diff --git a/src/Umbraco.Core/Services/DocumentUrlService.cs b/src/Umbraco.Core/Services/DocumentUrlService.cs index 9f01fa63e9..7548ae9cb7 100644 --- a/src/Umbraco.Core/Services/DocumentUrlService.cs +++ b/src/Umbraco.Core/Services/DocumentUrlService.cs @@ -488,8 +488,9 @@ public class DocumentUrlService : IDocumentUrlService } } - if (_globalSettings.ForceCombineUrlPathLeftToRight - || CultureInfo.GetCultureInfo(cultureOrDefault).TextInfo.IsRightToLeft is false) + var leftToRight = _globalSettings.ForceCombineUrlPathLeftToRight + || CultureInfo.GetCultureInfo(cultureOrDefault).TextInfo.IsRightToLeft is false; + if (leftToRight) { urlSegments.Reverse(); } @@ -501,7 +502,7 @@ public class DocumentUrlService : IDocumentUrlService } var isRootFirstItem = GetTopMostRootKey(isDraft, cultureOrDefault) == ancestorsOrSelfKeysArray.Last(); - return GetFullUrl(isRootFirstItem, urlSegments, null); + return GetFullUrl(isRootFirstItem, urlSegments, null, leftToRight); } public bool HasAny() @@ -583,8 +584,16 @@ public class DocumentUrlService : IDocumentUrlService } var isRootFirstItem = GetTopMostRootKey(false, culture) == ancestorsOrSelfKeysArray.Last(); + + var leftToRight = _globalSettings.ForceCombineUrlPathLeftToRight + || CultureInfo.GetCultureInfo(culture).TextInfo.IsRightToLeft is false; + if (leftToRight) + { + urlSegments.Reverse(); + } + result.Add(new UrlInfo( - text: GetFullUrl(isRootFirstItem, urlSegments, foundDomain), + text: GetFullUrl(isRootFirstItem, urlSegments, foundDomain, leftToRight), isUrl: hasUrlInCulture, culture: culture )); @@ -594,17 +603,27 @@ public class DocumentUrlService : IDocumentUrlService return result; } - private string GetFullUrl(bool isRootFirstItem, List reversedUrlSegments, Domain? foundDomain) + private string GetFullUrl(bool isRootFirstItem, List segments, Domain? foundDomain, bool leftToRight) { - var urlSegments = new List(reversedUrlSegments); - urlSegments.Reverse(); + var urlSegments = new List(segments); if (foundDomain is not null) { return foundDomain.Name.EnsureEndsWith("/") + string.Join('/', urlSegments); } - return '/' + string.Join('/', urlSegments.Skip(_globalSettings.HideTopLevelNodeFromPath && isRootFirstItem ? 1 : 0)); + var hideTopLevel = _globalSettings.HideTopLevelNodeFromPath && isRootFirstItem; + if (leftToRight) + { + return '/' + string.Join('/', urlSegments.Skip(hideTopLevel ? 1 : 0)); + } + + if (hideTopLevel) + { + urlSegments.RemoveAt(urlSegments.Count - 1); + } + + return '/' + string.Join('/', urlSegments); } public async Task CreateOrUpdateUrlSegmentsWithDescendantsAsync(Guid key)