datai-vue/docs/api-docs/2026-01-26-002-03-api.md

407 lines
9.3 KiB
Markdown
Raw Permalink Normal View History

# 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)