Skip to content

Commit

Permalink
Cache a dictionary of dictionaries (#15908)
Browse files Browse the repository at this point in the history
* Re-commit change

Re-commit change after merge

* Fix issues after merge

Update usings after merge

* Re-delete obsolete

Remove the obsolete method
  • Loading branch information
matthewcare authored Aug 17, 2024
1 parent 9338395 commit 3b6fbf1
Showing 1 changed file with 45 additions and 19 deletions.
64 changes: 45 additions & 19 deletions src/Umbraco.Web.Common/UmbracoHelper.cs
Original file line number Diff line number Diff line change
Expand Up @@ -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;

Expand All @@ -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<CultureInfo, ICultureDictionary> _cultureDictionaries = [];

private IPublishedContent? _currentPage;

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


/// <summary>
/// Returns the dictionary value for the key specified, and if empty returns the specified default fall back value
/// </summary>
/// <param name="key">key of dictionary item</param>
/// <param name="key">Key of dictionary item.</param>
/// <param name="specificCulture">the specific culture on which the result well be back upon</param>
/// <returns></returns>
/// <returns>The dictionary value, should one exist.</returns>
public string? GetDictionaryValue(string key, CultureInfo specificCulture)
{
_cultureDictionary = _cultureDictionaryFactory.CreateDictionary(specificCulture);
return GetDictionaryValue(key);
ICultureDictionary cultureDictionary = GetCultureDictionary(specificCulture);
return cultureDictionary[key];
}

/// <summary>
/// Returns the dictionary value for the key specified, and if empty returns the specified default fall back value
/// </summary>
/// <param name="key">key of dictionary item</param>
/// <param name="defaultValue">fall back text if dictionary item is empty - Name altText to match Umbraco.Field</param>
/// <returns></returns>
/// <param name="key">key of dictionary item.</param>
/// <param name="defaultValue">fall back text if dictionary item is empty - Name altText to match Umbraco.Field.</param>
/// <returns>Returns the dictionary value, or a default value if none exists.</returns>
public string GetDictionaryValueOrDefault(string key, string defaultValue)
{
var dictionaryValue = GetDictionaryValue(key);
Expand All @@ -140,26 +141,51 @@ public string GetDictionaryValueOrDefault(string key, string defaultValue)
/// <summary>
/// Returns the dictionary value for the key specified, and if empty returns the specified default fall back value
/// </summary>
/// <param name="key">key of dictionary item</param>
/// <param name="specificCulture">the specific culture on which the result well be back upon</param>
/// <param name="defaultValue">fall back text if dictionary item is empty - Name altText to match Umbraco.Field</param>
/// <returns></returns>
/// <param name="key">Key of dictionary item.</param>
/// <param name="specificCulture">The specific culture on which the result well be back upon.</param>
/// <param name="defaultValue">Fall back text if dictionary item is empty - Name altText to match Umbraco.Field.</param>
/// <returns>Returns the dictionary value, or a default value if none exists.</returns>
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;
}

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

/// <summary>
/// Returns the ICultureDictionary for access to dictionary items
/// Gets the ICultureDictionary for access to dictionary items for a specific culture
/// </summary>
public ICultureDictionary CultureDictionary => _cultureDictionary ??= _cultureDictionaryFactory.CreateDictionary();
/// <param name="specificCulture">The culture of the culture dictionary you want to retrieve.</param>
/// <returns>Returns the culture dictionary for the specified culture.</returns>
public ICultureDictionary GetCultureDictionary(CultureInfo specificCulture)
{
CreateCultureDictionary(specificCulture);
return _cultureDictionaries.GetValue(specificCulture)!;
}

/// <summary>
/// Creates a culture dictionary for a specific culture if it doesn't already exist
/// </summary>
/// <param name="specificCulture">The culture to create a culture dictionary for.</param>
internal void CreateCultureDictionary(CultureInfo specificCulture)
{
if (_cultureDictionaries.ContainsKey(specificCulture))
{
return;
}

ICultureDictionary dictionary = _cultureDictionaryFactory.CreateDictionary(specificCulture);
_cultureDictionaries.Add(specificCulture, dictionary);
}

#endregion

Expand Down

0 comments on commit 3b6fbf1

Please sign in to comment.