JsonEmbeddedFileLocalizationDictionaryProvider.cs 3.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
  1. using System.Globalization;
  2. using System.Linq;
  3. using System.Reflection;
  4. using Abp.Localization.Dictionaries.Xml;
  5. namespace Abp.Localization.Dictionaries.Json
  6. {
  7. /// <summary>
  8. /// Provides localization dictionaries from JSON files embedded into an <see cref="Assembly"/>.
  9. /// </summary>
  10. public class JsonEmbeddedFileLocalizationDictionaryProvider : LocalizationDictionaryProviderBase
  11. {
  12. private readonly Assembly _assembly;
  13. private readonly string _rootNamespace;
  14. /// <summary>
  15. /// Creates a new <see cref="JsonEmbeddedFileLocalizationDictionaryProvider"/> object.
  16. /// </summary>
  17. /// <param name="assembly">Assembly that contains embedded json files</param>
  18. /// <param name="rootNamespace">
  19. /// <para>
  20. /// Namespace of the embedded json dictionary files
  21. /// </para>
  22. /// <para>
  23. /// Notice : Json folder name is different from Xml folder name.
  24. /// </para>
  25. /// <para>
  26. /// You must name it like this : Json**** and Xml****; Do not name : ****Json and ****Xml
  27. /// </para>
  28. /// </param>
  29. public JsonEmbeddedFileLocalizationDictionaryProvider(Assembly assembly, string rootNamespace)
  30. {
  31. _assembly = assembly;
  32. _rootNamespace = rootNamespace;
  33. }
  34. public override void Initialize(string sourceName)
  35. {
  36. var allCultureInfos = CultureInfo.GetCultures(CultureTypes.AllCultures);
  37. var resourceNames = _assembly.GetManifestResourceNames().Where(resouceName =>
  38. allCultureInfos.Any(culture => resouceName.EndsWith($"{sourceName}.json", true, null) ||
  39. resouceName.EndsWith($"{sourceName}-{culture.Name}.json", true,
  40. null))).ToList();
  41. foreach (var resourceName in resourceNames)
  42. {
  43. if (resourceName.StartsWith(_rootNamespace))
  44. {
  45. using (var stream = _assembly.GetManifestResourceStream(resourceName))
  46. {
  47. var jsonString = Utf8Helper.ReadStringFromStream(stream);
  48. var dictionary = CreateJsonLocalizationDictionary(jsonString);
  49. if (Dictionaries.ContainsKey(dictionary.CultureInfo.Name))
  50. {
  51. throw new AbpInitializationException(sourceName + " source contains more than one dictionary for the culture: " + dictionary.CultureInfo.Name);
  52. }
  53. Dictionaries[dictionary.CultureInfo.Name] = dictionary;
  54. if (resourceName.EndsWith(sourceName + ".json"))
  55. {
  56. if (DefaultDictionary != null)
  57. {
  58. throw new AbpInitializationException("Only one default localization dictionary can be for source: " + sourceName);
  59. }
  60. DefaultDictionary = dictionary;
  61. }
  62. }
  63. }
  64. }
  65. }
  66. protected virtual JsonLocalizationDictionary CreateJsonLocalizationDictionary(string jsonString)
  67. {
  68. return JsonLocalizationDictionary.BuildFromJsonString(jsonString);
  69. }
  70. }
  71. }