Browse Source

Support to get all strings without inheritance

pull/892/head
Halil ibrahim Kalkan 7 years ago
parent
commit
2f0aa53cad
  1. 36
      framework/src/Volo.Abp.Localization/Volo/Abp/Localization/AbpDictionaryBasedStringLocalizer.cs
  2. 3
      framework/src/Volo.Abp.Localization/Volo/Abp/Localization/AbpLocalizationModule.cs
  3. 46
      framework/src/Volo.Abp.Localization/Volo/Abp/Localization/AbpStringLocalizerExtensions.cs
  4. 10
      framework/src/Volo.Abp.Localization/Volo/Abp/Localization/IStringLocalizerSupportsInheritance.cs
  5. 52
      framework/test/Volo.Abp.Localization.Tests/Volo/Abp/Localization/AbpLocalization_Tests.cs

36
framework/src/Volo.Abp.Localization/Volo/Abp/Localization/AbpDictionaryBasedStringLocalizer.cs

@ -8,7 +8,7 @@ using Microsoft.Extensions.Localization;
namespace Volo.Abp.Localization
{
public class AbpDictionaryBasedStringLocalizer : IStringLocalizer
public class AbpDictionaryBasedStringLocalizer : IStringLocalizer, IStringLocalizerSupportsInheritance
{
public LocalizationResource Resource { get; }
@ -32,6 +32,16 @@ namespace Volo.Abp.Localization
);
}
public IEnumerable<LocalizedString> GetAllStrings(bool includeParentCultures, bool includeBaseLocalizers)
{
return GetAllStrings(
CultureInfo.CurrentUICulture.Name,
includeParentCultures,
includeBaseLocalizers
);
}
public IStringLocalizer WithCulture(CultureInfo culture)
{
return new CultureWrapperStringLocalizer(culture.Name, this);
@ -114,26 +124,30 @@ namespace Volo.Abp.Localization
protected virtual IReadOnlyList<LocalizedString> GetAllStrings(
string cultureName,
bool includeParentCultures = true)
bool includeParentCultures = true,
bool includeBaseLocalizers = true)
{
//TODO: Can be optimized (example: if it's already default dictionary, skip overriding)
var allStrings = new Dictionary<string, LocalizedString>();
foreach (var baseLocalizer in BaseLocalizers.Select(l => l.WithCulture(CultureInfo.GetCultureInfo(cultureName))))
if (includeBaseLocalizers)
{
//TODO: Try/catch is a workaround here!
try
foreach (var baseLocalizer in BaseLocalizers.Select(l => l.WithCulture(CultureInfo.GetCultureInfo(cultureName))))
{
var baseLocalizedString = baseLocalizer.GetAllStrings(includeParentCultures);
foreach (var localizedString in baseLocalizedString)
//TODO: Try/catch is a workaround here!
try
{
allStrings[localizedString.Name] = localizedString;
var baseLocalizedString = baseLocalizer.GetAllStrings(includeParentCultures);
foreach (var localizedString in baseLocalizedString)
{
allStrings[localizedString.Name] = localizedString;
}
}
}
catch (MissingManifestResourceException)
{
catch (MissingManifestResourceException)
{
}
}
}

3
framework/src/Volo.Abp.Localization/Volo/Abp/Localization/AbpLocalizationModule.cs

@ -1,4 +1,5 @@
using Volo.Abp.Localization.Resources.AbpValidation;
using Microsoft.Extensions.DependencyInjection;
using Volo.Abp.Localization.Resources.AbpValidation;
using Volo.Abp.Modularity;
using Volo.Abp.Settings;
using Volo.Abp.VirtualFileSystem;

46
framework/src/Volo.Abp.Localization/Volo/Abp/Localization/AbpStringLocalizerExtensions.cs

@ -0,0 +1,46 @@
using System.Collections.Generic;
using System.Reflection;
using Microsoft.Extensions.Localization;
using Volo.Abp.DynamicProxy;
namespace Volo.Abp.Localization
{
public static class AbpStringLocalizerExtensions
{
public static IStringLocalizer GetInternalLocalizer(this IStringLocalizer stringLocalizer)
{
var localizerField = stringLocalizer.GetType()
.GetField(
"_localizer",
BindingFlags.Instance |
BindingFlags.NonPublic
);
if (localizerField == null)
{
return stringLocalizer;
}
return localizerField.GetValue(stringLocalizer) as IStringLocalizer;
}
public static IEnumerable<LocalizedString> GetAllStrings(
this IStringLocalizer stringLocalizer,
bool includeParentCultures,
bool includeBaseLocalizers)
{
var internalLocalizer = (ProxyHelper.UnProxy(stringLocalizer) as IStringLocalizer).GetInternalLocalizer();
if (internalLocalizer is IStringLocalizerSupportsInheritance stringLocalizerSupportsInheritance)
{
return stringLocalizerSupportsInheritance.GetAllStrings(
includeParentCultures,
includeBaseLocalizers
);
}
return stringLocalizer.GetAllStrings(
includeParentCultures
);
}
}
}

10
framework/src/Volo.Abp.Localization/Volo/Abp/Localization/IStringLocalizerSupportsInheritance.cs

@ -0,0 +1,10 @@
using System.Collections.Generic;
using Microsoft.Extensions.Localization;
namespace Volo.Abp.Localization
{
public interface IStringLocalizerSupportsInheritance
{
IEnumerable<LocalizedString> GetAllStrings(bool includeParentCultures, bool includeBaseLocalizers);
}
}

52
framework/test/Volo.Abp.Localization.Tests/Volo/Abp/Localization/AbpLocalization_Tests.cs

@ -21,6 +21,14 @@ namespace Volo.Abp.Localization
_localizer = GetRequiredService<IStringLocalizer<LocalizationTestResource>>();
}
[Fact]
public void AbpStringLocalizerExtensions_GetInternalLocalizer()
{
var internalLocalizer = _localizer.GetInternalLocalizer();
internalLocalizer.ShouldNotBeNull();
internalLocalizer.ShouldBeOfType<AbpDictionaryBasedStringLocalizer>();
}
[Fact]
public void Should_Get_Same_Text_If_Not_Defined_Anywhere()
{
@ -145,6 +153,50 @@ namespace Volo.Abp.Localization
}
}
[Fact]
public void GetAllStrings_With_Inheritance()
{
using (AbpCultureHelper.Use("tr"))
{
var localizedStrings = _localizer
.GetAllStrings(true, includeBaseLocalizers: true)
.ToList();
localizedStrings.ShouldContain(
ls => ls.Name == "USA" &&
ls.Value == "Amerika Birleşik Devletleri" &&
ls.ResourceNotFound == false
);
localizedStrings.ShouldContain(
ls => ls.Name == "Universe" &&
ls.Value == "Evren" &&
ls.ResourceNotFound == false
);
}
}
[Fact]
public void GetAllStrings_Without_Inheritance()
{
using (AbpCultureHelper.Use("tr"))
{
var localizedStrings = _localizer
.GetAllStrings(true, includeBaseLocalizers: false)
.ToList();
localizedStrings.ShouldNotContain(
ls => ls.Name == "USA"
);
localizedStrings.ShouldContain(
ls => ls.Name == "Universe" &&
ls.Value == "Evren" &&
ls.ResourceNotFound == false
);
}
}
[DependsOn(typeof(AbpTestBaseModule))]
[DependsOn(typeof(AbpLocalizationModule))]
public class TestModule : AbpModule

Loading…
Cancel
Save