Skip to content

Commit bab93dc

Browse files
authored
Merge pull request aspnetboilerplate#1155 from 4nonym0us/undefined-localization-humanizer
Undefined localization string humanizer (Issue aspnetboilerplate#853)
2 parents 0468033 + af3e9ed commit bab93dc

6 files changed

+84
-9
lines changed

src/Abp/Configuration/Startup/ILocalizationConfiguration.cs

+9-1
Original file line numberDiff line numberDiff line change
@@ -40,5 +40,13 @@ public interface ILocalizationConfiguration
4040
/// Default: true.
4141
/// </summary>
4242
bool WrapGivenTextIfNotFound { get; set; }
43+
44+
/// <summary>
45+
/// It returns the given text by converting string from 'PascalCase' to a 'Sentense case'
46+
/// if not found in the localization source.
47+
/// This is considered only if <see cref="ReturnGivenTextIfNotFound"/> is true.
48+
/// Default: true.
49+
/// </summary>
50+
bool HumanizeTextIfNotFound { get; set; }
4351
}
44-
}
52+
}

src/Abp/Configuration/Startup/LocalizationConfiguration.cs

+5-1
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,9 @@ internal class LocalizationConfiguration : ILocalizationConfiguration
2323
/// <inheritdoc/>
2424
public bool WrapGivenTextIfNotFound { get; set; }
2525

26+
/// <inheritdoc/>
27+
public bool HumanizeTextIfNotFound { get; set; }
28+
2629
public LocalizationConfiguration()
2730
{
2831
Languages = new List<LanguageInfo>();
@@ -31,6 +34,7 @@ public LocalizationConfiguration()
3134
IsEnabled = true;
3235
ReturnGivenTextIfNotFound = true;
3336
WrapGivenTextIfNotFound = true;
37+
HumanizeTextIfNotFound = true;
3438
}
3539
}
36-
}
40+
}

src/Abp/Localization/LocalizationSourceHelper.cs

+13-3
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
1-
using Abp.Configuration.Startup;
1+
using System.Text.RegularExpressions;
2+
using Abp.Configuration.Startup;
23
using Abp.Logging;
34

45
namespace Abp.Localization
@@ -19,9 +20,18 @@ public static string ReturnGivenNameOrThrowException(ILocalizationConfiguration
1920

2021
LogHelper.Logger.Warn(exceptionMessage);
2122

22-
return configuration.WrapGivenTextIfNotFound
23-
? string.Format("[{0}]", name)
23+
var notFoundText = configuration.HumanizeTextIfNotFound
24+
? ToSentenceCase(name)
2425
: name;
26+
27+
return configuration.WrapGivenTextIfNotFound
28+
? string.Format("[{0}]", notFoundText)
29+
: notFoundText;
30+
}
31+
32+
private static string ToSentenceCase(string str)
33+
{
34+
return Regex.Replace(str, "[a-z][A-Z]", m => m.Value[0] + " " + char.ToLower(m.Value[1]));
2535
}
2636
}
2737
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
using System.Globalization;
2+
using Abp.Configuration.Startup;
3+
using Abp.Dependency;
4+
using Abp.Localization.Sources.Resource;
5+
using Abp.Tests.Localization.TestResourceFiles;
6+
using Shouldly;
7+
using Xunit;
8+
9+
namespace Abp.Tests.Localization
10+
{
11+
public class HumanizerOfUndefinedLocalizationSource_Tests
12+
{
13+
private readonly ResourceFileLocalizationSource _resourceFileLocalizationSource;
14+
private LocalizationConfiguration _localizationConfiguration;
15+
16+
public HumanizerOfUndefinedLocalizationSource_Tests()
17+
{
18+
_localizationConfiguration = new LocalizationConfiguration{ WrapGivenTextIfNotFound = false };
19+
_resourceFileLocalizationSource = new ResourceFileLocalizationSource("MyTestResource", MyTestResource.ResourceManager);
20+
_resourceFileLocalizationSource.Initialize(_localizationConfiguration, new IocManager());
21+
}
22+
23+
[Fact]
24+
public void Undefined_Localization_Source_Should_Be_Humanized()
25+
{
26+
// Default configuration
27+
_localizationConfiguration = new LocalizationConfiguration();
28+
29+
// Fallback to the same text as It's already in sentence case
30+
_resourceFileLocalizationSource
31+
.GetString("Lorem ipsum dolor sit amet", new CultureInfo("en-US"))
32+
.ShouldBe("Lorem ipsum dolor sit amet");
33+
34+
// Text in PascalCase should be converted properly
35+
_resourceFileLocalizationSource
36+
.GetString("LoremIpsumDolorSitAmet", new CultureInfo("en-US"))
37+
.ShouldBe("Lorem ipsum dolor sit amet");
38+
39+
// Text with mixed cases should be converted properly
40+
_resourceFileLocalizationSource
41+
.GetString("LoremIpsum dolor sit amet", new CultureInfo("en-US"))
42+
.ShouldBe("Lorem ipsum dolor sit amet");
43+
}
44+
}
45+
}

test/Abp.Tests/Localization/ResourceFileLocalizationSource_Tests.cs

+7-3
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,11 @@ public class ResourceFileLocalizationSource_Tests
1515
public ResourceFileLocalizationSource_Tests()
1616
{
1717
_resourceFileLocalizationSource = new ResourceFileLocalizationSource("MyTestResource", MyTestResource.ResourceManager);
18-
_resourceFileLocalizationSource.Initialize(new LocalizationConfiguration(), new IocManager());
18+
_resourceFileLocalizationSource.Initialize(new LocalizationConfiguration
19+
{
20+
HumanizeTextIfNotFound = false,
21+
WrapGivenTextIfNotFound = true
22+
}, new IocManager());
1923
}
2024

2125
[Fact]
@@ -28,7 +32,7 @@ public void Test_GetString()
2832
_resourceFileLocalizationSource.GetString("Hello", new CultureInfo("en-US")).ShouldBe("Hello!");
2933
_resourceFileLocalizationSource.GetString("World", new CultureInfo("en-US")).ShouldBe("World!");
3034
_resourceFileLocalizationSource.GetString("Hello", new CultureInfo("en-GB")).ShouldBe("Hello!");
31-
35+
3236
//Defined in Turkish
3337
_resourceFileLocalizationSource.GetString("Hello", new CultureInfo("tr")).ShouldBe("Merhaba!");
3438

@@ -37,7 +41,7 @@ public void Test_GetString()
3741

3842
//Undefined for Turkish, fallbacks to default language
3943
_resourceFileLocalizationSource.GetString("World", new CultureInfo("tr-TR")).ShouldBe("World!");
40-
44+
4145
//Undefined at all, fallback to given text
4246
_resourceFileLocalizationSource.GetString("Apple", new CultureInfo("en-US")).ShouldBe("[Apple]");
4347
}

test/Abp.Tests/Localization/Test_DictionaryBasedLocalizationSource.cs

+5-1
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,11 @@ public class Test_DictionaryBasedLocalizationSource
1616
public Test_DictionaryBasedLocalizationSource()
1717
{
1818
_localizationSource = new DictionaryBasedLocalizationSource("Test", new FakeLocalizationDictionary());
19-
_localizationSource.Initialize(new LocalizationConfiguration(), new IocManager());
19+
_localizationSource.Initialize(new LocalizationConfiguration
20+
{
21+
HumanizeTextIfNotFound = false,
22+
WrapGivenTextIfNotFound = true
23+
}, new IocManager());
2024
}
2125

2226
[Fact]

0 commit comments

Comments
 (0)