Browse Source

Refactored localization dictionaries.

pull/395/head
Halil ibrahim Kalkan 8 years ago
parent
commit
415ea939ff
  1. 64
      framework/src/Volo.Abp.Localization/Volo/Abp/Localization/CombinedLocalizationDictionary.cs
  2. 2
      framework/src/Volo.Abp.Localization/Volo/Abp/Localization/ILocalizationDictionary.cs
  3. 2
      framework/src/Volo.Abp.Localization/Volo/Abp/Localization/Json/JsonLocalizationDictionaryBuilder.cs
  4. 64
      framework/src/Volo.Abp.Localization/Volo/Abp/Localization/LocalizationDictionary.cs
  5. 13
      framework/src/Volo.Abp.Localization/Volo/Abp/Localization/LocalizationResource.cs
  6. 40
      framework/src/Volo.Abp.Localization/Volo/Abp/Localization/StaticLocalizationDictionary.cs

64
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<ILocalizationDictionary> _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<LocalString> GetAllStrings()
{
var localStrings = new Dictionary<string, LocalString>();
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);
}
}
}

2
framework/src/Volo.Abp.Localization/Volo/Abp/Localization/ILocalizationDictionary.cs

@ -21,7 +21,5 @@ namespace Volo.Abp.Localization
/// </summary>
/// <returns>List of all <see cref="LocalString"/> object</returns>
IReadOnlyList<LocalString> GetAllStrings();
void Extend(ILocalizationDictionary dictionary);
}
}

2
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);
}
}
}

64
framework/src/Volo.Abp.Localization/Volo/Abp/Localization/LocalizationDictionary.cs

@ -1,64 +0,0 @@
using System.Collections;
using System.Collections.Generic;
using System.Collections.Immutable;
namespace Volo.Abp.Localization
{
/// <summary>
/// Represents a simple implementation of <see cref="ILocalizationDictionary"/> interface.
/// </summary>
public class LocalizationDictionary : ILocalizationDictionary, IEnumerable<LocalString>
{
/// <inheritdoc/>
public string CultureName { get; }
private readonly Dictionary<string, LocalString> _dictionary;
/// <summary>
/// Creates a new <see cref="LocalizationDictionary"/> object.
/// </summary>
/// <param name="cultureName">Culture of the dictionary</param>
/// <param name="dictionary">The dictionary</param>
public LocalizationDictionary(string cultureName, Dictionary<string, LocalString> dictionary)
{
CultureName = cultureName;
_dictionary = dictionary;
}
/// <inheritdoc/>
public virtual LocalString GetOrNull(string name)
{
return _dictionary.GetOrDefault(name);
}
/// <inheritdoc/>
public virtual IReadOnlyList<LocalString> GetAllStrings()
{
return _dictionary.Values.ToImmutableList();
}
public void Extend(ILocalizationDictionary dictionary)
{
foreach (var localizedString in dictionary.GetAllStrings())
{
_dictionary[localizedString.Name] = localizedString;
}
}
/// <inheritdoc/>
public virtual IEnumerator<LocalString> GetEnumerator()
{
return GetAllStrings().GetEnumerator();
}
IEnumerator IEnumerable.GetEnumerator()
{
return GetAllStrings().GetEnumerator();
}
protected bool Contains(string name)
{
return _dictionary.ContainsKey(name);
}
}
}

13
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<string, ILocalizationDictionary> Dictionaries { get; }
public IReadOnlyDictionary<string, ILocalizationDictionary> Dictionaries => _dictionaries;
private readonly Dictionary<string, ILocalizationDictionary> _dictionaries;
[NotNull]
public List<ILocalizationResourceContributor> Contributors { get; }
@ -37,7 +38,7 @@ namespace Volo.Abp.Localization
ResourceType = Check.NotNull(resourceType, nameof(resourceType));
DefaultCultureName = defaultCultureName;
Dictionaries = new Dictionary<string, ILocalizationDictionary>();
_dictionaries = new Dictionary<string, ILocalizationDictionary>();
BaseResourceTypes = new List<Type>();
Contributors = new List<ILocalizationResourceContributor>();
@ -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<CombinedLocalizationDictionary>().AddFirst(dictionary);
}
}
}

40
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
{
/// <summary>
/// Represents a simple implementation of <see cref="ILocalizationDictionary"/> interface.
/// </summary>
public class StaticLocalizationDictionary : ILocalizationDictionary
{
/// <inheritdoc/>
public string CultureName { get; }
protected Dictionary<string, LocalString> Dictionary { get; }
/// <summary>
/// Creates a new <see cref="StaticLocalizationDictionary"/> object.
/// </summary>
/// <param name="cultureName">Culture of the dictionary</param>
/// <param name="dictionary">The dictionary</param>
public StaticLocalizationDictionary(string cultureName, Dictionary<string, LocalString> dictionary)
{
CultureName = cultureName;
Dictionary = dictionary;
}
/// <inheritdoc/>
public virtual LocalString GetOrNull(string name)
{
return Dictionary.GetOrDefault(name);
}
/// <inheritdoc/>
public virtual IReadOnlyList<LocalString> GetAllStrings()
{
return Dictionary.Values.ToImmutableList();
}
}
}
Loading…
Cancel
Save