mcpField
L
localization-engineer

localization-engineer

github.com/oakoss开发2197 次安装12 周前更新
代码仓库

关于 localization-engineer

localization-engineer 是面向多语言应用开发的国际化技能,覆盖从语言区域检测到翻译呈现的流程。它提供 ICU、CLDR、RTL 和 SEO 模式,并比较 Paraglide 与 i18next 的选择。

主要功能

  1. 01配置语言区域检测与协商
  2. 02使用 ICU 消息和 CLDR 复数规则
  3. 03进行本地化日期、数字和列表格式化
  4. 04支持 RTL 布局与多语言 SEO
  5. 05比较 Paraglide 与 i18next

适用场景

  1. 01为应用添加多语言界面
  2. 02实现符合语言区域的日期与数字显示
  3. 03审查 RTL 布局和翻译覆盖

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/oakoss/agent-skills --skill localization-engineer

安装后在 Claude Code 中输入/localization-engineer确认已加载。

包含的文件

除 SKILL.md 外,安装时一起下载的参考资料和脚本。

references/
i18next.md
icu-message-format.md
paraglide.md

详细介绍

本地化工程师

概述

提供与框架无关的多语言应用构建模式,涵盖从语言区域检测到翻译渲染的完整 i18n 流程。解决 ICU 消息格式化、CLDR 复数规则、RTL 支持和 SEO 等通用问题。

适用场景: 添加多语言支持、语言区域感知格式化、RTL 布局、复数形式处理、翻译管理、语言区域协商、多语言 SEO。

不适用场景: 没有国际化计划的单语言应用、语言区域永不变化的内容、没有动态内容的纯服务端渲染静态站点。

关键决策: 新项目如需编译时类型安全和精简的打包体积,选择 Paraglide。如需广泛的生态系统支持,或在现有项目中逐步采用,选择 i18next。请参阅下方的库选择表。

库选择

标准Paraglide JSi18next
架构编译时、可进行树摇优化的函数运行时、基于插件的生态系统
类型安全完整(生成带类型的消息函数)部分(需要手动设置类型)
打包体积精简(仅打包实际使用的消息)运行时较大(基础约 40 kB,另加插件)
复数形式处理通过消息格式插件内置 CLDR 复数类别
框架支持SvelteKit、TanStack Start、React Router、Astro、vanillaReact、Vue、Svelte、Angular、Node、vanilla
ICU 支持通过 inlang-icu-messageformat-1 插件通过 i18next-icu 插件
翻译工具Fink 编辑器、Sherlock VS Code 扩展Locize、i18next-parser,以及许多集成
语言区域策略内置(cookie、URL、header、自定义)通过 i18next-browser-languagedetector 插件
SSR 支持基于 AsyncLocalStorage,按请求隔离每个请求使用单独的 i18next 实例
学习曲线低(编译器会生成简单函数)中(API 范围广,插件众多)
命名空间支持每个语言区域使用扁平消息文件支持多命名空间,并可按路由延迟加载
消息格式Inlang 格式,或通过插件使用 ICUi18next JSON v4,或通过插件使用 ICU
社区规模不断壮大(inlang 生态系统)庞大(自 2015 年起发展成熟)
最适用场景注重打包体积和类型安全的新项目需要广泛生态系统支持的现有项目

快速参考

模式方法要点
ICU 复数形式{count, plural, one {# item} other {# items}}CLDR 类别:zero、one、two、few、many、other
ICU 选择(性别){gender, select, male {He} female {She} other {They}}支持按性别和变体生成消息
ICU 序数选择{rank, selectordinal, one {#st} two {#nd} other {#th}}序数后缀因语言而异
数字格式化Intl.NumberFormat(locale, options)平台内置货币、百分比和单位格式化
日期格式化Intl.DateTimeFormat(locale, options)避免手动构造日期字符串
相对时间Intl.RelativeTimeFormat(locale, options)根据语言环境输出「3 小时前」「2 天后」
列表格式化Intl.ListFormat(locale, { type: 'conjunction' })根据语言环境使用连接词输出「Alice、Bob 和 Charlie」
RTL 布局CSS 逻辑属性(inline-start、inline-end)将 left/right 替换为对应的逻辑属性
RTL 检测<html dir="rtl" lang="ar">根据语言环境设置 dir 属性
从 URL 获取语言环境/en/about、/de/about最利于 SEO,且对用户清晰明了
从 Cookie 获取语言环境locale=de cookie在多个会话间保留偏好设置
从标头获取语言环境Accept-Language: de-DE,de;q=0.9,en;q=0.8浏览器偏好设置,可用作后备选项
Hreflang 标签<link rel="alternate" hreflang="de" href="...">每种语言环境各设置一个,并添加 x-default
命名空间拆分按功能或路由对翻译进行分组通过延迟加载减小资源包体积
消息提取自动化工具扫描源代码中的翻译键防止出现无对应引用或缺失的翻译
伪本地化生成伪翻译以测试布局发现文本截断、溢出和硬编码字符串

常见错误

错误正确做法
将翻译片段拼接成句子使用 ICU 消息格式和占位符,确保不同语言环境下的语法正确
在 RTL 排版中使用 margin-left/padding-right使用 CSS 逻辑属性(margin-inline-start、padding-inline-end)
将复数规则硬编码为 count === 1使用 CLDR 复数类别(有些语言有零、二、少量、多量等形式)
仅通过 IP 地理位置判断语言环境依次使用 Accept-Language 标头、Cookie,最后再使用地理位置
hreflang 标签中缺少 x-default始终包含 <link rel="alternate" hreflang="x-default"> 作为回退
每种语言环境使用一个庞大的翻译文件按功能拆分为多个命名空间,以便延迟加载并提高可维护性
为每个组件创建新的 i18next 实例在应用初始化时创建一次,并在各组件间共享
通过字符串拼接格式化日期使用 Intl.DateTimeFormat 按语言环境格式化日期
将语言环境存储在组件状态中将其存储在 URL 路径或 Cookie 中,以兼容 SSR 并便于共享
在客户端和服务端使用不同的 i18n 键在客户端和服务端之间共享翻译文件和键结构
假设所有语言的文本扩展幅度都相同为德语/芬兰语翻译预留比英语多 30-40% 的空间
将文本嵌入图片使用 CSS/SVG 文本覆盖层,以便动态应用翻译
使用语言代码但不指定地区变体在日期、货币等格式存在差异时,使用 en-US 与 en-GB

委派

  • 审查代码库中的硬编码字符串:使用 Explore Agent 扫描组件,查找未翻译的面向用户文本
  • 搭建完整的 i18n 流水线:使用 Task Agent 配置语言环境检测、翻译加载和渲染
  • 规划本地化架构:使用 Plan Agent 设计命名空间结构、语言环境策略和翻译工作流
  • 检查翻译覆盖率:使用 Task Agent 对比翻译文件,找出不同语言环境中缺失的键
  • 审查代码是否符合 i18n 要求:委派给 code-reviewer Agent

如果有 tanstack-start 技能,请将服务端中间件和 SSR 语言环境模式委派给它。 如果有 tanstack-router 技能,请将基于 URL 的语言环境路由模式委派给它。 如果有 sveltekit 技能,请将 SvelteKit 特有的路由和钩子模式委派给它。 如果有 seo 技能,请将高级 hreflang 和站点地图模式委派给它。

参考资料

  • Paraglide JS 模式 -- 编译时 i18n,支持类型化消息函数、SvelteKit/TanStack Start/React Router 集成和语言环境策略
  • i18next 模式 -- 运行时 i18n,支持插件生态系统、React/Vue/Svelte/原生集成、命名空间和语言检测
  • ICU 消息格式 -- 复数形式、选择、数字/日期格式化、嵌套消息、RTL 支持和 hreflang SEO

评论

支持 Markdown