12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364 |
- 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<System.Xml.XmlNode>().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) ?? \"<no set>\")+\"\";");
- 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($" /// <summary>");
- stringBuilder.AppendLine($" /// {item.InnerText}");
- stringBuilder.AppendLine($" /// </summary>");
- stringBuilder.AppendLine($" public string {item.Value} => (Avalonia.Application.Current?.FindResource(nameof({item.Value})) ?? \"<no set>\")+\"\";");
- }
- stringBuilder.AppendLine(" }");
- stringBuilder.AppendLine("}");
- c.AddSource("LanguageValueViewModel.g.cs", stringBuilder.ToString());
- });
- }
- }
- }
- }
|