OpenPencil Vue SDK 中的 useI18n:读取本地化界面消息并构建自定义语言切换器
前端桌面应用AI 应用MCP 服务【免费下载链接】open-pencilAI-native design editor. Open-source Figma alternative.项目地址https://gitcode.com/gh_mirrors/op/open-pencil点击查看免费下载useI18n()是 OpenPencil Vue SDKopen-pencil/vue提供的一个兼容聚合型组合式函数它一次性返回全部产品域menu、settings、tools、panels 等的响应式翻译消息组以及活动语言、可用语言列表与切换语言的控制函数。本文围绕 useI18n 官方文档 展开结合 i18n 源码实现 讲解其返回结构、底层语言状态管理与懒加载机制并给出一个无需复制任何翻译目录即可工作的自定义语言选择器组件。读完本文你将掌握在 OpenPencil 宿主应用中读取本地化 UI 消息、按需订阅指定语言域、以及用原生语言元数据构建个性化语言切换器的完整方案。一、useI18n 是什么兼容聚合体与产品域组合式函数useI18n()提供活动语言active locale、翻译消息与面向菜单、命令、工具、面板、页面和窗口的标签可以让你在不复制翻译目录的前提下创建自定义语言选择器。在源码层面它被明确标注为「兼容聚合体」/** Compatibility aggregate. New code should import the narrow domain composable. */ export function useI18n() { return { ai: useAIMessages(), automation: useAutomationMessages(), ... locale: useStore(locale) as RefLocale, availableLocales: AVAILABLE_LOCALES, localeLabels: LOCALE_LABELS, setLocale } }见 packages/vue/src/i18n/useI18n.ts关键设计原则是新组件应当只导入自己需要的产品域组合式函数而不是订阅每一个翻译目录。这既能减少响应式订阅范围也便于按需加载对应语言的 JSON 目录详见第五节。每个域组合式函数返回一个响应式 refimport { useSettingsMessages, useRenameMessages } from open-pencil/vue const settings useSettingsMessages() const rename useRenameMessages()在script中读取时使用.value在模板中 Vue 会自动解包unwrapsref。二、返回结构24 个翻译 ref 与 4 个语言控制项useI18n()的完整返回结构分为两类翻译 refTranslation refs共 24 个产品域ai、automation、code、collaboration、commands、common、credentials、diagnostics、editor、files、fonts、media、menu、pages、panels、recovery、rendering、rename、settings、storage、tools、updates、variables、variableTypes。语言控制Locale controls共 4 个locale当前活动语言响应式availableLocales可用语言代码列表localeLabels语言代码 → 本地化显示名的映射setLocale(code)切换语言该列表与 useI18n.ts 源码 中的返回对象一一对应也印证了文档中「menu、commands、panels、pages 等标签均来自这些域」的描述。从源码结构看packages/vue/src/i18n/messages.ts每个域还有配套的xxxMessageDefaults默认消息对象作为英文基准目录被nanostores/i18n用于合并翻译 JSON。注意dialogs 组已移除开发版v0.14.0 之后中原先的dialogs组、useDialogMessages()和dialogMessages已被移除。请改用其所属域如settings、rename、recovery并同步更新对应的消息键。当前 messages.ts 中确实已不存在任何dialogs导出与文档说明一致。三、底层实现useI18nNamespace 与 nanostores 桥接聚合体的每个消息域本质上是useI18nNamespace的调用结果其实现仅一行export function useI18nNamespaceMessagesStore extends Store(messages: MessagesStore) { return useStore(messages) as RefStoreValueMessagesStore }见 packages/vue/src/i18n/useI18n.ts它借助nanostores/vue的useStore把 nanostores 的原子 store 转成 Vue 的Ref从而让语言切换时所有订阅了该 store 的组件自动响应式更新。整个 index.ts 导出清单 表明useI18n、24 个域组合式函数、i18n实例以及locale/localeSetting/setLocale/AVAILABLE_LOCALES/LOCALE_LABELS等语言原语全部对外导出。四、实战不复制目录的自定义语言选择器文档给出的基础示例用useI18n()直接构建一个下拉语言选择器script setup langts import { useI18n } from open-pencil/vue const { menu, locale, availableLocales, localeLabels, setLocale } useI18n() /script template label classflex items-center gap-2 span{{ menu.view }}/span select :valuelocale changesetLocale(($event.target as HTMLSelectElement).value as typeof locale) option v-forcode in availableLocales :keycode :valuecode {{ localeLabels[code] }} /option /select /label /template要点拆解不复制目录availableLocales与localeLabels直接来自 SDK 的语言元数据因此无需维护任何重复的语言清单或显示名表响应式切换locale是响应式 refsetLocale更新后模板中的menu.view等所有消息组会一起刷新文档 Notes 中的第一条「locale changes are reactive across all SDK message groups」类型安全(typeof locale)限定 select 的取值类型只能传入Locale联合类型中的合法代码。如果只想读取菜单标签而不订阅全部 24 个域可以改用useMenuMessages()订阅范围更小、更符合 SDK 的推荐用法。五、语言状态底层locale.ts 中的持久化与浏览器解析useI18n()返回的locale/availableLocales/localeLabels/setLocale全部来自 packages/vue/src/i18n/locale.ts可用语言第 4 行[en, de, es, fr, it, ja, pl, ru, zh-CN]共 9 种其中除en外的 8 种为翻译语言TRANSLATED_LOCALES显示标签第 30-40 行LOCALE_LABELS给出每种语言的原生显示名如zh-CN: 中文简体、ja: 日本語持久化偏好localeSetting是一个 nanostores atomsetLocale(code)同时写入该 store 与localStorage键名open-pencil-locale启动恢复模块加载时会从localStorage读取已保存的语言并校验其是否属于AVAILABLE_LOCALES非法值会被忽略浏览器语言解析resolveBrowserLocale按navigator.languages顺序精确匹配语言代码匹配失败时退回匹配语言基名如pt-BR无法匹配时会尝试pt最后兜底en活动语言合成locale由localeFrom(localeSetting, browserLocale)合成——优先用户偏好否则使用浏览器语言。这些细节解释了文档 Notes 第二条「the SDK also exports lower-level locale primitives when you need direct store access」。如果你需要把语言状态接入更大的应用外壳或只想拿语言元数据而不订阅完整的useI18n()返回对象可直接从open-pencil/vue导入locale、localeSetting、setLocale、AVAILABLE_LOCALES、LOCALE_LABELS详见 SDK Locale APIs。六、懒加载翻译目录create.ts 中的按需导入useI18n()之所以能「不复制目录」即可切换语言底层依赖 packages/vue/src/i18n/create.ts 中基于nanostores/i18n的createI18n实例const localeLoaders { de: () import(#vue/i18n/locales/de), es: () import(#vue/i18n/locales/es), ... zh-CN: () import(#vue/i18n/locales/zh-cn) } satisfies RecordTranslatedLocale, () Promise{ default: ComponentsJSON } export const i18n createI18nLocale, en(locale, { baseLocale: en, async get(code) { if (code en) return {} const mod await localeLoaders[code]() return mod.default } })每个非英文语言通过动态import()懒加载对应语言目录locales/目录下按语言分文件组织共 200 个 JSON 与 8 个 TS 文件en作为baseLocale直接返回空对象、由xxxMessageDefaults兜底。这意味着切换语言时只拉取目标语言的 JSON同时默认消息与翻译消息在nanostores/i18n内部完成合并这正是useI18n()返回各域 ref 都能即时更新的机制基础。七、与相关 API 的关系useMenuModel需要读取菜单模型而非仅菜单文案时使用见 use-menu-modelSDK Locale APIs需要绕过聚合体、直接操作语言 store 或获取语言元数据时使用见 locale-apis域级组合式函数新组件应优先使用useSettingsMessages、useRenameMessages等单一域入口而不是useI18n()全量订阅。小结useI18n()是 OpenPencil Vue SDK 中读取本地化 UI 消息的入口聚合体它把 24 个产品域的响应式翻译 ref 与语言控制项locale、availableLocales、localeLabels、setLocale打包成一份开箱即用的返回对象。其底层由 nanostores store Vue ref 桥接useI18nNamespace、localStorage持久化与浏览器语言解析locale.ts、以及按语言懒加载 JSON 的nanostores/i18n实例create.ts共同支撑。对于新代码按产品域导入窄接口是更优实践对于需要自定义语言选择器或深度集成语言状态的场景本文给出的示例与底层原语足以覆盖从 UI 到存储层的完整链路。赞分享前端桌面应用AI 应用MCP 服务【免费下载链接】open-pencilAI-native design editor. Open-source Figma alternative.项目地址https://gitcode.com/gh_mirrors/op/open-pencil点击查看免费下载相关推荐OpenPencil Vue SDK 国际化指南useI18n 组合式函数与多语言切换实战OpenPencil Vue SDK 国际化指南useI18n 组合式函数与多语言切换实战 导读 useI18n 是 OpenPencilAI native前端桌面应用AI 应用MCP 服务OpenPencil Vue SDK 区域配置 APILocale APIs深入解析语言切换、回退机制与自定义消息目录OpenPencil Vue SDK 区域配置 APILocale APIs深入解析语言切换、回退机制与自定义消息目录 open pencil/vue前端桌面应用AI 应用MCP 服务Pyarmor本地化支持如何自定义错误消息和界面语言Pyarmor本地化支持如何自定义错误消息和界面语言 Pyarmor作为专业的Python代码混淆工具提供了强大的本地化支持功能让开发者能够自定义错误消息开发工具应用安全上一篇SharpCompress快速开始5分钟掌握压缩与解压核心操作下一篇如何快速制作专业EPUB电子书在线编辑器完全指南创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

Zeek Modbus 协议分析:从 base 脚本到日志输出的完整实现指南

Zeek Modbus 协议分析:从 base 脚本到日志输出的完整实现指南

网络安全网络IDS 【免费下载链接】zeek Zeek is a powerful network analysis framework that is much different from the typical IDS you may know. 项目地址: https://gitcode.com/gh_mirrors/ze/zeek 点击查看 免费下载 Zeek 内置的 Modbus 分析器用于监控工业…

2026/10/9 1:57:18 阅读更多 →
Product-Manager-Skills 实战:PoL Probe 探针示例全解——用可抛弃的最小验证在昂贵开发前拿到残酷真相

Product-Manager-Skills 实战:PoL Probe 探针示例全解——用可抛弃的最小验证在昂贵开发前拿到残酷真相

AI 技能AI 插件 【免费下载链接】Product-Manager-Skills Product Management skills framework built on battle-tested methods for Claude Code, Cowork, Codex, and AI agents. 项目地址: https://gitcode.com/gh_mirrors/pr/Product-Manager-Skills 点击查看 免…

2026/10/9 1:57:18 阅读更多 →
串口在IIoT底层为何依然坚挺:从物理层到软件层的完整解析

串口在IIoT底层为何依然坚挺:从物理层到软件层的完整解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/9 1:57:18 阅读更多 →

最新新闻

SHA1算法的各种密码分析方法全面盘点

SHA1算法的各种密码分析方法全面盘点

SHA1算法的各种密码分析方法全面盘点SHA-1(安全散列算法1)是由NSA设计、NIST于1995年发布的160位密码杂凑函数。基于Merkle-Damgrd迭代结构,将任意长度消息分为512位块,通过压缩函数依次处理。理论上,SHA-1应具备160位…

2026/10/9 2:34:38 阅读更多 →
Python 数据挖掘实战项目:电商用户行为分析(聚类分群、流失预测与关联规则)

Python 数据挖掘实战项目:电商用户行为分析(聚类分群、流失预测与关联规则)

Python 数据挖掘实战项目:电商用户行为分析(聚类分群、流失预测与关联规则) 数据挖掘课程设计与竞赛入门的共同痛点是「没有真实数据可练」。本工程内置一个带真实行为规律的订单数据生成器(5000 用户 / 约 3 万条订单&#xff0…

2026/10/9 2:34:38 阅读更多 →
Java 异常处理实战案例集:50 个高频异常的现象、根因、修复与预防

Java 异常处理实战案例集:50 个高频异常的现象、根因、修复与预防

Java 异常处理实战案例集:50 个高频异常的现象、根因、修复与预防 异常处理是 Java 面试与答辩的必考题,但多数教程只讲语法不讲「为什么会炸」。这套案例集把 50 个高频异常按 8 大家族归类,每个案例固定四段式:现象&#xff08…

2026/10/9 2:34:38 阅读更多 →
SaaS「现金陷阱」全解析:EnterpriseCRM 案例教你如何识破 5:1 LTV:CAC 的假象(Product-Manager-Skills 实战拆解)

SaaS「现金陷阱」全解析:EnterpriseCRM 案例教你如何识破 5:1 LTV:CAC 的假象(Product-Manager-Skills 实战拆解)

AI 技能AI 插件 【免费下载链接】Product-Manager-Skills Product Management skills framework built on battle-tested methods for Claude Code, Cowork, Codex, and AI agents. 项目地址: https://gitcode.com/gh_mirrors/pr/Product-Manager-Skills 点击查看 免…

2026/10/9 2:34:38 阅读更多 →
互联网消费金融资金合作模式全解析:助贷、联合贷、ABS与信托通道选型指南

互联网消费金融资金合作模式全解析:助贷、联合贷、ABS与信托通道选型指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/9 2:34:38 阅读更多 →
Loop 径向菜单窗口管理完整指南:按住一个键,窗口就去哪

Loop 径向菜单窗口管理完整指南:按住一个键,窗口就去哪

Loop 径向菜单窗口管理完整指南:按住一个键,窗口就去哪 【免费下载链接】Loop Window management made elegant. 项目地址: https://gitcode.com/GitHub_Trending/lo/Loop 手要拖窗口之前 光标悬在窗口标题栏上,手指刚要往下拽&#…

2026/10/9 2:33:38 阅读更多 →

日新闻

Java时间API实战:LocalDate、Date与ZonedDateTime的转换与避坑指南

Java时间API实战:LocalDate、Date与ZonedDateTime的转换与避坑指南

Java时间API这个话题,隔三差五就会在群里被翻出来讨论一次。上周还有个同事线上处理一个订单超时问题,排查到最后发现是ZonedDateTime序列化后时区丢了,用户在下单当天晚上看到的时间整整差了8个小时。这类问题几乎每个做Java开发的人都遇到过…

2026/10/9 0:00:49 阅读更多 →
EasyTier实践:从NAT穿透到子网代理的异地组网部署与排错

EasyTier实践:从NAT穿透到子网代理的异地组网部署与排错

前几个月我手头有好几台机器需要互相访问:办公室台式机、家里 NAS、还有一台云主机。如果只是偶尔传个文件倒还好,问题是工作场景经常要在几处环境之间来回切换,每次都先登录跳板机再层层代理,实在折腾。我先后试过端口映射、自建…

2026/10/9 0:00:49 阅读更多 →
AI Agent工程实战:从七要素到七个决策点的系统设计指南

AI Agent工程实战:从七要素到七个决策点的系统设计指南

AI Agent 这个词在过去一年里被反复提及,但真正动手搭过一套能跑起来的 Agent 系统的人都知道,从"知道它是什么"到"让它稳定干活"之间隔着一整套工程决策。我前后参与过几个 Agent 项目的落地,从最初用现成框架拼装&…

2026/10/9 0:01:50 阅读更多 →

周新闻

KT148A语音芯片外挂8002D功放的工程实践指南

KT148A语音芯片外挂8002D功放的工程实践指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/8 15:26:32 阅读更多 →
LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/8 15:26:40 阅读更多 →
ARM架构深度解析:从RISC设计理念到交叉编译实战

ARM架构深度解析:从RISC设计理念到交叉编译实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/8 10:10:36 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/8 21:13:17 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/8 15:26:17 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/7 13:34:55 阅读更多 →