feat: 海外化改造(新加坡市场)—— 阶段 0-3
Some checks failed
Tests / test (push) Has been cancelled

按 U-Claw-海外化改造方案.md 与 范围决策记录.md 实施。这是 fork,不回上游:
海外版删掉的正是上游的中国市场默认值。

阶段 0 地基
- 下载源全部改国际:脚本/CI 61 处 + lockfile 880 条 npmmirror URL 归零
  (lockfile 那 880 条是 npm 的 resolved 字段,脚本层参数化根本绕不过它)
- 移除 install.ps1 里三个第三方 GitHub 加速代理,bundle 改直连 + SHA256 校验
  (原来只检查"文件大于 1MB"就解压运行)
- 技能内容与分发分离:skills/manifest.json 单一来源,install.sh 1170→658 行、
  install.ps1 721→546 行,两者技能内容归零
  实测原来是三份不一致:skills-cn 完整、install.sh 约 40%、install.ps1 约 17%,
  且 7 个通用技能只有 U 盘版有 —— 一键安装的用户一个能用的技能都没有
- Node 版本三种(v22.14/16/22.1)统一,新建 NODE_VERSION 单一来源
- Config 页三份合一。portable/Config.html 用根相对路径调 API 却只从 file:// 打开,
  保存功能已静默失效两个月;现缩为 120 行重定向壳
- 测试接入 CI(此前 node --test 无人运行,所有断言形同虚设)

阶段 1 双语可用
- 浏览器侧 i18n:JSON 为源、生成经典 script(file:// 下 fetch 本地 JSON 被拦)
  语言跟盘走不跟机器走:启动器写 data/.openclaw/locale.js
- 8 处硬编码 lang="zh-CN" 归零,data-i18n 覆盖 213 处,词条 en/zh 各 279 条
- B3 单框 Key:12 张模型卡 → 一个输入框,前缀识别 provider,
  服务端 /api/test-key 发 1-token 请求实测,错误映射成人话
  Key 填错到得知:从"直到对话失败"降到 ≤1 秒
- 区域格式 SG:DD/MM/YYYY、12 小时、S$、Asia/Singapore
  (ICU 在 en-SG 下把 SGD 渲染成裸 $,与美元无法区分,故自行拼 S$)
- README 内容分叉而非翻译,§1.3 证据清单逐条清零

阶段 2 降门槛
- 启动逻辑上移 lib/start.mjs:Windows-Start.bat 220→28 行、
  Mac-Start.command 235→33 行
  修掉 Mac 侧两个 bug:控制台端口硬编码 18788(回落时打开死页)、
  微信插件从未在 Mac 上安装
- U 盘根目录 23 → 3 个可点文件,其余进 advanced/
- 首启向导:语言 → 用途(7 角色,manifest 驱动)→ 密钥,答过不再问
- 三档界面,Simple 档隐藏一切技术名词
- 自动自愈:启动失败先自查自修,修不好导出脱敏诊断包
  (Doctor 从"用户要知道去点的工具"变成后台机制)

阶段 3 技能库
- 19 个英文技能,planned 归零。sg-weather / sg-transport 的端点均实测过
- SkillHub 从 56 张手写第三方卡片改为 manifest 生成:703→125 行,中文归零

其他
- origin.json 收拢所有运行时地址,tests/origin.test.mjs 保证迁移不会漏
- portable/ 下用户可见中文归零(由断言保证)
- 82 项测试

未验证(本机无 Windows / 无 pwsh):
- install.ps1、setup.ps1 约 210 行改动从未经 PowerShell 解析器
- 完整启动路径仅在假 node + 假 openclaw 上冒烟
- 8 个 .bat 的盘根推导仅静态断言
详见 U盘实测清单.md

受阻:
- 隐藏黑窗口 —— 需代码签名证书(.vbs 已被 Windows 弃用,替代方案都要签名)
- 场景卡 —— OpenClaw 上游 Dashboard 无预填 prompt 接口
- 官网 36 条 —— 上游 2026-04-14 拆到私有仓库,无权限
This commit is contained in:
2026-08-17 18:37:49 +08:00
parent 9a23aec097
commit b076815171
123 changed files with 13396 additions and 14723 deletions

View File

@@ -0,0 +1,279 @@
{
"start.banner": "U-Claw · 便携 AI 助手",
"start.node_version": "Node.js {version}",
"start.quarantine_removing": "正在解除 macOS 安全限制…",
"start.cache_local": "缓存已放在本机硬盘:{path}",
"start.config_migrating": "正在迁移你原来的设置…",
"start.config_migrated": "设置已迁移。",
"start.config_creating": "第一次使用,正在准备…",
"start.config_created": "准备好了。",
"start.deps_preparing": "正在准备,约 20 秒。",
"start.deps_slow_drive": "这个 U 盘比较慢,可能要几分钟,放着就行。",
"start.deps_done": "准备好了。",
"start.no_proxy": "将直连你的模型地址:{hosts}",
"start.wechat_installing": "正在安装微信插件…",
"start.wechat_installed": "微信插件已安装。",
"start.config_center_starting": "正在启动控制台…",
"start.config_center_port": "控制台端口:{port}",
"start.port_in_use": "端口 {port} 被占用,换下一个…",
"start.gateway_starting": "正在启动 U-Claw端口 {port}…",
"start.opening_screen": "正在打开启动页…",
"start.opening_config": "正在打开控制台…",
"start.running_title": "U-Claw 已启动",
"start.running_dashboard": "对话界面:{url}",
"start.running_config": "控制台: {url}",
"start.running_hint": "使用期间请不要关闭这个窗口。按 Ctrl+C 停止。",
"start.first_run_wait": "第一次从 U 盘启动需要 3090 秒解压组件。控制台已经打开,可以先选模型、填密钥。",
"start.stopped": "U-Claw 已停止。",
"start.exited_unexpectedly": "U-Claw 自己退出了(代码 {code})。",
"error.node_missing.what": "U 盘里少了一个 U-Claw 需要的文件。",
"error.node_missing.why": "通常是拷贝到 U 盘时没有复制完整。",
"error.node_missing.action": "把 U-Claw 文件夹重新拷贝一遍,或运行 setup.sh 重建。",
"error.unsupported_arch.what": "这台 Mac 的处理器不受支持({arch})。",
"error.unsupported_arch.why": "U-Claw 只提供 Apple Silicon 和 Intel Mac 的版本。",
"error.unsupported_arch.action": "换一台电脑试试。",
"error.no_port.what": "U-Claw 找不到可用的端口来启动。",
"error.no_port.why": "{from}{to} 都被占用了 —— 可能已经有一个 U-Claw 在运行。",
"error.no_port.action": "关掉已经在运行的那个窗口,再启动一次。",
"error.deps_failed.what": "U-Claw 没能准备完成。",
"error.deps_failed.why": "下载没有完成,通常是网络中断了。",
"error.deps_failed.action": "检查一下 Wi-Fi然后重新启动 U-Claw。",
"error.press_enter": "按回车关闭这个窗口。",
"loading.title": "正在启动 U-Claw",
"loading.starting": "U-Claw 正在启动…",
"loading.first_run": "第一次从 U 盘启动需要展开内置组件,稍等片刻,就绪后会提示你下一步。",
"loading.waiting_gateway": "正在等待 U-Claw 启动…",
"loading.ready": "U-Claw 已就绪",
"loading.choose_next": "选择下一步 —— 直接开始聊天,或先去配置模型和渠道。",
"loading.open_dashboard": "🚀 开始聊天",
"loading.open_settings": "⚙️ 设置",
"loading.settings_hint": "填写或更换 API 密钥,连接聊天软件。",
"loading.no_model_hint": "还没配过模型?先打开设置填一个密钥。",
"loading.slow_drive_note": "慢 U 盘首次启动通常 3090 秒。如果迟迟没反应,可以先打开设置:",
"loading.elapsed": "已等待 {seconds} 秒",
"loading.taking_long": "启动比平时慢,可以先打开设置:",
"welcome.title": "U-Claw 使用指南",
"welcome.subtitle": "装在 U 盘里的 AI 助手 · 三步开始",
"welcome.quickstart": "快速开始",
"welcome.step1_title": "1. 启动 U-Claw",
"welcome.step1_desc": "双击你电脑对应的那个文件:",
"welcome.step2_title": "2. 填一个密钥",
"welcome.step2_desc": "第一次启动会自动打开设置页。你需要一个 API 密钥才能开始 —— Google Gemini 最容易拿到:用 Google 账号登录即可,不用绑卡。",
"welcome.step2_link": "去领取免费的 Gemini 密钥 →",
"welcome.step3_title": "3. 开始对话",
"welcome.step3_desc": "密钥保存后,对话窗口会自己打开。就这样。",
"welcome.portable_note": "✅ 你的设置和聊天记录都存在盘上的 data/ 目录里跟着盘走Mac 和 Windows 通用。",
"welcome.models_title": "用哪个模型?",
"welcome.model_claude": "综合最强",
"welcome.model_gpt": "用的人最多",
"welcome.model_gemini": "有免费额度,注册最简单",
"welcome.model_local": "离线 · 数据不出本机",
"welcome.models_more": "更多选择在设置里,包括适合马来语、泰米尔语和 Singlish 的 SEA-LION。",
"welcome.trouble_title": "遇到问题?",
"welcome.trouble_lead": "💡 运行检查工具",
"welcome.trouble_desc": "如果 U-Claw 启动不了,双击:",
"welcome.open_settings": "打开设置",
"welcome.open_docs": "查看文档",
"nav.title": "U-Claw 启动导航",
"nav.tagline": "便携 AI 助手 — 插上就能用",
"nav.status_off": "U-Claw 尚未运行",
"nav.open_console": "打开它 →",
"nav.quickstart": "快速启动",
"nav.doubleclick": "双击",
"nav.step2": "第一次启动会自动打开设置页 —— 选一个模型,把密钥粘进去。",
"nav.mac_gatekeeper": "⚠️ 如果 macOS 提示「无法验证开发者」:右键点这个文件,选「打开」。",
"nav.config_shortcut": "📝 也可以双击 Config.html它会带你到设置页。",
"nav.win_smartscreen": "⚠️ 如果 Windows 弹安全警告:点「更多信息」,再点「仍要运行」。",
"nav.everything": "其他功能",
"nav.menu_opens": "打开完整菜单:",
"nav.g_settings": "设置",
"nav.g_settings_d": "模型、密钥和聊天软件",
"nav.g_checkup": "检查修复",
"nav.g_checkup_d": "找出并修复常见问题",
"nav.g_backup": "备份",
"nav.g_backup_d": "一键保存设置和记忆",
"nav.g_skills": "技能",
"nav.g_skills_d": "看看 U-Claw 能做什么",
"nav.g_system": "系统信息",
"nav.g_system_d": "版本、端口、运行状态",
"nav.g_cli": "命令行",
"nav.g_cli_d": "给进阶用户",
"nav.models_title": "可以用的模型",
"nav.model_sealion": "马来语、泰米尔语和 Singlish",
"nav.model_local": "本地模型",
"nav.model_more": "更多",
"nav.model_more_d": "其他模型在设置里",
"nav.more_title": "更多",
"nav.link_guide": "使用指南",
"nav.link_guide_d": "三步上手",
"nav.link_skills": "技能",
"nav.link_skills_d": "看看 U-Claw 能做什么",
"nav.link_contact": "联系我们",
"nav.link_site": "官网",
"nav.status_on": "U-Claw 正在运行(端口 {port}",
"nav.status_off_hint": "U-Claw 尚未运行 —— 请先双击启动文件",
"key.page_title": "U-Claw 设置",
"key.page_subtitle": "粘贴一个 API 密钥就可以了。",
"key.checking": "检测中…",
"key.step_key": "填密钥",
"key.step_done": "完成",
"key.heading": "粘贴你的 API 密钥",
"key.desc": "剩下的 U-Claw 自己搞定。密钥只保存在这个 U 盘上,不会上传到任何地方。",
"key.placeholder": "sk-…",
"key.show": "显示",
"key.hide": "隐藏",
"key.continue": "继续 →",
"key.checking_key": "正在检查这个密钥…",
"key.ok": "✓ {provider} · 连接成功,用时 {ms} 毫秒",
"key.custom_provider": "你的地址",
"key.no_key_title": "还没有密钥?",
"key.no_key_desc": "Google Gemini 最容易拿到:用 Google 账号登录即可,不用绑卡,还有免费额度。",
"key.get_gemini": "🔑 领取免费的 Gemini 密钥",
"key.get_openrouter": "🔑 OpenRouter —— 一个密钥用多种模型",
"key.advanced": "高级 —— 手动填写接口地址",
"key.base_url": "接口地址",
"key.model_name": "模型名称",
"key.advanced_hint": "只有自建或未收录的服务才需要填。留空则由 U-Claw 自动判断。",
"key.saved": "已保存。",
"key.err_empty": "先粘贴一个密钥。",
"key.err_not_checked": "稍等,密钥还在检查中。",
"key.err_rejected": "这个密钥没被接受。检查一下是不是没复制全 —— 密钥很长,容易少一截。",
"key.err_quota": "这个密钥的额度用完了。去服务商那边充值,或者换一个密钥。",
"key.err_offline": "连不上网络。检查一下 Wi-Fi 再试。",
"key.err_timeout": "服务商没有及时响应。过一会儿再试。",
"key.err_model": "密钥是好的,但它指向的模型没找到。在「高级」里填写模型名称。",
"key.err_provider_down": "服务商那边现在有问题。稍后再试。",
"key.err_unrecognised": "U-Claw 认不出这个密钥。请在「高级」里填写接口地址和模型名称。",
"key.err_unknown": "没能检查这个密钥。再试一次,或者在「高级」里自己填接口地址。",
"key.err_save": "保存失败。确认 U 盘还插着,然后再试一次。",
"hub.title": "U-Claw 技能",
"done.title": "配置完成",
"done.subtitle": "模型和密钥已保存在这个 U 盘上。",
"done.open": "🚀 开始聊天",
"done.restart_note": "聊天软件的设置已保存,重启 U-Claw 后生效。",
"done.change_key": "换模型或密钥",
"done.view_config": "查看配置文件",
"ch.title": "📱 连接聊天软件(可选)",
"ch.desc": "点卡片展开填写,也可以直接跳过。",
"ch.whatsapp_d": "用 WhatsApp 和 U-Claw 对话",
"ch.whatsapp_warning": "⚠️ 这里用的是非官方协议,你的 WhatsApp 账号可能因此被封。不要接入你离不开的号码。",
"ch.whatsapp_number": "手机号",
"ch.telegram_d": "用 Telegram 和 U-Claw 对话",
"ch.telegram_get": "→ 从 @BotFather 获取",
"ch.slack_d": "在工作区里和 U-Claw 对话",
"ch.slack_get": "→ 在 api.slack.com 创建应用",
"ch.discord_d": "用 Discord 和 U-Claw 对话",
"ch.discord_get": "→ 在 Discord 开发者后台创建应用",
"ch.china_group": "主要在中国使用的聊天软件",
"ch.wechat_d": "扫码接入个人微信",
"ch.wechat_start": "点这张卡片开始扫码",
"ch.saved": "聊天软件设置已保存。",
"ch.err_save": "聊天软件设置没能保存。确认 U 盘还插着。",
"info.layout_title": "U 盘里有什么",
"info.layout_desc": "文件夹是怎么组织的",
"info.skills": "技能",
"info.skills_d": "把 SKILL.md 放进来就会自动加载",
"info.app": "运行时",
"info.app_d": "Node.js 和 OpenClaw 核心",
"info.data": "你的数据",
"info.data_d": "密钥和聊天记录,只留在这个盘上。",
"info.feedback_title": "遇到问题?",
"info.feedback_desc": "U-Claw 是开源项目。出问题欢迎去 GitHub 提 Issue —— 我们不会自动收集或上传你机器上的任何东西。",
"info.feedback_link": "→ 去 GitHub 提 Issue",
"wx.getting_qr": "正在获取二维码…",
"wx.scan": "请用微信扫描上方二维码",
"wx.qr_failed": "获取二维码失败",
"wx.connected": "✅ 微信已连接",
"wx.account": "账号",
"wx.restart_needed": "还差一步:重启 U-Claw关掉再打开微信才能用。",
"wx.connected_toast": "微信已连接,重启 U-Claw 后生效。",
"wx.qr_refreshed": "二维码已刷新,请重新扫码",
"wx.confirm_on_phone": "已扫码,请在手机上确认…",
"wx.qr_expired": "二维码已过期。",
"wx.qr_retry": "重新获取",
"wx.failed": "连接失败",
"info.read_config_failed": "读取配置文件失败:",
"status.running": "U-Claw 正在运行,端口 {port}",
"status.open_dashboard": "打开它 →",
"status.not_running": "U-Claw 尚未运行 —— 请先运行 Windows-Start.bat 或 Mac-Start.command",
"key.which_model": "用哪个模型?",
"start.opening_language": "正在询问使用哪种语言…",
"persona.title": "你主要用它做什么?",
"persona.subtitle": "这会帮你把合适的工具装好。以后可以改,也可以多选。",
"persona.continue": "继续 →",
"persona.skip": "跳过",
"persona.saving": "正在准备…",
"persona.err_offline": "U-Claw 还没启动。先启动它,再打开这个页面。",
"persona.err_save": "没能保存。确认 U 盘还插着,然后再试一次。",
"persona.developer": "写代码",
"persona.admin": "写文档、发邮件",
"persona.sales": "跟客户打交道",
"persona.marketing": "做内容、发社交媒体",
"persona.finance": "算数、做表格",
"persona.boss": "管公司",
"persona.general": "先随便看看",
"start.opening_persona": "正在询问你主要用它做什么…",
"tier.label": "想看到多少?",
"tier.simple": "只要最基本的",
"tier.standard": "多一点控制",
"tier.expert": "全部",
"tier.changed_simple": "已切换到简洁模式 —— 高级选项已隐藏。",
"tier.changed_standard": "已切换到标准模式 —— 现在可以换模型、接更多聊天软件了。",
"tier.changed_expert": "已切换到完整模式 —— 所有东西都可见,包括配置文件。",
"start.checking": "出了点问题,正在检查…",
"start.repaired": "已修复,重试一次。",
"start.diagnostics_written": "已把情况记录到:{path}",
"start.diagnostics_hint": "里面的密钥已被去掉。需要帮忙的话,把它发到 help@u-claw.org。",
"skill.excel-helper.name": "表格",
"skill.excel-helper.desc": "公式、透视表、图表、清洗乱数据",
"skill.word-writer.name": "文档",
"skill.word-writer.desc": "报告、方案、简历 —— 起草和排版",
"skill.ppt-designer.name": "幻灯片",
"skill.ppt-designer.desc": "结构、版式和演讲要点",
"skill.pdf-toolkit.name": "PDF 工具",
"skill.pdf-toolkit.desc": "合并、拆分、提取文字 —— 全在本机",
"skill.image-compress.name": "图片",
"skill.image-compress.desc": "压缩、改尺寸、转格式 —— 不上传",
"skill.qrcode-maker.name": "二维码",
"skill.qrcode-maker.desc": "网址、文本、WiFi离线生成",
"skill.web-to-markdown.name": "保存网页",
"skill.web-to-markdown.desc": "把文章转成干净的 Markdown",
"skill.linkedin-post.name": "LinkedIn 帖子",
"skill.linkedin-post.desc": "钩子和结构,不要那股 LinkedIn 腔",
"skill.x-poster.name": "X 帖子",
"skill.x-poster.desc": "能独立成立的短帖和 thread",
"skill.tiktok-script.name": "TikTok 脚本",
"skill.tiktok-script.desc": "扛得住第一秒的钩子",
"skill.youtube-script.name": "YouTube 脚本",
"skill.youtube-script.desc": "标题、前 30 秒、章节",
"skill.medium-writer.name": "长文",
"skill.medium-writer.desc": "长文结构,以及怎么删水分",
"skill.email-campaign.name": "邮件营销",
"skill.email-campaign.desc": "标题、一个明确的 ask、符合 PDPA",
"skill.web-search.name": "网页搜索",
"skill.web-search.desc": "找当前信息并真的读来源",
"skill.sg-weather.name": "新加坡天气",
"skill.sg-weather.desc": "按区预报和空气质量,来自 NEA",
"skill.sea-translate.name": "东南亚翻译",
"skill.sea-translate.desc": "英 / 中 / 马来 / 泰米尔 —— 以及语域",
"skill.claude-helper.name": "问得更好",
"skill.claude-helper.desc": "怎么问,以及什么时候该核对答案",
"skill.sg-transport.name": "新加坡交通",
"skill.sg-transport.desc": "巴士到站、地铁故障、停车位",
"skill.meeting-notes.name": "会议纪要",
"skill.meeting-notes.desc": "决定和负责人,写完就能发",
"cat.office": "办公",
"cat.data": "数据",
"cat.writing": "写作",
"cat.files": "文件",
"cat.research": "资料",
"cat.social": "社交媒体",
"cat.video": "视频",
"cat.language": "语言",
"cat.local": "新加坡",
"cat.ai": "用好 AI",
"hub.lede": "这些已经在盘上了。直接说你想做什么就行,不用记技能名。",
"hub.all": "全部",
"hub.none": "这个分类下暂时没有。",
"hub.add_note": "技能放在盘上的 skills/ 目录里。丢一个 SKILL.md 进去就多一个。"
}