Skip to content

Commit 3b6fbf1

Browse files
authored
Cache a dictionary of dictionaries (#15908)
* Re-commit change Re-commit change after merge * Fix issues after merge Update usings after merge * Re-delete obsolete Remove the obsolete method
1 parent 9338395 commit 3b6fbf1

File tree

1 file changed

+45
-19
lines changed

1 file changed

+45
-19
lines changed

src/Umbraco.Web.Common/UmbracoHelper.cs

Lines changed: 45 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
using Umbraco.Cms.Core.Models.PublishedContent;
55
using Umbraco.Cms.Core.Strings;
66
using Umbraco.Cms.Core.Templates;
7+
using Umbraco.Extensions;
78

89
namespace Umbraco.Cms.Web.Common;
910

@@ -18,7 +19,7 @@ public class UmbracoHelper
1819
private readonly IUmbracoComponentRenderer _componentRenderer;
1920
private readonly ICultureDictionaryFactory _cultureDictionaryFactory;
2021
private readonly IPublishedContentQuery _publishedContentQuery;
21-
private ICultureDictionary? _cultureDictionary;
22+
private readonly Dictionary<CultureInfo, ICultureDictionary> _cultureDictionaries = [];
2223

2324
private IPublishedContent? _currentPage;
2425

@@ -103,29 +104,29 @@ public async Task<IHtmlEncodedString> RenderTemplateAsync(int contentId, int? al
103104
/// <summary>
104105
/// Returns the dictionary value for the key specified
105106
/// </summary>
106-
/// <param name="key"></param>
107-
/// <returns></returns>
108-
public string? GetDictionaryValue(string key) => CultureDictionary[key];
107+
/// <param name="key">Key of dictionary item.</param>
108+
/// <returns>The dictionary value, should one exist.</returns>
109+
public string? GetDictionaryValue(string key) => GetDictionaryValue(key, Thread.CurrentThread.CurrentUICulture);
109110

110111

111112
/// <summary>
112113
/// Returns the dictionary value for the key specified, and if empty returns the specified default fall back value
113114
/// </summary>
114-
/// <param name="key">key of dictionary item</param>
115+
/// <param name="key">Key of dictionary item.</param>
115116
/// <param name="specificCulture">the specific culture on which the result well be back upon</param>
116-
/// <returns></returns>
117+
/// <returns>The dictionary value, should one exist.</returns>
117118
public string? GetDictionaryValue(string key, CultureInfo specificCulture)
118119
{
119-
_cultureDictionary = _cultureDictionaryFactory.CreateDictionary(specificCulture);
120-
return GetDictionaryValue(key);
120+
ICultureDictionary cultureDictionary = GetCultureDictionary(specificCulture);
121+
return cultureDictionary[key];
121122
}
122123

123124
/// <summary>
124125
/// Returns the dictionary value for the key specified, and if empty returns the specified default fall back value
125126
/// </summary>
126-
/// <param name="key">key of dictionary item</param>
127-
/// <param name="defaultValue">fall back text if dictionary item is empty - Name altText to match Umbraco.Field</param>
128-
/// <returns></returns>
127+
/// <param name="key">key of dictionary item.</param>
128+
/// <param name="defaultValue">fall back text if dictionary item is empty - Name altText to match Umbraco.Field.</param>
129+
/// <returns>Returns the dictionary value, or a default value if none exists.</returns>
129130
public string GetDictionaryValueOrDefault(string key, string defaultValue)
130131
{
131132
var dictionaryValue = GetDictionaryValue(key);
@@ -140,26 +141,51 @@ public string GetDictionaryValueOrDefault(string key, string defaultValue)
140141
/// <summary>
141142
/// Returns the dictionary value for the key specified, and if empty returns the specified default fall back value
142143
/// </summary>
143-
/// <param name="key">key of dictionary item</param>
144-
/// <param name="specificCulture">the specific culture on which the result well be back upon</param>
145-
/// <param name="defaultValue">fall back text if dictionary item is empty - Name altText to match Umbraco.Field</param>
146-
/// <returns></returns>
144+
/// <param name="key">Key of dictionary item.</param>
145+
/// <param name="specificCulture">The specific culture on which the result well be back upon.</param>
146+
/// <param name="defaultValue">Fall back text if dictionary item is empty - Name altText to match Umbraco.Field.</param>
147+
/// <returns>Returns the dictionary value, or a default value if none exists.</returns>
147148
public string GetDictionaryValueOrDefault(string key, CultureInfo specificCulture, string defaultValue)
148149
{
149-
_cultureDictionary = _cultureDictionaryFactory.CreateDictionary(specificCulture);
150-
var dictionaryValue = GetDictionaryValue(key);
150+
var dictionaryValue = GetDictionaryValue(key, specificCulture);
151151
if (string.IsNullOrWhiteSpace(dictionaryValue))
152152
{
153153
dictionaryValue = defaultValue;
154154
}
155+
155156
return dictionaryValue;
156157
}
157158

159+
/// <summary>
160+
/// Gets the ICultureDictionary for the current UI Culture for access to dictionary items
161+
/// </summary>
162+
public ICultureDictionary CultureDictionary => GetCultureDictionary(Thread.CurrentThread.CurrentUICulture);
158163

159164
/// <summary>
160-
/// Returns the ICultureDictionary for access to dictionary items
165+
/// Gets the ICultureDictionary for access to dictionary items for a specific culture
161166
/// </summary>
162-
public ICultureDictionary CultureDictionary => _cultureDictionary ??= _cultureDictionaryFactory.CreateDictionary();
167+
/// <param name="specificCulture">The culture of the culture dictionary you want to retrieve.</param>
168+
/// <returns>Returns the culture dictionary for the specified culture.</returns>
169+
public ICultureDictionary GetCultureDictionary(CultureInfo specificCulture)
170+
{
171+
CreateCultureDictionary(specificCulture);
172+
return _cultureDictionaries.GetValue(specificCulture)!;
173+
}
174+
175+
/// <summary>
176+
/// Creates a culture dictionary for a specific culture if it doesn't already exist
177+
/// </summary>
178+
/// <param name="specificCulture">The culture to create a culture dictionary for.</param>
179+
internal void CreateCultureDictionary(CultureInfo specificCulture)
180+
{
181+
if (_cultureDictionaries.ContainsKey(specificCulture))
182+
{
183+
return;
184+
}
185+
186+
ICultureDictionary dictionary = _cultureDictionaryFactory.CreateDictionary(specificCulture);
187+
_cultureDictionaries.Add(specificCulture, dictionary);
188+
}
163189

164190
#endregion
165191

0 commit comments

Comments
 (0)