Replexica SDK 演进全解:从 @replexica/sdk 到 Lingo.dev 的本地化引擎实现原理与迁移指南
【免费下载链接】replexicaOpen-source localization engineering tools. Connects to Lingo.dev localization engineering platform for consistent, quality translations.项目地址: https://gitcode.com/GitHub_Trending/re/replexica
本篇技术指南以 legacy/sdk/CHANGELOG.md 的版本演进为骨架,结合当前仓库中 packages/sdk/src/index.ts 的完整实现源码,系统梳理 Replexica 定位(Localization)SDK 从 0.1.0 到 0.7.17 的核心能力演进、底层调用链与配置参数细节,并给出从已弃用的@replexica/sdk迁移到lingo.dev的完整方案。读完本文,你将掌握该 SDK 的分批请求机制、重试与限流策略、HTML 本地化实现、语言识别与成本预估等核心原理,能够直接基于源码定位问题并完成迁移。
一、SDK 的定位:API 调用层的独立抽取
回顾 legacy/sdk/CHANGELOG.md 的起点,@replexica/sdk在 0.1.0(对应 PR #142)版本中完成了最关键的一次架构决策:将 API 调用逻辑从 CLI 中抽取为独立 SDK 包。这意味着:
- CLI 与后续所有工具共享同一套引擎调用层;
- API 请求、响应解析、参数校验等逻辑被收敛到单一模块,便于集中演进;
- SDK 成为 CLI 与 Lingo.dev 本地化平台之间的"协议边界"。
从当前仓库的 packages/sdk/src/index.ts 可以确认这一架构延续至今:核心类LingoDotDevEngine封装了全部 API 交互,而 CLI、CI 集成、Directus 等均通过它发起请求。
二、版本演进时间线与能力里程碑
原 CHANGELOG 记录了 0.1.0 → 0.7.17 的完整版本史,其中掺杂了大量@replexica/spec、lingo.dev的依赖更新。下表将其中的功能型变更提炼出来,形成能力里程碑:
| 版本 | 类型 | 核心变更 | 源码印证(当前仓库) |
|---|---|---|---|
| 0.1.0 | Minor | 将 API 调用抽取为独立 SDK 包 | LingoDotDevEngine类整体封装 |
| 0.2.0 | Minor | 为 CLI 增加多源本地化(multisource localization)支持 | reference参数字段 |
| 0.3.0 | Minor | 更新 locale code 解析逻辑 | normalizeLocale/normalizedLocaleCodeSchema |
| 0.4.0 | Minor | 增加 format-specific 方法(面向特定内容格式的本地化方法) | localizeHtml、localizeChat等 |
| 0.5.0 | Minor | 实现recognizeLocale(语言识别)与.localizeHtml | recognizeLocale()方法 |
| 0.6.0 | Minor | 引入 fast mode(快速模式);更新默认 batch size 上限 | fast参数、batchSize配置 |
| 0.7.0 | Minor | 新增batchLocalizeText(单文本多目标语言批量本地化) | batchLocalizeText()方法 |
| 0.7.1 | Patch | 降低默认 batch size 以避免触发限流;过滤不存在的 keys | batchSize默认 25(≤250) |
| 0.7.3 | Patch | 将 jsdom import 移入 HTML handler 函数内部(延迟加载) | localizeHtml()内的动态import("jsdom") |
| 0.7.10–0.7.9 等 | Patch | @replexica/spec系列依赖更新(0.9.0 → 0.24.0) | 版本对齐 |
| 0.7.11 | Patch | 为 legacy 包添加 proxies、deprecation message 与 deprecation warning | legacy/sdk/index.js的console.warn |
| 0.7.13 | Patch | 为社区贡献(demo apps 等)创建独立空间;新增 dependency overrides 修补安全漏洞 | pnpm-workspace.yamloverrides |
| 0.7.12、0.7.14–0.7.17 | Patch | 依赖更新至lingo.dev(0.70.4 → 0.138.5) | 包改名后的版本延续 |
三、引擎配置参数:来自源码的完整字段说明
当前实现(packages/sdk/src/index.ts)通过 zod schema 定义并校验引擎配置,参数及其默认值如下:
| 参数 | 类型 | 默认值 | 取值范围/说明 |
|---|---|---|---|
apiKey | string | 必填 | 请求头X-API-Key的来源 |
apiUrl | string(URL) | https://api.lingo.dev | 可指向自建/代理端点 |
batchSize | int | 25 | >0且≤250;每个请求最多携带的键数量 |
idealBatchItemSize | int | 250 | >0且≤2500;按"词数"切分 chunk 的参考阈值 |
engineId | string | 可选 | 随请求透传给服务端 |
maxRetries | int | 3 | 瞬时失败(5xx/网络错误)后的最大重试次数,0关闭重试 |
retryDelayMs | int | 500 | 指数退避基础延迟(毫秒) |
其中两个 batch 参数共同决定分块策略(见 extractPayloadChunks):SDK 逐键累积 payload,当当前 chunk 的累计词数超过idealBatchItemSize、或键数量达到batchSize、或已到 payload 末尾时,将当前 chunk 发出。这正是 0.7.1 中"降低默认 batch size 避免触发限流"的工程落地——将batchSize从更大值收敛到 25,以单请求更小的体积换取更低的 API 限流风险。
3.1 实例化与调用示例
import { LingoDotDevEngine } from "lingo.dev/sdk"; const engine = new LingoDotDevEngine({ apiKey: "YOUR_API_KEY", // 以下均为可选,展示默认值与边界 apiUrl: "https://api.lingo.dev", // 默认 batchSize: 25, // 1–250 idealBatchItemSize: 250, // 1–2500 maxRetries: 3, // 0 表示不重试 retryDelayMs: 500, // 基础退避延迟 }); const localized = await engine.localizeText("Hello, world", { sourceLocale: "en", targetLocale: "es", });四、本地化请求的核心链路:从分块到重试
4.1 请求结构与校验
localizationParamsSchema(源码)定义了每次本地化请求的参数:
sourceLocale:可为null(由服务端自动识别源语言)或合法 locale code;targetLocale:目标语言代码;fast:可选布尔值,开启快速模式(0.6.0 引入,更快但质量可能略低);reference:可选的参考翻译字典(多源本地化的数据载体,对应 0.2.0 能力);hints:可选提示词集合(Record<string, string[]>);filePath:可选元数据,随请求透传;triggerType:"cli"或"ci",用于区分触发来源。
值得注意的细节是 locale 规范化:源码对 locale code 采用宽松校验、严格传输策略(normalizedLocaleCodeSchema),允许 Android 风格pt-rPT、下划线风格pt_PT通过校验,但在发往 API 前统一转换为规范 BCP 47 形式;文件路径则保留原始写法(例如 Android 资源目录values-pt-rPT/不受影响)。这与 0.3.0"更新 locale code 解析逻辑"一脉相承。
4.2 请求体与端点
每个 chunk 通过POST {apiUrl}/process/localize发送(见 localizeChunk),请求体包含:
{ "params": { "fast": false }, "sourceLocale": "en", "targetLocale": "es", "data": { "key1": "text1" }, "reference": { "es": { "key1": "texto1" } }, "hints": {}, "sessionId": "cuid2 生成的会话标识", "triggerType": "cli", "metadata": { "filePath": "src/i18n/en.json" } }sessionId由@paralleldrive/cuid2生成,用于服务端串联同一次会话的多次请求。所有请求携带Content-Type: application/json; charset=utf-8与X-API-Key两个请求头。
4.3 重试与指数退避
0.7.17 时期的 CHANGELOG 未显式记录重试逻辑,但当前 fetchWithRetry 实现(对应新包 0.16.5 的变更)提供了可验证的细节:
- 仅对瞬时失败重试:HTTP 5xx 与网络层错误;4xx 直接返回交由上层处理;
- 指数退避 + full jitter:实际等待时间为
[0, retryDelayMs * 2 ** attempt]区间内的随机值,避免大量客户端在服务恢复瞬间同步冲击(见 backoffDelay); - AbortSignal 中止的请求永不重试:重试循环每次迭代前都会检查
signal?.aborted,中止后立即抛错。
4.4 进度回调与事件埋点
_localizeRaw在每处理完一个 chunk 后,会以Math.round((i + 1) / chunkedPayload.length * 100)计算 0–100 的进度并回调。同时,localizeObject、localizeText、localizeChat等方法在成功/失败路径都会通过trackEvent上报LOCALIZE_START/LOCALIZE_SUCCESS/LOCALIZE_ERROR事件(当前仓库新版本中这些事件还支持按 organization 分组聚合),便于可观测性分析。
五、面向特定格式的方法族(0.4.0 与 0.5.0 的核心产出)
5.1 方法总览
| 方法 | 输入 | 输出 | 实现要点 |
|---|---|---|---|
localizeObject | 任意嵌套对象 | 同结构对象 | 递归提取字符串值,走通用分块管线 |
localizeText | 单条字符串 | 字符串 | 包装为{ text }键调用_localizeRaw |
batchLocalizeText | 文本 +targetLocales[] | 字符串数组 | 对每个目标语言并行Promise.all调用localizeText(0.7.0 引入) |
localizeStringArray | 字符串数组 | 有序字符串数组 | 映射为item_0/item_1/...键,按序还原 |
localizeChat | {name, text}[] | 同名结构数组 | 映射为chat_i键,保留发言人姓名(0.4.0 format-specific 代表) |
localizeHtml | HTML 字符串 | 本地化后的 HTML 字符串 | jsdom 解析 + 路径寻址回写(见下节) |
batchLocalizeText是 0.7.0 的里程碑能力:只需一段源文本和一组目标语言,即可一次性获得多语言结果,适合"单文案多语言发布"的场景。
5.2 HTML 本地化的实现细节
localizeHtml(源码)是 format-specific 方法的代表作,其处理流程清晰可验证:
- DOM 解析:使用
jsdom的JSDOM将 HTML 字符串解析为 DOM。这里印证了 0.7.3 的优化——jsdom通过动态import("jsdom")在 handler 函数内部按需加载,避免在仅使用文本/对象本地化时付出引入大型依赖的代价; - 可提取内容白名单:
- 文本节点:所有非空文本;
- 可本地化属性:
<meta content>、<img alt>、<input placeholder>、<a title>; - 排除标签:
<script>、<style>(及其子树);
- 路径寻址:每个提取项以类似
body/2/0或img/0/1#alt的索引路径作为键(根节点 + 兄弟节点索引 + 可选#属性名),本地化完成后按路径回写 DOM; - 语言属性更新:回写完成后将
<html lang>设置为targetLocale; - 序列化输出:最终通过
dom.serialize()输出完整 HTML。
该设计保证了 HTML 的结构、样式与脚本不被破坏,仅替换文本内容与可本地化属性。
六、语言识别与成本预估
6.1 recognizeLocale:识别文本语言
0.5.0 引入的recognizeLocale(源码)向POST {apiUrl}/process/recognize发送{ text },返回服务端识别的 locale code(如en、es)。其典型用途是:当sourceLocale未知时,先识别源语言,再执行翻译;或用于多语言混合内容的预处理。
6.2 estimate:翻译前成本预估
当前 SDK(对应新包 0.17.0)新增了estimate方法(源码):向POST {apiUrl}/process/estimate提交每个目标语言的源字符数,返回近似成本(CostEstimate类型)。服务端按chars → tokens启发式估算,字段包括:
{ approximate: true, totals: { sourceChars: number, estimatedOutputTokens: number, estimatedLlmCostUsd: number, estimatedLocalizationCostUsd: number, estimatedTotalCostUsd: number }, byLocale: [{ targetLocale, sourceChars, estimatedOutputTokens, estimatedCostUsd }] }注意:该结果是纯服务端计算,不产生翻译、不存储、不计费,适合在正式执行前评估成本。CLI 侧对应的run --estimate命令即复用此能力。
七、弃用与迁移:从 @replexica/sdk 到 lingo.dev
7.1 弃用链路(0.7.11 之后)
CHANGELOG 0.7.11 记录了"为 legacy packages 添加 proxies、deprecation message 与 deprecation warning"。当前 legacy/sdk 目录完整保留了这套弃用机制:
- legacy/sdk/package.json 中声明
"deprecated": "Replexica is now Lingo.dev! ...",描述为[DEPRECATED]; - legacy/sdk/index.js 在模块加载时通过
console.warn打印黄色警告,随后export * from "lingo.dev/sdk"完成透明转发; - legacy/sdk/index.d.ts 同样
export * from "lingo.dev/sdk",保证类型可用。
也就是说,即使仍安装@replexica/sdk,实际执行的也是lingo.dev的实现——旧包只是"代理壳"。版本号 0.7.17 之后不再独立演进,依赖随lingo.dev(0.70.4 → 0.138.5)同步更新。
7.2 类名层面的兼容与弃用
在当前 packages/sdk/src/index.ts 中,ReplexicaEngine与LingoEngine被标记为@deprecated,二者均继承自LingoDotDevEngine,仅在构造时打印一次性弃用警告。新代码应直接使用LingoDotDevEngine。
7.3 迁移步骤
- 移除旧依赖:
npm uninstall @replexica/sdk; - 安装新包:
npm install lingo.dev(安装方式见 packages/sdk/README.md); - 替换导入语句:
import { ... } from "@replexica/sdk"→import { ... } from "lingo.dev/sdk"; - 替换类名:
ReplexicaEngine/LingoEngine→LingoDotDevEngine; - 验证配置项:
apiKey、apiUrl、batchSize、idealBatchItemSize等字段语义不变,可直接沿用。
八、依赖安全与漏洞修复(0.7.13)
CHANGELOG 0.7.13 记录了通过 dependency overrides 修复的漏洞清单,涉及picomatch、qs、@unhead/vue、postcss、ajv、launch-editor、js-yaml(3.x 与 4.x 两条)、joi等传递依赖。这一实践在当前仓库的 pnpm-workspace.yaml overrides 中仍可见其延续(如js-yaml@>=4 <4.3.1: 4.3.1、postcss@>=8 <8.5.23: 8.5.23),是 monorepo 场景下通过单一文件集中收敛依赖版本、规避npm audit报漏洞的标准做法。
九、总结
从@replexica/sdk的 0.1.0(API 抽取)到 0.7.17(全量代理转发至lingo.dev),这条演进线清晰地展示了:能力分层(SDK 独立)→ 能力扩展(格式方法、快速模式、批量、语言识别)→ 工程加固(分块限流、延迟加载、漏洞修复)→ 品牌与包名收敛(迁移与弃用)。当前仓库 packages/sdk/src/index.ts 是这一演进的最终形态,也是理解lingo.dev本地化引擎调用协议的最佳源码参考——包括配置校验、locale 规范化、分块策略、指数退避重试、HTML 路径回写与成本预估等全部关键机制。
对于需要深入定制的开发者,建议按以下路径继续阅读源码:配置 Schema 与校验 → 分块与重试 → 各本地化方法 → HTML 本地化 → 识别与预估,并结合 packages/sdk/CHANGELOG.md 了解新版本的能力增量。
【免费下载链接】replexicaOpen-source localization engineering tools. Connects to Lingo.dev localization engineering platform for consistent, quality translations.项目地址: https://gitcode.com/GitHub_Trending/re/replexica
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考