55
66using Microsoft . Extensions . Localization ;
77using Microsoft . Extensions . Logging ;
8+ using System . Collections . Concurrent ;
89using System . Globalization ;
910using System . Reflection ;
1011using 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