LocaleValidationTask.cs 2.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273
  1. using System;
  2. using Microsoft.Build.Utilities;
  3. using System.Collections.Generic;
  4. using System.Linq;
  5. using System.IO;
  6. using Newtonsoft.Json;
  7. using Microsoft.Build.Framework;
  8. namespace Ryujinx.BuildValidationTasks
  9. {
  10. public class LocaleValidationTask : Task
  11. {
  12. public override bool Execute()
  13. {
  14. string path = System.Reflection.Assembly.GetExecutingAssembly().Location;
  15. if (path.Split(["src"], StringSplitOptions.None).Length == 1)
  16. {
  17. //i assume that we are in a build directory in the solution dir
  18. path = new FileInfo(path).Directory!.Parent!.GetDirectories("src")[0].GetDirectories("Ryujinx")[0].GetDirectories("Assets")[0].GetFiles("locales.json")[0].FullName;
  19. }
  20. else
  21. {
  22. path = path.Split(["src"], StringSplitOptions.None)[0];
  23. path = new FileInfo(path).Directory!.GetDirectories("src")[0].GetDirectories("Ryujinx")[0].GetDirectories("Assets")[0].GetFiles("locales.json")[0].FullName;
  24. }
  25. string data;
  26. using (StreamReader sr = new(path))
  27. {
  28. data = sr.ReadToEnd();
  29. }
  30. LocalesJson json = JsonConvert.DeserializeObject<LocalesJson>(data);
  31. for (int i = 0; i < json.Locales.Count; i++)
  32. {
  33. LocalesEntry locale = json.Locales[i];
  34. foreach (string langCode in json.Languages.Where(it => !locale.Translations.ContainsKey(it)))
  35. {
  36. locale.Translations.Add(langCode, string.Empty);
  37. Log.LogMessage(MessageImportance.High, $"Added '{langCode}' to Locale '{locale.ID}'");
  38. }
  39. locale.Translations = locale.Translations.OrderBy(pair => pair.Key).ToDictionary(pair => pair.Key, pair => pair.Value);
  40. json.Locales[i] = locale;
  41. }
  42. string jsonString = JsonConvert.SerializeObject(json, Formatting.Indented);
  43. using (StreamWriter sw = new(path))
  44. {
  45. sw.Write(jsonString);
  46. }
  47. return true;
  48. }
  49. struct LocalesJson
  50. {
  51. public List<string> Languages { get; set; }
  52. public List<LocalesEntry> Locales { get; set; }
  53. }
  54. struct LocalesEntry
  55. {
  56. public string ID { get; set; }
  57. public Dictionary<string, string> Translations { get; set; }
  58. }
  59. }
  60. }