Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
44 changes: 21 additions & 23 deletions src/BootstrapBlazor/Localization/Json/JsonStringLocalizer.cs
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,6 @@

using Microsoft.Extensions.Localization;
using Microsoft.Extensions.Logging;
using System.Collections.Concurrent;
using System.Globalization;
using System.Reflection;
using System.Resources;
Expand Down Expand Up @@ -105,33 +104,28 @@ public override LocalizedString this[string name]
return ret;
}

private readonly ConcurrentDictionary<string, object?> _missingManifestCache = [];
private string? GetStringFromJson(string name)
{
// <para lang="zh">从 json 本地化文件中获取字符串</para>
// <para lang="en">get string from json localization file</para>
var localizerStrings = MergeResolveLocalizers(CacheManager.GetAllStringsByTypeName(Assembly, typeName));
var cacheKey = $"name={name}&culture={CultureInfo.CurrentUICulture.Name}";
string? ret = null;
if (!_missingManifestCache.ContainsKey(cacheKey))

var l = localizerStrings.Find(i => i.Name == name);
if (l is { ResourceNotFound: false })
{
var l = localizerStrings.Find(i => i.Name == name);
if (l is { ResourceNotFound: false })
{
ret = l.Value;
}
else
{
// <para lang="zh">如果没有找到资源信息则尝试从父类中查找</para>
// <para lang="en">If resource info not found, try to find from base class</para>
ret ??= GetStringFromBaseType(name);
ret = l.Value;
}
else
{
// <para lang="zh">如果没有找到资源信息则尝试从父类中查找</para>
// <para lang="en">If resource info not found, try to find from base class</para>
ret ??= GetStringFromBaseType(name);

if (ret is null)
{
// <para lang="zh">加入缺失资源信息缓存中</para>
// <para lang="en">Add to missing resource info cache</para>
HandleMissingResourceItem(name);
}
if (ret is null)
{
// <para lang="zh">加入缺失资源信息缓存中</para>
// <para lang="en">Add to missing resource info cache</para>
HandleMissingResourceItem(name);
}
}
return ret;
Expand Down Expand Up @@ -172,11 +166,15 @@ private List<LocalizedString> MergeResolveLocalizers(IEnumerable<LocalizedString
private void HandleMissingResourceItem(string name)
{
localizationMissingItemHandler.HandleMissingItem(name, typeName, CultureInfo.CurrentUICulture.Name);
if (jsonLocalizationOptions.IgnoreLocalizerMissing == false)
if (jsonLocalizationOptions.IgnoreLocalizerMissing)
{
return;
Comment thread
sourcery-ai[bot] marked this conversation as resolved.
}

if (Logger.IsEnabled(LogLevel.Information))
{
Logger.LogInformation("{JsonStringLocalizerName} searched for '{Name}' in '{TypeName}' with culture '{CultureName}' not found.", nameof(JsonStringLocalizer), name, typeName, CultureInfo.CurrentUICulture.Name);
}
_missingManifestCache.TryAdd($"name={name}&culture={CultureInfo.CurrentUICulture.Name}", null);
}
Comment thread
ArgoZhang marked this conversation as resolved.

private List<LocalizedString>? _allLocalizedStrings;
Expand Down
6 changes: 5 additions & 1 deletion test/UnitTest/Localization/JsonStringLocalizerTest.cs
Original file line number Diff line number Diff line change
Expand Up @@ -215,7 +215,8 @@ public void GetAllStrings_FromResource()
Assert.NotEmpty(items);
Assert.Equal("test-name", items.First(i => i.Name == "Name").Value);

var name = Utility.GetDisplayName(typeof(Dummy), "DummyName");
var type = typeof(Dummy);
var name = Utility.GetDisplayName(type, "DummyName");
Assert.Equal("test-name", name);
}

Expand Down Expand Up @@ -498,5 +499,8 @@ public void GetAllStrings_FromInject()
var localizer = provider.GetRequiredService<IStringLocalizer<Foo>>();
var item = localizer["Foo.Name"];
Assert.NotEqual("Foo.Name", item);

item = localizer["missing-item"];
Assert.True(item.ResourceNotFound);
}
}
Loading