# JSON本地化 **本文档中引用的文件** - [AbpLocalizationJsonModule.cs](file://aspnet-core/framework/localization/LINGYUN.Abp.Localization.Json/LINGYUN/Abp/Localization/Json/AbpLocalizationJsonModule.cs) - [README.md](file://aspnet-core/framework/localization/LINGYUN.Abp.Localization.Json/README.md) - [JsonLocalizationTest.cs](file://aspnet-core/tests/LINGYUN.Abp.Localization.Json.Tests/LINGYUN/Abp/Localization/Json/JsonLocalizationTest.cs) - [LocalizationResourceExtensions.cs](file://aspnet-core/framework/localization/LINGYUN.Abp.Localization.Json/LINGYUN/Abp/Localization/Json/LocalizationResourceExtensions.cs) - [JsonPhysicalFileLocalizationResourceContributor.cs](file://aspnet-core/framework/localization/LINGYUN.Abp.Localization.Json/LINGYUN/Abp/Localization/Json/JsonPhysicalFileLocalizationResourceContributor.cs) ## 目录 1. [简介](#简介) 2. [项目结构](#项目结构) 3. [核心组件](#核心组件) 4. [架构概述](#架构概述) 5. [详细组件分析](#详细组件分析) 6. [依赖分析](#依赖分析) 7. [性能考虑](#性能考虑) 8. [故障排除指南](#故障排除指南) 9. [结论](#结论) 10. [附录](#附录)(如有必要) ## 简介 本文档详细介绍了ABP框架中基于JSON文件的本地化实现机制。该功能允许开发者使用JSON文件来管理应用程序的多语言文本,通过物理文件系统或虚拟文件系统加载本地化资源。文档涵盖了JSON本地化的技术架构、配置方式、使用场景以及最佳实践,为开发者提供了完整的JSON本地化支持指南。 ## 项目结构 JSON本地化功能主要位于`aspnet-core/framework/localization/LINGYUN.Abp.Localization.Json`目录下,该模块实现了基于物理文件提供程序的JSON本地化文件集成。 ```mermaid graph TD A[JSON本地化模块] --> B[AbpLocalizationJsonModule] A --> C[LocalizationResourceExtensions] A --> D[JsonPhysicalFileLocalizationResourceContributor] A --> E[README.md] B --> F[依赖AbpLocalizationModule] C --> G[扩展方法AddPhysicalJson] D --> H[实现ILocalizationResourceContributor] ``` **图示来源** - [AbpLocalizationJsonModule.cs](file://aspnet-core/framework/localization/LINGYUN.Abp.Localization.Json/LINGYUN/Abp/Localization/Json/AbpLocalizationJsonModule.cs) - [LocalizationResourceExtensions.cs](file://aspnet-core/framework/localization/LINGYUN.Abp.Localization.Json/LINGYUN/Abp/Localization/Json/LocalizationResourceExtensions.cs) - [JsonPhysicalFileLocalizationResourceContributor.cs](file://aspnet-core/framework/localization/LINGYUN.Abp.Localization.Json/LINGYUN/Abp/Localization/Json/JsonPhysicalFileLocalizationResourceContributor.cs) **节来源** - [AbpLocalizationJsonModule.cs](file://aspnet-core/framework/localization/LINGYUN.Abp.Localization.Json/LINGYUN/Abp/Localization/Json/AbpLocalizationJsonModule.cs) - [README.md](file://aspnet-core/framework/localization/LINGYUN.Abp.Localization.Json/README.md) ## 核心组件 JSON本地化模块的核心组件包括`AbpLocalizationJsonModule`、`LocalizationResourceExtensions`和`JsonPhysicalFileLocalizationResourceContributor`。这些组件共同实现了从JSON文件加载本地化文本的功能,支持物理文件系统和虚拟文件系统的集成。 **节来源** - [AbpLocalizationJsonModule.cs](file://aspnet-core/framework/localization/LINGYUN.Abp.Localization.Json/LINGYUN/Abp/Localization/Json/AbpLocalizationJsonModule.cs) - [LocalizationResourceExtensions.cs](file://aspnet-core/framework/localization/LINGYUN.Abp.Localization.Json/LINGYUN/Abp/Localization/Json/LocalizationResourceExtensions.cs) - [JsonPhysicalFileLocalizationResourceContributor.cs](file://aspnet-core/framework/localization/LINGYUN.Abp.Localization.Json/LINGYUN/Abp/Localization/Json/JsonPhysicalFileLocalizationResourceContributor.cs) ## 架构概述 JSON本地化模块的架构基于ABP框架的本地化系统,通过扩展`LocalizationResource`类来支持JSON文件的加载。模块使用`PhysicalFileProvider`来访问本地文件系统中的JSON文件,并将这些文件解析为本地化字典。 ```mermaid classDiagram class AbpLocalizationJsonModule { +DependsOn(AbpLocalizationModule) } class LocalizationResourceExtensions { +AddPhysicalJson(filePath) } class JsonPhysicalFileLocalizationResourceContributor { -filePath -fileProvider -dictionaries +Initialize(context) +GetOrNull(cultureName, name) +Fill(cultureName, dictionary) +CreateDictionaries() +CreateDictionaryFromFile(file) +CreateDictionaryFromFileContent(fileContent) } class ILocalizationResourceContributor { <> +Initialize(context) +GetOrNull(cultureName, name) +Fill(cultureName, dictionary) } AbpLocalizationJsonModule --> LocalizationResourceExtensions : "使用" LocalizationResourceExtensions --> JsonPhysicalFileLocalizationResourceContributor : "创建" JsonPhysicalFileLocalizationResourceContributor --> ILocalizationResourceContributor : "实现" ``` **图示来源** - [AbpLocalizationJsonModule.cs](file://aspnet-core/framework/localization/LINGYUN.Abp.Localization.Json/LINGYUN/Abp/Localization/Json/AbpLocalizationJsonModule.cs) - [LocalizationResourceExtensions.cs](file://aspnet-core/framework/localization/LINGYUN.Abp.Localization.Json/LINGYUN/Abp/Localization/Json/LocalizationResourceExtensions.cs) - [JsonPhysicalFileLocalizationResourceContributor.cs](file://aspnet-core/framework/localization/LINGYUN.Abp.Localization.Json/LINGYUN/Abp/Localization/Json/JsonPhysicalFileLocalizationResourceContributor.cs) ## 详细组件分析 ### AbpLocalizationJsonModule 分析 `AbpLocalizationJsonModule`是JSON本地化模块的主模块类,它依赖于ABP框架的`AbpLocalizationModule`,为应用程序提供JSON本地化功能。 #### 模块配置 ```csharp [DependsOn(typeof(AbpLocalizationModule))] public class AbpLocalizationJsonModule : AbpModule { } ``` **节来源** - [AbpLocalizationJsonModule.cs](file://aspnet-core/framework/localization/LINGYUN.Abp.Localization.Json/LINGYUN/Abp/Localization/Json/AbpLocalizationJsonModule.cs) ### LocalizationResourceExtensions 分析 `LocalizationResourceExtensions`类提供了扩展方法`AddPhysicalJson`,用于向本地化资源添加物理JSON文件支持。 #### 扩展方法实现 ```csharp public static LocalizationResource AddPhysicalJson( [NotNull] this LocalizationResource localizationResource, [NotNull] string jsonFilePath) { Check.NotNull(localizationResource, nameof(localizationResource)); Check.NotNull(jsonFilePath, nameof(jsonFilePath)); localizationResource.Contributors.Add(new JsonPhysicalFileLocalizationResourceContributor(jsonFilePath)); return localizationResource; } ``` **图示来源** - [LocalizationResourceExtensions.cs](file://aspnet-core/framework/localization/LINGYUN.Abp.Localization.Json/LINGYUN/Abp/Localization/Json/LocalizationResourceExtensions.cs) **节来源** - [LocalizationResourceExtensions.cs](file://aspnet-core/framework/localization/LINGYUN.Abp.Localization.Json/LINGYUN/Abp/Localization/Json/LocalizationResourceExtensions.cs) ### JsonPhysicalFileLocalizationResourceContributor 分析 `JsonPhysicalFileLocalizationResourceContributor`是JSON本地化的核心实现类,负责从物理文件系统加载JSON文件并解析为本地化字典。 #### 初始化流程 ```mermaid flowchart TD Start([开始]) --> Initialize["Initialize方法"] Initialize --> CreateFileProvider["创建PhysicalFileProvider"] CreateFileProvider --> Return["返回"] Return --> End([结束]) ``` #### 字典加载流程 ```mermaid flowchart TD Start([开始]) --> GetDictionaries["GetDictionaries方法"] GetDictionaries --> CheckCache{"缓存存在?"} CheckCache --> |是| ReturnCache["返回缓存字典"] CheckCache --> |否| Lock["获取同步锁"] Lock --> CheckCacheAgain{"再次检查缓存"} CheckCacheAgain --> |是| ReturnCache CheckCacheAgain --> |否| Subscribe["订阅文件变化"] Subscribe --> Create["CreateDictionaries方法"] Create --> ReadFiles["读取目录下所有文件"] ReadFiles --> Filter{"JSON文件?"} Filter --> |否| NextFile["下一个文件"] Filter --> |是| Parse["解析JSON文件"] Parse --> AddToDict["添加到字典"] AddToDict --> NextFile NextFile --> CheckEnd{"文件结束?"} CheckEnd --> |否| ReadFiles CheckEnd --> |是| Cache["缓存字典"] Cache --> Return["返回字典"] Return --> End([结束]) ``` **图示来源** - [JsonPhysicalFileLocalizationResourceContributor.cs](file://aspnet-core/framework/localization/LINGYUN.Abp.Localization.Json/LINGYUN/Abp/Localization/Json/JsonPhysicalFileLocalizationResourceContributor.cs) **节来源** - [JsonPhysicalFileLocalizationResourceContributor.cs](file://aspnet-core/framework/localization/LINGYUN.Abp.Localization.Json/LINGYUN/Abp/Localization/Json/JsonPhysicalFileLocalizationResourceContributor.cs) ## 依赖分析 JSON本地化模块依赖于ABP框架的核心本地化模块,并使用.NET的文件提供程序系统来访问物理文件。 ```mermaid graph TD A[JSON本地化模块] --> B[AbpLocalizationModule] A --> C[PhysicalFileProvider] B --> D[ABP框架核心] C --> E[.NET文件系统] D --> F[依赖注入系统] E --> G[操作系统文件系统] ``` **图示来源** - [AbpLocalizationJsonModule.cs](file://aspnet-core/framework/localization/LINGYUN.Abp.Localization.Json/LINGYUN/Abp/Localization/Json/AbpLocalizationJsonModule.cs) - [JsonPhysicalFileLocalizationResourceContributor.cs](file://aspnet-core/framework/localization/LINGYUN.Abp.Localization.Json/LINGYUN/Abp/Localization/Json/JsonPhysicalFileLocalizationResourceContributor.cs) **节来源** - [AbpLocalizationJsonModule.cs](file://aspnet-core/framework/localization/LINGYUN.Abp.Localization.Json/LINGYUN/Abp/Localization/Json/AbpLocalizationJsonModule.cs) - [JsonPhysicalFileLocalizationResourceContributor.cs](file://aspnet-core/framework/localization/LINGYUN.Abp.Localization.Json/LINGYUN/Abp/Localization/Json/JsonPhysicalFileLocalizationResourceContributor.cs) ## 性能考虑 JSON本地化模块在性能方面有以下特点: 1. **缓存机制**:模块使用内存缓存来存储已解析的本地化字典,避免重复解析JSON文件。 2. **文件监听**:通过`ChangeToken.OnChange`监听文件系统变化,当JSON文件被修改时自动清除缓存。 3. **延迟加载**:本地化字典在首次访问时才被创建和解析,减少启动时的开销。 4. **线程安全**:使用锁机制确保多线程环境下的安全访问。 ## 故障排除指南 ### 常见问题及解决方案 1. **JSON文件未被加载** - 检查文件路径是否正确 - 确认文件扩展名为.json - 验证JSON文件格式是否正确 2. **本地化文本未更新** - 检查文件监听是否正常工作 - 确认缓存是否被正确清除 - 验证应用程序是否重新加载了本地化资源 3. **文化名称冲突** - 确保每个JSON文件中的文化名称唯一 - 检查是否有重复的文化名称定义 **节来源** - [JsonPhysicalFileLocalizationResourceContributor.cs](file://aspnet-core/framework/localization/LINGYUN.Abp.Localization.Json/LINGYUN/Abp/Localization/Json/JsonPhysicalFileLocalizationResourceContributor.cs) - [JsonLocalizationTest.cs](file://aspnet-core/tests/LINGYUN.Abp.Localization.Json.Tests/LINGYUN/Abp/Localization/Json/JsonLocalizationTest.cs) ## 结论 JSON本地化模块为ABP应用程序提供了一种灵活的本地化解决方案,通过JSON文件管理多语言文本。该模块设计简洁,易于集成,支持物理文件系统和虚拟文件系统的集成。开发者可以轻松地创建和管理JSON本地化文件,实现动态更新和高性能的本地化支持。 ## 附录 ### JSON文件格式示例 ```json { "culture": "en", "texts": { "Hello China": "Hello China!" } } ``` ### 模块使用示例 ```csharp [DependsOn( typeof(AbpLocalizationJsonModule))] public class YouProjectModule : AbpModule { public override void ConfigureServices(ServiceConfigurationContext context) { Configure(options => { options.Resources .Add("en") .AddPhysicalJson(Path.Combine(Directory.GetCurrentDirectory(), "Resources")); }); } } ```