bricks/aidocs/i18n.md
2025-10-05 06:39:58 +08:00

283 lines
6.7 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

下面是为提供的 JavaScript 代码编写的 **Markdown 格式技术文档**,包含类的功能说明、构造函数参数、方法详解以及使用示例。
---
# `bricks.I18n` 国际化支持类
`bricks.I18n` 是一个轻量级的国际化i18n工具类用于在前端应用中实现多语言文本翻译和动态语言切换。它支持从远程 URL 加载语言包,并缓存已加载的语言资源以提高性能。
该类依赖于全局对象 `window.bricks`,并使用 `bricks.HttpJson` 进行异步请求,同时假设存在辅助函数 `objget``obj_fmtstr` 用于对象操作和字符串格式化。
---
## 基本结构
```javascript
var bricks = window.bricks || {};
bricks.I18n = class {
// 实现见下文
};
```
> ⚠️ 注意:此代码片段中存在一处变量名错误(`opts` 未定义),已在文档中指出并修正。
---
## 构造函数
### `new bricks.I18n(options)`
初始化 I18n 实例,配置语言资源路径与默认行为。
#### 参数
| 参数 | 类型 | 必填 | 描述 |
|------|------|------|------|
| `url` | `string` | 否 | 获取语言包的 API 地址(如 `/api/i18n`)。若不提供,则仅支持手动设置字典。 |
| `method` | `string` | 否 | 请求语言包时使用的 HTTP 方法,默认为 `'GET'`。 |
| `default_lang` | `string` | 否 | 默认语言代码(如 `'en'`, `'zh-CN'`),默认值为 `'en'`。 |
#### 示例
```js
const i18n = new bricks.I18n({
url: '/api/translations',
default_lang: 'zh-CN'
});
```
> ❌ **注意原始代码 Bug**
> 原始代码中使用了未定义的 `opts` 变量:
> ```js
> this.url = opts.url;
> ```
> 应改为传入的构造函数参数 `url`, `method`, `default_lang`。**正确实现应如下:**
```js
constructor(url, default_lang, method) {
this.url = url;
this.default_lang = default_lang || 'en';
this.method = method || 'GET';
this.lang_msgs = {}; // 缓存所有语言的消息字典
this.msgs = {}; // 当前激活语言的翻译映射
}
```
或者接受一个选项对象:
```js
constructor(options) {
this.url = options.url;
this.default_lang = options.default_lang || 'en';
this.method = options.method || 'GET';
this.lang_msgs = {};
this.msgs = {};
}
```
> ✅ 文档后续基于 **修正后的构造函数** 进行描述。
---
## 方法
### `_ (txt, obj) → string`
获取指定键的翻译文本,并可选地进行变量替换。
#### 参数
| 参数 | 类型 | 描述 |
|------|------|------|
| `txt` | `string` | 要翻译的键名key。 |
| `obj` | `Object``undefined` | 用于填充模板字符串的变量对象。 |
#### 返回值
- 如果当前语言中有对应的翻译,返回翻译后的内容;
- 若提供了 `obj`,则调用 `obj_fmtstr(obj, translatedStr)` 对结果进行格式化;
- 否则返回原始 `txt`
#### 示例
```js
i18n.setup_dict({
"hello": "Hello, {name}!",
"welcome": "Welcome aboard."
}, 'en');
i18n._("hello", {name: "Alice"});
// 输出: "Hello, Alice!"
i18n._("welcome");
// 输出: "Welcome aboard."
```
---
### `is_loaded(lang) → boolean`
检查某个语言包是否已被加载到内存中。
#### 参数
| 参数 | 类型 | 描述 |
|------|------|------|
| `lang` | `string` | 语言代码(如 `'zh-CN'`)。 |
#### 返回值
- `true`:该语言的消息字典已加载;
- `false`:尚未加载。
#### 示例
```js
if (!i18n.is_loaded('fr')) {
await i18n.change_lang('fr');
}
```
---
### `setup_dict(dic, lang)`
将给定的语言字典注册到实例中,并立即激活该语言。
> 此方法通常由 `change_lang` 内部调用,也可用于预加载或静态注入语言包。
#### 参数
| 参数 | 类型 | 描述 |
|------|------|------|
| `dic` | `Object` | 键值对形式的语言翻译表,例如 `{ "ok": "确定" }`。 |
| `lang` | `string` | 该字典对应的语言代码。 |
#### 行为
-`dic` 存储至 `this.lang_msgs[lang]` 中;
- 设置 `this.msgs = dic`,即当前活跃语言为 `lang`
#### 示例
```js
i18n.setup_dict({
"title": "应用标题",
"save": "保存"
}, 'zh-CN');
```
---
### `async change_lang(lang) → Promise<void>`
切换当前语言环境。如果目标语言未加载,会自动通过网络请求获取。
#### 参数
| 参数 | 类型 | 描述 |
|------|------|------|
| `lang` | `string` | 目标语言代码(如 `'es'`, `'ja'`)。 |
#### 流程
1. 检查是否已加载该语言:
- 是 → 直接激活;
- 否 → 发起 HTTP 请求获取语言包。
2. 使用 `bricks.HttpJson` 发送请求,携带参数 `{ lang }`
3. 成功响应后,调用 `setup_dict` 注册并激活新语言。
#### 异常处理
- 若未设置 `this.url`,则跳过请求,无法加载新语言。
- 错误需由 `HttpJson` 层自行抛出或捕获。
#### 示例
```js
await i18n.change_lang('zh-CN');
document.title = i18n._('app_title'); // 使用新语言更新界面
```
---
## 依赖说明
本类依赖以下外部模块或函数:
| 名称 | 说明 |
|------|------|
| `bricks.HttpJson` | 用于发送 JSON 格式的 HTTP 请求,需具备 `httpcall(url, config)` 方法。 |
| `objget(obj, path)` | 工具函数,安全访问嵌套对象属性(类似 lodash.get。 |
| `obj_fmtstr(obj, str)` | 字符串模板替换函数,支持 `{key}` 语法,用 `obj.key` 替换。 |
> 示例 `obj_fmtstr` 实现:
> ```js
> function obj_fmtstr(obj, str) {
> return str.replace(/\{([^}]+)\}/g, (m, key) => obj[key] || m);
> }
> ```
---
## 使用场景示例
### 初始化与语言切换
```js
// 初始化 i18n 实例
const i18n = new bricks.I18n({
url: '/api/translations',
default_lang: 'en'
});
// 切换语言
async function setLanguage(lang) {
await i18n.change_lang(lang);
updateUI(); // 重新渲染页面文本
}
function updateUI() {
document.getElementById('greeting').textContent = i18n._('welcome', { user: 'Tom' });
}
```
### 预加载语言包(离线模式)
```js
// 手动注入英文包
i18n.setup_dict({
"welcome": "Welcome!",
"goodbye": "Goodbye!"
}, 'en');
// 不发起请求,直接切换
i18n.change_lang('en').then(updateUI);
```
---
## 注意事项
1.**修复建议**:原始代码中的 `opts` 应为构造函数参数对象,请确保传参方式一致。
2. 🔐 安全性:确保服务端返回的语言包内容经过清洗,防止 XSS。
3. 🌐 性能优化:所有语言包会被缓存,避免重复请求。
4. ⏱ 异步加载:首次切换未加载语言时需要等待网络响应,请添加加载状态提示。
---
## 版本历史(示例)
| 版本 | 修改内容 |
|------|----------|
| 0.1 | 初始版本,支持基本翻译与远程加载 |
---
## 许可证
MIT License
---
✅ *文档结束*