From b199f4072c551058c480bd0df40605017db8d9e2 Mon Sep 17 00:00:00 2001 From: rodyvansambeek Date: Wed, 17 Feb 2016 09:46:49 +0100 Subject: [PATCH 01/19] Improved and added dutch translation Added and changed some dutch translations, especially for members and subnodes (in a listview). The term "kinderen" only relates to children (persons), not items or nodes. --- src/Umbraco.Web.UI/umbraco/config/lang/nl.xml | 20 +++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) diff --git a/src/Umbraco.Web.UI/umbraco/config/lang/nl.xml b/src/Umbraco.Web.UI/umbraco/config/lang/nl.xml index 9c8f587ca2..24e6d24c35 100644 --- a/src/Umbraco.Web.UI/umbraco/config/lang/nl.xml +++ b/src/Umbraco.Web.UI/umbraco/config/lang/nl.xml @@ -163,13 +163,17 @@ Lid van groep(en) Geen lid van groep(en) - Kinderen + Subitems Doel Klik om te uploaden Plaats je bestanden hier... + + Nieuw lid aanmaken + Alle Leden + Waar wil je de nieuwe %0% aanmaken? Aanmaken onder @@ -532,7 +536,7 @@ Echter, Runway biedt een gemakkelijke basis om je snel op weg te helpen. Als je De huidige node is niet toegestaan onder de geselecteerde node vanwege het node type De huidige node kan niet naar een van zijn subpagina’s worden verplaatst. De huidige node kan niet worden gebruikt op root-niveau - Deze actie is niet toegestaan omdat je onvoldoende rechten hebt op 1 of meer kinderen. + Deze actie is niet toegestaan omdat je onvoldoende rechten hebt op 1 of meer subitems. Relateer gekopieerde items aan het origineel @@ -620,7 +624,7 @@ Echter, Runway biedt een gemakkelijke basis om je snel op weg te helpen. Als je Plakken, en verwijder de opmaak (aanbevolen) - Geavanceerd: Beveilig door de Member Groups te seecteren die toegang hebben op de pagina + Geavanceerd: Beveilig door de Member Groups te selecteren die toegang hebben op de pagina gebruik makend van Umbraco's member groups.]]> role-based authentication.]]> Error Pagina @@ -650,14 +654,14 @@ Echter, Runway biedt een gemakkelijke basis om je snel op weg te helpen. Als je %0% kon niet worden gepubliceerd doordat een 3rd party extensie het heeft geannuleerd. ]]> - Inclusief ongepubliceerde kinderen + Inclusief ongepubliceerde subitems Publicatie in uitvoering - even geduld... %0% van %1% pagina’s zijn gepubliceerd... %0% is gepubliceerd %0% en onderliggende pagina’s zijn gepubliceerd - Publiceer %0% en alle kinderen + Publiceer %0% en alle subitems ok om %0% te publiceren en de wijzigingen zichtbaar te maken voor bezoekers.

- Je kunt deze pagina publiceren en alle onderliggende sub-pagina's door publiceer alle kinderen aan te vinken hieronder. + Je kunt deze pagina publiceren en alle onderliggende sub-pagina's door publiceer alle subitems aan te vinken hieronder. ]]>
@@ -986,10 +990,10 @@ Om een vertalingstaak te sluiten, ga aub naar het detailoverzicht en klik op de Ongeldig huidig wachtwoord Beide wachtwoorden waren niet hetzelfde. Probeer opnieuw! Beide wachtwoorden zijn niet hetzelfde! - Vervang rechten op de subnodes + Vervang rechten op de subitems U bent momenteel rechten aan het aanpassen voor volgende pagina's: Selecteer pagina's om hun rechten aan te passen - Doorzoek alle subnodes + Doorzoek alle subitems Startnode in Content Gebruikersnaam Gebruikersrechten From 27f121f25cc6d6f8003e9760b3b8326baca4b35d Mon Sep 17 00:00:00 2001 From: AndyButland Date: Wed, 21 Sep 2016 15:15:44 +0200 Subject: [PATCH 02/19] Fixes debug setting health check to correctly indicate no issue if config setting is missing --- .../Checks/Config/AbstractConfigCheck.cs | 22 +++++++++++++++---- .../Checks/Config/CompilationDebugCheck.cs | 5 +++++ 2 files changed, 23 insertions(+), 4 deletions(-) diff --git a/src/Umbraco.Web/HealthCheck/Checks/Config/AbstractConfigCheck.cs b/src/Umbraco.Web/HealthCheck/Checks/Config/AbstractConfigCheck.cs index 001bd4e3e8..2cec88d616 100644 --- a/src/Umbraco.Web/HealthCheck/Checks/Config/AbstractConfigCheck.cs +++ b/src/Umbraco.Web/HealthCheck/Checks/Config/AbstractConfigCheck.cs @@ -43,6 +43,14 @@ namespace Umbraco.Web.HealthCheck.Checks.Config /// public abstract ValueComparisonType ValueComparisonType { get; } + /// + /// Gets the flag indicating if the check is considered successful if the config value is missing (defaults to false - an error - if missing) + /// + public virtual bool ValidIfConfigMissing + { + get { return false; } + } + protected AbstractConfigCheck(HealthCheckContext healthCheckContext) : base(healthCheckContext) { _textService = healthCheckContext.ApplicationContext.Services.TextService; @@ -132,11 +140,18 @@ namespace Umbraco.Web.HealthCheck.Checks.Config public override IEnumerable GetStatus() { + var successMessage = string.Format(CheckSuccessMessage, FileName, XPath, Values, CurrentValue); + var configValue = _configurationService.GetConfigurationValue(); if (configValue.Success == false) { - var message = configValue.Result; - return new[] { new HealthCheckStatus(message) { ResultType = StatusResultType.Error } }; + if (ValidIfConfigMissing) + { + return new[] { new HealthCheckStatus(successMessage) { ResultType = StatusResultType.Success } }; + } + + var errorMessage = configValue.Result; + return new[] { new HealthCheckStatus(errorMessage) { ResultType = StatusResultType.Error } }; } CurrentValue = configValue.Result; @@ -144,8 +159,7 @@ namespace Umbraco.Web.HealthCheck.Checks.Config var valueFound = Values.Any(value => string.Equals(CurrentValue, value.Value, StringComparison.InvariantCultureIgnoreCase)); if (ValueComparisonType == ValueComparisonType.ShouldEqual && valueFound || ValueComparisonType == ValueComparisonType.ShouldNotEqual && valueFound == false) { - var message = string.Format(CheckSuccessMessage, FileName, XPath, Values, CurrentValue); - return new[] { new HealthCheckStatus(message) { ResultType = StatusResultType.Success } }; + return new[] { new HealthCheckStatus(successMessage) { ResultType = StatusResultType.Success } }; } // Declare the action for rectifying the config value diff --git a/src/Umbraco.Web/HealthCheck/Checks/Config/CompilationDebugCheck.cs b/src/Umbraco.Web/HealthCheck/Checks/Config/CompilationDebugCheck.cs index 989046b464..6612b77b26 100644 --- a/src/Umbraco.Web/HealthCheck/Checks/Config/CompilationDebugCheck.cs +++ b/src/Umbraco.Web/HealthCheck/Checks/Config/CompilationDebugCheck.cs @@ -30,6 +30,11 @@ namespace Umbraco.Web.HealthCheck.Checks.Config get { return ValueComparisonType.ShouldEqual; } } + public override bool ValidIfConfigMissing + { + get { return true; } + } + public override IEnumerable Values { get From 7f75802e4e4bad64a9e0931b182a8000f93b2e24 Mon Sep 17 00:00:00 2001 From: = <=> Date: Tue, 6 Jun 2017 22:18:12 -0600 Subject: [PATCH 03/19] allow DecimalValueConverter to understand signs in the front of the number. wonder if this could be more configurable as there are many other options avaialble." --- .appveyor.yml.swp | Bin 0 -> 12288 bytes .../ValueConverters/DecimalValueConverter.cs | 2 +- .../PropertyEditorValueConverterTests.cs | 21 ++++++++++++++++-- 3 files changed, 20 insertions(+), 3 deletions(-) create mode 100644 .appveyor.yml.swp diff --git a/.appveyor.yml.swp b/.appveyor.yml.swp new file mode 100644 index 0000000000000000000000000000000000000000..aa9bf48f59e9089608006fb982dc5e6533f7ec8d GIT binary patch literal 12288 zcmeI2OK%%h6vwA!!Mh+3`-_X!mdG=Xn>Jx0SMoD<<5xVfn^cyp@%YBR$voV9XY9DB zLSo0J5@G{8J^@AQ07Ej%AaugETltc=E9r2Bmqf45|9KW0ZBj- zkOU+FNk9^i1SA1T;D18E>?_LsrxoSiGYAO3|A+qr_yxcH{{VdreF=RE-Ge@YK70>Ll0h5ly9NC(0fo7DnVzVGtdVwpbz@vc}4jZdKbC_ zO`vrs3B3j>(2vh4%J;2cl~YO?N>1I@vRAL6u_z_Dp66oa)5q z!HEtLSQZuHXi8|qrM6BkoR4fLg8BJG%j5I{Y!V`<71*|)Mw?bgyta@y-}j;;gq~@ zjJP*ueadxW*rs)$xSr4Um}UCRbA=w=8)qe5Yp9bx9Vf=CX!0-kL)ho%!)FOZ$2$|$aGRZ6W2qYYCtlgm4GS~gS0;dQzbm^YV} zo2k{_QoEOOYpt#JE^FAWX)$Hp%oL4MS-V}=D)gW!+O1{2O@*~FyuM#tHH`huX>aP3 zFOQarTK&doa*GA28+%1cm%Y86Z1Heyt2BW#!uPm2pj|UcM)!bD!=R3}dV%YAUDH7Z z=V7>PF!XJPAdhp)+(u@yw%1eobYy#xnc1{#SSS^55Dqte5R9_haYXd4+UOxbR=JYz)>_qUp@~s$ zFrfaPXNQFqZ)9?tnT>)GkM0${#H&U$BTiy*qf(1&aDQl9wsQWRZp}2%+ zQ?MIQJ~BD-<5MnlBXAs(PuB~adtB6Ad%AwZ&N>rZMq!)GiKJsW zz0=?xa^R3?MUjh#YgaFI&>xmlXL&_UcCyHARYVOcJ*2V7%0p9)%yudLm}b@y{&wkD zY6`hhokW(wjx=W#K#nTlpAtWdW=2hoYM@gKHh>5|5)NkA&&aHMzNA!PyCl)3yypq# zPsvumD5|jLxn&e04r%*rOiAKzStF-q?GZN?(V=faGW|X*qhLsN3a1w9D)cEaI~Y!e zzCRMWrcEXj)tRDPRF4m|qBi$7+>dc!oN42fMy}Obl_TyEwpcTYF$5RIO|Y80W3I+# zfQt1d(TXG{4%jHYjD6K+j!4HyJkChDMlQ}h0~LW?SoIJ6OC(<>T1eEC)}&YY8PPjIOXa8)0t|L({gsN!PMHckv7y&jP}8?(JysoeRoe)Ek^& literal 0 HcmV?d00001 diff --git a/src/Umbraco.Core/PropertyEditors/ValueConverters/DecimalValueConverter.cs b/src/Umbraco.Core/PropertyEditors/ValueConverters/DecimalValueConverter.cs index 89af76ea12..10b3b7188e 100644 --- a/src/Umbraco.Core/PropertyEditors/ValueConverters/DecimalValueConverter.cs +++ b/src/Umbraco.Core/PropertyEditors/ValueConverters/DecimalValueConverter.cs @@ -22,7 +22,7 @@ namespace Umbraco.Core.PropertyEditors.ValueConverters if (sourceString != null) { decimal d; - return (decimal.TryParse(sourceString, NumberStyles.AllowDecimalPoint, CultureInfo.InvariantCulture, out d)) ? d : 0M; + return (decimal.TryParse(sourceString, NumberStyles.AllowDecimalPoint | NumberStyles.AllowLeadingSign, CultureInfo.InvariantCulture, out d)) ? d : 0M; } // in the database an a decimal is an a decimal diff --git a/src/Umbraco.Tests/PropertyEditors/PropertyEditorValueConverterTests.cs b/src/Umbraco.Tests/PropertyEditors/PropertyEditorValueConverterTests.cs index 8134924c61..5c67f82c65 100644 --- a/src/Umbraco.Tests/PropertyEditors/PropertyEditorValueConverterTests.cs +++ b/src/Umbraco.Tests/PropertyEditors/PropertyEditorValueConverterTests.cs @@ -2,7 +2,8 @@ using System.Collections.Generic; using NUnit.Framework; using Umbraco.Core.PropertyEditors.ValueConverters; - +using Umbraco.Core; + namespace Umbraco.Tests.PropertyEditors { [TestFixture] @@ -95,6 +96,22 @@ namespace Umbraco.Tests.PropertyEditors var result = converter.ConvertDataToSource(null, value, false); Assert.AreEqual(expected, result); - } + } + + [TestCase(null, "1", false, 1)] + [TestCase(null, "1", true, 1)] + [TestCase(null, "0", false, 0)] + [TestCase(null, "0", true, 0)] + [TestCase(null, null, false, 0)] + [TestCase(null, null, true, 0)] + [TestCase(null, "-1", false, -1)] + [TestCase(null, "-1", true, -1)] + public void CanConvertDecimalAliasPropertyEditor(Core.Models.PublishedContent.PublishedPropertyType propertyType, object value, bool preview, double expected) + { + var converter = new DecimalValueConverter(); + var result = converter.ConvertDataToSource(propertyType, value, preview); + + Assert.AreEqual(expected, result); + } } } From 792038390400c2b176cfe622bf65794621c155c1 Mon Sep 17 00:00:00 2001 From: Shannon Date: Mon, 19 Jun 2017 23:02:06 +1000 Subject: [PATCH 04/19] U4-10034 Package install may not wait for app domain restart in all cases --- src/Umbraco.Core/ActionsResolver.cs | 12 ++-- src/Umbraco.Core/IO/IOHelper.cs | 2 + .../src/common/resources/package.resource.js | 10 +++ .../views/packager/views/repo.controller.js | 32 ++++++++- .../Editors/PackageInstallController.cs | 18 +++++ src/Umbraco.Web/Models/PackageInstallModel.cs | 6 +- src/Umbraco.Web/RestartMarkerManager.cs | 70 +++++++++++++++++++ src/Umbraco.Web/Umbraco.Web.csproj | 1 + src/Umbraco.Web/WebBootManager.cs | 4 ++ 9 files changed, 146 insertions(+), 9 deletions(-) create mode 100644 src/Umbraco.Web/RestartMarkerManager.cs diff --git a/src/Umbraco.Core/ActionsResolver.cs b/src/Umbraco.Core/ActionsResolver.cs index 2da95a3416..206182c6f2 100644 --- a/src/Umbraco.Core/ActionsResolver.cs +++ b/src/Umbraco.Core/ActionsResolver.cs @@ -23,12 +23,12 @@ namespace Umbraco.Core : base(serviceProvider, logger, packageActions) { - } - - /// - /// Gets the implementations. - /// - public IEnumerable Actions + } + + /// + /// Gets the implementations. + /// + public IEnumerable Actions { get { diff --git a/src/Umbraco.Core/IO/IOHelper.cs b/src/Umbraco.Core/IO/IOHelper.cs index 2ee0463435..d017505b4c 100644 --- a/src/Umbraco.Core/IO/IOHelper.cs +++ b/src/Umbraco.Core/IO/IOHelper.cs @@ -97,6 +97,8 @@ namespace Umbraco.Core.IO public static string MapPath(string path, bool useHttpContext) { + if (path == null) throw new ArgumentNullException("path"); + // Check if the path is already mapped if ((path.Length >= 2 && path[1] == Path.VolumeSeparatorChar) || path.StartsWith(@"\\")) //UNC Paths start with "\\". If the site is running off a network drive mapped paths will look like "\\Whatever\Boo\Bar" diff --git a/src/Umbraco.Web.UI.Client/src/common/resources/package.resource.js b/src/Umbraco.Web.UI.Client/src/common/resources/package.resource.js index c9a501ba24..cb810c6edb 100644 --- a/src/Umbraco.Web.UI.Client/src/common/resources/package.resource.js +++ b/src/Umbraco.Web.UI.Client/src/common/resources/package.resource.js @@ -123,6 +123,16 @@ function packageResource($q, $http, umbDataFormatter, umbRequestHelper) { 'Failed to install package. Error during the step "InstallFiles" '); }, + checkRestart: function (package) { + + return umbRequestHelper.resourcePromise( + $http.post( + umbRequestHelper.getApiUrl( + "packageInstallApiBaseUrl", + "CheckRestart"), package), + 'Failed to install package. Error during the step "CheckRestart" '); + }, + installData: function (package) { return umbRequestHelper.resourcePromise( diff --git a/src/Umbraco.Web.UI.Client/src/views/packager/views/repo.controller.js b/src/Umbraco.Web.UI.Client/src/views/packager/views/repo.controller.js index 5ae1d4bf2c..73d06b26cf 100644 --- a/src/Umbraco.Web.UI.Client/src/views/packager/views/repo.controller.js +++ b/src/Umbraco.Web.UI.Client/src/views/packager/views/repo.controller.js @@ -193,13 +193,41 @@ .import(selectedPackage) .then(function(pack) { vm.installState.status = localizationService.localize("packager_installStateInstalling"); - vm.installState.progress = "33"; + vm.installState.progress = "25"; return packageResource.installFiles(pack); }, error) .then(function(pack) { vm.installState.status = localizationService.localize("packager_installStateRestarting"); - vm.installState.progress = "66"; + vm.installState.progress = "50"; + var deferred = $q.defer(); + + //check if the app domain is restarted ever 2 seconds + var count = 0; + function checkRestart() { + $timeout(function () { + packageResource.checkRestart(pack).then(function (d) { + count++; + //if there is an id it means it's not restarted yet but we'll limit it to only check 10 times + if (d.restartId && count < 10) { + checkRestart(); + } + else { + //it's restarted! + deferred.resolve(d); + } + }, + error); + }, 2000); + } + + checkRestart(); + + return deferred.promise; + }, error) + .then(function (pack) { + vm.installState.status = localizationService.localize("packager_installStateRestarting"); + vm.installState.progress = "75"; return packageResource.installData(pack); }, error) diff --git a/src/Umbraco.Web/Editors/PackageInstallController.cs b/src/Umbraco.Web/Editors/PackageInstallController.cs index d3771ce82c..005f934d8a 100644 --- a/src/Umbraco.Web/Editors/PackageInstallController.cs +++ b/src/Umbraco.Web/Editors/PackageInstallController.cs @@ -543,6 +543,24 @@ namespace Umbraco.Web.Editors var ins = new global::umbraco.cms.businesslogic.packager.Installer(Security.CurrentUser.Id); ins.LoadConfig(IOHelper.MapPath(model.TemporaryDirectoryPath)); ins.InstallFiles(model.Id, IOHelper.MapPath(model.TemporaryDirectoryPath)); + + var restartMarker = RestartMarkerManager.CreateRestartMarker(); + model.RestartId = restartMarker; + + return model; + } + + [HttpPost] + public PackageInstallModel CheckRestart(PackageInstallModel model) + { + if (model.RestartId == null) return model; + + var exists = RestartMarkerManager.RestartMarkerExists(); + if (exists == false) + { + //reset it + model.RestartId = null; + } return model; } diff --git a/src/Umbraco.Web/Models/PackageInstallModel.cs b/src/Umbraco.Web/Models/PackageInstallModel.cs index f903fc1880..1003a3d4c2 100644 --- a/src/Umbraco.Web/Models/PackageInstallModel.cs +++ b/src/Umbraco.Web/Models/PackageInstallModel.cs @@ -24,6 +24,10 @@ namespace Umbraco.Web.Models [DataMember(Name = "zipFilePath")] public string ZipFilePath { get; set; } - + /// + /// During installation this can be used to track any pending appdomain restarts + /// + [DataMember(Name = "restartId")] + public Guid? RestartId { get; set; } } } diff --git a/src/Umbraco.Web/RestartMarkerManager.cs b/src/Umbraco.Web/RestartMarkerManager.cs new file mode 100644 index 0000000000..14e3554be7 --- /dev/null +++ b/src/Umbraco.Web/RestartMarkerManager.cs @@ -0,0 +1,70 @@ +using System; +using System.IO; +using Umbraco.Core.IO; +using Umbraco.Core.Logging; + +namespace Umbraco.Web +{ + internal class RestartMarkerManager + { + /// + /// Check if a restart marker exists, if so it means the appdomain is still restarting + /// + /// + internal static bool RestartMarkerExists() + { + var dir = new DirectoryInfo(IOHelper.MapPath("~/App_Data/TEMP/Install")); + if (dir.Exists == false) return false; + return dir.GetFiles("restart_*.txt").Length > 0; + } + + /// + /// Used during package installation in the website in order to determine if the site is marked for restarting so subsequent requests know if restart has been successful + /// + internal static Guid? CreateRestartMarker() + { + try + { + //we need to store a restart marker, this is because even though files are installed and the app domain should + //restart, in may not be immediate because we might have waitChangeNotification and maxWaitChangeNotification + //configured. In which case the response and the next request to 'InstallData' will occur on the same app domain. + var restartId = Guid.NewGuid(); + Directory.CreateDirectory(IOHelper.MapPath("~/App_Data/TEMP/Install")); + File.CreateText(IOHelper.MapPath("~/App_Data/TEMP/Install/" + "restart_" + restartId + "_" + AppDomain.CurrentDomain.Id + ".txt")).Close(); + return restartId; + } + catch (Exception ex) + { + //swallow! we don't want to prevent the app from shutting down which is generally when this is called + LogHelper.Error("Could not create restart markers", ex); + return null; + } + } + + + + /// + /// Used during package installation in the website in order to determine if the site is marked for restarting so subsequent requests know if restart has been successful + /// + /// + /// The restart markers are cleared when the app is booted up + /// + internal static void ClearRestartMarkers() + { + try + { + var dir = new DirectoryInfo(IOHelper.MapPath("~/App_Data/TEMP/Install")); + if (dir.Exists == false) return; + foreach (var f in dir.GetFiles("restart_*.txt")) + { + f.Delete(); + } + } + catch (Exception ex) + { + //swallow! we don't want to prevent the app from starting + LogHelper.Error("Could not clear restart markers", ex); + } + } + } +} \ No newline at end of file diff --git a/src/Umbraco.Web/Umbraco.Web.csproj b/src/Umbraco.Web/Umbraco.Web.csproj index 9aaab32af9..11adf48792 100644 --- a/src/Umbraco.Web/Umbraco.Web.csproj +++ b/src/Umbraco.Web/Umbraco.Web.csproj @@ -413,6 +413,7 @@ + diff --git a/src/Umbraco.Web/WebBootManager.cs b/src/Umbraco.Web/WebBootManager.cs index 29565065e2..7c7071f234 100644 --- a/src/Umbraco.Web/WebBootManager.cs +++ b/src/Umbraco.Web/WebBootManager.cs @@ -228,9 +228,13 @@ namespace Umbraco.Web //Now ensure webapi is initialized after everything GlobalConfiguration.Configuration.EnsureInitialized(); + RestartMarkerManager.ClearRestartMarkers(); + return this; } + + internal static void ConfigureGlobalFilters() { GlobalFilters.Filters.Add(new EnsurePartialViewMacroViewContextFilterAttribute()); From d88526581857145779653ce6827216ad9c608434 Mon Sep 17 00:00:00 2001 From: Shannon Date: Mon, 19 Jun 2017 23:40:51 +1000 Subject: [PATCH 05/19] Changes restart tracking to use code we used to have in there which is an in memory marker for the app domain, this is a little cleaner --- .../views/install-local.controller.js | 29 +++++++- .../Editors/PackageInstallController.cs | 14 ++-- src/Umbraco.Web/Install/InstallHelper.cs | 2 +- .../InstallSteps/StarterKitDownloadStep.cs | 9 ++- src/Umbraco.Web/Models/PackageInstallModel.cs | 4 +- src/Umbraco.Web/RestartMarkerManager.cs | 70 ------------------- src/Umbraco.Web/Umbraco.Web.csproj | 1 - src/Umbraco.Web/WebBootManager.cs | 4 +- 8 files changed, 47 insertions(+), 86 deletions(-) delete mode 100644 src/Umbraco.Web/RestartMarkerManager.cs diff --git a/src/Umbraco.Web.UI.Client/src/views/packager/views/install-local.controller.js b/src/Umbraco.Web.UI.Client/src/views/packager/views/install-local.controller.js index 9ce2506e76..11604c1114 100644 --- a/src/Umbraco.Web.UI.Client/src/views/packager/views/install-local.controller.js +++ b/src/Umbraco.Web.UI.Client/src/views/packager/views/install-local.controller.js @@ -117,10 +117,37 @@ .then(function(pack) { vm.installState.progress = "25"; vm.installState.status = localizationService.localize("packager_installStateInstalling"); - vm.installState.progress = "50"; return packageResource.installFiles(pack); }, installError) + .then(function(pack) { + vm.installState.status = localizationService.localize("packager_installStateRestarting"); + vm.installState.progress = "50"; + var deferred = $q.defer(); + + //check if the app domain is restarted ever 2 seconds + var count = 0; + function checkRestart() { + $timeout(function () { + packageResource.checkRestart(pack).then(function (d) { + count++; + //if there is an id it means it's not restarted yet but we'll limit it to only check 10 times + if (d.restartId && count < 10) { + checkRestart(); + } + else { + //it's restarted! + deferred.resolve(d); + } + }, + error); + }, 2000); + } + + checkRestart(); + + return deferred.promise; + }, error) .then(function(pack) { vm.installState.status = localizationService.localize("packager_installStateRestarting"); vm.installState.progress = "75"; diff --git a/src/Umbraco.Web/Editors/PackageInstallController.cs b/src/Umbraco.Web/Editors/PackageInstallController.cs index 005f934d8a..6b5f460171 100644 --- a/src/Umbraco.Web/Editors/PackageInstallController.cs +++ b/src/Umbraco.Web/Editors/PackageInstallController.cs @@ -544,8 +544,10 @@ namespace Umbraco.Web.Editors ins.LoadConfig(IOHelper.MapPath(model.TemporaryDirectoryPath)); ins.InstallFiles(model.Id, IOHelper.MapPath(model.TemporaryDirectoryPath)); - var restartMarker = RestartMarkerManager.CreateRestartMarker(); - model.RestartId = restartMarker; + //set a restarting marker and reset the app pool + ApplicationContext.RestartApplicationPool(Request.TryGetHttpContext().Result); + + model.IsRestarting = true; return model; } @@ -553,13 +555,13 @@ namespace Umbraco.Web.Editors [HttpPost] public PackageInstallModel CheckRestart(PackageInstallModel model) { - if (model.RestartId == null) return model; + if (model.IsRestarting == false) return model; - var exists = RestartMarkerManager.RestartMarkerExists(); - if (exists == false) + //check for the key, if it's not there we're are restarted + if (Request.TryGetHttpContext().Result.Application.AllKeys.Contains("AppPoolRestarting") == false) { //reset it - model.RestartId = null; + model.IsRestarting = false; } return model; } diff --git a/src/Umbraco.Web/Install/InstallHelper.cs b/src/Umbraco.Web/Install/InstallHelper.cs index 8bc21a2334..6c088365a1 100644 --- a/src/Umbraco.Web/Install/InstallHelper.cs +++ b/src/Umbraco.Web/Install/InstallHelper.cs @@ -50,7 +50,7 @@ namespace Umbraco.Web.Install new DatabaseConfigureStep(_umbContext.Application), new DatabaseInstallStep(_umbContext.Application), new DatabaseUpgradeStep(_umbContext.Application), - new StarterKitDownloadStep(_umbContext.Application, _umbContext.Security), + new StarterKitDownloadStep(_umbContext.Application, _umbContext.Security, _umbContext.HttpContext), new StarterKitInstallStep(_umbContext.Application, _umbContext.HttpContext), new StarterKitCleanupStep(_umbContext.Application), new SetUmbracoVersionStep(_umbContext.Application, _umbContext.HttpContext), diff --git a/src/Umbraco.Web/Install/InstallSteps/StarterKitDownloadStep.cs b/src/Umbraco.Web/Install/InstallSteps/StarterKitDownloadStep.cs index a8f55d3b2c..fd0c15bd61 100644 --- a/src/Umbraco.Web/Install/InstallSteps/StarterKitDownloadStep.cs +++ b/src/Umbraco.Web/Install/InstallSteps/StarterKitDownloadStep.cs @@ -11,16 +11,19 @@ using Umbraco.Web.Security; namespace Umbraco.Web.Install.InstallSteps { [InstallSetupStep(InstallationType.NewInstall, - "StarterKitDownload", "starterKit", 30, "Adding a simple website to Umbraco, will make it easier for you to get started")] + "StarterKitDownload", "starterKit", 30, "Adding a simple website to Umbraco, will make it easier for you to get started", + PerformsAppRestart = true)] internal class StarterKitDownloadStep : InstallSetupStep { private readonly ApplicationContext _applicationContext; private readonly WebSecurity _security; + private readonly HttpContextBase _httpContext; - public StarterKitDownloadStep(ApplicationContext applicationContext, WebSecurity security) + public StarterKitDownloadStep(ApplicationContext applicationContext, WebSecurity security, HttpContextBase httpContext) { _applicationContext = applicationContext; _security = security; + _httpContext = httpContext; } private const string RepoGuid = "65194810-1f85-11dd-bd0b-0800200c9a66"; @@ -46,6 +49,8 @@ namespace Umbraco.Web.Install.InstallSteps var result = DownloadPackageFiles(starterKitId.Value); + _applicationContext.RestartApplicationPool(_httpContext); + return new InstallSetupResult(new Dictionary { {"manifestId", result.Item2}, diff --git a/src/Umbraco.Web/Models/PackageInstallModel.cs b/src/Umbraco.Web/Models/PackageInstallModel.cs index 1003a3d4c2..7748129a40 100644 --- a/src/Umbraco.Web/Models/PackageInstallModel.cs +++ b/src/Umbraco.Web/Models/PackageInstallModel.cs @@ -27,7 +27,7 @@ namespace Umbraco.Web.Models /// /// During installation this can be used to track any pending appdomain restarts /// - [DataMember(Name = "restartId")] - public Guid? RestartId { get; set; } + [DataMember(Name = "isRestarting")] + public bool IsRestarting { get; set; } } } diff --git a/src/Umbraco.Web/RestartMarkerManager.cs b/src/Umbraco.Web/RestartMarkerManager.cs deleted file mode 100644 index 14e3554be7..0000000000 --- a/src/Umbraco.Web/RestartMarkerManager.cs +++ /dev/null @@ -1,70 +0,0 @@ -using System; -using System.IO; -using Umbraco.Core.IO; -using Umbraco.Core.Logging; - -namespace Umbraco.Web -{ - internal class RestartMarkerManager - { - /// - /// Check if a restart marker exists, if so it means the appdomain is still restarting - /// - /// - internal static bool RestartMarkerExists() - { - var dir = new DirectoryInfo(IOHelper.MapPath("~/App_Data/TEMP/Install")); - if (dir.Exists == false) return false; - return dir.GetFiles("restart_*.txt").Length > 0; - } - - /// - /// Used during package installation in the website in order to determine if the site is marked for restarting so subsequent requests know if restart has been successful - /// - internal static Guid? CreateRestartMarker() - { - try - { - //we need to store a restart marker, this is because even though files are installed and the app domain should - //restart, in may not be immediate because we might have waitChangeNotification and maxWaitChangeNotification - //configured. In which case the response and the next request to 'InstallData' will occur on the same app domain. - var restartId = Guid.NewGuid(); - Directory.CreateDirectory(IOHelper.MapPath("~/App_Data/TEMP/Install")); - File.CreateText(IOHelper.MapPath("~/App_Data/TEMP/Install/" + "restart_" + restartId + "_" + AppDomain.CurrentDomain.Id + ".txt")).Close(); - return restartId; - } - catch (Exception ex) - { - //swallow! we don't want to prevent the app from shutting down which is generally when this is called - LogHelper.Error("Could not create restart markers", ex); - return null; - } - } - - - - /// - /// Used during package installation in the website in order to determine if the site is marked for restarting so subsequent requests know if restart has been successful - /// - /// - /// The restart markers are cleared when the app is booted up - /// - internal static void ClearRestartMarkers() - { - try - { - var dir = new DirectoryInfo(IOHelper.MapPath("~/App_Data/TEMP/Install")); - if (dir.Exists == false) return; - foreach (var f in dir.GetFiles("restart_*.txt")) - { - f.Delete(); - } - } - catch (Exception ex) - { - //swallow! we don't want to prevent the app from starting - LogHelper.Error("Could not clear restart markers", ex); - } - } - } -} \ No newline at end of file diff --git a/src/Umbraco.Web/Umbraco.Web.csproj b/src/Umbraco.Web/Umbraco.Web.csproj index 11adf48792..9aaab32af9 100644 --- a/src/Umbraco.Web/Umbraco.Web.csproj +++ b/src/Umbraco.Web/Umbraco.Web.csproj @@ -413,7 +413,6 @@ - diff --git a/src/Umbraco.Web/WebBootManager.cs b/src/Umbraco.Web/WebBootManager.cs index 7c7071f234..43d130529b 100644 --- a/src/Umbraco.Web/WebBootManager.cs +++ b/src/Umbraco.Web/WebBootManager.cs @@ -227,9 +227,7 @@ namespace Umbraco.Web //Now ensure webapi is initialized after everything GlobalConfiguration.Configuration.EnsureInitialized(); - - RestartMarkerManager.ClearRestartMarkers(); - + return this; } From ad6946aa2626ad72a26c6edf4448adfa566d741c Mon Sep 17 00:00:00 2001 From: Shannon Date: Tue, 20 Jun 2017 18:07:17 +1000 Subject: [PATCH 06/19] fixes error handler reference --- .../src/views/packager/views/install-local.controller.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/views/packager/views/install-local.controller.js b/src/Umbraco.Web.UI.Client/src/views/packager/views/install-local.controller.js index 11604c1114..7ba98bbc34 100644 --- a/src/Umbraco.Web.UI.Client/src/views/packager/views/install-local.controller.js +++ b/src/Umbraco.Web.UI.Client/src/views/packager/views/install-local.controller.js @@ -140,14 +140,14 @@ deferred.resolve(d); } }, - error); + installError); }, 2000); } checkRestart(); return deferred.promise; - }, error) + }, installError) .then(function(pack) { vm.installState.status = localizationService.localize("packager_installStateRestarting"); vm.installState.progress = "75"; From 68e287cf1264ff0f751d8ccc7226e32c4de6c178 Mon Sep 17 00:00:00 2001 From: Shannon Date: Tue, 20 Jun 2017 18:11:26 +1000 Subject: [PATCH 07/19] fixes $q reference --- .../src/views/packager/views/install-local.controller.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Umbraco.Web.UI.Client/src/views/packager/views/install-local.controller.js b/src/Umbraco.Web.UI.Client/src/views/packager/views/install-local.controller.js index 7ba98bbc34..5ca987a6fb 100644 --- a/src/Umbraco.Web.UI.Client/src/views/packager/views/install-local.controller.js +++ b/src/Umbraco.Web.UI.Client/src/views/packager/views/install-local.controller.js @@ -1,7 +1,7 @@ (function () { "use strict"; - function PackagesInstallLocalController($scope, $route, $location, Upload, umbRequestHelper, packageResource, localStorageService, $timeout, $window, localizationService) { + function PackagesInstallLocalController($scope, $route, $location, Upload, umbRequestHelper, packageResource, localStorageService, $timeout, $window, localizationService, $q) { var vm = this; vm.state = "upload"; From 6d81705ece6b2d178513784256f57151fe3aa40d Mon Sep 17 00:00:00 2001 From: Shannon Date: Wed, 21 Jun 2017 18:34:22 +1000 Subject: [PATCH 08/19] fixes the restart check --- .../src/views/packager/views/install-local.controller.js | 2 +- .../src/views/packager/views/repo.controller.js | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/views/packager/views/install-local.controller.js b/src/Umbraco.Web.UI.Client/src/views/packager/views/install-local.controller.js index 5ca987a6fb..c51f91c7c6 100644 --- a/src/Umbraco.Web.UI.Client/src/views/packager/views/install-local.controller.js +++ b/src/Umbraco.Web.UI.Client/src/views/packager/views/install-local.controller.js @@ -132,7 +132,7 @@ packageResource.checkRestart(pack).then(function (d) { count++; //if there is an id it means it's not restarted yet but we'll limit it to only check 10 times - if (d.restartId && count < 10) { + if (d.isRestarting && count < 10) { checkRestart(); } else { diff --git a/src/Umbraco.Web.UI.Client/src/views/packager/views/repo.controller.js b/src/Umbraco.Web.UI.Client/src/views/packager/views/repo.controller.js index 73d06b26cf..395800d329 100644 --- a/src/Umbraco.Web.UI.Client/src/views/packager/views/repo.controller.js +++ b/src/Umbraco.Web.UI.Client/src/views/packager/views/repo.controller.js @@ -209,7 +209,7 @@ packageResource.checkRestart(pack).then(function (d) { count++; //if there is an id it means it's not restarted yet but we'll limit it to only check 10 times - if (d.restartId && count < 10) { + if (d.isRestarting && count < 10) { checkRestart(); } else { From 0bd233815e6f1aaee3f5add43f377a536437d290 Mon Sep 17 00:00:00 2001 From: Stephan Date: Thu, 22 Jun 2017 10:04:48 +0200 Subject: [PATCH 09/19] deploy-348 - add support for languages --- src/Umbraco.Core/Constants-ObjectTypes.cs | 10 ++++++++++ src/Umbraco.Core/Models/UmbracoObjectTypes.cs | 9 ++++++++- src/Umbraco.Core/UdiEntityType.cs | 7 ++++++- src/Umbraco.Core/UdiGetterExtensions.cs | 18 ++++++++++++++++-- 4 files changed, 40 insertions(+), 4 deletions(-) diff --git a/src/Umbraco.Core/Constants-ObjectTypes.cs b/src/Umbraco.Core/Constants-ObjectTypes.cs index adc154174a..4a79437c61 100644 --- a/src/Umbraco.Core/Constants-ObjectTypes.cs +++ b/src/Umbraco.Core/Constants-ObjectTypes.cs @@ -212,6 +212,16 @@ namespace Umbraco.Core /// Guid for a Forms DataSource. /// public static readonly Guid FormsDataSourceGuid = new Guid(FormsDataSource); + + /// + /// Guid for a Language. + /// + public const string Language = "6B05D05B-EC78-49BE-A4E4-79E274F07A77"; + + /// + /// Guid for a Forms DataSource. + /// + public static readonly Guid LanguageGuid = new Guid(Language); } } } \ No newline at end of file diff --git a/src/Umbraco.Core/Models/UmbracoObjectTypes.cs b/src/Umbraco.Core/Models/UmbracoObjectTypes.cs index 0df7a21e57..d0136a10a4 100644 --- a/src/Umbraco.Core/Models/UmbracoObjectTypes.cs +++ b/src/Umbraco.Core/Models/UmbracoObjectTypes.cs @@ -178,6 +178,13 @@ namespace Umbraco.Core.Models /// [UmbracoObjectType(Constants.ObjectTypes.FormsDataSource)] [FriendlyName("DataSource")] - FormsDataSource + FormsDataSource, + + /// + /// Language + /// + [UmbracoObjectType(Constants.ObjectTypes.Language)] + [FriendlyName("Language")] + Language } } \ No newline at end of file diff --git a/src/Umbraco.Core/UdiEntityType.cs b/src/Umbraco.Core/UdiEntityType.cs index f6b9b1e3b0..0119e83b24 100644 --- a/src/Umbraco.Core/UdiEntityType.cs +++ b/src/Umbraco.Core/UdiEntityType.cs @@ -1,5 +1,4 @@ using System; -using System.Collections.Generic; using Umbraco.Core.Models; namespace Umbraco.Core @@ -84,6 +83,8 @@ namespace Umbraco.Core public const string PartialViewMacro = "partial-view-macro"; [UdiType(UdiType.StringUdi)] public const string Xslt = "xslt"; + [UdiType(UdiType.StringUdi)] + public const string Language = "language"; public static string FromUmbracoObjectType(UmbracoObjectTypes umbracoObjectType) { @@ -123,6 +124,8 @@ namespace Umbraco.Core return FormsPreValue; case UmbracoObjectTypes.FormsDataSource: return FormsDataSource; + case UmbracoObjectTypes.Language: + return Language; } throw new NotSupportedException(string.Format("UmbracoObjectType \"{0}\" does not have a matching EntityType.", umbracoObjectType)); } @@ -165,6 +168,8 @@ namespace Umbraco.Core return UmbracoObjectTypes.FormsPreValue; case FormsDataSource: return UmbracoObjectTypes.FormsDataSource; + case Language: + return UmbracoObjectTypes.Language; } throw new NotSupportedException( string.Format("EntityType \"{0}\" does not have a matching UmbracoObjectType.", entityType)); diff --git a/src/Umbraco.Core/UdiGetterExtensions.cs b/src/Umbraco.Core/UdiGetterExtensions.cs index 3d829c8a1a..d663acba9d 100644 --- a/src/Umbraco.Core/UdiGetterExtensions.cs +++ b/src/Umbraco.Core/UdiGetterExtensions.cs @@ -97,7 +97,7 @@ namespace Umbraco.Core /// /// The entity. /// The entity identifier of the entity. - public static GuidUdi GetUdi(this Umbraco.Core.Models.EntityContainer entity) + public static GuidUdi GetUdi(this EntityContainer entity) { if (entity == null) throw new ArgumentNullException("entity"); @@ -246,6 +246,17 @@ namespace Umbraco.Core return new GuidUdi(Constants.UdiEntityType.RelationType, entity.Key).EnsureClosed(); } + /// + /// Gets the entity identifier of the entity. + /// + /// The entity. + /// The entity identifier of the entity. + public static StringUdi GetUdi(this ILanguage entity) + { + if (entity == null) throw new ArgumentNullException("entity"); + return new StringUdi(Constants.UdiEntityType.Language, entity.IsoCode).EnsureClosed(); + } + /// /// Gets the entity identifier of the entity. /// @@ -279,7 +290,7 @@ namespace Umbraco.Core var dataTypeComposition = entity as IDataTypeDefinition; if (dataTypeComposition != null) return dataTypeComposition.GetUdi(); - var container = entity as Umbraco.Core.Models.EntityContainer; + var container = entity as EntityContainer; if (container != null) return container.GetUdi(); var media = entity as IMedia; @@ -315,6 +326,9 @@ namespace Umbraco.Core var relationType = entity as IRelationType; if (relationType != null) return relationType.GetUdi(); + var language = entity as ILanguage; + if (language != null) return language.GetUdi(); + throw new NotSupportedException(string.Format("Entity type {0} is not supported.", entity.GetType().FullName)); } } From 54fdfdd639b36af531d9f5c565bdc06a03efb1e5 Mon Sep 17 00:00:00 2001 From: Claus Date: Thu, 22 Jun 2017 11:05:42 +0200 Subject: [PATCH 10/19] adding grunt watch interval to prevent insane cpu load. --- src/Umbraco.Web.UI.Client/gruntFile.js | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/Umbraco.Web.UI.Client/gruntFile.js b/src/Umbraco.Web.UI.Client/gruntFile.js index 6c785489c4..83cb15df64 100644 --- a/src/Umbraco.Web.UI.Client/gruntFile.js +++ b/src/Umbraco.Web.UI.Client/gruntFile.js @@ -382,6 +382,9 @@ module.exports = function (grunt) { html: { files: ['src/views/**/*.html', 'src/*.html'], tasks: ['watch-html', 'timestamp'] + }, + options: { + interval: 500 } }, From b7a5cb046a159ccc3d88956f80c2006da35a5d26 Mon Sep 17 00:00:00 2001 From: Michael Latouche Date: Thu, 22 Jun 2017 23:56:33 +0200 Subject: [PATCH 11/19] Update fr.xml --- src/Umbraco.Web.UI/umbraco/config/lang/fr.xml | 282 +++++++++++++++--- 1 file changed, 243 insertions(+), 39 deletions(-) diff --git a/src/Umbraco.Web.UI/umbraco/config/lang/fr.xml b/src/Umbraco.Web.UI/umbraco/config/lang/fr.xml index 0064697d95..574214b5bb 100644 --- a/src/Umbraco.Web.UI/umbraco/config/lang/fr.xml +++ b/src/Umbraco.Web.UI/umbraco/config/lang/fr.xml @@ -28,6 +28,9 @@ Rafraîchir Republier le site tout entier Récupérer + Spécifier les permissions pour la page %0% + Choisir où déplacer + dans l'arborescence ci-dessous Permissions Version antérieure Envoyer pour publication @@ -45,16 +48,16 @@ Noeud invalide. Domaine invalide. Domaine déjà assigné. - Domaine Langue + Domaine Nouveau domaine '%0%' créé Domaine '%0%' supprimé Domaine '%0%' déjà assigné + Domaine '%0%' mis à jour + Editer les domaines actuels
Les domaines contenant un chemin d'un niveau sont autorisés, ex : "example.com/en". Pour autant, cela devrait être évité. Utilisez plutôt la gestion des noms d'hôte.]]>
- Domaine '%0%' mis à jour - Editer les domaines actuels Hériter Culture ou hériter de la culture des noeuds parents. S'appliquera aussi
@@ -85,8 +88,8 @@ Liste numérique Insérer une macro Insérer une image - Retourner à la liste Editer les relations + Retourner à la liste Sauver Sauver et publier Sauver et envoyer pour approbation @@ -97,7 +100,8 @@ Afficher les styles Insérer un tableau Générer les modèles - Sauver et générer les modèles + Défaire + Refaire Pour changer le type de document du contenu séléctionné, faites d'abord un choix dans la liste des types valides à cet endroit. @@ -173,14 +177,15 @@ Cible Ceci se traduit par l'heure suivante sur le serveur : Qu'est-ce que cela signifie?]]> - + Ajouter un autre champ texte + Enlever ce champ texte + Cliquez pour télécharger Faites glisser vos fichier ici... Lien vers le média ou cliquez ici pour choisir un fichier Les seuls types de fichiers autorisés sont - Impossible de télécharger ce fichier, il n'a pas un type de fichier autorisé. La taille maximum de fichier est @@ -196,6 +201,13 @@ Type de document sans modèle Nouveau répertoire Nouveau type de données + Nouveau fichier javascript + Nouvelle vue partielle vide + Nouvelle macro pour vue partielle + Nouvelle vue partielle à partir d'un snippet + Nouvelle macro pour vue partielle vide + Nouvelle macro pour vue partielle à partir d'un snippet + Nouvelle macro pour vue partielle (sans macro) Parcourir votre site @@ -289,10 +301,12 @@ Voir l'élément de cache Créer un répertoire... Lier à l'original + Inclure les descendants La communauté la plus amicale Lier à la page Ouvre le document lié dans une nouvelle fenêtre ou un nouvel onglet Lier à un media + Lier à un fichier Sélectionner le media Sélectionner l'icône Sélectionner l'élément @@ -301,7 +315,9 @@ Sélectionner le contenu Sélectionner le membre Sélectionner le groupe de membres + Aucune icone n'a été trouvée Il n'y a pas de paramètres pour cette macro + Il n'y a pas de macro disponible à insérer Fournisseurs externes d'identification Détails de l'exception Trace d'exécution @@ -310,12 +326,19 @@ Enlevez votre compte Sélectionner un éditeur + Selectionner un snippet %0%' ci-dessous.
Vous pouvez ajouter d'autres langues depuis le menu ci-dessous "Langues". ]]>
Nom de Culture + Modifiez la clé de l'élément de dictionaire. + + + Votre nom d'utilisateur @@ -331,7 +354,6 @@ Entrez votre email Votre nom d'utilisateur est généralement votre adresse email - Autoriser à la racine Seuls les Types de Contenu qui ont ceci coché peuvent être créés au niveau racine des arborescences de contenu et de media @@ -362,6 +384,13 @@ CSS associées Afficher le libellé Largeur et hauteur + Tous les types de propriété & les données de propriétés + utilisant ce type de données seront supprimés définitivement, veuillez confirmer que vous voulez également les supprimer + Oui, supprimer + et tous les types de propriétés & et les données de propriété utilisant ce type de donnés + Sélectionnez le répertoire vers lequel déplacer + dans l'arborescence ci-dessous + a été déplacé sous Vos données ont été sauvegardées, mais avant de pouvoir publier votre page, il y a des erreurs que vous devez corriger : @@ -420,6 +449,7 @@ Fermer la fenêtre Commenter Confirmer + Conserver Conserver les proportions Continuer Copier @@ -431,6 +461,7 @@ Supprimé Suppression... Design + Dictionnaire Dimensions Bas Télécharger @@ -440,6 +471,7 @@ Email Erreur Trouver + Premier Hauteur Aide Icône @@ -449,8 +481,8 @@ Installer Non valide Justifier - Libellé Langue + Dernier Mise en page En cours de chargement Bloqué @@ -477,8 +509,8 @@ Propriétés Email de réception des données de formulaire Corbeille - Votre corbeille est vide Restant + Enlever Renommer Renouveller Requis @@ -486,6 +518,7 @@ Permissions Rechercher Désolé, nous ne pouvons pas trouver ce que vous recherchez + Aucun élément n'a été ajouté Serveur Montrer Afficher la page à l'envoi @@ -519,6 +552,7 @@ Intégrer sélectionné + Noir Vert @@ -527,6 +561,7 @@ Bleu Rouge + Ajouter un onglet Ajouter une propriété @@ -544,7 +579,18 @@ Passer à la vue en liste Basculer vers l'autorisation comme racine + + Commenter/Décommenter les lignes + Supprimer la ligne + Copier les lignes vers le haut + Copier les lignes vers le bas + Déplacer les lignes vers le haut + Déplacer les lignes vers le bas + + General + Editor + Couleur de fond Gras @@ -552,6 +598,7 @@ Police Texte + Page @@ -580,17 +627,21 @@ N'ayez pas d'inquiétude : aucun contenu ne sera supprimé et tout continuera à fonctionner parfaitement par après !

]]>
- - Appuyez sur Suivant pour - poursuivre. ]]> - + Appuyez sur Suivant pour + poursuivre. ]]> Suivant pour poursuivre la configuration]]> Le mot de passe par défaut doit être modifié !]]> L'utilisateur par défaut a été désactivé ou n'a pas accès à Umbraco!

Aucune autre action n'est requise. Cliquez sur Suivant pour poursuivre.]]> Le mot de passe par défaut a été modifié avec succès depuis l'installation!

Aucune autre action n'est requise. Cliquez sur Suivant pour poursuivre.]]> Le mot de passe a été modifié ! - - ('admin') et le mot de passe ('default'). Il est important que ce mot de passe soit modifié en quelque-chose de sécurisé et unique. + + Umbraco crée un utilisateur par défaut avec le login ('admin') et le mot de passe ('default'). Il est important que ce mot de passe soit + modifié en quelque-chose de sécurisé et unique. +

+

+ Cette étape va vérifier le mot de passe utilisateur par défaut et suggèrera de le modifier si nécessaire. +

]]>
Pour bien commencer, regardez nos vidéos d'introduction En cliquant sur le bouton "Suivant" (ou en modifiant umbracoConfigurationStatus dans le fichier web.config), vous acceptez la licence de ce logiciel telle que spécifiée dans le champ ci-dessous. Veuillez noter que cette distribution Umbraco consiste en deux licences différentes, la licence open source MIT pour le framework et la licence Umbraco freeware qui couvre l'UI. @@ -619,8 +670,7 @@ Il stocke également des données temporaires (i.e : cache) pour améliorer les performances de votre site. ]]> Je veux démarrer "from scratch" - - Apprenez comment) Vous pouvez toujours choisir d'installer Runway plus tard. Pour cela, allez dans la section "Développeur" et sélectionnez "Packages". @@ -633,8 +683,7 @@ ]]> Recommandé uniquement pour les utilisateurs expérimentés Je veux commencer avec un site simple - - "Runway" est un site simple qui fournit des types de documents et des modèles de base. L'installateur peut mettre en place Runway automatiquement pour vous, mais vous pouvez facilement l'éditer, l'enrichir, ou le supprimer par la suite. Il n'est pas nécessaire, et vous pouvez parfaitement vous en passer pour utiliser Umbraco. Cela étant dit, @@ -738,8 +787,7 @@ Pour gérer votre site, ouvrez simplement le backoffice Umbraco et commencez à Avec les salutations du Robot Umbraco ]]> - - Hello %0%

+ Hello %0%

Ceci est un email automatique pour vous informer que la tâche '%1%' a été executée sur la page '%2%' @@ -774,6 +822,39 @@ Pour gérer votre site, ouvrez simplement le backoffice Umbraco et commencez à Choisissez un package sur votre ordinateur en cliquant sur le bouton Parcourir
et localisez le package. Les packages Umbraco ont généralement une extension ".umb" ou ".zip". ]]> + Déposez pour uploader + ou cliquez ici pour choisir les fichiers + Uploader un package + Installez un package local en le sélectionnant sur votre ordinateur. Installez uniquement des packages de sources fiables que vous connaissez + Uploader un autre package + Annuler et uploader un autre package + Licence + J'accepte + les conditions d'utilisation + Installer le package + Terminer + Packages installés + Vous n'avez aucun package installé + 'Packages' en haut à droite de votre écran]]> + Chercher des packages + Résultats pour + Nous n'avons rien pu trouver pour + Veuillez essayer de chercher un autre package ou naviguez à travers les catégories + Populaires + Nouvelles releases + a + points de karma + Information + Propriétaire + Contributeurs + Créé + Version actuelle + version .NET + Téléchargements + Coups de coeur + Compatibilité + Ce package est compatible avec les versions suivantes de Umbraco, selon les rapports des membres de la communauté. Une compatibilité complète ne peut pas être garantie pour les versions rapportées sous 100% + Sources externes Auteur Démo Documentation @@ -808,6 +889,8 @@ Pour gérer votre site, ouvrez simplement le backoffice Umbraco et commencez à Installation... Redémarrage, veuillez patienter... Terminé, votre navigateur va être rafraîchi, veuillez patienter... + Veuillez cliquer sur terminer pour compléter l'installation et recharger la page. + Package en cours de chargement... Coller en conservant le formatage (non recommandé) @@ -875,6 +958,10 @@ Pour gérer votre site, ouvrez simplement le backoffice Umbraco et commencez à Réinitialiser + Définir le recadrage + Donnez un alias au recadrage ainsi que sa largeur et sa hauteur par défaut + Sauvegarder le recadrage + Ajouter un nouveau recadrage Version actuelle @@ -1015,17 +1102,113 @@ Pour gérer votre site, ouvrez simplement le backoffice Umbraco et commencez à Prévisualiser Styles + Editer le modèle + + Sections Insérer une zone de contenu Insérer un placeholder de zone de contenu - Insérer un élément de dictionnaire - Insérer une Macro - Insérer un champ de la page Umbraco + + Insérer + Choisissez l'élément à insérer dans votre modèle + + Elément de dictionnaire + Un éléménet de dictionnaire est un espace pour un morceau de texte traduisible, ce qui facilite la création de designs pour des sites web multilangues. + + Macro + + Une Macro est un composant configurable, ce qui est génial pour les parties réutilisables de votre + design où vous devez pouvoir fournir des paramètres, + comme les galeries, les formulaires et les listes. + + + Valeur + Affiche la valeur d'un des champs de la page en cours, avec des options pour modifier la valeur ou spécifier des valeurs alternatives. + + Vue partielle + + Une vue partielle est un fichier modèle séparé qui peut être à l'intérieur d'un aute modèle, + c'est génial pour réutiliser du markup ou pour séparer des modèles complexes en plusieurs fichiers. + + Modèle de base - Guide rapide concernant les tags des modèles Umbraco + Pas de modèle de base + Pas de modèle + + Afficher un modèle enfant + + @RenderBody(). + ]]> + + + + Définir une section nommée + + @section { ... }. Celle-ci peut être affiché dans une région + spécifique du parent de ce modèle, en utilisant@RenderSection. + ]]> + + + Afficher une section nommée + + @RenderSection(name). + Ceci affiche une région d'un modèle enfant qui est entourée d'une définition @section [name]{ ... } correspondante. + ]]> + + + Nom de la section + La section est obligatoire + + Si obligatoire, le modèle enfant doit contenir une définition @section, sinon une erreur est affichée. + + + + Générateur de requêtes + Générer une requête + éléments trouvés, en + + Je veux + tout le contenu + le contenu du type "%0%" + à partir de + mon site web + + et + + est + n'est pas + avant + avant (incluant la date sélectionnée) + après + après (ncluant la date sélectionnée) + égal + n'est pas égal + contient + ne contient pas + supérieur à + supérieur ou égal à + inférieur à + inférieur ou égal à + + Id + Nom + Date de Création + Date de Dernière Modification + + trier par + ascendant + descendant + Modèle + + Choisissez le type de contenu Choisissez une mise en page @@ -1057,7 +1240,6 @@ Pour gérer votre site, ouvrez simplement le backoffice Umbraco et commencez à Paramètres Configurez les paramètres qui peuvent être modifiés par les éditeurs - Styles Configurez les effets de style qui peuvent être modifiés par les éditeurs @@ -1070,8 +1252,9 @@ Pour gérer votre site, ouvrez simplement le backoffice Umbraco et commencez à Choisir le défaut ont été ajoutés - - + + + Compositions Vous n'avez pas ajouté d'onglet Ajouter un nouvel onglet @@ -1085,6 +1268,7 @@ Pour gérer votre site, ouvrez simplement le backoffice Umbraco et commencez à Modèles autorisés Sélectionnez les modèles que les éditeurs sont autorisés à utiliser pour du contenu de ce type. + Autorisé comme racine Autorisez les éditeurs à créer du contenu de ce type à la racine de l'arborescence de contenu. Oui - autoriser du contenu de ce type à la racine @@ -1093,6 +1277,7 @@ Pour gérer votre site, ouvrez simplement le backoffice Umbraco et commencez à Autorisez la création de contenu des types spécifiés sous le contenu de ce type-ci Choisissez les noeuds enfants + Hériter des onglets et propriétés d'un type de document existant. De nouveaux onglets seront ajoutés au type de document actuel, ou fusionnés s'il existe un onglet avec un nom sililaire. Ce type de contenu est utilisé dans une composition, et ne peut donc pas être lui-même un composé. Il n'y a pas de type de contenu disponible à utiliser dans une composition. @@ -1127,39 +1312,43 @@ Pour gérer votre site, ouvrez simplement le backoffice Umbraco et commencez à Le membre peut éditer Afficher dans le profil du membre - l'onglet n'a pas d'ordonnancement - - - - Création des modèles - ceci peut prendre un certain temps, ne vous inquiétez pas - Les modèles ont été générés - Les modèles n'ont pas pu être générés - La génération des modèles a échoué, veuillez consulter les erreurs dans le log Umbraco + + Ajouter un champ de rechange + Champ de rechange + Ajouter une valeur par défaut + Valeur par défaut Champ alternatif Texte alternatif Casse Encodage Choisir un champ Convertir les sauts de ligne + Oui, convertir les sauts de ligne Remplace les sauts de ligne avec des balises &lt;br&gt; Champs particuliers Oui, la date seulement + Format et encodage Formater comme une date + Formate la valeur comme une date, ou une date avec l'heure, en fonction de la culture active Encoder en HTML Remplacera les caractères spéciaux par leur équivalent HTML. Sera inséré après la valeur du champ Sera inséré avant la valeur du champ Minuscules + Modifier le résultat Aucun + Example de résultat Insérer après le champ Insérer avant le champ Récursif + Oui, rendre récursif Supprimer les balises de paragraphes + Oui, supprimer les balises de paragraphe Supprimera toute balise &lt;P&gt; au début et à la fin du texte + Séparateur Champs standards Majuscules Encode pour URL @@ -1248,6 +1437,8 @@ Pour gérer votre site, ouvrez simplement le backoffice Umbraco et commencez à Modèles Fichiers XSLT Analytique + Vues partielles + Fichiers Macro pour les vues partielles Nouvelle mise à jour disponible @@ -1307,6 +1498,14 @@ Pour gérer votre site, ouvrez simplement le backoffice Umbraco et commencez à Valider comme Url ...ou introduisez une validation spécifique Champ obligatoire + Introduisez une expression régulière + Vous devez ajouter au moins + Vous ne pouvez avoir que + éléments + éléments sélectionnés + Date non valide + Pas un nombre + Email non valide