{"id":45375587,"url":"https://github.com/wuqiang1985/i18n-helper","last_synced_at":"2026-02-21T16:19:44.409Z","repository":{"id":40283829,"uuid":"274553252","full_name":"wuqiang1985/i18n-helper","owner":"wuqiang1985","description":"国际化自动包裹 \u0026 提取 \u0026 翻译词条工具","archived":false,"fork":false,"pushed_at":"2023-03-06T08:26:52.000Z","size":1430,"stargazers_count":69,"open_issues_count":12,"forks_count":17,"subscribers_count":1,"default_branch":"master","last_synced_at":"2025-11-24T06:11:51.971Z","etag":null,"topics":["extractor","i18n","translation","wrapper"],"latest_commit_sha":null,"homepage":"","language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/wuqiang1985.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2020-06-24T02:12:44.000Z","updated_at":"2025-10-19T02:26:36.000Z","dependencies_parsed_at":"2024-06-21T03:55:58.539Z","dependency_job_id":"e7c2be53-c3ac-4ea8-bfaf-f3e6af41b328","html_url":"https://github.com/wuqiang1985/i18n-helper","commit_stats":{"total_commits":66,"total_committers":2,"mean_commits":33.0,"dds":0.0757575757575758,"last_synced_commit":"72b7ff5a0f6bf97a85a92a6469355a26cdf02324"},"previous_names":[],"tags_count":7,"template":false,"template_full_name":null,"purl":"pkg:github/wuqiang1985/i18n-helper","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/wuqiang1985%2Fi18n-helper","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/wuqiang1985%2Fi18n-helper/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/wuqiang1985%2Fi18n-helper/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/wuqiang1985%2Fi18n-helper/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/wuqiang1985","download_url":"https://codeload.github.com/wuqiang1985/i18n-helper/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/wuqiang1985%2Fi18n-helper/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":29685815,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-02-21T15:51:39.154Z","status":"ssl_error","status_checked_at":"2026-02-21T15:49:03.425Z","response_time":107,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.5:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["extractor","i18n","translation","wrapper"],"created_at":"2026-02-21T16:19:41.373Z","updated_at":"2026-02-21T16:19:44.402Z","avatar_url":"https://github.com/wuqiang1985.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# i18n-helper-cli\n\n![NPM](https://img.shields.io/github/license/wuqiang1985/i18n-helper) ![npm](https://img.shields.io/npm/v/i18n-helper-cli) ![node-current](https://img.shields.io/node/v/i18n-helper-cli) [![PRs Welcome](https://img.shields.io/badge/PRs-welcome-brightgreen.svg?style=flat-square)](http://makeapullrequest.com)\n\n使用其他语言阅读：[English](./README_en.md) | 简体中文\n\n- [i18n-helper-cli](#i18n-helper-cli)\n  - [i18n-helper-cli 是什么](#i18n-helper-cli-是什么)\n  - [为什么要用 i18n-helper-cli](#为什么要用-i18n-helper-cli)\n    - [Web 国际化流程](#web-国际化流程)\n    - [问题](#问题)\n    - [解决方案 \u0026 原理](#解决方案--原理)\n  - [如何使用 i18n-helper-cli](#如何使用-i18n-helper-cli)\n    - [实例](#实例)\n    - [安装](#安装)\n    - [快捷使用](#快捷使用)\n    - [命令详情](#命令详情)\n    - [配置详情](#配置详情)\n  - [未来规划](#未来规划)\n  - [其他](#其他)\n\n## i18n-helper-cli 是什么\n\ni18n-helper-cli 是一个 Web 国际化整体解决方案，包含自动`包裹词条`，`提取词条`， `翻译词条`，`词条翻译统计`，`节省人力预估统计`，`网页多语言显示异常检测`（Coming soon）等功能。可以大大减低开发，测试，翻译各个角色的人力成本，减少重复劳动，低级错误。\n![i18n-helper-cli](https://user-images.githubusercontent.com/1751494/129152542-77d9ed28-5abd-4f98-8302-2c657d20019d.gif)\n\n## 为什么要用 i18n-helper-cli\n\n### Web 国际化流程\n\n随着出海的业务越来越多，web 应用面临越来越多的国际化的工作。简单来说可以分为以下 5 个步骤\n\n1. 【选型】多语言框架选型（这里不深究，不在此篇范围），我们选定 [i18next](https://react.i18next.com/)，18n-helper-cli 对多语言框架并不限制\n2. 【开发 - 包裹词条】从上面这步骤，我们知道需要把词条包裹起来，比如 `t('你好')`\n3. 【开发 - 提取词条】把上一步中包裹的词条 copy 到翻译文件中\n4. 【翻译 - 翻译】翻译把词条翻译好，填入翻译文件\n5. 【测试 - 测试页面】开发提交测试后，对多语言页面进行测试\n\n### 问题\n\n通过上面 5 步，可以完成站点国际化。大多数场景大家就是这么做的，但这里充斥着大量人工劳动，大量人工劳动意味着`重复低效`，`出错几率提高`。让我们从以下三个阶段分析下这些问题\n\n- 【开发阶段】\n\n  1. 人工操作包裹和提取词条耗时长，但对个人无任何成长。如果是【全新开发】的站点，大家还可以耐着性子`包裹词条`，`提取词条`，但如果是【存量修改】及对已有的站点做国际化，而且这里的页面几十上百，甚至更多，这里的`包裹词条`，`提取词条`的工作量会让人崩溃\n\n  2. 遗漏包裹，提取词条\n  3. 提取词条后，运行多语言界面无法看到效果，需要等到翻译返回\n\n- 【翻译阶段】\n\n  1. 翻译耗时长\n  2. 遗漏翻译\n\n- 【测试阶段】\n\n  1. 多语言页面测试每个都要测，耗费大量时间\n  2. 遗漏测试某个多语言页面\n\n所以这里最大的问题是上面这些工作都需`人工`操作，问题清楚了，那接下来我们要做的就是把这些人工操作能够交给机器，实现自动化，`提高效率`，`降低出错几率`。\n\n### 解决方案 \u0026 原理\n\ni18n-helper-cli 可以很好的解决上述问题。\n\n- 【词条包裹】通过对代码进行编译，得到`AST`，找到符合条件（中文，或者其他语言，可配置）的 Node，根据配置创建新 Node，替换老的 Node\n- 【词条提取】同上，也是`AST`, 找到的符合条件的词条以及原代码已经包裹的词条会被一起提取，根据配置写入文件\n- 【词条翻译】\n  1. 从源文件翻译：如果有一份翻译词库（这里有常见的翻译），我们提取出来的未翻译词条在这里有，我们就可以直接从这里翻译\n  2. 机器翻译：未翻译词条调用云服务实现翻译（这里我们用的是腾讯云的翻译服务）\n- 【网页多语言显示异常检测】提供一份页面 url 列表，用 Cypress 进行截图，调用腾讯云 OCR 服务提取图片文字，进行对比，假设我们有个叫`你好`的词条翻译成 en 为`Hello`，如果我们通过 OCR 得到的是`Hel`，那么我们可以认为这个页面有问题（Coming soon）\n- 【统计】\n  1. 翻译词条统计：根据当前语言下未翻译词条数 / 词条总数\n  2. 减低人工耗时预估：根据包裹，提取，翻译词条数预估\n\n## 如何使用 i18n-helper-cli\n\n### 实例\n\n[请参考 example](./examples/)\n\n### 安装\n\n**请确保 Nodejs 版本大于 14**\n\n```shell\n# npm 安装\nnpm install i18n-helper-cli -D\n# yarn 安装\nyarn add i18n-helper-cli —dev\n```\n\n### 快捷使用\n\n1. 在项目根目录下生成 i18n.config.json 文件\n\n```shell\n# 交互式命令行\ni18n-helper init\n# 生成默认配置文件，具体参见【配置说明】\ni18n-helper init -y\n```\n\n2. 包裹 \u0026 提取 \u0026 翻译 \u0026 统计\n\n```shell\n# 包裹 \u0026 提取 \u0026 翻译 \u0026 统计 i18n.config.json 中 srcPath 文件中的中文词条\ni18n-helper scan -wetc\n```\n\n3. 切换 Cli 语言\n\n```shell\n# cli 默认为中文，支持语言切换，目前支持zh \u0026 en\ni18n-helper switch en\n```\n\n### 命令详情\n\n```shell\n# 包裹 \u0026 提取 \u0026 翻译 \u0026 统计 i18n.config.json 中 srcPath 文件中的中文词条\n# w:wrap e:extract t:translate tm: translate machine c:count\n# l:language\n# 这 5 个操作可以随意组合 e.g. i18n-helper scan -we 则只会翻译 \u0026 提取\ni18n-helper scan -wetc\ni18n-helper scan -we -tm -c\n# 包裹 \u0026 提取 \u0026 翻译 \u0026 统计 指定路径，指定语言内符合规则的词条\n# e.g i18n-helper scan -wetc -l en ./src/test/index.js\ni18n-helper scan -wetc -l [language] [filepath]\ni18n-helper scan -we -tm -c -l [language] [filepath]\n\n# 包裹 i18n.config.json 中 srcPath 文件中的中文词条\ni18n-helper wrap\ni18n-helper scan -w\n# 包裹指定文件中的中文词条\ni18n-helper wrap [filepath]\ni18n-helper scan -w [filepath]\n\n# 提取 i18n.config.json 中 srcPath 文件中的中文词条到所有配置语言文件\ni18n-helper extract\ni18n-helper scan -e\n# 提取指定文件中文词条到指定语言文件\n# e.g i18n-helper extract -l en ./src/test/index.js\ni18n-helper extract -l [language] [filepath]\ni18n-helper scan -e -l [language] [filepath]\n\n# 翻译 i18n.config.json 中配置翻译文件词条， -m 腾讯翻译君机器翻译\n# 从翻译源文件文件中翻译\ni18n-helper translate\ni18n-helper scan -t\n# 腾讯翻译君自动翻译\ni18n-helper translate -m\ni18n-helper scan -tm\n# 翻译指定语言\n# 从翻译源文件文件中翻译\ni18n-helper translate [language]\ni18n-helper scan -t -l [language]\n# 腾讯翻译君自动翻译指定语言文件\ni18n-helper translate -m [language]\ni18n-helper scan -tm -l [language]\n\n# 统计 i18n.config.json 中翻译文件的翻译情况\ni18n-helper count\ni18n-helper scan -c\n# 统计指定语言翻译文件的翻译情况，多个语言用,分隔\ni18n-helper count [language]\ni18n-helper scan -c -l [language]\n```\n\n### 配置详情\n\n```javascript\nmodule.exports = {\n  // cli 语言\n  cliLang: 'zh',\n  // 项目类型：react | vue | js\n  projectType: '[react]',\n  // 默认包裹和提取词条的目录\n  srcPath: './',\n  // 扫描文件格式\n  fileExt: 'js,jsx,ts,tsx',\n  // git模式，设置为 true， 则只扫描修改和新增文件\n  gitModel: false,\n  // 包裹的字符集，下面是中文\n  wrapCharacter: '[\\u4e00-\\u9fa5]',\n  // 包裹词条的名字\n  wrapperFuncName: 't',\n  // 忽略掉包裹的方法，多个用,分隔，模糊匹配，支持正则,不区分大小写 e.g ^console\n  excludeWrapperFuncName: 'console,split,indexOf',\n  // jsx中的文字包裹方式，true用\u003ctrans\u003e\u003c/trans\u003e， false用【wrapperFuncName】的value包裹\n  jsx2Trans: false,\n  // 当文件需要翻译时引入的文件\n  importStr: `import { Trans, useTranslation, Translation, withTranslation } from 'react-i18next';\\n`,\n  // 排除目录，此目录下的不会不会执行包裹和提取词条操作\n  exclude: 'node_modules,dist,.git',\n  // 格式化方式，支持Prettier和ESlint，请确保项目根目录下有对应的配置文件，具体参考Prettier和ESlint官网\n  format: 'Prettier',\n  // 翻译词条目录\n  localeDir: './locales',\n  // 翻译语种\n  languages: 'zh,en',\n  // 源语言\n  sourceLanguage: 'zh',\n  // 翻译词条文件名\n  transFileName: 'translation',\n  // 翻译词条文件格式: json, po\n  transFileExt: 'json',\n  // 翻译词库目录（自动翻译目录）\n  targetTransDir: './src/translations',\n  // 翻译词库文件名\n  targetTransFile: 'transLib.json',\n  // 腾讯云 secretId\n  secretId: '',\n  // 腾讯云 secretKey\n  secretKey: '',\n};\n```\n\n## 未来规划\n\n- [ ] 网页多语言显示异常检测\n- [ ] 丰富提取文件(po, csv, excel 等等)\n- [ ] 词条提取 cleanMode，目前如果代码中没有这个词条了，提取后的文件依然会有\n\n## 其他\n\n目前还在完善中，欢迎大家试用，大家有问题可以提 issue。\n\n如果您觉得这个工具能帮到解决日常工作的问题，确实提升了效率，请扫下面的二维码，谢谢。\n\n\u003cimg src=\"https://user-images.githubusercontent.com/1751494/129164802-0f1c4580-2515-4497-8d60-32738061101a.jpeg\" align=\"left\" height=\"250\" width=\"250\" /\u003e\n\u003cimg src=\"https://user-images.githubusercontent.com/1751494/129164856-8793b9d1-5bc4-4e6e-be8d-c16b20c216c3.jpeg\" height=\"250\" width=\"200\" /\u003e\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fwuqiang1985%2Fi18n-helper","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fwuqiang1985%2Fi18n-helper","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fwuqiang1985%2Fi18n-helper/lists"}