diff --git a/src/BootstrapBlazor/BootstrapBlazor.csproj b/src/BootstrapBlazor/BootstrapBlazor.csproj index 96fb981e6c7bdcb9eec8dcfed3baef51123a03e5..c3f0d24d488f58db42059ca024e1021fc2b1b846 100644 --- a/src/BootstrapBlazor/BootstrapBlazor.csproj +++ b/src/BootstrapBlazor/BootstrapBlazor.csproj @@ -1,7 +1,7 @@ - 6.11.29 + 6.11.30-beta02 diff --git a/src/BootstrapBlazor/Localization/Json/JsonStringLocalizer.cs b/src/BootstrapBlazor/Localization/Json/JsonStringLocalizer.cs index b295839ed6cbaeb79815ab375628b3a19ad964be..55cf509eae33494a5c97ffc8b2eff737a2b29110 100644 --- a/src/BootstrapBlazor/Localization/Json/JsonStringLocalizer.cs +++ b/src/BootstrapBlazor/Localization/Json/JsonStringLocalizer.cs @@ -73,9 +73,23 @@ internal class JsonStringLocalizer : ResourceManagerStringLocalizer { get { - var format = GetStringSafely(name); - var value = string.Format(CultureInfo.CurrentCulture, format ?? name, arguments); - return new LocalizedString(name, value, resourceNotFound: format == null, searchedLocation: TypeName); + var value = SafeFormat(); + return new LocalizedString(name, value ?? name, resourceNotFound: value == null, searchedLocation: TypeName); + + string? SafeFormat() + { + string? ret = null; + try + { + var format = GetStringSafely(name); + ret = string.Format(CultureInfo.CurrentCulture, format ?? name, arguments); + } + catch (Exception ex) + { + Logger.LogError(ex, "{JsonStringLocalizerName} searched for '{Name}' in '{TypeName}' with culture '{CultureName}' throw exception.", nameof(JsonStringLocalizer), name, TypeName, CultureInfo.CurrentUICulture.Name); + } + return ret; + } } } @@ -161,7 +175,7 @@ internal class JsonStringLocalizer : ResourceManagerStringLocalizer { if (!IgnoreLocalizerMissing) { - Logger.LogInformation($"{nameof(JsonStringLocalizer)} searched for '{name}' in '{TypeName}' with culture '{CultureInfo.CurrentUICulture.Name}' not found."); + Logger.LogInformation("{JsonStringLocalizerName} searched for '{Name}' in '{TypeName}' with culture '{CultureName}' not found.", nameof(JsonStringLocalizer), name, TypeName, CultureInfo.CurrentUICulture.Name); } } diff --git a/test/UnitTest/Localization/JsonStringLocalizerTest.cs b/test/UnitTest/Localization/JsonStringLocalizerTest.cs index d5526982f898efbe0a614a73227ab4736de1d0b5..5e3a1ba067399688d979d62054c0a2118a6ee00e 100644 --- a/test/UnitTest/Localization/JsonStringLocalizerTest.cs +++ b/test/UnitTest/Localization/JsonStringLocalizerTest.cs @@ -212,6 +212,22 @@ public class JsonStringLocalizerTest : BootstrapBlazorTestBase Assert.Equal("test-name", localizer["test-name"]); } + [Fact] + public void FormatException_Ok() + { + var sc = new ServiceCollection(); + sc.AddConfiguration(); + sc.AddSingleton(); + sc.AddTransient(); + sc.AddBootstrapBlazor(); + + var provider = sc.BuildServiceProvider(); + var localizer = provider.GetRequiredService>(); + var v = localizer["Mock-FakeAddress", "Test"]; + Assert.True(v.ResourceNotFound); + Assert.Equal("Mock-FakeAddress", v); + } + [Fact] public void GetResourcePrefix_Ok() { @@ -260,7 +276,8 @@ public class JsonStringLocalizerTest : BootstrapBlazorTestBase public IEnumerable GetAllStrings(bool includeParentCultures) => new List() { new LocalizedString("Mock-Name", "Mock-Test-Name"), - new LocalizedString("Mock-Address", "Mock-Test-Address-{0}") + new LocalizedString("Mock-Address", "Mock-Test-Address-{0}"), + new LocalizedString("Mock-FakeAddress", "Mock-Test-Address-{ 0}") }; }