LanguageSourceGenerator.cs 3.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364
  1. using Microsoft.CodeAnalysis;
  2. using System.Text;
  3. using System.Xml;
  4. namespace LanguageSourceGenerator
  5. {
  6. [Generator(LanguageNames.CSharp)]
  7. public class LanguageSourceGenerator : IIncrementalGenerator
  8. {
  9. public void Initialize(IncrementalGeneratorInitializationContext context)
  10. {
  11. string name = typeof(LanguageSourceGenerator).Assembly.GetManifestResourceNames().First(x=>x.IndexOf("Language.axaml")>=0);
  12. var stream = typeof(LanguageSourceGenerator).Assembly.GetManifestResourceStream(name);
  13. XmlDocument document = new XmlDocument();
  14. document.PreserveWhitespace = false;
  15. document.Load(stream);
  16. 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();
  17. if(val.Count>0)
  18. {
  19. context.RegisterPostInitializationOutput(c =>
  20. {
  21. StringBuilder stringBuilder = new StringBuilder();
  22. stringBuilder.AppendLine("using Avalonia.Collections;");
  23. stringBuilder.AppendLine("using Avalonia.Controls;");
  24. stringBuilder.AppendLine("using Avalonia.Markup.Xaml;");
  25. stringBuilder.AppendLine("using System;");
  26. stringBuilder.AppendLine("namespace IViewModel.ViewModels");
  27. stringBuilder.AppendLine("{");
  28. stringBuilder.AppendLine(" public sealed class LanguageValueViewModel:ViewModelBase");
  29. stringBuilder.AppendLine(" {");
  30. stringBuilder.AppendLine($" public string this[string key] => (Avalonia.Application.Current?.FindResource(key) ?? \"<no set>\")+\"\";");
  31. stringBuilder.AppendLine(" private LanguageValueViewModel()");
  32. stringBuilder.AppendLine(" {");
  33. stringBuilder.AppendLine(" GetEvent(LanguageViewModel.LANGUAGECHANGEDEVENT).Subscrip((_, _) =>");
  34. stringBuilder.AppendLine(" {");
  35. foreach (var item in val)
  36. {
  37. stringBuilder.AppendLine($" OnPropertyChanged(nameof({item.Value}));");
  38. }
  39. stringBuilder.AppendLine(" });");
  40. stringBuilder.AppendLine(" }");
  41. stringBuilder.AppendLine(" static LanguageValueViewModel()");
  42. stringBuilder.AppendLine(" {");
  43. stringBuilder.AppendLine(" }");
  44. stringBuilder.AppendLine(" public static LanguageValueViewModel Instance {get;}= new LanguageValueViewModel();");
  45. foreach (var item in val)
  46. {
  47. stringBuilder.AppendLine($" /// <summary>");
  48. stringBuilder.AppendLine($" /// {item.InnerText}");
  49. stringBuilder.AppendLine($" /// </summary>");
  50. stringBuilder.AppendLine($" public string {item.Value} => (Avalonia.Application.Current?.FindResource(nameof({item.Value})) ?? \"<no set>\")+\"\";");
  51. }
  52. stringBuilder.AppendLine(" }");
  53. stringBuilder.AppendLine("}");
  54. c.AddSource("LanguageValueViewModel.g.cs", stringBuilder.ToString());
  55. });
  56. }
  57. }
  58. }
  59. }