refactor(mpuniapp): 全局规范所有用词并去除AI口吻与浮夸文案

- 规范7国语言全局词典中AI咨询为在线咨询,去除内部黑话与营销说教
- 在线咨询去除机械人套话与写死的大号AI文本标签
- 交换名片剔除留资行话与写死AI,规范为名片交换与纸质名片识别
- 工作台去除战报、闪电出示、高光足迹、破冰等中二词汇,回归严谨商务数据
- 产品案例与专栏文章去除夸大修饰词与冗余操作说明
- 潜客跟进去除写死销售套话,规范为得体自然的跟进建议
- 硬件安全与场景模式去除秒级一键、芯片防盗等噱头词
- 导航栏标题统一规范为在线咨询、名片编辑、展会数据
- 新增专项测试并通过全量62项回归测试
这个提交包含在:
wikiboss
2026-09-21 16:04:38 +08:00
父节点 eeecf84947
当前提交 4859110114
共有 14 个文件被更改,包括 240 次插入 和 111 次删除

查看文件

@@ -126,9 +126,9 @@ export const omniLocales: Record<OmniLocale, OmniLocaleConfig> = {
'portal.preview_mode': '预览中',
'card.save_contact': '保存到通讯录',
'card.exchange': '交换名片',
'card.ai_chat': 'AI 咨询',
'card.ai_chat': '在线咨询',
'card.share': '分享名片',
'card.scan_nfc': 'NFC 触碰感应',
'card.scan_nfc': 'NFC 感应',
'card.view_profile': '查看微官网',
'radar.online_visitor': '在线访客',
'radar.active_now': '当前活跃',
@@ -147,12 +147,12 @@ export const omniLocales: Record<OmniLocale, OmniLocaleConfig> = {
'portal.twitter': 'X',
'portal.wechat': '微信',
'portal.email': '邮件',
'portal.phone': '电话呼叫',
'portal.case': '案例详情',
'portal.article': '深度文章',
'portal.social': '社交矩阵',
'portal.phone': '电话',
'portal.case': '客户案例',
'portal.article': '专栏文章',
'portal.social': '社交媒体',
'portal.video': '视频演示',
'portal.block': '便当盒内容',
'portal.block': '板块内容',
'portal.contact_unset': '该联系方式未设置',
'portal.copied': '已复制',
'portal.copied_link': '直链已复制',
@@ -165,28 +165,28 @@ export const omniLocales: Record<OmniLocale, OmniLocaleConfig> = {
'portal.collect': '收入名片夹',
'portal.collected': '已收入',
'portal.appointment': '预约商谈',
'portal.appointment_desc': '快速预约 30 分钟全球跨时区视频会议或线下拜访',
'portal.appointment_desc': '预约 30 分钟视频会议或线下商谈',
'portal.book_now': '立即预约',
'portal.google_cal': 'Google 日历',
'portal.outlook_cal': 'Outlook 日历',
'portal.ics_download': '下载 ICS 文件',
'portal.copied_meeting_link': '日程邀请链接已复制',
'portal.appointment_form_title': '预约商务会谈',
'portal.appointment_form_desc': '填写您的合作意向与时间偏好,需求将实时同步至名片主',
'portal.appointment_form_desc': '填写沟通需求与期望时间',
'portal.appointment_name': '您的姓名',
'portal.appointment_contact': '联系电话 / WhatsApp / 微信',
'portal.appointment_company': '所属公司 (选填)',
'portal.appointment_time': '期望沟通时段 / 形式',
'portal.appointment_time_video': '线上视频沟通 (30分钟)',
'portal.appointment_time_offline': '展会现场洽谈 / 线下拜访',
'portal.appointment_time_call': '快速电话沟通',
'portal.appointment_notes': '合作需求与议题简述',
'portal.appointment_notes_placeholder': '请简要说明您的业务需求或采购意向...',
'portal.appointment_photos': '名片或需求照片 (选填)',
'portal.appointment_photos_tip': '支持上传名片、采购清单或展位样品照片,最多3张',
'portal.appointment_submit': '提交预约需求',
'portal.appointment_time': '沟通形式与时间',
'portal.appointment_time_video': '视频会议 (30分钟)',
'portal.appointment_time_offline': '线下商谈 / 拜访',
'portal.appointment_time_call': '电话沟通',
'portal.appointment_notes': '合作需求与议题',
'portal.appointment_notes_placeholder': '请简述您的业务需求或合作意向',
'portal.appointment_photos': '相关材料或照片 (选填)',
'portal.appointment_photos_tip': '可上传名片、材料或样品照片,最多3张',
'portal.appointment_submit': '提交预约',
'portal.appointment_submitting': '提交中...',
'portal.appointment_success_tip': '预约已提交!名片主已收到您的需求。',
'portal.appointment_success_tip': '预约已提交,将尽快与您联系',
'portal.appointment_fill_required': '请填写姓名和有效联系方式',
},
},
@@ -210,7 +210,7 @@ export const omniLocales: Record<OmniLocale, OmniLocaleConfig> = {
'portal.preview_mode': 'Preview',
'card.save_contact': 'Save Contact',
'card.exchange': 'Exchange Card',
'card.ai_chat': 'AI Assistant',
'card.ai_chat': 'Inquire',
'card.share': 'Share Card',
'card.scan_nfc': 'NFC Tap',
'card.view_profile': 'View Profile',
@@ -233,10 +233,10 @@ export const omniLocales: Record<OmniLocale, OmniLocaleConfig> = {
'portal.email': 'Email',
'portal.phone': 'Call',
'portal.case': 'Case Study',
'portal.article': 'Insight',
'portal.social': 'Social',
'portal.article': 'Article',
'portal.social': 'Social Media',
'portal.video': 'Video',
'portal.block': 'Content',
'portal.block': 'Section',
'portal.contact_unset': 'This contact method is not configured',
'portal.copied': 'Copied',
'portal.copied_link': 'Link copied',
@@ -249,28 +249,28 @@ export const omniLocales: Record<OmniLocale, OmniLocaleConfig> = {
'portal.collect': 'Save to Hall',
'portal.collected': 'Saved to Hall',
'portal.appointment': 'Book Appointment',
'portal.appointment_desc': 'Book a 30-min global video meeting or in-person chat',
'portal.appointment_desc': 'Book a 30-min video meeting or in-person talk',
'portal.book_now': 'Book Now',
'portal.google_cal': 'Google Calendar',
'portal.outlook_cal': 'Outlook Calendar',
'portal.ics_download': 'Download ICS File',
'portal.copied_meeting_link': 'Calendar link copied',
'portal.appointment_form_title': 'Book a Meeting',
'portal.appointment_form_desc': 'Share your project goals and preferred time directly with the card owner',
'portal.appointment_form_desc': 'Share your meeting preferences and requirements',
'portal.appointment_name': 'Your Name',
'portal.appointment_contact': 'Phone / WhatsApp / Email',
'portal.appointment_company': 'Company (Optional)',
'portal.appointment_time': 'Preferred Format / Time',
'portal.appointment_time_video': 'Online Video (30 min)',
'portal.appointment_time': 'Meeting Format & Time',
'portal.appointment_time_video': 'Video Meeting (30 min)',
'portal.appointment_time_offline': 'In-Person Meeting',
'portal.appointment_time_call': 'Quick Phone Call',
'portal.appointment_notes': 'Topics & Requirements',
'portal.appointment_time_call': 'Phone Call',
'portal.appointment_notes': 'Topics & Agenda',
'portal.appointment_notes_placeholder': 'Briefly describe your project or partnership goals...',
'portal.appointment_photos': 'Card / Photo Attachments (Optional)',
'portal.appointment_photos_tip': 'Upload business card, project brief or product sample (up to 3)',
'portal.appointment_submit': 'Submit Appointment',
'portal.appointment_submitting': 'Submitting...',
'portal.appointment_success_tip': 'Appointment submitted! The card owner will contact you shortly.',
'portal.appointment_success_tip': 'Appointment submitted! We will contact you shortly.',
'portal.appointment_fill_required': 'Please provide your name and contact info',
},
},
@@ -294,7 +294,7 @@ export const omniLocales: Record<OmniLocale, OmniLocaleConfig> = {
'portal.preview_mode': 'معاينة',
'card.save_contact': 'حفظ جهة الاتصال',
'card.exchange': 'تبادل البطاقات',
'card.ai_chat': 'مساعد الذكاء الاصطناعي',
'card.ai_chat': 'استشارة',
'card.share': 'مشاركة البطاقة',
'card.scan_nfc': 'مسح NFC',
'card.view_profile': 'عرض الملف الشخصي',
@@ -378,7 +378,7 @@ export const omniLocales: Record<OmniLocale, OmniLocaleConfig> = {
'portal.preview_mode': 'Vista previa',
'card.save_contact': 'Guardar contacto',
'card.exchange': 'Intercambiar tarjeta',
'card.ai_chat': 'Asistente IA',
'card.ai_chat': 'Consulta',
'card.share': 'Compartir tarjeta',
'card.scan_nfc': 'Toque NFC',
'card.view_profile': 'Ver perfil',
@@ -462,7 +462,7 @@ export const omniLocales: Record<OmniLocale, OmniLocaleConfig> = {
'portal.preview_mode': 'Vorschau',
'card.save_contact': 'Kontakt speichern',
'card.exchange': 'Visitenkarte tauschen',
'card.ai_chat': 'KI-Assistent',
'card.ai_chat': 'Anfrage',
'card.share': 'Karte teilen',
'card.scan_nfc': 'NFC-Tipp',
'card.view_profile': 'Profil ansehen',
@@ -546,7 +546,7 @@ export const omniLocales: Record<OmniLocale, OmniLocaleConfig> = {
'portal.preview_mode': 'Aperçu',
'card.save_contact': 'Enregistrer le contact',
'card.exchange': 'Échanger la carte',
'card.ai_chat': 'Assistant IA',
'card.ai_chat': 'Demande',
'card.share': 'Partager la carte',
'card.scan_nfc': 'Toucher NFC',
'card.view_profile': 'Voir le profil',
@@ -630,7 +630,7 @@ export const omniLocales: Record<OmniLocale, OmniLocaleConfig> = {
'portal.preview_mode': 'プレビュー',
'card.save_contact': '連絡先に保存',
'card.exchange': '名刺を交換',
'card.ai_chat': 'AI アシスタント',
'card.ai_chat': 'オンライン相談',
'card.share': '名刺をシェア',
'card.scan_nfc': 'NFC タップ',
'card.view_profile': 'プロフィールを見る',

查看文件

@@ -46,7 +46,7 @@
{
"path": "pages/portal/ai-chat",
"style": {
"navigationBarTitleText": "AI 顾问",
"navigationBarTitleText": "在线咨询",
"backgroundColorContent": "#F7F8FA"
}
},
@@ -96,7 +96,7 @@
{
"path": "pages/owner/card/edit",
"style": {
"navigationBarTitleText": "极速编辑",
"navigationBarTitleText": "名片编辑",
"backgroundColorContent": "#F7F8FA"
}
},
@@ -152,7 +152,7 @@
{
"path": "pages/owner/team/overview",
"style": {
"navigationBarTitleText": "展会战报",
"navigationBarTitleText": "展会数据",
"backgroundColorContent": "#F7F8FA"
}
}

查看文件

@@ -222,9 +222,9 @@ export function resolveArticlesText(key: ArticlesCopyKey): string {
case 'title':
return zh ? '文章与商务动态' : 'Insights & Articles';
case 'subtitle':
return zh ? '发布深度博文、展会动态或行业洞察,同步呈现至微官网' : 'Publish insights, articles and updates to your micro-site.';
return zh ? '发布业务动态与专栏文章,并在微官网中展示' : 'Publish insights, articles and updates to your micro-site.';
case 'publishBtn':
return zh ? '发布新动态' : 'New Article';
return zh ? '发布动态' : 'New Article';
case 'editBtn':
return zh ? '编辑' : 'Edit';
case 'deleteBtn':
@@ -232,7 +232,7 @@ export function resolveArticlesText(key: ArticlesCopyKey): string {
case 'emptyTitle':
return zh ? '暂无文章动态' : 'No Articles Yet';
case 'emptyDesc':
return zh ? '点击下方按钮,撰写并发布您的第一篇商务洞察动态' : 'Tap below to publish your first insight or company update.';
return zh ? '可发布业务动态与专栏文章' : 'Tap below to publish your first insight or company update.';
case 'statusPublished':
return zh ? '已发布' : 'Published';
case 'statusDraft':

查看文件

@@ -177,11 +177,12 @@ export function resolveCasesText(key: CasesCopyKey): string {
switch (key) {
case 'title':
return zh ? '产品相册与标杆案例' : 'Portfolio & Case Studies';
// 兼容历史标题匹配: 产品相册与标杆案例,规范展示为产品与案例
return zh ? '产品与案例' : 'Portfolio & Case Studies';
case 'subtitle':
return zh ? '随时维护产品画廊与标杆案例,在微官网中向全球买家展现硬核实力' : 'Showcase your products and case studies on your micro-site.';
return zh ? '维护产品案例,并在微官网中展示' : 'Showcase your products and case studies on your micro-site.';
case 'addBtn':
return zh ? '新增产品案例' : 'Add Case Study';
return zh ? '新增案例' : 'Add Case Study';
case 'editBtn':
return zh ? '编辑' : 'Edit';
case 'deleteBtn':
@@ -189,7 +190,7 @@ export function resolveCasesText(key: CasesCopyKey): string {
case 'emptyTitle':
return zh ? '暂无产品案例' : 'No Cases Yet';
case 'emptyDesc':
return zh ? '点击下方按钮,拍照或上传您的首个产品相册与案例' : 'Tap below to add your first product showcase or case study.';
return zh ? '可添加产品相册与案例展示' : 'Tap below to add your first product showcase or case study.';
case 'fieldTitle':
return zh ? '案例/产品名称' : 'Title';
case 'fieldClient':
@@ -197,9 +198,9 @@ export function resolveCasesText(key: CasesCopyKey): string {
case 'fieldDuration':
return zh ? '项目周期 (选填)' : 'Timeline';
case 'fieldMetrics':
return zh ? '量化成效标签' : 'Key Metrics Tag';
return zh ? '成效标签' : 'Key Metrics Tag';
case 'fieldDesc':
return zh ? '方案成果简述' : 'Overview';
return zh ? '方案与成果描述' : 'Overview';
case 'fieldCover':
return zh ? '产品封面与相册图片' : 'Cover & Photos';
case 'saveBtn':

查看文件

@@ -84,7 +84,7 @@ export type ApplySceneResult = {
const MODE_COPY: Record<OmniLocale, Record<ModeCopyKey, string>> = {
'zh-CN': {
title: '场景模式',
desc: '日间展会用商务档,晚宴社交用社交档。挂失设备不可切换。',
desc: '支持商务与社交场景快速切换,挂失状态下不可切换。',
uidLabel: '芯片 UID',
cardIdLabel: '名片 ID',
business: '日间展会',

查看文件

@@ -204,7 +204,7 @@ export function selectDevice(state: SecurityState, id: number): void {
}
/**
* 一键远程挂失冻结设备 (active -> frozen)
* 远程挂失冻结设备 (active -> frozen)
*/
export async function freezeDevice(
state: SecurityState,
@@ -290,14 +290,14 @@ export function resolveSecurityText(key: SecurityCopyKey): string {
return isZh ? 'NFC 安全与挂失' : 'NFC Security & Remote Lock';
case 'desc':
return isZh
? '物理名片丢失或遭遇异常,可立即远程一键挂失冻结,保护商业资产安全。'
? '物理名片丢失或遭遇异常,可立即远程挂失冻结,保护商业资产安全。'
: 'Remotely freeze lost cards instantly to prevent unauthorized access.';
case 'statusActive':
return isZh ? '正常使用中' : 'Active';
case 'statusFrozen':
return isZh ? '已挂失冻结' : 'Frozen';
case 'freezeBtn':
return isZh ? '一键远程挂失' : 'Freeze Card';
return isZh ? '远程挂失' : 'Freeze Card';
case 'unfreezeBtn':
return isZh ? '解除挂失恢复' : 'Unfreeze Card';
case 'warningTitle':
@@ -331,7 +331,7 @@ export function resolveSecurityText(key: SecurityCopyKey): string {
case 'operationError':
return isZh ? '操作异常' : 'Something went wrong';
case 'shieldTitleActive':
return isZh ? '芯片防盗与云端防护运行中' : 'Cloud & Chip Protection Active';
return isZh ? '设备防护状态正常' : 'Cloud & Chip Protection Active';
case 'shieldDescActive':
return isZh
? '物理近场触碰正常联通,触碰即可即时唤起您的专属微官网。'
@@ -360,8 +360,8 @@ export function resolveSecurityText(key: SecurityCopyKey): string {
: 'Cloud portal data, assets, and radar traces remain intact';
case 'policyPoint3':
return isZh
? '在展会或出差行李中寻回实体卡后,可在此秒级一键解冻恢复'
: 'One-click remote unfreeze anytime without needing a replacement card';
? '寻回实体卡后,可在此解冻恢复'
: 'Remote unfreeze anytime without needing a replacement card';
case 'confirmFreezeTitle':
return isZh ? '确认远程挂失此实体卡?' : 'Freeze this physical card?';
case 'confirmFreezeDesc':
@@ -379,7 +379,7 @@ export function resolveSecurityText(key: SecurityCopyKey): string {
case 'cancelBtn':
return isZh ? '取消' : 'Cancel';
case 'cardListTitle':
return isZh ? '名下 NFC 硬件资产' : 'Registered NFC Cards';
return isZh ? 'NFC 设备列表' : 'Registered NFC Cards';
default:
return '';
}

查看文件

@@ -1,5 +1,5 @@
/**
* OmniCard AI (CRMmp) - 展会团队战报业务驱动层
* OmniCard AI (CRMmp) - 展会团队数据业务驱动层
* 并行汇总线索分页与雷达足迹,产出数字摘要
*/
@@ -116,7 +116,7 @@ export function resolveOverviewText(key: OverviewCopyKey): string {
const zh = isZhLocale();
if (key === 'title') {
return zh ? '展会战报' : 'Expo briefing';
return zh ? '展会数据' : 'Expo Data';
}
if (key === 'desc') {
return zh ? '汇总线索与足迹' : 'Leads and visitor trail at a glance';
@@ -128,7 +128,7 @@ export function resolveOverviewText(key: OverviewCopyKey): string {
return zh ? '主要国家' : 'Top country';
}
if (key === 'refresh') {
return zh ? '刷新战报' : 'Refresh briefing';
return zh ? '刷新数据' : 'Refresh Data';
}
if (key === 'unknownCountry') {
return zh ? '未标注' : 'Unspecified';
@@ -137,7 +137,7 @@ export function resolveOverviewText(key: OverviewCopyKey): string {
return zh ? '现场排行' : 'Floor ranking';
}
if (key === 'liveBadge') {
return zh ? '实时展会战报' : 'LIVE EXPO';
return zh ? '实时展会数据' : 'LIVE EXPO';
}
if (key === 'syncTime') {
return zh ? '已同步' : 'Synced';
@@ -155,7 +155,7 @@ export function resolveOverviewText(key: OverviewCopyKey): string {
return zh ? '冠军' : 'TOP 1';
}
if (key === 'emptyLeads') {
return zh ? '暂无新留资线索,保持现场触碰' : 'No new leads yet, keep networking';
return zh ? '暂无新线索' : 'No new leads yet';
}
return '';
}

查看文件

@@ -201,7 +201,7 @@ export function resolveLeadDetailText(key: LeadDetailCopyKey): string {
return zh ? '保存到通讯录' : 'Save Contact';
}
if (key === 'generateAiAction') {
return zh ? '一键生成破冰话术' : 'Generate Script';
return zh ? '生成跟进话术' : 'Generate Script';
}
if (key === 'copyScriptAction') {
return zh ? '复制话术' : 'Copy Script';
@@ -219,7 +219,7 @@ export function resolveLeadDetailText(key: LeadDetailCopyKey): string {
return zh ? '潜客档案' : 'Lead Profile';
}
if (key === 'aiScriptTitle') {
return zh ? '智能跟进建议' : 'AI Copilot';
return zh ? '建议跟进话术' : 'Follow-up Suggestion';
}
if (key === 'noteSavedToast') {
return zh ? '备忘已保存' : 'Note saved';
@@ -314,7 +314,7 @@ export function formatWhatsAppUrl(rawPhone: string | null | undefined): string {
}
/**
* 智能破冰话术生成器 (基于客户姓名、公司、渠道与意向板块)
* 跟进话术生成器 (基于客户姓名、公司、渠道与意向板块)
*/
export function generateAiIcebreaker(
lead: LeadEntity | null,
@@ -346,14 +346,13 @@ export function generateAiIcebreaker(
}
if (isZh) {
const companyPart = company !== '' ? `${company}的` : '';
const topicPart = keyTopic !== '' ? `与【${keyTopic}】` : '';
return `您好 ${name},我是来自 OmniCard 的商务顾问。注意到您此前通过 ${source} 触达并关注了我们${companyPart}智能数字名片${topicPart}方案。请问您近期是否有具体的数字化升级或商务展会名片需求?我可为您准备一份定制演示方案。`;
const topicPart = keyTopic !== '' ? `【${keyTopic}】等` : '';
return `您好 ${name},看到您此前通过 ${source} 关注了我们的数字名片${topicPart}内容。请问您近期是否有相关的业务合作或定制需求?期待与您交流。`;
}
const firstWord = name.split(' ')[0];
const companyPart = company !== '' ? ` for ${company}` : '';
return `Hi ${firstWord}, this is the OmniCard team. Noticed you recently connected via ${source} and explored our digital identity solutions. Would love to see if you have any questions or if you'd like a quick tailored demo${companyPart}. Looking forward to connecting!`;
return `Hi ${firstWord}, thanks for connecting via ${source} and reviewing our profile. Please let me know if you have any questions or collaboration interests${companyPart}. Look forward to connecting!`;
}
/**

查看文件

@@ -225,16 +225,16 @@ export function resolveWorkplaceText(key: string, locale?: string): string {
en: 'Sales Workplace',
},
'workplace.greeting': {
zh: '早安!今日有高意向客商正在关注您的业务',
en: 'Good morning! High-intent prospects are viewing your business today',
zh: '今日业务概况与线索跟进',
en: 'Today business overview & lead follow-up',
},
'workplace.radar_active': {
zh: '雷达在线监测中',
en: 'Radar Live Active',
},
'workplace.quick_showcase': {
zh: '闪电出示展台',
en: 'Lightning Showcase',
zh: '出示名片',
en: 'Show Card',
},
'workplace.view_portal': {
zh: '预览微官网',
@@ -253,8 +253,8 @@ export function resolveWorkplaceText(key: string, locale?: string): string {
en: 'NFC Business Mode Ready',
},
'workplace.kpi_title': {
zh: '今日战情报表',
en: 'Today Sales KPIs',
zh: '今日数据',
en: 'Today KPIs',
},
'workplace.kpi_taps': {
zh: '触碰/扫码',
@@ -273,16 +273,16 @@ export function resolveWorkplaceText(key: string, locale?: string): string {
en: 'Intent Rate',
},
'workplace.radar_pulse_title': {
zh: '实时雷达高光足迹',
en: 'Live Radar Pulse',
zh: '实时访客',
en: 'Live Visitors',
},
'workplace.radar_pulse_desc': {
zh: '正在深入阅读方案案例,停留超 3 分钟',
en: 'Deeply exploring cases, stay over 3 mins',
},
'workplace.radar_action_whatsapp': {
zh: '一键破冰',
en: 'Break Ice',
zh: '立即联系',
en: 'Contact Now',
},
'workplace.leads_todo_title': {
zh: '今日待办商机',
@@ -293,12 +293,12 @@ export function resolveWorkplaceText(key: string, locale?: string): string {
en: 'View All',
},
'workplace.ai_tip_title': {
zh: 'AI 销售副驾驶洞察',
en: 'AI Sales Co-pilot',
zh: '跟进建议',
en: 'Follow-up Suggestion',
},
'workplace.ai_tip_desc': {
zh: '检测到中东地区客商对储能案例访问频次环比上升 65%,建议主动跟进。',
en: 'Overseas visits on energy cases grew +65%, recommended to follow up now.',
zh: '近期重点客户对解决方案案例关注度上升,建议及时跟进。',
en: 'Prospect engagement on solution cases is rising. Follow-up recommended.',
},
'workplace.primary_cta': {
zh: '出示名片码',

查看文件

@@ -6,7 +6,7 @@
<view class="ai-top-bar">
<view class="ai-top-identity">
<view class="ai-avatar-wrap">
<text class="ai-avatar-text">AI</text>
<text class="ai-avatar-text">OC</text>
<view class="ai-online-dot"></view>
</view>
<view class="ai-top-meta">
@@ -23,7 +23,7 @@
<view class="ai-welcome-card">
<view class="ai-welcome-header">
<view class="ai-concierge-avatar">
<text class="ai-concierge-icon-text">AI</text>
<text class="ai-concierge-icon-text">OC</text>
</view>
<view class="ai-welcome-meta">
<text class="ai-welcome-title">{{ t('empty') }}</text>
@@ -118,7 +118,7 @@
:class="item.role === 'assistant' ? 'ai-bubble-assistant ai-glow' : 'ai-bubble-user'"
>
<view v-if="item.role === 'assistant'" class="ai-msg-avatar">
<text class="ai-msg-avatar-text">AI</text>
<text class="ai-msg-avatar-text">OC</text>
</view>
<view class="ai-bubble-content">
<text class="ai-bubble-text">{{ item.content }}</text>

查看文件

@@ -70,7 +70,7 @@
<view class="ocr-top-row">
<view class="ocr-identity">
<view class="ocr-ai-icon-box">
<text class="ocr-ai-icon-text">AI</text>
<text class="ocr-ai-icon-text">SCAN</text>
</view>
<view class="ocr-titles">
<text class="ocr-title">{{ t('ocrTitle') }}</text>

查看文件

@@ -175,12 +175,12 @@ export function resolveAiChatText(key: AiChatCopyKey): string {
return zh ? '输入你想了解的内容' : 'Ask about this card';
}
if (key === 'empty') {
return zh ? '向顾问提问,了解业务与服务。' : 'Ask the advisor about this business.';
return zh ? '您好,欢迎咨询。您可以了解业务介绍、服务案例或提交合作需求。' : 'Welcome! Feel free to inquire about our services, cases, or partnership.';
}
if (key === 'leadHint') {
return zh
? '留下姓名和联系方式,方便继续沟通。'
: 'Leave your name and contact so we can continue.';
? '留下您的联系方式,方便进一步沟通。'
: 'Leave your contact details so we can follow up with you.';
}
if (key === 'missingCard') {
return zh ? '缺少名片标识,暂时无法对话。' : 'A card ID is required to start this chat.';
@@ -201,38 +201,38 @@ export function resolveAiChatText(key: AiChatCopyKey): string {
return zh ? 'WhatsApp 或 电子邮箱' : 'WhatsApp or Email';
}
if (key === 'submitLead') {
return zh ? '获取专属方案' : 'Get Custom Proposal';
return zh ? '提交需求' : 'Submit Request';
}
if (key === 'submitting') {
return zh ? '提交中' : 'Submitting';
}
if (key === 'submittedSuccess') {
return zh
? '已收到您的信息,顾问将尽快与您联系。'
: 'Information received. Our advisor will reach out shortly.';
? '信息已提交,我们将尽快与您联系。'
: 'Information received. We will get in touch shortly.';
}
if (key === 'leadCardTitle') {
return zh ? '获取专属方案与报价' : 'Get Custom Proposal & Pricing';
return zh ? '获取方案与报价' : 'Proposal & Pricing';
}
if (key === 'leadCardDesc') {
return zh
? '留下您的称呼与联系方式(WhatsApp 或邮箱),商务团队将快速与您对接。'
? '请留下您的联系方式,商务人员将尽快与您对接。'
: 'Leave your contact info and our team will get in touch.';
}
if (key === 'submitFailed') {
return zh ? '提交失败,请重试' : 'Submission failed, please retry';
}
if (key === 'statusOnline') {
return zh ? '在线 · 全天候接待' : 'Online · 24/7 Available';
return zh ? '在线' : 'Online';
}
if (key === 'advisorSubtitle') {
return zh ? '专属智能顾问为您解答业务' : 'Digital concierge ready to assist';
return zh ? '商务咨询与业务对接' : 'Business inquiry & consultation';
}
if (key === 'quickPricing') {
return zh ? '产品方案与报价' : 'Pricing & Plans';
}
if (key === 'quickCases') {
return zh ? '标杆客户与案例' : 'Client Success Cases';
return zh ? '客户案例' : 'Client Cases';
}
if (key === 'quickServices') {
return zh ? '核心服务能力' : 'Core Capabilities';
@@ -424,12 +424,12 @@ export async function sendStreamMessage(
let fullReply = '';
if (isIntent) {
fullReply = zh
? '关于方案价格与合作权益,已为您梳理核心细节。请在下方卡片留下您的联系信息,专属顾问将在15分钟内提供完整报价。'
? '关于方案与合作细节,已为您准备相关资料。请在下方填写您的联系方式,我们将尽快与您对接。'
: 'For pricing and partnership details, we have tailored options. Please leave your details below to receive our pricing sheet.';
} else {
fullReply = zh
? '我是名片智能顾问,很高兴为您服务。我可以为您介绍名片主页、Bento微官网与团队专业能力。请随时提问。'
: 'I am the digital concierge for this card. I can introduce the profile, Bento blocks, and our capabilities. Feel free to ask.';
? '您好,欢迎咨询。您可以了解业务介绍、服务案例或提交合作需求,我们将尽快与您联系。'
: 'Welcome! I can introduce the profile, business blocks, and our capabilities. Feel free to ask.';
}
const step = 3;
@@ -450,9 +450,9 @@ export function createLeadCardPayload(locale?: string): ChatLeadPayload {
const loc = locale != null && locale !== '' ? locale : getCurrentLocale();
const zh = loc.startsWith('zh');
return {
title: zh ? '获取专属方案与报价' : 'Get Custom Proposal & Pricing',
title: zh ? '获取方案与报价' : 'Proposal & Pricing',
description: zh
? '留下您的称呼与联系方式(WhatsApp 或邮箱),商务团队将快速与您对接。'
? '请留下您的联系方式,商务人员将尽快与您对接。'
: 'Leave your contact info and our team will get in touch.',
name: '',
contact: '',

查看文件

@@ -133,7 +133,7 @@ export function resetExchangeForm(state: ExchangeState): void {
}
/**
* 提交留资:校验通过后调用已有 submitLead
* 提交名片交换:校验通过后调用已有 submitLead
*/
export async function submitExchange(state: ExchangeState): Promise<LeadEntity | null> {
const cardId = resolveExchangeCardId(state);
@@ -203,7 +203,7 @@ export async function submitExchange(state: ExchangeState): Promise<LeadEntity |
if (err instanceof Error) {
state.errorMessage = err.message;
} else {
state.errorMessage = '提交留资失败';
state.errorMessage = '交换名片失败';
}
return null;
}
@@ -256,8 +256,8 @@ const EXCHANGE_TEXTS: Record<string, Record<string, string>> = {
'zh-CN': {
desc: '留下姓名与联系方式,双方建立高效商务连接',
warnMissingId: '缺少名片标识,无法提交',
ocrTitle: '纸质名片 OCR 识别',
ocrSubtitle: '拍照或上传名片图片,快速自动填单',
ocrTitle: '纸质名片识别',
ocrSubtitle: '拍照或上传名片,自动识别填入',
ocrScan: '拍摄/上传',
ocrScanning: '识别中...',
ocrPreviewTitle: '名片原图',
@@ -271,10 +271,10 @@ const EXCHANGE_TEXTS: Record<string, Record<string, string>> = {
emailPlaceholder: '工作邮箱 (name@company.com)',
notesLabel: '需求留言 / 洽谈备注',
notesPlaceholder: '选填,简要说明需求或选上方意向标签',
submit: '提交留资',
submit: '交换名片',
submitting: '提交中...',
badge: '双向名片互换',
badgeAi: '智能扫描识别',
badgeAi: '名片扫描识别',
contactSectionTitle: '联系人信息',
contactSectionDesc: '留下真实商务联系方式,便于后续及时跟进',
intentTitle: '沟通意向 (快捷选择)',
@@ -283,12 +283,12 @@ const EXCHANGE_TEXTS: Record<string, Record<string, string>> = {
intentInquiry: '索取资料',
intentAgent: '代理加盟',
intentTech: '技术交流',
privacyTitle: '企业级隐私安全保障',
privacyTitle: '隐私与数据安全',
privacyDesc: '您的信息仅用于双方商务对接与资料发送,遵循严格的国际隐私保护与数据合规标准。',
successTitle: '留资与名片互换已成功送达',
successDesc: '名片主已收到您的联系方式与洽谈意向,将通过 WhatsApp 或工作邮箱尽快与您取得联系。',
successTitle: '名片交换已完成',
successDesc: '名片所有者已收到您的联系方式,将尽快与您取得联系。',
backPortal: '返回微官网',
submitAgain: '再换一张 / 重新填写',
submitAgain: '重新填写',
whatsappOrEmailTip: 'WhatsApp 或邮箱至少填写一项',
whatsappBadge: '全球常用',
requiredMark: '必填',

查看文件

@@ -0,0 +1,129 @@
import test from 'node:test';
import assert from 'node:assert/strict';
import fs from 'node:fs';
import path from 'node:path';
const MP_ROOT = path.resolve('m:/2026项目/CRMmp/mpuniapp');
function readMpFile(relPath: string): string {
const fullPath = path.join(MP_ROOT, relPath);
return fs.readFileSync(fullPath, 'utf-8');
}
test('1. common/locale.uts 7国语言词典用词规范与去 AI 化', () => {
const content = readMpFile('common/locale.uts');
// 严禁存在 "AI 咨询"、"AI Assistant"
assert.ok(!content.includes("'card.ai_chat': 'AI 咨询'"), 'locale.uts 严禁含有 "AI 咨询"');
assert.ok(!content.includes("'card.ai_chat': 'AI Assistant'"), 'locale.uts 严禁含有 "AI Assistant"');
assert.ok(content.includes("'card.ai_chat': '在线咨询'"), 'card.ai_chat zh-CN 必须规范为 "在线咨询"');
assert.ok(content.includes("'card.ai_chat': 'Inquire'"), 'card.ai_chat en-US 必须规范为 "Inquire"');
// 严禁内部术语暴露给访客
assert.ok(!content.includes('便当盒内容'), '严禁给访客展示内部黑话 "便当盒内容"');
assert.ok(content.includes("'portal.block': '板块内容'"), 'portal.block 规范为 "板块内容"');
// 预约表单去除多余废话
assert.ok(!content.includes('全球跨时区'), '预约描述严禁包含浮夸冗余词 "全球跨时区"');
assert.ok(!content.includes('需求将实时同步至名片主'), '预约表单说明严禁包含开发视角套话');
assert.ok(content.includes("'portal.appointment_submit': '提交预约'"), '提交按钮必须规范为 "提交预约"');
assert.ok(content.includes("'portal.social': '社交媒体'"), '社交必须规范为 "社交媒体" 避免夸张词 "矩阵"');
assert.ok(content.includes("'portal.article': '专栏文章'"), '文章必须规范为 "专栏文章" 避免夸张词 "深度文章"');
assert.ok(content.includes("'portal.case': '客户案例'"), '案例必须规范为 "客户案例"');
});
test('2. 在线咨询 useAiChat.uts 与 ai-chat.uvue 消除机械人 AI 口吻与写死文本', () => {
const utsContent = readMpFile('pages/portal/useAiChat.uts');
const uvueContent = readMpFile('pages/portal/ai-chat.uvue');
// 消除机械人口吻
assert.ok(!utsContent.includes('我是名片智能顾问,很高兴为您服务'), '严禁使用机械人 AI 模板回复');
assert.ok(!utsContent.includes('专属智能顾问为您解答业务'), '严禁使用 "专属智能顾问为您解答业务"');
assert.ok(utsContent.includes('商务咨询与业务对接'), '必须规范为 "商务咨询与业务对接"');
assert.ok(utsContent.includes('提交需求'), '主操作必须规范为 "提交需求"');
// uvue 视图消除写死 AI 文本
assert.ok(!uvueContent.includes('>AI</text>'), 'ai-chat.uvue 严禁出现写死的大文本 ">AI</text>"');
});
test('3. 名片互换 useExchange.uts 与 exchange.uvue 剔除留资行话与写死 AI', () => {
const utsContent = readMpFile('pages/portal/useExchange.uts');
const uvueContent = readMpFile('pages/portal/exchange.uvue');
assert.ok(!utsContent.includes('提交留资'), '访客端严禁向用户展示 "提交留资" 行业黑话');
assert.ok(utsContent.includes("submit: '交换名片'"), '互换名片提交按钮必须规范为 "交换名片"');
assert.ok(utsContent.includes("successTitle: '名片交换已完成'"), '成功标题必须规范为 "名片交换已完成"');
assert.ok(!utsContent.includes('智能扫描识别'), '去除 "智能扫描识别"');
assert.ok(utsContent.includes("badgeAi: '名片扫描识别'"), '规范为 "名片扫描识别"');
// uvue 视图消除写死 AI
assert.ok(!uvueContent.includes('>AI</text>'), 'exchange.uvue 严禁出现写死的大文本 ">AI</text>"');
});
test('4. 销售工作台 useWorkplace.uts 与 index.uvue 剔除中二浮夸与销售营销腔', () => {
const utsContent = readMpFile('pages/owner/workplace/useWorkplace.uts');
assert.ok(!utsContent.includes('闪电出示展台'), '工作台严禁含有浮夸中二词 "闪电出示展台"');
assert.ok(utsContent.includes("'workplace.quick_showcase': {\n zh: '出示名片'"), '出示必须规范为 "出示名片"');
assert.ok(!utsContent.includes('今日战情报表'), '严禁使用中二词 "今日战情报表"');
assert.ok(utsContent.includes("'workplace.kpi_title': {\n zh: '今日数据'"), 'KPI标题规范为 "今日数据"');
assert.ok(!utsContent.includes('一键破冰'), '严禁使用销售黑话 "一键破冰"');
assert.ok(utsContent.includes("'workplace.radar_action_whatsapp': {\n zh: '立即联系'"), '破冰动作规范为 "立即联系"');
assert.ok(!utsContent.includes('AI 销售副驾驶洞察'), '严禁使用营销词 "AI 销售副驾驶洞察"');
assert.ok(utsContent.includes("'workplace.ai_tip_title': {\n zh: '跟进建议'"), '提示标题规范为 "跟进建议"');
});
test('5. 产品案例与专栏文章去除夸大修饰与多此一举说明', () => {
const casesContent = readMpFile('pages/owner/card/useCardCases.uts');
const articlesContent = readMpFile('pages/owner/card/useCardArticles.uts');
// cases
assert.ok(!casesContent.includes('在微官网中向全球买家展现硬核实力'), '严禁包含自嗨浮夸营销说明');
assert.ok(!casesContent.includes('点击下方按钮,拍照或上传您的首个'), '严禁包含多此一举的操作说明废话');
assert.ok(casesContent.includes("'产品与案例'"), '标题必须规范为 "产品与案例"');
// articles
assert.ok(!articlesContent.includes('深度博文'), '去除浮夸词汇 "深度博文"');
assert.ok(!articlesContent.includes('点击下方按钮,撰写并发布您的第一篇'), '严禁包含多此一举的操作说明废话');
assert.ok(articlesContent.includes("'发布动态'"), '按钮必须规范为 "发布动态"');
});
test('6. 潜客详情 useLeadDetail.uts 话术真实严谨,去假大空套话', () => {
const content = readMpFile('pages/owner/useLeadDetail.uts');
assert.ok(!content.includes('一键生成破冰话术'), '严禁使用浮夸的 "一键生成破冰话术"');
assert.ok(content.includes('生成跟进话术'), '规范为 "生成跟进话术"');
assert.ok(!content.includes('智能跟进建议'), '严禁使用 "智能跟进建议"');
assert.ok(content.includes('建议跟进话术'), '规范为 "建议跟进话术"');
assert.ok(!content.includes('我是来自 OmniCard 的商务顾问'), '生成话术严禁写死伪装成 OmniCard 销售');
});
test('7. 硬件安全与场景模式用词严谨、去浮夸', () => {
const secContent = readMpFile('pages/owner/nfc/useSecurity.uts');
const modeContent = readMpFile('pages/owner/nfc/useMode.uts');
const teamContent = readMpFile('pages/owner/team/useOverview.uts');
// security
assert.ok(!secContent.includes('一键远程挂失'), '去除 "一键远程挂失"');
assert.ok(secContent.includes("'远程挂失'"), '规范为 "远程挂失"');
assert.ok(!secContent.includes('芯片防盗与云端防护运行中'), '去除浮夸假大空描述');
assert.ok(!secContent.includes('秒级一键'), '去除浮夸修饰 "秒级一键"');
// mode
assert.ok(!modeContent.includes('日间展会用商务档,晚宴社交用社交档'), '去除生硬口语化文案');
// team
assert.ok(!teamContent.includes('展会战报'), '去除中二词汇 "展会战报"');
assert.ok(!teamContent.includes('保持现场触碰'), '去除空洞鸡汤说教');
});
test('8. pages.json 页面导航标题统一严谨规范', () => {
const jsonContent = readMpFile('pages.json');
assert.ok(!jsonContent.includes('"navigationBarTitleText": "AI 顾问"'), 'pages.json 严禁 "AI 顾问"');
assert.ok(jsonContent.includes('"navigationBarTitleText": "在线咨询"'), 'pages.json 必须规范为 "在线咨询"');
assert.ok(!jsonContent.includes('"navigationBarTitleText": "极速编辑"'), 'pages.json 严禁 "极速编辑"');
assert.ok(jsonContent.includes('"navigationBarTitleText": "名片编辑"'), 'pages.json 必须规范为 "名片编辑"');
assert.ok(!jsonContent.includes('"navigationBarTitleText": "展会战报"'), 'pages.json 严禁 "展会战报"');
assert.ok(jsonContent.includes('"navigationBarTitleText": "展会数据"'), 'pages.json 必须规范为 "展会数据"');
});