using Microsoft.CodeAnalysis; using System.Text; using System.Xml; namespace LanguageSourceGenerator { [Generator(LanguageNames.CSharp)] public class LanguageSourceGenerator : IIncrementalGenerator { public void Initialize(IncrementalGeneratorInitializationContext context) { string name = typeof(LanguageSourceGenerator).Assembly.GetManifestResourceNames().First(x=>x.IndexOf("Language.axaml")>=0); var stream = typeof(LanguageSourceGenerator).Assembly.GetManifestResourceStream(name); XmlDocument document = new XmlDocument(); document.PreserveWhitespace = false; document.Load(stream); var val = document.ChildNodes[0]!.ChildNodes.Cast().Where(x => x.NodeType == XmlNodeType.Element && x.Attributes?.Count>0).Select(x => (x!.Attributes![0]!.Value, x.InnerText)).ToList(); if(val.Count>0) { context.RegisterPostInitializationOutput(c => { StringBuilder stringBuilder = new StringBuilder(); stringBuilder.AppendLine("using Avalonia.Collections;"); stringBuilder.AppendLine("using Avalonia.Controls;"); stringBuilder.AppendLine("using Avalonia.Markup.Xaml;"); stringBuilder.AppendLine("using System;"); stringBuilder.AppendLine("namespace IViewModel.ViewModels"); stringBuilder.AppendLine("{"); stringBuilder.AppendLine(" public sealed class LanguageValueViewModel:ViewModelBase"); stringBuilder.AppendLine(" {"); stringBuilder.AppendLine($" public string this[string key] => (Avalonia.Application.Current?.FindResource(key) ?? \"\")+\"\";"); stringBuilder.AppendLine(" private LanguageValueViewModel()"); stringBuilder.AppendLine(" {"); stringBuilder.AppendLine(" GetEvent(LanguageViewModel.LANGUAGECHANGEDEVENT).Subscrip((_, _) =>"); stringBuilder.AppendLine(" {"); foreach (var item in val) { stringBuilder.AppendLine($" OnPropertyChanged(nameof({item.Value}));"); } stringBuilder.AppendLine(" });"); stringBuilder.AppendLine(" }"); stringBuilder.AppendLine(" static LanguageValueViewModel()"); stringBuilder.AppendLine(" {"); stringBuilder.AppendLine(" }"); stringBuilder.AppendLine(" public static LanguageValueViewModel Instance {get;}= new LanguageValueViewModel();"); foreach (var item in val) { stringBuilder.AppendLine($" /// "); stringBuilder.AppendLine($" /// {item.InnerText}"); stringBuilder.AppendLine($" /// "); stringBuilder.AppendLine($" public string {item.Value} => (Avalonia.Application.Current?.FindResource(nameof({item.Value})) ?? \"\")+\"\";"); } stringBuilder.AppendLine(" }"); stringBuilder.AppendLine("}"); c.AddSource("LanguageValueViewModel.g.cs", stringBuilder.ToString()); }); } } } }