diff --git a/.github/CONTRIBUTING_DETAILED.md b/.github/CONTRIBUTING_DETAILED.md index b3e34ef55dd1..8c2bfffd8759 100644 --- a/.github/CONTRIBUTING_DETAILED.md +++ b/.github/CONTRIBUTING_DETAILED.md @@ -19,7 +19,7 @@ When contributing code to Umbraco there's plenty of things you'll want to know, * [What branch should I target for my contributions?](#what-branch-should-i-target-for-my-contributions) * [Building Umbraco from source code](#building-umbraco-from-source-code) * [Keeping your Umbraco fork in sync with the main repository](#keeping-your-umbraco-fork-in-sync-with-the-main-repository) - + ## How Can I Contribute? ### Reporting Bugs @@ -52,7 +52,7 @@ Provide more context by answering these questions: Include details about your configuration and environment: - * **Which version of Umbraco are you using?** + * **Which version of Umbraco are you using?** * **What is the environment you're using Umbraco in?** Is this a problem on your local machine or on a server. Tell us about your configuration: Windows version, IIS/IISExpress, database type, etc. * **Which packages do you have installed?** @@ -80,7 +80,7 @@ The most successful pull requests usually look a like this: * Unit tests, while optional are awesome, thank you! * New code is commented with documentation from which [the reference documentation](https://our.umbraco.com/documentation/Reference/) is generated -Again, these are guidelines, not strict requirements. +Again, these are guidelines, not strict requirements. ## Making changes after the PR was opened @@ -90,7 +90,7 @@ If you make the corrections we ask for in the same branch and push them to your To be honest, we don't like rules very much. We trust you have the best of intentions and we encourage you to create working code. If it doesn't look perfect then we'll happily help clean it up. -That said, the Umbraco development team likes to follow the hints that ReSharper gives us (no problem if you don't have this installed) and we've added a `.editorconfig` file so that Visual Studio knows what to do with whitespace, line endings, etc. +That said, the Umbraco development team likes to follow the hints that ReSharper gives us (no problem if you don't have this installed) and we've added a `.editorconfig` file so that Visual Studio knows what to do with whitespace, line endings, etc. ## What should I know before I get started? @@ -125,6 +125,12 @@ We like to use [Gitflow as much as possible](https://jeffkreeftmeijer.com/git-fl ### Building Umbraco from source code +In order to build the Umbraco source code locally, first make sure you have the following installed. + + * Visual Studio 2017 v15.3+ + * Node v10+ (Installed via `build.bat` script. If you already have it installed, make sure you're running at least v10) + * npm v6.4.1+ (Installed via `build.bat` script. If you already have it installed, make sure you're running at least v6.4.1) + The easiest way to get started is to run `build.bat` which will build both the backoffice (also known as "Belle") and the Umbraco core. You can then easily start debugging from Visual Studio, or if you need to debug Belle you can run `gulp dev` in `src\Umbraco.Web.UI.Client`. See [this page](BUILD.md) for more details. Alternatively, you can open `src\umbraco.sln` in Visual Studio 2017 (version 15.3 or higher, [the community edition is free](https://www.visualstudio.com/thank-you-downloading-visual-studio/?sku=Community&rel=15) for you to use to contribute to Open Source projects). In Visual Studio, find the Task Runner Explorer (in the View menu under Other Windows) and run the build task under the gulpfile. diff --git a/src/Umbraco.Core/Models/UserExtensions.cs b/src/Umbraco.Core/Models/UserExtensions.cs index 5db36d16ed3e..d9898766078c 100644 --- a/src/Umbraco.Core/Models/UserExtensions.cs +++ b/src/Umbraco.Core/Models/UserExtensions.cs @@ -3,6 +3,7 @@ using System.Globalization; using System.Linq; using System.Net; +using System.Security.Cryptography; using Umbraco.Core.Cache; using Umbraco.Core.Configuration; using Umbraco.Core.IO; @@ -35,9 +36,12 @@ public static bool HasSectionAccess(this IUser user, string app) /// A list of 5 different sized avatar URLs /// internal static string[] GetUserAvatarUrls(this IUser user, ICacheProvider staticCache) - { - //check if the user has explicitly removed all avatars including a gravatar, this will be possible and the value will be "none" - if (user.Avatar == "none") + { + // If FIPS is required, never check the Gravatar service as it only supports MD5 hashing. + // Unfortunately, if the FIPS setting is enabled on Windows, using MD5 will throw an exception + // and the website will not run. + // Also, check if the user has explicitly removed all avatars including a gravatar, this will be possible and the value will be "none" + if (user.Avatar == "none" || CryptoConfig.AllowOnlyFipsAlgorithms) { return new string[0]; } diff --git a/src/Umbraco.Core/Persistence/Repositories/AuditRepository.cs b/src/Umbraco.Core/Persistence/Repositories/AuditRepository.cs index 4fe235346f78..0ff233b1fa82 100644 --- a/src/Umbraco.Core/Persistence/Repositories/AuditRepository.cs +++ b/src/Umbraco.Core/Persistence/Repositories/AuditRepository.cs @@ -48,7 +48,7 @@ public IEnumerable GetPagedResultsByQuery(IQuery query, var sql = GetBaseQuery(false); if (query == null) query = new Query(); - + var queryHasWhereClause = query.GetWhereClauses().Any(); var translatorIds = new SqlTranslator(sql, query); var translatedQuery = translatorIds.Translate(); @@ -59,7 +59,7 @@ public IEnumerable GetPagedResultsByQuery(IQuery query, { var filterSql = new Sql(); foreach (var filterClause in customFilterWheres) - { + { filterSql.Append($"AND ({filterClause.Item1})", filterClause.Item2); } @@ -70,7 +70,7 @@ public IEnumerable GetPagedResultsByQuery(IQuery query, { var filterSql = new Sql(); foreach (var filterClause in auditTypeFilter) - { + { filterSql.Append("AND (logHeader = @logHeader)", new { logHeader = filterClause.ToString() }); } @@ -80,14 +80,14 @@ public IEnumerable GetPagedResultsByQuery(IQuery query, if (orderDirection == Direction.Descending) translatedQuery.OrderByDescending("Datestamp"); else - translatedQuery.OrderBy("Datestamp"); + translatedQuery.OrderBy("Datestamp"); // Get page of results and total count var pagedResult = Database.Page(pageIndex + 1, pageSize, translatedQuery); totalRecords = pagedResult.TotalItems; var pages = pagedResult.Items.Select( - dto => new AuditItem(dto.Id, dto.Comment, Enum.ParseOrNull(dto.Header) ?? AuditType.Custom, dto.UserId)).ToArray(); + dto => new AuditItem(dto.NodeId, dto.Comment, Enum.ParseOrNull(dto.Header) ?? AuditType.Custom, dto.UserId)).ToArray(); //Mapping the DateStamp for (var i = 0; i < pages.Length; i++) @@ -142,7 +142,7 @@ protected override IEnumerable PerformGetAll(params int[] ids) protected override IEnumerable PerformGetByQuery(IQuery query) { throw new NotImplementedException(); - } + } protected override string GetBaseWhereClause() { @@ -167,7 +167,7 @@ private Sql GetFilteredSqlForPagedResults(Sql sql, Sql filterSql, bool hasWhereC // Apply filter if (filterSql != null) { - //ensure we don't append a WHERE if there is already one + //ensure we don't append a WHERE if there is already one var sqlFilter = hasWhereClause ? filterSql.SQL : " WHERE " + filterSql.SQL.TrimStart("AND "); diff --git a/src/Umbraco.Core/Persistence/Repositories/RepositoryBase.cs b/src/Umbraco.Core/Persistence/Repositories/RepositoryBase.cs index 5b1737564a09..459248709c9d 100644 --- a/src/Umbraco.Core/Persistence/Repositories/RepositoryBase.cs +++ b/src/Umbraco.Core/Persistence/Repositories/RepositoryBase.cs @@ -258,12 +258,20 @@ public IEnumerable GetAll(params TId[] ids) //.Where(x => Equals(x, default(TId)) == false) .ToArray(); - if (ids.Length > 2000) + // can't query more than 2000 ids at a time... but if someone is really querying 2000+ entities, + // the additional overhead of fetching them in groups is minimal compared to the lookup time of each group + const int maxParams = 2000; + if (ids.Length <= maxParams) { - throw new InvalidOperationException("Cannot perform a query with more than 2000 parameters"); + return CachePolicy.GetAll(ids, PerformGetAll); } + var entities = new List(); + foreach (var groupOfIds in ids.InGroupsOf(maxParams)) + { + entities.AddRange(CachePolicy.GetAll(groupOfIds.ToArray(), PerformGetAll)); + } + return entities; - return CachePolicy.GetAll(ids, PerformGetAll); } protected abstract IEnumerable PerformGetByQuery(IQuery query); diff --git a/src/Umbraco.Core/Services/ContentService.cs b/src/Umbraco.Core/Services/ContentService.cs index 9b0de4009022..ba777ef59e72 100644 --- a/src/Umbraco.Core/Services/ContentService.cs +++ b/src/Umbraco.Core/Services/ContentService.cs @@ -2575,8 +2575,18 @@ private Attempt SaveAndPublishDo(IContent content, int userId = 0 _publishingStrategy.PublishingFinalized(uow, descendants, false); } - Audit(uow, AuditType.Publish, "Save and Publish performed by user", userId, content.Id); uow.Commit(); + + if (publishStatus.StatusType == PublishStatusType.Success) + { + Audit(uow, AuditType.Publish, "Save and Publish performed by user", userId, content.Id); + } + else + { + Audit(uow, AuditType.Save, "Save performed by user", userId, content.Id); + } + uow.Commit(); + return Attempt.If(publishStatus.StatusType == PublishStatusType.Success, publishStatus); } } diff --git a/src/Umbraco.Tests/Migrations/Upgrades/SqlCeUpgradeTest.cs b/src/Umbraco.Tests/Migrations/Upgrades/SqlCeUpgradeTest.cs index bdaf3f4bfd8f..3d249ff39042 100644 --- a/src/Umbraco.Tests/Migrations/Upgrades/SqlCeUpgradeTest.cs +++ b/src/Umbraco.Tests/Migrations/Upgrades/SqlCeUpgradeTest.cs @@ -35,7 +35,7 @@ public override void DatabaseSpecificSetUp() catch (Exception) { //if this doesn't work we have to make sure everything is reset! otherwise - // well run into issues because we've already set some things up + // we'll run into issues because we've already set some things up TearDown(); throw; } @@ -83,4 +83,4 @@ public override string GetDatabaseSpecificSqlScript() return SqlScripts.SqlResources.SqlCeTotal_480; } } -} \ No newline at end of file +} diff --git a/src/Umbraco.Tests/TestHelpers/BaseDatabaseFactoryTest.cs b/src/Umbraco.Tests/TestHelpers/BaseDatabaseFactoryTest.cs index 6bc45914a02c..690eb6bec1cc 100644 --- a/src/Umbraco.Tests/TestHelpers/BaseDatabaseFactoryTest.cs +++ b/src/Umbraco.Tests/TestHelpers/BaseDatabaseFactoryTest.cs @@ -183,8 +183,8 @@ protected virtual void CreateSqlCeDatabase() { RemoveDatabaseFile(ex => { - //if this doesn't work we have to make sure everything is reset! otherwise - // well run into issues because we've already set some things up + //If this doesn't work we have to make sure everything is reset! otherwise + // we'll run into issues because we've already set some things up TearDown(); throw ex; }); @@ -435,4 +435,4 @@ protected virtual string GetXmlContent(int templateId) "; } } -} \ No newline at end of file +} diff --git a/src/Umbraco.Web.UI.Client/src/less/belle.less b/src/Umbraco.Web.UI.Client/src/less/belle.less index 9b9be85053e7..7f10c3d4d754 100644 --- a/src/Umbraco.Web.UI.Client/src/less/belle.less +++ b/src/Umbraco.Web.UI.Client/src/less/belle.less @@ -101,7 +101,6 @@ @import "components/umb-confirm-action.less"; @import "components/umb-keyboard-shortcuts-overview.less"; @import "components/umb-checkbox-list.less"; -@import "components/umb-radiobuttons-list.less"; @import "components/umb-locked-field.less"; @import "components/umb-tabs.less"; @import "components/umb-load-indicator.less"; diff --git a/src/Umbraco.Web.UI.Client/src/less/components/overlays.less b/src/Umbraco.Web.UI.Client/src/less/components/overlays.less index 0906b513a6f9..9311e1985068 100644 --- a/src/Umbraco.Web.UI.Client/src/less/components/overlays.less +++ b/src/Umbraco.Web.UI.Client/src/less/components/overlays.less @@ -174,6 +174,7 @@ box-sizing: border-box; background: @gray-10; border-bottom: 1px solid @purple-l3; + pointer-events: none; } .umb-overlay__item-details-title-wrapper { diff --git a/src/Umbraco.Web.UI.Client/src/less/components/umb-radiobuttons-list.less b/src/Umbraco.Web.UI.Client/src/less/components/umb-radiobuttons-list.less deleted file mode 100644 index 2fe3487a8ff7..000000000000 --- a/src/Umbraco.Web.UI.Client/src/less/components/umb-radiobuttons-list.less +++ /dev/null @@ -1,80 +0,0 @@ -.umb-radiobuttons{ - &__label{ - position: relative; - padding: 0; - - &-text{ - margin: 0 0 0 32px; - position: relative; - top: 1px; - } - } - - &__input{ - position: absolute; - top: 0; - left: 0; - opacity: 0; - - &:focus ~ .umb-radiobuttons__state{ - box-shadow: 0 1px 3px fade(@black, 12%), 0 1px 2px fade(@black, 24%); - } - - &:focus:checked ~ .umb-radiobuttons__state{ - box-shadow: none; - } - - &:checked ~ .umb-radiobuttons__state{ - &:before{ - width: 100%; - height: 100%; - } - } - - &:checked ~ .umb-radiobuttons__state .umb-radiobuttons__icon{ - opacity: 1; - } - } - - &__state{ - display: flex; - flex-wrap: wrap; - border: 1px solid @gray-8; - border-radius: 100%; - width: 22px; - height: 22px; - position: relative; - - &:before{ - content: ""; - background: @green; - width: 0; - height: 0; - transition: .1s ease-out; - position: absolute; - left: 0; - right: 0; - top: 0; - bottom: 0; - margin: auto; - border-radius: 100%; - } - } - - &__icon{ - color: @white; - text-align: center; - font-size: 15px; - opacity: 0; - transition: .3s ease-out; - - &:before{ - position: absolute; - top: 2px; - right: 0; - left: 0; - bottom: 0; - margin: auto; - } - } -} diff --git a/src/Umbraco.Web.UI.Client/src/views/common/dialogs/treepicker.controller.js b/src/Umbraco.Web.UI.Client/src/views/common/dialogs/treepicker.controller.js index b0521dc930b3..844ee6e24093 100644 --- a/src/Umbraco.Web.UI.Client/src/views/common/dialogs/treepicker.controller.js +++ b/src/Umbraco.Web.UI.Client/src/views/common/dialogs/treepicker.controller.js @@ -8,7 +8,7 @@ angular.module("umbraco").controller("Umbraco.Dialogs.TreePickerController", $scope.section = dialogOptions.section; $scope.treeAlias = dialogOptions.treeAlias; $scope.multiPicker = dialogOptions.multiPicker; - $scope.hideHeader = true; + $scope.hideHeader = (typeof dialogOptions.hideHeader) === "boolean" ? dialogOptions.hideHeader : true;; $scope.searchInfo = { searchFromId: dialogOptions.startNodeId, searchFromName: null, @@ -428,4 +428,4 @@ angular.module("umbraco").controller("Umbraco.Dialogs.TreePickerController", $scope.dialogTreeEventHandler.unbind("treeNodeExpanded", nodeExpandedHandler); $scope.dialogTreeEventHandler.unbind("treeNodeSelect", nodeSelectHandler); }); - }); \ No newline at end of file + }); diff --git a/src/Umbraco.Web.UI.Client/src/views/components/umb-list-view-settings.html b/src/Umbraco.Web.UI.Client/src/views/components/umb-list-view-settings.html index 356864546a7a..7f1b75a713d2 100644 --- a/src/Umbraco.Web.UI.Client/src/views/components/umb-list-view-settings.html +++ b/src/Umbraco.Web.UI.Client/src/views/components/umb-list-view-settings.html @@ -33,8 +33,10 @@ - - +
+ + +
diff --git a/src/Umbraco.Web.UI.Client/src/views/prevalueeditors/valuetype.html b/src/Umbraco.Web.UI.Client/src/views/prevalueeditors/valuetype.html index 59b7c55c1950..4146ba076337 100644 --- a/src/Umbraco.Web.UI.Client/src/views/prevalueeditors/valuetype.html +++ b/src/Umbraco.Web.UI.Client/src/views/prevalueeditors/valuetype.html @@ -1,7 +1,7 @@ - - \ No newline at end of file + diff --git a/src/Umbraco.Web.UI.Client/src/views/propertyeditors/checkboxlist/checkboxlist.html b/src/Umbraco.Web.UI.Client/src/views/propertyeditors/checkboxlist/checkboxlist.html index ae691215e725..f49858e5cb28 100644 --- a/src/Umbraco.Web.UI.Client/src/views/propertyeditors/checkboxlist/checkboxlist.html +++ b/src/Umbraco.Web.UI.Client/src/views/propertyeditors/checkboxlist/checkboxlist.html @@ -5,7 +5,8 @@ diff --git a/src/Umbraco.Web.UI.Client/src/views/propertyeditors/dropdownFlexible/dropdownFlexible.controller.js b/src/Umbraco.Web.UI.Client/src/views/propertyeditors/dropdownFlexible/dropdownFlexible.controller.js index c7a472d80ef1..251fa12455f5 100644 --- a/src/Umbraco.Web.UI.Client/src/views/propertyeditors/dropdownFlexible/dropdownFlexible.controller.js +++ b/src/Umbraco.Web.UI.Client/src/views/propertyeditors/dropdownFlexible/dropdownFlexible.controller.js @@ -74,8 +74,16 @@ angular.module("umbraco").controller("Umbraco.PropertyEditors.DropdownFlexibleCo // if we run in single mode we'll store the value in a local variable // so we can pass an array as the model as our PropertyValueEditor expects that $scope.model.singleDropdownValue = ""; - if ($scope.model.config.multiple === "0") { + if ($scope.model.config.multiple === "0" && $scope.model.value) { $scope.model.singleDropdownValue = Array.isArray($scope.model.value) ? $scope.model.value[0] : $scope.model.value; } + // if we run in multiple mode, make sure the model is an array (in case the property was previously saved in single mode) + // also explicitly set the model to null if it's an empty array, so mandatory validation works on the client + if ($scope.model.config.multiple === "1" && $scope.model.value) { + $scope.model.value = !Array.isArray($scope.model.value) ? [$scope.model.value] : $scope.model.value; + if ($scope.model.value.length === 0) { + $scope.model.value = null; + } + } }); diff --git a/src/Umbraco.Web.UI.Client/src/views/propertyeditors/dropdownFlexible/dropdownFlexible.html b/src/Umbraco.Web.UI.Client/src/views/propertyeditors/dropdownFlexible/dropdownFlexible.html index a68a614ad152..0524b826667a 100644 --- a/src/Umbraco.Web.UI.Client/src/views/propertyeditors/dropdownFlexible/dropdownFlexible.html +++ b/src/Umbraco.Web.UI.Client/src/views/propertyeditors/dropdownFlexible/dropdownFlexible.html @@ -5,7 +5,8 @@ ng-switch-default ng-change="updateSingleDropdownValue()" ng-model="model.singleDropdownValue" - ng-options="item.id as item.value for item in model.config.items"> + ng-options="item.id as item.value for item in model.config.items" + ng-required="model.validation.mandatory"> @@ -15,5 +16,6 @@ ng-switch-when="1" multiple ng-model="model.value" - ng-options="item.id as item.value for item in model.config.items"> + ng-options="item.id as item.value for item in model.config.items" + ng-required="model.validation.mandatory"> diff --git a/src/Umbraco.Web.UI.Client/src/views/propertyeditors/imagecropper/imagecropper.prevalues.controller.js b/src/Umbraco.Web.UI.Client/src/views/propertyeditors/imagecropper/imagecropper.prevalues.controller.js index 5a0b43d105fd..de56442239a2 100644 --- a/src/Umbraco.Web.UI.Client/src/views/propertyeditors/imagecropper/imagecropper.prevalues.controller.js +++ b/src/Umbraco.Web.UI.Client/src/views/propertyeditors/imagecropper/imagecropper.prevalues.controller.js @@ -69,4 +69,8 @@ angular.module("umbraco").controller("Umbraco.PrevalueEditors.CropSizesControlle //there was an error, do the highlight (will be set back by the directive) $scope.hasError = true; }; + + $scope.sortableOptions = { + axis: 'y' + } }); diff --git a/src/Umbraco.Web.UI.Client/src/views/propertyeditors/imagecropper/imagecropper.prevalues.html b/src/Umbraco.Web.UI.Client/src/views/propertyeditors/imagecropper/imagecropper.prevalues.html index 6341d6f11c51..37a8b85f7023 100644 --- a/src/Umbraco.Web.UI.Client/src/views/propertyeditors/imagecropper/imagecropper.prevalues.html +++ b/src/Umbraco.Web.UI.Client/src/views/propertyeditors/imagecropper/imagecropper.prevalues.html @@ -58,7 +58,7 @@ -
+
diff --git a/src/Umbraco.Web.UI.Client/src/views/propertyeditors/nestedcontent/nestedcontent.html b/src/Umbraco.Web.UI.Client/src/views/propertyeditors/nestedcontent/nestedcontent.html index 0117bac92d79..1ff6666907b3 100644 --- a/src/Umbraco.Web.UI.Client/src/views/propertyeditors/nestedcontent/nestedcontent.html +++ b/src/Umbraco.Web.UI.Client/src/views/propertyeditors/nestedcontent/nestedcontent.html @@ -37,7 +37,7 @@
diff --git a/src/Umbraco.Web.UI.Client/src/views/propertyeditors/radiobuttons/radiobuttons.html b/src/Umbraco.Web.UI.Client/src/views/propertyeditors/radiobuttons/radiobuttons.html index 7af6491641ed..cdb5a37ac8c2 100644 --- a/src/Umbraco.Web.UI.Client/src/views/propertyeditors/radiobuttons/radiobuttons.html +++ b/src/Umbraco.Web.UI.Client/src/views/propertyeditors/radiobuttons/radiobuttons.html @@ -1,17 +1,12 @@ 
  • -
-
+
\ No newline at end of file diff --git a/src/Umbraco.Web.UI/umbraco/config/lang/en.xml b/src/Umbraco.Web.UI/umbraco/config/lang/en.xml index 5b14e03fae78..dee70fd4537c 100644 --- a/src/Umbraco.Web.UI/umbraco/config/lang/en.xml +++ b/src/Umbraco.Web.UI/umbraco/config/lang/en.xml @@ -2191,7 +2191,7 @@ To manage your website, simply open the Umbraco back office and start adding con %0%.]]> %0%.]]>

Results of the scheduled Umbraco Health Checks run on %0% at %1% are as follows:

%2%]]>
- Umbraco Health Check Status + Umbraco Health Check Status: %0% Disable URL tracker 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 b4c06029958f..3b5eb81da96e 100644 --- a/src/Umbraco.Web.UI/umbraco/config/lang/en_us.xml +++ b/src/Umbraco.Web.UI/umbraco/config/lang/en_us.xml @@ -2184,7 +2184,7 @@ To manage your website, simply open the Umbraco back office and start adding con %0%.]]> %0%.]]>

Results of the scheduled Umbraco Health Checks run on %0% at %1% are as follows:

%2%]]>
- Umbraco Health Check Status + Umbraco Health Check Status: %0% Disable URL tracker diff --git a/src/Umbraco.Web.UI/umbraco/config/lang/es.xml b/src/Umbraco.Web.UI/umbraco/config/lang/es.xml index a41d17604b4f..ba0027aef01f 100644 --- a/src/Umbraco.Web.UI/umbraco/config/lang/es.xml +++ b/src/Umbraco.Web.UI/umbraco/config/lang/es.xml @@ -5,8 +5,8 @@ https://our.umbraco.com/documentation/Extending-Umbraco/Language-Files - Administrar hostnames - Auditoría + Administrar dominios + Historial Nodo de Exploración Cambiar tipo de documento Copiar @@ -20,26 +20,26 @@ Exportar Documento (tipo) Importar Documento (tipo) Importar Paquete - Editar en lienzo - Salir + Editar en vivo + Cerrar sesión Mover Notificaciones Acceso Público Publicar - Unpublish + Retirar publicación Recargar Nodos Republicar sitio completo Renombrar Restaurar Establecer permisos para la página %0% - Elije dónde mover + Elige dónde mover En el árbol de contenido Permisos Deshacer Enviar a Publicar Enviar a Traducir Establecer grupo - Ordernar + Ordenar Traducir Actualizar Establecer permisos @@ -54,7 +54,7 @@ Permitir acceso para asignar cultura y dominios - Permitir acceso para ver informes de nodos + Permitir acceso para ver el historial de un nodo Permitir acceso para ver un nodo Permitir acceso para cambiar el tipo de documento de un nodo Permitir acceso para copiar un nodo @@ -79,7 +79,7 @@ Nodo no válido. Formato de dominio no válido. Este dominio ya ha sido asignado. - Language + Idioma Dominio El nuevo dominio %0% ha sido creado El dominio %0% ha sido borrado @@ -91,9 +91,9 @@ "https://www.tudominio.com/".

Los dominios de un nivel están soportados, por ej. "example.com/en". De todas formas deberían de evitarse. Mejor usar la configuración cultural especificada arriba.]]> Heredar - Cultura + Idioma - o hereda la cultura de los nodos padres. También se aplicará
+ o hereda el idioma de los nodos padres. También se aplicará
para el nodo actual, a menos que un dominio por debajo lo aplique también.]]>
Dominios @@ -117,7 +117,7 @@ Alinear a la Izquierda Alinear a la Derecha Insertar Link - Insertar link local (anchor) + Insertar link local (ancla) Lista en Viñetas Lista Numérica Insertar macro @@ -140,7 +140,7 @@ Para cambiar el tipo de documento al contenido seleccionado, primero selecciona uno de la lista de tipos válidos. - Entonces confirma el mapeo de propiedades del tipo actual al nuevo y haz click en Guardar. + Entonces confirma el mapeo de propiedades del tipo actual al nuevo y haz clic en Guardar. El contenido se ha vuelto a publicar. Propiedad actual Tipo actual @@ -163,8 +163,8 @@ Acerca de Link alternativo (como describe la imagen sobre el teléfono) - Vinculos Alternativos - Click para editar esta entrada + Vínculos Alternativos + Clic para editar esta entrada Creado por Autor original Actualizado por @@ -189,16 +189,16 @@ Título de la página Propiedades Este documento ha sido publicado pero no es visible porque el padre '%0%' no esta publicado - Upss: este documento está publicado pero no está en la caché (error interno) + Ups: este documento está publicado pero no está en la caché (error interno) No se pudo obtener la url - Este documento está publicado pero su url colisionará con contenido %0% + Este documento está publicado pero tu url colisionará con contenido %0% Publicar Estado de la Publicación Publicar el - Despublicar el + Retirar publicación el Fecha de Eliminación El Orden esta actualizado - Para organizar los nodos, simplemente arrastre los nodos o realice un clic en uno de los encabezados de columna. Puede seleccionar multiple nodos manteniendo presionados "Shift" o "Control" mientras selecciona + Para organizar los nodos, simplemente arrastra los nodos o realice un clic en uno de los encabezados de columna. Puedes seleccionar múltiple nodos manteniendo presionados "Shift" o "Control" mientras seleccionas Estadísticas Título (opcional) Texto alternativo (opcional) @@ -209,16 +209,16 @@ Eliminar archivo Vínculo al documento Miembro de grupo(s) - No es miembreo de grupo(s) + No es miembro de grupo(s) Nodos hijo - Target + Destino Esto se traduce en la siguiente hora en el servidor: ¿Esto qué significa?]]> ¿Estás seguro que quieres eliminar este elemento? Propiedad %0% utiliza editor %1% que no está soportado por Nested Content. Añadir otra caja de texto Eliminar caja de texto - Raiz de contenido + Raíz de contenido Crear nueva Plantilla de Contenido desde '%0%' @@ -230,7 +230,7 @@ Una Plantilla de Contenido es contenido predefinido que un editor puede usar como base para crear nuevo contenido - Haz click para subir archivos + Haz clic para subir archivos Arrastra los archivos aquí... @@ -241,7 +241,7 @@ ¿Dónde quieres crear el nuevo %0% Crear debajo de Selecciona el Tipo de Documento para el que quieres crear una plantilla de contenido - Elije un tipo y un título + Elige un tipo y un título "Tipos de documentos".]]> "Tipos de medios".]]> Tipo de Documento sin plantilla @@ -304,16 +304,16 @@ Nombre Administrar dominios Cerrar esta ventana - Esta usted seguro que desea borrar - Esta usted seguro que desea deshabilitar - Por favor seleccione esta casilla para confirmar la eliminación de %0% entrada(s) - Esta usted seguro? - Esta usted Seguro? + Estás seguro que quieres borrar + Estás seguro que quieres deshabilitar + Por favor selecciona esta casilla para confirmar la eliminación de %0% entrada(s) + ¿Estás seguro? + ¿Estás seguro? Cortar Editar entrada del Diccionario Editar idioma Agregar enlace interno - Insertar caracter + Insertar carácter Insertar titular gráfico Insertar imagen Insertar enlace @@ -331,9 +331,9 @@ Establecer permisos para Establecer permisos para %0% para grupo %1% Selecciona el grupo de usuarios para el cual quieres establecer permisos - Se está vaciando la papelera. No cierre esta ventana mientras se ejecuta este proceso + Se está vaciando la papelera. No cierres esta ventana mientras se ejecuta este proceso La papelera está vacía - No podrá recuperar los items una vez sean borrados de la papelera + No podrás recuperar los elementos una vez sean borrados de la papelera regexlib.com está experimentando algunos problemas en estos momentos, de los cuales no somos responsables. Pedimos disculpas por las molestias.]]> Buscar una expresión regular para agregar validación a un campo de formulario. Ejemplo: 'correo electrónico', código postal "," url " Eliminar macro @@ -344,16 +344,16 @@ Número de columnas Número de filas Coloca un 'placeholder' id al colocar un ID en tu 'placeholder' puedes insertar contenido en esta plantilla desde una plantilla hija, referenciando este ID usando un elemento<asp:content />.]]> - Seleccione una tecla de la lista abajo indicada. Sólo puede elegir a partir de la ID de la plantilla actual del dominio. - Haga clic sobre la imagen para verla a tamaño completo. - Seleccionar item - Ver item en la caché + Selecciona una tecla de la lista abajo indicada. Sólo puedes elegir a partir de la ID de la plantilla actual del dominio. + Haz clic sobre la imagen para verla a tamaño completo. + Seleccionar elemento + Ver elemento en la caché Crear carpeta... Relacionar con original Incluir descendientes La amigable comunidad Enlazar a página - Abre el documento enlazado en una nueva ventana o Opens the linked document in a new window o pestaña + Abre el documento enlazado en una nueva ventana o pestaña Enlazar a medio Enlazar a archivo Selecciona nodo de inicio de contenido @@ -370,8 +370,8 @@ Selecciona secciones Selecciona usuarios No se encontraron iconos - No hay parametros para esta macro - No hay maros disponibles para insertar + No hay parámetros para esta macro + No hay macros disponibles para insertar Proveedores de login externo Detalles de la Excepción Stacktrace @@ -383,12 +383,12 @@ Selecciona snippet - Editar las diferentes versiones lingüísticas para la entrada en el diccionario '% 0%' debajo añadir otros idiomas en el menu de 'idiomas' en el menú de la izquierda + Editar las diferentes versiones lingüísticas para la entrada en el diccionario '% 0%' debajo añadir otros idiomas en el menú de 'idiomas' en el menú de la izquierda - Edita clave de elemento de dictionario. + Edita clave de elemento de diccionario. Renombrado - Introduce un nuevo nombre para la carpeta aqui + Introduce un nuevo nombre para la carpeta aquí %0% fue renombrada a %1% - añadir prevalor + añadir valor preestablecido Tipo de datos GUID - Tipo de datos GUIDprestar control + Renderizar control Botones Habilitar la configuración avanzada para Habilitar menú contextual @@ -470,41 +470,41 @@ %0% ya existe Se han encontrado los siguientes errores: Se han encontrado los siguientes errores: - La clave debe tener como mínimo %0% caracteres y %1% caracter(es) no alfanuméricos + La clave debe tener como mínimo %0% caracteres y %1% carácter(es) no alfanuméricos %0% debe ser un número entero - Debe llenar los campos del %0% al %1% - Debe llenar el campo %0% - Debe poner el formato correcto del %0% al %1% - Debe poner un formato correcto en %0% + Debes llenar los campos del %0% al %1% + Debes llenar el campo %0% + Debes poner el formato correcto del %0% al %1% + Debes poner un formato correcto en %0% Se recibió un error desde el servidor El tipo de archivo especificado ha sido deshabilitado por el administrador - NOTA: Aunque CodeMirror esté activado en los ajustes de configuracion, no se muestra en Internet Explorer debido a que no es lo suficientemente estable.' - Debe llenar el alias y el nombre en el propertytype + NOTA: Aunque CodeMirror esté activado en los ajustes de configuración, no se muestra en Internet Explorer debido a que no es lo suficientemente estable.' + Debes rellenar el alias y el nombre en el tipo de propiedad Hay un problema de lectura y escritura al acceder a un archivo o carpeta Error cargando Vista Parcial (archivo: %0%) Error cargando userControl '%0%' - Error cargandog customControl (Assembly: %0%, Type: '%1%') + Error cargando customControl (Assembly: %0%, Type: '%1%') Error cargando MacroEngine script (file: %0%) "Error analizando archivo XSLT: %0% "Error leyendo archivo XSLT: %0% - - Por favor, elija un tipo - Usted está a punto de hacer la foto más grande que el tamaño original. ¿Está seguro de que desea continuar? + Por favor, elige un tipo + Estás a punto de hacer la foto más grande que el tamaño original. ¿Estás seguro de que desea continuar? Error en script python El script python no se ha guardado debido a que contenía error(es) - - Por favor, marque el contenido antes de cambiar de estilo - No active estilos disponibles + Por favor, marca el contenido antes de cambiar de estilo + No actives estilos disponibles - @@ -524,7 +524,7 @@ Acciones Añadir Alias - ¿Está seguro? + ¿Estás seguro? Borde o Cancelar @@ -545,7 +545,7 @@ Borrado Borrando... Diseño - Dictionario + Diccionario Dimensiones Abajo Descargar @@ -565,11 +565,11 @@ Margen interno Insertar Instalar - Invalido + Inválido Justificar Etiqueta Idioma - Ultimo + Último Diseño Cargando Bloqueado @@ -581,7 +581,7 @@ Mensaje Mover Nombre - New + Nuevo Próximo No de @@ -643,7 +643,7 @@ Guardando... actual Insertar - selecionado + seleccionado Negro @@ -669,10 +669,10 @@ mostrar atajos Activar/Desactivar vista de lista - Activar/Desactivar permitir como raiz + Activar/Desactivar permitir como raíz - Act/Desact Comentar líneas - Elimiar línea + Comentar/Descomentar líneas + Eliminar línea Copiar líneas arriba Copiar líneas abajo Mover líneas arriba @@ -693,18 +693,18 @@ El instalador no puede conectar con la base de datos. - No se ha podido guardar el archivo Web.config. Por favor, modifique la cadena de conexión manualmente. - Su base de datos ha sido encontrada y ha sido identificada como + No se ha podido guardar el archivo Web.config. Por favor, modifica la cadena de conexión manualmente. + Tu base de datos ha sido encontrada y ha sido identificada como Configuración de la base de datos - instalar para instalar %0% la base de datos de Umbraco]]> - Próximo para continuar]]> - ¡No se ha encontrado ninguna base de datos! Mira si la información en la "connection string" del “web.config” es correcta.

Para continuar, edite el "web.config" (bien sea usando Visual Studio o su editor de texto preferido), vaya al final del archivo y añada la cadena de conexión para la base de datos con el nombre (key) "umbracoDbDSN" y guarde el archivo.

Pinche en reintentar cuando haya terminado.
Pinche aquí para mayor información de como editar el web.config (en inglés)

]]>
+ instalar para instalar %0% la base de datos de Umbraco]]> + Próximo para continuar]]> + ¡No se ha encontrado ninguna base de datos! Mira si la información en la cadena de conexión del “web.config” es correcta.

Para continuar, edita el "web.config" (bien sea usando Visual Studio o tu editor de texto preferido), ve al final del archivo y añade la cadena de conexión para la base de datos con el nombre (key) "umbracoDbDSN" y guarda el archivo.

Pincha en reintentar cuando hayas terminado.
Pincha aquí para mayor información de como editar el web.config (en inglés)

]]>
Por favor, contacta con tu ISP si es necesario. Si estás realizando la instalación en una máquina o servidor local, quizás necesites información de tu administrador de sistemas.]]> - Pinche en actualizar para actualizar la base de datos a Umbraco %0%

Ningún contenido será borrado de la base de datos y seguirá funcionando después de la actualización

]]>
- Pinche en Próximo para continuar. ]]> - próximo para continuar con el asistente de configuración]]> + Pincha en actualizar para actualizar la base de datos a Umbraco %0%

Ningún contenido será borrado de la base de datos y seguirá funcionando después de la actualización

]]>
+ Pincha en Próximo para continuar. ]]> + próximo para continuar con el asistente de configuración]]> La contraseña del usuario por defecto debe ser cambiada]]> - El usuario por defecto ha sido desabilitado o ha perdido el acceso a Umbraco!

Pinche en Próximo para continuar.]]> + El usuario por defecto ha sido deshabilitado o ha perdido el acceso a Umbraco!

Pincha en Próximo para continuar.]]> ¡La contraseña del usuario por defecto ha sido cambiada desde que se instaló!

No hay que realizar ninguna tarea más. Pulsa Siguiente para proseguir.]]> ¡La contraseña se ha cambiado! Ten un buen comienzo, visita nuestros videos de introducción @@ -723,15 +723,15 @@ Resolviendo problemas con directorios Sigue este enlace para más información sobre problemas con ASP.NET y creación de directorios Configurando los permisos de directorios - Umbraco necesita permisos de lectura/escritura en algunos directorios para poder almacenar archivos tales como imagenes y PDFs. También almacena datos en la caché para mejorar el rendimiento de su sitio web + Umbraco necesita permisos de lectura/escritura en algunos directorios para poder almacenar archivos tales como imágenes y PDFs. También almacena datos en la caché para mejorar el rendimiento de tu sitio web Quiero empezar de cero - learn how). Todavía podrás elegir instalar Runway más adelante. Por favor ve a la sección del Desarrollador y elije Paquetes.]]> + aprende cómo). Todavía podrás elegir instalar Runway más adelante. Por favor ve a la sección del Desarrollador y elige Paquetes.]]> Acabas de configurar una nueva plataforma Umbraco. ¿Qué deseas hacer ahora? Se ha instalado Runway Esta es nuestra lista de módulos recomendados, selecciona los que desees instalar, o mira la lista completa de módulos ]]> Sólo recomendado para usuarios expertos Quiero empezar con un sitio web sencillo - "Runway" es un sitio web sencillo que contiene unos tipos de documentos y plantillas básicos. El instalador puede configurar Runway por ti de forma automática, pero fácilmente puedes editarlo, extenderlo o eliminarlo. No es necesario y puedes usar Umbrao perfectamente sin él. Sin embargo, Runway ofrece unos cimientos sencillos basados en buenas prácticas para iniciarte más rápido que nunca. Si eliges instalar Runway, puedes seleccionar bloques de construcción básicos llamados Módulos de Runway de forma opcional para realzar tus páginas de Runway. Incluido con Runway: Página de inicio, página de Cómo empezar, página de Instalación de módulos.
Módulos opcionales: Navegación superior, Mapa del sitio, Contacto, Galería.
]]>
+ "Runway" es un sitio web sencillo que contiene unos tipos de documentos y plantillas básicos. El instalador puede configurar Runway por ti de forma automática, pero fácilmente puedes editarlo, extenderlo o eliminarlo. No es necesario y puedes usar Umbraco perfectamente sin él. Sin embargo, Runway ofrece unos cimientos sencillos basados en buenas prácticas para iniciarte más rápido que nunca. Si eliges instalar Runway, puedes seleccionar bloques de construcción básicos llamados Módulos de Runway de forma opcional para realzar tus páginas de Runway. Incluido con Runway: Página de inicio, página de Cómo empezar, página de Instalación de módulos.
Módulos opcionales: Navegación superior, Mapa del sitio, Contacto, Galería.
]]>
¿Qué es Runway? Paso 1 de 5. Aceptar los términos de la licencia Paso 2 de 5. Configuración de la base de datos @@ -749,15 +749,15 @@ Umbraco versión 3 Umbraco versión 4 Mirar - Umbraco %0% o actualizar la versión 3.0 a Umbraco %0%.

Pinche en "próximo" para empezar con el asistente de configuración.]]>
+ Umbraco %0% o actualizar la versión 3.0 a Umbraco %0%.

Pincha en "próximo" para empezar con el asistente de configuración.]]>
Código de cultura Nombre de cultura - No ha habido ninguna actividad y su sessión se cerrará en - Renovar su sesión para guardar sus cambios + No ha habido ninguna actividad y tu sesión se cerrará en + Renovar tu sesión para guardar sus cambios Feliz super domingo @@ -772,10 +772,10 @@ © 2001 - %0%
umbraco.com

]]>
¿Olvidaste tu contraseña? Enviaremos un email a la dirección especificada con un enlace para restaurar tu contraseña - Un email con instrucciones para restaurar tu contraseña será enviado a la dirección especificada si esta está registrada. - Volver a formularion de acceso + Un email con instrucciones para restaurar tu contraseña será enviado a la dirección especificada si ésta está registrada. + Volver al formulario de acceso Por favor, introduce una nueva contraseña - Tu contraseña has sido actualizada + Tu contraseña ha sido actualizada El enlace pulsado es inválido o ha caducado Umbraco: Restaurar contraseña @@ -869,36 +869,36 @@ Contenido - Elija una página arriba... + Elige una página arriba... %0% ha sido copiado al %1% - Seleccione donde el documento %0% debe ser copiado abajo + Selecciona donde el documento %0% debe ser copiado abajo %0% ha sido movido a %1% - Seleccione debajo donde mover el documento %0% - ha sido seleccionado como raíz de su nuevo contenido, haga click sobre 'ok' debajo. - No ha seleccionado ningún nodo. Seleccione un nodo en la lista mostrada arriba antes the pinchar en 'continuar' (continue) - No se puede colgar el nodo actual bajo el nodo elegido debido a su tipo + Selecciona debajo donde mover el documento %0% + ha sido seleccionado como raíz de tu nuevo contenido, haga clic sobre 'ok' debajo. + No ha seleccionado ningún nodo. Selecciona un nodo en la lista mostrada arriba antes de pinchar en 'continuar' + No se puede colgar el nodo actual bajo el nodo elegido debido a tu tipo El nodo actual no puede moverse a ninguna de sus subpáginas - El nodo actual no puede existir en la raiz - Acción no permitida. No tiene permisos suficientes para uno o más subnodos.' + El nodo actual no puede existir en la raíz + Acción no permitida. No tienes permisos suficientes para uno o más subnodos.' Relacionar elemento copiado al original - Edite su notificación para %0% - Hola %0% Esto es un e-mail automático para informarle que la tarea '%1%' ha sido realizada sobre la página '%2%' por el usuario '%3%' Vaya a http://%4%/#/content/content/edit/%5% para editarla. ¡Espero que tenga un buen día! Saludos del robot de Umbraco + Edita tu notificación para %0% + Hola %0% Esto es un e-mail automático para informarte que la tarea '%1%' ha sido realizada sobre la página '%2%' por el usuario '%3%' Vaya a http://%4%/#/content/content/edit/%5% para editarla. ¡Espero que tenga un buen día! Saludos del robot de Umbraco Hola %0%

Esto es un e-mail generado automáticamente para informarle que la tarea '%1%' ha sido realizada sobre la página '%2%' por el usuario '%3%'

Resumen de actualización:

%6%

¡Espero que tenga un buen día!

Saludos del robot Umbraco.

]]>
[%0%] Notificación acerca de %1% realizado en %2% Notificaciones y localizando el paquete. Los paquetes de Umbraco normalmente tienen la extensión ".umb" o ".zip".]]> - Suelte para subir archivo - o pulse aquí para elegir paquete + Suelta para subir archivo + o Pulsa aquí para elegir paquete Subir paquete - Instala un paquete local seleccionándolo desde tu ordenador. Sólo instala paquetes de fuentes que conoces y en las que confías + Instala un paquete local seleccionándolo desde tu ordenador. instala sólo paquetes de fuentes que conoces y en las que confías Subir otro paquete Cancelar y subir otro paquete Licencia - Aceptop + Aceptar términos de uso Instalar paquete Terminar @@ -914,13 +914,13 @@ tiene puntos de karma Información - Propetarioa + Propietario Contribuidores Creado Versión actual Versión .NET Descargas - Gustas + Me Gusta Compatibilidad Este paquete es compatible con las siguientes versiones de Umbraco, declaradas según miembros de la comunidad. No se puede garantizar compatibilidad completa para versiones declaradas debajo del 100% Fuentes externas @@ -930,19 +930,19 @@ ]]>
Documentación - Meta datos del paquete + Metadatos del paquete Nombre del paquete El paquete no contiene ningún elemento
Puedes eliminarlo del sistema de forma segura seleccionando la opción "desinstalar paquete" de abajo.]]>
No hay actualizaciones disponibles Opciones del paquete - Leeme del paquete + Léeme del paquete Repositorio de paquetes Confirma la desinstalación El paquete ha sido desinstalado El paquete se ha desinstalado correctamente Desinstalar paquete - Nota: cualquier documento, archivo etc dependiente de los elementos eliminados, dejará de funcionar, y puede conllevar inestabilidad en el sistema, por lo que lleva cuidado al desinstalar elementos. En caso de duda, contacta con el autor del paquete.]]> + Nota: cualquier documento, archivo etc dependiente de los elementos eliminados, dejará de funcionar, y puede conllevar inestabilidad en el sistema, por lo que lleva cuidado al desinstalar elementos. En caso de duda, contacta con el autor del paquete.]]> Descargar actualización del repositorio Actualizar paquete Instrucciones de actualización @@ -962,27 +962,27 @@ Pegar con formato completo (No recomendado) - El texto que estás intentando pegar contiene caractéres o formato especial. El problema puede ser debido al copiar texto desde Microsoft Word. Umbraco puede eliminar estos caractéres o formato especial automáticamente, de esa manera el contenido será más adecuado para la web. + El texto que estás intentando pegar contiene caracteres o formato especial. El problema puede ser debido al copiar texto desde Microsoft Word. Umbraco puede eliminar estos caracteres o formato especial automáticamente, de esa manera el contenido será más adecuado para la web. Pegar como texto sin formato Pegar, pero quitando el formato (Recomendado) - Proteccion basada en roles - usando los grupos de miembros de Umbraco.]]> - Necesita crear un grupo de miembros antes de poder usar autenticación basada en roles + Protección basada en roles + usando los grupos de miembros de Umbraco.]]> + Necesitas crear un grupo de miembros antes de poder usar autenticación basada en roles Página de error Usada cuando alguien hace login, pero no tiene acceso - Elija cómo restringir el acceso a esta página + Elige cómo restringir el acceso a esta página %0% está protegido Protección borrada de %0% Página de login - Elija la página que contenga el formulario de login + Elige la página que contenga el formulario de login Borrar protección - Elija las páginas que contendrán el formulario de login y mensajes de error - Elija los roles que tendrán acceso a esta página - Elija el login y password para esta página + Elige las páginas que contendrán el formulario de login y mensajes de error + Elige los roles que tendrán acceso a esta página + Elige el login y contraseña para esta página Protección de usuario único - Si sólo necesita configurar una protección simple usando un único login y password + Si sólo necesita configurar una protección simple usando un único login y contraseña @@ -1014,7 +1014,7 @@ %0% se ha publicado %0% y sus subpáginas se han publicado Publicar %0% y todas sus subpáginas - aceptar para publicar %0% y por lo tanto, hacer que su contenido esté disponible al público.

Puedes publicar esta página y todas sus subpáginas marcando publicar todos los hijos debajo. ]]>
+ aceptar para publicar %0% y por lo tanto, hacer que tu contenido esté disponible al público.

Puedes publicar esta página y todas sus subpáginas marcando publicar todos los hijos debajo. ]]>
No has configurado ningún color @@ -1035,7 +1035,7 @@ Enlace Abrir en una nueva ventana Introduce texto - Introduzce el enlace + Introduce el enlace Reiniciar @@ -1044,11 +1044,11 @@ Versión actual - Red el texto de la versión seleccionada no se mostrará. , green means added]]> + Red el texto de la versión seleccionada no se mostrará. , el verde significa añadido]]> Se ha recuperado la última versión del documento. - Esto muestra la versión seleccionada como html, si desea ver la diferencia entre 2 versiones al mismo tiempo, por favor use la vista diff + Esto muestra la versión seleccionada como html, si deseas ver la diferencia entre 2 versiones al mismo tiempo, por favor usa la vista diff Volver a - Elija versión + Elige versión Ver @@ -1068,7 +1068,7 @@ Traducción Usuarios Ayuda - Analisis + Análisis ir a @@ -1079,7 +1079,7 @@ Plantilla por defecto Clave de diccionario - Para importar un tipo de documento encuentre el fichero ".udt" en su ordenador haciendo click sobre el botón "Navegar" y pulsando "Importar" (se le solicitará confirmación en la siguiente pantalla) + Para importar un tipo de documento encuentra el fichero ".udt" en tu ordenador haciendo clic sobre el botón "Navegar" y pulsando "Importar" (se te solicitará confirmación en la siguiente pantalla) Nuevo nombre de la pestaña Tipo de nodo Tipo @@ -1092,7 +1092,7 @@ Tipo de Contenido Maestro activado Este Tipo de Contenido usa como Tipo de Contenido Maestro. Las pestañas para los Tipos de Contenido Maestros no se muestran y solo se pueden modificar desde el Tipo de Contenido Maestro - No existen propiedades para esta pestaña. Haga clic en el enlace "añadir nueva propiedad" para crear una nueva propiedad. + No existen propiedades para esta pestaña. Haz clic en el enlace "añadir nueva propiedad" para crear una nueva propiedad. Tipo de documento Maestro Crear plantilla correspondiente Añadir icono @@ -1101,12 +1101,12 @@ Ordenar Fecha Creado Ordenación completa - Arrastra las diferentes páginas debajo para colocarlas como deberían estar. O haz click en las cabeceras de las columnas para ordenar todas las páginas - + Arrastra las diferentes páginas debajo para colocarlas como deberían estar o haz clic en las cabeceras de las columnas para ordenar todas las páginas + Validación - Los errors de validación deben ser arreglados antes de que el elemento pueda ser guardado + Los errores de validación deben ser arreglados antes de que el elemento pueda ser guardado Fallo Guardado Insuficientes permisos de usuario, no se pudo completar la operación @@ -1166,7 +1166,7 @@ Contenido oculto Vista parcial guardada Vista parcial guardada sin errores - ista parcial no guardada + Vista parcial no guardada Error guardando el archivo. Permisos guardados para Script guardado @@ -1187,7 +1187,7 @@ Grupos de usuario establecidos %0% grupos de usuario borrados %0% fue borrado - %0% usuarios desbloquedaos + %0% usuarios desbloqueados Error desbloqueando usuarios %0% está desbloqueado Error desbloqueando usuario @@ -1206,21 +1206,21 @@ Insertar área de contenido Insertar marcador de posición de área de contenido Insertar - Elije que insertar en tu plantilla + Elige que insertar en tu plantilla Insertar objeto del diccionario - A dictionary item is a placeholder for a translatable piece of text, which makes it easy to create designs for multilingual websites. + Un objeto de diccionario es una variable para un texto traducible, lo que facilita crear sitios multi idioma. Insertar macro - Una Macor es un componente configurable que es genial como partes reutilizables de tu diseño, + Una Macro es un componente configurable que es genial como partes reutilizables de tu diseño, donde necesites una forma de proporcionar parámetros, como galerías, formularios y listas. Insertar campo de página de Umbraco - Muestra el valor de una propiedad de la página actual, con opciones para modificar el valor or usar valores alternativos. + Muestra el valor de una propiedad de la página actual, con opciones para modificar el valor o usar valores alternativos. Vista parcial Una vista parcial es una platilla separada que puede ser mostrada dentro de otra plantilla. - Es útil para reutilizar código or para distribuir plantillas complejas en archivos separados. + Es útil para reutilizar código o para distribuir plantillas complejas en archivos separados. Plantilla principal Sin plantilla principal @@ -1245,14 +1245,14 @@ @RenderSection(name) placeholder. - Esto muestra un area de una plantilla hija rodeada de la corresponsiente definición @section [name]{ ... }. + Esto muestra un area de una plantilla hija rodeada de la correspondiente definición @section [name]{ ... }. ]]> Nombre de sección Sección es obligatoria - Si obligatoria, la plantilla hija debe contener una definición de @section o se mostrará un error. + Si está marcada como obligatoria, la plantilla hija debe contener una definición de @section o se mostrará un error. @@ -1295,26 +1295,26 @@ Plantilla - Rich Text Editor - Image + Editor de texto enriquecido + Imagen Macro - Embed - Headline - Quote + Incrustado + Encabezado + Cita Insertar control - Elije configuración + Elige configuración Añade más filas Añadir contenido Soltar contenido - Settings applied + Configuración aplicada Contenido no permitido aquí Contenido permitido aquí - Pulse para insertar - Pulse para insertar imagen + Pulsa para insertar + Pulsa para insertar imagen Leyenda de imagen... - Escribe aqui... + Escribe aquí... Plantillas de Grid Las plantillas son el área de trabajo para el editor de grids, normalmente sólo necesitas una o dos plantillas diferentes @@ -1350,7 +1350,7 @@ Composiciones - No has añadido nunguna pestaña + No has añadido ninguna pestaña Añadir nueva pestaña Añadir otra pestaña Heredado de @@ -1361,11 +1361,11 @@ Configura la página para mostrar una lista de sus hijas que puedes ordenar y buscar, los hijas no se mostrarán en el árbol de contenido Platillas permitidas - Elije que plantillas se permite a los editores utilizar en contenido de este tipo + Elige que plantillas se permite a los editores utilizar en contenido de este tipo - Permitir como raiz - Permite a los editores crear contenido de este tipo en la raiz del árbol de contenido - Si - permitir contenido de este tipo en la raiz + Permitir como raíz + Permite a los editores crear contenido de este tipo en la raíz del árbol de contenido + Si - permitir contenido de este tipo en la raíz Tipos de nodos hijos permitidos Permite contenido de los tipos permitidos ser creados debajo de este tipo de contenido @@ -1426,15 +1426,15 @@ MAYÚSCULA/minúscula Elegir campo Convertir a salto de línea - Sí, convertir salto de linea + Sí, convertir salto de línea Reemplaza los saltos de línea con la etiqueta HTML &lt;br&gt; Campos personalizados Si, solamente la fecha Formato y codificación Cambiar formato a fecha - Formatear el valor como una fecha o una fecha con hora , de acuerdo con la cultura activa + Formatear el valor como una fecha o una fecha con hora, de acuerdo con el idioma activa Codificar HTML - Se reemplazarán los caracteres especiales por su código HTML equivalente. + Se reemplazarán los caracteres especiales por tu código HTML equivalente. Será insertado después del valor del campo Será insertado antes del valor del campo Minúscula @@ -1450,13 +1450,13 @@ Mayúscula Codificar URL Formateará los caracteres especiales de las URLs - Sólo será usado cuando el campo superior esté vacio - Este campo será usado unicamente si el campo primario está vacío + Sólo será usado cuando el campo superior esté vacío + Este campo será usado únicamente si el campo primario está vacío Si, con el tiempo. Separador: - Tareas asignadas a usted - asignadas a usted. Para acceder a la vista detallaa incluyendo comentarios, haga click sobre "Detalles" o sobre el nombre de la página. También puede descargar la página como XML directamente pulsando sobre el enlace "Descarga XML".
Para terminar la tarea de traducción, por favor dirijase a la vista de detalles y haga click sobre el botón de "Cerrar". ]]>
+ Tareas asignadas + asignadas. Para acceder a la vista detallada incluyendo comentarios, haz clic sobre "Detalles" o sobre el nombre de la página. También puedes descargar la página como XML directamente pulsando sobre el enlace "Descarga XML".
Para terminar la tarea de traducción, por favor dirígete a la vista de detalles y haz clic sobre el botón de "Cerrar". ]]>
cerrar tarea Detalles de traducción Descargar todas las tareas pendientes de traducción como archivo xml @@ -1468,17 +1468,17 @@
- Tarea para tradudir [%0%] por %1% - No se encontraron usuarios traductores. Por favor, crea un usuario traductor antes de empezar a mandar contenido para su traducción + Tarea para traducir [%0%] por %1% + No se encontraron usuarios traductores. Por favor, crea un usuario traductor antes de empezar a mandar contenido para tu traducción Tareas creadas por ti creadas por tí. Para ver una vista detallada incluyendo los comentarios, pulsa en "Detalles" o tan solo en el nombre de la página. También puedes descargar la página como XML directamente pulsando en el enlace "Descargar Xml". Para cerrar una tarea de traducción, por favor ve a la vista de Detalles y pulsa el botón de "Cerrar".]]> La página '%0%' se ha mandado a traducción @@ -1543,17 +1543,17 @@ Basado en los grupos asignados y los nodos iniciales, el usuario tiene acceso a los siguientes nodos. Asignar acceso Administrador - Campo de categoria + Campo de categoría Cambiar contraseña Cambiar foto Nueva contraseña no ha sido bloqueado La contraseña no se ha cambiado Confirma nueva contraseña - Puede cambiar su contraseña para acceder al 'back office' de Umbraco rellenando el siguiente formulario y haciendo clic en el botón 'Cambiar contraseña' + Puedes cambiar tu contraseña para acceder al 'back office' de Umbraco rellenando el siguiente formulario y haciendo clic en el botón 'Cambiar contraseña' Canal de contenido Crear otro usuario - Crear nuevos usuarios para darles acceso a Umbraco. Cuando un nuevo usuario es creado, una nueva contrasela será generada y la podrás compartir con el usuario. + Crear nuevos usuarios para darles acceso a Umbraco. Cuando un nuevo usuario es creado, una nueva contraseña será generada y la podrás compartir con el usuario. Campo descriptivo Deshabilitar usuario Tipo de documento @@ -1565,39 +1565,39 @@ Invitar otro usuario Invita nuevos usuarios para darles acceso a Umbraco. Un email de invitación será enviado al usuario con información sobre cómo acceder a Umbraco. Idioma - Establecer el idioma que verás en menús y dialogos + Establecer el idioma que verás en menús y diálogos Última fecha bloqueado Último acceso Última contraseña cambiada Acceso - Nodo de comienzo en la libreria de medios - Limitar la librería de medios al siguiente nodo de inicio + Nodo de comienzo en la biblioteca de medios + Limitar la biblioteca de medios al siguiente nodo de inicio Nodos de inicio para Medios - Limitar la librería de medios a los siguientes nodos de inicio + Limitar la biblioteca de medios a los siguientes nodos de inicio Secciones Deshabilitar acceso a Umbraco no se ha conectado aún - Contraseña antigüa + Contraseña antigua Contraseña Reiniciar contraseña - Su contraseña ha sido cambiada - Por favor confirme su nueva contraseña - Introduzca su nueva contraseña + Tu contraseña ha sido cambiada + Por favor confirma tu nueva contraseña + Introduce tu nueva contraseña La nueva contraseña no puede estar vacía Contraseña actual Contraseña actual inválida - La nueva contraseña no coincide con la contraseña de confirmación. Por favor, vuela a intentarlo!' - La contraseña de confirmación no coincide con la nueva contraseña!' + La nueva contraseña no coincide con la contraseña de confirmación. Por favor, vuele a intentarlo! + La contraseña de confirmación no coincide con la nueva contraseña! Reemplazar los permisos de los nodos hijo - Estas modificando los permisos para las páginas: + Estás modificando los permisos para las páginas: Selecciona las páginas para modificar sus permisos - Eliminar photo + Eliminar imagen Permisos por defecto Permisos granulares - Establecer permisos para nodos especificos + Establecer permisos para nodos específicos Perfil Buscar en todos los hijos - Añadir secciones para dar aceso a usuarios + Añadir secciones para dar acceso a usuarios Seleccionar grupos de usuarios Nodo de inicio no seleccionado Nodos de inicio no seleccionado @@ -1613,17 +1613,17 @@ Nombre (A-Z) Nombre (Z-A) Más nuevo - Más antigüo - Último accesso + Más antiguo + Último acceso Última actualización en usuario ha sido creado Se ha creado el nuevo usuario con éxito. Para acceder a Umbraco usa la contraseña siguiente. Administración de usuario Nombre de usuario Permisos de usuarios - Permisos de group de usuario + Permisos de grupo de usuario Grupo de usuario - Grupos ds usuario + Grupos de usuario ha sido invitado Se ha enviado una invitación al nuevo usuario con detalles sobre cómo acceder a Umbraco. ¡Hola y bienvenido a Umbraco!. En un minuto todo estará listo para empezar, sólo necesitamos que configures tu contraseña y una imagen para tu avatar. @@ -1636,7 +1636,7 @@ La sesión caduca en Invitar usuario Crear usuario - Enviar invitatión + Enviar invitación Volver a usuarios Umbraco: Invitación @@ -1739,7 +1739,7 @@ Validar como email Validar como número Validar como Url - ...or introduce tu propia validación + ...o introduce tu propia validación Campo obligatorio Introduce una expresión regular Necesitas añadir al menos @@ -1788,18 +1788,18 @@ '%0%' en archivo de configuración '%1%'.]]> Hubo un error, revisa los logs para ver el error completo: %0%. - Miembros - Total XML: %0%, Total: %1%, Total invalidos: %2% - Media - Total XML: %0%, Total: %1%, Total invalidos: %2% - Contenido - Total XML: %0%, Total publicados: %1%, Total invalidos: %2% + Miembros - Total XML: %0%, Total: %1%, Total inválidos: %2% + Media - Total XML: %0%, Total: %1%, Total inválidos: %2% + Contenido - Total XML: %0%, Total publicados: %1%, Total inválidos: %2% El certificado de tu sitio es válido. Error validando certificado: '%0%' - El ceriticado SSL de tu sitio ha caducado. - El ceriticado SSL de tu sitio caducará en %0% días. - Error pinging la URL %0% - '%1%' + El certificado SSL de tu sitio ha caducado. + El certificado SSL de tu sitio caducará en %0% días. + Error haciendo ping a la URL %0% - '%1%' Actualmente estás %0% viendo el sitio usando el esquema HTTPS. - El appSetting 'umbracoUseSSL' está configurado como 'false' en tu archivo web.config. Una vez que accedes al sitio usando HTTPS, debería ser configuraio como 'true'. - Ele appSetting 'umbracoUseSSL' está configurado como '%0%' en tu archivo your web.config, tus cookies son %1% marcadas como seguras. + El appSetting 'umbracoUseSSL' está configurado como 'false' en tu archivo web.config. Una vez que accedes al sitio usando HTTPS, debería ser configurado como 'true'. + Ele appSetting 'umbracoUseSSL' está configurado como '%0%' en tu archivo web.config, tus cookies son %1% marcadas como seguras. No se pudo actualizar 'umbracoUseSSL' en tu archivo web.config. Error: %0% @@ -1812,8 +1812,8 @@ No se pudo arreglar chequeo con un valor de comparación 'ShouldEqual' con el valor introducido. Valor para arreglar chequeo no introducido. - Modo Debug en compilacion está desactivado. - Modo Debug en compilacion está activado. Se recomienda desactivarlo antes de publicar el sitio. + Modo Debug en compilación está desactivado. + Modo Debug en compilación está activado. Se recomienda desactivarlo antes de publicar el sitio. Modo Debug en compilación se ha desactivado correctamente. Modo Trace está desactivado. @@ -1836,16 +1836,16 @@ X-Frame-Options usado para controlar si un sitio puede ser IFRAMEd por otra fue encontrado.]]> X-Frame-Options usado para controlar si un sitio puede ser IFRAMEd por otra no se ha encontrado.]]> - Establecer Header en Config - Adds a value to the httpProtocol/customHeaders section of web.config to prevent the site being IFRAMEd by other websites. - A setting to create a header preventing IFRAMEing of the site by other websites has been added to your web.config file. - Could not update web.config file. Error: %0% + Establecer Cabecera en Config + Añade una entrada a la sección httpProtocol/customHeaders del archivo web.config para prevenir que el sitio sea incrustado en un iframe por otros sitios web. + Una entrada ha sido añadida a la sección httpProtocol/customHeaders del archivo web.config para prevenir que el sitio sea incrustado en un iframe por otros sitios web. + No se ha podido actualizar el archivo web.config. Error: %0% %0%.]]> - No se ha encontrado ninguna cabecerá que revele información sobre la tecnología del sitio. + No se ha encontrado ninguna cabecera que revele información sobre la tecnología del sitio. No se encontró system.net/mailsettings en Web.config. En la sección system.net/mailsettings section de web.config, el host no está configurado. @@ -1853,9 +1853,9 @@ El servidor SMTP configurado con host '%0%' y puerto '%1%' no se pudo alcanzar. Por favor revisa que la configuración en la sección system.net/mailsettings del archivo Web.config es correcta. %0%.]]> - %0%.]]> + %0%.]]>

Los resultados de los Chequeos de Salud de Umbraco programados para ejecutarse el %0% a las %1% son:

%2%]]>
- Status de los Chequeos de Salud de Umbraco + Status de los Chequeos de Salud de Umbraco: %0% Desactivar URL tracker @@ -1867,7 +1867,7 @@ Eliminar ¿Estás seguro que quieres eliminar la redirección de '%0%' a '%1%'? Redirección URL eliminada. - Error removing redirect URL. + Error borrando la redirección URL. ¿Seguro que quieres desactivar URL tracker? URL tracker ha sido desactivado. Error desactivando URL tracker, más información se puede encontrar en los logs. diff --git a/src/Umbraco.Web.UI/umbraco/config/lang/fr.xml b/src/Umbraco.Web.UI/umbraco/config/lang/fr.xml index 7d20714ab632..fd2b4c53a8af 100644 --- a/src/Umbraco.Web.UI/umbraco/config/lang/fr.xml +++ b/src/Umbraco.Web.UI/umbraco/config/lang/fr.xml @@ -2169,7 +2169,7 @@ Pour gérer votre site, ouvrez simplement le backoffice Umbraco et commencez à %0%.]]> %0%.]]>

Les résultats de l'exécution du Umbraco Health Checks planifiée le %0% à %1% sont les suivants :

%2%]]>
- Statut du Umbraco Health Check + Statut du Umbraco Health Check: %0% Désactiver URL tracker diff --git a/src/Umbraco.Web.UI/umbraco/config/lang/ru.xml b/src/Umbraco.Web.UI/umbraco/config/lang/ru.xml index 8e9856668745..fd33e647adc5 100644 --- a/src/Umbraco.Web.UI/umbraco/config/lang/ru.xml +++ b/src/Umbraco.Web.UI/umbraco/config/lang/ru.xml @@ -869,7 +869,7 @@ %0%.]]> %0%.]]>

Зафиксированы следующие результаты автоматической проверки состояния Umbraco по расписанию, запущенной на %0% в %1%:

%2%]]>
- Результат проверки состояния Umbraco + Результат проверки состояния Umbraco: %0% перейти к diff --git a/src/Umbraco.Web.UI/umbraco/developer/RelationTypes/EditRelationType.aspx b/src/Umbraco.Web.UI/umbraco/developer/RelationTypes/EditRelationType.aspx index 59687309a507..e9d7b2e9c060 100644 --- a/src/Umbraco.Web.UI/umbraco/developer/RelationTypes/EditRelationType.aspx +++ b/src/Umbraco.Web.UI/umbraco/developer/RelationTypes/EditRelationType.aspx @@ -10,6 +10,8 @@ table.relations th.directionIcon { width:16px; height:16px; } table.relations td { background: transparent none no-repeat scroll center center } + + table.relations td a { text-decoration: underline; } /* objectType icons */ table.relations td.ContentItemType {} @@ -124,10 +126,10 @@   - <%# DataBinder.Eval(Container.DataItem, "ParentText") %> + " target="_blank"><%# DataBinder.Eval(Container.DataItem, "ParentText") %>     - <%# DataBinder.Eval(Container.DataItem, "ChildText") %> + " target="_blank"><%# DataBinder.Eval(Container.DataItem, "ChildText") %> <%# DataBinder.Eval(Container.DataItem, "DateTime") %> <%# DataBinder.Eval(Container.DataItem, "Comment") %> diff --git a/src/Umbraco.Web/Editors/DictionaryController.cs b/src/Umbraco.Web/Editors/DictionaryController.cs index 4679a01412e1..547abdabdf3f 100644 --- a/src/Umbraco.Web/Editors/DictionaryController.cs +++ b/src/Umbraco.Web/Editors/DictionaryController.cs @@ -1,5 +1,6 @@ using System; using System.Collections.Generic; +using System.Linq; using System.Net; using System.Net.Http; using System.Web.Http; @@ -194,7 +195,7 @@ public IEnumerable GetList() const int level = 0; - foreach (var dictionaryItem in Services.LocalizationService.GetRootDictionaryItems()) + foreach (var dictionaryItem in Services.LocalizationService.GetRootDictionaryItems().OrderBy(ItemSort())) { var item = Mapper.Map(dictionaryItem); item.Level = 0; @@ -220,8 +221,7 @@ public IEnumerable GetList() /// private void GetChildItemsForList(IDictionaryItem dictionaryItem, int level, List list) { - foreach (var childItem in Services.LocalizationService.GetDictionaryItemChildren( - dictionaryItem.Key)) + foreach (var childItem in Services.LocalizationService.GetDictionaryItemChildren(dictionaryItem.Key).OrderBy(ItemSort())) { var item = Mapper.Map(childItem); item.Level = level; @@ -230,5 +230,7 @@ private void GetChildItemsForList(IDictionaryItem dictionaryItem, int level, Lis GetChildItemsForList(childItem, level + 1, list); } } + + private Func ItemSort() => item => item.ItemKey; } } diff --git a/src/Umbraco.Web/HealthCheck/Checks/DataIntegrity/XmlDataIntegrityHealthCheck.cs b/src/Umbraco.Web/HealthCheck/Checks/DataIntegrity/XmlDataIntegrityHealthCheck.cs index 8b94271e2980..6b116776c224 100644 --- a/src/Umbraco.Web/HealthCheck/Checks/DataIntegrity/XmlDataIntegrityHealthCheck.cs +++ b/src/Umbraco.Web/HealthCheck/Checks/DataIntegrity/XmlDataIntegrityHealthCheck.cs @@ -181,7 +181,10 @@ private HealthCheckStatus CheckContent() if (totalXml != total || totalNonGuidXml > 0) { //if the counts don't match - actions.Add(new HealthCheckAction(CheckContentXmlTableAction, Id)); + actions.Add(new HealthCheckAction(CheckContentXmlTableAction, Id) + { + Name = _textService.Localize("healthcheck/rectifyButton") + }); hasError = true; } @@ -195,4 +198,4 @@ private HealthCheckStatus CheckContent() }; } } -} \ No newline at end of file +} diff --git a/src/Umbraco.Web/HealthCheck/NotificationMethods/EmailNotificationMethod.cs b/src/Umbraco.Web/HealthCheck/NotificationMethods/EmailNotificationMethod.cs index 998525c96a52..257ffbd592e9 100644 --- a/src/Umbraco.Web/HealthCheck/NotificationMethods/EmailNotificationMethod.cs +++ b/src/Umbraco.Web/HealthCheck/NotificationMethods/EmailNotificationMethod.cs @@ -1,9 +1,11 @@ using System; +using System.Collections.Generic; using System.Net.Mail; using System.Threading.Tasks; using Umbraco.Core; using Umbraco.Core.Configuration; using Umbraco.Core.Configuration.HealthChecks; +using Umbraco.Core.Logging; using Umbraco.Core.Services; namespace Umbraco.Web.HealthCheck.NotificationMethods @@ -65,7 +67,17 @@ public async Task SendAsync(HealthCheckResults results) results.ResultsAsHtml(Verbosity) }); - var subject = _textService.Localize("healthcheck/scheduledHealthCheckEmailSubject"); + // Include the umbraco Application URL host in the message subject so that + // you can identify the site that these results are for. + var umbracoApplicationUrl = ApplicationContext.Current.UmbracoApplicationUrl; + var host = umbracoApplicationUrl; + + if (Uri.TryCreate(umbracoApplicationUrl, UriKind.Absolute, out var umbracoApplicationUri)) + host = umbracoApplicationUri.Host; + else + LogHelper.Debug($"umbracoApplicationUrl {umbracoApplicationUrl} appears to be invalid"); + + var subject = _textService.Localize("healthcheck/scheduledHealthCheckEmailSubject", new[] { host }); var mailSender = new EmailSender(); using (var mailMessage = new MailMessage(UmbracoConfig.For.UmbracoSettings().Content.NotificationEmailAddress, diff --git a/src/Umbraco.Web/Routing/ContentFinderByRedirectUrl.cs b/src/Umbraco.Web/Routing/ContentFinderByRedirectUrl.cs index c6af13e874d1..a8f5272a55c0 100644 --- a/src/Umbraco.Web/Routing/ContentFinderByRedirectUrl.cs +++ b/src/Umbraco.Web/Routing/ContentFinderByRedirectUrl.cs @@ -29,14 +29,6 @@ public bool TryFindContent(PublishedContentRequest contentRequest) var service = contentRequest.RoutingContext.UmbracoContext.Application.Services.RedirectUrlService; var redirectUrl = service.GetMostRecentRedirectUrl(route); - // From: http://stackoverflow.com/a/22468386/5018 - // See http://issues.umbraco.org/issue/U4-8361#comment=67-30532 - // Setting automatic 301 redirects to not be cached because browsers cache these very aggressively which then leads - // to problems if you rename a page back to it's original name or create a new page with the original name - contentRequest.Cacheability = HttpCacheability.NoCache; - contentRequest.CacheExtensions = new List { "no-store, must-revalidate" }; - contentRequest.Headers = new Dictionary { { "Pragma", "no-cache" }, { "Expires", "0" } }; - if (redirectUrl == null) { LogHelper.Debug("No match for route: \"{0}\".", () => route); @@ -52,8 +44,20 @@ public bool TryFindContent(PublishedContentRequest contentRequest) return false; } + // Apending any querystring from the incoming request to the redirect url. + url = string.IsNullOrEmpty(contentRequest.Uri.Query) ? url : url + contentRequest.Uri.Query; + LogHelper.Debug("Route \"{0}\" matches content {1} with url \"{2}\", redirecting.", () => route, () => content.Id, () => url); + + // From: http://stackoverflow.com/a/22468386/5018 + // See http://issues.umbraco.org/issue/U4-8361#comment=67-30532 + // Setting automatic 301 redirects to not be cached because browsers cache these very aggressively which then leads + // to problems if you rename a page back to it's original name or create a new page with the original name + contentRequest.Cacheability = HttpCacheability.NoCache; + contentRequest.CacheExtensions = new List { "no-store, must-revalidate" }; + contentRequest.Headers = new Dictionary { { "Pragma", "no-cache" }, { "Expires", "0" } }; + contentRequest.SetRedirectPermanent(url); return true; } diff --git a/src/Umbraco.Web/Trees/ContentTreeControllerBase.cs b/src/Umbraco.Web/Trees/ContentTreeControllerBase.cs index 006355eb3586..932687211132 100644 --- a/src/Umbraco.Web/Trees/ContentTreeControllerBase.cs +++ b/src/Umbraco.Web/Trees/ContentTreeControllerBase.cs @@ -375,6 +375,11 @@ protected void FilterUserAllowedMenuItems(MenuItemCollection menuWithAllItems, I foreach (var m in notAllowed) { menuWithAllItems.Items.Remove(m); + // if the disallowed action is set as default action, make sure to reset the default action as well + if (menuWithAllItems.DefaultMenuAlias == m.Alias) + { + menuWithAllItems.DefaultMenuAlias = null; + } } } diff --git a/src/Umbraco.Web/Trees/DictionaryTreeController.cs b/src/Umbraco.Web/Trees/DictionaryTreeController.cs index 2046bdbf0538..0dfe31dae106 100644 --- a/src/Umbraco.Web/Trees/DictionaryTreeController.cs +++ b/src/Umbraco.Web/Trees/DictionaryTreeController.cs @@ -3,6 +3,7 @@ using System.Net.Http.Formatting; using umbraco.BusinessLogic.Actions; using Umbraco.Core; +using Umbraco.Core.Models; using Umbraco.Core.Services; using Umbraco.Web.Models.Trees; using Umbraco.Web.WebApi.Filters; @@ -50,10 +51,12 @@ protected override TreeNodeCollection GetTreeNodes(string id, FormDataCollection var nodes = new TreeNodeCollection(); + Func ItemSort() => item => item.ItemKey; + if (id == Constants.System.Root.ToInvariantString()) { nodes.AddRange( - Services.LocalizationService.GetRootDictionaryItems().Select( + Services.LocalizationService.GetRootDictionaryItems().OrderBy(ItemSort()).Select( x => CreateTreeNode( x.Id.ToInvariantString(), id, @@ -69,7 +72,7 @@ protected override TreeNodeCollection GetTreeNodes(string id, FormDataCollection if (parentDictionary == null) return nodes; - nodes.AddRange(Services.LocalizationService.GetDictionaryItemChildren(parentDictionary.Key).ToList().OrderByDescending(item => item.Key).Select( + nodes.AddRange(Services.LocalizationService.GetDictionaryItemChildren(parentDictionary.Key).ToList().OrderBy(ItemSort()).Select( x => CreateTreeNode( x.Id.ToInvariantString(), id, diff --git a/src/Umbraco.Web/umbraco.presentation/umbraco/create/language.ascx.cs b/src/Umbraco.Web/umbraco.presentation/umbraco/create/language.ascx.cs index df66e925b112..e8d701f4d021 100644 --- a/src/Umbraco.Web/umbraco.presentation/umbraco/create/language.ascx.cs +++ b/src/Umbraco.Web/umbraco.presentation/umbraco/create/language.ascx.cs @@ -6,6 +6,9 @@ using System.Web.UI.WebControls; using Umbraco.Web.UI; using umbraco.BasePages; +using umbraco.cms.businesslogic.language; +using System.Linq; + namespace umbraco.cms.presentation.create.controls { /// @@ -23,7 +26,13 @@ protected void Page_Load(object sender, EventArgs e) var sortedCultures = new SortedList(); Cultures.Items.Clear(); Cultures.Items.Add(new ListItem(ui.Text("choose") + "...", "")); - foreach (var cultureInfo in CultureInfo.GetCultures(CultureTypes.AllCultures)) + + var languagesUsed = Language.GetAllAsList(); + + var cultures = CultureInfo.GetCultures(CultureTypes.AllCultures) + .Where(ci => !languagesUsed.Any(lu => lu.CultureAlias == ci.Name)); + + foreach (var cultureInfo in cultures) sortedCultures.Add(cultureInfo.DisplayName + "|||" + Guid.NewGuid(), cultureInfo.Name); var dictionaryEnumerator = sortedCultures.GetEnumerator(); @@ -86,4 +95,4 @@ protected void sbmt_Click(object sender, EventArgs e) protected global::System.Web.UI.WebControls.Button sbmt; } -} \ No newline at end of file +} diff --git a/src/Umbraco.Web/umbraco.presentation/umbraco/developer/RelationTypes/EditRelationType.aspx b/src/Umbraco.Web/umbraco.presentation/umbraco/developer/RelationTypes/EditRelationType.aspx index 2b8e9e16b0d9..3eb00d60ad2a 100644 --- a/src/Umbraco.Web/umbraco.presentation/umbraco/developer/RelationTypes/EditRelationType.aspx +++ b/src/Umbraco.Web/umbraco.presentation/umbraco/developer/RelationTypes/EditRelationType.aspx @@ -10,6 +10,8 @@ table.relations th.directionIcon { width:16px; height:16px; } table.relations td { background: transparent none no-repeat scroll center center } + + table.relations td a { text-decoration: underline; } /* objectType icons */ table.relations td.ContentItemType {} @@ -124,10 +126,10 @@   - <%# DataBinder.Eval(Container.DataItem, "ParentText") %> + " target="_blank"><%# DataBinder.Eval(Container.DataItem, "ParentText") %>     - <%# DataBinder.Eval(Container.DataItem, "ChildText") %> + " target="_blank"><%# DataBinder.Eval(Container.DataItem, "ChildText") %> <%# DataBinder.Eval(Container.DataItem, "DateTime") %> <%# DataBinder.Eval(Container.DataItem, "Comment") %> @@ -144,4 +146,4 @@ - \ No newline at end of file + diff --git a/src/Umbraco.Web/umbraco.presentation/umbraco/developer/RelationTypes/EditRelationType.aspx.cs b/src/Umbraco.Web/umbraco.presentation/umbraco/developer/RelationTypes/EditRelationType.aspx.cs index b4e72082e12f..33366681f50e 100644 --- a/src/Umbraco.Web/umbraco.presentation/umbraco/developer/RelationTypes/EditRelationType.aspx.cs +++ b/src/Umbraco.Web/umbraco.presentation/umbraco/developer/RelationTypes/EditRelationType.aspx.cs @@ -1,5 +1,6 @@ using System; using System.Collections.Generic; +using System.Text; using System.Web.UI; using System.Web.UI.WebControls; using umbraco.BasePages; @@ -127,7 +128,7 @@ FROM umbracoRelation A /// EventArgs (expect empty) protected void Page_Load(object sender, EventArgs e) { - int id; + int id; if (int.TryParse(Request.QueryString["id"], out id)) { var relationService = Services.RelationService; @@ -281,5 +282,25 @@ void saveMenuImageButton_Click(object sender, EventArgs e) } } } + + + public string GetEditUrl(string objectTypeName, int id) + { + var path = new StringBuilder(); + path.Append(UmbracoPath.Replace("~", string.Empty)); + + if (objectTypeName == UmbracoObjectTypes.Document.GetFriendlyName()) + path.Append("#/content/content/"); + else if (objectTypeName == UmbracoObjectTypes.Media.GetFriendlyName()) + path.Append("#/media/media/"); + else if (objectTypeName == UmbracoObjectTypes.Member.GetFriendlyName()) + path.Append("#/member/member/"); + else + return string.Empty; + + path.Append("edit/"); + path.Append(id); + return path.ToString(); + } } } diff --git a/src/Umbraco.Web/umbraco.presentation/umbraco/settings/editLanguage.aspx.cs b/src/Umbraco.Web/umbraco.presentation/umbraco/settings/editLanguage.aspx.cs index 4911e64e0171..f83da8ec9d9c 100644 --- a/src/Umbraco.Web/umbraco.presentation/umbraco/settings/editLanguage.aspx.cs +++ b/src/Umbraco.Web/umbraco.presentation/umbraco/settings/editLanguage.aspx.cs @@ -13,49 +13,57 @@ using Umbraco.Core; using Umbraco.Web.Trees; using umbraco.uicontrols; +using System.Linq; +using umbraco.cms.businesslogic.language; namespace umbraco.settings { - /// - /// Summary description for editLanguage. - /// + /// + /// Summary description for editLanguage. + /// [WebformsPageTreeAuthorize(Constants.Trees.Languages)] - public partial class editLanguage : BasePages.UmbracoEnsuredPage - { - public editLanguage() - { + public partial class editLanguage : BasePages.UmbracoEnsuredPage + { + public editLanguage() + { CurrentApp = BusinessLogic.DefaultApps.settings.ToString(); - } - protected System.Web.UI.WebControls.TextBox NameTxt; - protected System.Web.UI.WebControls.Literal DisplayName; - cms.businesslogic.language.Language currentLanguage; - - protected void Page_Load(object sender, System.EventArgs e) - { - currentLanguage = new cms.businesslogic.language.Language(int.Parse(helper.Request("id"))); - - - // Put user code to initialize the page here + } + protected System.Web.UI.WebControls.TextBox NameTxt; + protected System.Web.UI.WebControls.Literal DisplayName; + cms.businesslogic.language.Language currentLanguage; + + protected void Page_Load(object sender, System.EventArgs e) + { + currentLanguage = new cms.businesslogic.language.Language(int.Parse(helper.Request("id"))); + + + // Put user code to initialize the page here Panel1.Text = ui.Text("editlanguage"); pp_language.Text = ui.Text("language", "displayName", base.getUser()); - if (!IsPostBack) - { - updateCultureList(); - - ClientTools - .SetActiveTreeType(Constants.Trees.Languages) - .SyncTree(helper.Request("id"), false); - } - - } - - private void updateCultureList() - { + if (!IsPostBack) + { + updateCultureList(); + + ClientTools + .SetActiveTreeType(Constants.Trees.Languages) + .SyncTree(helper.Request("id"), false); + } + + } + + private void updateCultureList() + { SortedList sortedCultures = new SortedList(); Cultures.Items.Clear(); Cultures.Items.Add(new ListItem(ui.Text("choose") + "...", "")); - foreach (CultureInfo ci in CultureInfo.GetCultures(CultureTypes.AllCultures)) + + var languagesUsed = Language.GetAllAsList(); + + var cultures = CultureInfo.GetCultures(CultureTypes.AllCultures) + .Where(ci => !languagesUsed.Any(lu => lu.CultureAlias == ci.Name) || ci.Name == currentLanguage.CultureAlias); + + foreach (CultureInfo ci in cultures) sortedCultures.Add(ci.DisplayName + "|||" + Guid.NewGuid().ToString(), ci.Name); IDictionaryEnumerator ide = sortedCultures.GetEnumerator(); @@ -69,39 +77,39 @@ private void updateCultureList() } } - private void save_click(object sender, EventArgs e) - { - currentLanguage.CultureAlias = Cultures.SelectedValue; - currentLanguage.Save(); - updateCultureList(); - - ClientTools.ShowSpeechBubble(speechBubbleIcon.save, ui.Text("speechBubbles", "languageSaved"), ""); - } - - #region Web Form Designer generated code - override protected void OnInit(EventArgs e) - { - Panel1.hasMenu = true; - var save = Panel1.Menu.NewButton(); - save.Click += save_click; + private void save_click(object sender, EventArgs e) + { + currentLanguage.CultureAlias = Cultures.SelectedValue; + currentLanguage.Save(); + updateCultureList(); + + ClientTools.ShowSpeechBubble(speechBubbleIcon.save, ui.Text("speechBubbles", "languageSaved"), ""); + } + + #region Web Form Designer generated code + override protected void OnInit(EventArgs e) + { + Panel1.hasMenu = true; + var save = Panel1.Menu.NewButton(); + save.Click += save_click; save.Text = ui.Text("save"); save.ButtonType = MenuButtonType.Primary; - save.ID = "save"; - - Panel1.Text = ui.Text("language", "editLanguage"); - - InitializeComponent(); - base.OnInit(e); - } - - /// - /// Required method for Designer support - do not modify - /// the contents of this method with the code editor. - /// - private void InitializeComponent() - { - - } - #endregion - } + save.ID = "save"; + + Panel1.Text = ui.Text("language", "editLanguage"); + + InitializeComponent(); + base.OnInit(e); + } + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + + } + #endregion + } } diff --git a/src/umbraco.cms/businesslogic/language/Language.cs b/src/umbraco.cms/businesslogic/language/Language.cs index e51817a57796..e06005d8786f 100644 --- a/src/umbraco.cms/businesslogic/language/Language.cs +++ b/src/umbraco.cms/businesslogic/language/Language.cs @@ -85,6 +85,10 @@ public static void MakeNew(string cultureCode) var culture = GetCulture(cultureCode); if (culture != null) { + // check if language exists already + var existingLanguage = GetByCultureCode(culture.Name); + if (existingLanguage != null) return; + //insert it var lang = new Umbraco.Core.Models.Language(cultureCode) { @@ -338,4 +342,4 @@ protected virtual void FireAfterDelete(DeleteEventArgs e) } #endregion } -} \ No newline at end of file +}