Skip to content

Commit d0dd670

Browse files
refactor(CacheManager): add cache by type (#5152)
* doc: remove missing cache * refactor: 重构缓存键值 * test: 增加多语言支持 Co-Authored-By: Alex chow <[email protected]> Co-Authored-By: Argo Zhang <[email protected]>
1 parent 554b715 commit d0dd670

File tree

3 files changed

+52
-38
lines changed

3 files changed

+52
-38
lines changed

src/BootstrapBlazor.Server/Locales/en-US.json

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6889,5 +6889,17 @@
68896889
"Watermarkntro": "Add specific text or patterns to the page",
68906890
"WatermarkNormalTitle": "Basic usage",
68916891
"WatermarkNormalIntro": "Use the <code>Text</code> property to set a string to specify the watermark text"
6892+
},
6893+
"BootstrapBlazor.Server.Data.AttributeItem": {
6894+
"Name": "Name",
6895+
"Description": "Description",
6896+
"Type": "Type",
6897+
"ValueList": "ValueList",
6898+
"DefaultValue": "DefaultValue"
6899+
},
6900+
"BootstrapBlazor.Server.Data.EventItem": {
6901+
"Name": "Name",
6902+
"Description": "Description",
6903+
"Type": "Type"
68926904
}
68936905
}

src/BootstrapBlazor.Server/Locales/zh-CN.json

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6888,5 +6888,17 @@
68886888
"Watermarkntro": "在页面上添加文本或图片等水印信息",
68896889
"WatermarkNormalTitle": "基础用法",
68906890
"WatermarkNormalIntro": "使用 <code>Text</code> 属性设置一个字符串指定水印内容"
6891+
},
6892+
"BootstrapBlazor.Server.Data.AttributeItem": {
6893+
"Name": "参数",
6894+
"Description": "说明",
6895+
"Type": "类型",
6896+
"ValueList": "可选值",
6897+
"DefaultValue": "默认值"
6898+
},
6899+
"BootstrapBlazor.Server.Data.EventItem": {
6900+
"Name": "参数",
6901+
"Description": "说明",
6902+
"Type": "类型"
68916903
}
68926904
}

src/BootstrapBlazor/Localization/Json/JsonStringLocalizer.cs

Lines changed: 28 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55

66
using Microsoft.Extensions.Localization;
77
using Microsoft.Extensions.Logging;
8+
using System.Collections.Concurrent;
89
using System.Globalization;
910
using System.Reflection;
1011
using System.Resources;
@@ -71,30 +72,37 @@ public override LocalizedString this[string name]
7172
}
7273
}
7374

74-
private string? GetStringSafely(string name)
75-
{
76-
return GetStringFromService(name)
77-
?? GetStringSafely(name, null)
78-
?? GetStringSafelyFromJson(name);
75+
private string? GetStringSafely(string name) => GetStringFromService(name) ?? GetStringSafely(name, null) ?? GetStringSafelyFromJson(name);
7976

77+
private string? GetStringFromService(string name)
78+
{
8079
// get string from inject service
81-
string? GetStringFromService(string name)
80+
string? ret = null;
81+
var localizer = Utility.GetStringLocalizerFromService(Assembly, typeName);
82+
if (localizer != null && localizer is not JsonStringLocalizer)
8283
{
83-
string? ret = null;
84-
var localizer = Utility.GetStringLocalizerFromService(Assembly, typeName);
85-
if (localizer != null && localizer is not JsonStringLocalizer)
84+
var cacheKey = $"name={name}&culture={CultureInfo.CurrentUICulture.Name}";
85+
if (!_missingManifestCache.ContainsKey(cacheKey))
8686
{
87-
ret = GetLocalizerValueFromCache(localizer, name);
87+
var l = localizer[name];
88+
if (!l.ResourceNotFound)
89+
{
90+
ret = l.Value;
91+
}
92+
else
93+
{
94+
HandleMissingResourceItem(name);
95+
}
8896
}
89-
return ret;
9097
}
98+
return ret;
99+
}
91100

101+
private string? GetStringSafelyFromJson(string name)
102+
{
92103
// get string from json localization file
93-
string? GetStringSafelyFromJson(string name)
94-
{
95-
var localizerStrings = MegerResolveLocalizers(CacheManager.GetAllStringsByTypeName(Assembly, typeName));
96-
return GetValueFromCache(localizerStrings, name);
97-
}
104+
var localizerStrings = MegerResolveLocalizers(CacheManager.GetAllStringsByTypeName(Assembly, typeName));
105+
return GetValueFromCache(localizerStrings, name);
98106
}
99107

100108
private List<LocalizedString> MegerResolveLocalizers(IEnumerable<LocalizedString>? localizerStrings)
@@ -110,12 +118,13 @@ private List<LocalizedString> MegerResolveLocalizers(IEnumerable<LocalizedString
110118
return localizers;
111119
}
112120

113-
private readonly HashSet<string> _missingLocalizerCache = [];
121+
private readonly ConcurrentDictionary<string, object?> _missingManifestCache = [];
114122

115123
private string? GetValueFromCache(List<LocalizedString> localizerStrings, string name)
116124
{
117125
string? ret = null;
118-
if (!_missingLocalizerCache.Contains(name))
126+
var cacheKey = $"name={name}&culture={CultureInfo.CurrentUICulture.Name}";
127+
if (!_missingManifestCache.ContainsKey(cacheKey))
119128
{
120129
var l = localizerStrings.Find(i => i.Name == name);
121130
if (l is { ResourceNotFound: false })
@@ -125,26 +134,6 @@ private List<LocalizedString> MegerResolveLocalizers(IEnumerable<LocalizedString
125134
else
126135
{
127136
HandleMissingResourceItem(name);
128-
_missingLocalizerCache.Add(name);
129-
}
130-
}
131-
return ret;
132-
}
133-
134-
private string? GetLocalizerValueFromCache(IStringLocalizer localizer, string name)
135-
{
136-
string? ret = null;
137-
if (!_missingLocalizerCache.Contains(name))
138-
{
139-
var l = localizer[name];
140-
if (!l.ResourceNotFound)
141-
{
142-
ret = l.Value;
143-
}
144-
else
145-
{
146-
HandleMissingResourceItem(name);
147-
_missingLocalizerCache.Add(name);
148137
}
149138
}
150139
return ret;
@@ -157,6 +146,7 @@ private void HandleMissingResourceItem(string name)
157146
{
158147
Logger.LogInformation("{JsonStringLocalizerName} searched for '{Name}' in '{TypeName}' with culture '{CultureName}' not found.", nameof(JsonStringLocalizer), name, typeName, CultureInfo.CurrentUICulture.Name);
159148
}
149+
_missingManifestCache.TryAdd($"name={name}&culture={CultureInfo.CurrentUICulture.Name}", null);
160150
}
161151

162152
private List<LocalizedString>? _allLocalizerdStrings;

0 commit comments

Comments
 (0)