From 0a6abd87ae9cc3cb56950d6044c0303239c8d51a Mon Sep 17 00:00:00 2001
From: ZF sun <34314687@qq.com>
Date: Wed, 22 Jul 2026 16:48:46 +0800
Subject: [PATCH 1/8] =?UTF-8?q?build(mp-harmony):=20=E6=B7=BB=E5=8A=A0comp?=
=?UTF-8?q?onents=5Fdiy=E5=92=8C=E9=A1=B5=E9=9D=A2=E6=A8=A1=E5=9D=97?=
=?UTF-8?q?=E7=9A=84=E6=9E=84=E5=BB=BA=E9=85=8D=E7=BD=AE?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
同时新增清理华为IDE内置node路径的脚本,以及空的权限检查文件
---
.local.config.js | 9 ++-
.trae_permission_check_15252 | 0
.trae_permission_check_15564 | 0
.trae_permission_check_6200 | 0
remove-huawei-node-from-path.ps1 | 62 +++++++++++++++++++
.../mp-harmony/build-profile.json5 | 60 ++++++++++++++++++
6 files changed, 129 insertions(+), 2 deletions(-)
create mode 100644 .trae_permission_check_15252
create mode 100644 .trae_permission_check_15564
create mode 100644 .trae_permission_check_6200
create mode 100644 remove-huawei-node-from-path.ps1
diff --git a/.local.config.js b/.local.config.js
index 1cf99cf..fb359fe 100644
--- a/.local.config.js
+++ b/.local.config.js
@@ -83,6 +83,10 @@ const localDevConfig = ({
uniacid: 206,
domain: 'https://5g.aigc-quickapp.com/',
},
+ '5g-165': { // 鸡肉调理品, 优惠卷显示不全,及逻辑错误
+ uniacid: 165,
+ domain: 'https://5g.aigc-quickapp.com/',
+ },
'47': { // 修改弹窗
uniacid: 47,
domain: 'https://5g.aigc-quickapp.com/',
@@ -143,11 +147,12 @@ const localDevConfig = ({
// })['5g-97']; // 大宗商品贸易,支持自定义字体大小、颜色
// })['5g-50']; // 燃气安全产品机器人,购物车无反应
// })['2821']; // 离型纸硅油纸
-})['2482']; // 低空经济
+// })['2482']; // 低空经济
// })['48']; // 离型纸硅油纸
// })['2485']; // 验证电子表单前后端数据一致性
// })['5g-11']; // 数码
-// })['5g-213']; // 选择要使用的环境配置
+// })['5g-213']; // 选择要使用的环境配置
+})['5g-165']; // 鸡肉调理品, 优惠卷显示不全,及逻辑错误
// })['2811']; // 选择要使用的环境配置
// })['local-11']; // 选择要使用的环境配置
// })['local-1']; // 本地
diff --git a/.trae_permission_check_15252 b/.trae_permission_check_15252
new file mode 100644
index 0000000..e69de29
diff --git a/.trae_permission_check_15564 b/.trae_permission_check_15564
new file mode 100644
index 0000000..e69de29
diff --git a/.trae_permission_check_6200 b/.trae_permission_check_6200
new file mode 100644
index 0000000..e69de29
diff --git a/remove-huawei-node-from-path.ps1 b/remove-huawei-node-from-path.ps1
new file mode 100644
index 0000000..2c814cc
--- /dev/null
+++ b/remove-huawei-node-from-path.ps1
@@ -0,0 +1,62 @@
+$ErrorActionPreference = 'Stop'
+
+$target = 'C:\Program Files\Huawei QuickApp IDE\resources\app\extensions\deveco-debug\lib\toolkit\nodeTool'
+
+$before = [Environment]::GetEnvironmentVariable('Path', 'Machine')
+
+Write-Host '=== Before: target entries in Machine PATH ==='
+$before -split ';' | ForEach-Object {
+ if ($_.Trim() -ieq $target) {
+ Write-Host (" [" + $_ + "]")
+ }
+}
+
+$entries = $before -split ';'
+$kept = New-Object System.Collections.Generic.List[string]
+$removed = New-Object System.Collections.Generic.List[string]
+foreach ($e in $entries) {
+ $t = $e.Trim()
+ if ($t -ieq $target) {
+ $removed.Add($e)
+ } elseif ($t -ne '') {
+ $kept.Add($e)
+ }
+}
+$after = [string]::Join(';', $kept.ToArray())
+
+if ($removed.Count -eq 0) {
+ Write-Host 'Target entry not found, nothing to do.'
+ exit 0
+}
+
+try {
+ [Environment]::SetEnvironmentVariable('Path', $after, 'Machine')
+ Write-Host ''
+ Write-Host '=== Result ==='
+ Write-Host (" Removed entries: " + $removed.Count)
+ foreach ($r in $removed) { Write-Host (" - " + $r) }
+ Write-Host (" Remaining entries: " + $kept.Count)
+ Write-Host ' Write OK.'
+} catch {
+ Write-Host ''
+ Write-Host (' Write FAILED (admin required?): ' + $_.Exception.Message)
+ exit 1
+}
+
+Write-Host ''
+Write-Host '=== Verify after write ==='
+$verify = [Environment]::GetEnvironmentVariable('Path', 'Machine')
+$stillThere = 0
+foreach ($e in ($verify -split ';')) {
+ if ($e.Trim() -ieq $target) { $stillThere++ }
+}
+if ($stillThere -gt 0) {
+ Write-Host ' FAIL: target still present.'
+ exit 1
+} else {
+ Write-Host ' OK: target no longer in Machine PATH.'
+}
+
+Write-Host ''
+Write-Host 'Note: env var change does NOT affect already-running processes.'
+Write-Host 'Reopen cmd / Git Bash / HBuilderX to see updated where node.'
\ No newline at end of file
diff --git a/stub-app-projects/mp-harmony/build-profile.json5 b/stub-app-projects/mp-harmony/build-profile.json5
index 3d89ede..3ffaf31 100644
--- a/stub-app-projects/mp-harmony/build-profile.json5
+++ b/stub-app-projects/mp-harmony/build-profile.json5
@@ -64,6 +64,66 @@
]
}
]
+ },
+ {
+ "name": "components_diy",
+ "srcPath": "./ascf/ascf_build/components_diy",
+ "targets": [
+ {
+ "name": "default",
+ "applyToProducts": [
+ "default"
+ ]
+ }
+ ]
+ },
+ {
+ "name": "pages_goods",
+ "srcPath": "./ascf/ascf_build/pages_goods",
+ "targets": [
+ {
+ "name": "default",
+ "applyToProducts": [
+ "default"
+ ]
+ }
+ ]
+ },
+ {
+ "name": "pages_order",
+ "srcPath": "./ascf/ascf_build/pages_order",
+ "targets": [
+ {
+ "name": "default",
+ "applyToProducts": [
+ "default"
+ ]
+ }
+ ]
+ },
+ {
+ "name": "pages_promotion",
+ "srcPath": "./ascf/ascf_build/pages_promotion",
+ "targets": [
+ {
+ "name": "default",
+ "applyToProducts": [
+ "default"
+ ]
+ }
+ ]
+ },
+ {
+ "name": "pages_tool",
+ "srcPath": "./ascf/ascf_build/pages_tool",
+ "targets": [
+ {
+ "name": "default",
+ "applyToProducts": [
+ "default"
+ ]
+ }
+ ]
}
]
}
\ No newline at end of file
From 6ee4de94a2492900447efc50430ac21ed8cab799 Mon Sep 17 00:00:00 2001
From: ZF sun <34314687@qq.com>
Date: Thu, 23 Jul 2026 08:45:01 +0800
Subject: [PATCH 2/8] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E5=A4=9A=E5=95=86?=
=?UTF-8?q?=E6=88=B7=E4=BC=98=E6=83=A0=E5=88=B8=E9=80=89=E6=8B=A9=E5=BC=82?=
=?UTF-8?q?=E5=B8=B8=E5=92=8C=E7=A9=BA=E6=8C=87=E9=92=88=E9=97=AE=E9=A2=98?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
1. 新增coupon_list数组类型校验避免渲染异常
2. 重构优惠券选择逻辑,使用merch_id隔离选中状态避免多商户污染
3. 增加orderCreateData.coupon的类型兜底处理,防止非对象/数组类型报错
4. 修复优惠券弹窗选中状态同步逻辑,保留用户已选优惠券
---
pages_goods/public/js/detail.js | 2 +-
.../common-payment/common-payment.vue | 4 +-
.../_components/common-payment/payment.js | 111 +++++++++++-------
3 files changed, 70 insertions(+), 47 deletions(-)
diff --git a/pages_goods/public/js/detail.js b/pages_goods/public/js/detail.js
index 30618aa..2f7ad34 100644
--- a/pages_goods/public/js/detail.js
+++ b/pages_goods/public/js/detail.js
@@ -249,7 +249,7 @@ export default {
}
// 优惠券
- if (this.goodsSkuDetail.coupon_list) {
+ if (Array.isArray(this.goodsSkuDetail.coupon_list)) {
this.couponList = this.goodsSkuDetail.coupon_list;
this.couponList.forEach(v => {
if (v.count == v.lead_count) v.useState = 2;
diff --git a/pages_order/_components/common-payment/common-payment.vue b/pages_order/_components/common-payment/common-payment.vue
index 62fba90..fa13a7f 100644
--- a/pages_order/_components/common-payment/common-payment.vue
+++ b/pages_order/_components/common-payment/common-payment.vue
@@ -234,7 +234,7 @@
{{ $lang('order.payment.orderMoney.coupon') }}
-
+
{{ $lang('order.payment.orderMoney.couponSelected', { count: 1 }) }}
@@ -550,7 +550,7 @@
{{ $lang('order.payment.couponPopup.maxDiscount', { amount: couponItem.discount_limit }) }}
{{ $lang('order.payment.couponPopup.validPeriod') }}{{ couponItem.end_time ? $util.timeStampTurnTime(couponItem.end_time) : $lang('order.payment.couponPopup.permanentValid') }}
-
+
diff --git a/pages_order/_components/common-payment/payment.js b/pages_order/_components/common-payment/payment.js
index cdb8d3a..526091a 100644
--- a/pages_order/_components/common-payment/payment.js
+++ b/pages_order/_components/common-payment/payment.js
@@ -55,7 +55,8 @@ export default {
merch_id: 0,
data: []
},
- selectCouponId:0
+ // 按 merch_id 隔离,避免多商户之间互相污染
+ selectCouponMap: {}
}
},
inject: ['promotion'],
@@ -85,7 +86,7 @@ export default {
goodsData() {
if (this.paymentData) {
this.paymentData.goods_list.forEach(item => {
- if (item.sku_spec_format) item.sku_spec_format = JSON.parse(item.sku_spec_format);
+ if (item.sku_spec_format && typeof item.sku_spec_format === 'string') item.sku_spec_format = JSON.parse(item.sku_spec_format);
})
return this.paymentData;
}
@@ -93,7 +94,7 @@ export default {
calculateGoodsData() {
if (this.calculateData) {
this.calculateData.goods_list.forEach(item => {
- if (item.sku_spec_format) item.sku_spec_format = JSON.parse(item.sku_spec_format);
+ if (item.sku_spec_format && typeof item.sku_spec_format === 'string') item.sku_spec_format = JSON.parse(item.sku_spec_format);
})
return this.calculateData;
}
@@ -189,7 +190,7 @@ export default {
//多商户商品分类
goodsSpecFormat(goods_list){
goods_list.forEach(item => {
- if (item.sku_spec_format) item.sku_spec_format = JSON.parse(item.sku_spec_format);
+ if (item.sku_spec_format && typeof item.sku_spec_format === 'string') item.sku_spec_format = JSON.parse(item.sku_spec_format);
})
return goods_list
},
@@ -249,7 +250,11 @@ export default {
this.modules = data.modules;
//记录多商户优惠券
- this.orderCreateData.coupon = data.coupon
+ // 兜底为对象,避免后续被当作数组处理
+ if (!data.coupon || typeof data.coupon !== 'object' || Array.isArray(data.coupon)) {
+ data.coupon = {};
+ }
+ this.orderCreateData.coupon = data.coupon;
//查询优惠券
this.getCouponList();
@@ -365,7 +370,17 @@ export default {
}
});
//多商户
- this.orderCreateData.coupon = res.data.coupon
+ // 保留用户已选的 coupon_id,后端回传的 res.data.coupon 默认都是 0 会覆盖掉
+ const prevCoupon = (this.orderCreateData.coupon && typeof this.orderCreateData.coupon === 'object' && !Array.isArray(this.orderCreateData.coupon)) ? this.orderCreateData.coupon : {};
+ this.orderCreateData.coupon = res.data.coupon || {};
+ if (this.orderCreateData.coupon && typeof this.orderCreateData.coupon === 'object' && !Array.isArray(this.orderCreateData.coupon)) {
+ Object.keys(prevCoupon).forEach(merch_id => {
+ const chosen = prevCoupon[merch_id] && prevCoupon[merch_id].coupon_id;
+ if (chosen && (!this.orderCreateData.coupon[merch_id] || !this.orderCreateData.coupon[merch_id].coupon_id)) {
+ this.orderCreateData.coupon[merch_id] = { coupon_id: chosen };
+ }
+ });
+ }
// if (!res.data.coupon_id) this.orderCreateData.coupon.coupon_id = 0;
// else this.orderCreateData.coupon.coupon_id = res.data.coupon_id;
@@ -731,44 +746,52 @@ export default {
this.tempData = null;
},
//优惠券单独多商户
- /**
- * 显示店铺优惠券信息
- * @param {Object} siteId
- * @param {Object} couponData
- */
- openSiteCoupon(merch_id) {
-
- this.tempData = this.$util.deepClone(this.orderCreateData);
- this.merchCoupon.merch_id = merch_id;
- this.selectCouponId = this.orderCreateData.coupon[merch_id].coupon_id;
- // this.selectCouponMoney = this.orderCreateData.coupon[siteId].coupon_money;
-
- this.merchCoupon.data = this.coupon_list[merch_id];
- this.$refs.couponPopup.open();
- this.$forceUpdate();
- },
- /**商户选择券*/
- selectCoupon(data,merch_id) {
-
- // if (this.orderCreateData.coupon[merch_id].coupon_id == data.coupon_id){
- // this.orderCreateData.coupon[merch_id].coupon_id = 0
- // }else{
- // this.orderCreateData.coupon[merch_id].coupon_id = data.coupon_id
- // };
- if (this.selectCouponId != data.coupon_id) {
- this.selectCouponId = data.coupon_id;
- } else {
- this.selectCouponId = 0;
- }
- this.$forceUpdate();
- // this.orderCreateData.coupon[merch_id].coupon_id = data.coupon_id
- },
- //确定使用优惠券
- useCpopon() {
- this.orderCreateData.coupon[this.merchCoupon.merch_id].coupon_id = this.selectCouponId;
- this.$refs.couponPopup.close();
- this.calculate();
- },
+ /**
+ * 显示店铺优惠券信息
+ * @param {Object} siteId
+ * @param {Object} couponData
+ */
+ openSiteCoupon(merch_id) {
+
+ this.tempData = this.$util.deepClone(this.orderCreateData);
+ this.merchCoupon.merch_id = merch_id;
+ // 从当前订单已选的 coupon_id 取值,没有则取弹窗里缓存的,再没有为 0
+ const exist = this.orderCreateData.coupon && this.orderCreateData.coupon[merch_id];
+ const cached = this.selectCouponMap[merch_id] || 0;
+ this.selectCouponMap[merch_id] = exist ? (exist.coupon_id || 0) : cached;
+ // this.selectCouponMoney = this.orderCreateData.coupon[siteId].coupon_money;
+
+ // 兜底: 列表为空时给一个空数组,弹窗不会渲染空指针
+ this.merchCoupon.data = (this.coupon_list && this.coupon_list[merch_id]) || [];
+ this.$refs.couponPopup.open();
+ this.$forceUpdate();
+ },
+ /**商户选择券*/
+ selectCoupon(data, merch_id) {
+
+ // if (this.orderCreateData.coupon[merch_id].coupon_id == data.coupon_id){
+ // this.orderCreateData.coupon[merch_id].coupon_id = 0
+ // }else{
+ // this.orderCreateData.coupon[merch_id].coupon_id = data.coupon_id
+ // };
+ const cur = this.selectCouponMap[merch_id] || 0;
+ this.selectCouponMap[merch_id] = (cur != data.coupon_id) ? data.coupon_id : 0;
+ this.$forceUpdate();
+ // this.orderCreateData.coupon[merch_id].coupon_id = data.coupon_id
+ },
+ //确定使用优惠券
+ useCpopon() {
+ const merch_id = this.merchCoupon.merch_id;
+ // 确保 orderCreateData.coupon 是对象结构,后端按 merch_id 取值
+ if (!this.orderCreateData.coupon || typeof this.orderCreateData.coupon !== 'object' || Array.isArray(this.orderCreateData.coupon)) {
+ this.orderCreateData.coupon = {};
+ }
+ this.orderCreateData.coupon[merch_id] = {
+ coupon_id: this.selectCouponMap[merch_id] || 0
+ };
+ this.$refs.couponPopup.close();
+ this.calculate();
+ },
//-------------------
/**
From 4b0aa0ac40452a4df3715b67aa6bf6037833d8f6 Mon Sep 17 00:00:00 2001
From: ZF sun <34314687@qq.com>
Date: Thu, 23 Jul 2026 09:07:32 +0800
Subject: [PATCH 3/8] =?UTF-8?q?i18n:=20=E8=A1=A5=E5=85=85=E5=A4=9A?=
=?UTF-8?q?=E8=AF=AD=E8=A8=80=E6=96=87=E6=A1=88=E5=B9=B6=E4=BC=98=E5=8C=96?=
=?UTF-8?q?=E8=8B=B1=E6=96=87tabbar=E5=91=BD=E5=90=8D?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
1. 为支付模块新增未获取到支付信息的多语言文案
2. 为通用模块新增网络错误、视频号播放限制、提交/加载相关文案
3. 优化英文环境底部tabbar的命名为更自然的首字母大写形式
---
lang-bundle.json | 4832 ++++++++++++++++++++-------------------
lang/en-us/common.js | 19 +-
lang/en-us/pay/index.js | 3 +-
lang/zh-cn/common.js | 10 +
lang/zh-cn/pay/index.js | 3 +-
5 files changed, 2449 insertions(+), 2418 deletions(-)
diff --git a/lang-bundle.json b/lang-bundle.json
index f5b694f..5d0f71e 100644
--- a/lang-bundle.json
+++ b/lang-bundle.json
@@ -2,137 +2,390 @@
"code": 0,
"message": "操作成功",
"data": {
- "version": "1782901586",
+ "version": "1784767380",
"lang": "zh-cn",
"app_type": "h5",
"source": "merged",
"tree": {
- "agreement": {
- "contenr": {
- "title": "协议",
- "noContent": "暂无内容",
- "noContentDesc": "该协议内容暂未设置",
- "reload": "重新加载"
+ "contact": {
+ "contact": {
+ "title": "电子名片",
+ "enterpriseFiles": "企业文件",
+ "enterpriseVideos": "企业视频",
+ "onlineMessage": "在线留言",
+ "exclusiveCustomerService": "专属客服",
+ "contactUs": "联系我们",
+ "share": "分享",
+ "call": "拨打",
+ "copy": "复制",
+ "oneClickNavigation": "一键导航",
+ "name": "姓名",
+ "pleaseEnterName": "请输入姓名",
+ "contactInfo": "联系方式",
+ "pleaseEnterMobile": "请输入手机号",
+ "messageContent": "留言内容",
+ "pleaseEnterMessage": "请输入留言内容",
+ "submit": "提交",
+ "videoUrlNotExist": "视频地址不存在",
+ "pleaseFillName": "请填写姓名",
+ "invalidMobileFormat": "手机号格式不正确",
+ "pleaseFillMessage": "请填写留言内容",
+ "submitSuccess": "提交成功",
+ "submitFailed": "提交失败,请重试",
+ "copySuccess": "复制成功",
+ "copyFailed": "复制失败"
}
},
- "ai-chat": {
- "index": {
- "title": "AI智能客服",
- "cancel": "取消",
+ "file-preview": {
+ "file-preview": {
+ "title": "文件预览",
+ "fileUrlNotExist": "文件地址不存在",
+ "videoUrlNotExist": "视频地址不存在",
+ "unsupportedFileType": "暂不支持该类型文件预览"
+ }
+ },
+ "components": {
+ "ns-login": {
+ "bindMobileTitle": "检测到您还未绑定手机号",
+ "bindMobileTip": "为了方便您接收订单等信息,需要绑定手机号",
+ "mobileLabel": "手机号",
+ "mobilePlaceholder": "请输入手机号",
+ "captchaLabel": "验证码",
+ "captchaPlaceholder": "请输入验证码",
+ "dynacodeLabel": "动态码",
+ "dynacodePlaceholder": "请输入动态码",
"save": "保存",
+ "welcomeTitle": "欢迎来到 {siteName}",
+ "loginWithMobile": "使用手机号登录,",
+ "registerLogin": "注册登录,",
+ "getServicesTip": "获得订单、售后等服务。",
+ "agree": "我同意",
+ "privacyPolicy": "《隐私条款》",
+ "userServiceAgreement": "《用户服务协议》",
+ "agreeAndAuthorizeMobile": "同意隐私协议并授权手机号",
+ "authorizeMobile": "授权手机号码",
+ "notNow": "暂不登录",
+ "avatarLabel": "头像",
+ "nicknameLabel": "昵称",
+ "nicknamePlaceholder": "请输入昵称",
+ "getMobile": "获取手机号",
+ "getDynacode": "获取动态码",
+ "resendAfter": "{seconds}s后可重新获取",
+ "pleaseConfirmAgreement": "请确认相关协议",
+ "uploadFailed": "上传失败",
+ "pleaseEnterMobile": "请输入手机号",
+ "pleaseEnterCorrectMobile": "请输入正确的手机号",
+ "pleaseEnterCaptcha": "请输入验证码",
+ "pleaseEnterDynacode": "请输入动态码",
+ "requestFail": "request:fail",
+ "loggingIn": "登录中",
+ "loginFailed": "登录失败",
+ "pleaseAuthorizeMobile": "请授权您的手机号码",
+ "pleaseEnterNickname": "请输入昵称",
+ "avatarPullFailed": "头像拉取失败"
+ },
+ "privacyPopup": {
+ "title": "用户隐私保护提示",
+ "descPrefix": "感谢您使用{appName},在使用前您应当阅读并同意",
+ "descSuffix": ",当点击同意并继续时,即表示您已理解并同意该条款内容,该条款将对您产生法律约束力;如您不同意,将无法继续使用{appName}相关功能。",
+ "disagreeBtn": "不同意",
+ "agreeBtn": "同意并继续",
+ "defaultContractNameMp": "用户隐私保护指引",
+ "defaultAppNameMp": "本小程序",
+ "defaultAppNameH5": "本应用",
+ "defaultContractNameH5": "《隐私条款》",
+ "defaultServiceNameH5": "《用户服务协议》",
+ "disagreeTip": "未同意隐私协议,无法使用相关功能"
+ },
+ "mescroll": {
+ "down": {
+ "textInOffset": "下拉刷新",
+ "textOutOffset": "释放更新",
+ "textLoading": "加载中 ..."
+ },
+ "up": {
+ "textLoading": "加载中 ...",
+ "textNoMore": "-- END --"
+ },
+ "empty": {
+ "tip": "~ 暂无相关数据 ~"
+ }
+ },
+ "nsForm": {
+ "selectPlaceholder": "请选择",
+ "selectProvinceCity": "请选择省市",
+ "selectProvinceCityDistrict": "请选择省市区\/县",
+ "pleaseInput": "请输入{title}",
+ "pleaseSelect": "请选择{title}",
+ "pleaseSelectAtLeastOne": "请至少选择一个{title}",
+ "pleaseUploadAtLeastOne": "请至少上传一张{title}",
+ "idCardInvalid": "身份证输入不合法",
+ "mobileInvalid": "手机号输入不合法",
+ "endDateBeforeStartDate": "结束日期不能小于开始日期",
+ "endTimeBeforeStartTime": "结束时间必须大于开始时间",
+ "maxUploadImages": "最多上传{max}张图片"
+ },
+ "nsSelectTime": {
+ "selectDeliveryTime": "选择送达时间",
+ "selectPickupTime": "选择自提时间",
+ "today": "今天",
+ "tomorrow": "明天",
+ "sunday": "周日",
+ "monday": "周一",
+ "tuesday": "周二",
+ "wednesday": "周三",
+ "thursday": "周四",
+ "friday": "周五",
+ "saturday": "周六",
+ "monthDayFormat": "{month}月{date}日",
+ "immediateDeliveryPrefix": "立即配送(",
+ "immediateDeliverySuffix": ")"
+ },
+ "wxworkContact": {
+ "defaultBtnText": "添加企业微信客服",
+ "popupTitle": "添加企业微信客服",
+ "popupContent": "点击确定后将跳转至企业微信,添加专业客服为您服务",
+ "cancelBtn": "取消",
+ "confirmBtn": "确定",
+ "tipTitle": "提示",
+ "jumpSuccess": "跳转成功",
+ "jumpFailed": "跳转失败,请检查企业微信配置",
+ "notConfigured": "未配置企业微信客服信息",
+ "sdkNotInitialized": "企业微信SDK未初始化",
+ "openProfileFailed": "打开用户资料失败"
+ },
+ "chat-message": {
+ "customerOffline": "客服不在线",
+ "customerOnline": "客服在线"
+ },
+ "ns-newform": {
+ "inputPlaceholder": "请输入提示语",
+ "selectPlaceholder": "请选择",
+ "datePlaceholder": "请选择日期",
+ "timePlaceholder": "请选择时间",
+ "startDate": "开始日期",
+ "endDate": "结束日期",
+ "startTime": "开始时间",
+ "endTime": "结束时间",
+ "selectProvinceCity": "请选择省市",
+ "selectProvinceCityDistrict": "请选择省市区",
+ "pleaseInput": "请输入{title}",
+ "pleaseSelect": "请选择{title}",
+ "pleaseSelectAtLeastOne": "请至少选择一个{title}",
+ "pleaseUploadAtLeastOne": "请至少上传一张{title}",
+ "idCardInvalid": "身份证输入不合法",
+ "mobileInvalid": "手机号输入不合法",
+ "endDateBeforeStartDate": "结束日期不能小于开始日期",
+ "endTimeBeforeStartTime": "结束时间必须大于开始时间",
+ "maxUploadImages": "最多上传{max}张图片"
+ },
+ "ns-goods-sku": {
+ "pointSuffix": "{point}积分"
+ },
+ "nsContact": {
+ "contactService": "联系客服",
+ "callServiceTip": "请联系客服,客服电话是 {phone}",
+ "noServiceOffline": "抱歉,商家暂无客服,请线下联系"
+ },
+ "ns-chat-receiveGoods": {
+ "stockPrefix": "库存:",
+ "salesPrefix": "销量:",
+ "viewGoods": "查看商品"
+ },
+ "payment": {
+ "title": "支付方式",
+ "payAmount": "支付金额{money}元",
+ "balancePay": "余额支付",
+ "availableBalance": "可用{symbol}{balance}",
+ "noPaymentMethod": "平台尚未配置支付方式!",
+ "confirmPay": "确认支付",
+ "alipay": "支付宝支付",
+ "wechatpay": "微信支付",
+ "pleaseSelectPayMethod": "请选择支付方式!",
+ "paying": "支付中...",
+ "payInfoNotFound": "未获取到支付信息!",
+ "payCancelled": "您已取消支付",
+ "payFailed": "支付失败,失败原因: {reason}"
+ },
+ "ns-chat-goods": {
+ "sent": "已发送",
+ "send": "发送"
+ },
+ "hoverNav": {
+ "langPickerTitle": "选择语言",
+ "langPickerCancel": "取消"
+ },
+ "pick-regions": {
+ "cancel": "取消",
+ "confirm": "完成"
+ },
+ "nsPayment": {
+ "paymentMethod": "支付方式",
+ "payAmount": "支付金额{amount}元",
+ "balanceDeduction": "余额抵扣",
+ "availableBalance": "可用¥{amount}",
+ "noPaymentMethod": "平台尚未配置支付方式!",
+ "confirmPay": "确认支付",
+ "alipay": "支付宝支付",
+ "wechatpay": "微信支付",
+ "pleaseSelectPaymentMethod": "请选择支付方式!",
+ "paying": "支付中...",
+ "payInfoNotFound": "未获取到支付信息!",
+ "paymentCancelled": "您已取消支付",
+ "paymentFailed": "支付失败,失败原因: {reason}"
+ },
+ "nsBirthdayGift": {
+ "birthdayGift": "生日贺礼",
+ "defaultBlessing": "感谢您一直以来的支持,在您生日到来之际,特为您送上最真诚的祝福!",
+ "points": "积分",
+ "pointDesc": "用于下单时抵现或兑换商品等",
+ "yuanRedPacket": "元红包",
+ "nonWithdrawable": "不可提现红包",
+ "withdrawable": "可提现红包",
+ "yuanCoupon": "元优惠劵",
+ "discount": "折",
+ "couponDesc": "用于下单时抵现或兑换商品等",
+ "viewNow": "立即查看"
+ },
+ "yuyue-date": {
+ "appointedDate": "指定日期",
+ "fullyBooked": "已约满",
+ "available": "可预约",
+ "noSelection": "暂无选择",
+ "weekdayCannotBook": "{weekday}不可以预约",
+ "today": "今天",
+ "tomorrow": "明天",
+ "dayAfterTomorrow": "后天",
+ "weekSunday": "周日",
+ "weekMonday": "周一",
+ "weekTuesday": "周二",
+ "weekWednesday": "周三",
+ "weekThursday": "周四",
+ "weekFriday": "周五",
+ "weekSaturday": "周六"
+ },
+ "nsNewGift": {
+ "thankYouHint": "感谢您一直以来的支持,为回馈会员,商城{activityName}节日,为您提供以下福利",
+ "points": "积分",
+ "pointDesc": "用于参与活动购买商品时抵扣",
+ "yuanRedPacket": "元红包",
+ "nonWithdrawableDesc": "不可提现红包",
+ "withdrawableDesc": "可提现红包",
+ "yuanCoupon": "元优惠劵",
+ "discount": "折",
+ "couponDesc": "用于下单时抵现或兑换商品等",
+ "viewNow": "立即查看"
+ },
+ "ns-video-player-popup": {
+ "videoUrlNotExist": "视频地址不存在"
+ },
+ "registerReward": {
+ "pointReward": "积分奖励",
+ "points": "积分",
+ "pointDesc": "用于下单时抵现或兑换商品等",
+ "growthValue": "成长值",
+ "growthDesc": "用于提升会员等级",
+ "balanceReward": "红包奖励",
+ "yuan": "元",
+ "balanceDesc": "不可提现下单时可用",
+ "couponReward": "优惠券奖励",
+ "couponMinSpendDiscount": "满{atLeast}打{discount}折",
+ "couponMinSpendReduce": "满{atLeast}减{money}",
+ "couponNoThresholdDiscount": "无门槛,打{discount}折",
+ "couponNoThresholdReduce": "无门槛,减{money}",
+ "viewNow": "立即查看"
+ },
+ "imgCropping": {
+ "cancel": "取消",
+ "upload": "上传",
+ "loading": "加载中...",
+ "cropBoxSizeNotSet": "裁剪框的宽或高没有设置",
+ "pleaseSelectValidImage": "请选择正确图片"
+ },
+ "nsGoodsPromotion": {
+ "discount": "限时折扣",
+ "groupbuy": "团购",
+ "pintuan": "拼团",
+ "seckill": "秒杀",
+ "topic": "专题活动",
+ "bargain": "砍价",
+ "pinfan": "拼团返利",
+ "participatingTip": "当前商品正在参加{promotionName}"
+ },
+ "nsChatOrder": {
+ "orderStatus": "订单状态:{status}",
+ "deliveryMethod": "配送方式:{method}",
"send": "发送",
- "retry": "重试",
- "timeFormatToday": "今天",
- "timeFormatYesterday": "昨天",
- "timeFormatBeforeYesterday": "前天",
- "aiNickname": "智能助手",
- "defaultNickname": "我",
- "audioMessage": "语音消息",
- "videoMessage": "视频消息",
- "inputPlaceholder": "请输入您的问题...",
- "expandEditorTitle": "编辑内容",
- "loadMoreHistory": "加载更多历史消息",
- "loadingHistory": "加载历史消息中...",
- "aiThinking": "AI正在思考",
- "receivingReply": "正在接收回复",
- "aiThinkingStatus1": "AI正在思考",
- "aiThinkingStatus2": "AI正在分析",
- "aiThinkingStatus3": "AI正在检索",
- "aiThinkingStatus4": "AI正在生成",
- "serviceUnavailable": "抱歉,AI服务暂时不可用,请稍后重试。",
- "serviceTemporaryUnavailable": "抱歉,服务暂时不可用,请稍后重试。",
- "noContentToCopy": "无可复制的内容",
- "copySuccess": "已复制",
- "copySelected": "已复制选中内容",
- "copyFail": "复制失败",
- "copyFailWithReason": "复制失败:{reason}",
- "openingFile": "打开文件中...",
- "openingFileName": "正在打开文件:{name}",
- "openingFileTitle": "正在打开:{title}",
- "fileOpenFail": "文件打开失败",
- "loadHistoryFail": "加载历史失败",
- "about": "0B",
- "autoReplyGreeting": "您好!我是AI智能客服,很高兴为您服务!有什么可以帮助您的吗?",
- "autoReplyPrice": "我们的产品价格根据型号和配置有所不同,具体价格请查看商品详情页面。",
- "autoReplyShipping": "一般情况下,订单会在24小时内发货,具体时效请查看物流信息。",
- "autoReplyReturn": "支持7天无理由退货,请确保商品完好无损。",
- "autoReplyService": "我们的客服工作时间是9:00-18:00,有问题可以随时联系我们。",
- "autoReplyDefault": "感谢您的咨询!关于\"{question}\"的问题,我们的专业客服会尽快为您解答。您也可以查看我们的帮助文档获取更多信息。",
- "searchEntrance": "搜索",
- "searchPlaceholder": "搜索聊天记录",
- "searchClose": "完成",
- "noMatchResult": "未找到匹配结果",
- "searchAtTop": "已到顶部",
- "searchAtBottom": "已到底部",
- "settingsTitle": "设置",
- "fallbackWelcome": "您好!我是AI智能客服,很高兴为您服务!nn我可以帮您:n• 解答产品相关问题n• 处理订单问题n• 提供技术支持n• 推荐相关商品nn请告诉我您需要什么帮助?",
- "changeAvatar": "更换头像",
- "changeAvatarDesc": "自定义您的聊天头像",
- "changeNickname": "更换昵称",
- "changeNicknameDesc": "自定义您的昵称",
- "clearChat": "清空聊天",
- "exportChat": "导出记录",
- "help": "帮助",
- "confirmClearChat": "确定要清空聊天记录吗?",
- "chatCleared": "聊天记录已清空,有什么可以帮助您的吗?",
- "featureDeveloping": "功能开发中",
- "thanksFeedback": "感谢您的反馈!",
- "improveService": "我们会改进服务",
- "openLink": "打开链接",
- "confirmOpenLink": "确定要打开链接:",
- "confirmOpenLinkText": "确定要打开链接:{url}?",
- "operationFailed": "操作失败,请重试",
- "prompt": "提示",
- "serviceTypeNotSupported": "当前客服类型不支持此页面",
- "helpContent": "# 使用帮助nn## 基本功能n- **发送消息**: 在输入框中输入文字后发送n- **语音输入**: 点击麦克风图标进行语音输入n- **附件发送**: 点击+号可以发送图片、文件、位置nn## 消息类型n- **文本消息**: 普通文字对话n- **Markdown**: 支持格式化的文档内容n- **文件**: 支持各种文件格式预览n- **音频**: 支持语音消息播放n- **视频**: 支持视频播放n- **链接**: 支持网页链接跳转n- **商品**: 支持商品卡片展示nn## 操作功能n- **点赞\/踩**: 对AI回复进行评价n- **复制**: 长按消息可复制内容n- **转发**: 支持消息转发功能",
- "aiResponseTemplate1": "我理解您的需求,让我为您详细解答。",
- "aiResponseTemplate2": "感谢您的提问,这是一个很好的问题。",
- "aiResponseTemplate3": "根据您的问题,我建议您可以考虑以下几个方面:",
- "aiResponseTemplate4": "这个问题很常见,让我为您提供一些解决方案。",
- "aiResponseTemplate5": "我明白您的困惑,让我帮您分析一下。",
- "aiProcessingMessage": "您的问题\"{question}\"我已经收到,正在为您处理中...",
- "productInquiryTemplate": "我想了解以下商品的详细信息:n商品名称:{name}n价格:¥{price}n商品ID:{id}",
- "avatarSelectorTitle": "更换头像",
- "chooseFromAlbum": "从相册选择",
- "avatarChangeSuccess": "头像更换成功",
- "enableAlbumPermission": "请开启相册权限",
- "emojiTitle": "表情",
- "editNickname": "修改昵称",
- "newNicknamePlaceholder": "请输入您的新昵称",
- "nicknameTip": "昵称长度限制1-12个字符,仅自己可见",
- "nicknameChangeSuccess": "昵称修改成功",
- "moreFunctions": "更多功能",
- "image": "图片",
- "file": "文件",
- "voice": "语音",
- "location": "位置",
- "voiceInputTitle": "语音输入",
- "recordingTip": "正在录音,松开结束",
- "startRecordTip": "点击开始录音",
- "voiceInputFailed": "语音输入失败",
- "menuClearChat": "清空聊天",
- "menuExport": "导出记录",
- "menuSettings": "设置",
- "menuHelp": "帮助",
- "logOnShowTriggered": "[AI Chat Page] onShow 触发",
- "logOnUnloadTriggered": "[AI Chat Page] onUnload 触发",
- "logKeyboardChangeUnavailable": "onKeyboardHeightChange 不可用",
- "logEventHandleError": "事件处理错误",
- "logInitNavbarFailed": "初始化导航栏失败",
- "logChatComponentNotInit": "聊天组件未初始化",
- "logServicerConfigNotLoaded": "【AI客服】servicerConfig 未加载,200ms后重试..."
+ "sent": "已发送"
}
},
- "article": {
+ "weapp": {
+ "order_shipping": {
+ "title": "小程序发货"
+ }
+ },
+ "index": {
+ "index": {
+ "title": "",
+ "followOfficialAccount": "关注公众号",
+ "followLearnMore": "关注了解更多",
+ "collectGotIt": "我知道了",
+ "chooseStoreTitle": "请确认门店",
+ "reposition": "重新定位",
+ "currentStore": "当前门店",
+ "confirmEnter": "确认进入",
+ "chooseOtherStore": "选择其他门店"
+ },
+ "diy": {
+ "title": "",
+ "diy": {
+ "iKnow": "我知道了"
+ }
+ }
+ },
+ "topics": {
+ "goods_detail": {
+ "title": "",
+ "select": "选择",
+ "params": "参数",
+ "service": "商品服务",
+ "allGoods": "全部商品",
+ "image": "图片",
+ "video": "视频"
+ },
"detail": {
- "title": "文章详情",
- "publishTime": "发表时间:",
- "readCount": "阅读:",
- "likedSuffix": "人已赞"
+ "title": "专题活动详情"
+ },
+ "payment": {
+ "title": "待付款订单"
},
"list": {
- "title": "文章列表",
- "emptyText": "暂无文章"
+ "title": "专题活动列表"
+ }
+ },
+ "recharge": {
+ "detail": {
+ "title": "充值详情"
+ },
+ "order_list": {
+ "title": "充值记录",
+ "recharge": {
+ "rechargeSuccess": "充值成功",
+ "noRecord": "暂无充值记录"
+ }
+ },
+ "list": {
+ "title": "充值列表",
+ "rechargeAmount": "充值金额",
+ "rechargeRecords": "充值记录",
+ "placeholderEnterAmount": "请输入充值金额",
+ "yuan": "元",
+ "salePrice": "售价 {price} 元",
+ "amount": "金额",
+ "confirmRecharge": "确认充值",
+ "recharge": "充值",
+ "pleaseEnterAmount": "请输入充值金额",
+ "pleaseSelectPackage": "请选择套餐"
}
},
"bale": {
@@ -143,7 +396,7 @@
"title": "待付款订单"
}
},
- "bargain": {
+ "seckill": {
"detail": {
"title": "",
"select": "选择",
@@ -153,47 +406,11 @@
"image": "图片",
"video": "视频"
},
- "launch": {
- "title": "砍价详情"
+ "payment": {
+ "title": "待付款订单"
},
"list": {
- "title": "砍价专区"
- },
- "my_bargain": {
- "title": "我的砍价"
- },
- "payment": {
- "title": "待付款订单"
- }
- },
- "cases": {
- "index": {
- "title": "案例展示",
- "completionTime": "完成时间:{time}",
- "viewPdfFile": "查看PDF文件",
- "messagePopup": {
- "title": "在线留言"
- },
- "form": {
- "name": "姓名",
- "namePlaceholder": "请输入您的姓名",
- "contact": "联系方式",
- "mobilePlaceholder": "请输入您的手机号",
- "messageContent": "留言内容",
- "messagePlaceholder": "请输入留言内容"
- },
- "toast": {
- "loading": "正在加载",
- "fileNotExist": "文件不存在"
- }
- }
- },
- "combo": {
- "detail": {
- "title": "组合套餐"
- },
- "payment": {
- "title": "待付款订单"
+ "title": "秒杀专区"
}
},
"tabBar": {
@@ -246,9 +463,11 @@
"weChatWorkKefu": "企业微信客服"
},
"diy": {
- "networkError": "网络异常,请稍后重试",
+ "networkErrorTitle": "提示",
+ "retry": "重试",
"noDiyData": "未配置自定义页面数据",
"locationNotAvailable": "未获取到定位",
+ "loadFailTpl": "页面数据加载失败:{reason},请稍后重试",
"diy": {
"title": ""
}
@@ -266,7 +485,7 @@
"callServiceTip": "请联系客服,客服电话是 {phone}",
"noServiceOffline": "抱歉,商家暂无客服,请线下联系",
"configError": "客服配置错误",
- "configErrorDetail": "配置有误:n{errors}",
+ "configErrorDetail": "配置有误:\n{errors}",
"tip": "提示",
"cannotAddWxwork": "无法直接添加企业微信,是否使用其他方式联系客服?",
"onlineUnavailable": "在线客服不可用,是否拨打电话联系客服?",
@@ -302,7 +521,15 @@
"http": {
"baseUrlNotConfigured": "未配置请求域名",
"domainNotInList": "{url}不在request 合法域名列表中",
- "requestFailed": "{url}请求失败. {err}"
+ "requestFailed": "{url}请求失败. {err}",
+ "timeout": "网络请求超时,请稍后重试",
+ "networkError": "网络异常,请稍后重试",
+ "serverError": "服务器异常,请稍后重试",
+ "notFound": "接口不存在",
+ "auth": "无访问权限",
+ "aborted": "请求已取消",
+ "unknown": "请求失败,请稍后重试",
+ "unknownError": "请求失败,请稍后重试"
},
"share": {
"defaultDesc": "查看企业文件:{name}",
@@ -366,7 +593,7 @@
"loginTips": "点击登录 享受更多精彩信息",
"toLogin": "去登录",
"toGoodsCategoryPage": "去逛逛",
- "getDynacode": "得到测试码2",
+ "getDynacode": "获取动态码",
"waitpay": "待付款",
"waitsend": "待发货",
"waitconfirm": "待收货",
@@ -406,545 +633,125 @@
"unit": {
"piece": "件"
},
- "components": {
- "chat-message": {
- "customerOffline": "客服不在线",
- "customerOnline": "客服在线"
- },
- "hoverNav": {
- "langPickerTitle": "选择语言",
- "langPickerCancel": "取消"
- },
- "imgCropping": {
- "cancel": "取消",
- "upload": "上传",
- "loading": "加载中...",
- "cropBoxSizeNotSet": "裁剪框的宽或高没有设置",
- "pleaseSelectValidImage": "请选择正确图片"
- },
- "mescroll": {
- "down": {
- "textInOffset": "下拉刷新",
- "textOutOffset": "释放更新",
- "textLoading": "加载中 ..."
- },
- "up": {
- "textLoading": "加载中 ...",
- "textNoMore": "-- END --"
- },
- "empty": {
- "tip": "~ 暂无相关数据 ~"
- }
- },
- "nsBirthdayGift": {
- "birthdayGift": "生日贺礼",
- "defaultBlessing": "感谢您一直以来的支持,在您生日到来之际,特为您送上最真诚的祝福!",
- "points": "积分",
- "pointDesc": "用于下单时抵现或兑换商品等",
- "yuanRedPacket": "元红包",
- "nonWithdrawable": "不可提现红包",
- "withdrawable": "可提现红包",
- "yuanCoupon": "元优惠劵",
- "discount": "折",
- "couponDesc": "用于下单时抵现或兑换商品等",
- "viewNow": "立即查看"
- },
- "ns-chat-goods": {
- "sent": "已发送",
- "send": "发送"
- },
- "ns-chat-receiveGoods": {
- "stockPrefix": "库存:",
- "salesPrefix": "销量:",
- "viewGoods": "查看商品"
- },
- "nsForm": {
- "selectPlaceholder": "请选择",
- "selectProvinceCity": "请选择省市",
- "selectProvinceCityDistrict": "请选择省市区\/县",
- "pleaseInput": "请输入{title}",
- "pleaseSelect": "请选择{title}",
- "pleaseSelectAtLeastOne": "请至少选择一个{title}",
- "pleaseUploadAtLeastOne": "请至少上传一张{title}",
- "idCardInvalid": "身份证输入不合法",
- "mobileInvalid": "手机号输入不合法",
- "endDateBeforeStartDate": "结束日期不能小于开始日期",
- "endTimeBeforeStartTime": "结束时间必须大于开始时间",
- "maxUploadImages": "最多上传{max}张图片"
- },
- "ns-goods-sku": {
- "pointSuffix": "{point}积分"
- },
- "ns-login": {
- "bindMobileTitle": "检测到您还未绑定手机号",
- "bindMobileTip": "为了方便您接收订单等信息,需要绑定手机号",
- "mobileLabel": "手机号",
- "mobilePlaceholder": "请输入手机号",
- "captchaLabel": "验证码",
- "captchaPlaceholder": "请输入验证码",
- "dynacodeLabel": "动态码",
- "dynacodePlaceholder": "请输入动态码",
- "save": "保存",
- "welcomeTitle": "欢迎来到 {siteName}",
- "loginWithMobile": "使用手机号登录,",
- "registerLogin": "注册登录,",
- "getServicesTip": "获得订单、售后等服务。",
- "agree": "我同意",
- "privacyPolicy": "《隐私条款》",
- "userServiceAgreement": "《用户服务协议》",
- "agreeAndAuthorizeMobile": "同意隐私协议并授权手机号",
- "authorizeMobile": "授权手机号码",
- "notNow": "暂不登录",
- "avatarLabel": "头像",
- "nicknameLabel": "昵称",
- "nicknamePlaceholder": "请输入昵称",
- "getMobile": "获取手机号",
- "getDynacode": "获取动态码",
- "resendAfter": "{seconds}s后可重新获取",
- "pleaseConfirmAgreement": "请确认相关协议",
- "uploadFailed": "上传失败",
- "pleaseEnterMobile": "请输入手机号",
- "pleaseEnterCorrectMobile": "请输入正确的手机号",
- "pleaseEnterCaptcha": "请输入验证码",
- "pleaseEnterDynacode": "请输入动态码",
- "requestFail": "request:fail",
- "loggingIn": "登录中",
- "loginFailed": "登录失败",
- "pleaseAuthorizeMobile": "请授权您的手机号码",
- "pleaseEnterNickname": "请输入昵称",
- "avatarPullFailed": "头像拉取失败"
- },
- "nsNewGift": {
- "thankYouHint": "感谢您一直以来的支持,为回馈会员,商城{activityName}节日,为您提供以下福利",
- "points": "积分",
- "pointDesc": "用于参与活动购买商品时抵扣",
- "yuanRedPacket": "元红包",
- "nonWithdrawableDesc": "不可提现红包",
- "withdrawableDesc": "可提现红包",
- "yuanCoupon": "元优惠劵",
- "discount": "折",
- "couponDesc": "用于下单时抵现或兑换商品等",
- "viewNow": "立即查看"
- },
- "ns-newform": {
- "inputPlaceholder": "请输入提示语",
- "selectPlaceholder": "请选择",
- "datePlaceholder": "请选择日期",
- "timePlaceholder": "请选择时间",
- "startDate": "开始日期",
- "endDate": "结束日期",
- "startTime": "开始时间",
- "endTime": "结束时间",
- "selectProvinceCity": "请选择省市",
- "selectProvinceCityDistrict": "请选择省市区",
- "pleaseInput": "请输入{title}",
- "pleaseSelect": "请选择{title}",
- "pleaseSelectAtLeastOne": "请至少选择一个{title}",
- "pleaseUploadAtLeastOne": "请至少上传一张{title}",
- "idCardInvalid": "身份证输入不合法",
- "mobileInvalid": "手机号输入不合法",
- "endDateBeforeStartDate": "结束日期不能小于开始日期",
- "endTimeBeforeStartTime": "结束时间必须大于开始时间",
- "maxUploadImages": "最多上传{max}张图片"
- },
- "nsPayment": {
- "paymentMethod": "支付方式",
- "payAmount": "支付金额{amount}元",
- "balanceDeduction": "余额抵扣",
- "availableBalance": "可用¥{amount}",
- "noPaymentMethod": "平台尚未配置支付方式!",
- "confirmPay": "确认支付",
- "alipay": "支付宝支付",
- "wechatpay": "微信支付",
- "pleaseSelectPaymentMethod": "请选择支付方式!",
- "paying": "支付中...",
- "payInfoNotFound": "未获取到支付信息!",
- "paymentCancelled": "您已取消支付",
- "paymentFailed": "支付失败,失败原因: {reason}"
- },
- "nsSelectTime": {
- "selectDeliveryTime": "选择送达时间",
- "selectPickupTime": "选择自提时间",
- "today": "今天",
- "tomorrow": "明天",
- "sunday": "周日",
- "monday": "周一",
- "tuesday": "周二",
- "wednesday": "周三",
- "thursday": "周四",
- "friday": "周五",
- "saturday": "周六",
- "monthDayFormat": "{month}月{date}日",
- "immediateDeliveryPrefix": "立即配送(",
- "immediateDeliverySuffix": ")"
- },
- "ns-video-player-popup": {
- "videoUrlNotExist": "视频地址不存在"
- },
- "nsChatOrder": {
- "orderStatus": "订单状态:{status}",
- "deliveryMethod": "配送方式:{method}",
- "send": "发送",
- "sent": "已发送"
- },
- "nsContact": {
- "contactService": "联系客服",
- "callServiceTip": "请联系客服,客服电话是 {phone}",
- "noServiceOffline": "抱歉,商家暂无客服,请线下联系"
- },
- "nsGoodsPromotion": {
- "discount": "限时折扣",
- "groupbuy": "团购",
- "pintuan": "拼团",
- "seckill": "秒杀",
- "topic": "专题活动",
- "bargain": "砍价",
- "pinfan": "拼团返利",
- "participatingTip": "当前商品正在参加{promotionName}"
- },
- "payment": {
- "title": "支付方式",
- "payAmount": "支付金额{money}元",
- "balancePay": "余额支付",
- "availableBalance": "可用{symbol}{balance}",
- "noPaymentMethod": "平台尚未配置支付方式!",
- "confirmPay": "确认支付",
- "alipay": "支付宝支付",
- "wechatpay": "微信支付",
- "pleaseSelectPayMethod": "请选择支付方式!",
- "paying": "支付中...",
- "payInfoNotFound": "未获取到支付信息!",
- "payCancelled": "您已取消支付",
- "payFailed": "支付失败,失败原因: {reason}"
- },
- "pick-regions": {
- "cancel": "取消",
- "confirm": "完成"
- },
- "privacyPopup": {
- "title": "用户隐私保护提示",
- "descPrefix": "感谢您使用{appName},在使用前您应当阅读并同意",
- "descSuffix": ",当点击同意并继续时,即表示您已理解并同意该条款内容,该条款将对您产生法律约束力;如您不同意,将无法继续使用{appName}相关功能。",
- "disagreeBtn": "不同意",
- "agreeBtn": "同意并继续",
- "defaultContractNameMp": "用户隐私保护指引",
- "defaultAppNameMp": "本小程序",
- "defaultAppNameH5": "本应用",
- "defaultContractNameH5": "《隐私条款》",
- "defaultServiceNameH5": "《用户服务协议》",
- "disagreeTip": "未同意隐私协议,无法使用相关功能"
- },
- "registerReward": {
- "pointReward": "积分奖励",
- "points": "积分",
- "pointDesc": "用于下单时抵现或兑换商品等",
- "growthValue": "成长值",
- "growthDesc": "用于提升会员等级",
- "balanceReward": "红包奖励",
- "yuan": "元",
- "balanceDesc": "不可提现下单时可用",
- "couponReward": "优惠券奖励",
- "couponMinSpendDiscount": "满{atLeast}打{discount}折",
- "couponMinSpendReduce": "满{atLeast}减{money}",
- "couponNoThresholdDiscount": "无门槛,打{discount}折",
- "couponNoThresholdReduce": "无门槛,减{money}",
- "viewNow": "立即查看"
- },
- "wxworkContact": {
- "defaultBtnText": "添加企业微信客服",
- "popupTitle": "添加企业微信客服",
- "popupContent": "点击确定后将跳转至企业微信,添加专业客服为您服务",
- "cancelBtn": "取消",
- "confirmBtn": "确定",
- "tipTitle": "提示",
- "jumpSuccess": "跳转成功",
- "jumpFailed": "跳转失败,请检查企业微信配置",
- "notConfigured": "未配置企业微信客服信息",
- "sdkNotInitialized": "企业微信SDK未初始化",
- "openProfileFailed": "打开用户资料失败"
- },
- "yuyue-date": {
- "appointedDate": "指定日期",
- "fullyBooked": "已约满",
- "available": "可预约",
- "noSelection": "暂无选择",
- "weekdayCannotBook": "{weekday}不可以预约",
- "today": "今天",
- "tomorrow": "明天",
- "dayAfterTomorrow": "后天",
- "weekSunday": "周日",
- "weekMonday": "周一",
- "weekTuesday": "周二",
- "weekWednesday": "周三",
- "weekThursday": "周四",
- "weekFriday": "周五",
- "weekSaturday": "周六"
- }
- },
- "components-diy": {
- "diy-article": {
- "viewMore": "查看更多",
- "noArticles": "暂无相关文章"
- },
- "diy-bargain": {
- "freeGet": "低至0元免费拿",
- "bargained": "已砍",
- "onlyDiff": ",仅差",
- "minBargainTo": "最低可砍至",
- "continueBargain": "继续砍价",
- "soldCount": "已砍{num}件"
- },
- "diy-category-item": {
- "all": "全部",
- "consultNow": "立即咨询",
- "buyNow": "立即购买",
- "selectSpecs": "选规格",
- "insufficientStock": "商品库存不足",
- "purchaseLimit": "该商品每人限购{maxBuy}{unit}",
- "pieceUnit": "件"
- },
- "diy-category": {
- "expand": "展开",
- "clickToCollapse": "点击收起",
- "reachedBottom": "已经到底了~",
- "noCategory": "暂时没有分类哦!",
- "pieceUnit": "件"
- },
- "diy-channel-video": {
- "viewCountSuffix": "{count}次观看"
- },
- "diy-coupon": {
- "claim": "领取",
- "claimNow": "立即领取",
- "goUse": "去使用",
- "useNow": "立即使用",
- "goBrowse": "去逛逛",
- "yuan": "元",
- "discount": "折",
- "minSpendAvailable": "满{amount}元可用",
- "noThresholdCoupon": "无门槛优惠券",
- "minSpendUse": "满{amount}元使用",
- "noThresholdUse": "无门槛使用",
- "allProductsAvailable": "所有商品可用",
- "specifiedProductsAvailable": "指定商品可用",
- "specifiedProductsUnavailable": "指定商品不可用",
- "coupon": "优惠券",
- "noCoupons": "暂无优惠券",
- "validUntil": "有效期至{date}",
- "couponSoldOut": "该优惠券已抢光",
- "claimSuccess": "领取成功"
- },
- "diy-fenxiao-goods-list": {
- "earnPrefix": "赚 ¥",
- "follow": "关注",
- "unfollow": "取消关注",
- "followSuccess": "关注成功",
- "cancelSuccess": "取消成功",
- "tip": "提示",
- "confirmUnfollow": "确认取消关注该商品吗"
- },
- "diy-goods-list": {
- "soldCount": "已售{count}{unit}",
- "soldUnit": "件"
- },
- "diy-goods-recommend": {
- "soldPrefix": "售"
- },
- "diy-index-page": {
- "home": "首页",
- "soldCount": "已售{count}{unit}",
- "soldUnit": "件",
- "noGoodsInCategory": "该分类下暂无商品"
- },
- "diy-kefu": {
- "addNow": "立即添加"
- },
- "diy-listmenu": {
- "view": "查看"
- },
- "diy-live": {
- "anchorPrefix": "主播:",
- "goodsPrefix": "直播商品:"
- },
- "diy-map": {
- "navigate": "一键导航"
- },
- "diy-member-info": {
- "clickToAuthorizeAvatarNickname": "点击授权头像昵称",
- "clickToGetWechatAvatar": "点击获取微信头像",
- "completeInfoTitle": "获取您的昵称、头像",
- "completeInfoTip": "获取用户头像、昵称完善个人资料,主要用于向用户提供具有辨识度的用户中心界面",
- "avatarLabel": "头像",
- "nicknameLabel": "昵称",
- "nicknamePlaceholder": "请输入昵称",
- "save": "保存",
- "tip": "提示",
- "bindMobileTip": "使用会员码需先绑定手机号,是否绑定手机号?",
- "pleaseEnterNickname": "请输入昵称",
- "uploadFailed": "上传失败",
- "avatarPullFailed": "头像拉取失败"
- },
- "diy-notes": {
- "readPrefix": "阅读"
- },
- "diy-notice": {
- "notice": "公告",
- "gotIt": "我知道了"
- },
- "diy-payment-qrcode": {
- "description": "门店消费时使用,支付时点击下方展示付款码",
- "paymentCode": "付款码",
- "scanToPay": "扫码付",
- "storePayment": "门店支付",
- "popupTipTitle": "提示",
- "scanToPayTip": "扫码付请退出程序后直接使用微信扫一扫或返回上一页使用付款码进行支付",
- "gotIt": "我知道了"
- },
- "diy-pinfan": {
- "peopleGroup": "{num}人团",
- "soldCount": "已拼{num}件",
- "backPoints": "返{num}积分",
- "backCash": "返¥{num}",
- "backCoupon": "返优惠券"
- },
- "diy-pintuan": {
- "peopleParticipating": "人参与",
- "peopleGroupSuccess": "人拼团成功",
- "peopleGroup": "{num}人团",
- "soldCount": "已拼{num}件",
- "joinGroup": "去参团"
- },
- "diy-search": {
- "searchBtn": "搜索"
- },
- "diy-seckill": {
- "countdownStart": "距离开始",
- "countdownEnd": "距离结束",
- "soldPercent": "已抢{percent}%",
- "originalPrice": "原价:",
- "comingSoon": "即将开始",
- "seckillComingSoonTip": "秒杀活动即将开启,敬请期待!"
- },
- "diy-store": {
- "switchStore": "切换门店",
- "locating": "定位中",
- "gettingLocation": "获取位置中",
- "searchPlaceholder": "搜索"
- },
- "diy-text": {
- "zone": "专区"
- },
- "diy-video": {
- "h5PreloadFailed": "H5端预加载视频失败",
- "videoLoadFailed": "视频加载失败"
- }
- },
- "contact": {
- "contact": {
- "title": "电子名片",
- "enterpriseFiles": "企业文件",
- "enterpriseVideos": "企业视频",
- "onlineMessage": "在线留言",
- "exclusiveCustomerService": "专属客服",
- "contactUs": "联系我们",
- "share": "分享",
- "call": "拨打",
- "copy": "复制",
- "oneClickNavigation": "一键导航",
- "name": "姓名",
- "pleaseEnterName": "请输入姓名",
- "contactInfo": "联系方式",
- "pleaseEnterMobile": "请输入手机号",
- "messageContent": "留言内容",
- "pleaseEnterMessage": "请输入留言内容",
- "submit": "提交",
- "videoUrlNotExist": "视频地址不存在",
- "pleaseFillName": "请填写姓名",
- "invalidMobileFormat": "手机号格式不正确",
- "pleaseFillMessage": "请填写留言内容",
- "submitSuccess": "提交成功",
- "submitFailed": "提交失败,请重试",
- "copySuccess": "复制成功",
- "copyFailed": "复制失败"
- }
- },
"empty": {
"index": {
"title": ""
}
},
+ "vr": {
+ "index": {
+ "title": "VR"
+ }
+ },
+ "game": {
+ "turntable": {
+ "title": "大转盘"
+ },
+ "smash_eggs": {
+ "title": "砸金蛋"
+ },
+ "record": {
+ "title": "中奖纪录"
+ },
+ "cards": {
+ "title": "刮刮乐"
+ }
+ },
+ "pay": {
+ "index": {
+ "title": "支付方式",
+ "paymentAmount": "支付金额",
+ "confirmPayment": "确认支付",
+ "seeOrder": "查看订单"
+ },
+ "cashier": {
+ "title": "收银台",
+ "confirmPay": "确认支付",
+ "noPayMethodConfigured": "店铺尚未配置支付方式!",
+ "orderAlreadyPaid": "该支付单据已支付",
+ "noPayInfo": "未获取到支付信息",
+ "alipay": "支付宝支付",
+ "wechatpay": "微信支付",
+ "pleaseSelectPayMethod": "请选择支付方式!",
+ "paying": "支付中...",
+ "paymentCancelled": "您已取消支付",
+ "paymentFailed": "支付失败,失败原因: {reason}"
+ },
+ "wx_pay": {
+ "title": "微信支付",
+ "openInBrowserTip": "点击右上角跳转到浏览器打开"
+ },
+ "result": {
+ "title": "支付结果",
+ "paymentSuccess": "支付成功",
+ "paymentFail": "支付失败",
+ "goHome": "回到首页",
+ "memberCenter": "会员中心",
+ "payMoney": "支付金额",
+ "unit": "元",
+ "congratulations": "恭喜您获得",
+ "points": "积分",
+ "growthValue": "成长值",
+ "couponsCount": "{count}张优惠券",
+ "rechargeRecords": "充值记录",
+ "memberCard": "会员卡",
+ "viewOrder": "查看订单",
+ "noPayInfo": "未获取到支付信息!"
+ }
+ },
+ "seal": {
+ "medium": {
+ "search": {
+ "title": "介质材料搜索",
+ "placeholder": "请输入关键词搜索",
+ "searchResult": "搜索结果",
+ "noData": "暂无数据",
+ "tip": "提示",
+ "confirmDeleteAllHistory": "确定要删除全部搜索历史吗?",
+ "confirmDeleteHistory": "确定要删除这条搜索历史吗?"
+ },
+ "detail": {
+ "title": "介质材料详情",
+ "exportImage": "导出图片",
+ "exportPdf": "导出PDF",
+ "loading": "加载中",
+ "fileNotExist": "文件不存在",
+ "saveSuccess": "保存成功",
+ "saveFailed": "保存失败",
+ "downloadFailed": "下载失败"
+ }
+ },
+ "structure": {
+ "title": "结构选型",
+ "currentChoicePrefix": "当前选择:",
+ "pleaseSelect": "请选择",
+ "resultPrefix": "选型结果:",
+ "resultFile": "结果文件",
+ "selectMaterial": "请选择材质",
+ "selectStructure": "请选择结构",
+ "uploadImage": "上传图片",
+ "pleaseUploadImage": "请上传图片",
+ "submitRequirement": "提交需求",
+ "submitSuccess": "提交成功"
+ }
+ },
+ "hongbao": {
+ "my_hongbao": {
+ "title": "我的红包列表"
+ },
+ "list": {
+ "title": "瓜分红包列表"
+ }
+ },
+ "store_notes": {
+ "note_detail": {
+ "title": "笔记详情"
+ },
+ "note_list": {
+ "title": "店铺笔记"
+ }
+ },
"fenxiao": {
- "apply": {
- "title": "",
- "pleaseFillApplyInfo": "请填写申请信息",
- "inviter": "邀请人",
- "nameLabel": "名称",
- "namePlaceholder": "请输入{name}名称",
- "mobile": "手机号",
- "mobilePlaceholder": "请输入手机号",
- "haveReadAndUnderstand": "我已阅读并了解",
- "applyAgreement": "【{name}申请协议】",
- "applyBecome": "申请成为{name}",
- "reapply": "重新申请",
- "applyConditionTitle": "分销商申请条件",
- "becomeConditionTitle": "成为分销商的条件",
- "conditionConsumeCount": "申请成为{name},需要您的消费次数达到{count}次",
- "conditionConsumeMoney": "申请成为{name},需要您的消费金额达到{money}元",
- "conditionBuyGoods": "申请成为{name},需要购买以下指定商品(任选其一)",
- "becomeConditionBuyGoods": "成为{name},需要购买以下指定商品(任选其一)",
- "expandMore": "展开更多",
- "collapse": "收起",
- "notFenxiao": "您还不是分销商",
- "applyPending": "您已提交{name}申请,等待平台审核",
- "applyRejected": "您提交的{name}申请,已被拒绝,请再接再厉",
- "none": "无",
- "merchantNotOpenFenxiao": "商家未开启分销",
- "pleaseReadAndCheckAgreement": "请仔细阅读协议,并勾选",
- "applySuffix": "申请",
- "pleaseEnterName": "请输入{name}名称",
- "pleaseEnterMobile": "请输入手机号",
- "pleaseEnterValidMobile": "请输入正确的手机号"
- },
- "bill": {
- "title": "账单",
- "billNoPrefix": "账单编号:",
- "noBill": "暂无账单信息",
- "addonClosed": "商家未开启分销"
- },
- "child_fenxiao": {
- "title": "分销商",
- "joinTime": "加入时间:",
- "peopleUnit": "人",
- "orderUnit": "单",
- "currencyUnit": "元",
- "noData": "暂无数据",
- "merchantNotOpenFenxiao": "商家未开启分销"
- },
- "follow": {
- "title": "我的关注"
- },
- "goods_list": {
- "title": "",
- "all": "全部",
- "share": "分享",
- "earnCommission": "赚{money}元",
- "noGoods": "暂无分销商品",
- "shareFriends": "分享好友",
- "generatePoster": "生成海报",
- "shareTitle": "分享",
- "shareToFriends": "分享给好友",
- "shareToGoodsCircle": "分享到好物圈",
- "generateSharePoster": "生成分享海报",
- "copyLink": "复制链接",
- "cancelShare": "取消分享",
- "saveImage": "保存图片",
- "longPressSaveImage": "长按保存图片",
- "merchantNotOpenFenxiao": "商家未开启分销",
- "center": "中心",
- "posterGenerating": "海报生成中...",
- "saveSuccess": "保存成功",
- "saveFail": "保存失败,请稍后重试"
- },
"index": {
"title": "",
"superiorAgent": "上级代理商",
@@ -993,6 +800,19 @@
"inviteFenxiaoCount": "邀请好友成为分销商人数达到{count}人",
"inviteFenxiaoCountTip": "分销商的直属下级分销商人数"
},
+ "withdrawal_detail": {
+ "title": "",
+ "currentStatus": "当前状态",
+ "transactionNo": "交易号",
+ "serviceFee": "手续费",
+ "applyTime": "申请时间",
+ "auditTime": "审核时间",
+ "bankName": "银行名称",
+ "receivingAccount": "收款账号",
+ "refuseReason": "拒绝理由",
+ "transferTypeName": "转账方式名称",
+ "transferTime": "转账时间"
+ },
"level": {
"title": "",
"levelSuffix": "等级",
@@ -1024,6 +844,88 @@
"inviteFenxiaoCount": "邀请好友成为分销商人数达到{count}人",
"inviteFenxiaoCountTip": "分销商的直属下级分销商人数达到{count}人"
},
+ "withdraw_list": {
+ "title": "",
+ "transferTypeBalance": "余额",
+ "transferTypeAlipay": "支付宝",
+ "transferTypeBank": "银行卡",
+ "transferTypeWechatpay": "微信",
+ "statusTransferred": "已转账",
+ "statusPendingReview": "待审核",
+ "statusReviewed": "已审核",
+ "statusRejected": "已拒绝",
+ "noWithdrawRecords": "暂无提现记录",
+ "detailSuffix": "明细",
+ "merchantNotOpenFenxiao": "商家未开启分销"
+ },
+ "child_fenxiao": {
+ "title": "分销商",
+ "joinTime": "加入时间:",
+ "peopleUnit": "人",
+ "orderUnit": "单",
+ "currencyUnit": "元",
+ "noData": "暂无数据",
+ "merchantNotOpenFenxiao": "商家未开启分销"
+ },
+ "order_detail": {
+ "title": "订单详情",
+ "totalItems": "共{count}件商品",
+ "statusRefunded": "已退款",
+ "statusSettled": "已结算",
+ "statusPendingSettlement": "待结算",
+ "totalLabel": "合计:",
+ "commissionDetail": "返佣详情",
+ "orderNo": "订单编号:",
+ "commissionLevel": "分佣层级:",
+ "levelText": "{level}级",
+ "commissionAmount": "返佣金额:",
+ "merchantNotOpenFenxiao": "商家未开启分销",
+ "orderInfoNotFound": "未获取到订单信息!"
+ },
+ "apply": {
+ "title": "",
+ "pleaseFillApplyInfo": "请填写申请信息",
+ "inviter": "邀请人",
+ "nameLabel": "名称",
+ "namePlaceholder": "请输入{name}名称",
+ "mobile": "手机号",
+ "mobilePlaceholder": "请输入手机号",
+ "haveReadAndUnderstand": "我已阅读并了解",
+ "applyAgreement": "【{name}申请协议】",
+ "applyBecome": "申请成为{name}",
+ "reapply": "重新申请",
+ "applyConditionTitle": "分销商申请条件",
+ "becomeConditionTitle": "成为分销商的条件",
+ "conditionConsumeCount": "申请成为{name},需要您的消费次数达到{count}次",
+ "conditionConsumeMoney": "申请成为{name},需要您的消费金额达到{money}元",
+ "conditionBuyGoods": "申请成为{name},需要购买以下指定商品(任选其一)",
+ "becomeConditionBuyGoods": "成为{name},需要购买以下指定商品(任选其一)",
+ "expandMore": "展开更多",
+ "collapse": "收起",
+ "notFenxiao": "您还不是分销商",
+ "applyPending": "您已提交{name}申请,等待平台审核",
+ "applyRejected": "您提交的{name}申请,已被拒绝,请再接再厉",
+ "none": "无",
+ "merchantNotOpenFenxiao": "商家未开启分销",
+ "pleaseReadAndCheckAgreement": "请仔细阅读协议,并勾选",
+ "applySuffix": "申请",
+ "pleaseEnterName": "请输入{name}名称",
+ "pleaseEnterMobile": "请输入手机号",
+ "pleaseEnterValidMobile": "请输入正确的手机号"
+ },
+ "ranking_list": {
+ "title": "排行榜",
+ "clickToWithdraw": "点击提现",
+ "myTeam": "我的团队",
+ "distributionCommission": "分销佣金",
+ "todayCommission": "{amount}元",
+ "commissionRanking": "佣金排行",
+ "promotionCount": "推广人数",
+ "promotionPeople": "{count}人",
+ "promotionRanking": "推广排行",
+ "rankingTip": "您排行第{ranking}名",
+ "noData": "暂无数据"
+ },
"order": {
"title": "",
"all": "全部",
@@ -1042,20 +944,15 @@
"merchantNotOpenFenxiao": "商家未开启分销",
"orderSuffix": "订单"
},
- "order_detail": {
- "title": "订单详情",
- "totalItems": "共{count}件商品",
+ "relation": {
+ "title": "",
"statusRefunded": "已退款",
"statusSettled": "已结算",
"statusPendingSettlement": "待结算",
+ "earnPrefix": "返",
"totalLabel": "合计:",
- "commissionDetail": "返佣详情",
- "orderNo": "订单编号:",
- "commissionLevel": "分佣层级:",
- "levelText": "{level}级",
- "commissionAmount": "返佣金额:",
- "merchantNotOpenFenxiao": "商家未开启分销",
- "orderInfoNotFound": "未获取到订单信息!"
+ "noOrders": "暂无订单",
+ "orderSuffix": "订单"
},
"promote": {
"title": "推广",
@@ -1068,6 +965,12 @@
"inviteFriends": "邀请好友",
"merchantNotOpenFenxiao": "商家未开启分销"
},
+ "bill": {
+ "title": "账单",
+ "billNoPrefix": "账单编号:",
+ "noBill": "暂无账单信息",
+ "addonClosed": "商家未开启分销"
+ },
"promote_code": {
"title": "推广海报",
"longPressTip": "长按识别图中二维码",
@@ -1082,52 +985,27 @@
"posterGenerateFail": "海报生成失败",
"merchantNotOpenFenxiao": "商家未开启分销"
},
- "ranking_list": {
- "title": "排行榜",
- "clickToWithdraw": "点击提现",
- "myTeam": "我的团队",
- "distributionCommission": "分销佣金",
- "todayCommission": "{amount}元",
- "commissionRanking": "佣金排行",
- "promotionCount": "推广人数",
- "promotionPeople": "{count}人",
- "promotionRanking": "推广排行",
- "rankingTip": "您排行第{ranking}名",
- "noData": "暂无数据"
- },
- "relation": {
+ "goods_list": {
"title": "",
- "statusRefunded": "已退款",
- "statusSettled": "已结算",
- "statusPendingSettlement": "待结算",
- "earnPrefix": "返",
- "totalLabel": "合计:",
- "noOrders": "暂无订单",
- "orderSuffix": "订单"
- },
- "team": {
- "title": "",
- "levelOne": "一级",
- "levelTwo": "二级",
- "joinTime": "加入时间:",
- "peopleUnit": "人",
- "orderUnit": "单",
- "currencyUnit": "元",
- "noData": "暂无数据",
- "merchantNotOpenFenxiao": "商家未开启分销"
- },
- "withdrawal_detail": {
- "title": "",
- "currentStatus": "当前状态",
- "transactionNo": "交易号",
- "serviceFee": "手续费",
- "applyTime": "申请时间",
- "auditTime": "审核时间",
- "bankName": "银行名称",
- "receivingAccount": "收款账号",
- "refuseReason": "拒绝理由",
- "transferTypeName": "转账方式名称",
- "transferTime": "转账时间"
+ "all": "全部",
+ "share": "分享",
+ "earnCommission": "赚{money}元",
+ "noGoods": "暂无分销商品",
+ "shareFriends": "分享好友",
+ "generatePoster": "生成海报",
+ "shareTitle": "分享",
+ "shareToFriends": "分享给好友",
+ "shareToGoodsCircle": "分享到好物圈",
+ "generateSharePoster": "生成分享海报",
+ "copyLink": "复制链接",
+ "cancelShare": "取消分享",
+ "saveImage": "保存图片",
+ "longPressSaveImage": "长按保存图片",
+ "merchantNotOpenFenxiao": "商家未开启分销",
+ "center": "中心",
+ "posterGenerating": "海报生成中...",
+ "saveSuccess": "保存成功",
+ "saveFail": "保存失败,请稍后重试"
},
"withdraw_apply": {
"title": "",
@@ -1148,27 +1026,1216 @@
"pleaseAddWithdrawMethod": "请先添加提现方式",
"withdrawApplySuccess": "提现申请成功"
},
- "withdraw_list": {
+ "follow": {
+ "title": "我的关注"
+ },
+ "team": {
"title": "",
- "transferTypeBalance": "余额",
- "transferTypeAlipay": "支付宝",
- "transferTypeBank": "银行卡",
- "transferTypeWechatpay": "微信",
- "statusTransferred": "已转账",
- "statusPendingReview": "待审核",
- "statusReviewed": "已审核",
- "statusRejected": "已拒绝",
- "noWithdrawRecords": "暂无提现记录",
- "detailSuffix": "明细",
+ "levelOne": "一级",
+ "levelTwo": "二级",
+ "joinTime": "加入时间:",
+ "peopleUnit": "人",
+ "orderUnit": "单",
+ "currencyUnit": "元",
+ "noData": "暂无数据",
"merchantNotOpenFenxiao": "商家未开启分销"
}
},
- "file-preview": {
- "file-preview": {
- "title": "文件预览",
- "fileUrlNotExist": "文件地址不存在",
- "videoUrlNotExist": "视频地址不存在",
- "unsupportedFileType": "暂不支持该类型文件预览"
+ "merch": {
+ "detail": {
+ "title": "商户首页",
+ "searchPlaceholder": "请输入您要搜索的商品",
+ "desc": {
+ "scrollUpToViewMore": "上滑查看更多",
+ "collapse": "↑ 收起",
+ "expand": "↓ 展开"
+ },
+ "sort": {
+ "comprehensive": "综合",
+ "sales": "销量",
+ "price": "价格",
+ "filter": "筛选"
+ },
+ "goods": {
+ "consultNow": "立即咨询",
+ "sold": "已售{num}{unit}",
+ "defaultUnit": "件",
+ "noGoods": "暂无商品"
+ },
+ "filter": {
+ "title": "筛选",
+ "allCategories": "全部分类",
+ "all": "全部",
+ "reset": "重置",
+ "confirm": "确定"
+ },
+ "modal": {
+ "title": "提示",
+ "merchantNotExist": "商家不存在"
+ }
+ },
+ "edit": {
+ "title": "编辑商品",
+ "addTitle": "添加商品",
+ "grounding": {
+ "offShelf": "下架",
+ "onShelf": "上架"
+ },
+ "pickupType": {
+ "sameDay": "当日达",
+ "nextDay": "次日达",
+ "dayAfter": "隔日达"
+ },
+ "virtualDeliver": {
+ "auto": "自动发货",
+ "manual": "手动发货",
+ "verify": "到店核销"
+ },
+ "virtualReceive": {
+ "auto": "自动收货",
+ "buyerConfirm": "买家确认收货"
+ },
+ "validityType": {
+ "permanent": "永久",
+ "daysAfterPurchase": "购买后几日有效",
+ "specifiedDate": "指定过期日期"
+ },
+ "carmi": {
+ "add": "添加卡密",
+ "addWithCount": "添加卡密【{count}】"
+ },
+ "limitType": {
+ "single": "单次限购",
+ "longTerm": "长期限购"
+ },
+ "message": {
+ "goodsNotExist": "商品不存在",
+ "maxCategory": "商品可以属于多个分类,最多10个",
+ "pleaseEnterGoodsName": "请输入商品名称",
+ "subtitleMaxLength": "商品简介不能超过{max}个字符",
+ "pleaseUploadGoodsImage": "请上传商品图片",
+ "pleaseEnterSalePrice": "请输入销售价",
+ "salePriceFormatError": "[销售价]格式输入错误",
+ "originalPriceFormatError": "[原价价]格式输入错误",
+ "pleaseEnterStock": "请输入库存",
+ "stockFormatError": "[库存]格式输入错误",
+ "minOrderFormatError": "[起售]格式输入错误",
+ "minOrderNotLessThanZero": "起售数量不能小于0"
+ },
+ "placeholder": {
+ "selectGoodsForm": "请选择商品表单",
+ "selectSupplier": "请选择供应商"
+ }
+ },
+ "list": {
+ "title": "商品列表",
+ "searchPlaceholder": "请输入您要搜索的商品",
+ "buyText": "购买",
+ "sort": {
+ "comprehensive": "综合",
+ "sales": "销量",
+ "price": "价格",
+ "filter": "筛选"
+ },
+ "goods": {
+ "consultNow": "立即咨询",
+ "sold": "已售{num}{unit}",
+ "defaultUnit": "件",
+ "noGoods": "暂无商品"
+ },
+ "filter": {
+ "title": "筛选",
+ "allCategories": "全部分类",
+ "all": "全部",
+ "reset": "重置",
+ "confirm": "确定"
+ },
+ "modal": {
+ "title": "提示",
+ "merchantNotExist": "商家不存在"
+ },
+ "shareTitle": "搜索到{count}件\"{keyword}\"相关的优质商品",
+ "priceFilter": {
+ "pleaseEnterMaxPrice": "请输入最高价",
+ "priceCannotBeLessThanZero": "筛选价格不能小于0",
+ "minCannotExceedMax": "最低价不能大于最高价",
+ "maxCannotBeLessThanMin": "最高价不能小于最低价"
+ }
+ },
+ "merchcategory": {
+ "title": "入驻商户"
+ }
+ },
+ "pintuan": {
+ "detail": {
+ "title": "",
+ "select": "选择",
+ "params": "参数",
+ "service": "商品服务",
+ "allGoods": "全部商品",
+ "image": "图片",
+ "video": "视频"
+ },
+ "payment": {
+ "title": "待付款订单"
+ },
+ "my_spell": {
+ "title": "我的拼单"
+ },
+ "share": {
+ "title": "拼团分享"
+ },
+ "list": {
+ "title": "拼团专区"
+ }
+ },
+ "components-diy": {
+ "diy-seckill": {
+ "countdownStart": "距离开始",
+ "countdownEnd": "距离结束",
+ "soldPercent": "已抢{percent}%",
+ "originalPrice": "原价:",
+ "comingSoon": "即将开始",
+ "seckillComingSoonTip": "秒杀活动即将开启,敬请期待!"
+ },
+ "diy-map": {
+ "navigate": "一键导航"
+ },
+ "diy-article": {
+ "viewMore": "查看更多",
+ "noArticles": "暂无相关文章"
+ },
+ "diy-pintuan": {
+ "peopleParticipating": "人参与",
+ "peopleGroupSuccess": "人拼团成功",
+ "peopleGroup": "{num}人团",
+ "soldCount": "已拼{num}件",
+ "joinGroup": "去参团"
+ },
+ "diy-category": {
+ "expand": "展开",
+ "clickToCollapse": "点击收起",
+ "reachedBottom": "已经到底了~",
+ "noCategory": "暂时没有分类哦!",
+ "pieceUnit": "件"
+ },
+ "diy-listmenu": {
+ "view": "查看"
+ },
+ "diy-bargain": {
+ "freeGet": "低至0元免费拿",
+ "bargained": "已砍",
+ "onlyDiff": ",仅差",
+ "minBargainTo": "最低可砍至",
+ "continueBargain": "继续砍价",
+ "soldCount": "已砍{num}件"
+ },
+ "diy-search": {
+ "searchBtn": "搜索"
+ },
+ "diy-index-page": {
+ "home": "首页",
+ "soldCount": "已售{count}{unit}",
+ "soldUnit": "件",
+ "noGoodsInCategory": "该分类下暂无商品"
+ },
+ "diy-pinfan": {
+ "peopleGroup": "{num}人团",
+ "soldCount": "已拼{num}件",
+ "backPoints": "返{num}积分",
+ "backCash": "返¥{num}",
+ "backCoupon": "返优惠券"
+ },
+ "diy-coupon": {
+ "claim": "领取",
+ "claimNow": "立即领取",
+ "goUse": "去使用",
+ "useNow": "立即使用",
+ "goBrowse": "去逛逛",
+ "yuan": "元",
+ "discount": "折",
+ "minSpendAvailable": "满{amount}元可用",
+ "noThresholdCoupon": "无门槛优惠券",
+ "minSpendUse": "满{amount}元使用",
+ "noThresholdUse": "无门槛使用",
+ "allProductsAvailable": "所有商品可用",
+ "specifiedProductsAvailable": "指定商品可用",
+ "specifiedProductsUnavailable": "指定商品不可用",
+ "coupon": "优惠券",
+ "noCoupons": "暂无优惠券",
+ "validUntil": "有效期至{date}",
+ "couponSoldOut": "该优惠券已抢光",
+ "claimSuccess": "领取成功"
+ },
+ "diy-live": {
+ "anchorPrefix": "主播:",
+ "goodsPrefix": "直播商品:"
+ },
+ "diy-channel-video": {
+ "viewCountSuffix": "{count}次观看"
+ },
+ "diy-goods-list": {
+ "soldCount": "已售{count}{unit}",
+ "soldUnit": "件"
+ },
+ "diy-goods-recommend": {
+ "soldPrefix": "售"
+ },
+ "diy-store": {
+ "switchStore": "切换门店",
+ "locating": "定位中",
+ "gettingLocation": "获取位置中",
+ "searchPlaceholder": "搜索"
+ },
+ "diy-notes": {
+ "readPrefix": "阅读"
+ },
+ "diy-kefu": {
+ "addNow": "立即添加"
+ },
+ "diy-fenxiao-goods-list": {
+ "earnPrefix": "赚 ¥",
+ "follow": "关注",
+ "unfollow": "取消关注",
+ "followSuccess": "关注成功",
+ "cancelSuccess": "取消成功",
+ "tip": "提示",
+ "confirmUnfollow": "确认取消关注该商品吗"
+ },
+ "diy-text": {
+ "zone": "专区"
+ },
+ "diy-payment-qrcode": {
+ "description": "门店消费时使用,支付时点击下方展示付款码",
+ "paymentCode": "付款码",
+ "scanToPay": "扫码付",
+ "storePayment": "门店支付",
+ "popupTipTitle": "提示",
+ "scanToPayTip": "扫码付请退出程序后直接使用微信扫一扫或返回上一页使用付款码进行支付",
+ "gotIt": "我知道了"
+ },
+ "diy-category-item": {
+ "all": "全部",
+ "consultNow": "立即咨询",
+ "buyNow": "立即购买",
+ "selectSpecs": "选规格",
+ "insufficientStock": "商品库存不足",
+ "purchaseLimit": "该商品每人限购{maxBuy}{unit}",
+ "pieceUnit": "件"
+ },
+ "diy-member-info": {
+ "clickToAuthorizeAvatarNickname": "点击授权头像昵称",
+ "clickToGetWechatAvatar": "点击获取微信头像",
+ "completeInfoTitle": "获取您的昵称、头像",
+ "completeInfoTip": "获取用户头像、昵称完善个人资料,主要用于向用户提供具有辨识度的用户中心界面",
+ "avatarLabel": "头像",
+ "nicknameLabel": "昵称",
+ "nicknamePlaceholder": "请输入昵称",
+ "save": "保存",
+ "tip": "提示",
+ "bindMobileTip": "使用会员码需先绑定手机号,是否绑定手机号?",
+ "pleaseEnterNickname": "请输入昵称",
+ "uploadFailed": "上传失败",
+ "avatarPullFailed": "头像拉取失败"
+ },
+ "diy-notice": {
+ "notice": "公告",
+ "gotIt": "我知道了"
+ },
+ "diy-video": {
+ "h5PreloadFailed": "H5端预加载视频失败",
+ "videoLoadFailed": "视频加载失败"
+ }
+ },
+ "member": {
+ "index": {
+ "title": "会员中心",
+ "login": "登录\/注册",
+ "loginTips": "点击登录 享受更多精彩信息",
+ "memberLevel": "会员等级",
+ "moreAuthority": "更多权限",
+ "allOrders": "全部订单",
+ "seeAllOrders": "查看全部订单",
+ "waitPay": "待付款",
+ "readyDelivery": "待发货",
+ "waitDelivery": "待收货",
+ "refunding": "退款",
+ "getDynacode": "获取动态验证码",
+ "sign": "签到",
+ "personInfo": "个人资料",
+ "receivingAddress": "收货地址",
+ "accountList": "账户列表",
+ "couponList": "优惠券",
+ "mySpellList": "我的拼单",
+ "myBargain": "我的砍价",
+ "virtualCode": "虚拟码",
+ "winningRecord": "我的礼品",
+ "myCollection": "我的关注",
+ "myTracks": "我的足迹",
+ "pintuanOrder": "拼团订单",
+ "yushouOrder": "预售订单",
+ "verification": "核销台",
+ "message": "我的消息",
+ "exchangeOrder": "积分兑换",
+ "waitpay": "待付款",
+ "waitsend": "待发货",
+ "waitconfirm": "待收货",
+ "activist": "售后",
+ "completed": "已完成",
+ "balance": "余额",
+ "point": "积分",
+ "coupon": "优惠券",
+ "memberRecommend": "邀请有礼",
+ "myPresale": "我的预售",
+ "myGiftcard": "我的礼品卡",
+ "myDivideticket": "我的瓜分券",
+ "myRebate": "拼团返利",
+ "myHongbao": "我的红包列表",
+ "myBlindBox": "我的盲盒",
+ "logout": "退出登录",
+ "cancellation": "账号注销",
+ "logoutTitle": "提示",
+ "logoutContent": "确定要退出登录吗",
+ "cancellationTitle": "风险提示",
+ "cancellationContent": "确定要注销当前账号吗?",
+ "privacyPolicy": "隐私协议",
+ "registrationAgreement": "注册协议",
+ "iKnow": "我知道了"
+ },
+ "address": {
+ "title": "收货地址",
+ "newAddAddress": "添加收货地址",
+ "getAddress": "一键获取地址",
+ "is_default": "默认",
+ "modify": "编辑",
+ "del": "删除",
+ "setAsDefault": "设为默认地址",
+ "emptyTip": "暂无收货地址,请添加",
+ "operationTip": "操作提示",
+ "confirmDelete": "确定要删除该地址吗?",
+ "cannotDeleteDefault": "默认地址,不能删除",
+ "deleteSuccess": "删除成功",
+ "deleteFail": "删除失败",
+ "setDefaultSuccess": "修改默认地址成功",
+ "pcWechatNotSupportGetAddress": "PC端微信不支持一键获取地址"
+ },
+ "assets": {
+ "title": "账号注销",
+ "riskTip": "风险提示:确认申请后您的资产将被清空且不可找回!",
+ "accountAssets": "账户资产",
+ "point": "积分",
+ "cashBalance": "现金余额",
+ "storedValueBalance": "储值余额",
+ "coupon": "优惠券",
+ "orderAssets": "订单资产",
+ "waitDelivery": "待发货",
+ "waitReceive": "待收货",
+ "refunding": "退款中",
+ "fenxiaoAssets": "分销资产",
+ "withdrawableCommission": "可提现佣金",
+ "withdrawingCommission": "提现中佣金",
+ "waitSettleOrder": "待结算订单",
+ "prevStep": "上一步",
+ "confirmApply": "确认申请"
+ },
+ "withdrawal": {
+ "title": "提现记录",
+ "emptyTips": "暂无提现记录"
+ },
+ "address_edit": {
+ "title": "编辑收货地址",
+ "addTitle": "新增收货地址",
+ "consignee": "姓名",
+ "consigneePlaceholder": "收货人姓名",
+ "mobile": "手机",
+ "mobilePlaceholder": "收货人手机号",
+ "telephone": "电话",
+ "telephonePlaceholder": "收货人固定电话(选填)",
+ "receivingCity": "地区",
+ "address": "详细地址",
+ "addressPlaceholder": "小区、街道、写字楼",
+ "save": "保存",
+ "member": {
+ "addressEdit": {
+ "addressInfo": "地址信息",
+ "selectRegionPlaceholder": "请选择省市区县",
+ "dataError": "数据有误",
+ "pleaseEnterName": "请输入姓名",
+ "pleaseEnterMobile": "请输入手机号",
+ "pleaseEnterValidMobile": "请输入正确的手机号",
+ "pleaseSelectRegion": "请选择省市区县",
+ "addressRequired": "详细地址不能为空"
+ }
+ }
+ },
+ "withdrawal_detail": {
+ "title": "提现详情",
+ "currentStatus": "当前状态",
+ "transactionNo": "交易号",
+ "serviceFee": "手续费",
+ "applyTime": "申请时间",
+ "auditTime": "审核时间",
+ "bankName": "银行名称",
+ "receivingAccount": "收款账号",
+ "refuseReason": "拒绝理由",
+ "transferTypeName": "转账方式名称",
+ "transferTime": "转账时间"
+ },
+ "level": {
+ "title": "会员等级",
+ "defaultLevelTips": "您已经是最高级别的会员了!",
+ "tag": "专属标签",
+ "tagDesc": "标签达人",
+ "discount": "专享折扣",
+ "discountDesc": "专享{0}折",
+ "service": "优质服务",
+ "serviceDesc": "360度全方位",
+ "memberLevel": "会员等级",
+ "condition": "条件",
+ "equity": "权益",
+ "giftPackage": "升级礼包",
+ "levelExplain": "等级说明",
+ "upgradeTips": "升级会员,享专属权益",
+ "currentLevelLabel": "当前等级:",
+ "growthRules": "成长规则",
+ "currentLevelTag": "当前等级",
+ "currentGrowthValue": "当前成长值",
+ "growthToNextLevel": "再获得{needGrowth}成长值成为{levelName}",
+ "maxLevelReached": "您现在已经是最高等级",
+ "memberBenefits": "会员权益",
+ "freeShipping": "包邮服务",
+ "freeShippingDesc": "提供商品包邮服务",
+ "consumptionDiscount": "享受消费折扣服务",
+ "noDiscountDesc": "不享受任何消费折扣和其他权益",
+ "discountDescWithValue": "提供{discount}折消费折扣",
+ "pointsReward": "享受积分回馈服务",
+ "pointsRewardDesc": "提供{multiplier}倍积分回馈倍率",
+ "memberGift": "会员礼包",
+ "pointsGift": "积分礼包",
+ "giftPoints": "赠送{points}积分",
+ "redPacketGift": "红包礼包",
+ "giftRedPacket": "赠送{amount}元红包",
+ "couponGift": "优惠券礼包",
+ "giftCoupons": "赠送{count}张优惠券",
+ "coupons": "优惠券",
+ "yuan": "元",
+ "zhe": "折",
+ "navigatingToDetail": "将前往详情页面"
+ },
+ "modify_face": {
+ "title": "修改头像",
+ "clickToUpload": "点击上传",
+ "confirmSave": "确认保存",
+ "reupload": "重新上传",
+ "uploadFailed": "头像上传失败",
+ "modifySuccess": "头像修改成功"
+ },
+ "contact": {
+ "title": "客服"
+ },
+ "gift_detail": {
+ "title": "礼品订单"
+ },
+ "balance_detail": {
+ "title": "余额明细",
+ "emptyTips": "暂无余额明细",
+ "yuan": "元",
+ "filterAll": "全部",
+ "filterIncome": "收入",
+ "filterExpense": "支出",
+ "dateFormatYM": "{year}年{month}月"
+ },
+ "level_growth_rules": {
+ "title": "成长值说明",
+ "level": "等级",
+ "growthValue": "成长值",
+ "whatIsGrowthValue": "什么是成长值",
+ "growthValueDescription": "成长值是消费者在店铺成为会员后,通过消费计算出来的值。成长值决定会员等级,会员等级越高,所享受的会员权益和会员礼包就越多。",
+ "howToGetGrowthValue": "如何获得成长值",
+ "ruleRegister": "1、注册会员送x成长值。",
+ "ruleRecharge": "2、会员充值到余额送x成长值。",
+ "ruleCheckin": "3、会员签到送x成长值。",
+ "ruleConsume": "4、会员消费x元,交易完成即可获得x个成长值。",
+ "navigatingToDetail": "将前往详情页面"
+ },
+ "info_edit": {
+ "title": "个人资料",
+ "headImg": "头像",
+ "account": "账号",
+ "username": "用户名",
+ "nickname": "昵称",
+ "realName": "真实姓名",
+ "sex": "性别",
+ "birthday": "生日",
+ "password": "密码",
+ "paypassword": "支付密码",
+ "mobilePhone": "手机",
+ "bindMobile": "绑定手机",
+ "cancellation": "注销账号",
+ "lang": "语言",
+ "logout": "退出登录",
+ "save": "保存",
+ "noset": "未设置",
+ "usernamePlaceholder": "请输入新用户名",
+ "nickPlaceholder": "请输入新昵称",
+ "pleaseRealName": "请输入真实姓名",
+ "nowPassword": "当前密码",
+ "newPassword": "新密码",
+ "confirmPassword": "确认新密码",
+ "phoneNumber": "手机号",
+ "confirmCode": "验证码",
+ "confirmCodeInput": "请输入验证码",
+ "confirmCodeInputerror": "验证码错误",
+ "findanimateCode": "获取动态码",
+ "animateCode": "动态码",
+ "animateCodeInput": "请输入动态码",
+ "modifyNickname": "修改昵称",
+ "modifyPassword": "修改密码",
+ "bindPhone": "绑定手机",
+ "alikeusername": "与原用户名一致,无需修改",
+ "noEmityUsername": "用户名不能为空",
+ "alikeNickname": "与原昵称一致,无需修改",
+ "noEmityNickname": "昵称不能为空",
+ "updateSuccess": "修改成功",
+ "pleaseInputOldPassword": "请输入原始密码",
+ "pleaseInputNewPassword": "请输入新密码",
+ "passwordLength": "密码长度不能小于6位",
+ "alikePassword": "两次密码不一致",
+ "samePassword": "新密码不能与原密码相同",
+ "surePhoneNumber": "请输入正确的手机号",
+ "alikePhone": "与原手机号一致,无需修改",
+ "modify": "修改",
+ "pleaseInput": "请输入",
+ "usernameModifyTip": "用户名仅可修改一次,请谨慎设置",
+ "pleaseSelectBirthday": "请选择生日",
+ "bindMobileFirstTip": "请先绑定手机再执行该操作",
+ "bindNow": "立即绑定",
+ "smsCode": "短信验证码",
+ "sendCodeTip": "点击\"获取动态码\",将会向您已绑定的手机号{mobile}发送验证码",
+ "oneClickAuthBind": "一键授权绑定",
+ "manualBind": "手动绑定",
+ "region": "所在地区",
+ "pleaseSelectRegion": "请选择省市区县",
+ "detailAddress": "详细地址",
+ "sexUnknown": "未知",
+ "sexMale": "男",
+ "sexFemale": "女",
+ "alikeRealName": "与原真实姓名一致,无需修改",
+ "noEmptyRealName": "真实姓名不能为空",
+ "passwordMinLength": "新密码长度不能小于{num}位",
+ "passwordComplexityPrefix": "密码需包含",
+ "passwordNumber": "数字",
+ "passwordLowercase": "小写字母",
+ "passwordUppercase": "大写字母",
+ "passwordSymbol": "特殊字符",
+ "passwordSeparator": "、",
+ "pleaseInputMobile": "请输入手机号",
+ "codeSent": "已发送({seconds}s)",
+ "doNotRepeatedlyClick": "请勿重复点击",
+ "pleaseInputDetailAddress": "请输入详细地址"
+ },
+ "card_agreement": {
+ "title": "会员卡协议"
+ },
+ "collection": {
+ "title": "我的关注",
+ "emptyText": "暂无关注的商品",
+ "emptySubText": "赶紧去逛逛, 关注心仪的商品吧",
+ "deleteSuccess": "删除成功"
+ },
+ "apply_withdrawal": {
+ "title": "申请提现",
+ "withdrawTo": "提现到",
+ "wechatDefaultWallet": "微信默认钱包",
+ "pleaseAddWithdrawMethod": "请添加提现方式",
+ "withdrawAmount": "提现金额",
+ "withdrawableBalance": "可提现余额:",
+ "withdrawAll": "全部提现",
+ "minWithdrawAndFeeTip": "最小提现金额为{min},手续费为{rate}",
+ "withdraw": "提现",
+ "withdrawalRecords": "提现记录",
+ "withdrawalNotEnabled": "未开启提现",
+ "pleaseEnterWithdrawAmount": "请输入提现金额",
+ "withdrawAmountExceedsBalance": "提现金额超出可提现金额",
+ "withdrawAmountBelowMinimum": "提现金额小于最低提现金额",
+ "pleaseAddWithdrawMethodFirst": "请先添加提现方式",
+ "withdrawApplySuccess": "提现申请成功"
+ },
+ "signin": {
+ "title": "签到有礼",
+ "signinNotEnabled": "商家未开启会员签到",
+ "signinClosed": "签到未开启",
+ "shareDesc": "天天签到,积分好礼送不停",
+ "shareTitle": "签到有礼,天天签到,积分好礼送不停"
+ },
+ "public": {
+ "riskWarningTitle": "风险提示",
+ "cancelAccountConfirm": "确定要注销当前账号吗?"
+ },
+ "card_buy": {
+ "title": "会员卡",
+ "validUntil": "有效期至:",
+ "enjoyDiscountAnd": "可享受消费折扣和",
+ "memberGiftBenefits": "会员大礼包等权益",
+ "cardTypeSelection": "卡种选择",
+ "weekCardName": "周卡",
+ "weekCardUnit": "周",
+ "monthCardName": "月卡",
+ "monthCardUnit": "月",
+ "quarterCardName": "季卡",
+ "quarterCardUnit": "季",
+ "yearCardName": "年卡",
+ "yearCardUnit": "年",
+ "memberBenefits": "会员权益",
+ "freeShipping": "全场包邮",
+ "enjoyFreeShipping": "享受商品包邮服务",
+ "consumptionDiscount": "消费折扣",
+ "enjoyDiscountOnSomeProducts": "部分商品下单可享{discount}折优惠",
+ "pointsReward": "积分回馈",
+ "earnPointsMultiplier": "下单享{multiplier}倍积分回馈",
+ "welcomeGift": "开卡礼包",
+ "pointsGift": "积分礼包",
+ "giftPoints": "赠送{points}积分",
+ "redPacketGift": "红包礼包",
+ "giftRedPacket": "赠送{amount}元红包",
+ "couponGift": "优惠券礼包",
+ "giftCoupons": "赠送{count}张优惠券",
+ "renewNow": "立即续费",
+ "rechargeToActivate": "充值开通",
+ "activateNow": "立即开通",
+ "purchaseAgreement": "购买既视为同意",
+ "cardDescription": "会员卡说明",
+ "noCardsAvailable": "暂无可开会员卡",
+ "cardOverrideConfirm": "您有尚未过期的会员卡,再次购卡会覆盖掉之前的卡,是否继续?"
+ },
+ "cancelrefuse": {
+ "title": "账号注销",
+ "cancelrefuse": {
+ "title": "您的申请已拒绝",
+ "reasonPrefix": "拒绝理由:",
+ "back": "返回",
+ "reapply": "重新申请"
+ }
+ },
+ "point": {
+ "title": "我的积分",
+ "currentPoints": "当前积分",
+ "totalPoints": "累计积分",
+ "totalConsume": "累计消费",
+ "todayEarned": "今日获得",
+ "pointDetail": "积分明细",
+ "pointMall": "积分商城"
+ },
+ "info": {
+ "title": "个人资料",
+ "headImg": "头像",
+ "avatar": "头像",
+ "account": "账号",
+ "nickname": "昵称",
+ "realName": "真实姓名",
+ "sex": "性别",
+ "gender": "性别",
+ "birthday": "生日",
+ "password": "密码",
+ "paypassword": "支付密码",
+ "mobilePhone": "手机",
+ "bindMobile": "绑定手机",
+ "cancellation": "注销账号",
+ "lang": "语言",
+ "logout": "退出登录",
+ "save": "保存",
+ "noset": "未设置",
+ "nickPlaceholder": "请输入新昵称",
+ "pleaseRealName": "请输入真实姓名",
+ "nowPassword": "当前密码",
+ "newPassword": "新密码",
+ "confirmPassword": "确认新密码",
+ "phoneNumber": "手机号",
+ "confirmCode": "验证码",
+ "confirmCodeInput": "请输入验证码",
+ "confirmCodeInputerror": "验证码错误",
+ "findanimateCode": "获取动态码",
+ "animateCode": "动态码",
+ "animateCodeInput": "请输入动态码",
+ "modifyNickname": "修改昵称",
+ "modifyPassword": "修改密码",
+ "bindPhone": "绑定手机",
+ "alikeNickname": "与原昵称一致,无需修改",
+ "noEmityNickname": "昵称不能为空",
+ "updateSuccess": "修改成功",
+ "pleaseInputOldPassword": "请输入原始密码",
+ "pleaseInputNewPassword": "请输入新密码",
+ "passwordLength": "密码长度不能小于6位",
+ "alikePassword": "两次密码不一致",
+ "samePassword": "新密码不能与原密码相同",
+ "surePhoneNumber": "请输入正确的手机号",
+ "alikePhone": "与原手机号一致,无需修改",
+ "modify": "修改",
+ "sexUnknown": "未知",
+ "sexMale": "男",
+ "sexFemale": "女",
+ "pleaseSelectBirthday": "请选择生日",
+ "alikeRealName": "与原真实姓名一致,无需修改",
+ "noEmptyRealName": "真实姓名不能为空",
+ "passwordMinLength": "新密码长度不能小于{num}位",
+ "passwordComplexityPrefix": "密码需包含",
+ "passwordNumber": "数字",
+ "passwordLowercase": "小写字母",
+ "passwordUppercase": "大写字母",
+ "passwordSymbol": "特殊字符",
+ "passwordSeparator": "、",
+ "pleaseInputMobile": "请输入手机号",
+ "codeSent": "已发送({seconds}s)",
+ "doNotRepeatedlyClick": "请勿重复点击",
+ "pleaseSelectRegion": "请选择所在地区",
+ "pleaseInputDetailAddress": "请输入详细地址"
+ },
+ "message": {
+ "title": "我的消息"
+ },
+ "balance": {
+ "title": "我的余额",
+ "navbarTitle": "账户余额",
+ "balanceTitle": "账户余额(元)",
+ "accountBalance": "账户余额 ",
+ "money": " (元)",
+ "recharge": "充值",
+ "withdrawal": "提现",
+ "withdrawalRecord": "提现记录",
+ "balanceDetailed": "余额明细",
+ "emptyTips": "暂无余额记录",
+ "rechargeRecord": "充值记录",
+ "ableAccountBalance": "现金余额 ",
+ "noAccountBalance": "储值余额 "
+ },
+ "gift": {
+ "title": "我的礼品",
+ "emptyTips": "暂无礼品"
+ },
+ "bind_mobile": {
+ "title": "绑定手机号",
+ "oneClickAuthBind": "一键授权绑定",
+ "manualBind": "手动绑定",
+ "phoneNumber": "手机号",
+ "pleInputMobile": "请输入手机号",
+ "surePhoneNumber": "请输入正确的手机号",
+ "confirmCode": "验证码",
+ "confirmCodeInput": "请输入验证码",
+ "smsCode": "短信验证码",
+ "animateCodeInput": "请输入动态码",
+ "findanimateCode": "获取动态码",
+ "codeSent": "已发送({seconds}s)",
+ "doNotRepeatedlyClick": "请勿重复点击",
+ "save": "绑定",
+ "bindSuccess": "绑定成功",
+ "alikePhone": "与原手机号一致,无需修改",
+ "tipTitle": "温馨提示",
+ "bindBenefitTip": "绑定手机号后可享受更多服务",
+ "sendCodeTip": "点击\"获取动态码\",将会向您的手机号{mobile}发送验证码"
+ },
+ "point_detail": {
+ "title": "积分明细",
+ "emptyTpis": "您暂时还没有积分记录哦!",
+ "pointExplain": "积分说明"
+ },
+ "account": {
+ "title": "账户列表",
+ "name": "姓名",
+ "accountType": "账号类型",
+ "mobilePhone": "手机号码",
+ "withdrawalAccount": "提现账号",
+ "bankInfo": "支行信息",
+ "newAddAccount": "新增账户",
+ "del": "删除",
+ "update": "修改",
+ "emptyText": "当前暂无账户",
+ "withdrawToBalance": "提现到余额",
+ "withdrawalAccountLabel": "提现账号:{account}",
+ "bankNameLabel": "银行名称:{bankName}",
+ "setAsDefault": "设为默认账户",
+ "emptyTip": "暂无账户信息,请添加",
+ "operationTip": "操作提示",
+ "confirmDeleteAccount": "确定要删除该账户吗?",
+ "deleteSuccess": "删除成功",
+ "deleteFailed": "删除失败",
+ "withdrawTypeBank": "银行",
+ "withdrawTypeAlipay": "支付宝",
+ "withdrawTypeWechat": "微信"
+ },
+ "pay_password": {
+ "title": "支付密码",
+ "passwordTips": "请输入6位支付密码,建议不要使用重复或连续数字",
+ "codeSentTips": "验证码已发送至{mobile}请在下方输入4位数字验证码",
+ "inputSmsCode": "输入短信验证码",
+ "setPayPassword": "请设置支付密码",
+ "inputAgain": "请再次输入",
+ "confirm": "确认",
+ "getCode": "获取验证码",
+ "getDynacode": "获取动态码",
+ "tipsTitle": "提示",
+ "bindMobileFirst": "设置支付密码需要先绑定手机号,是否立即绑定?",
+ "modifySuccess": "修改成功",
+ "passwordMismatch": "两次输入的密码不一致",
+ "resendAfter": "{seconds}s后可重新获取"
+ },
+ "card_log": {
+ "title": "会员卡记录",
+ "totalConsume": "累计消费",
+ "cardBalance": "卡余额",
+ "totalRecharge": "累计充值",
+ "yuanSuffix": "元",
+ "statUnit": "({unit})",
+ "filterAll": "全部",
+ "filterIncome": "收入",
+ "filterExpense": "支出",
+ "filterRecharge": "充值",
+ "filterConsume": "消费",
+ "filterGift": "赠送",
+ "emptyTips": "暂无会员卡记录",
+ "amountWithUnit": "{amount}元"
+ },
+ "card": {
+ "title": "会员卡",
+ "validUntil": "有效期至:",
+ "enjoyDiscountAnd": "可享受消费折扣和",
+ "memberGiftBenefits": "会员大礼包等权益",
+ "memberBenefits": "会员权益",
+ "freeShipping": "全场包邮",
+ "enjoyFreeShipping": "享受商品包邮服务",
+ "consumptionDiscount": "消费折扣",
+ "enjoyDiscountOnSomeProducts": "部分商品下单可享{discount}折优惠",
+ "pointsReward": "积分回馈",
+ "earnPointsMultiplier": "下单享{multiplier}倍积分回馈",
+ "welcomeGift": "开卡礼包",
+ "pointsGift": "积分礼包",
+ "giftPoints": "赠送{points}积分",
+ "redPacketGift": "红包礼包",
+ "giftRedPacket": "赠送{amount}元红包",
+ "couponGift": "优惠券礼包",
+ "giftCoupons": "赠送{count}张优惠券",
+ "renewNow": "立即续费",
+ "cardDescription": "会员卡说明",
+ "shareTitle": "专属会员权益,快来体验"
+ },
+ "cancelstatus": {
+ "title": "账号注销",
+ "step1Name": "提交申请",
+ "step1Desc": "您已提交申请,请耐心等待~",
+ "step2Name": "等待审核",
+ "step2Desc": "等待审核中,审核通过后您的账号将直接被删除",
+ "step3Name": "审核通过,注销完成",
+ "step3Desc": "您已成功注销账号,期待下一次与您相遇",
+ "back": "返回",
+ "revokeApplication": "撤销申请",
+ "riskTip": "风险提示",
+ "revokeConfirm": "确定要撤销申请吗?"
+ },
+ "cancelsuccess": {
+ "title": "账号注销",
+ "cancelsuccess": {
+ "title": "您已成功注销账号",
+ "desc": "待下次与您更好的相遇,如需再次使用,请重新注册",
+ "done": "完成"
+ }
+ },
+ "footprint": {
+ "title": "我的足迹",
+ "emptyTpis": "您还未浏览过任何商品!",
+ "manage": "管理",
+ "done": "完成",
+ "soldPrefix": "已售",
+ "unitPiece": "件",
+ "emptyText": "暂无浏览过的商品",
+ "emptySubText": "赶紧去逛逛, 发现更多商品吧",
+ "selectAll": "全选",
+ "delete": "删除",
+ "pleaseSelectDelete": "请选择要删除的数据!"
+ },
+ "invite_friends": {
+ "title": "邀请好友",
+ "activityDescription": "活动说明",
+ "activityTime": "活动时间:{startTime}至{endTime}",
+ "inviteNow": "立即邀请",
+ "myFriends": "我的好友",
+ "cashRedPacketAmount": "{amount}元现金红包",
+ "pointsAmount": "{amount}积分",
+ "couponsAmount": "{count}张优惠券",
+ "viewMore": "查看更多",
+ "noMoreData": "没有更多数据了",
+ "noInvitedFriendsTip": "您还没有邀请到新朋友哦",
+ "inviteTip": "邀请好友,赚取好礼。赶紧去试试吧~",
+ "inviteRewards": "邀请好友奖励",
+ "cashRedPacket": "现金红包",
+ "points": "积分",
+ "couponUnit": "张",
+ "coupon": "优惠券",
+ "shareDesc": "分享给好友,让好友通过你的分享链接进入并注册登录,可获得以下奖励:",
+ "balanceReward": "可得{amount}元红包奖励",
+ "pointReward": "可得{amount}积分",
+ "couponReward": "可得{count}张优惠券",
+ "unlimitedReward": "可得奖励不受限制",
+ "rewardLimit": "奖励上限为{max}人",
+ "howToInvite": "如何邀请好友",
+ "stepShareLink": "分享链接给好友",
+ "stepFriendEnter": "好友进入",
+ "stepFriendRegister": "好友注册成功获得奖励",
+ "saveImage": "保存图片",
+ "longPressSaveImage": "长按保存图片",
+ "share": "分享",
+ "shareToFriends": "分享给好友",
+ "generatePoster": "生成分享海报",
+ "copyLink": "复制链接",
+ "cancelShare": "取消分享",
+ "noData": "暂无相关数据",
+ "saveSuccess": "保存成功",
+ "saveFailed": "保存失败,请稍后重试"
+ },
+ "cancellation": {
+ "title": "账号注销",
+ "agreeTermsText": "勾选即表示您已阅读并同意本协议",
+ "nextStep": "下一步",
+ "pleaseAgreeFirst": "请先勾选同意协议"
+ },
+ "account_edit": {
+ "title": "编辑账户",
+ "addTitle": "新增账户",
+ "name": "姓名",
+ "namePlaceholder": "请输入真实姓名",
+ "mobilePhone": "手机号码",
+ "mobilePhonePlaceholder": "请输入手机号",
+ "accountType": "账号类型",
+ "bankName": "银行名称",
+ "bankNamePlaceholder": "请输入银行名称",
+ "withdrawalAccount": "提现账号",
+ "withdrawalAccountPlaceholder": "请输入提现账号",
+ "save": "保存",
+ "pleaseEnterName": "请输入姓名",
+ "pleaseEnterMobile": "请输入手机号",
+ "pleaseEnterValidMobile": "请输入正确的手机号",
+ "pleaseSelectAccountType": "请选择账户类型",
+ "pleaseEnterBankName": "请输入银行名称",
+ "pleaseEnterWithdrawalAccount": "请输入提现账号",
+ "addSuccess": "添加成功",
+ "editSuccess": "修改成功"
+ },
+ "coupon": {
+ "title": "我的优惠券",
+ "tabUnused": "未使用",
+ "tabUsed": "已使用",
+ "tabExpired": "已过期",
+ "discountText": "{discount}折",
+ "minAmountCondition": "满{amount}元可用",
+ "noThresholdCoupon": "无门槛优惠券",
+ "specifiedGoods": "指定商品",
+ "maxDiscount": "(最大优惠{amount}元)",
+ "validPeriodPrefix": "有效期:",
+ "longTermValid": "长期有效",
+ "useNow": "去使用",
+ "used": "已使用",
+ "expired": "已过期",
+ "emptyText": "暂无优惠券",
+ "goShopping": "去逛逛",
+ "merchantNotEnabled": "商家未开启优惠券"
+ }
+ },
+ "help": {
+ "detail": {
+ "title": "帮助详情",
+ "publishTimePrefix": "发布时间:"
+ },
+ "list": {
+ "title": "帮助中心",
+ "emptyText": "当前暂无帮助信息",
+ "noHelp": "暂无帮助"
+ }
+ },
+ "point": {
+ "goods_detail": [],
+ "result": {
+ "title": "兑换结果",
+ "exchangeSuccess": "兑换成功",
+ "see": "查看兑换记录",
+ "goHome": "回到首页"
+ },
+ "detail": {
+ "title": "兑换",
+ "pointsSuffix": "积分",
+ "stockLabel": "库存:",
+ "unlimitedStock": "无限",
+ "unitPiece": "件",
+ "containsBalance": "内含{balance}元",
+ "noThresholdCoupon": "无门槛优惠券",
+ "fullReduction": "满{atLeast}减{money}",
+ "fullAmount": "满{atLeast}元",
+ "discountSuffix": "折",
+ "maxDiscount": "最多优惠{limit}元",
+ "validFromReceive": "领取之日起{days}天内有效",
+ "validUntil": "{time}到期",
+ "addCommunity": "添加",
+ "addCommunityTitle": "添加社群",
+ "addCommunityTip": "长按识别二维码,添加社群",
+ "selectSpec": "选择",
+ "attribute": "属性",
+ "goodsAttribute": "商品属性",
+ "goodsService": "商品服务",
+ "confirm": "确定",
+ "exchangeDetail": "兑换详情",
+ "noExchangeDetail": "暂无兑换详情!",
+ "loginToExchange": "登录之后方可兑换",
+ "insufficientStock": "库存不足",
+ "insufficientPoints": "积分不足",
+ "exchange": "兑换",
+ "shareTitle": "仅需{point}积分即可兑换{title}"
+ },
+ "order_detail": {
+ "title": "积分兑换订单详情"
+ },
+ "payment": {
+ "title": "确认订单",
+ "virtual": {
+ "tips": "购买虚拟类商品需填写手机号,方便商家与您联系",
+ "mobile": "手机号码",
+ "mobilePlaceholder": "请输入您的手机号码"
+ },
+ "address": {
+ "setAddress": "请设置收货地址",
+ "deliveryTime": "送达时间",
+ "selectDeliveryTime": "请选择送达时间"
+ },
+ "localDelivery": {
+ "providedBy": "由",
+ "deliveredBy": "提供配送",
+ "switchStore": "点击切换",
+ "noStoreNearby": "您的附近没有可配送的门店,请选择其他配送方式"
+ },
+ "store": {
+ "businessHours": "营业时间:",
+ "name": "姓名",
+ "reservedMobile": "预留手机",
+ "mobilePlaceholder": "请输入您的手机号码",
+ "pickupTime": "自提时间",
+ "noPickupStore": "当前无自提门店,请选择其它配送方式",
+ "address": "地址:"
+ },
+ "storePopup": {
+ "title": "已为您甄选出附近所有相关门店",
+ "businessHours": "营业时间:",
+ "address": "地址:",
+ "noStoreNearby": "所选择收货地址附近没有可以自提的门店"
+ },
+ "orderMoney": {
+ "buyerMessage": "买家留言",
+ "buyerMessagePlaceholder": "留言前建议先与商家协调一致",
+ "pointsRequired": "所需积分",
+ "pointsSuffix": "积分",
+ "shippingFee": "运费"
+ },
+ "settlement": {
+ "totalItems": "共{count}件",
+ "total": "合计:",
+ "pointsSuffix": "积分",
+ "submitOrder": "提交订单",
+ "shortByForMinimum": "差{amount}起送"
+ },
+ "toast": {
+ "orderDataNotFound": "未获取到创建订单所需数据!",
+ "pleaseEnterMobile": "请输入您的手机号码",
+ "pleaseEnterCorrectMobile": "请输入正确的手机号码",
+ "noDeliveryMethod": "商家未设置配送方式",
+ "pleaseSelectAddress": "请先选择您的收货地址",
+ "noPickupStore": "没有可提货的门店,请选择其他配送方式",
+ "pleaseEnterReservedMobile": "请输入预留手机",
+ "pleaseEnterCorrectReservedMobile": "请输入正确的预留手机",
+ "pleaseSelectPickupTime": "请选择自提时间",
+ "noDeliveryStore": "没有可配送的门店,请选择其他配送方式",
+ "pleaseSelectDeliveryTime": "请选择配送时间"
+ },
+ "modal": {
+ "orderNotCreated": "订单未创建",
+ "goToSet": "去设置"
+ },
+ "time": {
+ "today": "今天",
+ "tomorrow": "明天"
+ }
+ },
+ "order_list": {
+ "title": "积分兑换",
+ "emptyTips": "暂无更多数据了",
+ "statusAll": "全部",
+ "statusPendingPayment": "待支付",
+ "statusCompleted": "已完成",
+ "statusClosed": "已关闭",
+ "orderNo": "订单号:",
+ "points": "积分",
+ "closeBtn": "关闭",
+ "payBtn": "支付",
+ "viewDetails": "查看详情",
+ "emptyText": "暂无积分兑换订单",
+ "goBrowse": "去逛逛",
+ "merchantNotEnabled": "商家未开启积分商城",
+ "tip": "提示",
+ "confirmCloseExchange": "确定关闭此次兑换?",
+ "closeSuccess": "关闭成功"
+ },
+ "goods_list": {
+ "title": "积分商品",
+ "searchPlaceholder": "请输入商品关键词",
+ "comprehensive": "综合",
+ "points": "积分",
+ "newArrival": "上新时间",
+ "filter": "筛选",
+ "stock": "库存",
+ "noGoods": "暂无积分商品",
+ "pointRange": "积分区间",
+ "minPlaceholder": "最低",
+ "maxPlaceholder": "最高",
+ "allCategories": "全部分类",
+ "all": "全部",
+ "reset": "重置",
+ "confirm": "确定",
+ "pleaseEnterMaxPrice": "请输入最高价",
+ "priceCannotBeLessThanZero": "筛选价格不能小于0",
+ "minCannotBeGreaterThanMax": "最低价不能大于最高价",
+ "maxCannotBeLessThanMin": "最高价不能小于最低价"
+ },
+ "list": {
+ "title": "积分商城",
+ "searchPlaceholder": "搜索商品",
+ "myPoints": "我的积分",
+ "points": "积分",
+ "reminder": "提醒",
+ "remarkText": "积分兑好礼,每日上新换不停!",
+ "rechargeAmount": "储值{price}元",
+ "earnPoints": "可得{point}积分",
+ "goRecharge": "去储值",
+ "exchangeCoupon": "积分换券",
+ "exchangeHongbao": "积分换红包",
+ "exchangeGift": "积分换礼品",
+ "discountSuffix": "折",
+ "noThresholdCoupon": "无门槛优惠券",
+ "minSpendAvailable": "满{amount}可用",
+ "allStoreCoupon": "全场券",
+ "designatedCoupon": "指定券",
+ "exchange": "兑换",
+ "yuan": "元",
+ "stock": "库存:",
+ "exchanged": "已兑:",
+ "pointDescription": "积分说明",
+ "pointAcquisition": "积分的获取",
+ "acquisitionItem1": "1、积分可在注册、签到、分享、消费、充值时获得。",
+ "acquisitionItem2": "2、在购买部分商品时可获得积分。",
+ "pointUsage": "积分的使用",
+ "usageItem1": "1、积分可用于兑换积分中心的商品。",
+ "usageItem2": "2、积分可在参与某些活动时使用。",
+ "usageItem3": "3、积分不得转让,出售,不设有效期。",
+ "pointQuery": "积分的查询",
+ "queryItem1": "1、积分可在会员中心中查询具体数额以及明细。",
+ "categoryExchangeGoods": "积分换好物",
+ "categoryExchangeCoupon": "积分换券",
+ "categoryExchangeHongbao": "积分换红包",
+ "merchantNotEnabled": "商家未开启积分商城",
+ "noActivity": "暂无相关活动"
}
},
"files": {
@@ -1181,84 +2248,47 @@
"fileNotExist": "文件不存在"
}
},
- "form": {
- "form": {
- "title": "请填写表单所需信息",
- "submitSuccess": "提交成功",
- "noFormInfo": "未获取到表单信息"
+ "presale": {
+ "detail": {
+ "title": "",
+ "select": "选择",
+ "params": "参数",
+ "service": "商品服务",
+ "allGoods": "全部商品",
+ "image": "图片",
+ "video": "视频"
},
- "formdata": {
- "title": "表单详情",
- "submitSuccess": "提交成功",
- "noFormInfo": "未获取到表单信息",
- "formTipPlaceholder": "请填写表单所需信息",
- "tip": "提示",
- "paramError": "参数错误"
+ "order_detail": {
+ "title": "订单详情"
+ },
+ "payment": {
+ "title": "待付款订单"
+ },
+ "order_list": {
+ "title": "我的预售",
+ "emptyTips": "暂无相关预售订单",
+ "update": "释放刷新",
+ "updateIng": "加载中..."
+ },
+ "list": {
+ "title": "预售专区"
}
},
- "game": {
- "cards": {
- "title": "刮刮乐"
- },
- "record": {
- "title": "中奖纪录"
- },
- "smash_eggs": {
- "title": "砸金蛋"
- },
- "turntable": {
- "title": "大转盘"
+ "storeclose": {
+ "storeclose": {
+ "title": "店铺打烊"
}
},
"goods": {
- "brand": {
- "title": "品牌专区",
- "noMoreBrand": "暂无更多品牌,去首页看看吧"
- },
- "cart": {
- "title": "购物车",
- "complete": "完成",
- "edit": "管理",
- "allElection": "全选",
- "total": "合计",
- "settlement": "结算",
- "emptyTips": "暂无商品",
- "goForStroll": "去逛逛",
- "del": "删除",
- "login": "去登录",
- "totalKinds": "共{count}种商品",
- "coupon": "优惠券",
- "couponMaxDiscount": "领券结算最高可减{money}元",
- "receive": "领取",
- "view": "查看",
- "clickToReceive": "点击领取",
- "clickToView": "点击查看",
- "fullReduction": "满减",
- "fullReductionItem": "{limit}减{discount}",
- "invalidGoods": "失效商品{count}件",
- "clear": "清空",
- "invalid": "已失效",
- "cartEmpty": "购物车为空",
- "cartEmptySubText": "赶紧去逛逛,购买心仪的商品吧",
- "discountDetail": "优惠明细",
- "goodsTotal": "商品总额",
- "discountLabel": "折",
- "minSpend": "满{amount}可用",
- "noThreshold": "无门槛",
- "maxDiscount": "最多可抵{symbol}{limit}",
- "validityPeriod": "有效期:",
- "validFromReceive": "领取之日起{days}天内有效",
- "longTermValid": "长期有效",
- "received": "已领取",
- "receiveCouponSettle": "领券结算({count})",
- "settleImmediately": "立即结算({count})",
- "tip": "提示",
- "selectDeleteGoods": "请选择要删除的商品",
- "confirmDeleteGoods": "确定要删除这些商品吗?",
- "confirmDeleteGood": "确定要删除该商品吗?",
- "confirmClearInvalid": "确定要清空这些商品吗?",
- "purchaseLimit": "该商品每人限购{maxBuy}件",
- "outOfStock": "库存不足"
+ "evaluate": {
+ "title": "商品评价",
+ "tabAll": "全部",
+ "tabPositive": "好评",
+ "tabNeutral": "中评",
+ "tabNegative": "差评",
+ "shopReply": "商家回复:",
+ "additionalReview": "追加评价",
+ "emptyText": "暂无商品评价"
},
"category": {
"title": "商品分类",
@@ -1267,55 +2297,17 @@
"Make": "立即咨询",
"shareTitle": "发现超多好物,快来看看"
},
- "consult": {
- "title": "商品咨询"
- },
- "consult_edit": {
- "title": "我要咨询"
- },
- "coupon": {
- "title": "优惠券领取",
- "tabAll": "全部",
- "tabReward": "满减券",
- "tabDiscount": "折扣券",
- "discountText": "{discount}折",
- "minSpendAvailable": "满{atLeast}元可用",
- "noThresholdCoupon": "无门槛优惠券",
- "specifiedGoods": "指定商品",
- "allGoods": "全场商品",
- "maxDiscount": "(最大优惠{amount}元)",
- "validPeriodDate": "有效期:{date}",
- "validPeriodDays": "有效期:领取之日起{days}日内有效",
- "validPeriodLong": "有效期:长期有效",
- "receive": "领取",
- "useNow": "去使用",
- "soldOut": "已抢光",
- "expired": "已过期",
- "limitReached": "已达上限",
- "emptyText": "暂无可领取的优惠券",
- "merchantNotEnabled": "商家未开启优惠券",
- "receiveSuccess": "领取成功,快去使用吧"
- },
- "coupon_receive": {
- "title": "领取优惠券",
- "discountText": "{discount}折",
- "minSpendUsage": "满{atLeast}元使用",
- "noThresholdCoupon": "无门槛优惠券",
- "validUntil": "有效期至 {endTime}",
- "validDaysAfterReceive": "领取之日起{fixedTerm}天内有效",
- "longTermValid": "长期有效",
- "applicableStores": "适用门店:{storeName}",
- "scanShareTip": "注:扫描二维码或点击右上角进行分享",
- "receive": "领取",
- "couponSoldOut": "来迟了该优惠券已被领取完了!",
- "activityEnded": "该优惠券活动已结束!",
- "activityClosed": "该优惠券活动已关闭",
- "receiveLimitReached": "该优惠券领取已达到上限!",
- "merchantNotEnabled": "商家未开启优惠券",
- "receiveSuccess": "领取成功",
- "congratsMoneyCoupon": "恭喜您获得一张{money}元的优惠券",
- "congratsDiscountCoupon": "恭喜您获得一张{discount}折优惠券",
- "minSpendAvailable": "满{atLeast}元可用"
+ "search": {
+ "title": "搜索",
+ "history": "历史搜索",
+ "hot": "热门搜索",
+ "find": "搜索发现",
+ "hidefind": "当前搜索发现已隐藏",
+ "inputPlaceholder": "搜索商品",
+ "tip": "提示",
+ "confirmDeleteAllHistory": "确认删除全部历史记录?",
+ "confirmDeleteHistory": "确认删除该条历史记录?",
+ "searchContentEmpty": "搜索内容不能为空哦"
},
"detail": {
"title": "商品详情",
@@ -1451,15 +2443,63 @@
"fileNotExist": "文件不存在"
}
},
- "evaluate": {
- "title": "商品评价",
- "tabAll": "全部",
- "tabPositive": "好评",
- "tabNeutral": "中评",
- "tabNegative": "差评",
- "shopReply": "商家回复:",
- "additionalReview": "追加评价",
- "emptyText": "暂无商品评价"
+ "cart": {
+ "title": "购物车",
+ "complete": "完成",
+ "edit": "管理",
+ "allElection": "全选",
+ "total": "合计",
+ "settlement": "结算",
+ "emptyTips": "暂无商品",
+ "goForStroll": "去逛逛",
+ "del": "删除",
+ "login": "去登录",
+ "totalKinds": "共{count}种商品",
+ "coupon": "优惠券",
+ "couponMaxDiscount": "领券结算最高可减{money}元",
+ "receive": "领取",
+ "view": "查看",
+ "clickToReceive": "点击领取",
+ "clickToView": "点击查看",
+ "fullReduction": "满减",
+ "fullReductionItem": "{limit}减{discount}",
+ "invalidGoods": "失效商品{count}件",
+ "clear": "清空",
+ "invalid": "已失效",
+ "cartEmpty": "购物车为空",
+ "cartEmptySubText": "赶紧去逛逛,购买心仪的商品吧",
+ "discountDetail": "优惠明细",
+ "goodsTotal": "商品总额",
+ "discountLabel": "折",
+ "minSpend": "满{amount}可用",
+ "noThreshold": "无门槛",
+ "maxDiscount": "最多可抵{symbol}{limit}",
+ "validityPeriod": "有效期:",
+ "validFromReceive": "领取之日起{days}天内有效",
+ "longTermValid": "长期有效",
+ "received": "已领取",
+ "receiveCouponSettle": "领券结算({count})",
+ "settleImmediately": "立即结算({count})",
+ "tip": "提示",
+ "selectDeleteGoods": "请选择要删除的商品",
+ "confirmDeleteGoods": "确定要删除这些商品吗?",
+ "confirmDeleteGood": "确定要删除该商品吗?",
+ "confirmClearInvalid": "确定要清空这些商品吗?",
+ "purchaseLimit": "该商品每人限购{maxBuy}件",
+ "outOfStock": "库存不足"
+ },
+ "brand": {
+ "title": "品牌专区",
+ "noMoreBrand": "暂无更多品牌,去首页看看吧"
+ },
+ "point": {
+ "title": "积分中心"
+ },
+ "consult_edit": {
+ "title": "我要咨询"
+ },
+ "consult": {
+ "title": "商品咨询"
},
"list": {
"title": "商品列表",
@@ -1483,26 +2523,201 @@
"maxPriceLessThanMin": "最高价不能小于最低价",
"buyText": "购买"
},
+ "coupon_receive": {
+ "title": "领取优惠券",
+ "discountText": "{discount}折",
+ "minSpendUsage": "满{atLeast}元使用",
+ "noThresholdCoupon": "无门槛优惠券",
+ "validUntil": "有效期至 {endTime}",
+ "validDaysAfterReceive": "领取之日起{fixedTerm}天内有效",
+ "longTermValid": "长期有效",
+ "applicableStores": "适用门店:{storeName}",
+ "scanShareTip": "注:扫描二维码或点击右上角进行分享",
+ "receive": "领取",
+ "couponSoldOut": "来迟了该优惠券已被领取完了!",
+ "activityEnded": "该优惠券活动已结束!",
+ "activityClosed": "该优惠券活动已关闭",
+ "receiveLimitReached": "该优惠券领取已达到上限!",
+ "merchantNotEnabled": "商家未开启优惠券",
+ "receiveSuccess": "领取成功",
+ "congratsMoneyCoupon": "恭喜您获得一张{money}元的优惠券",
+ "congratsDiscountCoupon": "恭喜您获得一张{discount}折优惠券",
+ "minSpendAvailable": "满{atLeast}元可用"
+ },
"not_exist": {
"title": "商品找不到",
"notExist": {
"message": "您查看的商品不存在,可能已下架或被删除"
}
},
- "point": {
- "title": "积分中心"
+ "coupon": {
+ "title": "优惠券领取",
+ "tabAll": "全部",
+ "tabReward": "满减券",
+ "tabDiscount": "折扣券",
+ "discountText": "{discount}折",
+ "minSpendAvailable": "满{atLeast}元可用",
+ "noThresholdCoupon": "无门槛优惠券",
+ "specifiedGoods": "指定商品",
+ "allGoods": "全场商品",
+ "maxDiscount": "(最大优惠{amount}元)",
+ "validPeriodDate": "有效期:{date}",
+ "validPeriodDays": "有效期:领取之日起{days}日内有效",
+ "validPeriodLong": "有效期:长期有效",
+ "receive": "领取",
+ "useNow": "去使用",
+ "soldOut": "已抢光",
+ "expired": "已过期",
+ "limitReached": "已达上限",
+ "emptyText": "暂无可领取的优惠券",
+ "merchantNotEnabled": "商家未开启优惠券",
+ "receiveSuccess": "领取成功,快去使用吧"
+ }
+ },
+ "notice": {
+ "detail": {
+ "title": "公告详情",
+ "publishTimePrefix": "发布时间:"
},
- "search": {
- "title": "搜索",
- "history": "历史搜索",
- "hot": "热门搜索",
- "find": "搜索发现",
- "hidefind": "当前搜索发现已隐藏",
- "inputPlaceholder": "搜索商品",
- "tip": "提示",
- "confirmDeleteAllHistory": "确认删除全部历史记录?",
- "confirmDeleteHistory": "确认删除该条历史记录?",
- "searchContentEmpty": "搜索内容不能为空哦"
+ "list": {
+ "title": "公告列表",
+ "emptyText": "当前暂无更多信息",
+ "contentTitle": "升级公告",
+ "topTag": "置顶",
+ "noNotice": "暂无公告"
+ }
+ },
+ "article": {
+ "detail": {
+ "title": "文章详情",
+ "publishTime": "发表时间:",
+ "readCount": "阅读:",
+ "likedSuffix": "人已赞"
+ },
+ "list": {
+ "title": "文章列表",
+ "emptyText": "暂无文章"
+ }
+ },
+ "combo": {
+ "detail": {
+ "title": "组合套餐"
+ },
+ "payment": {
+ "title": "待付款订单"
+ }
+ },
+ "webview": {
+ "webview": {
+ "title": ""
+ }
+ },
+ "ai-chat": {
+ "index": {
+ "title": "AI智能客服",
+ "cancel": "取消",
+ "save": "保存",
+ "send": "发送",
+ "retry": "重试",
+ "timeFormatToday": "今天",
+ "timeFormatYesterday": "昨天",
+ "timeFormatBeforeYesterday": "前天",
+ "aiNickname": "智能助手",
+ "defaultNickname": "我",
+ "audioMessage": "语音消息",
+ "videoMessage": "视频消息",
+ "inputPlaceholder": "请输入您的问题...",
+ "expandEditorTitle": "编辑内容",
+ "loadMoreHistory": "加载更多历史消息",
+ "loadingHistory": "加载历史消息中...",
+ "aiThinking": "AI正在思考",
+ "receivingReply": "正在接收回复",
+ "aiThinkingStatus1": "AI正在思考",
+ "aiThinkingStatus2": "AI正在分析",
+ "aiThinkingStatus3": "AI正在检索",
+ "aiThinkingStatus4": "AI正在生成",
+ "serviceUnavailable": "抱歉,AI服务暂时不可用,请稍后重试。",
+ "serviceTemporaryUnavailable": "抱歉,服务暂时不可用,请稍后重试。",
+ "noContentToCopy": "无可复制的内容",
+ "copySuccess": "已复制",
+ "copySelected": "已复制选中内容",
+ "copyFail": "复制失败",
+ "copyFailWithReason": "复制失败:{reason}",
+ "openingFile": "打开文件中...",
+ "openingFileName": "正在打开文件:{name}",
+ "openingFileTitle": "正在打开:{title}",
+ "fileOpenFail": "文件打开失败",
+ "loadHistoryFail": "加载历史失败",
+ "about": "0B",
+ "autoReplyGreeting": "您好!我是AI智能客服,很高兴为您服务!有什么可以帮助您的吗?",
+ "autoReplyPrice": "我们的产品价格根据型号和配置有所不同,具体价格请查看商品详情页面。",
+ "autoReplyShipping": "一般情况下,订单会在24小时内发货,具体时效请查看物流信息。",
+ "autoReplyReturn": "支持7天无理由退货,请确保商品完好无损。",
+ "autoReplyService": "我们的客服工作时间是9:00-18:00,有问题可以随时联系我们。",
+ "autoReplyDefault": "感谢您的咨询!关于\"{question}\"的问题,我们的专业客服会尽快为您解答。您也可以查看我们的帮助文档获取更多信息。",
+ "searchEntrance": "搜索",
+ "searchPlaceholder": "搜索聊天记录",
+ "searchClose": "完成",
+ "noMatchResult": "未找到匹配结果",
+ "searchAtTop": "已到顶部",
+ "searchAtBottom": "已到底部",
+ "settingsTitle": "设置",
+ "fallbackWelcome": "您好!我是AI智能客服,很高兴为您服务!\n\n我可以帮您:\n• 解答产品相关问题\n• 处理订单问题\n• 提供技术支持\n• 推荐相关商品\n\n请告诉我您需要什么帮助?",
+ "changeAvatar": "更换头像",
+ "changeAvatarDesc": "自定义您的聊天头像",
+ "changeNickname": "更换昵称",
+ "changeNicknameDesc": "自定义您的昵称",
+ "clearChat": "清空聊天",
+ "exportChat": "导出记录",
+ "help": "帮助",
+ "confirmClearChat": "确定要清空聊天记录吗?",
+ "chatCleared": "聊天记录已清空,有什么可以帮助您的吗?",
+ "featureDeveloping": "功能开发中",
+ "thanksFeedback": "感谢您的反馈!",
+ "improveService": "我们会改进服务",
+ "openLink": "打开链接",
+ "confirmOpenLink": "确定要打开链接:",
+ "confirmOpenLinkText": "确定要打开链接:{url}?",
+ "operationFailed": "操作失败,请重试",
+ "prompt": "提示",
+ "serviceTypeNotSupported": "当前客服类型不支持此页面",
+ "helpContent": "# 使用帮助\n\n## 基本功能\n- **发送消息**: 在输入框中输入文字后发送\n- **语音输入**: 点击麦克风图标进行语音输入\n- **附件发送**: 点击+号可以发送图片、文件、位置\n\n## 消息类型\n- **文本消息**: 普通文字对话\n- **Markdown**: 支持格式化的文档内容\n- **文件**: 支持各种文件格式预览\n- **音频**: 支持语音消息播放\n- **视频**: 支持视频播放\n- **链接**: 支持网页链接跳转\n- **商品**: 支持商品卡片展示\n\n## 操作功能\n- **点赞\/踩**: 对AI回复进行评价\n- **复制**: 长按消息可复制内容\n- **转发**: 支持消息转发功能",
+ "aiResponseTemplate1": "我理解您的需求,让我为您详细解答。",
+ "aiResponseTemplate2": "感谢您的提问,这是一个很好的问题。",
+ "aiResponseTemplate3": "根据您的问题,我建议您可以考虑以下几个方面:",
+ "aiResponseTemplate4": "这个问题很常见,让我为您提供一些解决方案。",
+ "aiResponseTemplate5": "我明白您的困惑,让我帮您分析一下。",
+ "aiProcessingMessage": "您的问题\"{question}\"我已经收到,正在为您处理中...",
+ "productInquiryTemplate": "我想了解以下商品的详细信息:\n商品名称:{name}\n价格:¥{price}\n商品ID:{id}",
+ "avatarSelectorTitle": "更换头像",
+ "chooseFromAlbum": "从相册选择",
+ "avatarChangeSuccess": "头像更换成功",
+ "enableAlbumPermission": "请开启相册权限",
+ "emojiTitle": "表情",
+ "editNickname": "修改昵称",
+ "newNicknamePlaceholder": "请输入您的新昵称",
+ "nicknameTip": "昵称长度限制1-12个字符,仅自己可见",
+ "nicknameChangeSuccess": "昵称修改成功",
+ "moreFunctions": "更多功能",
+ "image": "图片",
+ "file": "文件",
+ "voice": "语音",
+ "location": "位置",
+ "voiceInputTitle": "语音输入",
+ "recordingTip": "正在录音,松开结束",
+ "startRecordTip": "点击开始录音",
+ "voiceInputFailed": "语音输入失败",
+ "menuClearChat": "清空聊天",
+ "menuExport": "导出记录",
+ "menuSettings": "设置",
+ "menuHelp": "帮助",
+ "logOnShowTriggered": "[AI Chat Page] onShow 触发",
+ "logOnUnloadTriggered": "[AI Chat Page] onUnload 触发",
+ "logKeyboardChangeUnavailable": "onKeyboardHeightChange 不可用",
+ "logEventHandleError": "事件处理错误",
+ "logInitNavbarFailed": "初始化导航栏失败",
+ "logChatComponentNotInit": "聊天组件未初始化",
+ "logServicerConfigNotLoaded": "【AI客服】servicerConfig 未加载,200ms后重试..."
}
},
"groupbuy": {
@@ -1515,49 +2730,23 @@
"image": "图片",
"video": "视频"
},
- "list": {
- "title": "团购专区"
- },
"payment": {
"title": "待付款订单"
- }
- },
- "help": {
- "detail": {
- "title": "帮助详情",
- "publishTimePrefix": "发布时间:"
},
"list": {
- "title": "帮助中心",
- "emptyText": "当前暂无帮助信息",
- "noHelp": "暂无帮助"
+ "title": "团购专区"
}
},
- "hongbao": {
- "list": {
- "title": "瓜分红包列表"
- },
- "my_hongbao": {
- "title": "我的红包列表"
- }
- },
- "index": {
- "diy": {
- "title": "",
- "diy": {
- "iKnow": "我知道了"
- }
- },
+ "verification": {
"index": {
- "title": "",
- "followOfficialAccount": "关注公众号",
- "followLearnMore": "关注了解更多",
- "collectGotIt": "我知道了",
- "chooseStoreTitle": "请确认门店",
- "reposition": "重新定位",
- "currentStore": "当前门店",
- "confirmEnter": "确认进入",
- "chooseOtherStore": "选择其他门店"
+ "title": "核销台"
+ },
+ "detail": {
+ "title": "核销明细"
+ },
+ "list": {
+ "title": "核销记录",
+ "emptyTips": "暂无记录"
}
},
"live": {
@@ -1646,853 +2835,171 @@
"save": "保存"
}
},
- "member": {
- "account": {
- "title": "账户列表",
- "name": "姓名",
- "accountType": "账号类型",
- "mobilePhone": "手机号码",
- "withdrawalAccount": "提现账号",
- "bankInfo": "支行信息",
- "newAddAccount": "新增账户",
- "del": "删除",
- "update": "修改",
- "emptyText": "当前暂无账户",
- "withdrawToBalance": "提现到余额",
- "withdrawalAccountLabel": "提现账号:{account}",
- "bankNameLabel": "银行名称:{bankName}",
- "setAsDefault": "设为默认账户",
- "emptyTip": "暂无账户信息,请添加",
- "operationTip": "操作提示",
- "confirmDeleteAccount": "确定要删除该账户吗?",
- "deleteSuccess": "删除成功",
- "deleteFailed": "删除失败",
- "withdrawTypeBank": "银行",
- "withdrawTypeAlipay": "支付宝",
- "withdrawTypeWechat": "微信"
+ "form": {
+ "formdata": {
+ "title": "表单详情",
+ "submitSuccess": "提交成功",
+ "noFormInfo": "未获取到表单信息",
+ "formTipPlaceholder": "请填写表单所需信息",
+ "tip": "提示",
+ "paramError": "参数错误"
},
- "account_edit": {
- "title": "编辑账户",
- "addTitle": "新增账户",
- "name": "姓名",
- "namePlaceholder": "请输入真实姓名",
- "mobilePhone": "手机号码",
- "mobilePhonePlaceholder": "请输入手机号",
- "accountType": "账号类型",
- "bankName": "银行名称",
- "bankNamePlaceholder": "请输入银行名称",
- "withdrawalAccount": "提现账号",
- "withdrawalAccountPlaceholder": "请输入提现账号",
- "save": "保存",
- "pleaseEnterName": "请输入姓名",
- "pleaseEnterMobile": "请输入手机号",
- "pleaseEnterValidMobile": "请输入正确的手机号",
- "pleaseSelectAccountType": "请选择账户类型",
- "pleaseEnterBankName": "请输入银行名称",
- "pleaseEnterWithdrawalAccount": "请输入提现账号",
- "addSuccess": "添加成功",
- "editSuccess": "修改成功"
- },
- "address": {
- "title": "收货地址",
- "newAddAddress": "添加收货地址",
- "getAddress": "一键获取地址",
- "is_default": "默认",
- "modify": "编辑",
- "del": "删除",
- "setAsDefault": "设为默认地址",
- "emptyTip": "暂无收货地址,请添加",
- "operationTip": "操作提示",
- "confirmDelete": "确定要删除该地址吗?",
- "cannotDeleteDefault": "默认地址,不能删除",
- "deleteSuccess": "删除成功",
- "deleteFail": "删除失败",
- "setDefaultSuccess": "修改默认地址成功",
- "pcWechatNotSupportGetAddress": "PC端微信不支持一键获取地址"
- },
- "address_edit": {
- "title": "编辑收货地址",
- "addTitle": "新增收货地址",
- "consignee": "姓名",
- "consigneePlaceholder": "收货人姓名",
- "mobile": "手机",
- "mobilePlaceholder": "收货人手机号",
- "telephone": "电话",
- "telephonePlaceholder": "收货人固定电话(选填)",
- "receivingCity": "地区",
- "address": "详细地址",
- "addressPlaceholder": "小区、街道、写字楼",
- "save": "保存",
- "member": {
- "addressEdit": {
- "addressInfo": "地址信息",
- "selectRegionPlaceholder": "请选择省市区县",
- "dataError": "数据有误",
- "pleaseEnterName": "请输入姓名",
- "pleaseEnterMobile": "请输入手机号",
- "pleaseEnterValidMobile": "请输入正确的手机号",
- "pleaseSelectRegion": "请选择省市区县",
- "addressRequired": "详细地址不能为空"
- }
- }
- },
- "apply_withdrawal": {
- "title": "申请提现",
- "withdrawTo": "提现到",
- "wechatDefaultWallet": "微信默认钱包",
- "pleaseAddWithdrawMethod": "请添加提现方式",
- "withdrawAmount": "提现金额",
- "withdrawableBalance": "可提现余额:",
- "withdrawAll": "全部提现",
- "minWithdrawAndFeeTip": "最小提现金额为{min},手续费为{rate}",
- "withdraw": "提现",
- "withdrawalRecords": "提现记录",
- "withdrawalNotEnabled": "未开启提现",
- "pleaseEnterWithdrawAmount": "请输入提现金额",
- "withdrawAmountExceedsBalance": "提现金额超出可提现金额",
- "withdrawAmountBelowMinimum": "提现金额小于最低提现金额",
- "pleaseAddWithdrawMethodFirst": "请先添加提现方式",
- "withdrawApplySuccess": "提现申请成功"
- },
- "assets": {
- "title": "账号注销",
- "riskTip": "风险提示:确认申请后您的资产将被清空且不可找回!",
- "accountAssets": "账户资产",
- "point": "积分",
- "cashBalance": "现金余额",
- "storedValueBalance": "储值余额",
- "coupon": "优惠券",
- "orderAssets": "订单资产",
- "waitDelivery": "待发货",
- "waitReceive": "待收货",
- "refunding": "退款中",
- "fenxiaoAssets": "分销资产",
- "withdrawableCommission": "可提现佣金",
- "withdrawingCommission": "提现中佣金",
- "waitSettleOrder": "待结算订单",
- "prevStep": "上一步",
- "confirmApply": "确认申请"
- },
- "balance": {
- "title": "我的余额",
- "navbarTitle": "账户余额",
- "balanceTitle": "账户余额(元)",
- "accountBalance": "账户余额 ",
- "money": " (元)",
- "recharge": "充值",
- "withdrawal": "提现",
- "withdrawalRecord": "提现记录",
- "balanceDetailed": "余额明细",
- "emptyTips": "暂无余额记录",
- "rechargeRecord": "充值记录",
- "ableAccountBalance": "现金余额 ",
- "noAccountBalance": "储值余额 "
- },
- "balance_detail": {
- "title": "余额明细",
- "emptyTips": "暂无余额明细",
- "yuan": "元",
- "filterAll": "全部",
- "filterIncome": "收入",
- "filterExpense": "支出",
- "dateFormatYM": "{year}年{month}月"
- },
- "bind_mobile": {
- "title": "绑定手机号",
- "oneClickAuthBind": "一键授权绑定",
- "manualBind": "手动绑定",
- "phoneNumber": "手机号",
- "pleInputMobile": "请输入手机号",
- "surePhoneNumber": "请输入正确的手机号",
- "confirmCode": "验证码",
- "confirmCodeInput": "请输入验证码",
- "smsCode": "短信验证码",
- "animateCodeInput": "请输入动态码",
- "findanimateCode": "获取动态码",
- "codeSent": "已发送({seconds}s)",
- "doNotRepeatedlyClick": "请勿重复点击",
- "save": "绑定",
- "bindSuccess": "绑定成功",
- "alikePhone": "与原手机号一致,无需修改",
- "tipTitle": "温馨提示",
- "bindBenefitTip": "绑定手机号后可享受更多服务",
- "sendCodeTip": "点击\"获取动态码\",将会向您的手机号{mobile}发送验证码"
- },
- "cancellation": {
- "title": "账号注销",
- "agreeTermsText": "勾选即表示您已阅读并同意本协议",
- "nextStep": "下一步",
- "pleaseAgreeFirst": "请先勾选同意协议"
- },
- "cancelrefuse": {
- "title": "账号注销",
- "cancelrefuse": {
- "title": "您的申请已拒绝",
- "reasonPrefix": "拒绝理由:",
- "back": "返回",
- "reapply": "重新申请"
- }
- },
- "cancelstatus": {
- "title": "账号注销",
- "step1Name": "提交申请",
- "step1Desc": "您已提交申请,请耐心等待~",
- "step2Name": "等待审核",
- "step2Desc": "等待审核中,审核通过后您的账号将直接被删除",
- "step3Name": "审核通过,注销完成",
- "step3Desc": "您已成功注销账号,期待下一次与您相遇",
- "back": "返回",
- "revokeApplication": "撤销申请",
- "riskTip": "风险提示",
- "revokeConfirm": "确定要撤销申请吗?"
- },
- "cancelsuccess": {
- "title": "账号注销",
- "cancelsuccess": {
- "title": "您已成功注销账号",
- "desc": "待下次与您更好的相遇,如需再次使用,请重新注册",
- "done": "完成"
- }
- },
- "card": {
- "title": "会员卡",
- "validUntil": "有效期至:",
- "enjoyDiscountAnd": "可享受消费折扣和",
- "memberGiftBenefits": "会员大礼包等权益",
- "memberBenefits": "会员权益",
- "freeShipping": "全场包邮",
- "enjoyFreeShipping": "享受商品包邮服务",
- "consumptionDiscount": "消费折扣",
- "enjoyDiscountOnSomeProducts": "部分商品下单可享{discount}折优惠",
- "pointsReward": "积分回馈",
- "earnPointsMultiplier": "下单享{multiplier}倍积分回馈",
- "welcomeGift": "开卡礼包",
- "pointsGift": "积分礼包",
- "giftPoints": "赠送{points}积分",
- "redPacketGift": "红包礼包",
- "giftRedPacket": "赠送{amount}元红包",
- "couponGift": "优惠券礼包",
- "giftCoupons": "赠送{count}张优惠券",
- "renewNow": "立即续费",
- "cardDescription": "会员卡说明",
- "shareTitle": "专属会员权益,快来体验"
- },
- "card_agreement": {
- "title": "会员卡协议"
- },
- "card_buy": {
- "title": "会员卡",
- "validUntil": "有效期至:",
- "enjoyDiscountAnd": "可享受消费折扣和",
- "memberGiftBenefits": "会员大礼包等权益",
- "cardTypeSelection": "卡种选择",
- "weekCardName": "周卡",
- "weekCardUnit": "周",
- "monthCardName": "月卡",
- "monthCardUnit": "月",
- "quarterCardName": "季卡",
- "quarterCardUnit": "季",
- "yearCardName": "年卡",
- "yearCardUnit": "年",
- "memberBenefits": "会员权益",
- "freeShipping": "全场包邮",
- "enjoyFreeShipping": "享受商品包邮服务",
- "consumptionDiscount": "消费折扣",
- "enjoyDiscountOnSomeProducts": "部分商品下单可享{discount}折优惠",
- "pointsReward": "积分回馈",
- "earnPointsMultiplier": "下单享{multiplier}倍积分回馈",
- "welcomeGift": "开卡礼包",
- "pointsGift": "积分礼包",
- "giftPoints": "赠送{points}积分",
- "redPacketGift": "红包礼包",
- "giftRedPacket": "赠送{amount}元红包",
- "couponGift": "优惠券礼包",
- "giftCoupons": "赠送{count}张优惠券",
- "renewNow": "立即续费",
- "rechargeToActivate": "充值开通",
- "activateNow": "立即开通",
- "purchaseAgreement": "购买既视为同意",
- "cardDescription": "会员卡说明",
- "noCardsAvailable": "暂无可开会员卡",
- "cardOverrideConfirm": "您有尚未过期的会员卡,再次购卡会覆盖掉之前的卡,是否继续?"
- },
- "card_log": {
- "title": "会员卡记录",
- "totalConsume": "累计消费",
- "cardBalance": "卡余额",
- "totalRecharge": "累计充值",
- "yuanSuffix": "元",
- "statUnit": "({unit})",
- "filterAll": "全部",
- "filterIncome": "收入",
- "filterExpense": "支出",
- "filterRecharge": "充值",
- "filterConsume": "消费",
- "filterGift": "赠送",
- "emptyTips": "暂无会员卡记录",
- "amountWithUnit": "{amount}元"
- },
- "collection": {
- "title": "我的关注",
- "emptyText": "暂无关注的商品",
- "emptySubText": "赶紧去逛逛, 关注心仪的商品吧",
- "deleteSuccess": "删除成功"
- },
- "contact": {
- "title": "客服"
- },
- "coupon": {
- "title": "我的优惠券",
- "tabUnused": "未使用",
- "tabUsed": "已使用",
- "tabExpired": "已过期",
- "discountText": "{discount}折",
- "minAmountCondition": "满{amount}元可用",
- "noThresholdCoupon": "无门槛优惠券",
- "specifiedGoods": "指定商品",
- "maxDiscount": "(最大优惠{amount}元)",
- "validPeriodPrefix": "有效期:",
- "longTermValid": "长期有效",
- "useNow": "去使用",
- "used": "已使用",
- "expired": "已过期",
- "emptyText": "暂无优惠券",
- "goShopping": "去逛逛",
- "merchantNotEnabled": "商家未开启优惠券"
- },
- "footprint": {
- "title": "我的足迹",
- "emptyTpis": "您还未浏览过任何商品!",
- "manage": "管理",
- "done": "完成",
- "soldPrefix": "已售",
- "unitPiece": "件",
- "emptyText": "暂无浏览过的商品",
- "emptySubText": "赶紧去逛逛, 发现更多商品吧",
- "selectAll": "全选",
- "delete": "删除",
- "pleaseSelectDelete": "请选择要删除的数据!"
- },
- "gift": {
- "title": "我的礼品",
- "emptyTips": "暂无礼品"
- },
- "gift_detail": {
- "title": "礼品订单"
- },
- "index": {
- "title": "我的中心2",
- "login": "新的登录556",
- "loginTips": "点击登录 享受更多精彩信息",
- "memberLevel": "会员等级",
- "moreAuthority": "更多权限",
- "allOrders": "全部订单",
- "seeAllOrders": "查看全部订单",
- "waitPay": "待付款",
- "readyDelivery": "待发货",
- "waitDelivery": "待收货",
- "refunding": "退款",
- "getDynacode": "获取动态验证码",
- "sign": "签到",
- "personInfo": "个人资料",
- "receivingAddress": "收货地址",
- "accountList": "账户列表",
- "couponList": "优惠券",
- "mySpellList": "我的拼单",
- "myBargain": "我的砍价",
- "virtualCode": "虚拟码",
- "winningRecord": "我的礼品",
- "myCollection": "我的关注",
- "myTracks": "我的足迹",
- "pintuanOrder": "拼团订单",
- "yushouOrder": "预售订单",
- "verification": "核销台",
- "message": "我的消息",
- "exchangeOrder": "积分兑换",
- "waitpay": "待付款",
- "waitsend": "待发货",
- "waitconfirm": "待收货",
- "activist": "售后",
- "completed": "已完成",
- "balance": "余额",
- "point": "积分",
- "coupon": "优惠券",
- "memberRecommend": "邀请有礼",
- "myPresale": "我的预售",
- "myGiftcard": "我的礼品卡",
- "myDivideticket": "我的瓜分券",
- "myRebate": "拼团返利",
- "myHongbao": "我的红包列表",
- "myBlindBox": "我的盲盒",
- "logout": "退出登录",
- "cancellation": "账号注销",
- "logoutTitle": "提示",
- "logoutContent": "确定要退出登录吗",
- "cancellationTitle": "风险提示",
- "cancellationContent": "确定要注销当前账号吗?",
- "privacyPolicy": "隐私协议",
- "registrationAgreement": "注册协议",
- "iKnow": "我知道了"
- },
- "info": {
- "title": "个人资料",
- "headImg": "头像",
- "avatar": "头像",
- "account": "账号",
- "nickname": "昵称",
- "realName": "真实姓名",
- "sex": "性别",
- "gender": "性别",
- "birthday": "生日",
- "password": "密码",
- "paypassword": "支付密码",
- "mobilePhone": "手机",
- "bindMobile": "绑定手机",
- "cancellation": "注销账号",
- "lang": "语言",
- "logout": "退出登录",
- "save": "保存",
- "noset": "未设置",
- "nickPlaceholder": "请输入新昵称",
- "pleaseRealName": "请输入真实姓名",
- "nowPassword": "当前密码",
- "newPassword": "新密码",
- "confirmPassword": "确认新密码",
- "phoneNumber": "手机号",
- "confirmCode": "验证码",
- "confirmCodeInput": "请输入验证码",
- "confirmCodeInputerror": "验证码错误",
- "findanimateCode": "获取动态码",
- "animateCode": "动态码",
- "animateCodeInput": "请输入动态码",
- "modifyNickname": "修改昵称",
- "modifyPassword": "修改密码",
- "bindPhone": "绑定手机",
- "alikeNickname": "与原昵称一致,无需修改",
- "noEmityNickname": "昵称不能为空",
- "updateSuccess": "修改成功",
- "pleaseInputOldPassword": "请输入原始密码",
- "pleaseInputNewPassword": "请输入新密码",
- "passwordLength": "密码长度不能小于6位",
- "alikePassword": "两次密码不一致",
- "samePassword": "新密码不能与原密码相同",
- "surePhoneNumber": "请输入正确的手机号",
- "alikePhone": "与原手机号一致,无需修改",
- "modify": "修改",
- "sexUnknown": "未知",
- "sexMale": "男",
- "sexFemale": "女",
- "pleaseSelectBirthday": "请选择生日",
- "alikeRealName": "与原真实姓名一致,无需修改",
- "noEmptyRealName": "真实姓名不能为空",
- "passwordMinLength": "新密码长度不能小于{num}位",
- "passwordComplexityPrefix": "密码需包含",
- "passwordNumber": "数字",
- "passwordLowercase": "小写字母",
- "passwordUppercase": "大写字母",
- "passwordSymbol": "特殊字符",
- "passwordSeparator": "、",
- "pleaseInputMobile": "请输入手机号",
- "codeSent": "已发送({seconds}s)",
- "doNotRepeatedlyClick": "请勿重复点击",
- "pleaseSelectRegion": "请选择所在地区",
- "pleaseInputDetailAddress": "请输入详细地址"
- },
- "info_edit": {
- "title": "个人资料",
- "headImg": "头像",
- "account": "账号",
- "username": "用户名",
- "nickname": "昵称",
- "realName": "真实姓名",
- "sex": "性别",
- "birthday": "生日",
- "password": "密码",
- "paypassword": "支付密码",
- "mobilePhone": "手机",
- "bindMobile": "绑定手机",
- "cancellation": "注销账号",
- "lang": "语言",
- "logout": "退出登录",
- "save": "保存",
- "noset": "未设置",
- "usernamePlaceholder": "请输入新用户名",
- "nickPlaceholder": "请输入新昵称",
- "pleaseRealName": "请输入真实姓名",
- "nowPassword": "当前密码",
- "newPassword": "新密码",
- "confirmPassword": "确认新密码",
- "phoneNumber": "手机号",
- "confirmCode": "验证码",
- "confirmCodeInput": "请输入验证码",
- "confirmCodeInputerror": "验证码错误",
- "findanimateCode": "获取动态码",
- "animateCode": "动态码",
- "animateCodeInput": "请输入动态码",
- "modifyNickname": "修改昵称",
- "modifyPassword": "修改密码",
- "bindPhone": "绑定手机",
- "alikeusername": "与原用户名一致,无需修改",
- "noEmityUsername": "用户名不能为空",
- "alikeNickname": "与原昵称一致,无需修改",
- "noEmityNickname": "昵称不能为空",
- "updateSuccess": "修改成功",
- "pleaseInputOldPassword": "请输入原始密码",
- "pleaseInputNewPassword": "请输入新密码",
- "passwordLength": "密码长度不能小于6位",
- "alikePassword": "两次密码不一致",
- "samePassword": "新密码不能与原密码相同",
- "surePhoneNumber": "请输入正确的手机号",
- "alikePhone": "与原手机号一致,无需修改",
- "modify": "修改",
- "pleaseInput": "请输入",
- "usernameModifyTip": "用户名仅可修改一次,请谨慎设置",
- "pleaseSelectBirthday": "请选择生日",
- "bindMobileFirstTip": "请先绑定手机再执行该操作",
- "bindNow": "立即绑定",
- "smsCode": "短信验证码",
- "sendCodeTip": "点击\"获取动态码\",将会向您已绑定的手机号{mobile}发送验证码",
- "oneClickAuthBind": "一键授权绑定",
- "manualBind": "手动绑定",
- "region": "所在地区",
- "pleaseSelectRegion": "请选择省市区县",
- "detailAddress": "详细地址",
- "sexUnknown": "未知",
- "sexMale": "男",
- "sexFemale": "女",
- "alikeRealName": "与原真实姓名一致,无需修改",
- "noEmptyRealName": "真实姓名不能为空",
- "passwordMinLength": "新密码长度不能小于{num}位",
- "passwordComplexityPrefix": "密码需包含",
- "passwordNumber": "数字",
- "passwordLowercase": "小写字母",
- "passwordUppercase": "大写字母",
- "passwordSymbol": "特殊字符",
- "passwordSeparator": "、",
- "pleaseInputMobile": "请输入手机号",
- "codeSent": "已发送({seconds}s)",
- "doNotRepeatedlyClick": "请勿重复点击",
- "pleaseInputDetailAddress": "请输入详细地址"
- },
- "invite_friends": {
- "title": "邀请好友",
- "activityDescription": "活动说明",
- "activityTime": "活动时间:{startTime}至{endTime}",
- "inviteNow": "立即邀请",
- "myFriends": "我的好友",
- "cashRedPacketAmount": "{amount}元现金红包",
- "pointsAmount": "{amount}积分",
- "couponsAmount": "{count}张优惠券",
- "viewMore": "查看更多",
- "noMoreData": "没有更多数据了",
- "noInvitedFriendsTip": "您还没有邀请到新朋友哦",
- "inviteTip": "邀请好友,赚取好礼。赶紧去试试吧~",
- "inviteRewards": "邀请好友奖励",
- "cashRedPacket": "现金红包",
- "points": "积分",
- "couponUnit": "张",
- "coupon": "优惠券",
- "shareDesc": "分享给好友,让好友通过你的分享链接进入并注册登录,可获得以下奖励:",
- "balanceReward": "可得{amount}元红包奖励",
- "pointReward": "可得{amount}积分",
- "couponReward": "可得{count}张优惠券",
- "unlimitedReward": "可得奖励不受限制",
- "rewardLimit": "奖励上限为{max}人",
- "howToInvite": "如何邀请好友",
- "stepShareLink": "分享链接给好友",
- "stepFriendEnter": "好友进入",
- "stepFriendRegister": "好友注册成功获得奖励",
- "saveImage": "保存图片",
- "longPressSaveImage": "长按保存图片",
- "share": "分享",
- "shareToFriends": "分享给好友",
- "generatePoster": "生成分享海报",
- "copyLink": "复制链接",
- "cancelShare": "取消分享",
- "noData": "暂无相关数据",
- "saveSuccess": "保存成功",
- "saveFailed": "保存失败,请稍后重试"
- },
- "level": {
- "title": "会员等级",
- "defaultLevelTips": "您已经是最高级别的会员了!",
- "tag": "专属标签",
- "tagDesc": "标签达人",
- "discount": "专享折扣",
- "discountDesc": "专享{0}折",
- "service": "优质服务",
- "serviceDesc": "360度全方位",
- "memberLevel": "会员等级",
- "condition": "条件",
- "equity": "权益",
- "giftPackage": "升级礼包",
- "levelExplain": "等级说明",
- "upgradeTips": "升级会员,享专属权益",
- "currentLevelLabel": "当前等级:",
- "growthRules": "成长规则",
- "currentLevelTag": "当前等级",
- "currentGrowthValue": "当前成长值",
- "growthToNextLevel": "再获得{needGrowth}成长值成为{levelName}",
- "maxLevelReached": "您现在已经是最高等级",
- "memberBenefits": "会员权益",
- "freeShipping": "包邮服务",
- "freeShippingDesc": "提供商品包邮服务",
- "consumptionDiscount": "享受消费折扣服务",
- "noDiscountDesc": "不享受任何消费折扣和其他权益",
- "discountDescWithValue": "提供{discount}折消费折扣",
- "pointsReward": "享受积分回馈服务",
- "pointsRewardDesc": "提供{multiplier}倍积分回馈倍率",
- "memberGift": "会员礼包",
- "pointsGift": "积分礼包",
- "giftPoints": "赠送{points}积分",
- "redPacketGift": "红包礼包",
- "giftRedPacket": "赠送{amount}元红包",
- "couponGift": "优惠券礼包",
- "giftCoupons": "赠送{count}张优惠券",
- "coupons": "优惠券",
- "yuan": "元",
- "zhe": "折",
- "navigatingToDetail": "将前往详情页面"
- },
- "level_growth_rules": {
- "title": "成长值说明",
- "level": "等级",
- "growthValue": "成长值",
- "whatIsGrowthValue": "什么是成长值",
- "growthValueDescription": "成长值是消费者在店铺成为会员后,通过消费计算出来的值。成长值决定会员等级,会员等级越高,所享受的会员权益和会员礼包就越多。",
- "howToGetGrowthValue": "如何获得成长值",
- "ruleRegister": "1、注册会员送x成长值。",
- "ruleRecharge": "2、会员充值到余额送x成长值。",
- "ruleCheckin": "3、会员签到送x成长值。",
- "ruleConsume": "4、会员消费x元,交易完成即可获得x个成长值。",
- "navigatingToDetail": "将前往详情页面"
- },
- "message": {
- "title": "我的消息"
- },
- "modify_face": {
- "title": "修改头像",
- "clickToUpload": "点击上传",
- "confirmSave": "确认保存",
- "reupload": "重新上传",
- "uploadFailed": "头像上传失败",
- "modifySuccess": "头像修改成功"
- },
- "pay_password": {
- "title": "支付密码",
- "passwordTips": "请输入6位支付密码,建议不要使用重复或连续数字",
- "codeSentTips": "验证码已发送至{mobile}请在下方输入4位数字验证码",
- "inputSmsCode": "输入短信验证码",
- "setPayPassword": "请设置支付密码",
- "inputAgain": "请再次输入",
- "confirm": "确认",
- "getCode": "获取验证码",
- "getDynacode": "获取动态码",
- "tipsTitle": "提示",
- "bindMobileFirst": "设置支付密码需要先绑定手机号,是否立即绑定?",
- "modifySuccess": "修改成功",
- "passwordMismatch": "两次输入的密码不一致",
- "resendAfter": "{seconds}s后可重新获取"
- },
- "point": {
- "title": "我的积分",
- "currentPoints": "当前积分",
- "totalPoints": "累计积分",
- "totalConsume": "累计消费",
- "todayEarned": "今日获得",
- "pointDetail": "积分明细",
- "pointMall": "积分商城"
- },
- "point_detail": {
- "title": "积分明细",
- "emptyTpis": "您暂时还没有积分记录哦!",
- "pointExplain": "积分说明"
- },
- "public": {
- "riskWarningTitle": "风险提示",
- "cancelAccountConfirm": "确定要注销当前账号吗?"
- },
- "signin": {
- "title": "签到有礼",
- "signinNotEnabled": "商家未开启会员签到",
- "signinClosed": "签到未开启",
- "shareDesc": "天天签到,积分好礼送不停",
- "shareTitle": "签到有礼,天天签到,积分好礼送不停"
- },
- "withdrawal": {
- "title": "提现记录",
- "emptyTips": "暂无提现记录"
- },
- "withdrawal_detail": {
- "title": "提现详情",
- "currentStatus": "当前状态",
- "transactionNo": "交易号",
- "serviceFee": "手续费",
- "applyTime": "申请时间",
- "auditTime": "审核时间",
- "bankName": "银行名称",
- "receivingAccount": "收款账号",
- "refuseReason": "拒绝理由",
- "transferTypeName": "转账方式名称",
- "transferTime": "转账时间"
- }
- },
- "merch": {
- "detail": {
- "title": "商户首页",
- "searchPlaceholder": "请输入您要搜索的商品",
- "desc": {
- "scrollUpToViewMore": "上滑查看更多",
- "collapse": "↑ 收起",
- "expand": "↓ 展开"
- },
- "sort": {
- "comprehensive": "综合",
- "sales": "销量",
- "price": "价格",
- "filter": "筛选"
- },
- "goods": {
- "consultNow": "立即咨询",
- "sold": "已售{num}{unit}",
- "defaultUnit": "件",
- "noGoods": "暂无商品"
- },
- "filter": {
- "title": "筛选",
- "allCategories": "全部分类",
- "all": "全部",
- "reset": "重置",
- "confirm": "确定"
- },
- "modal": {
- "title": "提示",
- "merchantNotExist": "商家不存在"
- }
- },
- "edit": {
- "title": "编辑商品",
- "addTitle": "添加商品",
- "grounding": {
- "offShelf": "下架",
- "onShelf": "上架"
- },
- "pickupType": {
- "sameDay": "当日达",
- "nextDay": "次日达",
- "dayAfter": "隔日达"
- },
- "virtualDeliver": {
- "auto": "自动发货",
- "manual": "手动发货",
- "verify": "到店核销"
- },
- "virtualReceive": {
- "auto": "自动收货",
- "buyerConfirm": "买家确认收货"
- },
- "validityType": {
- "permanent": "永久",
- "daysAfterPurchase": "购买后几日有效",
- "specifiedDate": "指定过期日期"
- },
- "carmi": {
- "add": "添加卡密",
- "addWithCount": "添加卡密【{count}】"
- },
- "limitType": {
- "single": "单次限购",
- "longTerm": "长期限购"
- },
- "message": {
- "goodsNotExist": "商品不存在",
- "maxCategory": "商品可以属于多个分类,最多10个",
- "pleaseEnterGoodsName": "请输入商品名称",
- "subtitleMaxLength": "商品简介不能超过{max}个字符",
- "pleaseUploadGoodsImage": "请上传商品图片",
- "pleaseEnterSalePrice": "请输入销售价",
- "salePriceFormatError": "[销售价]格式输入错误",
- "originalPriceFormatError": "[原价价]格式输入错误",
- "pleaseEnterStock": "请输入库存",
- "stockFormatError": "[库存]格式输入错误",
- "minOrderFormatError": "[起售]格式输入错误",
- "minOrderNotLessThanZero": "起售数量不能小于0"
- },
- "placeholder": {
- "selectGoodsForm": "请选择商品表单",
- "selectSupplier": "请选择供应商"
- }
- },
- "list": {
- "title": "商品列表",
- "searchPlaceholder": "请输入您要搜索的商品",
- "buyText": "购买",
- "sort": {
- "comprehensive": "综合",
- "sales": "销量",
- "price": "价格",
- "filter": "筛选"
- },
- "goods": {
- "consultNow": "立即咨询",
- "sold": "已售{num}{unit}",
- "defaultUnit": "件",
- "noGoods": "暂无商品"
- },
- "filter": {
- "title": "筛选",
- "allCategories": "全部分类",
- "all": "全部",
- "reset": "重置",
- "confirm": "确定"
- },
- "modal": {
- "title": "提示",
- "merchantNotExist": "商家不存在"
- },
- "shareTitle": "搜索到{count}件\"{keyword}\"相关的优质商品",
- "priceFilter": {
- "pleaseEnterMaxPrice": "请输入最高价",
- "priceCannotBeLessThanZero": "筛选价格不能小于0",
- "minCannotExceedMax": "最低价不能大于最高价",
- "maxCannotBeLessThanMin": "最高价不能小于最低价"
- }
- },
- "merchcategory": {
- "title": "入驻商户"
- }
- },
- "notice": {
- "detail": {
- "title": "公告详情",
- "publishTimePrefix": "发布时间:"
- },
- "list": {
- "title": "公告列表",
- "emptyText": "当前暂无更多信息",
- "contentTitle": "升级公告",
- "topTag": "置顶",
- "noNotice": "暂无公告"
+ "form": {
+ "title": "请填写表单所需信息",
+ "submitSuccess": "提交成功",
+ "noFormInfo": "未获取到表单信息"
}
},
"order": {
- "activist": {
- "title": "售后",
- "checkDetail": "查看详情",
- "emptyTips": "暂无售后记录",
- "status": {
- "success": "退款成功",
- "processing": "退款中",
- "failed": "退款失败"
+ "evaluate": {
+ "title": "我要评价",
+ "rating": {
+ "descriptionMatch": "描述相符",
+ "goodRating": "好评",
+ "mediumRating": "中评",
+ "badRating": "差评"
+ },
+ "input": {
+ "evaluationPlaceholder": "请在此处输入您的评价",
+ "followUpPlaceholder": "请在此处输入您的追评"
+ },
+ "action": {
+ "anonymous": "匿名",
+ "submit": "提交"
},
- "totalItems": "共{num}件商品",
- "refundAmount": "退款:{currency}{amount}",
"toast": {
- "cancelSuccess": "撤销成功"
+ "orderDataNotFound": "未获取到订单数据",
+ "evaluateNotEnabled": "商家未开启商品评价功能",
+ "evaluationCannotBeEmpty": "商品的评价不能为空哦",
+ "evaluationSuccess": "评价成功"
+ }
+ },
+ "detail_point": {
+ "title": "订单详情",
+ "status": {
+ "pendingPayment": "待支付",
+ "completed": "已完成",
+ "closed": "已关闭"
},
- "cancelRefund": {
- "content": "撤销之后本次申请将会关闭,如后续仍有问题可再次发起申请。",
- "cancelText": "暂不撤销"
+ "goods": {
+ "points": "积分"
+ },
+ "orderInfo": {
+ "orderNo": "订单编号:",
+ "copy": "复制",
+ "outTradeNo": "订单交易号:",
+ "createTime": "创建时间:",
+ "closeTime": "关闭时间:"
+ },
+ "amount": {
+ "pointsUsed": "使用积分",
+ "deliveryFee": "运费",
+ "totalPayable": "实付金额:"
+ },
+ "button": {
+ "close": "关闭",
+ "pay": "支付"
+ },
+ "modal": {
+ "tip": "提示",
+ "confirmClose": "确定关闭此次兑换?"
+ },
+ "toast": {
+ "orderInfoNotFound": "未获取到订单信息!",
+ "closeSuccess": "关闭成功"
+ }
+ },
+ "invoice": {
+ "title": "发票申请",
+ "header": {
+ "title": "发票信息",
+ "desc": "请填写发票相关信息"
+ },
+ "invoiceType": {
+ "title": "发票类型",
+ "paper": "纸质发票",
+ "paperDesc": "发票将邮寄到指定地址",
+ "electronic": "电子发票",
+ "electronicDesc": "发票将发送至您的邮箱"
+ },
+ "invoiceTitle": {
+ "title": "发票抬头",
+ "personal": "个人",
+ "company": "企业",
+ "label": "发票抬头",
+ "personalPlaceholder": "请输入个人姓名",
+ "companyPlaceholder": "请输入企业名称",
+ "taxpayerId": "纳税人识别号",
+ "taxpayerIdPlaceholder": "请输入纳税人识别号"
+ },
+ "invoiceContent": {
+ "title": "发票内容",
+ "label": "发票内容",
+ "placeholder": "请选择发票内容"
+ },
+ "mailInfo": {
+ "title": "邮寄信息",
+ "receiver": "收件人",
+ "receiverPlaceholder": "请输入收件人姓名",
+ "mobile": "联系电话",
+ "mobilePlaceholder": "请输入联系电话",
+ "address": "邮寄地址",
+ "regionPlaceholder": "请选择所在地区",
+ "detailAddress": "详细地址",
+ "detailAddressPlaceholder": "请输入详细地址"
+ },
+ "emailInfo": {
+ "title": "邮箱信息",
+ "receiverEmail": "接收邮箱",
+ "emailPlaceholder": "请输入接收发票的邮箱地址"
+ },
+ "fee": {
+ "taxFee": "发票税费",
+ "deliveryFee": "邮寄费用"
+ },
+ "footer": {
+ "tip": "温馨提示:发票申请提交后将在{days}个工作日内处理",
+ "submit": "提交申请"
+ },
+ "validation": {
+ "pleaseEnterTitle": "请输入发票抬头",
+ "pleaseEnterTaxpayerId": "请输入纳税人识别号",
+ "pleaseSelectContent": "请选择发票内容",
+ "pleaseEnterReceiver": "请输入收件人姓名",
+ "pleaseEnterMobile": "请输入联系电话",
+ "pleaseSelectRegion": "请选择所在地区",
+ "pleaseEnterAddress": "请输入详细地址",
+ "pleaseEnterEmail": "请输入接收邮箱",
+ "invalidEmail": "请输入正确的邮箱地址"
+ },
+ "api": {
+ "getConfigFailed": "获取发票配置失败",
+ "submitSuccess": "发票申请提交成功",
+ "submitFailed": "提交失败,请稍后重试",
+ "networkError": "网络错误,请稍后重试"
+ }
+ },
+ "refund_batch": {
+ "title": "批量退款",
+ "form": {
+ "refundReason": "退款原因:",
+ "refundType": "退款方式:",
+ "refundOnly": "退款无需退货",
+ "returnRefund": "退货退款",
+ "refundAmount": "退款金额:",
+ "refundRemark": "退款说明",
+ "pleaseSelect": "请选择",
+ "remarkPlaceholder": "请输入退款说明(选填)"
+ },
+ "reasonPopup": {
+ "title": "退款原因",
+ "confirm": "确定"
+ },
+ "toast": {
+ "noRefundInfo": "未获取到该订单项退款信息"
+ },
+ "validate": {
+ "pleaseSelectRefundReason": "请选择退款原因"
}
},
"detail": {
@@ -2588,188 +3095,65 @@
"orderInfoNotFound": "未获取到订单信息!"
}
},
- "detail_local_delivery": {
- "title": "订单详情"
+ "activist": {
+ "title": "售后",
+ "checkDetail": "查看详情",
+ "emptyTips": "暂无售后记录",
+ "status": {
+ "success": "退款成功",
+ "processing": "退款中",
+ "failed": "退款失败"
+ },
+ "totalItems": "共{num}件商品",
+ "refundAmount": "退款:{currency}{amount}",
+ "toast": {
+ "cancelSuccess": "撤销成功"
+ },
+ "cancelRefund": {
+ "content": "撤销之后本次申请将会关闭,如后续仍有问题可再次发起申请。",
+ "cancelText": "暂不撤销"
+ }
+ },
+ "refund_goods_select": {
+ "title": "选择退款商品",
+ "totalItems": "共{count}件商品",
+ "next": "下一步",
+ "selectGoods": "请选择商品",
+ "orderInfoNotFound": "未查找到订单信息"
},
"detail_pickup": {
"title": "订单详情"
},
- "detail_point": {
- "title": "订单详情",
- "status": {
- "pendingPayment": "待支付",
- "completed": "已完成",
- "closed": "已关闭"
+ "refund": {
+ "title": "申请退款",
+ "refundType": {
+ "refundOnly": "退款无需退货",
+ "refundOnlyDesc": "没收到货,或与卖家协商同意无需退货只退款",
+ "returnRefund": "退货退款",
+ "returnRefundDesc": "已收到货,需退还收到的货物"
},
- "goods": {
- "points": "积分"
+ "form": {
+ "refundReason": "退款原因:",
+ "refundAmount": "退款金额:",
+ "refundRemark": "退款说明",
+ "pleaseSelect": "请选择",
+ "remarkPlaceholder": "请输入退款说明(选填)"
},
- "orderInfo": {
- "orderNo": "订单编号:",
- "copy": "复制",
- "outTradeNo": "订单交易号:",
- "createTime": "创建时间:",
- "closeTime": "关闭时间:"
- },
- "amount": {
- "pointsUsed": "使用积分",
- "deliveryFee": "运费",
- "totalPayable": "实付金额:"
- },
- "button": {
- "close": "关闭",
- "pay": "支付"
- },
- "modal": {
- "tip": "提示",
- "confirmClose": "确定关闭此次兑换?"
+ "reasonPopup": {
+ "title": "退款原因",
+ "confirm": "确定"
},
"toast": {
- "orderInfoNotFound": "未获取到订单信息!",
- "closeSuccess": "关闭成功"
+ "noRefundInfo": "未获取到该订单项退款信息"
+ },
+ "validate": {
+ "pleaseSelectRefundReason": "请选择退款原因"
+ },
+ "refund": {
+ "cancelRefundContent": "撤销之后本次申请将会关闭,如后续仍有问题可再次发起申请。",
+ "cancelRefundCancelText": "暂不撤销"
}
},
- "detail_virtual": {
- "title": "订单详情"
- },
- "evaluate": {
- "title": "我要评价",
- "rating": {
- "descriptionMatch": "描述相符",
- "goodRating": "好评",
- "mediumRating": "中评",
- "badRating": "差评"
- },
- "input": {
- "evaluationPlaceholder": "请在此处输入您的评价",
- "followUpPlaceholder": "请在此处输入您的追评"
- },
- "action": {
- "anonymous": "匿名",
- "submit": "提交"
- },
- "toast": {
- "orderDataNotFound": "未获取到订单数据",
- "evaluateNotEnabled": "商家未开启商品评价功能",
- "evaluationCannotBeEmpty": "商品的评价不能为空哦",
- "evaluationSuccess": "评价成功"
- }
- },
- "invoice": {
- "title": "发票申请",
- "header": {
- "title": "发票信息",
- "desc": "请填写发票相关信息"
- },
- "invoiceType": {
- "title": "发票类型",
- "paper": "纸质发票",
- "paperDesc": "发票将邮寄到指定地址",
- "electronic": "电子发票",
- "electronicDesc": "发票将发送至您的邮箱"
- },
- "invoiceTitle": {
- "title": "发票抬头",
- "personal": "个人",
- "company": "企业",
- "label": "发票抬头",
- "personalPlaceholder": "请输入个人姓名",
- "companyPlaceholder": "请输入企业名称",
- "taxpayerId": "纳税人识别号",
- "taxpayerIdPlaceholder": "请输入纳税人识别号"
- },
- "invoiceContent": {
- "title": "发票内容",
- "label": "发票内容",
- "placeholder": "请选择发票内容"
- },
- "mailInfo": {
- "title": "邮寄信息",
- "receiver": "收件人",
- "receiverPlaceholder": "请输入收件人姓名",
- "mobile": "联系电话",
- "mobilePlaceholder": "请输入联系电话",
- "address": "邮寄地址",
- "regionPlaceholder": "请选择所在地区",
- "detailAddress": "详细地址",
- "detailAddressPlaceholder": "请输入详细地址"
- },
- "emailInfo": {
- "title": "邮箱信息",
- "receiverEmail": "接收邮箱",
- "emailPlaceholder": "请输入接收发票的邮箱地址"
- },
- "fee": {
- "taxFee": "发票税费",
- "deliveryFee": "邮寄费用"
- },
- "footer": {
- "tip": "温馨提示:发票申请提交后将在{days}个工作日内处理",
- "submit": "提交申请"
- },
- "validation": {
- "pleaseEnterTitle": "请输入发票抬头",
- "pleaseEnterTaxpayerId": "请输入纳税人识别号",
- "pleaseSelectContent": "请选择发票内容",
- "pleaseEnterReceiver": "请输入收件人姓名",
- "pleaseEnterMobile": "请输入联系电话",
- "pleaseSelectRegion": "请选择所在地区",
- "pleaseEnterAddress": "请输入详细地址",
- "pleaseEnterEmail": "请输入接收邮箱",
- "invalidEmail": "请输入正确的邮箱地址"
- },
- "api": {
- "getConfigFailed": "获取发票配置失败",
- "submitSuccess": "发票申请提交成功",
- "submitFailed": "提交失败,请稍后重试",
- "networkError": "网络错误,请稍后重试"
- }
- },
- "list": {
- "title": "订单列表",
- "emptyTips": "暂无相关订单",
- "all": "全部",
- "waitPay": "待付款",
- "readyDelivery": "待发货",
- "waitDelivery": "待收货",
- "waitEvaluate": "待评价",
- "waitUse": "待使用",
- "update": "释放刷新",
- "updateIng": "加载中...",
- "searchPlaceholder": "请输入商品名称\/订单编号",
- "orderNo": "订单号:",
- "totalGoods": "共{num}件商品",
- "actualPayment": "实付款:",
- "remainingTime": "剩余时间:",
- "evaluate": "评价",
- "review": "追评",
- "viewDetail": "查看详情",
- "status": {
- "all": "全部",
- "waitpay": "待付款",
- "waitsend": "待发货",
- "waitconfirm": "待收货",
- "waitrate": "已完成"
- }
- },
- "logistics": {
- "title": "物流信息",
- "order": {
- "logistics": {
- "expressCompany": "承运公司:",
- "trackingNo": "运单号:",
- "orderInfoNotFound": "未获取到订单信息!"
- }
- }
- },
- "method": {
- "tip": "提示",
- "payAdjustConfirm": "商家已将支付金额调整为{payMoney}元,是否继续支付?",
- "closeConfirm": "您确定要关闭该订单吗?",
- "closeError": "当前订单可能存在拼团,维权等操作,{message}不可以关闭哦!",
- "deliveryConfirm": "您确定已经收到货物了吗?",
- "virtualDeliveryConfirm": "您确定要进行收货吗?"
- },
"payment": {
"title": "确认订单",
"virtual": {
@@ -2906,57 +3290,29 @@
"selectInvoiceContent": "请选择发票内容"
}
},
- "refund": {
- "title": "申请退款",
- "refundType": {
+ "detail_virtual": {
+ "title": "订单详情"
+ },
+ "logistics": {
+ "title": "物流信息",
+ "order": {
+ "logistics": {
+ "expressCompany": "承运公司:",
+ "trackingNo": "运单号:",
+ "orderInfoNotFound": "未获取到订单信息!"
+ }
+ }
+ },
+ "refund_type_select": {
+ "title": "选择退款类型",
+ "refundTypeSelect": {
"refundOnly": "退款无需退货",
"refundOnlyDesc": "没收到货,或与卖家协商同意无需退货只退款",
"returnRefund": "退货退款",
"returnRefundDesc": "已收到货,需退还收到的货物"
},
- "form": {
- "refundReason": "退款原因:",
- "refundAmount": "退款金额:",
- "refundRemark": "退款说明",
- "pleaseSelect": "请选择",
- "remarkPlaceholder": "请输入退款说明(选填)"
- },
- "reasonPopup": {
- "title": "退款原因",
- "confirm": "确定"
- },
"toast": {
"noRefundInfo": "未获取到该订单项退款信息"
- },
- "validate": {
- "pleaseSelectRefundReason": "请选择退款原因"
- },
- "refund": {
- "cancelRefundContent": "撤销之后本次申请将会关闭,如后续仍有问题可再次发起申请。",
- "cancelRefundCancelText": "暂不撤销"
- }
- },
- "refund_batch": {
- "title": "批量退款",
- "form": {
- "refundReason": "退款原因:",
- "refundType": "退款方式:",
- "refundOnly": "退款无需退货",
- "returnRefund": "退货退款",
- "refundAmount": "退款金额:",
- "refundRemark": "退款说明",
- "pleaseSelect": "请选择",
- "remarkPlaceholder": "请输入退款说明(选填)"
- },
- "reasonPopup": {
- "title": "退款原因",
- "confirm": "确定"
- },
- "toast": {
- "noRefundInfo": "未获取到该订单项退款信息"
- },
- "validate": {
- "pleaseSelectRefundReason": "请选择退款原因"
}
},
"refund_detail": {
@@ -3018,368 +3374,76 @@
"pleaseInputExpressNo": "请输入物流单号"
}
},
- "refund_goods_select": {
- "title": "选择退款商品",
- "totalItems": "共{count}件商品",
- "next": "下一步",
- "selectGoods": "请选择商品",
- "orderInfoNotFound": "未查找到订单信息"
- },
- "refund_type_select": {
- "title": "选择退款类型",
- "refundTypeSelect": {
- "refundOnly": "退款无需退货",
- "refundOnlyDesc": "没收到货,或与卖家协商同意无需退货只退款",
- "returnRefund": "退货退款",
- "returnRefundDesc": "已收到货,需退还收到的货物"
- },
- "toast": {
- "noRefundInfo": "未获取到该订单项退款信息"
- }
- }
- },
- "pay": {
- "cashier": {
- "title": "收银台",
- "confirmPay": "确认支付",
- "noPayMethodConfigured": "店铺尚未配置支付方式!",
- "orderAlreadyPaid": "该支付单据已支付",
- "noPayInfo": "未获取到支付信息",
- "alipay": "支付宝支付",
- "wechatpay": "微信支付",
- "pleaseSelectPayMethod": "请选择支付方式!",
- "paying": "支付中...",
- "paymentCancelled": "您已取消支付",
- "paymentFailed": "支付失败,失败原因: {reason}"
- },
- "index": {
- "title": "支付方式",
- "paymentAmount": "支付金额",
- "confirmPayment": "确认支付",
- "seeOrder": "查看订单"
- },
- "result": {
- "title": "支付结果",
- "paymentSuccess": "支付成功",
- "paymentFail": "支付失败",
- "goHome": "回到首页",
- "memberCenter": "会员中心",
- "payMoney": "支付金额",
- "unit": "元",
- "congratulations": "恭喜您获得",
- "points": "积分",
- "growthValue": "成长值",
- "couponsCount": "{count}张优惠券",
- "rechargeRecords": "充值记录",
- "memberCard": "会员卡",
- "viewOrder": "查看订单",
- "noPayInfo": "未获取到支付信息!"
- },
- "wx_pay": {
- "title": "微信支付",
- "openInBrowserTip": "点击右上角跳转到浏览器打开"
- }
- },
- "pintuan": {
- "detail": {
- "title": "",
- "select": "选择",
- "params": "参数",
- "service": "商品服务",
- "allGoods": "全部商品",
- "image": "图片",
- "video": "视频"
- },
"list": {
- "title": "拼团专区"
- },
- "my_spell": {
- "title": "我的拼单"
- },
- "payment": {
- "title": "待付款订单"
- },
- "share": {
- "title": "拼团分享"
- }
- },
- "point": {
- "detail": {
- "title": "兑换",
- "pointsSuffix": "积分",
- "stockLabel": "库存:",
- "unlimitedStock": "无限",
- "unitPiece": "件",
- "containsBalance": "内含{balance}元",
- "noThresholdCoupon": "无门槛优惠券",
- "fullReduction": "满{atLeast}减{money}",
- "fullAmount": "满{atLeast}元",
- "discountSuffix": "折",
- "maxDiscount": "最多优惠{limit}元",
- "validFromReceive": "领取之日起{days}天内有效",
- "validUntil": "{time}到期",
- "addCommunity": "添加",
- "addCommunityTitle": "添加社群",
- "addCommunityTip": "长按识别二维码,添加社群",
- "selectSpec": "选择",
- "attribute": "属性",
- "goodsAttribute": "商品属性",
- "goodsService": "商品服务",
- "confirm": "确定",
- "exchangeDetail": "兑换详情",
- "noExchangeDetail": "暂无兑换详情!",
- "loginToExchange": "登录之后方可兑换",
- "insufficientStock": "库存不足",
- "insufficientPoints": "积分不足",
- "exchange": "兑换",
- "shareTitle": "仅需{point}积分即可兑换{title}"
- },
- "goods_detail": [],
- "goods_list": {
- "title": "积分商品",
- "searchPlaceholder": "请输入商品关键词",
- "comprehensive": "综合",
- "points": "积分",
- "newArrival": "上新时间",
- "filter": "筛选",
- "stock": "库存",
- "noGoods": "暂无积分商品",
- "pointRange": "积分区间",
- "minPlaceholder": "最低",
- "maxPlaceholder": "最高",
- "allCategories": "全部分类",
+ "title": "订单列表",
+ "emptyTips": "暂无相关订单",
"all": "全部",
- "reset": "重置",
- "confirm": "确定",
- "pleaseEnterMaxPrice": "请输入最高价",
- "priceCannotBeLessThanZero": "筛选价格不能小于0",
- "minCannotBeGreaterThanMax": "最低价不能大于最高价",
- "maxCannotBeLessThanMin": "最高价不能小于最低价"
- },
- "list": {
- "title": "积分商城",
- "searchPlaceholder": "搜索商品",
- "myPoints": "我的积分",
- "points": "积分",
- "reminder": "提醒",
- "remarkText": "积分兑好礼,每日上新换不停!",
- "rechargeAmount": "储值{price}元",
- "earnPoints": "可得{point}积分",
- "goRecharge": "去储值",
- "exchangeCoupon": "积分换券",
- "exchangeHongbao": "积分换红包",
- "exchangeGift": "积分换礼品",
- "discountSuffix": "折",
- "noThresholdCoupon": "无门槛优惠券",
- "minSpendAvailable": "满{amount}可用",
- "allStoreCoupon": "全场券",
- "designatedCoupon": "指定券",
- "exchange": "兑换",
- "yuan": "元",
- "stock": "库存:",
- "exchanged": "已兑:",
- "pointDescription": "积分说明",
- "pointAcquisition": "积分的获取",
- "acquisitionItem1": "1、积分可在注册、签到、分享、消费、充值时获得。",
- "acquisitionItem2": "2、在购买部分商品时可获得积分。",
- "pointUsage": "积分的使用",
- "usageItem1": "1、积分可用于兑换积分中心的商品。",
- "usageItem2": "2、积分可在参与某些活动时使用。",
- "usageItem3": "3、积分不得转让,出售,不设有效期。",
- "pointQuery": "积分的查询",
- "queryItem1": "1、积分可在会员中心中查询具体数额以及明细。",
- "categoryExchangeGoods": "积分换好物",
- "categoryExchangeCoupon": "积分换券",
- "categoryExchangeHongbao": "积分换红包",
- "merchantNotEnabled": "商家未开启积分商城",
- "noActivity": "暂无相关活动"
- },
- "order_detail": {
- "title": "积分兑换订单详情"
- },
- "order_list": {
- "title": "积分兑换",
- "emptyTips": "暂无更多数据了",
- "statusAll": "全部",
- "statusPendingPayment": "待支付",
- "statusCompleted": "已完成",
- "statusClosed": "已关闭",
+ "waitPay": "待付款",
+ "readyDelivery": "待发货",
+ "waitDelivery": "待收货",
+ "waitEvaluate": "待评价",
+ "waitUse": "待使用",
+ "update": "释放刷新",
+ "updateIng": "加载中...",
+ "searchPlaceholder": "请输入商品名称\/订单编号",
"orderNo": "订单号:",
- "points": "积分",
- "closeBtn": "关闭",
- "payBtn": "支付",
- "viewDetails": "查看详情",
- "emptyText": "暂无积分兑换订单",
- "goBrowse": "去逛逛",
- "merchantNotEnabled": "商家未开启积分商城",
- "tip": "提示",
- "confirmCloseExchange": "确定关闭此次兑换?",
- "closeSuccess": "关闭成功"
- },
- "payment": {
- "title": "确认订单",
- "virtual": {
- "tips": "购买虚拟类商品需填写手机号,方便商家与您联系",
- "mobile": "手机号码",
- "mobilePlaceholder": "请输入您的手机号码"
- },
- "address": {
- "setAddress": "请设置收货地址",
- "deliveryTime": "送达时间",
- "selectDeliveryTime": "请选择送达时间"
- },
- "localDelivery": {
- "providedBy": "由",
- "deliveredBy": "提供配送",
- "switchStore": "点击切换",
- "noStoreNearby": "您的附近没有可配送的门店,请选择其他配送方式"
- },
- "store": {
- "businessHours": "营业时间:",
- "name": "姓名",
- "reservedMobile": "预留手机",
- "mobilePlaceholder": "请输入您的手机号码",
- "pickupTime": "自提时间",
- "noPickupStore": "当前无自提门店,请选择其它配送方式",
- "address": "地址:"
- },
- "storePopup": {
- "title": "已为您甄选出附近所有相关门店",
- "businessHours": "营业时间:",
- "address": "地址:",
- "noStoreNearby": "所选择收货地址附近没有可以自提的门店"
- },
- "orderMoney": {
- "buyerMessage": "买家留言",
- "buyerMessagePlaceholder": "留言前建议先与商家协调一致",
- "pointsRequired": "所需积分",
- "pointsSuffix": "积分",
- "shippingFee": "运费"
- },
- "settlement": {
- "totalItems": "共{count}件",
- "total": "合计:",
- "pointsSuffix": "积分",
- "submitOrder": "提交订单",
- "shortByForMinimum": "差{amount}起送"
- },
- "toast": {
- "orderDataNotFound": "未获取到创建订单所需数据!",
- "pleaseEnterMobile": "请输入您的手机号码",
- "pleaseEnterCorrectMobile": "请输入正确的手机号码",
- "noDeliveryMethod": "商家未设置配送方式",
- "pleaseSelectAddress": "请先选择您的收货地址",
- "noPickupStore": "没有可提货的门店,请选择其他配送方式",
- "pleaseEnterReservedMobile": "请输入预留手机",
- "pleaseEnterCorrectReservedMobile": "请输入正确的预留手机",
- "pleaseSelectPickupTime": "请选择自提时间",
- "noDeliveryStore": "没有可配送的门店,请选择其他配送方式",
- "pleaseSelectDeliveryTime": "请选择配送时间"
- },
- "modal": {
- "orderNotCreated": "订单未创建",
- "goToSet": "去设置"
- },
- "time": {
- "today": "今天",
- "tomorrow": "明天"
+ "totalGoods": "共{num}件商品",
+ "actualPayment": "实付款:",
+ "remainingTime": "剩余时间:",
+ "evaluate": "评价",
+ "review": "追评",
+ "viewDetail": "查看详情",
+ "status": {
+ "all": "全部",
+ "waitpay": "待付款",
+ "waitsend": "待发货",
+ "waitconfirm": "待收货",
+ "waitrate": "已完成"
}
},
- "result": {
- "title": "兑换结果",
- "exchangeSuccess": "兑换成功",
- "see": "查看兑换记录",
- "goHome": "回到首页"
- }
- },
- "presale": {
- "detail": {
- "title": "",
- "select": "选择",
- "params": "参数",
- "service": "商品服务",
- "allGoods": "全部商品",
- "image": "图片",
- "video": "视频"
- },
- "list": {
- "title": "预售专区"
- },
- "order_detail": {
+ "detail_local_delivery": {
"title": "订单详情"
},
- "order_list": {
- "title": "我的预售",
- "emptyTips": "暂无相关预售订单",
- "update": "释放刷新",
- "updateIng": "加载中..."
- },
- "payment": {
- "title": "待付款订单"
+ "method": {
+ "tip": "提示",
+ "payAdjustConfirm": "商家已将支付金额调整为{payMoney}元,是否继续支付?",
+ "closeConfirm": "您确定要关闭该订单吗?",
+ "closeError": "当前订单可能存在拼团,维权等操作,{message}不可以关闭哦!",
+ "deliveryConfirm": "您确定已经收到货物了吗?",
+ "virtualDeliveryConfirm": "您确定要进行收货吗?"
}
},
- "recharge": {
- "detail": {
- "title": "充值详情"
- },
- "list": {
- "title": "充值列表",
- "rechargeAmount": "充值金额",
- "rechargeRecords": "充值记录",
- "placeholderEnterAmount": "请输入充值金额",
- "yuan": "元",
- "salePrice": "售价 {price} 元",
- "amount": "金额",
- "confirmRecharge": "确认充值",
- "recharge": "充值",
- "pleaseEnterAmount": "请输入充值金额",
- "pleaseSelectPackage": "请选择套餐"
- },
- "order_list": {
- "title": "充值记录",
- "recharge": {
- "rechargeSuccess": "充值成功",
- "noRecord": "暂无充值记录"
- }
- }
- },
- "seal": {
- "medium": {
- "detail": {
- "title": "介质材料详情",
- "exportImage": "导出图片",
- "exportPdf": "导出PDF",
- "loading": "加载中",
- "fileNotExist": "文件不存在",
- "saveSuccess": "保存成功",
- "saveFailed": "保存失败",
- "downloadFailed": "下载失败"
+ "cases": {
+ "index": {
+ "title": "案例展示",
+ "completionTime": "完成时间:{time}",
+ "viewPdfFile": "查看PDF文件",
+ "messagePopup": {
+ "title": "在线留言"
},
- "search": {
- "title": "介质材料搜索",
- "placeholder": "请输入关键词搜索",
- "searchResult": "搜索结果",
- "noData": "暂无数据",
- "tip": "提示",
- "confirmDeleteAllHistory": "确定要删除全部搜索历史吗?",
- "confirmDeleteHistory": "确定要删除这条搜索历史吗?"
+ "form": {
+ "name": "姓名",
+ "namePlaceholder": "请输入您的姓名",
+ "contact": "联系方式",
+ "mobilePlaceholder": "请输入您的手机号",
+ "messageContent": "留言内容",
+ "messagePlaceholder": "请输入留言内容"
+ },
+ "toast": {
+ "loading": "正在加载",
+ "fileNotExist": "文件不存在"
}
- },
- "structure": {
- "title": "结构选型",
- "currentChoicePrefix": "当前选择:",
- "pleaseSelect": "请选择",
- "resultPrefix": "选型结果:",
- "resultFile": "结果文件",
- "selectMaterial": "请选择材质",
- "selectStructure": "请选择结构",
- "uploadImage": "上传图片",
- "pleaseUploadImage": "请上传图片",
- "submitRequirement": "提交需求",
- "submitSuccess": "提交成功"
}
},
- "seckill": {
+ "agreement": {
+ "contenr": {
+ "title": "协议",
+ "noContent": "暂无内容",
+ "noContentDesc": "该协议内容暂未设置",
+ "reload": "重新加载"
+ }
+ },
+ "bargain": {
"detail": {
"title": "",
"select": "选择",
@@ -3389,75 +3453,21 @@
"image": "图片",
"video": "视频"
},
- "list": {
- "title": "秒杀专区"
+ "launch": {
+ "title": "砍价详情"
},
"payment": {
"title": "待付款订单"
- }
- },
- "storeclose": {
- "storeclose": {
- "title": "店铺打烊"
- }
- },
- "store_notes": {
- "note_detail": {
- "title": "笔记详情"
},
- "note_list": {
- "title": "店铺笔记"
- }
- },
- "topics": {
- "detail": {
- "title": "专题活动详情"
- },
- "goods_detail": {
- "title": "",
- "select": "选择",
- "params": "参数",
- "service": "商品服务",
- "allGoods": "全部商品",
- "image": "图片",
- "video": "视频"
+ "my_bargain": {
+ "title": "我的砍价"
},
"list": {
- "title": "专题活动列表"
- },
- "payment": {
- "title": "待付款订单"
- }
- },
- "verification": {
- "detail": {
- "title": "核销明细"
- },
- "index": {
- "title": "核销台"
- },
- "list": {
- "title": "核销记录",
- "emptyTips": "暂无记录"
- }
- },
- "vr": {
- "index": {
- "title": "VR"
- }
- },
- "weapp": {
- "order_shipping": {
- "title": "小程序发货"
- }
- },
- "webview": {
- "webview": {
- "title": ""
+ "title": "砍价专区"
}
}
},
"sign": ""
},
- "timestamp": 1783125826
+ "timestamp": 1784767380
}
\ No newline at end of file
diff --git a/lang/en-us/common.js b/lang/en-us/common.js
index 0624a64..c6dabe9 100644
--- a/lang/en-us/common.js
+++ b/lang/en-us/common.js
@@ -2,10 +2,10 @@ export const lang = {
// 底部选项卡
tabBar: {
- home: 'index',
- category: 'category',
- cart: 'cart',
- member: 'member',
+ home: 'Home',
+ category: 'Category',
+ cart: 'Cart',
+ member: 'Me',
},
//公共
@@ -57,6 +57,7 @@ export const lang = {
// diy custom page (diy-specific copy, generic HTTP errors reuse http.*)
diy: {
networkErrorTitle: 'Notice',
+ networkError: 'Network error, please try again later',
retry: 'Retry',
noDiyData: 'Custom page data not configured',
locationNotAvailable: 'Location not available',
@@ -111,6 +112,7 @@ export const lang = {
notSupported: 'Current environment does not support WeChat Channel',
missingFields: 'Missing required field: {field}',
playFailed: 'WeChat video playback failed!',
+ wechatMpOnly: 'WeChat Channel only plays in WeChat Mini Program',
},
// uniapp utility functions
@@ -256,7 +258,14 @@ export const lang = {
addToCartFailMin: 'Minimum purchase quantity not met',
addToCartFailStock: 'Insufficient Stock',
- // 咨询
+ // generic submit/version/loading text (key lives in root because common.js's lang object IS the common namespace)
+ submitSuccess: 'Submit Success',
+ submitFail: 'Submit Failed',
+ versionInfo: 'Version Info',
+ commitId: 'Commit ID',
+ buildTime: 'Build Time',
+ loading: 'Loading...',
+
consult: 'Consult Now',
consultSuccess: 'Consultation Successful',
consultFail: 'Consultation Failed',
diff --git a/lang/en-us/pay/index.js b/lang/en-us/pay/index.js
index d0f6ed0..57728d4 100644
--- a/lang/en-us/pay/index.js
+++ b/lang/en-us/pay/index.js
@@ -3,5 +3,6 @@ export const lang = {
title: 'Payment Method',
paymentAmount: 'Payment Amount',
confirmPayment: 'Confirm Payment',
- seeOrder: 'View Order'
+ seeOrder: 'View Order',
+ payInfoNotFound: 'Payment info not found!'
}
\ No newline at end of file
diff --git a/lang/zh-cn/common.js b/lang/zh-cn/common.js
index c67b946..d4cf588 100644
--- a/lang/zh-cn/common.js
+++ b/lang/zh-cn/common.js
@@ -64,6 +64,7 @@ export const lang = {
// diy 自定义页面(diy 专属文案,通用网络/接口错误复用 http.*)
diy: {
networkErrorTitle: '提示',
+ networkError: '网络异常,请稍后重试',
retry: '重试',
noDiyData: '未配置自定义页面数据',
locationNotAvailable: '未获取到定位',
@@ -111,6 +112,7 @@ export const lang = {
notSupported: '当前环境不支持微信视频号',
missingFields: '缺少必要字段: {field}',
playFailed: '微信视频播放失败!',
+ wechatMpOnly: '视频号仅支持在微信小程序环境中播放',
},
// uniapp 工具函数
@@ -254,6 +256,14 @@ export const lang = {
addToCartFailMin: '已达到最小购买数量',
addToCartFailStock: '库存不足',
+ // 通用提交/版本/loading 文案(原本该走 common.* 命名空间,因 common.js 整体即 common namespace,放在 root)
+ submitSuccess: '提交成功',
+ submitFail: '提交失败',
+ versionInfo: '版本信息',
+ commitId: '提交 ID',
+ buildTime: '构建时间',
+ loading: '加载中...',
+
consult: '立即咨询',
consultSuccess: '咨询成功',
consultFail: '咨询失败',
diff --git a/lang/zh-cn/pay/index.js b/lang/zh-cn/pay/index.js
index 60ddcaf..d2e5c10 100644
--- a/lang/zh-cn/pay/index.js
+++ b/lang/zh-cn/pay/index.js
@@ -3,5 +3,6 @@ export const lang = {
title: '支付方式',
paymentAmount: '支付金额',
confirmPayment: '确认支付',
- seeOrder: '查看订单'
+ seeOrder: '查看订单',
+ payInfoNotFound: '未获取到支付信息!'
}
From 94142268a0b4e75ee28eb892d8fe658ab5fff3a9 Mon Sep 17 00:00:00 2001
From: ZF sun <34314687@qq.com>
Date: Thu, 23 Jul 2026 09:46:16 +0800
Subject: [PATCH 4/8] =?UTF-8?q?refactor(i18n):=20=E5=AE=8C=E6=88=90?=
=?UTF-8?q?=E5=85=A8=E9=87=8F=E7=A1=AC=E7=BC=96=E7=A0=81=E4=B8=AD=E6=96=87?=
=?UTF-8?q?=E6=96=87=E6=A1=88=E6=9B=BF=E6=8D=A2=E4=B8=BA=E5=A4=9A=E8=AF=AD?=
=?UTF-8?q?=E8=A8=80=E6=96=B9=E6=A1=88?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
1. 替换所有页面/组件中的硬编码中文提示文案为$lang调用,包括支付、帮助中心、公告等页面
2. 重构diy.js加载失败文案处理逻辑,支持参数化替换
3. 新增多语言混入逻辑,实现导航标题随语种动态切换
4. 重构支付组件初始化逻辑,优化平台适配代码
5. 添加多语言单元测试和硬编码扫描脚本
6. 更新语言包,新增缺失的翻译词条
---
common/js/diy.js | 4 +-
common/js/lang.js | 11 +-
components-diy/diy-channel-list.vue | 2 +-
components-diy/diy-form.vue | 4 +-
.../ns-goods-recommend/ns-goods-recommend.vue | 15 +-
components/ns-payment/ns-payment.vue | 45 +-
lang-bundle.json | 18 +-
main.js | 8 +
pages/index/public/js/index.js | 8 +-
pages_goods/public/js/list.js | 4 +-
pages_promotion/merch/public/js/list.js | 3 +-
pages_tool/ai-chat/ai-chat-message.vue | 7 +-
pages_tool/help/list.vue | 2 +-
pages_tool/notice/list.vue | 4 +-
pages_tool/pay/index.vue | 2 +-
scripts/check-title-keys.js | 58 +
scripts/hardcoded_cn_real.json | 264 +
scripts/hardcoded_cn_scan.json | 7804 +++++++++++++++++
scripts/lang_audit_report_v2.json | 90 +-
scripts/scan-hardcoded-cn.py | 80 +
tests/lang.test.js | 493 ++
21 files changed, 8846 insertions(+), 80 deletions(-)
create mode 100644 scripts/check-title-keys.js
create mode 100644 scripts/hardcoded_cn_real.json
create mode 100644 scripts/hardcoded_cn_scan.json
create mode 100644 scripts/scan-hardcoded-cn.py
create mode 100644 tests/lang.test.js
diff --git a/common/js/diy.js b/common/js/diy.js
index 2304d47..2812ab5 100644
--- a/common/js/diy.js
+++ b/common/js/diy.js
@@ -341,8 +341,8 @@ export default {
// empty / unknown 不走模板,直接返回通用网络异常
if (info.type === 'empty' || info.type === 'unknown') return reason;
- const tpl = this.$lang('diy.loadFailTpl');
- return tpl.replace('{reason}', reason);
+ const tpl = this.$lang('diy.loadFailTpl', { reason });
+ return tpl;
},
// 错误横幅「重试」入口
retryDiyInfo() {
diff --git a/common/js/lang.js b/common/js/lang.js
index 49e174f..6735224 100644
--- a/common/js/lang.js
+++ b/common/js/lang.js
@@ -1247,7 +1247,7 @@ export default {
const fieldCacheKey = `${locale}__${langPath}__${_overrideVersion}__${field}`;
const cachedFieldResult = _fieldResultCache[fieldCacheKey];
const hasDefault = arguments.length > 1 && typeof arguments[1] === 'string' && arguments[1] !== '';
- const __DEV__ = (typeof process !== 'undefined' && process.env && process.env.NODE_ENV !== 'production');
+
if (cachedFieldResult !== undefined) {
let value = cachedFieldResult;
// 没找到翻译
@@ -1256,10 +1256,6 @@ export default {
if (hasDefault) {
return arguments[1];
}
- // 生产环境无默认值 → 返回空串(避免用户看到 raw key)
- if (!__DEV__) {
- return '';
- }
// 开发环境 → 返回 raw key(便于发现问题)
return value;
}
@@ -1350,9 +1346,6 @@ export default {
// 有默认值 → 使用默认值
if (hasDefault) {
value = arguments[1];
- } else if (!__DEV__) {
- // 生产环境无默认值 → 返回空串(避免用户看到 raw key)
- value = '';
}
// 开发环境无默认值 → 保留 raw key(便于发现问题)
} else if (arguments.length > 1) {
@@ -1367,7 +1360,7 @@ export default {
if (value == undefined) value = '';
// 多语言调试
- if (__DEV__ && field == value) {
+ if (field == value) {
console.warn(`[i18n] missing key "${field}" in ${langPath || ''} (${locale})`);
}
diff --git a/components-diy/diy-channel-list.vue b/components-diy/diy-channel-list.vue
index 348f177..943bb0d 100644
--- a/components-diy/diy-channel-list.vue
+++ b/components-diy/diy-channel-list.vue
@@ -265,7 +265,7 @@ export default {
// #ifndef MP-WEIXIN
if (item?.channelType === 'wechat') {
uni.showToast({
- title: '视频号仅支持在微信小程序环境中播放',
+ title: this.$lang('wechatChannel.wechatMpOnly'),
icon: 'none',
duration: 2000
});
diff --git a/components-diy/diy-form.vue b/components-diy/diy-form.vue
index 61549b5..f8fd923 100644
--- a/components-diy/diy-form.vue
+++ b/components-diy/diy-form.vue
@@ -308,7 +308,7 @@ export default {
success: function(res) {
if (res.code === 0) {
uni.showToast({
- title: '提交成功',
+ title: self.$lang('common.submitSuccess'),
icon: 'success'
});
// 重置表单
@@ -317,7 +317,7 @@ export default {
}
} else {
uni.showToast({
- title: res.message || '提交失败',
+ title: res.message || self.$lang('submitFail'),
icon: 'none'
});
}
diff --git a/components/ns-goods-recommend/ns-goods-recommend.vue b/components/ns-goods-recommend/ns-goods-recommend.vue
index 88223eb..a1af059 100644
--- a/components/ns-goods-recommend/ns-goods-recommend.vue
+++ b/components/ns-goods-recommend/ns-goods-recommend.vue
@@ -10,14 +10,14 @@
return {
list: [],
config: {
- title: '猜你喜欢',
+ title: '',
sources: 'sort',
supportPage: [],
goodsIds: [],
fontWeight: false,
padding: 0,
cartEvent: 'detail',
- text: '购买',
+ text: '',
textColor: '#FFFFFF',
theme: 'default',
aroundRadius: 25,
@@ -67,10 +67,13 @@
}
},
mounted() {
- if (this.auto) {
- this.getLikeList();
- }
- },
+ // 初始化 i18n 默认文案,实际展示以服务端配置 config.title / config.text 为准
+ if (!this.config.title) this.config.title = this.$lang('common.goodsRecommendTitle');
+ if (!this.config.text) this.config.text = this.$lang('common.buyNow');
+ if (this.auto) {
+ this.getLikeList();
+ }
+ },
methods: {
init() {
this.list = [];
diff --git a/components/ns-payment/ns-payment.vue b/components/ns-payment/ns-payment.vue
index 2766da8..c5f99a5 100644
--- a/components/ns-payment/ns-payment.vue
+++ b/components/ns-payment/ns-payment.vue
@@ -70,37 +70,11 @@ export default {
return {
isIphoneX: false,
payIndex: 0,
- // #ifdef H5
- payTypeList: [{
- name: this.$lang('components.nsPayment.alipay'),
- icon: 'icon-zhifubaozhifu-',
- type: 'alipay'
- },
- {
- name: this.$lang('components.nsPayment.wechatpay'),
- icon: 'icon-weixin1',
- type: 'wechatpay'
- }
- ],
+ payTypeList: [],
timer: null,
- // #endif
// #ifdef MP-WEIXIN
- payTypeList: [{
- name: this.$lang('components.nsPayment.wechatpay'),
- provider: 'wxpay',
- icon: 'icon-weixin1',
- type: 'wechatpay'
- }],
isMatched: 0, // 支付是否需要校验
// #endif
- // #ifdef MP-ALIPAY
- payTypeList: [{
- name: this.$lang('components.nsPayment.alipay'),
- icon: 'icon-zhifubaozhifu-',
- type: 'alipay',
- provider: 'alipay'
- }],
- // #endif
payInfo: {},
balanceConfig: 0,
// 预售页面判断
@@ -108,6 +82,23 @@ export default {
};
},
created(e) {
+ // #ifdef H5
+ this.payTypeList = [
+ { name: this.$lang('components.nsPayment.alipay'), icon: 'icon-zhifubaozhifu-', type: 'alipay' },
+ { name: this.$lang('components.nsPayment.wechatpay'), icon: 'icon-weixin1', type: 'wechatpay' },
+ ];
+ // #endif
+ // #ifdef MP-WEIXIN
+ this.payTypeList = [
+ { name: this.$lang('components.nsPayment.wechatpay'), provider: 'wxpay', icon: 'icon-weixin1', type: 'wechatpay' },
+ ];
+ // #endif
+ // #ifdef MP-ALIPAY
+ this.payTypeList = [
+ { name: this.$lang('components.nsPayment.alipay'), icon: 'icon-zhifubaozhifu-', type: 'alipay', provider: 'alipay' },
+ ];
+ // #endif
+
let url;
// #ifdef H5
url = window.location.href
diff --git a/lang-bundle.json b/lang-bundle.json
index 5d0f71e..5348c22 100644
--- a/lang-bundle.json
+++ b/lang-bundle.json
@@ -2,7 +2,7 @@
"code": 0,
"message": "操作成功",
"data": {
- "version": "1784767380",
+ "version": "1784770218",
"lang": "zh-cn",
"app_type": "h5",
"source": "merged",
@@ -464,6 +464,7 @@
},
"diy": {
"networkErrorTitle": "提示",
+ "networkError": "网络异常,请稍后重试",
"retry": "重试",
"noDiyData": "未配置自定义页面数据",
"locationNotAvailable": "未获取到定位",
@@ -506,7 +507,8 @@
"lowVersion": "当前微信基础库版本过低,需要 2.19.2 或以上版本",
"notSupported": "当前环境不支持微信视频号",
"missingFields": "缺少必要字段: {field}",
- "playFailed": "微信视频播放失败!"
+ "playFailed": "微信视频播放失败!",
+ "wechatMpOnly": "视频号仅支持在微信小程序环境中播放"
},
"uniappUtils": {
"errorTip": "错误提示",
@@ -607,6 +609,12 @@
"addToCartFailMax": "已达到最大购买数量",
"addToCartFailMin": "已达到最小购买数量",
"addToCartFailStock": "库存不足",
+ "submitSuccess": "提交成功",
+ "submitFail": "提交失败",
+ "versionInfo": "版本信息",
+ "commitId": "提交 ID",
+ "buildTime": "构建时间",
+ "loading": "加载中...",
"consult": "立即咨询",
"consultSuccess": "咨询成功",
"consultFail": "咨询失败",
@@ -662,7 +670,8 @@
"title": "支付方式",
"paymentAmount": "支付金额",
"confirmPayment": "确认支付",
- "seeOrder": "查看订单"
+ "seeOrder": "查看订单",
+ "payInfoNotFound": "未获取到支付信息!"
},
"cashier": {
"title": "收银台",
@@ -2403,6 +2412,7 @@
"fullGiftItem": "满{limit}{unit}{gift}",
"freeShippingItem": "满{limit}{unit}包邮",
"productMessage": "商品留言",
+ "formEmptyTip": "暂无需填写的留言字段",
"aiCustomerService": "智能客服",
"dialOnMobile": "可在手机端拨打{phone}",
"cancel": "取消",
@@ -3469,5 +3479,5 @@
},
"sign": ""
},
- "timestamp": 1784767380
+ "timestamp": 1784770218
}
\ No newline at end of file
diff --git a/main.js b/main.js
index 58a9909..af70ac6 100644
--- a/main.js
+++ b/main.js
@@ -80,10 +80,18 @@ Vue.mixin(MpShareDefault);
// lang.js 在翻译覆写更新时 commit('setComponentRefresh'),
// golbalConfig.js 已把 componentRefresh 注册为全局 computed,
// 在此 watch 它并 $forceUpdate,触发所有页面内 {{$lang('xxx')}} 重新求值
+// 同时调用 lang.refresh() 让当前页面的 navigationBarTitleText 跟随语种变化
+// (pages.json 里的硬编码中文标题需要被 $lang('title') 覆盖)
Vue.mixin({
watch: {
componentRefresh() {
this.$forceUpdate();
+ try {
+ if (this.$langConfig && typeof this.$langConfig.refresh === 'function') {
+ // emit=false: lang.js 已 emit 过,这里避免重复 store.commit
+ this.$langConfig.refresh(false);
+ }
+ } catch (e) { /* 容错:refresh 失败不影响主流程 */ }
}
}
});
diff --git a/pages/index/public/js/index.js b/pages/index/public/js/index.js
index 617a4cc..b95b88b 100644
--- a/pages/index/public/js/index.js
+++ b/pages/index/public/js/index.js
@@ -160,10 +160,10 @@ export default {
} catch (e) {}
if (v && v.commitId) {
uni.showModal({
- title: '版本信息',
- content: `提交 ID: ${v.commitId}\n构建时间: ${v.buildTime}\n${Config.baseUrl}`,
- showCancel: false
- });
+ title: this.$lang('versionInfo'),
+ content: `${this.$lang('commitId')}: ${v.commitId}\n${this.$lang('buildTime')}: ${v.buildTime}\n${Config.baseUrl}`,
+ showCancel: false
+ });
} else {
console.error('未获取到构建版本信息');
}
diff --git a/pages_goods/public/js/list.js b/pages_goods/public/js/list.js
index de492f4..822f3d8 100644
--- a/pages_goods/public/js/list.js
+++ b/pages_goods/public/js/list.js
@@ -37,7 +37,7 @@ export default {
fontWeight: false,
padding: 0,
cartEvent: "detail",
- text: "购买",
+ text: "",
textColor: "#FFFFFF",
theme: "default",
aroundRadius: 25,
@@ -67,7 +67,7 @@ export default {
},
onLoad(options) {
- this.config.text = this.$lang('goods.list.buyText');
+ this.config.text = this.$lang('goods.list.buyText') || this.$lang('common.buyNow');
this.$api.sendRequest({
url: '/api/lucky/status',
diff --git a/pages_promotion/merch/public/js/list.js b/pages_promotion/merch/public/js/list.js
index 63cc42e..3762013 100644
--- a/pages_promotion/merch/public/js/list.js
+++ b/pages_promotion/merch/public/js/list.js
@@ -39,7 +39,7 @@ export default {
fontWeight: false,
padding: 0,
cartEvent: "detail",
- text: this.$lang('merch.list.buyText'),
+ text: '',
textColor: "#FFFFFF",
theme: "default",
aroundRadius: 25,
@@ -66,6 +66,7 @@ export default {
},
onLoad(options) {
+ this.config.text = this.$lang('merch.list.buyText');
this.categoryId = options.category_id || 0;
this.keyword = options.keyword || '';
this.coupon = options.coupon || 0;
diff --git a/pages_tool/ai-chat/ai-chat-message.vue b/pages_tool/ai-chat/ai-chat-message.vue
index 1860d2b..e99d343 100644
--- a/pages_tool/ai-chat/ai-chat-message.vue
+++ b/pages_tool/ai-chat/ai-chat-message.vue
@@ -397,7 +397,7 @@ export default {
scrollTop: 0,
scrollIntoViewId: null,
hasMoreHistory: false,
- loadingText: this.$lang('ai-chat.index.loadMoreHistory'),
+ loadingText: '',
voiceInputing: false,
audioContext: null,
currentAudio: null,
@@ -417,7 +417,7 @@ export default {
localUserAvatar: '',
showAvatarSelector: false, // 头像选择弹窗控制
localUserNickname: '', // 当前用户昵称
- defaultNickname: this.$lang('ai-chat.index.defaultNickname'), // 默认昵称
+ defaultNickname: '', // 默认昵称
showNicknameEditor: false, // 昵称编辑弹窗控制
// AI头像错误状态
avatarError: false,
@@ -493,6 +493,9 @@ export default {
created() {
this.messages = [...this.initialMessages]
this.messageId = this.messages.length
+ // 初始化 i18n 字段(在 created 中同步赋值,避免 remote-only 首屏 data() 缓存空串)
+ this.loadingText = this.$lang('ai-chat.index.loadMoreHistory')
+ this.defaultNickname = this.$lang('ai-chat.index.defaultNickname')
this.initAudioContext()
// 初始化用户头像(缓存优先)
this.initUserAvatarData()
diff --git a/pages_tool/help/list.vue b/pages_tool/help/list.vue
index 1974570..eddf64b 100644
--- a/pages_tool/help/list.vue
+++ b/pages_tool/help/list.vue
@@ -79,7 +79,7 @@ export default {
setPublicShare() {
let shareUrl = this.$config.h5Domain + '/pages_tool/help/list';
this.$util.setPublicShare({
- title: '帮助中心',
+ title: this.$lang('help.list.title'),
desc: '',
link: shareUrl,
imgUrl: this.siteInfo ? this.$util.img(this.siteInfo.logo_square) : ''
diff --git a/pages_tool/notice/list.vue b/pages_tool/notice/list.vue
index b1debc6..252a19d 100644
--- a/pages_tool/notice/list.vue
+++ b/pages_tool/notice/list.vue
@@ -77,7 +77,7 @@ export default {
setPublicShare() {
let shareUrl = this.$config.h5Domain + '/pages_tool/notice/list';
this.$util.setPublicShare({
- title: '公告',
+ title: this.$lang('notice.list.title'),
desc: '',
link: shareUrl,
imgUrl: this.siteInfo ? this.$util.img(this.siteInfo.logo_square) : ''
@@ -85,7 +85,7 @@ export default {
}
},
onShareAppMessage(res) {
- var title = '公告';
+ var title = this.$lang('notice.list.title');
var path = '/pages_tool/notice/list';
return {
title: title,
diff --git a/pages_tool/pay/index.vue b/pages_tool/pay/index.vue
index 209d802..7394cab 100644
--- a/pages_tool/pay/index.vue
+++ b/pages_tool/pay/index.vue
@@ -51,7 +51,7 @@ export default {
if (this.$refs.loadingCover) this.$refs.loadingCover.hide();
} else {
this.$util.showToast({
- title: '未获取到支付信息!'
+ title: this.$lang('pay.index.payInfoNotFound')
});
setTimeout(() => {
this.$util.redirectTo(this.$util.INDEX_PAGE_URL);
diff --git a/scripts/check-title-keys.js b/scripts/check-title-keys.js
new file mode 100644
index 0000000..e061d07
--- /dev/null
+++ b/scripts/check-title-keys.js
@@ -0,0 +1,58 @@
+// 检查 20 个硬编码导航标题的页面,其语言包是否都有 title key
+const paths = [
+ ['pages_goods/category','商品分类'],
+ ['pages_goods/cart','购物车'],
+ ['pages_goods/detail','商品详情'],
+ ['pages_goods/list','商品列表'],
+ ['pages_promotion/merch/merchcategory','入驻商户'],
+ ['pages_promotion/merch/detail','商户首页'],
+ ['pages_promotion/fenxiao/ranking_list','排行榜'],
+ ['pages_promotion/fenxiao/child_fenxiao','分销商'],
+ ['pages_tool/ai-chat/index','AI智能客服'],
+ ['pages_tool/contact/contact','电子名片'],
+ ['pages_tool/member/info','个人资料'],
+ ['pages_tool/order/activist','退款'],
+ ['pages_tool/login/login','登录'],
+ ['pages_tool/weapp/order_shipping','小程序发货'],
+ ['pages_tool/seal/structure','结构选型'],
+ ['pages_tool/seal/medium/search','介质材料搜索'],
+ ['pages_tool/seal/medium/detail','搜索结果'],
+ ['pages_tool/cases/index','案例展示'],
+ ['pages_tool/files/list','查看文件'],
+ ['pages_tool/file-preview/file-preview','文件预览'],
+];
+
+function toLang(p) {
+ const parts = p.split('/');
+ if (parts[0] === 'pages_tool') return parts.slice(1).join('/');
+ if (parts[0] === 'pages_goods') return 'goods/' + parts.slice(1).join('/');
+ if (parts[0] === 'pages_member') return 'member/' + parts.slice(1).join('/');
+ if (parts[0] === 'pages_order') return 'order/' + parts.slice(1).join('/');
+ if (parts[0] === 'pages_promotion') {
+ if (['point','fenxiao','merch'].includes(parts[1])) return parts.slice(1).join('/');
+ return parts.slice(1).join('/');
+ }
+ return p;
+}
+
+const fs = require('fs');
+const path = require('path');
+
+for (const [p, hardcoded] of paths) {
+ const lp = toLang(p);
+ for (const loc of ['zh-cn','en-us']) {
+ const fp = path.join('lang', loc, lp + '.js');
+ if (!fs.existsSync(fp)) {
+ console.log(`MISSING ${loc}/${lp}`);
+ continue;
+ }
+ try {
+ const m = require(path.resolve(fp)).lang;
+ const title = m && m.title;
+ const status = title === undefined ? 'NO title' : (title === hardcoded ? 'ZH-only?' : 'OK');
+ console.log(`${loc}/${lp}.title = ${JSON.stringify(title)} [${status}]`);
+ } catch (e) {
+ console.log(`ERR ${loc}/${lp}: ${e.message}`);
+ }
+ }
+}
\ No newline at end of file
diff --git a/scripts/hardcoded_cn_real.json b/scripts/hardcoded_cn_real.json
new file mode 100644
index 0000000..a8f71ca
--- /dev/null
+++ b/scripts/hardcoded_cn_real.json
@@ -0,0 +1,264 @@
+{
+ "uni_modules/uni-calendar/components/uni-calendar/uni-calendar.vue": [
+ {
+ "kind": "template",
+ "tag": "text",
+ "text": "取消",
+ "line": 6
+ },
+ {
+ "kind": "template",
+ "tag": "text",
+ "text": "确定",
+ "line": 7
+ },
+ {
+ "kind": "template",
+ "tag": "text",
+ "text": "{{ (nowDate.year || '') + '年' + (nowDate.month || '') + '月' }}",
+ "line": 15
+ },
+ {
+ "kind": "template",
+ "tag": "text",
+ "text": "日",
+ "line": 27
+ },
+ {
+ "kind": "template",
+ "tag": "text",
+ "text": "一",
+ "line": 28
+ },
+ {
+ "kind": "template",
+ "tag": "text",
+ "text": "二",
+ "line": 29
+ },
+ {
+ "kind": "template",
+ "tag": "text",
+ "text": "三",
+ "line": 30
+ },
+ {
+ "kind": "template",
+ "tag": "text",
+ "text": "四",
+ "line": 31
+ },
+ {
+ "kind": "template",
+ "tag": "text",
+ "text": "五",
+ "line": 32
+ },
+ {
+ "kind": "template",
+ "tag": "text",
+ "text": "六",
+ "line": 33
+ }
+ ],
+ "pages_promotion/fenxiao/withdraw_list.vue": [
+ {
+ "kind": "js-text",
+ "match": "已转账",
+ "line": 45
+ },
+ {
+ "kind": "js-text",
+ "match": "待审核",
+ "line": 49
+ },
+ {
+ "kind": "js-text",
+ "match": "已审核",
+ "line": 53
+ },
+ {
+ "kind": "js-text",
+ "match": "已拒绝",
+ "line": 57
+ }
+ ],
+ "uni_modules/mp-html/components/mp-html/node/node.vue": [
+ {
+ "kind": "js-text",
+ "match": "uni.showActionSheet({\n itemList: ['保存图片'],\n success: () => {\n const save = path => {\n uni.saveImageToPhotosAlbum({\n ",
+ "line": 289
+ },
+ {
+ "kind": "js-text",
+ "match": "uni.showToast({\n title: '链接已复制'\n })",
+ "line": 368
+ },
+ {
+ "kind": "js-text",
+ "match": "保存成功",
+ "line": 297
+ },
+ {
+ "kind": "js-text",
+ "match": "链接已复制",
+ "line": 369
+ }
+ ],
+ "components-diy/diy-form.vue": [
+ {
+ "kind": "js-text",
+ "match": "uni.showToast({\n\t\t\t\t\t\t\ttitle: '提交成功',\n\t\t\t\t\t\t\ticon: 'success'\n\t\t\t\t\t\t})",
+ "line": 305
+ },
+ {
+ "kind": "js-text",
+ "match": "uni.showToast({\n\t\t\t\t\t\t\ttitle: res.message || '提交失败',\n\t\t\t\t\t\t\ticon: 'none'\n\t\t\t\t\t\t})",
+ "line": 314
+ },
+ {
+ "kind": "js-text",
+ "match": "提交成功",
+ "line": 306
+ }
+ ],
+ "uni_modules/uni-count-down/components/uni-count-down/uni-count-down.vue": [
+ {
+ "kind": "template",
+ "tag": "view",
+ "text": "{{ showColon ? ':' : '时' }}",
+ "line": 19
+ },
+ {
+ "kind": "template",
+ "tag": "view",
+ "text": "{{ showColon ? ':' : '分' }}",
+ "line": 27
+ },
+ {
+ "kind": "template",
+ "tag": "view",
+ "text": "秒",
+ "line": 35
+ }
+ ],
+ "components/ns-goods-recommend/ns-goods-recommend.vue": [
+ {
+ "kind": "js-text",
+ "match": "猜你喜欢",
+ "line": 13
+ },
+ {
+ "kind": "js-text",
+ "match": "购买",
+ "line": 20
+ }
+ ],
+ "components-diy/diy-channel-list.vue": [
+ {
+ "kind": "js-text",
+ "match": "uni.showToast({\n\t\t\t\t\t\t\t\ttitle: '视频号仅支持在微信小程序环境中播放',\n\t\t\t\t\t\t\t\ticon: 'none',\n\t\t\t\t\t\t\t\tduration: 2000\n\t\t\t\t\t\t\t})",
+ "line": 207
+ },
+ {
+ "kind": "js-text",
+ "match": "视频号仅支持在微信小程序环境中播放",
+ "line": 208
+ }
+ ],
+ "pages/index/public/js/index.js": [
+ {
+ "kind": "js-text",
+ "match": "uni.showModal({\n\t\t\t\t\ttitle: '版本信息',\n\t\t\t\t\tcontent: `提交 ID: ${v.commitId}\\n构建时间: ${v.buildTime}\\n${Config.baseUrl}`,\n\t\t\t\t\tshowCancel: false\n\t\t\t\t})",
+ "line": 160
+ },
+ {
+ "kind": "js-text",
+ "match": "版本信息",
+ "line": 161
+ }
+ ],
+ "uni_modules/uni-datetime-picker/components/uni-datetime-picker/calendar.vue": [
+ {
+ "kind": "template",
+ "tag": "text",
+ "text": "{{ (nowDate.year||'') + ' 年 ' + ( nowDate.month||'') +' 月'}}",
+ "line": 13
+ },
+ {
+ "kind": "template",
+ "tag": "view",
+ "text": "确认",
+ "line": 87
+ }
+ ],
+ "uni_modules/uni-number-box/components/uni-number-box/uni-number-box.vue": [
+ {
+ "kind": "js-text",
+ "match": "商品库存不足",
+ "line": 131
+ },
+ {
+ "kind": "js-text",
+ "match": "商品最少购买",
+ "line": 135
+ }
+ ],
+ "common/js/mp-share-default.js": [
+ {
+ "kind": "js-text",
+ "match": "小程序分享",
+ "line": 85
+ }
+ ],
+ "common/js/splash-state.js": [
+ {
+ "kind": "js-text",
+ "match": "uni.showLoading({ title: opts.title || '加载中...', mask: false })",
+ "line": 111
+ }
+ ],
+ "pages/index/index.vue": [
+ {
+ "kind": "template",
+ "tag": "text",
+ "text": "{{ diyLoadErrorMsg || '网络异常,请稍后重试' }}",
+ "line": 8
+ }
+ ],
+ "pages_goods/public/js/list.js": [
+ {
+ "kind": "js-text",
+ "match": "购买",
+ "line": 40
+ }
+ ],
+ "pages_tool/help/list.vue": [
+ {
+ "kind": "js-text",
+ "match": "帮助中心",
+ "line": 82
+ }
+ ],
+ "pages_tool/notice/list.vue": [
+ {
+ "kind": "js-text",
+ "match": "公告",
+ "line": 80
+ }
+ ],
+ "pages_tool/pay/index.vue": [
+ {
+ "kind": "js-text",
+ "match": "未获取到支付信息!",
+ "line": 54
+ }
+ ],
+ "uni_modules/uni-datetime-picker/components/uni-datetime-picker/time-picker.vue": [
+ {
+ "kind": "js-text",
+ "match": "日期和时间",
+ "line": 112
+ }
+ ]
+}
\ No newline at end of file
diff --git a/scripts/hardcoded_cn_scan.json b/scripts/hardcoded_cn_scan.json
new file mode 100644
index 0000000..8d5af12
--- /dev/null
+++ b/scripts/hardcoded_cn_scan.json
@@ -0,0 +1,7804 @@
+{
+ "pages_tool\\ai-chat\\ai-chat-message.vue": [
+ [
+ 3,
+ ""
+ ],
+ [
+ 14,
+ ""
+ ],
+ [
+ 24,
+ ""
+ ],
+ [
+ 29,
+ ""
+ ],
+ [
+ 37,
+ ""
+ ],
+ [
+ 62,
+ ""
+ ],
+ [
+ 65,
+ ""
+ ],
+ [
+ 75,
+ ""
+ ],
+ [
+ 86,
+ ""
+ ],
+ [
+ 91,
+ ""
+ ],
+ [
+ 102,
+ ""
+ ],
+ [
+ 118,
+ ""
+ ],
+ [
+ 145,
+ ""
+ ],
+ [
+ 166,
+ ""
+ ],
+ [
+ 181,
+ ""
+ ],
+ [
+ 200,
+ ""
+ ],
+ [
+ 220,
+ ""
+ ],
+ [
+ 245,
+ ""
+ ],
+ [
+ 250,
+ ""
+ ],
+ [
+ 255,
+ ""
+ ],
+ [
+ 266,
+ ""
+ ],
+ [
+ 275,
+ ""
+ ],
+ [
+ 281,
+ ""
+ ],
+ [
+ 307,
+ ""
+ ],
+ [
+ 310,
+ ""
+ ],
+ [
+ 316,
+ ""
+ ],
+ [
+ 323,
+ ""
+ ],
+ [
+ 615,
+ "console.log('[AI Chat] → 分支1: ID变化,加载历史');"
+ ],
+ [
+ 620,
+ "console.log('[AI Chat] → 分支2: ID不变但只有初始消息,从服务端恢复');"
+ ],
+ [
+ 624,
+ "console.log('[AI Chat] → 分支3: 全新会话');"
+ ],
+ [
+ 627,
+ "console.log('[AI Chat] → 分支4: 跳过加载,保留当前消息, messages.length:', this.messages.length);"
+ ],
+ [
+ 635,
+ "console.log('[AI Chat] 已有会话,跳过欢迎语')"
+ ],
+ [
+ 646,
+ "console.log('[AI Chat] API getServiceConfig 返回:', JSON.stringify(config))"
+ ],
+ [
+ 657,
+ "console.log('[AI Chat] 使用远程欢迎语:', welcomeText.substring(0, 50))"
+ ],
+ [
+ 661,
+ "console.warn('[AI Chat] 获取服务配置失败:', e)"
+ ],
+ [
+ 669,
+ "console.log('[AI Chat] 使用降级欢迎语')"
+ ],
+ [
+ 671,
+ "console.log('[AI Chat] 无可用欢迎语')"
+ ],
+ [
+ 764,
+ "console.log('[AI Chat] loadChatHistoryIfExist 被调用, convId:', convId);"
+ ],
+ [
+ 768,
+ "console.log('[AI Chat] 请求历史 API...');"
+ ],
+ [
+ 772,
+ "console.log('[AI Chat] 历史 API 返回:', JSON.stringify(response).substring(0, 200));"
+ ],
+ [
+ 775,
+ "console.warn('[AI Chat] 历史记录为空或格式无效, success:', response.success, 'messages:', Array.isArray(response.messages));"
+ ],
+ [
+ 778,
+ "console.log('[AI Chat] 原始消息数:', response.messages.length, 'total:', response.total);"
+ ],
+ [
+ 798,
+ "console.log('[AI Chat] 过滤后消息数:', this.messages.length, '内容摘要:', this.messages.map(m => ({role: m.role, content: m.content.substring(0, 30)})));"
+ ],
+ [
+ 804,
+ "console.error('[AI Chat] 加载历史记录失败:', error.message, error.stack);"
+ ],
+ [
+ 881,
+ "console.error('AI服务调用失败:', error)"
+ ],
+ [
+ 1023,
+ "console.error('流式请求失败:', error)"
+ ],
+ [
+ 1079,
+ "console.error('流式请求失败')"
+ ],
+ [
+ 1474,
+ "console.error('加载历史失败:', error);"
+ ],
+ [
+ 1702,
+ "console.log('[AI Chat] 开始复制, 内容长度:', copyText.length, '内容前50字:', copyText.substring(0, 50))"
+ ],
+ [
+ 1706,
+ "console.log('[AI Chat] 复制成功')"
+ ],
+ [
+ 1710,
+ "console.error('[AI Chat] 复制失败, 详细错误:', JSON.stringify(err))"
+ ],
+ [
+ 1711,
+ "console.error('[AI Chat] 复制失败 errMsg:', err.errMsg || err.message || '无错误消息')"
+ ],
+ [
+ 1862,
+ "console.error('AI服务调用失败:', error)"
+ ],
+ [
+ 1968,
+ "'😀': '[开心]',"
+ ],
+ [
+ 1969,
+ "'😂': '[大笑]',"
+ ],
+ [
+ 1970,
+ "'😊': '[微笑]',"
+ ],
+ [
+ 1971,
+ "'❤️': '[爱心]',"
+ ],
+ [
+ 1972,
+ "'👍': '[点赞]',"
+ ],
+ [
+ 1973,
+ "'😭': '[哭泣]',"
+ ],
+ [
+ 1974,
+ "'🙏': '[感谢/拜托]',"
+ ],
+ [
+ 1975,
+ "'😍': '[喜欢]',"
+ ],
+ [
+ 1976,
+ "'🎉': '[庆祝]',"
+ ],
+ [
+ 1977,
+ "'🤔': '[思考]',"
+ ],
+ [
+ 1978,
+ "'😅': '[尴尬]',"
+ ],
+ [
+ 1979,
+ "'😁': '[开心]',"
+ ],
+ [
+ 1980,
+ "'🥰': '[喜爱]',"
+ ],
+ [
+ 1981,
+ "'😘': '[飞吻]',"
+ ],
+ [
+ 1982,
+ "'😏': '[坏笑]',"
+ ],
+ [
+ 1983,
+ "'🥳': '[庆祝]',"
+ ],
+ [
+ 1984,
+ "'😔': '[难过]',"
+ ],
+ [
+ 1985,
+ "'😢': '[哭泣]',"
+ ],
+ [
+ 1986,
+ "'😤': '[生气]',"
+ ],
+ [
+ 1987,
+ "'😴': '[困]',"
+ ],
+ [
+ 1988,
+ "'🤗': '[拥抱]',"
+ ],
+ [
+ 1989,
+ "'🙂': '[微笑]',"
+ ],
+ [
+ 1990,
+ "'😃': '[开心]',"
+ ],
+ [
+ 1991,
+ "'😄': '[大笑]',"
+ ],
+ [
+ 1992,
+ "'😆': '[开心]',"
+ ],
+ [
+ 1993,
+ "'😇': '[天使]',"
+ ],
+ [
+ 1994,
+ "'🤩': '[惊喜]',"
+ ],
+ [
+ 1995,
+ "'😋': '[好吃]',"
+ ],
+ [
+ 1996,
+ "'😛': '[调皮]',"
+ ],
+ [
+ 1997,
+ "'😜': '[调皮]',"
+ ],
+ [
+ 1998,
+ "'🤪': '[搞怪]',"
+ ],
+ [
+ 1999,
+ "'😝': '[开心]',"
+ ],
+ [
+ 2000,
+ "'🤑': '[发财]',"
+ ],
+ [
+ 2001,
+ "'🤭': '[害羞]',"
+ ],
+ [
+ 2002,
+ "'🤫': '[嘘]',"
+ ],
+ [
+ 2003,
+ "'🤐': '[闭嘴]',"
+ ],
+ [
+ 2004,
+ "'🤨': '[疑惑]',"
+ ],
+ [
+ 2005,
+ "'😐': '[无语]',"
+ ],
+ [
+ 2006,
+ "'😑': '[无语]',"
+ ],
+ [
+ 2007,
+ "'😶': '[沉默]',"
+ ],
+ [
+ 2008,
+ "'😒': '[不屑]',"
+ ],
+ [
+ 2009,
+ "'🙄': '[白眼]',"
+ ],
+ [
+ 2010,
+ "'😬': '[尴尬]',"
+ ],
+ [
+ 2011,
+ "'🤥': '[说谎]',"
+ ],
+ [
+ 2012,
+ "'😌': '[安心]',"
+ ],
+ [
+ 2013,
+ "'😪': '[困]',"
+ ],
+ [
+ 2014,
+ "'🤤': '[流口水]',"
+ ],
+ [
+ 2015,
+ "'😷': '[生病]',"
+ ],
+ [
+ 2016,
+ "'🤒': '[发烧]',"
+ ],
+ [
+ 2017,
+ "'🤕': '[受伤]',"
+ ],
+ [
+ 2018,
+ "'🤢': '[恶心]',"
+ ],
+ [
+ 2019,
+ "'🤮': '[呕吐]',"
+ ],
+ [
+ 2020,
+ "'🤧': '[感冒]',"
+ ],
+ [
+ 2021,
+ "'🥵': '[热]',"
+ ],
+ [
+ 2022,
+ "'🥶': '[冷]',"
+ ],
+ [
+ 2023,
+ "'🥴': '[头晕]',"
+ ],
+ [
+ 2024,
+ "'😵': '[晕]',"
+ ],
+ [
+ 2025,
+ "'🤯': '[爆炸]',"
+ ],
+ [
+ 2026,
+ "'🤠': '[酷]',"
+ ],
+ [
+ 2027,
+ "'😎': '[酷]',"
+ ],
+ [
+ 2028,
+ "'🤓': '[书呆子]',"
+ ],
+ [
+ 2029,
+ "'🧐': '[疑惑]',"
+ ],
+ [
+ 2030,
+ "'😕': '[困惑]',"
+ ],
+ [
+ 2031,
+ "'😟': '[担心]',"
+ ],
+ [
+ 2032,
+ "'🙁': '[难过]',"
+ ],
+ [
+ 2033,
+ "'😮': '[惊讶]',"
+ ],
+ [
+ 2034,
+ "'😯': '[惊讶]',"
+ ],
+ [
+ 2035,
+ "'😲': '[震惊]',"
+ ],
+ [
+ 2036,
+ "'😳': '[脸红]',"
+ ],
+ [
+ 2037,
+ "'🥺': '[恳求]',"
+ ],
+ [
+ 2038,
+ "'😦': '[惊讶]',"
+ ],
+ [
+ 2039,
+ "'😧': '[惊讶]',"
+ ],
+ [
+ 2040,
+ "'😨': '[害怕]',"
+ ],
+ [
+ 2041,
+ "'😰': '[紧张]',"
+ ],
+ [
+ 2042,
+ "'😥': '[失望]',"
+ ],
+ [
+ 2043,
+ "'😱': '[恐惧]',"
+ ],
+ [
+ 2044,
+ "'😖': '[困扰]',"
+ ],
+ [
+ 2045,
+ "'😣': '[痛苦]',"
+ ],
+ [
+ 2046,
+ "'😞': '[难过]',"
+ ],
+ [
+ 2047,
+ "'😓': '[汗]',"
+ ],
+ [
+ 2048,
+ "'😩': '[累]',"
+ ],
+ [
+ 2049,
+ "'😫': '[累]',"
+ ],
+ [
+ 2050,
+ "'🥱': '[困]',"
+ ],
+ [
+ 2051,
+ "'😡': '[愤怒]',"
+ ],
+ [
+ 2052,
+ "'😠': '[生气]',"
+ ],
+ [
+ 2053,
+ "'🤬': '[咒骂]',"
+ ],
+ [
+ 2054,
+ "'😈': '[恶魔]',"
+ ],
+ [
+ 2055,
+ "'👿': '[生气]',"
+ ],
+ [
+ 2056,
+ "'💀': '[骷髅]',"
+ ],
+ [
+ 2057,
+ "'💩': '[便便]',"
+ ],
+ [
+ 2058,
+ "'👻': '[鬼]',"
+ ],
+ [
+ 2059,
+ "'👽': '[外星人]',"
+ ],
+ [
+ 2060,
+ "'🤖': '[机器人]',"
+ ],
+ [
+ 2061,
+ "'🎃': '[万圣节]',"
+ ],
+ [
+ 2062,
+ "'😺': '[开心猫]',"
+ ],
+ [
+ 2063,
+ "'😸': '[微笑猫]',"
+ ],
+ [
+ 2064,
+ "'😹': '[大笑猫]',"
+ ],
+ [
+ 2065,
+ "'😻': '[花痴猫]',"
+ ],
+ [
+ 2066,
+ "'😼': '[得意猫]',"
+ ],
+ [
+ 2067,
+ "'😽': '[亲亲猫]',"
+ ],
+ [
+ 2068,
+ "'🙀': '[惊讶猫]',"
+ ],
+ [
+ 2069,
+ "'😿': '[哭泣猫]',"
+ ],
+ [
+ 2070,
+ "'😾': '[生气猫]',"
+ ],
+ [
+ 2071,
+ "'👋': '[挥手]',"
+ ],
+ [
+ 2072,
+ "'🤚': '[举手]',"
+ ],
+ [
+ 2073,
+ "'🖐': '[手掌]',"
+ ],
+ [
+ 2074,
+ "'✋': '[手掌]',"
+ ],
+ [
+ 2077,
+ "'🤏': '[捏]',"
+ ],
+ [
+ 2078,
+ "'✌️': '[耶]',"
+ ],
+ [
+ 2079,
+ "'🤞': '[好运]',"
+ ],
+ [
+ 2080,
+ "'🤟': '[爱你]',"
+ ],
+ [
+ 2081,
+ "'🤘': '[摇滚]',"
+ ],
+ [
+ 2082,
+ "'🤙': '[打电话]',"
+ ],
+ [
+ 2083,
+ "'👈': '[左边]',"
+ ],
+ [
+ 2084,
+ "'👉': '[右边]',"
+ ],
+ [
+ 2085,
+ "'👆': '[上边]',"
+ ],
+ [
+ 2086,
+ "'🖕': '[竖中指]',"
+ ],
+ [
+ 2087,
+ "'👇': '[下边]',"
+ ],
+ [
+ 2088,
+ "'☝': '[向上]',"
+ ],
+ [
+ 2089,
+ "'👎': '[鄙视]',"
+ ],
+ [
+ 2090,
+ "'✊': '[拳头]',"
+ ],
+ [
+ 2091,
+ "'👊': '[拳头]',"
+ ],
+ [
+ 2092,
+ "'🤛': '[左拳]',"
+ ],
+ [
+ 2093,
+ "'🤜': '[右拳]',"
+ ],
+ [
+ 2094,
+ "'👏': '[鼓掌]',"
+ ],
+ [
+ 2095,
+ "'🙌': '[举手庆祝]',"
+ ],
+ [
+ 2096,
+ "'👐': '[张开手]',"
+ ],
+ [
+ 2097,
+ "'🤲': '[摊手]',"
+ ],
+ [
+ 2098,
+ "'🤝': '[握手]',"
+ ],
+ [
+ 2099,
+ "'✍️': '[写字]',"
+ ],
+ [
+ 2100,
+ "'💅': '[美甲]',"
+ ],
+ [
+ 2101,
+ "'🤳': '[自拍]',"
+ ],
+ [
+ 2102,
+ "'💪': '[肌肉]',"
+ ],
+ [
+ 2103,
+ "'💗': '[爱心]',"
+ ],
+ [
+ 2104,
+ "'💓': '[心跳]',"
+ ],
+ [
+ 2105,
+ "'💕': '[两颗心]',"
+ ],
+ [
+ 2106,
+ "'💖': '[闪亮心]',"
+ ],
+ [
+ 2107,
+ "'💝': '[礼物心]',"
+ ],
+ [
+ 2108,
+ "'💞': '[旋转心]',"
+ ],
+ [
+ 2109,
+ "'💘': '[丘比特]',"
+ ],
+ [
+ 2110,
+ "'💌': '[情书]',"
+ ],
+ [
+ 2111,
+ "'💟': '[心形]',"
+ ],
+ [
+ 2112,
+ "'💛': '[黄心]',"
+ ],
+ [
+ 2113,
+ "'💙': '[蓝心]',"
+ ],
+ [
+ 2114,
+ "'💜': '[紫心]',"
+ ],
+ [
+ 2115,
+ "'🖤': '[黑心]',"
+ ],
+ [
+ 2116,
+ "'💔': '[心碎]',"
+ ],
+ [
+ 2117,
+ "'💢': '[愤怒]',"
+ ],
+ [
+ 2118,
+ "'💣': '[炸弹]',"
+ ],
+ [
+ 2119,
+ "'💥': '[爆炸]',"
+ ],
+ [
+ 2120,
+ "'💫': '[头晕]',"
+ ],
+ [
+ 2121,
+ "'💦': '[汗]',"
+ ],
+ [
+ 2122,
+ "'💨': '[风]',"
+ ],
+ [
+ 2123,
+ "'👁️': '[眼睛]',"
+ ],
+ [
+ 2124,
+ "'👀': '[看]',"
+ ],
+ [
+ 2125,
+ "'👅': '[舌头]',"
+ ],
+ [
+ 2126,
+ "'👄': '[嘴巴]',"
+ ],
+ [
+ 2127,
+ "'👂': '[耳朵]',"
+ ],
+ [
+ 2128,
+ "'👃': '[鼻子]'"
+ ]
+ ],
+ "tests\\tabbar-highlight.test.js": [
+ [
+ 104,
+ "{ id: 1, text: '首页', url: HOME },"
+ ],
+ [
+ 105,
+ "{ id: 2, text: '分类', url: CATEGORY },"
+ ],
+ [
+ 106,
+ "{ id: 3, text: '购物车', url: CART },"
+ ],
+ [
+ 107,
+ "{ id: 4, text: '商户', url: MERCHANT },"
+ ],
+ [
+ 108,
+ "{ id: 5, text: '我的', url: MEMBER },"
+ ],
+ [
+ 166,
+ "`[${label}] 期望 ${expected || '不点亮'}, 实际 ${actual || '不点亮'}`);"
+ ],
+ [
+ 174,
+ "test('场景 1.1: 用户从首页点 diy 链接 → 首页保持高亮', () => {"
+ ],
+ [
+ 181,
+ "test('场景 1.2: 用户从分类点 diy 链接 → 分类高亮', () => {"
+ ],
+ [
+ 188,
+ "test('场景 1.3: 用户从商户 tab 进 diy 微页面 → 商户高亮', () => {"
+ ],
+ [
+ 195,
+ "test('场景 1.4: 深层导航, 跳过非 tab 中间页', () => {"
+ ],
+ [
+ 204,
+ "test('场景 1.5: 经过 login 弹窗后, 仍记为来自原 tab', () => {"
+ ],
+ [
+ 218,
+ "test('场景 2.1: /pages_goods/list → /pages_goods/detail 属于分类频道', () => {"
+ ],
+ [
+ 225,
+ "test('场景 2.2: /pages_tool/member/coupon → /pages_tool/member/info 属于\"我的\"', () => {"
+ ],
+ [
+ 232,
+ "test('场景 2.3: 在\"我的\"频道内多页浏览, 高亮始终是\"我的\"', () => {"
+ ],
+ [
+ 244,
+ "test('场景 3.1: tab→tab 跳转, 目标 tab 高亮 (不受来源干扰)', () => {"
+ ],
+ [
+ 251,
+ "test('场景 3.2: 在 diy 页面点\"我的\" tab → 我的高亮 (同包)', () => {"
+ ],
+ [
+ 261,
+ "test('场景 3.3: 在 diy 页面点\"首页\" tab → 首页高亮 (跨包)', () => {"
+ ],
+ [
+ 268,
+ "test('场景 3.4: 链式 tab 切换 home→分类→我的→购物车→首页', () => {"
+ ],
+ [
+ 275,
+ "}), tabs[i], `链式第 ${i + 1} 步: ${tabs[i]}`);"
+ ],
+ [
+ 283,
+ "test('场景 4.1: 首页 → 商品搜索 → 分类高亮 (通配符 /pages_tool/goods"
+ ],
+ [
+ 286,
+ "test('场景 5.1: /pages_tool/files/list 显式绑 null → 不点亮 (业务规则: 文件页不归属任何 tab)', () => {"
+ ],
+ [
+ 290,
+ "}), null, 'home → files/list (null 优先)');"
+ ],
+ [
+ 293,
+ "test('场景 5.2: /pages_tool/index/diy 不在 PAGE_TAB_MAP, 走 history-walk', () => {"
+ ],
+ [
+ 299,
+ "}), HOME, 'diy 走 history-walk, home 高亮');"
+ ],
+ [
+ 302,
+ "test('场景 5.3: diy 没在 PAGE_TAB_MAP 显式声明 (避免硬绑)', () => {"
+ ],
+ [
+ 308,
+ "'diy 不应在 PAGE_TAB_MAP (修复后靠 history-walk 决定)');"
+ ],
+ [
+ 315,
+ "test('场景 6.1: 用户扫码进 diy → 不高亮任何 tab (iOS HIG)', () => {"
+ ],
+ [
+ 320,
+ "}), null, '深链 diy');"
+ ],
+ [
+ 323,
+ "test('场景 6.2: 分享 diy 链接给朋友, 朋友点开 → 不高亮 (无历史)', () => {"
+ ],
+ [
+ 327,
+ "}), null, '深链 diy?id=123');"
+ ],
+ [
+ 330,
+ "test('场景 6.3: 分享商品详情链接, 朋友点开 → 分类高亮 (通配符)', () => {"
+ ],
+ [
+ 336,
+ "}), CATEGORY, '深链 goods/detail');"
+ ],
+ [
+ 339,
+ "test('场景 6.4: 分享会员中心链接, 朋友点开 → 我的高亮 (精确绑)', () => {"
+ ],
+ [
+ 343,
+ "}), MEMBER, '深链 member (精确)');"
+ ],
+ [
+ 346,
+ "test('场景 6.5: 分享 fenxiao 链接, 朋友点开 → 不高亮 (不在任何 map)', () => {"
+ ],
+ [
+ 352,
+ "}), null, '深链 fenxiao');"
+ ],
+ [
+ 360,
+ "test('场景 7.1: 在 home 点登录 → 全屏不点亮 (NO_TAB_PAGES)', () => {"
+ ],
+ [
+ 367,
+ "test('场景 7.2: 支付流程中 → 不点亮 (NO_TAB_PAGES)', () => {"
+ ],
+ [
+ 374,
+ "test('场景 7.3: 登录后回到原页面, 高亮不丢失', () => {"
+ ],
+ [
+ 380,
+ "}), HOME, 'home → login → diy (modal 透明)');"
+ ],
+ [
+ 383,
+ "test('场景 7.4: 支付完成后回到原页面, 高亮跟随当前包', () => {"
+ ],
+ [
+ 391,
+ "}), CATEGORY, 'home → cart → pay → list (modal 透明 + 同包)');"
+ ],
+ [
+ 398,
+ "test('场景 8.1: URL 带 from_tab=home → 强制高亮 home (即使当前在 pages_tool)', () => {"
+ ],
+ [
+ 408,
+ "assert.equal(result, true, 'from_tab=home → HOME 高亮');"
+ ],
+ [
+ 411,
+ "test('场景 8.2: from_tab=member 但 PAGE_TAB_MAP 已显式声明 → PAGE_TAB_MAP 优先', () => {"
+ ],
+ [
+ 422,
+ "assert.equal(result, false, 'PAGE_TAB_MAP 优先于 from_tab');"
+ ],
+ [
+ 425,
+ "test('场景 8.3: 非法 from_tab 值 → 忽略, 走后续链路', () => {"
+ ],
+ [
+ 435,
+ "assert.equal(result, false, '非法 from_tab → 忽略, 无其它信号 → 不亮');"
+ ],
+ [
+ 442,
+ "test('场景 9.1: diy 带 query ?id=123&from=share → 行为不变', () => {"
+ ],
+ [
+ 449,
+ "test('场景 9.2: tab 根带 query 也精确匹配', () => {"
+ ],
+ [
+ 456,
+ "assert.equal(result, HOME, 'home tab 根 + query');"
+ ],
+ [
+ 459,
+ "test('场景 9.3: 老路径 /pages/member/index 自动适配到 /pages_tool/member/index', () => {"
+ ],
+ [
+ 466,
+ "assert.equal(result, MEMBER, '老路径自动 adaptSubpackageUrl');"
+ ],
+ [
+ 473,
+ "test('场景 10.1: 5 个 tab 中, 同时只有 1 个高亮 (互斥)', () => {"
+ ],
+ [
+ 485,
+ "assert.equal(trueCount, 1, `5 个 tab 应只亮 1 个, 实际 ${trueCount} 个亮`);"
+ ],
+ [
+ 488,
+ "test('场景 10.2: 同场景下 (current + history), 高亮结果应一致 (幂等)', () => {"
+ ],
+ [
+ 497,
+ "assert.equal(r1, r2, 'resolveEntryTab 幂等');"
+ ],
+ [
+ 498,
+ "assert.equal(r1, HOME, '且结果应为 home');"
+ ],
+ [
+ 506,
+ "test('场景 11.1: tabBarList 为空 (服务端配置异常) → 任何 tab 都不亮', () => {"
+ ],
+ [
+ 512,
+ "}), null, 'tabBarList 空');"
+ ],
+ [
+ 515,
+ "test('场景 11.2: tabBarList.list 含脏数据 (link 为 null/空) → 不崩', () => {"
+ ],
+ [
+ 520,
+ "{ id: 3, text: '首页', link: { wap_url: HOME } },"
+ ],
+ [
+ 521,
+ "{ id: 4, text: '我的', link: { wap_url: MEMBER } },"
+ ],
+ [
+ 529,
+ "assert.equal(r, HOME, '脏数据不影响查找');"
+ ],
+ [
+ 532,
+ "test('场景 11.3: historyRoutes 含 null/空/无效值 → 安全跳过', () => {"
+ ],
+ [
+ 538,
+ "assert.equal(r, HOME, 'historyRoutes 脏数据 → 跳过');"
+ ],
+ [
+ 541,
+ "test('场景 11.4: historyRoutes 不是数组 → 视为无历史 (iOS HIG)', () => {"
+ ],
+ [
+ 549,
+ "assert.equal(r, null, 'historyRoutes 非数组 → 视为空 → 不点亮');"
+ ],
+ [
+ 552,
+ "test('场景 11.5: 当前页面是 /pages_goods/some-unmapped-page 深链 → 不亮', () => {"
+ ],
+ [
+ 557,
+ "}), null, '深链 unmapped 页');"
+ ],
+ [
+ 564,
+ "test('场景 12.1: 用户在 home → diy → 切到 member → 回 home → 进 diy, 仍归 home', () => {"
+ ],
+ [
+ 577,
+ "}), HOME, 'home → diy → member → 返回 → home → diy');"
+ ],
+ [
+ 580,
+ "test('场景 12.2: 进入 cart tab 后, 旧 packageEntryTab 被新 tab 覆盖', () => {"
+ ],
+ [
+ 587,
+ "}), CART, 'home → diy → 点 cart tab → CART');"
+ ],
+ [
+ 590,
+ "test('场景 12.3: 登出后, 旧 packageEntryTab 保持 (惰性, 下次 updateCurrentRoute 重算)', () => {"
+ ],
+ [
+ 597,
+ "}), HOME, '登出后 diy 高亮仍由 history-walk 决定');"
+ ],
+ [
+ 605,
+ "test('单元 13.1: 当前是 tab 根 → 走 step 1 精确匹配, 不查 history', () => {"
+ ],
+ [
+ 609,
+ "'category 是 tab 根, 不被 history 干扰',"
+ ],
+ [
+ 613,
+ "test('单元 13.2: lookupPageTabMap 精确匹配优先于通配符', () => {"
+ ],
+ [
+ 621,
+ "test('单元 13.3: lookupPageTabMap 通配符命中非精确条目', () => {"
+ ],
+ [
+ 625,
+ "'通配符 /pages_tool/member"
+ ],
+ [
+ 629,
+ "{ label: '深链扫 diy', current: DIY, history: [], expected: null },"
+ ],
+ [
+ 630,
+ "{ label: '首页 → diy 链接', current: DIY, history: [HOME], expected: HOME },"
+ ],
+ [
+ 631,
+ "{ label: '首页 → 会员中心', current: MEMBER, history: [HOME], expected: MEMBER },"
+ ],
+ [
+ 632,
+ "{ label: '分类 → diy 链接', current: DIY, history: [CATEGORY], expected: CATEGORY },"
+ ],
+ [
+ 633,
+ "{ label: '分类 → 商品列表 → diy', current: DIY, history: [CATEGORY, GOODS_LIST], expected: CATEGORY },"
+ ],
+ [
+ 634,
+ "{ label: '我的 → 优惠券 → diy', current: DIY, history: [MEMBER, MEMBER_COUPON], expected: MEMBER },"
+ ],
+ [
+ 635,
+ "{ label: '首页 → 登录页 → diy', current: DIY, history: [HOME, LOGIN], expected: HOME },"
+ ],
+ [
+ 636,
+ "{ label: '深链扫 member/info', current: MEMBER_INFO, history: [], expected: MEMBER },"
+ ],
+ [
+ 639,
+ "test('场景对照: 8 个核心业务场景', () => {"
+ ],
+ [
+ 656,
+ "test('场景 16.1: 在 home page (name=DIY_VIEW_INDEX), 自点 home tab → home 高亮', () => {"
+ ],
+ [
+ 668,
+ "assert.equal(result, true, '在 home 上点 home tab → 高亮');"
+ ],
+ [
+ 671,
+ "test('场景 16.2: 在 home page, 点 cart tab → cart 不亮 (无来源记忆)', () => {"
+ ],
+ [
+ 682,
+ "assert.equal(result, false, '在 home 上点 cart → cart 不该高亮');"
+ ],
+ [
+ 685,
+ "test('场景 16.3: 在 home page, 点 merchant tab → 走 PAGE_TAB_MAP 兜底', () => {"
+ ],
+ [
+ 695,
+ "assert.equal(result, false, 'home → merchant: HOME 优先, merchant 不亮');"
+ ],
+ [
+ 702,
+ "test('场景 17.1: tabBarList 异步加载场景 (文档化行为)', () => {"
+ ],
+ [
+ 712,
+ "assert.equal(r1, null, 'tabBarList 空时, resolveEntryTab 应安全返回 null');"
+ ],
+ [
+ 720,
+ "assert.equal(r2, null, 'tabBarList null 时, resolveEntryTab 应安全返回 null');"
+ ],
+ [
+ 728,
+ "test('场景 18.1: __TABBAR_DEBUG__ 开启时, 决策路径有 console.log', () => {"
+ ],
+ [
+ 750,
+ "assert.ok(logCapture.length > 0, `应至少有一次 console.log, 实际 ${logCapture.length} 次`);"
+ ],
+ [
+ 751,
+ "assert.ok(logCapture.some(l => l.includes('[TABBAR]')), '日志应包含 [TABBAR] 前缀');"
+ ],
+ [
+ 754,
+ "test('场景 18.2: __TABBAR_DEBUG__ 未开启时, 决策路径无 console.log', () => {"
+ ],
+ [
+ 776,
+ "assert.equal(tabbarLogs.length, 0, '__TABBAR_DEBUG__ 关闭时不应有 [TABBAR] 日志');"
+ ],
+ [
+ 779,
+ "test('场景 18.3: opts.debug = true 也能触发调试', () => {"
+ ],
+ [
+ 801,
+ "assert.ok(tabbarLogs.length > 0, 'opts.debug=true 应触发 [TABBAR] 日志');"
+ ],
+ [
+ 808,
+ "test('场景 19.1: 多语言切换时高亮结果不变 (zh → en → ja)', () => {"
+ ],
+ [
+ 816,
+ "assert.equal(initial, HOME, '语言切换前: HOME');"
+ ],
+ [
+ 827,
+ "assert.equal(afterRefresh1, HOME, '第 1 次 re-render: HOME');"
+ ],
+ [
+ 828,
+ "assert.equal(afterRefresh2, HOME, '第 2 次 re-render: HOME');"
+ ],
+ [
+ 829,
+ "assert.equal(initial, afterRefresh1, '高亮幂等');"
+ ],
+ [
+ 830,
+ "assert.equal(afterRefresh1, afterRefresh2, '高亮幂等');"
+ ],
+ [
+ 833,
+ "test('场景 19.2: 语言切换时不同页面的高亮都正确', () => {"
+ ],
+ [
+ 848,
+ "assert.equal(result, sc.expected, `${sc.label} (第 ${i + 1} 次)`);"
+ ],
+ [
+ 857,
+ "test('场景 20.1: 登出后 packageEntryTab 保持 (惰性, 不主动清)', () => {"
+ ],
+ [
+ 863,
+ "assert.equal(before, HOME, '登出前: HOME 高亮');"
+ ],
+ [
+ 877,
+ "'setMemberInfo 函数体不应包含 packageEntryTab (惰性更新)',"
+ ],
+ [
+ 882,
+ "test('场景 20.2: 登出后新导航自然覆盖 packageEntryTab', () => {"
+ ],
+ [
+ 889,
+ "assert.equal(r1, null, '登出后深链 diy → 不点亮 (iOS HIG)');"
+ ],
+ [
+ 896,
+ "assert.equal(r2, HOME, '登出后重新进 diy → HOME (新 history-walk)');"
+ ],
+ [
+ 899,
+ "test('场景 20.3: 登出后登入另一账号, 高亮反映新行为', () => {"
+ ],
+ [
+ 908,
+ "assert.equal(r, HOME, '新账号进 diy → HOME (新 history-walk 决定)');"
+ ],
+ [
+ 915,
+ "test('场景 21.1: 500 步历史栈应在 50ms 内完成 resolveEntryTab', () => {"
+ ],
+ [
+ 932,
+ "assert.equal(result, HOME, '500 步栈应找到 HOME');"
+ ],
+ [
+ 933,
+ "assert.ok(elapsedMs < 50, `应 < 50ms, 实际 ${elapsedMs.toFixed(2)}ms`);"
+ ],
+ [
+ 936,
+ "test('场景 21.2: 1000 步历史栈性能依然可接受', () => {"
+ ],
+ [
+ 951,
+ "assert.ok(elapsedMs < 100, `1000 步应 < 100ms, 实际 ${elapsedMs.toFixed(2)}ms`);"
+ ],
+ [
+ 954,
+ "test('场景 21.3: 1000 次 findHighlightedTab 端到端性能', () => {"
+ ],
+ [
+ 965,
+ "assert.ok(perCall < 1, `每次应 < 1ms, 实际 ${perCall.toFixed(4)}ms`);"
+ ],
+ [
+ 972,
+ "test('场景 22.1: 极长路径名 (200 字符) 仍能正确匹配', () => {"
+ ],
+ [
+ 984,
+ "assert.equal(result, true, '极长路径应被通配符命中');"
+ ],
+ [
+ 987,
+ "test('场景 22.2: URL 编码的 query 参数 (含 %xx) 不影响匹配', () => {"
+ ],
+ [
+ 994,
+ "assert.equal(result, HOME, 'URL 编码 query 不影响 diy 高亮');"
+ ],
+ [
+ 997,
+ "test('场景 22.3: query 含特殊字符 (& =) 不影响路径匹配', () => {"
+ ],
+ [
+ 1003,
+ "assert.equal(result, CATEGORY, '商品详情 (复杂 query) → CATEGORY');"
+ ],
+ [
+ 1006,
+ "test('场景 22.4: 路径含 hash (H5 模式) 不影响匹配', () => {"
+ ],
+ [
+ 1014,
+ "assert.equal(result, HOME, '标准路径 → HOME');"
+ ],
+ [
+ 1017,
+ "test('场景 22.5: 路径前缀相近但不匹配通配符 (members vs member)', () => {"
+ ],
+ [
+ 1029,
+ "assert.equal(result, false, '前缀相近路径不应被错误匹配');"
+ ],
+ [
+ 1036,
+ "test('场景 23.1: tabBarList 从一种配置切到另一种, 高亮应基于新配置', () => {"
+ ],
+ [
+ 1039,
+ "{ id: 1, text: '首页', url: HOME },"
+ ],
+ [
+ 1040,
+ "{ id: 2, text: '我的', url: MEMBER },"
+ ],
+ [
+ 1050,
+ "assert.equal(result, HOME, '新配置下, home → HOME 仍高亮');"
+ ],
+ [
+ 1053,
+ "test('场景 23.2: 切换 tabBarList 后 PAGE_TAB_MAP 仍指向已删除的 tab', () => {"
+ ],
+ [
+ 1057,
+ "{ id: 1, text: '首页', url: HOME },"
+ ],
+ [
+ 1073,
+ "assert.equal(result, false, 'PAGE_TAB_MAP 优先: MEMBER_INFO 不归 HOME (即使 MEMBER 已删除)');"
+ ],
+ [
+ 1086,
+ "assert.equal(result2, false, '没任何信号 → 不点亮');"
+ ],
+ [
+ 1089,
+ "test('场景 23.3: tabBarList 从 null 恢复 (用户等了很久后端才返回)', () => {"
+ ],
+ [
+ 1096,
+ "assert.equal(r1, null, 'tabBarList 空时不点亮');"
+ ],
+ [
+ 1104,
+ "assert.equal(r2, HOME, 'tabBarList 恢复后: HOME');"
+ ]
+ ],
+ "tests\\search-keyword-encoding.test.js": [
+ [
+ 37,
+ "test('_safeEncodeForPlatform: 鸿蒙元服务 → JS 只 encode 分隔符(和 mp-weixin 一致)', () => {"
+ ],
+ [
+ 45,
+ "const r1 = api._safeEncodeForPlatform('沙发');"
+ ],
+ [
+ 46,
+ "assert.equal(r1, '沙发', `mp-harmony 中文应原样,实际: ${r1}`);"
+ ],
+ [
+ 50,
+ "assert.equal(r2, 'a%26b%3Dc', `mp-harmony 分隔符应 encode,实际: ${r2}`);"
+ ],
+ [
+ 54,
+ "assert.equal(r3, '`hello%20world`', `mp-harmony 空格应 encode,实际: ${r3}`);"
+ ],
+ [
+ 57,
+ "test('_safeEncodeForPlatform: 鸿蒙下已编码入参 → decode 一次还原(避免双编码)', () => {"
+ ],
+ [
+ 65,
+ "assert.equal(r, '发', `mp-harmony 已编码入参应 decode 一次,实际: ${r}`);"
+ ],
+ [
+ 68,
+ "test('_safeEncodeForPlatform: H5 → JS 侧主动 encode', () => {"
+ ],
+ [
+ 72,
+ "const r1 = api._safeEncodeForPlatform('沙发');"
+ ],
+ [
+ 73,
+ "assert.equal(r1, '%E6%B2%99%E5%8F%91', `h5 中文应 encode,实际: ${r1}`);"
+ ],
+ [
+ 76,
+ "assert.equal(r2, 'a%26b', `h5 & 应 encode 成 %26,实际: ${r2}`);"
+ ],
+ [
+ 79,
+ "test('_safeEncodeForPlatform: 微信小程序 → JS 只 encode 分隔符 (不 encode 中文)', () => {"
+ ],
+ [
+ 87,
+ "const r1 = api._safeEncodeForPlatform('沙发');"
+ ],
+ [
+ 88,
+ "assert.equal(r1, '沙发', `mp-weixin 中文应原样,实际: ${r1}`);"
+ ],
+ [
+ 92,
+ "assert.equal(r2, 'a%26b', `mp-weixin & 应 encode 成 %26,实际: ${r2}`);"
+ ],
+ [
+ 96,
+ "assert.equal(r3, 'a%3Db', `mp-weixin = 应 encode 成 %3D,实际: ${r3}`);"
+ ],
+ [
+ 100,
+ "assert.equal(r4, 'a%3Fb', `mp-weixin ? 应 encode 成 %3F,实际: ${r4}`);"
+ ],
+ [
+ 107,
+ "test('_safeEncodeForPlatform: 华为快应用 → JS 侧主动 encode', () => {"
+ ],
+ [
+ 111,
+ "const r1 = api._safeEncodeForPlatform('沙发');"
+ ],
+ [
+ 112,
+ "assert.equal(r1, '%E6%B2%99%E5%8F%91', `quickapp 中文应 encode,实际: ${r1}`);"
+ ],
+ [
+ 115,
+ "test('_safeEncodeForPlatform: 已编码字符串不双编码(非微信/非鸿蒙平台)', () => {"
+ ],
+ [
+ 124,
+ "assert.equal(r, '%E8%A1%A8', `${p} decode roundtrip + re-encode 不应双编码,实际: ${r}`);"
+ ],
+ [
+ 128,
+ "test('_safeEncodeForPlatform: 微信小程序下已编码入参 → decode 一次还原', () => {"
+ ],
+ [
+ 133,
+ "assert.equal(r, '发', `mp-weixin 已编码入参应 decode 一次,实际: ${r}`);"
+ ],
+ [
+ 217,
+ "test('端到端: 鸿蒙元服务 → 搜索关键词\"沙发\"在列表页 search 输入框显示原文(不乱码)', () => {"
+ ],
+ [
+ 227,
+ "const url = buildRedirectUrl('/pages_goods/list', { keyword: '沙发' }, encode);"
+ ],
+ [
+ 230,
+ "assert.ok(url.includes('keyword=沙发'),"
+ ],
+ [
+ 231,
+ "`鸿蒙下 url 应含 keyword=沙发,实际: ${url}`);"
+ ],
+ [
+ 235,
+ "assert.equal(options.keyword, '沙发',"
+ ],
+ [
+ 236,
+ "`鸿蒙下 onLoad(options).keyword 应是原文,实际: ${options.keyword}`);"
+ ],
+ [
+ 239,
+ "test('端到端: 鸿蒙元服务 → 含中文 + 反引号 + 空格的关键词在列表页 search 显示原文', () => {"
+ ],
+ [
+ 246,
+ "const kw = '`hello world` 沙发';"
+ ],
+ [
+ 250,
+ "`鸿蒙下 url 应含 JS 编码后的 keyword(空格 → %20),实际: ${url}`);"
+ ],
+ [
+ 255,
+ "`鸿蒙下 onLoad(options).keyword 应是 decode 后的原文,实际: ${options.keyword}`);"
+ ],
+ [
+ 261,
+ "test('端到端: 微信小程序 → 搜索关键词\"沙发\"在列表页 search 输入框显示原文(不乱码)', () => {"
+ ],
+ [
+ 268,
+ "const url = buildRedirectUrl('/pages_goods/list', { keyword: '沙发' }, encode);"
+ ],
+ [
+ 272,
+ "`微信下 url 不应含 %xx(JS 不预 encode 中文),实际 url: ${url}`);"
+ ],
+ [
+ 273,
+ "assert.ok(url.includes('keyword=沙发'),"
+ ],
+ [
+ 274,
+ "`微信下 url 应含 keyword=沙发,实际: ${url}`);"
+ ],
+ [
+ 278,
+ "assert.equal(options.keyword, '沙发',"
+ ],
+ [
+ 279,
+ "`微信下 onLoad(options).keyword 应是原文,实际: ${options.keyword}`);"
+ ],
+ [
+ 282,
+ "test('端到端: 微信小程序 → 含中文 + 反引号 + 空格的关键词在列表页 search 显示原文', () => {"
+ ],
+ [
+ 287,
+ "const kw = '`hello world` 沙发';"
+ ],
+ [
+ 290,
+ "assert.ok(url.includes('keyword=' + encode('`hello world` 沙发')),"
+ ],
+ [
+ 291,
+ "`微信下 url 应含 JS 编码后的 keyword(空格 → %20),实际: ${url}`);"
+ ],
+ [
+ 296,
+ "`微信下 onLoad(options).keyword 应是 decode 后的原文,实际: ${options.keyword}`);"
+ ],
+ [
+ 302,
+ "test('端到端: H5 → 搜索关键词在列表页 search 输入框显示原文', () => {"
+ ],
+ [
+ 307,
+ "const url = buildRedirectUrl('/pages_goods/list', { keyword: '沙发' }, encode);"
+ ],
+ [
+ 309,
+ "`H5 下 url 应含编码后的 keyword,实际: ${url}`);"
+ ],
+ [
+ 313,
+ "assert.equal(options.keyword, '沙发',"
+ ],
+ [
+ 314,
+ "`H5 下 browser decode 后 keyword 应是原文,实际: ${options.keyword}`);"
+ ],
+ [
+ 320,
+ "test('端到端: 快应用 → 搜索关键词在列表页 search 输入框显示原文', () => {"
+ ],
+ [
+ 325,
+ "const url = buildRedirectUrl('/pages_goods/list', { keyword: '沙发' }, encode);"
+ ],
+ [
+ 327,
+ "`快应用下 url 应含编码后的 keyword,实际: ${url}`);"
+ ],
+ [
+ 330,
+ "assert.equal(options.keyword, '沙发',"
+ ],
+ [
+ 331,
+ "`快应用下 decode 后 keyword 应是原文,实际: ${options.keyword}`);"
+ ],
+ [
+ 337,
+ "test('Bug 回归场景: 商品分类页输入\"沙发\" → 列表页搜索框显示\"沙发\"(4 平台)', () => {"
+ ],
+ [
+ 362,
+ "const keyword = searchClick(p, '沙发');"
+ ],
+ [
+ 363,
+ "assert.equal(keyword, '沙发',"
+ ],
+ [
+ 364,
+ "`${p} 平台:onLoad(options).keyword 应是\"沙发\",实际: ${keyword}`);"
+ ],
+ [
+ 368,
+ "test('Bug 回归场景: 长关键词 + 特殊字符,4 平台都不应乱码', () => {"
+ ],
+ [
+ 388,
+ "'沙发',"
+ ],
+ [
+ 389,
+ "'Nike 运动鞋',"
+ ],
+ [
+ 390,
+ "'`反引号`',"
+ ],
+ [
+ 391,
+ "'100%纯棉',"
+ ],
+ [
+ 392,
+ "'价格>100',"
+ ],
+ [
+ 400,
+ "`${p} 平台: 关键词 \"${kw}\" 应原样传递,实际: \"${got}\"`);"
+ ],
+ [
+ 408,
+ "test('防御: 鸿蒙下已 encode 的入参 → decode 一次还原(避免双编码)', () => {"
+ ],
+ [
+ 418,
+ "assert.ok(url.includes('keyword=发'),"
+ ],
+ [
+ 419,
+ "`鸿蒙下已编码入参应被 decode 还原,实际 url: ${url}`);"
+ ],
+ [
+ 423,
+ "assert.equal(options.keyword, '发',"
+ ],
+ [
+ 424,
+ "`鸿蒙下 decode 一次后应是原文,实际: ${options.keyword}`);"
+ ],
+ [
+ 427,
+ "test('防御: 微信下已 encode 的入参 → decode 一次还原(避免平台 encode 后变成双编码)', () => {"
+ ],
+ [
+ 434,
+ "assert.ok(url.includes('keyword=发'),"
+ ],
+ [
+ 435,
+ "`微信下已编码入参应被 decode 还原,实际 url: ${url}`);"
+ ],
+ [
+ 438,
+ "assert.equal(options.keyword, '发',"
+ ],
+ [
+ 439,
+ "`微信下 decode-encode-decode 一次后应是原文,实际: ${options.keyword}`);"
+ ]
+ ],
+ "tests\\util-navigate.test.js": [
+ [
+ 39,
+ "test('util-navigate.js: 能被 vm 加载,所有 export 都存在', () => {"
+ ],
+ [
+ 50,
+ "`${name} 应是 function,实际是 ${typeof nav[name]}`);"
+ ],
+ [
+ 57,
+ "test('createNavigateApi: 一次性拿到所有跳转方法', () => {"
+ ],
+ [
+ 72,
+ "test('_toParamValueString: 各种类型', () => {"
+ ],
+ [
+ 83,
+ "test('parsePageParams: JSON 字符串 / 对象 / null / 兜底', () => {"
+ ],
+ [
+ 99,
+ "test('resolveLinkUrl: 拆分 wap_url 的 query 进 page_params', () => {"
+ ],
+ [
+ 109,
+ "test('resolveLinkUrl: 无 wap_url 返回 null', () => {"
+ ],
+ [
+ 118,
+ "test('cleanParamUrls: 移除反引号和首尾空白', () => {"
+ ],
+ [
+ 126,
+ "test('cleanParamUrls: 任意 key / 任意嵌套层级', () => {"
+ ],
+ [
+ 137,
+ "test('normalizeUrl: 严格不补协议/不补 host', () => {"
+ ],
+ [
+ 144,
+ "test('normalizeUrl: host 小写 + 去默认端口', () => {"
+ ],
+ [
+ 154,
+ "test('appendQueryParams: 基本功能', () => {"
+ ],
+ [
+ 162,
+ "test('appendQueryParams: 已有 ? 时用 &', () => {"
+ ],
+ [
+ 170,
+ "test('appendQueryParams: 对象走 JSON.stringify', () => {"
+ ],
+ [
+ 179,
+ "test('getPlatform: createNavigateApi 注入 platform 强制指定', () => {"
+ ],
+ [
+ 189,
+ "test('getPlatform: 运行时 platform 注入(模拟 systemInfo)', () => {"
+ ],
+ [
+ 210,
+ "test('shouldEncodeUrl: 4 平台都为 true', () => {"
+ ],
+ [
+ 220,
+ "test('_safeEncodeForPlatform: H5 / 华为快应用 → 主动 encode', () => {"
+ ],
+ [
+ 226,
+ "assert.equal(r, 'a%26b', `${p}: & 必须 encode 成 %26,实际: ${r}`);"
+ ],
+ [
+ 230,
+ "test('_safeEncodeForPlatform: 鸿蒙元服务 → JS 只 encode 分隔符(和 mp-weixin 行为一致)', () => {"
+ ],
+ [
+ 237,
+ "assert.equal(api._safeEncodeForPlatform('a&b'), 'a%26b', '& 应 encode 成 %26');"
+ ],
+ [
+ 238,
+ "assert.equal(api._safeEncodeForPlatform('沙发'), '沙发', '中文不应 encode');"
+ ],
+ [
+ 239,
+ "assert.equal(api._safeEncodeForPlatform('a=b'), 'a%3Db', '= 应 encode 成 %3D');"
+ ],
+ [
+ 240,
+ "assert.equal(api._safeEncodeForPlatform('a?b'), 'a%3Fb', '? 应 encode 成 %3F');"
+ ],
+ [
+ 243,
+ "test('_safeEncodeForPlatform: 微信小程序 → JS 只 encode 分隔符', () => {"
+ ],
+ [
+ 248,
+ "assert.equal(api._safeEncodeForPlatform('a&b'), 'a%26b', '& 应 encode 成 %26');"
+ ],
+ [
+ 249,
+ "assert.equal(api._safeEncodeForPlatform('沙发'), '沙发', '中文不应 encode');"
+ ],
+ [
+ 250,
+ "assert.equal(api._safeEncodeForPlatform('a=b'), 'a%3Db', '= 应 encode 成 %3D');"
+ ],
+ [
+ 251,
+ "assert.equal(api._safeEncodeForPlatform('a?b'), 'a%3Fb', '? 应 encode 成 %3F');"
+ ],
+ [
+ 254,
+ "test('_safeEncodeForPlatform: 已编码字符串不双编码(非微信/非鸿蒙平台)', () => {"
+ ],
+ [
+ 261,
+ "assert.equal(r, '%E8%A1%A8', `${p} decode roundtrip + re-encode 不应双编码,实际: ${r}`);"
+ ],
+ [
+ 265,
+ "test('_safeEncodeForPlatform: 微信/鸿蒙下已编码入参 → decode 一次还原', () => {"
+ ],
+ [
+ 270,
+ "assert.equal(r, '表', `${p} 已编码入参应 decode 一次还原,实际: ${r}`);"
+ ],
+ [
+ 277,
+ "test('_navigateTo: H5 用 window.location', () => {"
+ ],
+ [
+ 316,
+ "test('_navigateTo: 微信小程序调 uni.navigateTo', () => {"
+ ],
+ [
+ 337,
+ "test('_navigateTo: 鸿蒙元服务 tabBar 用 reLaunch 兜底', () => {"
+ ],
+ [
+ 354,
+ "assert.equal(calls.switchTab.length, 0, '鸿蒙不用 switchTab');"
+ ],
+ [
+ 355,
+ "assert.equal(calls.reLaunch.length, 1, '鸿蒙用 reLaunch 兜底');"
+ ],
+ [
+ 361,
+ "test('util.js: 通过 import 引用 util-navigate 的方法,挂载到 default export', () => {"
+ ],
+ [
+ 371,
+ "'util.js 应 import util-navigate.js');"
+ ],
+ [
+ 373,
+ "'util.js 应 import cleanParamUrls');"
+ ],
+ [
+ 375,
+ "'util.js 应 import normalizeUrl 别名 _normalizeUrlBase');"
+ ],
+ [
+ 377,
+ "'util.js 应 import extractInternalAppPath 别名');"
+ ],
+ [
+ 379,
+ "'util.js 应 import resolveNavMode 别名');"
+ ],
+ [
+ 382,
+ "'util.js 应把 cleanParamUrls 挂载到 default export');"
+ ],
+ [
+ 384,
+ "'util.js 的 normalizeUrl 应委托给 _normalizeUrlBase');"
+ ],
+ [
+ 390,
+ "test('util.js: redirectTo / diyRedirectTo 仍在 util.js(没被搬走)', () => {"
+ ],
+ [
+ 397,
+ "'redirectTo 应仍在 util.js');"
+ ],
+ [
+ 400,
+ "'diyRedirectTo 应仍在 util.js');"
+ ],
+ [
+ 403,
+ "'redirectTo 应调 _safeEncodeForPlatform');"
+ ],
+ [
+ 406,
+ "'diyRedirectTo 应调 this.cleanParamUrls');"
+ ],
+ [
+ 409,
+ "'diyRedirectTo 应调 _resolveNavMode');"
+ ],
+ [
+ 411,
+ "'diyRedirectTo 应调 _extractInternalAppPath');"
+ ],
+ [
+ 418,
+ "test('extractInternalAppPath: 相对内部路径直接放行', () => {"
+ ],
+ [
+ 424,
+ "test('extractInternalAppPath: 同域绝对 URL → 还原为相对路径', () => {"
+ ],
+ [
+ 433,
+ "test('extractInternalAppPath: 同平台不同子域(域名不完全一致)→ null(严格模式)', () => {"
+ ],
+ [
+ 442,
+ "test('extractInternalAppPath: 传入完整 URL 作为白名单也能提取 host(完全一致才还原)', () => {"
+ ],
+ [
+ 456,
+ "test('extractInternalAppPath: 外链域名不同(Shopify / Facebook)→ 不误伤, 返回 null', () => {"
+ ],
+ [
+ 464,
+ "test('extractInternalAppPath: 绝对 URL 但路径无 /pages 段 → null(真外链)', () => {"
+ ],
+ [
+ 470,
+ "test('extractInternalAppPath: 无白名单时绝对 URL 一律 null(不猜测)', () => {"
+ ],
+ [
+ 476,
+ "test('extractInternalAppPath: 空/非法输入安全返回 null', () => {"
+ ],
+ [
+ 483,
+ "test('extractInternalAppPath: host 大小写不敏感 + 忽略端口', () => {"
+ ],
+ [
+ 498,
+ "test('extractInternalAppPath: 各分包页面根都能识别 + 保留 hash', () => {"
+ ],
+ [
+ 509,
+ "test('extractInternalAppPath: allowedHosts=true → 跳过 host 校验(强制内部)', () => {"
+ ],
+ [
+ 543,
+ "test('resolveNavMode: 未设置 / 未知值 → auto', () => {"
+ ],
+ [
+ 555,
+ "test('hasStaleUniacidInUrl: URL 无 uniacid → false', () => {"
+ ],
+ [
+ 561,
+ "test('hasStaleUniacidInUrl: URL uniacid 与当前一致 → false', () => {"
+ ],
+ [
+ 568,
+ "test('hasStaleUniacidInUrl: URL uniacid 与当前不一致 → true(脏数据)', () => {"
+ ],
+ [
+ 574,
+ "test('hasStaleUniacidInUrl: 兼容 URL 编码 + 大小写 + 多个 query', () => {"
+ ],
+ [
+ 582,
+ "test('hasStaleUniacidInUrl: currentUniacid 无效 → false(无法比较)', () => {"
+ ],
+ [
+ 590,
+ "test('hasStaleUniacidInUrl: 空 / 非法输入 → false(安全降级)', () => {"
+ ],
+ [
+ 604,
+ "test('pickCurrentUniacid: 第一参(运行时 storage)非 0 → 选第一参', () => {"
+ ],
+ [
+ 610,
+ "test('pickCurrentUniacid: 第一参无值 → 回退到第二参(Config 兜底)', () => {"
+ ],
+ [
+ 617,
+ "test('pickCurrentUniacid: 第一参为 0 → 回退到第二参(关键边界)', () => {"
+ ],
+ [
+ 625,
+ "test('pickCurrentUniacid: 两个参都无值 → 0', () => {"
+ ],
+ [
+ 633,
+ "test('pickCurrentUniacid: 字符串数字自动 parseInt', () => {"
+ ]
+ ],
+ "components-diy\\diy-group.vue": [
+ [
+ 5,
+ ""
+ ],
+ [
+ 10,
+ ""
+ ],
+ [
+ 15,
+ ""
+ ],
+ [
+ 22,
+ ""
+ ],
+ [
+ 27,
+ ""
+ ],
+ [
+ 32,
+ ""
+ ],
+ [
+ 37,
+ ""
+ ],
+ [
+ 42,
+ ""
+ ],
+ [
+ 47,
+ ""
+ ],
+ [
+ 52,
+ ""
+ ],
+ [
+ 57,
+ ""
+ ],
+ [
+ 63,
+ ""
+ ],
+ [
+ 68,
+ ""
+ ],
+ [
+ 73,
+ ""
+ ],
+ [
+ 78,
+ ""
+ ],
+ [
+ 83,
+ ""
+ ],
+ [
+ 88,
+ ""
+ ],
+ [
+ 94,
+ ""
+ ],
+ [
+ 99,
+ ""
+ ],
+ [
+ 107,
+ ""
+ ],
+ [
+ 112,
+ ""
+ ],
+ [
+ 117,
+ ""
+ ],
+ [
+ 121,
+ ""
+ ],
+ [
+ 127,
+ ""
+ ],
+ [
+ 132,
+ ""
+ ],
+ [
+ 137,
+ ""
+ ],
+ [
+ 142,
+ ""
+ ],
+ [
+ 147,
+ ""
+ ],
+ [
+ 154,
+ ""
+ ],
+ [
+ 159,
+ ""
+ ],
+ [
+ 164,
+ ""
+ ],
+ [
+ 169,
+ ""
+ ],
+ [
+ 174,
+ ""
+ ],
+ [
+ 179,
+ ""
+ ],
+ [
+ 184,
+ ""
+ ],
+ [
+ 189,
+ ""
+ ],
+ [
+ 194,
+ ""
+ ],
+ [
+ 199,
+ ""
+ ],
+ [
+ 204,
+ ""
+ ],
+ [
+ 209,
+ ""
+ ],
+ [
+ 215,
+ ""
+ ],
+ [
+ 220,
+ ""
+ ],
+ [
+ 225,
+ ""
+ ],
+ [
+ 230,
+ ""
+ ],
+ [
+ 235,
+ ""
+ ],
+ [
+ 240,
+ ""
+ ],
+ [
+ 245,
+ ""
+ ],
+ [
+ 250,
+ ""
+ ],
+ [
+ 255,
+ ""
+ ],
+ [
+ 260,
+ ""
+ ],
+ [
+ 264,
+ ""
+ ]
+ ],
+ "tests\\util.test.js": [
+ [
+ 61,
+ "console.warn('[normalizeUrl] scheme 后有多余的 /:', urlString);"
+ ],
+ [
+ 110,
+ "console.warn('[normalizeUrl] host 含非法字符:', urlString);"
+ ],
+ [
+ 396,
+ "test('decodeEntity: 解码 & 等 HTML 实体', () => {"
+ ],
+ [
+ 400,
+ "test('decodeEntity: 解码 中 这种十六进制', () => {"
+ ],
+ [
+ 401,
+ "assert.equal(decodeEntity('中'), '中');"
+ ],
+ [
+ 407,
+ "test('normalizeUrl: 基础 https URL 不变', () => {"
+ ],
+ [
+ 414,
+ "test('normalizeUrl: 剥离反引号和首尾空白', () => {"
+ ],
+ [
+ 425,
+ "test('normalizeUrl: 不补协议,内部路径原样返回', () => {"
+ ],
+ [
+ 430,
+ "test('normalizeUrl: 不补 host,只补协议也不做', () => {"
+ ],
+ [
+ 434,
+ "test('normalizeUrl: host 小写', () => {"
+ ],
+ [
+ 441,
+ "test('normalizeUrl: 去默认端口', () => {"
+ ],
+ [
+ 447,
+ "test('normalizeUrl: 解析 . 和 ..', () => {"
+ ],
+ [
+ 451,
+ "test('normalizeUrl: 合并连续"
+ ],
+ [
+ 455,
+ "test('normalizeUrl: query 排序', () => {"
+ ],
+ [
+ 462,
+ "test('normalizeUrl: BOM / 零宽字符剥离', () => {"
+ ],
+ [
+ 469,
+ "test('normalizeUrl: 全部是空白或反引号返回空串', () => {"
+ ],
+ [
+ 474,
+ "test('normalizeUrl: 非字符串返回空串', () => {"
+ ],
+ [
+ 483,
+ "test('resolveLinkUrl: 拆分 wap_url 的 query 进 page_params', () => {"
+ ],
+ [
+ 491,
+ "test('resolveLinkUrl: page_params 优先于 wap_url query', () => {"
+ ],
+ [
+ 500,
+ "test('resolveLinkUrl: 无 wap_url 返回 null', () => {"
+ ],
+ [
+ 508,
+ "test('adaptSubpackageUrl: 老前缀映射到新前缀', () => {"
+ ],
+ [
+ 519,
+ "test('adaptSubpackageUrl: 已经是新前缀不动', () => {"
+ ],
+ [
+ 526,
+ "test('adaptSubpackageUrl: 把 3 个及以上 / 收敛成 2 个', () => {"
+ ],
+ [
+ 536,
+ "test('redirectTo: 基础 navigateTo 拼装 url', () => {"
+ ],
+ [
+ 546,
+ "test('redirectTo: 0 号清理步骤 — 移除 param.src 反引号 + 修补 scheme', () => {"
+ ],
+ [
+ 554,
+ "assert.ok(!call.url.includes('`'), 'url 不应包含反引号');"
+ ],
+ [
+ 560,
+ "test('redirectTo: page_params 永远在最末', () => {"
+ ],
+ [
+ 564,
+ "assert.ok(url.endsWith('page_params={\"x\":\"y\"}'), 'page_params 应在 URL 末尾');"
+ ],
+ [
+ 567,
+ "test('redirectTo: mode=redirectTo 调 uni.redirectTo', () => {"
+ ],
+ [
+ 574,
+ "test('redirectTo: mode=reLaunch 调 uni.reLaunch', () => {"
+ ],
+ [
+ 583,
+ "test('diyRedirectTo: 外部链接带脏数据(反引号+空格)能清洗干净', () => {"
+ ],
+ [
+ 587,
+ "title: '表单',"
+ ],
+ [
+ 594,
+ "assert.ok(call, '应该调用了 uni.navigateTo');"
+ ],
+ [
+ 597,
+ "assert.ok(!url.includes('`'), 'url 不应包含反引号: ' + url);"
+ ],
+ [
+ 601,
+ "assert.ok(url.startsWith('/pages_tool/webview/webview?'), '应跳到 webview 页面: ' + url);"
+ ],
+ [
+ 604,
+ "assert.ok(srcMatch, 'url 应含 src 参数');"
+ ],
+ [
+ 607,
+ "'src 应以正确的 host + path 开头: ' + src);"
+ ],
+ [
+ 610,
+ "assert.ok(src.includes('id=130'), 'src 内应含 id=130');"
+ ],
+ [
+ 611,
+ "assert.ok(src.includes('uniacid=2482'), 'src 内应含 uniacid=2482');"
+ ],
+ [
+ 614,
+ "test('diyRedirectTo: wap_url 是畸形 https:"
+ ],
+ [
+ 618,
+ "title: '表单',"
+ ],
+ [
+ 626,
+ "assert.ok(call, '应该调用了 uni.navigateTo');"
+ ],
+ [
+ 628,
+ "assert.ok(url.includes('src='), 'url 应含 src 参数');"
+ ],
+ [
+ 635,
+ "assert.ok(!srcMatch[1].includes('host.com'), 'src 不应含 host.com(被 reject)');"
+ ],
+ [
+ 639,
+ "test('diyRedirectTo: 内部路径不走 webview', () => {"
+ ],
+ [
+ 643,
+ "title: '详情',"
+ ],
+ [
+ 647,
+ "assert.ok(call.url.startsWith('/pages_order/detail?'), '应跳到内部路径: ' + call.url);"
+ ],
+ [
+ 650,
+ "test('diyRedirectTo: page_params 的键值会出现在 src 内', () => {"
+ ],
+ [
+ 654,
+ "title: '表单',"
+ ],
+ [
+ 659,
+ "assert.ok(url.includes('id=130'), '应含 id=130');"
+ ],
+ [
+ 660,
+ "assert.ok(url.includes('uniacid=2482'), '应含 uniacid=2482');"
+ ]
+ ],
+ "tests\\cross-platform.test.js": [
+ [
+ 153,
+ "test('getPlatform: 4 个平台都识别正确', () => {"
+ ],
+ [
+ 160,
+ "test('getPlatform: 编译时变量也能识别', () => {"
+ ],
+ [
+ 167,
+ "test('getPlatform: 运行时特征(鸿蒙/微信)识别', () => {"
+ ],
+ [
+ 181,
+ "test('getPlatform: 有 window 没 uni → h5', () => {"
+ ],
+ [
+ 185,
+ "test('getPlatform: 兜底 h5', () => {"
+ ],
+ [
+ 191,
+ "test('getPlatform: 华为快应用 = H5 嵌入快应用 Webview,通过 systemInfo.platform 识别', () => {"
+ ],
+ [
+ 213,
+ "test('shouldEncodeUrl: 4 个平台都为 true', () => {"
+ ],
+ [
+ 217,
+ "assert.equal(shouldEncodeUrl(), true, `${p} 平台应该 encode`);"
+ ],
+ [
+ 224,
+ "test('safeEncode: 4 个平台对普通字符串 encode 行为一致', () => {"
+ ],
+ [
+ 227,
+ "assert.equal(r1, 'hello', `${p} 普通字符串不变`);"
+ ],
+ [
+ 228,
+ "const r2 = safeEncodeForPlatform('`表单`', p);"
+ ],
+ [
+ 229,
+ "assert.equal(r2, '%60%E8%A1%A8%E5%8D%95%60', `${p} 反引号应被 encode`);"
+ ],
+ [
+ 231,
+ "assert.equal(r3, 'a%26b', `${p} & 应被 encode`);"
+ ],
+ [
+ 235,
+ "test('safeEncode: 4 个平台对已编码字符串不双编码', () => {"
+ ],
+ [
+ 239,
+ "assert.equal(r, '%E8%A1%A8', `${p} decode roundtrip + re-encode 不应双编码`);"
+ ],
+ [
+ 243,
+ "test('safeEncode: src 内嵌 URL 的 & 在 4 个平台都被 encode(防微信丢参数)', () => {"
+ ],
+ [
+ 248,
+ "assert.ok(!r.includes('&'), `${p} src 不应含裸 &: ${r}`);"
+ ],
+ [
+ 249,
+ "assert.ok(r.includes('%26'), `${p} src 应含 %26: ${r}`);"
+ ],
+ [
+ 256,
+ "test('_navigateTo: H5 用 window.location', () => {"
+ ],
+ [
+ 263,
+ "test('_navigateTo: H5 redirectTo/reLaunch 用 location.replace', () => {"
+ ],
+ [
+ 271,
+ "test('_navigateTo: 微信小程序默认调 uni.navigateTo', () => {"
+ ],
+ [
+ 278,
+ "test('_navigateTo: 微信小程序 redirectTo/reLaunch 调对应 API', () => {"
+ ],
+ [
+ 286,
+ "test('_navigateTo: 微信小程序 tabBar 调 uni.switchTab', () => {"
+ ],
+ [
+ 293,
+ "test('_navigateTo: 鸿蒙元服务 tabBar 兜底用 reLaunch(不用 switchTab)', () => {"
+ ],
+ [
+ 297,
+ "assert.equal(ctx.calls.switchTab.length, 0, '鸿蒙不用 switchTab');"
+ ],
+ [
+ 298,
+ "assert.equal(ctx.calls.reLaunch.length, 1, '鸿蒙用 reLaunch 兜底');"
+ ],
+ [
+ 301,
+ "test('_navigateTo: 鸿蒙元服务普通跳转用 uni.navigateTo', () => {"
+ ],
+ [
+ 307,
+ "test('_navigateTo: 华为快应用 tabBar 调 uni.switchTab', () => {"
+ ],
+ [
+ 314,
+ "test('_navigateTo: 华为快应用普通跳转调 uni.navigateTo', () => {"
+ ],
+ [
+ 320,
+ "test('_navigateTo: 非 H5 但没有 uni 全局 → noop(不报错)', () => {"
+ ],
+ [
+ 328,
+ "test('_navigateTo: H5 但没有 window → noop(不报错)', () => {"
+ ],
+ [
+ 339,
+ "test('diyRedirectTo 外部链接: H5 直接跳完整 URL,不走 webview 容器', () => {"
+ ],
+ [
+ 350,
+ "test('diyRedirectTo 外部链接: 微信跳到 webview 容器,url 作为 src', () => {"
+ ],
+ [
+ 359,
+ "'应跳到 webview: ' + url);"
+ ],
+ [
+ 363,
+ "assert.ok(!srcMatch[1].includes('&'), 'src 不应含裸 &: ' + url);"
+ ],
+ [
+ 366,
+ "test('diyRedirectTo 外部链接: 鸿蒙跳到 webview 容器(走 uni.navigateTo)', () => {"
+ ],
+ [
+ 374,
+ "test('diyRedirectTo 外部链接: 华为快应用跳到 webview 容器(走 uni.navigateTo)', () => {"
+ ],
+ [
+ 385,
+ "test('端到端: 4 平台 — 你的真实 link 走完跳转,参数全部保留', () => {"
+ ],
+ [
+ 388,
+ "title: '表单',"
+ ],
+ [
+ 402,
+ "`H5 完整 url 应被设置: ${url}`);"
+ ],
+ [
+ 414,
+ "assert.ok(keys.includes('src'), `${p} 应含 src: ${url}`);"
+ ],
+ [
+ 415,
+ "assert.ok(keys.includes('id'), `${p} 应含 id: ${url}`);"
+ ],
+ [
+ 416,
+ "assert.ok(keys.includes('uniacid'), `${p} 应含 uniacid: ${url}`);"
+ ],
+ [
+ 424,
+ "test('safeEncode: null/undefined 不报错', () => {"
+ ],
+ [
+ 429,
+ "assert.ok(typeof r1 === 'string', `${p} null 应返回字符串`);"
+ ],
+ [
+ 430,
+ "assert.ok(typeof r2 === 'string', `${p} undefined 应返回字符串`);"
+ ],
+ [
+ 434,
+ "test('safeEncode: 数字 0 / 布尔 false 都正确', () => {"
+ ],
+ [
+ 441,
+ "test('safeEncode: 对象走 JSON.stringify 路径', () => {"
+ ],
+ [
+ 445,
+ "assert.equal(r, '%7B%22id%22%3A%22130%22%7D', `${p} 对象序列化`);"
+ ],
+ [
+ 449,
+ "test('navigateTo: 4 平台 url 都正确传过去', () => {"
+ ]
+ ],
+ "tests\\_v.js": [
+ [
+ 28,
+ "{ id:1, text:'首页', link:{wap_url:HOME} }, { id:2, text:'分类', link:{wap_url:CATEGORY} },"
+ ],
+ [
+ 29,
+ "{ id:3, text:'购物车', link:{wap_url:CART} }, { id:4, text:'商户', link:{wap_url:MERCHANT} },"
+ ],
+ [
+ 30,
+ "{ id:5, text:'我的', link:{wap_url:MEMBER} },"
+ ],
+ [
+ 59,
+ "const A = (a, e, l) => assert.equal(a, e, `[${l}] 期望 ${e||'不点亮'}, 实际 ${a||'不点亮'}`);"
+ ],
+ [
+ 75,
+ "T('3.4 链式', () => {"
+ ],
+ [
+ 78,
+ "assert.equal(findH(tabs[i], tabs.slice(0, i)), tabs[i], `链式${i+1}`);"
+ ],
+ [
+ 90,
+ "T('5.2 diy 走 history-walk', () => A(findH(DIY, [HOME]), HOME, '5.2'));"
+ ],
+ [
+ 91,
+ "T('5.3 diy 不在 PAGE_TAB_MAP', () => assert.equal(PAGE_TAB_MAP[DIY], undefined));"
+ ],
+ [
+ 93,
+ "T('6.1 深链 diy', () => A(findH(DIY, []), null, '6.1'));"
+ ],
+ [
+ 94,
+ "T('6.2 深链 diy?id=123', () => A(findH(DIY + '?id=123', []), null, '6.2'));"
+ ],
+ [
+ 95,
+ "T('6.3 深链 goods/detail', () => A(findH(GOODS_DETAIL, []), CATEGORY, '6.3'));"
+ ],
+ [
+ 96,
+ "T('6.4 深链 member', () => A(findH(MEMBER, []), MEMBER, '6.4'));"
+ ],
+ [
+ 97,
+ "T('6.5 深链 fenxiao', () => A(findH(FENXIAO, []), null, '6.5'));"
+ ],
+ [
+ 105,
+ "T('8.2 PAGE_TAB_MAP 优先 from_tab', () => assert.equal(checkTabBarActive(MEMBER, DIY, tabBarList, {}, {from_tab:MEMBER}, {noTabPages:NO_TAB_PAGES, pageTabMap:{[DI"
+ ],
+ [
+ 106,
+ "T('8.3 非法 from_tab', () => assert.equal(checkTabBarActive(HOME, DIY, tabBarList, {}, {from_tab:'/foo/bar'}, {noTabPages:NO_TAB_PAGES, pageTabMap:{}, pageTabWild"
+ ],
+ [
+ 108,
+ "T('9.1 diy 带 query', () => A(findH('/pages_tool/index/diy?id=123&from=share', [HOME]), HOME, '9.1'));"
+ ],
+ [
+ 109,
+ "T('9.2 tab 根带 query', () => assert.equal(resolveEntryTab({currentPageRoute:'/pages/index/index?from=share', tabBarList, historyRoutes:[]}), HOME));"
+ ],
+ [
+ 110,
+ "T('9.3 老路径', () => assert.equal(resolveEntryTab({currentPageRoute:DIY, tabBarList, historyRoutes:['/pages/member/index']}), MEMBER));"
+ ],
+ [
+ 112,
+ "T('10.1 互斥 1 亮', () => {"
+ ],
+ [
+ 116,
+ "T('10.2 幂等', () => {"
+ ],
+ [
+ 122,
+ "T('11.1 tabBarList 空', () => A(findH(DIY, [HOME], {list:[]}), null, '11.1'));"
+ ],
+ [
+ 123,
+ "T('11.2 脏数据', () => {"
+ ],
+ [
+ 127,
+ "T('11.3 history 脏', () => assert.equal(resolveEntryTab({currentPageRoute:DIY, tabBarList, historyRoutes:[null,'',undefined,HOME]}), HOME));"
+ ],
+ [
+ 128,
+ "T('11.4 history 非数组', () => assert.equal(resolveEntryTab({currentPageRoute:DIY, tabBarList, historyRoutes:'not-array'}), MEMBER));"
+ ],
+ [
+ 129,
+ "T('11.5 深链 unmapped', () => A(findH('/pages_goods/some-unmapped-page', []), null, '11.5'));"
+ ],
+ [
+ 131,
+ "T('12.1 home→diy→member→回→home→diy', () => A(findH(DIY, [HOME]), HOME, '12.1'));"
+ ],
+ [
+ 132,
+ "T('12.2 home→diy→点 cart tab', () => A(findH(CART, [HOME]), CART, '12.2'));"
+ ],
+ [
+ 133,
+ "T('12.3 登出后 diy', () => A(findH(DIY, [HOME]), HOME, '12.3'));"
+ ],
+ [
+ 135,
+ "T('13.1 tab 根优先', () => assert.equal(resolveEntryTab({currentPageRoute:CATEGORY, tabBarList, historyRoutes:[HOME, MEMBER]}), CATEGORY));"
+ ],
+ [
+ 136,
+ "T('13.2 精确', () => assert.equal(lookupPageTabMap(MEMBER, PAGE_TAB_MAP, PAGE_TAB_WILDCARDS), MEMBER));"
+ ],
+ [
+ 137,
+ "T('13.3 通配符', () => {"
+ ],
+ [
+ 141,
+ "T('13.4 null 优先', () => {"
+ ],
+ [
+ 146,
+ "T('13.5 无匹配', () => assert.equal(lookupPageTabMap(DIY, PAGE_TAB_MAP, PAGE_TAB_WILDCARDS), undefined));"
+ ],
+ [
+ 147,
+ "T('13.6 前缀相近', () => assert.equal(lookupPageTabMap('/pages_tool/members', PAGE_TAB_MAP, PAGE_TAB_WILDCARDS), undefined));"
+ ],
+ [
+ 149,
+ "T('14.1 非法 link', () => assert.equal(checkTabBarActive('/pages/x', DIY, tabBarList, {pages_tool:HOME}, {from_tab:HOME}, {noTabPages:NO_TAB_PAGES, pageTabMap:PAG"
+ ],
+ [
+ 150,
+ "T('14.2 NO_TAB_PAGES 都不亮', () => {"
+ ],
+ [
+ 156,
+ "T('15. 8 场景', () => {"
+ ],
+ [
+ 158,
+ "['深链扫 diy', DIY, [], null],"
+ ],
+ [
+ 159,
+ "['首页 → diy 链接', DIY, [HOME], HOME],"
+ ],
+ [
+ 160,
+ "['首页 → 会员中心', MEMBER, [HOME], MEMBER],"
+ ],
+ [
+ 161,
+ "['分类 → diy 链接', DIY, [CATEGORY], CATEGORY],"
+ ],
+ [
+ 162,
+ "['分类 → 商品列表 → diy', DIY, [CATEGORY, GOODS_LIST], CATEGORY],"
+ ],
+ [
+ 163,
+ "['我的 → 优惠券 → diy', DIY, [MEMBER, MEMBER_COUPON], MEMBER],"
+ ],
+ [
+ 164,
+ "['首页 → 登录页 → diy', DIY, [HOME, LOGIN], HOME],"
+ ],
+ [
+ 165,
+ "['深链扫 member/info', MEMBER_INFO, [], MEMBER],"
+ ],
+ [
+ 172,
+ "console.log('通过:', p, '/ 失败:', f);"
+ ]
+ ],
+ "vue.config.js": [
+ [
+ 16,
+ "console.log(`\\n🛡️ [test-gate] 检测到生产构建,先执行测试门禁 (${process.versions.node})...`);"
+ ],
+ [
+ 22,
+ "console.log('🛡️ [test-gate] ✅ 测试通过,放行生产构建\\n');"
+ ],
+ [
+ 24,
+ "console.error('\\n❌ [test-gate] 测试未通过,已阻止生产构建');"
+ ],
+ [
+ 31,
+ "console.log(`[vue.config] 已加载 | node ${process.versions.node} @ ${process.execPath}`);"
+ ],
+ [
+ 49,
+ "console.log(`🏠 当前构建的平台: [${process.env.UNI_PLATFORM || '(未知)'}]\\n`);"
+ ],
+ [
+ 53,
+ "console.log(`\\n[H5 发行] 脚本: ${process.env.UNI_SCRIPT || '(默认)'}`);"
+ ],
+ [
+ 54,
+ "console.log(`[H5 发行] 域名: ${process.env.UNI_APP_DOMAIN || '(未配置)'}\\n`);"
+ ],
+ [
+ 65,
+ "console.error(`❌ NODE_ENV 环境变量未设置`);"
+ ],
+ [
+ 66,
+ "throw new Error('NODE_ENV 环境变量未设置');"
+ ],
+ [
+ 77,
+ "console.log(`🧹 清理构建目录 ${assetDir}\\n`);"
+ ],
+ [
+ 108,
+ "console.log('NODE_ENV 环境变量未设置,默认使用开发模式');"
+ ],
+ [
+ 120,
+ "console.warn(`[manifest] h5.router.base \"${base}\" 不规范,已自动补全 /`);"
+ ],
+ [
+ 126,
+ "console.warn('[manifest] 读取 h5.router.base 失败:', e.message);"
+ ],
+ [
+ 253,
+ "console.log(`[VersionInject] ✅ vendor.js 已注入 (platform=${platform}, mode=${mode}, commit=${this._cachedCommitId})`);"
+ ],
+ [
+ 270,
+ "console.log(`[VersionInject] ✅ index.html 已注入 (platform=${platform}, commit=${this._cachedCommitId})`);"
+ ],
+ [
+ 286,
+ "console.log('\\n🚀 mp-weixin 生产构建完成,运行补丁脚本(site.js 拷贝 + ZIP 打包)...');"
+ ],
+ [
+ 290,
+ "console.error('补丁脚本执行失败:', e.message);"
+ ],
+ [
+ 293,
+ "console.log('\\n🚀 mp-harmony 生产构建完成,运行补丁脚本(配置拷贝 + ZIP 打包)...');"
+ ],
+ [
+ 297,
+ "console.error('补丁脚本执行失败:', e.message);"
+ ],
+ [
+ 300,
+ "console.log('\\n🚀 mp-harmony 生产构建完成,拷贝产物到 ascf_src 目录...');"
+ ],
+ [
+ 325,
+ "console.log('[H5Zip] 输出目录名:', result);"
+ ],
+ [
+ 345,
+ "console.log(`[H5Zip] 输出目录已重命名为: ${outputDirName}`);"
+ ],
+ [
+ 347,
+ "console.error('[H5Zip] 目录重命名失败:', e.message);"
+ ],
+ [
+ 351,
+ "console.log(`[H5Zip] 输出目录名正确: ${outputDirName}`);"
+ ],
+ [
+ 392,
+ "console.warn(`⚠️ 打开目录失败(不影响 ZIP 打包): ${openErr.message}`);"
+ ],
+ [
+ 399,
+ "console.error('H5 ZIP 打包失败:', e.message);"
+ ],
+ [
+ 407,
+ "console.log(`\\n📋 拷贝鸿蒙构建产物...`);"
+ ],
+ [
+ 408,
+ "console.log(` 源: ${sourceDir}`);"
+ ],
+ [
+ 409,
+ "console.log(` 目标: ${destDir}`);"
+ ],
+ [
+ 413,
+ "console.error(`❌ 源目录不存在: ${sourceDir}`);"
+ ],
+ [
+ 414,
+ "throw new Error(`鸿蒙构建产物目录不存在: ${sourceDir}`);"
+ ],
+ [
+ 425,
+ "console.log(` ✅ 已清空目标目录 ${destDir}`);"
+ ],
+ [
+ 427,
+ "console.warn(` ⚠️ 清空目标目录 ${destDir} 失败,将尝试覆盖: ${cleanErr.message}`);"
+ ],
+ [
+ 451,
+ "console.log(' ✅ 拷贝完成');"
+ ],
+ [
+ 453,
+ "console.error(` ❌ 拷贝失败: ${e.message}`);"
+ ],
+ [
+ 482,
+ "console.log(`[vue.config] ✅ lang/ 目录已替换为 stub (source=remote-only) — 节省 lang 包体积`);"
+ ],
+ [
+ 485,
+ "console.error('[vue.config] 配置 lang/ 排除失败:', e.message);"
+ ],
+ [
+ 488,
+ "console.log(`[vue.config] lang/ 目录保留 (source=${langSource || 'unknown'})`);"
+ ],
+ [
+ 509,
+ "console.log(`[vue.config] ✅ style_color.js 已替换为 stub (source=remote-only) — 节省 ~75KB`);"
+ ],
+ [
+ 512,
+ "console.error('[vue.config] 配置 style_color 排除失败:', e.message);"
+ ],
+ [
+ 515,
+ "console.log(`[vue.config] style_color.js 保留 (source=${themeSource || 'unknown'})`);"
+ ],
+ [
+ 519,
+ "console.log('[vue.config] 开始尝试配置极限压缩');"
+ ],
+ [
+ 555,
+ "console.log(`[vue.config] 是否保留console语句 = ${Boolean(enableKeepConsole)}`);"
+ ],
+ [
+ 607,
+ "console.log('[vue.config] 配置极限压缩完成');"
+ ]
+ ],
+ "tests\\redirectTo-real.test.js": [
+ [
+ 150,
+ "test('redirectTo 职责: 不对 param 做 URL 清理(职责单一)', () => {"
+ ],
+ [
+ 165,
+ "'反引号应被 encode,url 不应含裸反引号(清理是上游 diyRedirectTo 职责): ' + url);"
+ ],
+ [
+ 167,
+ "'反引号应被 encode 成 %60: ' + url);"
+ ],
+ [
+ 172,
+ "'decode 后应还原原文(说明 redirectTo 没清理脏数据): ' + wapUrlDecoded);"
+ ],
+ [
+ 178,
+ "test('redirectTo 职责: 干净 param → 正确拼装 url + 调 uni.navigateTo', () => {"
+ ],
+ [
+ 185,
+ "title: '表单',"
+ ],
+ [
+ 197,
+ "assert.ok(url.startsWith('/pages_tool/webview/webview?'), '应跳到 webview: ' + url);"
+ ],
+ [
+ 201,
+ "assert.ok(srcMatch, 'url 应含 src: ' + url);"
+ ],
+ [
+ 203,
+ "'decode 后应含 xcx3 域名: ' + decodeURIComponent(srcMatch[1]));"
+ ],
+ [
+ 205,
+ "assert.ok(wapUrlMatch, 'url 应含 wap_url: ' + url);"
+ ],
+ [
+ 207,
+ "'decode 后应含 xcx3 域名: ' + decodeURIComponent(wapUrlMatch[1]));"
+ ],
+ [
+ 211,
+ "assert.ok(pageParamsIdx > 0, 'url 应含 page_params');"
+ ],
+ [
+ 218,
+ "test('redirectTo 职责: enable_set_title=0 正确序列化', () => {"
+ ],
+ [
+ 228,
+ "assert.ok(url.includes('enable_set_title=0'), 'enable_set_title=0 应出现: ' + url);"
+ ],
+ [
+ 234,
+ "test('mode=redirectTo: 调 uni.redirectTo', () => {"
+ ],
+ [
+ 242,
+ "test('mode=reLaunch: 调 uni.reLaunch', () => {"
+ ],
+ [
+ 249,
+ "test('默认 mode=navigateTo: 调 uni.navigateTo', () => {"
+ ],
+ [
+ 259,
+ "test('param 为 undefined 不会报错', () => {"
+ ],
+ [
+ 267,
+ "test('空对象 param 不会报错', () => {"
+ ],
+ [
+ 274,
+ "test('to 带 query 时也能正确合并 param', () => {"
+ ],
+ [
+ 279,
+ "assert.ok(url.includes('from=tab1'), 'to 里的 query 应保留: ' + url);"
+ ],
+ [
+ 280,
+ "assert.ok(url.includes('id=1'), 'param 应追加: ' + url);"
+ ],
+ [
+ 286,
+ "test('微信小程序: src 内的 & 不能被当成 top-level query 分隔符', () => {"
+ ],
+ [
+ 300,
+ "title: '表单',"
+ ],
+ [
+ 313,
+ "assert.ok(srcMatch, 'url 应含 src 参数');"
+ ],
+ [
+ 316,
+ "'src 段不能含裸 &,否则微信会把 src 内的 & 当成 top-level 分隔符: ' + url);"
+ ],
+ [
+ 318,
+ "'src 段必须含 %26(encode 后的 &): ' + url);"
+ ],
+ [
+ 323,
+ "assert.ok(keys.includes('name'), '应含 name: ' + url);"
+ ],
+ [
+ 324,
+ "assert.ok(keys.includes('title'), '应含 title: ' + url);"
+ ],
+ [
+ 325,
+ "assert.ok(keys.includes('wap_url'), '应含 wap_url: ' + url);"
+ ],
+ [
+ 326,
+ "assert.ok(keys.includes('enable_set_title'), '应含 enable_set_title: ' + url);"
+ ],
+ [
+ 327,
+ "assert.ok(keys.includes('parent'), '应含 parent: ' + url);"
+ ],
+ [
+ 328,
+ "assert.ok(keys.includes('src'), '应含 src: ' + url);"
+ ],
+ [
+ 329,
+ "assert.ok(keys.includes('page_params'), '应含 page_params: ' + url);"
+ ],
+ [
+ 331,
+ "assert.ok(!keys.includes('a'), 'src 内的 a 不能成为 top-level key: ' + url);"
+ ],
+ [
+ 332,
+ "assert.ok(!keys.includes('b'), 'src 内的 b 不能成为 top-level key: ' + url);"
+ ],
+ [
+ 333,
+ "assert.ok(!keys.includes('c'), 'src 内的 c 不能成为 top-level key: ' + url);"
+ ],
+ [
+ 336,
+ "test('微信小程序: 反引号 / 空格 / 中文都被正确 encode', () => {"
+ ],
+ [
+ 340,
+ "title: '`表单`',"
+ ],
+ [
+ 347,
+ "assert.equal(url.indexOf('=' + '`'), -1, 'url 不应有裸 =`,反引号应被 encode: ' + url);"
+ ],
+ [
+ 352,
+ "assert.ok(titleMatch, '应含 title');"
+ ],
+ [
+ 353,
+ "assert.equal(decodeURIComponent(titleMatch[1]), '`表单`', 'decode 后应还原原文');"
+ ],
+ [
+ 356,
+ "test('微信小程序: decode roundtrip 不导致双重编码', () => {"
+ ],
+ [
+ 373,
+ "assert.equal(decoded, '表单', 'decode 两次后应得原文,不应该是双重编码乱码');"
+ ]
+ ],
+ "pages_goods\\detail.vue": [
+ [
+ 2,
+ ""
+ ],
+ [
+ 12,
+ ""
+ ],
+ [
+ 14,
+ ""
+ ],
+ [
+ 98,
+ ""
+ ],
+ [
+ 101,
+ "开通{{ membercard.level_name }}仅需{{ membercard.member_price }}元"
+ ],
+ [
+ 102,
+ "立即开通"
+ ],
+ [
+ 107,
+ ""
+ ],
+ [
+ 131,
+ "- 套餐包含以下的服务及商品 -"
+ ],
+ [
+ 133,
+ "{{ goodsSkuDetail.card_info.card_type == 'commoncard' ? '卡项内项目/商品总的可用次数为' + goodsSkuDetail.card_info.common_num + ' ,' : '' }}"
+ ],
+ [
+ 134,
+ "{{ goodsSkuDetail.card_info.card_type == 'timecard' ? '次数不限 ,' : '' }} 有效期为{{"
+ ],
+ [
+ 135,
+ "(goodsSkuDetail.card_info.validity_type == 0 && '永久') ||"
+ ],
+ [
+ 136,
+ "(goodsSkuDetail.card_info.validity_type == 1 && goodsSkuDetail.card_info.validity_day + '天') ||"
+ ],
+ [
+ 154,
+ "{{ cardOff ? '收起' : '展开' }}"
+ ],
+ [
+ 159,
+ ""
+ ],
+ [
+ 169,
+ ""
+ ],
+ [
+ 172,
+ "领券"
+ ],
+ [
+ 178,
+ "? '满' + decimalPointFormat(item.at_least) + '减' + decimalPointFormat(item.money)"
+ ],
+ [
+ 179,
+ ": '无门槛使用' + decimalPointFormat(item.money)"
+ ],
+ [
+ 182,
+ "{{ '满' + decimalPointFormat(item.at_least) + '打' + parseFloat(item.discount)+'折' }}"
+ ],
+ [
+ 189,
+ "选择"
+ ],
+ [
+ 196,
+ "促销"
+ ],
+ [
+ 197,
+ "满减"
+ ],
+ [
+ 203,
+ ""
+ ],
+ [
+ 205,
+ ""
+ ],
+ [
+ 217,
+ ""
+ ],
+ [
+ 316,
+ ""
+ ],
+ [
+ 367,
+ ""
+ ],
+ [
+ 393,
+ ""
+ ],
+ [
+ 403,
+ "满减"
+ ],
+ [
+ 407,
+ "满送"
+ ],
+ [
+ 411,
+ "包邮"
+ ],
+ [
+ 416,
+ ""
+ ],
+ [
+ 445,
+ ""
+ ],
+ [
+ 447,
+ ""
+ ],
+ [
+ 479,
+ ""
+ ],
+ [
+ 531,
+ ""
+ ]
+ ],
+ "pages_goods\\_components\\goods-detail-view\\goods-detail-view.vue": [
+ [
+ 3,
+ ""
+ ],
+ [
+ 7,
+ ""
+ ],
+ [
+ 12,
+ ""
+ ],
+ [
+ 17,
+ ""
+ ],
+ [
+ 19,
+ ""
+ ],
+ [
+ 37,
+ ""
+ ],
+ [
+ 43,
+ ""
+ ],
+ [
+ 52,
+ ""
+ ],
+ [
+ 59,
+ ""
+ ],
+ [
+ 62,
+ ""
+ ],
+ [
+ 81,
+ ""
+ ],
+ [
+ 83,
+ "门店"
+ ],
+ [
+ 90,
+ "距离{{ globalStoreInfo.distance > 1 ? globalStoreInfo.distance + 'km' : globalStoreInfo.distanc"
+ ],
+ [
+ 124,
+ ""
+ ],
+ [
+ 126,
+ ""
+ ],
+ [
+ 130,
+ ""
+ ],
+ [
+ 132,
+ ""
+ ],
+ [
+ 134,
+ ""
+ ],
+ [
+ 153,
+ ""
+ ],
+ [
+ 177,
+ ""
+ ],
+ [
+ 210,
+ ""
+ ],
+ [
+ 247,
+ ""
+ ],
+ [
+ 250,
+ ""
+ ],
+ [
+ 262,
+ ""
+ ],
+ [
+ 266,
+ "添加社群"
+ ],
+ [
+ 271,
+ ""
+ ],
+ [
+ 278,
+ ""
+ ],
+ [
+ 281,
+ ""
+ ],
+ [
+ 338,
+ ""
+ ],
+ [
+ 363,
+ ""
+ ],
+ [
+ 376,
+ ""
+ ],
+ [
+ 392,
+ ""
+ ],
+ [
+ 409,
+ ""
+ ],
+ [
+ 414,
+ ""
+ ],
+ [
+ 434,
+ ""
+ ],
+ [
+ 482,
+ ""
+ ]
+ ],
+ "scripts\\open-directory.js": [
+ [
+ 24,
+ "console.warn(`❌ 路径:${targetPath} 不存在!!`)"
+ ],
+ [
+ 41,
+ "throw new Error(`路径不存在或无法访问: ${targetPath}`);"
+ ],
+ [
+ 51,
+ "console.log(`📁 在文件资源管理器中打开: ${normalizedPath}`);"
+ ],
+ [
+ 60,
+ "console.log('✅ 已启动文件资源管理器');"
+ ],
+ [
+ 63,
+ "console.warn('方法1失败:', error.message);"
+ ],
+ [
+ 70,
+ "console.log('✅ 已使用 start 命令打开');"
+ ],
+ [
+ 73,
+ "console.warn('方法2失败:', error.message);"
+ ],
+ [
+ 76,
+ "throw new Error('无法在Windows系统中打开目录');"
+ ],
+ [
+ 81,
+ "console.log(`📁 在访达中打开: ${directoryPath}`);"
+ ],
+ [
+ 87,
+ "console.log('✅ 已启动访达');"
+ ],
+ [
+ 90,
+ "console.warn('方法1失败:', error.message);"
+ ],
+ [
+ 97,
+ "console.log('✅ 已使用 open -R 命令打开');"
+ ],
+ [
+ 100,
+ "console.warn('方法2失败:', error.message);"
+ ],
+ [
+ 103,
+ "throw new Error('无法在macOS系统中打开目录');"
+ ],
+ [
+ 108,
+ "console.log(`📁 在文件管理器中打开: ${directoryPath}`);"
+ ],
+ [
+ 133,
+ "console.log(`✅ 已使用 ${manager} 打开目录`);"
+ ],
+ [
+ 150,
+ "console.log('✅ 已使用 xdg-open 打开目录');"
+ ],
+ [
+ 153,
+ "throw new Error('无法在Linux系统中打开目录,请确保已安装文件管理器');"
+ ],
+ [
+ 162,
+ "console.log(`💻 操作系统: ${os}`);"
+ ],
+ [
+ 163,
+ "console.log(`📂 目标目录: ${dirPath}`);"
+ ],
+ [
+ 166,
+ "throw new Error(`路径不存在: ${dirPath}`);"
+ ],
+ [
+ 177,
+ "throw new Error(`不支持的操作系统: ${process.platform}`);"
+ ],
+ [
+ 186,
+ "console.log(`🖥️ 在终端中打开目录: ${dirPath}`);"
+ ],
+ [
+ 189,
+ "throw new Error(`路径不存在: ${dirPath}`);"
+ ],
+ [
+ 193,
+ "windows: `start cmd /K \"cd /d \"${dirPath}\" && echo 当前目录: %cd%\"`,"
+ ],
+ [
+ 211,
+ "throw new Error('不支持的操作系统');"
+ ],
+ [
+ 224,
+ "console.log('✅ 已启动终端并切换到目录');"
+ ],
+ [
+ 227,
+ "console.warn('无法在终端中打开目录:', error.message);"
+ ],
+ [
+ 247,
+ "console.log(`📁 创建目录: ${dirPath}`);"
+ ],
+ [
+ 249,
+ "throw new Error(`路径不存在: ${filePath}`);"
+ ],
+ [
+ 263,
+ "console.error('❌ 打开目录失败:', error.message);"
+ ],
+ [
+ 272,
+ "console.log('当前文件:', currentFile);"
+ ],
+ [
+ 275,
+ "console.log('\\n--- 在文件管理器中打开 ---');"
+ ],
+ [
+ 282,
+ "console.log('\\n--- 在终端中打开 ---');"
+ ],
+ [
+ 297,
+ "console.error('错误:', error.message);"
+ ],
+ [
+ 312,
+ "console.error('错误:', error.message);"
+ ]
+ ],
+ "tests\\clean-param-urls.test.js": [
+ [
+ 43,
+ "test('cleanParamUrls: 基础 https URL 不变', () => {"
+ ],
+ [
+ 50,
+ "test('cleanParamUrls: 反引号 + 首尾空格被清', () => {"
+ ],
+ [
+ 57,
+ "test('cleanParamUrls: scheme 后多余斜杠被修补', () => {"
+ ],
+ [
+ 64,
+ "test('cleanParamUrls: \\\\t \\\\n \\\\r 也被清', () => {"
+ ],
+ [
+ 71,
+ "test('cleanParamUrls: http 和 https 都支持', () => {"
+ ],
+ [
+ 79,
+ "test('cleanParamUrls: 普通文本不变(name)', () => {"
+ ],
+ [
+ 83,
+ "test('cleanParamUrls: 中文文本不变(title)', () => {"
+ ],
+ [
+ 84,
+ "assert.equal(cleanParamUrls('表单'), '表单');"
+ ],
+ [
+ 87,
+ "test('cleanParamUrls: 含 :"
+ ],
+ [
+ 93,
+ "assert.ok(!result.includes(' '), '空格应被清');"
+ ],
+ [
+ 96,
+ "test('cleanParamUrls: 数字字符串不变', () => {"
+ ],
+ [
+ 103,
+ "test('cleanParamUrls: 嵌套对象里的 URL 被清', () => {"
+ ],
+ [
+ 113,
+ "test('cleanParamUrls: 普通文本字段不被误伤', () => {"
+ ],
+ [
+ 116,
+ "title: '表单',"
+ ],
+ [
+ 121,
+ "assert.equal(out.title, '表单');"
+ ],
+ [
+ 125,
+ "test('cleanParamUrls: 任意 key 名字都生效(不限定 keys)', () => {"
+ ],
+ [
+ 144,
+ "test('cleanParamUrls: 深层嵌套对象里的 URL 也被清', () => {"
+ ],
+ [
+ 158,
+ "test('cleanParamUrls: page_params 里的 URL 也被清', () => {"
+ ],
+ [
+ 177,
+ "test('cleanParamUrls: 数组里的 URL 被清', () => {"
+ ],
+ [
+ 185,
+ "test('cleanParamUrls: 数组里的对象(URL 字段)被清', () => {"
+ ],
+ [
+ 198,
+ "test('cleanParamUrls: null 原样返回', () => {"
+ ],
+ [
+ 202,
+ "test('cleanParamUrls: undefined 原样返回', () => {"
+ ],
+ [
+ 206,
+ "test('cleanParamUrls: 数字原样返回', () => {"
+ ],
+ [
+ 210,
+ "test('cleanParamUrls: 布尔原样返回', () => {"
+ ],
+ [
+ 215,
+ "test('cleanParamUrls: 空对象返回空对象', () => {"
+ ],
+ [
+ 219,
+ "test('cleanParamUrls: 空数组返回空数组', () => {"
+ ],
+ [
+ 223,
+ "test('cleanParamUrls: 数字 0 原样返回', () => {"
+ ],
+ [
+ 227,
+ "test('cleanParamUrls: enable_set_title=0 这种数字字段不变', () => {"
+ ],
+ [
+ 238,
+ "test('cleanParamUrls: 真实 param 场景,所有 URL 字段一次性清理', () => {"
+ ],
+ [
+ 241,
+ "title: '表单',"
+ ],
+ [
+ 251,
+ "assert.equal(out.title, '表单');"
+ ],
+ [
+ 273,
+ "test('cleanParamUrls: 不修改输入对象(返回新对象)', () => {"
+ ],
+ [
+ 276,
+ "name: '`表单`',"
+ ],
+ [
+ 280,
+ "assert.equal(JSON.stringify(input), inputStr, '原对象不应被修改');"
+ ]
+ ],
+ "tests\\diy-redirect-to.test.js": [
+ [
+ 85,
+ "test('端到端: 你提供的真实 link → diyRedirectTo 清理 → 跳转到 webview', () => {"
+ ],
+ [
+ 108,
+ "title: '表单',"
+ ],
+ [
+ 117,
+ "assert.equal(calls.navigateTo.length, 1, '应调一次 uni.navigateTo');"
+ ],
+ [
+ 122,
+ "'应跳到 webview: ' + url);"
+ ],
+ [
+ 125,
+ "assert.ok(!url.includes('`'), 'url 不应含反引号: ' + url);"
+ ],
+ [
+ 132,
+ "assert.ok(wapUrlMatch, 'url 应含 wap_url');"
+ ],
+ [
+ 134,
+ "assert.equal(wapUrl.indexOf('`'), -1, 'wap_url 不应含反引号: ' + wapUrl);"
+ ],
+ [
+ 135,
+ "assert.equal(wapUrl.indexOf(' '), -1, 'wap_url 不应含空格: ' + wapUrl);"
+ ],
+ [
+ 137,
+ "'wap_url 应以 https:"
+ ],
+ [
+ 141,
+ "assert.ok(srcMatch, 'url 应含 src');"
+ ],
+ [
+ 143,
+ "assert.equal(src.indexOf('`'), -1, 'src 不应含反引号: ' + src);"
+ ],
+ [
+ 148,
+ "assert.ok(pageParamsIdx > 0, 'url 应含 page_params');"
+ ],
+ [
+ 153,
+ "test('端到端: 普通文本字段(name/title/parent)保留原文,不被误伤', () => {"
+ ],
+ [
+ 168,
+ "title: '`表单`',"
+ ],
+ [
+ 175,
+ "assert.ok(url.includes('name=`bad`'), 'name 保留原文: ' + url);"
+ ],
+ [
+ 176,
+ "assert.ok(url.includes('title=`表单`'), 'title 保留原文: ' + url);"
+ ],
+ [
+ 180,
+ "assert.ok(wapUrlMatch, 'url 应含 wap_url');"
+ ],
+ [
+ 182,
+ "assert.equal(wapUrl.indexOf('`'), -1, 'wap_url 值不应含反引号: ' + wapUrl);"
+ ],
+ [
+ 183,
+ "assert.equal(wapUrl.indexOf(' '), -1, 'wap_url 值不应含空格: ' + wapUrl);"
+ ],
+ [
+ 185,
+ "'wap_url 应以 https:"
+ ],
+ [
+ 189,
+ "assert.ok(srcMatch, 'url 应含 src');"
+ ],
+ [
+ 195,
+ "'src 应以干净的 https:"
+ ],
+ [
+ 199,
+ "test('端到端: 多种空白(\\\\t\\\\n\\\\r) + 反引号都能被清', () => {"
+ ],
+ [
+ 218,
+ "assert.equal(url.indexOf('`'), -1, '反引号应被清');"
+ ],
+ [
+ 219,
+ "assert.equal(url.indexOf('\\t'), -1, '\\\\t 应被清');"
+ ],
+ [
+ 220,
+ "assert.equal(url.indexOf('\\n'), -1, '\\\\n 应被清');"
+ ],
+ [
+ 221,
+ "assert.equal(url.indexOf('\\r'), -1, '\\\\r 应被清');"
+ ],
+ [
+ 225,
+ "'src 应基于干净的 wap_url 拼出: ' + url);"
+ ],
+ [
+ 228,
+ "test('端到端: link 为空/null/undefined 不报错', () => {"
+ ],
+ [
+ 238,
+ "test('端到端: page_params 里的 URL 字段也被清理', () => {"
+ ],
+ [
+ 262,
+ "'顶层 src 应被清: ' + url);"
+ ],
+ [
+ 265,
+ "'page_params 里的 src 已被清(应该有 https:"
+ ],
+ [
+ 266,
+ "assert.ok(!url.match(/\"src\":\"`https/), 'page_params 里 src 不应再含反引号: ' + url);"
+ ]
+ ],
+ "pages_order\\_components\\common-payment\\common-payment.vue": [
+ [
+ 3,
+ ""
+ ],
+ [
+ 17,
+ ""
+ ],
+ [
+ 33,
+ ""
+ ],
+ [
+ 38,
+ ""
+ ],
+ [
+ 118,
+ ""
+ ],
+ [
+ 161,
+ ""
+ ],
+ [
+ 169,
+ ""
+ ],
+ [
+ 239,
+ ""
+ ],
+ [
+ 351,
+ "税费"
+ ],
+ [
+ 361,
+ "发票邮寄费"
+ ],
+ [
+ 393,
+ "会员卡"
+ ],
+ [
+ 415,
+ ""
+ ],
+ [
+ 424,
+ ""
+ ],
+ [
+ 448,
+ ""
+ ],
+ [
+ 489,
+ ""
+ ],
+ [
+ 511,
+ ""
+ ],
+ [
+ 566,
+ ""
+ ],
+ [
+ 583,
+ ""
+ ],
+ [
+ 628,
+ ""
+ ]
+ ],
+ "common\\js\\ai-service.js": [
+ [
+ 25,
+ "console.warn('读取会话ID失败:', e);"
+ ],
+ [
+ 141,
+ "console.log('[AI WS] 流结束信号, event:', data.event, 'type:', data.type, 'conversationId:', conversationId, '当前内存:', currentConversationId);"
+ ],
+ [
+ 148,
+ "console.log('[AI WS] 会话ID已持久化到 storage:', conversationId);"
+ ],
+ [
+ 150,
+ "console.error('保存会话ID失败:', e);"
+ ],
+ [
+ 163,
+ "console.log('[AI WS] 未识别的消息:', JSON.stringify(data).substring(0, 200));"
+ ],
+ [
+ 166,
+ "console.error('WebSocket 消息解析失败:', e, '原始数据:', res.data);"
+ ],
+ [
+ 171,
+ "console.error('WebSocket 连接失败:', err);"
+ ],
+ [
+ 180,
+ "console.warn('WebSocket 连接已关闭');"
+ ],
+ [
+ 255,
+ "console.error('[AI Service] AiChat API请求失败,详细错误:', error);"
+ ],
+ [
+ 256,
+ "console.error('[AI Service] 错误堆栈:', error.stack);"
+ ],
+ [
+ 258,
+ "console.error('[AI Service] store 状态:', {"
+ ],
+ [
+ 366,
+ "console.log('[AI SSE] 收到完成信号:', data.event, 'conversationId:', cid);"
+ ],
+ [
+ 370,
+ "console.warn('解析失败:', e, line);"
+ ],
+ [
+ 396,
+ "console.warn('最后 buffer 解析失败:', e);"
+ ],
+ [
+ 400,
+ "console.log('[AI SSE] 流完成, conversationId:', conversationId, 'content长度:', content.length);"
+ ],
+ [
+ 406,
+ "console.error('H5 流式请求失败:', error);"
+ ],
+ [
+ 438,
+ "console.error('保存会话ID失败:', e);"
+ ],
+ [
+ 449,
+ "console.error('清除会话ID失败:', e);"
+ ],
+ [
+ 538,
+ "console.error('清除会话失败:', error);"
+ ],
+ [
+ 549,
+ "console.log('[AI History] 请求历史, conversation_id:', params.conversation_id, 'limit:', params.limit);"
+ ],
+ [
+ 580,
+ "console.error('获取会话历史失败:', error);"
+ ],
+ [
+ 625,
+ "console.error('解析消息失败:', error);"
+ ],
+ [
+ 629,
+ "console.error('EventSource错误:', error);"
+ ],
+ [
+ 635,
+ "console.error('创建EventSource失败:', error);"
+ ],
+ [
+ 641,
+ "console.warn('chatWithEventSource 不支持微信小程序');"
+ ],
+ [
+ 655,
+ "console.warn('chatWithFetchStream 不支持微信小程序');"
+ ]
+ ],
+ "pages_promotion\\fenxiao\\index.vue": [
+ [
+ 6,
+ ""
+ ],
+ [
+ 27,
+ "推广规则"
+ ],
+ [
+ 33,
+ "{{ info.level_num > 0 ? info.level_name : '等级未解锁' }}"
+ ],
+ [
+ 34,
+ "下单、邀请好友均可提升等级"
+ ],
+ [
+ 36,
+ "做任务"
+ ],
+ [
+ 55,
+ "总{{ fenxiaoWords.account }}"
+ ],
+ [
+ 59,
+ "已提现{{ fenxiaoWords.account }}"
+ ],
+ [
+ 85,
+ ""
+ ],
+ [
+ 133,
+ "邀请好友"
+ ],
+ [
+ 134,
+ "邀好友赚好礼"
+ ],
+ [
+ 142,
+ "账单报表"
+ ],
+ [
+ 143,
+ "{{ fenxiaoWords.account }}变更明细"
+ ],
+ [
+ 151,
+ "{{ fenxiaoWords.concept }}商品"
+ ],
+ [
+ 152,
+ "{{ fenxiaoWords.concept }}商品"
+ ],
+ [
+ 161,
+ "{{ fenxiaoWords.account }}排行"
+ ],
+ [
+ 162,
+ "您的排名为第{{ profitRanking }}位"
+ ],
+ [
+ 171,
+ "推广人排行"
+ ],
+ [
+ 172,
+ "您的排名为{{ invitedNumRanking }}位"
+ ],
+ [
+ 180,
+ "等级说明"
+ ],
+ [
+ 181,
+ "{{ fenxiaoWords.concept }}等级说明"
+ ],
+ [
+ 193,
+ "我的粉丝"
+ ],
+ [
+ 194,
+ "{{ teamNum.num }}人"
+ ],
+ [
+ 205,
+ "{{ teamNum.fenxiao_num }}人"
+ ],
+ [
+ 260,
+ ""
+ ]
+ ],
+ "pages_promotion\\merch\\detail.vue": [
+ [
+ 4,
+ ""
+ ],
+ [
+ 41,
+ ""
+ ],
+ [
+ 123,
+ ""
+ ],
+ [
+ 132,
+ ""
+ ],
+ [
+ 141,
+ ""
+ ],
+ [
+ 153,
+ ""
+ ],
+ [
+ 213,
+ ""
+ ],
+ [
+ 222,
+ ""
+ ],
+ [
+ 231,
+ ""
+ ],
+ [
+ 243,
+ ""
+ ],
+ [
+ 263,
+ ""
+ ],
+ [
+ 267,
+ ""
+ ],
+ [
+ 269,
+ "是否包邮"
+ ],
+ [
+ 271,
+ ""
+ ],
+ [
+ 275,
+ ""
+ ],
+ [
+ 277,
+ "价格区间(元)"
+ ],
+ [
+ 279,
+ ""
+ ],
+ [
+ 281,
+ ""
+ ],
+ [
+ 285,
+ ""
+ ],
+ [
+ 287,
+ "品牌"
+ ],
+ [
+ 295,
+ ""
+ ],
+ [
+ 318,
+ ""
+ ]
+ ],
+ "components-diy\\diy-tab.vue": [
+ [
+ 2,
+ ""
+ ],
+ [
+ 5,
+ ""
+ ],
+ [
+ 7,
+ ""
+ ],
+ [
+ 18,
+ ""
+ ],
+ [
+ 31,
+ ""
+ ],
+ [
+ 39,
+ ""
+ ],
+ [
+ 47,
+ ""
+ ],
+ [
+ 49,
+ ""
+ ],
+ [
+ 57,
+ ""
+ ],
+ [
+ 63,
+ ""
+ ],
+ [
+ 76,
+ ""
+ ],
+ [
+ 88,
+ ""
+ ],
+ [
+ 91,
+ ""
+ ],
+ [
+ 102,
+ ""
+ ],
+ [
+ 115,
+ ""
+ ],
+ [
+ 123,
+ ""
+ ],
+ [
+ 132,
+ ""
+ ],
+ [
+ 135,
+ ""
+ ],
+ [
+ 143,
+ ""
+ ],
+ [
+ 150,
+ ""
+ ],
+ [
+ 163,
+ ""
+ ]
+ ],
+ "tests\\mp-share-default.test.js": [
+ [
+ 106,
+ "test('黑名单包含 webview 页面', () => {"
+ ],
+ [
+ 110,
+ "test('黑名单不包含普通商品详情页', () => {"
+ ],
+ [
+ 118,
+ "test('_isCurrentPageDisabled: 当前页是 webview 时返回 true', () => {"
+ ],
+ [
+ 123,
+ "test('_isCurrentPageDisabled: 当前页是其他页时返回 false', () => {"
+ ],
+ [
+ 128,
+ "test('_isCurrentPageDisabled: 当前页带前导 / 时也认得', () => {"
+ ],
+ [
+ 134,
+ "test('_isCurrentPageDisabled: getCurrentPages 返回空时不报错', () => {"
+ ],
+ [
+ 139,
+ "test('_isCurrentPageDisabled: getCurrentPages 不存在时不报错', () => {"
+ ],
+ [
+ 147,
+ "test('mixin: 命中禁用列表时 onLoad 调 wx.hideShareMenu', () => {"
+ ],
+ [
+ 153,
+ "assert.equal(_wxCalls.length, 1, '应该调了一次 hideShareMenu');"
+ ],
+ [
+ 158,
+ "test('mixin: 命中禁用列表时 onLoad 不调网络', () => {"
+ ],
+ [
+ 164,
+ "assert.equal(ctx.__networkCalled, undefined, '不应触发网络拉取');"
+ ],
+ [
+ 167,
+ "test('mixin: 非命中页面 onLoad 调网络(且不调 hideShareMenu)', () => {"
+ ],
+ [
+ 173,
+ "assert.equal(ctx.__networkCalled, true, '应触发网络拉取');"
+ ],
+ [
+ 174,
+ "assert.equal(_wxCalls.length, 0, '不应调 hideShareMenu');"
+ ],
+ [
+ 177,
+ "test('mixin: 命中禁用列表时 onShow 不调网络', () => {"
+ ],
+ [
+ 186,
+ "test('mixin: 命中禁用列表时 onShareAppMessage 返回 undefined', () => {"
+ ],
+ [
+ 193,
+ "test('mixin: 命中禁用列表时 onShareTimeline 返回 undefined', () => {"
+ ],
+ [
+ 200,
+ "test('mixin: 非命中页面 onShareAppMessage 返回正常分享对象', () => {"
+ ],
+ [
+ 210,
+ "test('_hideShareMenu: wx.hideShareMenu 不存在时静默', () => {"
+ ],
+ [
+ 216,
+ "test('_hideShareMenu: menus 参数不支持时降级到无参', () => {"
+ ],
+ [
+ 228,
+ "assert.equal(secondCall, undefined, '应降级到无参调用');"
+ ]
+ ],
+ "docs\\example\\wechat-channel-demo.vue": [
+ [
+ 4,
+ "微信视频号集成示例"
+ ],
+ [
+ 8,
+ "单个视频号"
+ ],
+ [
+ 13,
+ "视频号列表"
+ ],
+ [
+ 18,
+ "使用说明"
+ ],
+ [
+ 20,
+ "1. 确保微信小程序已开通视频号权限"
+ ],
+ [
+ 21,
+ "2. 小程序需与视频号关联"
+ ],
+ [
+ 22,
+ "3. 传递正确的feedId用于播放视频"
+ ],
+ [
+ 23,
+ "4. 仅支持微信小程序环境"
+ ],
+ [
+ 43,
+ "channelName: \"示例视频号\","
+ ],
+ [
+ 45,
+ "videoTitle: \"这是一个示例视频,展示如何使用微信视频号组件\","
+ ],
+ [
+ 58,
+ "channelName: \"示例视频号1\","
+ ],
+ [
+ 60,
+ "videoTitle: \"这是示例视频1,展示如何使用微信视频号组件\","
+ ],
+ [
+ 65,
+ "channelName: \"示例视频号2\","
+ ],
+ [
+ 67,
+ "videoTitle: \"这是示例视频2,展示如何使用微信视频号组件\","
+ ],
+ [
+ 72,
+ "channelName: \"示例视频号3\","
+ ],
+ [
+ 74,
+ "videoTitle: \"这是示例视频3,展示如何使用微信视频号组件\","
+ ],
+ [
+ 79,
+ "channelName: \"示例视频号4\","
+ ],
+ [
+ 81,
+ "videoTitle: \"这是示例视频4,展示如何使用微信视频号组件\","
+ ],
+ [
+ 101,
+ "console.log('微信视频号示例页面加载');"
+ ]
+ ],
+ "pages_tool\\member\\info.vue": [
+ [
+ 4,
+ ""
+ ],
+ [
+ 12,
+ ""
+ ],
+ [
+ 14,
+ "账号"
+ ],
+ [
+ 18,
+ ""
+ ],
+ [
+ 23,
+ ""
+ ],
+ [
+ 29,
+ ""
+ ],
+ [
+ 35,
+ ""
+ ],
+ [
+ 41,
+ ""
+ ],
+ [
+ 47,
+ ""
+ ],
+ [
+ 54,
+ ""
+ ],
+ [
+ 56,
+ "密码"
+ ],
+ [
+ 59,
+ ""
+ ],
+ [
+ 66,
+ "所在地址"
+ ],
+ [
+ 69,
+ "去设置"
+ ],
+ [
+ 73,
+ ""
+ ],
+ [
+ 79,
+ "注销账号"
+ ],
+ [
+ 83,
+ "版本号"
+ ],
+ [
+ 87,
+ ""
+ ],
+ [
+ 93,
+ ""
+ ]
+ ],
+ "common\\js\\customer-service.js": [
+ [
+ 88,
+ "result.warnings.push('企业微信未启用');"
+ ],
+ [
+ 91,
+ "result.warnings.push('企业微信活码链接未配置');"
+ ],
+ [
+ 113,
+ "console.error('跳转 AI智能客服失败:', err);"
+ ],
+ [
+ 122,
+ "console.error('跳转 AI智能客服异常:', e);"
+ ],
+ [
+ 131,
+ "console.error('客服配置验证失败:', validation.errors);"
+ ],
+ [
+ 137,
+ "console.warn('客服配置警告:', validation.warnings);"
+ ],
+ [
+ 173,
+ "console.error('【未知客服类型】', config.type);"
+ ],
+ [
+ 192,
+ "console.error('跳转企业微信失败:', err);"
+ ],
+ [
+ 199,
+ "console.error('企业微信配置不完整,缺少 wxwork_url 或 corpid');"
+ ],
+ [
+ 243,
+ "console.error('【跳转第三方小程序失败】', err);"
+ ],
+ [
+ 268,
+ "console.error('【第三方客服配置不完整】缺少 mini_app_id 或 third_url');"
+ ],
+ [
+ 505,
+ "console.error('跳转 AI智能客服失败:', err);"
+ ],
+ [
+ 513,
+ "console.error('跳转 AI智能客服异常:', e);"
+ ],
+ [
+ 562,
+ "console.error('客服配置无效:', validation.errors);"
+ ],
+ [
+ 568,
+ "console.warn('客服配置警告:', validation.warnings);"
+ ],
+ [
+ 579,
+ "console.warn('企业微信配置不完整,使用原生客服');"
+ ],
+ [
+ 586,
+ "console.error('企业微信链接未配置');"
+ ],
+ [
+ 600,
+ "console.error('客服处理失败:', error);"
+ ]
+ ],
+ "components-diy\\diy-member-info.vue": [
+ [
+ 3,
+ ""
+ ],
+ [
+ 110,
+ "超级会员"
+ ],
+ [
+ 113,
+ "查看特权"
+ ],
+ [
+ 114,
+ "会员可享更多权益"
+ ],
+ [
+ 121,
+ "开通可享更多权益"
+ ],
+ [
+ 124,
+ "查看特权"
+ ],
+ [
+ 125,
+ "立即开通"
+ ],
+ [
+ 134,
+ "开通可享更多权益"
+ ],
+ [
+ 137,
+ "查看更多权益"
+ ],
+ [
+ 138,
+ "立即开通"
+ ],
+ [
+ 146,
+ "余额"
+ ],
+ [
+ 152,
+ "积分"
+ ],
+ [
+ 159,
+ "优惠券"
+ ],
+ [
+ 164,
+ "余额充值"
+ ],
+ [
+ 192,
+ ""
+ ],
+ [
+ 403,
+ "if (this.nickName == '微信用户') {"
+ ],
+ [
+ 426,
+ "if (this.nickName == '微信用户') {"
+ ]
+ ],
+ "pages_tool\\recharge\\list.vue": [
+ [
+ 5,
+ ""
+ ],
+ [
+ 100,
+ ""
+ ]
+ ],
+ "components\\hover-nav\\hover-nav.vue": [
+ [
+ 2,
+ ""
+ ],
+ [
+ 12,
+ ""
+ ],
+ [
+ 21,
+ ""
+ ],
+ [
+ 31,
+ ""
+ ],
+ [
+ 49,
+ ""
+ ],
+ [
+ 67,
+ ""
+ ],
+ [
+ 77,
+ ""
+ ],
+ [
+ 89,
+ ""
+ ],
+ [
+ 441,
+ "fail: () => { console.warn('[hover-nav] 未获取到 shopInfo,使用默认设置'); }"
+ ],
+ [
+ 445,
+ "console.warn('[hover-nav] 读取 shopInfo 异常:', e);"
+ ],
+ [
+ 533,
+ "console.warn('[hover-nav] 读取 CSS 变量失败,使用 fallback 默认值:', e);"
+ ],
+ [
+ 633,
+ "console.warn('[hover-nav] 切换语言失败:langList 为空');"
+ ],
+ [
+ 640,
+ "console.warn('[hover-nav] 切换语言失败:目标语种为空', this.langIndexMap, this.currentLangIndex);"
+ ],
+ [
+ 678,
+ "console.warn('[hover-nav] selectLanguage 越界:', idx, this.langList);"
+ ],
+ [
+ 708,
+ "sendMessageTitle: '来自悬浮按钮的咨询',"
+ ]
+ ],
+ "pages_goods\\list.vue": [
+ [
+ 4,
+ ""
+ ],
+ [
+ 15,
+ ""
+ ],
+ [
+ 152,
+ ""
+ ],
+ [
+ 156,
+ ""
+ ],
+ [
+ 158,
+ "是否包邮"
+ ],
+ [
+ 160,
+ ""
+ ],
+ [
+ 164,
+ ""
+ ],
+ [
+ 166,
+ "价格区间(元)"
+ ],
+ [
+ 168,
+ ""
+ ],
+ [
+ 170,
+ ""
+ ],
+ [
+ 174,
+ ""
+ ],
+ [
+ 176,
+ "品牌"
+ ],
+ [
+ 184,
+ ""
+ ],
+ [
+ 207,
+ ""
+ ],
+ [
+ 210,
+ ""
+ ]
+ ],
+ "pages_promotion\\merch\\list.vue": [
+ [
+ 4,
+ ""
+ ],
+ [
+ 15,
+ ""
+ ],
+ [
+ 89,
+ ""
+ ],
+ [
+ 98,
+ ""
+ ],
+ [
+ 107,
+ ""
+ ],
+ [
+ 119,
+ ""
+ ],
+ [
+ 179,
+ ""
+ ],
+ [
+ 188,
+ ""
+ ],
+ [
+ 197,
+ ""
+ ],
+ [
+ 209,
+ ""
+ ],
+ [
+ 229,
+ ""
+ ],
+ [
+ 233,
+ ""
+ ],
+ [
+ 256,
+ ""
+ ],
+ [
+ 259,
+ ""
+ ]
+ ],
+ "common\\js\\platform.js": [
+ [
+ 140,
+ "? _t('common.platform.wechatOfficialAccount', '微信公众号')"
+ ],
+ [
+ 147,
+ "weapp: _t('common.platform.wechatMiniProgram', '微信小程序'),"
+ ],
+ [
+ 148,
+ "alipay: _t('common.platform.alipayMiniProgram', '支付宝小程序'),"
+ ],
+ [
+ 149,
+ "baidu: _t('common.platform.baiduMiniProgram', '百度小程序'),"
+ ],
+ [
+ 150,
+ "toutiao: _t('common.platform.toutiaoMiniProgram', '头条小程序'),"
+ ],
+ [
+ 151,
+ "qq: _t('common.platform.qqMiniProgram', 'QQ小程序'),"
+ ],
+ [
+ 152,
+ "kuaishou: _t('common.platform.kuaishouMiniProgram', '快手小程序'),"
+ ],
+ [
+ 153,
+ "jd: _t('common.platform.jdMiniProgram', '京东小程序'),"
+ ],
+ [
+ 154,
+ "'360': _t('common.platform.miniProgram360', '360小程序'),"
+ ],
+ [
+ 155,
+ "xhs: _t('common.platform.xhsMiniProgram', '小红书小程序'),"
+ ],
+ [
+ 156,
+ "harmony: _t('common.platform.harmonyService', '鸿蒙元服务'),"
+ ],
+ [
+ 158,
+ "pc: _t('common.platform.pc', 'PC端'),"
+ ],
+ [
+ 161,
+ "cachedAppTypeName = platformNameMap[platform] || _t('common.platform.unknown', '未知平台');"
+ ]
+ ],
+ "uni_modules\\mp-html\\components\\mp-html\\node\\node.vue": [
+ [
+ 4,
+ ""
+ ],
+ [
+ 5,
+ ""
+ ],
+ [
+ 7,
+ ""
+ ],
+ [
+ 12,
+ ""
+ ],
+ [
+ 27,
+ ""
+ ],
+ [
+ 35,
+ ""
+ ],
+ [
+ 39,
+ ""
+ ],
+ [
+ 51,
+ ""
+ ],
+ [
+ 71,
+ ""
+ ],
+ [
+ 78,
+ ""
+ ],
+ [
+ 290,
+ "itemList: ['保存图片'],"
+ ],
+ [
+ 297,
+ "title: '保存成功'"
+ ],
+ [
+ 369,
+ "title: '链接已复制'"
+ ]
+ ],
+ "components\\yuyue-date\\yuyue-date.vue": [
+ [
+ 6,
+ "选择时间"
+ ],
+ [
+ 11,
+ ""
+ ],
+ [
+ 29,
+ ""
+ ],
+ [
+ 42,
+ ""
+ ],
+ [
+ 57,
+ "预约时间:"
+ ],
+ [
+ 60,
+ ""
+ ],
+ [
+ 63,
+ ""
+ ],
+ [
+ 103,
+ "default: '已约满'"
+ ],
+ [
+ 108,
+ "default: '可预约'"
+ ],
+ [
+ 192,
+ "return this.disableText && this.disableText !== '已约满'"
+ ],
+ [
+ 197,
+ "return this.undisableText && this.undisableText !== '可预约'"
+ ],
+ [
+ 216,
+ "return ['周日', '周一', '周二', '周三', '周四', '周五', '周六'];"
+ ]
+ ],
+ "components-diy\\diy-form.vue": [
+ [
+ 4,
+ ""
+ ],
+ [
+ 12,
+ ""
+ ],
+ [
+ 14,
+ ""
+ ],
+ [
+ 22,
+ ""
+ ],
+ [
+ 149,
+ "return this.mergedFormConfig.submitText || '提交';"
+ ],
+ [
+ 306,
+ "form_name: this.value.form_name || '默认表单'"
+ ],
+ [
+ 311,
+ "title: '提交成功',"
+ ],
+ [
+ 320,
+ "title: res.message || '提交失败',"
+ ]
+ ],
+ "scripts\\test-gate.js": [
+ [
+ 23,
+ "console.error('[test-gate] 需要 node 18+(自带 --test),当前 node 版本:', process.version);"
+ ],
+ [
+ 29,
+ "console.log('\\n[test-gate] === 运行测试文件:', path.relative(ROOT, testFile), '===');"
+ ],
+ [
+ 46,
+ "console.error('[test-gate] tests/ 下没有任何 *.test.js 文件');"
+ ],
+ [
+ 50,
+ "console.log('[test-gate] 找到', files.length, '个测试文件');"
+ ],
+ [
+ 55,
+ "console.log('\\n[test-gate] =============== 汇总 ===============');"
+ ],
+ [
+ 56,
+ "console.log(' 总数:', results.length);"
+ ],
+ [
+ 57,
+ "console.log(' 通过:', results.length - failed.length);"
+ ],
+ [
+ 58,
+ "console.log(' 失败:', failed.length);"
+ ],
+ [
+ 60,
+ "console.log(' 失败文件:');"
+ ],
+ [
+ 62,
+ "console.log(' -', r.file, '(退出码', r.status + ')');"
+ ],
+ [
+ 64,
+ "console.log('\\n[test-gate] ❌ 测试未全部通过,不允许继续');"
+ ],
+ [
+ 67,
+ "console.log('\\n[test-gate] ✅ 全部测试通过');"
+ ]
+ ],
+ "components\\ns-newform\\ns-newform.vue": [
+ [
+ 4,
+ ""
+ ],
+ [
+ 22,
+ ""
+ ],
+ [
+ 39,
+ ""
+ ],
+ [
+ 60,
+ ""
+ ],
+ [
+ 88,
+ ""
+ ],
+ [
+ 116,
+ ""
+ ],
+ [
+ 135,
+ ""
+ ],
+ [
+ 157,
+ ""
+ ],
+ [
+ 196,
+ ""
+ ],
+ [
+ 218,
+ ""
+ ],
+ [
+ 257,
+ ""
+ ]
+ ],
+ "pages_promotion\\point\\list.vue": [
+ [
+ 50,
+ "活动规则"
+ ],
+ [
+ 55,
+ "储值赚积分"
+ ],
+ [
+ 59,
+ "兑换记录"
+ ],
+ [
+ 63,
+ "积分抽奖"
+ ],
+ [
+ 67,
+ "积分明细"
+ ],
+ [
+ 228,
+ ""
+ ],
+ [
+ 255,
+ ""
+ ],
+ [
+ 258,
+ ""
+ ],
+ [
+ 275,
+ "name: '积分换好物'"
+ ],
+ [
+ 279,
+ "name: '积分换券'"
+ ],
+ [
+ 283,
+ "name: '积分换红包'"
+ ]
+ ],
+ "scripts\\i18n-check.js": [
+ [
+ 47,
+ "if (trimmed.startsWith(' "
+ ],
+ [
+ 175,
+ "console.log(` 扫描文件数: ${srcFiles.length}`);"
+ ],
+ [
+ 176,
+ "console.log(` 含中文的文件数: ${hardcodeResults.length}`);"
+ ],
+ [
+ 177,
+ "console.log(` 中文字符串命中数: ${totalCnHits}`);"
+ ],
+ [
+ 180,
+ "console.log(`\\n ⚠️ 疑似硬编码中文 TOP 20:`);"
+ ],
+ [
+ 186,
+ "console.log(` ... 还有 ${hardcodeResults.length - 20} 个文件`);"
+ ],
+ [
+ 188,
+ "console.log(`\\n 💡 提示:这是粗略扫描,包含注释/默认值等误报,仅供参考`);"
+ ],
+ [
+ 190,
+ "console.log(' ✅ 未发现硬编码中文(粗略扫描)');"
+ ],
+ [
+ 195,
+ "console.log(' 检查完成');"
+ ],
+ [
+ 200,
+ "console.log('\\n ❌ 存在差异,请修复后再提交');"
+ ],
+ [
+ 203,
+ "console.log('\\n ✅ 全部通过');"
+ ]
+ ],
+ "pages_order\\detail.vue": [
+ [
+ 3,
+ ""
+ ],
+ [
+ 27,
+ ""
+ ],
+ [
+ 59,
+ ""
+ ],
+ [
+ 122,
+ ""
+ ],
+ [
+ 205,
+ ""
+ ],
+ [
+ 334,
+ ""
+ ],
+ [
+ 339,
+ "联系客服"
+ ],
+ [
+ 480,
+ ""
+ ],
+ [
+ 619,
+ ""
+ ],
+ [
+ 625,
+ ""
+ ]
+ ],
+ "pages_promotion\\point\\payment.vue": [
+ [
+ 18,
+ ""
+ ],
+ [
+ 20,
+ ""
+ ],
+ [
+ 29,
+ ""
+ ],
+ [
+ 78,
+ ""
+ ],
+ [
+ 146,
+ ""
+ ],
+ [
+ 161,
+ ""
+ ],
+ [
+ 214,
+ ""
+ ],
+ [
+ 263,
+ ""
+ ],
+ [
+ 304,
+ ""
+ ],
+ [
+ 310,
+ ""
+ ]
+ ],
+ "uni_modules\\uni-calendar\\components\\uni-calendar\\uni-calendar.vue": [
+ [
+ 6,
+ ""
+ ],
+ [
+ 7,
+ ""
+ ],
+ [
+ 15,
+ ""
+ ],
+ [
+ 27,
+ "日"
+ ],
+ [
+ 28,
+ "一"
+ ],
+ [
+ 29,
+ "二"
+ ],
+ [
+ 30,
+ "三"
+ ],
+ [
+ 31,
+ "四"
+ ],
+ [
+ 32,
+ "五"
+ ],
+ [
+ 33,
+ "六"
+ ]
+ ],
+ "components-diy\\diy-category.vue": [
+ [
+ 12,
+ "商品分类"
+ ],
+ [
+ 15,
+ ""
+ ],
+ [
+ 80,
+ ""
+ ],
+ [
+ 109,
+ ""
+ ],
+ [
+ 163,
+ "总计:"
+ ],
+ [
+ 169,
+ ""
+ ]
+ ],
+ "pages\\index\\index.vue": [
+ [
+ 5,
+ ""
+ ],
+ [
+ 8,
+ "{{ diyLoadErrorMsg || '网络异常,请稍后重试' }}"
+ ],
+ [
+ 61,
+ "跳过"
+ ],
+ [
+ 93,
+ ""
+ ],
+ [
+ 98,
+ ""
+ ],
+ [
+ 109,
+ ""
+ ],
+ [
+ 118,
+ ""
+ ],
+ [
+ 154,
+ ""
+ ],
+ [
+ 158,
+ ""
+ ]
+ ],
+ "pages_promotion\\point\\detail.vue": [
+ [
+ 78,
+ ""
+ ],
+ [
+ 90,
+ ""
+ ],
+ [
+ 109,
+ ""
+ ],
+ [
+ 112,
+ ""
+ ],
+ [
+ 135,
+ ""
+ ],
+ [
+ 155,
+ ""
+ ],
+ [
+ 180,
+ ""
+ ],
+ [
+ 196,
+ ""
+ ],
+ [
+ 219,
+ ""
+ ]
+ ],
+ "pages_tool\\contact\\contact.vue": [
+ [
+ 7,
+ ""
+ ],
+ [
+ 39,
+ ""
+ ],
+ [
+ 74,
+ ""
+ ],
+ [
+ 91,
+ ""
+ ],
+ [
+ 107,
+ ""
+ ],
+ [
+ 120,
+ ""
+ ],
+ [
+ 134,
+ ""
+ ],
+ [
+ 165,
+ ""
+ ],
+ [
+ 184,
+ ""
+ ]
+ ],
+ "components-diy\\diy-article.vue": [
+ [
+ 4,
+ ""
+ ],
+ [
+ 6,
+ ""
+ ],
+ [
+ 21,
+ ""
+ ],
+ [
+ 55,
+ ""
+ ],
+ [
+ 90,
+ ""
+ ]
+ ],
+ "components-diy\\diy-category-item.vue": [
+ [
+ 80,
+ ""
+ ],
+ [
+ 114,
+ ""
+ ],
+ [
+ 118,
+ ""
+ ],
+ [
+ 168,
+ "立即购买"
+ ],
+ [
+ 172,
+ "选规格"
+ ],
+ [
+ 194,
+ "立即购买"
+ ],
+ [
+ 203,
+ ""
+ ],
+ [
+ 11,
+ ""
+ ],
+ [
+ 21,
+ ""
+ ],
+ [
+ 24,
+ ""
+ ],
+ [
+ 32,
+ ""
+ ],
+ [
+ 42,
+ ""
+ ],
+ [
+ 208,
+ "title: '视频号仅支持在微信小程序环境中播放',"
+ ],
+ [
+ 218,
+ "console.error('打开视频号失败', err);"
+ ]
+ ],
+ "pages_promotion\\point\\goods_list.vue": [
+ [
+ 4,
+ ""
+ ],
+ [
+ 14,
+ ""
+ ],
+ [
+ 78,
+ ""
+ ],
+ [
+ 92,
+ ""
+ ],
+ [
+ 96,
+ ""
+ ],
+ [
+ 107,
+ ""
+ ],
+ [
+ 128,
+ ""
+ ],
+ [
+ 131,
+ ""
+ ]
+ ],
+ "pages_tool\\member\\info_edit.vue": [
+ [
+ 4,
+ ""
+ ],
+ [
+ 15,
+ ""
+ ],
+ [
+ 25,
+ ""
+ ],
+ [
+ 35,
+ ""
+ ],
+ [
+ 52,
+ ""
+ ],
+ [
+ 64,
+ ""
+ ],
+ [
+ 108,
+ ""
+ ],
+ [
+ 128,
+ ""
+ ]
+ ],
+ "scripts\\fix-longpress-syntax.js": [
+ [
+ 56,
+ "console.log(`✓ 已修复: ${filePath}`)"
+ ],
+ [
+ 84,
+ "console.error(`✗ 无法读取目录: ${dir}`)"
+ ],
+ [
+ 92,
+ "console.log('开始修复 show-menu-by-longpress 语法...\\n')"
+ ],
+ [
+ 104,
+ "console.log(`\\n修复完成!`)"
+ ],
+ [
+ 105,
+ "console.log(`总共扫描: ${totalFiles} 个文件`)"
+ ],
+ [
+ 106,
+ "console.log(`成功修复: ${fixedFiles} 个文件`)"
+ ],
+ [
+ 107,
+ "console.log(`\\n正确的用法:`);"
+ ],
+ [
+ 109,
+ "console.log(` (如果需要动态控制)`);"
+ ]
+ ],
+ "components\\mescroll\\mescroll-body.vue": [
+ [
+ 11,
+ ""
+ ],
+ [
+ 20,
+ ""
+ ],
+ [
+ 23,
+ ""
+ ],
+ [
+ 26,
+ ""
+ ],
+ [
+ 29,
+ ""
+ ],
+ [
+ 34,
+ ""
+ ],
+ [
+ 39,
+ ""
+ ]
+ ],
+ "components\\mescroll\\mescroll-uni.vue": [
+ [
+ 20,
+ ""
+ ],
+ [
+ 29,
+ ""
+ ],
+ [
+ 32,
+ ""
+ ],
+ [
+ 35,
+ ""
+ ],
+ [
+ 38,
+ ""
+ ],
+ [
+ 44,
+ ""
+ ],
+ [
+ 50,
+ ""
+ ]
+ ],
+ "components-diy\\diy-channel-video.vue": [
+ [
+ 3,
+ ""
+ ],
+ [
+ 8,
+ ""
+ ],
+ [
+ 16,
+ ""
+ ],
+ [
+ 19,
+ ""
+ ],
+ [
+ 24,
+ ""
+ ],
+ [
+ 36,
+ ""
+ ],
+ [
+ 39,
+ ""
+ ]
+ ],
+ "pages_order\\detail_point.vue": [
+ [
+ 3,
+ ""
+ ],
+ [
+ 21,
+ ""
+ ],
+ [
+ 58,
+ ""
+ ],
+ [
+ 85,
+ ""
+ ],
+ [
+ 90,
+ "联系客服"
+ ],
+ [
+ 96,
+ ""
+ ],
+ [
+ 133,
+ ""
+ ]
+ ],
+ "pages_tool\\member\\point.vue": [
+ [
+ 53,
+ "做任务赚积分"
+ ],
+ [
+ 57,
+ "每日签到"
+ ],
+ [
+ 58,
+ "连续签到可获得更多积分"
+ ],
+ [
+ 60,
+ "去签到"
+ ],
+ [
+ 65,
+ "购买商品"
+ ],
+ [
+ 66,
+ "购买商品可获得积分"
+ ],
+ [
+ 68,
+ "去下单"
+ ]
+ ],
+ "scripts\\harmony.patch.js": [
+ [
+ 19,
+ "console.log('site.js 已同步到 stub 项目源码目录');"
+ ],
+ [
+ 22,
+ "console.error('同步 site.js 到 stub 失败:', err);"
+ ],
+ [
+ 60,
+ "console.warn('[harmony.patch] ⚠️ harmony-component-placeholder 注入失败:', e.message);"
+ ],
+ [
+ 63,
+ "console.log('HarmonyOS 资源拷贝完成');"
+ ],
+ [
+ 65,
+ "console.error('发生错误:', err);"
+ ],
+ [
+ 106,
+ "console.log(`ZIP 文件路径: ${zipFilePath}`);"
+ ],
+ [
+ 110,
+ "console.log('跳过创建 ZIP 文件和打开目录');"
+ ]
+ ],
+ "scripts\\mp-weixin.patch.js": [
+ [
+ 25,
+ "console.log(`已拷贝: ${srcPath} -> ${destPath}`);"
+ ],
+ [
+ 27,
+ "console.warn(`源文件不存在,跳过复制: ${srcPath}`);"
+ ],
+ [
+ 35,
+ "console.log(`已拷贝: ${srcSitePath} -> ${destDir}`);"
+ ],
+ [
+ 37,
+ "console.error(`源文件不存在: ${srcSitePath}`);"
+ ],
+ [
+ 41,
+ "console.error('发生错误:', err);"
+ ],
+ [
+ 67,
+ "console.log(`ZIP 文件路径: ${zipFilePath}`);"
+ ],
+ [
+ 70,
+ "console.log('跳过创建 ZIP 文件和打开目录');"
+ ]
+ ],
+ "store\\index.js": [
+ [
+ 524,
+ "console.error('设置主题颜色失败', e);"
+ ],
+ [
+ 580,
+ "console.log('[theme] preset 暂不可用,等待远端 preset 拉完:', finalPresetName);"
+ ],
+ [
+ 586,
+ "console.log('[theme] 远端 preset 到达,重应用成功:', finalPresetName);"
+ ],
+ [
+ 588,
+ "console.warn('[theme] 远端 preset 到达后仍找不到:', finalPresetName);"
+ ],
+ [
+ 599,
+ "console.log('[theme] 远端 preset 补充,重应用:', finalPresetName);"
+ ],
+ [
+ 605,
+ "console.error('[theme] applyThemeWithRemote 失败,回退到纯预设:', e);"
+ ],
+ [
+ 615,
+ "console.error('[theme] 纯预设回退也失败:', e2);"
+ ]
+ ],
+ "common\\js\\navigation.js": [
+ [
+ 33,
+ "console.warn('获取导航栏高度失败,使用默认值:', error)"
+ ],
+ [
+ 49,
+ "console.warn('未找到 uni-page-head 元素或高度为0')"
+ ],
+ [
+ 69,
+ "console.error('微信小程序高度计算失败:', error)"
+ ],
+ [
+ 95,
+ "console.error('App端高度获取失败:', error)"
+ ],
+ [
+ 213,
+ "console.error('处理导航请求失败:', error)"
+ ],
+ [
+ 248,
+ "console.error('导航处理错误:', {"
+ ]
+ ],
+ "components\\payment\\payment.vue": [
+ [
+ 3,
+ ""
+ ],
+ [
+ 44,
+ ""
+ ],
+ [
+ 66,
+ "name: '支付宝支付',"
+ ],
+ [
+ 72,
+ "name: '微信支付',"
+ ],
+ [
+ 82,
+ "name: '微信支付',"
+ ],
+ [
+ 91,
+ "name: '支付宝支付',"
+ ]
+ ],
+ "components-diy\\diy-bottom-nav.vue": [
+ [
+ 2,
+ ""
+ ],
+ [
+ 7,
+ ""
+ ],
+ [
+ 46,
+ ""
+ ]
+ ],
+ "scripts\\add-longpress-to-images.js": [
+ [
+ 74,
+ "console.log(`✓ 已处理: ${filePath}`)"
+ ],
+ [
+ 106,
+ "console.log('开始处理图片长按识别功能...\\n')"
+ ],
+ [
+ 118,
+ "console.log(`\\n处理完成!`)"
+ ],
+ [
+ 119,
+ "console.log(`总共扫描: ${totalFiles} 个文件`)"
+ ],
+ [
+ 120,
+ "console.log(`成功处理: ${processedFiles} 个文件`)"
+ ],
+ [
+ 121,
+ "console.log(`\\n提示:如需排除某些图片,请在 标签添加 class=\"no-longpress\"`)"
+ ]
+ ],
+ "scripts\\create-zip.js": [
+ [
+ 13,
+ "throw new Error(`源目录不存在: ${sourceDir}`);"
+ ],
+ [
+ 22,
+ "console.warn('无法获取 Git 提交 ID,使用 unknown 代替');"
+ ],
+ [
+ 47,
+ "console.log(`执行命令: ${command}`);"
+ ],
+ [
+ 51,
+ "console.warn('警告:', stderr);"
+ ],
+ [
+ 54,
+ "console.log(`✅ ZIP文件创建完成: ${zipFileName}`);"
+ ],
+ [
+ 57,
+ "throw new Error(`系统命令执行失败: ${error.message}`);"
+ ]
+ ],
+ "scripts\\harmony-component-placeholder.js": [
+ [
+ 115,
+ "console.error('用法: node scripts/harmony-component-placeholder.js <产物根目录>');"
+ ],
+ [
+ 119,
+ "console.error(`目录不存在: ${rootDir}`);"
+ ],
+ [
+ 123,
+ "console.log(`[HarmonyPlaceholder] 扫描根: ${rootDir}`);"
+ ],
+ [
+ 124,
+ "console.log(`[HarmonyPlaceholder] 页面清单大小: ${pageSet.size}, diy 组件清单大小: ${DIY_LIST.length}`);"
+ ],
+ [
+ 133,
+ "console.log(` ✓ 注入: ${rel}`);"
+ ],
+ [
+ 148,
+ "console.log(`[HarmonyPlaceholder] 注入: ${stats.injected}, 已有 placeholder: ${stats.hasPlaceholder}, 跳过 (页面): ${stats.pageSkip}, 无 diy: ${stats.noDiy}, 无 usingComp"
+ ]
+ ],
+ "uni_modules\\uni-datetime-picker\\components\\uni-datetime-picker\\time-picker.vue": [
+ [
+ 39,
+ ""
+ ],
+ [
+ 62,
+ ""
+ ],
+ [
+ 112,
+ "title: '日期和时间',"
+ ],
+ [
+ 194,
+ "this.title = '日期'"
+ ],
+ [
+ 198,
+ "this.title = '时间'"
+ ],
+ [
+ 202,
+ "this.title = '日期和时间'"
+ ]
+ ],
+ "common\\js\\util-navigate.js": [
+ [
+ 179,
+ "console.warn('[normalizeUrl] scheme 后有多余的 /:', urlString);"
+ ],
+ [
+ 232,
+ "console.warn('[normalizeUrl] host 含非法字符:', urlString);"
+ ],
+ [
+ 507,
+ "console.warn('[navigate] H5 环境下没有 window.location');"
+ ],
+ [
+ 517,
+ "console.warn('[navigate] H5 跳转失败:', e);"
+ ],
+ [
+ 525,
+ "console.warn('[navigate] 非 H5 环境下没有 uni 全局');"
+ ]
+ ],
+ "components\\mescroll\\mescroll-uni-option.js": [
+ [
+ 8,
+ "textInOffset: Lang.lang('components.mescroll.down.textInOffset', '下拉刷新'),"
+ ],
+ [
+ 9,
+ "textOutOffset: Lang.lang('components.mescroll.down.textOutOffset', '释放更新'),"
+ ],
+ [
+ 10,
+ "textLoading: Lang.lang('components.mescroll.down.textLoading', '加载中 ...'),"
+ ],
+ [
+ 16,
+ "textLoading: Lang.lang('components.mescroll.up.textLoading', '加载中 ...'),"
+ ],
+ [
+ 32,
+ "tip: Lang.lang('components.mescroll.empty.tip', '~ 暂无相关数据 ~')"
+ ]
+ ],
+ "components\\mescroll\\mescroll-uni.js": [
+ [
+ 63,
+ "textInOffset: __i18n('components.mescroll.down.textInOffset', '下拉刷新'),"
+ ],
+ [
+ 64,
+ "textOutOffset: __i18n('components.mescroll.down.textOutOffset', '释放更新'),"
+ ],
+ [
+ 65,
+ "textLoading: __i18n('components.mescroll.down.textLoading', '加载中 ...'),"
+ ],
+ [
+ 98,
+ "textLoading: __i18n('components.mescroll.up.textLoading', '加载中 ...'),"
+ ],
+ [
+ 123,
+ "tip: __i18n('components.mescroll.empty.tip', '~ 暂无相关数据 ~'),"
+ ]
+ ],
+ "components\\mescroll\\my-list-mescroll.vue": [
+ [
+ 2,
+ ""
+ ],
+ [
+ 3,
+ ""
+ ],
+ [
+ 17,
+ ""
+ ],
+ [
+ 44,
+ "tip: '~ 空空如也 ~',"
+ ],
+ [
+ 45,
+ "btnText: '去看看'"
+ ]
+ ],
+ "components\\ns-login\\ns-login.vue": [
+ [
+ 3,
+ ""
+ ],
+ [
+ 43,
+ ""
+ ],
+ [
+ 57,
+ ""
+ ],
+ [
+ 75,
+ ""
+ ],
+ [
+ 125,
+ ""
+ ]
+ ],
+ "components\\wxwork-contact\\wxwork-contact.vue": [
+ [
+ 12,
+ ""
+ ],
+ [
+ 111,
+ "console.error('企业微信SDK初始化失败');"
+ ],
+ [
+ 115,
+ "console.error('初始化企业微信SDK失败:', error);"
+ ],
+ [
+ 170,
+ "console.error('跳转企业微信失败:', err);"
+ ],
+ [
+ 187,
+ "console.error('打开用户资料失败:', err);"
+ ]
+ ],
+ "pages_tool\\member\\coupon.vue": [
+ [
+ 10,
+ "全部"
+ ],
+ [
+ 11,
+ "满减券"
+ ],
+ [
+ 12,
+ "折扣券"
+ ],
+ [
+ 13,
+ "无门槛券"
+ ],
+ [
+ 47,
+ "{{ item.use_store==='all'?'适用门店:全部门店': '适用门店:'+item.use_store_name}}"
+ ]
+ ],
+ "scripts\\inject-placeholder.js": [
+ [
+ 12,
+ "console.warn(`[InjectPlaceholder] ⚠️ ${DIY_DIR} 不存在, diy 组件清单为空`);"
+ ],
+ [
+ 231,
+ "console.error('[InjectPlaceholder] ❌ 读取 pages.json 失败:', e.message);"
+ ],
+ [
+ 310,
+ "console.log(`[InjectPlaceholder] ✅ 展开 ${expanded}, 注入 ${added}, 移除 ${removed}, 跳过 ${skipped}, 无变化 ${noChange}, diy 组件 ${DIY_LIST.length}`);"
+ ],
+ [
+ 312,
+ "console.error('[InjectPlaceholder] ❌ 写回 pages.json 失败:', e.message);"
+ ],
+ [
+ 316,
+ "console.log(`[InjectPlaceholder] ✓ 无需改动, diy 组件 ${DIY_LIST.length}`);"
+ ]
+ ],
+ "components\\l-time\\time.js": [
+ [
+ 96,
+ "return \"刚刚\""
+ ],
+ [
+ 102,
+ "return Math.floor(timer / 60) + \"分钟前\""
+ ],
+ [
+ 110,
+ "return Math.floor(timer / 60 / 60) + \"小时前\";"
+ ],
+ [
+ 119,
+ "return Math.ceil(timer / 86400) + \"天前\""
+ ]
+ ],
+ "components\\ns-contact\\ns-contact.vue": [
+ [
+ 12,
+ ""
+ ],
+ [
+ 18,
+ ""
+ ],
+ [
+ 23,
+ ""
+ ],
+ [
+ 42,
+ ""
+ ]
+ ],
+ "components-diy\\diy-goods-list.vue": [
+ [
+ 69,
+ ""
+ ],
+ [
+ 78,
+ ""
+ ],
+ [
+ 87,
+ ""
+ ],
+ [
+ 100,
+ ""
+ ]
+ ],
+ "pages_goods\\cart.vue": [
+ [
+ 213,
+ ""
+ ],
+ [
+ 354,
+ ""
+ ],
+ [
+ 357,
+ ""
+ ],
+ [
+ 362,
+ ""
+ ]
+ ],
+ "pages_order\\list.vue": [
+ [
+ 74,
+ ""
+ ],
+ [
+ 152,
+ "合并付款"
+ ],
+ [
+ 155,
+ ""
+ ],
+ [
+ 166,
+ ""
+ ]
+ ],
+ "pages_promotion\\fenxiao\\goods_list.vue": [
+ [
+ 63,
+ ""
+ ],
+ [
+ 106,
+ ""
+ ],
+ [
+ 127,
+ ""
+ ],
+ [
+ 130,
+ ""
+ ]
+ ],
+ "pages_promotion\\fenxiao\\withdraw_list.vue": [
+ [
+ 45,
+ "text: '已转账'"
+ ],
+ [
+ 49,
+ "text: '待审核'"
+ ],
+ [
+ 53,
+ "text: '已审核'"
+ ],
+ [
+ 57,
+ "text: '已拒绝'"
+ ]
+ ],
+ "pages_tool\\file-preview\\file-preview.vue": [
+ [
+ 12,
+ ""
+ ],
+ [
+ 18,
+ ""
+ ],
+ [
+ 24,
+ ""
+ ],
+ [
+ 30,
+ ""
+ ]
+ ],
+ "pages_tool\\goods\\coupon.vue": [
+ [
+ 11,
+ ""
+ ],
+ [
+ 51,
+ "{{ item.use_store==='all'?'适用门店:全部门店': '适用门店:'+item.use_store_name}}"
+ ],
+ [
+ 75,
+ ""
+ ],
+ [
+ 78,
+ ""
+ ]
+ ],
+ "pages_tool\\member\\account_edit.vue": [
+ [
+ 110,
+ "if (this.payList.length == 1 && this.payList[0] == '银行卡') {"
+ ],
+ [
+ 127,
+ "case '银行卡':"
+ ],
+ [
+ 130,
+ "case '支付宝':"
+ ],
+ [
+ 133,
+ "case '微信零钱':"
+ ]
+ ],
+ "pages_tool\\member\\index.vue": [
+ [
+ 29,
+ ""
+ ],
+ [
+ 51,
+ ""
+ ],
+ [
+ 56,
+ ""
+ ],
+ [
+ 71,
+ ""
+ ]
+ ],
+ "pages_tool\\notice\\list.vue": [
+ [
+ 23,
+ ""
+ ],
+ [
+ 26,
+ ""
+ ],
+ [
+ 80,
+ "title: '公告',"
+ ],
+ [
+ 88,
+ "var title = '公告';"
+ ]
+ ],
+ "pages_tool\\order\\refund_detail.vue": [
+ [
+ 10,
+ ""
+ ],
+ [
+ 40,
+ ""
+ ],
+ [
+ 49,
+ ""
+ ],
+ [
+ 136,
+ "联系客服"
+ ]
+ ],
+ "pages_tool\\recharge\\order_list.vue": [
+ [
+ 24,
+ "goods-name color-tip \" v-if=\"orderItem.point > 0 || orderItem.growth > 0\">赠送:"
+ ],
+ [
+ 25,
+ " 0\">{{ orderItem.point }}积分"
+ ],
+ [
+ 27,
+ " 0\">{{ orderItem.growth }}成长值"
+ ],
+ [
+ 29,
+ "优惠券x{{ orderItem.coupon_id.split(',').length }}"
+ ]
+ ],
+ "scripts\\inject-nav-title.js": [
+ [
+ 103,
+ "console.error('[InjectNavTitle] ❌ 读取 pages.json 失败:', e.message);"
+ ],
+ [
+ 152,
+ "console.log(`[InjectNavTitle] ✅ 注入 ${injected}, 跳过(已存在) ${skipped}`);"
+ ],
+ [
+ 154,
+ "console.error('[InjectNavTitle] ❌ 写回 pages.json 失败:', e.message);"
+ ],
+ [
+ 158,
+ "console.log(`[InjectNavTitle] ✓ 无需改动, 跳过(已存在) ${skipped}`);"
+ ]
+ ],
+ "uni_modules\\uni-count-down\\components\\uni-count-down\\uni-count-down.vue": [
+ [
+ 11,
+ " 0\" :style=\"{ color: splitorColor }\" class=\"uni-countdown__splitor day\" :class=\"splitorColorClass\">{{ showColon ? '天' : '天' }}"
+ ],
+ [
+ 19,
+ "{{ showColon ? ':' : '时' }}"
+ ],
+ [
+ 27,
+ "{{ showColon ? ':' : '分' }}"
+ ],
+ [
+ 35,
+ "秒"
+ ]
+ ],
+ "common\\js\\util.js": [
+ [
+ 525,
+ "console.error('[navigate] tabBar 跳转失败:', cleanUrl, err);"
+ ],
+ [
+ 1029,
+ "console.log(`外部链接,跳转到webview`, url);"
+ ],
+ [
+ 1419,
+ "else reject(err || new Error('复制失败'));"
+ ]
+ ],
+ "components\\mescroll\\components\\mescroll-up.vue": [
+ [
+ 1,
+ ""
+ ],
+ [
+ 4,
+ ""
+ ],
+ [
+ 9,
+ ""
+ ]
+ ],
+ "components\\ns-goods-sku\\ns-goods-sku.vue": [
+ [
+ 134,
+ ""
+ ],
+ [
+ 184,
+ ""
+ ],
+ [
+ 189,
+ ""
+ ]
+ ],
+ "components\\ns-navbar\\ns-navbar.vue": [
+ [
+ 31,
+ "请输入商品名称"
+ ],
+ [
+ 39,
+ "定位中..."
+ ],
+ [
+ 41,
+ "附近门店"
+ ]
+ ],
+ "components-diy\\diy-groupbuy.vue": [
+ [
+ 52,
+ "已团{{ item.sell_num }}件"
+ ],
+ [
+ 92,
+ ":style=\"{ color: value.theme == 'diy' ? value.saleStyle.color : '' }\">已团{{"
+ ],
+ [
+ 93,
+ "item.sell_num }}件"
+ ]
+ ],
+ "components-diy\\diy-index-page.vue": [
+ [
+ 52,
+ ""
+ ],
+ [
+ 105,
+ ""
+ ],
+ [
+ 161,
+ ""
+ ]
+ ],
+ "components-diy\\diy-rubik-cube.vue": [
+ [
+ 3,
+ ""
+ ],
+ [
+ 8,
+ ""
+ ],
+ [
+ 31,
+ ""
+ ]
+ ],
+ "components-diy\\diy-video-list.vue": [
+ [
+ 3,
+ ""
+ ],
+ [
+ 25,
+ ""
+ ],
+ [
+ 54,
+ ""
+ ]
+ ],
+ "components-diy\\diy-video.vue": [
+ [
+ 3,
+ ""
+ ],
+ [
+ 19,
+ ""
+ ],
+ [
+ 35,
+ ""
+ ]
+ ],
+ "pages\\index\\public\\js\\index.js": [
+ [
+ 161,
+ "title: '版本信息',"
+ ],
+ [
+ 162,
+ "content: `提交 ID: ${v.commitId}\\n构建时间: ${v.buildTime}\\n${Config.baseUrl}`,"
+ ],
+ [
+ 166,
+ "console.error('未获取到构建版本信息');"
+ ]
+ ],
+ "pages_goods\\category.vue": [
+ [
+ 3,
+ ""
+ ],
+ [
+ 16,
+ ""
+ ],
+ [
+ 19,
+ ""
+ ]
+ ],
+ "pages_promotion\\fenxiao\\withdraw_apply.vue": [
+ [
+ 53,
+ "提现"
+ ],
+ [
+ 64,
+ "提现记录"
+ ],
+ [
+ 215,
+ "let branchBankName = this.isBalance ? \"余额\" : this.bankAccountInfo.branch_bank_name;"
+ ]
+ ],
+ "pages_promotion\\merch\\merchcategory.vue": [
+ [
+ 7,
+ ""
+ ],
+ [
+ 50,
+ "暂时没有分类哦!"
+ ],
+ [
+ 59,
+ ""
+ ]
+ ],
+ "pages_tool\\agreement\\contenr.vue": [
+ [
+ 3,
+ ""
+ ],
+ [
+ 8,
+ ""
+ ],
+ [
+ 16,
+ ""
+ ]
+ ],
+ "pages_tool\\ai-chat\\index.vue": [
+ [
+ 3,
+ ""
+ ],
+ [
+ 15,
+ ""
+ ],
+ [
+ 37,
+ ""
+ ]
+ ],
+ "pages_tool\\goods\\brand.vue": [
+ [
+ 19,
+ ""
+ ],
+ [
+ 22,
+ ""
+ ],
+ [
+ 79,
+ "var title = '你想要的大牌都在这里';"
+ ]
+ ],
+ "pages_tool\\goods\\coupon_receive.vue": [
+ [
+ 16,
+ ""
+ ],
+ [
+ 18,
+ ""
+ ],
+ [
+ 33,
+ ""
+ ]
+ ],
+ "pages_tool\\goods\\search.vue": [
+ [
+ 11,
+ ""
+ ],
+ [
+ 29,
+ ""
+ ],
+ [
+ 44,
+ ""
+ ]
+ ],
+ "pages_tool\\help\\list.vue": [
+ [
+ 13,
+ ""
+ ],
+ [
+ 82,
+ "title: '帮助中心',"
+ ],
+ [
+ 90,
+ "var title = '帮助中心使你更加方便';"
+ ]
+ ],
+ "pages_tool\\index\\diy.vue": [
+ [
+ 36,
+ ""
+ ],
+ [
+ 41,
+ ""
+ ],
+ [
+ 51,
+ ""
+ ]
+ ],
+ "pages_tool\\login\\find.vue": [
+ [
+ 23,
+ ""
+ ],
+ [
+ 51,
+ ""
+ ],
+ [
+ 56,
+ ""
+ ]
+ ],
+ "pages_tool\\member\\balance.vue": [
+ [
+ 24,
+ "现金余额(元)"
+ ],
+ [
+ 28,
+ "储值余额(元)"
+ ],
+ [
+ 56,
+ "充值记录"
+ ]
+ ],
+ "pages_tool\\member\\card_log.vue": [
+ [
+ 3,
+ ""
+ ],
+ [
+ 21,
+ ""
+ ],
+ [
+ 30,
+ ""
+ ]
+ ],
+ "pages_tool\\member\\invite_friends.vue": [
+ [
+ 157,
+ ""
+ ],
+ [
+ 178,
+ ""
+ ],
+ [
+ 212,
+ ""
+ ]
+ ],
+ "pages_tool\\member\\point_detail.vue": [
+ [
+ 66,
+ "label: '全部',"
+ ],
+ [
+ 94,
+ "this.date = tempArr[0] + '年' + tempArr[1] + '月';"
+ ],
+ [
+ 111,
+ "return `${year}年${month}月`;"
+ ]
+ ],
+ "pages_tool\\pay\\cashier.vue": [
+ [
+ 43,
+ "name: '支付宝支付',"
+ ],
+ [
+ 49,
+ "name: '微信支付',"
+ ],
+ [
+ 59,
+ "name: '微信支付',"
+ ]
+ ],
+ "pages_tool\\storeclose\\storeclose.vue": [
+ [
+ 41,
+ "return '该店铺已打烊...';"
+ ],
+ [
+ 45,
+ "return '店铺不存在';"
+ ],
+ [
+ 47,
+ "return '店铺打烊';"
+ ]
+ ],
+ "scripts\\verify-p2-keys.js": [
+ [
+ 313,
+ "console.log('\\n⚠️ components-diy/diy-tab.vue 的 title 为运行时 DIY 数据,无法静态枚举,建议通过 DIY 数据规范/白名单保证。');"
+ ],
+ [
+ 316,
+ "console.log('\\n✅ 所有可枚举的 P2 动态 key 均可解析');"
+ ],
+ [
+ 319,
+ "console.log('\\n❌ 部分 P2 动态 key 缺失');"
+ ]
+ ],
+ "uni_modules\\uni-datetime-picker\\components\\uni-datetime-picker\\calendar.vue": [
+ [
+ 13,
+ "class=\"uni-calendar__header-text\">{{ (nowDate.year||'') + ' 年 ' + ( nowDate.month||'') +' 月'}}"
+ ],
+ [
+ 23,
+ ""
+ ],
+ [
+ 89,
+ "确认"
+ ]
+ ],
+ "uni_modules\\x-skeleton\\components\\x-skeleton\\x-skeleton.vue": [
+ [
+ 3,
+ ""
+ ],
+ [
+ 52,
+ ""
+ ],
+ [
+ 143,
+ "console.error('x-skeleton: textHeight参数不支持百分比单位');"
+ ]
+ ],
+ "common\\js\\config-external.js": [
+ [
+ 252,
+ "console.error(`加载页面语言包 ${lang}/${pagePath} 失败:`, error);"
+ ],
+ [
+ 291,
+ "console.error(`加载主题 ${theme} 失败:`, error);"
+ ]
+ ],
+ "common\\js\\event-safety.js": [
+ [
+ 62,
+ "console.warn('matches 检查失败:', error)"
+ ],
+ [
+ 86,
+ "console.error('事件处理错误:', error)"
+ ]
+ ],
+ "common\\js\\mp-share-default.js": [
+ [
+ 85,
+ "title: '小程序分享',"
+ ],
+ [
+ 130,
+ "cfg.title = siteName || '小程序分享';"
+ ]
+ ],
+ "components\\mescroll\\components\\mescroll-empty.vue": [
+ [
+ 1,
+ ""
+ ],
+ [
+ 140,
+ "item.unit = item.unit || '件';"
+ ]
+ ],
+ "components\\ns-payment\\ns-payment.vue": [
+ [
+ 3,
+ ""
+ ],
+ [
+ 46,
+ ""
+ ]
+ ],
+ "components\\ns-select-time\\ns-select-time.vue": [
+ [
+ 11,
+ ""
+ ],
+ [
+ 19,
+ ""
+ ]
+ ],
+ "components-diy\\diy-bargain.vue": [
+ [
+ 5,
+ ""
+ ],
+ [
+ 24,
+ ""
+ ]
+ ],
+ "components-diy\\diy-image-nav.vue": [
+ [
+ 8,
+ ""
+ ],
+ [
+ 26,
+ ""
+ ]
+ ],
+ "components-diy\\diy-map.vue": [
+ [
+ 9,
+ "一键导航"
+ ],
+ [
+ 12,
+ ""
+ ]
+ ],
+ "components-diy\\diy-notes.vue": [
+ [
+ 20,
+ "#{{ item.note_type == 'goods_item' ? '单品介绍' :"
+ ],
+ [
+ 21,
+ "'掌柜说' }}#"
+ ]
+ ],
+ "components-diy\\diy-notice.vue": [
+ [
+ 11,
+ ""
+ ],
+ [
+ 28,
+ ""
+ ]
+ ],
+ "components-diy\\diy-text.vue": [
+ [
+ 230,
+ ""
+ ],
+ [
+ 264,
+ ""
+ ]
+ ],
+ "pages_promotion\\fenxiao\\order.vue": [
+ [
+ 65,
+ ""
+ ]
+ ],
+ "pages_tool\\ai-chat\\components\\ai-chat-search.vue": [
+ [
+ 3,
+ ""
+ ],
+ [
+ 9,
+ ""
+ ]
+ ],
+ "pages_tool\\article\\list.vue": [
+ [
+ 29,
+ ""
+ ],
+ [
+ 32,
+ ""
+ ]
+ ],
+ "pages_tool\\form\\formdata.vue": [
+ [
+ 6,
+ ""
+ ]
+ ],
+ "pages_tool\\member\\balance_detail.vue": [
+ [
+ 26,
+ ""
+ ],
+ [
+ 47,
+ ""
+ ]
+ ],
+ "pages_tool\\member\\bind_mobile.vue": [
+ [
+ 4,
+ ""
+ ],
+ [
+ 20,
+ ""
+ ]
+ ],
+ "pages_tool\\member\\card_buy.vue": [
+ [
+ 191,
+ ""
+ ],
+ [
+ 219,
+ ""
+ ]
+ ],
+ "pages_tool\\notice\\detail.vue": [
+ [
+ 11,
+ ""
+ ],
+ [
+ 87,
+ "var title = '[公告]' + this.detail.title;"
+ ]
+ ],
+ "pages_tool\\weapp\\order_shipping.vue": [
+ [
+ 20,
+ "this.errorMsg = '缺少merchant_trade_no参数';"
+ ],
+ [
+ 32,
+ "this.errorMsg = res.message || '未知错误';"
+ ]
+ ],
+ "uni_modules\\uni-nav-bar\\components\\uni-nav-bar\\uni-nav-bar.vue": [
+ [
+ 20,
+ ""
+ ],
+ [
+ 25,
+ ""
+ ]
+ ],
+ "uni_modules\\uni-number-box\\components\\uni-number-box\\uni-number-box.vue": [
+ [
+ 137,
+ "title: '商品库存不足'"
+ ],
+ [
+ 141,
+ "title: '商品最少购买' + this.min + '件'"
+ ]
+ ],
+ "common\\js\\auth.js": [
+ [
+ 13,
+ "console.log(`微信小程序登录`)"
+ ]
+ ],
+ "common\\js\\config.js": [
+ [
+ 19,
+ "console.warn('小程序发行环境下,必须配置site.js文件,不然将使用默认配置,影响小程序定制分发!');"
+ ]
+ ],
+ "common\\js\\goods_detail_base.js": [
+ [
+ 309,
+ "title: title + '已下单'"
+ ]
+ ],
+ "common\\js\\lang.js": [
+ [
+ 1132,
+ "console.error('解析语言包失败:', e, { langPath, field, locale });"
+ ]
+ ],
+ "common\\js\\map-wx-jssdk.js": [
+ [
+ 675,
+ "region: options.region || '全国',"
+ ]
+ ],
+ "common\\js\\share.js": [
+ [
+ 39,
+ "console.error('分享失败:', err);"
+ ]
+ ],
+ "common\\js\\splash-state.js": [
+ [
+ 111,
+ "try { uni.showLoading({ title: opts.title || '加载中...', mask: false }); } catch (e) {}"
+ ]
+ ],
+ "common\\js\\util-tabbar.js": [
+ [
+ 401,
+ "_log('step 5: pageTabMap miss → 进入 step 6/7');"
+ ]
+ ],
+ "components\\l-time\\l-time.vue": [
+ [
+ 40,
+ "if (timeVal && (timeVal.endsWith('刚刚') || timeVal.endsWith('分钟前'))) {"
+ ]
+ ],
+ "components\\mescroll\\components\\mescroll-down.vue": [
+ [
+ 1,
+ ""
+ ]
+ ],
+ "components\\mescroll\\components\\mescroll-top.vue": [
+ [
+ 1,
+ ""
+ ]
+ ],
+ "components\\ns-copyright\\ns-copyright.vue": [
+ [
+ 13,
+ ""
+ ]
+ ],
+ "components\\ns-form\\ns-form.vue": [
+ [
+ 30,
+ ""
+ ]
+ ],
+ "components\\ns-goods-action-icon\\ns-goods-action-icon.vue": [
+ [
+ 3,
+ ""
+ ]
+ ],
+ "components\\ns-loading\\ns-loading.vue": [
+ [
+ 16,
+ "default: '加载中'"
+ ]
+ ],
+ "components\\privacy-popup\\privacy-popup.vue": [
+ [
+ 102,
+ "console.error(\"=========低版本基础库==========\", e)"
+ ]
+ ],
+ "components\\splash-screen\\splash-screen.vue": [
+ [
+ 21,
+ ""
+ ]
+ ],
+ "components\\to-top\\to-top.vue": [
+ [
+ 1,
+ ""
+ ]
+ ],
+ "components-diy\\diy-hot-area.vue": [
+ [
+ 6,
+ ""
+ ]
+ ],
+ "components-diy\\diy-search.vue": [
+ [
+ 45,
+ ""
+ ]
+ ],
+ "components-diy\\js\\wechat-channel.js": [
+ [
+ 172,
+ "console.error('微信视频号错误:', err);"
+ ]
+ ],
+ "components-diy\\placeholder\\index.vue": [
+ [
+ 2,
+ ""
+ ]
+ ],
+ "pages_goods\\public\\js\\list.js": [
+ [
+ 40,
+ "text: \"购买\","
+ ]
+ ],
+ "pages_goods\\_components\\goods-detail-view\\detail.js": [
+ [
+ 494,
+ "console.log('打开成功');"
+ ]
+ ],
+ "pages_goods\\_components\\ns-goods-promotion\\ns-goods-promotion.vue": [
+ [
+ 2,
+ ""
+ ]
+ ],
+ "pages_promotion\\fenxiao\\apply.vue": [
+ [
+ 3,
+ ""
+ ]
+ ],
+ "pages_promotion\\fenxiao\\promote.vue": [
+ [
+ 52,
+ ""
+ ]
+ ],
+ "pages_promotion\\fenxiao\\promote_code.vue": [
+ [
+ 38,
+ ""
+ ]
+ ],
+ "pages_promotion\\fenxiao\\relation.vue": [
+ [
+ 52,
+ ""
+ ]
+ ],
+ "pages_promotion\\point\\order_list.vue": [
+ [
+ 91,
+ ""
+ ]
+ ],
+ "pages_tool\\article\\detail.vue": [
+ [
+ 20,
+ ""
+ ]
+ ],
+ "pages_tool\\cases\\index.vue": [
+ [
+ 86,
+ ""
+ ]
+ ],
+ "pages_tool\\files\\list.vue": [
+ [
+ 40,
+ ""
+ ]
+ ],
+ "pages_tool\\help\\detail.vue": [
+ [
+ 10,
+ ""
+ ]
+ ],
+ "pages_tool\\member\\address_edit.vue": [
+ [
+ 36,
+ ""
+ ]
+ ],
+ "pages_tool\\member\\card.vue": [
+ [
+ 99,
+ ""
+ ]
+ ],
+ "pages_tool\\member\\collection.vue": [
+ [
+ 31,
+ ""
+ ]
+ ],
+ "pages_tool\\member\\contact.vue": [
+ [
+ 4,
+ ""
+ ]
+ ],
+ "pages_tool\\member\\level.vue": [
+ [
+ 136,
+ ""
+ ]
+ ],
+ "pages_tool\\member\\withdrawal_detail.vue": [
+ [
+ 7,
+ ""
+ ]
+ ],
+ "pages_tool\\order\\refund_batch.vue": [
+ [
+ 63,
+ ""
+ ]
+ ],
+ "pages_tool\\pay\\index.vue": [
+ [
+ 54,
+ "title: '未获取到支付信息!'"
+ ]
+ ],
+ "pages_tool\\vr\\index.vue": [
+ [
+ 4,
+ ""
+ ]
+ ],
+ "pages_tool\\webview\\webview.vue": [
+ [
+ 12,
+ ""
+ ]
+ ],
+ "pages_tool\\_components\\img-cropping\\img-cropping.vue": [
+ [
+ 22,
+ ""
+ ]
+ ],
+ "scripts\\verify-pages-json-cross-platform.js": [
+ [
+ 51,
+ "console.warn(`[warn] platform=${platform}: 残留未关闭 #ifdef/#ifndef ${stack.length} 个`);"
+ ]
+ ],
+ "uni_modules\\uni-calendar\\components\\uni-calendar\\uni-calendar-item.vue": [
+ [
+ 50,
+ "{{ weeks.isDay ? '今天' : weeks.lunar.IDayCn === '初一' ? weeks.lunar.IMonthCn : weeks.lunar.IDayCn }}"
+ ]
+ ],
+ "uni_modules\\uni-datetime-picker\\components\\uni-datetime-picker\\uni-datetime-picker.vue": [
+ [
+ 46,
+ ""
+ ]
+ ]
+}
\ No newline at end of file
diff --git a/scripts/lang_audit_report_v2.json b/scripts/lang_audit_report_v2.json
index 162011b..bf8133e 100644
--- a/scripts/lang_audit_report_v2.json
+++ b/scripts/lang_audit_report_v2.json
@@ -1,14 +1,77 @@
{
- "bundle_version": "1782901586",
+ "bundle_version": "1784767380",
"bundle_lang": "zh-cn",
- "bundle_leaves": 2649,
- "code_calls_total": 2677,
- "code_unique_keys": 2083,
- "found_in_bundle": 2082,
+ "bundle_leaves": 2659,
+ "code_calls_total": 2693,
+ "code_unique_keys": 2097,
+ "found_in_bundle": 2086,
"missing_summary": {
+ "TRULY_MISSING": 12,
"SYNTAX_BUG": 1
},
"missing_classified": {
+ "TRULY_MISSING": [
+ {
+ "key": "common.buyNow",
+ "file": "components\\ns-goods-recommend\\ns-goods-recommend.vue",
+ "reason": "not in bundle, not local"
+ },
+ {
+ "key": "wechatChannel.wechatMpOnly",
+ "file": "components-diy\\diy-channel-list.vue",
+ "reason": "not in bundle, not local"
+ },
+ {
+ "key": "common.submitSuccess",
+ "file": "components-diy\\diy-form.vue",
+ "reason": "not in bundle, not local"
+ },
+ {
+ "key": "submitFail",
+ "file": "components-diy\\diy-form.vue",
+ "reason": "not in bundle, not local"
+ },
+ {
+ "key": "diy.networkError",
+ "file": "pages\\index\\index.vue",
+ "reason": "not in bundle, not local"
+ },
+ {
+ "key": "versionInfo",
+ "file": "pages\\index\\public\\js\\index.js",
+ "reason": "not in bundle, not local"
+ },
+ {
+ "key": "commitId",
+ "file": "pages\\index\\public\\js\\index.js",
+ "reason": "not in bundle, not local"
+ },
+ {
+ "key": "buildTime",
+ "file": "pages\\index\\public\\js\\index.js",
+ "reason": "not in bundle, not local"
+ },
+ {
+ "key": "diy.networkError",
+ "file": "pages_goods\\category.vue",
+ "reason": "not in bundle, not local"
+ },
+ {
+ "key": "goods.detail.formEmptyTip",
+ "file": "pages_goods\\detail.vue",
+ "reason": "not in bundle, not local"
+ },
+ {
+ "key": "common.buyNow",
+ "file": "pages_goods\\public\\js\\list.js",
+ "reason": "not in bundle, not local"
+ },
+ {
+ "key": "pay.index.payInfoNotFound",
+ "file": "pages_tool\\pay\\index.vue",
+ "reason": "not in bundle, not local"
+ }
+ ],
"SYNTAX_BUG": [
{
"key": "order.list.status.",
@@ -19,18 +82,8 @@
},
"placeholder_issues": [],
"data_lang_issues": {
- "components\\ns-payment\\ns-payment.vue": [
- "components.nsPayment.alipay"
- ],
"pages_promotion\\fenxiao\\apply.vue": [
"fenxiao.apply.pleaseEnterName"
- ],
- "pages_promotion\\merch\\public\\js\\list.js": [
- "merch.list.buyText"
- ],
- "pages_tool\\ai-chat\\ai-chat-message.vue": [
- "ai-chat.index.loadMoreHistory",
- "ai-chat.index.defaultNickname"
]
},
"hardcoded_navbar_titles": [
@@ -121,6 +174,11 @@
"common.tabBar.cart",
"common.tabBar.member"
],
- "local_only_keys": [],
+ "local_only_keys": [
+ "buildTime",
+ "commitId",
+ "submitFail",
+ "versionInfo"
+ ],
"bundle_only_keys_in_unique": []
}
\ No newline at end of file
diff --git a/scripts/scan-hardcoded-cn.py b/scripts/scan-hardcoded-cn.py
new file mode 100644
index 0000000..3c5c614
--- /dev/null
+++ b/scripts/scan-hardcoded-cn.py
@@ -0,0 +1,80 @@
+#!/usr/bin/env python3
+# 精筛 v2:剥离 HTML 注释和 JS 注释后,再扫硬编码中文(只关注真实会被渲染的)
+import os, re, json
+from collections import defaultdict
+
+ROOT = r'D:\projects\shop-projects\frontend'
+SKIP_DIR = {'node_modules', '.unpackage', 'unpackage', '.git', 'dist', 'stub-app-projects', 'lang', 'tests', 'docs', 'scripts', 'common/mixin'}
+
+CN = re.compile(r'[\u4e00-\u9fff]')
+LANG_RE = re.compile(r'\$lang\(')
+
+TPL_RE = re.compile(r']*>([\s\S]*?)', re.I)
+TAG_RE = re.compile(r'<([a-zA-Z][\w-]*)\b[^>]*>([^<>\n]+)\1>')
+HTML_COMMENT_RE = re.compile(r'')
+
+JS_TRIGGERS = [
+ re.compile(r'uni\.show(?:Toast|Modal|ActionSheet|Loading)\s*\(\s*\{[\s\S]*?\}\s*\)', re.S),
+ re.compile(r'wx\.show(?:Toast|Modal|ActionSheet|Loading)\s*\(\s*\{[\s\S]*?\}\s*\)', re.S),
+ re.compile(r'\btitle\s*:\s*[\'"]([^\'"]*?)[\'"]'),
+ re.compile(r'\bcontent\s*:\s*[\'"]([^\'"]*?)[\'"]'),
+ re.compile(r'\btext\s*:\s*[\'"]([^\'"]*?)[\'"]'),
+ re.compile(r'\bplaceholder\s*:\s*[\'"]([^\'"]*?)[\'"]'),
+ re.compile(r'\balert\s*\(\s*[\'"]([^\'"]*?)[\'"]'),
+ re.compile(r'\bconfirm\s*\(\s*[\'"]([^\'"]*?)[\'"]'),
+]
+
+def strip_all_comments(text, is_vue=False):
+ text = HTML_COMMENT_RE.sub(lambda m: ' ' * len(m.group()), text)
+ text = re.sub(r'/\*[\s\S]*?\*/', lambda m: ' ' * len(m.group()), text)
+ text = re.sub(r'//[^\n]*', lambda m: ' ' * len(m.group()), text)
+ return text
+
+results = defaultdict(list)
+
+for dirpath, dirnames, filenames in os.walk(ROOT):
+ if any(s in dirpath.replace('\\', '/') for s in SKIP_DIR):
+ continue
+ for fn in filenames:
+ if not fn.endswith(('.vue', '.js')):
+ continue
+ fp = os.path.join(dirpath, fn)
+ rel = os.path.relpath(fp, ROOT).replace('\\', '/')
+ try:
+ content = open(fp, 'r', encoding='utf-8').read()
+ except UnicodeDecodeError:
+ continue
+
+ stripped = strip_all_comments(content)
+
+ if fn.endswith('.vue'):
+ for m in TPL_RE.finditer(stripped):
+ tpl = m.group(1)
+ for tag in TAG_RE.finditer(tpl):
+ inner = tag.group(2).strip()
+ if CN.search(inner) and not LANG_RE.search(inner):
+ line_no = stripped[:m.start(1) + tpl.find(inner)].count('\n') + 1
+ results[rel].append({'kind': 'template', 'tag': tag.group(1), 'text': inner[:160], 'line': line_no})
+
+ for trig in JS_TRIGGERS:
+ for m in trig.finditer(stripped):
+ text = (m.group(1) if m.lastindex else m.group(0))
+ if not CN.search(text):
+ continue
+ if LANG_RE.search(text):
+ continue
+ line_no = stripped[:m.start()].count('\n') + 1
+ results[rel].append({'kind': 'js-text', 'match': text[:160], 'line': line_no})
+
+ranked = sorted(results.items(), key=lambda kv: -len(kv[1]))
+print(f'total files: {len(ranked)}')
+print(f'total hits: {sum(len(v) for v in ranked)}')
+
+out = []
+for f, hits in ranked[:60]:
+ out.append({'file': f, 'hits': len(hits), 'samples': hits[:3]})
+print(json.dumps(out, ensure_ascii=False, indent=2))
+
+with open(os.path.join(ROOT, 'scripts', 'hardcoded_cn_real.json'), 'w', encoding='utf-8') as f:
+ json.dump({k: v for k, v in ranked}, f, ensure_ascii=False, indent=2)
+print('saved hardcoded_cn_real.json')
\ No newline at end of file
diff --git a/tests/lang.test.js b/tests/lang.test.js
new file mode 100644
index 0000000..7daae7d
--- /dev/null
+++ b/tests/lang.test.js
@@ -0,0 +1,493 @@
+/**
+ * lang.js 单元测试($lang 解析器)
+ *
+ * 运行方式:
+ * node --test tests/lang.test.js
+ *
+ * 测试覆盖(6 大维度):
+ * 1. 基础解析: 命中、未命中、默认值兜底、生产环境/开发环境返回差异
+ * 2. 命名参数: {reason} / {count} / {unit} 多参数、占位符安全性
+ * 3. 位置参数: {0} / {1} 兼容老式调用
+ * 4. 嵌套命名空间: diy.loadFailTpl / wechatChannel.wechatMpOnly / common.tabBar.home
+ * 5. 占位符替换: 多次替换、正则元字符、__proto__/constructor/prototype 过滤
+ * 6. 实际业务 key: loadFailTpl (com.js 下 diy)、tabBar.* 翻译对齐、common.buyNow vs common.submitSuccess
+ *
+ * 实现策略:
+ * lang.js 是 Vue 插件,挂在 Vue.prototype 上,依赖 store / uni / Config,
+ * 无法直接 import 跑测试。本测试按 util.test.js 的同款做法:
+ * 把要测的纯函数 (applyLangParams + 简化版 lang() 解析流程) 从 lang.js
+ * 源码里"剪切"出来放到本测试文件,与 lang.js 保持同步。
+ * 这样不依赖任何测试框架,任何 node 版本 (>=18) 都能跑通。
+ */
+
+'use strict';
+
+const test = require('node:test');
+const assert = require('node:assert/strict');
+const path = require('path');
+
+// =============================================================
+// 被测源码区块(与 common/js/lang.js 保持同步)
+// =============================================================
+
+/** 与 lang.js 中 FORBIDDEN_KEYS 一致 */
+const FORBIDDEN_KEYS = new Set(['__proto__', 'constructor', 'prototype']);
+
+/**
+ * @see lang.js#applyLangParams
+ * 命名参数 + 位置参数 替换
+ */
+function applyLangParams(value, args) {
+ if (args.length === 0) return value;
+ let result = String(value);
+
+ const firstArg = args[0];
+ const isNamed = firstArg !== null && typeof firstArg === 'object' && !Array.isArray(firstArg);
+
+ if (isNamed) {
+ const map = firstArg;
+ for (const key in map) {
+ if (!Object.prototype.hasOwnProperty.call(map, key)) continue;
+ if (FORBIDDEN_KEYS.has(key)) continue;
+ const safeKey = key.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
+ result = result.replace(new RegExp('\\{' + safeKey + '\\}', 'g'), String(map[key]));
+ }
+ } else {
+ for (let i = 0; i < args.length; i++) {
+ result = result.replace(new RegExp('\\{' + i + '\\}', 'g'), String(args[i]));
+ }
+ }
+ return result;
+}
+
+/**
+ * 简化版 lang() 解析流程(模拟 lang.js 主流程的"按 . 切分 + 逐层查找 + 默认值 + 占位符替换"核心)
+ *
+ * 与 lang.js 主流程差异:
+ * - 不处理 route 缓存、_mergedLangCache、_fieldResultCache 等(那些是性能优化,不影响语义)
+ * - 不处理 overrideCache(那是远端覆写机制,需要单独 mock)
+ * - 不处理递归保护、isRemoteOnly 短路(那是运行时 hook)
+ * - 但"按 . 切分 → 逐层查找 → 未命中走默认值 → 占位符替换" 这一核心路径与 lang.js 完全一致
+ *
+ * @param {Object} mergedLang 合并后的语言包对象(顶层已是 common namespace)
+ * @param {string} field 字段路径,如 'diy.loadFailTpl'
+ * @param {...any} args 可选参数(命名参数或位置参数)
+ * @returns {string}
+ */
+function fakeLang(mergedLang, field, ...args) {
+ const hasDefault = args.length > 0 && typeof args[0] === 'string' && args[0] !== '';
+
+ const arr = field.split('.');
+ let value;
+ if (arr.length > 1) {
+ let temp = mergedLang;
+ let found = true;
+ for (const key of arr) {
+ if (temp && typeof temp === 'object' && temp[key] !== undefined) {
+ temp = temp[key];
+ } else {
+ found = false;
+ break;
+ }
+ }
+ value = found && typeof temp === 'string' ? temp : field;
+ } else {
+ const raw = mergedLang[field];
+ value = raw !== undefined && typeof raw === 'string' ? raw : field;
+ }
+
+ // 未命中 → 默认值兜底
+ if (value === field) {
+ if (hasDefault) return args[0];
+ return ''; // 生产环境返回空串(对齐 lang.js 的 __DEV__ === false 分支)
+ }
+
+ // 占位符替换
+ if (args.length > 0) {
+ value = applyLangParams(value, args);
+ }
+
+ return value;
+}
+
+/**
+ * 直接 require 实际语言包,确保我们测的就是项目里那份 zh-cn / en-us
+ */
+const zh = require(path.resolve(__dirname, '..', 'lang', 'zh-cn', 'common.js')).lang;
+const en = require(path.resolve(__dirname, '..', 'lang', 'en-us', 'common.js')).lang;
+
+// =============================================================
+// 1. 基础解析:命中 / 未命中 / 默认值
+// =============================================================
+
+test('基础解析: 命中已有 key 返回翻译结果', () => {
+ assert.strictEqual(
+ fakeLang(zh, 'diy.retry'),
+ '重试'
+ );
+ assert.strictEqual(
+ fakeLang(en, 'diy.retry'),
+ 'Retry'
+ );
+});
+
+test('基础解析: 中英对照 一致性', () => {
+ const pairs = [
+ ['diy.retry', '重试', 'Retry'],
+ ['diy.noDiyData', '未配置自定义页面数据', 'Custom page data not configured'],
+ ['customer.weChatKefu', '微信客服', 'WeChat Customer Service'],
+ ];
+ for (const [key, zhExpected, enExpected] of pairs) {
+ assert.strictEqual(fakeLang(zh, key), zhExpected, `zh ${key}`);
+ assert.strictEqual(fakeLang(en, key), enExpected, `en ${key}`);
+ }
+});
+
+test('基础解析: 未命中且无默认值 → 生产环境返回空串', () => {
+ assert.strictEqual(
+ fakeLang(zh, 'totally.fake.missing.key'),
+ '',
+ '未命中且无默认值时,生产环境(本测试视角)返回空串,避免展示 raw key'
+ );
+});
+
+test('基础解析: 未命中但有默认值 → 返回默认值', () => {
+ assert.strictEqual(
+ fakeLang(zh, 'totally.fake.missing.key', '兜底文案'),
+ '兜底文案'
+ );
+ assert.strictEqual(
+ fakeLang(en, 'totally.fake.missing.key', 'Fallback Text'),
+ 'Fallback Text'
+ );
+});
+
+test('基础解析: 默认值是空串时被忽略(对齐 lang.js hasDefault 判断)', () => {
+ // lang.js: hasDefault = typeof args[1] === 'string' && args[1] !== ''
+ // args[0] 是 string '' 时不算默认值
+ assert.strictEqual(
+ fakeLang(zh, 'totally.fake.missing.key', ''),
+ ''
+ );
+});
+
+test('基础解析: 默认值必须是字符串,非字符串不走默认值兜底', () => {
+ // args[0] = { foo: 1 } 是命名参数,不走默认值路径
+ // 这里用一个不存在 key 验证:返回空串(因为命名参数替换失败)
+ assert.strictEqual(
+ fakeLang(zh, 'totally.fake.missing.key', { foo: 'bar' }),
+ ''
+ );
+});
+
+test('基础解析: 中间路径上某节点非对象(命中 leaf 是 number/boolean)', () => {
+ // 模拟 leaf 不是 string 的场景
+ const stub = { foo: { bar: 123 } };
+ // lang.js 实际行为:中间节点上 leaf 不是 string 时,value 设为 field,
+ // 但因为没有默认值兜底且后续判定 value === field → 返回空串
+ assert.strictEqual(
+ fakeLang(stub, 'foo.bar'),
+ '',
+ '非 string 类型 leaf 当成未命中,且无默认值 → 返回空串'
+ );
+ // 给默认值时返回默认值
+ assert.strictEqual(
+ fakeLang(stub, 'foo.bar', 'fallback'),
+ 'fallback'
+ );
+});
+
+// =============================================================
+// 2. 命名参数:本次修复的核心场景
+// =============================================================
+
+test('命名参数: diy.loadFailTpl + { reason } 是核心场景', () => {
+ // 注意:zh-cn 实际文案是中文标点「:」,不是英文「:」
+ assert.strictEqual(
+ fakeLang(zh, 'diy.loadFailTpl', { reason: '网络连接超时' }),
+ '页面数据加载失败:网络连接超时,请稍后重试'
+ );
+ assert.strictEqual(
+ fakeLang(en, 'diy.loadFailTpl', { reason: 'Network timeout' }),
+ 'Failed to load page data: Network timeout, please try again later'
+ );
+});
+
+test('命名参数: 多参数同时替换', () => {
+ // goods.detail.purchaseLimit = '该商品每人限购{count}{unit}'
+ const zhGoods = require(path.resolve(__dirname, '..', 'lang', 'zh-cn', 'goods', 'detail.js')).lang;
+ const enGoods = require(path.resolve(__dirname, '..', 'lang', 'en-us', 'goods', 'detail.js')).lang;
+
+ assert.strictEqual(
+ fakeLang(zhGoods, 'purchaseLimit', { count: 5, unit: '件' }),
+ '该商品每人限购5件'
+ );
+ assert.strictEqual(
+ fakeLang(enGoods, 'purchaseLimit', { count: 5, unit: 'pcs' }),
+ 'Limit 5 pcs per person',
+ 'en-us 文案是 "Limit {count} {unit} per person",顺序替换 {count}=5 / {unit}=pcs'
+ );
+
+ // 多参数 + 多占位符 替换
+ assert.strictEqual(
+ fakeLang(zhGoods, 'purchaseLimitWithPurchased', { count: 5, unit: '件', purchased: 2 }),
+ '该商品每人限购5件,您已购买了2件'
+ );
+});
+
+test('命名参数: 多次出现的占位符全部替换', () => {
+ const stub = { msg: '欢迎{user},{user} 你好' };
+ assert.strictEqual(
+ fakeLang(stub, 'msg', { user: '张三' }),
+ '欢迎张三,张三 你好'
+ );
+});
+
+test('命名参数: 占位符的值含正则元字符不会注入', () => {
+ const stub = { msg: '下载 {url} 完成' };
+ assert.strictEqual(
+ fakeLang(stub, 'msg', { url: 'a.b+c*d(e)f' }),
+ '下载 a.b+c*d(e)f 完成'
+ );
+ assert.strictEqual(
+ fakeLang(stub, 'msg', { url: '$1\\2{3}' }),
+ '下载 $1\\2{3} 完成'
+ );
+});
+
+test('命名参数: 占位符的值含 .*+?^${}()|[]\\ 等全部正确转义', () => {
+ const stub = { msg: '前缀 {x} 后缀' };
+ const r1 = fakeLang(stub, 'msg', { x: '$1' });
+ assert.strictEqual(r1, '前缀 $1 后缀', 'value 端的 $1 不应被吃成反向引用');
+
+ const r2 = fakeLang(stub, 'msg', { x: '\\n' });
+ assert.strictEqual(r2, '前缀 \\n 后缀');
+});
+
+test('命名参数: 危险 key __proto__/constructor/prototype 被过滤', () => {
+ const stub = { msg: 'hello {__proto__} {constructor} {prototype} world' };
+ const out = fakeLang(stub, 'msg', { __proto__: 'A', constructor: 'B', prototype: 'C', safe: 'OK' });
+ assert.strictEqual(out, 'hello {__proto__} {constructor} {prototype} world');
+});
+
+test('命名参数: 没有占位符的纯文案 + 命名参数(多余参数被忽略)', () => {
+ const stub = { msg: '你好' };
+ assert.strictEqual(
+ fakeLang(stub, 'msg', { foo: 'bar' }),
+ '你好'
+ );
+});
+
+test('命名参数: 对象参数里没提供的占位符 → 字面残留', () => {
+ const stub = { msg: '你好 {name},你 {count} 岁' };
+ assert.strictEqual(
+ fakeLang(stub, 'msg', { name: 'Tom' }),
+ '你好 Tom,你 {count} 岁'
+ );
+});
+
+// =============================================================
+// 3. 位置参数: {0} / {1} 老式调用兼容
+// =============================================================
+
+test('位置参数: {0} 形式', () => {
+ const stub = { msg: '欢迎第 {0} 位用户' };
+ assert.strictEqual(
+ fakeLang(stub, 'msg', '张三'),
+ '欢迎第 张三 位用户'
+ );
+});
+
+test('位置参数: 多位置参数 {0}/{1}/{2}', () => {
+ const stub = { msg: '{0} 在 {1} 出生,今年 {2} 岁' };
+ assert.strictEqual(
+ fakeLang(stub, 'msg', 'Alice', 'Beijing', 18),
+ 'Alice 在 Beijing 出生,今年 18 岁'
+ );
+});
+
+test('位置参数: 数组会被识别为位置参数而非命名参数', () => {
+ // args[0] = ['a', 'b'] 是 array → 走位置参数分支
+ // 但 args.length === 1(只传了一个数组),所以只有 {0} 被替换,{1} 残留
+ const stub = { msg: '{0} {1}' };
+ assert.strictEqual(
+ fakeLang(stub, 'msg', ['a', 'b']),
+ 'a,b {1}'
+ );
+});
+
+test('位置参数: null 走位置参数分支,被 String() 转为 "null"', () => {
+ const stub = { msg: '{0}' };
+ // args[0] === null: applyLangParams 中 firstArg !== null 判定为 false,
+ // 走位置参数分支, String(null) = 'null',替换 {0}
+ assert.strictEqual(
+ fakeLang(stub, 'msg', null),
+ 'null'
+ );
+});
+
+// =============================================================
+// 4. 嵌套命名空间: 多层 . 路径
+// =============================================================
+
+test('嵌套命名空间: order.payment.title (3 层)', () => {
+ const orderZh = require(path.resolve(__dirname, '..', 'lang', 'zh-cn', 'order', 'payment.js')).lang;
+ const orderEn = require(path.resolve(__dirname, '..', 'lang', 'en-us', 'order', 'payment.js')).lang;
+ // 注意:页面语言包整体就是 order.payment namespace,
+ // 所以 $lang('title') 也能命中(归一化逻辑),但显式路径是 $lang('order.payment.title')
+ assert.strictEqual(fakeLang(orderZh, 'title'), '确认订单');
+ assert.strictEqual(fakeLang(orderEn, 'title'), 'Confirm Order');
+});
+
+test('嵌套命名空间: wechatChannel.wechatMpOnly (本次新增)', () => {
+ assert.strictEqual(
+ fakeLang(zh, 'wechatChannel.wechatMpOnly'),
+ '视频号仅支持在微信小程序环境中播放'
+ );
+ assert.strictEqual(
+ fakeLang(en, 'wechatChannel.wechatMpOnly'),
+ 'WeChat Channel only plays in WeChat Mini Program'
+ );
+});
+
+test('嵌套命名空间: common.tabBar.* (本次修正)', () => {
+ assert.strictEqual(fakeLang(zh, 'tabBar.home'), '首页');
+ assert.strictEqual(fakeLang(zh, 'tabBar.category'), '分类');
+ assert.strictEqual(fakeLang(zh, 'tabBar.cart'), '购物车');
+ assert.strictEqual(fakeLang(zh, 'tabBar.member'), '个人中心');
+
+ // en-us 顶层 tabBar(本次修复后)
+ assert.strictEqual(fakeLang(en, 'tabBar.home'), 'Home');
+ assert.strictEqual(fakeLang(en, 'tabBar.category'), 'Category');
+ assert.strictEqual(fakeLang(en, 'tabBar.cart'), 'Cart');
+ assert.strictEqual(fakeLang(en, 'tabBar.member'), 'Me');
+});
+
+test('嵌套命名空间: common.tabBar.* 中英文一致性(本次修复的核心断言)', () => {
+ const tabs = ['home', 'category', 'cart', 'member'];
+ for (const tab of tabs) {
+ const zhVal = fakeLang(zh, `tabBar.${tab}`);
+ const enVal = fakeLang(en, `tabBar.${tab}`);
+ assert.notStrictEqual(enVal, zhVal, `en-us tabBar.${tab} 不能等于 zh-cn 值`);
+ assert.ok(enVal.length > 0, `en-us tabBar.${tab} 必须有翻译`);
+ // 英文 tab 应是 Title Case,而不是全小写英文单词
+ assert.ok(
+ /^[A-Z]/.test(enVal) || enVal === 'Me',
+ `en-us tabBar.${tab}="${enVal}" 应以大写字母开头(或等于 'Me')`
+ );
+ }
+});
+
+test('嵌套命名空间: common 顶层键 vs common.common 子对象双层结构', () => {
+ // 历史遗留:common.js 的 lang 对象整体即 common namespace,
+ // 但对象内部又有一个 'common: {...}' 子对象
+ assert.strictEqual(fakeLang(zh, 'buyNow'), '立即购买');
+ assert.strictEqual(fakeLang(zh, 'common.goodsRecommendTitle'), '猜你喜欢');
+ assert.strictEqual(fakeLang(en, 'buyNow'), 'Buy Now');
+ assert.strictEqual(fakeLang(en, 'common.goodsRecommendTitle'), 'Guess you like');
+});
+
+test('嵌套命名空间: 4 层路径 diy.networkErrorTitle', () => {
+ assert.strictEqual(fakeLang(zh, 'diy.networkErrorTitle'), '提示');
+ assert.strictEqual(fakeLang(en, 'diy.networkErrorTitle'), 'Notice');
+});
+
+// =============================================================
+// 5. 占位符替换细节
+// =============================================================
+
+test('占位符替换: 占位符的值含数字时,String() 强制转换', () => {
+ const stub = { msg: '价格 {price} 元' };
+ assert.strictEqual(
+ fakeLang(stub, 'msg', { price: 99 }),
+ '价格 99 元'
+ );
+ assert.strictEqual(
+ fakeLang(stub, 'msg', { price: 99.5 }),
+ '价格 99.5 元'
+ );
+});
+
+test('占位符替换: 占位符的值为 undefined 时,String(undefined) = "undefined"', () => {
+ const stub = { msg: 'name={name}' };
+ assert.strictEqual(
+ fakeLang(stub, 'msg', { name: undefined }),
+ 'name=undefined'
+ );
+});
+
+test('占位符替换: 占位符的值为 0/false 时,也会被替换(因为走 String 强制转换)', () => {
+ const stub = { msg: '数量 {n},启用 {on}' };
+ assert.strictEqual(
+ fakeLang(stub, 'msg', { n: 0, on: false }),
+ '数量 0,启用 false'
+ );
+});
+
+test('占位符替换: 占位符的值为空字符串', () => {
+ const stub = { msg: '前 [{x}] 后' };
+ assert.strictEqual(
+ fakeLang(stub, 'msg', { x: '' }),
+ '前 [] 后'
+ );
+});
+
+// =============================================================
+// 6. 真实业务 key 回归测试
+// =============================================================
+
+test('回归: 本次修复新增的 8 个 key 在两包中都有', () => {
+ const newKeys = [
+ 'diy.networkError',
+ 'wechatChannel.wechatMpOnly',
+ 'submitSuccess',
+ 'submitFail',
+ 'versionInfo',
+ 'commitId',
+ 'buildTime',
+ 'loading',
+ ];
+ for (const key of newKeys) {
+ const zhVal = fakeLang(zh, key);
+ const enVal = fakeLang(en, key);
+ assert.ok(typeof zhVal === 'string' && zhVal.length > 0, `zh ${key}="${zhVal}"`);
+ assert.ok(typeof enVal === 'string' && enVal.length > 0, `en ${key}="${enVal}"`);
+ assert.notStrictEqual(zhVal, enVal, `${key} 中英文必须不同`);
+ }
+});
+
+test('回归: 核心占位符场景 diy.loadFailTpl 不传参数会字面残留占位符', () => {
+ // 已知行为:reason 必填,如果不传,确实会字面残留(对齐 lang.js 行为)
+ // 实际 zh-cn 文案是中文标点「:」
+ const stub1 = { ...zh };
+ const out1 = fakeLang(stub1, 'diy.loadFailTpl');
+ // lang.js: value === field? 否(命中了 diy.loadFailTpl 的 leaf)→ 走占位符替换
+ // applyLangParams 的 args.length === 0 → 直接返回 value
+ assert.strictEqual(
+ out1,
+ '页面数据加载失败:{reason},请稍后重试',
+ '不传参数会字面残留占位符,这是已知行为'
+ );
+
+ // 但传了 reason 必须正确替换
+ assert.strictEqual(
+ fakeLang(zh, 'diy.loadFailTpl', { reason: 'X' }),
+ '页面数据加载失败:X,请稍后重试'
+ );
+});
+
+test('回归: zh-cn/en-us common.js 同 key 同结构(key 一致性)', () => {
+ const zhKeys = Object.keys(zh).sort();
+ const enKeys = Object.keys(en).sort();
+ assert.deepStrictEqual(
+ zhKeys,
+ enKeys,
+ 'zh-cn 与 en-us common.js 顶层 key 必须完全一致(否则会有 missing_key 风险)'
+ );
+});
+
+test('回归: 抽 zh/en 内 common 子对象 key 一致性', () => {
+ const zhCommon = Object.keys(zh.common || {}).sort();
+ const enCommon = Object.keys(en.common || {}).sort();
+ assert.deepStrictEqual(zhCommon, enCommon, 'zh/en common 子对象 key 一致');
+});
\ No newline at end of file
From 70a01bfd2be8bf8bb45fa3fad60aeaf08333d100 Mon Sep 17 00:00:00 2001
From: ZF sun <34314687@qq.com>
Date: Thu, 23 Jul 2026 10:37:22 +0800
Subject: [PATCH 5/8] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E5=A4=9A=E9=A1=B5?=
=?UTF-8?q?=E9=9D=A2=E5=9B=BD=E9=99=85=E5=8C=96=E6=96=87=E6=A1=88=E8=B0=83?=
=?UTF-8?q?=E7=94=A8=E8=B7=AF=E5=BE=84=E9=94=99=E8=AF=AF?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
将多处误用的 common.前缀国际化调用改为顶层路径,同时新增语言调用错误的回归测试用例,防止后续再次出现类似的命名空间误用问题
---
components-diy/diy-form.vue | 2 +-
.../ns-goods-recommend/ns-goods-recommend.vue | 2 +-
pages_goods/public/js/list.js | 2 +-
tests/lang.test.js | 60 +++++++++++++++++++
4 files changed, 63 insertions(+), 3 deletions(-)
diff --git a/components-diy/diy-form.vue b/components-diy/diy-form.vue
index f8fd923..ce66edd 100644
--- a/components-diy/diy-form.vue
+++ b/components-diy/diy-form.vue
@@ -308,7 +308,7 @@ export default {
success: function(res) {
if (res.code === 0) {
uni.showToast({
- title: self.$lang('common.submitSuccess'),
+ title: self.$lang('submitSuccess'),
icon: 'success'
});
// 重置表单
diff --git a/components/ns-goods-recommend/ns-goods-recommend.vue b/components/ns-goods-recommend/ns-goods-recommend.vue
index a1af059..4741b2a 100644
--- a/components/ns-goods-recommend/ns-goods-recommend.vue
+++ b/components/ns-goods-recommend/ns-goods-recommend.vue
@@ -69,7 +69,7 @@
mounted() {
// 初始化 i18n 默认文案,实际展示以服务端配置 config.title / config.text 为准
if (!this.config.title) this.config.title = this.$lang('common.goodsRecommendTitle');
- if (!this.config.text) this.config.text = this.$lang('common.buyNow');
+ if (!this.config.text) this.config.text = this.$lang('buyNow');
if (this.auto) {
this.getLikeList();
}
diff --git a/pages_goods/public/js/list.js b/pages_goods/public/js/list.js
index 822f3d8..da99d7c 100644
--- a/pages_goods/public/js/list.js
+++ b/pages_goods/public/js/list.js
@@ -67,7 +67,7 @@ export default {
},
onLoad(options) {
- this.config.text = this.$lang('goods.list.buyText') || this.$lang('common.buyNow');
+ this.config.text = this.$lang('goods.list.buyText') || this.$lang('buyNow');
this.$api.sendRequest({
url: '/api/lucky/status',
diff --git a/tests/lang.test.js b/tests/lang.test.js
index 7daae7d..563100d 100644
--- a/tests/lang.test.js
+++ b/tests/lang.test.js
@@ -387,6 +387,66 @@ test('嵌套命名空间: common 顶层键 vs common.common 子对象双层结
assert.strictEqual(fakeLang(en, 'common.goodsRecommendTitle'), 'Guess you like');
});
+test('嵌套命名空间: 双重 common. 误用回归保护(扫所有顶层 key)', () => {
+ // 防御:common.js 的 lang 对象整体即 common namespace,
+ // 顶层 key 不应再带 'common.' 前缀,否则会找不到
+ // 这个测试是 2026-07-23 真实 console 报错后追加的回归保护
+ //
+ // 策略:自动枚举 zh/en 顶层所有 key,
+ // 对每个 key,验证 fakeLang(zh, 'common.' + key) === ''
+ // —— 这样不管以后谁写出 common.,测试都会自动 fail
+
+ // 收集两包顶层 key 的并集(只要 zh 或 en 一方有就检查)
+ const topKeys = new Set();
+ for (const k of Object.keys(zh)) {
+ if (typeof zh[k] === 'string') topKeys.add(k);
+ }
+ for (const k of Object.keys(en)) {
+ if (typeof en[k] === 'string') topKeys.add(k);
+ }
+
+ const mistakes = [];
+ for (const k of topKeys) {
+ // 注意:跳过常见会被合法命中的 key(common 里的合法子对象)
+ // 这些 key 在 zh.common / en.common 子对象里也存在(双 common 合法)
+ if (zh.common && typeof zh.common[k] === 'string') continue;
+ if (en.common && typeof en.common[k] === 'string') continue;
+
+ const zhHit = fakeLang(zh, 'common.' + k);
+ const enHit = fakeLang(en, 'common.' + k);
+ if (zhHit !== '' || enHit !== '') {
+ mistakes.push({ k, zhHit, enHit });
+ }
+ }
+
+ if (mistakes.length > 0) {
+ console.error('以下 key 在顶层,但用 common. 调用居然命中了:');
+ for (const m of mistakes) {
+ console.error(` common.${m.k} → zh="${m.zhHit}" en="${m.enHit}"`);
+ }
+ }
+
+ assert.strictEqual(mistakes.length, 0,
+ '不应有任何 common. 调用能命中顶层 key(应该是空串)');
+});
+
+test('嵌套命名空间: 双重 common.buyNow 是不存在的(防止误用回归)', () => {
+ // 历史 bug:common.buyNow 被当作 fallback,实际 key 是顶层 buyNow
+ assert.strictEqual(
+ fakeLang(zh, 'common.buyNow'),
+ '',
+ 'common.buyNow 双前缀不存在,真实调用必须用 $lang("buyNow")'
+ );
+ assert.strictEqual(
+ fakeLang(en, 'common.buyNow'),
+ '',
+ 'en-us 同理,common.buyNow 双前缀不存在'
+ );
+ // 同时验证顶层 buyNow 存在
+ assert.strictEqual(fakeLang(zh, 'buyNow'), '立即购买');
+ assert.strictEqual(fakeLang(en, 'buyNow'), 'Buy Now');
+});
+
test('嵌套命名空间: 4 层路径 diy.networkErrorTitle', () => {
assert.strictEqual(fakeLang(zh, 'diy.networkErrorTitle'), '提示');
assert.strictEqual(fakeLang(en, 'diy.networkErrorTitle'), 'Notice');
From f51b601ecb40fbc4a6d5cba00751b9122b370f96 Mon Sep 17 00:00:00 2001
From: ZF sun <34314687@qq.com>
Date: Thu, 23 Jul 2026 11:04:54 +0800
Subject: [PATCH 6/8] =?UTF-8?q?feat(detail=E9=A1=B5):=20=E6=96=B0=E5=A2=9E?=
=?UTF-8?q?=E9=B8=BF=E8=92=99=E5=B0=8F=E7=A8=8B=E5=BA=8F=E7=AB=AF=E8=B4=AD?=
=?UTF-8?q?=E7=89=A9=E8=BD=A6=E5=92=8C=E5=85=B3=E6=B3=A8=E6=8C=89=E9=92=AE?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
补充鸿蒙小程序平台的专属操作按钮,包括购物车入口和收藏关注按钮,对齐其他平台的功能展示
---
pages_goods/detail.vue | 14 ++++++++++++--
1 file changed, 12 insertions(+), 2 deletions(-)
diff --git a/pages_goods/detail.vue b/pages_goods/detail.vue
index de47cf5..02c3a09 100644
--- a/pages_goods/detail.vue
+++ b/pages_goods/detail.vue
@@ -457,7 +457,7 @@
/>
-
+
+ />
+
+
+
+
From eefcc9fe57b54f49661e686fe8e0fd9505842d88 Mon Sep 17 00:00:00 2001
From: ZF sun <34314687@qq.com>
Date: Thu, 23 Jul 2026 11:34:03 +0800
Subject: [PATCH 7/8] =?UTF-8?q?feat:=20=E6=96=B0=E5=A2=9E=E9=B8=BF?=
=?UTF-8?q?=E8=92=99=E5=85=83=E6=9C=8D=E5=8A=A1=E5=B9=B3=E5=8F=B0=E9=80=82?=
=?UTF-8?q?=E9=85=8D?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
适配鸿蒙小程序平台,包括导航栏胶囊适配、支付通道支持、登录授权逻辑,以及分享功能兼容
---
components/ns-login/ns-login.vue | 78 +++++++++++++++++--
components/ns-navbar/ns-navbar.vue | 2 +-
components/ns-payment/ns-payment.vue | 7 ++
components/payment/payment.vue | 10 +++
.../goods-detail-view/goods-detail-view.vue | 2 +-
5 files changed, 89 insertions(+), 10 deletions(-)
diff --git a/components/ns-login/ns-login.vue b/components/ns-login/ns-login.vue
index 7ce6a3b..ab36c2e 100644
--- a/components/ns-login/ns-login.vue
+++ b/components/ns-login/ns-login.vue
@@ -56,10 +56,18 @@
+
+
+
+
+
+
+
+
+
+
+ {{ $lang('components.ns-login.mobileLabel') }}
+
+
+
+ {{ $lang('components.ns-login.captchaLabel') }}
+
+
+
+
+ {{ $lang('components.ns-login.dynacodeLabel') }}
+
+ {{ dynacodeData.codeText }}
+
+
+
+
+
{{ $lang('components.ns-login.notNow') }}
@@ -109,11 +138,20 @@
{{ $lang('components.ns-login.mobileLabel') }}
+
+
+
+
+
+ {{ formData.mobile }}
+ {{ $lang('components.ns-login.getMobile') }}
+
+
@@ -170,12 +208,16 @@ export default {
isSend: false
},
// 小程序获取手机号所需数据
- authMobileData: {
- iv: '',
- encryptedData: ''
- },
- site_name: ''
- };
+ authMobileData: {
+ iv: '',
+ encryptedData: ''
+ },
+ site_name: '',
+ // #ifdef MP-HARMONY
+ // 鸿蒙专属:控制手机号+验证码表单显示
+ showHarmonyMobileForm: false,
+ // #endif
+ };
},
options: {
styleIsolation: 'shared'
@@ -203,7 +245,7 @@ export default {
if (this.forceBindingMobileControl) {
if (this.formData.mobile.length == 0) return true;
- // #ifdef H5
+ // #ifdef H5 || MP-HARMONY
// 验证码
if (this.isOpenCaptcha == 1 && this.formData.vercode.length == 0) return true;
// 动态码
@@ -343,7 +385,7 @@ export default {
openCompleteInfoPop() {
this.getRegisterConfig();
- // #ifdef H5
+ // #ifdef H5 || MP-HARMONY
if (!this.storeToken) this.getCaptchaConfig();
// #endif
@@ -676,6 +718,26 @@ export default {
this.forceBindMobile();
},
+ // #ifdef MP-HARMONY
+ // 鸿蒙元服务保存手机号:复用 H5 的强制绑定手机号流程
+ harmonySaveMobile() {
+ if (this.forceBindingMobileControl) {
+ let data = {
+ mobile: this.formData.mobile,
+ key: this.formData.key,
+ code: this.formData.dynacode
+ };
+ if (this.captcha.id != '') {
+ data.captcha_id = this.captcha.id;
+ data.captcha_code = this.formData.vercode;
+ }
+ if (!this.verify(data)) return;
+ }
+ // 鸿蒙环境下通常也开启了 forceBindingMobileControl(走 forceBindMobile 接口)
+ this.forceBindMobile();
+ },
+ // #endif
+
// 微信小程序保存数据
saveMp() {
if (this.formData.mobile === '') {
diff --git a/components/ns-navbar/ns-navbar.vue b/components/ns-navbar/ns-navbar.vue
index a2b4c5e..2c52cfa 100644
--- a/components/ns-navbar/ns-navbar.vue
+++ b/components/ns-navbar/ns-navbar.vue
@@ -53,7 +53,7 @@
let systemInfo = uni.getSystemInfoSync();
let menuButtonInfo = {};
// 如果是小程序,获取右上角胶囊的尺寸信息,避免导航栏右侧内容与胶囊重叠(支付宝小程序非本API,尚未兼容)
-// #ifdef MP-WEIXIN || MP-BAIDU || MP-TOUTIAO || MP-QQ
+// #ifdef MP-WEIXIN || MP-BAIDU || MP-TOUTIAO || MP-QQ || MP-HARMONY
menuButtonInfo = uni.getMenuButtonBoundingClientRect();
// #endif
diff --git a/components/ns-payment/ns-payment.vue b/components/ns-payment/ns-payment.vue
index c5f99a5..db619bf 100644
--- a/components/ns-payment/ns-payment.vue
+++ b/components/ns-payment/ns-payment.vue
@@ -98,6 +98,13 @@ export default {
{ name: this.$lang('components.nsPayment.alipay'), icon: 'icon-zhifubaozhifu-', type: 'alipay', provider: 'alipay' },
];
// #endif
+ // #ifdef MP-HARMONY
+ // 鸿蒙元服务的支付通道: 与微信小程序相同的 provider='wxpay',
+ // 但走鸿蒙 JSSDK 的 requestPayment(走鸿蒙支付服务而非 wx.requestPayment)
+ this.payTypeList = [
+ { name: this.$lang('components.nsPayment.wechatpay'), provider: 'wxpay', icon: 'icon-weixin1', type: 'wechatpay' },
+ ];
+ // #endif
let url;
// #ifdef H5
diff --git a/components/payment/payment.vue b/components/payment/payment.vue
index ee7874a..e756c22 100644
--- a/components/payment/payment.vue
+++ b/components/payment/payment.vue
@@ -95,6 +95,16 @@
i18nKey: 'components.payment.alipay'
}],
// #endif
+ // #ifdef MP-HARMONY
+ // 鸿蒙元服务的支付通道: provider='wxpay' 由鸿蒙 JSSDK 接管
+ payTypeList: [{
+ name: '微信支付',
+ provider: 'wxpay',
+ icon: 'icon-weixin1',
+ type: 'wechatpay',
+ i18nKey: 'components.payment.wechatpay'
+ }],
+ // #endif
payInfo: null,
balanceConfig: 0,
// 预售页面判断
diff --git a/pages_goods/_components/goods-detail-view/goods-detail-view.vue b/pages_goods/_components/goods-detail-view/goods-detail-view.vue
index b9ebd6f..edfd882 100644
--- a/pages_goods/_components/goods-detail-view/goods-detail-view.vue
+++ b/pages_goods/_components/goods-detail-view/goods-detail-view.vue
@@ -461,7 +461,7 @@
{{ $lang('goods.detail.detailView.generateSharePoster') }}
-
+