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> /// </summary>
/// <returns>List of all <see cref="LocalString"/> object</returns> /// <returns>List of all <see cref="LocalString"/> object</returns>
IReadOnlyList<LocalString> GetAllStrings(); 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(", ")); 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; } public string DefaultCultureName { get; set; }
[NotNull] [NotNull]
public IDictionary<string, ILocalizationDictionary> Dictionaries { get; } public IReadOnlyDictionary<string, ILocalizationDictionary> Dictionaries => _dictionaries;
private readonly Dictionary<string, ILocalizationDictionary> _dictionaries;
[NotNull] [NotNull]
public List<ILocalizationResourceContributor> Contributors { get; } public List<ILocalizationResourceContributor> Contributors { get; }
@ -37,7 +38,7 @@ namespace Volo.Abp.Localization
ResourceType = Check.NotNull(resourceType, nameof(resourceType)); ResourceType = Check.NotNull(resourceType, nameof(resourceType));
DefaultCultureName = defaultCultureName; DefaultCultureName = defaultCultureName;
Dictionaries = new Dictionary<string, ILocalizationDictionary>(); _dictionaries = new Dictionary<string, ILocalizationDictionary>();
BaseResourceTypes = new List<Type>(); BaseResourceTypes = new List<Type>();
Contributors = new List<ILocalizationResourceContributor>(); Contributors = new List<ILocalizationResourceContributor>();
@ -52,7 +53,7 @@ namespace Volo.Abp.Localization
public virtual void FillDictionaries(IServiceProvider serviceProvider) public virtual void FillDictionaries(IServiceProvider serviceProvider)
{ {
Dictionaries.Clear(); _dictionaries.Clear();
var context = new LocalizationResourceInitializationContext(this, serviceProvider); var context = new LocalizationResourceInitializationContext(this, serviceProvider);
@ -60,14 +61,14 @@ namespace Volo.Abp.Localization
{ {
foreach (var dictionary in contributor.GetDictionaries(context)) foreach (var dictionary in contributor.GetDictionaries(context))
{ {
var existingDictionary = Dictionaries.GetOrDefault(dictionary.CultureName); var existingDictionary = _dictionaries.GetOrDefault(dictionary.CultureName);
if (existingDictionary == null) if (existingDictionary == null)
{ {
Dictionaries[dictionary.CultureName] = dictionary; _dictionaries[dictionary.CultureName] = new CombinedLocalizationDictionary(dictionary);
} }
else 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