From 48591101141bc80b4da05125bc8709e736b31d55 Mon Sep 17 00:00:00 2001 From: wikiboss Date: Mon, 21 Sep 2026 16:04:38 +0800 Subject: [PATCH] =?UTF-8?q?refactor(mpuniapp):=20=E5=85=A8=E5=B1=80?= =?UTF-8?q?=E8=A7=84=E8=8C=83=E6=89=80=E6=9C=89=E7=94=A8=E8=AF=8D=E5=B9=B6?= =?UTF-8?q?=E5=8E=BB=E9=99=A4AI=E5=8F=A3=E5=90=BB=E4=B8=8E=E6=B5=AE?= =?UTF-8?q?=E5=A4=B8=E6=96=87=E6=A1=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 规范7国语言全局词典中AI咨询为在线咨询,去除内部黑话与营销说教 - 在线咨询去除机械人套话与写死的大号AI文本标签 - 交换名片剔除留资行话与写死AI,规范为名片交换与纸质名片识别 - 工作台去除战报、闪电出示、高光足迹、破冰等中二词汇,回归严谨商务数据 - 产品案例与专栏文章去除夸大修饰词与冗余操作说明 - 潜客跟进去除写死销售套话,规范为得体自然的跟进建议 - 硬件安全与场景模式去除秒级一键、芯片防盗等噱头词 - 导航栏标题统一规范为在线咨询、名片编辑、展会数据 - 新增专项测试并通过全量62项回归测试 --- mpuniapp/common/locale.uts | 70 +++++----- mpuniapp/pages.json | 6 +- mpuniapp/pages/owner/card/useCardArticles.uts | 6 +- mpuniapp/pages/owner/card/useCardCases.uts | 13 +- mpuniapp/pages/owner/nfc/useMode.uts | 2 +- mpuniapp/pages/owner/nfc/useSecurity.uts | 14 +- mpuniapp/pages/owner/team/useOverview.uts | 10 +- mpuniapp/pages/owner/useLeadDetail.uts | 13 +- .../pages/owner/workplace/useWorkplace.uts | 28 ++-- mpuniapp/pages/portal/ai-chat.uvue | 6 +- mpuniapp/pages/portal/exchange.uvue | 2 +- mpuniapp/pages/portal/useAiChat.uts | 32 ++--- mpuniapp/pages/portal/useExchange.uts | 20 +-- mpuniapp/tests/copy-standardization.test.ts | 129 ++++++++++++++++++ 14 files changed, 240 insertions(+), 111 deletions(-) create mode 100644 mpuniapp/tests/copy-standardization.test.ts diff --git a/mpuniapp/common/locale.uts b/mpuniapp/common/locale.uts index ce981f2..6d898bd 100644 --- a/mpuniapp/common/locale.uts +++ b/mpuniapp/common/locale.uts @@ -126,9 +126,9 @@ export const omniLocales: Record = { '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 = { '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 = { '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 = { '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 = { '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 = { '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 = { '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 = { '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 = { '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 = { '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 = { 'portal.preview_mode': 'プレビュー', 'card.save_contact': '連絡先に保存', 'card.exchange': '名刺を交換', - 'card.ai_chat': 'AI アシスタント', + 'card.ai_chat': 'オンライン相談', 'card.share': '名刺をシェア', 'card.scan_nfc': 'NFC タップ', 'card.view_profile': 'プロフィールを見る', diff --git a/mpuniapp/pages.json b/mpuniapp/pages.json index 885b0aa..38543c6 100644 --- a/mpuniapp/pages.json +++ b/mpuniapp/pages.json @@ -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" } } diff --git a/mpuniapp/pages/owner/card/useCardArticles.uts b/mpuniapp/pages/owner/card/useCardArticles.uts index d32971d..f8057aa 100644 --- a/mpuniapp/pages/owner/card/useCardArticles.uts +++ b/mpuniapp/pages/owner/card/useCardArticles.uts @@ -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': diff --git a/mpuniapp/pages/owner/card/useCardCases.uts b/mpuniapp/pages/owner/card/useCardCases.uts index 8deddc1..8872f31 100644 --- a/mpuniapp/pages/owner/card/useCardCases.uts +++ b/mpuniapp/pages/owner/card/useCardCases.uts @@ -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': diff --git a/mpuniapp/pages/owner/nfc/useMode.uts b/mpuniapp/pages/owner/nfc/useMode.uts index 8d980cd..e2f55b5 100644 --- a/mpuniapp/pages/owner/nfc/useMode.uts +++ b/mpuniapp/pages/owner/nfc/useMode.uts @@ -84,7 +84,7 @@ export type ApplySceneResult = { const MODE_COPY: Record> = { 'zh-CN': { title: '场景模式', - desc: '日间展会用商务档,晚宴社交用社交档。挂失设备不可切换。', + desc: '支持商务与社交场景快速切换,挂失状态下不可切换。', uidLabel: '芯片 UID', cardIdLabel: '名片 ID', business: '日间展会', diff --git a/mpuniapp/pages/owner/nfc/useSecurity.uts b/mpuniapp/pages/owner/nfc/useSecurity.uts index b4200ea..551d0f2 100644 --- a/mpuniapp/pages/owner/nfc/useSecurity.uts +++ b/mpuniapp/pages/owner/nfc/useSecurity.uts @@ -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 ''; } diff --git a/mpuniapp/pages/owner/team/useOverview.uts b/mpuniapp/pages/owner/team/useOverview.uts index 0ab1f7b..c3fd2c2 100644 --- a/mpuniapp/pages/owner/team/useOverview.uts +++ b/mpuniapp/pages/owner/team/useOverview.uts @@ -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 ''; } diff --git a/mpuniapp/pages/owner/useLeadDetail.uts b/mpuniapp/pages/owner/useLeadDetail.uts index 598ffcf..08d7441 100644 --- a/mpuniapp/pages/owner/useLeadDetail.uts +++ b/mpuniapp/pages/owner/useLeadDetail.uts @@ -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!`; } /** diff --git a/mpuniapp/pages/owner/workplace/useWorkplace.uts b/mpuniapp/pages/owner/workplace/useWorkplace.uts index 6a1f37f..bcd2883 100644 --- a/mpuniapp/pages/owner/workplace/useWorkplace.uts +++ b/mpuniapp/pages/owner/workplace/useWorkplace.uts @@ -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: '出示名片码', diff --git a/mpuniapp/pages/portal/ai-chat.uvue b/mpuniapp/pages/portal/ai-chat.uvue index 9a92446..1942d20 100644 --- a/mpuniapp/pages/portal/ai-chat.uvue +++ b/mpuniapp/pages/portal/ai-chat.uvue @@ -6,7 +6,7 @@ - AI + OC @@ -23,7 +23,7 @@ - AI + OC {{ t('empty') }} @@ -118,7 +118,7 @@ :class="item.role === 'assistant' ? 'ai-bubble-assistant ai-glow' : 'ai-bubble-user'" > - AI + OC {{ item.content }} diff --git a/mpuniapp/pages/portal/exchange.uvue b/mpuniapp/pages/portal/exchange.uvue index 09b4b31..81618e7 100644 --- a/mpuniapp/pages/portal/exchange.uvue +++ b/mpuniapp/pages/portal/exchange.uvue @@ -70,7 +70,7 @@ - AI + SCAN {{ t('ocrTitle') }} diff --git a/mpuniapp/pages/portal/useAiChat.uts b/mpuniapp/pages/portal/useAiChat.uts index 3f12aa1..8794fda 100644 --- a/mpuniapp/pages/portal/useAiChat.uts +++ b/mpuniapp/pages/portal/useAiChat.uts @@ -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: '', diff --git a/mpuniapp/pages/portal/useExchange.uts b/mpuniapp/pages/portal/useExchange.uts index 194c132..1c65fbe 100644 --- a/mpuniapp/pages/portal/useExchange.uts +++ b/mpuniapp/pages/portal/useExchange.uts @@ -133,7 +133,7 @@ export function resetExchangeForm(state: ExchangeState): void { } /** - * 提交留资:校验通过后调用已有 submitLead + * 提交名片交换:校验通过后调用已有 submitLead */ export async function submitExchange(state: ExchangeState): Promise { const cardId = resolveExchangeCardId(state); @@ -203,7 +203,7 @@ export async function submitExchange(state: ExchangeState): Promise> = { 'zh-CN': { desc: '留下姓名与联系方式,双方建立高效商务连接', warnMissingId: '缺少名片标识,无法提交', - ocrTitle: '纸质名片 OCR 识别', - ocrSubtitle: '拍照或上传名片图片,快速自动填单', + ocrTitle: '纸质名片识别', + ocrSubtitle: '拍照或上传名片,自动识别填入', ocrScan: '拍摄/上传', ocrScanning: '识别中...', ocrPreviewTitle: '名片原图', @@ -271,10 +271,10 @@ const EXCHANGE_TEXTS: Record> = { emailPlaceholder: '工作邮箱 (name@company.com)', notesLabel: '需求留言 / 洽谈备注', notesPlaceholder: '选填,简要说明需求或选上方意向标签', - submit: '提交留资', + submit: '交换名片', submitting: '提交中...', badge: '双向名片互换', - badgeAi: '智能扫描识别', + badgeAi: '名片扫描识别', contactSectionTitle: '联系人信息', contactSectionDesc: '留下真实商务联系方式,便于后续及时跟进', intentTitle: '沟通意向 (快捷选择)', @@ -283,12 +283,12 @@ const EXCHANGE_TEXTS: Record> = { intentInquiry: '索取资料', intentAgent: '代理加盟', intentTech: '技术交流', - privacyTitle: '企业级隐私安全保障', + privacyTitle: '隐私与数据安全', privacyDesc: '您的信息仅用于双方商务对接与资料发送,遵循严格的国际隐私保护与数据合规标准。', - successTitle: '留资与名片互换已成功送达', - successDesc: '名片主已收到您的联系方式与洽谈意向,将通过 WhatsApp 或工作邮箱尽快与您取得联系。', + successTitle: '名片交换已完成', + successDesc: '名片所有者已收到您的联系方式,将尽快与您取得联系。', backPortal: '返回微官网', - submitAgain: '再换一张 / 重新填写', + submitAgain: '重新填写', whatsappOrEmailTip: 'WhatsApp 或邮箱至少填写一项', whatsappBadge: '全球常用', requiredMark: '必填', diff --git a/mpuniapp/tests/copy-standardization.test.ts b/mpuniapp/tests/copy-standardization.test.ts new file mode 100644 index 0000000..66deb07 --- /dev/null +++ b/mpuniapp/tests/copy-standardization.test.ts @@ -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'), 'ai-chat.uvue 严禁出现写死的大文本 ">AI"'); +}); + +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'), 'exchange.uvue 严禁出现写死的大文本 ">AI"'); +}); + +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 必须规范为 "展会数据"'); +});