![]() |
VOOZH | about |
dotnet add package Lang.Avalonia.Resx --version 12.0.4.1
NuGet\Install-Package Lang.Avalonia.Resx -Version 12.0.4.1
<PackageReference Include="Lang.Avalonia.Resx" Version="12.0.4.1" />
<PackageVersion Include="Lang.Avalonia.Resx" Version="12.0.4.1" />Directory.Packages.props
<PackageReference Include="Lang.Avalonia.Resx" />Project file
paket add Lang.Avalonia.Resx --version 12.0.4.1
#r "nuget: Lang.Avalonia.Resx, 12.0.4.1"
#:package Lang.Avalonia.Resx@12.0.4.1
#addin nuget:?package=Lang.Avalonia.Resx&version=12.0.4.1Install as a Cake Addin
#tool nuget:?package=Lang.Avalonia.Resx&version=12.0.4.1Install as a Cake Tool
Lang.Avalonia 是面向 Avalonia UI 的插件化多语言库。核心包提供 XAML 标记扩展、绑定刷新流程、转换器、I18nManager 和 ILangPlugin 契约;资源加载由 JSON、XML、RESX 插件实现,也可以使用 Source Generator 生成强类型资源 Key。
| 包 | NuGet | 下载量 |
|---|---|---|
| Lang.Avalonia | 👁 NuGet |
👁 NuGet |
| Lang.Avalonia.Json | 👁 NuGet |
👁 NuGet |
| Lang.Avalonia.Xml | 👁 NuGet |
👁 NuGet |
| Lang.Avalonia.Resx | 👁 NuGet |
👁 NuGet |
| Lang.Avalonia.Analysis | 👁 NuGet |
👁 NuGet |
12.0.3.5,版本号统一维护在根目录 Directory.Build.props 的 <Version> 节点。net8.0;net10.0;Demo、App、测试与内部应用项目统一使用 net11.0 / net11.0-windows。logo.svg、logo.png、logo.ico 是唯一图标源,子工程只通过 MSBuild Link 引用,不维护图标副本。README.md 和 UpdateLog.md。I18nManager.Instance.Culture 运行时切换语言。ILangPlugin。Lang.Avalonia.Analysis 生成强类型资源 Key。| 资源格式 | 包 | 适用场景 |
|---|---|---|
| JSON | Lang.Avalonia + Lang.Avalonia.Json |
可编辑文件、跨平台工具链、Source Generator 示例 |
| XML | Lang.Avalonia + Lang.Avalonia.Xml |
层级清晰的语言文件 |
| RESX | Lang.Avalonia + Lang.Avalonia.Resx |
.NET ResourceManager 和卫星程序集 |
| 强类型 Key | Lang.Avalonia.Analysis |
从 AdditionalFiles 编译期生成常量 |
安装核心包和一个资源提供器:
dotnet add package Lang.Avalonia.Json
应用启动时注册插件:
using Lang.Avalonia;
using Lang.Avalonia.Json;
using System.Globalization;
I18nManager.Instance.Register(new JsonLangPlugin(), new CultureInfo("en-US"), out var error);
if (!string.IsNullOrWhiteSpace(error))
{
// 记录或展示初始化错误。
}
在 AXAML 中使用生成的常量:
xmlns:c="https://codewf.com"
xmlns:mainLangs="clr-namespace:Localization.Main"
<SelectableTextBlock Text="{c:I18n {x:Static mainLangs:MainView.Title}}" />
<SelectableTextBlock Text="{c:I18n {x:Static mainLangs:MainView.Title}, CultureName=ja-JP}" />
在 C# 中使用相同 Key:
var title = I18nManager.Instance.GetResource(Localization.Main.MainView.Title);
var englishTitle = I18nManager.Instance.GetResource(Localization.Main.MainView.Title, "en-US");
运行时切换语言:
I18nManager.Instance.Culture = new CultureInfo("zh-CN");
安装:
dotnet add package Lang.Avalonia.Json
每个文化一个文件,并将 JSON 文件复制到输出目录:
I18n/en-US.json
I18n/zh-CN.json
I18n/zh-Hant.json
I18n/ja-JP.json
<ItemGroup>
<None Update="I18n\*.json" CopyToOutputDirectory="PreserveNewest" />
</ItemGroup>
每个 JSON 文件都必须包含 language、description、cultureName 元数据:
{
"language": "English",
"description": "English resources",
"cultureName": "en-US",
"Localization": {
"Main": {
"MainView": {
"Title": "Lang.Avalonia localization workspace",
"ChangeLanguage": "Language"
}
}
}
}
如果发现无效 JSON 文件,JsonLangPlugin.LoadDiagnostics 会包含被跳过文件的诊断信息。
安装:
dotnet add package Lang.Avalonia.Xml
每个文化一个文件,并将 XML 文件复制到输出目录:
I18n/en-US.xml
I18n/zh-CN.xml
I18n/zh-Hant.xml
I18n/ja-JP.xml
<ItemGroup>
<None Update="I18n\*.xml" CopyToOutputDirectory="PreserveNewest" />
</ItemGroup>
每个 XML 文件都必须在根节点上包含 language、description、cultureName 元数据:
<?xml version="1.0" encoding="utf-8"?>
<Localization language="English" description="English resources" cultureName="en-US">
<Main>
<MainView>
<Title>Lang.Avalonia localization workspace</Title>
<ChangeLanguage>Language</ChangeLanguage>
</MainView>
</Main>
</Localization>
叶子节点路径会成为资源 Key。上面的示例会生成 Localization.Main.MainView.Title。
如果发现无效 XML 文件,XmlLangPlugin.LoadDiagnostics 会包含被跳过文件的诊断信息。
安装:
dotnet add package Lang.Avalonia.Resx
使用标准 .NET RESX 命名:
I18n/Resources.resx
I18n/Resources.zh-CN.resx
I18n/Resources.zh-Hant.resx
I18n/Resources.ja-JP.resx
建议使用完整资源 Key 作为 RESX 数据名称:
<data name="Localization.Main.MainView.Title" xml:space="preserve">
<value>Lang.Avalonia localization workspace</value>
</data>
ResxLangPlugin 按文化同步资源,并通过与 JSON、XML 提供器相同的 ILangPlugin 契约对外提供资源。裁剪发布时建议显式传入生成的 ResourceManager,这样应用不需要为了 Lang.Avalonia.Resx 额外配置链接器 Root 文件:
using MyApp.I18n;
I18nManager.Instance.Register(
new ResxLangPlugin(Resources.ResourceManager),
new CultureInfo("zh-CN"),
out var error);
也可以传入生成的资源 Designer 类型:
I18nManager.Instance.Register(
new ResxLangPlugin(typeof(Resources)),
new CultureInfo("zh-CN"),
out var error);
ResxLangPlugin.Mark 默认值为 i18n。请让生成的资源 Designer 类型位于包含 I18n 的命名空间或文件夹下,或者显式设置 Mark:
I18nManager.Instance.Register(
new ResxLangPlugin { Mark = "Resources" },
new CultureInfo("en-US"),
out var error);
按约定扫描保留用于兼容旧用法,但裁剪应用推荐使用显式注册。
支持两种生成路径:
I18n/Language.cs。Lang.Avalonia.Analysis 会从 AdditionalFiles 在编译期生成 Language.g.cs。在应用项目中建议将 Lang.Avalonia.Analysis 作为私有构建期分析器:
<PackageReference Include="Lang.Avalonia.Analysis" Version="*" PrivateAssets="all" />
将 JSON、XML 或 RESX 语言文件注册为 AdditionalFiles:
<ItemGroup>
<AdditionalFiles Include="I18n\*.json" />
<AdditionalFiles Include="I18n\*.xml" />
<AdditionalFiles Include="I18n\*.resx" />
</ItemGroup>
生成字段的值会保留原始资源 Key,只有 C# 标识符名称会被清洗。
对于以下资源 Key:
Localization.Main.MainView.Title
生成器会输出类似常量:
namespace Localization.Main;
public static class MainView
{
public static readonly string Title = "Localization.Main.MainView.Title";
}
仓库包含四个示例:
| 示例 | 用途 |
|---|---|
Lang.Avalonia.Json.Demo |
JSON 文件复制到输出目录并由 JsonLangPlugin 加载 |
Lang.Avalonia.Xml.Demo |
XML 文件复制到输出目录并由 XmlLangPlugin 加载 |
Lang.Avalonia.Resx.Demo |
通过 ResourceManager 加载 RESX 资源 |
Lang.Avalonia.Analysis.Demo |
JSON 资源加 Source Generator 生成 Key |
设计文档和 SVG 图示见 docs/design.md。
资源查找顺序如下:
CultureName;未提供时使用 I18nManager.Instance.Culture。Register 时传入的默认文化。AppDomain.CurrentDomain.BaseDirectory。AddResource 读取嵌入资源。ResourceManager 或资源 Designer 类型时,裁剪发布不需要为 Lang.Avalonia.Resx 配置 Root.xml。检查方式:dotnet restore Lang.Avalonia.slnx、dotnet list package --include-transitive、NuGet .nuspec、NuGet.org 与源码仓库信息。优先接受 MIT / Apache-2.0 / BSD;其它开源协议在源码与传递依赖均可追溯时单独标注。
整改:
AvaloniaUI.DiagnosticsSupport。Avalonia / Avalonia.Desktop 从 12.0.2 升级到 12.0.3。System.Drawing.Common 固定到 10.0.8。System.Text.Json 从 10.0.2 升级到 10.0.8。Prism.Avalonia、Prism.DryIoc.Avalonia 以及配套的 Irihi.Ursa.PrismExtension 继续保留在当前 8.x 兼容开源线,不升级到 Prism 9.x 商业化版本线。| 包 | 使用范围 | 协议 | 源码/项目地址 | 结论 |
|---|---|---|---|---|
Avalonia / Avalonia.Desktop |
Demo UI 与核心 Avalonia 集成 | MIT | https://github.com/AvaloniaUI/Avalonia | 通过,已升级到 12.0.3 |
Semi.Avalonia |
Demo 主题 | MIT | https://github.com/irihitech/Semi.Avalonia | 通过,仅使用开源主体包 |
Irihi.Ursa / Irihi.Ursa.PrismExtension / Irihi.Ursa.Themes.Semi |
Demo 控件与 Prism 扩展 | MIT | https://github.com/irihitech/Ursa.Avalonia | 通过,Prism 扩展保留在当前 8.x 兼容线 |
Prism.Avalonia / Prism.DryIoc.Avalonia 8.1.97.11073 |
Demo DI / Prism shell | MIT | https://github.com/AvaloniaCommunity/Prism.Avalonia | 通过,保留 8.x 开源线 |
ReactiveUI.Avalonia |
Demo MVVM | MIT | https://github.com/reactiveui/reactiveui | 通过 |
Microsoft.CodeAnalysis.* |
Lang.Avalonia.Analysis 源码生成 |
MIT | https://github.com/dotnet/roslyn | 通过 |
System.Drawing.Common / System.Text.Json |
RESX 与 JSON 支持 | MIT | https://github.com/dotnet/dotnet | 通过,固定到 10.0.8 |
VC-LTL |
Windows 兼容 | EPL-2.0 | https://github.com/Chuyu-Team/VC-LTL5 | 源码开放,按“非优先但可追溯”通过 |
YY-Thunks |
Windows 兼容 | MIT | https://github.com/Chuyu-Team/YY-Thunks | 源码开放,通过 |
传递依赖检查结论:Avalonia / Ursa / Semi / Prism / ReactiveUI / Roslyn / .NET 运行时与类库链路均有公开源码;有效项目文件中不再包含 AvaloniaUI.DiagnosticsSupport 或其它黑盒组件。
| Product | Versions Compatible and additional computed target framework versions. |
|---|---|
| .NET | net8.0 net8.0 is compatible. net8.0-android net8.0-android was computed. net8.0-browser net8.0-browser was computed. net8.0-ios net8.0-ios was computed. net8.0-maccatalyst net8.0-maccatalyst was computed. net8.0-macos net8.0-macos was computed. net8.0-tvos net8.0-tvos was computed. net8.0-windows net8.0-windows was computed. net9.0 net9.0 was computed. net9.0-android net9.0-android was computed. net9.0-browser net9.0-browser was computed. net9.0-ios net9.0-ios was computed. net9.0-maccatalyst net9.0-maccatalyst was computed. net9.0-macos net9.0-macos was computed. net9.0-tvos net9.0-tvos was computed. net9.0-windows net9.0-windows was computed. net10.0 net10.0 is compatible. net10.0-android net10.0-android was computed. net10.0-browser net10.0-browser was computed. net10.0-ios net10.0-ios was computed. net10.0-maccatalyst net10.0-maccatalyst was computed. net10.0-macos net10.0-macos was computed. net10.0-tvos net10.0-tvos was computed. net10.0-windows net10.0-windows was computed. |
Showing the top 1 NuGet packages that depend on Lang.Avalonia.Resx:
| Package | Downloads |
|---|---|
|
Shinya.Avalonia
Shinya.Framework |
This package is not used by any popular GitHub repositories.