From 3b6fbf1a4cfff9c08617aa404ab99df4a0c48dec Mon Sep 17 00:00:00 2001 From: Matthew Care Date: Sat, 17 Aug 2024 16:00:24 +0200 Subject: [PATCH] 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 --- src/Umbraco.Web.Common/UmbracoHelper.cs | 64 +++++++++++++++++-------- 1 file changed, 45 insertions(+), 19 deletions(-) diff --git a/src/Umbraco.Web.Common/UmbracoHelper.cs b/src/Umbraco.Web.Common/UmbracoHelper.cs index ec726148ecc6..9b1a9c627527 100644 --- a/src/Umbraco.Web.Common/UmbracoHelper.cs +++ b/src/Umbraco.Web.Common/UmbracoHelper.cs @@ -4,6 +4,7 @@ using Umbraco.Cms.Core.Models.PublishedContent; using Umbraco.Cms.Core.Strings; using Umbraco.Cms.Core.Templates; +using Umbraco.Extensions; namespace Umbraco.Cms.Web.Common; @@ -18,7 +19,7 @@ public class UmbracoHelper private readonly IUmbracoComponentRenderer _componentRenderer; private readonly ICultureDictionaryFactory _cultureDictionaryFactory; private readonly IPublishedContentQuery _publishedContentQuery; - private ICultureDictionary? _cultureDictionary; + private readonly Dictionary _cultureDictionaries = []; private IPublishedContent? _currentPage; @@ -103,29 +104,29 @@ public async Task RenderTemplateAsync(int contentId, int? al /// /// Returns the dictionary value for the key specified /// - /// - /// - public string? GetDictionaryValue(string key) => CultureDictionary[key]; + /// Key of dictionary item. + /// The dictionary value, should one exist. + public string? GetDictionaryValue(string key) => GetDictionaryValue(key, Thread.CurrentThread.CurrentUICulture); /// /// Returns the dictionary value for the key specified, and if empty returns the specified default fall back value /// - /// key of dictionary item + /// Key of dictionary item. /// the specific culture on which the result well be back upon - /// + /// The dictionary value, should one exist. public string? GetDictionaryValue(string key, CultureInfo specificCulture) { - _cultureDictionary = _cultureDictionaryFactory.CreateDictionary(specificCulture); - return GetDictionaryValue(key); + ICultureDictionary cultureDictionary = GetCultureDictionary(specificCulture); + return cultureDictionary[key]; } /// /// Returns the dictionary value for the key specified, and if empty returns the specified default fall back value /// - /// key of dictionary item - /// fall back text if dictionary item is empty - Name altText to match Umbraco.Field - /// + /// key of dictionary item. + /// fall back text if dictionary item is empty - Name altText to match Umbraco.Field. + /// Returns the dictionary value, or a default value if none exists. public string GetDictionaryValueOrDefault(string key, string defaultValue) { var dictionaryValue = GetDictionaryValue(key); @@ -140,26 +141,51 @@ public string GetDictionaryValueOrDefault(string key, string defaultValue) /// /// Returns the dictionary value for the key specified, and if empty returns the specified default fall back value /// - /// key of dictionary item - /// the specific culture on which the result well be back upon - /// fall back text if dictionary item is empty - Name altText to match Umbraco.Field - /// + /// Key of dictionary item. + /// The specific culture on which the result well be back upon. + /// Fall back text if dictionary item is empty - Name altText to match Umbraco.Field. + /// Returns the dictionary value, or a default value if none exists. public string GetDictionaryValueOrDefault(string key, CultureInfo specificCulture, string defaultValue) { - _cultureDictionary = _cultureDictionaryFactory.CreateDictionary(specificCulture); - var dictionaryValue = GetDictionaryValue(key); + var dictionaryValue = GetDictionaryValue(key, specificCulture); if (string.IsNullOrWhiteSpace(dictionaryValue)) { dictionaryValue = defaultValue; } + return dictionaryValue; } + /// + /// Gets the ICultureDictionary for the current UI Culture for access to dictionary items + /// + public ICultureDictionary CultureDictionary => GetCultureDictionary(Thread.CurrentThread.CurrentUICulture); /// - /// Returns the ICultureDictionary for access to dictionary items + /// Gets the ICultureDictionary for access to dictionary items for a specific culture /// - public ICultureDictionary CultureDictionary => _cultureDictionary ??= _cultureDictionaryFactory.CreateDictionary(); + /// The culture of the culture dictionary you want to retrieve. + /// Returns the culture dictionary for the specified culture. + public ICultureDictionary GetCultureDictionary(CultureInfo specificCulture) + { + CreateCultureDictionary(specificCulture); + return _cultureDictionaries.GetValue(specificCulture)!; + } + + /// + /// Creates a culture dictionary for a specific culture if it doesn't already exist + /// + /// The culture to create a culture dictionary for. + internal void CreateCultureDictionary(CultureInfo specificCulture) + { + if (_cultureDictionaries.ContainsKey(specificCulture)) + { + return; + } + + ICultureDictionary dictionary = _cultureDictionaryFactory.CreateDictionary(specificCulture); + _cultureDictionaries.Add(specificCulture, dictionary); + } #endregion