# 国际化系统
## 1. 概述
Gallery 使用 AtomUI 自研的国际化系统,基于 `LanguageProvider` + Source Generator 实现。支持中文(zh_CN)和英文(en_US)两种语言,运行时动态切换。
## 2. 架构
```mermaid
graph TB
subgraph "定义层"
LP["LanguageProvider 子类
定义 const string 字段"]
ZH["zh_CN.cs
中文翻译"]
EN["en_US.cs
英文翻译"]
end
subgraph "生成层 (Source Generator)"
Enum["CaseNavigationLangResourceKind
自动生成枚举"]
Ext["CaseNavigationLangResourceExtension
自动生成 XAML 扩展"]
Pool["LanguageProviderPool.g.cs
自动生成注册池"]
end
subgraph "使用层"
XAML["XAML 中使用
{CaseNavigationLangResource DataDisplay}"]
Code["代码中使用
LanguageManager.Instance"]
end
LP --> Enum
LP --> Ext
LP --> Pool
ZH --> LP
EN --> LP
Enum --> XAML
Ext --> XAML
Pool --> Code
```
## 3. LanguageProvider 定义模式
每个需要国际化的模块定义一个 `LanguageProvider` 子类:
```csharp
// Workspace/Localization/CaseNavigationLang/zh_CN.cs
[LanguageProvider("CaseNavigation")]
public class CaseNavigationZhCN : AbstractLanguageProvider
{
public const string General = "通用";
public const string General_Button = "按钮 Button";
public const string DataDisplay = "数据展示";
// ...
}
```
```csharp
// Workspace/Localization/CaseNavigationLang/en_US.cs
[LanguageProvider("CaseNavigation")]
public class CaseNavigationEnUS : AbstractLanguageProvider
{
public const string General = "General";
public const string General_Button = "Button";
public const string DataDisplay = "Data Display";
// ...
}
```
### 关键规则
1. **`[LanguageProvider("Name")]`** — 标记类为语言提供者,参数为提供者名称
2. **同一名称的多个类** — 对应不同语言变体(zh_CN / en_US)
3. **`const string` 字段** — 字段名作为资源键,字段值作为翻译文本
4. **字段名必须一致** — 不同语言类中相同含义的字段名必须完全相同
## 4. Source Generator 生成内容
### 4.1 LanguageResourceConst.g.cs
自动生成枚举和 XAML 扩展标记:
```csharp
// 自动生成
public enum CaseNavigationLangResourceKind
{
DataDisplay,
DataDisplay_Avatar,
DataDisplay_Badge,
// ... 所有 const string 字段名
General,
General_Button,
// ...
}
public class CaseNavigationLangResourceExtension : LanguageResourceExtension
{
// XAML 标记扩展,用于在 XAML 中引用国际化文本
}
```
### 4.2 LanguageProviderPool.g.cs
自动生成语言提供者注册池,在应用启动时自动注册所有语言提供者。
## 5. XAML 中使用
```xml
```
## 6. 语言切换
通过 `Application.Current.SetLanguageVariant()` 切换语言:
```csharp
// 切换到中文
Application.Current.SetLanguageVariant(LanguageVariant.zh_CN);
// 切换到英文
Application.Current.SetLanguageVariant(LanguageVariant.en_US);
```
切换后,所有使用 `LanguageResourceExtension` 的绑定会自动更新。
## 7. 当前国际化模块
| 模块 | LanguageProvider 名称 | 文件位置 |
|------|----------------------|---------|
| 导航面板 | `CaseNavigation` | `Workspace/Localization/CaseNavigationLang/` |
| 窗口菜单 | `WorkspaceWindow` | `Workspace/Localization/WorkspaceWindowLang/` |
## 8. 新增国际化资源步骤
1. 在对应模块的 `Localization/` 目录下创建 `zh_CN.cs` 和 `en_US.cs`
2. 两个文件中定义相同名称的 `const string` 字段
3. 使用 `[LanguageProvider("ModuleName")]` 标记类
4. Source Generator 自动生成枚举和 XAML 扩展
5. 在 XAML 中使用 `{ModuleNameLangResource FieldName}` 引用
## 9. WorkspaceWindowLang 资源清单
| 资源键 | 中文 | 英文 |
|--------|------|------|
| `MenuItemCompactMode` | 紧凑模式 | Compact Mode |
| `MenuItemDarkMode` | 暗色模式 | Dark Mode |
| `MenuItemEnableFullScreen` | 允许全屏 | Enable Full Screen |
| `MenuItemEnableMaximize` | 允许最大化 | Enable Maximize |
| `MenuItemEnableMinimize` | 允许最小化 | Enable Minimize |
| `MenuItemEnableMotion` | 启用动效 | Enable Motion |
| `MenuItemEnableMove` | 允许移动 | Enable Move |
| `MenuItemEnablePin` | 允许置顶 | Enable Pin |
| `MenuItemEnableResize` | 允许调整大小 | Enable Resize |
| `MenuItemEnableWaveSpirit` | 启用波纹 | Enable Wave Spirit |
| `MenuItemLanguage` | 语言 | Language |
| `MenuItemSettings` | 设置 | Settings |
| `MenuItemTheme` | 主题 | Theme |
| `MenuItemWindowOptions` | 窗口选项 | Window Options |