mirror of
https://github.com/AtomUI/AtomUI.git
synced 2026-10-18 22:46:38 +08:00
3018239197
- Add Overview.md: design goals, system architecture diagram, core concepts, source file inventory - Add Architecture.md: core types, Source Generator pipeline, end-to-end Dialog example, resource lifecycle, runtime language switching - Add DeveloperGuide.md: step-by-step tutorial with QRCode example, Common shared resources, Dialog/Tour/Pagination examples, application-level i18n, runtime switching API, FAQ - Update .gitignore: add .referenceprojects/ ignore rule - Bump version to 5.2.0-build.3
9.2 KiB
9.2 KiB
AtomUI 多语言系统概览
本文档描述 AtomUI 国际化(i18n)系统的整体架构,包括设计目标、核心概念、系统分层以及源文件清单。
1. 设计目标
AtomUI 多语言系统遵循以下设计原则:
- 所有用户可见文本必须通过多语言系统管理 — 禁止在控件中硬编码字符串。
- 运行时热切换 — 用户可在运行时切换语言,UI 即时响应刷新,无需重启应用。
- Source Generator 自动化 — 通过 Roslyn Source Generator 自动生成资源枚举键和 XAML 标记扩展,消除手动维护的负担。
- 与 Avalonia 资源系统深度集成 — 多语言文本以
ResourceDictionary形式注入 Avalonia 资源树,利用DynamicResource机制实现动态绑定。 - 按组件分组管理 — 每个控件的语言资源独立定义,通过
LangId分组,避免全局命名冲突。 - 可扩展 — 第三方开发者可使用相同机制为自定义控件添加多语言支持。
2. 系统架构总览
┌──────────────────────────────────────────────────────────────────────┐
│ 构建时 (Build Time) — Roslyn Source Generator │
│ │
│ LanguageGenerator (IIncrementalGenerator) │
│ ├── LanguageProviderWalker → 扫描 [LanguageProvider] 类 │
│ ├── LangResourceKeyClassSourceWriter │
│ │ → 生成 {LangId}LangResourceKind 枚举 │
│ │ → 生成 {LangId}LangResourceExtension 标记扩展 │
│ └── LanguageProviderPoolClassSourceWriter │
│ → 生成 LanguageProviderPool.GetLanguageProviders() │
└──────────────────────────────┬───────────────────────────────────────┘
│
▼
┌──────────────────────────────────────────────────────────────────────┐
│ 应用初始化 (App Init) │
│ │
│ Application.UseAtomUI(builder => { │
│ builder.WithDefaultLanguageVariant(LanguageVariant.zh_CN); │
│ builder.UseDesktopControls(); // 注册 LanguageProviderPool │
│ }) │
│ │ │
│ ├── ThemeManagerBuilder 收集所有 LanguageProvider │
│ ├── ThemeManagerBuilder.Build() → 创建 ThemeManager │
│ ├── ThemeManager.Configure() → BuildLanguageResources() │
│ │ └── 按 LanguageVariant 分组,构建 ResourceDictionary │
│ └── 设置初始 LanguageVariant → 对应语言 ResourceDictionary │
│ 注入 MergedDictionaries │
└──────────────────────────────┬───────────────────────────────────────┘
│
▼
┌──────────────────────────────────────────────────────────────────────┐
│ 运行时 (Runtime) │
│ │
│ AXAML 主题中使用 {atom:XxxLangResource Key} 绑定语言文本 │
│ │
│ 运行时切换语言: │
│ application.SetLanguageVariant(LanguageVariant.en_US) │
│ │ │
│ └── ThemeManager.LanguageVariant 属性变更 │
│ ├── 移除旧语言 ResourceDictionary │
│ ├── 注入新语言 ResourceDictionary │
│ └── 触发 LanguageVariantChanged 事件 │
│ → DynamicResource 自动刷新所有绑定控件 │
└──────────────────────────────────────────────────────────────────────┘
3. 核心概念
| 概念 | 说明 |
|---|---|
| LanguageCode | 语言代码枚举,如 zh_CN、en_US |
| LanguageVariant | 语言变体的类型安全封装,支持与 CultureInfo 互转 |
| LanguageProvider | 单个语言+单个组件的文本定义类,包含所有 public const string 字段 |
| LangId | 语言资源分组标识(通常与控件 Token ID 一致),同一 LangId 下不同语言共享同一组资源键 |
| LangResourceKind | Source Generator 自动生成的资源键枚举,作为 ResourceDictionary 的键 |
| LangResourceExtension | Source Generator 自动生成的 XAML 标记扩展,在 AXAML 中绑定语言文本 |
| LanguageProviderPool | Source Generator 自动生成的工厂类,列举当前程序集中所有 LanguageProvider |
| CommonLangId | 跨控件共享的通用语言分组,如 "确定"、"取消"、"提交" 等 |
4. 源文件清单
4.1 核心基础设施 (src/AtomUI.Core/Language/)
| 文件 | 职责 |
|---|---|
LanguageCode.cs |
LanguageCode 枚举定义(zh_CN、en_US),含 ToHyphenString() 扩展方法 |
LanguageVariant.cs |
LanguageVariant record — 语言变体的类型安全封装,含 StyledProperty、CultureInfo 互转 |
LanguageVariantTypeConverter.cs |
XAML 字符串到 LanguageVariant 的类型转换器 |
LanguageVariantChangedEventArgs.cs |
语言切换事件参数 |
ILanguageProvider.cs |
语言提供者接口 — LangCode、LangId、BuildResourceDictionary() |
LanguageProvider.cs |
语言提供者抽象基类 — 通过反射将 const string 字段写入 ResourceDictionary |
LanguageProviderAttribute.cs |
[LanguageProvider] 标注 — 指定语言代码和分组 ID |
LanguageSgMetaInfoAttribute.cs |
[assembly: LanguageSgMetaInfo] — 指定 Source Generator 输出命名空间 |
LanguageResourceExtension.cs |
LanguageResourceExtension<T> 泛型 XAML 标记扩展基类 |
CommonLangId.cs |
CommonLangId.Common — 跨控件通用语言分组常量 |
4.2 Source Generator (src/AtomUI.Generator/Language/)
| 文件 | 职责 |
|---|---|
LanguageInfo.cs |
数据模型 — 存储单个 LanguageProvider 类的解析结果 |
LanguageProviderWalker.cs |
Roslyn Syntax Walker — 遍历 [LanguageProvider] 类,提取字段和元信息 |
LangResourceKeyClassSourceWriter.cs |
代码生成器 — 输出 {LangId}LangResourceKind 枚举 + {LangId}LangResourceExtension 标记扩展 |
LanguageProviderPoolClassSourceWriter.cs |
代码生成器 — 输出 LanguageProviderPool.GetLanguageProviders() 工厂方法 |
Source Generator 入口:src/AtomUI.Generator/LanguageGenerator.cs
4.3 运行时集成
| 文件 | 职责 |
|---|---|
src/AtomUI.Core/Theme/ThemeManager.cs |
管理 _languages 字典,处理语言切换的 ResourceDictionary 替换 |
src/AtomUI.Core/Theme/ThemeManagerBuilder.cs |
收集 LanguageProvider 实例,构建 ThemeManager |
src/AtomUI.Core/Theme/IThemeManager.cs |
公开 LanguageVariant 属性和 LanguageVariantChanged 事件 |
src/AtomUI.Core/ApplicationExtensions.cs |
UseAtomUI() 入口 — 设置默认语言并初始化 |
src/AtomUI.Controls.Shared/ApplicationExtensions.cs |
SetLanguageVariant() / GetLanguageVariant() 便捷扩展方法 |
5. 当前支持的语言
| LanguageCode | LanguageVariant | 显示名称 | CultureInfo |
|---|---|---|---|
zh_CN |
LanguageVariant.zh_CN |
简体中文 | zh-CN |
en_US |
LanguageVariant.en_US |
English | en-US |
默认语言为 en_US(在 ApplicationExtensions.UseAtomUI() 中设置),但 Gallery 示例应用使用 zh_CN 作为默认语言。
6. 相关文档
| 文档 | 内容 |
|---|---|
| Architecture.md | 多语言系统内部架构详解 — 核心类型、Source Generator 管线、资源生命周期 |
| DeveloperGuide.md | 开发者使用指南 — 如何为自定义控件添加多语言支持(含完整示例) |