{"_id":"@creekjs/i18n-extract","_rev":"2-66fb2c7ac344a9d62177d241d4bd5397","name":"@creekjs/i18n-extract","dist-tags":{"latest":"1.0.1"},"versions":{"1.0.0":{"name":"@creekjs/i18n-extract","version":"1.0.0","_id":"@creekjs/i18n-extract@1.0.0","maintainers":[{"name":"creekjs","email":"997402405@qq.com"}],"bin":{"creek-i18n":"bin/creek-i18n.js"},"dist":{"shasum":"b1441307ef0bd11bce0a46e5ee2ec0a6f8b3051a","tarball":"https://registry.npmjs.org/@creekjs/i18n-extract/-/i18n-extract-1.0.0.tgz","fileCount":36,"integrity":"sha512-bNoT4LTwMgGb/tzuNmBaFIMv52fU7l89Npek1MKMrobNMwq7oldKiNMeYj+8kQQWiQYTzMOcIUvpTpUPuUxwAw==","signatures":[{"sig":"MEUCIQC+SWl4f9sd94MR2I3t6wY6PDtspBQjCqC6HhqwW5MnqwIgav0rWEbGM15flhV02+fCtiCDmSpSiPGiszeHRVKcT+4=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":204761},"main":"dist/index.js","types":"dist/index.d.ts","gitHead":"1499507943ca09e4e903b5f3cf3f0ad48f1df477","scripts":{"dev":"father dev","build":"father build","prepublishOnly":"npm run build"},"_npmUser":{"name":"creekjs","email":"997402405@qq.com"},"_npmVersion":"10.2.3","description":"i18n extract tool for creekjs","directories":{},"_nodeVersion":"20.10.0","dependencies":{"glob":"^7.2.0","jiti":"^2.6.1","xlsx":"^0.18.5","chalk":"^4.1.2","pinyin":"^2.11.0","fs-extra":"^10.0.0","prettier":"^3.3.3","commander":"^9.0.0","@babel/core":"^7.0.0","@babel/types":"^7.0.0","@babel/parser":"^7.0.0","@babel/traverse":"^7.0.0","@babel/generator":"^7.0.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"father":"^4.0.0","typescript":"^4.0.0","@types/glob":"^7.2.0","@types/node":"^14.0.0","@types/fs-extra":"^9.0.13"},"_npmOperationalInternal":{"tmp":"tmp/i18n-extract_1.0.0_1774253357602_0.21881003296722645","host":"s3://npm-registry-packages-npm-production"}},"1.0.1":{"name":"@creekjs/i18n-extract","version":"1.0.1","description":"i18n extract tool for creekjs","main":"dist/index.js","types":"dist/index.d.ts","bin":{"creek-i18n":"bin/creek-i18n.js"},"dependencies":{"@babel/core":"^7.0.0","@babel/generator":"^7.0.0","@babel/parser":"^7.0.0","@babel/traverse":"^7.0.0","@babel/types":"^7.0.0","chalk":"^4.1.2","commander":"^9.0.0","fs-extra":"^10.0.0","glob":"^7.2.0","jiti":"^2.6.1","pinyin":"^2.11.0","prettier":"^3.3.3","xlsx":"^0.18.5"},"devDependencies":{"@types/fs-extra":"^9.0.13","@types/glob":"^7.2.0","@types/node":"^14.0.0","father":"^4.0.0","typescript":"^4.0.0"},"publishConfig":{"access":"public"},"scripts":{"build":"father build","dev":"father dev"},"_id":"@creekjs/i18n-extract@1.0.1","_integrity":"sha512-PmUOHyse7vAy9Lv38BfrDjQPWcyfPPfu0ZHhjt8b06yIfr+i4tEx6gab5oi0JECgMa4QL5RsMT++AbXC+N8rEg==","_resolved":"/private/var/folders/y3/1z7_z0ms51n9kjyqh2304mkr0000gn/T/b6b4583ae9a473131218eb6bb5b4275a/creekjs-i18n-extract-1.0.1.tgz","_from":"file:creekjs-i18n-extract-1.0.1.tgz","_nodeVersion":"20.10.0","_npmVersion":"10.2.3","dist":{"integrity":"sha512-PmUOHyse7vAy9Lv38BfrDjQPWcyfPPfu0ZHhjt8b06yIfr+i4tEx6gab5oi0JECgMa4QL5RsMT++AbXC+N8rEg==","shasum":"c785415e8b6fc48a7f86bc099655f67bdde002ac","tarball":"https://registry.npmjs.org/@creekjs/i18n-extract/-/i18n-extract-1.0.1.tgz","fileCount":36,"unpackedSize":204722,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIQCJYFM65aJDYvyJ//g9I2X4tqxSlrCzJime2ps8cvezfAIgJpzHfjOvPbIsCAeepgYPNx5Jh4lNYHKNREKvOeRQlhw="}]},"_npmUser":{"name":"creekjs","email":"997402405@qq.com"},"directories":{},"maintainers":[{"name":"creekjs","email":"997402405@qq.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/i18n-extract_1.0.1_1774434183934_0.8759816283400135"},"_hasShrinkwrap":false}},"time":{"created":"2026-03-23T08:09:17.446Z","modified":"2026-03-25T10:23:04.247Z","1.0.0":"2026-03-23T08:09:17.744Z","1.0.1":"2026-03-25T10:23:04.099Z"},"description":"i18n extract tool for creekjs","maintainers":[{"name":"creekjs","email":"997402405@qq.com"}],"readme":"# @creekjs/i18n-extract\n\n一个强大的中文国际化提取工具，支持 TypeScript、React、Vue 文件，能够自动识别中文并替换为国际化函数调用，同时生成对应的语言包文件。\n\n## 功能特性\n\n- **多语言支持**：支持 `.ts`, `.tsx`, `.js`, `.jsx`, `.vue` 文件。\n- **自动提取与替换**：\n  - 自动识别代码中的中文字符串。\n  - 自动将其替换为 `t('key', 'value')`（函数名可配置）。\n  - 自动添加 `import { t } from '@/utils/i18n'` 导入语句（路径可配置）。\n- **Vue 支持**：\n  - 支持 Vue 2/3 的 `<template>` 中文提取。\n  - 支持 Vue 组件属性（如 `title=\"中文\"`）提取。\n  - 支持 `<script>` 块中的中文提取。\n- **智能合并**：生成的语言包文件会保留已有的翻译，只新增未翻译的词条，避免覆盖。\n- **目录结构镜像**：生成的语言包文件会严格镜像源代码的目录结构，方便管理。\n  - 例如：`src/pages/Demo/index.tsx` -> `src/locales/zh_CN/pages/Demo/index.ts`\n- **Excel 导出**：支持将所有提取到的词条导出为 Excel 文件，方便翻译人员使用。\n- **高度可配置**：支持自定义 key 生成规则、t 函数名称、导入语句等。\n\n## 安装\n\n```bash\nnpm install @creekjs/i18n-extract --save-dev\n# 或者\nyarn add @creekjs/i18n-extract -D\n```\n\n## 使用方法\n\n### CLI 命令\n\n```bash\ncreek-i18n [options]\n```\n\n#### 选项\n\n- `-p, --path <path>`: 指定要扫描的源码路径（Glob 模式，例如 `src/**/*.{ts,tsx}`）。\n- `-o, --out <path>`: 指定生成的语言包输出目录（例如 `src/locales`）。\n- `-c, --config <path>`: 指定配置文件路径（默认为 `i18n.config.ts` 或 `i18n.config.js`）。\n- `--excel <path>`: 导出 Excel 文件的路径（例如 `./translations.xlsx`）。\n\n### 配置文件\n\n在项目根目录下创建 `i18n.config.ts` 或 `i18n.config.js`：\n\n```typescript\n// i18n.config.ts\nmodule.exports = {\n  // 语言文件类型 (ts/js/json)\n  localeFileType: 'ts',\n  \n  // 语言包输出的主入口文件路径\n  // 注意：实际生成的翻译文件会存放在该文件同级目录下以文件名命名的文件夹中\n  // 例如：src/locales/zh_CN.ts -> 生成的文件在 src/locales/zh_CN/ 目录下\n  localePath: './src/locales/zh_CN.ts',\n  \n  // 要扫描的文件路径 (Glob)\n  path: 'src/**/*.{ts,tsx,js,jsx,vue}',\n  \n  // 排除的文件/目录\n  exclude: ['**/node_modules/**', '**/dist/**', '**/.umi/**', '**/locales/**'],\n  \n  // 国际化函数名称 (默认为 't')\n  tFunction: 't',\n  \n  // 国际化函数的导入语句\n  importStatement: 'import { t } from \"@/utils/i18n\"',\n  \n  // 是否使用目录结构作为命名空间 (默认为 true)\n  // 开启后，生成的语言文件将镜像源码目录结构\n  useDirectoryAsNamespace: true,\n  \n  // 自定义 key 生成规则 (可选)\n  // text: 中文原文\n  // filePath: 当前文件路径\n  // customizeKey: (text, filePath) => {\n  //   return someHashFunction(text); \n  // }\n  \n  // 开启 React Hooks 模式 (useT)\n  // 默认为 false\n  useT: false,\n\n  // 指定哪些目录下的文件使用 useT 模式\n  // 默认为 ['pages', 'components']\n  // 只有在这些目录下的文件，并且是 React 组件或 Hook 时，才会注入 useT\n  useTDirs: ['pages', 'components'],\n\n  // useT 的 Hook 名称\n  // 默认为 'useT'\n  useTFunction: 'useT',\n\n  // useT 的导入语句\n  // 默认为 'import { useT } from \"@/utils/i18n\"'\n  useTImportStatement: 'import { useT } from \"@/utils/i18n\"',\n};\n```\n\n## 响应式支持 (useT)\n\n为了支持 React 组件中的语言切换响应式更新，工具支持 `useT` Hook 模式。\n\n### 配置\n\n在 `i18n.config.ts` 中开启 `useT`：\n\n```typescript\nmodule.exports = {\n  // ... 其他配置\n  useT: true,\n  useTDirs: ['pages', 'components'], // 指定生效目录\n};\n```\n\n### 效果\n\n**处理前：**\n\n```tsx\nimport React from 'react';\n\nexport const Demo = () => {\n  return <div>你好</div>;\n};\n```\n\n**处理后：**\n\n```tsx\nimport { useT } from '@/utils/i18n'; // 自动添加 useT 导入\nimport React from 'react';\n\nexport const Demo = () => {\n  const t = useT(); // 自动注入 hook 调用\n  return <div>{t('demo.nihao', '你好')}</div>;\n};\n```\n\n注意：\n- `useT` 模式只会在 `useTDirs` 配置的目录下的 React 组件或自定义 Hook 中生效。\n- 对于非组件函数或不在指定目录下的文件，仍然会使用全局 `t` 函数。\n\n## 示例\n\n### React 组件\n\n**处理前：**\n\n```tsx\nimport React from 'react';\nimport { Button } from 'antd';\n\nexport const Demo = () => {\n  return (\n    <div>\n      <div>你好，世界</div>\n      <Button>点击我</Button>\n      <div title=\"标题\">属性测试</div>\n    </div>\n  );\n};\n```\n\n**处理后：**\n\n```tsx\nimport { t } from \"@/utils/i18n\"; // 自动添加导入\nimport React from 'react';\nimport { Button } from 'antd';\n\nexport const Demo = () => {\n  return (\n    <div>\n      <div>{t(\"nihaoshijie\", \"你好，世界\")}</div>\n      <Button>{t(\"dianjiwo\", \"点击我\")}</Button>\n      <div title={t(\"biaoti\", \"标题\")}>{t(\"shuxingceshi\", \"属性测试\")}</div>\n    </div>\n  );\n};\n```\n\n### Vue 组件\n\n**处理前：**\n\n```vue\n<template>\n  <div title=\"标题\">\n    你好，Vue\n  </div>\n</template>\n\n<script>\nexport default {\n  data() {\n    return {\n      msg: '欢迎'\n    }\n  }\n}\n</script>\n```\n\n**处理后：**\n\n```vue\n<template>\n  <div :title=\"$t('biaoti')\">\n    {{ $t('nihaovue') }}\n  </div>\n</template>\n\n<script>\nimport { t } from \"@/utils/i18n\"; // 自动添加导入\nexport default {\n  data() {\n    return {\n      msg: t('huanying', '欢迎')\n    }\n  }\n}\n</script>\n```\n\n## 导出 Excel\n\n你可以将提取到的所有翻译导出为 Excel 文件，方便交付给翻译团队：\n\n```bash\ncreek-i18n -c i18n.config.ts --excel ./translations.xlsx\n```\n\n生成的 Excel 包含以下列：\n- `Namespace`: 命名空间（文件路径）\n- `Key`: 翻译键值\n- `zh_CN`: 中文原文\n- `en_US`: 英文翻译占位符\n","readmeFilename":"README.md"}