pi-extensions-i18n0.9.0
Shared i18n catalog loader & translator for pi extensions
Untested on omp
This is a pi package. No one has reported whether it works on omp yet. If you try it, add your result below.
Reports 0
No reports yet.
Readme
pi-extensions-i18n
Pi 扩展公共国际化运行时。它提供基于 catalog 的小型 API,支持 zh-CN、en-US 和自动语言选择。
为什么需要公共包
独立的 Pi 扩展仍然需要相同的基础能力:可移植的配置路径、语言优先级、fallback、catalog 校验和参数插值。把这些能力集中在这里,功能包就可以专注于自身逻辑,同时保持用户可见文案的一致性。
能力
- 支持
zh-CN、en-US和auto语言偏好。 - 将设置持久化到
~/.pi/agent/extensions/pi-extensions-i18n/config.json。 - 支持
PI_EXTENSIONS_LOCALE环境变量覆盖。 - 提供
/config:language交互式命令,也支持/config:language en-US直接设置。 - 加载并校验 catalog,要求每个消息 key 同时提供两种语言。
- 为 UI、命令描述和 Agent prompt 提供用户文案插值。
- 提供统一的用户提示出口
notifyWithSource:把提示画成会话区里的带底色消息块(用户消息同款底色,见下条),并配上[tag]来源标签,解决 Pi 对info级提示只显示暗灰无前缀文本、用户既分不清来源也不容易注意到的问题。所有包用同一个弱化色标标签(NOTICE_TAG_COLOR):来源靠 tag 文本,不靠颜色 —— 9 个色槽分给 16 个包必然撞车,撞车后颜色反而误导。 - 提示落在消息下方、不进 LLM 上下文:通过 Pi 的自定义条目(
appendEntry+registerEntryRenderer)实现,条目只在本地渲染,不消耗上下文窗口。 - 提示块里的细节行(
details)默认收起、只占一行,行尾带展开箭头(收起态▶、展开态▼,强调色):全屏模式下直接点这条提示块切换,常规模式用Ctrl+O(pi-tui 太老没有MouseRegion时自动退化成只能键盘展开)。用箭头而不是写「Ctrl+O展开」:全屏与常规模式在条目渲染时区分不出来,箭头在两种模式下都成立,而且与清爽模式的折叠头用同一个字形。没有details的提示不带箭头,不会指一个点了没反应的入口。
安装
pi install npm:pi-extensions-i18n
各功能包会自动安装并加载这个公共依赖,因此安装任意使用它的功能包即可使用语言命令。只有不安装其他功能包、想单独使用语言命令时,才需要直接安装本包。
统一的提示出口
import { NOTICE_TAG_COLOR, notifyWithSource, type NoticeColor, type NoticeSource } from "pi-extensions-i18n";
/** 本扩展的提示标签;短且唯一。 */
const NOTICE_TAG = "distill";
/** 提示标签颜色:所有扩展统一用弱化色,来源靠 tag 文本区分,不靠颜色。 */
const NOTICE_COLOR: NoticeColor = NOTICE_TAG_COLOR;
/** 本扩展的提示来源。 */
const NOTICE_SOURCE: NoticeSource = { tag: NOTICE_TAG, color: NOTICE_COLOR };
notifyWithSource({ ctx, source: NOTICE_SOURCE, level: "warning", message: i18n.t("failed") });
输出是一个和用户消息同款的实心底色块,首行是 [distill] 提示正文:标签统一用共享的弱化色 NOTICE_TAG_COLOR,正文颜色由 level 决定(warning 黄、error 红、info 用扩展消息正文色),也可以用 textColor 覆盖成结论行自带的语义色(dim/success 等)。级别色是语义色,保持不变;只有来源标签不再用颜色当身份标识。
渲染细节:
- 只有 TUI 会把提示画成底色块;rpc/print/json 仍走
ctx.ui.notify,输出纯文本[distill] 提示正文,不会出现 ANSI 乱码。 - 底色块由本包的扩展入口
installNoticeRenderer(pi)注册一次,因此使用本包的功能包必须在自己的pi.extensions里加载../pi-extensions-i18n/index.ts。 - 老版本 Pi 没有这两个能力时不会注入,提示自动退回
ctx.ui.notify(仍然可见,只是没有底色)。
需要更细粒度控制时用 formatNotice({ source, message, mode, theme }) 只取文本。
安装后重新加载 Pi:
/reload
语言优先级
PI_EXTENSIONS_LOCALE 环境变量
> 持久化配置
> 默认 zh-CN
选择 auto 时会检查 LC_ALL、LC_MESSAGES 和 LANG:中文系统语言解析为 zh-CN,其他语言解析为 en-US。同时接受 zh 和 en 简写。
示例:
PI_EXTENSIONS_LOCALE=en-US pi
/config:language en-US
扩展作者 API
本包导出功能扩展使用的语言和 catalog 原语:
import {
createTranslator,
getLocale,
loadCatalog,
} from "pi-extensions-i18n";
const messages = loadCatalog(new URL("../locales/messages.json", import.meta.url));
const i18n = createTranslator(messages);
i18n.t("description");
getLocale();
catalog 条目必须同时包含两种语言:
{
"description": {
"zh-CN": "扩展描述",
"en-US": "Extension description"
}
}
无效 catalog 会在加载阶段失败,让缺失翻译在测试和 CI 中暴露,而不是静默向用户泄露单一语言文案。
要求
- Node.js 22 或更高版本。
- 使用
/config:language命令时需要 Pi 扩展运行时;/pi-language仍作为兼容别名保留。