ClawX 中的 TokenDance 提供商中文界面限定发现机制:基于声明式语言门控的完整实现解析 人工智能AI 应用桌面应用交互助手【免费下载链接】ClawXClawX is a desktop app that provides a graphical interface for OpenClaw AI agents. It turns CLI-based AI orchestration into a desktop experience without using the terminal. China website is https://clawx.com.cn.项目地址https://gitcode.com/gh_mirrors/cl/ClawX点击查看免费下载TokenDance 是一个多模型网关提供商在 ClawX 中作为 OpenAI 兼容提供商接入。本文围绕任务规格 restrict-tokendance-to-chinese-ui.md 展开深入讲解 ClawX 如何通过声明式界面语言可用性元数据让 TokenDance 仅在中文界面下出现在添加提供商目录中同时保证已配置的 TokenDance 账户在切换语言后仍可管理与使用。读完本文你将掌握这套语言门控机制的完整数据流、底层实现位置、边界约束与测试验证方式并可直接在 ClawX 代码库中追踪每个关键环节。需求背景为什么 TokenDance 只对中文界面开放发现入口TokenDance 作为面向特定用户群体的网关服务ClawX 希望其新配置入口add-provider 目录只出现在中文界面中而英文、日文、俄文等界面不向用户暴露这一选项。这一需求不是简单的 UI 隐藏而是有一套明确的行为契约见任务规格的expectedUserBehavior当界面语言为英语、日语或俄语时TokenDance不出现在添加提供商对话框中当界面语言为中文时TokenDance出现在添加提供商对话框中且从设置页切换语言后该变化即时生效已经配置好的 TokenDance 账户在界面切换到非中文后仍然可见、可管理不会被删除、禁用或隐藏。这与配套规则 tokendance-oauth-provider.md 中的约束一致TokenDance discovery is available only when the ClawX interface language resolves to Chinese. English, Japanese, Russian, and unsupported fallback locales must not show TokenDance in the add-provider catalog. This presentation gate must remain declarative and reactive to language changes; it must not delete, disable, or hide an already configured TokenDance account.也就是说这套门控是纯表现层presentation约束它只影响发现discovery绝不触及账户数据、密钥或运行时行为。核心机制availableInLanguages声明式元数据整个语言门控的基石是前端提供商元数据中新增的availableInLanguages字段。在 src/lib/providers.ts 的ProviderTypeInfo接口中该字段被明确定义并附有语义注释/** Limits discovery in the add-provider UI without affecting configured accounts. */ availableInLanguages?: readonly LanguageCode[];作用范围仅限制添加提供商 UI 中的发现不影响已配置账户缺省语义未声明该字段的提供商在所有语言下都可被发现见下文isProviderAvailableForLanguage的实现值类型LanguageCode数组来自 shared/language.ts 中定义的SUPPORTED_LANGUAGE_CODES [en, zh, ja, ru]。TokenDance 的元数据声明位于同一文件的PROVIDER_TYPE_INFO列表中{ id: tokendance, name: TokenDance, icon: TD, placeholder: your-tokendance-api-key, model: Multi-Model, requiresApiKey: true, isOAuth: true, supportsApiKey: true, defaultBaseUrl: https://tokendance.space/gateway/v1, defaultModelId: qwen3.8-max, showModelId: true, modelIdPlaceholder: qwen3.8-max, apiKeyUrl: https://tokendance.space/keys, docsUrl: https://tokendance.space/docs/ai-integration, availableInLanguages: [zh], }availableInLanguages: [zh]即宣告TokenDance 仅在中文界面下可被发现。除语言门控外这条元数据还携带了 TokenDance 的运行参数网关地址https://tokendance.space/gateway/v1、默认模型qwen3.8-max、同时支持 OAuth 登录与 API Key 两种接入方式isOAuth: true且supportsApiKey: true。语言解析resolveSupportedLanguage如何归一化中文区域变体由于用户界面语言可能携带区域后缀如zh-CN门控判断不能做简单的字符串相等比较。ClawX 在 shared/language.ts 中提供了resolveSupportedLanguage函数将任意 locale 归一到四种受支持语言之一function normalizeLocale(locale: string | null | undefined): string { return locale?.trim().toLowerCase().replaceAll(_, -) ?? ; } export function resolveSupportedLanguage( locale: string | null | undefined, fallback: LanguageCode en, ): LanguageCode { const normalizedLocale normalizeLocale(locale); if (!normalizedLocale) { return fallback; } const [baseLanguage] normalizedLocale.split(-); return SUPPORTED_LANGUAGE_CODE_SET.has(baseLanguage) ? (baseLanguage as LanguageCode) : fallback; }关键点先做归一化去除首尾空白、转小写、把下划线_替换为连字符-兼容zh_CN这类写法再取连字符前的基础语言码zh-CN、zh-TW、zh_HK都会解析为zh因此中文区域变体被统一识别未支持的 locale 回退到en这意味着任何无法解析的界面语言都会落入英语TokenDance 自然不会出现在目录中。这一基础语言码 回退策略正是任务规格 acceptance 中所要求的handles normalized Chinese locale variants处理归一化的中文区域变体。判断函数isProviderAvailableForLanguage的过滤规则在 src/lib/providers.ts 中门控判断被封装为纯函数便于复用与单元测试export function isProviderAvailableForLanguage( provider: PickProviderTypeInfo, availableInLanguages, language: string | null | undefined, ): boolean { if (!provider.availableInLanguages?.length) { return true; } return provider.availableInLanguages.includes(resolveSupportedLanguage(language)); }逻辑非常简洁未声明availableInLanguages或为空数组的提供商 → 恒为true不受语言影响保证绝大多数提供商Anthropic、OpenAI、Google、DeepSeek 等在所有语言下行为不变声明了该字段的提供商则将传入的语言字符串交给resolveSupportedLanguage归一化后判断是否落在允许列表内。TokenDance 只允许zh因此zh/zh-CN返回trueen/ja/ru以及任意不支持的语言都返回false。目录过滤添加提供商对话框中的响应式应用元数据与判断函数最终在 UI 层落地。在 src/components/settings/ProvidersSettings.tsx 的availableTypes计算中目录过滤同时应用了暂时隐藏与语言不可用两条规则const availableTypes PROVIDER_TYPE_INFO.filter((type) { // Skip providers that are temporarily hidden or unavailable in this UI language. if (type.hidden) return false; if (!isProviderAvailableForLanguage(type, i18n.resolvedLanguage || i18n.language)) return false; // ... 其余互斥性过滤MiniMax、Z.AI 等 });这里有两个值得注意的工程细节响应式reactive语言来源传入的是i18n.resolvedLanguage || i18n.language即当前生效的界面语言。由于该表达式位于组件渲染路径中当用户在设置页切换语言时availableTypes会随 i18n 状态变更自动重新计算——这正是任务规格expectedUserBehavior中包括在设置中切换语言之后TokenDance 仍能正确出现/消失的实现保障门控与数据隔离过滤只影响添加到目录ProviderTypeInfo中 TokenDance 的类型注册、图标资源见 src/assets/providers/index.ts 与tokendance.svg以及已配置账户的卡片渲染逻辑都不在此路径上从而保证已有账户不受影响。从源码结构看该过滤发生在候选提供商枚举阶段与账户是否已配置无关因此不存在因为语言变化而移除账户的可能。边界约束什么不做比做什么更重要任务规格用独立的Out Of Scope小节明确了语言门控的边界这些约束在实现与后续维护中必须被尊重不做的事情原因从 Main 或共享提供商注册表移除 TokenDance已有账户的运行时同步仍依赖该注册表用户切换语言时删除、禁用或迁移已有 TokenDance 账户用户仍需要管理账户、接收本地化恢复指引改变 TokenDance 的 OAuth、校验、恢复或运行时传输行为语言门控是纯表现层改动移除已有账户所需的 TokenDance 恢复翻译切换到非中文界面的用户仍可能需要恢复指引配套规则 tokendance-oauth-provider.md 进一步强调该表现层门控must not delete, disable, or hide an already configured TokenDance account, because users still need to manage that account and receive localized recovery guidance after switching languages。为了支撑切换语言后账户仍可管理这一承诺TokenDance 的恢复指引必须覆盖所有支持的语言。以 shared/i18n/locales/zh/chat.json 为例三类文档化恢复动作均有本地化文案top_up_balance: TokenDance 账户余额不足。请充值后重试此请求。, reauthorize_api_key: TokenDance 密钥已失效。请打开模型设置并重新授权 TokenDance。, api_key_quota: TokenDance 密钥已达到周期额度。请等待额度刷新或重新授权 TokenDance。这三类动作top_up_balance/reauthorize_api_key/api_key_quota对应ProviderRecoveryAction类型见 src/lib/providers.ts由 Main 侧的密钥校验识别并从响应头中提取再交由渲染层 src/pages/Chat/AcpErrorBanner.tsx 替换为本地化指引。实现背后的完整语境TokenDance 的 OAuth 与运行时接入语言门控只是 TokenDance 接入方案的呈现层部分。为了理解发现入口背后承接的是什么简要梳理配套任务 add-tokendance-oauth-provider.md 与规则文档中的关键事实授权方式Authorization Code S256 PKCE产出的是API Key而非可续期的 OAuth token密钥经 API-key 密钥通道持久化OAuth 细节在 Electron Main 中持有 verifier回调走随机127.0.0.1loopback 端口校验一次性回调的 flow 标识代码交换限时十分钟归属标识https://clawx.com.cn同时用于 OAuth 的app_url参数和每次模型请求的X-App-URL请求头保证请求归属覆盖密钥归属运行时配置网关地址https://tokendance.space/gateway/v1协议openai-completions默认模型qwen3.8-max。这些常量可以在 electron/utils/tokendance-oauth.ts 中直接核对例如export const TOKENDANCE_APP_URL https://clawx.com.cn; export const TOKENDANCE_GATEWAY_BASE_URL https://tokendance.space/gateway/v1; export const TOKENDANCE_DEFAULT_MODEL qwen3.8-max; export const TOKENDANCE_APP_HEADER { X-App-URL: TOKENDANCE_APP_URL } as const;需要强调的是这些行为明确属于Out Of Scope——语言门控任务不改变上述任何传输与授权行为理解它们只是为了把握门控之外、账户配置完成后仍然持续运转的运行时链路。测试验证单元测试如何锁定语言门控行为语言门控的正确性由单元测试直接锁定。在 tests/unit/providers.test.ts 中limits TokenDance discovery to Chinese interface locales用例对判断函数做了完整覆盖it(limits TokenDance discovery to Chinese interface locales, () { const tokenDance PROVIDER_TYPE_INFO.find((provider) provider.id tokendance); const openAi PROVIDER_TYPE_INFO.find((provider) provider.id openai); expect(tokenDance).toBeDefined(); expect(isProviderAvailableForLanguage(tokenDance!, zh)).toBe(true); expect(isProviderAvailableForLanguage(tokenDance!, zh-CN)).toBe(true); expect(isProviderAvailableForLanguage(tokenDance!, en)).toBe(false); expect(isProviderAvailableForLanguage(tokenDance!, ja)).toBe(false); expect(isProviderAvailableForLanguage(tokenDance!, ru)).toBe(false); expect(isProviderAvailableForLanguage(tokenDance!, unsupported)).toBe(false); expect(isProviderAvailableForLanguage(openAi!, en)).toBe(true); });该用例验证了任务规格 acceptance 中的关键条目中文可见zh与带区域后缀的zh-CN均返回true归一化区域变体非中文不可见en、ja、ru均返回false不支持的语言回退unsupported返回false说明未支持 locale 经回退到en后同样被门控对照组不回归未声明availableInLanguages的 OpenAI 在en下仍返回true证明该机制不影响其他提供商。同一测试文件中includes TokenDance OAuth with ClawX request attribution用例还锁定了元数据本身expect(PROVIDER_TYPE_INFO).toEqual(expect.arrayContaining([ expect.objectContaining({ id: tokendance, isOAuth: true, supportsApiKey: true, defaultBaseUrl: https://tokendance.space/gateway/v1, defaultModelId: qwen3.8-max, availableInLanguages: [zh], }), ]));除此之外任务规格的requiredTests还要求以下测试覆盖相关面可作为继续深入阅读的索引tests/unit/tokendance-oauth.test.tsOAuth 协议细节PKCE、回调 flow 校验、超时、取消tests/unit/tokendance-openclaw-recovery.test.ts恢复动作在运行时错误文本中的保留与分类tests/unit/provider-validation.test.tsMain 侧密钥校验行为tests/unit/provider-runtime-sync.test.ts 与 tests/unit/provider-store-init.test.ts运行时时同步与存储初始化tests/e2e/provider-lifecycle.spec.ts在 Electron E2E 层覆盖英文隐藏、中文可见的完整用户行为。验收标准一览如何判断实现是否达标任务规格的acceptance小节给出了完整验收清单浓缩了本节全部讨论提供商可用性元数据将 TokenDance 标记为仅中文界面可用并处理归一化的中文区域变体添加提供商目录在过滤提供商类型时应用当前响应式界面语言非中文界面无法通过提供商对话框发起新的 TokenDance 配置已存在的 TokenDance 卡片与运行时行为不因界面语言变化而被移除或禁用渲染层代码不新增直接 IPC 或 Gateway HTTP 调用门控完全在渲染层元数据与 i18n 内完成README 各语言翻译对语言门控的 TokenDance 入口描述一致聚焦测试、harness 校验、通信回放与对比、类型检查与 lint 全部通过。其中第 5 条尤其值得注意语言门控属于纯前端表现逻辑由src/lib/providers.ts的元数据与纯函数、src/components/settings/ProvidersSettings.tsx的响应式过滤共同完成不涉及任何进程边界调用。小结ClawX 通过声明式元数据 纯函数判断 响应式目录过滤三层结构实现了 TokenDance 提供商的中文界面限定发现availableInLanguages: [zh]声明约束resolveSupportedLanguage归一化语言变体isProviderAvailableForLanguage封装判断逻辑ProvidersSettings.tsx在渲染路径中随 i18n 语言即时应用过滤。与此同时明确的 Out Of Scope 边界保证了已配置账户的管理与运行时行为、OAuth 授权链路和恢复翻译均不受语言切换影响最终由单元测试与 E2E 测试将这套行为契约固化为可回归验证的工程事实。赞分享人工智能AI 应用桌面应用交互助手【免费下载链接】ClawXClawX is a desktop app that provides a graphical interface for OpenClaw AI agents. It turns CLI-based AI orchestration into a desktop experience without using the terminal. China website is https://clawx.com.cn.项目地址https://gitcode.com/gh_mirrors/cl/ClawX点击查看免费下载相关推荐Axure RP 界面语言定制方案5分钟实现完整中文体验Axure RP 界面语言定制方案5分钟实现完整中文体验 还在为Axure RP界面中英文混杂而烦恼吗Axure RP 简体中文界面定制工具提供了完整的解决FanControl中文界面完整配置指南轻松实现多语言散热控制FanControl中文界面完整配置指南轻松实现多语言散热控制 还在为英文风扇控制软件的操作界面感到困扰吗想要快速调节PC散热系统却卡在语言障碍上FanC桌面应用智能硬件蓝鲸PaaS双环境部署模型stag与prod环境的完整玩法蓝鲸PaaS双环境部署模型stag与prod环境的完整玩法 蓝鲸智云 PaaS 平台BlueKing PaaS蓝鲸PaaS是一个开放式的 SaaS 应用后端云原生微服务前端企业应用开发者门户上一篇styled-system Variants 完全指南基于单个 prop 的主题化复杂样式体系下一篇JAX强化学习策略分布式PPO的样本高效训练创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考