using System; using System.Collections.Generic; using System.Collections.Immutable; using System.Linq; using Abp.Configuration.Startup; using Abp.Dependency; using Abp.Localization.Dictionaries; using Abp.Localization.Sources; using Castle.Core.Logging; namespace Abp.Localization { internal class LocalizationManager : ILocalizationManager { public ILogger Logger { get; set; } private readonly ILanguageManager _languageManager; private readonly ILocalizationConfiguration _configuration; private readonly IIocResolver _iocResolver; private readonly IDictionary _sources; /// /// Constructor. /// public LocalizationManager( ILanguageManager languageManager, ILocalizationConfiguration configuration, IIocResolver iocResolver) { Logger = NullLogger.Instance; _languageManager = languageManager; _configuration = configuration; _iocResolver = iocResolver; _sources = new Dictionary(); } public void Initialize() { InitializeSources(); } private void InitializeSources() { if (!_configuration.IsEnabled) { Logger.Debug("Localization disabled."); return; } Logger.Debug(string.Format("Initializing {0} localization sources.", _configuration.Sources.Count)); foreach (var source in _configuration.Sources) { if (_sources.ContainsKey(source.Name)) { throw new AbpException("There are more than one source with name: " + source.Name + "! Source name must be unique!"); } _sources[source.Name] = source; source.Initialize(_configuration, _iocResolver); //Extending dictionaries if (source is IDictionaryBasedLocalizationSource) { var dictionaryBasedSource = source as IDictionaryBasedLocalizationSource; var extensions = _configuration.Sources.Extensions.Where(e => e.SourceName == source.Name).ToList(); foreach (var extension in extensions) { extension.DictionaryProvider.Initialize(source.Name); foreach (var extensionDictionary in extension.DictionaryProvider.Dictionaries.Values) { dictionaryBasedSource.Extend(extensionDictionary); } } } Logger.Debug("Initialized localization source: " + source.Name); } } /// /// Gets a localization source with name. /// /// Unique name of the localization source /// The localization source public ILocalizationSource GetSource(string name) { if (!_configuration.IsEnabled) { return NullLocalizationSource.Instance; } if (name == null) { throw new ArgumentNullException("name"); } ILocalizationSource source; if (!_sources.TryGetValue(name, out source)) { throw new AbpException("Can not find a source with name: " + name); } return source; } /// /// Gets all registered localization sources. /// /// List of sources public IReadOnlyList GetAllSources() { return _sources.Values.ToImmutableList(); } } }