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() 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) foreach (var file in _virtualFileProvider.GetDirectoryContents(_virtualPath)
.Where(f => !f.IsDirectory && CanParseFile(f)) .Where(f => !f.IsDirectory && CanParseFile(f))
@ -102,20 +102,19 @@ public abstract class VirtualFileLocalizationResourceContributorBase : ILocaliza
continue; continue;
} }
if (!dictionaries.ContainsKey(dictionary.CultureName)) if (!rawDictionaries.TryGetValue(dictionary.CultureName, out var raw))
{ {
dictionaries[dictionary.CultureName] = dictionary; raw = new Dictionary<string, LocalizedString>();
} rawDictionaries[dictionary.CultureName] = raw;
else
{
var merged = new Dictionary<string, LocalizedString>();
dictionaries[dictionary.CultureName].Fill(merged);
dictionary.Fill(merged);
dictionaries[dictionary.CultureName] = new StaticLocalizationDictionary(dictionary.CultureName, merged);
} }
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); 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] [Fact]
public void Should_Create_Resource_By_Name_FromSplitFiles() public void Should_Create_Resource_By_Name_From_Split_Files()
{ {
using (CultureHelper.Use("en")) 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 public class JsonLocalizationDictionaryBuilder_Tests
{ {
[Fact] [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 = """ var input = """
{ {
"culture": "en", "culture": "en",
"texts": { "texts": {
"ThisFieldIsRequired": "This field is required", "DeepLocalizationKey__DeepKey": "FlatValue",
"MaxLenghtErrorMessage": "This field can be maximum of '{0}' chars", "DeepLocalizationKey": { "DeepKey": "NestedValue" }
"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"
} }
} }
"""; """;
var localizationDictionary = JsonLocalizationDictionaryBuilder.BuildFromJsonString(input); var localizationDictionary = JsonLocalizationDictionaryBuilder.BuildFromJsonString(input);
var localizationString = localizationDictionary.GetOrNull("ThisFieldIsRequired"); localizationDictionary.ShouldNotBeNull();
var localizationString = localizationDictionary.GetOrNull("DeepLocalizationKey__DeepKey");
localizationString.ShouldNotBeNull(); localizationString.ShouldNotBeNull();
localizationString.Value.ShouldBe("NestedValue");
localizationString.Value.ShouldBe("This field is required again");
} }
[Fact] [Fact]

Loading…
Cancel
Save