XmlEmbeddedFileLocalizationDictionaryProvider.cs 3.0 KB

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