# i18n 国际化规范文档

> **版本**：v1.0  
> **适用项目**：`mes-ui`  
> **语言包文件**：`src/locales/zh-chs.json` / `src/locales/en.json` / `src/locales/zh-cht.json` / `src/locales/ja.json`  
> **配合使用**：`src/composables/useI18n.js`（`i18nMixin`）

---

## 目录

1. [语言包文件规范](#1-语言包文件规范)
2. [Key 命名规范（三层层级）](#2-key-命名规范三层层级)
3. [公共 Key 规范（page.common）](#3-公共-key-规范pagecommon)
4. [页面中如何使用（i18nMixin）](#4-页面中如何使用i18nmixin)
5. [常见场景 Key 模板](#5-常见场景-key-模板)
6. [旧项目 Key 迁移对照](#6-旧项目-key-迁移对照)
7. [翻译格式规范](#7-翻译格式规范)
8. [新增页面 Checklist](#8-新增页面-checklist)

---

## 1. 语言包文件规范

### 1.1 文件清单

| 文件 | 语言 | `_element` 值 |
|------|------|--------------|
| `src/locales/zh-chs.json` | 简体中文 | `"zh-CN"` |
| `src/locales/zh-cht.json` | 繁体中文 | `"zh-TW"` |
| `src/locales/en.json` | 英文 | `"en"` |
| `src/locales/ja.json` | 日文 | `"ja"` |

### 1.2 文件格式

- **编码**：UTF-8
- **格式**：标准 JSON（不允许尾逗号，不允许注释）
- **顶层结构**：

```json
{
  "_element": "zh-CN",
  "_name": "简体中文",
  "page": { ... }
}
```

- `_element`：对应 `element-ui/lib/locale/lang/` 的语言包文件名
- `_name`：语言切换下拉菜单中的显示名
- `page`：所有业务翻译的根节点，之下按模块层级嵌套

### 1.3 维护原则

- 中文和英文文件**必须保持 key 结构完全一致**，不允许一边有 key 而另一边没有
- 新增页面时**中英文同步添加**
- 每次新增后用 `node -e "JSON.parse(require('fs').readFileSync('src/locales/zh-chs.json','utf8'))"` 验证 JSON 合法性

---

## 2. Key 命名规范（三层层级）

### 2.1 核心规则

```
page.{一级模块英文} .{二级模块英文} .{三级模块英文} .{具体key}
     └─ snake_case ─┘└─ snake_case ─┘└─ snake_case ─┘
```

**英文来源**：[后台Webman界面截图对照表](./后台Webman界面截图对照表.md) 中的英文列。

**格式转换**：对照表英文 → 全小写 + 空格替换为下划线 + `&` 替换为下划线。

### 2.2 对照表 → i18n Key 映射表

| 对照表英文名 | snake_case（用于 i18n key） | kebab-case（用于目录名） |
|-------------|---------------------------|------------------------|
| System Administration | `system_administration` | `system-administration` |
| Production Master Data | `production_master_data` | `production-master-data` |
| Equipment Management | `equipment_management` | `equipment-management` |
| Planning & Production | `planning_production` | `planning-production` |
| Quality Management | `quality_management` | `quality-management` |
| Data Platform | `data_platform` | `data-platform` |
| Factory Model | `factory_model` | `factory-model` |
| Process Model | `process_model` | `process-model` |
| Product Management | `product_management` | `product-management` |
| Material Model | `material_model` | `material-model` |
| SPC Configuration | `spc_configuration` | `spc-configuration` |
| Team Model | `team_model` | `team-model` |
| User Management | `user_management` | `user-management` |
| Menu Management | `menu_management` | `menu-management` |
| System Utilities | `system_utilities` | `system-utilities` |
| System Monitoring | `system_monitoring` | `system-monitoring` |
| Batch Management | `batch_management` | `batch-management` |
| Production Monitoring | `production_monitoring` | `production-monitoring` |
| Process Control | `process_control` | `process-control` |
| Inspection Management | `inspection_management` | `inspection-management` |
| Traceability | `traceability` | `traceability` |
| Production Reports | `production_reports` | `production-reports` |
| Correlation Analysis | `correlation_analysis` | `correlation-analysis` |
| Factory Area | `factory_area` | `factory-area` |
| Production Line | `production_line` | `production-line` |

> **完整映射表**见本文档末尾附录 A。

### 2.3 完整示例

以「生产配置 → 工厂模型 → 工厂区域」页面为例：

```json
{
  "page": {
    "production_master_data": {
      "factory_model": {
        "factory_area": {
          "search": "查询",
          "reset": "重置",
          "code": "所区编码",
          "name": "所区名称",
          "add": "新 增",
          "edit": "编 辑",
          "delete": "删 除"
        }
      }
    }
  }
}
```

对应的 `i18nMixin` 前缀：

```js
mixins: [i18nMixin('page.production_master_data.factory_model.factory_area')]
```

---

## 3. 公共 Key 规范（page.common）

### 3.1 什么应该放公共

跨页面、跨模块重复出现的文案，提取到 `page.common` 下：

```json
{
  "page": {
    "common": {
      "help": "帮 助",
      "confirm": "确定",
      "cancel": "取消",
      "save": "保存",
      "delete": "删除",
      "edit": "编辑",
      "add": "新增",
      "search": "查询",
      "reset": "重置",
      "operation": "操作",
      "tip": "提示",
      "confirm_delete": "确定要执行该操作吗?",
      "operation_success": "操作成功",
      "no_data": "暂无数据",
      "loading": "加载中..."
    }
  }
}
```

### 3.2 已有公共 Key 清单

| key | 中文 | 英文 | 用途 |
|-----|------|------|------|
| `page.common.help` | 帮 助 | Help | 表格工具栏右侧帮助按钮 |

> 后续发现跨页面共用 key 时，持续往 `page.common` 中补充。

### 3.3 如何使用

```vue
<page-table :help-text="$t(ckey('help'))" />
```

`ckey('help')` → `'page.common.help'`，由 `i18nMixin` 自动注入。

### 3.4 判断标准：该不该放 common？

| 情况 | 放哪里 | 示例 |
|------|--------|------|
| 多个一级模块都出现 | `page.common` | 帮助、确定、取消 |
| 只在本模块内出现 | 模块自己的 key | 所区编码、产线编码 |
| 不确定 | 先放在模块内，等第二次出现时提取 | — |

---

## 4. 页面中如何使用（i18nMixin）

### 4.1 页面 Script 部分

```js
import { i18nMixin } from '@/composables/useI18n'

export default {
  mixins: [i18nMixin('page.production_master_data.factory_model.factory_area')],
  data () {
    return {
      // 传入完整 i18n key，不在此处翻译，由子组件内部 $t() 处理
      formCols: [
        [{ label: this.key('code'), placeholder: this.key('enter_code') }]
      ],
      rules: {
        code: [{ required: true, message: this.key('enter_code'), trigger: 'blur' }]
      }
    }
  },
  created () {
    this.columns = useTableColumns([
      { prop: 'code', label: this.key('code') }
    ])
  }
}
```

### 4.2 页面 Template 部分

```vue
<template>
  <!-- 当前页面翻译 -->
  <el-form-item :label="$t(key('code'))">
    <el-input :placeholder="$t(key('enter_code'))" />
  </el-form-item>
  <el-button>{{ $t(key('search')) }}</el-button>

  <!-- 公共翻译 -->
  <page-table :help-text="$t(ckey('help'))" />
</template>
```

### 4.3 data() 中传参的时机说明

`data()` 在 `created` 之前执行，此时 `this` 已经可用。因此：

- **column label / formCols / rules.message**：在 `data()` 中或 `created()` 中用 `this.key()` 传入完整 i18n key
- **翻译由子组件负责**：`page-table` 和 `page-dialog-form` 内部使用 `$t()` 翻译传入的 key，切换语言时自动响应更新
- **不要用 `k()` 提前翻译**：`k()` 将 key 翻译成静态字符串，语言切换后不会更新

---

## 5. 常见场景 Key 模板

### 5.1 标准 CRUD 页面（每个页面必有的 key）

```json
{
  "search": "查询",
  "reset": "重置",
  "add": "新 增",
  "edit": "编 辑",
  "delete": "删 除",
  "operation": "操作",
  "add_title": "新增{模块名}",
  "edit_title": "编辑{模块名}",
  "operation_success": "操作成功",
  "confirm_delete": "确定要执行该操作吗?",
  "enter_xxx": "请输入{字段名}",
  "select_xxx": "请选择{字段名}"
}
```

### 5.2 列表页字段 Key

```json
{
  "sort": "序号",
  "code": "{实体}编码",
  "name": "{实体}名称",
  "remark": "备注"
}
```

### 5.3 表单校验 Key

```json
{
  "enter_code": "请输入{实体}编码",
  "enter_name": "请输入{实体}名称",
  "remark_length": "长度在 1 到 100 个字符",
  "validation_fail": "校验失败"
}
```

### 5.4 登录页 Key

```json
{
  "username": "用户名",
  "password": "密码",
  "login": "登录",
  "please_enter_username": "请输入用户名",
  "please_enter_password": "请输入密码",
  "form_validation_failed": "表单校验失败，请检查"
}
```

---

## 6. 旧项目 Key 迁移对照

### 6.1 旧 Key 结构 vs 新 Key 结构

旧项目 key 路径深且命名不统一：

| 旧 key 前缀 | 新 key 前缀 |
|-----------|-----------|
| `page.system_settings.user_management.role` | `page.system_administration.user_management.role` |
| `page.system_settings.user_management.user` | `page.system_administration.user_management.user` |
| `page.system_settings.menu_configuration.menu` | `page.system_administration.menu_management.menu_configuration` |
| `page.system_settings.system_assistant.operate_log` | `page.system_administration.system_utilities.operation_logs` |
| `page.system_settings.system_monitoring.system.login` | `page.system_administration.system_monitoring.login` |
| `page.production_configuration.factory_model.factory_area` | `page.production_master_data.factory_model.factory_area` |
| `page.production_configuration.matetial_model.*` | `page.production_master_data.material_model.*` |
| `page.planning_production.production_batch_management.batch` | `page.planning_production.batch_management.batch_list` |
| `page.data_middleground.basic_traceability.*` | `page.data_platform.traceability.*` |
| `page.warehouse.*` | `page.warehouse.*`（待确定对照表英文名） |

### 6.2 搬迁时的操作步序

1. 确定页面对应的对照表三级模块英文名
2. 按 `page.{一级}.{二级}.{三级}` 组装新 key 前缀
3. 在 `zh-chs.json` 中按三层嵌套创建节点
4. 在 `en.json` 中创建相同结构
5. 将旧 key 的翻译值复制到新 key 下
6. 页面代码中 `i18nMixin` 参数改为新前缀
7. 模板中 `$t('旧key')` 全部改为 `$t(key('新suffix'))`

---

## 7. 翻译格式规范

### 7.1 中文规范

| 场景 | 格式 | 示例 |
|------|------|------|
| 按钮文字 | 字间加空格（两字不加） | `"查询"`、`"新 增"`、`"批量删除"` |
| 占位提示 | `请输入{名称}` | `"请输入所区编码"` |
| 校验消息 | 完整句，不加句号 | `"长度在 1 到 100 个字符"` |
| 提示弹框 | 加问号 | `"确定要执行该操作吗?"` |
| 操作成功消息 | 不加"成功"后缀的冗余 | `"操作成功"`（而非"保存成功"、"编辑成功"各自定义） |

### 7.2 英文规范

| 场景 | 格式 | 示例 |
|------|------|------|
| 按钮文字 | 首字母大写 | `"Search"`、`"Add"`、`"Edit"` |
| 占位提示 | `Please enter {name}` | `"Please enter area code"` |
| 校验消息 | 完整句 | `"Length should be 1 to 100 characters"` |
| 提示弹框 | 问句 | `"Are you sure to delete?"` |
| 操作成功消息 | 过去式或名词 | `"Operation succeeded"` |

### 7.3 占位符

使用 `{name}` 格式，不使用 `%s` / `{0}`：

```json
"please_enter": "请输入{name}"
```

```js
this.$t('please_enter', { name: '所区编码' })
// → "请输入所区编码"
```

---

## 8. 新增页面 Checklist

新增一个 CRUD 页面时，按以下顺序操作：

- [ ] 1. 在 [后台Webman界面截图对照表](./后台Webman界面截图对照表.md) 中找到该页面的三级英文名
- [ ] 2. 确定 i18n key 前缀：`page.{一级snake_case}.{二级snake_case}.{三级snake_case}`
- [ ] 3. 在 `zh-chs.json` 的对应节点下添加本页面全部 key
- [ ] 4. 在 `en.json` 的相同节点下添加对应英文翻译
- [ ] 5. 验证 JSON 合法性：`node -e "JSON.parse(require('fs').readFileSync('src/locales/zh-chs.json','utf8'))"`
- [ ] 6. 页面中使用 `mixins: [i18nMixin('key前缀')]`
- [ ] 7. 模板中用 `$t(key('xxx'))` 替代硬编码文字
- [ ] 8. data() 中用 `this.key('xxx')` 传入完整 i18n key（不用 `k()` 提前翻译）
- [ ] 9. 公共文案（帮助、确定、取消等）用 `ckey('xxx')` 引用
- [ ] 10. `pnpm lint` 无报错

---

## 附录 A：对照表 → i18n Key 完整映射

### 一级模块

| 对照表英文 | snake_case（i18n） | kebab-case（目录） |
|-----------|-------------------|-------------------|
| System Administration | `system_administration` | `system-administration` |
| Production Master Data | `production_master_data` | `production-master-data` |
| Equipment Management | `equipment_management` | `equipment-management` |
| Planning & Production | `planning_production` | `planning-production` |
| Quality Management | `quality_management` | `quality-management` |
| Data Platform | `data_platform` | `data-platform` |
| Warehouse | `warehouse` | `warehouse` |
| SCADA Management | `scada_management` | `scada-management` |

### 生产配置 → 二级模块

| 二级（对照表） | snake_case | 三级页面数 |
|---------------|-----------|:--:|
| Factory Model | `factory_model` | 2 |
| Process Model | `process_model` | 3 |
| Product Management | `product_management` | 2 |
| Material Model | `material_model` | 4 |
| SPC Configuration | `spc_configuration` | 1 |
| Team Model | `team_model` | 3 |

### 设备模型 → 二级模块

| 二级（对照表） | snake_case |
|---------------|-----------|
| Equipment Category | `equipment_category` |
| Equipment Management | `equipment_management` |
| Inspection Management | `inspection_management` |
| Maintenance Management | `maintenance_management` |
| Repair Management | `repair_management` |
| Consumables Management | `consumables_management` |

### 系统设置 → 二级/三级

| 二级（对照表） | snake_case | 三级 snake_case |
|---------------|-----------|----------------|
| User Management | `user_management` | `role` / `user` |
| Menu Management | `menu_management` | `menu_configuration` |
| System Utilities | `system_utilities` | `operation_logs` / `api_logs` |
| System Monitoring | `system_monitoring` | `monitoring_configuration` |
| Organization | `organization` | `production_team_manage` / `production_shift_management` / `production_shift_calender` |
| OCR | `ocr` | `config` / `log` |

---

## 附录 B：当前已实施页面

| 页面 | i18nMixin 前缀 | 语言包节点 |
|------|---------------|----------|
| 工厂区域 | `page.production_master_data.factory_model.factory_area` | `zh-chs.json` / `en.json` ✅ |
