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 · Portable AI Agent",
"start.node_version": "Node.js {version}",
"start.quarantine_removing": "Clearing the macOS security flag…",
"start.cache_local": "Cache on local disk: {path}",
"start.config_migrating": "Bringing your old settings across…",
"start.config_migrated": "Settings moved over.",
"start.config_creating": "First run — setting things up…",
"start.config_created": "Ready.",
"start.deps_preparing": "Getting things ready — about 20 seconds.",
"start.deps_slow_drive": "This drive is slow, so it may take a few minutes. You can leave it running.",
"start.deps_done": "Ready.",
"start.no_proxy": "Connecting directly to your model host: {hosts}",
"start.wechat_installing": "Installing the WeChat plugin…",
"start.wechat_installed": "WeChat plugin installed.",
"start.config_center_starting": "Starting the Control Panel…",
"start.config_center_port": "Control Panel is on port {port}.",
"start.port_in_use": "Port {port} is busy, trying the next one…",
"start.gateway_starting": "Starting U-Claw on port {port}…",
"start.opening_screen": "Opening the start screen…",
"start.opening_config": "Opening the Control Panel…",
"start.running_title": "U-Claw is running",
"start.running_dashboard": "Dashboard: {url}",
"start.running_config": "Control Panel: {url}",
"start.running_hint": "Keep this window open while you use U-Claw. Press Ctrl+C to stop.",
"start.first_run_wait": "First run from a USB drive takes 3090 seconds while components unpack. The Control Panel is already open so you can pick a model and paste a key.",
"start.stopped": "U-Claw stopped.",
"start.exited_unexpectedly": "U-Claw closed on its own (code {code}).",
"error.node_missing.what": "A file U-Claw needs is missing from the drive.",
"error.node_missing.why": "This usually means the copy onto the USB drive did not finish.",
"error.node_missing.action": "Copy the U-Claw folder onto the drive again, or run setup.sh to rebuild it.",
"error.unsupported_arch.what": "This Mac's processor is not supported ({arch}).",
"error.unsupported_arch.why": "U-Claw ships builds for Apple Silicon and Intel Macs only.",
"error.unsupported_arch.action": "Try U-Claw on a different computer.",
"error.no_port.what": "U-Claw could not find a free port to start on.",
"error.no_port.why": "Ports {from}{to} are all in use — U-Claw may already be running.",
"error.no_port.action": "Close any window already running U-Claw and start it again.",
"error.deps_failed.what": "U-Claw could not finish getting ready.",
"error.deps_failed.why": "The download did not complete — usually a dropped network connection.",
"error.deps_failed.action": "Check your Wi-Fi and start U-Claw again.",
"error.press_enter": "Press Enter to close this window.",
"loading.title": "Starting U-Claw",
"loading.starting": "Starting U-Claw…",
"loading.first_run": "First run from a USB drive unpacks the bundled components. Give it a moment — you will be told when it is ready.",
"loading.waiting_gateway": "Waiting for U-Claw to come up…",
"loading.ready": "U-Claw is ready",
"loading.choose_next": "Pick what to do next — start chatting, or set up your model and channels first.",
"loading.open_dashboard": "🚀 Start chatting",
"loading.open_settings": "⚙️ Settings",
"loading.settings_hint": "Add or change your API key, and connect chat apps.",
"loading.no_model_hint": "No model set up yet? Open Settings first to add a key.",
"loading.slow_drive_note": "A slow drive usually takes 3090 seconds. If nothing happens for a long time, open Settings:",
"loading.elapsed": "Waited {seconds}s",
"loading.taking_long": "This is taking longer than usual. You can open Settings while you wait:",
"welcome.title": "U-Claw — Getting Started",
"welcome.subtitle": "Your AI assistant on a USB drive · three steps",
"welcome.quickstart": "Quick start",
"welcome.step1_title": "1. Start U-Claw",
"welcome.step1_desc": "Double-click the file for your computer:",
"welcome.step2_title": "2. Add a key",
"welcome.step2_desc": "Settings opens on its own the first time. You need one API key to get going — Google Gemini is the easiest to obtain: sign in with a Google account, no card required.",
"welcome.step2_link": "Get a free Gemini key →",
"welcome.step3_title": "3. Start talking",
"welcome.step3_desc": "Once the key is saved, the chat window opens by itself. That is it.",
"welcome.portable_note": "✅ Your settings and history stay in the data/ folder on the drive, so they travel with you between Mac and Windows.",
"welcome.models_title": "Which model?",
"welcome.model_claude": "Best all-rounder",
"welcome.model_gpt": "Most widely used",
"welcome.model_gemini": "Free tier, easiest signup",
"welcome.model_local": "Offline · nothing leaves this machine",
"welcome.models_more": "More options, including SEA-LION for Malay, Tamil and Singlish, are in Settings.",
"welcome.trouble_title": "Something not working?",
"welcome.trouble_lead": "💡 Run the check-up tool",
"welcome.trouble_desc": "If U-Claw will not start, double-click:",
"welcome.open_settings": "Open Settings",
"welcome.open_docs": "Documentation",
"nav.title": "U-Claw — Start here",
"nav.tagline": "Portable AI agent — plug in and go",
"nav.status_off": "U-Claw is not running",
"nav.open_console": "Open it →",
"nav.quickstart": "Quick start",
"nav.doubleclick": "Double-click",
"nav.step2": "Settings opens by itself the first time — pick a model and paste your key.",
"nav.mac_gatekeeper": "⚠️ If macOS says the developer cannot be verified: right-click the file, then choose Open.",
"nav.config_shortcut": "📝 You can also double-click Config.html — it takes you to the settings page.",
"nav.win_smartscreen": "⚠️ If Windows shows a security warning: click More info, then Run anyway.",
"nav.everything": "Everything else",
"nav.menu_opens": "for the full menu:",
"nav.g_settings": "Settings",
"nav.g_settings_d": "Model, key and chat apps",
"nav.g_checkup": "Check-up",
"nav.g_checkup_d": "Finds and fixes common problems",
"nav.g_backup": "Backup",
"nav.g_backup_d": "Save settings and memory in one click",
"nav.g_skills": "Skills",
"nav.g_skills_d": "Browse what U-Claw can do",
"nav.g_system": "System info",
"nav.g_system_d": "Version, port, running state",
"nav.g_cli": "Command line",
"nav.g_cli_d": "For advanced use",
"nav.models_title": "Models you can use",
"nav.model_sealion": "Malay, Tamil and Singlish",
"nav.model_local": "Local model",
"nav.model_more": "More",
"nav.model_more_d": "Others are listed in Settings",
"nav.more_title": "More",
"nav.link_guide": "Getting started",
"nav.link_guide_d": "The three-step walkthrough",
"nav.link_skills": "Skills",
"nav.link_skills_d": "Browse what U-Claw can do",
"nav.link_contact": "Contact",
"nav.link_site": "Website",
"nav.status_on": "U-Claw is running on port {port}",
"nav.status_off_hint": "U-Claw is not running — double-click the start file first",
"key.page_title": "U-Claw Settings",
"key.page_subtitle": "Paste an API key and you are done.",
"key.checking": "Checking…",
"key.step_key": "Your key",
"key.step_done": "Done",
"key.heading": "Paste your API key",
"key.desc": "U-Claw works out the rest by itself. Your key is saved on this drive only — it is never uploaded anywhere.",
"key.placeholder": "sk-…",
"key.show": "Show",
"key.hide": "Hide",
"key.continue": "Continue →",
"key.checking_key": "Checking this key…",
"key.ok": "✓ {provider} · connected in {ms}ms",
"key.custom_provider": "Your endpoint",
"key.no_key_title": "Do not have a key yet?",
"key.no_key_desc": "Google Gemini is the quickest to get: sign in with a Google account, no card needed, and there is a free tier.",
"key.get_gemini": "🔑 Get a free Gemini key",
"key.get_openrouter": "🔑 OpenRouter — one key for many models",
"key.advanced": "Advanced — set the endpoint manually",
"key.base_url": "API endpoint",
"key.model_name": "Model name",
"key.advanced_hint": "Only needed for a self-hosted or unlisted provider. Leave blank to let U-Claw decide.",
"key.saved": "Saved.",
"key.err_empty": "Paste a key to continue.",
"key.err_not_checked": "Hold on — still checking that key.",
"key.err_rejected": "That key was not accepted. Check you copied all of it — keys are long and easy to cut short.",
"key.err_quota": "This key has run out of credit. Top it up with your provider, or paste a different key.",
"key.err_offline": "Cannot reach the internet. Check your Wi-Fi and try again.",
"key.err_timeout": "The provider did not answer in time. Try again in a moment.",
"key.err_model": "That key works, but the model it points to was not found. Set the model name under Advanced.",
"key.err_provider_down": "The provider is having trouble right now. Try again shortly.",
"key.err_unrecognised": "This key is not one U-Claw recognises. Fill in the endpoint and model under Advanced.",
"key.err_unknown": "Could not check that key. Try again, or use Advanced to set the endpoint yourself.",
"key.err_save": "Could not save. Make sure the drive is still plugged in, then try again.",
"hub.title": "U-Claw Skills",
"done.title": "You are set up",
"done.subtitle": "Your model and key are saved on this drive.",
"done.open": "🚀 Start chatting",
"done.restart_note": "Chat app settings are saved now and take effect after U-Claw restarts.",
"done.change_key": "Change model or key",
"done.view_config": "View config file",
"ch.title": "📱 Connect a chat app (optional)",
"ch.desc": "Click a card to fill it in, or skip this entirely.",
"ch.whatsapp_d": "Talk to U-Claw from WhatsApp",
"ch.whatsapp_warning": "⚠️ This uses an unofficial protocol. Your WhatsApp account can be banned for it. Do not connect a number you rely on.",
"ch.whatsapp_number": "Phone number",
"ch.telegram_d": "Talk to U-Claw from Telegram",
"ch.telegram_get": "→ Get one from @BotFather",
"ch.slack_d": "Talk to U-Claw from your workspace",
"ch.slack_get": "→ Create an app at api.slack.com",
"ch.discord_d": "Talk to U-Claw from Discord",
"ch.discord_get": "→ Create an app in the Discord developer portal",
"ch.china_group": "Chat apps used mainly in China",
"ch.wechat_d": "Scan a QR code to link a personal WeChat account",
"ch.wechat_start": "Click this card to show the QR code",
"ch.saved": "Chat app settings saved.",
"ch.err_save": "Could not save the chat app settings. Check the drive is still plugged in.",
"info.layout_title": "What is on the drive",
"info.layout_desc": "How the folders are organised",
"info.skills": "Skills",
"info.skills_d": "Drop a SKILL.md in here and it is picked up automatically",
"info.app": "Runtime",
"info.app_d": "Node.js and the OpenClaw core",
"info.data": "Your data",
"info.data_d": "Your key and chat history. Stays on this drive.",
"info.feedback_title": "Found a problem?",
"info.feedback_desc": "U-Claw is open source. Report anything that breaks on GitHub — nothing is collected or uploaded from your machine automatically.",
"info.feedback_link": "→ Open an issue on GitHub",
"wx.getting_qr": "Fetching the QR code…",
"wx.scan": "Scan the code above with WeChat",
"wx.qr_failed": "Could not fetch the QR code",
"wx.connected": "✅ WeChat connected",
"wx.account": "Account",
"wx.restart_needed": "One more thing: restart U-Claw (close it and open it again) before WeChat will work.",
"wx.connected_toast": "WeChat connected. It works after U-Claw restarts.",
"wx.qr_refreshed": "The code refreshed — scan it again",
"wx.confirm_on_phone": "Scanned. Confirm on your phone…",
"wx.qr_expired": "That code expired.",
"wx.qr_retry": "Get a new one",
"wx.failed": "Could not connect",
"info.read_config_failed": "Could not read the config file:",
"status.running": "U-Claw is running on port {port}",
"status.open_dashboard": "Open it →",
"status.not_running": "U-Claw is not running — start it with Windows-Start.bat or Mac-Start.command",
"key.which_model": "Which model?",
"start.opening_language": "Asking which language to use…",
"persona.title": "What will you mostly use this for?",
"persona.subtitle": "This sets up the right tools for you. You can change it later, and picking more than one is fine.",
"persona.continue": "Continue →",
"persona.skip": "Skip this",
"persona.saving": "Setting things up…",
"persona.err_offline": "U-Claw is not running yet. Start it, then open this page again.",
"persona.err_save": "Could not save that. Check the drive is still plugged in, then try again.",
"persona.developer": "Writing code",
"persona.admin": "Documents and email",
"persona.sales": "Talking to customers",
"persona.marketing": "Content and social",
"persona.finance": "Numbers and spreadsheets",
"persona.boss": "Running a business",
"persona.general": "Just having a look",
"start.opening_persona": "Asking what you will use it for…",
"tier.label": "How much do you want to see?",
"tier.simple": "Just the essentials",
"tier.standard": "A bit more control",
"tier.expert": "Everything",
"tier.changed_simple": "Switched to the simple view — advanced options are hidden.",
"tier.changed_standard": "Switched to the standard view — you can now change models and connect more chat apps.",
"tier.changed_expert": "Switched to the full view — everything is visible, including the config file.",
"start.checking": "Something went wrong — checking…",
"start.repaired": "Fixed. Trying again.",
"start.diagnostics_written": "A report of what happened was saved to: {path}",
"start.diagnostics_hint": "API keys have been removed from it. Send it to help@u-claw.org if you want a hand.",
"skill.excel-helper.name": "Spreadsheets",
"skill.excel-helper.desc": "Formulas, pivot tables, charts, cleaning messy data",
"skill.word-writer.name": "Documents",
"skill.word-writer.desc": "Reports, proposals, CVs — drafting and formatting",
"skill.ppt-designer.name": "Slide decks",
"skill.ppt-designer.desc": "Structure, layout and speaker notes",
"skill.pdf-toolkit.name": "PDF tools",
"skill.pdf-toolkit.desc": "Merge, split, extract text — all on this machine",
"skill.image-compress.name": "Images",
"skill.image-compress.desc": "Shrink, resize and convert — nothing is uploaded",
"skill.qrcode-maker.name": "QR codes",
"skill.qrcode-maker.desc": "Links, text and WiFi details, generated offline",
"skill.web-to-markdown.name": "Save a web page",
"skill.web-to-markdown.desc": "Turn any article into clean Markdown",
"skill.linkedin-post.name": "LinkedIn posts",
"skill.linkedin-post.desc": "Hooks and structure, without the LinkedIn voice",
"skill.x-poster.name": "Posts for X",
"skill.x-poster.desc": "Short posts and threads that stand on their own",
"skill.tiktok-script.name": "TikTok scripts",
"skill.tiktok-script.desc": "Hooks that survive the first second",
"skill.youtube-script.name": "YouTube scripts",
"skill.youtube-script.desc": "Titles, the first 30 seconds, and chapters",
"skill.medium-writer.name": "Articles",
"skill.medium-writer.desc": "Long-form structure, and cutting the padding",
"skill.email-campaign.name": "Email campaigns",
"skill.email-campaign.desc": "Subject lines, one clear ask, PDPA-safe",
"skill.web-search.name": "Web search",
"skill.web-search.desc": "Find current information and read the sources",
"skill.sg-weather.name": "Singapore weather",
"skill.sg-weather.desc": "Forecast by area and air quality, from NEA",
"skill.sea-translate.name": "SEA translation",
"skill.sea-translate.desc": "English, Chinese, Malay, Tamil — and register",
"skill.claude-helper.name": "Better answers",
"skill.claude-helper.desc": "How to ask, and when to check the answer",
"skill.sg-transport.name": "Singapore transport",
"skill.sg-transport.desc": "Bus arrivals, MRT alerts, carpark lots",
"skill.meeting-notes.name": "Meeting notes",
"skill.meeting-notes.desc": "Decisions and owners, ready to send",
"cat.office": "Office",
"cat.data": "Data",
"cat.writing": "Writing",
"cat.files": "Files",
"cat.research": "Research",
"cat.social": "Social",
"cat.video": "Video",
"cat.language": "Language",
"cat.local": "Singapore",
"cat.ai": "Using AI",
"hub.lede": "These are on this drive already. Just ask for what you want — you do not have to name the skill.",
"hub.all": "All",
"hub.none": "Nothing in this category.",
"hub.add_note": "Skills live in the skills/ folder on this drive. Dropping a SKILL.md in there adds one."
}