一个轻量级、可扩展、可插拔的国际化库,支持热重载和多种数据源,适用于 Avalonia 和 WPF。
- 多语言 — 任意数量的语言,运行时动态切换
- 热重载 — 切换语言无需重启
- 可插拔 — 支持 JSON、YAML、RESX 提供者,可扩展至任何数据源
- 插件支持 — 动态注册/注销Provider,适用于插件架构
- XAML 友好 — 为 Avalonia 和 WPF 提供简洁的标记扩展
- DI 集成 — 完整的
Microsoft.Extensions.DependencyInjection支持
| 包 | 描述 |
|---|---|
| DynamicLocalization.Core | 核心库,平台无关 |
| DynamicLocalization.Avalonia | Avalonia 平台(标记扩展) |
| DynamicLocalization.WPF | WPF 平台(标记扩展) |
<!-- Avalonia -->
<PackageReference Include="DynamicLocalization.Avalonia" />
<!-- 或 WPF -->
<PackageReference Include="DynamicLocalization.WPF" />JSON — Localization/en.json(支持扁平或嵌套格式):
{
"App.Title": "My Application",
"App": { "Title": "My Application" } // 等价
}YAML — Localization/en.yml:
App.Title: My Application
# 或嵌套格式:
App:
Title: My ApplicationRESX — Visual Studio 资源文件(Resources/Strings.resx)。
// 选择一个或多个提供者组合
services.AddJsonLocalization(o =>
{
o.BasePath = "Localization";
o.UseEmbeddedResources = true;
o.Assembly = typeof(App).Assembly;
});
// services.AddYamlLocalization(o => o.BasePath = "Localization");
// services.AddResxLocalization(o => o.ResourceType = typeof(Resources.Strings));
services.AddCultureService();
var sp = services.BuildServiceProvider().InitializeLocalization();<TextBlock Text="{loc:Localize App.Title}" />
<TextBlock Text="{loc:Localize Greeting, StringFormat='你好, {0}!'}" />var greeting = cultureService["Greeting"];
cultureService.SetCulture("zh-CN");
cultureService.CultureChanged += (s, e) => Console.WriteLine($"已切换到 {e.NewCulture.Name}");- 文件:
{BasePath}/{culture}.json - 字符串:
provider.LoadJsonString(json, "en") - 支持扁平与嵌套格式
- 文件:
{BasePath}/{culture}.yml - 字符串:
provider.LoadYamlString(yaml, "en") - 支持扁平与嵌套格式、列表值
- 使用 Visual Studio
.resx设计器文件 - 自动检测附属程序集
详见 spec/providers.md(所有选项、格式及编程用法)。
详见 spec/api-reference.md(ICultureService、ILocalizationProvider、LocalizedString、DI 扩展)。
- 实现
ILocalizationProvider创建自定义数据源 - 继承
JsonLocalizationProvider/YamlLocalizationProvider重写解析逻辑 - 动态注册/注销提供者,适用于插件场景
详见 spec/extending.md(自定义提供者、继承、插件集成)。
MIT License