using System.Globalization; using System.Linq; using System.Reflection; namespace Abp.Localization.Dictionaries.Xml { /// /// Provides localization dictionaries from XML files embedded into an . /// public class XmlEmbeddedFileLocalizationDictionaryProvider : LocalizationDictionaryProviderBase { private readonly Assembly _assembly; private readonly string _rootNamespace; /// /// Creates a new object. /// /// Assembly that contains embedded xml files /// Namespace of the embedded xml dictionary files public XmlEmbeddedFileLocalizationDictionaryProvider(Assembly assembly, string rootNamespace) { _assembly = assembly; _rootNamespace = rootNamespace; } public override void Initialize(string sourceName) { var allCultureInfos = CultureInfo.GetCultures(CultureTypes.AllCultures); var resourceNames = _assembly.GetManifestResourceNames().Where(resouceName => allCultureInfos.Any(culture => resouceName.EndsWith($"{sourceName}.xml", true, null) || resouceName.EndsWith($"{sourceName}-{culture.Name}.xml", true, null))).ToList(); foreach (var resourceName in resourceNames) { if (resourceName.StartsWith(_rootNamespace)) { using (var stream = _assembly.GetManifestResourceStream(resourceName)) { var xmlString = Utf8Helper.ReadStringFromStream(stream); var dictionary = CreateXmlLocalizationDictionary(xmlString); if (Dictionaries.ContainsKey(dictionary.CultureInfo.Name)) { throw new AbpInitializationException(sourceName + " source contains more than one dictionary for the culture: " + dictionary.CultureInfo.Name); } Dictionaries[dictionary.CultureInfo.Name] = dictionary; if (resourceName.EndsWith(sourceName + ".xml")) { if (DefaultDictionary != null) { throw new AbpInitializationException("Only one default localization dictionary can be for source: " + sourceName); } DefaultDictionary = dictionary; } } } } } protected virtual XmlLocalizationDictionary CreateXmlLocalizationDictionary(string xmlString) { return XmlLocalizationDictionary.BuildFomXmlString(xmlString); } } }