From 452097d97507d238754d65339af6cce686f3cb33 Mon Sep 17 00:00:00 2001 From: Bjarke Berg Date: Fri, 24 Sep 2021 17:42:31 +0200 Subject: [PATCH] Fixed issue with Paths-integers being converted using local culture. (#11180) * Fixed issue with Paths-integers being converted using local culture. * Align with the old implementation * Use int.TryParse insteaad of TryConvertTo when we do not want culture specific parsing * More fixes for cultures and fixed wrong test. Users should be part of all groups to have access * Fix casing for requested file * Force tests to not use NLS * try force tests to not use NLS * try force tests to not use NLS * Force tests on windows to run ICU * More fixes for invariant int parsing * Change key on actions/emptyRecycleBin, so the casing aligns with the view file, that is named emptyrecyclebin.html * Fixed casing issue * use Attempt to align with other code --- .../Extensions/StringExtensions.cs | 4 +- .../Models/Mapping/UserMapDefinition.cs | 4 + src/Umbraco.Core/Models/UserExtensions.cs | 6 +- .../ContentPickerValueConverter.cs | 16 +++- .../Security/ContentPermissions.cs | 4 +- .../Services/UserServiceExtensions.cs | 5 +- .../BackOfficeExamineSearcher.cs | 86 ------------------- .../Examine/ContentValueSetValidator.cs | 5 +- .../Search/UmbracoTreeSearcher.cs | 8 +- ...peServiceBaseOfTRepositoryTItemTService.cs | 7 +- .../Services/Implement/EntityXmlSerializer.cs | 6 +- .../Umbraco.Tests.Integration.csproj | 5 ++ .../Composing/CompositionTests.cs | 12 --- .../CoreThings/TryConvertToTests.cs | 66 +++++++------- .../Models/UserExtensionsTests.cs | 7 +- .../Umbraco.Tests.UnitTests.csproj | 5 ++ ...entPermissionsPublishBranchHandlerTests.cs | 5 +- ...ntentPermissionsQueryStringHandlerTests.cs | 3 +- .../ContentPermissionsResourceHandlerTests.cs | 3 +- .../Authorization/UserGroupHandlerTests.cs | 4 +- .../Authorization/AdminUsersHandler.cs | 10 ++- .../Authorization/UserGroupHandler.cs | 14 +-- .../Controllers/MemberController.cs | 6 +- .../Controllers/UsersController.cs | 17 +--- .../CheckIfUserTicketDataIsStaleAttribute.cs | 8 +- .../Trees/ContentBlueprintTreeController.cs | 8 +- .../Trees/ContentTreeControllerBase.cs | 2 +- .../Trees/ContentTypeTreeController.cs | 2 +- src/Umbraco.Web.UI/umbraco/config/lang/cs.xml | 4 +- src/Umbraco.Web.UI/umbraco/config/lang/cy.xml | 20 ++--- src/Umbraco.Web.UI/umbraco/config/lang/da.xml | 4 +- src/Umbraco.Web.UI/umbraco/config/lang/de.xml | 4 +- src/Umbraco.Web.UI/umbraco/config/lang/en.xml | 4 +- .../umbraco/config/lang/en_us.xml | 4 +- src/Umbraco.Web.UI/umbraco/config/lang/es.xml | 4 +- src/Umbraco.Web.UI/umbraco/config/lang/fr.xml | 4 +- src/Umbraco.Web.UI/umbraco/config/lang/he.xml | 4 +- src/Umbraco.Web.UI/umbraco/config/lang/it.xml | 4 +- src/Umbraco.Web.UI/umbraco/config/lang/ja.xml | 6 +- src/Umbraco.Web.UI/umbraco/config/lang/ko.xml | 4 +- src/Umbraco.Web.UI/umbraco/config/lang/nb.xml | 6 +- src/Umbraco.Web.UI/umbraco/config/lang/nl.xml | 4 +- src/Umbraco.Web.UI/umbraco/config/lang/pl.xml | 4 +- src/Umbraco.Web.UI/umbraco/config/lang/pt.xml | 6 +- src/Umbraco.Web.UI/umbraco/config/lang/ru.xml | 4 +- src/Umbraco.Web.UI/umbraco/config/lang/sv.xml | 4 +- src/Umbraco.Web.UI/umbraco/config/lang/tr.xml | 4 +- src/Umbraco.Web.UI/umbraco/config/lang/zh.xml | 4 +- .../umbraco/config/lang/zh_tw.xml | 4 +- 49 files changed, 173 insertions(+), 261 deletions(-) delete mode 100644 src/Umbraco.Tests.UnitTests/Umbraco.Core/Composing/CompositionTests.cs diff --git a/src/Umbraco.Core/Extensions/StringExtensions.cs b/src/Umbraco.Core/Extensions/StringExtensions.cs index 04942246141e..7a9dc53ed092 100644 --- a/src/Umbraco.Core/Extensions/StringExtensions.cs +++ b/src/Umbraco.Core/Extensions/StringExtensions.cs @@ -42,9 +42,9 @@ static StringExtensions() public static int[] GetIdsFromPathReversed(this string path) { var nodeIds = path.Split(Constants.CharArrays.Comma, StringSplitOptions.RemoveEmptyEntries) - .Select(x => x.TryConvertTo()) + .Select(x => int.TryParse(x, NumberStyles.Integer, CultureInfo.InvariantCulture, out var output) ? Attempt.Succeed(output) : Attempt.Fail()) .Where(x => x.Success) - .Select(x => x.Result) + .Select(x=>x.Result) .Reverse() .ToArray(); return nodeIds; diff --git a/src/Umbraco.Core/Models/Mapping/UserMapDefinition.cs b/src/Umbraco.Core/Models/Mapping/UserMapDefinition.cs index f66e3a6b23ef..238065718002 100644 --- a/src/Umbraco.Core/Models/Mapping/UserMapDefinition.cs +++ b/src/Umbraco.Core/Models/Mapping/UserMapDefinition.cs @@ -425,6 +425,10 @@ private IEnumerable CreateUserEditorNavigation() private static int GetIntId(object id) { + if (id is string strId && int.TryParse(strId, NumberStyles.Integer, CultureInfo.InvariantCulture, out var asInt)) + { + return asInt; + } var result = id.TryConvertTo(); if (result.Success == false) { diff --git a/src/Umbraco.Core/Models/UserExtensions.cs b/src/Umbraco.Core/Models/UserExtensions.cs index dd96faf298e9..aab9a5d8a7e0 100644 --- a/src/Umbraco.Core/Models/UserExtensions.cs +++ b/src/Umbraco.Core/Models/UserExtensions.cs @@ -219,14 +219,14 @@ private static bool StartsWithPath(string test, string path) private static string GetBinPath(UmbracoObjectTypes objectType) { - var binPath = Constants.System.Root + ","; + var binPath = Constants.System.RootString + ","; switch (objectType) { case UmbracoObjectTypes.Document: - binPath += Constants.System.RecycleBinContent; + binPath += Constants.System.RecycleBinContentString; break; case UmbracoObjectTypes.Media: - binPath += Constants.System.RecycleBinMedia; + binPath += Constants.System.RecycleBinMediaString; break; default: throw new ArgumentOutOfRangeException(nameof(objectType)); diff --git a/src/Umbraco.Core/PropertyEditors/ValueConverters/ContentPickerValueConverter.cs b/src/Umbraco.Core/PropertyEditors/ValueConverters/ContentPickerValueConverter.cs index 1f89fea12de0..4a33b6cc4738 100644 --- a/src/Umbraco.Core/PropertyEditors/ValueConverters/ContentPickerValueConverter.cs +++ b/src/Umbraco.Core/PropertyEditors/ValueConverters/ContentPickerValueConverter.cs @@ -32,12 +32,20 @@ public override object ConvertSourceToIntermediate(IPublishedElement owner, IPub { if (source == null) return null; + + if(source is not string) + { + var attemptConvertInt = source.TryConvertTo(); + if (attemptConvertInt.Success) + return attemptConvertInt.Result; + } //Don't attempt to convert to int for UDI - if(!(source is string) || source is string strSource && !string.IsNullOrWhiteSpace(strSource) && !strSource.StartsWith("umb")) + if( source is string strSource + && !string.IsNullOrWhiteSpace(strSource) + && !strSource.StartsWith("umb") + && int.TryParse(strSource, NumberStyles.Integer, CultureInfo.InvariantCulture, out var intValue)) { - var attemptConvertInt = source.TryConvertTo(); - if (attemptConvertInt.Success) - return attemptConvertInt.Result; + return intValue; } var attemptConvertUdi = source.TryConvertTo(); diff --git a/src/Umbraco.Core/Security/ContentPermissions.cs b/src/Umbraco.Core/Security/ContentPermissions.cs index 3d3ae55a62e8..206422b6e1c5 100644 --- a/src/Umbraco.Core/Security/ContentPermissions.cs +++ b/src/Umbraco.Core/Security/ContentPermissions.cs @@ -236,11 +236,11 @@ public static bool HasPathAccess(string path, int[] startNodeIds, int recycleBin // only users with root access have access to the recycle bin, // if the above check didn't pass then access is denied - if (formattedPath.Contains(string.Concat(",", recycleBinId, ","))) + if (formattedPath.Contains(string.Concat(",", recycleBinId.ToString(CultureInfo.InvariantCulture), ","))) return false; // check for a start node in the path - return startNodeIds.Any(x => formattedPath.Contains(string.Concat(",", x, ","))); + return startNodeIds.Any(x => formattedPath.Contains(string.Concat(",", x.ToString(CultureInfo.InvariantCulture), ","))); } public static bool IsInBranchOfStartNode(string path, int[] startNodeIds, string[] startNodePaths, out bool hasPathAccess) diff --git a/src/Umbraco.Core/Services/UserServiceExtensions.cs b/src/Umbraco.Core/Services/UserServiceExtensions.cs index c06711a91ef1..a1f6c09d5c08 100644 --- a/src/Umbraco.Core/Services/UserServiceExtensions.cs +++ b/src/Umbraco.Core/Services/UserServiceExtensions.cs @@ -1,5 +1,6 @@ using System; using System.Collections.Generic; +using System.Globalization; using System.Linq; using Umbraco.Cms.Core; using Umbraco.Cms.Core.Models.Membership; @@ -12,9 +13,9 @@ public static class UserServiceExtensions public static EntityPermission GetPermissions(this IUserService userService, IUser user, string path) { var ids = path.Split(Constants.CharArrays.Comma, StringSplitOptions.RemoveEmptyEntries) - .Select(x => x.TryConvertTo()) + .Select(x => int.TryParse(x, NumberStyles.Integer, CultureInfo.InvariantCulture, out var value) ? Attempt.Succeed(value) : Attempt.Fail()) .Where(x => x.Success) - .Select(x => x.Result) + .Select(x=>x.Result) .ToArray(); if (ids.Length == 0) throw new InvalidOperationException("The path: " + path + " could not be parsed into an array of integers or the path was empty"); diff --git a/src/Umbraco.Examine.Lucene/BackOfficeExamineSearcher.cs b/src/Umbraco.Examine.Lucene/BackOfficeExamineSearcher.cs index 5e2b66c72064..a77bee7c4426 100644 --- a/src/Umbraco.Examine.Lucene/BackOfficeExamineSearcher.cs +++ b/src/Umbraco.Examine.Lucene/BackOfficeExamineSearcher.cs @@ -382,91 +382,5 @@ private void AppendPath(StringBuilder sb, string path, bool includeThisNode) sb.Append(path); sb.Append("\\,*"); } - - // TODO: When/Where is this used? - - /// - /// Returns a collection of entities for media based on search results - /// - /// - /// - private IEnumerable MemberFromSearchResults(IEnumerable results) - { - //add additional data - foreach (var result in results) - { - var m = _umbracoMapper.Map(result); - - //if no icon could be mapped, it will be set to document, so change it to picture - if (m.Icon == Constants.Icons.DefaultIcon) - { - m.Icon = Constants.Icons.Member; - } - - if (result.Values.ContainsKey("email") && result.Values["email"] != null) - { - m.AdditionalData["Email"] = result.Values["email"]; - } - if (result.Values.ContainsKey(UmbracoExamineFieldNames.NodeKeyFieldName) && result.Values[UmbracoExamineFieldNames.NodeKeyFieldName] != null) - { - if (Guid.TryParse(result.Values[UmbracoExamineFieldNames.NodeKeyFieldName], out var key)) - { - m.Key = key; - } - } - - yield return m; - } - } - - // TODO: When/Where is this used? - - /// - /// Returns a collection of entities for media based on search results - /// - /// - /// - private IEnumerable MediaFromSearchResults(IEnumerable results) - => _umbracoMapper.Map>(results); - - // TODO: When/Where is this used? - - /// - /// Returns a collection of entities for content based on search results - /// - /// - /// - private IEnumerable ContentFromSearchResults(IEnumerable results, string culture = null) - { - var defaultLang = _languageService.GetDefaultLanguageIsoCode(); - foreach (var result in results) - { - var entity = _umbracoMapper.Map(result, context => - { - if (culture != null) - { - context.SetCulture(culture); - } - } - ); - - var intId = entity.Id.TryConvertTo(); - if (intId.Success) - { - //if it varies by culture, return the default language URL - if (result.Values.TryGetValue(UmbracoExamineFieldNames.VariesByCultureFieldName, out var varies) && varies == "y") - { - entity.AdditionalData["Url"] = _publishedUrlProvider.GetUrl(intId.Result, culture: culture ?? defaultLang); - } - else - { - entity.AdditionalData["Url"] = _publishedUrlProvider.GetUrl(intId.Result); - } - } - - yield return entity; - } - } - } } diff --git a/src/Umbraco.Infrastructure/Examine/ContentValueSetValidator.cs b/src/Umbraco.Infrastructure/Examine/ContentValueSetValidator.cs index 39d260a24d9a..ddd97adb1a15 100644 --- a/src/Umbraco.Infrastructure/Examine/ContentValueSetValidator.cs +++ b/src/Umbraco.Infrastructure/Examine/ContentValueSetValidator.cs @@ -1,4 +1,5 @@ using System.Collections.Generic; +using System.Globalization; using System.Linq; using Examine; using Umbraco.Cms.Core.Scoping; @@ -30,7 +31,7 @@ public bool ValidatePath(string path, string category) { // we cannot return FAILED here because we need the value set to get into the indexer and then deal with it from there // because we need to remove anything that doesn't pass by parent Id in the cases that umbraco data is moved to an illegal parent. - if (!path.Contains(string.Concat(",", ParentId.Value, ","))) + if (!path.Contains(string.Concat(",", ParentId.Value.ToString(CultureInfo.InvariantCulture), ","))) return false; } @@ -39,7 +40,7 @@ public bool ValidatePath(string path, string category) public bool ValidateRecycleBin(string path, string category) { - var recycleBinId = category == IndexTypes.Content ? Constants.System.RecycleBinContent : Constants.System.RecycleBinMedia; + var recycleBinId = category == IndexTypes.Content ? Constants.System.RecycleBinContentString : Constants.System.RecycleBinMediaString; //check for recycle bin if (PublishedValuesOnly) diff --git a/src/Umbraco.Infrastructure/Search/UmbracoTreeSearcher.cs b/src/Umbraco.Infrastructure/Search/UmbracoTreeSearcher.cs index b401e51f8511..218ee4298ba9 100644 --- a/src/Umbraco.Infrastructure/Search/UmbracoTreeSearcher.cs +++ b/src/Umbraco.Infrastructure/Search/UmbracoTreeSearcher.cs @@ -1,5 +1,6 @@ using System; using System.Collections.Generic; +using System.Globalization; using System.Linq; using Examine; using Umbraco.Cms.Core.Mapping; @@ -162,17 +163,16 @@ private IEnumerable ContentFromSearchResults(IEnumerable(); - if (intId.Success) + if (int.TryParse(entity.Id.ToString(),NumberStyles.Integer, CultureInfo.InvariantCulture, out var intId)) { //if it varies by culture, return the default language URL if (result.Values.TryGetValue(UmbracoExamineFieldNames.VariesByCultureFieldName, out var varies) && varies == "y") { - entity.AdditionalData["Url"] = _publishedUrlProvider.GetUrl(intId.Result, culture: culture ?? defaultLang); + entity.AdditionalData["Url"] = _publishedUrlProvider.GetUrl(intId, culture: culture ?? defaultLang); } else { - entity.AdditionalData["Url"] = _publishedUrlProvider.GetUrl(intId.Result); + entity.AdditionalData["Url"] = _publishedUrlProvider.GetUrl(intId); } } diff --git a/src/Umbraco.Infrastructure/Services/Implement/ContentTypeServiceBaseOfTRepositoryTItemTService.cs b/src/Umbraco.Infrastructure/Services/Implement/ContentTypeServiceBaseOfTRepositoryTItemTService.cs index 8f0c8ce49b52..c1c22d0b89a2 100644 --- a/src/Umbraco.Infrastructure/Services/Implement/ContentTypeServiceBaseOfTRepositoryTItemTService.cs +++ b/src/Umbraco.Infrastructure/Services/Implement/ContentTypeServiceBaseOfTRepositoryTItemTService.cs @@ -1,5 +1,6 @@ using System; using System.Collections.Generic; +using System.Globalization; using System.Linq; using Microsoft.Extensions.Logging; using Umbraco.Cms.Core.Events; @@ -946,11 +947,7 @@ public IEnumerable GetContainers(int[] containerIds) public IEnumerable GetContainers(TItem item) { var ancestorIds = item.Path.Split(Constants.CharArrays.Comma, StringSplitOptions.RemoveEmptyEntries) - .Select(x => - { - var asInt = x.TryConvertTo(); - return asInt ? asInt.Result : int.MinValue; - }) + .Select(x => int.TryParse(x, NumberStyles.Integer, CultureInfo.InvariantCulture, out var asInt) ? asInt : int.MinValue) .Where(x => x != int.MinValue && x != item.Id) .ToArray(); diff --git a/src/Umbraco.Infrastructure/Services/Implement/EntityXmlSerializer.cs b/src/Umbraco.Infrastructure/Services/Implement/EntityXmlSerializer.cs index 06b279cdac03..d2ebb72bca8e 100644 --- a/src/Umbraco.Infrastructure/Services/Implement/EntityXmlSerializer.cs +++ b/src/Umbraco.Infrastructure/Services/Implement/EntityXmlSerializer.cs @@ -568,11 +568,11 @@ private XElement SerializePropertyType(IPropertyType propertyType, IDataType def private XElement SerializeContentBase(IContentBase contentBase, string urlValue, string nodeName, bool published) { var xml = new XElement(nodeName, - new XAttribute("id", contentBase.Id), + new XAttribute("id", contentBase.Id.ToInvariantString()), new XAttribute("key", contentBase.Key), - new XAttribute("parentID", contentBase.Level > 1 ? contentBase.ParentId : -1), + new XAttribute("parentID", (contentBase.Level > 1 ? contentBase.ParentId : -1).ToInvariantString()), new XAttribute("level", contentBase.Level), - new XAttribute("creatorID", contentBase.CreatorId), + new XAttribute("creatorID", contentBase.CreatorId.ToInvariantString()), new XAttribute("sortOrder", contentBase.SortOrder), new XAttribute("createDate", contentBase.CreateDate.ToString("s")), new XAttribute("updateDate", contentBase.UpdateDate.ToString("s")), diff --git a/src/Umbraco.Tests.Integration/Umbraco.Tests.Integration.csproj b/src/Umbraco.Tests.Integration/Umbraco.Tests.Integration.csproj index 89012e7d6c28..401ff2053940 100644 --- a/src/Umbraco.Tests.Integration/Umbraco.Tests.Integration.csproj +++ b/src/Umbraco.Tests.Integration/Umbraco.Tests.Integration.csproj @@ -9,6 +9,11 @@ true + + + + + IS_WINDOWS diff --git a/src/Umbraco.Tests.UnitTests/Umbraco.Core/Composing/CompositionTests.cs b/src/Umbraco.Tests.UnitTests/Umbraco.Core/Composing/CompositionTests.cs deleted file mode 100644 index 4056f5fdd403..000000000000 --- a/src/Umbraco.Tests.UnitTests/Umbraco.Core/Composing/CompositionTests.cs +++ /dev/null @@ -1,12 +0,0 @@ -// Copyright (c) Umbraco. -// See LICENSE for more details. - -using NUnit.Framework; - -namespace Umbraco.Cms.Tests.UnitTests.Umbraco.Core.Composing -{ - [TestFixture] - public class CompositionTests - { - } -} diff --git a/src/Umbraco.Tests.UnitTests/Umbraco.Core/CoreThings/TryConvertToTests.cs b/src/Umbraco.Tests.UnitTests/Umbraco.Core/CoreThings/TryConvertToTests.cs index 2c399d0e93e3..4e7930f8b6bc 100644 --- a/src/Umbraco.Tests.UnitTests/Umbraco.Core/CoreThings/TryConvertToTests.cs +++ b/src/Umbraco.Tests.UnitTests/Umbraco.Core/CoreThings/TryConvertToTests.cs @@ -49,49 +49,43 @@ public void ConvertToBoolTest() [Test] - [TestCase("en-US")] - [TestCase(null)] - [TestCase("da-DK")] - [TestCase("tr-TR")] - public void ConvertToIntegerTest(string culture) + [TestCase("en-US", -1, ExpectedResult = -1)] + [TestCase("en-US", "-1", ExpectedResult = -1)] + [TestCase("en-US", "100", ExpectedResult = 100)] + [TestCase("en-US", "100.000", ExpectedResult = 100)] + [TestCase("en-US", "100,000", ExpectedResult = 100)] + [TestCase("en-US", "100.001", ExpectedResult = 100)] + [TestCase("en-US", 100, ExpectedResult = 100)] + [TestCase("en-US", 100.000, ExpectedResult = 100)] + [TestCase("en-US", 100.001, ExpectedResult = 100)] + [TestCase("sv-SE", -1, ExpectedResult = -1)] + [TestCase("sv-SE", "−1", ExpectedResult = -1)] // Note '−' vs '-' + [TestCase("sv-SE", "100", ExpectedResult = 100)] + [TestCase("sv-SE", "100.000", ExpectedResult = 100)] + [TestCase("sv-SE", "100,000", ExpectedResult = 100)] + [TestCase("sv-SE", "100.001", ExpectedResult = 100)] + [TestCase("sv-SE", 100, ExpectedResult = 100)] + [TestCase("sv-SE", 100.000, ExpectedResult = 100)] + [TestCase("sv-SE", 100.001, ExpectedResult = 100)] + [TestCase("da-DK", "-1", ExpectedResult = -1)] + [TestCase("da-DK", -1, ExpectedResult = -1)] + [TestCase("da-DK", "100", ExpectedResult = 100)] + [TestCase("da-DK", "100.000", ExpectedResult = 100)] + [TestCase("da-DK", "100,000", ExpectedResult = 100)] + [TestCase("da-DK", "100.001", ExpectedResult = 100)] + [TestCase("da-DK", 100, ExpectedResult = 100)] + [TestCase("da-DK", 100.000, ExpectedResult = 100)] + [TestCase("da-DK", 100.001, ExpectedResult = 100)] + public int ConvertToIntegerTest(string culture, object input) { if (culture is not null) { CultureInfo.CurrentCulture = CultureInfo.GetCultureInfo(culture); } - var conv = "-1".TryConvertTo(); + var conv = input.TryConvertTo(); Assert.IsTrue(conv); - Assert.AreEqual(-1, conv.Result); - conv = "100".TryConvertTo(); - Assert.IsTrue(conv); - Assert.AreEqual(100, conv.Result); - - conv = "100.000".TryConvertTo(); - Assert.IsTrue(conv); - Assert.AreEqual(100, conv.Result); - - conv = "100,000".TryConvertTo(); - Assert.IsTrue(conv); - Assert.AreEqual(100, conv.Result); - - // oops - conv = "100.001".TryConvertTo(); - Assert.IsTrue(conv); - Assert.AreEqual(100, conv.Result); - - conv = 100m.TryConvertTo(); - Assert.IsTrue(conv); - Assert.AreEqual(100, conv.Result); - - conv = 100.000m.TryConvertTo(); - Assert.IsTrue(conv); - Assert.AreEqual(100, conv.Result); - - // oops - conv = 100.001m.TryConvertTo(); - Assert.IsTrue(conv); - Assert.AreEqual(100, conv.Result); + return conv.Result; } [Test] diff --git a/src/Umbraco.Tests.UnitTests/Umbraco.Core/Models/UserExtensionsTests.cs b/src/Umbraco.Tests.UnitTests/Umbraco.Core/Models/UserExtensionsTests.cs index ae51d77a9394..bb6267aebda8 100644 --- a/src/Umbraco.Tests.UnitTests/Umbraco.Core/Models/UserExtensionsTests.cs +++ b/src/Umbraco.Tests.UnitTests/Umbraco.Core/Models/UserExtensionsTests.cs @@ -3,6 +3,7 @@ using System; using System.Collections.Generic; +using System.Globalization; using System.Linq; using Moq; using NUnit.Framework; @@ -101,10 +102,10 @@ public void CombineStartNodes(string groupSn, string userSn, string expected) var comma = new[] { ',' }; - var groupSnA = groupSn.Split(comma, StringSplitOptions.RemoveEmptyEntries).Select(int.Parse).ToArray(); - var userSnA = userSn.Split(comma, StringSplitOptions.RemoveEmptyEntries).Select(int.Parse).ToArray(); + var groupSnA = groupSn.Split(comma, StringSplitOptions.RemoveEmptyEntries).Select(x=>int.Parse(x, CultureInfo.InvariantCulture)).ToArray(); + var userSnA = userSn.Split(comma, StringSplitOptions.RemoveEmptyEntries).Select(x=>int.Parse(x, CultureInfo.InvariantCulture)).ToArray(); var combinedA = UserExtensions.CombineStartNodes(UmbracoObjectTypes.Document, groupSnA, userSnA, esmock.Object).OrderBy(x => x).ToArray(); - var expectedA = expected.Split(comma, StringSplitOptions.RemoveEmptyEntries).Select(int.Parse).OrderBy(x => x).ToArray(); + var expectedA = expected.Split(comma, StringSplitOptions.RemoveEmptyEntries).Select(x=>int.Parse(x, CultureInfo.InvariantCulture)).OrderBy(x => x).ToArray(); var ok = combinedA.Length == expectedA.Length; if (ok) diff --git a/src/Umbraco.Tests.UnitTests/Umbraco.Tests.UnitTests.csproj b/src/Umbraco.Tests.UnitTests/Umbraco.Tests.UnitTests.csproj index 0d7777fb2629..5d5a3bbd1ec7 100644 --- a/src/Umbraco.Tests.UnitTests/Umbraco.Tests.UnitTests.csproj +++ b/src/Umbraco.Tests.UnitTests/Umbraco.Tests.UnitTests.csproj @@ -7,6 +7,11 @@ Umbraco.Cms.Tests.UnitTests + + + + + diff --git a/src/Umbraco.Tests.UnitTests/Umbraco.Web.BackOffice/Authorization/ContentPermissionsPublishBranchHandlerTests.cs b/src/Umbraco.Tests.UnitTests/Umbraco.Web.BackOffice/Authorization/ContentPermissionsPublishBranchHandlerTests.cs index c85ae8705a1d..c03581244100 100644 --- a/src/Umbraco.Tests.UnitTests/Umbraco.Web.BackOffice/Authorization/ContentPermissionsPublishBranchHandlerTests.cs +++ b/src/Umbraco.Tests.UnitTests/Umbraco.Web.BackOffice/Authorization/ContentPermissionsPublishBranchHandlerTests.cs @@ -2,6 +2,7 @@ // See LICENSE for more details. using System.Collections.Generic; +using System.Globalization; using System.Security.Claims; using System.Threading.Tasks; using Microsoft.AspNetCore.Authorization; @@ -90,10 +91,10 @@ private static Mock CreateMockUserService(int parentNodeId, Dictio var mockUserService = new Mock(); mockUserService - .Setup(x => x.GetPermissionsForPath(It.IsAny(), It.Is(y => y == $"{Constants.System.Root},{parentNodeId},{DescendentNodeId1}"))) + .Setup(x => x.GetPermissionsForPath(It.IsAny(), It.Is(y => y == $"{Constants.System.RootString},{parentNodeId.ToString(CultureInfo.InvariantCulture)},{DescendentNodeId1}"))) .Returns(new EntityPermissionSet(parentNodeId, new EntityPermissionCollection(new List { new EntityPermission(1, parentNodeId, descendendNodePermissionsForPath[DescendentNodeId1]) }))); mockUserService - .Setup(x => x.GetPermissionsForPath(It.IsAny(), It.Is(y => y == $"{Constants.System.Root},{parentNodeId},{DescendentNodeId1},{DescendentNodeId2}"))) + .Setup(x => x.GetPermissionsForPath(It.IsAny(), It.Is(y => y == $"{Constants.System.RootString},{parentNodeId.ToString(CultureInfo.InvariantCulture)},{DescendentNodeId1},{DescendentNodeId2}"))) .Returns(new EntityPermissionSet(parentNodeId, new EntityPermissionCollection(new List { new EntityPermission(1, parentNodeId, descendendNodePermissionsForPath[DescendentNodeId2]) }))); return mockUserService; diff --git a/src/Umbraco.Tests.UnitTests/Umbraco.Web.BackOffice/Authorization/ContentPermissionsQueryStringHandlerTests.cs b/src/Umbraco.Tests.UnitTests/Umbraco.Web.BackOffice/Authorization/ContentPermissionsQueryStringHandlerTests.cs index aa227842ecd6..15cf62534186 100644 --- a/src/Umbraco.Tests.UnitTests/Umbraco.Web.BackOffice/Authorization/ContentPermissionsQueryStringHandlerTests.cs +++ b/src/Umbraco.Tests.UnitTests/Umbraco.Web.BackOffice/Authorization/ContentPermissionsQueryStringHandlerTests.cs @@ -18,6 +18,7 @@ using Umbraco.Cms.Core.Services; using Umbraco.Cms.Tests.Common.Builders; using Umbraco.Cms.Web.BackOffice.Authorization; +using Umbraco.Extensions; using Constants = Umbraco.Cms.Core.Constants; namespace Umbraco.Cms.Tests.UnitTests.Umbraco.Web.BackOffice.Authorization @@ -222,7 +223,7 @@ private static ContentPermissions CreateContentPermissions(IEntityService entity var mockUserService = new Mock(); mockUserService - .Setup(x => x.GetPermissionsForPath(It.IsAny(), It.Is(y => y == $"{Constants.System.Root},{nodeId}"))) + .Setup(x => x.GetPermissionsForPath(It.IsAny(), It.Is(y => y == $"{Constants.System.RootString},{nodeId.ToInvariantString()}"))) .Returns(new EntityPermissionSet(nodeId, new EntityPermissionCollection(new List { new EntityPermission(1, nodeId, permissionsForPath) }))); var mockContentService = new Mock(); diff --git a/src/Umbraco.Tests.UnitTests/Umbraco.Web.BackOffice/Authorization/ContentPermissionsResourceHandlerTests.cs b/src/Umbraco.Tests.UnitTests/Umbraco.Web.BackOffice/Authorization/ContentPermissionsResourceHandlerTests.cs index a3428e8fe3e2..effc5d6f125d 100644 --- a/src/Umbraco.Tests.UnitTests/Umbraco.Web.BackOffice/Authorization/ContentPermissionsResourceHandlerTests.cs +++ b/src/Umbraco.Tests.UnitTests/Umbraco.Web.BackOffice/Authorization/ContentPermissionsResourceHandlerTests.cs @@ -14,6 +14,7 @@ using Umbraco.Cms.Core.Services; using Umbraco.Cms.Tests.Common.Builders; using Umbraco.Cms.Web.BackOffice.Authorization; +using Umbraco.Extensions; using Constants = Umbraco.Cms.Core.Constants; namespace Umbraco.Cms.Tests.UnitTests.Umbraco.Web.BackOffice.Authorization @@ -110,7 +111,7 @@ private static ContentPermissions CreateContentPermissions(int nodeId, string[] var mockUserService = new Mock(); mockUserService - .Setup(x => x.GetPermissionsForPath(It.IsAny(), It.Is(y => y == $"{Constants.System.Root},{nodeId}"))) + .Setup(x => x.GetPermissionsForPath(It.IsAny(), It.Is(y => y == $"{Constants.System.RootString},{nodeId.ToInvariantString()}"))) .Returns(new EntityPermissionSet(nodeId, new EntityPermissionCollection(new List { new EntityPermission(1, nodeId, permissionsForPath) }))); var mockContentService = new Mock(); diff --git a/src/Umbraco.Tests.UnitTests/Umbraco.Web.BackOffice/Authorization/UserGroupHandlerTests.cs b/src/Umbraco.Tests.UnitTests/Umbraco.Web.BackOffice/Authorization/UserGroupHandlerTests.cs index cf08011bc59c..7ff68aca523b 100644 --- a/src/Umbraco.Tests.UnitTests/Umbraco.Web.BackOffice/Authorization/UserGroupHandlerTests.cs +++ b/src/Umbraco.Tests.UnitTests/Umbraco.Web.BackOffice/Authorization/UserGroupHandlerTests.cs @@ -65,14 +65,14 @@ public async Task User_Matching_Single_Requested_Group_Id_Is_Authorised() } [Test] - public async Task User_Matching_One_Of_Requested_Group_Ids_Is_Authorised() + public async Task User_Matching_Only_One_Of_Requested_Group_Ids_Is_NOT_Authorised() { AuthorizationHandlerContext authHandlerContext = CreateAuthorizationHandlerContext(); UserGroupHandler sut = CreateHandler(queryStringValue: $"{Group1Id},{Group2Id}"); await sut.HandleAsync(authHandlerContext); - Assert.IsTrue(authHandlerContext.HasSucceeded); + Assert.IsTrue(authHandlerContext.HasFailed); } [Test] diff --git a/src/Umbraco.Web.BackOffice/Authorization/AdminUsersHandler.cs b/src/Umbraco.Web.BackOffice/Authorization/AdminUsersHandler.cs index 1f760de4fd73..36d01675d5e4 100644 --- a/src/Umbraco.Web.BackOffice/Authorization/AdminUsersHandler.cs +++ b/src/Umbraco.Web.BackOffice/Authorization/AdminUsersHandler.cs @@ -1,6 +1,7 @@ // Copyright (c) Umbraco. // See LICENSE for more details. +using System; using System.Collections.Generic; using System.Globalization; using System.Linq; @@ -8,6 +9,7 @@ using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Http; using Microsoft.Extensions.Primitives; +using Umbraco.Cms.Core; using Umbraco.Cms.Core.Editors; using Umbraco.Cms.Core.Models.Membership; using Umbraco.Cms.Core.Security; @@ -62,7 +64,7 @@ protected override Task IsAuthorized(AuthorizationHandlerContext context, } else { - var ids = _httpContextAccessor.HttpContext.Request.Query.Where(x => x.Key == requirement.QueryStringName).ToList(); + var ids = queryString.ToString().Split(Constants.CharArrays.Comma, StringSplitOptions.RemoveEmptyEntries).ToList(); if (ids.Count == 0) { // Must succeed this requirement since we cannot process it. @@ -70,8 +72,10 @@ protected override Task IsAuthorized(AuthorizationHandlerContext context, } userIds = ids - .Select(x => x.Value.ToString()) - .Select(x => x.TryConvertTo()).Where(x => x.Success).Select(x => x.Result).ToArray(); + .Select(x => int.TryParse(x, NumberStyles.Integer, CultureInfo.InvariantCulture, out var output) ? Attempt.Succeed(output) : Attempt.Fail()) + .Where(x => x.Success) + .Select(x => x.Result) + .ToArray(); } if (userIds.Length == 0) diff --git a/src/Umbraco.Web.BackOffice/Authorization/UserGroupHandler.cs b/src/Umbraco.Web.BackOffice/Authorization/UserGroupHandler.cs index 6fe807e6fe93..118aede07a16 100644 --- a/src/Umbraco.Web.BackOffice/Authorization/UserGroupHandler.cs +++ b/src/Umbraco.Web.BackOffice/Authorization/UserGroupHandler.cs @@ -2,6 +2,7 @@ // See LICENSE for more details. using System.Collections.Generic; +using System.Globalization; using System.Linq; using System.Threading.Tasks; using Microsoft.AspNetCore.Authorization; @@ -62,23 +63,22 @@ protected override Task IsAuthorized(AuthorizationHandlerContext context, { IUser currentUser = _backOfficeSecurityAccessor.BackOfficeSecurity.CurrentUser; - IQueryCollection queryString = _httpContextAccessor.HttpContext?.Request.Query; - if (queryString == null) + var querystring = _httpContextAccessor.HttpContext?.Request.Query[requirement.QueryStringName]; + if (querystring is null) { // Must succeed this requirement since we cannot process it. return Task.FromResult(true); } - KeyValuePair[] ids = queryString.Where(x => x.Key == requirement.QueryStringName).ToArray(); - if (ids.Length == 0) + if (querystring.Value.Count == 0) { // Must succeed this requirement since we cannot process it. return Task.FromResult(true); } - var intIds = ids - .Select(x => x.Value.ToString()) - .Select(x => x.TryConvertTo()).Where(x => x.Success).Select(x => x.Result).ToArray(); + var intIds = querystring.Value.ToString().Split(Constants.CharArrays.Comma) + .Select(x => int.TryParse(x, NumberStyles.Integer, CultureInfo.InvariantCulture, out var output) ? Attempt.Succeed(output) : Attempt.Fail()) + .Where(x => x.Success).Select(x => x.Result).ToArray(); var authHelper = new UserGroupEditorAuthorizationHelper( _userService, diff --git a/src/Umbraco.Web.BackOffice/Controllers/MemberController.cs b/src/Umbraco.Web.BackOffice/Controllers/MemberController.cs index d8ee3126a449..ec7ebe30a164 100644 --- a/src/Umbraco.Web.BackOffice/Controllers/MemberController.cs +++ b/src/Umbraco.Web.BackOffice/Controllers/MemberController.cs @@ -1,6 +1,7 @@ using System; using System.Collections.Generic; using System.ComponentModel.DataAnnotations; +using System.Globalization; using System.Linq; using System.Net.Http; using System.Net.Mime; @@ -524,15 +525,14 @@ private async Task> UpdateMemberAsync(MemberSave contentItem) return ValidationProblem(validatePassword.Errors.ToErrorMessage()); } - Attempt intId = identityMember.Id.TryConvertTo(); - if (intId.Success == false) + if (!int.TryParse(identityMember.Id, NumberStyles.Integer, CultureInfo.InvariantCulture, out var intId)) { return ValidationProblem("Member ID was not valid"); } var changingPasswordModel = new ChangingPasswordModel { - Id = intId.Result, + Id = intId, OldPassword = contentItem.Password.OldPassword, NewPassword = contentItem.Password.NewPassword, }; diff --git a/src/Umbraco.Web.BackOffice/Controllers/UsersController.cs b/src/Umbraco.Web.BackOffice/Controllers/UsersController.cs index 821719c79605..7e62e514f776 100644 --- a/src/Umbraco.Web.BackOffice/Controllers/UsersController.cs +++ b/src/Umbraco.Web.BackOffice/Controllers/UsersController.cs @@ -554,7 +554,7 @@ private async Task SendUserInviteEmailAsync(UserBasic userDisplay, string from, // This needs to be in the correct mailto format including the name, else // the name cannot be captured in the email sending notification. - // i.e. "Some Person" + // i.e. "Some Person" var toMailBoxAddress = new MailboxAddress(to.Name, to.Email); var mailMessage = new EmailMessage(fromEmail, toMailBoxAddress.ToString(), emailSubject, emailBody, true); @@ -577,12 +577,7 @@ public ActionResult PostSaveUser(UserSave userSave) return ValidationProblem(ModelState); } - var intId = userSave.Id.TryConvertTo(); - if (intId.Success == false) - return NotFound(); - - - var found = _userService.GetUserById(intId.Result); + var found = _userService.GetUserById(userSave.Id); if (found == null) return NotFound(); @@ -673,13 +668,7 @@ public async Task>> PostChangePasswo return ValidationProblem(ModelState); } - Attempt intId = changingPasswordModel.Id.TryConvertTo(); - if (intId.Success == false) - { - return NotFound(); - } - - IUser found = _userService.GetUserById(intId.Result); + IUser found = _userService.GetUserById(changingPasswordModel.Id); if (found == null) { return NotFound(); diff --git a/src/Umbraco.Web.BackOffice/Filters/CheckIfUserTicketDataIsStaleAttribute.cs b/src/Umbraco.Web.BackOffice/Filters/CheckIfUserTicketDataIsStaleAttribute.cs index 178d9d50f076..568ebab1c62f 100644 --- a/src/Umbraco.Web.BackOffice/Filters/CheckIfUserTicketDataIsStaleAttribute.cs +++ b/src/Umbraco.Web.BackOffice/Filters/CheckIfUserTicketDataIsStaleAttribute.cs @@ -118,13 +118,7 @@ private async Task CheckStaleData(ActionExecutingContext actionContext) return; } - Attempt userId = identity.GetId().TryConvertTo(); - if (userId == false) - { - return; - } - - IUser user = _userService.GetUserById(userId.Result); + IUser user = _userService.GetUserById(identity.GetId()); if (user == null) { return; diff --git a/src/Umbraco.Web.BackOffice/Trees/ContentBlueprintTreeController.cs b/src/Umbraco.Web.BackOffice/Trees/ContentBlueprintTreeController.cs index abf3854f5bfc..efbc71f6cbc5 100644 --- a/src/Umbraco.Web.BackOffice/Trees/ContentBlueprintTreeController.cs +++ b/src/Umbraco.Web.BackOffice/Trees/ContentBlueprintTreeController.cs @@ -103,9 +103,13 @@ protected override ActionResult GetTreeNodes(string id, Form return nodes; } - var intId = id.TryConvertTo(); + if (!int.TryParse(id, NumberStyles.Integer, CultureInfo.InvariantCulture, out var intId)) + { + return nodes; + } + //Get the content type - var ct = _contentTypeService.Get(intId.Result); + var ct = _contentTypeService.Get(intId); if (ct == null) return nodes; var blueprintsForDocType = entities.Where(x => ct.Alias == ((IContentEntitySlim) x).ContentTypeAlias); diff --git a/src/Umbraco.Web.BackOffice/Trees/ContentTreeControllerBase.cs b/src/Umbraco.Web.BackOffice/Trees/ContentTreeControllerBase.cs index 2f27f8adace2..1bddb12cdeb3 100644 --- a/src/Umbraco.Web.BackOffice/Trees/ContentTreeControllerBase.cs +++ b/src/Umbraco.Web.BackOffice/Trees/ContentTreeControllerBase.cs @@ -469,7 +469,7 @@ protected sealed override ActionResult GetMenuForNode(string // only add empty recycle bin if the current user is allowed to delete by default if (deleteAllowed) { - menu.Items.Add(new MenuItem("emptyRecycleBin", LocalizedTextService) + menu.Items.Add(new MenuItem("emptyrecyclebin", LocalizedTextService) { Icon = "trash", OpensDialog = true diff --git a/src/Umbraco.Web.BackOffice/Trees/ContentTypeTreeController.cs b/src/Umbraco.Web.BackOffice/Trees/ContentTypeTreeController.cs index 2be23f69e24a..c4112cc77e39 100644 --- a/src/Umbraco.Web.BackOffice/Trees/ContentTypeTreeController.cs +++ b/src/Umbraco.Web.BackOffice/Trees/ContentTypeTreeController.cs @@ -117,7 +117,7 @@ protected override ActionResult GetMenuForNode(string id, Fo // root actions menu.Items.Add(LocalizedTextService, opensDialog: true); - menu.Items.Add(new MenuItem("importDocumentType", LocalizedTextService) + menu.Items.Add(new MenuItem("importdocumenttype", LocalizedTextService) { Icon = "page-up", SeparatorBefore = true, diff --git a/src/Umbraco.Web.UI/umbraco/config/lang/cs.xml b/src/Umbraco.Web.UI/umbraco/config/lang/cs.xml index 20b72a7e6858..2f1f83a214d6 100644 --- a/src/Umbraco.Web.UI/umbraco/config/lang/cs.xml +++ b/src/Umbraco.Web.UI/umbraco/config/lang/cs.xml @@ -16,10 +16,10 @@ Vytvořit skupinu Odstranit Deaktivovat - Vyprázdnit koš + Vyprázdnit koš Aktivovat Exportovat typ dokumentu - Importovat typ dokumentu + Importovat typ dokumentu Importovat balíček Editovat na stránce Odhlásit diff --git a/src/Umbraco.Web.UI/umbraco/config/lang/cy.xml b/src/Umbraco.Web.UI/umbraco/config/lang/cy.xml index a2692dc334c9..c78a9a1c55ca 100644 --- a/src/Umbraco.Web.UI/umbraco/config/lang/cy.xml +++ b/src/Umbraco.Web.UI/umbraco/config/lang/cy.xml @@ -18,10 +18,10 @@ Dileu Analluogi Golygu gosodiadau - Gwagu bin ailgylchu + Gwagu bin ailgylchu Galluogi Allforio Math o Ddogfen - Mewnforio Math o Ddogfen + Mewnforio Math o Ddogfen Mewnforio Pecyn Golygu mewn Cynfas Gadael @@ -102,7 +102,7 @@ Parth '%0%' wedi diweddaru Golygu Parthau Presennol - Etifeddu @@ -908,7 +908,7 @@ Mae "Runway" yn wefan syml sy'n darparu mathau o ddogfennau a thempledi syml. Gall y gosodwr osod Runway i chi yn awtomatig, - ond gallwch olygu, estyn neu ei ddileu yn hawdd. Nid yw'n angenrheidiol a gallwch ddefnyddio Umbraco yn berffaith heb. Ond, + ond gallwch olygu, estyn neu ei ddileu yn hawdd. Nid yw'n angenrheidiol a gallwch ddefnyddio Umbraco yn berffaith heb. Ond, mae Runwayyn cynnig sylfaen hawdd wedi'i seilio ar arferion gorau er mwyn i chi gychwyn yn gyflymach nag erioed. Os rydych chi'n dewis gosod Runway, gallwch ddewis blociau adeiliadu syml o'r enw Modylau Runway er mwyn mwyhau eich tudalennau Runway.

@@ -1095,15 +1095,15 @@ Er mwyn gweinyddu eich gwefan, agorwch swyddfa gefn Umbraco a dechreuwch ychwang @@ -2327,9 +2327,9 @@ Er mwyn gweinyddu eich gwefan, agorwch swyddfa gefn Umbraco a dechreuwch ychwang Cuddstôr Cof @@ -2340,7 +2340,7 @@ Er mwyn gweinyddu eich gwefan, agorwch swyddfa gefn Umbraco a dechreuwch ychwang Gall ailadeiladu fod yn ddrud. - Defnyddio fo pan mae ail-lwytho ddim yn ddigon, a ti'n feddwl mai'r stôr cronfa ddata heb gael ei + Defnyddio fo pan mae ail-lwytho ddim yn ddigon, a ti'n feddwl mai'r stôr cronfa ddata heb gael ei chynhyrchu'n iawn—a fyddai'n arwydd o broblem gritigol efo Umbraco. ]]> diff --git a/src/Umbraco.Web.UI/umbraco/config/lang/da.xml b/src/Umbraco.Web.UI/umbraco/config/lang/da.xml index faec3f5e9f05..05c2caad27da 100644 --- a/src/Umbraco.Web.UI/umbraco/config/lang/da.xml +++ b/src/Umbraco.Web.UI/umbraco/config/lang/da.xml @@ -18,10 +18,10 @@ Slet Deaktivér Edit settings - Tøm papirkurv + Tøm papirkurv Aktivér Eksportér dokumenttype - Importér dokumenttype + Importér dokumenttype Importér pakke Redigér i Canvas Log af diff --git a/src/Umbraco.Web.UI/umbraco/config/lang/de.xml b/src/Umbraco.Web.UI/umbraco/config/lang/de.xml index 9332e63f5719..84ec9efc7d07 100644 --- a/src/Umbraco.Web.UI/umbraco/config/lang/de.xml +++ b/src/Umbraco.Web.UI/umbraco/config/lang/de.xml @@ -16,10 +16,10 @@ Neue Gruppe Entfernen Deaktivieren - Papierkorb leeren + Papierkorb leeren Aktivieren Dokumenttyp exportieren - Dokumenttyp importieren + Dokumenttyp importieren Paket importieren 'Canvas'-Modus starten Abmelden diff --git a/src/Umbraco.Web.UI/umbraco/config/lang/en.xml b/src/Umbraco.Web.UI/umbraco/config/lang/en.xml index 143c754a7212..f5386892b94f 100644 --- a/src/Umbraco.Web.UI/umbraco/config/lang/en.xml +++ b/src/Umbraco.Web.UI/umbraco/config/lang/en.xml @@ -17,10 +17,10 @@ Delete Disable Edit settings - Empty recycle bin + Empty recycle bin Enable Export Document Type - Import Document Type + Import Document Type Import Package Edit in Canvas Exit diff --git a/src/Umbraco.Web.UI/umbraco/config/lang/en_us.xml b/src/Umbraco.Web.UI/umbraco/config/lang/en_us.xml index 77ab76aab1a2..2c811cd27453 100644 --- a/src/Umbraco.Web.UI/umbraco/config/lang/en_us.xml +++ b/src/Umbraco.Web.UI/umbraco/config/lang/en_us.xml @@ -18,10 +18,10 @@ Delete Disable Edit settings - Empty recycle bin + Empty recycle bin Enable Export Document Type - Import Document Type + Import Document Type Import Package Edit in Canvas Exit diff --git a/src/Umbraco.Web.UI/umbraco/config/lang/es.xml b/src/Umbraco.Web.UI/umbraco/config/lang/es.xml index 96079b59053a..5a5dfaa2bbb3 100644 --- a/src/Umbraco.Web.UI/umbraco/config/lang/es.xml +++ b/src/Umbraco.Web.UI/umbraco/config/lang/es.xml @@ -15,10 +15,10 @@ Crear grupo Borrar Deshabilitar - Vaciar Papelera + Vaciar Papelera Activar Exportar Documento (tipo) - Importar Documento (tipo) + Importar Documento (tipo) Importar Paquete Editar en vivo Cerrar sesión diff --git a/src/Umbraco.Web.UI/umbraco/config/lang/fr.xml b/src/Umbraco.Web.UI/umbraco/config/lang/fr.xml index d58d45b1b6c5..9ab5d3f1b339 100644 --- a/src/Umbraco.Web.UI/umbraco/config/lang/fr.xml +++ b/src/Umbraco.Web.UI/umbraco/config/lang/fr.xml @@ -16,10 +16,10 @@ Créer un groupe Supprimer Désactiver - Vider la corbeille + Vider la corbeille Activer Exporter le type de document - Importer un type de document + Importer un type de document Importer un package Editer dans Canvas Déconnexion diff --git a/src/Umbraco.Web.UI/umbraco/config/lang/he.xml b/src/Umbraco.Web.UI/umbraco/config/lang/he.xml index 5a431dacf301..ee03ca6fc9ea 100644 --- a/src/Umbraco.Web.UI/umbraco/config/lang/he.xml +++ b/src/Umbraco.Web.UI/umbraco/config/lang/he.xml @@ -13,9 +13,9 @@ צור חבילה מחק נטרל - רוקן סל מיחזור + רוקן סל מיחזור ייצא סוג קובץ - ייבא סוג מסמך + ייבא סוג מסמך ייבא חבילה ערוך במצב "קנבס" יציאה diff --git a/src/Umbraco.Web.UI/umbraco/config/lang/it.xml b/src/Umbraco.Web.UI/umbraco/config/lang/it.xml index f9a224355415..eadd6957385b 100644 --- a/src/Umbraco.Web.UI/umbraco/config/lang/it.xml +++ b/src/Umbraco.Web.UI/umbraco/config/lang/it.xml @@ -13,9 +13,9 @@ Crea pacchetto Cancella Disabilita - Svuota il cestino + Svuota il cestino Esporta il tipo di documento - Importa il tipo di documento + Importa il tipo di documento Importa il pacchetto Modifica in Area di Lavoro Uscita diff --git a/src/Umbraco.Web.UI/umbraco/config/lang/ja.xml b/src/Umbraco.Web.UI/umbraco/config/lang/ja.xml index 6695c9ad0e26..9775668df9ef 100644 --- a/src/Umbraco.Web.UI/umbraco/config/lang/ja.xml +++ b/src/Umbraco.Web.UI/umbraco/config/lang/ja.xml @@ -14,9 +14,9 @@ パッケージの作成 削除 無効 - ごみ箱を空にする + ごみ箱を空にする ドキュメントタイプの書出 - ドキュメントタイプの読込 + ドキュメントタイプの読込 パッケージの読み込み ライブ編集 ログアウト @@ -1087,4 +1087,4 @@ Runwayをインストールして作られた新しいウェブサイトがど すべて選択 すべての選択を解除 - \ No newline at end of file + diff --git a/src/Umbraco.Web.UI/umbraco/config/lang/ko.xml b/src/Umbraco.Web.UI/umbraco/config/lang/ko.xml index 821e81631495..1bf5d052ddd4 100644 --- a/src/Umbraco.Web.UI/umbraco/config/lang/ko.xml +++ b/src/Umbraco.Web.UI/umbraco/config/lang/ko.xml @@ -13,9 +13,9 @@ 패키지 새로 만들기 삭제 비활성 - 휴지통 비우기 + 휴지통 비우기 추출 문서 유형 - 등록 문서 유형 + 등록 문서 유형 패키지 등록 캔버스 내용 편집 종료 diff --git a/src/Umbraco.Web.UI/umbraco/config/lang/nb.xml b/src/Umbraco.Web.UI/umbraco/config/lang/nb.xml index a20d0ce4e372..9f518fa319ef 100644 --- a/src/Umbraco.Web.UI/umbraco/config/lang/nb.xml +++ b/src/Umbraco.Web.UI/umbraco/config/lang/nb.xml @@ -14,9 +14,9 @@ Opprett pakke Slett Deaktiver - Tøm papirkurv + Tøm papirkurv Eksporter dokumenttype - Importer dokumenttype + Importer dokumenttype Importer pakke Rediger i Canvas Logg av @@ -920,4 +920,4 @@ Vennlig hilsen Umbraco roboten Velg alle Opphev alle - \ No newline at end of file + diff --git a/src/Umbraco.Web.UI/umbraco/config/lang/nl.xml b/src/Umbraco.Web.UI/umbraco/config/lang/nl.xml index c557c44a3cab..36a6f2f4573b 100644 --- a/src/Umbraco.Web.UI/umbraco/config/lang/nl.xml +++ b/src/Umbraco.Web.UI/umbraco/config/lang/nl.xml @@ -18,10 +18,10 @@ Verwijderen Uitschakelen Instellingen wijzigen - Prullenbak leegmaken + Prullenbak leegmaken Inschakelen Documenttype exporteren - Documenttype importeren + Documenttype importeren Package importeren Aanpassen in Canvas Afsluiten diff --git a/src/Umbraco.Web.UI/umbraco/config/lang/pl.xml b/src/Umbraco.Web.UI/umbraco/config/lang/pl.xml index 4cdbe3e0f8b2..14fddc054f6a 100644 --- a/src/Umbraco.Web.UI/umbraco/config/lang/pl.xml +++ b/src/Umbraco.Web.UI/umbraco/config/lang/pl.xml @@ -15,10 +15,10 @@ Stwórz grupę Usuń Deaktywuj - Opróżnij kosz + Opróżnij kosz Aktywuj Eksportuj typ dokumentu - Importuj typ dokumentu + Importuj typ dokumentu Importuj zbiór Edytuj na stronie Wyjście diff --git a/src/Umbraco.Web.UI/umbraco/config/lang/pt.xml b/src/Umbraco.Web.UI/umbraco/config/lang/pt.xml index f70707422530..ad6db137ba18 100644 --- a/src/Umbraco.Web.UI/umbraco/config/lang/pt.xml +++ b/src/Umbraco.Web.UI/umbraco/config/lang/pt.xml @@ -13,9 +13,9 @@ Criar Pacote Remover Desabilitar - Esvaziar Lixeira + Esvaziar Lixeira Exportar Tipo de Documento - Importar Tipo de Documento + Importar Tipo de Documento Importar Pacote Editar na Tela Sair @@ -835,4 +835,4 @@ Você pode publicar esta página e todas suas sub-páginas ao selecionar pub Selecionar tudo Desmarcar todos - \ No newline at end of file + diff --git a/src/Umbraco.Web.UI/umbraco/config/lang/ru.xml b/src/Umbraco.Web.UI/umbraco/config/lang/ru.xml index f51ab92a9c4c..953c7b0bf38e 100644 --- a/src/Umbraco.Web.UI/umbraco/config/lang/ru.xml +++ b/src/Umbraco.Web.UI/umbraco/config/lang/ru.xml @@ -17,11 +17,11 @@ Значение по умолчанию Удалить Отключить - Очистить корзину + Очистить корзину Включить Экспорт Экспортировать - Импортировать + Импортировать Импортировать пакет Править на месте Выйти diff --git a/src/Umbraco.Web.UI/umbraco/config/lang/sv.xml b/src/Umbraco.Web.UI/umbraco/config/lang/sv.xml index 2aceb81ec59a..6fb16bc8e0a4 100644 --- a/src/Umbraco.Web.UI/umbraco/config/lang/sv.xml +++ b/src/Umbraco.Web.UI/umbraco/config/lang/sv.xml @@ -20,9 +20,9 @@ Standardvärde Ta bort Avaktivera - Töm papperskorgen + Töm papperskorgen Exportera dokumenttyp - Importera dokumenttyp + Importera dokumenttyp Importera paket Redigera i Canvas Logga ut diff --git a/src/Umbraco.Web.UI/umbraco/config/lang/tr.xml b/src/Umbraco.Web.UI/umbraco/config/lang/tr.xml index f371ad2cf00b..d5bd6c2af197 100644 --- a/src/Umbraco.Web.UI/umbraco/config/lang/tr.xml +++ b/src/Umbraco.Web.UI/umbraco/config/lang/tr.xml @@ -17,10 +17,10 @@ Sil Devre Dışı Bırak Ayarları düzenle - Geri dönüşüm kutusunu boşalt + Geri dönüşüm kutusunu boşalt Etkinleştir Belge Türünü Dışa Aktar - Belge Türünü İçe Aktar + Belge Türünü İçe Aktar Paketi İçe Aktar Kanvas'ta Düzenle Çıkış diff --git a/src/Umbraco.Web.UI/umbraco/config/lang/zh.xml b/src/Umbraco.Web.UI/umbraco/config/lang/zh.xml index a2f044b102d4..cf2db35e9cd3 100644 --- a/src/Umbraco.Web.UI/umbraco/config/lang/zh.xml +++ b/src/Umbraco.Web.UI/umbraco/config/lang/zh.xml @@ -14,9 +14,9 @@ 创建扩展包 删除 禁用 - 清空回收站 + 清空回收站 导出文档类型 - 导入文档类型 + 导入文档类型 导入扩展包 实时编辑模式 退出 diff --git a/src/Umbraco.Web.UI/umbraco/config/lang/zh_tw.xml b/src/Umbraco.Web.UI/umbraco/config/lang/zh_tw.xml index f65a8c0cb7da..0fee4e6a1838 100644 --- a/src/Umbraco.Web.UI/umbraco/config/lang/zh_tw.xml +++ b/src/Umbraco.Web.UI/umbraco/config/lang/zh_tw.xml @@ -14,9 +14,9 @@ 創建擴展包 刪除 禁用 - 清空回收站 + 清空回收站 匯出文檔類型 - 導入文檔類型 + 導入文檔類型 導入擴展包 即時編輯模式 退出