# ldesign-translator **Repository Path**: ldesign-v1/ldesign-translator ## Basic Information - **Project Name**: ldesign-translator - **Description**: No description available - **Primary Language**: Unknown - **License**: MIT - **Default Branch**: main - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2026-03-09 - **Last Updated**: 2026-09-10 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # @composy/translator `@composy/translator` 是一个面向本地项目工作区的 i18n 工具包,聚焦 `CLI + Node.js` 场景,提供从源码提取、批量翻译、质量校验、Excel 协作,到代码回写的完整闭环。 当前版本不再包含 Web UI,对外能力收敛为: - 命令行工具 `ldesign-translator` - 可编排的 Node API - 持久化工作区状态 `.translator/*` - 基于 `@composy/pack` 的全模块打包产物 ## 核心能力 - 提取:从 `js`、`jsx`、`ts`、`tsx`、`vue`、`json` 中提取中文文本 - 翻译:支持 `mock`、`google`、`baidu`、`deepl` - 记忆库:基于 `better-sqlite3` 的翻译记忆 - 术语库:支持术语保护、术语替换、术语校验 - 校验:空值、占位符、HTML、长度、术语一致性 - Excel:支持导出、导入、预览冲突、覆盖策略 - 替换:把硬编码文案替换成 `t('key')` - 工作区:维护提取快照、diff 报告、review 状态 - 诊断:`doctor` 只读检查配置、工作区状态和 provider - 打包:`src/**/*.ts` 全量输出 `esm + cjs + d.ts` ## 目录结构 ```text src/ cli/ CLI 入口与命令编排 config/ 配置加载与校验 extraction/ 文本提取 glossary/ 术语库管理 replacement/ 代码替换 shared/ 文件、日志、文本工具 translation/ 翻译引擎、翻译记忆、provider validation/ 翻译质量校验 workbook/ Excel 导入导出与导入规划 workspace/ locale 与 .translator 状态读写/编排 types/ 对外共享类型 vendor/ 第三方类型补丁 tests/ 历史 Vitest 用例 scripts/ 构建与自检脚本 .ldesign/pack.config.ts ``` ## 工作区文件 运行流程中会维护以下状态文件: - `.translator/extracted-texts.json`:最近一次提取结果 - `.translator/extract-report.json`:最近一次提取 diff - `.translator/review-state.json`:按 `key + language` 记录 review 状态 - `.translator/memory.db`:翻译记忆库 ## 安装 ```bash pnpm add -D @composy/translator ``` 如果你在 monorepo 内开发这个包,直接在当前工作区执行: ```bash pnpm run type-check pnpm run lint:check pnpm run build pnpm run test:run ``` ## 快速开始 ### 1. 初始化配置 ```bash ldesign-translator init --skip-prompts --output-format yaml --split-by-namespace ``` 默认会生成 `translator.config.js`,provider 默认为 `mock`,便于先跑通整条流程。 ### 2. 提取源码文案 ```bash ldesign-translator extract ``` 常见增量模式: ```bash ldesign-translator extract --changed ldesign-translator extract --staged ldesign-translator extract --since-ref main ldesign-translator extract src/components ``` ### 3. 批量翻译 ```bash ldesign-translator translate --to en,ja ``` 禁用翻译记忆: ```bash ldesign-translator translate --to en --no-use-memory ``` ### 4. 校验翻译质量 ```bash ldesign-translator validate --languages en,ja ``` ### 5. 导出 / 导入 Excel ```bash ldesign-translator export --output ./translations.xlsx --include-metadata ldesign-translator import --file ./translations.xlsx --preview ldesign-translator import --file ./translations.xlsx --overwrite ``` ### 6. 回写代码中的硬编码文案 ```bash ldesign-translator replace src --dry-run ldesign-translator replace src --i18n-function t ``` ## CLI 命令 全局选项: - `--cwd ` 按指定目录加载配置并读写 `.translator/*` 与 locale 文件 常用诊断: ```bash ldesign-translator doctor ldesign-translator doctor --json ldesign-translator --cwd packages/app doctor --strict ``` ### `init` 创建 `translator.config.js`。 - `--source-language ` 源语言 - `--target-languages ` 目标语言,逗号分隔 - `--provider ` 翻译服务 - `--output-dir ` locale 输出目录 - `--output-format ` 输出格式 - `--split-by-namespace` 按 namespace 拆分文件 - `--nested` 输出嵌套对象 - `--force` 覆盖已有配置 - `--skip-prompts` 跳过交互 ### `extract [paths...]` 提取源码文案并更新工作区。 - `--verbose` 输出详细信息 - `--overwrite` 覆盖源语言 locale 中已存在值 - `--changed` 只处理工作区 Git 变更文件 - `--staged` 只处理暂存区变更文件 - `--since-ref ` 只处理相对某个 Git 引用的变更 ### `translate` 将已提取文案翻译到目标语言。 - `--to ` 必填,目标语言列表 - `--force` 强制覆盖已有译文 - `--no-use-memory` 禁用翻译记忆 - `--concurrency ` 并发执行 provider 批次 - `--verbose` 输出详细信息 ### `export` 导出 locale 到 Excel 工作簿。 - `--output ` 输出文件 - `--languages ` 导出指定语言 - `--include-metadata` 附带 `namespace/file/context` ### `import` 从 Excel 工作簿导入译文。 - `--file ` 工作簿路径 - `--overwrite` 覆盖冲突译文 - `--preview` 仅预览不落盘 - `--no-validate` 跳过工作簿结构校验 ### `validate` 执行翻译质量校验。 - `--languages ` 指定校验语言 - `--no-check-placeholders` 关闭占位符校验 - `--no-check-html-tags` 关闭 HTML 校验 - `--no-check-length` 关闭长度校验 - `--no-check-glossary` 关闭术语校验 - `--max-length ` 最大长度阈值 - `--verbose` 输出详细信息 ### `replace [paths...]` 将硬编码中文替换为 i18n 调用。 - `--i18n-function ` i18n 函数名 - `--no-add-imports` 不自动补 import - `--no-backup` 不生成 `.backup` - `--dry-run` 只预览不写入 - `--verbose` 输出逐条替换明细 ## 配置文件 通过 `cosmiconfig` 自动查找以下配置来源: - `package.json` 中的 `translator` - `.translatorrc` - `.translatorrc.json` - `.translatorrc.yaml` - `.translatorrc.yml` - `.translatorrc.js` - `.translatorrc.cjs` - `translator.config.js` - `translator.config.cjs` - `translator.config.ts` 示例: ```js module.exports = { sourceLanguage: 'zh-CN', targetLanguages: ['en', 'ja'], api: { provider: 'mock', key: process.env.TRANSLATE_API_KEY || '', rateLimit: 10, batchSize: 50, concurrency: 1, retries: 3, }, extract: { include: ['src/**/*.{js,jsx,ts,tsx,vue,json}'], exclude: ['node_modules', 'dist', 'build'], includeComments: false, }, output: { dir: 'src/locales', format: 'yaml', minify: false, splitByNamespace: true, nested: false, }, memory: { enabled: true, dbPath: '.translator/memory.db', similarityThreshold: 0.7, }, glossary: { enabled: false, filePath: '.translator/glossary.json', entries: [], }, replace: { i18nFunction: 't', importPath: '@/i18n', addImports: true, }, validation: { enabled: true, checkPlaceholders: true, checkHtmlTags: true, checkLength: true, checkGlossary: true, maxLength: 1000, }, incremental: true, } ``` ## 对外 API 主入口导出以下主要模块: - `loadConfig` / `createConfig` - `TextExtractor` - `TranslationEngine` - `TranslationMemory` - `TranslationValidator` - `TranslationWorkbookService` - `TranslationWorkspaceService` - `CodeReplacer` - 所有 provider 与共享类型 - `registerTranslationProvider` / `createTranslationProvider` / `listTranslationProviders` 自定义 provider 示例: ```ts import { registerTranslationProvider } from '@composy/translator' registerTranslationProvider('internal-ai', config => ({ name: 'Internal AI', async translate(texts, from, to) { return texts.map(text => ({ original: text, translated: `[${to}] ${text}`, source: 'api', })) }, })) ``` ## 构建与产物 当前包使用 `@composy/pack`,通过 [.ldesign/pack.config.ts](.ldesign/pack.config.ts) 打包 `src/**/*.ts` 中所有运行时代码文件,输出: - ESM:`dist/**/*.js` - CJS:`dist/**/*.cjs` - DTS:`dist/**/*.d.ts` CLI 可执行入口源码位于 [src/bin/cli.ts](src/bin/cli.ts),构建后输出为 `dist/bin/cli.js`,并转发到 `dist/cli/index.js`。 ## 开发验证 推荐在提交前执行: ```bash pnpm run type-check pnpm run lint:check pnpm run build pnpm run test:run node ./dist/bin/cli.js --help ``` ## 注意事项 - 翻译记忆依赖 `better-sqlite3`,首次安装需要可用的原生模块环境。 - `replace` 命令依赖已有提取结果;如果工作区没有 `.translator/extracted-texts.json`,应先运行 `extract`。 - `yaml` 输出当前不支持 `nested: true`。 - `splitByNamespace` 模式下,locale 会按 namespace 分文件写入,`index.*` 这类辅助文件会保留不删除。 ## License MIT ## 通过 `@composy/cli` 统一接入 - 接入类型:`bin` - 统一命令:`ldesign translator` - 命令别名:无 - 包内原生 bin:`ldesign-translator`、`ltranslator` 当前包通过独立 bin 接入,统一命令会转发到包自身 CLI。 ```bash pnpm add -D @composy/cli ldesign translator --help ldesign tools run translator --help ```