407 lines
9.3 KiB
Markdown
407 lines
9.3 KiB
Markdown
# API 文档:前端国际化-动态资源
|
||
|
||
## 元数据
|
||
- **需求编号**:2026-01-26-002-03
|
||
- **需求名称**:前端国际化-动态资源
|
||
- **创建时间**:2026-01-26
|
||
- **创建人**:SSOT 架构师
|
||
- **状态**:已完成
|
||
|
||
## API 概述
|
||
本文档描述了前端国际化-动态资源功能涉及的 API 接口,包括查询语言列表、获取当前语言偏好、更新用户语言偏好、查询国际化资源列表等接口。这些接口用于实现前端与后端国际化接口的深度对接,包括动态获取系统支持的语言列表、登录后自动同步并应用用户的语言偏好、实现远程翻译资源的加载、合并与缓存策略,以及实现动态菜单国际化。
|
||
|
||
## 接口列表
|
||
|
||
### 接口 1:查询语言列表
|
||
|
||
#### 功能描述
|
||
查询系统支持的语言列表,用于动态生成语言选择器的下拉选项。
|
||
|
||
#### 请求方式
|
||
GET
|
||
|
||
#### 请求路径
|
||
`/system/language/list`
|
||
|
||
#### 请求参数
|
||
|
||
| 参数名 | 类型 | 必填 | 说明 |
|
||
|--------|------|------|------|
|
||
| pageNum | Number | 否 | 页码,默认 1 |
|
||
| pageSize | Number | 否 | 每页条数,默认 10 |
|
||
| langCode | String | 否 | 语言代码(后端格式,如 zh_CN) |
|
||
| langName | String | 否 | 语言名称(如 简体中文) |
|
||
| status | String | 否 | 状态(0 正常,1 停用) |
|
||
|
||
#### 响应参数
|
||
|
||
| 参数名 | 类型 | 说明 |
|
||
|--------|------|------|
|
||
| code | Number | 状态码(200 成功,其他失败) |
|
||
| msg | String | 提示信息 |
|
||
| rows | Array | 语言列表数据 |
|
||
| rows[].id | Number | 语言 ID |
|
||
| rows[].langCode | String | 语言代码(后端格式,如 zh_CN) |
|
||
| rows[].langName | String | 语言名称(如 简体中文) |
|
||
| rows[].status | String | 状态(0 正常,1 停用) |
|
||
| rows[].createTime | String | 创建时间 |
|
||
| rows[].updateTime | String | 更新时间 |
|
||
| total | Number | 总记录数 |
|
||
|
||
#### 成功示例
|
||
|
||
```json
|
||
{
|
||
"code": 200,
|
||
"msg": "查询成功",
|
||
"rows": [
|
||
{
|
||
"id": 1,
|
||
"langCode": "zh_CN",
|
||
"langName": "简体中文",
|
||
"status": "0",
|
||
"createTime": "2026-01-26 10:00:00",
|
||
"updateTime": "2026-01-26 10:00:00"
|
||
},
|
||
{
|
||
"id": 2,
|
||
"langCode": "en_US",
|
||
"langName": "English",
|
||
"status": "0",
|
||
"createTime": "2026-01-26 10:00:00",
|
||
"updateTime": "2026-01-26 10:00:00"
|
||
}
|
||
],
|
||
"total": 2
|
||
}
|
||
```
|
||
|
||
#### 失败示例
|
||
|
||
```json
|
||
{
|
||
"code": 500,
|
||
"msg": "查询失败"
|
||
}
|
||
```
|
||
|
||
#### 错误码
|
||
|
||
| 错误码 | 说明 |
|
||
|--------|------|
|
||
| 500 | 查询失败 |
|
||
|
||
---
|
||
|
||
### 接口 2:获取当前语言偏好
|
||
|
||
#### 功能描述
|
||
获取当前登录用户的语言偏好,用于登录后自动同步并应用用户的语言偏好。
|
||
|
||
#### 请求方式
|
||
GET
|
||
|
||
#### 请求路径
|
||
`/system/i18n/currentLocale`
|
||
|
||
#### 请求参数
|
||
无
|
||
|
||
#### 响应参数
|
||
|
||
| 参数名 | 类型 | 说明 |
|
||
|--------|------|------|
|
||
| code | Number | 状态码(200 成功,其他失败) |
|
||
| msg | String | 提示信息 |
|
||
| data | Object | 语言偏好数据 |
|
||
| data.langCode | String | 语言代码(后端格式,如 zh_CN) |
|
||
|
||
#### 成功示例
|
||
|
||
```json
|
||
{
|
||
"code": 200,
|
||
"msg": "查询成功",
|
||
"data": {
|
||
"langCode": "zh_CN"
|
||
}
|
||
}
|
||
```
|
||
|
||
#### 失败示例
|
||
|
||
```json
|
||
{
|
||
"code": 500,
|
||
"msg": "查询失败"
|
||
}
|
||
```
|
||
|
||
#### 错误码
|
||
|
||
| 错误码 | 说明 |
|
||
|--------|------|
|
||
| 401 | 用户未登录 |
|
||
| 500 | 查询失败 |
|
||
|
||
---
|
||
|
||
### 接口 3:更新用户语言偏好
|
||
|
||
#### 功能描述
|
||
更新当前登录用户的语言偏好,用于用户切换语言时同步到后端。
|
||
|
||
#### 请求方式
|
||
PUT
|
||
|
||
#### 请求路径
|
||
`/system/i18n/updateLocale`
|
||
|
||
#### 请求参数
|
||
|
||
| 参数名 | 类型 | 必填 | 说明 |
|
||
|--------|------|------|------|
|
||
| langCode | String | 是 | 语言代码(后端格式,如 zh_CN) |
|
||
|
||
#### 请求示例
|
||
|
||
```json
|
||
{
|
||
"langCode": "zh_CN"
|
||
}
|
||
```
|
||
|
||
#### 响应参数
|
||
|
||
| 参数名 | 类型 | 说明 |
|
||
|--------|------|------|
|
||
| code | Number | 状态码(200 成功,其他失败) |
|
||
| msg | String | 提示信息 |
|
||
|
||
#### 成功示例
|
||
|
||
```json
|
||
{
|
||
"code": 200,
|
||
"msg": "更新成功"
|
||
}
|
||
```
|
||
|
||
#### 失败示例
|
||
|
||
```json
|
||
{
|
||
"code": 500,
|
||
"msg": "更新失败"
|
||
}
|
||
```
|
||
|
||
#### 错误码
|
||
|
||
| 错误码 | 说明 |
|
||
|--------|------|
|
||
| 401 | 用户未登录 |
|
||
| 500 | 更新失败 |
|
||
|
||
---
|
||
|
||
### 接口 4:查询国际化资源列表
|
||
|
||
#### 功能描述
|
||
查询指定语言的国际化资源列表,用于远程加载翻译资源。
|
||
|
||
#### 请求方式
|
||
GET
|
||
|
||
#### 请求路径
|
||
`/system/i18nresource/list`
|
||
|
||
#### 请求参数
|
||
|
||
| 参数名 | 类型 | 必填 | 说明 |
|
||
|--------|------|------|------|
|
||
| pageNum | Number | 否 | 页码,默认 1 |
|
||
| pageSize | Number | 否 | 每页条数,默认 10 |
|
||
| langCode | String | 否 | 语言代码(后端格式,如 zh_CN) |
|
||
| moduleName | String | 否 | 模块名称(如 common、layout、login) |
|
||
| resourceKey | String | 否 | 资源键(如 login.button.login) |
|
||
| resourceValue | String | 否 | 资源值(如 登录) |
|
||
|
||
#### 响应参数
|
||
|
||
| 参数名 | 类型 | 说明 |
|
||
|--------|------|------|
|
||
| code | Number | 状态码(200 成功,其他失败) |
|
||
| msg | String | 提示信息 |
|
||
| rows | Array | 国际化资源列表数据 |
|
||
| rows[].id | Number | 资源 ID |
|
||
| rows[].langCode | String | 语言代码(后端格式,如 zh_CN) |
|
||
| rows[].moduleName | String | 模块名称(如 common、layout、login) |
|
||
| rows[].resourceKey | String | 资源键(如 login.button.login) |
|
||
| rows[].resourceValue | String | 资源值(如 登录) |
|
||
| rows[].createTime | String | 创建时间 |
|
||
| rows[].updateTime | String | 更新时间 |
|
||
| total | Number | 总记录数 |
|
||
|
||
#### 成功示例
|
||
|
||
```json
|
||
{
|
||
"code": 200,
|
||
"msg": "查询成功",
|
||
"rows": [
|
||
{
|
||
"id": 1,
|
||
"langCode": "zh_CN",
|
||
"moduleName": "common",
|
||
"resourceKey": "common.ok",
|
||
"resourceValue": "确定",
|
||
"createTime": "2026-01-26 10:00:00",
|
||
"updateTime": "2026-01-26 10:00:00"
|
||
},
|
||
{
|
||
"id": 2,
|
||
"langCode": "zh_CN",
|
||
"moduleName": "login",
|
||
"resourceKey": "login.button.login",
|
||
"resourceValue": "登录",
|
||
"createTime": "2026-01-26 10:00:00",
|
||
"updateTime": "2026-01-26 10:00:00"
|
||
}
|
||
],
|
||
"total": 2
|
||
}
|
||
```
|
||
|
||
#### 失败示例
|
||
|
||
```json
|
||
{
|
||
"code": 500,
|
||
"msg": "查询失败"
|
||
}
|
||
```
|
||
|
||
#### 错误码
|
||
|
||
| 错误码 | 说明 |
|
||
|--------|------|
|
||
| 500 | 查询失败 |
|
||
|
||
---
|
||
|
||
## 错误码汇总
|
||
|
||
| 错误码 | 说明 | 处理建议 |
|
||
|--------|------|----------|
|
||
| 200 | 操作成功 | 无 |
|
||
| 401 | 用户未登录 | 跳转到登录页面 |
|
||
| 500 | 操作失败 | 显示错误提示,联系管理员 |
|
||
|
||
## 使用示例
|
||
|
||
### 示例 1:动态获取语言列表
|
||
|
||
```javascript
|
||
import { listLanguage } from '@/api/system/language'
|
||
|
||
async function loadLanguageList() {
|
||
try {
|
||
const response = await listLanguage({ status: '0' })
|
||
const languageOptions = response.rows
|
||
.filter(item => item.status === '0')
|
||
.map(item => ({
|
||
label: item.langName,
|
||
value: item.langCode.replace('_', '-')
|
||
}))
|
||
console.log('语言列表:', languageOptions)
|
||
} catch (error) {
|
||
console.error('加载语言列表失败:', error)
|
||
}
|
||
}
|
||
```
|
||
|
||
### 示例 2:获取用户语言偏好
|
||
|
||
```javascript
|
||
import { getCurrentLocale } from '@/api/system/language'
|
||
import { toFrontend } from '@/utils/langFormat'
|
||
|
||
async function syncUserLanguagePreference() {
|
||
try {
|
||
const response = await getCurrentLocale()
|
||
const remoteLang = toFrontend(response.data.langCode)
|
||
console.log('用户语言偏好:', remoteLang)
|
||
// 应用用户语言偏好
|
||
appStore.setLanguage(remoteLang)
|
||
} catch (error) {
|
||
console.error('获取用户语言偏好失败:', error)
|
||
}
|
||
}
|
||
```
|
||
|
||
### 示例 3:更新用户语言偏好
|
||
|
||
```javascript
|
||
import { updateLocale } from '@/api/system/language'
|
||
import { toBackend } from '@/utils/langFormat'
|
||
|
||
async function updateUserLanguagePreference(lang) {
|
||
try {
|
||
await updateLocale({ langCode: toBackend(lang) })
|
||
console.log('更新用户语言偏好成功')
|
||
} catch (error) {
|
||
console.error('更新用户语言偏好失败:', error)
|
||
}
|
||
}
|
||
```
|
||
|
||
### 示例 4:加载远程翻译资源
|
||
|
||
```javascript
|
||
import { listI18nResource } from '@/api/system/language'
|
||
|
||
async function loadRemoteMessages(lang) {
|
||
try {
|
||
const response = await listI18nResource({
|
||
pageNum: 1,
|
||
pageSize: 9999,
|
||
langCode: lang
|
||
})
|
||
const messages = transformToNestedObject(response.rows)
|
||
console.log('远程翻译资源:', messages)
|
||
return messages
|
||
} catch (error) {
|
||
console.error('加载远程翻译资源失败:', error)
|
||
return {}
|
||
}
|
||
}
|
||
|
||
function transformToNestedObject(rows) {
|
||
const result = {}
|
||
rows.forEach(row => {
|
||
const keys = row.resourceKey.split('.')
|
||
let current = result
|
||
keys.forEach((key, index) => {
|
||
if (index === keys.length - 1) {
|
||
current[key] = row.resourceValue
|
||
} else {
|
||
if (!current[key]) {
|
||
current[key] = {}
|
||
}
|
||
current = current[key]
|
||
}
|
||
})
|
||
})
|
||
return result
|
||
}
|
||
```
|
||
|
||
## 相关文档
|
||
- [需求文档](../requirements/2026-01-26-002-03-前端国际化-动态资源.md)
|
||
- [设计文档](../design/2026-01-26-002-03-前端国际化-动态资源-设计.md)
|
||
- [决策记录](../decisions/2026-01-26-002-03-ADR-前端国际化-动态资源实现策略决策.md)
|
||
- [提示词文档](../prompts/2026-01-26-002-03-prompt-前端国际化-动态资源.md)
|
||
- [变更日志](../changelog/2026-01-26-002-03-changelog.md)
|
||
- [复盘文档](../retros/2026-01-26-002-03-retro.md)
|