Browse Source

Refactor localization dictionary handling and improve test cases for split localization files

pull/25227/head
maliming 6 months ago
parent
commit
9c5015b8ec
No known key found for this signature in database GPG Key ID: A646B9CB645ECEA4
  1. 21
      framework/src/Volo.Abp.Localization/Volo/Abp/Localization/VirtualFiles/VirtualFileLocalizationResourceContributorBase.cs
  2. 2
      framework/test/Volo.Abp.Localization.Tests/Volo/Abp/Localization/AbpStringLocalizerFactory_Tests.cs
  3. 20
      framework/test/Volo.Abp.Localization.Tests/Volo/Abp/Localization/JsonLocalizationDictionaryBuilder_Tests.cs

21
framework/src/Volo.Abp.Localization/Volo/Abp/Localization/VirtualFiles/VirtualFileLocalizationResourceContributorBase.cs

@ -89,7 +89,7 @@ public abstract class VirtualFileLocalizationResourceContributorBase : ILocaliza
private Dictionary<string, ILocalizationDictionary> CreateDictionaries()
{
var dictionaries = new Dictionary<string, ILocalizationDictionary>();
var rawDictionaries = new Dictionary<string, Dictionary<string, LocalizedString>>();
foreach (var file in _virtualFileProvider.GetDirectoryContents(_virtualPath)
.Where(f => !f.IsDirectory && CanParseFile(f))
@ -102,20 +102,19 @@ public abstract class VirtualFileLocalizationResourceContributorBase : ILocaliza
continue;
}
if (!dictionaries.ContainsKey(dictionary.CultureName))
if (!rawDictionaries.TryGetValue(dictionary.CultureName, out var raw))
{
dictionaries[dictionary.CultureName] = dictionary;
}
else
{
var merged = new Dictionary<string, LocalizedString>();
dictionaries[dictionary.CultureName].Fill(merged);
dictionary.Fill(merged);
dictionaries[dictionary.CultureName] = new StaticLocalizationDictionary(dictionary.CultureName, merged);
raw = new Dictionary<string, LocalizedString>();
rawDictionaries[dictionary.CultureName] = raw;
}
dictionary.Fill(raw);
}
return dictionaries;
return rawDictionaries.ToDictionary(
kvp => kvp.Key,
kvp => (ILocalizationDictionary)new StaticLocalizationDictionary(kvp.Key, kvp.Value)
);
}
protected abstract bool CanParseFile(IFileInfo file);

2
framework/test/Volo.Abp.Localization.Tests/Volo/Abp/Localization/AbpStringLocalizerFactory_Tests.cs

@ -93,7 +93,7 @@ public class AbpStringLocalizerFactory_Tests : AbpIntegratedTest<AbpLocalization
}
[Fact]
public void Should_Create_Resource_By_Name_FromSplitFiles()
public void Should_Create_Resource_By_Name_From_Split_Files()
{
using (CultureHelper.Use("en"))
{

20
framework/test/Volo.Abp.Localization.Tests/Volo/Abp/Localization/JsonLocalizationDictionaryBuilder_Tests.cs

@ -10,29 +10,25 @@ namespace Volo.Abp.Localization;
public class JsonLocalizationDictionaryBuilder_Tests
{
[Fact]
public void JsonLocalizationDictionaryBuilder_Should_Handle_Duplicates()
public void Should_Use_Nested_Value_When_Flat_Key_Is_Defined_Before_Nested_Object()
{
// When a flat key (e.g. "Foo__Bar") appears before a nested object (e.g. "Foo": {"Bar": ...}),
// the nested value wins because FlattenTexts processes keys in order and last-write wins.
var input = """
{
"culture": "en",
"texts": {
"ThisFieldIsRequired": "This field is required",
"MaxLenghtErrorMessage": "This field can be maximum of '{0}' chars",
"Enum:BookType.Undefined": "Undefined from ValidationResource",
"Enum:BookType.0": "Undefined with value 0 from ValidationResource",
"BookType.Adventure": "Adventure from ValidationResource",
"BookType.1": "Adventure with value 1 from ValidationResource",
"Biography": "Biography from ValidationResource",
"ThisFieldIsRequired": "This field is required again"
"DeepLocalizationKey__DeepKey": "FlatValue",
"DeepLocalizationKey": { "DeepKey": "NestedValue" }
}
}
""";
var localizationDictionary = JsonLocalizationDictionaryBuilder.BuildFromJsonString(input);
var localizationString = localizationDictionary.GetOrNull("ThisFieldIsRequired");
localizationDictionary.ShouldNotBeNull();
var localizationString = localizationDictionary.GetOrNull("DeepLocalizationKey__DeepKey");
localizationString.ShouldNotBeNull();
localizationString.Value.ShouldBe("This field is required again");
localizationString.Value.ShouldBe("NestedValue");
}
[Fact]

Loading…
Cancel
Save