Files
AtomUI/docs/Gallery/05-LocalizationSystem.md
chinboy 7df3f29065 docs: 添加 AtomUIGallery 项目全面分析文档
- 00-Index: 文档索引与快速导航
- 01-Overview: 项目概览、目录树、依赖关系、构建运行
- 02-Architecture: MVVM架构、模块划分、核心类职责(含Mermaid图)
- 03-ShowCaseSystem: 72个ShowCase清单、路由注册、布局系统
- 04-WorkspaceSystem: 主窗口、导航面板、菜单系统
- 05-LocalizationSystem: LanguageProvider+Source Generator架构
- 06-IconSystem: IconProvider+Source Generator架构
- 07-TechStack: 技术栈清单(C#/Avalonia/ReactiveUI等)
- 08-CodingConventions: 编码规范与ReactiveUI使用规范
- 09-RisksAndNotes: 风险、技术债、迭代检查清单
2026-04-14 17:45:49 +08:00

4.8 KiB
Raw Permalink Blame History

国际化系统

1. 概述

Gallery 使用 AtomUI 自研的国际化系统,基于 LanguageProvider + Source Generator 实现。支持中文(zh_CN)和英文(en_US)两种语言,运行时动态切换。

2. 架构

graph TB
    subgraph "定义层"
        LP["LanguageProvider 子类<br/>定义 const string 字段"]
        ZH["zh_CN.cs<br/>中文翻译"]
        EN["en_US.cs<br/>英文翻译"]
    end

    subgraph "生成层 (Source Generator)"
        Enum["CaseNavigationLangResourceKind<br/>自动生成枚举"]
        Ext["CaseNavigationLangResourceExtension<br/>自动生成 XAML 扩展"]
        Pool["LanguageProviderPool.g.cs<br/>自动生成注册池"]
    end

    subgraph "使用层"
        XAML["XAML 中使用<br/>{CaseNavigationLangResource DataDisplay}"]
        Code["代码中使用<br/>LanguageManager.Instance"]
    end

    LP --> Enum
    LP --> Ext
    LP --> Pool
    ZH --> LP
    EN --> LP
    Enum --> XAML
    Ext --> XAML
    Pool --> Code

3. LanguageProvider 定义模式

每个需要国际化的模块定义一个 LanguageProvider 子类:

// 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 = "数据展示";
    // ...
}
// 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 扩展标记:

// 自动生成
public enum CaseNavigationLangResourceKind
{
    DataDisplay,
    DataDisplay_Avatar,
    DataDisplay_Badge,
    // ... 所有 const string 字段名
    General,
    General_Button,
    // ...
}

public class CaseNavigationLangResourceExtension : LanguageResourceExtension<CaseNavigationLangResourceKind>
{
    // XAML 标记扩展,用于在 XAML 中引用国际化文本
}

4.2 LanguageProviderPool.g.cs

自动生成语言提供者注册池,在应用启动时自动注册所有语言提供者。

5. XAML 中使用

<!-- 使用生成的 XAML 扩展 -->
<NavMenuItem Header="{CaseNavigationLangResource General_Button}" 
             ItemKey="{x:Static vm:ButtonViewModel.ID}"/>

6. 语言切换

通过 Application.Current.SetLanguageVariant() 切换语言:

// 切换到中文
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