From 0da33d064ae13caed5a5390e4f269629bfd91f04 Mon Sep 17 00:00:00 2001 From: Ibrahim Muhammad Nada Date: Thu, 6 Jul 2023 13:29:18 +0300 Subject: [PATCH] Fixes #12904 UmbracoHelper.GetDictionaryValue defaults to en-US when used in non-front end code (#12942) * adding new overload/rename a method * remove this keyword * fix comment * remove space * commit * revert * replace param name * public backward compatibility * Minor style tweaks * Don't change default culture in UmbracoCultureDictionary --------- Co-authored-by: Nikolaj --- .../Dictionary/ICultureDictionaryFactory.cs | 4 ++ .../Dictionary/UmbracoCultureDictionary.cs | 3 +- .../UmbracoCultureDictionaryFactory.cs | 4 ++ src/Umbraco.Web.Common/UmbracoHelper.cs | 52 +++++++++++++++++++ 4 files changed, 62 insertions(+), 1 deletion(-) diff --git a/src/Umbraco.Core/Dictionary/ICultureDictionaryFactory.cs b/src/Umbraco.Core/Dictionary/ICultureDictionaryFactory.cs index 6cb2642b1539..242cfb8e3575 100644 --- a/src/Umbraco.Core/Dictionary/ICultureDictionaryFactory.cs +++ b/src/Umbraco.Core/Dictionary/ICultureDictionaryFactory.cs @@ -1,6 +1,10 @@ +using System.Globalization; + namespace Umbraco.Cms.Core.Dictionary; public interface ICultureDictionaryFactory { ICultureDictionary CreateDictionary(); + + ICultureDictionary CreateDictionary(CultureInfo specificCulture) => throw new NotImplementedException(); } diff --git a/src/Umbraco.Core/Dictionary/UmbracoCultureDictionary.cs b/src/Umbraco.Core/Dictionary/UmbracoCultureDictionary.cs index de968f167640..36e1acbce8ba 100644 --- a/src/Umbraco.Core/Dictionary/UmbracoCultureDictionary.cs +++ b/src/Umbraco.Core/Dictionary/UmbracoCultureDictionary.cs @@ -1,4 +1,5 @@ using System.Globalization; +using System.Text.RegularExpressions; using Umbraco.Cms.Core.Cache; using Umbraco.Cms.Core.Models; using Umbraco.Cms.Core.Services; @@ -47,7 +48,7 @@ public DefaultCultureDictionary(CultureInfo specificCulture, ILocalizationServic } /// - /// Returns the current culture + /// Returns the defualt umbraco's back office culture /// public CultureInfo Culture => _specificCulture ?? Thread.CurrentThread.CurrentUICulture; diff --git a/src/Umbraco.Core/Dictionary/UmbracoCultureDictionaryFactory.cs b/src/Umbraco.Core/Dictionary/UmbracoCultureDictionaryFactory.cs index 4c4eb030cc7e..2f00114c13a8 100644 --- a/src/Umbraco.Core/Dictionary/UmbracoCultureDictionaryFactory.cs +++ b/src/Umbraco.Core/Dictionary/UmbracoCultureDictionaryFactory.cs @@ -1,3 +1,4 @@ +using System.Globalization; using Umbraco.Cms.Core.Cache; using Umbraco.Cms.Core.Services; @@ -23,4 +24,7 @@ public DefaultCultureDictionaryFactory(ILocalizationService localizationService, public ICultureDictionary CreateDictionary() => new DefaultCultureDictionary(_localizationService, _appCaches.RequestCache); + + public ICultureDictionary CreateDictionary(CultureInfo specificCulture) => + new DefaultCultureDictionary(specificCulture, _localizationService, _appCaches.RequestCache); } diff --git a/src/Umbraco.Web.Common/UmbracoHelper.cs b/src/Umbraco.Web.Common/UmbracoHelper.cs index 56181b29dac6..2cb2ea8002b8 100644 --- a/src/Umbraco.Web.Common/UmbracoHelper.cs +++ b/src/Umbraco.Web.Common/UmbracoHelper.cs @@ -1,4 +1,6 @@ +using System.Globalization; using System.Xml.XPath; +using Serilog.Events; using Umbraco.Cms.Core; using Umbraco.Cms.Core.Dictionary; using Umbraco.Cms.Core.Models.PublishedContent; @@ -139,12 +141,43 @@ public async Task RenderMacroAsync(string alias, IDictionary /// public string? GetDictionaryValue(string key) => CultureDictionary[key]; + + /// + /// 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 + /// + public string? GetDictionaryValue(string key, CultureInfo specificCulture) + { + _cultureDictionary = _cultureDictionaryFactory.CreateDictionary(specificCulture); + return GetDictionaryValue(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 + /// + public string GetDictionaryValueOrDefault(string key, string defaultValue) + { + var dictionaryValue = GetDictionaryValue(key); + if (string.IsNullOrWhiteSpace(dictionaryValue)) + { + dictionaryValue = defaultValue; + } + + return dictionaryValue; + } + /// /// 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 /// + [Obsolete("Use GetDictionaryValueOrDefault instead, scheduled for removal in v14.")] public string GetDictionaryValue(string key, string altText) { var dictionaryValue = GetDictionaryValue(key); @@ -156,6 +189,25 @@ public string GetDictionaryValue(string key, string altText) return dictionaryValue; } + /// + /// 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 + /// + public string GetDictionaryValueOrDefault(string key, CultureInfo specificCulture, string defaultValue) + { + _cultureDictionary = _cultureDictionaryFactory.CreateDictionary(specificCulture); + var dictionaryValue = GetDictionaryValue(key); + if (string.IsNullOrWhiteSpace(dictionaryValue)) + { + dictionaryValue = defaultValue; + } + return dictionaryValue; + } + + /// /// Returns the ICultureDictionary for access to dictionary items ///