From 415ea939ff79247432fe2c38f5bc35775979b87b Mon Sep 17 00:00:00 2001 From: Halil ibrahim Kalkan Date: Tue, 17 Jul 2018 16:19:42 +0300 Subject: [PATCH] Refactored localization dictionaries. --- .../CombinedLocalizationDictionary.cs | 64 +++++++++++++++++++ .../Localization/ILocalizationDictionary.cs | 2 - .../Json/JsonLocalizationDictionaryBuilder.cs | 2 +- .../Localization/LocalizationDictionary.cs | 64 ------------------- .../Abp/Localization/LocalizationResource.cs | 13 ++-- .../StaticLocalizationDictionary.cs | 40 ++++++++++++ 6 files changed, 112 insertions(+), 73 deletions(-) create mode 100644 framework/src/Volo.Abp.Localization/Volo/Abp/Localization/CombinedLocalizationDictionary.cs delete mode 100644 framework/src/Volo.Abp.Localization/Volo/Abp/Localization/LocalizationDictionary.cs create mode 100644 framework/src/Volo.Abp.Localization/Volo/Abp/Localization/StaticLocalizationDictionary.cs diff --git a/framework/src/Volo.Abp.Localization/Volo/Abp/Localization/CombinedLocalizationDictionary.cs b/framework/src/Volo.Abp.Localization/Volo/Abp/Localization/CombinedLocalizationDictionary.cs new file mode 100644 index 0000000000..fa3739298a --- /dev/null +++ b/framework/src/Volo.Abp.Localization/Volo/Abp/Localization/CombinedLocalizationDictionary.cs @@ -0,0 +1,64 @@ +using System.Collections.Generic; +using System.Collections.Immutable; +using System.Linq; + +namespace Volo.Abp.Localization +{ + public class CombinedLocalizationDictionary : ILocalizationDictionary + { + public string CultureName { get; } + + private readonly List _dictionaries; + + public CombinedLocalizationDictionary(params ILocalizationDictionary[] dictionaries) + { + Check.NotNullOrEmpty(dictionaries, nameof(dictionaries)); + _dictionaries = dictionaries.ToList(); + CultureName = dictionaries.First().CultureName; + + if (dictionaries.Any(d => d.CultureName != CultureName)) + { + throw new AbpException($"All given dictionaries should have the same {nameof(CultureName)}"); + } + } + + public LocalString GetOrNull(string name) + { + foreach (var dictionary in _dictionaries) + { + var value = dictionary.GetOrNull(name); + if (value != null) + { + return value; + } + } + + return null; + } + + public IReadOnlyList GetAllStrings() + { + var localStrings = new Dictionary(); + + foreach (var dictionary in _dictionaries) + { + foreach (var localString in dictionary.GetAllStrings()) + { + localStrings[localString.Name] = localString; + } + } + + return localStrings.Values.ToImmutableList(); + } + + public void AddFirst(ILocalizationDictionary dictionary) + { + _dictionaries.AddFirst(dictionary); + } + + public void AddLast(ILocalizationDictionary dictionary) + { + _dictionaries.AddLast(dictionary); + } + } +} diff --git a/framework/src/Volo.Abp.Localization/Volo/Abp/Localization/ILocalizationDictionary.cs b/framework/src/Volo.Abp.Localization/Volo/Abp/Localization/ILocalizationDictionary.cs index c2de70ab40..7f94db103a 100644 --- a/framework/src/Volo.Abp.Localization/Volo/Abp/Localization/ILocalizationDictionary.cs +++ b/framework/src/Volo.Abp.Localization/Volo/Abp/Localization/ILocalizationDictionary.cs @@ -21,7 +21,5 @@ namespace Volo.Abp.Localization /// /// List of all object IReadOnlyList GetAllStrings(); - - void Extend(ILocalizationDictionary dictionary); } } \ No newline at end of file diff --git a/framework/src/Volo.Abp.Localization/Volo/Abp/Localization/Json/JsonLocalizationDictionaryBuilder.cs b/framework/src/Volo.Abp.Localization/Volo/Abp/Localization/Json/JsonLocalizationDictionaryBuilder.cs index 88f241a738..223843f773 100644 --- a/framework/src/Volo.Abp.Localization/Volo/Abp/Localization/Json/JsonLocalizationDictionaryBuilder.cs +++ b/framework/src/Volo.Abp.Localization/Volo/Abp/Localization/Json/JsonLocalizationDictionaryBuilder.cs @@ -75,7 +75,7 @@ namespace Volo.Abp.Localization.Json dublicateNames.JoinAsString(", ")); } - return new LocalizationDictionary(cultureCode, dictionary); + return new StaticLocalizationDictionary(cultureCode, dictionary); } } } \ No newline at end of file diff --git a/framework/src/Volo.Abp.Localization/Volo/Abp/Localization/LocalizationDictionary.cs b/framework/src/Volo.Abp.Localization/Volo/Abp/Localization/LocalizationDictionary.cs deleted file mode 100644 index 7b0a339726..0000000000 --- a/framework/src/Volo.Abp.Localization/Volo/Abp/Localization/LocalizationDictionary.cs +++ /dev/null @@ -1,64 +0,0 @@ -using System.Collections; -using System.Collections.Generic; -using System.Collections.Immutable; - -namespace Volo.Abp.Localization -{ - /// - /// Represents a simple implementation of interface. - /// - public class LocalizationDictionary : ILocalizationDictionary, IEnumerable - { - /// - public string CultureName { get; } - - private readonly Dictionary _dictionary; - - /// - /// Creates a new object. - /// - /// Culture of the dictionary - /// The dictionary - public LocalizationDictionary(string cultureName, Dictionary dictionary) - { - CultureName = cultureName; - _dictionary = dictionary; - } - - /// - public virtual LocalString GetOrNull(string name) - { - return _dictionary.GetOrDefault(name); - } - - /// - public virtual IReadOnlyList GetAllStrings() - { - return _dictionary.Values.ToImmutableList(); - } - - public void Extend(ILocalizationDictionary dictionary) - { - foreach (var localizedString in dictionary.GetAllStrings()) - { - _dictionary[localizedString.Name] = localizedString; - } - } - - /// - public virtual IEnumerator GetEnumerator() - { - return GetAllStrings().GetEnumerator(); - } - - IEnumerator IEnumerable.GetEnumerator() - { - return GetAllStrings().GetEnumerator(); - } - - protected bool Contains(string name) - { - return _dictionary.ContainsKey(name); - } - } -} \ No newline at end of file diff --git a/framework/src/Volo.Abp.Localization/Volo/Abp/Localization/LocalizationResource.cs b/framework/src/Volo.Abp.Localization/Volo/Abp/Localization/LocalizationResource.cs index 228608333c..097ef6ecb5 100644 --- a/framework/src/Volo.Abp.Localization/Volo/Abp/Localization/LocalizationResource.cs +++ b/framework/src/Volo.Abp.Localization/Volo/Abp/Localization/LocalizationResource.cs @@ -17,7 +17,8 @@ namespace Volo.Abp.Localization public string DefaultCultureName { get; set; } [NotNull] - public IDictionary Dictionaries { get; } + public IReadOnlyDictionary Dictionaries => _dictionaries; + private readonly Dictionary _dictionaries; [NotNull] public List Contributors { get; } @@ -37,7 +38,7 @@ namespace Volo.Abp.Localization ResourceType = Check.NotNull(resourceType, nameof(resourceType)); DefaultCultureName = defaultCultureName; - Dictionaries = new Dictionary(); + _dictionaries = new Dictionary(); BaseResourceTypes = new List(); Contributors = new List(); @@ -52,7 +53,7 @@ namespace Volo.Abp.Localization public virtual void FillDictionaries(IServiceProvider serviceProvider) { - Dictionaries.Clear(); + _dictionaries.Clear(); var context = new LocalizationResourceInitializationContext(this, serviceProvider); @@ -60,14 +61,14 @@ namespace Volo.Abp.Localization { foreach (var dictionary in contributor.GetDictionaries(context)) { - var existingDictionary = Dictionaries.GetOrDefault(dictionary.CultureName); + var existingDictionary = _dictionaries.GetOrDefault(dictionary.CultureName); if (existingDictionary == null) { - Dictionaries[dictionary.CultureName] = dictionary; + _dictionaries[dictionary.CultureName] = new CombinedLocalizationDictionary(dictionary); } else { - existingDictionary.Extend(dictionary); + _dictionaries[dictionary.CultureName].As().AddFirst(dictionary); } } } diff --git a/framework/src/Volo.Abp.Localization/Volo/Abp/Localization/StaticLocalizationDictionary.cs b/framework/src/Volo.Abp.Localization/Volo/Abp/Localization/StaticLocalizationDictionary.cs new file mode 100644 index 0000000000..dd398e1345 --- /dev/null +++ b/framework/src/Volo.Abp.Localization/Volo/Abp/Localization/StaticLocalizationDictionary.cs @@ -0,0 +1,40 @@ +using System.Collections; +using System.Collections.Generic; +using System.Collections.Immutable; + +namespace Volo.Abp.Localization +{ + /// + /// Represents a simple implementation of interface. + /// + public class StaticLocalizationDictionary : ILocalizationDictionary + { + /// + public string CultureName { get; } + + protected Dictionary Dictionary { get; } + + /// + /// Creates a new object. + /// + /// Culture of the dictionary + /// The dictionary + public StaticLocalizationDictionary(string cultureName, Dictionary dictionary) + { + CultureName = cultureName; + Dictionary = dictionary; + } + + /// + public virtual LocalString GetOrNull(string name) + { + return Dictionary.GetOrDefault(name); + } + + /// + public virtual IReadOnlyList GetAllStrings() + { + return Dictionary.Values.ToImmutableList(); + } + } +} \ No newline at end of file