@ansstory/hias 1.0.4 → 1.0.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.gitattributes +1 -1
- package/.vscode/settings.json +8 -0
- package/LICENSE +22 -22
- package/README.md +533 -11
- package/README.zh-CN.md +531 -0
- package/lib/config.js +22 -18
- package/lib/core/action.js +95 -68
- package/lib/core/close-port.js +173 -0
- package/lib/core/commander.js +106 -40
- package/lib/core/download.js +32 -19
- package/lib/core/help.js +17 -6
- package/lib/core/lang.js +50 -0
- package/lib/core/translate.js +1049 -0
- package/lib/extractors/index.js +694 -0
- package/lib/i18n/index.js +77 -0
- package/lib/i18n/resources/en.json +91 -0
- package/lib/i18n/resources/zh-CN.json +91 -0
- package/lib/i18n/store.js +85 -0
- package/lib/index.js +14 -6
- package/lib/template/component.jsx.ejs +11 -11
- package/lib/template/component.tsx.ejs +12 -12
- package/lib/template/component.vue.ejs +13 -13
- package/lib/template/reduxStore.jsx.ejs +16 -16
- package/lib/template/reduxTsStore.tsx.ejs +22 -22
- package/lib/utils/baidu-translate.js +78 -0
- package/lib/utils/compile-ejs.js +28 -21
- package/lib/utils/tencent-translate.js +187 -0
- package/lib/utils/translation-cache.js +73 -0
- package/lib/utils/write-file.js +16 -10
- package/package.json +11 -3
- package/test/close-port.test.js +88 -0
- package/test/translate.test.js +545 -0
package/README.zh-CN.md
ADDED
|
@@ -0,0 +1,531 @@
|
|
|
1
|
+
# hias-cli
|
|
2
|
+
|
|
3
|
+
> 个人脚手架 CLI,内置国际化翻译工具链。
|
|
4
|
+
|
|
5
|
+
## 安装
|
|
6
|
+
|
|
7
|
+
```sh
|
|
8
|
+
npm i @ansstory/hias -g
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
## 使用
|
|
12
|
+
|
|
13
|
+
```
|
|
14
|
+
hias <command> [options]
|
|
15
|
+
```
|
|
16
|
+
|
|
17
|
+
---
|
|
18
|
+
|
|
19
|
+
## 快速开始(国际化翻译)
|
|
20
|
+
|
|
21
|
+
### 1. 配置 API 密钥
|
|
22
|
+
|
|
23
|
+
注册一个翻译服务商,然后在项目中生成配置文件:
|
|
24
|
+
|
|
25
|
+
```sh
|
|
26
|
+
hias setting
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
编辑 `.hias/setting.json`,填入 `appId` 和 `secretKey`:
|
|
30
|
+
|
|
31
|
+
```json
|
|
32
|
+
{
|
|
33
|
+
"translationSetting": {
|
|
34
|
+
"appId": "your_app_id",
|
|
35
|
+
"secretKey": "your_secret_key",
|
|
36
|
+
"provider": "baidu"
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
> **没有 API 密钥?** 留空即可使用回退模式——中文原文直接作为 key,国际化迁移仍然可以完成。
|
|
42
|
+
|
|
43
|
+
### 2. 预览变更(推荐)
|
|
44
|
+
|
|
45
|
+
```sh
|
|
46
|
+
hias tfo src/views myNamespace --dry-run
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
显示行级 diff 并提示 `Apply changes? (y/N)`。
|
|
50
|
+
|
|
51
|
+
### 3. 执行翻译
|
|
52
|
+
|
|
53
|
+
```sh
|
|
54
|
+
hias tfo src/views myNamespace
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
语言包文件生成到 `.hias/lang/myNamespace/`。若 `replaceOriginalFile` 为 `true`,则直接覆盖源文件。
|
|
58
|
+
|
|
59
|
+
---
|
|
60
|
+
|
|
61
|
+
## 命令
|
|
62
|
+
|
|
63
|
+
### `create <project>`(别名: `crt`)
|
|
64
|
+
|
|
65
|
+
从框架模板创建项目。
|
|
66
|
+
|
|
67
|
+
交互式提示列出所有可用框架。选择后模板将从 Gitee 下载到 `<project>/` 目录。
|
|
68
|
+
|
|
69
|
+
```sh
|
|
70
|
+
hias create my-app
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
**可用框架:**
|
|
74
|
+
|
|
75
|
+
| 名称 | 说明 |
|
|
76
|
+
| ------------ | ----------------------- |
|
|
77
|
+
| `vue2` | Vue 2 模板 |
|
|
78
|
+
| `vue3` | Vue 3 模板 |
|
|
79
|
+
| `vue-ts` | Vue 3 + TypeScript 模板 |
|
|
80
|
+
| `uni-vite` | uni-app + Vite 模板 |
|
|
81
|
+
| `nuxt-web` | Nuxt.js 网页模板 |
|
|
82
|
+
| `vue-screen` | Vue 数据大屏模板 |
|
|
83
|
+
| `react` | React JSX 模板 |
|
|
84
|
+
| `react-ts` | React TypeScript 模板 |
|
|
85
|
+
|
|
86
|
+
---
|
|
87
|
+
|
|
88
|
+
### `adv <name> [options]`
|
|
89
|
+
|
|
90
|
+
添加 Vue 组件文件。
|
|
91
|
+
|
|
92
|
+
```sh
|
|
93
|
+
hias adv Demo -d src/components
|
|
94
|
+
hias adv index -d src/views/demo
|
|
95
|
+
```
|
|
96
|
+
|
|
97
|
+
### `adr <name> [options]`
|
|
98
|
+
|
|
99
|
+
添加 React JSX 组件文件。
|
|
100
|
+
|
|
101
|
+
```sh
|
|
102
|
+
hias adr Demo -d src/components
|
|
103
|
+
```
|
|
104
|
+
|
|
105
|
+
### `adrt <name> [options]`
|
|
106
|
+
|
|
107
|
+
添加 React TSX 组件文件。
|
|
108
|
+
|
|
109
|
+
```sh
|
|
110
|
+
hias adrt Demo -d src/components
|
|
111
|
+
```
|
|
112
|
+
|
|
113
|
+
### `adrd <name> [options]`
|
|
114
|
+
|
|
115
|
+
添加 Redux JSX Store 文件。
|
|
116
|
+
|
|
117
|
+
```sh
|
|
118
|
+
hias adrd useDemoStore -d src/store/modules
|
|
119
|
+
```
|
|
120
|
+
|
|
121
|
+
### `adrdt <name> [options]`
|
|
122
|
+
|
|
123
|
+
添加 Redux TSX Store 文件。
|
|
124
|
+
|
|
125
|
+
```sh
|
|
126
|
+
hias adrdt useDemoStore -d src/store/modules
|
|
127
|
+
```
|
|
128
|
+
|
|
129
|
+
#### 组件命令通用选项
|
|
130
|
+
|
|
131
|
+
| 选项 | 说明 |
|
|
132
|
+
| ------------------- | ---------------------------------------------------------- |
|
|
133
|
+
| `-d, --dest <path>` | 目标文件夹,默认 `src/components`,支持 Windows 反斜杠路径 |
|
|
134
|
+
|
|
135
|
+
如果 `name` 为 `index`,则组件文件以父文件夹名命名。
|
|
136
|
+
|
|
137
|
+
---
|
|
138
|
+
|
|
139
|
+
### `close-port <ports...>`
|
|
140
|
+
|
|
141
|
+
关闭占用一个或多个端口的进程。
|
|
142
|
+
|
|
143
|
+
```sh
|
|
144
|
+
hias close-port 8076 8077
|
|
145
|
+
hias close-port 8076,8077
|
|
146
|
+
hias close-port 3000
|
|
147
|
+
```
|
|
148
|
+
|
|
149
|
+
支持空格分隔和逗号分隔的端口列表。兼容 Windows(`netstat` + `taskkill`)、macOS 和 Linux(`lsof` + `kill`)。
|
|
150
|
+
|
|
151
|
+
---
|
|
152
|
+
|
|
153
|
+
### `lang [language]`
|
|
154
|
+
|
|
155
|
+
设置或查看 CLI 语言。
|
|
156
|
+
|
|
157
|
+
```sh
|
|
158
|
+
hias lang zh-CN
|
|
159
|
+
hias lang en
|
|
160
|
+
hias lang -l # 查看当前语言
|
|
161
|
+
```
|
|
162
|
+
|
|
163
|
+
| 选项 | 说明 |
|
|
164
|
+
| ------------ | ------------ |
|
|
165
|
+
| `-l, --list` | 显示当前语言 |
|
|
166
|
+
|
|
167
|
+
支持的语言:`en`、`zh-CN`。
|
|
168
|
+
|
|
169
|
+
语言偏好存储在 `~/.hias-cli/config.json` 中。
|
|
170
|
+
|
|
171
|
+
---
|
|
172
|
+
|
|
173
|
+
### 翻译命令
|
|
174
|
+
|
|
175
|
+
翻译系统从源文件中提取中文,替换为 `$t()` 国际化调用,并生成语言包 JSON 文件。支持百度翻译 API 和腾讯云 TMT API。
|
|
176
|
+
|
|
177
|
+
#### `tf [file] [name]`
|
|
178
|
+
|
|
179
|
+
翻译单个文件。
|
|
180
|
+
|
|
181
|
+
```sh
|
|
182
|
+
hias tf src/views/index.vue vue
|
|
183
|
+
hias tf src/views/index.vue vue --verbose
|
|
184
|
+
```
|
|
185
|
+
|
|
186
|
+
| 参数 / 选项 | 说明 |
|
|
187
|
+
| -------------------- | --------------------------------------------------------------------- |
|
|
188
|
+
| `file`(位置参数) | 要翻译的文件路径 |
|
|
189
|
+
| `name`(位置参数) | 国际化命名空间 key(默认使用父目录名) |
|
|
190
|
+
| `-n, --name <name>` | 指定命名空间的另一种方式 |
|
|
191
|
+
| `--dry-run` | 预览变更但不实际修改文件(显示行级 diff,确认后执行) |
|
|
192
|
+
| `-v, --verbose` | 显示详细逐文件日志,替代进度 spinner |
|
|
193
|
+
| `--show-extractions` | 仅展示所有提取到的中文文本及其文件和位置,不执行翻译也不发送 API 请求 |
|
|
194
|
+
|
|
195
|
+
**支持的文件类型:** `.vue`、`.js`、`.ts`、`.jsx`、`.tsx`、`.json`
|
|
196
|
+
|
|
197
|
+
#### `tfo [folder] [name]`
|
|
198
|
+
|
|
199
|
+
递归翻译文件夹内所有支持的文件。
|
|
200
|
+
|
|
201
|
+
```sh
|
|
202
|
+
hias tfo src/views views
|
|
203
|
+
hias tfo src/views views --verbose
|
|
204
|
+
```
|
|
205
|
+
|
|
206
|
+
| 参数 / 选项 | 说明 |
|
|
207
|
+
| --------------------- | --------------------------------------------------------------------------------------------------- |
|
|
208
|
+
| `folder`(位置参数) | 文件夹路径 |
|
|
209
|
+
| `name`(位置参数) | 国际化命名空间 key(默认使用文件夹名) |
|
|
210
|
+
| `-n, --name <name>` | 指定命名空间的另一种方式 |
|
|
211
|
+
| `--dry-run` | 预览变更但不实际修改文件(显示行级 diff,确认后执行) |
|
|
212
|
+
| `-v, --verbose` | 显示详细逐文件日志,替代进度 spinner |
|
|
213
|
+
| `--exclude <pattern>` | 排除匹配 glob 模式的文件(如 `**/*.test.js`、`node_modules/**`)。使用 minimatch 匹配。可多次指定。 |
|
|
214
|
+
| `--show-extractions` | 仅展示所有提取到的中文文本及其文件和位置,不执行翻译也不发送 API 请求 |
|
|
215
|
+
|
|
216
|
+
#### `setting`
|
|
217
|
+
|
|
218
|
+
生成项目级翻译配置文件。
|
|
219
|
+
|
|
220
|
+
```sh
|
|
221
|
+
hias setting
|
|
222
|
+
```
|
|
223
|
+
|
|
224
|
+
在当前项目目录下创建 `.hias/setting.json`。
|
|
225
|
+
|
|
226
|
+
#### `globalsetting`
|
|
227
|
+
|
|
228
|
+
生成全局翻译配置文件。
|
|
229
|
+
|
|
230
|
+
```sh
|
|
231
|
+
hias globalsetting
|
|
232
|
+
```
|
|
233
|
+
|
|
234
|
+
创建或更新 `~/.hias-cli/config.json`,保留已有的 `language` 设置。
|
|
235
|
+
|
|
236
|
+
#### `gitignore`
|
|
237
|
+
|
|
238
|
+
将 `.hias` 添加到项目的 `.gitignore`。若文件不存在则创建,若已存在则追加条目。
|
|
239
|
+
|
|
240
|
+
```sh
|
|
241
|
+
hias gitignore
|
|
242
|
+
```
|
|
243
|
+
|
|
244
|
+
---
|
|
245
|
+
|
|
246
|
+
#### `rollback`
|
|
247
|
+
|
|
248
|
+
恢复上一次翻译操作的原文件并清理生成的输出。
|
|
249
|
+
|
|
250
|
+
每次翻译运行会在 `.hias/.langbackup/<timestamp>_<name>/` 下创建一个快照。执行 `rollback` 会恢复最近一次快照并删除该快照,保留更早的快照供多次单步回滚。
|
|
251
|
+
|
|
252
|
+
```sh
|
|
253
|
+
hias rollback
|
|
254
|
+
hias rollback --list # 列出所有可用备份
|
|
255
|
+
hias rollback --name 20250101_120000_vue # 回滚指定备份
|
|
256
|
+
hias rollback --keep 3 # 仅保留最近 3 个备份,删除更旧的
|
|
257
|
+
```
|
|
258
|
+
|
|
259
|
+
**行为:** 若当时 `replaceOriginalFile` 为 `true`,则还原原始源文件;若为 `false`,则仅删除输出目录 `.hias/lang/<name>/`。
|
|
260
|
+
|
|
261
|
+
**`--keep` 行为:** 按备份目录名称(时间戳)排序,删除最旧的备份,只保留最近的 N 个。若备份总数 ≤ N 则不操作。
|
|
262
|
+
|
|
263
|
+
| 选项 | 说明 |
|
|
264
|
+
| ---------------- | ----------------------------------- |
|
|
265
|
+
| `-l, --list` | 列出所有可用备份 |
|
|
266
|
+
| `--name <name>` | 按名称回滚指定备份 |
|
|
267
|
+
| `--keep <count>` | 仅保留最近 N 个备份,删除更旧的备份 |
|
|
268
|
+
|
|
269
|
+
---
|
|
270
|
+
|
|
271
|
+
## 配置
|
|
272
|
+
|
|
273
|
+
### 配置级联
|
|
274
|
+
|
|
275
|
+
翻译设置按以下优先级解析:
|
|
276
|
+
|
|
277
|
+
1. **项目级** — 当前工作目录下的 `.hias/setting.json`
|
|
278
|
+
2. **全局** — `~/.hias-cli/config.json`(通过 `hias globalsetting` 创建)
|
|
279
|
+
3. **默认值** — 硬编码的默认值(如下所示)
|
|
280
|
+
|
|
281
|
+
### 设置文件格式
|
|
282
|
+
|
|
283
|
+
```json
|
|
284
|
+
{
|
|
285
|
+
"translationSetting": {
|
|
286
|
+
"locales": ["zh-CN", "en-US"],
|
|
287
|
+
"outDir": ".hias/lang",
|
|
288
|
+
"fallbackToKey": true,
|
|
289
|
+
"replaceOriginalFile": false,
|
|
290
|
+
"provider": "tencent",
|
|
291
|
+
"_provider_hint": "'baidu','tencent'",
|
|
292
|
+
"i18nCallTemplate": "$t",
|
|
293
|
+
"extensions": [".vue", ".js", ".ts", ".jsx", ".tsx", ".json"],
|
|
294
|
+
"appId": "",
|
|
295
|
+
"secretKey": ""
|
|
296
|
+
}
|
|
297
|
+
}
|
|
298
|
+
```
|
|
299
|
+
|
|
300
|
+
### 配置字段说明
|
|
301
|
+
|
|
302
|
+
| 字段 | 类型 | 默认值 | 说明 |
|
|
303
|
+
| --------------------- | ---------- | -------------------- | ---------------------------------------------------------------------------------------------------------------------------------- |
|
|
304
|
+
| `locales` | `string[]` | `["zh-CN", "en-US"]` | 语言代码列表。**第一个为源语言**,其余为目标语言。例如 `["zh-CN", "en-US", "ja-JP", "ko-KR"]` 会同时生成英文、日文、韩文三套语言包 |
|
|
305
|
+
| `outDir` | `string` | `".hias/lang"` | 生成的语言包和翻译副本的输出目录 |
|
|
306
|
+
| `fallbackToKey` | `boolean` | `true` | 翻译 API 不可用时是否生成 key |
|
|
307
|
+
| `replaceOriginalFile` | `boolean` | `false` | 为 `true` 时直接覆盖源文件(不复制到 `outDir`) |
|
|
308
|
+
| `provider` | `string` | `"tencent"` | 翻译服务商:`"baidu"` 或 `"tencent"` |
|
|
309
|
+
| `i18nCallTemplate` | `string` | `"$t"` | i18n 函数名。当包含 `{{key}}` 时直接替换;否则包装为 `$t('key')` |
|
|
310
|
+
| `extensions` | `string[]` | — | 覆盖支持的文件扩展名(如 `[".vue", ".ts"]`),默认支持所有类型 |
|
|
311
|
+
| `appId` | `string` | `""` | 百度 AppId 或腾讯 SecretId |
|
|
312
|
+
| `secretKey` | `string` | `""` | 百度 SecretKey 或腾讯 SecretKey |
|
|
313
|
+
|
|
314
|
+
### 翻译服务商
|
|
315
|
+
|
|
316
|
+
| 服务商 | `provider` 值 | `appId` | `secretKey` |
|
|
317
|
+
| ---------- | ------------- | ------------- | -------------- |
|
|
318
|
+
| 百度翻译 | `"baidu"` | 百度 AppId | 百度 SecretKey |
|
|
319
|
+
| 腾讯云 TMT | `"tencent"` | 腾讯 SecretId | 腾讯 SecretKey |
|
|
320
|
+
|
|
321
|
+
`appId` 和 `secretKey` 都留空则使用回退模式(中文原文同时作为 key 和 value)。
|
|
322
|
+
|
|
323
|
+
> **配置校验:** 加载配置时会自动校验字段格式(如 `locales` 是否为数组、`provider` 是否为支持的枚举值、`appId`/`secretKey` 是否为字符串等)。格式不符合时将发出警告并回退至默认值,不会中断流程。
|
|
324
|
+
|
|
325
|
+
### 翻译服务商配置
|
|
326
|
+
|
|
327
|
+
#### 百度翻译
|
|
328
|
+
|
|
329
|
+
1. 访问 [百度翻译开放平台](https://fanyi-api.baidu.com/) 注册账号
|
|
330
|
+
2. 创建应用获取 **AppId** 和 **SecretKey**
|
|
331
|
+
3. 配置文件中设置 `"provider": "baidu"`
|
|
332
|
+
|
|
333
|
+
#### 腾讯云 TMT
|
|
334
|
+
|
|
335
|
+
1. 访问 [腾讯云 TMT](https://console.cloud.tencent.com/tmt) 开通服务
|
|
336
|
+
2. 创建 API 密钥获取 **SecretId**(填入 `appId`)和 **SecretKey**
|
|
337
|
+
3. 配置文件中设置 `"provider": "tencent"`
|
|
338
|
+
|
|
339
|
+
---
|
|
340
|
+
|
|
341
|
+
## 输出结构
|
|
342
|
+
|
|
343
|
+
翻译完成后会创建以下目录结构(假设 `locales: ["zh-CN", "en-US", "ja-JP"]`):
|
|
344
|
+
|
|
345
|
+
```
|
|
346
|
+
.hias/
|
|
347
|
+
├── setting.json # 项目级配置文件
|
|
348
|
+
├── lang/
|
|
349
|
+
│ └── <命名空间>/
|
|
350
|
+
│ ├── zh-CN.json # 源语言包
|
|
351
|
+
│ ├── en-US.json # 目标语言包 ①
|
|
352
|
+
│ ├── ja-JP.json # 目标语言包 ②
|
|
353
|
+
│ └── <file>.vue # 翻译副本(仅 replaceOriginalFile=false 时)
|
|
354
|
+
├── .translation-cache.json # 翻译缓存(自动生成)
|
|
355
|
+
└── .langbackup/
|
|
356
|
+
└── <时间戳>_<命名空间>/
|
|
357
|
+
└── <file>.vue.bak # 原始文件备份
|
|
358
|
+
```
|
|
359
|
+
|
|
360
|
+
语言包采用 `{ namespace: { key: value } }` 嵌套格式,可直接用于 `vue-i18n` 等库的模块注册。
|
|
361
|
+
|
|
362
|
+
---
|
|
363
|
+
|
|
364
|
+
## 翻译行为
|
|
365
|
+
|
|
366
|
+
### 源码提取
|
|
367
|
+
|
|
368
|
+
工具扫描源文件并从以下位置提取中文:
|
|
369
|
+
|
|
370
|
+
- **引号字符串**:`'中文'`、`"中文"`、`` `中文{expr}文` ``(模板字面量含表达式时拆分,仅提取静态中文段)
|
|
371
|
+
- **Vue 模板**:`{{ '中文' }}`、`<div>中文</div>`
|
|
372
|
+
- **Vue 复杂表达式**:`{{ isHidden || '中文' }}`、`{{ isHidden ?? '中文' }}`(提取表达式中的引号字符串)
|
|
373
|
+
- **Vue 指令**:`v-if="text1 == '中文'"`(提取指令表达式中的内联字符串)
|
|
374
|
+
- **JSX/TSX 文本节点**:`<span>中文 {name}</span>`(支持含表达式的混合文本)
|
|
375
|
+
- **JSX/TSX 属性**:`<div title="中文">` 或 `<div title={'中文'}>`
|
|
376
|
+
- **JSON 值**:`"key": "中文值"`
|
|
377
|
+
- **HTML 普通属性**:`<div title="兴趣">`(Vue 模板中)
|
|
378
|
+
|
|
379
|
+
注释(`//`、`/* */`、`<!-- -->`)会被正确跳过。`data-*` 和 `aria-*` 属性会被排除。
|
|
380
|
+
|
|
381
|
+
### 替换模式
|
|
382
|
+
|
|
383
|
+
| 上下文 | 替换前 | 替换后 |
|
|
384
|
+
| -------------------- | ------------------------- | -------------------------------------------------- |
|
|
385
|
+
| Vue 模板文本节点 | `<div>兴趣</div>` | `<div>{{ $t('demo.interest') }}</div>` |
|
|
386
|
+
| Vue 模板插值 | `{{ '兴趣' }}` | `{{ $t('demo.interest') }}` |
|
|
387
|
+
| Vue 复杂表达式 | <code>{{ isHidden || '兴趣' }}</code> | <code>{{ isHidden || $t('demo.interest') }}</code> |
|
|
388
|
+
| Vue 指令表达式 | `v-if="text1 == '文本'"` | `v-if="text1 == $t('demo.text')"` |
|
|
389
|
+
| Vue script / JS / TS | `'兴趣'` | `$t('demo.interest')` |
|
|
390
|
+
| JSX 文本节点 | `<div>兴趣</div>` | `<div>{$t('demo.interest')}</div>` |
|
|
391
|
+
| JSX 属性 | `<div title="兴趣">` | `<div title={$t('demo.interest')}>` |
|
|
392
|
+
| Vue v-bind 属性 | `<div :title="'兴趣'">` | `<div :title="$t('demo.interest')">` |
|
|
393
|
+
| 模板字面量 | `` `中文 ${name} 测试` `` | `` `$t('demo.chinese') ${name} $t('demo.test')` `` |
|
|
394
|
+
| JSON 值 | `"兴趣"` | `"interest"`(直接替换为翻译结果) |
|
|
395
|
+
|
|
396
|
+
### 语言包文件格式
|
|
397
|
+
|
|
398
|
+
**翻译成功时**(基于英文的 key):
|
|
399
|
+
|
|
400
|
+
```json
|
|
401
|
+
// zh-CN.json
|
|
402
|
+
{ "demo": { "interest": "兴趣", "test": "测试" } }
|
|
403
|
+
// en-US.json
|
|
404
|
+
{ "demo": { "interest": "interest", "test": "test" } }
|
|
405
|
+
// ja-JP.json(如果 locales 包含 ja-JP)
|
|
406
|
+
{ "demo": { "interest": "興味", "test": "テスト" } }
|
|
407
|
+
```
|
|
408
|
+
|
|
409
|
+
**翻译失败时**(根据中文自动生成简短 key):
|
|
410
|
+
|
|
411
|
+
```json
|
|
412
|
+
// zh-CN.json 和 en-US.json
|
|
413
|
+
{ "demo": { "提起妈妈的手_一股酸痛便涌上心头": "提起妈妈的手,一股酸痛便涌上心头...", "test": "测试" } }
|
|
414
|
+
```
|
|
415
|
+
|
|
416
|
+
### Key 生成规则
|
|
417
|
+
|
|
418
|
+
| 场景 | 来源 | Key 生成方式 | 最大长度 |
|
|
419
|
+
| ------------ | -------- | ------------------------ | -------- |
|
|
420
|
+
| API 翻译成功 | 英文译文 | 转 snake_case | 40 字符 |
|
|
421
|
+
| API 回退 | 原始中文 | 去标点、`。` → `_`,截断 | 40 字符 |
|
|
422
|
+
|
|
423
|
+
Key 会去重:若两段文本生成相同的截断 key,则自动追加 `_1`、`_2`……
|
|
424
|
+
|
|
425
|
+
### 翻译 API 回退警告
|
|
426
|
+
|
|
427
|
+
当翻译 API 调用失败(网络错误、凭据无效或频率限制)时,工具会在控制台输出警告,例如:
|
|
428
|
+
|
|
429
|
+
```
|
|
430
|
+
⚠ Translation API failed, falling back to Chinese keys for this batch
|
|
431
|
+
```
|
|
432
|
+
|
|
433
|
+
然后回退到基于中文的自动生成 key(参见上方 [Key 生成规则](#key-生成规则)),确保即使没有 API 连接也能继续进行国际化迁移。
|
|
434
|
+
|
|
435
|
+
> **逐文本回退:** 若批次内部分文本翻译成功、部分失败,仅失败文本走回退模式,成功文本仍使用英文 key。这避免了因单个文本翻译失败导致整批内容降级使用中文 key。
|
|
436
|
+
|
|
437
|
+
### 翻译缓存
|
|
438
|
+
|
|
439
|
+
每次成功的 API 翻译结果会缓存到 `.hias/.translation-cache.json`。下次翻译相同文本时(无论哪个命名空间),直接从缓存读取,避免重复的网络请求和 API 费用。
|
|
440
|
+
|
|
441
|
+
- 缓存以原文为键、目标语言为二级键:`{ "text": { "en": "translated" } }`
|
|
442
|
+
- 缓存文件破损或格式错误时自动忽略,不影响正常翻译流程
|
|
443
|
+
- 缓存自动在"空闲时"落盘(`setImmediate` 延迟写入),不阻塞翻译管线
|
|
444
|
+
|
|
445
|
+
### 未使用翻译清理
|
|
446
|
+
|
|
447
|
+
替换中文为 `$t()` 调用后,工具会检查现有的语言包 JSON 文件,**移除源文件中不再引用的 key**,防止语言包随时间积累过期条目。
|
|
448
|
+
|
|
449
|
+
清理操作仅针对本次翻译操作使用的命名空间,且仅移除在所有扫描源文件中引用数为零的 key。
|
|
450
|
+
|
|
451
|
+
### 命名空间规范化
|
|
452
|
+
|
|
453
|
+
源文件中已有的 `$t('旧命名空间.key')` 调用会在翻译时自动更新为当前命名空间。
|
|
454
|
+
|
|
455
|
+
### 预览模式(--dry-run)
|
|
456
|
+
|
|
457
|
+
指定 `--dry-run` 时,工具会显示所有变更的行级 diff,但不实际修改文件。预览结束后提示 `Apply changes? (y/N)` — 输入 `y` 或 `yes` 执行变更,其他任何输入取消。
|
|
458
|
+
|
|
459
|
+
### `i18nCallTemplate` 自定义
|
|
460
|
+
|
|
461
|
+
`i18nCallTemplate` 字段控制国际化函数名和调用格式:
|
|
462
|
+
|
|
463
|
+
| 模板值 | 生成结果 |
|
|
464
|
+
| ---------------------------- | ------------------------------------- |
|
|
465
|
+
| `"$t"`(默认) | `$t('demo.interest')` |
|
|
466
|
+
| `"$te"` | `$te('demo.interest')` |
|
|
467
|
+
| `"{{key}}"` | `demo.interest`(裸 key,无函数调用) |
|
|
468
|
+
| `"t('{{key}}')"` | `t('demo.interest')` |
|
|
469
|
+
| `"i18n.global.t('{{key}}')"` | `i18n.global.t('demo.interest')` |
|
|
470
|
+
|
|
471
|
+
当模板 **包含** `{{key}}` 时,`{{key}}` 会被替换为 `namespace.subKey`;当 **不包含** `{{key}}` 时,包装为 `template('namespace.subKey')`。
|
|
472
|
+
|
|
473
|
+
### 工作流建议
|
|
474
|
+
|
|
475
|
+
- **首次翻译前务必使用 `--dry-run`** 预览提取结果,确认无误后再执行
|
|
476
|
+
- **针对单文件翻译**:`hias tfo src/views/MyComponent myComp`
|
|
477
|
+
- **排除配置或生成文件**:`hias tfo src/views views --exclude "**/*.test.js" --exclude node_modules`
|
|
478
|
+
- **按模块划分命名空间**:例如 `src/views/user/` → 命名空间 `user`,`src/views/admin/` → 命名空间 `admin`,保持语言包小巧聚焦
|
|
479
|
+
- **启用 `replaceOriginalFile` 后及时回滚确认**:`hias rollback`
|
|
480
|
+
- **多次回滚**:每次 `rollback` 撤销一个快照,可多次执行逐步回退
|
|
481
|
+
- **重复翻译安全**:已有 `$t()` 调用会在重新提取前被剥离,重复运行只会添加剩余中文的翻译
|
|
482
|
+
|
|
483
|
+
---
|
|
484
|
+
|
|
485
|
+
## 全局配置
|
|
486
|
+
|
|
487
|
+
全局配置文件位于 `~/.hias-cli/config.json`,语言设置和翻译设置共用此文件:
|
|
488
|
+
|
|
489
|
+
```json
|
|
490
|
+
{
|
|
491
|
+
"language": "zh-CN",
|
|
492
|
+
"translationSetting": {
|
|
493
|
+
"locales": ["zh-CN", "en-US"],
|
|
494
|
+
"outDir": ".hias/lang",
|
|
495
|
+
"fallbackToKey": true,
|
|
496
|
+
"replaceOriginalFile": false,
|
|
497
|
+
"provider": "tencent",
|
|
498
|
+
"_provider_hint": "'baidu','tencent'",
|
|
499
|
+
"i18nCallTemplate": "$t",
|
|
500
|
+
"extensions": [".vue", ".js", ".ts", ".jsx", ".tsx", ".json"],
|
|
501
|
+
"appId": "",
|
|
502
|
+
"secretKey": ""
|
|
503
|
+
}
|
|
504
|
+
}
|
|
505
|
+
```
|
|
506
|
+
|
|
507
|
+
由以下命令管理:
|
|
508
|
+
|
|
509
|
+
- **`hias lang <language>`** — 设置 `language`
|
|
510
|
+
- **`hias globalsetting`** — 创建/更新 `translationSetting`
|
|
511
|
+
|
|
512
|
+
---
|
|
513
|
+
|
|
514
|
+
## 全部命令一览
|
|
515
|
+
|
|
516
|
+
| 命令 | 别名 | 说明 |
|
|
517
|
+
| ----------------------- | ----- | ---------------------------- |
|
|
518
|
+
| `create <project>` | `crt` | 从框架模板创建项目 |
|
|
519
|
+
| `adv <name>` | – | 添加 Vue 组件 |
|
|
520
|
+
| `adr <name>` | – | 添加 React JSX 组件 |
|
|
521
|
+
| `adrt <name>` | – | 添加 React TSX 组件 |
|
|
522
|
+
| `adrd <name>` | – | 添加 Redux JSX Store |
|
|
523
|
+
| `adrdt <name>` | – | 添加 Redux TSX Store |
|
|
524
|
+
| `close-port <ports...>` | – | 关闭端口的进程 |
|
|
525
|
+
| `lang [language]` | – | 设置或查看 CLI 语言 |
|
|
526
|
+
| `tf [file] [name]` | – | 单个文件翻译 |
|
|
527
|
+
| `tfo [folder] [name]` | – | 递归翻译文件夹 |
|
|
528
|
+
| `setting` | – | 生成项目级翻译配置 |
|
|
529
|
+
| `globalsetting` | – | 生成全局翻译配置 |
|
|
530
|
+
| `gitignore` | – | 添加 `.hias` 到 `.gitignore` |
|
|
531
|
+
| `rollback` | – | 回滚上一次翻译操作 |
|
package/lib/config.js
CHANGED
|
@@ -1,18 +1,22 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
'
|
|
7
|
-
'
|
|
8
|
-
'
|
|
9
|
-
'
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
1
|
+
// 项目配置文件 - 定义支持的框架模板和对应的下载地址
|
|
2
|
+
// 各框架模板的 Gitee 仓库地址映射表
|
|
3
|
+
const foramworkUrl = {
|
|
4
|
+
vue2: 'https://gitee.com/AnsStory/hias-vue2-template.git',
|
|
5
|
+
vue3: 'https://gitee.com/AnsStory/hias-vue3-template.git',
|
|
6
|
+
'vue-ts': 'https://gitee.com/AnsStory/hias-vue-ts-template.git',
|
|
7
|
+
'uni-vite': 'https://gitee.com/AnsStory/hias-uni-vite.git',
|
|
8
|
+
'nuxt-web': 'https://gitee.com/AnsStory/hias-nuxt-web-tmp.git',
|
|
9
|
+
'vue-screen': 'https://gitee.com/AnsStory/hias-vite-screen.git',
|
|
10
|
+
react: 'https://gitee.com/AnsStory/hias-react-template.git',
|
|
11
|
+
'react-ts': 'https://gitee.com/AnsStory/hias-react-ts-template.git',
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
// 从 foramworkUrl 对象提取所有支持的框架名称
|
|
15
|
+
const framwork = Object.keys(foramworkUrl)
|
|
16
|
+
|
|
17
|
+
module.exports = {
|
|
18
|
+
// 可选择的框架列表
|
|
19
|
+
framwork,
|
|
20
|
+
// 框架对应的下载地址映射表
|
|
21
|
+
foramworkUrl,
|
|
22
|
+
}
|