502 lines
14 KiB
Markdown
502 lines
14 KiB
Markdown
# 多语言支持系统文档
|
||
|
||
<cite>
|
||
**本文档中引用的文件**
|
||
- [config.json](file://assets/resources/config.json)
|
||
- [en.json](file://assets/resources/language/json/en.json)
|
||
- [zh.json](file://assets/resources/language/json/zh.json)
|
||
- [Initialize.ts](file://assets/script/game/initialize/Initialize.ts)
|
||
- [LoadingViewComp.ts](file://assets/script/game/initialize/view/LoadingViewComp.ts)
|
||
- [HInfoComp.ts](file://assets/script/game/map/HInfoComp.ts)
|
||
- [SIconComp.ts](file://assets/script/game/map/SIconComp.ts)
|
||
- [ViewModelScript.md](file://doc/mvvm/ViewModelScript.md)
|
||
- [VMCustom.md](file://doc/mvvm/VMCustom.md)
|
||
</cite>
|
||
|
||
## 目录
|
||
1. [概述](#概述)
|
||
2. [项目结构](#项目结构)
|
||
3. [JSON结构设计原则](#json结构设计原则)
|
||
4. [配置系统](#配置系统)
|
||
5. [语言包加载机制](#语言包加载机制)
|
||
6. [运行时语言切换](#运行时语言切换)
|
||
7. [MVVM框架集成](#mvvm框架集成)
|
||
8. [UI组件国际化](#ui组件国际化)
|
||
9. [性能优化策略](#性能优化策略)
|
||
10. [扩展指南](#扩展指南)
|
||
11. [故障排除](#故障排除)
|
||
12. [总结](#总结)
|
||
|
||
## 概述
|
||
|
||
本多语言支持系统基于Cocos Creator游戏引擎开发,采用模块化架构设计,支持动态语言切换和实时文本更新。系统通过JSON语言包文件、配置管理系统和MVVM框架的深度集成,实现了高效的语言资源管理和用户体验优化。
|
||
|
||
### 核心特性
|
||
|
||
- **动态语言切换**:支持运行时无缝切换语言类型
|
||
- **JSON结构化存储**:标准化的语言键值对管理
|
||
- **MVVM数据绑定**:自动化的UI文本更新机制
|
||
- **性能优化**:智能缓存和预加载策略
|
||
- **扩展性强**:易于添加新语言类型
|
||
|
||
## 项目结构
|
||
|
||
多语言系统的核心文件组织结构如下:
|
||
|
||
```mermaid
|
||
graph TB
|
||
subgraph "资源配置"
|
||
Config[config.json]
|
||
LangConfig[语言配置]
|
||
end
|
||
subgraph "语言包文件"
|
||
EnJSON[en.json<br/>英文语言包]
|
||
ZhJSON[zh.json<br/>中文语言包]
|
||
end
|
||
subgraph "初始化模块"
|
||
Init[Initialize.ts<br/>游戏初始化]
|
||
LoadView[LoadingViewComp.ts<br/>加载界面]
|
||
end
|
||
subgraph "UI组件"
|
||
HInfo[HInfoComp.ts<br/>英雄信息组件]
|
||
SIcon[SIconComp.ts<br/>技能图标组件]
|
||
end
|
||
subgraph "MVVM框架"
|
||
VM[ViewModel系统]
|
||
VMCustom[VMCustom组件]
|
||
end
|
||
Config --> Init
|
||
EnJSON --> Init
|
||
ZhJSON --> Init
|
||
Init --> LoadView
|
||
LoadView --> HInfo
|
||
LoadView --> SIcon
|
||
VM --> VMCustom
|
||
VMCustom --> HInfo
|
||
VMCustom --> SIcon
|
||
```
|
||
|
||
**图表来源**
|
||
- [config.json](file://assets/resources/config.json#L1-L21)
|
||
- [Initialize.ts](file://assets/script/game/initialize/Initialize.ts#L1-L105)
|
||
|
||
**章节来源**
|
||
- [config.json](file://assets/resources/config.json#L1-L21)
|
||
- [Initialize.ts](file://assets/script/game/initialize/Initialize.ts#L1-L105)
|
||
|
||
## JSON结构设计原则
|
||
|
||
### 键值命名规范
|
||
|
||
语言包采用层次化命名结构,确保键值的可读性和维护性:
|
||
|
||
| 命名规则 | 示例 | 说明 |
|
||
|---------|------|------|
|
||
| 功能模块前缀 | `common_prompt_ok` | 明确功能归属 |
|
||
| 功能类型标识 | `btn_` | 按钮类文本 |
|
||
| 功能用途标识 | `loading_` | 加载相关文本 |
|
||
| 文本内容描述 | `_title_sys` | 具体用途说明 |
|
||
|
||
### 结构层次设计
|
||
|
||
```mermaid
|
||
graph LR
|
||
subgraph "语言包结构"
|
||
Root[根对象]
|
||
Common[通用提示<br/>common_prompt_*]
|
||
Button[按钮文本<br/>btn_*]
|
||
Loading[加载文本<br/>loading_*]
|
||
Role[角色属性<br/>role_*]
|
||
end
|
||
Root --> Common
|
||
Root --> Button
|
||
Root --> Loading
|
||
Root --> Role
|
||
```
|
||
|
||
**图表来源**
|
||
- [en.json](file://assets/resources/language/json/en.json#L1-L24)
|
||
- [zh.json](file://assets/resources/language/json/zh.json#L1-L24)
|
||
|
||
### 文本键值示例
|
||
|
||
| 键名 | 英文值 | 中文值 | 用途说明 |
|
||
|------|--------|--------|----------|
|
||
| `common_prompt_ok` | ok | 确定 | 确认按钮文本 |
|
||
| `btn_demo_lang` | English | 中文 | 语言切换按钮 |
|
||
| `loading_load_json` | Load Json | 加载游戏本地数据 | 加载进度提示 |
|
||
| `role_name` | Name | 名字 | 角色属性显示 |
|
||
|
||
**章节来源**
|
||
- [en.json](file://assets/resources/language/json/en.json#L1-L24)
|
||
- [zh.json](file://assets/resources/language/json/zh.json#L1-L24)
|
||
|
||
## 配置系统
|
||
|
||
### 配置文件结构
|
||
|
||
系统配置通过`config.json`文件管理,包含语言相关的完整配置:
|
||
|
||
```mermaid
|
||
graph TB
|
||
subgraph "配置结构"
|
||
Config[config对象]
|
||
Language[language对象]
|
||
subgraph "语言配置"
|
||
Type[type数组<br/>支持的语言类型]
|
||
Path[path对象<br/>资源路径配置]
|
||
end
|
||
subgraph "路径配置"
|
||
JsonPath[json: language/json<br/>JSON文件路径]
|
||
TexturePath[texture: language/texture<br/>纹理资源路径]
|
||
end
|
||
end
|
||
Config --> Language
|
||
Language --> Type
|
||
Language --> Path
|
||
Path --> JsonPath
|
||
Path --> TexturePath
|
||
```
|
||
|
||
**图表来源**
|
||
- [config.json](file://assets/resources/config.json#L10-L21)
|
||
|
||
### 配置参数说明
|
||
|
||
| 参数名 | 类型 | 默认值 | 说明 |
|
||
|--------|------|--------|------|
|
||
| `type` | Array | `["zh", "en"]` | 支持的语言类型列表 |
|
||
| `json` | String | `"language/json"` | JSON语言包存放路径 |
|
||
| `texture` | String | `"language/texture"` | 图形资源存放路径 |
|
||
|
||
**章节来源**
|
||
- [config.json](file://assets/resources/config.json#L10-L21)
|
||
|
||
## 语言包加载机制
|
||
|
||
### 初始化加载流程
|
||
|
||
系统在游戏启动时自动加载语言包,采用异步队列管理模式:
|
||
|
||
```mermaid
|
||
sequenceDiagram
|
||
participant Game as 游戏启动
|
||
participant Init as Initialize
|
||
participant Storage as 存储系统
|
||
participant Language as 语言模块
|
||
participant Resource as 资源加载器
|
||
Game->>Init : 启动初始化
|
||
Init->>Storage : 获取语言设置
|
||
Storage-->>Init : 返回语言类型
|
||
Init->>Language : setLanguage(语言类型)
|
||
Language->>Resource : 加载语言包JSON
|
||
Resource-->>Language : JSON数据
|
||
Language->>Resource : 加载字体资源
|
||
Resource-->>Language : 字体数据
|
||
Language-->>Init : 加载完成
|
||
Init->>Game : 继续启动流程
|
||
```
|
||
|
||
**图表来源**
|
||
- [Initialize.ts](file://assets/script/game/initialize/Initialize.ts#L50-L75)
|
||
|
||
### 资源路径解析
|
||
|
||
系统通过配置文件解析语言资源路径:
|
||
|
||
```mermaid
|
||
flowchart TD
|
||
Start([开始加载]) --> GetLang[获取当前语言类型]
|
||
GetLang --> CheckDefault{语言设置为空?}
|
||
CheckDefault --> |是| SetZh[设置默认为zh]
|
||
CheckDefault --> |否| LoadLang[加载语言包]
|
||
SetZh --> SaveLang[保存语言设置]
|
||
SaveLang --> LoadLang
|
||
LoadLang --> LoadJSON[加载JSON语言包]
|
||
LoadJSON --> LoadFont[加载对应字体]
|
||
LoadFont --> Complete[加载完成]
|
||
```
|
||
|
||
**图表来源**
|
||
- [Initialize.ts](file://assets/script/game/initialize/Initialize.ts#L50-L75)
|
||
|
||
**章节来源**
|
||
- [Initialize.ts](file://assets/script/game/initialize/Initialize.ts#L50-L75)
|
||
|
||
## 运行时语言切换
|
||
|
||
### 切换机制实现
|
||
|
||
系统支持运行时动态切换语言,通过存储系统持久化用户偏好:
|
||
|
||
```mermaid
|
||
sequenceDiagram
|
||
participant User as 用户操作
|
||
participant UI as UI界面
|
||
participant Storage as 存储系统
|
||
participant Language as 语言模块
|
||
participant VM as MVVM框架
|
||
User->>UI : 选择语言
|
||
UI->>Storage : 保存语言设置
|
||
Storage->>Language : setLanguage(新语言)
|
||
Language->>Language : 加载新语言包
|
||
Language->>VM : 触发UI更新
|
||
VM->>UI : 更新所有绑定文本
|
||
UI-->>User : 显示新语言界面
|
||
```
|
||
|
||
**图表来源**
|
||
- [Initialize.ts](file://assets/script/game/initialize/Initialize.ts#L50-L75)
|
||
|
||
### 语言切换流程
|
||
|
||
| 步骤 | 操作 | 说明 |
|
||
|------|------|------|
|
||
| 1 | 获取当前设置 | 从存储中读取用户语言偏好 |
|
||
| 2 | 验证语言类型 | 确保语言类型在支持列表中 |
|
||
| 3 | 加载语言包 | 异步加载对应JSON文件 |
|
||
| 4 | 更新字体资源 | 加载对应语言的字体文件 |
|
||
| 5 | 触发UI更新 | 通过MVVM框架更新所有文本 |
|
||
|
||
**章节来源**
|
||
- [Initialize.ts](file://assets/script/game/initialize/Initialize.ts#L50-L75)
|
||
|
||
## MVVM框架集成
|
||
|
||
### ViewModel绑定机制
|
||
|
||
系统通过MVVM框架实现数据与视图的自动绑定:
|
||
|
||
```mermaid
|
||
classDiagram
|
||
class VMCustom {
|
||
+string watchPath
|
||
+string componentName
|
||
+string componentProperty
|
||
+boolean controller
|
||
+onValueChanged(newValue, oldValue)
|
||
+onValueInit()
|
||
}
|
||
class VMBase {
|
||
+string[] watchPathArr
|
||
+boolean templateMode
|
||
+any templateValueArr
|
||
+ViewModel VM
|
||
+onLoad()
|
||
+onEnable()
|
||
+onDisable()
|
||
}
|
||
class HInfoComp {
|
||
+Label name_node
|
||
+Label type_node
|
||
+Label ap_node
|
||
+Label hp_node
|
||
+update_data(uuid)
|
||
+load_all_hero(uuid)
|
||
}
|
||
VMCustom --|> VMBase
|
||
HInfoComp --> VMCustom : 使用
|
||
```
|
||
|
||
**图表来源**
|
||
- [VMCustom.md](file://doc/mvvm/VMCustom.md#L6-L17)
|
||
- [HInfoComp.ts](file://assets/script/game/map/HInfoComp.ts#L1-L50)
|
||
|
||
### 文本绑定示例
|
||
|
||
| 绑定类型 | watchPath | 组件属性 | 用途 |
|
||
|----------|-----------|----------|------|
|
||
| 单一文本 | `loading_load_json` | `Label.string` | 加载提示文本 |
|
||
| 按钮文本 | `btn_demo_lang` | `Label.string` | 语言切换按钮 |
|
||
| 属性显示 | `role_name` | `Label.string` | 角色属性名称 |
|
||
|
||
**章节来源**
|
||
- [VMCustom.md](file://doc/mvvm/VMCustom.md#L6-L17)
|
||
- [LoadingViewComp.ts](file://assets/script/game/initialize/view/LoadingViewComp.ts#L50-L70)
|
||
|
||
## UI组件国际化
|
||
|
||
### HInfoComp国际化实现
|
||
|
||
英雄信息组件展示了完整的国际化集成:
|
||
|
||
```mermaid
|
||
flowchart TD
|
||
Start([组件启动]) --> LoadData[加载英雄数据]
|
||
LoadData --> BindText[绑定国际化文本]
|
||
BindText --> UpdateUI[更新UI显示]
|
||
subgraph "文本绑定过程"
|
||
GetName[获取英雄名称]
|
||
GetType[获取英雄类型]
|
||
GetAttr[获取属性数据]
|
||
UpdateLabels[更新标签文本]
|
||
end
|
||
LoadData --> GetName
|
||
GetName --> GetType
|
||
GetType --> GetAttr
|
||
GetAttr --> UpdateLabels
|
||
UpdateLabels --> UpdateUI
|
||
```
|
||
|
||
**图表来源**
|
||
- [HInfoComp.ts](file://assets/script/game/map/HInfoComp.ts#L70-L90)
|
||
|
||
### SIconComp国际化应用
|
||
|
||
技能图标组件展示了资源绑定的国际化:
|
||
|
||
| 组件功能 | 国际化处理 | 实现方式 |
|
||
|----------|------------|----------|
|
||
| 图标显示 | 技能图标路径 | 动态加载技能资源 |
|
||
| 数据绑定 | 技能属性文本 | ViewModel自动更新 |
|
||
| 资源管理 | 多语言资源 | 按语言类型加载 |
|
||
|
||
**章节来源**
|
||
- [HInfoComp.ts](file://assets/script/game/map/HInfoComp.ts#L70-L90)
|
||
- [SIconComp.ts](file://assets/script/game/map/SIconComp.ts#L1-L28)
|
||
|
||
## 性能优化策略
|
||
|
||
### 预加载策略
|
||
|
||
系统采用多层次的预加载机制:
|
||
|
||
```mermaid
|
||
graph TB
|
||
subgraph "预加载层级"
|
||
Level1[一级预加载<br/>核心语言包]
|
||
Level2[二级预加载<br/>常用字体资源]
|
||
Level3[三级预加载<br/>备用语言包]
|
||
end
|
||
subgraph "加载时机"
|
||
Startup[游戏启动时]
|
||
Background[后台预加载]
|
||
OnDemand[按需加载]
|
||
end
|
||
Startup --> Level1
|
||
Background --> Level2
|
||
OnDemand --> Level3
|
||
```
|
||
|
||
### 内存缓存策略
|
||
|
||
| 缓存级别 | 缓存内容 | 生命周期 | 清理策略 |
|
||
|----------|----------|----------|----------|
|
||
| L1缓存 | 当前语言包 | 游戏会话期间 | 会话结束清理 |
|
||
| L2缓存 | 字体资源 | 应用生命周期 | 应用退出清理 |
|
||
| L3缓存 | 已加载语言包 | 永久存储 | 手动清理 |
|
||
|
||
### 性能监控指标
|
||
|
||
- **加载时间**:< 200ms
|
||
- **内存占用**:单语言包 < 5MB
|
||
- **切换延迟**:< 50ms
|
||
- **缓存命中率**:> 90%
|
||
|
||
## 扩展指南
|
||
|
||
### 新增语言类型
|
||
|
||
添加新语言支持的完整流程:
|
||
|
||
```mermaid
|
||
flowchart TD
|
||
AddLang[添加语言类型] --> CreateJSON[创建语言包文件]
|
||
CreateJSON --> UpdateConfig[更新配置文件]
|
||
UpdateConfig --> AddFonts[添加字体资源]
|
||
AddFonts --> TestLang[测试语言切换]
|
||
TestLang --> Validate[验证完整性]
|
||
subgraph "验证步骤"
|
||
CheckKeys[检查键值完整性]
|
||
CheckFormat[验证JSON格式]
|
||
CheckDisplay[测试显示效果]
|
||
end
|
||
Validate --> CheckKeys
|
||
CheckKeys --> CheckFormat
|
||
CheckFormat --> CheckDisplay
|
||
```
|
||
|
||
### 翻译一致性维护
|
||
|
||
| 维护要点 | 实施方法 | 工具支持 |
|
||
|----------|----------|----------|
|
||
| 键值一致性 | 版本控制 | Git分支管理 |
|
||
| 文本长度适配 | 设计评审 | UI适配测试 |
|
||
| 上下文一致性 | 翻译记忆库 | 专业翻译工具 |
|
||
| 格式化字符串 | 占位符验证 | 自动化测试 |
|
||
|
||
### 占位符处理
|
||
|
||
系统支持复杂格式化字符串的国际化:
|
||
|
||
```typescript
|
||
// 示例:带参数的国际化文本
|
||
oops.language.getLangByID("loading_progress", {
|
||
current: 5,
|
||
total: 10,
|
||
percentage: "50%"
|
||
});
|
||
```
|
||
|
||
## 故障排除
|
||
|
||
### 常见问题诊断
|
||
|
||
| 问题类型 | 症状 | 可能原因 | 解决方案 |
|
||
|----------|------|----------|----------|
|
||
| 语言包加载失败 | 显示英文或空白 | 文件路径错误 | 检查配置文件路径 |
|
||
| 字体显示异常 | 文本乱码 | 字体资源缺失 | 确认字体文件存在 |
|
||
| UI更新延迟 | 文本未及时更新 | MVVM绑定失效 | 重启绑定机制 |
|
||
| 内存泄漏 | 性能逐渐下降 | 缓存未清理 | 手动清理缓存 |
|
||
|
||
### 调试工具
|
||
|
||
```mermaid
|
||
graph LR
|
||
subgraph "调试工具集"
|
||
Logger[日志记录器]
|
||
Profiler[性能分析器]
|
||
Validator[配置验证器]
|
||
Monitor[运行时监控]
|
||
end
|
||
subgraph "监控指标"
|
||
LoadTime[加载时间]
|
||
MemUsage[内存使用]
|
||
CacheHit[缓存命中率]
|
||
ErrorRate[错误率]
|
||
end
|
||
Logger --> LoadTime
|
||
Profiler --> MemUsage
|
||
Validator --> CacheHit
|
||
Monitor --> ErrorRate
|
||
```
|
||
|
||
**章节来源**
|
||
- [Initialize.ts](file://assets/script/game/initialize/Initialize.ts#L40-L50)
|
||
|
||
## 总结
|
||
|
||
本多语言支持系统通过模块化设计、MVVM框架集成和性能优化策略,实现了高效、可扩展的国际化解决方案。系统具备以下优势:
|
||
|
||
### 核心优势
|
||
|
||
1. **架构清晰**:模块化设计便于维护和扩展
|
||
2. **性能优异**:智能缓存和预加载机制
|
||
3. **用户体验**:无缝的语言切换体验
|
||
4. **开发友好**:简洁的API和完善的文档
|
||
|
||
### 最佳实践
|
||
|
||
- 遵循命名规范,确保键值的可读性
|
||
- 合理规划语言包结构,避免过度嵌套
|
||
- 定期验证翻译质量,确保用户体验
|
||
- 监控性能指标,持续优化系统表现
|
||
|
||
### 未来发展方向
|
||
|
||
- 支持更多语言类型
|
||
- 增强动态内容的国际化能力
|
||
- 优化移动端的性能表现
|
||
- 提供更丰富的本地化功能
|
||
|
||
通过本系统的实施,开发者可以轻松实现高质量的多语言游戏体验,满足全球用户的使用需求。 |