diff --git a/src/Umbraco.Core/Extensions/PublishedElementExtensions.cs b/src/Umbraco.Core/Extensions/PublishedElementExtensions.cs index c85178c85c..440962cd76 100644 --- a/src/Umbraco.Core/Extensions/PublishedElementExtensions.cs +++ b/src/Umbraco.Core/Extensions/PublishedElementExtensions.cs @@ -134,6 +134,27 @@ public static class PublishedElementExtensions #endregion + #region CheckVariation + /// + /// Method to check if VariationContext culture differs from culture parameter, if so it will update the VariationContext for the PublishedValueFallback. + /// + /// The requested PublishedValueFallback. + /// The requested culture. + /// The requested segment. + /// + private static void EventuallyUpdateVariationContext(IPublishedValueFallback publishedValueFallback, string? culture, string? segment) + { + IVariationContextAccessor? variationContextAccessor = publishedValueFallback.VariationContextAccessor; + + //If there is a difference in requested culture and the culture that is set in the VariationContext, it will pick wrong localized content. + //This happens for example using links to localized content in a RichText Editor. + if (!string.IsNullOrEmpty(culture) && variationContextAccessor?.VariationContext?.Culture != culture) + { + variationContextAccessor!.VariationContext = new VariationContext(culture, segment); + } + } + #endregion + #region Value /// @@ -174,6 +195,8 @@ public static class PublishedElementExtensions { IPublishedProperty? property = content.GetProperty(alias); + EventuallyUpdateVariationContext(publishedValueFallback, culture, segment); + // if we have a property, and it has a value, return that value if (property != null && property.HasValue(culture, segment)) { diff --git a/src/Umbraco.Core/Models/PublishedContent/IPublishedValueFallback.cs b/src/Umbraco.Core/Models/PublishedContent/IPublishedValueFallback.cs index 729f7dd6bc..111d747ec1 100644 --- a/src/Umbraco.Core/Models/PublishedContent/IPublishedValueFallback.cs +++ b/src/Umbraco.Core/Models/PublishedContent/IPublishedValueFallback.cs @@ -5,6 +5,11 @@ namespace Umbraco.Cms.Core.Models.PublishedContent; /// public interface IPublishedValueFallback { + /// + /// VariationContextAccessor that is not required to be implemented, therefore throws NotImplementedException as default. + /// + IVariationContextAccessor VariationContextAccessor { get { throw new NotImplementedException(); } set { throw new NotImplementedException(); } } + /// /// Tries to get a fallback value for a property. /// diff --git a/src/Umbraco.Core/Models/PublishedContent/PublishedValueFallback.cs b/src/Umbraco.Core/Models/PublishedContent/PublishedValueFallback.cs index 0e43a2617f..1d4c512f78 100644 --- a/src/Umbraco.Core/Models/PublishedContent/PublishedValueFallback.cs +++ b/src/Umbraco.Core/Models/PublishedContent/PublishedValueFallback.cs @@ -20,6 +20,8 @@ public class PublishedValueFallback : IPublishedValueFallback _variationContextAccessor = variationContextAccessor; } + public IVariationContextAccessor VariationContextAccessor { get { return _variationContextAccessor; } } + /// public bool TryGetValue(IPublishedProperty property, string? culture, string? segment, Fallback fallback, object? defaultValue, out object? value) => TryGetValue(property, culture, segment, fallback, defaultValue, out value);