{"_id":"@bakarhythm/i18n-extract-cli","name":"@bakarhythm/i18n-extract-cli","dist-tags":{"latest":"2.0.0"},"versions":{"2.0.0":{"name":"@bakarhythm/i18n-extract-cli","version":"2.0.0","description":"这是一款能够自动将代码里的中文转成i18n国际化标记的命令行工具。当然，你也可以用它实现将中文语言包自动翻译成其他语言。适用于vue2、vue3和react","publishConfig":{"access":"public"},"bin":{"it":"bin/index.js","i18n-extract":"bin/index.js"},"types":"types/index.d.ts","keywords":["i18n","intl","extract","intl-cli","i18n-cli","vue-i18n","react-i18n","i18n-translate","auto-translate","translate"],"engines":{"node":">=14.21.2"},"author":{"name":"IFreeOvO"},"license":"MIT","dependencies":{"@babel/core":"^7.20.2","@babel/generator":"^7.20.0","@babel/plugin-syntax-decorators":"^7.19.0","@babel/preset-env":"^7.25.4","@babel/preset-react":"^7.24.7","@babel/preset-typescript":"^7.24.7","@babel/template":"^7.18.10","@babel/traverse":"^7.20.0","@babel/types":"^7.20.0","@vue/compiler-sfc":"^3.2.39","chalk":"4.1.2","cli-progress":"^3.11.2","commander":"^9.4.1","ejs":"^3.1.8","fs-extra":"^10.1.0","glob":"^8.0.3","htmlparser2":"^8.0.1","inquirer":"8.2.5","leven":"3.1.0","lodash":"^4.17.21","minimist":"^1.2.8","mustache":"^4.2.0","node-xlsx":"^0.21.0","prettier":"^2.7.1","semver":"^7.3.8","serialize-javascript":"^6.0.0","slash":"3.0.0","@bakarhythm/translate-utils":"2.0.0"},"devDependencies":{"@types/babel__core":"^7.1.20","@types/babel__generator":"^7.6.4","@types/babel__template":"^7.4.1","@types/babel__traverse":"^7.18.2","@types/cli-progress":"^3.11.0","@types/ejs":"^3.1.1","@types/fs-extra":"^9.0.13","@types/glob":"^8.0.0","@types/inquirer":"^9.0.3","@types/lodash":"^4.14.188","@types/minimist":"^1.2.2","@types/mustache":"^4.2.5","@types/prettier":"^2.7.1","@types/serialize-javascript":"^5.0.2","rimraf":"^3.0.2"},"repository":{"type":"git","url":"git+https://github.com/IFreeOvO/i18n-cli.git","directory":"packages/i18n-extract-cli"},"bugs":{"url":"https://github.com/IFreeOvO/i18n-cli/issues"},"homepage":"https://github.com/IFreeOvO/i18n-cli/tree/master/packages/i18n-extract-cli","scripts":{"dev":"unbuild --stub","build":"unbuild","check":"tsc --noEmit","test":"vitest","test:ui":"vitest --ui","test:run":"vitest run","coverage":"vitest run --coverage"},"_id":"@bakarhythm/i18n-extract-cli@2.0.0","_integrity":"sha512-UGadeJt2Da49RsfTf6L33ySgwWhJD6E+/gmbMk/Q4OeHI6imbvAp11PDQPOisbah+jRgso2zNjUyOEKghRG4Gw==","_resolved":"/private/var/folders/8n/dxh6zyq52wz8h_znkndgr1fw0000gn/T/66e5c92b598df2f3f137202b1a357c98/bakarhythm-i18n-extract-cli-2.0.0.tgz","_from":"file:bakarhythm-i18n-extract-cli-2.0.0.tgz","_nodeVersion":"25.6.1","_npmVersion":"11.9.0","dist":{"integrity":"sha512-UGadeJt2Da49RsfTf6L33ySgwWhJD6E+/gmbMk/Q4OeHI6imbvAp11PDQPOisbah+jRgso2zNjUyOEKghRG4Gw==","shasum":"9e528229a940c1b56acea097da2d9b52ab43f5ca","tarball":"https://registry.npmjs.org/@bakarhythm/i18n-extract-cli/-/i18n-extract-cli-2.0.0.tgz","fileCount":11,"unpackedSize":238218,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIQCJthnjvbGFWR1yiVxr/UtVf2biuN3yA/xDDJt4SQhENQIgeqgEArt3IwvDE2CyzThdNfOy45ilj2N32eVHoUZbDE4="}]},"_npmUser":{"name":"shakugannoshana","email":"cqyxy2510129@gmail.com"},"directories":{},"maintainers":[{"name":"shakugannoshana","email":"cqyxy2510129@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/i18n-extract-cli_2.0.0_1772212606221_0.6045557955195571"},"_hasShrinkwrap":false}},"time":{"created":"2026-02-27T17:16:46.123Z","2.0.0":"2026-02-27T17:16:46.402Z","modified":"2026-02-27T17:16:46.712Z"},"maintainers":[{"name":"shakugannoshana","email":"cqyxy2510129@gmail.com"}],"description":"这是一款能够自动将代码里的中文转成i18n国际化标记的命令行工具。当然，你也可以用它实现将中文语言包自动翻译成其他语言。适用于vue2、vue3和react","homepage":"https://github.com/IFreeOvO/i18n-cli/tree/master/packages/i18n-extract-cli","keywords":["i18n","intl","extract","intl-cli","i18n-cli","vue-i18n","react-i18n","i18n-translate","auto-translate","translate"],"repository":{"type":"git","url":"git+https://github.com/IFreeOvO/i18n-cli.git","directory":"packages/i18n-extract-cli"},"author":{"name":"IFreeOvO"},"bugs":{"url":"https://github.com/IFreeOvO/i18n-cli/issues"},"license":"MIT","readme":"# 介绍\n\n这是一款能够自动将代码里的中文转成 i18n 国际化标记的命令行工具。当然，你也可以用它实现将中文语言包自动翻译成其他语言。适用于 vue2、vue3 和 react\n\n## 流程设计\n\n见[掘金文章](https://juejin.cn/post/7174082242426175525)\n\n## 功能 🎉\n\n- 支持.mjs.cjs.js.ts.jsx.tsx.vue 后缀文件提取中文\n- 支持 vue2.0，vue3.0，react 提取中文\n- 支持通过/\\*i18n-ignore\\*/注释，忽略中文提取\n- 支持将提取的中文以 key-value 形式存入\\*.json 语言包里\n- 支持 prettier 格式化代码\n- 支持将中文语言包自动翻译成其他语言\n- 支持将翻译结果导出成 excel\n- 支持读取 excel 文件并转换成语言包\n- 自定义语言包 key 的层级嵌套\n- 自定义语言包的 key\n- 自定义 i18n 工具的调用对象\n- 自定义 i18n 工具的方法名\n- 自定义 i18n 第三方包的导入\n- 自定义忽略提取的方法\n\n## 安装\n\n```\nnpm i @bakarhythm/i18n-extract-cli -g\n```\n\n## 使用\n\n在项目根目录执行下面命令\n\n```\nit\n```\n\n## 指令参数\n\n| 参数              | 类型    | 默认值                 | 描述                                                                                   |\n| ----------------- | ------- | ---------------------- | -------------------------------------------------------------------------------------- |\n| -i, --input       | String  | 'src'                  | 指定待提取的文件目录。                                                                 |\n| -o, --output      | String  | ''                     | 输出转换后文件路径。没有值时表示完成提取后自动覆盖原始文件。当有值时，会输出到指定目录 |\n| -c, --config-file | String  | ''                     | 指定命令行配置文件的所在路径（可以自定义更多功能）                                     |\n| --localePath      | String  | './locales/zh-CN.json' | 指定提取的中文语言包所存放的路径。                                                     |\n| -v,--verbose      | Boolean | false                  | 控制台打印更多调试信息                                                                 |\n| -h,--help         | Boolean | false                  | 查看指令用法                                                                           |\n| --skip-extract    | Boolean | false                  | 跳过 i18n 转换阶段。                                                                   |\n| --skip-translate  | Boolean | false                  | 跳过中文翻译阶段。                                                                     |\n| --locales         | Array   | ['en-US']              | 根据中文语言包自动翻译成其他语言。用法例子 --locales en zh-CHT                         |\n| --exportExcel     | Boolean | false                  | 开启后。导出所有翻译内容到 excel。 默认导出到当前目录下的 locales.xlsx                 |\n| --excelPath       | String  | './locales.xlsx'       | 指定导出的 excel 路径。                                                                |\n\n## 子命令\n\n| 子命令    | 描述                                      |\n| --------- | ----------------------------------------- |\n| init      | 在项目里初始化一个命令行配置              |\n| loadExcel | 根据导入翻译文件的 excel 内容，生成语言包 |\n\n## 命令行配置\n\n如果有更多的定制需求，可以在项目根目录执行`it init`，创建`i18n.config.js`文件，按自身需求修改完配置后，再执行`it -c i18n.config.js`。（注意：配置文件里参数的优先级比指令参数高）\n\n```js\n// 以下为i18n.config.js默认的完整配置，所有属性均为可选，可以根据自身需要修改\nmodule.exports = {\n  input: 'src', // 需要转换的文件目录或文件。形式可以是数组，例如['./a.js', 'src']，也可以是字符串，例如'a.js'\n  output: '', // 没有值时表示完成提取后自动覆盖原始文件\n  exclude: ['**/node_modules/**/*'], // 排除不需要提取的文件\n  localePath: './locales/zh-CN.json', // 中文语言包的存放位置\n  localeFileType: 'json', // 设置语言包的文件类型，支持js、json。默认为json\n  // rules每个属性对应的是不同后缀文件的处理方式\n  rules: {\n    js: {\n      caller: '', // 自定义this.$t('xxx')中的this。不填则默认没有调用对象\n      functionName: 't', // 自定义this.$t('xxx')中的$t\n      customizeKey: function (key, currentFilePath) {\n        return key\n      }, // 自定义this.$t('xxx')中的'xxx'部分的生成规则\n      customSlot: function (slotValue) {\n        return slotValue\n      }, // 自定义模版字段串里插槽部分，例如原文为`你好 ${name}`，转换后是t('你好 {name}')，其中转换后的{name}部分，可以通过这个函数定制\n      importDeclaration: 'import { t } from \"i18n\"', // 默认在文件里导入i18n包。不填则默认不导入i18n的包。由于i18n的npm包有很多，用户可根据项目自行修改导入语法\n      forceImport: false, // 即使文件没出现中文，也强行插入importDeclaration定义的语句\n    },\n    // ts,cjs,mjs,jsx,tsx配置方式同上\n    ts: {\n      caller: '',\n      functionName: 't',\n      customizeKey: function (key, currentFilePath) {\n        return key\n      },\n      customSlot: function (slotValue) {\n        return slotValue\n      },\n      forceImport: false,\n    },\n    cjs: {\n      caller: '',\n      functionName: 't',\n      customizeKey: function (key, currentFilePath) {\n        return key\n      },\n      customSlot: function (slotValue) {\n        return slotValue\n      },\n      importDeclaration: 'import { t } from \"i18n\"',\n      forceImport: false,\n    },\n    mjs: {\n      caller: '',\n      functionName: 't',\n      customizeKey: function (key, currentFilePath) {\n        return key\n      },\n      customSlot: function (slotValue) {\n        return slotValue\n      },\n      importDeclaration: 'import { t } from \"i18n\"',\n      forceImport: false,\n    },\n    jsx: {\n      caller: '',\n      functionName: 't',\n      customizeKey: function (key, currentFilePath) {\n        return key\n      },\n      customSlot: function (slotValue) {\n        return slotValue\n      },\n      importDeclaration: 'import { t } from \"i18n\"',\n      functionSnippets: '', // react函数组件里，全局加代码片段\n      forceImport: false,\n    },\n    tsx: {\n      caller: '',\n      functionName: 't',\n      customizeKey: function (key, currentFilePath) {\n        return key\n      },\n      customSlot: function (slotValue) {\n        return slotValue\n      },\n      importDeclaration: 'import { t } from \"i18n\"',\n      functionSnippets: '',\n      forceImport: false,\n    },\n    vue: {\n      caller: 'this',\n      functionNameInTemplate: '$t', // vue这里的配置，仅针对vue的template标签里面的内容生效\n      functionNameInScript: '$t', // vue这里的配置，仅针对vue的script部分export default里面的内容生效\n      customizeKey: function (key, currentFilePath) {\n        return key\n      },\n      customSlot: function (slotValue) {\n        return slotValue\n      },\n      importDeclaration: '',\n      forceImport: false,\n      tagOrder: ['template', 'script', 'style'], // 支持自定义vue文件的标签顺序\n    },\n  },\n  globalRule: {\n    ignoreMethods: [], // 忽略指定函数调用的中文提取。例如想忽略sensor.track('中文')的提取。这里就写['sensor.track']\n  },\n  // prettier配置，参考https://prettier.io/docs/en/options.html\n  prettier: {\n    semi: false,\n    singleQuote: true,\n  },\n  incremental: true, // 开启后。支持将文件中新提取到中文键值对，追加到原有的中文语言包\n  skipExtract: false, // 跳过提取中文阶段\n  // 以下是和翻译相关的配置，注意搭配使用\n  skipTranslate: true, // 跳过翻译语言包阶段。默认不翻译\n  translationTextMaxLength: 5000, // 每次请求翻译接口，接口携带参数里翻译原文的最大长度\n  locales: [], // 需要翻译的语言包。例如['en', 'zh-CHT']，会自动翻译英文和繁体\n  excelPath: './locales.xlsx', // excel存放路径\n  exportExcel: false, // 是否导出excel\n  // 参数：\n  // allKeyValue：已遍历的所有文件的key-value\n  // currentFileKeyMap: 当前文件提取到的key-value\n  // currentFilePath: 当前遍历的文件路径\n  adjustKeyMap(allKeyValue, currentFileKeyMap, currentFilePath) {\n    return allKeyValue\n  }, // 对提取结构进行二次处理\n}\n```\n\n具体用法可以点击下方链接参考\n\n- [react 项目实战例子](https://github.com/IFreeOvO/i18n-cli/tree/master/examples/react-demo)\n\n- [vue 项目实战例子](https://github.com/IFreeOvO/i18n-cli/tree/master/examples/vue-demo)\n\n## 举几个栗子 🌰\n\n1. 跳过转换阶段，仅将中文语言包翻译成其他语言(例如英语、中文繁体等)\n\n```bash\nit --skip-extract --locales en zh-CHT\n```\n\n2. 跳过自动翻译阶段，仅进行 i18n 转换，并将提取到的 key-value 提取到中文语言包\n\n```bash\nit --skip-translate\n```\n\n3. 使用自定义配置进行 i18n 转换\n\n```bash\nit -c ./i18n.config.js\n```\n\n4. 指定需要自动翻译的语言(例如日语)，并指定项目里中文语言包的位置(相对于命令的执行位置)。命令执行时会自动根据中文语言包，将日语翻译出来并存入到`ja.json`文件中\n\n```bash\nit --localePath ./locales/zh-CN.json  --locales ja\n```\n\n5. 导入翻译的 excel 表格，并自动生成对应语言包的 json 文件\n\nexcel 的表头格式举例`['字典key', 'zh-CN', 'en-US']`\n\n```bash\n# 方式1，根据指令参数导入\nit loadExcel --excelPath ./demo.xlsx --localePath ./locales/zh-CN.json\n# 方式2，根据本地自定义配置导入\nit loadExcel -c ./i18n.config.js\n```\n\n6. 将翻译结果导出到 excel 表格\n\n```bash\n# 方式1，根据指令参数\nit --skip-extract --skip-translate --exportExcel --excelPath ./demo.xlsx\n# 方式2，根据本地配置\nit --skip-extract --skip-translate  -c ./i18n.config.js\n```\n\n## 转换效果示例\n\n#### react 转换示例\n\n转换前\n\n```jsx\nimport { useState } from 'react'\n\n/*i18n-ignore*/\nconst b = '被忽略提取的文案'\n\nfunction Example() {\n  const [msg, setMsg] = useState('你好')\n\n  return (\n    <div>\n      <p title=\"标题\">{msg + '呵呵'}</p>\n      <button onClick={() => setMsg(msg + '啊')}>点击</button>\n    </div>\n  )\n}\n\nexport default Example\n```\n\n转换后\n\n```jsx\nimport { t } from 'i18n'\nimport { useState } from 'react'\n\n/*i18n-ignore*/\nconst b = '被忽略提取的文案'\n\nfunction Example() {\n  const [msg, setMsg] = useState(t('你好'))\n  return (\n    <div>\n      <p title={t('标题')}>{msg + t('呵呵')}</p>\n      <button onClick={() => setMsg(msg + t('啊'))}>{t('点击')}</button>\n    </div>\n  )\n}\nexport default Example\n```\n\n#### vue 转换示例\n\n转换前\n\n```vue\n<template>\n  <div :label=\"'标签'\" :title=\"1 + '标题'\">\n    <p title=\"测试注释\">内容</p>\n    <button @click=\"handleClick('信息')\">点击</button>\n  </div>\n</template>\n\n<script>\nexport default {\n  methods: {\n    handleClick() {\n      console.log('点了')\n    },\n  },\n}\n</script>\n```\n\n转换后\n\n```vue\n<template>\n  <div :label=\"$t('标签')\" :title=\"1 + $t('标题')\">\n    <p :title=\"$t('测试注释')\">{{ $t('内容') }}</p>\n    <button @click=\"handleClick($t('信息'))\">{{ $t('点击') }}</button>\n  </div>\n</template>\n<script>\nexport default {\n  methods: {\n    handleClick() {\n      console.log(this.$t('点了'))\n    },\n  },\n}\n</script>\n```\n\n## 注意事项\n\n- 自定义配置里的 js 规则，除了用于处理 js 文件，也会应用到 vue 的模版和 vue`script`标签的非`export default`部分。例如\n\n```js\n<script>import a from 'a.js' function b() {a('哈哈哈')}</script>\n```\n\n- 自定义配置里的 vue 的`functionNameInScript`规则，仅针对`script`标签的`export default`部分生效。例如\n\n```vue\n<script>\nexport default {\n  data: {\n    return {\n      a: '测试'\n    }\n  }\n}\n</script>\n```\n\n- 代码转换后，新插入的导入语句中`import { t } from \"i18n\"`的`i18n`是通过打包工具(如`webpack`)的别名`alias`功能实现的。开发者可以结合自身需求自己定义，通过别名把`i18n`文件指向一个绝对路径\n\n- 导入语句中`import { t } from \"i18n\"`，其中的`i18n`文件内容要自己去封装实现\n\n- 翻译后，命令行工具自动去掉提取汉字里的回车，这是因为回车会影响翻译准确度。所有原文里如果有回车，请自行校对，在语言包里手动补上回车\n\n- 如果使用的 ts 枚举类型包含中文键，这种情况不支持自动转换，例如\n\n```ts\nenum typeEnum {\n  '测试',\n}\n```\n\n需要手动加注释跳过转换\n\n```ts\n/* i18n-ignore */\nenum typeEnum {\n  '测试',\n}\n```\n\n- type 类型定义里的中文，也不支持自动转换。请用`/*i18n-ignore*/`忽略\n\n```ts\n/* i18n-ignore */\ntype TitleType = '测试'\n```\n\n## 开源许可证\n\n[MIT](./LICENSE)\n","readmeFilename":"README.md","_rev":"1-a903c71744fbc721e8afe99685a05f4b"}