public LocalizedValue <TProp> GetLocalizedValue <T, TProp>(T entity, string localeKeyGroup, string localeKey, Func <T, TProp> fallback, object requestLanguageIdOrObj, // Id or Language bool returnDefaultValue = true, bool ensureTwoPublishedLanguages = true, bool detectEmptyHtml = false) where T : ILocalizedEntity { if (entity == null) { throw new ArgumentNullException(nameof(entity)); } TProp result = default; var str = string.Empty; Language currentLanguage = null; Language requestLanguage = null; if (!(requestLanguageIdOrObj is Language)) { if (requestLanguageIdOrObj is int requestLanguageId) { requestLanguage = _languageService.GetLanguageById(requestLanguageId); } } else { requestLanguage = (Language)requestLanguageIdOrObj; } if (requestLanguage == null) { requestLanguage = _workContext.WorkingLanguage; } // Ensure that we have at least two published languages var loadLocalizedValue = true; if (ensureTwoPublishedLanguages) { loadLocalizedValue = _languageCount > 1; } // Localized value if (loadLocalizedValue) { str = _localizedEntityService.GetLocalizedValue(requestLanguage.Id, entity.Id, localeKeyGroup, localeKey); if (detectEmptyHtml && HtmlUtils.IsEmptyHtml(str)) { str = string.Empty; } if (str.HasValue()) { currentLanguage = requestLanguage; result = str.Convert <TProp>(CultureInfo.InvariantCulture); } } // Set default value if required if (returnDefaultValue && str.IsEmpty()) { currentLanguage = _defaultLanguage; result = fallback(entity); } if (currentLanguage == null) { currentLanguage = requestLanguage; } return(new LocalizedValue <TProp>(result, requestLanguage, currentLanguage)); }