diff --git a/.github/BUILD.md b/.github/BUILD.md index ad33872423..5f962a8911 100644 --- a/.github/BUILD.md +++ b/.github/BUILD.md @@ -39,7 +39,7 @@ To build Umbraco, fire up PowerShell and move to Umbraco's repository root (the build/build.ps1 -If you only see a build.bat-file, you're probably on the wrong branch. If you switch to the correct branch (dev-v8) the file will appear and you can build it. +If you only see a build.bat-file, you're probably on the wrong branch. If you switch to the correct branch (v8/contrib) the file will appear and you can build it. You might run into [Powershell quirks](#powershell-quirks). diff --git a/.gitignore b/.gitignore index ea2ddfbb68..15c9fb52f2 100644 --- a/.gitignore +++ b/.gitignore @@ -198,3 +198,5 @@ src/Umbraco.Tests.Integration/Views/ src/Umbraco.Tests/TEMP/ /src/Umbraco.Web.UI.NetCore/Umbraco/Data/* + +/src/Umbraco.Web.UI/config/umbracoSettings.config diff --git a/build/NuSpecs/tools/ReadmeUpgrade.txt b/build/NuSpecs/tools/ReadmeUpgrade.txt index 91d49d896c..fd1b2174e2 100644 --- a/build/NuSpecs/tools/ReadmeUpgrade.txt +++ b/build/NuSpecs/tools/ReadmeUpgrade.txt @@ -11,7 +11,7 @@ Y88 88Y 888 888 888 888 d88P 888 888 888 Y88b. Y88..88P Don't forget to build! -We've done our best to transform your configuration files but in case something is not quite right: we recommmend you look in source control for the previous version so you can find the original files before they were transformed. +We've done our best to transform your configuration files but in case something is not quite right: we recommend you look in source control for the previous version so you can find the original files before they were transformed. This NuGet package includes build targets that extend the creation of a deploy package, which is generated by Publishing from Visual Studio. The targets will only work once Publishing is configured, so if you don't use diff --git a/src/SolutionInfo.cs b/src/SolutionInfo.cs index 0a2e2c5c54..3a1f151388 100644 --- a/src/SolutionInfo.cs +++ b/src/SolutionInfo.cs @@ -2,7 +2,7 @@ using System.Resources; [assembly: AssemblyCompany("Umbraco")] -[assembly: AssemblyCopyright("Copyright © Umbraco 2020")] +[assembly: AssemblyCopyright("Copyright © Umbraco 2021")] [assembly: AssemblyTrademark("")] [assembly: AssemblyCulture("")] diff --git a/src/Umbraco.Core/Collections/EventClearingObservableCollection.cs b/src/Umbraco.Core/Collections/EventClearingObservableCollection.cs new file mode 100644 index 0000000000..af25cc1b4a --- /dev/null +++ b/src/Umbraco.Core/Collections/EventClearingObservableCollection.cs @@ -0,0 +1,41 @@ +using System.Collections.Generic; +using System.Collections.ObjectModel; +using System.Collections.Specialized; + +namespace Umbraco.Core.Collections +{ + /// + /// Allows clearing all event handlers + /// + /// + public class EventClearingObservableCollection : ObservableCollection, INotifyCollectionChanged + { + public EventClearingObservableCollection() + { + } + + public EventClearingObservableCollection(List list) : base(list) + { + } + + public EventClearingObservableCollection(IEnumerable collection) : base(collection) + { + } + + // need to explicitly implement with event accessor syntax in order to override in order to to clear + // c# events are weird, they do not behave the same way as other c# things that are 'virtual', + // a good article is here: https://medium.com/@unicorn_dev/virtual-events-in-c-something-went-wrong-c6f6f5fbe252 + // and https://stackoverflow.com/questions/2268065/c-sharp-language-design-explicit-interface-implementation-of-an-event + private NotifyCollectionChangedEventHandler _changed; + event NotifyCollectionChangedEventHandler INotifyCollectionChanged.CollectionChanged + { + add { _changed += value; } + remove { _changed -= value; } + } + + /// + /// Clears all event handlers for the event + /// + public void ClearCollectionChangedEvents() => _changed = null; + } +} diff --git a/src/Umbraco.Core/Collections/ObservableDictionary.cs b/src/Umbraco.Core/Collections/ObservableDictionary.cs index c6aedab377..fd9e469f07 100644 --- a/src/Umbraco.Core/Collections/ObservableDictionary.cs +++ b/src/Umbraco.Core/Collections/ObservableDictionary.cs @@ -1,11 +1,14 @@ using System; using System.Collections.Generic; using System.Collections.ObjectModel; +using System.Collections.Specialized; +using System.ComponentModel; using System.Linq; using System.Runtime.Serialization; namespace Umbraco.Core.Collections { + /// /// An ObservableDictionary /// @@ -15,7 +18,7 @@ namespace Umbraco.Core.Collections /// /// The type of elements contained in the BindableCollection /// The type of the indexing key - public class ObservableDictionary : ObservableCollection, IReadOnlyDictionary, IDictionary + public class ObservableDictionary : ObservableCollection, IReadOnlyDictionary, IDictionary, INotifyCollectionChanged { protected Dictionary Indecies { get; } protected Func KeySelector { get; } @@ -74,6 +77,22 @@ namespace Umbraco.Core.Collections #endregion + // need to explicitly implement with event accessor syntax in order to override in order to to clear + // c# events are weird, they do not behave the same way as other c# things that are 'virtual', + // a good article is here: https://medium.com/@unicorn_dev/virtual-events-in-c-something-went-wrong-c6f6f5fbe252 + // and https://stackoverflow.com/questions/2268065/c-sharp-language-design-explicit-interface-implementation-of-an-event + private NotifyCollectionChangedEventHandler _changed; + event NotifyCollectionChangedEventHandler INotifyCollectionChanged.CollectionChanged + { + add { _changed += value; } + remove { _changed -= value; } + } + + /// + /// Clears all event handlers + /// + public void ClearCollectionChangedEvents() => _changed = null; + public bool ContainsKey(TKey key) { return Indecies.ContainsKey(key); diff --git a/src/Umbraco.Core/Composing/ComponentComposer.cs b/src/Umbraco.Core/Composing/ComponentComposer.cs index 853d4f4502..fca0161d05 100644 --- a/src/Umbraco.Core/Composing/ComponentComposer.cs +++ b/src/Umbraco.Core/Composing/ComponentComposer.cs @@ -1,5 +1,4 @@ - -using Umbraco.Core.DependencyInjection; +using Umbraco.Core.DependencyInjection; namespace Umbraco.Core.Composing { diff --git a/src/Umbraco.Core/Configuration/IConfigManipulator.cs b/src/Umbraco.Core/Configuration/IConfigManipulator.cs index bc89b7bd1d..16c5a509f2 100644 --- a/src/Umbraco.Core/Configuration/IConfigManipulator.cs +++ b/src/Umbraco.Core/Configuration/IConfigManipulator.cs @@ -1,6 +1,4 @@ -using Umbraco.Core.IO; - -namespace Umbraco.Core.Configuration +namespace Umbraco.Core.Configuration { public interface IConfigManipulator { @@ -8,5 +6,6 @@ namespace Umbraco.Core.Configuration void SaveConnectionString(string connectionString, string providerName); void SaveConfigValue(string itemPath, object value); void SaveDisableRedirectUrlTracking(bool disable); + void SetGlobalId(string id); } } diff --git a/src/Umbraco.Core/Configuration/Models/ContentSettings.cs b/src/Umbraco.Core/Configuration/Models/ContentSettings.cs index 55881cd8db..01ffffa190 100644 --- a/src/Umbraco.Core/Configuration/Models/ContentSettings.cs +++ b/src/Umbraco.Core/Configuration/Models/ContentSettings.cs @@ -193,8 +193,15 @@ namespace Umbraco.Core.Configuration.Models public bool ShowDeprecatedPropertyEditors { get; set; } = false; /// - /// Gets or sets a value for the pate to the login screen background image. + /// Gets or sets a value for the path to the login screen background image. /// public string LoginBackgroundImage { get; set; } = "assets/img/login.jpg"; + + /// + /// Gets or sets a value for the path to the login screen logo image. + /// + public string LoginLogoImage { get; set; } = "assets/img/application/umbraco_logo_white.svg"; + + } } diff --git a/src/Umbraco.Core/Configuration/Models/GlobalSettings.cs b/src/Umbraco.Core/Configuration/Models/GlobalSettings.cs index eb13427d2b..c6e5d92794 100644 --- a/src/Umbraco.Core/Configuration/Models/GlobalSettings.cs +++ b/src/Umbraco.Core/Configuration/Models/GlobalSettings.cs @@ -94,10 +94,15 @@ namespace Umbraco.Core.Configuration.Models public bool InstallMissingDatabase { get; set; } = false; /// - /// Gets or sets a value indicating whether to install the database when it is empty. + /// Gets or sets a value indicating whether unattended installs are enabled. /// - public bool InstallEmptyDatabase { get; set; } = false; - + /// + /// By default, when a database connection string is configured and it is possible to connect to + /// the database, but the database is empty, the runtime enters the Install level. + /// If this option is set to true an unattended install will be performed and the runtime enters + /// the Run level. + /// + public bool InstallUnattended { get; set; } = false; /// /// Gets or sets a value indicating whether to disable the election for a single server. /// @@ -112,6 +117,7 @@ namespace Umbraco.Core.Configuration.Models /// Gets or sets a value for the main dom lock. /// public string MainDomLock { get; set; } = string.Empty; + public string Id { get; set; } = string.Empty; /// /// Gets or sets a value for the path to the no content view. diff --git a/src/Umbraco.Core/Constants-Configuration.cs b/src/Umbraco.Core/Constants-Configuration.cs index a60f29c39d..451ac5d438 100644 --- a/src/Umbraco.Core/Constants-Configuration.cs +++ b/src/Umbraco.Core/Constants-Configuration.cs @@ -16,10 +16,10 @@ public const string ConfigCorePrefix = ConfigPrefix + "Core:"; public const string ConfigCustomErrorsPrefix = ConfigPrefix + "CustomErrors:"; public const string ConfigGlobalPrefix = ConfigPrefix + "Global:"; + public const string ConfigGlobalId = ConfigGlobalPrefix + "Id"; public const string ConfigHostingPrefix = ConfigPrefix + "Hosting:"; public const string ConfigModelsBuilderPrefix = ConfigPrefix + "ModelsBuilder:"; public const string ConfigSecurityPrefix = ConfigPrefix + "Security:"; - public const string ConfigContentNotificationsEmail = ConfigContentNotificationsPrefix + "Email"; public const string ConfigContentMacroErrors = ConfigContentPrefix + "MacroErrors"; public const string ConfigGlobalUseHttps = ConfigGlobalPrefix + "UseHttps"; diff --git a/src/Umbraco.Core/Constants-SqlTemplates.cs b/src/Umbraco.Core/Constants-SqlTemplates.cs index 984bc495b0..5a78b62f5b 100644 --- a/src/Umbraco.Core/Constants-SqlTemplates.cs +++ b/src/Umbraco.Core/Constants-SqlTemplates.cs @@ -14,7 +14,16 @@ public const string GetParentNode = "Umbraco.Core.VersionableRepository.GetParentNode"; public const string GetReservedId = "Umbraco.Core.VersionableRepository.GetReservedId"; } + public static class RelationRepository + { + public const string DeleteByParentAll = "Umbraco.Core.RelationRepository.DeleteByParent"; + public const string DeleteByParentIn = "Umbraco.Core.RelationRepository.DeleteByParentIn"; + } + public static class DataTypeRepository + { + public const string EnsureUniqueNodeName = "Umbraco.Core.DataTypeDefinitionRepository.EnsureUniqueNodeName"; + } } } } diff --git a/src/Umbraco.Core/Constants-SvgSanitizer.cs b/src/Umbraco.Core/Constants-SvgSanitizer.cs index 447ea66668..c92b9f56c7 100644 --- a/src/Umbraco.Core/Constants-SvgSanitizer.cs +++ b/src/Umbraco.Core/Constants-SvgSanitizer.cs @@ -17,7 +17,7 @@ namespace Umbraco.Core /// /// Allowlist for SVG tabs. /// - public static readonly IList Tags = new [] { "a", "altGlyph", "altGlyphDef", "altGlyphItem", "animate", "animateColor", "animateMotion", "animateTransform", "circle", "clipPath", "color-profile", "cursor", "defs", "desc", "discard", "ellipse", "feBlend", "feColorMatrix", "feComponentTransfer", "feComposite", "feConvolveMatrix", "feDiffuseLighting", "feDisplacementMap", "feDistantLight", "feDropShadow", "feFlood", "feFuncA", "feFuncB", "feFuncG", "feFuncR", "feGaussianBlur", "feImage", "feMerge", "feMergeNode", "feMorphology", "feOffset", "fePointLight", "feSpecularLighting", "feSpotLight", "feTile", "feTurbulence", "filter", "font", "font-face", "font-face-format", "font-face-name", "font-face-src", "font-face-uri", "foreignObject", "g", "glyph", "glyphRef", "hatch", "hatchpath", "hkern", "image", "line", "linearGradient", "marker", "mask", "mesh", "meshgradient", "meshpatch", "meshrow", "metadata", "missing-glyph", "mpath", "path", "pattern", "polygon", "polyline", "radialGradient", "rect", "set", "solidcolor", "stop", "style", "svg", "switch", "symbol", "text", "textPath", "title", "tref", "tspan", "unknown", "use", "view", "vkern" }; + public static readonly IList Tags = new [] { "a", "altGlyph", "altGlyphDef", "altGlyphItem", "animate", "animateColor", "animateMotion", "animateTransform", "circle", "clipPath", "color-profile", "cursor", "defs", "desc", "discard", "ellipse", "feBlend", "feColorMatrix", "feComponentTransfer", "feComposite", "feConvolveMatrix", "feDiffuseLighting", "feDisplacementMap", "feDistantLight", "feDropShadow", "feFlood", "feFuncA", "feFuncB", "feFuncG", "feFuncR", "feGaussianBlur", "feImage", "feMerge", "feMergeNode", "feMorphology", "feOffset", "fePointLight", "feSpecularLighting", "feSpotLight", "feTile", "feTurbulence", "filter", "font", "font-face", "font-face-format", "font-face-name", "font-face-src", "font-face-uri", "foreignObject", "g", "glyph", "glyphRef", "hatch", "hatchpath", "hkern", "image", "line", "linearGradient", "marker", "mask", "mesh", "meshgradient", "meshpatch", "meshrow", "metadata", "missing-glyph", "mpath", "path", "pattern", "polygon", "polyline", "radialGradient", "rect", "set", "solidcolor", "stop", "svg", "switch", "symbol", "text", "textPath", "title", "tref", "tspan", "unknown", "use", "view", "vkern" }; } } } diff --git a/src/Umbraco.Core/Exceptions/UnattendedInstallException.cs b/src/Umbraco.Core/Exceptions/UnattendedInstallException.cs new file mode 100644 index 0000000000..6f672d17cd --- /dev/null +++ b/src/Umbraco.Core/Exceptions/UnattendedInstallException.cs @@ -0,0 +1,46 @@ +using System; +using System.Runtime.Serialization; + +namespace Umbraco.Core.Exceptions +{ + /// + /// An exception that is thrown if an unattended installation occurs. + /// + [Serializable] + public class UnattendedInstallException : Exception + { + /// + /// Initializes a new instance of the class. + /// + public UnattendedInstallException() + { + } + + /// + /// Initializes a new instance of the class with a specified error message. + /// + /// The message that describes the error. + public UnattendedInstallException(string message) : base(message) + { + } + + /// + /// Initializes a new instance of the class with a specified error message + /// and a reference to the inner exception which is the cause of this exception. + /// + /// The message that describes the error. + /// The inner exception, or null. + public UnattendedInstallException(string message, Exception innerException) : base(message, innerException) + { + } + + /// + /// Initializes a new instance of the class. + /// + /// The that holds the serialized object data about the exception being thrown. + /// The that contains contextual information about the source or destination. + protected UnattendedInstallException(SerializationInfo info, StreamingContext context) : base(info, context) + { + } + } +} diff --git a/src/Umbraco.Core/IO/SystemFiles.cs b/src/Umbraco.Core/IO/SystemFiles.cs index c8151d076c..92e9156f2f 100644 --- a/src/Umbraco.Core/IO/SystemFiles.cs +++ b/src/Umbraco.Core/IO/SystemFiles.cs @@ -9,8 +9,6 @@ namespace Umbraco.Core.IO { public static string TinyMceConfig => Constants.SystemDirectories.Config + "/tinyMceConfig.config"; - public static string TelemetricsIdentifier => Constants.SystemDirectories.Data + "/telemetrics-id.umb"; - // TODO: Kill this off we don't have umbraco.config XML cache we now have NuCache public static string GetContentCacheXml(IHostingEnvironment hostingEnvironment) { diff --git a/src/Umbraco.Core/Install/InstallSteps/TelemetryIdentifierStep.cs b/src/Umbraco.Core/Install/InstallSteps/TelemetryIdentifierStep.cs new file mode 100644 index 0000000000..01d8e428c7 --- /dev/null +++ b/src/Umbraco.Core/Install/InstallSteps/TelemetryIdentifierStep.cs @@ -0,0 +1,54 @@ +using System; +using System.Threading.Tasks; +using Microsoft.Extensions.Logging; +using Microsoft.Extensions.Options; +using Umbraco.Core.Configuration; +using Umbraco.Core.Configuration.Models; +using Umbraco.Web.Install.Models; + +namespace Umbraco.Web.Install.InstallSteps +{ + [InstallSetupStep(InstallationType.NewInstall | InstallationType.Upgrade, + "TelemetryIdConfiguration", 0, "", + PerformsAppRestart = false)] + public class TelemetryIdentifierStep : InstallSetupStep + { + private readonly ILogger _logger; + private readonly IOptions _globalSettings; + private readonly IConfigManipulator _configManipulator; + + public TelemetryIdentifierStep(ILogger logger, IOptions globalSettings, IConfigManipulator configManipulator) + { + _logger = logger; + _globalSettings = globalSettings; + _configManipulator = configManipulator; + } + + public override Task ExecuteAsync(object model) + { + // Generate GUID + var telemetrySiteIdentifier = Guid.NewGuid(); + + try + { + _configManipulator.SetGlobalId(telemetrySiteIdentifier.ToString()); + } + catch (Exception ex) + { + _logger.LogError(ex, "Couldn't update config files with a telemetry site identifier"); + } + + return Task.FromResult(null); + } + + public override bool RequiresExecution(object model) + { + // Verify that Json value is not empty string + // Try & get a value stored in appSettings.json + var backofficeIdentifierRaw = _globalSettings.Value.Id; + + // No need to add Id again if already found + return string.IsNullOrEmpty(backofficeIdentifierRaw); + } + } +} diff --git a/src/Umbraco.Core/Models/Content.cs b/src/Umbraco.Core/Models/Content.cs index c5930bf998..04f49e704e 100644 --- a/src/Umbraco.Core/Models/Content.cs +++ b/src/Umbraco.Core/Models/Content.cs @@ -98,10 +98,15 @@ namespace Umbraco.Core.Models set { if (_schedule != null) - _schedule.CollectionChanged -= ScheduleCollectionChanged; + { + _schedule.ClearCollectionChangedEvents(); + } + SetPropertyValueAndDetectChanges(value, ref _schedule, nameof(ContentSchedule)); if (_schedule != null) + { _schedule.CollectionChanged += ScheduleCollectionChanged; + } } } @@ -223,10 +228,16 @@ namespace Umbraco.Core.Models } set { - if (_publishInfos != null) _publishInfos.CollectionChanged -= PublishNamesCollectionChanged; + if (_publishInfos != null) + { + _publishInfos.ClearCollectionChangedEvents(); + } + _publishInfos = value; if (_publishInfos != null) + { _publishInfos.CollectionChanged += PublishNamesCollectionChanged; + } } } @@ -321,7 +332,7 @@ namespace Umbraco.Core.Models else Properties.EnsurePropertyTypes(contentType.CompositionPropertyTypes); - Properties.CollectionChanged -= PropertiesChanged; // be sure not to double add + Properties.ClearCollectionChangedEvents(); // be sure not to double add Properties.CollectionChanged += PropertiesChanged; } @@ -438,7 +449,7 @@ namespace Umbraco.Core.Models //if culture infos exist then deal with event bindings if (clonedContent._publishInfos != null) { - clonedContent._publishInfos.CollectionChanged -= PublishNamesCollectionChanged; //clear this event handler if any + clonedContent._publishInfos.ClearCollectionChangedEvents(); //clear this event handler if any clonedContent._publishInfos = (ContentCultureInfosCollection)_publishInfos.DeepClone(); //manually deep clone clonedContent._publishInfos.CollectionChanged += clonedContent.PublishNamesCollectionChanged; //re-assign correct event handler } @@ -446,7 +457,7 @@ namespace Umbraco.Core.Models //if properties exist then deal with event bindings if (clonedContent._schedule != null) { - clonedContent._schedule.CollectionChanged -= ScheduleCollectionChanged; //clear this event handler if any + clonedContent._schedule.ClearCollectionChangedEvents(); //clear this event handler if any clonedContent._schedule = (ContentScheduleCollection)_schedule.DeepClone(); //manually deep clone clonedContent._schedule.CollectionChanged += clonedContent.ScheduleCollectionChanged; //re-assign correct event handler } diff --git a/src/Umbraco.Core/Models/ContentBase.cs b/src/Umbraco.Core/Models/ContentBase.cs index 2b522b2931..1e71da34c4 100644 --- a/src/Umbraco.Core/Models/ContentBase.cs +++ b/src/Umbraco.Core/Models/ContentBase.cs @@ -138,7 +138,11 @@ namespace Umbraco.Core.Models get => _properties; set { - if (_properties != null) _properties.CollectionChanged -= PropertiesChanged; + if (_properties != null) + { + _properties.ClearCollectionChangedEvents(); + } + _properties = value; _properties.CollectionChanged += PropertiesChanged; } @@ -173,10 +177,15 @@ namespace Umbraco.Core.Models } set { - if (_cultureInfos != null) _cultureInfos.CollectionChanged -= CultureInfosCollectionChanged; + if (_cultureInfos != null) + { + _cultureInfos.ClearCollectionChangedEvents(); + } _cultureInfos = value; if (_cultureInfos != null) + { _cultureInfos.CollectionChanged += CultureInfosCollectionChanged; + } } } @@ -479,7 +488,7 @@ namespace Umbraco.Core.Models //if culture infos exist then deal with event bindings if (clonedContent._cultureInfos != null) { - clonedContent._cultureInfos.CollectionChanged -= CultureInfosCollectionChanged; //clear this event handler if any + clonedContent._cultureInfos.ClearCollectionChangedEvents(); //clear this event handler if any clonedContent._cultureInfos = (ContentCultureInfosCollection)_cultureInfos.DeepClone(); //manually deep clone clonedContent._cultureInfos.CollectionChanged += clonedContent.CultureInfosCollectionChanged; //re-assign correct event handler } @@ -487,7 +496,7 @@ namespace Umbraco.Core.Models //if properties exist then deal with event bindings if (clonedContent._properties != null) { - clonedContent._properties.CollectionChanged -= PropertiesChanged; //clear this event handler if any + clonedContent._properties.ClearCollectionChangedEvents(); //clear this event handler if any clonedContent._properties = (IPropertyCollection)_properties.DeepClone(); //manually deep clone clonedContent._properties.CollectionChanged += clonedContent.PropertiesChanged; //re-assign correct event handler } diff --git a/src/Umbraco.Core/Models/ContentScheduleCollection.cs b/src/Umbraco.Core/Models/ContentScheduleCollection.cs index 6c7dd79312..0ebcc0fe4b 100644 --- a/src/Umbraco.Core/Models/ContentScheduleCollection.cs +++ b/src/Umbraco.Core/Models/ContentScheduleCollection.cs @@ -14,6 +14,11 @@ namespace Umbraco.Core.Models public event NotifyCollectionChangedEventHandler CollectionChanged; + /// + /// Clears all event handlers + /// + public void ClearCollectionChangedEvents() => CollectionChanged = null; + private void OnCollectionChanged(NotifyCollectionChangedEventArgs args) { CollectionChanged?.Invoke(this, args); diff --git a/src/Umbraco.Core/Models/ContentTypeBase.cs b/src/Umbraco.Core/Models/ContentTypeBase.cs index 9823bb8a1d..cb1531d739 100644 --- a/src/Umbraco.Core/Models/ContentTypeBase.cs +++ b/src/Umbraco.Core/Models/ContentTypeBase.cs @@ -266,7 +266,10 @@ namespace Umbraco.Core.Models set { if (_noGroupPropertyTypes != null) - _noGroupPropertyTypes.CollectionChanged -= PropertyTypesChanged; + { + _noGroupPropertyTypes.ClearCollectionChangedEvents(); + } + _noGroupPropertyTypes = new PropertyTypeCollection(SupportsPublishing, value); _noGroupPropertyTypes.CollectionChanged += PropertyTypesChanged; PropertyTypesChanged(_noGroupPropertyTypes, new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Reset)); @@ -484,14 +487,14 @@ namespace Umbraco.Core.Models // its ignored from the auto-clone process because its return values are unions, not raw and // we end up with duplicates, see: http://issues.umbraco.org/issue/U4-4842 - clonedEntity._noGroupPropertyTypes.CollectionChanged -= PropertyTypesChanged; //clear this event handler if any + clonedEntity._noGroupPropertyTypes.ClearCollectionChangedEvents(); //clear this event handler if any clonedEntity._noGroupPropertyTypes = (PropertyTypeCollection) _noGroupPropertyTypes.DeepClone(); //manually deep clone clonedEntity._noGroupPropertyTypes.CollectionChanged += clonedEntity.PropertyTypesChanged; //re-assign correct event handler } if (clonedEntity._propertyGroups != null) { - clonedEntity._propertyGroups.CollectionChanged -= PropertyGroupsChanged; //clear this event handler if any + clonedEntity._propertyGroups.ClearCollectionChangedEvents(); //clear this event handler if any clonedEntity._propertyGroups = (PropertyGroupCollection) _propertyGroups.DeepClone(); //manually deep clone clonedEntity._propertyGroups.CollectionChanged += clonedEntity.PropertyGroupsChanged; //re-assign correct event handler } diff --git a/src/Umbraco.Core/Models/IPropertyCollection.cs b/src/Umbraco.Core/Models/IPropertyCollection.cs index c0a9622e6e..c947a5e12d 100644 --- a/src/Umbraco.Core/Models/IPropertyCollection.cs +++ b/src/Umbraco.Core/Models/IPropertyCollection.cs @@ -34,5 +34,6 @@ namespace Umbraco.Core.Models void Add(IProperty property); int Count { get; } + void ClearCollectionChangedEvents(); } } diff --git a/src/Umbraco.Core/Models/Media.cs b/src/Umbraco.Core/Models/Media.cs index 452bb615d1..c4e841f27b 100644 --- a/src/Umbraco.Core/Models/Media.cs +++ b/src/Umbraco.Core/Models/Media.cs @@ -77,7 +77,7 @@ namespace Umbraco.Core.Models else Properties.EnsurePropertyTypes(contentType.CompositionPropertyTypes); - Properties.CollectionChanged -= PropertiesChanged; // be sure not to double add + Properties.ClearCollectionChangedEvents(); // be sure not to double add Properties.CollectionChanged += PropertiesChanged; } } diff --git a/src/Umbraco.Core/Models/PropertyCollection.cs b/src/Umbraco.Core/Models/PropertyCollection.cs index e206a3b38c..21b13d58da 100644 --- a/src/Umbraco.Core/Models/PropertyCollection.cs +++ b/src/Umbraco.Core/Models/PropertyCollection.cs @@ -155,6 +155,8 @@ namespace Umbraco.Core.Models /// public event NotifyCollectionChangedEventHandler CollectionChanged; + public void ClearCollectionChangedEvents() => CollectionChanged = null; + protected virtual void OnCollectionChanged(NotifyCollectionChangedEventArgs args) { CollectionChanged?.Invoke(this, args); diff --git a/src/Umbraco.Core/Models/PropertyGroup.cs b/src/Umbraco.Core/Models/PropertyGroup.cs index 2e6da5d837..022fb6ed03 100644 --- a/src/Umbraco.Core/Models/PropertyGroup.cs +++ b/src/Umbraco.Core/Models/PropertyGroup.cs @@ -66,7 +66,10 @@ namespace Umbraco.Core.Models set { if (_propertyTypes != null) - _propertyTypes.CollectionChanged -= PropertyTypesChanged; + { + _propertyTypes.ClearCollectionChangedEvents(); + } + _propertyTypes = value; // since we're adding this collection to this group, @@ -100,7 +103,7 @@ namespace Umbraco.Core.Models if (clonedEntity._propertyTypes != null) { - clonedEntity._propertyTypes.CollectionChanged -= PropertyTypesChanged; //clear this event handler if any + clonedEntity._propertyTypes.ClearCollectionChangedEvents(); //clear this event handler if any clonedEntity._propertyTypes = (PropertyTypeCollection) _propertyTypes.DeepClone(); //manually deep clone clonedEntity._propertyTypes.CollectionChanged += clonedEntity.PropertyTypesChanged; //re-assign correct event handler } diff --git a/src/Umbraco.Core/Models/PropertyGroupCollection.cs b/src/Umbraco.Core/Models/PropertyGroupCollection.cs index f5b3012b1a..11f4e470ee 100644 --- a/src/Umbraco.Core/Models/PropertyGroupCollection.cs +++ b/src/Umbraco.Core/Models/PropertyGroupCollection.cs @@ -160,6 +160,11 @@ namespace Umbraco.Core.Models public event NotifyCollectionChangedEventHandler CollectionChanged; + /// + /// Clears all event handlers + /// + public void ClearCollectionChangedEvents() => CollectionChanged = null; + protected virtual void OnCollectionChanged(NotifyCollectionChangedEventArgs args) { CollectionChanged?.Invoke(this, args); diff --git a/src/Umbraco.Core/Models/PropertyTypeCollection.cs b/src/Umbraco.Core/Models/PropertyTypeCollection.cs index bca7e88e03..132c80e7d1 100644 --- a/src/Umbraco.Core/Models/PropertyTypeCollection.cs +++ b/src/Umbraco.Core/Models/PropertyTypeCollection.cs @@ -165,7 +165,11 @@ namespace Umbraco.Core.Models } public event NotifyCollectionChangedEventHandler CollectionChanged; - + + /// + /// Clears all event handlers + /// + public void ClearCollectionChangedEvents() => CollectionChanged = null; protected virtual void OnCollectionChanged(NotifyCollectionChangedEventArgs args) { CollectionChanged?.Invoke(this, args); diff --git a/src/Umbraco.Core/Models/PublicAccessEntry.cs b/src/Umbraco.Core/Models/PublicAccessEntry.cs index b7f9caed44..e48e3bd711 100644 --- a/src/Umbraco.Core/Models/PublicAccessEntry.cs +++ b/src/Umbraco.Core/Models/PublicAccessEntry.cs @@ -4,6 +4,7 @@ using System.Collections.ObjectModel; using System.Collections.Specialized; using System.Linq; using System.Runtime.Serialization; +using Umbraco.Core.Collections; using Umbraco.Core.Models.Entities; namespace Umbraco.Core.Models @@ -12,7 +13,7 @@ namespace Umbraco.Core.Models [DataContract(IsReference = true)] public class PublicAccessEntry : EntityBase { - private readonly ObservableCollection _ruleCollection; + private readonly EventClearingObservableCollection _ruleCollection; private int _protectedNodeId; private int _noAccessNodeId; private int _loginNodeId; @@ -28,7 +29,7 @@ namespace Umbraco.Core.Models NoAccessNodeId = noAccessNode.Id; _protectedNodeId = protectedNode.Id; - _ruleCollection = new ObservableCollection(ruleCollection); + _ruleCollection = new EventClearingObservableCollection(ruleCollection); _ruleCollection.CollectionChanged += _ruleCollection_CollectionChanged; foreach (var rule in _ruleCollection) @@ -44,7 +45,7 @@ namespace Umbraco.Core.Models NoAccessNodeId = noAccessNodeId; _protectedNodeId = protectedNodeId; - _ruleCollection = new ObservableCollection(ruleCollection); + _ruleCollection = new EventClearingObservableCollection(ruleCollection); _ruleCollection.CollectionChanged += _ruleCollection_CollectionChanged; foreach (var rule in _ruleCollection) @@ -148,7 +149,7 @@ namespace Umbraco.Core.Models if (cloneEntity._ruleCollection != null) { - cloneEntity._ruleCollection.CollectionChanged -= _ruleCollection_CollectionChanged; //clear this event handler if any + cloneEntity._ruleCollection.ClearCollectionChangedEvents(); //clear this event handler if any cloneEntity._ruleCollection.CollectionChanged += cloneEntity._ruleCollection_CollectionChanged; //re-assign correct event handler } } diff --git a/src/Umbraco.Core/Models/Range.cs b/src/Umbraco.Core/Models/Range.cs index 83afa11658..108d564665 100644 --- a/src/Umbraco.Core/Models/Range.cs +++ b/src/Umbraco.Core/Models/Range.cs @@ -1,52 +1,130 @@ using System; +using System.Globalization; + namespace Umbraco.Core.Models { - // The Range class. Adapted from http://stackoverflow.com/questions/5343006/is-there-a-c-sharp-type-for-representing-an-integer-range - /// Generic parameter. - public class Range where T : IComparable + /// + /// Represents a range with a minimum and maximum value. + /// + /// The type of the minimum and maximum values. + /// + public class Range : IEquatable> + where T : IComparable { - /// Minimum value of the range. + /// + /// Gets or sets the minimum value. + /// + /// + /// The minimum value. + /// public T Minimum { get; set; } - /// Maximum value of the range. + /// + /// Gets or sets the maximum value. + /// + /// + /// The maximum value. + /// public T Maximum { get; set; } - /// Presents the Range in readable format. - /// String representation of the Range - public override string ToString() - { - return string.Format("{0},{1}", this.Minimum, this.Maximum); - } + /// + /// Returns a that represents this instance. + /// + /// + /// A that represents this instance. + /// + public override string ToString() => this.ToString("{0},{1}", CultureInfo.InvariantCulture); - /// Determines if the range is valid. - /// True if range is valid, else false - public bool IsValid() - { - return this.Minimum.CompareTo(this.Maximum) <= 0; - } + /// + /// Returns a that represents this instance. + /// + /// A composite format string for a single value (minimum and maximum are equal). Use {0} for the minimum and {1} for the maximum value. + /// A composite format string for the range values. Use {0} for the minimum and {1} for the maximum value. + /// An object that supplies culture-specific formatting information. + /// + /// A that represents this instance. + /// + public string ToString(string format, string formatRange, IFormatProvider provider = null) => this.ToString(this.Minimum.CompareTo(this.Maximum) == 0 ? format : formatRange, provider); - /// Determines if the provided value is inside the range. - /// The value to test - /// True if the value is inside Range, else false - public bool ContainsValue(T value) - { - return (this.Minimum.CompareTo(value) <= 0) && (value.CompareTo(this.Maximum) <= 0); - } + /// + /// Returns a that represents this instance. + /// + /// A composite format string for the range values. Use {0} for the minimum and {1} for the maximum value. + /// An object that supplies culture-specific formatting information. + /// + /// A that represents this instance. + /// + public string ToString(string format, IFormatProvider provider = null) => string.Format(provider, format, this.Minimum, this.Maximum); - /// Determines if this Range is inside the bounds of another range. - /// The parent range to test on - /// True if range is inclusive, else false - public bool IsInsideRange(Range range) - { - return this.IsValid() && range.IsValid() && range.ContainsValue(this.Minimum) && range.ContainsValue(this.Maximum); - } + /// + /// Determines whether this range is valid (the minimum value is lower than or equal to the maximum value). + /// + /// + /// true if this range is valid; otherwise, false. + /// + public bool IsValid() => this.Minimum.CompareTo(this.Maximum) <= 0; - /// Determines if another range is inside the bounds of this range. - /// The child range to test - /// True if range is inside, else false - public bool ContainsRange(Range range) - { - return this.IsValid() && range.IsValid() && this.ContainsValue(range.Minimum) && this.ContainsValue(range.Maximum); - } + /// + /// Determines whether this range contains the specified value. + /// + /// The value. + /// + /// true if this range contains the specified value; otherwise, false. + /// + public bool ContainsValue(T value) => this.Minimum.CompareTo(value) <= 0 && value.CompareTo(this.Maximum) <= 0; + + /// + /// Determines whether this range is inside the specified range. + /// + /// The range. + /// + /// true if this range is inside the specified range; otherwise, false. + /// + public bool IsInsideRange(Range range) => this.IsValid() && range.IsValid() && range.ContainsValue(this.Minimum) && range.ContainsValue(this.Maximum); + + /// + /// Determines whether this range contains the specified range. + /// + /// The range. + /// + /// true if this range contains the specified range; otherwise, false. + /// + public bool ContainsRange(Range range) => this.IsValid() && range.IsValid() && this.ContainsValue(range.Minimum) && this.ContainsValue(range.Maximum); + + /// + /// Determines whether the specified , is equal to this instance. + /// + /// The to compare with this instance. + /// + /// true if the specified is equal to this instance; otherwise, false. + /// + public override bool Equals(object obj) => obj is Range other && this.Equals(other); + + /// + /// Indicates whether the current object is equal to another object of the same type. + /// + /// An object to compare with this object. + /// + /// if the current object is equal to the parameter; otherwise, . + /// + public bool Equals(Range other) => other != null && this.Equals(other.Minimum, other.Maximum); + + /// + /// Determines whether the specified and values are equal to this instance values. + /// + /// The minimum value. + /// The maximum value. + /// + /// true if the specified and values are equal to this instance values; otherwise, false. + /// + public bool Equals(T minimum, T maximum) => this.Minimum.CompareTo(minimum) == 0 && this.Maximum.CompareTo(maximum) == 0; + + /// + /// Returns a hash code for this instance. + /// + /// + /// A hash code for this instance, suitable for use in hashing algorithms and data structures like a hash table. + /// + public override int GetHashCode() => (this.Minimum, this.Maximum).GetHashCode(); } } diff --git a/src/Umbraco.Core/Scheduling/RecurringTaskBase.cs b/src/Umbraco.Core/Scheduling/RecurringTaskBase.cs index 58df54a07e..4544711946 100644 --- a/src/Umbraco.Core/Scheduling/RecurringTaskBase.cs +++ b/src/Umbraco.Core/Scheduling/RecurringTaskBase.cs @@ -15,9 +15,29 @@ namespace Umbraco.Web.Scheduling public abstract class RecurringTaskBase : LatchedBackgroundTaskBase { private readonly IBackgroundTaskRunner _runner; - private readonly int _periodMilliseconds; + private readonly long _periodMilliseconds; private readonly Timer _timer; + /// + /// Initializes a new instance of the class. + /// + /// The task runner. + /// The delay. + /// The period. + /// The task will repeat itself periodically. Use this constructor to create a new task. + protected RecurringTaskBase(IBackgroundTaskRunner runner, long delayMilliseconds, long periodMilliseconds) + { + _runner = runner; + _periodMilliseconds = periodMilliseconds; + + // note + // must use the single-parameter constructor on Timer to avoid it from being GC'd + // read http://stackoverflow.com/questions/4962172/why-does-a-system-timers-timer-survive-gc-but-not-system-threading-timer + + _timer = new Timer(_ => Release()); + _timer.Change(delayMilliseconds, 0); + } + /// /// Initializes a new instance of the class. /// diff --git a/src/Umbraco.Core/Services/ContentTypeServiceExtensions.cs b/src/Umbraco.Core/Services/ContentTypeServiceExtensions.cs index 8d21c21276..d03820b53e 100644 --- a/src/Umbraco.Core/Services/ContentTypeServiceExtensions.cs +++ b/src/Umbraco.Core/Services/ContentTypeServiceExtensions.cs @@ -37,7 +37,7 @@ namespace Umbraco.Core.Services /// This is required because in the case of creating/modifying a content type because new property types being added to it are not yet persisted so cannot /// be looked up via the db, they need to be passed in. /// - /// Wether the composite content types should be applicable for an element type + /// Whether the composite content types should be applicable for an element type /// public static ContentTypeAvailableCompositionsResults GetAvailableCompositeContentTypes(this IContentTypeService ctService, IContentTypeComposition source, diff --git a/src/Umbraco.Core/Services/IRuntimeState.cs b/src/Umbraco.Core/Services/IRuntimeState.cs index ef826014be..2e5f8630d4 100644 --- a/src/Umbraco.Core/Services/IRuntimeState.cs +++ b/src/Umbraco.Core/Services/IRuntimeState.cs @@ -57,5 +57,6 @@ namespace Umbraco.Core void Configure(RuntimeLevel level, RuntimeLevelReason reason); + void DoUnattendedInstall(); } } diff --git a/src/Umbraco.Core/Telemetry/TelemetryMarkerComponent.cs b/src/Umbraco.Core/Telemetry/TelemetryMarkerComponent.cs deleted file mode 100644 index 157cacd618..0000000000 --- a/src/Umbraco.Core/Telemetry/TelemetryMarkerComponent.cs +++ /dev/null @@ -1,70 +0,0 @@ -using System; -using System.IO; -using Microsoft.Extensions.Logging; -using Umbraco.Core; -using Umbraco.Core.Composing; -using Umbraco.Core.Hosting; -using Umbraco.Core.IO; - -namespace Umbraco.Web.Telemetry -{ - public class TelemetryMarkerComponent : IComponent - { - private readonly ILogger _logger; - private readonly IRuntimeState _runtime; - private readonly IHostingEnvironment _hostingEnvironment; - - public TelemetryMarkerComponent(ILogger logger, IRuntimeState runtime, IHostingEnvironment hostingEnvironment) - { - _logger = logger; - _runtime = runtime; - _hostingEnvironment = hostingEnvironment; - } - - public void Initialize() - { - if (_runtime.Level != RuntimeLevel.Install && _runtime.Level != RuntimeLevel.Upgrade) - { - return; - } - - var telemetricsFilePath = _hostingEnvironment.MapPathContentRoot(SystemFiles.TelemetricsIdentifier); - - // Verify file does not exist already (if we are upgrading) - // In a clean install we know it would not exist - // If the site is upgraded and the file was removed it would re-create one - // NOTE: If user removed the marker file to opt out it would re-create a new guid marker file & potentially skew - if (_runtime.Level == RuntimeLevel.Upgrade && File.Exists(telemetricsFilePath)) - { - _logger.LogWarning("When upgrading the anonymous telemetry file already existed on disk at {filePath}", telemetricsFilePath); - return; - } - if (_runtime.Level == RuntimeLevel.Install && File.Exists(telemetricsFilePath)) - { - // No need to log for when level is install if file exists (As this component hit several times during install process) - return; - } - - // We are a clean install or an upgrade without the marker file - // Generate GUID - var telemetrySiteIdentifier = Guid.NewGuid(); - - // Write file contents - try - { - File.WriteAllText(telemetricsFilePath, telemetrySiteIdentifier.ToString()); - } - catch (Exception ex) - { - _logger.LogError(ex, "Unable to create telemetry file at {filePath}", telemetricsFilePath); - } - - - - } - - public void Terminate() - { - } - } -} diff --git a/src/Umbraco.Core/Telemetry/TelemetryMarkerComposer.cs b/src/Umbraco.Core/Telemetry/TelemetryMarkerComposer.cs deleted file mode 100644 index ccb66c7b2a..0000000000 --- a/src/Umbraco.Core/Telemetry/TelemetryMarkerComposer.cs +++ /dev/null @@ -1,8 +0,0 @@ -using Umbraco.Core; -using Umbraco.Core.Composing; - -namespace Umbraco.Web.Telemetry -{ - public class TelemetryMarkerComposer : ComponentComposer, ICoreComposer - { } -} diff --git a/src/Umbraco.Infrastructure/Configuration/JsonConfigManipulator.cs b/src/Umbraco.Infrastructure/Configuration/JsonConfigManipulator.cs index a3a43d2b93..0d6be8717a 100644 --- a/src/Umbraco.Infrastructure/Configuration/JsonConfigManipulator.cs +++ b/src/Umbraco.Infrastructure/Configuration/JsonConfigManipulator.cs @@ -42,6 +42,7 @@ namespace Umbraco.Core.Configuration SaveJson(provider, json); } + public void SaveConfigValue(string key, object value) { var provider = GetJsonConfigurationProvider(); @@ -79,6 +80,40 @@ namespace Umbraco.Core.Configuration SaveJson(provider, json); } + public void SetGlobalId(string id) + { + var provider = GetJsonConfigurationProvider(); + + var json = GetJson(provider); + + var item = GetGlobalIdItem(id); + + json.Merge(item, new JsonMergeSettings()); + + SaveJson(provider, json); + } + + private object GetGlobalIdItem(string id) + { + JTokenWriter writer = new JTokenWriter(); + + writer.WriteStartObject(); + writer.WritePropertyName("Umbraco"); + writer.WriteStartObject(); + writer.WritePropertyName("CMS"); + writer.WriteStartObject(); + writer.WritePropertyName("Global"); + writer.WriteStartObject(); + writer.WritePropertyName("Id"); + writer.WriteValue(id); + writer.WriteEndObject(); + writer.WriteEndObject(); + writer.WriteEndObject(); + writer.WriteEndObject(); + + return writer.Token; + } + private JToken GetDisableRedirectUrlItem(string value) { JTokenWriter writer = new JTokenWriter(); diff --git a/src/Umbraco.Infrastructure/DependencyInjection/UmbracoBuilder.CoreServices.cs b/src/Umbraco.Infrastructure/DependencyInjection/UmbracoBuilder.CoreServices.cs index 94c1e3dcfa..8ce9839f6b 100644 --- a/src/Umbraco.Infrastructure/DependencyInjection/UmbracoBuilder.CoreServices.cs +++ b/src/Umbraco.Infrastructure/DependencyInjection/UmbracoBuilder.CoreServices.cs @@ -194,11 +194,12 @@ namespace Umbraco.Infrastructure.DependencyInjection var hostingEnvironment = factory.GetRequiredService(); var dbCreator = factory.GetRequiredService(); + var databaseSchemaCreatorFactory = factory.GetRequiredService(); var isWindows = RuntimeInformation.IsOSPlatform(OSPlatform.Windows); var loggerFactory = factory.GetRequiredService(); return globalSettings.MainDomLock.Equals("SqlMainDomLock") || isWindows == false - ? (IMainDomLock)new SqlMainDomLock(loggerFactory.CreateLogger(), loggerFactory, globalSettings, connectionStrings, dbCreator, hostingEnvironment) + ? (IMainDomLock)new SqlMainDomLock(loggerFactory.CreateLogger(), loggerFactory, globalSettings, connectionStrings, dbCreator, hostingEnvironment, databaseSchemaCreatorFactory) : new MainDomSemaphoreLock(loggerFactory.CreateLogger(), hostingEnvironment); }); diff --git a/src/Umbraco.Infrastructure/DependencyInjection/UmbracoBuilder.Installer.cs b/src/Umbraco.Infrastructure/DependencyInjection/UmbracoBuilder.Installer.cs index e5bdd844d8..1e40831f75 100644 --- a/src/Umbraco.Infrastructure/DependencyInjection/UmbracoBuilder.Installer.cs +++ b/src/Umbraco.Infrastructure/DependencyInjection/UmbracoBuilder.Installer.cs @@ -17,6 +17,7 @@ namespace Umbraco.Infrastructure.DependencyInjection builder.Services.AddScoped(); builder.Services.AddScoped(); builder.Services.AddScoped(); + builder.Services.AddScoped(); builder.Services.AddScoped(); builder.Services.AddScoped(); builder.Services.AddScoped(); diff --git a/src/Umbraco.Infrastructure/HostedServices/ReportSiteTask.cs b/src/Umbraco.Infrastructure/HostedServices/ReportSiteTask.cs index 95b09d5498..7ce1fffa0c 100644 --- a/src/Umbraco.Infrastructure/HostedServices/ReportSiteTask.cs +++ b/src/Umbraco.Infrastructure/HostedServices/ReportSiteTask.cs @@ -1,15 +1,14 @@ using Newtonsoft.Json; using System; -using System.IO; using System.Net.Http; using System.Runtime.Serialization; using System.Text; using System.Threading.Tasks; using Microsoft.Extensions.Logging; +using Microsoft.Extensions.Options; using Umbraco.Core; using Umbraco.Core.Configuration; -using Umbraco.Core.Hosting; -using Umbraco.Core.IO; +using Umbraco.Core.Configuration.Models; using Umbraco.Infrastructure.HostedServices; namespace Umbraco.Web.Telemetry @@ -17,71 +16,43 @@ namespace Umbraco.Web.Telemetry public class ReportSiteTask : RecurringHostedServiceBase { private readonly ILogger _logger; - private readonly IHostingEnvironment _hostingEnvironment; private readonly IUmbracoVersion _umbracoVersion; + private readonly IOptions _globalSettings; private static HttpClient s_httpClient; public ReportSiteTask( ILogger logger, - IHostingEnvironment hostingEnvironment, - IUmbracoVersion umbracoVersion) + IUmbracoVersion umbracoVersion, + IOptions globalSettings) : base(TimeSpan.FromDays(1), TimeSpan.FromMinutes(1)) { _logger = logger; - _hostingEnvironment = hostingEnvironment; _umbracoVersion = umbracoVersion; + _globalSettings = globalSettings; s_httpClient = new HttpClient(); } /// - /// Runs the background task to send the anynomous ID + /// Runs the background task to send the anonymous ID /// to telemetry service /// internal override async Task PerformExecuteAsync(object state) { - // Try & find file at '/umbraco/telemetrics-id.umb' - var telemetricsFilePath = _hostingEnvironment.MapPathContentRoot(SystemFiles.TelemetricsIdentifier); - - if (File.Exists(telemetricsFilePath) == false) - { - // Some users may have decided to not be tracked by deleting/removing the marker file - _logger.LogWarning("No telemetry marker file found at '{filePath}' and will not report site to telemetry service", telemetricsFilePath); - - return; - } - - - string telemetricsFileContents; - try - { - // Open file & read its contents - // It may throw due to file permissions or file locking - telemetricsFileContents = File.ReadAllText(telemetricsFilePath); - } - catch (Exception ex) - { - // Silently swallow ex - but lets log it (ReadAllText throws a ton of different types of ex) - // Hence the use of general exception type - _logger.LogError(ex, "Error in reading file contents of telemetry marker file found at '{filePath}'", telemetricsFilePath); - - // Exit out early, but mark this task to be repeated in case its a file lock so it can be rechecked the next time round - return; - } - + // Try & get a value stored in umbracoSettings.config on the backoffice XML element ID attribute + var backofficeIdentifierRaw = _globalSettings.Value.Id; // Parse as a GUID & verify its a GUID and not some random string // In case of users may have messed or decided to empty the file contents or put in something random - if (Guid.TryParse(telemetricsFileContents, out var telemetrySiteIdentifier) == false) + if (Guid.TryParse(backofficeIdentifierRaw, out var telemetrySiteIdentifier) == false) { - // Some users may have decided to mess with file contents - _logger.LogWarning("The telemetry marker file found at '{filePath}' with '{telemetrySiteId}' is not a valid identifier for the telemetry service", telemetricsFilePath, telemetrySiteIdentifier); + // Some users may have decided to mess with the XML attribute and put in something else + _logger.LogWarning("No telemetry marker found"); return; } try { - // Send data to LIVE telemetry s_httpClient.BaseAddress = new Uri("https://telemetry.umbraco.com/"); @@ -112,11 +83,10 @@ namespace Umbraco.Web.Telemetry { // Silently swallow // The user does not need the logs being polluted if our service has fallen over or is down etc - // Hence only loggigng this at a more verbose level (Which users should not be using in prod) + // Hence only logging this at a more verbose level (which users should not be using in production) _logger.LogDebug("There was a problem sending a request to the Umbraco telemetry service"); } } - [DataContract] private class TelemetryReportData { diff --git a/src/Umbraco.Infrastructure/Install/InstallHelper.cs b/src/Umbraco.Infrastructure/Install/InstallHelper.cs index 1538187528..b8b5371457 100644 --- a/src/Umbraco.Infrastructure/Install/InstallHelper.cs +++ b/src/Umbraco.Infrastructure/Install/InstallHelper.cs @@ -131,7 +131,7 @@ namespace Umbraco.Web.Install return true; } - return _databaseBuilder.HasSomeNonDefaultUser() == false; + return _databaseBuilder.IsUmbracoInstalled() == false; } } diff --git a/src/Umbraco.Infrastructure/Install/InstallStepCollection.cs b/src/Umbraco.Infrastructure/Install/InstallStepCollection.cs index 523cd35a27..4b352190b0 100644 --- a/src/Umbraco.Infrastructure/Install/InstallStepCollection.cs +++ b/src/Umbraco.Infrastructure/Install/InstallStepCollection.cs @@ -21,6 +21,7 @@ namespace Umbraco.Web.Install a.OfType().First(), a.OfType().First(), a.OfType().First(), + a.OfType().First(), a.OfType().First(), a.OfType().First(), a.OfType().First(), diff --git a/src/Umbraco.Infrastructure/Install/InstallSteps/NewInstallStep.cs b/src/Umbraco.Infrastructure/Install/InstallSteps/NewInstallStep.cs index b7699b7d0e..5d70338079 100644 --- a/src/Umbraco.Infrastructure/Install/InstallSteps/NewInstallStep.cs +++ b/src/Umbraco.Infrastructure/Install/InstallSteps/NewInstallStep.cs @@ -9,6 +9,7 @@ using Umbraco.Core; using Umbraco.Core.Configuration.Models; using Umbraco.Core.Migrations.Install; using Umbraco.Core.Security; +using Umbraco.Core.Persistence; using Umbraco.Core.Services; using Umbraco.Extensions; using Umbraco.Web.Install.Models; @@ -34,6 +35,7 @@ namespace Umbraco.Web.Install.InstallSteps private readonly ConnectionStrings _connectionStrings; private readonly ICookieManager _cookieManager; private readonly IBackOfficeUserManager _userManager; + private readonly IDbProviderFactoryCreator _dbProviderFactoryCreator; public NewInstallStep( IUserService userService, @@ -42,7 +44,8 @@ namespace Umbraco.Web.Install.InstallSteps IOptions securitySettings, IOptions connectionStrings, ICookieManager cookieManager, - IBackOfficeUserManager userManager) + IBackOfficeUserManager userManager, + IDbProviderFactoryCreator dbProviderFactoryCreator) { _userService = userService ?? throw new ArgumentNullException(nameof(userService)); _databaseBuilder = databaseBuilder ?? throw new ArgumentNullException(nameof(databaseBuilder)); @@ -51,6 +54,7 @@ namespace Umbraco.Web.Install.InstallSteps _connectionStrings = connectionStrings.Value ?? throw new ArgumentNullException(nameof(connectionStrings)); _cookieManager = cookieManager; _userManager = userManager ?? throw new ArgumentNullException(nameof(userManager)); + _dbProviderFactoryCreator = dbProviderFactoryCreator ?? throw new ArgumentNullException(nameof(dbProviderFactoryCreator)); } public override async Task ExecuteAsync(UserModel user) @@ -120,26 +124,89 @@ namespace Umbraco.Web.Install.InstallSteps { get { - return RequiresExecution(null) - //the user UI - ? "user" - //the continue install UI - : "continueinstall"; + return ShowView() + // the user UI + ? "user" + // continue install UI + : "continueinstall"; } } + private InstallState GetInstallState() + { + var installState = InstallState.Unknown; + + var databaseSettings = _connectionStrings.UmbracoConnectionString; + + var hasConnString = databaseSettings != null && _databaseBuilder.IsDatabaseConfigured; + if (hasConnString) + { + installState = (installState | InstallState.HasConnectionString) & ~InstallState.Unknown; + } + + var connStringConfigured = databaseSettings.IsConnectionStringConfigured(); + if (connStringConfigured) + { + installState = (installState | InstallState.ConnectionStringConfigured) & ~InstallState.Unknown; + } + + var factory = _dbProviderFactoryCreator.CreateFactory(databaseSettings.ProviderName); + var canConnect = connStringConfigured && DbConnectionExtensions.IsConnectionAvailable(databaseSettings.ConnectionString, factory); + if (canConnect) + { + installState = (installState | InstallState.CanConnect) & ~InstallState.Unknown; + } + + var umbracoInstalled = canConnect ? _databaseBuilder.IsUmbracoInstalled() : false; + if (umbracoInstalled) + { + installState = (installState | InstallState.UmbracoInstalled) & ~InstallState.Unknown; + } + + var hasNonDefaultUser = umbracoInstalled ? _databaseBuilder.HasSomeNonDefaultUser() : false; + if (hasNonDefaultUser) + { + installState = (installState | InstallState.HasNonDefaultUser) & ~InstallState.Unknown; + } + + return installState; + } + + private bool ShowView() + { + var installState = GetInstallState(); + + return installState.HasFlag(InstallState.Unknown) + || !installState.HasFlag(InstallState.UmbracoInstalled); + } + public override bool RequiresExecution(UserModel model) { - //now we have to check if this is really a new install, the db might be configured and might contain data - var databaseSettings = _connectionStrings.UmbracoConnectionString; - if (databaseSettings.IsConnectionStringConfigured() && _databaseBuilder.IsDatabaseConfigured) - return _databaseBuilder.HasSomeNonDefaultUser() == false; + var installState = GetInstallState(); - // In this one case when it's a brand new install and nothing has been configured, make sure the - // back office cookie is cleared so there's no old cookies lying around causing problems - _cookieManager.ExpireCookie(_securitySettings.AuthCookieName); + if (installState.HasFlag(InstallState.Unknown)) + { + // In this one case when it's a brand new install and nothing has been configured, make sure the + // back office cookie is cleared so there's no old cookies lying around causing problems + _cookieManager.ExpireCookie(_securitySettings.AuthCookieName); + } - return true; + return installState.HasFlag(InstallState.Unknown) + || !installState.HasFlag(InstallState.HasNonDefaultUser); + } + + [Flags] + private enum InstallState : short + { + // This is an easy way to avoid 0 enum assignment and not worry about + // manual calcs. https://www.codeproject.com/Articles/396851/Ending-the-Great-Debate-on-Enum-Flags + Unknown = 1, + HasVersion = 1 << 1, + HasConnectionString = 1 << 2, + ConnectionStringConfigured = 1 << 3, + CanConnect = 1 << 4, + UmbracoInstalled = 1 << 5, + HasNonDefaultUser = 1 << 6 } } } diff --git a/src/Umbraco.Infrastructure/Migrations/Install/DatabaseBuilder.cs b/src/Umbraco.Infrastructure/Migrations/Install/DatabaseBuilder.cs index 98e9bcb4bb..541896548c 100644 --- a/src/Umbraco.Infrastructure/Migrations/Install/DatabaseBuilder.cs +++ b/src/Umbraco.Infrastructure/Migrations/Install/DatabaseBuilder.cs @@ -29,9 +29,9 @@ namespace Umbraco.Core.Migrations.Install private readonly IHostingEnvironment _hostingEnvironment; private readonly ILogger _logger; private readonly ILoggerFactory _loggerFactory; - private readonly IUmbracoVersion _umbracoVersion; private readonly IDbProviderFactoryCreator _dbProviderFactoryCreator; private readonly IConfigManipulator _configManipulator; + private readonly DatabaseSchemaCreatorFactory _databaseSchemaCreatorFactory; private DatabaseSchemaResult _databaseSchemaValidationResult; @@ -47,9 +47,9 @@ namespace Umbraco.Core.Migrations.Install IMigrationBuilder migrationBuilder, IKeyValueService keyValueService, IHostingEnvironment hostingEnvironment, - IUmbracoVersion umbracoVersion, IDbProviderFactoryCreator dbProviderFactoryCreator, - IConfigManipulator configManipulator) + IConfigManipulator configManipulator, + DatabaseSchemaCreatorFactory databaseSchemaCreatorFactory) { _scopeProvider = scopeProvider; _databaseFactory = databaseFactory; @@ -59,9 +59,9 @@ namespace Umbraco.Core.Migrations.Install _migrationBuilder = migrationBuilder; _keyValueService = keyValueService; _hostingEnvironment = hostingEnvironment; - _umbracoVersion = umbracoVersion; _dbProviderFactoryCreator = dbProviderFactoryCreator; _configManipulator = configManipulator; + _databaseSchemaCreatorFactory = databaseSchemaCreatorFactory; } #region Status @@ -133,6 +133,14 @@ namespace Umbraco.Core.Migrations.Install } } + internal bool IsUmbracoInstalled() + { + using (var scope = _scopeProvider.CreateScope(autoComplete: true)) + { + return scope.Database.IsUmbracoInstalled(); + } + } + #endregion #region Configure Connection String @@ -315,14 +323,15 @@ namespace Umbraco.Core.Migrations.Install private DatabaseSchemaResult ValidateSchema(IScope scope) { if (_databaseFactory.Initialized == false) - return new DatabaseSchemaResult(_databaseFactory.SqlContext.SqlSyntax); + return new DatabaseSchemaResult(); if (_databaseSchemaValidationResult != null) return _databaseSchemaValidationResult; - var database = scope.Database; - var dbSchema = new DatabaseSchemaCreator(database, _loggerFactory.CreateLogger(), _loggerFactory, _umbracoVersion); - _databaseSchemaValidationResult = dbSchema.ValidateSchema(); + _databaseSchemaValidationResult = scope.Database.ValidateSchema(); + + scope.Complete(); + return _databaseSchemaValidationResult; } @@ -361,15 +370,14 @@ namespace Umbraco.Core.Migrations.Install var schemaResult = ValidateSchema(); var hasInstalledVersion = schemaResult.DetermineHasInstalledVersion(); - //var installedSchemaVersion = schemaResult.DetermineInstalledVersion(); - //var hasInstalledVersion = !installedSchemaVersion.Equals(new Version(0, 0, 0)); + //If the determined version is "empty" its a new install - otherwise upgrade the existing if (!hasInstalledVersion) { if (_runtime.Level == RuntimeLevel.Run) throw new Exception("Umbraco is already configured!"); - var creator = new DatabaseSchemaCreator(database, _loggerFactory.CreateLogger(), _loggerFactory, _umbracoVersion); + var creator = _databaseSchemaCreatorFactory.Create(database); creator.InitializeDatabaseSchema(); message = message + "

Installation completed!

"; diff --git a/src/Umbraco.Infrastructure/Migrations/Install/DatabaseSchemaCreator.cs b/src/Umbraco.Infrastructure/Migrations/Install/DatabaseSchemaCreator.cs index 5bca64e1e1..ed6e684cc6 100644 --- a/src/Umbraco.Infrastructure/Migrations/Install/DatabaseSchemaCreator.cs +++ b/src/Umbraco.Infrastructure/Migrations/Install/DatabaseSchemaCreator.cs @@ -25,10 +25,15 @@ namespace Umbraco.Core.Migrations.Install public DatabaseSchemaCreator(IUmbracoDatabase database, ILogger logger, ILoggerFactory loggerFactory, IUmbracoVersion umbracoVersion) { - _database = database; - _logger = logger; - _loggerFactory = loggerFactory; - _umbracoVersion = umbracoVersion; + _database = database ?? throw new ArgumentNullException(nameof(database)); + _logger = logger ?? throw new ArgumentNullException(nameof(logger)); + _loggerFactory = loggerFactory ?? throw new ArgumentNullException(nameof(loggerFactory)); + _umbracoVersion = umbracoVersion ?? throw new ArgumentNullException(nameof(umbracoVersion)); + + if (_database?.SqlContext?.SqlSyntax == null) + { + throw new InvalidOperationException("No SqlContext has been assigned to the database"); + } } private ISqlSyntaxProvider SqlSyntax => _database.SqlContext.SqlSyntax; @@ -149,7 +154,7 @@ namespace Umbraco.Core.Migrations.Install internal DatabaseSchemaResult ValidateSchema(IEnumerable orderedTables) { - var result = new DatabaseSchemaResult(SqlSyntax); + var result = new DatabaseSchemaResult(); result.IndexDefinitions.AddRange(SqlSyntax.GetDefinedIndexes(_database) .Select(x => new DbIndexDefinition(x))); @@ -451,14 +456,14 @@ namespace Umbraco.Core.Migrations.Install } //Execute the Create Table sql - var created = _database.Execute(new Sql(createSql)); - _logger.LogInformation("Create Table {TableName} ({Created}): \n {Sql}", tableName, created, createSql); + _database.Execute(new Sql(createSql)); + _logger.LogInformation("Create Table {TableName}: \n {Sql}", tableName, createSql); //If any statements exists for the primary key execute them here if (string.IsNullOrEmpty(createPrimaryKeySql) == false) { - var createdPk = _database.Execute(new Sql(createPrimaryKeySql)); - _logger.LogInformation("Create Primary Key ({CreatedPk}):\n {Sql}", createdPk, createPrimaryKeySql); + _database.Execute(new Sql(createPrimaryKeySql)); + _logger.LogInformation("Create Primary Key:\n {Sql}", createPrimaryKeySql); } if (SqlSyntax.SupportsIdentityInsert() && tableDefinition.Columns.Any(x => x.IsIdentity)) @@ -475,15 +480,15 @@ namespace Umbraco.Core.Migrations.Install //Loop through index statements and execute sql foreach (var sql in indexSql) { - var createdIndex = _database.Execute(new Sql(sql)); - _logger.LogInformation("Create Index ({CreatedIndex}):\n {Sql}", createdIndex, sql); + _database.Execute(new Sql(sql)); + _logger.LogInformation("Create Index:\n {Sql}", sql); } //Loop through foreignkey statements and execute sql foreach (var sql in foreignSql) { - var createdFk = _database.Execute(new Sql(sql)); - _logger.LogInformation("Create Foreign Key ({CreatedFk}):\n {Sql}", createdFk, sql); + _database.Execute(new Sql(sql)); + _logger.LogInformation("Create Foreign Key:\n {Sql}", sql); } if (overwrite) diff --git a/src/Umbraco.Infrastructure/Migrations/Install/DatabaseSchemaCreatorFactory.cs b/src/Umbraco.Infrastructure/Migrations/Install/DatabaseSchemaCreatorFactory.cs new file mode 100644 index 0000000000..935ede3ab5 --- /dev/null +++ b/src/Umbraco.Infrastructure/Migrations/Install/DatabaseSchemaCreatorFactory.cs @@ -0,0 +1,31 @@ +using Microsoft.Extensions.Logging; +using Umbraco.Core.Configuration; +using Umbraco.Core.Persistence; + +namespace Umbraco.Core.Migrations.Install +{ + /// + /// Creates the initial database schema during install. + /// + public class DatabaseSchemaCreatorFactory + { + private readonly ILogger _logger; + private readonly ILoggerFactory _loggerFactory; + private readonly IUmbracoVersion _umbracoVersion; + + public DatabaseSchemaCreatorFactory( + ILogger logger, + ILoggerFactory loggerFactory, + IUmbracoVersion umbracoVersion) + { + _logger = logger; + _loggerFactory = loggerFactory; + _umbracoVersion = umbracoVersion; + } + + public DatabaseSchemaCreator Create(IUmbracoDatabase database) + { + return new DatabaseSchemaCreator(database, _logger, _loggerFactory, _umbracoVersion); + } + } +} diff --git a/src/Umbraco.Infrastructure/Migrations/Install/DatabaseSchemaResult.cs b/src/Umbraco.Infrastructure/Migrations/Install/DatabaseSchemaResult.cs index e7b7b479ec..a153ba7b41 100644 --- a/src/Umbraco.Infrastructure/Migrations/Install/DatabaseSchemaResult.cs +++ b/src/Umbraco.Infrastructure/Migrations/Install/DatabaseSchemaResult.cs @@ -2,8 +2,8 @@ using System.Collections.Generic; using System.Linq; using System.Text; +using Umbraco.Core.Persistence; using Umbraco.Core.Persistence.DatabaseModelDefinitions; -using Umbraco.Core.Persistence.SqlSyntax; namespace Umbraco.Core.Migrations.Install { @@ -12,7 +12,7 @@ namespace Umbraco.Core.Migrations.Install /// public class DatabaseSchemaResult { - public DatabaseSchemaResult(ISqlSyntaxProvider sqlSyntax) + public DatabaseSchemaResult() { Errors = new List>(); TableDefinitions = new List(); diff --git a/src/Umbraco.Infrastructure/Persistence/IUmbracoDatabase.cs b/src/Umbraco.Infrastructure/Persistence/IUmbracoDatabase.cs index 1b0d1d9c2b..3849ae6ebd 100644 --- a/src/Umbraco.Infrastructure/Persistence/IUmbracoDatabase.cs +++ b/src/Umbraco.Infrastructure/Persistence/IUmbracoDatabase.cs @@ -1,5 +1,6 @@ using System.Collections.Generic; using NPoco; +using Umbraco.Core.Migrations.Install; namespace Umbraco.Core.Persistence { @@ -25,5 +26,7 @@ namespace Umbraco.Core.Persistence bool EnableSqlCount { get; set; } int SqlCount { get; } int BulkInsertRecords(IEnumerable records); + bool IsUmbracoInstalled(); + DatabaseSchemaResult ValidateSchema(); } } diff --git a/src/Umbraco.Infrastructure/Persistence/Repositories/Implement/ContentRepositoryBase.cs b/src/Umbraco.Infrastructure/Persistence/Repositories/Implement/ContentRepositoryBase.cs index 7b90efd4ae..bd947260ce 100644 --- a/src/Umbraco.Infrastructure/Persistence/Repositories/Implement/ContentRepositoryBase.cs +++ b/src/Umbraco.Infrastructure/Persistence/Repositories/Implement/ContentRepositoryBase.cs @@ -947,7 +947,8 @@ namespace Umbraco.Core.Persistence.Repositories.Implement var template = SqlContext.Templates.Get(Constants.SqlTemplates.VersionableRepository.EnsureUniqueNodeName, tsql => tsql .Select(x => Alias(x.NodeId, "id"), x => Alias(x.Text, "name")) .From() - .Where(x => x.NodeObjectType == SqlTemplate.Arg("nodeObjectType") && x.ParentId == SqlTemplate.Arg("parentId"))); + .Where(x => x.NodeObjectType == SqlTemplate.Arg("nodeObjectType") && x.ParentId == SqlTemplate.Arg("parentId")) + ); var sql = template.Sql(NodeObjectTypeId, parentId); var names = Database.Fetch(sql); @@ -957,28 +958,43 @@ namespace Umbraco.Core.Persistence.Repositories.Implement protected virtual int GetNewChildSortOrder(int parentId, int first) { - var template = SqlContext.Templates.Get(Constants.SqlTemplates.VersionableRepository.GetSortOrder, tsql => - tsql.Select($"COALESCE(MAX(sortOrder),{first - 1})").From().Where(x => x.ParentId == SqlTemplate.Arg("parentId") && x.NodeObjectType == NodeObjectTypeId) + var template = SqlContext.Templates.Get(Constants.SqlTemplates.VersionableRepository.GetSortOrder, tsql => tsql + .Select("MAX(sortOrder)") + .From() + .Where(x => x.NodeObjectType == SqlTemplate.Arg("nodeObjectType") && x.ParentId == SqlTemplate.Arg("parentId")) ); - return Database.ExecuteScalar(template.Sql(new { parentId })) + 1; + var sql = template.Sql(NodeObjectTypeId, parentId); + var sortOrder = Database.ExecuteScalar(sql); + + return (sortOrder + 1) ?? first; } protected virtual NodeDto GetParentNodeDto(int parentId) { - var template = SqlContext.Templates.Get(Constants.SqlTemplates.VersionableRepository.GetParentNode, tsql => - tsql.Select().From().Where(x => x.NodeId == SqlTemplate.Arg("parentId")) + var template = SqlContext.Templates.Get(Constants.SqlTemplates.VersionableRepository.GetParentNode, tsql => tsql + .Select() + .From() + .Where(x => x.NodeId == SqlTemplate.Arg("parentId")) ); - return Database.Fetch(template.Sql(parentId)).First(); + var sql = template.Sql(parentId); + var nodeDto = Database.First(sql); + + return nodeDto; } protected virtual int GetReservedId(Guid uniqueId) { - var template = SqlContext.Templates.Get(Constants.SqlTemplates.VersionableRepository.GetReservedId, tsql => - tsql.Select(x => x.NodeId).From().Where(x => x.UniqueId == SqlTemplate.Arg("uniqueId") && x.NodeObjectType == Constants.ObjectTypes.IdReservation) + var template = SqlContext.Templates.Get(Constants.SqlTemplates.VersionableRepository.GetReservedId, tsql => tsql + .Select(x => x.NodeId) + .From() + .Where(x => x.UniqueId == SqlTemplate.Arg("uniqueId") && x.NodeObjectType == Constants.ObjectTypes.IdReservation) ); - var id = Database.ExecuteScalar(template.Sql(new { uniqueId = uniqueId })); + + var sql = template.Sql(new { uniqueId }); + var id = Database.ExecuteScalar(sql); + return id ?? 0; } diff --git a/src/Umbraco.Infrastructure/Persistence/Repositories/Implement/ContentTypeRepositoryBase.cs b/src/Umbraco.Infrastructure/Persistence/Repositories/Implement/ContentTypeRepositoryBase.cs index 6554782d24..c5c38d29bc 100644 --- a/src/Umbraco.Infrastructure/Persistence/Repositories/Implement/ContentTypeRepositoryBase.cs +++ b/src/Umbraco.Infrastructure/Persistence/Repositories/Implement/ContentTypeRepositoryBase.cs @@ -467,8 +467,14 @@ AND umbracoNode.id <> @id", // The composed property is only considered segment variant when the base content type is also segment variant. // Example: Culture variant content type with a Culture+Segment variant property type will become ContentVariation.Culture var target = newContentTypeVariation & composedPropertyType.Variations; + // Determine the previous variation + // We have to compare with the old content type variation because the composed property might already have changed + // Example: A property with variations in an element type with variations is used in a document without + // when you enable variations the property has already enabled variations from the element type, + // but it's still a change from nothing because the document did not have variations, but it does now. + var from = oldContentTypeVariation & composedPropertyType.Variations; - propertyTypeVariationChanges[composedPropertyType.Id] = (composedPropertyType.Variations, target); + propertyTypeVariationChanges[composedPropertyType.Id] = (from, target); } } diff --git a/src/Umbraco.Infrastructure/Persistence/Repositories/Implement/DataTypeRepository.cs b/src/Umbraco.Infrastructure/Persistence/Repositories/Implement/DataTypeRepository.cs index 1f614e7647..b50f46e9a6 100644 --- a/src/Umbraco.Infrastructure/Persistence/Repositories/Implement/DataTypeRepository.cs +++ b/src/Umbraco.Infrastructure/Persistence/Repositories/Implement/DataTypeRepository.cs @@ -313,7 +313,7 @@ namespace Umbraco.Core.Persistence.Repositories.Implement private string EnsureUniqueNodeName(string nodeName, int id = 0) { - var template = SqlContext.Templates.Get("Umbraco.Core.DataTypeDefinitionRepository.EnsureUniqueNodeName", tsql => tsql + var template = SqlContext.Templates.Get(Constants.SqlTemplates.DataTypeRepository.EnsureUniqueNodeName, tsql => tsql .Select(x => Alias(x.NodeId, "id"), x => Alias(x.Text, "name")) .From() .Where(x => x.NodeObjectType == SqlTemplate.Arg("nodeObjectType"))); diff --git a/src/Umbraco.Infrastructure/Persistence/Repositories/Implement/RelationRepository.cs b/src/Umbraco.Infrastructure/Persistence/Repositories/Implement/RelationRepository.cs index 4299d50f15..80ca2edd11 100644 --- a/src/Umbraco.Infrastructure/Persistence/Repositories/Implement/RelationRepository.cs +++ b/src/Umbraco.Infrastructure/Persistence/Repositories/Implement/RelationRepository.cs @@ -314,17 +314,51 @@ namespace Umbraco.Core.Persistence.Repositories.Implement public void DeleteByParent(int parentId, params string[] relationTypeAliases) { - var subQuery = Sql().Select(x => x.Id) - .From() - .InnerJoin().On(x => x.RelationType, x => x.Id) - .Where(x => x.ParentId == parentId); - - if (relationTypeAliases.Length > 0) + if (Database.DatabaseType.IsSqlCe()) { - subQuery.WhereIn(x => x.Alias, relationTypeAliases); - } + var subQuery = Sql().Select(x => x.Id) + .From() + .InnerJoin().On(x => x.RelationType, x => x.Id) + .Where(x => x.ParentId == parentId); - Database.Execute(Sql().Delete().WhereIn(x => x.Id, subQuery)); + if (relationTypeAliases.Length > 0) + { + subQuery.WhereIn(x => x.Alias, relationTypeAliases); + } + + Database.Execute(Sql().Delete().WhereIn(x => x.Id, subQuery)); + + } + else + { + if (relationTypeAliases.Length > 0) + { + var template = SqlContext.Templates.Get( + Constants.SqlTemplates.RelationRepository.DeleteByParentIn, + tsql => Sql().Delete() + .From() + .InnerJoin().On(x => x.RelationType, x => x.Id) + .Where(x => x.ParentId == SqlTemplate.Arg("parentId")) + .WhereIn(x => x.Alias, SqlTemplate.ArgIn("relationTypeAliases"))); + + var sql = template.Sql(parentId, relationTypeAliases); + + Database.Execute(sql); + } + else + { + var template = SqlContext.Templates.Get( + Constants.SqlTemplates.RelationRepository.DeleteByParentAll, + tsql => Sql().Delete() + .From() + .InnerJoin().On(x => x.RelationType, x => x.Id) + .Where(x => x.ParentId == SqlTemplate.Arg("parentId"))); + + var sql = template.Sql(parentId); + + Database.Execute(sql); + } + } } /// diff --git a/src/Umbraco.Infrastructure/Persistence/UmbracoDatabase.cs b/src/Umbraco.Infrastructure/Persistence/UmbracoDatabase.cs index 37c47da50d..74aba854e3 100644 --- a/src/Umbraco.Infrastructure/Persistence/UmbracoDatabase.cs +++ b/src/Umbraco.Infrastructure/Persistence/UmbracoDatabase.cs @@ -2,14 +2,13 @@ using System.Collections.Generic; using System.Data; using System.Data.Common; -using System.Data.SqlClient; using System.Linq; using System.Text; using Microsoft.Extensions.Logging; using NPoco; using StackExchange.Profiling; +using Umbraco.Core.Migrations.Install; using Umbraco.Core.Persistence.FaultHandling; -using Umbraco.Core.Persistence.SqlSyntax; namespace Umbraco.Core.Persistence { @@ -25,6 +24,7 @@ namespace Umbraco.Core.Persistence { private readonly ILogger _logger; private readonly IBulkSqlInsertProvider _bulkSqlInsertProvider; + private readonly DatabaseSchemaCreatorFactory _databaseSchemaCreatorFactory; private readonly RetryPolicy _connectionRetryPolicy; private readonly RetryPolicy _commandRetryPolicy; private readonly Guid _instanceGuid = Guid.NewGuid(); @@ -39,13 +39,14 @@ namespace Umbraco.Core.Persistence /// Used by UmbracoDatabaseFactory to create databases. /// Also used by DatabaseBuilder for creating databases and installing/upgrading. /// - public UmbracoDatabase(string connectionString, ISqlContext sqlContext, DbProviderFactory provider, ILogger logger, IBulkSqlInsertProvider bulkSqlInsertProvider, RetryPolicy connectionRetryPolicy = null, RetryPolicy commandRetryPolicy = null) + public UmbracoDatabase(string connectionString, ISqlContext sqlContext, DbProviderFactory provider, ILogger logger, IBulkSqlInsertProvider bulkSqlInsertProvider, DatabaseSchemaCreatorFactory databaseSchemaCreatorFactory, RetryPolicy connectionRetryPolicy = null, RetryPolicy commandRetryPolicy = null) : base(connectionString, sqlContext.DatabaseType, provider, sqlContext.SqlSyntax.DefaultIsolationLevel) { SqlContext = sqlContext; _logger = logger; _bulkSqlInsertProvider = bulkSqlInsertProvider; + _databaseSchemaCreatorFactory = databaseSchemaCreatorFactory; _connectionRetryPolicy = connectionRetryPolicy; _commandRetryPolicy = commandRetryPolicy; @@ -177,7 +178,20 @@ namespace Umbraco.Core.Persistence } + /// + /// Returns the for the database + /// + public DatabaseSchemaResult ValidateSchema() + { + var dbSchema = _databaseSchemaCreatorFactory.Create(this); + var databaseSchemaValidationResult = dbSchema.ValidateSchema(); + return databaseSchemaValidationResult; + } + /// + /// Returns true if Umbraco database tables are detected to be installed + /// + public bool IsUmbracoInstalled() => ValidateSchema().DetermineHasInstalledVersion(); #endregion diff --git a/src/Umbraco.Infrastructure/Persistence/UmbracoDatabaseExtensions.cs b/src/Umbraco.Infrastructure/Persistence/UmbracoDatabaseExtensions.cs index 714721ef2c..204f904f68 100644 --- a/src/Umbraco.Infrastructure/Persistence/UmbracoDatabaseExtensions.cs +++ b/src/Umbraco.Infrastructure/Persistence/UmbracoDatabaseExtensions.cs @@ -1,6 +1,6 @@ using System; +using System.Linq; using Umbraco.Core.Persistence.Dtos; -using Umbraco.Core.Runtime; namespace Umbraco.Core.Persistence { @@ -27,5 +27,33 @@ namespace Umbraco.Core.Persistence .Where(x => x.Key == key); return database.FirstOrDefault(sql)?.Value; } + + + /// + /// Returns true if the database contains the specified table + /// + /// + /// + /// + public static bool HasTable(this IUmbracoDatabase database, string tableName) + { + try + { + return database.SqlContext.SqlSyntax.GetTablesInSchema(database).Any(table => table.InvariantEquals(tableName)); + } + catch (Exception) + { + return false; // will occur if the database cannot connect + } + } + + /// + /// Returns true if the database contains no tables + /// + /// + /// + public static bool IsDatabaseEmpty(this IUmbracoDatabase database) + => database.SqlContext.SqlSyntax.GetTablesInSchema(database).Any() == false; + } } diff --git a/src/Umbraco.Infrastructure/Persistence/UmbracoDatabaseFactory.cs b/src/Umbraco.Infrastructure/Persistence/UmbracoDatabaseFactory.cs index 5c3c984677..69c8975ed5 100644 --- a/src/Umbraco.Infrastructure/Persistence/UmbracoDatabaseFactory.cs +++ b/src/Umbraco.Infrastructure/Persistence/UmbracoDatabaseFactory.cs @@ -6,6 +6,7 @@ using Microsoft.Extensions.Options; using NPoco; using NPoco.FluentMappings; using Umbraco.Core.Configuration.Models; +using Umbraco.Core.Migrations.Install; using Umbraco.Core.Persistence.FaultHandling; using Umbraco.Core.Persistence.Mappers; using Umbraco.Core.Persistence.SqlSyntax; @@ -27,6 +28,7 @@ namespace Umbraco.Core.Persistence public class UmbracoDatabaseFactory : DisposableObjectSlim, IUmbracoDatabaseFactory { private readonly IDbProviderFactoryCreator _dbProviderFactoryCreator; + private readonly DatabaseSchemaCreatorFactory _databaseSchemaCreatorFactory; private readonly GlobalSettings _globalSettings; private readonly Lazy _mappers; private readonly ILogger _logger; @@ -70,8 +72,8 @@ namespace Umbraco.Core.Persistence /// Initializes a new instance of the . /// /// Used by core runtime. - public UmbracoDatabaseFactory(ILogger logger, ILoggerFactory loggerFactory, IOptions globalSettings, IOptions connectionStrings, Lazy mappers,IDbProviderFactoryCreator dbProviderFactoryCreator) - : this(logger, loggerFactory, globalSettings.Value, connectionStrings.Value, mappers, dbProviderFactoryCreator) + public UmbracoDatabaseFactory(ILogger logger, ILoggerFactory loggerFactory, IOptions globalSettings, IOptions connectionStrings, Lazy mappers,IDbProviderFactoryCreator dbProviderFactoryCreator, DatabaseSchemaCreatorFactory databaseSchemaCreatorFactory) + : this(logger, loggerFactory, globalSettings.Value, connectionStrings.Value, mappers, dbProviderFactoryCreator, databaseSchemaCreatorFactory) { } @@ -80,12 +82,13 @@ namespace Umbraco.Core.Persistence /// Initializes a new instance of the . /// /// Used by the other ctor and in tests. - public UmbracoDatabaseFactory(ILogger logger, ILoggerFactory loggerFactory, GlobalSettings globalSettings, ConnectionStrings connectionStrings, Lazy mappers, IDbProviderFactoryCreator dbProviderFactoryCreator) + public UmbracoDatabaseFactory(ILogger logger, ILoggerFactory loggerFactory, GlobalSettings globalSettings, ConnectionStrings connectionStrings, Lazy mappers, IDbProviderFactoryCreator dbProviderFactoryCreator, DatabaseSchemaCreatorFactory databaseSchemaCreatorFactory) { _globalSettings = globalSettings; _mappers = mappers ?? throw new ArgumentNullException(nameof(mappers)); _dbProviderFactoryCreator = dbProviderFactoryCreator ?? throw new ArgumentNullException(nameof(dbProviderFactoryCreator)); + _databaseSchemaCreatorFactory = databaseSchemaCreatorFactory ?? throw new ArgumentNullException(nameof(databaseSchemaCreatorFactory)); _logger = logger ?? throw new ArgumentNullException(nameof(logger)); _loggerFactory = loggerFactory; @@ -114,12 +117,13 @@ namespace Umbraco.Core.Persistence /// Initializes a new instance of the . /// /// Used in tests. - public UmbracoDatabaseFactory(ILogger logger, ILoggerFactory loggerFactory, string connectionString, string providerName, Lazy mappers, IDbProviderFactoryCreator dbProviderFactoryCreator) + public UmbracoDatabaseFactory(ILogger logger, ILoggerFactory loggerFactory, string connectionString, string providerName, Lazy mappers, IDbProviderFactoryCreator dbProviderFactoryCreator, DatabaseSchemaCreatorFactory databaseSchemaCreatorFactory) { _mappers = mappers ?? throw new ArgumentNullException(nameof(mappers)); _logger = logger ?? throw new ArgumentNullException(nameof(logger)); _loggerFactory = loggerFactory; _dbProviderFactoryCreator = dbProviderFactoryCreator ?? throw new ArgumentNullException(nameof(dbProviderFactoryCreator)); + _databaseSchemaCreatorFactory = databaseSchemaCreatorFactory ?? throw new ArgumentNullException(nameof(databaseSchemaCreatorFactory)); if (string.IsNullOrWhiteSpace(connectionString) || string.IsNullOrWhiteSpace(providerName)) { @@ -312,7 +316,7 @@ namespace Umbraco.Core.Persistence // method used by NPoco's UmbracoDatabaseFactory to actually create the database instance private UmbracoDatabase CreateDatabaseInstance() { - return new UmbracoDatabase(ConnectionString, SqlContext, DbProviderFactory, _loggerFactory.CreateLogger(), _bulkSqlInsertProvider, _connectionRetryPolicy, _commandRetryPolicy); + return new UmbracoDatabase(ConnectionString, SqlContext, DbProviderFactory, _loggerFactory.CreateLogger(), _bulkSqlInsertProvider, _databaseSchemaCreatorFactory, _connectionRetryPolicy, _commandRetryPolicy); } protected override void DisposeResources() diff --git a/src/Umbraco.Infrastructure/Runtime/CoreRuntime.cs b/src/Umbraco.Infrastructure/Runtime/CoreRuntime.cs index a05c1a7f98..de0be4ca25 100644 --- a/src/Umbraco.Infrastructure/Runtime/CoreRuntime.cs +++ b/src/Umbraco.Infrastructure/Runtime/CoreRuntime.cs @@ -78,6 +78,7 @@ namespace Umbraco.Infrastructure.Runtime AppDomain.CurrentDomain.SetData("DataDirectory", _hostingEnvironment?.MapPathContentRoot(Core.Constants.SystemDirectories.Data)); + DoUnattendedInstall(); DetermineRuntimeLevel(); if (State.Level <= RuntimeLevel.BootFailed) @@ -100,6 +101,11 @@ namespace Umbraco.Infrastructure.Runtime _components.Initialize(); } + private void DoUnattendedInstall() + { + State.DoUnattendedInstall(); + } + public async Task StopAsync(CancellationToken cancellationToken) { _components.Terminate(); diff --git a/src/Umbraco.Infrastructure/Runtime/SqlMainDomLock.cs b/src/Umbraco.Infrastructure/Runtime/SqlMainDomLock.cs index c73a817327..a150afa095 100644 --- a/src/Umbraco.Infrastructure/Runtime/SqlMainDomLock.cs +++ b/src/Umbraco.Infrastructure/Runtime/SqlMainDomLock.cs @@ -10,10 +10,12 @@ using Microsoft.Extensions.Logging; using NPoco; using Umbraco.Core.Configuration.Models; using Umbraco.Core.Hosting; +using Umbraco.Core.Migrations.Install; using Umbraco.Core.Persistence; using Umbraco.Core.Persistence.Dtos; using Umbraco.Core.Persistence.Mappers; using Umbraco.Core.Persistence.SqlSyntax; +using MapperCollection = Umbraco.Core.Persistence.Mappers.MapperCollection; namespace Umbraco.Core.Runtime { @@ -31,19 +33,21 @@ namespace Umbraco.Core.Runtime private readonly UmbracoDatabaseFactory _dbFactory; private bool _errorDuringAcquiring; private object _locker = new object(); + private bool _hasTable = false; - public SqlMainDomLock(ILogger logger, ILoggerFactory loggerFactory, GlobalSettings globalSettings, ConnectionStrings connectionStrings, IDbProviderFactoryCreator dbProviderFactoryCreator, IHostingEnvironment hostingEnvironment) + public SqlMainDomLock(ILogger logger, ILoggerFactory loggerFactory, GlobalSettings globalSettings, ConnectionStrings connectionStrings, IDbProviderFactoryCreator dbProviderFactoryCreator, IHostingEnvironment hostingEnvironment, DatabaseSchemaCreatorFactory databaseSchemaCreatorFactory) { // unique id for our appdomain, this is more unique than the appdomain id which is just an INT counter to its safer _lockId = Guid.NewGuid().ToString(); _logger = logger; - _hostingEnvironment = hostingEnvironment; +_hostingEnvironment = hostingEnvironment; _dbFactory = new UmbracoDatabaseFactory(loggerFactory.CreateLogger(), loggerFactory, globalSettings, connectionStrings, - new Lazy(() => new Persistence.Mappers.MapperCollection(Enumerable.Empty())), - dbProviderFactoryCreator); + new Lazy(() => new MapperCollection(Enumerable.Empty())), + dbProviderFactoryCreator, + databaseSchemaCreatorFactory); MainDomKey = MainDomKeyPrefix + "-" + (NetworkHelper.MachineName + MainDom.GetMainDomId(_hostingEnvironment)).GenerateHash(); } @@ -52,7 +56,7 @@ namespace Umbraco.Core.Runtime { if (!_dbFactory.Configured) { - // if we aren't configured, then we're in an install state, in which case we have no choice but to assume we can acquire + // if we aren't configured then we're in an install state, in which case we have no choice but to assume we can acquire return true; } @@ -72,6 +76,14 @@ namespace Umbraco.Core.Runtime try { db = _dbFactory.CreateDatabase(); + + _hasTable = db.HasTable(Constants.DatabaseSchema.Tables.KeyValue); + if (!_hasTable) + { + // the Db does not contain the required table, we must be in an install state we have no choice but to assume we can acquire + return true; + } + db.BeginTransaction(IsolationLevel.ReadCommitted); try @@ -176,11 +188,24 @@ namespace Umbraco.Core.Runtime _logger.LogDebug("Task canceled, exiting loop"); return; } - IUmbracoDatabase db = null; + try { db = _dbFactory.CreateDatabase(); + + if (!_hasTable) + { + // re-check if its still false, we don't want to re-query once we know its there since this + // loop needs to use minimal resources + _hasTable = db.HasTable(Constants.DatabaseSchema.Tables.KeyValue); + if (!_hasTable) + { + // the Db does not contain the required table, we just keep looping since we can't query the db + continue; + } + } + db.BeginTransaction(IsolationLevel.ReadCommitted); // get a read lock _sqlServerSyntax.ReadLock(db, Constants.Locks.MainDom); @@ -414,7 +439,7 @@ namespace Umbraco.Core.Runtime _cancellationTokenSource.Cancel(); _cancellationTokenSource.Dispose(); - if (_dbFactory.Configured) + if (_dbFactory.Configured && _hasTable) { IUmbracoDatabase db = null; try diff --git a/src/Umbraco.Infrastructure/RuntimeState.cs b/src/Umbraco.Infrastructure/RuntimeState.cs index 505cf045c3..8b5e0abdc0 100644 --- a/src/Umbraco.Infrastructure/RuntimeState.cs +++ b/src/Umbraco.Infrastructure/RuntimeState.cs @@ -6,6 +6,7 @@ using Microsoft.Extensions.Options; using Umbraco.Core.Configuration; using Umbraco.Core.Configuration.Models; using Umbraco.Core.Exceptions; +using Umbraco.Core.Migrations.Install; using Umbraco.Core.Migrations.Upgrade; using Umbraco.Core.Persistence; @@ -20,6 +21,7 @@ namespace Umbraco.Core private readonly IUmbracoVersion _umbracoVersion; private readonly IUmbracoDatabaseFactory _databaseFactory; private readonly ILogger _logger; + private readonly DatabaseSchemaCreatorFactory _databaseSchemaCreatorFactory; /// /// The initial @@ -33,12 +35,18 @@ namespace Umbraco.Core /// /// Initializes a new instance of the class. /// - public RuntimeState(IOptions globalSettings, IUmbracoVersion umbracoVersion, IUmbracoDatabaseFactory databaseFactory, ILogger logger) + public RuntimeState( + IOptions globalSettings, + IUmbracoVersion umbracoVersion, + IUmbracoDatabaseFactory databaseFactory, + ILogger logger, + DatabaseSchemaCreatorFactory databaseSchemaCreatorFactory) { _globalSettings = globalSettings.Value; _umbracoVersion = umbracoVersion; _databaseFactory = databaseFactory; _logger = logger; + _databaseSchemaCreatorFactory = databaseSchemaCreatorFactory; } @@ -79,9 +87,119 @@ namespace Umbraco.Core return; } - // else, keep going, - // anything other than install wants a database - see if we can connect - // (since this is an already existing database, assume localdb is ready) + // Check the database state, whether we can connect or if it's in an upgrade or empty state, etc... + + switch (GetUmbracoDatabaseState(_databaseFactory)) + { + case UmbracoDatabaseState.CannotConnect: + { + // cannot connect to configured database, this is bad, fail + _logger.LogDebug("Could not connect to database."); + + if (_globalSettings.InstallMissingDatabase) + { + // ok to install on a configured but missing database + Level = RuntimeLevel.Install; + Reason = RuntimeLevelReason.InstallMissingDatabase; + return; + } + + // else it is bad enough that we want to throw + Reason = RuntimeLevelReason.BootFailedCannotConnectToDatabase; + throw new BootFailedException("A connection string is configured but Umbraco could not connect to the database."); + } + case UmbracoDatabaseState.NotInstalled: + { + // ok to install on an empty database + Level = RuntimeLevel.Install; + Reason = RuntimeLevelReason.InstallEmptyDatabase; + return; + } + case UmbracoDatabaseState.NeedsUpgrade: + { + // the db version does not match... but we do have a migration table + // so, at least one valid table, so we quite probably are installed & need to upgrade + + // although the files version matches the code version, the database version does not + // which means the local files have been upgraded but not the database - need to upgrade + _logger.LogDebug("Has not reached the final upgrade step, need to upgrade Umbraco."); + Level = RuntimeLevel.Upgrade; + Reason = RuntimeLevelReason.UpgradeMigrations; + } + break; + case UmbracoDatabaseState.Ok: + default: + { + // if we already know we want to upgrade, exit here + if (Level == RuntimeLevel.Upgrade) + return; + + // the database version matches the code & files version, all clear, can run + Level = RuntimeLevel.Run; + Reason = RuntimeLevelReason.Run; + } + break; + } + } + + private enum UmbracoDatabaseState + { + Ok, + CannotConnect, + NotInstalled, + NeedsUpgrade + } + + private UmbracoDatabaseState GetUmbracoDatabaseState(IUmbracoDatabaseFactory databaseFactory) + { + try + { + if (!TryDbConnect(databaseFactory)) + { + return UmbracoDatabaseState.CannotConnect; + } + + // no scope, no service - just directly accessing the database + using (var database = databaseFactory.CreateDatabase()) + { + if (!database.IsUmbracoInstalled()) + { + return UmbracoDatabaseState.NotInstalled; + } + + if (DoesUmbracoRequireUpgrade(database)) + { + return UmbracoDatabaseState.NeedsUpgrade; + } + } + + return UmbracoDatabaseState.Ok; + } + catch (Exception e) + { + // can connect to the database so cannot check the upgrade state... oops + _logger.LogWarning(e, "Could not check the upgrade state."); + + // else it is bad enough that we want to throw + Reason = RuntimeLevelReason.BootFailedCannotCheckUpgradeState; + throw new BootFailedException("Could not check the upgrade state.", e); + } + } + + public void Configure(RuntimeLevel level, RuntimeLevelReason reason) + { + Level = level; + Reason = reason; + } + + public void DoUnattendedInstall() + { + // unattended install is not enabled + if (_globalSettings.InstallUnattended == false) return; + + // no connection string set + if (_databaseFactory.Configured == false) return; + var connect = false; var tries = _globalSettings.InstallMissingDatabase ? 2 : 5; for (var i = 0;;) @@ -92,79 +210,37 @@ namespace Umbraco.Core Thread.Sleep(1000); } - if (connect == false) - { - // cannot connect to configured database, this is bad, fail - _logger.LogDebug("Could not connect to database."); + // could not connect to the database + if (connect == false) return; - if (_globalSettings.InstallMissingDatabase) + using (var database = _databaseFactory.CreateDatabase()) + { + var hasUmbracoTables = database.IsUmbracoInstalled(); + + // database has umbraco tables, assume Umbraco is already installed + if (hasUmbracoTables) return; + + // all conditions fulfilled, do the install + _logger.LogInformation("Starting unattended install."); + + try { - // ok to install on a configured but missing database - Level = RuntimeLevel.Install; - Reason = RuntimeLevelReason.InstallMissingDatabase; - return; + database.BeginTransaction(); + var creator = _databaseSchemaCreatorFactory.Create(database); + creator.InitializeDatabaseSchema(); + database.CompleteTransaction(); + _logger.LogInformation("Unattended install completed."); } - - // else it is bad enough that we want to throw - Reason = RuntimeLevelReason.BootFailedCannotConnectToDatabase; - throw new BootFailedException("A connection string is configured but Umbraco could not connect to the database."); - } - - // if we already know we want to upgrade, - // still run EnsureUmbracoUpgradeState to get the states - // (v7 will just get a null state, that's ok) - - // else - // look for a matching migration entry - bypassing services entirely - they are not 'up' yet - bool noUpgrade; - try - { - noUpgrade = EnsureUmbracoUpgradeState(_databaseFactory, _logger); - } - catch (Exception e) - { - // can connect to the database but cannot check the upgrade state... oops - _logger.LogWarning(e, "Could not check the upgrade state."); - - if (_globalSettings.InstallEmptyDatabase) + catch (Exception ex) { - // ok to install on an empty database - Level = RuntimeLevel.Install; - Reason = RuntimeLevelReason.InstallEmptyDatabase; - return; + _logger.LogInformation(ex, "Error during unattended install."); + database.AbortTransaction(); + + throw new UnattendedInstallException( + "The database configuration failed with the following message: " + ex.Message + + "\n Please check log file for additional information (can be found in '/App_Data/Logs/')"); } - - // else it is bad enough that we want to throw - Reason = RuntimeLevelReason.BootFailedCannotCheckUpgradeState; - throw new BootFailedException("Could not check the upgrade state.", e); } - - // if we already know we want to upgrade, exit here - if (Level == RuntimeLevel.Upgrade) - return; - - if (noUpgrade) - { - // the database version matches the code & files version, all clear, can run - Level = RuntimeLevel.Run; - Reason = RuntimeLevelReason.Run; - return; - } - - // the db version does not match... but we do have a migration table - // so, at least one valid table, so we quite probably are installed & need to upgrade - - // although the files version matches the code version, the database version does not - // which means the local files have been upgraded but not the database - need to upgrade - _logger.LogDebug("Has not reached the final upgrade step, need to upgrade Umbraco."); - Level = RuntimeLevel.Upgrade; - Reason = RuntimeLevelReason.UpgradeMigrations; - } - - public void Configure(RuntimeLevel level, RuntimeLevelReason reason) - { - Level = level; - Reason = reason; } private bool EnsureUmbracoUpgradeState(IUmbracoDatabaseFactory databaseFactory, ILogger logger) @@ -183,5 +259,36 @@ namespace Umbraco.Core return CurrentMigrationState == FinalMigrationState; } + private bool DoesUmbracoRequireUpgrade(IUmbracoDatabase database) + { + var upgrader = new Upgrader(new UmbracoPlan(_umbracoVersion)); + var stateValueKey = upgrader.StateValueKey; + + CurrentMigrationState = database.GetFromKeyValueTable(stateValueKey); + FinalMigrationState = upgrader.Plan.FinalState; + + _logger.LogDebug("Final upgrade state is {FinalMigrationState}, database contains {DatabaseState}", FinalMigrationState, CurrentMigrationState ?? ""); + + return CurrentMigrationState != FinalMigrationState; + } + + private bool TryDbConnect(IUmbracoDatabaseFactory databaseFactory) + { + // anything other than install wants a database - see if we can connect + // (since this is an already existing database, assume localdb is ready) + bool canConnect; + var tries = _globalSettings.InstallMissingDatabase ? 2 : 5; + for (var i = 0; ;) + { + canConnect = databaseFactory.CanConnect; + if (canConnect || ++i == tries) break; + _logger.LogDebug("Could not immediately connect to database, trying again."); + Thread.Sleep(1000); + } + + return canConnect; + } + + } } diff --git a/src/Umbraco.Infrastructure/WebAssets/JsInitialize.js b/src/Umbraco.Infrastructure/WebAssets/JsInitialize.js index ea9e4620c8..d7ede6dfa6 100644 --- a/src/Umbraco.Infrastructure/WebAssets/JsInitialize.js +++ b/src/Umbraco.Infrastructure/WebAssets/JsInitialize.js @@ -35,6 +35,8 @@ 'lib/umbraco/NamespaceManager.js', 'lib/umbraco/LegacySpeechBubble.js', + 'js/utilities.js', + 'js/app.js', 'js/umbraco.resources.js', @@ -44,5 +46,5 @@ 'js/umbraco.interceptors.js', 'js/umbraco.controllers.js', 'js/routes.js', - 'js/init.js' + 'js/init.js' ] diff --git a/src/Umbraco.Infrastructure/WebAssets/PreviewInitialize.js b/src/Umbraco.Infrastructure/WebAssets/PreviewInitialize.js index 45ee39eefc..c19f99c02a 100644 --- a/src/Umbraco.Infrastructure/WebAssets/PreviewInitialize.js +++ b/src/Umbraco.Infrastructure/WebAssets/PreviewInitialize.js @@ -3,6 +3,7 @@ 'lib/angular/angular.js', 'lib/underscore/underscore-min.js', 'lib/umbraco/Extensions.js', + 'js/utilities.js', 'js/app.js', 'js/umbraco.resources.js', 'js/umbraco.services.js', diff --git a/src/Umbraco.Tests.Common/TestHelpers/TestDatabase.cs b/src/Umbraco.Tests.Common/TestHelpers/TestDatabase.cs index 303d534b98..3f388c8612 100644 --- a/src/Umbraco.Tests.Common/TestHelpers/TestDatabase.cs +++ b/src/Umbraco.Tests.Common/TestHelpers/TestDatabase.cs @@ -12,6 +12,7 @@ using Moq; using NPoco; using NPoco.DatabaseTypes; using NPoco.Linq; +using Umbraco.Core.Migrations.Install; using Umbraco.Core.Persistence; using Umbraco.Core.Persistence.SqlSyntax; @@ -112,6 +113,9 @@ namespace Umbraco.Tests.Testing public int SqlCount { get; } public int BulkInsertRecords(IEnumerable records) => throw new NotImplementedException(); + public bool IsUmbracoInstalled() => true; + + public DatabaseSchemaResult ValidateSchema() => throw new NotImplementedException(); public DbParameter CreateParameter() => throw new NotImplementedException(); diff --git a/src/Umbraco.Tests.Integration/Testing/TestUmbracoDatabaseFactoryProvider.cs b/src/Umbraco.Tests.Integration/Testing/TestUmbracoDatabaseFactoryProvider.cs index 3eb70331b1..9b27f4cfba 100644 --- a/src/Umbraco.Tests.Integration/Testing/TestUmbracoDatabaseFactoryProvider.cs +++ b/src/Umbraco.Tests.Integration/Testing/TestUmbracoDatabaseFactoryProvider.cs @@ -5,6 +5,7 @@ using System; using Microsoft.Extensions.Logging; using Microsoft.Extensions.Options; using Umbraco.Core.Configuration.Models; +using Umbraco.Core.Migrations.Install; using Umbraco.Core.Persistence; using Umbraco.Core.Persistence.Mappers; @@ -21,19 +22,22 @@ namespace Umbraco.Tests.Integration.Testing private readonly IOptions _connectionStrings; private readonly Lazy _mappers; private readonly IDbProviderFactoryCreator _dbProviderFactoryCreator; + private readonly DatabaseSchemaCreatorFactory _databaseSchemaCreatorFactory; public TestUmbracoDatabaseFactoryProvider( ILoggerFactory loggerFactory, IOptions globalSettings, IOptions connectionStrings, Lazy mappers, - IDbProviderFactoryCreator dbProviderFactoryCreator) + IDbProviderFactoryCreator dbProviderFactoryCreator, + DatabaseSchemaCreatorFactory databaseSchemaCreatorFactory) { _loggerFactory = loggerFactory; _globalSettings = globalSettings; _connectionStrings = connectionStrings; _mappers = mappers; _dbProviderFactoryCreator = dbProviderFactoryCreator; + _databaseSchemaCreatorFactory = databaseSchemaCreatorFactory; } public IUmbracoDatabaseFactory Create() @@ -45,7 +49,8 @@ namespace Umbraco.Tests.Integration.Testing _globalSettings.Value, _connectionStrings.Value, _mappers, - _dbProviderFactoryCreator); + _dbProviderFactoryCreator, + _databaseSchemaCreatorFactory); } } } diff --git a/src/Umbraco.Tests.Integration/Testing/UmbracoIntegrationTest.cs b/src/Umbraco.Tests.Integration/Testing/UmbracoIntegrationTest.cs index 80416f063e..ca62668493 100644 --- a/src/Umbraco.Tests.Integration/Testing/UmbracoIntegrationTest.cs +++ b/src/Umbraco.Tests.Integration/Testing/UmbracoIntegrationTest.cs @@ -109,7 +109,7 @@ namespace Umbraco.Tests.Integration.Testing [SetUp] public virtual void Setup() { - InMemoryConfiguration[Constants.Configuration.ConfigGlobal + ":" + nameof(GlobalSettings.InstallEmptyDatabase)] = "true"; + InMemoryConfiguration[Constants.Configuration.ConfigGlobal + ":" + nameof(GlobalSettings.InstallUnattended)] = "true"; IHostBuilder hostBuilder = CreateHostBuilder(); IHost host = hostBuilder.Build(); diff --git a/src/Umbraco.Tests.Integration/Umbraco.Infrastructure/Persistence/Repositories/ContentTypeRepositoryTest.cs b/src/Umbraco.Tests.Integration/Umbraco.Infrastructure/Persistence/Repositories/ContentTypeRepositoryTest.cs index b297594e2d..69441fd649 100644 --- a/src/Umbraco.Tests.Integration/Umbraco.Infrastructure/Persistence/Repositories/ContentTypeRepositoryTest.cs +++ b/src/Umbraco.Tests.Integration/Umbraco.Infrastructure/Persistence/Repositories/ContentTypeRepositoryTest.cs @@ -20,6 +20,7 @@ using Umbraco.Tests.Common.Builders; using Umbraco.Tests.Integration.Testing; using Umbraco.Tests.Testing; using Umbraco.Web.Models.ContentEditing; +using Content = Umbraco.Core.Models.Content; namespace Umbraco.Tests.Integration.Umbraco.Infrastructure.Persistence.Repositories { @@ -43,6 +44,7 @@ namespace Umbraco.Tests.Integration.Umbraco.Infrastructure.Persistence.Repositor private IMediaTypeRepository MediaTypeRepository => GetRequiredService(); private IDocumentRepository DocumentRepository => GetRequiredService(); + private IContentService ContentService => GetRequiredService(); private ContentTypeRepository ContentTypeRepository => (ContentTypeRepository)GetRequiredService(); @@ -945,5 +947,87 @@ namespace Umbraco.Tests.Integration.Umbraco.Infrastructure.Persistence.Repositor Assert.That(result2, Is.True); } } + + [Test] + public void Can_Update_Variation_Of_Element_Type_Property() + { + var provider = ScopeProvider; + using (var scope = provider.CreateScope()) + { + ContentTypeRepository repository = ContentTypeRepository; + var contentRepository = DocumentRepository; + + // Create elementType + var elementType = new ContentType(ShortStringHelper, -1) + { + Alias = "elementType", + Name = "Element type", + Description = "Element type to use as compositions", + Icon = ".sprTreeDoc3", + Thumbnail = "doc.png", + SortOrder = 1, + CreatorId = 0, + Trashed = false, + IsElement = true, + Variations = ContentVariation.Nothing + }; + + var contentCollection = new PropertyTypeCollection(true); + contentCollection.Add(new PropertyType(ShortStringHelper, "test", ValueStorageType.Ntext) + { + Alias = "title", + Name = "Title", + Description = "", + Mandatory = false, + SortOrder = 1, + DataTypeId = Constants.DataTypes.Textbox, + LabelOnTop = true, + Variations = ContentVariation.Nothing + }); + elementType.PropertyGroups.Add(new PropertyGroup(contentCollection) {Name = "Content", SortOrder = 1}); + elementType.ResetDirtyProperties(false); + elementType.SetDefaultTemplate(new Template(ShortStringHelper, "ElementType", "elementType")); + repository.Save(elementType); + + // Create the basic "home" doc type that uses element type as comp + var docType = new ContentType(ShortStringHelper, -1) + { + Alias = "home", + Name = "Home", + Description = "Home containing elementType", + Icon = ".sprTreeDoc3", + Thumbnail = "doc.png", + SortOrder = 1, + CreatorId = 0, + Trashed = false, + Variations = ContentVariation.Nothing + }; + var comp = new List(); + comp.Add(elementType); + docType.ContentTypeComposition = comp; + repository.Save(docType); + + // Create "home" content + var content = new Content("Home", -1, docType){Level = 1, SortOrder = 1, CreatorId = 0, WriterId = 0}; + object obj = new {title = "test title"}; + content.PropertyValues(obj); + content.ResetDirtyProperties(false); + contentRepository.Save(content); + + // Update variation on element type + elementType.Variations = ContentVariation.Culture; + elementType.PropertyTypes.First().Variations = ContentVariation.Culture; + repository.Save(elementType); + + // Update variation on doc type + docType.Variations = ContentVariation.Culture; + repository.Save(docType); + + // Re fetch renewedContent and make sure that the culture has been set. + var renewedContent = ContentService.GetById(content.Id); + var hasCulture = renewedContent.Properties["title"].Values.First().Culture != null; + Assert.That(hasCulture, Is.True); + } + } } } diff --git a/src/Umbraco.Tests.Integration/Umbraco.Infrastructure/Services/ContentTypeServiceVariantsTests.cs b/src/Umbraco.Tests.Integration/Umbraco.Infrastructure/Services/ContentTypeServiceVariantsTests.cs index 54120236e5..3671287da7 100644 --- a/src/Umbraco.Tests.Integration/Umbraco.Infrastructure/Services/ContentTypeServiceVariantsTests.cs +++ b/src/Umbraco.Tests.Integration/Umbraco.Infrastructure/Services/ContentTypeServiceVariantsTests.cs @@ -1048,7 +1048,7 @@ namespace Umbraco.Tests.Integration.Umbraco.Infrastructure.Services Console.WriteLine(GetJson(document.Id)); AssertJsonStartsWith( document.Id, - "{'pd':{'value11':[{'c':'en','v':'v11en'},{'c':'fr','v':'v11fr'}],'value12':[{'v':'v12'}],'value21':[{'v':'v21en'}],'value22':[{'v':'v22'}]},'cd':"); + "{'pd':{'value11':[{'c':'fr','v':'v11fr'},{'c':'en','v':'v11en'}],'value12':[{'v':'v12'}],'value21':[{'v':'v21en'}],'value22':[{'v':'v22'}]},'cd':"); composed.PropertyTypes.First(x => x.Alias == "value21").Variations = ContentVariation.Culture; ContentTypeService.Save(composed); @@ -1057,7 +1057,7 @@ namespace Umbraco.Tests.Integration.Umbraco.Infrastructure.Services Console.WriteLine(GetJson(document.Id)); AssertJsonStartsWith( document.Id, - "{'pd':{'value11':[{'c':'en','v':'v11en'},{'c':'fr','v':'v11fr'}],'value12':[{'v':'v12'}],'value21':[{'c':'fr','v':'v21fr'},{'c':'en','v':'v21en'}],'value22':[{'v':'v22'}]},'cd':"); + "{'pd':{'value11':[{'c':'fr','v':'v11fr'},{'c':'en','v':'v11en'}],'value12':[{'v':'v12'}],'value21':[{'c':'fr','v':'v21fr'},{'c':'en','v':'v21en'}],'value22':[{'v':'v22'}]},'cd':"); composing.Variations = ContentVariation.Nothing; ContentTypeService.Save(composing); @@ -1177,7 +1177,7 @@ namespace Umbraco.Tests.Integration.Umbraco.Infrastructure.Services Console.WriteLine(GetJson(document1.Id)); AssertJsonStartsWith( document1.Id, - "{'pd':{'value11':[{'c':'en','v':'v11en'},{'c':'fr','v':'v11fr'}],'value12':[{'v':'v12'}],'value21':[{'v':'v21en'}],'value22':[{'v':'v22'}]},'cd':"); + "{'pd':{'value11':[{'c':'fr','v':'v11fr'},{'c':'en','v':'v11en'}],'value12':[{'v':'v12'}],'value21':[{'v':'v21en'}],'value22':[{'v':'v22'}]},'cd':"); Console.WriteLine(GetJson(document2.Id)); AssertJsonStartsWith( @@ -1191,7 +1191,7 @@ namespace Umbraco.Tests.Integration.Umbraco.Infrastructure.Services Console.WriteLine(GetJson(document1.Id)); AssertJsonStartsWith( document1.Id, - "{'pd':{'value11':[{'c':'en','v':'v11en'},{'c':'fr','v':'v11fr'}],'value12':[{'v':'v12'}],'value21':[{'c':'fr','v':'v21fr'},{'c':'en','v':'v21en'}],'value22':[{'v':'v22'}]},'cd':"); + "{'pd':{'value11':[{'c':'fr','v':'v11fr'},{'c':'en','v':'v11en'}],'value12':[{'v':'v12'}],'value21':[{'c':'fr','v':'v21fr'},{'c':'en','v':'v21en'}],'value22':[{'v':'v22'}]},'cd':"); Console.WriteLine(GetJson(document2.Id)); AssertJsonStartsWith( diff --git a/src/Umbraco.Tests.UnitTests/Umbraco.Core/Components/ComponentTests.cs b/src/Umbraco.Tests.UnitTests/Umbraco.Core/Components/ComponentTests.cs index 7e43eb4b83..a57b9b34fa 100644 --- a/src/Umbraco.Tests.UnitTests/Umbraco.Core/Components/ComponentTests.cs +++ b/src/Umbraco.Tests.UnitTests/Umbraco.Core/Components/ComponentTests.cs @@ -15,11 +15,13 @@ using NUnit.Framework; using Umbraco.Core; using Umbraco.Core.Cache; using Umbraco.Core.Composing; +using Umbraco.Core.Configuration; using Umbraco.Core.Configuration.Models; using Umbraco.Core.DependencyInjection; using Umbraco.Core.Hosting; using Umbraco.Core.IO; using Umbraco.Core.Logging; +using Umbraco.Core.Migrations.Install; using Umbraco.Core.Persistence; using Umbraco.Core.Persistence.Mappers; using Umbraco.Core.Scoping; @@ -43,7 +45,8 @@ namespace Umbraco.Tests.UnitTests.Umbraco.Core.Components ILogger logger = loggerFactory.CreateLogger("GenericLogger"); var globalSettings = new GlobalSettings(); var connectionStrings = new ConnectionStrings(); - var f = new UmbracoDatabaseFactory(loggerFactory.CreateLogger(), loggerFactory, Options.Create(globalSettings), Options.Create(connectionStrings), new Lazy(() => new MapperCollection(Enumerable.Empty())), TestHelper.DbProviderFactoryCreator); + var f = new UmbracoDatabaseFactory(loggerFactory.CreateLogger(), loggerFactory, Options.Create(globalSettings), Options.Create(connectionStrings), new Lazy(() => new MapperCollection(Enumerable.Empty())), TestHelper.DbProviderFactoryCreator, + new DatabaseSchemaCreatorFactory(loggerFactory.CreateLogger(), loggerFactory, new UmbracoVersion())); var fs = new FileSystems(mock.Object, loggerFactory.CreateLogger(), loggerFactory, IOHelper, Options.Create(globalSettings), Mock.Of()); var coreDebug = new CoreDebugSettings(); IMediaFileSystem mediaFileSystem = Mock.Of(); diff --git a/src/Umbraco.Tests.UnitTests/Umbraco.Tests.UnitTests.csproj b/src/Umbraco.Tests.UnitTests/Umbraco.Tests.UnitTests.csproj index 1e774f4b00..88ff4a67ce 100644 --- a/src/Umbraco.Tests.UnitTests/Umbraco.Tests.UnitTests.csproj +++ b/src/Umbraco.Tests.UnitTests/Umbraco.Tests.UnitTests.csproj @@ -30,4 +30,12 @@ + + + + + + + + diff --git a/src/Umbraco.Tests/Models/RangeTests.cs b/src/Umbraco.Tests/Models/RangeTests.cs new file mode 100644 index 0000000000..3fb4e8708b --- /dev/null +++ b/src/Umbraco.Tests/Models/RangeTests.cs @@ -0,0 +1,179 @@ +using System.Globalization; +using NUnit.Framework; +using Umbraco.Core.Models; + +namespace Umbraco.Tests.Models +{ + [TestFixture] + public class RangeTests + { + [TestCase(0, 0, "0,0")] + [TestCase(0, 1, "0,1")] + [TestCase(1, 1, "1,1")] + public void RangeInt32_ToString(int minimum, int maximum, string expected) + { + Assert.AreEqual(expected, new Range() + { + Minimum = minimum, + Maximum = maximum + }.ToString()); + } + + [TestCase(0, 0.5, "0,0.5")] + [TestCase(0.5, 0.5, "0.5,0.5")] + [TestCase(0.5, 1, "0.5,1")] + public void RangeDouble_ToString(double minimum, double maximum, string expected) + { + Assert.AreEqual(expected, new Range() + { + Minimum = minimum, + Maximum = maximum + }.ToString()); + } + + [TestCase(0, 0, "0")] + [TestCase(0, 1, "0,1")] + [TestCase(1, 1, "1")] + public void RangeInt32_ToStringFormatRange(int minimum, int maximum, string expected) + { + Assert.AreEqual(expected, new Range() + { + Minimum = minimum, + Maximum = maximum + }.ToString("{0}", "{0},{1}", CultureInfo.InvariantCulture)); + } + + [TestCase(0, 0.5, "0,0.5")] + [TestCase(0.5, 0.5, "0.5")] + [TestCase(0.5, 1, "0.5,1")] + public void RangeDouble_ToStringFormatRange(double minimum, double maximum, string expected) + { + Assert.AreEqual(expected, new Range() + { + Minimum = minimum, + Maximum = maximum + }.ToString("{0}", "{0},{1}", CultureInfo.InvariantCulture)); + } + + [TestCase(0, 0, "0,0")] + [TestCase(0, 1, "0,1")] + [TestCase(1, 1, "1,1")] + public void RangeInt32_ToStringFormat(int minimum, int maximum, string expected) + { + Assert.AreEqual(expected, new Range() + { + Minimum = minimum, + Maximum = maximum + }.ToString("{0},{1}", CultureInfo.InvariantCulture)); + } + + [TestCase(0, 0.5, "0,0.5")] + [TestCase(0.5, 0.5, "0.5,0.5")] + [TestCase(0.5, 1, "0.5,1")] + public void RangeDouble_ToStringFormat(double minimum, double maximum, string expected) + { + Assert.AreEqual(expected, new Range() + { + Minimum = minimum, + Maximum = maximum + }.ToString("{0},{1}", CultureInfo.InvariantCulture)); + } + + [TestCase(0, 0, true)] + [TestCase(0, 1, true)] + [TestCase(-1, 1, true)] + [TestCase(1, 0, false)] + [TestCase(0, -1, false)] + public void RangeInt32_IsValid(int minimum, int maximum, bool expected) + { + Assert.AreEqual(expected, new Range() + { + Minimum = minimum, + Maximum = maximum + }.IsValid()); + } + + [TestCase(0, 0, 0, true)] + [TestCase(0, 1, 0, true)] + [TestCase(0, 1, 1, true)] + [TestCase(-1, 1, 0, true)] + [TestCase(0, 0, 1, false)] + [TestCase(0, 0, -1, false)] + public void RangeInt32_ContainsValue(int minimum, int maximum, int value, bool expected) + { + Assert.AreEqual(expected, new Range() + { + Minimum = minimum, + Maximum = maximum + }.ContainsValue(value)); + } + + [TestCase(0, 0, 0, 0, true)] + [TestCase(0, 1, 0, 1, true)] + [TestCase(0, 1, 1, 1, false)] + [TestCase(-1, 1, 0, 0, false)] + [TestCase(0, 0, 1, 1, false)] + [TestCase(0, 0, -1, 1, true)] + public void RangeInt32_IsInsideRange(int minimum1, int maximum1, int minimum2, int maximum2, bool expected) + { + Assert.AreEqual(expected, new Range() + { + Minimum = minimum1, + Maximum = maximum1 + }.IsInsideRange(new Range() + { + Minimum = minimum2, + Maximum = maximum2 + })); + } + + [TestCase(0, 0, 0, 0, true)] + [TestCase(0, 1, 0, 1, true)] + [TestCase(0, 1, 1, 1, true)] + [TestCase(-1, 1, 0, 0, true)] + [TestCase(0, 0, 1, 1, false)] + [TestCase(0, 0, -1, 1, false)] + public void RangeInt32_ContainsRange(int minimum1, int maximum1, int minimum2, int maximum2, bool expected) + { + Assert.AreEqual(expected, new Range() + { + Minimum = minimum1, + Maximum = maximum1 + }.ContainsRange(new Range() + { + Minimum = minimum2, + Maximum = maximum2 + })); + } + + [TestCase(0, 0, 0, 0, true)] + [TestCase(0, 1, 0, 1, true)] + [TestCase(0, 1, 1, 1, false)] + [TestCase(0, 0, 1, 1, false)] + public void RangeInt32_Equals(int minimum1, int maximum1, int minimum2, int maximum2, bool expected) + { + Assert.AreEqual(expected, new Range() + { + Minimum = minimum1, + Maximum = maximum1 + }.Equals(new Range() + { + Minimum = minimum2, + Maximum = maximum2 + })); + } + + [TestCase(0, 0, 0, 0, true)] + [TestCase(0, 1, 0, 1, true)] + [TestCase(0, 1, 1, 1, false)] + [TestCase(0, 0, 1, 1, false)] + public void RangeInt32_EqualsValues(int minimum1, int maximum1, int minimum2, int maximum2, bool expected) + { + Assert.AreEqual(expected, new Range() + { + Minimum = minimum1, + Maximum = maximum1 + }.Equals(minimum2, maximum2)); + } + } +} diff --git a/src/Umbraco.Tests/Persistence/FaultHandling/ConnectionRetryTest.cs b/src/Umbraco.Tests/Persistence/FaultHandling/ConnectionRetryTest.cs index fd3b525039..5409b1d493 100644 --- a/src/Umbraco.Tests/Persistence/FaultHandling/ConnectionRetryTest.cs +++ b/src/Umbraco.Tests/Persistence/FaultHandling/ConnectionRetryTest.cs @@ -21,7 +21,7 @@ namespace Umbraco.Tests.Persistence.FaultHandling { const string connectionString = @"server=.\SQLEXPRESS;database=EmptyForTest;user id=x;password=umbraco"; const string providerName = Constants.DbProviderNames.SqlServer; - var factory = new UmbracoDatabaseFactory(Mock.Of>(), NullLoggerFactory.Instance, connectionString, providerName, new Lazy(() => Mock.Of()), TestHelper.DbProviderFactoryCreator); + var factory = new UmbracoDatabaseFactory(Mock.Of>(), NullLoggerFactory.Instance, connectionString, providerName, new Lazy(() => Mock.Of()), TestHelper.DbProviderFactoryCreator, TestHelper.DatabaseSchemaCreatorFactory); using (var database = factory.CreateDatabase()) { @@ -35,7 +35,7 @@ namespace Umbraco.Tests.Persistence.FaultHandling { const string connectionString = @"server=.\SQLEXPRESS;database=EmptyForTest;user id=umbraco;password=umbraco"; const string providerName = Constants.DbProviderNames.SqlServer; - var factory = new UmbracoDatabaseFactory(Mock.Of>(), NullLoggerFactory.Instance, connectionString, providerName, new Lazy(() => Mock.Of()), TestHelper.DbProviderFactoryCreator); + var factory = new UmbracoDatabaseFactory(Mock.Of>(), NullLoggerFactory.Instance, connectionString, providerName, new Lazy(() => Mock.Of()), TestHelper.DbProviderFactoryCreator, TestHelper.DatabaseSchemaCreatorFactory); using (var database = factory.CreateDatabase()) { diff --git a/src/Umbraco.Tests/TestHelpers/TestHelper.cs b/src/Umbraco.Tests/TestHelpers/TestHelper.cs index 8c89905c97..8a3d4a6297 100644 --- a/src/Umbraco.Tests/TestHelpers/TestHelper.cs +++ b/src/Umbraco.Tests/TestHelpers/TestHelper.cs @@ -37,9 +37,11 @@ using File = System.IO.File; using Umbraco.Tests.Common.Builders; using Microsoft.Extensions.Options; using Microsoft.Extensions.Logging; +using Microsoft.Extensions.Logging.Abstractions; using Umbraco.Core.Configuration.Models; using Umbraco.Core.DependencyInjection; using Umbraco.Core.Mail; +using Umbraco.Core.Migrations.Install; namespace Umbraco.Tests.TestHelpers { @@ -59,6 +61,7 @@ namespace Umbraco.Tests.TestHelpers } public override IDbProviderFactoryCreator DbProviderFactoryCreator { get; } = new UmbracoDbProviderFactoryCreator(); + public DatabaseSchemaCreatorFactory DatabaseSchemaCreatorFactory { get; } = new DatabaseSchemaCreatorFactory(Mock.Of>(), NullLoggerFactory.Instance, new UmbracoVersion()); public override IBulkSqlInsertProvider BulkSqlInsertProvider { get; } = new SqlCeBulkSqlInsertProvider(); @@ -99,6 +102,7 @@ namespace Umbraco.Tests.TestHelpers public static IJsonSerializer JsonSerializer => _testHelperInternal.JsonSerializer; public static IVariationContextAccessor VariationContextAccessor => _testHelperInternal.VariationContextAccessor; public static IDbProviderFactoryCreator DbProviderFactoryCreator => _testHelperInternal.DbProviderFactoryCreator; + public static DatabaseSchemaCreatorFactory DatabaseSchemaCreatorFactory => _testHelperInternal.DatabaseSchemaCreatorFactory; public static IBulkSqlInsertProvider BulkSqlInsertProvider => _testHelperInternal.BulkSqlInsertProvider; public static IMarchal Marchal => _testHelperInternal.Marchal; public static CoreDebugSettings CoreDebugSettings => _testHelperInternal.CoreDebugSettings; diff --git a/src/Umbraco.Tests/TestHelpers/TestObjects.cs b/src/Umbraco.Tests/TestHelpers/TestObjects.cs index 3b17861fb3..21c66f8922 100644 --- a/src/Umbraco.Tests/TestHelpers/TestObjects.cs +++ b/src/Umbraco.Tests/TestHelpers/TestObjects.cs @@ -10,6 +10,7 @@ using Umbraco.Core.Cache; using Umbraco.Core.Configuration; using Umbraco.Core.Configuration.Models; using Umbraco.Core.IO; +using Umbraco.Core.Migrations.Install; using Umbraco.Core.Persistence; using Umbraco.Core.Persistence.Mappers; using Umbraco.Core.Persistence.SqlSyntax; @@ -78,7 +79,8 @@ namespace Umbraco.Tests.TestHelpers globalSettings, connectionStrings, new Lazy(() => mappers), - TestHelper.DbProviderFactoryCreator); + TestHelper.DbProviderFactoryCreator, + new DatabaseSchemaCreatorFactory(Mock.Of>(),loggerFactory, new UmbracoVersion())); } fileSystems ??= new FileSystems(Current.Factory, loggerFactory.CreateLogger(), loggerFactory, TestHelper.IOHelper, Options.Create(globalSettings), TestHelper.GetHostingEnvironment()); diff --git a/src/Umbraco.Tests/TestHelpers/TestWithDatabaseBase.cs b/src/Umbraco.Tests/TestHelpers/TestWithDatabaseBase.cs index b47da98709..f8a6e132a9 100644 --- a/src/Umbraco.Tests/TestHelpers/TestWithDatabaseBase.cs +++ b/src/Umbraco.Tests/TestHelpers/TestWithDatabaseBase.cs @@ -91,7 +91,7 @@ namespace Umbraco.Tests.TestHelpers return TestObjects.GetDatabaseFactoryMock(); var lazyMappers = new Lazy(f.GetRequiredService); - var factory = new UmbracoDatabaseFactory(f.GetRequiredService>(), f.GetRequiredService(), GetDbConnectionString(), GetDbProviderName(), lazyMappers, TestHelper.DbProviderFactoryCreator); + var factory = new UmbracoDatabaseFactory(f.GetRequiredService>(), f.GetRequiredService(), GetDbConnectionString(), GetDbProviderName(), lazyMappers, TestHelper.DbProviderFactoryCreator, f.GetRequiredService()); return factory; }); } diff --git a/src/Umbraco.Tests/Testing/UmbracoTestBase.cs b/src/Umbraco.Tests/Testing/UmbracoTestBase.cs index 433ef1de02..78f9fc3013 100644 --- a/src/Umbraco.Tests/Testing/UmbracoTestBase.cs +++ b/src/Umbraco.Tests/Testing/UmbracoTestBase.cs @@ -31,6 +31,7 @@ using Umbraco.Core.Mail; using Umbraco.Core.Manifest; using Umbraco.Core.Mapping; using Umbraco.Core.Media; +using Umbraco.Core.Migrations.Install; using Umbraco.Core.Models.PublishedContent; using Umbraco.Core.Persistence; using Umbraco.Core.Persistence.Mappers; @@ -487,7 +488,8 @@ namespace Umbraco.Tests.Testing globalSettings, connectionStrings, new Lazy(f.GetRequiredService), - TestHelper.DbProviderFactoryCreator)); + TestHelper.DbProviderFactoryCreator, + new DatabaseSchemaCreatorFactory(LoggerFactory.CreateLogger(), LoggerFactory, UmbracoVersion))); Builder.Services.AddUnique(f => f.GetService().SqlContext); diff --git a/src/Umbraco.Tests/Umbraco.Tests.csproj b/src/Umbraco.Tests/Umbraco.Tests.csproj index fe9d41f681..d84908062d 100644 --- a/src/Umbraco.Tests/Umbraco.Tests.csproj +++ b/src/Umbraco.Tests/Umbraco.Tests.csproj @@ -117,6 +117,12 @@ + + + + + + @@ -145,6 +151,8 @@ + + @@ -306,9 +314,6 @@ - - - $(NuGetPackageFolders.Split(';')[0]) diff --git a/src/Umbraco.Web.BackOffice/Controllers/BackOfficeServerVariables.cs b/src/Umbraco.Web.BackOffice/Controllers/BackOfficeServerVariables.cs index 07f20e1e03..066f6e3463 100644 --- a/src/Umbraco.Web.BackOffice/Controllers/BackOfficeServerVariables.cs +++ b/src/Umbraco.Web.BackOffice/Controllers/BackOfficeServerVariables.cs @@ -91,7 +91,7 @@ namespace Umbraco.Web.BackOffice.Controllers var keepOnlyKeys = new Dictionary { {"umbracoUrls", new[] {"authenticationApiBaseUrl", "serverVarsJs", "externalLoginsUrl", "currentUserApiBaseUrl", "previewHubUrl"}}, - {"umbracoSettings", new[] {"allowPasswordReset", "imageFileTypes", "maxFileSize", "loginBackgroundImage", "canSendRequiredEmail", "usernameIsEmail"}}, + {"umbracoSettings", new[] {"allowPasswordReset", "imageFileTypes", "maxFileSize", "loginBackgroundImage", "loginLogoImage", "canSendRequiredEmail", "usernameIsEmail"}}, {"application", new[] {"applicationPath", "cacheBuster"}}, {"isDebuggingEnabled", new string[] { }}, {"features", new [] {"disabledFeatures"}} @@ -394,6 +394,7 @@ namespace Umbraco.Web.BackOffice.Controllers {"cssPath", _hostingEnvironment.ToAbsolute(globalSettings.UmbracoCssPath).TrimEnd('/')}, {"allowPasswordReset", _securitySettings.AllowPasswordReset}, {"loginBackgroundImage", _contentSettings.LoginBackgroundImage}, + {"loginLogoImage", _contentSettings.LoginLogoImage }, {"showUserInvite", EmailSender.CanSendRequiredEmail(globalSettings)}, {"canSendRequiredEmail", EmailSender.CanSendRequiredEmail(globalSettings)}, {"showAllowSegmentationForDocumentTypes", false}, diff --git a/src/Umbraco.Web.BackOffice/Controllers/ContentController.cs b/src/Umbraco.Web.BackOffice/Controllers/ContentController.cs index 52273b92ee..eb7cf7e411 100644 --- a/src/Umbraco.Web.BackOffice/Controllers/ContentController.cs +++ b/src/Umbraco.Web.BackOffice/Controllers/ContentController.cs @@ -738,7 +738,7 @@ namespace Umbraco.Web.BackOffice.Controllers //The default validation language will be either: The default languauge, else if the content is brand new and the default culture is // not marked to be saved, it will be the first culture in the list marked for saving. - var defaultCulture = _allLangs.Value.Values.FirstOrDefault(x => x.IsDefault)?.CultureName; + var defaultCulture = _allLangs.Value.Values.FirstOrDefault(x => x.IsDefault)?.IsoCode; var cultureForInvariantErrors = CultureImpact.GetCultureForInvariantErrors( contentItem.PersistedContent, contentItem.Variants.Where(x => x.Save).Select(x => x.Culture).ToArray(), diff --git a/src/Umbraco.Web.BackOffice/Controllers/ContentTypeControllerBase.cs b/src/Umbraco.Web.BackOffice/Controllers/ContentTypeControllerBase.cs index f5934a9583..fe22523ebd 100644 --- a/src/Umbraco.Web.BackOffice/Controllers/ContentTypeControllerBase.cs +++ b/src/Umbraco.Web.BackOffice/Controllers/ContentTypeControllerBase.cs @@ -71,7 +71,7 @@ namespace Umbraco.Web.BackOffice.Controllers /// be looked up via the db, they need to be passed in. /// /// - /// Wether the composite content types should be applicable for an element type + /// Whether the composite content types should be applicable for an element type /// protected ActionResult>> PerformGetAvailableCompositeContentTypes(int contentTypeId, UmbracoObjectTypes type, diff --git a/src/Umbraco.Web.BackOffice/Controllers/PreviewController.cs b/src/Umbraco.Web.BackOffice/Controllers/PreviewController.cs index 0405012898..eec088478f 100644 --- a/src/Umbraco.Web.BackOffice/Controllers/PreviewController.cs +++ b/src/Umbraco.Web.BackOffice/Controllers/PreviewController.cs @@ -4,6 +4,7 @@ using Microsoft.AspNetCore.Mvc.ViewEngines; using Microsoft.Extensions.Options; using System; using System.IO; +using System.Linq; using System.Threading.Tasks; using Umbraco.Core; using Umbraco.Core.Configuration; @@ -43,6 +44,7 @@ namespace Umbraco.Web.BackOffice.Controllers private readonly ICookieManager _cookieManager; private readonly IRuntimeMinifier _runtimeMinifier; private readonly ICompositeViewEngine _viewEngines; + private readonly IUmbracoContextAccessor _umbracoContextAccessor; public PreviewController( UmbracoFeatures features, @@ -53,7 +55,8 @@ namespace Umbraco.Web.BackOffice.Controllers IHostingEnvironment hostingEnvironment, ICookieManager cookieManager, IRuntimeMinifier runtimeMinifier, - ICompositeViewEngine viewEngines) + ICompositeViewEngine viewEngines, + IUmbracoContextAccessor umbracoContextAccessor) { _features = features; _globalSettings = globalSettings.Value; @@ -64,14 +67,22 @@ namespace Umbraco.Web.BackOffice.Controllers _cookieManager = cookieManager; _runtimeMinifier = runtimeMinifier; _viewEngines = viewEngines; + _umbracoContextAccessor = umbracoContextAccessor; } [Authorize(Policy = AuthorizationPolicies.BackOfficeAccessWithoutApproval)] [DisableBrowserCache] - public ActionResult Index() + public ActionResult Index(int? id = null) { var availableLanguages = _localizationService.GetAllLanguages(); + if (id.HasValue) + { + var content = _umbracoContextAccessor.UmbracoContext.Content.GetById(true, id.Value); + if (content is null) + return NotFound(); + availableLanguages = availableLanguages.Where(language => content.Cultures.ContainsKey(language.IsoCode)); + } var model = new BackOfficePreviewModel(_features, availableLanguages); if (model.PreviewExtendedHeaderView.IsNullOrWhiteSpace() == false) @@ -90,6 +101,7 @@ namespace Umbraco.Web.BackOffice.Controllers return View(viewPath, model); } + /// /// Returns the JavaScript file for preview /// diff --git a/src/Umbraco.Web.BackOffice/Controllers/UsersController.cs b/src/Umbraco.Web.BackOffice/Controllers/UsersController.cs index 5e84b7cd65..b543146f19 100644 --- a/src/Umbraco.Web.BackOffice/Controllers/UsersController.cs +++ b/src/Umbraco.Web.BackOffice/Controllers/UsersController.cs @@ -1,10 +1,12 @@ using System; using System.Collections.Generic; +using System.Globalization; using System.IO; using System.Linq; using System.Net; using System.Runtime.Serialization; using System.Security.Cryptography; +using System.Threading; using System.Threading.Tasks; using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Http; @@ -664,7 +666,16 @@ namespace Umbraco.Web.BackOffice.Controllers var display = _umbracoMapper.Map(user); - display.AddSuccessNotification(_localizedTextService.Localize("speechBubbles/operationSavedHeader"), _localizedTextService.Localize("speechBubbles/editUserSaved")); + // determine if the user has changed their own language; + var currentUser = _backofficeSecurityAccessor.BackOfficeSecurity.CurrentUser; + var userHasChangedOwnLanguage = + user.Id == currentUser.Id && currentUser.Language != user.Language; + + var textToLocalise = userHasChangedOwnLanguage ? "speechBubbles/operationSavedHeaderReloadUser" : "speechBubbles/operationSavedHeader"; + var culture = userHasChangedOwnLanguage + ? CultureInfo.GetCultureInfo(user.Language) + : Thread.CurrentThread.CurrentUICulture; + display.AddSuccessNotification(_localizedTextService.Localize(textToLocalise, culture), _localizedTextService.Localize("speechBubbles/editUserSaved", culture)); return display; } diff --git a/src/Umbraco.Web.Common/DependencyInjection/UmbracoBuilderExtensions.cs b/src/Umbraco.Web.Common/DependencyInjection/UmbracoBuilderExtensions.cs index 58a0690bfc..289e251bb3 100644 --- a/src/Umbraco.Web.Common/DependencyInjection/UmbracoBuilderExtensions.cs +++ b/src/Umbraco.Web.Common/DependencyInjection/UmbracoBuilderExtensions.cs @@ -25,6 +25,7 @@ using Umbraco.Core.Diagnostics; using Umbraco.Core.Events; using Umbraco.Core.Hosting; using Umbraco.Core.Logging; +using Umbraco.Core.Migrations.Install; using Umbraco.Core.Persistence; using Umbraco.Core.Persistence.SqlSyntax; using Umbraco.Core.Security; @@ -125,7 +126,7 @@ namespace Umbraco.Web.Common.DependencyInjection // Add supported databases builder.AddUmbracoSqlServerSupport(); builder.AddUmbracoSqlCeSupport(); - + builder.Services.AddUnique(); // Must be added here because DbProviderFactories is netstandard 2.1 so cannot exist in Infra for now builder.Services.AddSingleton(factory => new DbProviderFactoryCreator( diff --git a/src/Umbraco.Web.Common/Extensions/ApplicationBuilderExtensions.cs b/src/Umbraco.Web.Common/Extensions/ApplicationBuilderExtensions.cs index 73682ca6c5..eb33451e0b 100644 --- a/src/Umbraco.Web.Common/Extensions/ApplicationBuilderExtensions.cs +++ b/src/Umbraco.Web.Common/Extensions/ApplicationBuilderExtensions.cs @@ -60,6 +60,7 @@ namespace Umbraco.Extensions app.UseRouting(); app.UseAuthentication(); app.UseAuthorization(); + // This must come after auth because the culture is based on the auth'd user app.UseRequestLocalization(); diff --git a/src/Umbraco.Web.UI.Client/gulp/tasks/dependencies.js b/src/Umbraco.Web.UI.Client/gulp/tasks/dependencies.js index 179faeb843..e8336b2177 100644 --- a/src/Umbraco.Web.UI.Client/gulp/tasks/dependencies.js +++ b/src/Umbraco.Web.UI.Client/gulp/tasks/dependencies.js @@ -30,14 +30,17 @@ function dependencies() { "./node_modules/ace-builds/src-min-noconflict/snippets/javascript.js", "./node_modules/ace-builds/src-min-noconflict/snippets/css.js", "./node_modules/ace-builds/src-min-noconflict/snippets/json.js", + "./node_modules/ace-builds/src-min-noconflict/snippets/xml.js", "./node_modules/ace-builds/src-min-noconflict/theme-chrome.js", "./node_modules/ace-builds/src-min-noconflict/mode-razor.js", "./node_modules/ace-builds/src-min-noconflict/mode-javascript.js", "./node_modules/ace-builds/src-min-noconflict/mode-css.js", + "./node_modules/ace-builds/src-min-noconflict/mode-json.js", + "./node_modules/ace-builds/src-min-noconflict/mode-xml.js", "./node_modules/ace-builds/src-min-noconflict/worker-javascript.js", "./node_modules/ace-builds/src-min-noconflict/worker-css.js", - "./node_modules/ace-builds/src-min-noconflict/mode-json.js", - "./node_modules/ace-builds/src-min-noconflict/worker-json.js" + "./node_modules/ace-builds/src-min-noconflict/worker-json.js", + "./node_modules/ace-builds/src-min-noconflict/worker-xml.js" ], "base": "./node_modules/ace-builds" }, diff --git a/src/Umbraco.Web.UI.Client/src/common/directives/components/application/umblogin.directive.js b/src/Umbraco.Web.UI.Client/src/common/directives/components/application/umblogin.directive.js index ea8602214d..392199738b 100644 --- a/src/Umbraco.Web.UI.Client/src/common/directives/components/application/umblogin.directive.js +++ b/src/Umbraco.Web.UI.Client/src/common/directives/components/application/umblogin.directive.js @@ -57,6 +57,7 @@ vm.denyLocalLogin = externalLoginInfoService.hasDenyLocalLogin(); vm.externalLoginInfo = externalLoginInfo; vm.resetPasswordCodeInfo = resetPasswordCodeInfo; + vm.logoImage = Umbraco.Sys.ServerVariables.umbracoSettings.loginLogoImage; vm.backgroundImage = Umbraco.Sys.ServerVariables.umbracoSettings.loginBackgroundImage; vm.usernameIsEmail = Umbraco.Sys.ServerVariables.umbracoSettings.usernameIsEmail; diff --git a/src/Umbraco.Web.UI.Client/src/common/directives/components/umbaceeditor.directive.js b/src/Umbraco.Web.UI.Client/src/common/directives/components/umbaceeditor.directive.js index 10fc44c2c6..070ffd4ddd 100644 --- a/src/Umbraco.Web.UI.Client/src/common/directives/components/umbaceeditor.directive.js +++ b/src/Umbraco.Web.UI.Client/src/common/directives/components/umbaceeditor.directive.js @@ -126,7 +126,7 @@ // Load in ace library assetsService.load(['lib/ace-builds/src-min-noconflict/ace.js', 'lib/ace-builds/src-min-noconflict/ext-language_tools.js'], scope).then(function () { - if (angular.isUndefined(window.ace)) { + if (Utilities.isUndefined(window.ace)) { throw new Error('ui-ace need ace to work... (o rly?)'); } else { // init editor diff --git a/src/Umbraco.Web.UI.Client/src/common/directives/components/umbcolorpicker.directive.js b/src/Umbraco.Web.UI.Client/src/common/directives/components/umbcolorpicker.directive.js index e45fb174b8..b8731c9c51 100644 --- a/src/Umbraco.Web.UI.Client/src/common/directives/components/umbcolorpicker.directive.js +++ b/src/Umbraco.Web.UI.Client/src/common/directives/components/umbcolorpicker.directive.js @@ -5,7 +5,7 @@ @scope @description -Added in Umbraco v. 8.8: Use this directive to render a color picker. +Added in Umbraco v. 8.10: Use this directive to render a color picker.

Markup example

diff --git a/src/Umbraco.Web.UI.Client/src/common/directives/components/umbcolorswatches.directive.js b/src/Umbraco.Web.UI.Client/src/common/directives/components/umbcolorswatches.directive.js
index 9d7927f59a..d6eda76940 100644
--- a/src/Umbraco.Web.UI.Client/src/common/directives/components/umbcolorswatches.directive.js
+++ b/src/Umbraco.Web.UI.Client/src/common/directives/components/umbcolorswatches.directive.js
@@ -30,15 +30,15 @@ Use this directive to generate color swatches to pick from.
         function link(scope, el, attr, ctrl) {
 
             // Set default to true if not defined
-            if (angular.isUndefined(scope.useColorClass)) {
+            if (Utilities.isUndefined(scope.useColorClass)) {
                 scope.useColorClass = false;
             }
 
             // Set default to "btn" if not defined
-            if (angular.isUndefined(scope.colorClassNamePrefix)) {
+            if (Utilities.isUndefined(scope.colorClassNamePrefix)) {
                 scope.colorClassNamePrefix = "btn";
             }
-            
+
             scope.setColor = function (color, $index, $event) {
                 if (scope.onSelect) {
                     // did the value change?
diff --git a/src/Umbraco.Web.UI.Client/src/common/directives/validation/showvalidationonsubmit.directive.js b/src/Umbraco.Web.UI.Client/src/common/directives/validation/showvalidationonsubmit.directive.js
index 78dd00e64b..ad646748b7 100644
--- a/src/Umbraco.Web.UI.Client/src/common/directives/validation/showvalidationonsubmit.directive.js
+++ b/src/Umbraco.Web.UI.Client/src/common/directives/validation/showvalidationonsubmit.directive.js
@@ -11,6 +11,7 @@
             link: function (scope, element, attr, ctrl) {
 
                 var formMgr = ctrl.length > 1 ? ctrl[1] : null;
+                const hiddenClass = 'ng-hide';
 
                 //We can either get the form submitted status by the parent directive valFormManager
                 //or we can check upwards in the DOM for the css class... lets try both :)
@@ -18,17 +19,17 @@
                 //reset the status.
                 var submitted = element.closest(".show-validation").length > 0 || (formMgr && formMgr.showValidation);
                 if (!submitted) {
-                    element.hide();
+                    element[0].classList.add(hiddenClass);
                 }
 
                 var unsubscribe = [];
 
                 unsubscribe.push(scope.$on("formSubmitting", function (ev, args) {
-                    element.show();
+                    element[0].classList.remove(hiddenClass);
                 }));
 
                 unsubscribe.push(scope.$on("formSubmitted", function (ev, args) {
-                    element.hide();
+                    element[0].classList.add(hiddenClass);
                 }));
 
                 //no isolate scope to listen to element destroy
diff --git a/src/Umbraco.Web.UI.Client/src/common/filters/umbCmsJoinArray.filter.js b/src/Umbraco.Web.UI.Client/src/common/filters/umbCmsJoinArray.filter.js
index a519f81054..870e497541 100644
--- a/src/Umbraco.Web.UI.Client/src/common/filters/umbCmsJoinArray.filter.js
+++ b/src/Umbraco.Web.UI.Client/src/common/filters/umbCmsJoinArray.filter.js
@@ -13,7 +13,7 @@
  */
 angular.module("umbraco.filters").filter('umbCmsJoinArray', function () {
     return function join(array, separator, prop) {
-        return (!angular.isUndefined(prop) ? array.map(function (item) {
+        return (!Utilities.isUndefined(prop) ? array.map(function (item) {
             return item[prop];
         }) : array).join(separator || '');
     };
diff --git a/src/Umbraco.Web.UI.Client/src/common/filters/umbwordlimit.filter.js b/src/Umbraco.Web.UI.Client/src/common/filters/umbwordlimit.filter.js
index 93f0bddc96..bd597b21d0 100644
--- a/src/Umbraco.Web.UI.Client/src/common/filters/umbwordlimit.filter.js
+++ b/src/Umbraco.Web.UI.Client/src/common/filters/umbwordlimit.filter.js
@@ -17,7 +17,7 @@
                 return collection;
             }
 
-            if (angular.isUndefined(property)) {
+            if (Utilities.isUndefined(property)) {
                 return collection;
             }
 
diff --git a/src/Umbraco.Web.UI.Client/src/common/resources/auth.resource.js b/src/Umbraco.Web.UI.Client/src/common/resources/auth.resource.js
index 7dc34c3b5a..78fefc8db5 100644
--- a/src/Umbraco.Web.UI.Client/src/common/resources/auth.resource.js
+++ b/src/Umbraco.Web.UI.Client/src/common/resources/auth.resource.js
@@ -12,7 +12,24 @@
 function authResource($q, $http, umbRequestHelper, angularHelper) {
 
   return {
-
+     /**
+     * @ngdoc method
+     * @name umbraco.resources.authResource#get2FAProviders
+     * @methodOf umbraco.resources.authResource
+     *
+     * @description
+     * Logs the Umbraco backoffice user in if the credentials are good
+     *
+     * ##usage
+     * 
+     * authResource.get2FAProviders()
+     *    .then(function(data) {
+     *        //Do stuff ...
+     *    });
+     * 
+ * @returns {Promise} resourcePromise object + * + */ get2FAProviders: function () { return umbRequestHelper.resourcePromise( @@ -23,6 +40,25 @@ function authResource($q, $http, umbRequestHelper, angularHelper) { 'Could not retrive two factor provider info'); }, + /** + * @ngdoc method + * @name umbraco.resources.authResource#get2FAProviders + * @methodOf umbraco.resources.authResource + * + * @description + * Generate the two-factor authentication code for the provider and send it to the user + * + * ##usage + *
+    * authResource.send2FACode(provider)
+    *    .then(function(data) {
+    *        //Do stuff ...
+    *    });
+    * 
+ * @param {string} provider Name of the provider + * @returns {Promise} resourcePromise object + * + */ send2FACode: function (provider) { return umbRequestHelper.resourcePromise( @@ -34,6 +70,26 @@ function authResource($q, $http, umbRequestHelper, angularHelper) { 'Could not send code'); }, + /** + * @ngdoc method + * @name umbraco.resources.authResource#get2FAProviders + * @methodOf umbraco.resources.authResource + * + * @description + * Verify the two-factor authentication code entered by the user against the provider + * + * ##usage + *
+    * authResource.verify2FACode(provider, code)
+    *    .then(function(data) {
+    *        //Do stuff ...
+    *    });
+    * 
+ * @param {string} provider Name of the provider + * @param {string} code The two-factor authentication code + * @returns {Promise} resourcePromise object + * + */ verify2FACode: function (provider, code) { return umbRequestHelper.resourcePromise( diff --git a/src/Umbraco.Web.UI.Client/src/common/resources/contenttype.resource.js b/src/Umbraco.Web.UI.Client/src/common/resources/contenttype.resource.js index 4a8c65c322..c5a353d746 100644 --- a/src/Umbraco.Web.UI.Client/src/common/resources/contenttype.resource.js +++ b/src/Umbraco.Web.UI.Client/src/common/resources/contenttype.resource.js @@ -7,6 +7,25 @@ function contentTypeResource($q, $http, umbRequestHelper, umbDataFormatter, loca return { + /** + * @ngdoc method + * @name umbraco.resources.contentTypeResource#getCount + * @methodOf umbraco.resources.contentTypeResource + * + * @description + * Gets the count of content types + * + * ##usage + *
+        * contentTypeResource.getCount()
+        *    .then(function(data) {
+        *        console.log(data);
+        *    });
+        * 
+ * + * @returns {Promise} resourcePromise object. + * + */ getCount: function () { return umbRequestHelper.resourcePromise( $http.get( @@ -16,6 +35,29 @@ function contentTypeResource($q, $http, umbRequestHelper, umbDataFormatter, loca 'Failed to retrieve count'); }, + /** + * @ngdoc method + * @name umbraco.resources.contentTypeResource#getAvailableCompositeContentTypes + * @methodOf umbraco.resources.contentTypeResource + * + * @description + * Gets the compositions for a content type + * + * ##usage + *
+        * contentTypeResource.getAvailableCompositeContentTypes()
+        *    .then(function(data) {
+        *        console.log(data);
+        *    });
+        * 
+ * + * @param {Int} contentTypeId id of the content type to retrieve the list of the compositions + * @param {Array} filterContentTypes array of content types to filter out + * @param {Array} filterPropertyTypes array of property aliases to filter out. If specified any content types with the property aliases will be filtered out + * @param {Boolean} isElement whether the composite content types should be applicable for an element type + * @returns {Promise} resourcePromise object. + * + */ getAvailableCompositeContentTypes: function (contentTypeId, filterContentTypes, filterPropertyTypes, isElement) { if (!filterContentTypes) { filterContentTypes = []; @@ -86,6 +128,7 @@ function contentTypeResource($q, $http, umbRequestHelper, umbDataFormatter, loca * $scope.type = type; * }); *
+ * * @param {Int} contentTypeId id of the content item to retrive allowed child types for * @returns {Promise} resourcePromise object. * @@ -110,6 +153,14 @@ function contentTypeResource($q, $http, umbRequestHelper, umbDataFormatter, loca * @description * Returns a list of defined property type aliases * + * ##usage + *
+         * contentTypeResource.getAllPropertyTypeAliases()
+         *    .then(function(array) {
+         *       Do stuff...
+         *    });
+         * 
+ * * @returns {Promise} resourcePromise object. * */ @@ -123,6 +174,25 @@ function contentTypeResource($q, $http, umbRequestHelper, umbDataFormatter, loca 'Failed to retrieve property type aliases'); }, + /** + * @ngdoc method + * @name umbraco.resources.contentTypeResource#getAllStandardFields + * @methodOf umbraco.resources.contentTypeResource + * + * @description + * Returns a list of standard property type aliases + * + * ##usage + *
+        * contentTypeResource.getAllStandardFields()
+        *    .then(function(array) {
+        *       Do stuff...
+        *    });
+        * 
+ * + * @returns {Promise} resourcePromise object. + * + */ getAllStandardFields: function () { return umbRequestHelper.resourcePromise( @@ -133,6 +203,26 @@ function contentTypeResource($q, $http, umbRequestHelper, umbDataFormatter, loca 'Failed to retrieve standard fields'); }, + /** + * @ngdoc method + * @name umbraco.resources.contentTypeResource#getPropertyTypeScaffold + * @methodOf umbraco.resources.contentTypeResource + * + * @description + * Returns the property display for a given datatype id + * + * ##usage + *
+        * contentTypeResource.getPropertyTypeScaffold(1234)
+        *    .then(function(array) {
+        *       Do stuff...
+        *    });
+        * 
+ * + * @param {Int} id the id of the datatype + * @returns {Promise} resourcePromise object. + * + */ getPropertyTypeScaffold: function (id) { return umbRequestHelper.resourcePromise( $http.get( @@ -143,6 +233,26 @@ function contentTypeResource($q, $http, umbRequestHelper, umbDataFormatter, loca 'Failed to retrieve property type scaffold'); }, + /** + * @ngdoc method + * @name umbraco.resources.contentTypeResource#getById + * @methodOf umbraco.resources.contentTypeResource + * + * @description + * Get the content type with a given id + * + * ##usage + *
+        * contentTypeResource.getById("64058D0F-4911-4AB7-B3BA-000D89F00A26")
+        *    .then(function(array) {
+        *       Do stuff...
+        *    });
+        * 
+ * + * @param {String} id the guid id of the content type + * @returns {Promise} resourcePromise object. + * + */ getById: function (id) { return umbRequestHelper.resourcePromise( @@ -154,6 +264,26 @@ function contentTypeResource($q, $http, umbRequestHelper, umbDataFormatter, loca 'Failed to retrieve content type'); }, + /** + * @ngdoc method + * @name umbraco.resources.contentTypeResource#deleteById + * @methodOf umbraco.resources.contentTypeResource + * + * @description + * Delete the content type of a given id + * + * ##usage + *
+        * contentTypeResource.deleteById(1234)
+        *    .then(function(array) {
+        *       Do stuff...
+        *    });
+        * 
+ * + * @param {Int} id the id of the content type + * @returns {Promise} resourcePromise object. + * + */ deleteById: function (id) { return umbRequestHelper.resourcePromise( @@ -165,6 +295,26 @@ function contentTypeResource($q, $http, umbRequestHelper, umbDataFormatter, loca 'Failed to delete content type'); }, + /** + * @ngdoc method + * @name umbraco.resources.contentTypeResource#deleteContainerById + * @methodOf umbraco.resources.contentTypeResource + * + * @description + * Delete the content type container of a given id + * + * ##usage + *
+        * contentTypeResource.deleteContainerById(1234)
+        *    .then(function(array) {
+        *       Do stuff...
+        *    });
+        * 
+ * + * @param {Int} id the id of the content type container + * @returns {Promise} resourcePromise object. + * + */ deleteContainerById: function (id) { return umbRequestHelper.resourcePromise( @@ -177,16 +327,16 @@ function contentTypeResource($q, $http, umbRequestHelper, umbDataFormatter, loca }, /** - * @ngdoc method - * @name umbraco.resources.contentTypeResource#getAll - * @methodOf umbraco.resources.contentTypeResource - * - * @description - * Returns a list of all content types - * - * @returns {Promise} resourcePromise object. - * - */ + * @ngdoc method + * @name umbraco.resources.contentTypeResource#getAll + * @methodOf umbraco.resources.contentTypeResource + * + * @description + * Returns a list of all content types + * + * @returns {Promise} resourcePromise object. + * + */ getAll: function () { return umbRequestHelper.resourcePromise( @@ -197,6 +347,26 @@ function contentTypeResource($q, $http, umbRequestHelper, umbDataFormatter, loca 'Failed to retrieve all content types'); }, + /** + * @ngdoc method + * @name umbraco.resources.contentTypeResource#getScaffold + * @methodOf umbraco.resources.contentTypeResource + * + * @description + * Returns an empty content type for use as a scaffold when creating a new content type + * + * ##usage + *
+        * contentTypeResource.getScaffold(1234)
+        *    .then(function(array) {
+        *       Do stuff...
+        *    });
+        * 
+ * + * @param {Int} id the parent id + * @returns {Promise} resourcePromise object. + * + */ getScaffold: function (parentId) { return umbRequestHelper.resourcePromise( @@ -240,14 +410,14 @@ function contentTypeResource($q, $http, umbRequestHelper, umbDataFormatter, loca *
          * contentTypeResource.move({ parentId: 1244, id: 123 })
          *    .then(function() {
-         *        alert("node was moved");
+         *        alert("content type was moved");
          *    }, function(err){
-         *      alert("node didnt move:" + err.data.Message);
+         *      alert("content type didnt move:" + err.data.Message);
          *    });
          * 
* @param {Object} args arguments object - * @param {Int} args.idd the ID of the node to move - * @param {Int} args.parentId the ID of the parent node to move to + * @param {Int} args.id the ID of the content type to move + * @param {Int} args.parentId the ID of the parent content type to move to * @returns {Promise} resourcePromise object. * */ @@ -271,6 +441,29 @@ function contentTypeResource($q, $http, umbRequestHelper, umbDataFormatter, loca 'Failed to move content'); }, + /** + * @ngdoc method + * @name umbraco.resources.contentTypeResource#copy + * @methodOf umbraco.resources.contentTypeResource + * + * @description + * Copied a content type underneath a new parentId + * + * ##usage + *
+         * contentTypeResource.copy({ parentId: 1244, id: 123 })
+         *    .then(function() {
+         *        alert("content type was copied");
+         *    }, function(err){
+         *      alert("content type didnt copy:" + err.data.Message);
+         *    });
+         * 
+ * @param {Object} args arguments object + * @param {Int} args.id the ID of the content type to copy + * @param {Int} args.parentId the ID of the parent content type to copy to + * @returns {Promise} resourcePromise object. + * + */ copy: function (args) { if (!args) { throw "args cannot be null"; @@ -291,6 +484,27 @@ function contentTypeResource($q, $http, umbRequestHelper, umbDataFormatter, loca 'Failed to copy content'); }, + /** + * @ngdoc method + * @name umbraco.resources.contentTypeResource#createContainer + * @methodOf umbraco.resources.contentTypeResource + * + * @description + * Create a new content type container of a given name underneath a given parent item + * + * ##usage + *
+        * contentTypeResource.createContainer(1244,"testcontainer")
+        *    .then(function() {
+        *       Do stuff..
+        *    });
+        * 
+ * + * @param {Int} parentId the ID of the parent content type underneath which to create the container + * @param {String} name the name of the container + * @returns {Promise} resourcePromise object. + * + */ createContainer: function (parentId, name) { return umbRequestHelper.resourcePromise( @@ -299,6 +513,32 @@ function contentTypeResource($q, $http, umbRequestHelper, umbDataFormatter, loca }, + /** + * @ngdoc method + * @name umbraco.resources.contentTypeResource#createCollection + * @methodOf umbraco.resources.contentTypeResource + * + * @description + * Create a collection of a content types + * + * ##usage + *
+        * contentTypeResource.createCollection(1244,"testcollectionname",true,"collectionItemName",true,"icon-name","icon-name")
+        *    .then(function() {
+        *       Do stuff..
+        *    });
+        * 
+ * + * @param {Int} parentId the ID of the parent content type underneath which to create the collection + * @param {String} collectionName the name of the collection + * @param {Boolean} collectionCreateTemplate true/false to specify whether to create a default template for the collection + * @param {String} collectionItemName the name of the collection item + * @param {Boolean} collectionItemCreateTemplate true/false to specify whether to create a default template for the collection item + * @param {String} collectionIcon the icon for the collection + * @param {String} collectionItemIcon the icon for the collection item + * @returns {Promise} resourcePromise object. + * + */ createCollection: function (parentId, collectionName, collectionCreateTemplate, collectionItemName, collectionItemCreateTemplate, collectionIcon, collectionItemIcon) { return umbRequestHelper.resourcePromise( @@ -307,6 +547,27 @@ function contentTypeResource($q, $http, umbRequestHelper, umbDataFormatter, loca }, + /** + * @ngdoc method + * @name umbraco.resources.contentTypeResource#renameContainer + * @methodOf umbraco.resources.contentTypeResource + * + * @description + * Rename a container of a given id + * + * ##usage + *
+        * contentTypeResource.renameContainer( 1244,"testcontainer")
+        *    .then(function() {
+        *       Do stuff..
+        *    });
+        * 
+ * + * @param {Int} id the ID of the container to rename + * @param {String} name the new name of the container + * @returns {Promise} resourcePromise object. + * + */ renameContainer: function (id, name) { return umbRequestHelper.resourcePromise( @@ -318,6 +579,27 @@ function contentTypeResource($q, $http, umbRequestHelper, umbDataFormatter, loca }, + /** + * @ngdoc method + * @name umbraco.resources.contentTypeResource#export + * @methodOf umbraco.resources.contentTypeResource + * + * @description + * Export a content type of a given id. + * + * ##usage + *
+        * contentTypeResource.export(1234){
+        *    .then(function() {
+        *       Do stuff..
+        *    });
+        * 
+ * + * @param {Int} id the ID of the container to rename + * @param {String} name the new name of the container + * @returns {Promise} resourcePromise object. + * + */ export: function (id) { if (!id) { throw "id cannot be null"; @@ -336,6 +618,26 @@ function contentTypeResource($q, $http, umbRequestHelper, umbDataFormatter, loca }); }, + /** + * @ngdoc method + * @name umbraco.resources.contentTypeResource#import + * @methodOf umbraco.resources.contentTypeResource + * + * @description + * Import a content type from a file + * + * ##usage + *
+        * contentTypeResource.import("path to file"){
+        *    .then(function() {
+        *       Do stuff..
+        *    });
+        * 
+ * + * @param {String} file path of the file to import + * @returns {Promise} resourcePromise object. + * + */ import: function (file) { if (!file) { throw "file cannot be null"; @@ -347,12 +649,52 @@ function contentTypeResource($q, $http, umbRequestHelper, umbDataFormatter, loca ); }, + /** + * @ngdoc method + * @name umbraco.resources.contentTypeResource#createDefaultTemplate + * @methodOf umbraco.resources.contentTypeResource + * + * @description + * Create a default template for a content type with a given id + * + * ##usage + *
+        * contentTypeResource.createDefaultTemplate(1234){
+        *    .then(function() {
+        *       Do stuff..
+        *    });
+        * 
+ * + * @param {Int} id the id of the content type for which to create the default template + * @returns {Promise} resourcePromise object. + * + */ createDefaultTemplate: function (id) { return umbRequestHelper.resourcePromise( $http.post(umbRequestHelper.getApiUrl("contentTypeApiBaseUrl", "PostCreateDefaultTemplate", { id: id })), 'Failed to create default template for content type with id ' + id); }, + /** + * @ngdoc method + * @name umbraco.resources.contentTypeResource#hasContentNodes + * @methodOf umbraco.resources.contentTypeResource + * + * @description + * Returns whether a content type has content nodes + * + * ##usage + *
+        * contentTypeResource.hasContentNodes(1234){
+        *    .then(function() {
+        *       Do stuff..
+        *    });
+        * 
+ * + * @param {Int} id the id of the content type + * @returns {Promise} resourcePromise object. + * + */ hasContentNodes: function (id) { return umbRequestHelper.resourcePromise( $http.get( diff --git a/src/Umbraco.Web.UI.Client/src/common/resources/elementtype.resource.js b/src/Umbraco.Web.UI.Client/src/common/resources/elementtype.resource.js index acc0a94485..b097a65447 100644 --- a/src/Umbraco.Web.UI.Client/src/common/resources/elementtype.resource.js +++ b/src/Umbraco.Web.UI.Client/src/common/resources/elementtype.resource.js @@ -7,6 +7,25 @@ function elementTypeResource($q, $http, umbRequestHelper) { return { + /** + * @ngdoc method + * @name umbraco.resources.elementTypeResource#getAll + * @methodOf umbraco.resources.elementTypeResource + * + * @description + * Gets a list of all element types + * + * ##usage + *
+        * elementTypeResource.getAll()
+        *    .then(function() {
+        *        alert('Found it!');
+        *    });
+        * 
+ * + * @returns {Promise} resourcePromise object. + * + **/ getAll: function () { return umbRequestHelper.resourcePromise( diff --git a/src/Umbraco.Web.UI.Client/src/common/resources/modelsbuildermanagement.resource.js b/src/Umbraco.Web.UI.Client/src/common/resources/modelsbuildermanagement.resource.js index ee3cd80c71..8352ca07e6 100644 --- a/src/Umbraco.Web.UI.Client/src/common/resources/modelsbuildermanagement.resource.js +++ b/src/Umbraco.Web.UI.Client/src/common/resources/modelsbuildermanagement.resource.js @@ -1,18 +1,82 @@ + +/** +* @ngdoc service +* @name umbraco.resources.modelsBuilderManagementResource +* @description Resources to get information on modelsbuilder status and build models +**/ function modelsBuilderManagementResource($q, $http, umbRequestHelper) { return { + + /** + * @ngdoc method + * @name umbraco.resources.modelsBuilderManagementResource#getModelsOutOfDateStatus + * @methodOf umbraco.resources.modelsBuilderManagementResource + * + * @description + * Gets the status of modelsbuilder + * + * ##usage + *
+        * modelsBuilderManagementResource.getModelsOutOfDateStatus()
+        *  .then(function() {
+        *        Do stuff...*
+        * });
+        * 
+ * + * @returns {Promise} resourcePromise object. + * + */ getModelsOutOfDateStatus: function () { return umbRequestHelper.resourcePromise( $http.get(umbRequestHelper.getApiUrl("modelsBuilderBaseUrl", "GetModelsOutOfDateStatus")), "Failed to get models out-of-date status"); }, + /** + * @ngdoc method + * @name umbraco.resources.modelsBuilderManagementResource#buildModels + * @methodOf umbraco.resources.modelsBuilderManagementResource + * + * @description + * Builds the models + * + * ##usage + *
+        * modelsBuilderManagementResource.buildModels()
+        *  .then(function() {
+        *        Do stuff...*
+        * });
+        * 
+ * + * @returns {Promise} resourcePromise object. + * + */ buildModels: function () { return umbRequestHelper.resourcePromise( $http.post(umbRequestHelper.getApiUrl("modelsBuilderBaseUrl", "BuildModels")), "Failed to build models"); }, + /** + * @ngdoc method + * @name umbraco.resources.modelsBuilderManagementResource#getDashboard + * @methodOf umbraco.resources.modelsBuilderManagementResource + * + * @description + * Gets the modelsbuilder dashboard + * + * ##usage + *
+        * modelsBuilderManagementResource.getDashboard()
+        *  .then(function() {
+        *        Do stuff...*
+        * });
+        * 
+ * + * @returns {Promise} resourcePromise object. + * + */ getDashboard: function () { return umbRequestHelper.resourcePromise( $http.get(umbRequestHelper.getApiUrl("modelsBuilderBaseUrl", "GetDashboard")), diff --git a/src/Umbraco.Web.UI.Client/src/install.loader.js b/src/Umbraco.Web.UI.Client/src/install.loader.js index 997c8cbe84..8c17b8cd64 100644 --- a/src/Umbraco.Web.UI.Client/src/install.loader.js +++ b/src/Umbraco.Web.UI.Client/src/install.loader.js @@ -1,6 +1,6 @@ LazyLoad.js([ 'lib/jquery/jquery.min.js', - + 'lib/angular/angular.js', 'lib/angular-cookies/angular-cookies.js', 'lib/angular-touch/angular-touch.js', @@ -8,10 +8,14 @@ LazyLoad.js([ 'lib/angular-messages/angular-messages.js', 'lib/angular-aria/angular-aria.min.js', 'lib/underscore/underscore-min.js', - 'lib/angular-ui-sortable/sortable.js', + 'lib/angular-ui-sortable/sortable.js', + + 'js/utilities.js', + 'js/installer.app.js', 'js/umbraco.directives.js', 'js/umbraco.installer.js' + ], function () { jQuery(document).ready(function () { angular.bootstrap(document, ['umbraco']); diff --git a/src/Umbraco.Web.UI.Client/src/installer/steps/database.controller.js b/src/Umbraco.Web.UI.Client/src/installer/steps/database.controller.js index ae2fc63293..d236d45568 100644 --- a/src/Umbraco.Web.UI.Client/src/installer/steps/database.controller.js +++ b/src/Umbraco.Web.UI.Client/src/installer/steps/database.controller.js @@ -1,28 +1,28 @@ angular.module("umbraco.install").controller("Umbraco.Installer.DataBaseController", function($scope, $http, installerService){ - + $scope.checking = false; $scope.invalidDbDns = false; - + $scope.dbs = $scope.installer.current.model.databases; if (angular.isUndefined(installerService.status.current.model.dbType) || installerService.status.current.model.dbType === null) { installerService.status.current.model.dbType = $scope.dbs[0].id; } - + $scope.validateAndForward = function() { if (!$scope.checking && this.myForm.$valid) { $scope.checking = true; $scope.invalidDbDns = false; - + var model = installerService.status.current.model; $http.post( Umbraco.Sys.ServerVariables.installApiBaseUrl + "PostValidateDatabaseConnection", model).then(function(response) { - + if (response.data === true) { - installerService.forward(); + installerService.forward(); } else { $scope.invalidDbDns = true; diff --git a/src/Umbraco.Web.UI.Client/src/less/application/grid.less b/src/Umbraco.Web.UI.Client/src/less/application/grid.less index 9e91da4792..68160923c8 100644 --- a/src/Umbraco.Web.UI.Client/src/less/application/grid.less +++ b/src/Umbraco.Web.UI.Client/src/less/application/grid.less @@ -171,13 +171,13 @@ body.umb-drawer-is-visible #mainwrapper{ } @media (min-width: 1101px) { - #contentwrapper, #speechbubble {left: 360px;} - .emptySection #contentwrapper {left:0px;} + #contentwrapper, #speechbubble { left: 360px; } + .emptySection #contentwrapper { left: 0 !important; } } //empty section modification -.emptySection #speechbubble {left: 0;} -.emptySection #navigation {display: none} +.emptySection #speechbubble { left: 0; } +.emptySection #navigation { display: none } .login-only #speechbubble { z-index: 10000; diff --git a/src/Umbraco.Web.UI.Client/src/less/components/buttons/umb-button.less b/src/Umbraco.Web.UI.Client/src/less/components/buttons/umb-button.less index d523b24141..b6800aba65 100644 --- a/src/Umbraco.Web.UI.Client/src/less/components/buttons/umb-button.less +++ b/src/Umbraco.Web.UI.Client/src/less/components/buttons/umb-button.less @@ -63,6 +63,11 @@ border-left-color: @white; } +.umb-button__progress.-black { + border-color: rgba(255, 255, 255, 0.4); + border-left-color: @black; +} + .umb-button__success, .umb-button__error { position: absolute; diff --git a/src/Umbraco.Web.UI.Client/src/less/components/html/umb-expansion-panel.less b/src/Umbraco.Web.UI.Client/src/less/components/html/umb-expansion-panel.less index 2a8137e5f9..ea08794c23 100644 --- a/src/Umbraco.Web.UI.Client/src/less/components/html/umb-expansion-panel.less +++ b/src/Umbraco.Web.UI.Client/src/less/components/html/umb-expansion-panel.less @@ -10,11 +10,12 @@ font-weight: bold; display: flex; align-items: center; - cursor: pointer; justify-content: space-between; color: @black; + width: 100%; - &:hover .umb-expansion-panel__expand { + &:hover .umb-expansion-panel__expand, + &:focus .umb-expansion-panel__expand { color: @gray-6; } } diff --git a/src/Umbraco.Web.UI.Client/src/less/components/umb-checkbox-list.less b/src/Umbraco.Web.UI.Client/src/less/components/umb-checkbox-list.less index 11194eeb43..c9f47a66df 100644 --- a/src/Umbraco.Web.UI.Client/src/less/components/umb-checkbox-list.less +++ b/src/Umbraco.Web.UI.Client/src/less/components/umb-checkbox-list.less @@ -37,6 +37,7 @@ align-items: center; flex: 0 0 30px; margin-right: 5px; + position: relative; } .umb-checkbox-list__item-icon { @@ -44,6 +45,17 @@ font-size: 16px; } +.umb-checkbox-list__item-icon-wrapper { + position: relative; + + .umb-button__progress { + width: 10px; + height: 10px; + margin-left: -10px; + margin-top: -8px; + } +} + .umb-checkbox-list__item-text { font-size: 14px; margin-bottom: 0; diff --git a/src/Umbraco.Web.UI.Client/src/less/components/umb-grid.less b/src/Umbraco.Web.UI.Client/src/less/components/umb-grid.less index 784598e84a..e1fc5573e5 100644 --- a/src/Umbraco.Web.UI.Client/src/less/components/umb-grid.less +++ b/src/Umbraco.Web.UI.Client/src/less/components/umb-grid.less @@ -392,7 +392,7 @@ // EDITOR PLACEHOLDER // ------------------------- .umb-grid .umb-editor-placeholder { - min-height: 65px; + min-height: 110px; padding: 20px; padding-bottom: 30px; position: relative; @@ -400,7 +400,7 @@ border: 4px dashed @gray-8; text-align: center; text-align: -moz-center; - cursor: pointer; + width: 100%; } .umb-grid .umb-editor-placeholder i { @@ -413,6 +413,7 @@ .umb-grid .umb-editor-preview { position: relative; + width: 100%; .umb-editor-preview-overlay { cursor: pointer; diff --git a/src/Umbraco.Web.UI.Client/src/less/components/umb-nested-content.less b/src/Umbraco.Web.UI.Client/src/less/components/umb-nested-content.less index 05824ba425..834a1a69e9 100644 --- a/src/Umbraco.Web.UI.Client/src/less/components/umb-nested-content.less +++ b/src/Umbraco.Web.UI.Client/src/less/components/umb-nested-content.less @@ -4,6 +4,7 @@ .umb-nested-content-property-container { position: relative; + &:not(:last-child){ margin-bottom: 12px; } @@ -54,19 +55,19 @@ visibility: visible !important; } -.umb-nested-content__item--single > .umb-nested-content__content { +.umb-nested-content__item--single { border: 0; -} -.umb-nested-content__item--single > .umb-nested-content__content > .umb-pane { - margin: 0; + > .umb-nested-content__content { + > .umb-pane { + margin: 0; + } + } } .umb-nested-content__header-bar { - cursor: pointer; background-color: @white; - -moz-user-select: none; -khtml-user-select: none; -webkit-user-select: none; @@ -78,21 +79,19 @@ padding-right: 60px; } } - } .umb-nested-content__heading { + display: flex; + padding: 15px; line-height: 20px; - position: relative; - padding: 15px 5px; - color:@ui-option-type; + color: @ui-option-type; &:hover { - color:@ui-option-type-hover; + color: @ui-option-type-hover; } .umb-nested-content__item-icon { - position: absolute; margin-top: -3px; font-size: 22px; } @@ -106,10 +105,9 @@ padding-left: 5px; &.--has-icon { - padding-left: 30px; + padding-left: 10px; } } - } .umb-nested-content__icons { @@ -125,13 +123,16 @@ .umb-nested-content__item--active > .umb-nested-content__header-bar { .umb-nested-content__heading { background-color: @ui-active; + &:hover { - color:@ui-option-type; + color: @ui-option-type; } + .umb-nested-content__item-name { padding-right: 60px; } } + .umb-nested-content__icons { background-color: @ui-active; &:before { @@ -140,8 +141,6 @@ } } - - .umb-nested-content__header-bar:hover .umb-nested-content__icons, .umb-nested-content__header-bar:focus .umb-nested-content__icons, .umb-nested-content__header-bar:focus-within .umb-nested-content__icons, @@ -149,8 +148,6 @@ opacity: 1; } - - .umb-nested-content__icon { background: transparent; border: 0 none; @@ -180,9 +177,6 @@ } } - - - .umb-nested-content__footer-bar { margin-top: 20px; } @@ -212,7 +206,6 @@ cursor: not-allowed; } - .umb-nested-content__content { border-top: 1px solid transparent; border-bottom: 1px solid transparent; @@ -240,17 +233,17 @@ } .umb-nested-content__doctypepicker table td.icon-navigation, -.umb-nested-content__doctypepicker i.umb-nested-content__help-icon { +.umb-nested-content__doctypepicker .umb-nested-content__help-icon { vertical-align: middle; color: @gray-7; } .umb-nested-content__doctypepicker table td.icon-navigation:hover, -.umb-nested-content__doctypepicker i.umb-nested-content__help-icon:hover { +.umb-nested-content__doctypepicker .umb-nested-content__help-icon:hover { color: @gray-2; } -.umb-nested-content__doctypepicker i.umb-nested-content__help-icon { +.umb-nested-content__doctypepicker .umb-nested-content__help-action { margin-left: 10px; } diff --git a/src/Umbraco.Web.UI.Client/src/less/navs.less b/src/Umbraco.Web.UI.Client/src/less/navs.less index e45a4d46bb..6dab771c94 100644 --- a/src/Umbraco.Web.UI.Client/src/less/navs.less +++ b/src/Umbraco.Web.UI.Client/src/less/navs.less @@ -12,7 +12,10 @@ padding-right: 7px; } -.icon.handle{color: @gray-8;} +.umb-icon.handle, +.icon.handle { + color: @gray-8; +} // BASE CLASS diff --git a/src/Umbraco.Web.UI.Client/src/preview/preview.controller.js b/src/Umbraco.Web.UI.Client/src/preview/preview.controller.js index 44ff1d1cdf..aa17b4a7c2 100644 --- a/src/Umbraco.Web.UI.Client/src/preview/preview.controller.js +++ b/src/Umbraco.Web.UI.Client/src/preview/preview.controller.js @@ -117,6 +117,13 @@ var app = angular.module("umbraco.preview", ['umbraco.resources', 'umbraco.servi } } + function fixExternalLinks(iframe) { + // Make sure external links don't open inside the iframe + Array.from(iframe.contentDocument.getElementsByTagName("a")) + .filter(a => a.hostname !== location.hostname && !a.target) + .forEach(a => a.target = "_top"); + } + var isInit = getParameterByName("init"); if (isInit === "true") { //do not continue, this is the first load of this new window, if this is passed in it means it's been @@ -443,6 +450,7 @@ var app = angular.module("umbraco.preview", ['umbraco.resources', 'umbraco.servi $scope.frameLoaded = true; configureSignalR(iframe); + fixExternalLinks(iframe); $scope.currentCultureIso = $location.search().culture || null; }; diff --git a/src/Umbraco.Web.UI.Client/src/views/common/drawers/help/help.html b/src/Umbraco.Web.UI.Client/src/views/common/drawers/help/help.html index 04b5501846..4f6b283fd8 100644 --- a/src/Umbraco.Web.UI.Client/src/views/common/drawers/help/help.html +++ b/src/Umbraco.Web.UI.Client/src/views/common/drawers/help/help.html @@ -97,7 +97,7 @@ - + - +
- +
Visit umbraco.tv @@ -138,7 +138,7 @@ - +
diff --git a/src/Umbraco.Web.UI.Client/src/views/common/infiniteeditors/compositions/compositions.controller.js b/src/Umbraco.Web.UI.Client/src/views/common/infiniteeditors/compositions/compositions.controller.js index ab8c133211..526d2d4dfa 100644 --- a/src/Umbraco.Web.UI.Client/src/views/common/infiniteeditors/compositions/compositions.controller.js +++ b/src/Umbraco.Web.UI.Client/src/views/common/infiniteeditors/compositions/compositions.controller.js @@ -7,7 +7,7 @@ var oldModel = null; vm.showConfirmSubmit = false; - vm.loading = false; + vm.loadingAlias = null; vm.isSelected = isSelected; vm.openContentType = openContentType; @@ -57,31 +57,13 @@ $location.path(url); } - function selectCompositeContentType(compositeContentType) { - - vm.loading = true; + function selectCompositeContentType(compositeContentType) { + vm.loadingAlias = compositeContentType.contentType.alias var contentType = compositeContentType.contentType; $scope.model.selectCompositeContentType(contentType).then(function (response) { - - Utilities.forEach(vm.availableGroups, function (group) { - - Utilities.forEach(group.compositeContentTypes, function (obj) { - if (obj.allowed === false) { - obj.selected = false; - } - }); - }); - - $timeout(function () { - vm.loading = false; - }, 500); - - }, function () { - $timeout(function () { - vm.loading = false; - }, 500); + vm.loadingAlias = null; }); // Check if the template is already selected. diff --git a/src/Umbraco.Web.UI.Client/src/views/common/infiniteeditors/compositions/compositions.html b/src/Umbraco.Web.UI.Client/src/views/common/infiniteeditors/compositions/compositions.html index 8060605b87..98db2b0336 100644 --- a/src/Umbraco.Web.UI.Client/src/views/common/infiniteeditors/compositions/compositions.html +++ b/src/Umbraco.Web.UI.Client/src/views/common/infiniteeditors/compositions/compositions.html @@ -42,10 +42,6 @@ -
- -
-

@@ -68,18 +64,21 @@
  • + ng-class="{'-disabled': (compositeContentType.allowed === false && !compositeContentType.selected) || compositeContentType.inherited, '-selected': compositeContentType.selected}">
    + disabled="(compositeContentType.allowed === false && !compositeContentType.selected) || compositeContentType.inherited || vm.loadingAlias">
    -
  • diff --git a/src/Umbraco.Web.UI.Client/src/views/dictionary/dictionary.edit.controller.js b/src/Umbraco.Web.UI.Client/src/views/dictionary/dictionary.edit.controller.js index 7619c7abfc..416d2c3a65 100644 --- a/src/Umbraco.Web.UI.Client/src/views/dictionary/dictionary.edit.controller.js +++ b/src/Umbraco.Web.UI.Client/src/views/dictionary/dictionary.edit.controller.js @@ -24,9 +24,11 @@ function DictionaryEditController($scope, $routeParams, $location, dictionaryRes vm.page.menu.currentNode = null; vm.description = ""; vm.showBackButton = true; + vm.maxlength = 1000; vm.save = saveDictionary; vm.back = back; + vm.change = change; function loadDictionary() { @@ -56,6 +58,7 @@ function DictionaryEditController($scope, $routeParams, $location, dictionaryRes // create data for umb-property displaying for (var i = 0; i < data.translations.length; i++) { data.translations[i].property = createTranslationProperty(data.translations[i]); + change(data.translations[i]); } contentEditingHelper.handleSuccessfulSave({ @@ -111,6 +114,13 @@ function DictionaryEditController($scope, $routeParams, $location, dictionaryRes $location.path(vm.page.menu.currentSection + "/dictionary/list"); } + function change(translation) { + if (translation.translation) { + var charsCount = translation.translation.length; + translation.nearMaxLimit = charsCount > Math.max(vm.maxlength * .8, vm.maxlength - 50); + } + } + $scope.$watch("vm.content.name", function (newVal, oldVal) { //when the value changes, we need to set the name dirty if (newVal && (newVal !== oldVal) && typeof(oldVal) !== "undefined") { diff --git a/src/Umbraco.Web.UI.Client/src/views/dictionary/edit.html b/src/Umbraco.Web.UI.Client/src/views/dictionary/edit.html index cad99edbdd..1577af43de 100644 --- a/src/Umbraco.Web.UI.Client/src/views/dictionary/edit.html +++ b/src/Umbraco.Web.UI.Client/src/views/dictionary/edit.html @@ -23,7 +23,18 @@

    - + +
    +

    + {{ translation.displayName }} + %0% characters left. +

    +
    diff --git a/src/Umbraco.Web.UI.Client/src/views/macros/infiniteeditors/parameter.controller.js b/src/Umbraco.Web.UI.Client/src/views/macros/infiniteeditors/parameter.controller.js index 7d4df17277..6fe8c303a0 100644 --- a/src/Umbraco.Web.UI.Client/src/views/macros/infiniteeditors/parameter.controller.js +++ b/src/Umbraco.Web.UI.Client/src/views/macros/infiniteeditors/parameter.controller.js @@ -36,8 +36,7 @@ } function submit() { - console.log("model", $scope.model); - + if ($scope.model && $scope.model.submit && formHelper.submitForm({scope: $scope})) { $scope.model.submit($scope.model); } diff --git a/src/Umbraco.Web.UI.Client/src/views/media/edit.html b/src/Umbraco.Web.UI.Client/src/views/media/edit.html index d22c55ae65..d2782a2a21 100644 --- a/src/Umbraco.Web.UI.Client/src/views/media/edit.html +++ b/src/Umbraco.Web.UI.Client/src/views/media/edit.html @@ -59,7 +59,7 @@ -
    -
    Package Properties
    -   -
    +
    @@ -103,10 +103,10 @@
    -
    -
    Package Content
    -   -
    +
    @@ -231,15 +231,13 @@
    -
    -
    Package Files
    -   -
    +
    - + @@ -288,19 +286,22 @@
    -
    -
    Package Actions
    -   -
    +
    diff --git a/src/Umbraco.Web.UI.Client/src/views/packages/views/created.html b/src/Umbraco.Web.UI.Client/src/views/packages/views/created.html index e3743674f9..88a2b21795 100644 --- a/src/Umbraco.Web.UI.Client/src/views/packages/views/created.html +++ b/src/Umbraco.Web.UI.Client/src/views/packages/views/created.html @@ -5,7 +5,7 @@ @@ -20,7 +20,7 @@
    - +
    {{ createdPackage.name }}
    diff --git a/src/Umbraco.Web.UI.Client/src/views/packages/views/repo.html b/src/Umbraco.Web.UI.Client/src/views/packages/views/repo.html index a499a12558..42b538f9ad 100644 --- a/src/Umbraco.Web.UI.Client/src/views/packages/views/repo.html +++ b/src/Umbraco.Web.UI.Client/src/views/packages/views/repo.html @@ -294,7 +294,7 @@
    External sources
    - + {{ externalSource.name }} @@ -335,7 +335,7 @@
    @@ -345,7 +345,7 @@
    @@ -357,7 +357,7 @@
    - I accept terms of use + I accept terms of use
    - + +
    @@ -167,7 +171,11 @@
    - + +
    diff --git a/src/Umbraco.Web.UI.Client/src/views/propertyeditors/contentpicker/contentpicker.controller.js b/src/Umbraco.Web.UI.Client/src/views/propertyeditors/contentpicker/contentpicker.controller.js index bd80cdc42c..0f012810ba 100644 --- a/src/Umbraco.Web.UI.Client/src/views/propertyeditors/contentpicker/contentpicker.controller.js +++ b/src/Umbraco.Web.UI.Client/src/views/propertyeditors/contentpicker/contentpicker.controller.js @@ -15,7 +15,7 @@ * @param {any} editorService * @param {any} userService */ -function contentPickerController($scope, $q, $routeParams, $location, entityResource, editorState, iconHelper, angularHelper, navigationService, localizationService, editorService, userService) { +function contentPickerController($scope, $q, $routeParams, $location, entityResource, editorState, iconHelper, angularHelper, navigationService, localizationService, editorService, userService, overlayService) { var vm = { labels: { @@ -116,6 +116,14 @@ function contentPickerController($scope, $q, $routeParams, $location, entityReso } }; + var removeAllEntriesAction = { + labelKey: 'clipboard_labelForRemoveAllEntries', + labelTokens: [], + icon: 'trash', + method: removeAllEntries, + isDisabled: true + }; + if ($scope.model.config) { //special case, if the `startNode` is falsy on the server config delete it entirely so the default value is merged in if (!$scope.model.config.startNode) { @@ -129,6 +137,14 @@ function contentPickerController($scope, $q, $routeParams, $location, entityReso if ($scope.model.validation && $scope.model.validation.mandatory && !$scope.model.config.minNumber) { $scope.model.config.minNumber = 1; } + + if ($scope.model.config.multiPicker === true && $scope.umbProperty) { + var propertyActions = [ + removeAllEntriesAction + ]; + + $scope.umbProperty.setPropertyActions(propertyActions); + } } //Umbraco persists boolean for prevalues as "0" or "1" so we need to convert that! @@ -275,6 +291,8 @@ function contentPickerController($scope, $q, $routeParams, $location, entityReso angularHelper.getCurrentForm($scope).$setDirty(); $scope.model.value = currIds.join(); } + + removeAllEntriesAction.isDisabled = currIds.length === 0; }; $scope.showNode = function (index) { @@ -301,10 +319,13 @@ function contentPickerController($scope, $q, $routeParams, $location, entityReso currIds.push(itemId); $scope.model.value = currIds.join(); } + + removeAllEntriesAction.isDisabled = false; }; $scope.clear = function () { $scope.model.value = null; + removeAllEntriesAction.isDisabled = true; }; $scope.openEditor = function (item) { @@ -362,6 +383,8 @@ function contentPickerController($scope, $q, $routeParams, $location, entityReso //sync the sortable model $scope.sortableModel = valueIds; + removeAllEntriesAction.isDisabled = valueIds.length === 0; + //load current data if anything selected if (valueIds.length > 0) { @@ -507,6 +530,22 @@ function contentPickerController($scope, $q, $routeParams, $location, entityReso } } + function removeAllEntries() { + localizationService.localizeMany(["content_nestedContentDeleteAllItems", "general_delete"]).then(function (data) { + overlayService.confirmDelete({ + title: data[1], + content: data[0], + close: function () { + overlayService.close(); + }, + submit: function () { + $scope.clear(); + overlayService.close(); + } + }); + }); + } + function init() { userService.getCurrentUser().then(function (user) { diff --git a/src/Umbraco.Web.UI.Client/src/views/propertyeditors/grid/editors/embed.html b/src/Umbraco.Web.UI.Client/src/views/propertyeditors/grid/editors/embed.html index de80b05760..14741d6ca6 100644 --- a/src/Umbraco.Web.UI.Client/src/views/propertyeditors/grid/editors/embed.html +++ b/src/Umbraco.Web.UI.Client/src/views/propertyeditors/grid/editors/embed.html @@ -1,13 +1,13 @@
    -
    +
    + Click to embed + -
    -
    -
    -
    +
    diff --git a/src/Umbraco.Web.UI.Client/src/views/propertyeditors/grid/editors/macro.html b/src/Umbraco.Web.UI.Client/src/views/propertyeditors/grid/editors/macro.html index cc581698fc..c07d29d89c 100644 --- a/src/Umbraco.Web.UI.Client/src/views/propertyeditors/grid/editors/macro.html +++ b/src/Umbraco.Web.UI.Client/src/views/propertyeditors/grid/editors/macro.html @@ -1,16 +1,13 @@
    -
    -
    +
    -
    -
    -
    -
    -
    - + {{title}} + + + + +
    diff --git a/src/Umbraco.Web.UI.Client/src/views/propertyeditors/grid/editors/media.html b/src/Umbraco.Web.UI.Client/src/views/propertyeditors/grid/editors/media.html index fa32821917..2ab42807fd 100644 --- a/src/Umbraco.Web.UI.Client/src/views/propertyeditors/grid/editors/media.html +++ b/src/Umbraco.Web.UI.Client/src/views/propertyeditors/grid/editors/media.html @@ -1,16 +1,19 @@
    - -
    +
    + + Click to insert image + +
    - - + + +
    diff --git a/src/Umbraco.Web.UI.Client/src/views/propertyeditors/nestedcontent/nestedcontent.doctypepicker.html b/src/Umbraco.Web.UI.Client/src/views/propertyeditors/nestedcontent/nestedcontent.doctypepicker.html index f62894e043..fa146f12f0 100644 --- a/src/Umbraco.Web.UI.Client/src/views/propertyeditors/nestedcontent/nestedcontent.doctypepicker.html +++ b/src/Umbraco.Web.UI.Client/src/views/propertyeditors/nestedcontent/nestedcontent.doctypepicker.html @@ -3,7 +3,7 @@ - @@ -13,20 +13,20 @@ -
    + Element Type Template +
    - + {{ph = placeholder(config);""}} -
    +
    +
    @@ -49,17 +49,19 @@ - +

    - Group:
    + Group:
    Select the group whose properties should be displayed. If left blank, the first group on the element type will be used.

    - Template:
    + Template:
    Enter an angular expression to evaluate against each item for its name. Use {{$index}} to display the item index diff --git a/src/Umbraco.Web.UI.Client/src/views/propertyeditors/relatedlinks/relatedlinks.html b/src/Umbraco.Web.UI.Client/src/views/propertyeditors/relatedlinks/relatedlinks.html index 221e7666f7..abd0c6bc81 100644 --- a/src/Umbraco.Web.UI.Client/src/views/propertyeditors/relatedlinks/relatedlinks.html +++ b/src/Umbraco.Web.UI.Client/src/views/propertyeditors/relatedlinks/relatedlinks.html @@ -22,16 +22,16 @@

    -
    \ No newline at end of file +
    diff --git a/src/Umbraco.Web.UI.Client/test/lib/angular/angular-mocks.js b/src/Umbraco.Web.UI.Client/test/lib/angular/angular-mocks.js index 31310e1c46..9760a91c7c 100644 --- a/src/Umbraco.Web.UI.Client/test/lib/angular/angular-mocks.js +++ b/src/Umbraco.Web.UI.Client/test/lib/angular/angular-mocks.js @@ -1377,13 +1377,13 @@ function MockHttpExpectation(method, url, data, headers) { }; this.matchHeaders = function (h) { - if (angular.isUndefined(headers)) return true; + if (Utilities.isUndefined(headers)) return true; if (angular.isFunction(headers)) return headers(h); return angular.equals(headers, h); }; this.matchData = function (d) { - if (angular.isUndefined(data)) return true; + if (Utilities.isUndefined(data)) return true; if (data && angular.isFunction(data.test)) return data.test(d); if (data && !Utilities.isString(data)) return angular.toJson(data) == d; return data == d; diff --git a/src/Umbraco.Web.UI.NetCore/umbraco/config/lang/cs.xml b/src/Umbraco.Web.UI.NetCore/umbraco/config/lang/cs.xml index 0c7b938d41..eda9c33fd3 100644 --- a/src/Umbraco.Web.UI.NetCore/umbraco/config/lang/cs.xml +++ b/src/Umbraco.Web.UI.NetCore/umbraco/config/lang/cs.xml @@ -1,883 +1,882 @@ - - Umbraco komunita - https://our.umbraco.com/documentation/Extending-Umbraco/Language-Files - - - Kultura a názvy hostitelů - Historie změn - Prohlížet uzel - Změnit typ dokumentu - Kopírovat - Vytvořit - Exportovat - Vytvořit balíček - Vytvořit skupinu - Odstranit - Deaktivovat - Vyprázdnit koš - Aktivovat - Exportovat typ dokumentu - Importovat typ dokumentu - Importovat balíček - Editovat na stránce - Odhlásit - Přesunout - Upozornění - Veřejný přístup - Publikovat - Nepublikovat - Znovu načíst uzly - Znovu publikovat celý web - Práva - Přejmenovat - Obnovit - Nastavit oprávnění pro stránku %0% - Kam zkopírovat - Kam přesunout - do struktury stromu pod - Choose where to copy the selected item(s) - Choose where to move the selected item(s) - bylo přesunuto - bylo zkopírováno - bylo smazáno - Vrátit starší verzi - Odeslat k publikování - Odeslat k překladu - Nastavit skupinu - Seřadit - Přeložit - Aktualizovat - Nastavit oprávnění - Odemknout - Vytvořit šablonu obsahu - Přeposlat pozvánku - - - Obsah - Administrace - Struktura - Ostatní - - - Povolit přístup k přiřazování kultury a názvů hostitelů - Povolit přístup k zobrazení protokolu historie uzlu - Povolit přístup k zobrazení uzlu - Povolit přístup ke změně typu dokumentu daného uzlu - Povolit přístup ke kopírování uzlu - Povolit přístup k vytváření uzlů - Povolit přístup k mazání uzlů - Povolit přístup k přesunutí uzlu - Povolit přístup k nastavení a změně veřejného přístupu k uzlu - Povolit přístup k publikování uzlu - Povolit přístup k zrušení publikování uzlu - Povolit přístup ke změně oprávnění pro uzel - Povolit přístup k vrácení uzlu do předchozího stavu - Povolit přístup k odeslání uzlu ke schválení před publikováním - Povolit přístup k odeslání uzlu k překladu - Povolit přístup ke změně pořadí uzlů - Povolit přístup k překladu uzlu - Povolit přístup k uložení uzlu - Povolit přístup k vytvoření šablony obsahu - - - Obsah - Info - - - Přístup zakázán. - Přidat novou doménu - Odebrat - Neplatný uzel. - Neplatný tvar domény. - Doména už byla přiřazena. - Doména - Jazyk - Nová doména '%0%' byla vytvořena - Doména '%0%' je odstraněna - Doména '%0%' už byla přiřazena - Doména '%0%' byla aktualizována - Editace aktuálních domén - - + Umbraco komunita + https://our.umbraco.com/documentation/Extending-Umbraco/Language-Files + + + Kultura a názvy hostitelů + Historie změn + Prohlížet uzel + Změnit typ dokumentu + Kopírovat + Vytvořit + Exportovat + Vytvořit balíček + Vytvořit skupinu + Odstranit + Deaktivovat + Vyprázdnit koš + Aktivovat + Exportovat typ dokumentu + Importovat typ dokumentu + Importovat balíček + Editovat na stránce + Odhlásit + Přesunout + Upozornění + Veřejný přístup + Publikovat + Nepublikovat + Znovu načíst uzly + Znovu publikovat celý web + Práva + Přejmenovat + Obnovit + Nastavit oprávnění pro stránku %0% + Kam zkopírovat + Kam přesunout + do struktury stromu pod + Choose where to copy the selected item(s) + Choose where to move the selected item(s) + bylo přesunuto + bylo zkopírováno + bylo smazáno + Vrátit starší verzi + Odeslat k publikování + Odeslat k překladu + Nastavit skupinu + Seřadit + Přeložit + Aktualizovat + Nastavit oprávnění + Odemknout + Vytvořit šablonu obsahu + Přeposlat pozvánku + + + Obsah + Administrace + Struktura + Ostatní + + + Povolit přístup k přiřazování kultury a názvů hostitelů + Povolit přístup k zobrazení protokolu historie uzlu + Povolit přístup k zobrazení uzlu + Povolit přístup ke změně typu dokumentu daného uzlu + Povolit přístup ke kopírování uzlu + Povolit přístup k vytváření uzlů + Povolit přístup k mazání uzlů + Povolit přístup k přesunutí uzlu + Povolit přístup k nastavení a změně veřejného přístupu k uzlu + Povolit přístup k publikování uzlu + Povolit přístup k zrušení publikování uzlu + Povolit přístup ke změně oprávnění pro uzel + Povolit přístup k vrácení uzlu do předchozího stavu + Povolit přístup k odeslání uzlu ke schválení před publikováním + Povolit přístup k odeslání uzlu k překladu + Povolit přístup ke změně pořadí uzlů + Povolit přístup k překladu uzlu + Povolit přístup k uložení uzlu + Povolit přístup k vytvoření šablony obsahu + + + Obsah + Info + + + Přístup zakázán. + Přidat novou doménu + Odebrat + Neplatný uzel. + Neplatný tvar domény. + Doména už byla přiřazena. + Doména + Jazyk + Nová doména '%0%' byla vytvořena + Doména '%0%' je odstraněna + Doména '%0%' už byla přiřazena + Doména '%0%' byla aktualizována + Editace aktuálních domén + + - Dědit - Kultura - nebo dědění kultury po nadřazeném uzlu. Vztahuje se také
    + Dědit + Kultura + nebo dědění kultury po nadřazeném uzlu. Vztahuje se také
    na aktivní uzel.]]>
    - Domény - - - Zrušit výběr - Vybrat - Dělat něco jiného - Tučně - Zrušit odsazení odstavce - Vložit formulářové pole - Vložit grafický nadpis - Editovat Html - Odsadit odstavec - Kurzíva - Zarovnat na střed - Zarovnat na levo - Zarovnat na pravo - Vložit odkaz - Vložit místní odkaz (kotvu) - Neuspořádaný seznam - Číslovaný seznam - Vložit makro - Vložit obrázek - Publikovat a zavřít - Publikovat s potomky - Editovat vztahy - Zpět na seznam - Uložit - Uložit a zavřít - Uložit a publikovat - Uložit a naplánovat - Uložit a odeslat ke schválení - Náhled - Uložit zobrazení seznamu - Naplánovat - Náhled - Náhled je deaktivován, protože není přiřazena žádná šablona - Vybrat styl - Zobrazit styly - Vložit tabulku - Generovat modely a zavřít - Uložit a generovat modely - Zpět - Znovu - Obnovit - Smazat štítek - Zrušit - Potvrdit - Další možnosti publikování - - - Zobrazení pro - Obsah smazán - Obsah nepublikován - Obsah nepublikován pro jazyky: %0% - Obsah publikován - Obsah publikován pro jazyky: %0% - Obsah uložen - Obsah uložen pro jazyky: %0% - Obsah přesunut - Obsah zkopírován - Obsah vrácen zpět - Obsah odeslán k publikování - Obsah odeslán k publikování pro jazyky: %0% - Seřadit podřízené položky prováděné uživatelem - Kopírovat - Publikovat - Publikovat - Přesunout - Uložit - Uložit - Smazat - Nepublikovat - Nepublikovat - Vrátit zpět - Odeslat k publikování - Odeslat k publikování - Seřadit - Historie (všechny jazyky) - - - Abyste změnili typ dokumentu pro zvolený obsah, nejprve jej vyberte ze seznamu typů platných pro tohle umístění. - Pak potvrďte a/nebo pozměňte mapování vlastností z aktuálního typu na nový a dejte Uložit. - Obsah byl znovu publikován. - Aktuální vlastnost - Aktuální typ - Typ dokumentu nemůže být změněn, neboť neexistují alternativy platné pro toto umístění. - Typ dokumentu byl změněn - Mapování vlastností - Mapování na vlastnost - Nová šablona - Nový typ - nic - Obsah - Vybrat nový typ dokumentu - Typ dokumentu pro zvolený obsah byl úspěšně změněný na [new type] a následující vlastnosti byly namapovány: - na - Nelze dokončit mapování vlastností, neboť nejméně jedna z vlastností má definováno více než jedno mapování. - Jsou zobrazeny pouze alternativní typy platné pro aktuální umístění. - - - Nepodařilo se vytvořit složku pod rodičem s ID %0% - Nepodařilo se vytvořit složku pod rodičem s názvem %0% - Název složky nesmí obsahovat nepovolené znaky. - Odstranění položky se nezdařilo: %0% - - - Is Published - O této stránce - Alias - (jak byste popsali obrázek přes telefon) - Alternativní adresy URL - Klikněte pro editaci položky - Vytvořeno uživatelem - Původní autor - Aktualizováno uživatelem - Vytvořeno - Datum/čas vytvoření tohoto dokumentu - Typ dokumentu - Editování - Datum odebrání - Tato položko byla změněna po publikování - Tato položka není publikována - Naposledy publikováno - There are no items to show - There are no items to show in the list. - No child items have been added - No members have been added - Typ média - Odkaz na položky medií - Skupina členů - Role - Typ člena - No changes have been made - Nevybráno žádné datum - Titulek stránky - This media item has no link - No content can be added for this item - Vlastnosti - Tento dokument je publikován, ale není viditelný, protože jeho rodič '%0%' publikován není - Tato jazyková verze je publikována, ale není viditelná, protože její rodič '%0%' publikován není - Jejda: tento dokument je publikován, ale není v mezipaměti (vnitřní chyba) - Could not get the URL - This document is published but its URL would collide with content %0% - This document is published but its URL cannot be routed - Publikovat - Published - Published (pending changes) - Stav publikování - Publish with descendants to publish %0% and all content items underneath and thereby making their content publicly available.]]> - Publish with descendants to publish the selected languages and the same languages of content items underneath and thereby making their content publicly available.]]> - Datum publikování - Datum ukončení publikování - Datum odebrání - Set date - Třídění je aktualizováno - Abyste uzly setřídili, jednoduše je přetáhněte anebo klikněte na jednu z hlaviček sloupce. Podržením "shift" nebo "control" při výběru můžete označit uzlů více. - Statistika - Titulek (volitelně) - Alternative text (optional) - Typ - Nepublikovat - Draft - Not created - Naposledy změněno - Datum/čas poslední změny dokumentu - Odebrat soubor(y) - Click here to remove the image from the media item - Click here to remove the file from the media item - URL adresa dokumentu - Člen skupin(y) - Není člen skupin(y) - Podřízené položky - Cíl - This translates to the following time on the server: - What does this mean?]]> - Are you sure you want to delete this item? - Are you sure you want to delete all items? - Property %0% uses editor %1% which is not supported by Nested Content. - No content types are configured for this property. - Add element type - Select element type - Select the group whose properties should be displayed. If left blank, the first group on the element type will be used. - Enter an angular expression to evaluate against each item for its name. Use - to display the item index - Add another text box - Remove this text box - Content root - Include drafts: also publish unpublished content items. - This value is hidden. If you need access to view this value please contact your website administrator. - This value is hidden. - What languages would you like to publish? All languages with content are saved! - What languages would you like to publish? - What languages would you like to save? - All languages with content are saved on creation! - What languages would you like to send for approval? - What languages would you like to schedule? - Select the languages to unpublish. Unpublishing a mandatory language will unpublish all languages. - Published Languages - Unpublished Languages - Unmodified Languages - These languages haven't been created - Ready to Publish? - Ready to Save? - Send for approval - Select the date and time to publish and/or unpublish the content item. - Create new - Paste from clipboard - This item is in the Recycle Bin - - - Vytvořit novou šablonu obsahu z '%0%' - Prázdná - Vybrat obsahovou šablonu - Šablona obsahu byla vytvořena - Šablona obsahu byla vytvořena z '%0%' - Již existuje jiná šablona obsahu se stejným názvem - Šablona obsahu je předdefinovaný obsah, který si editor může vybrat jako základ pro vytváření nového obsahu - - - Klikněte pro nahrání - nebo kliknutím sem vyberte soubory - Sem můžete přetáhnout a nahrát soubory. - Tento soubor nelze nahrát, nemá povolený typ souboru - Maximální velikost souboru je - Nejvyšší složka médií - Nepodařilo se přesunout média - Nadřazené a cílové složky nemohou být stejné - Médium se nepodařilo zkopírovat - Nepodařilo se vytvořit složku pod nadřazeným id %0% - Nepodařilo se přejmenovat složku s id %0% - Přetáhněte své soubory do oblasti - - - Vytvořit nového člena - Všichni členové - Členské skupiny nemají žádné další vlastnosti pro úpravy. - - - Kde chcete vytvořit nový %0% - Vytvořit položku pod - Vyberte typ dokumentu, pro který chcete vytvořit šablonu obsahu - Zadejte název složky - Vyberte typ a titulek - "typy dokumentů".]]> - Typy dokumentů v části Nastavení.]]> - Vybraná stránka ve stromu obsahu neumožňuje vytváření žádných stránek pod ní. - Oprávnění k úpravám pro tento typ dokumentu - Vytvořit nový typ dokumentu - Typy dokumentů v části Nastavení změnou možnosti Povolit jako root v části Oprávnění.]]> - "typy medií".]]> - Vybraná média ve stromu neumožňuje vytváření pod nimi žádná další média. - Upravit oprávnění pro tento typ média - Typ dokumentu bez šablony - Nová složka - Nový datový typ - Nový skript JavaScript - Nová prázdná částečná šablona - Nové makro pro částečnou šablonu - Nová částečná šablona ze snippetu - Nové makro částečné šablony ze snippetu - Nové makro pro částečnou šablonu (bez makra) - Nový soubor stylů - stylopis - Nový soubor stylů Rich Text editoru - - - Prohlédnout svůj web - - Skrýt - Jestli se umbraco neotevírá, možná budete muset povolit na tomto webu vyskakovací okna - byl otevřený v novém okně - Restart - Navštívit - Vítejte - - - Zůstat zde - Zahodit změny - Máte neuložené změny - Opravdu chcete opustit tuto stránku? Máte neuložené změny. - Publikování zviditelní vybrané položky na webu. - Zrušení publikování odstraní vybrané položky a všechny jejich potomky z webu. - Zrušení publikování odstraní tuto stránku a všechny její potomky z webu. - Máte neuložené změny. Provedením změn typu dokumentu změny zahodíte. - - - Hotovo - Smazána %0% položka - Smazáno %0% položek - Smazána %0% z %1% položek - Smazáno %0% z %1% položek - Publikována %0% položka - Publikováno %0% položek - Publikována %0% z %1% položek - Publikováno %0% z %1% položek - Zrušeno publikování %0% položky - Zrušeno publikování %0% položek - Zrušeno publikování %0% z %1% položek - Zrušeno publikování %0% z %1% položek - Přesunuta %0% položka - Přesunuto %0% položek - Přesunuta %0% z %1% položek - Přesunuto %0% z %1% položek - Zkopírována %0% položka - Zkopírováno %0% položek - Zkopírována %0% z %1% položek - Zkopírováno %0% z %1% položek - - - Titulek odkazu - Odkaz - Kotva / dotaz - Název - Spravovat názvy hostitelů - Zavřít toto okno - Jste si jistí. že chcete odstranit - Jste si jistí, že chcete deaktivovat - Jste si jistí? - Jste si jistí? - Vyjmout - Editovat položku slovníku - Editovat jazyk - Edit selected media - Vložit místní odkaz - Vložit znak - Vložit grafický titulek - Vložit obrázek - Vložit odkaz - Kliknout pro přidání makra - Vložit tabulku - Tím se odstraní jazyk - Změna kultury jazyka může být náročná operace a bude mít za následek opětovné sestavení mezipaměti obsahu a indexů - Naposledy editováno - Odkaz - Místní odkaz: - Při používání místních odkazů vložte znak "#" před odkaz - Otevřít v novém okně? - Nastavení makra - Toto makro nemá žádné vlastnosti, které by bylo možno editovat - Vložit - Editovat oprávnění pro - Nastavit oprávnění pro - Nastavit oprávnění pro %0% pro skupinu %1% - Vyberte skupiny uživatelů, pro které chcete nastavit oprávnění - Položky koše jsou nyní mazány. Nezavírejte, prosím, toto okno, dokud operace probíhá - Koš je nyní prázdný - Odebrání položek z koše způsobí jejich trvalé odstranění - regexlib.com má v tuto chvíli nějaké problémy, které jsou mimo naší kontrolu. Omlouváme se za vzniklé nepříjemnosti.]]> - Vyhledat regulární výraz pro přidání validace formulářového prvku. Například: 'email, 'PSČ' 'url' - Odstranit makro - Pole je vyžadování - Web je přeindexován - Mezipaměť webu byla obnovena. Všechen publikovaný obsah je nyní aktuální, zatímco nepublikovaný obsah zůstal nepublikovaný. - Mezipaměť webu bude obnovena. Všechen publikovaný obsah bude aktualizován, zatímco nepublikovaný obsah zůstane nepublikovaný. - Počet sloupců - Počet řádků - Klikněte na obrázek pro zobrazení v plné velikosti - Vybrat položku - Zobrazit položku mezipaměti - Navázat na originál - Včetně potomků - Nejpřátelštější komunita - Odkaz na stránku - Otevře propojený dokument v novém okně nebo na kartě - Odkaz na média - Vybrat počáteční uzel obsahu - Vybrat média - Vybrat typ média - Vybrat ikonu - Vybrat položku - Vybrat odkaz - Vybrat makro - Vybrat obsah - Vybrat typ obsahu - Vybrat počáteční uzel média - Vybrat člena - Vybrat skupinu členů - Vybrat typ člena - Vybrat uzel - Vybrat sekce - Vybrat uživatele - Nebyly nalezeny žádné ikony - Pro toto makro neexistují žádné parametry - K dispozici nejsou žádná makra - Externí poskytovatelé přihlášení - Podrobnosti o výjimce - Stacktrace - Vnitřní výjimka - Propojit se - Odpojit se - účet - Vybrat editora - Vybrat snippet - Tímto odstraníte uzel a všechny jeho jazyky. Pokud chcete smazat pouze jeden jazyk, měli byste zrušit publikování uzlu v tomto jazyce. - - - Nejsou žádné položky ve slovníku. - - - Domény + + + Zrušit výběr + Vybrat + Dělat něco jiného + Tučně + Zrušit odsazení odstavce + Vložit formulářové pole + Vložit grafický nadpis + Editovat Html + Odsadit odstavec + Kurzíva + Zarovnat na střed + Zarovnat na levo + Zarovnat na pravo + Vložit odkaz + Vložit místní odkaz (kotvu) + Neuspořádaný seznam + Číslovaný seznam + Vložit makro + Vložit obrázek + Publikovat a zavřít + Publikovat s potomky + Editovat vztahy + Zpět na seznam + Uložit + Uložit a zavřít + Uložit a publikovat + Uložit a naplánovat + Uložit a odeslat ke schválení + Náhled + Uložit zobrazení seznamu + Naplánovat + Náhled + Náhled je deaktivován, protože není přiřazena žádná šablona + Vybrat styl + Zobrazit styly + Vložit tabulku + Generovat modely a zavřít + Uložit a generovat modely + Zpět + Znovu + Obnovit + Smazat štítek + Zrušit + Potvrdit + Další možnosti publikování + + + Zobrazení pro + Obsah smazán + Obsah nepublikován + Obsah nepublikován pro jazyky: %0% + Obsah publikován + Obsah publikován pro jazyky: %0% + Obsah uložen + Obsah uložen pro jazyky: %0% + Obsah přesunut + Obsah zkopírován + Obsah vrácen zpět + Obsah odeslán k publikování + Obsah odeslán k publikování pro jazyky: %0% + Seřadit podřízené položky prováděné uživatelem + Kopírovat + Publikovat + Publikovat + Přesunout + Uložit + Uložit + Smazat + Nepublikovat + Nepublikovat + Vrátit zpět + Odeslat k publikování + Odeslat k publikování + Seřadit + Historie (všechny jazyky) + + + Abyste změnili typ dokumentu pro zvolený obsah, nejprve jej vyberte ze seznamu typů platných pro tohle umístění. + Pak potvrďte a/nebo pozměňte mapování vlastností z aktuálního typu na nový a dejte Uložit. + Obsah byl znovu publikován. + Aktuální vlastnost + Aktuální typ + Typ dokumentu nemůže být změněn, neboť neexistují alternativy platné pro toto umístění. + Typ dokumentu byl změněn + Mapování vlastností + Mapování na vlastnost + Nová šablona + Nový typ + nic + Obsah + Vybrat nový typ dokumentu + Typ dokumentu pro zvolený obsah byl úspěšně změněný na [new type] a následující vlastnosti byly namapovány: + na + Nelze dokončit mapování vlastností, neboť nejméně jedna z vlastností má definováno více než jedno mapování. + Jsou zobrazeny pouze alternativní typy platné pro aktuální umístění. + + + Nepodařilo se vytvořit složku pod rodičem s ID %0% + Nepodařilo se vytvořit složku pod rodičem s názvem %0% + Název složky nesmí obsahovat nepovolené znaky. + Odstranění položky se nezdařilo: %0% + + + Is Published + O této stránce + Alias + (jak byste popsali obrázek přes telefon) + Alternativní adresy URL + Klikněte pro editaci položky + Vytvořeno uživatelem + Původní autor + Aktualizováno uživatelem + Vytvořeno + Datum/čas vytvoření tohoto dokumentu + Typ dokumentu + Editování + Datum odebrání + Tato položko byla změněna po publikování + Tato položka není publikována + Naposledy publikováno + There are no items to show + There are no items to show in the list. + No child items have been added + No members have been added + Typ média + Odkaz na položky medií + Skupina členů + Role + Typ člena + No changes have been made + Nevybráno žádné datum + Titulek stránky + This media item has no link + No content can be added for this item + Vlastnosti + Tento dokument je publikován, ale není viditelný, protože jeho rodič '%0%' publikován není + Tato jazyková verze je publikována, ale není viditelná, protože její rodič '%0%' publikován není + Jejda: tento dokument je publikován, ale není v mezipaměti (vnitřní chyba) + Could not get the URL + This document is published but its URL would collide with content %0% + This document is published but its URL cannot be routed + Publikovat + Published + Published (pending changes) + Stav publikování + Publish with descendants to publish %0% and all content items underneath and thereby making their content publicly available.]]> + Publish with descendants to publish the selected languages and the same languages of content items underneath and thereby making their content publicly available.]]> + Datum publikování + Datum ukončení publikování + Datum odebrání + Set date + Třídění je aktualizováno + Abyste uzly setřídili, jednoduše je přetáhněte anebo klikněte na jednu z hlaviček sloupce. Podržením "shift" nebo "control" při výběru můžete označit uzlů více. + Statistika + Titulek (volitelně) + Alternative text (optional) + Typ + Nepublikovat + Draft + Not created + Naposledy změněno + Datum/čas poslední změny dokumentu + Odebrat soubor(y) + Click here to remove the image from the media item + Click here to remove the file from the media item + URL adresa dokumentu + Člen skupin(y) + Není člen skupin(y) + Podřízené položky + Cíl + This translates to the following time on the server: + What does this mean?]]> + Are you sure you want to delete this item? + Are you sure you want to delete all items? + Property %0% uses editor %1% which is not supported by Nested Content. + No content types are configured for this property. + Add element type + Select element type + Select the group whose properties should be displayed. If left blank, the first group on the element type will be used. + Enter an angular expression to evaluate against each item for its name. Use + to display the item index + Add another text box + Remove this text box + Content root + Include drafts: also publish unpublished content items. + This value is hidden. If you need access to view this value please contact your website administrator. + This value is hidden. + What languages would you like to publish? All languages with content are saved! + What languages would you like to publish? + What languages would you like to save? + All languages with content are saved on creation! + What languages would you like to send for approval? + What languages would you like to schedule? + Select the languages to unpublish. Unpublishing a mandatory language will unpublish all languages. + Published Languages + Unpublished Languages + Unmodified Languages + These languages haven't been created + Ready to Publish? + Ready to Save? + Send for approval + Select the date and time to publish and/or unpublish the content item. + Create new + Paste from clipboard + This item is in the Recycle Bin + + + Vytvořit novou šablonu obsahu z '%0%' + Prázdná + Vybrat obsahovou šablonu + Šablona obsahu byla vytvořena + Šablona obsahu byla vytvořena z '%0%' + Již existuje jiná šablona obsahu se stejným názvem + Šablona obsahu je předdefinovaný obsah, který si editor může vybrat jako základ pro vytváření nového obsahu + + + Klikněte pro nahrání + nebo kliknutím sem vyberte soubory + Sem můžete přetáhnout a nahrát soubory. + Tento soubor nelze nahrát, nemá povolený typ souboru + Maximální velikost souboru je + Nejvyšší složka médií + Nepodařilo se přesunout média + Nadřazené a cílové složky nemohou být stejné + Médium se nepodařilo zkopírovat + Nepodařilo se vytvořit složku pod nadřazeným id %0% + Nepodařilo se přejmenovat složku s id %0% + Přetáhněte své soubory do oblasti + + + Vytvořit nového člena + Všichni členové + Členské skupiny nemají žádné další vlastnosti pro úpravy. + + + Kde chcete vytvořit nový %0% + Vytvořit položku pod + Vyberte typ dokumentu, pro který chcete vytvořit šablonu obsahu + Zadejte název složky + Vyberte typ a titulek + "typy dokumentů".]]> + Typy dokumentů v části Nastavení.]]> + Vybraná stránka ve stromu obsahu neumožňuje vytváření žádných stránek pod ní. + Oprávnění k úpravám pro tento typ dokumentu + Vytvořit nový typ dokumentu + Typy dokumentů v části Nastavení změnou možnosti Povolit jako root v části Oprávnění.]]> + "typy medií".]]> + Vybraná média ve stromu neumožňuje vytváření pod nimi žádná další média. + Upravit oprávnění pro tento typ média + Typ dokumentu bez šablony + Nová složka + Nový datový typ + Nový skript JavaScript + Nová prázdná částečná šablona + Nové makro pro částečnou šablonu + Nová částečná šablona ze snippetu + Nové makro částečné šablony ze snippetu + Nové makro pro částečnou šablonu (bez makra) + Nový soubor stylů - stylopis + Nový soubor stylů Rich Text editoru + + + Prohlédnout svůj web + - Skrýt + Jestli se umbraco neotevírá, možná budete muset povolit na tomto webu vyskakovací okna + byl otevřený v novém okně + Restart + Navštívit + Vítejte + + + Zůstat zde + Zahodit změny + Máte neuložené změny + Opravdu chcete opustit tuto stránku? Máte neuložené změny. + Publikování zviditelní vybrané položky na webu. + Zrušení publikování odstraní vybrané položky a všechny jejich potomky z webu. + Zrušení publikování odstraní tuto stránku a všechny její potomky z webu. + Máte neuložené změny. Provedením změn typu dokumentu změny zahodíte. + + + Hotovo + Smazána %0% položka + Smazáno %0% položek + Smazána %0% z %1% položek + Smazáno %0% z %1% položek + Publikována %0% položka + Publikováno %0% položek + Publikována %0% z %1% položek + Publikováno %0% z %1% položek + Zrušeno publikování %0% položky + Zrušeno publikování %0% položek + Zrušeno publikování %0% z %1% položek + Zrušeno publikování %0% z %1% položek + Přesunuta %0% položka + Přesunuto %0% položek + Přesunuta %0% z %1% položek + Přesunuto %0% z %1% položek + Zkopírována %0% položka + Zkopírováno %0% položek + Zkopírována %0% z %1% položek + Zkopírováno %0% z %1% položek + + + Titulek odkazu + Odkaz + Kotva / dotaz + Název + Spravovat názvy hostitelů + Zavřít toto okno + Jste si jistí. že chcete odstranit + Jste si jistí, že chcete deaktivovat + Jste si jistí? + Jste si jistí? + Vyjmout + Editovat položku slovníku + Editovat jazyk + Edit selected media + Vložit místní odkaz + Vložit znak + Vložit grafický titulek + Vložit obrázek + Vložit odkaz + Kliknout pro přidání makra + Vložit tabulku + Tím se odstraní jazyk + Změna kultury jazyka může být náročná operace a bude mít za následek opětovné sestavení mezipaměti obsahu a indexů + Naposledy editováno + Odkaz + Místní odkaz: + Při používání místních odkazů vložte znak "#" před odkaz + Otevřít v novém okně? + Nastavení makra + Toto makro nemá žádné vlastnosti, které by bylo možno editovat + Vložit + Editovat oprávnění pro + Nastavit oprávnění pro + Nastavit oprávnění pro %0% pro skupinu %1% + Vyberte skupiny uživatelů, pro které chcete nastavit oprávnění + Položky koše jsou nyní mazány. Nezavírejte, prosím, toto okno, dokud operace probíhá + Koš je nyní prázdný + Odebrání položek z koše způsobí jejich trvalé odstranění + regexlib.com má v tuto chvíli nějaké problémy, které jsou mimo naší kontrolu. Omlouváme se za vzniklé nepříjemnosti.]]> + Vyhledat regulární výraz pro přidání validace formulářového prvku. Například: 'email, 'PSČ' 'URL' + Odstranit makro + Pole je vyžadování + Web je přeindexován + Mezipaměť webu byla obnovena. Všechen publikovaný obsah je nyní aktuální, zatímco nepublikovaný obsah zůstal nepublikovaný. + Mezipaměť webu bude obnovena. Všechen publikovaný obsah bude aktualizován, zatímco nepublikovaný obsah zůstane nepublikovaný. + Počet sloupců + Počet řádků + Klikněte na obrázek pro zobrazení v plné velikosti + Vybrat položku + Zobrazit položku mezipaměti + Navázat na originál + Včetně potomků + Nejpřátelštější komunita + Odkaz na stránku + Otevře propojený dokument v novém okně nebo na kartě + Odkaz na média + Vybrat počáteční uzel obsahu + Vybrat média + Vybrat typ média + Vybrat ikonu + Vybrat položku + Vybrat odkaz + Vybrat makro + Vybrat obsah + Vybrat typ obsahu + Vybrat počáteční uzel média + Vybrat člena + Vybrat skupinu členů + Vybrat typ člena + Vybrat uzel + Vybrat sekce + Vybrat uživatele + Nebyly nalezeny žádné ikony + Pro toto makro neexistují žádné parametry + K dispozici nejsou žádná makra + Externí poskytovatelé přihlášení + Podrobnosti o výjimce + Stacktrace + Vnitřní výjimka + Propojit se + Odpojit se + účet + Vybrat editora + Vybrat snippet + Tímto odstraníte uzel a všechny jeho jazyky. Pokud chcete smazat pouze jeden jazyk, měli byste zrušit publikování uzlu v tomto jazyce. + + + Nejsou žádné položky ve slovníku. + + + %0%' níže.
    Můžete přidat další jazyky v nabídce 'jazyky' nalevo.]]>
    - Název jazyka - Název jazyka + - Přehled slovníku - - - Konfigurovaní vyhledávače - Zobrazuje vlastnosti a nástroje pro libovolný konfigurovaný vyhledávač (např. pro víceindexový vyhledávač) - Hodnoty pole - Stav - Stav indexu a jeho čitelnost - Indexery - Informace o indexu - Uvádí vlastnosti indexu - Spravovat indexy Examine - Umožňuje zobrazit podrobnosti každého indexu a poskytuje některé nástroje pro správu indexů - Znovu vytvořit index - Přehled slovníku + + + Konfigurovaní vyhledávače + Zobrazuje vlastnosti a nástroje pro libovolný konfigurovaný vyhledávač (např. pro víceindexový vyhledávač) + Hodnoty pole + Stav + Stav indexu a jeho čitelnost + Indexery + Informace o indexu + Uvádí vlastnosti indexu + Spravovat indexy Examine + Umožňuje zobrazit podrobnosti každého indexu a poskytuje některé nástroje pro správu indexů + Znovu vytvořit index + V závislosti na tom, kolik obsahu je na vašem webu, může to chvíli trvat.
    Nedoporučuje se znovu vytvářet index v době vysokého provozu na webu nebo při úpravách obsahu editory. ]]> -
    - Vyhledávače - Prohledat index a zobrazit výsledky - Nástroje - Nástroje pro správu indexu - pole - Index nelze číst a bude nutné jej znovu sestavit - Proces trvá déle, než se očekávalo, zkontrolujte Umbraco log a zkontrolujte, zda během této operace nedošlo k chybám - Tento index nelze znovu sestavit, protože nemá přiřazen - IIndexPopulator - - - Zadejte Vaše uživatelské jméno - Zadejte Vaše heslo - Potvrďte heslo - Pojmenujte %0%... - Zadejte jméno... - Zadejte e-mail... - Zadejte uživatelské jméno... - Popisek... - Zadejte popis... - Pište pro vyhledání... - Pište pro filtrování... - Pište pro vložení štítků (po každém stiskněte klávesu Enter)... - Vložte svůj e-mail - Vložte zprávu... - Vaše uživatelské jméno je obvykle váš e-mail - #hodnota or ?klíč=hodnota - Vložte alias... - Generování aliasu... - - - Vytvořit vlastní zobrazení seznamu - Odebrat vlastní zobrazení seznamu - Typ obsahu, typ média nebo typ člena s tímto aliasem již existuje - - - Přejmenováno - Sem zadejte nový název složky - %0% přejmenováno na %1% - - - Přidat předlohu - Databázový datový typ - GUID editoru vlastností - Editor vlastností - Tlačítka - Povolit rozšířené nastavení pro - Povolit kontextové menu - Největší výchozí rozměr pro vložené obrázky - Související stylopisy - Zobrazit jmenovku - Šířka a výška - Všechny typy vlastností a údaje o nich - použití tohoto datového typu bude trvale smazáno, potvrďte, že je chcete odstranit - Ano, smazat - a všechny typy vlastností a data vlastností používající tento typ dat - Vyberte složku, kterou chcete přesunout - do stromové struktury níže - byla přesunuta pod - %0% vymažete vlastnosti a jejich data z následujících položek]]> - Rozumím, že tato akce odstraní vlastnosti a data založená na tomto datovém typu - - - Vaše data byla uložena, ale než budete moci publikovat tuto stránku, je třeba odstranit některé chyby: - Současný MemberShip Provider nepodporuje změnu hesla (EnablePasswordRetrieval musí mít hodnotu true) - %0% již existuje - Vyskytly se chyby: - Vyskytly se chyby: - Heslo musí být nejméně %0% znaků dlouhé a obsahovat nejméně %1% nealfanumerických znaků - %0% musí být celé číslo - Pole %0% na záložce %1% je povinné - %0% je povinné pole - %0% v %1% není ve správném formátu - %0% není ve správném formátu - - - Ze serveru byla přijata chyba - Použití daného typu souboru bylo zakázáno adminitrátorem - UPOZORNĚNÍ! I když CodeMirror je dle konfigurace povolený, je zakázaný v Internet Exploreru, protože není dost stabilní. - Vyplňte, prosím, alias i název nového typu vlastností! - Vyskytl se problém při čtení/zápisu do určeného souboru nebo adresáře - Chyba při načítání skriptu částečné šablony (soubor: %0%) - Uveďte, prosím, titulek - Vyberte, prosím, typ - Chystáte se obrázek zvětšit více, než je jeho původní rozměr. Opravdu chcete pokračovat? - Počáteční uzel je odstraněný, kontaktujte, prosím, administrátora - Před změnou stylu označte, prosím, obsah - Žádne aktivní styly nejsou dostupné - Umístěte, prosím, kurzor nalevo od těch dvou buňek, které chcete sloučit - Nemužete rozdělit buňku, která nebyla sloučená. - Tato vlastnost je neplatná - - - Volby - O... - Akce - Akce - Přidat - Alias - Vše - Jste si jistí? - Zpět - Zpět na přehled - Okraj - o - Zrušit - Okraj buňky - Vybrat - Vyčistit - Zavřít - Zavřít okno - Komentovat - Potvrdit - Omezit - Zachovat proporce - Obsah - Pokračovat - Kopírovat - Vytvořit - Databáze - Datum - Výchozí - Odstranit - Odstraněno - Odstraňování... - Vzhled - Slovník - Rozměry - Dolů - Stáhnout - Editovat - Editováno - Prvky - Email - Chyba - Pole - Najít - První - Focal point - Obecné - Skupiny - Skupina - Výška - Nápověda - Skrýt - Historie - Ikona - Id - Import - Zahrnout podsložky do vyhledávání - Info - Vnitřní okraj - Vložit - Instalovat - Neplatné - Vyrovnat - Popisek - Jazyk - Poslední - Rozvržení - Odkazy - Nahrávání - Zamčeno - Přihlášení - Odhlášení - Odhlášení - Makro - Povinné - Zpráva - Přesunout - Název - Nový - Následující - Ne - z - Vypnuto - OK - Otevřít - Zapnuto - nebo - Seřadit podle - Heslo - Cesta - Moment, prosím... - Předchozí - Vlastnosti - Obnovit - Email pro obdržení formulářových dat - Koš - Váš koš je prázdný - Znovu načíst - Zbývající - Odebrat - Přejmenovat - Obnovit - Povinné - Načíst - Zopakovat - Oprávnění - Plánované publikování - Hledat - Litujeme, ale nemůžeme najít to, co hledáte. - Nebyly přidány žádné položky - Server - Nastavení - Zobrazit - Zobrazit stránku při odeslání - Rozměr - Seřadit - Stav - Potvrdit - Zadejte - Pište pro vyhledávání... - pod - Nahoru - Aktualizovat - Povýšit - Nahrání - Url - Uživatel - Uživatelské jméno - Hodnota - Pohled - Vítejte... - Šířka - Ano - Složka - Výsledky hledání - Přesunout - Skončil jsem s přesouváním - Náhled - Změnit heslo - na - Seznam - Ukládám... - aktuální - Vložené - vybrané - Další - Články - Videa - Vyčistit - Instalování - - - Modrá - - - Přidat skupinu - Přidat vlastnost - Přidat editor - Přidat šablonu - Přidat vnořený uzel - Přidat potomka - Upravit datový typ - Navigace v sekcích - Klávesové zkratky - zobrazit klávesové zkratky - Přepnout zobrazení seznamu - Přepnout povolení jako root - Okomentovat/Odkomentovat řádky - Odebrat řádek - Kopírovat řádky nahoru - Kopírovat řádky dolů - Přesunout řádky nahoru - Přesunout řádky dolů - Obecný - Editor - Přepnout povolení jazykových verzí - - - Barva pozadí - Tučně - Barva písma - Font - Text - - - Stránka - - - Instalátor se nemůže připojit k databázi. - Nelze uložit soubor web.config. Modifikujte, prosím, připojovací řetězec manuálně. - Vyše databáze byla nalezena a je identifikována jako - Nastavení databáze - + Vyhledávače + Prohledat index a zobrazit výsledky + Nástroje + Nástroje pro správu indexu + pole + Index nelze číst a bude nutné jej znovu sestavit + Proces trvá déle, než se očekávalo, zkontrolujte Umbraco log a zkontrolujte, zda během této operace nedošlo k chybám + Tento index nelze znovu sestavit, protože nemá přiřazen + IIndexPopulator + + + Zadejte Vaše uživatelské jméno + Zadejte Vaše heslo + Potvrďte heslo + Pojmenujte %0%... + Zadejte jméno... + Zadejte e-mail... + Zadejte uživatelské jméno... + Popisek... + Zadejte popis... + Pište pro vyhledání... + Pište pro filtrování... + Pište pro vložení štítků (po každém stiskněte klávesu Enter)... + Vložte svůj e-mail + Vložte zprávu... + Vaše uživatelské jméno je obvykle váš e-mail + #hodnota or ?klíč=hodnota + Vložte alias... + Generování aliasu... + + + Vytvořit vlastní zobrazení seznamu + Odebrat vlastní zobrazení seznamu + Typ obsahu, typ média nebo typ člena s tímto aliasem již existuje + + + Přejmenováno + Sem zadejte nový název složky + %0% přejmenováno na %1% + + + Přidat předlohu + Databázový datový typ + GUID editoru vlastností + Editor vlastností + Tlačítka + Povolit rozšířené nastavení pro + Povolit kontextové menu + Největší výchozí rozměr pro vložené obrázky + Související stylopisy + Zobrazit jmenovku + Šířka a výška + Všechny typy vlastností a údaje o nich + použití tohoto datového typu bude trvale smazáno, potvrďte, že je chcete odstranit + Ano, smazat + a všechny typy vlastností a data vlastností používající tento typ dat + Vyberte složku, kterou chcete přesunout + do stromové struktury níže + byla přesunuta pod + %0% vymažete vlastnosti a jejich data z následujících položek]]> + Rozumím, že tato akce odstraní vlastnosti a data založená na tomto datovém typu + + + Vaše data byla uložena, ale než budete moci publikovat tuto stránku, je třeba odstranit některé chyby: + Současný MemberShip Provider nepodporuje změnu hesla (EnablePasswordRetrieval musí mít hodnotu true) + %0% již existuje + Vyskytly se chyby: + Vyskytly se chyby: + Heslo musí být nejméně %0% znaků dlouhé a obsahovat nejméně %1% nealfanumerických znaků + %0% musí být celé číslo + Pole %0% na záložce %1% je povinné + %0% je povinné pole + %0% v %1% není ve správném formátu + %0% není ve správném formátu + + + Ze serveru byla přijata chyba + Použití daného typu souboru bylo zakázáno adminitrátorem + UPOZORNĚNÍ! I když CodeMirror je dle konfigurace povolený, je zakázaný v Internet Exploreru, protože není dost stabilní. + Vyplňte, prosím, alias i název nového typu vlastností! + Vyskytl se problém při čtení/zápisu do určeného souboru nebo adresáře + Chyba při načítání skriptu částečné šablony (soubor: %0%) + Uveďte, prosím, titulek + Vyberte, prosím, typ + Chystáte se obrázek zvětšit více, než je jeho původní rozměr. Opravdu chcete pokračovat? + Počáteční uzel je odstraněný, kontaktujte, prosím, administrátora + Před změnou stylu označte, prosím, obsah + Žádne aktivní styly nejsou dostupné + Umístěte, prosím, kurzor nalevo od těch dvou buňek, které chcete sloučit + Nemužete rozdělit buňku, která nebyla sloučená. + Tato vlastnost je neplatná + + + Volby + O... + Akce + Akce + Přidat + Alias + Vše + Jste si jistí? + Zpět + Zpět na přehled + Okraj + o + Zrušit + Okraj buňky + Vybrat + Vyčistit + Zavřít + Zavřít okno + Komentovat + Potvrdit + Omezit + Zachovat proporce + Obsah + Pokračovat + Kopírovat + Vytvořit + Databáze + Datum + Výchozí + Odstranit + Odstraněno + Odstraňování... + Vzhled + Slovník + Rozměry + Dolů + Stáhnout + Editovat + Editováno + Prvky + Email + Chyba + Pole + Najít + První + Focal point + Obecné + Skupiny + Skupina + Výška + Nápověda + Skrýt + Historie + Ikona + Id + Import + Zahrnout podsložky do vyhledávání + Info + Vnitřní okraj + Vložit + Instalovat + Neplatné + Vyrovnat + Popisek + Jazyk + Poslední + Rozvržení + Odkazy + Nahrávání + Zamčeno + Přihlášení + Odhlášení + Odhlášení + Makro + Povinné + Zpráva + Přesunout + Název + Nový + Následující + Ne + z + Vypnuto + OK + Otevřít + Zapnuto + nebo + Seřadit podle + Heslo + Cesta + Moment, prosím... + Předchozí + Vlastnosti + Obnovit + Email pro obdržení formulářových dat + Koš + Váš koš je prázdný + Znovu načíst + Zbývající + Odebrat + Přejmenovat + Obnovit + Povinné + Načíst + Zopakovat + Oprávnění + Plánované publikování + Hledat + Litujeme, ale nemůžeme najít to, co hledáte. + Nebyly přidány žádné položky + Server + Nastavení + Zobrazit + Zobrazit stránku při odeslání + Rozměr + Seřadit + Stav + Potvrdit + Zadejte + Pište pro vyhledávání... + pod + Nahoru + Aktualizovat + Povýšit + Nahrání + URL + Uživatel + Uživatelské jméno + Hodnota + Pohled + Vítejte... + Šířka + Ano + Složka + Výsledky hledání + Přesunout + Skončil jsem s přesouváním + Náhled + Změnit heslo + na + Seznam + Ukládám... + aktuální + Vložené + vybrané + Další + Články + Videa + Instalování + + + Modrá + + + Přidat skupinu + Přidat vlastnost + Přidat editor + Přidat šablonu + Přidat vnořený uzel + Přidat potomka + Upravit datový typ + Navigace v sekcích + Klávesové zkratky + zobrazit klávesové zkratky + Přepnout zobrazení seznamu + Přepnout povolení jako root + Okomentovat/Odkomentovat řádky + Odebrat řádek + Kopírovat řádky nahoru + Kopírovat řádky dolů + Přesunout řádky nahoru + Přesunout řádky dolů + Obecný + Editor + Přepnout povolení jazykových verzí + + + Barva pozadí + Tučně + Barva písma + Font + Text + + + Stránka + + + Instalátor se nemůže připojit k databázi. + Nelze uložit soubor web.config. Modifikujte, prosím, připojovací řetězec manuálně. + Vyše databáze byla nalezena a je identifikována jako + Nastavení databáze + instalovat, abyste nainstalovali Umbraco %0% databázi ]]> - následující pro pokračování.]]> - Databáze nenalezena! Zkontrolujte, prosím, že informace v "připojovacím řetězci" souboru "web.config" jsou správné.

    + následující pro pokračování.]]> + Databáze nenalezena! Zkontrolujte, prosím, že informace v "připojovacím řetězci" souboru "web.config" jsou správné.

    Pro pokračování otevřete, prosím, soubor "web.config" (za pužití Visual Studia nebo Vašeho oblíbeného tedtového editoru), přejděte na jeho konec, přidejte připojovací řetězec pro Vaši databázi v klíčí nazvaném "umbracoDbDSN" a soubor uložte.

    - Klikněte na tlačítko zopakovat, až budete hotovi.
    - Další informace o editování souboru web.config zde.

    ]]>
    - + Klikněte na tlačítko zopakovat, až budete hotovi.
    + Další informace o editování souboru web.config zde.

    ]]>
    + Pokud je to nezbytné, kontaktujte vašeho poskytovatele hostingu. Jestliže instalujete na místní počítač nebo server, budete potřebovat informace od Vašeho systémového administrátora.]]> - Stiskněte tlačítko povýšit pro povýšení Vaší databáze na Umbraco %0%

    Neobávejte se - žádný obsah nebude odstraněn a všechno bude fungovat jak má!

    ]]>
    - Stiskněte Následující pro pokračování. ]]> - následující, pro pokračování konfiguračního průvodce]]> - Heslo výchozího uživatele musí být změněno!]]> - Výchozí uživatel byl deaktivován, nebo nemá přístup k umbracu!

    Netřeba nic dalšího dělat. Klikněte na Následující pro pokračování.]]> - Heslo výchozího uživatele bylo úspěšně změněno od doby instalace!

    Netřeba nic dalšího dělat. Klikněte na Následující pro pokračování.]]> - Heslo je změněno! - Mějte skvělý start, sledujte naše uváděcí videa - Kliknutím na tlačítko následující (nebo modifikováním umbracoConfigurationStatus v souboru web.config) přijímáte licenci tohoto software tak, jak je uvedena v poli níže. Upozorňujeme, že tato distribuce Umbraca se skládá ze dvou různých licencí, open source MIT licence pro framework a umbraco freeware licence, která pokrývá UI. - Není nainstalováno. - Dotčené soubory a složky - Další informace o nastavování oprávnění pro umbraco zde - Musíte udělit ASP.NET oprávnění měnit následující soubory/složky - Vaše nastavení oprávnění je téměř dokonalé!

    + Stiskněte Následující pro pokračování. ]]> + následující, pro pokračování konfiguračního průvodce]]> + Heslo výchozího uživatele musí být změněno!]]> + Výchozí uživatel byl deaktivován, nebo nemá přístup k umbracu!

    Netřeba nic dalšího dělat. Klikněte na Následující pro pokračování.]]> + Heslo výchozího uživatele bylo úspěšně změněno od doby instalace!

    Netřeba nic dalšího dělat. Klikněte na Následující pro pokračování.]]> + Heslo je změněno! + Mějte skvělý start, sledujte naše uváděcí videa + Kliknutím na tlačítko následující (nebo modifikováním umbracoConfigurationStatus v souboru web.config) přijímáte licenci tohoto software tak, jak je uvedena v poli níže. Upozorňujeme, že tato distribuce Umbraca se skládá ze dvou různých licencí, open source MIT licence pro framework a umbraco freeware licence, která pokrývá UI. + Není nainstalováno. + Dotčené soubory a složky + Další informace o nastavování oprávnění pro umbraco zde + Musíte udělit ASP.NET oprávnění měnit následující soubory/složky + Vaše nastavení oprávnění je téměř dokonalé!

    Můžete provozovat umbraco bez potíží, ale nebudete smět instalovat balíčky, které jsou doporučené pro plné využívání všech možností umbraca.]]>
    - Jak to vyřešit - Klikněte zde, chcete-li číst textovou verzi - výukové video o nastavovaní oprávnění pro složky umbraca, nebo si přečtěte textovou verzi.]]> - Vaše nastavení oprávnění může být problém! + Jak to vyřešit + Klikněte zde, chcete-li číst textovou verzi + výukové video o nastavovaní oprávnění pro složky umbraca, nebo si přečtěte textovou verzi.]]> + Vaše nastavení oprávnění může být problém!

    Můžete provozovat umbraco bez potíží, ale nebudete smět vytvářet složky a instalovat balíčky, které jsou doporučené pro plné využívání všech možností umbraca.]]>
    - Vaše nastavení oprívnění není připraveno pro umbraco! + Vaše nastavení oprívnění není připraveno pro umbraco!

    Abyste mohli umbraco provozovat, budete muset aktualizovat Vaše nastavení oprávnění.]]>
    - Vaše nastavení oprávnění je dokonalé!

    + Vaše nastavení oprávnění je dokonalé!

    Jste připraveni provozovat umbraco a instalovat balíčky!]]>
    - Řešení potíží se složkami - Následujte tento odkaz pro další informace o potížích s ASP.NET a vytvářením složek. - Nastavování oprávnění pro složky - Řešení potíží se složkami + Následujte tento odkaz pro další informace o potížích s ASP.NET a vytvářením složek. + Nastavování oprávnění pro složky + - Chci začít od nuly - Chci začít od nuly + zjistěte jak) + (zjistěte jak) Stále se můžete později rozhodnout nainstalovat Runway. Za tím účelem navštivte Vývojářskou sekci a zvolte Balíčky. ]]> - Právě jste vytvořili čistou platformu Umbraco. Co chcete dělat dále? - Runway je nainstalován - Právě jste vytvořili čistou platformu Umbraco. Co chcete dělat dále? + Runway je nainstalován + Toto je náš seznam doporučených modulů, vyberte ty, které chcete nainstalovat, nebo si prohlédněte úplný seznam modulů ]]> - Doporučeno pouze pro zkušené uživatele - Chci začít s jednoduchým webem - Doporučeno pouze pro zkušené uživatele + Chci začít s jednoduchým webem + "Runway" je jednoduchý web poskytující některé základní typy dokumentů a šablon. Instalátor pro Vás může Runway nainstalovat automaticky a Vy ho pak můžete jednoduše editovat, rozšířit anebo úplně odstranit. Není nezbytný a můžete bez problému provozovat Umbraco bez něj. Runway nicméně nabízí jednoduché základy založené na nejlepších praktikách tak, abyste mohli začít rychleji, než kdykoliv jindy. Rozhodnete-li se Runway si nainstalovat, můžete si volitelně vybrat základní stavební bloky zvané Moduly Runway a stránky Runway si tak vylepšit.

    @@ -886,62 +885,62 @@ Volitelné moduly: Horní navigace, Mapa webu, Kontakt, Galerie. ]]>
    - Co je Runway - Krok 1/5: Přijetí licence - Krok 2/5: Konfigurace databáze - Krok 3/5: Ověřování oprávnění k souborům - Krok 4/5: Kontrola zabezpečení umbraca - Krok 5/5: Umbraco je připraveno a můžete začít - Děkujeme, že jeste si vybrali umbraco - Prohlédněte si svůj nový web + Co je Runway + Krok 1/5: Přijetí licence + Krok 2/5: Konfigurace databáze + Krok 3/5: Ověřování oprávnění k souborům + Krok 4/5: Kontrola zabezpečení umbraca + Krok 5/5: Umbraco je připraveno a můžete začít + Děkujeme, že jeste si vybrali umbraco + Prohlédněte si svůj nový web Nainstalovali jste Runway, tak proč se nepodívat, jak Váš nový web vypadá.]]> - Další pomoc a informace + Další pomoc a informace Abyste získali pomoc od naší oceňované komunity, projděte si dokumentaci, nebo si pusťte některá videa zdarma o tom, jak vytvořit jednoduchý web, jak používat balíčky a rychlý úvod do terminologie umbraca]]> - Umbraco %0% je nainstalováno a připraveno k použití - soubor /web.config a upravit klíč AppSetting umbracoConfigurationStatus dole na hodnotu '%0%'.]]> - ihned začít kliknutím na tlačítko "Spustit Umbraco" níže.
    Jestliže je pro Vás umbraco nové, + Umbraco %0% je nainstalováno a připraveno k použití + soubor /web.config a upravit klíč AppSetting umbracoConfigurationStatus dole na hodnotu '%0%'.]]> + ihned začít kliknutím na tlačítko "Spustit Umbraco" níže.
    Jestliže je pro Vás umbraco nové, spoustu zdrojů naleznete na naších stránkách "začínáme".]]>
    - Spustit Umbraco + Spustit Umbraco Chcete-li spravovat Váš web, jednoduše přejděte do administrace umbraca a začněte přidávat obsah, upravovat šablony a stylopisy, nebo přidávat nové funkce]]> - Připojení k databázi selhalo. - Umbraco verze 3 - Umbraco verze 4 - Shlédnout - umbraca %0% jako čisté instalace nebo povýšením z 3.0. + Připojení k databázi selhalo. + Umbraco verze 3 + Umbraco verze 4 + Shlédnout + umbraca %0% jako čisté instalace nebo povýšením z 3.0.

    Stiskněte "následující" pro spuštění průvodce.]]>
    - - - Kód jazyka - Název jazyka - - - Byli jste nečinní a odhlášení proběhne automaticky za - Obnovte nyní pro uložení práce - - - Šťastnou super neděli - Šťastné šílené pondělí - Šťastné husté úterý - Šťastnou překrásnou středu - Šťastný bouřlivý čtvrtek - Šťastný bláznivý pátek - Šťastnou kočkobotu - přihlašte se níže - Přihlásit se pomocí - Relace vypršela - © 2001 - %0%
    umbraco.org

    ]]>
    - Zapomenuté heslo? - Na uvedenou adresu bude zaslán e-mail s odkazem pro obnovení hesla - Pokud odpovídá našim záznamům, bude na zadanou adresu zaslán e-mail s pokyny k obnovení hesla - Zobrazit heslo - Skrýt heslo - Vrátit se na přihlašovací obrazovku - Zadejte nové heslo - Vaše heslo bylo aktualizováno - Odkaz, na který jste klikli, je neplatný nebo jeho platnost vypršela - Umbraco: Resetování hesla - + + Kód jazyka + Název jazyka + + + Byli jste nečinní a odhlášení proběhne automaticky za + Obnovte nyní pro uložení práce + + + Šťastnou super neděli + Šťastné šílené pondělí + Šťastné husté úterý + Šťastnou překrásnou středu + Šťastný bouřlivý čtvrtek + Šťastný bláznivý pátek + Šťastnou kočkobotu + přihlašte se níže + Přihlásit se pomocí + Relace vypršela + © 2001 - %0%
    umbraco.org

    ]]>
    + Zapomenuté heslo? + Na uvedenou adresu bude zaslán e-mail s odkazem pro obnovení hesla + Pokud odpovídá našim záznamům, bude na zadanou adresu zaslán e-mail s pokyny k obnovení hesla + Zobrazit heslo + Skrýt heslo + Vrátit se na přihlašovací obrazovku + Zadejte nové heslo + Vaše heslo bylo aktualizováno + Odkaz, na který jste klikli, je neplatný nebo jeho platnost vypršela + Umbraco: Resetování hesla + @@ -1022,30 +1021,30 @@ ]]> - - - Ovládací panel - Sekce - Obsah - - - Vyberte stránku výše... - %0% byl zkopírován do %1% - Níže vyberte, kam má být dokument %0% zkopírován - %0% byl přesunut do %1% - Níže vyberte, kam má být dokument %0% přesunut - byl vybrán jako kořen Vašeho nového obsahu, klikněte na 'ok' níže. - Ještě nebyl vybrán uzel, vyberte, prosím, uzel ze seznamu výše, než stisknete 'ok' - Aktuální uzel není povolen pod vybraným uzlem kvůli jeho typu - Aktuální uzel nemůže být přesunut do jedné ze svých podstránek - Aktuální uzel nemůže být v kořeni - Operace není povolena, protože máte nedostatečná práva pro 1 nebo více podřizených dokumentů. - Vztáhněte kopírované položky k originálu - - - Upravte vaše oznámení pro %0% - Nastavení oznámení bylo uloženo pro - + + Ovládací panel + Sekce + Obsah + + + Vyberte stránku výše... + %0% byl zkopírován do %1% + Níže vyberte, kam má být dokument %0% zkopírován + %0% byl přesunut do %1% + Níže vyberte, kam má být dokument %0% přesunut + byl vybrán jako kořen Vašeho nového obsahu, klikněte na 'ok' níže. + Ještě nebyl vybrán uzel, vyberte, prosím, uzel ze seznamu výše, než stisknete 'ok' + Aktuální uzel není povolen pod vybraným uzlem kvůli jeho typu + Aktuální uzel nemůže být přesunut do jedné ze svých podstránek + Aktuální uzel nemůže být v kořeni + Operace není povolena, protože máte nedostatečná práva pro 1 nebo více podřizených dokumentů. + Vztáhněte kopírované položky k originálu + + + Upravte vaše oznámení pro %0% + Nastavení oznámení bylo uloženo pro + - Následující jazyky byly změněny %0% - Ahoj %0%

    + Následující jazyky byly změněny %0% + Ahoj %0%

    Toto je automatická zpráva informující Vás, že úloha '%1%' byla provedena na stránce '%2%' @@ -1086,623 +1085,623 @@

    Mějte hezký den!

    Zdraví umbraco robot

    ]]>
    - Byly změněny následující jazyky:

    + Byly změněny následující jazyky:

    %0% ]]>
    - [%0%] Upozornění o %1% na %2% - Upozornění - - - Akce - Vytvořeno - Vytvořit balíček - [%0%] Upozornění o %1% na %2% + Upozornění + + + Akce + Vytvořeno + Vytvořit balíček + a výběrem balíčku. Balíčky umbraco mají obvykle přípony ".umb" nebo ".zip". ]]> - Tím se balíček odstraní - Přetáhněte sem pro nahrání - Zahrnout všechny podřízené uzly - nebo kliknutím sem vyberte soubor balíčku - Nahrát balíček - Nainstalujte místní balíček výběrem ze svého počítače. Instalujte pouze balíčky ze zdrojů, které znáte a kterým důvěřujete - Nahrát další balíček - Zrušit a nahrát další balíček - Přijímám - podmínky použití - Cesta k souboru - Absolutní cesta k souboru (ie: /bin/umbraco.bin) - Nainstalováno - Nainstalované balíčky - Instalovat místní - Dokončit - Tento balíček nemá žádné zobrazení konfigurace - Zatím nebyly vytvořeny žádné balíčky - Nemáte nainstalované žádné balíčky - Balíčky v pravém horním rohu obrazovky.]]> - Akce balíčku - Web autora - Obsah balíčku - Soubory balíčku - URL ikony - Nainstalovat balíček - Licence - URL licence - Vlastnosti balíčku - Hledat balíčky - Výsledky pro - Nemohli jsme nic najít - Zkuste prosím vyhledat jiný balíček nebo procházet jednotlivé kategorie - Oblíbené - Nové - - karma body - Informace - Vlastník - Přispěvatelé - Vytvořeno - Aktuální verze - .NET verze - Počet stažení - Počet lajků - kompatibilita - Tento balíček je kompatibilní s následujícími verzemi Umbraco, jak ohlásili členové komunity. Plnou kompatibilitu nelze zaručit u verzí hlášených pod 100% - Externí zdroje - Autor - Dokumentace - Meta data balíčku - Název balíčku - Balíček neobsahuje žádné položky -
    + Tím se balíček odstraní + Přetáhněte sem pro nahrání + Zahrnout všechny podřízené uzly + nebo kliknutím sem vyberte soubor balíčku + Nahrát balíček + Nainstalujte místní balíček výběrem ze svého počítače. Instalujte pouze balíčky ze zdrojů, které znáte a kterým důvěřujete + Nahrát další balíček + Zrušit a nahrát další balíček + Přijímám + podmínky použití + Cesta k souboru + Absolutní cesta k souboru (ie: /bin/umbraco.bin) + Nainstalováno + Nainstalované balíčky + Instalovat místní + Dokončit + Tento balíček nemá žádné zobrazení konfigurace + Zatím nebyly vytvořeny žádné balíčky + Nemáte nainstalované žádné balíčky + Balíčky v pravém horním rohu obrazovky.]]> + Akce balíčku + Web autora + Obsah balíčku + Soubory balíčku + URL ikony + Nainstalovat balíček + Licence + URL licence + Vlastnosti balíčku + Hledat balíčky + Výsledky pro + Nemohli jsme nic najít + Zkuste prosím vyhledat jiný balíček nebo procházet jednotlivé kategorie + Oblíbené + Nové + + karma body + Informace + Vlastník + Přispěvatelé + Vytvořeno + Aktuální verze + .NET verze + Počet stažení + Počet lajků + kompatibilita + Tento balíček je kompatibilní s následujícími verzemi Umbraco, jak ohlásili členové komunity. Plnou kompatibilitu nelze zaručit u verzí hlášených pod 100% + Externí zdroje + Autor + Dokumentace + Meta data balíčku + Název balíčku + Balíček neobsahuje žádné položky +
    Můžete jej ze systému bezpečně odstranit kliknutím na "odebrat balíček" níže.]]>
    - Možnosti balíčku - Čti mě balíčku - Úložiště balíčku - Potvrdit odinstalování - Balíček byl odinstalován - Balíček byl úspěšně odinstalován - Odinstalovat balíček - + Možnosti balíčku + Čti mě balíčku + Úložiště balíčku + Potvrdit odinstalování + Balíček byl odinstalován + Balíček byl úspěšně odinstalován + Odinstalovat balíček + Upozornění: všechny dokumenty, media atd. závislé na položkách, které odstraníte, přestanou pracovat a mohou vést k nestabilitě systému, takže odinstalovávejte opatrně. Jste-li na pochybách, kontaktujte autora balíčku.]]> - Verze balíčku - Upgradování z verze - Balíček je již nainstalován - Tento balíček nelze nainstalovat, vyžaduje minimální verzi Umbraco - Odinstalovávám... - Stahuji... - Importuji... - Instaluji... - Restartuji, prosím čekejte... - Vše je hotovo, váš prohlížeč se nyní obnoví, prosím čekejte... - Klepnutím na tlačítko „Dokončit“ dokončete instalaci a znovu načtěte stránku. - Nahrávám balíček... - - - Vložit s úplným formatováním (nedoporučeno) - Text, který chcete vložit, obsahuje speciální znaky nebo formatování. Toto může být způsobeno kopirováním textu z Microsoft Wordu. Umbraco může odstranit speciální znaky nebo formatování, takže vložený obsah bude pro web vhodnější. - Vložit jako čistý text bez jakéhokoliv formátování - Vložit, ale odstranit formátování (doporučeno) - - - Ochrana prostřednictvím rolí - použijte členské skupiny umbraca.]]> - Musíte vytvořit členskou skupinu před tím, než můžete použít autentizaci prostřednictvím rolí - Chybová stránka - Použita, když jsou lidé přihlášení, ale nemají přístup - Vyberte, jak omezit přístup k této stránce - %0% je nyní chráněna - Ochrana odebrána z %0% - Přihlašovací stránka - Vyberte stránku, která obsahuje přihlašovací formulář - Odstranit ochranu - %0%?]]> - Vyberte stránky, které obsahují přihlašovací formulář a chybová hlášení - Vyberte role, které mají přístup k této stránce - %0%]]> - %0%]]> - Ochrana konkrétních členů - Pokud si přejete udělit přístup konkrétním členům - Nastavte přihlašovací jmého a heslo pro tuto stránku - Jednouživatelská ochrana - Jestliže chcete nastavit jenom jednoduchou ochranu prostřednictvím uživatelského jména a hesla - - - Nedostatečná uživatelská oprávnění k publikování všech potomků - Verze balíčku + Upgradování z verze + Balíček je již nainstalován + Tento balíček nelze nainstalovat, vyžaduje minimální verzi Umbraco + Odinstalovávám... + Stahuji... + Importuji... + Instaluji... + Restartuji, prosím čekejte... + Vše je hotovo, váš prohlížeč se nyní obnoví, prosím čekejte... + Klepnutím na tlačítko „Dokončit“ dokončete instalaci a znovu načtěte stránku. + Nahrávám balíček... + + + Vložit s úplným formatováním (nedoporučeno) + Text, který chcete vložit, obsahuje speciální znaky nebo formatování. Toto může být způsobeno kopirováním textu z Microsoft Wordu. Umbraco může odstranit speciální znaky nebo formatování, takže vložený obsah bude pro web vhodnější. + Vložit jako čistý text bez jakéhokoliv formátování + Vložit, ale odstranit formátování (doporučeno) + + + Ochrana prostřednictvím rolí + použijte členské skupiny umbraca.]]> + Musíte vytvořit členskou skupinu před tím, než můžete použít autentizaci prostřednictvím rolí + Chybová stránka + Použita, když jsou lidé přihlášení, ale nemají přístup + Vyberte, jak omezit přístup k této stránce + %0% je nyní chráněna + Ochrana odebrána z %0% + Přihlašovací stránka + Vyberte stránku, která obsahuje přihlašovací formulář + Odstranit ochranu + %0%?]]> + Vyberte stránky, které obsahují přihlašovací formulář a chybová hlášení + Vyberte role, které mají přístup k této stránce + %0%]]> + %0%]]> + Ochrana konkrétních členů + Pokud si přejete udělit přístup konkrétním členům + Nastavte přihlašovací jmého a heslo pro tuto stránku + Jednouživatelská ochrana + Jestliže chcete nastavit jenom jednoduchou ochranu prostřednictvím uživatelského jména a hesla + + + Nedostatečná uživatelská oprávnění k publikování všech potomků + - - - - - - - - Ověření se nezdařilo pro požadovaný jazyk '% 0%'. Tento jazyk byl uložen, ale nezveřejněn. - Probíhá publikování - počkejte, prosím... - %0% ze %1% stránek bylo publikováno... - %0% byla publikována - %0% a podstránky byly publikovány - Publikovat %0% a všechny její podstránky - ok pro publikování %0% a tedy zveřejnění jejího obsahu.

    + + + Ověření se nezdařilo pro požadovaný jazyk '% 0%'. Tento jazyk byl uložen, ale nezveřejněn. + Probíhá publikování - počkejte, prosím... + %0% ze %1% stránek bylo publikováno... + %0% byla publikována + %0% a podstránky byly publikovány + Publikovat %0% a všechny její podstránky + ok pro publikování %0% a tedy zveřejnění jejího obsahu.

    Můžete publikovat tuto stránku a všechny její podstránky zatrhnutím publikovat všchny podstránky níže. ]]>
    - Zahrnout nepublikované podřízené stránky - - - Nenakonfigurovali jste žádné schválené barvy - - - Můžete vybrat pouze položky typu (typů): %0% - Vybrali jste aktuálně odstraněnou položku obsahu nebo položku v koši - Vybrali jste aktuálně odstraněné položky obsahu nebo položky v koši - - - Smazaná položka - Vybrali jste aktuálně odstraněnou položku média nebo položku v koši - Vybrali jste aktuálně odstraněné položky médií nebo položky médií v koši - V koši - - - zadejte externí odkaz - zvolte interní stránku - Nadpis - Odkaz - Otevřít v novém okně - zadejte titulek - Zadejte odkaz - - Přidat vnější odkaz - Přidat vnitřní odkaz - Přidat - Vnitřní stránka - URL - Posunout dolů - Posunout nahoru - Odebrat odkaz - - - Zrušit oříznutí - Uložit oříznutí - Přidat nové oříznutí - Hotovo - Vrátit změny - - - Vyberte verzi, kterou chcete porovnat s aktuální verzí - Současná verze - Červený text nebude ve vybrané verzi zobrazen, zelený znamená přidaný].]]> - Dokument byl vrácen na starší verzi - Tohle zobrazuje vybranou verzi jako html, jestliže chcete vidět rozdíly mezi 2 verzemi najednou, použijte rozdílové zobrazení - Vrátit starší verzi - Vybrat verzi - Zobrazení - - - Editovat skriptovací soubor - - - Obsah - Formuláře - Média - Členové - Balíčky - Nastavení - Překlad - Uživatelé - - Domovník - Kurýr - Vývojář - Průvodce nastavením Umbraca - Zpravodaje - Statistiky - Nápověda - - - Příručky - Nejlepší videopříručky Umbraco - Navštívit our.umbraco.com - Navštívit umbraco.tv - - - Výchozí šablona - Pro importování typu dokumentu vyhledejte soubor ".udt" ve svém počítači tak, že kliknete na tlačítko "Prohledat" a pak kliknete na "Import" (na následující obrazovce budete vyzváni k potvrzení) - Název nové záložky - Typ uzlu - Typ - Stylopis - Skript - Záložka - Název záložky - Záložky - Nadřazený typ obsahu povolen - Tento typ obsahu používá - jako nadřazený typ obsahu. Záložky z nadřazených typů obsahu nejsou zobrazeny a mohou byt editovány pouze na nadřazených typech obsahu samotných - Na této záložce nejsou definovány žádné vlastnosti. Pro vytvoření nové vlastnosti klikněte na odkaz "přidat novou vlastnost" nahoře. - Vytvořit odpovídající šablonu - Přidat ikonu - - - Řazení - Datum vytvoření - Třídění bylo ukončeno. - Abyste nastavili, jak mají být položky seřazeny, přetáhněte jednotlivé z nich nahoru či dolů. Anebo klikněte na hlavičku sloupce pro setřídění celé kolekce - - Tato položka nemá vnořené položky k seřazení - - - Validace - Před uložením položky je nutné opravit chyby - Chyba - Uloženo - Nedostatečná uživatelská oprávnění, operace nemohla být dokončena - Zrušeno - Operace byla zrušena doplňkem třetí strany - Typ vlastnosti už existuje - Typ vlastnosti vytvořen - Datový typ: %1%]]> - Typ vlastnosti odstraněn - Typ vlastnosti uložen - Záložka vytvořena - Záložka odstraněna - Záložka s id: %0% odstraněna - Stylopis nebyl uložen - Stylopis byl uložen - Stylopis byl uložen bez chyb - Datový typ byl uložen - Položka slovníku byla uložena - Obsah byl publikován - a je viditelný na webu - %0% dokumentů zveřejněných a viditelných na webu - %0% zveřejněných a viditelných na webu - %0% dokumentů zveřejněných pro jazyky %1% a viditelných na webu - Obsah byl uložen - Nezapomeňte na publikování, aby se změny projevily - Načasování publikování bylo aktualizováno - %0% uloženo - Odeslat ke schválení - Změny byly odeslány ke schválení - %0% změn bylo odesláno ke schválení - Médium bylo uloženo - Médium bylo uloženo bez chyb - Člen byl uložen - Skupina členů byla uložena - Vlastnost stylopisu byla uložena - Stylopis byl uložen - Šablona byla uložena - Chyba při ukládání uživatele (zkontrolujte log) - Uživatel byl uložen - Typ uživatele byl uložen - Skupina uživatelů byla uložena - Jazyky a názvy hostitelů byly uloženy - Při ukládání jazyků a názvů hostitelů došlo k chybě - Soubor nebyl uložen - soubor nemohl být uložen. Zkontrolujte, prosím, oprávnění k souboru - Soubor byl uložen - Soubor byl uložen bez chyb - Jazyk byl uložen - Typ média byl uložen - Typ člena byl uložen - Skupina členů byla uložena - Šablona nebyla uložena - Ujistěte se, prosím, že nemáte 2 šablony se stejným aliasem - Šablona byla uložena - Šablona byla uložena bez chyb! - Publikování obsahu bylo zrušeno - Varianta obsahu %0% nebyla publikována - Povinný jazyk '%0%' nebyl publikován. Všechny jazyky pro tuto položku obsahu nejsou nyní publikovány. - Částečný pohled byl uložen - Částečný pohled byl uložen bez chyb! - Částečný pohled nebyl uložen - Při ukládání souboru došlo k chybě. - Oprávnění byla uložena pro - Smazáno %0% skupin uživatelů - %0% bylo smazáno - Povoleno %0% uživatelů - Zakázáno %0% uživatelů - %0% je nyní povoleno - %0% je nyní zakázáno - Skupiny uživatelů byly nastaveny - Odemčeno %0% uživatelů - %0% je nyný odemčeno - Člen byl exportován do souboru - Při exportu člena došlo k chybě - Uživatel %0% byl smazán - Pozvat uživatele - Pozvánka byla znovu odeslána na %0% - Dokument nelze publikovat, protože %0% není publikována - Ověření pro jazyk '%0%' se nezdařilo - Typ dokumentu byl exportován do souboru - Při exportu typu dokumentu došlo k chybě - Datum vydání nemůže být v minulosti - Nelze naplánovat publikování dokumentu, protože %0% není publikována - Dokument nelze naplánovat na publikování, protože „%0%“ má datum zveřejnění později než nepovinný jazyk - Datum vypršení platnosti nemůže být v minulosti - Datum vypršení nemůže být před datem vydání - - Publikování bylo zrušeno doplňkem třetí strany - Publikování se nezdařilo, protože nadřazená stránka není publikována - - - Přidat styl - Upravit styl - Styly Rich Text editoru - Definujte styly, které by měly být k dispozici v editoru formátovaného textu pro tuto šablonu stylů - Editovat stylopis - Editovat vlastnost stylopisu - Název, který identifikuje vlastnost stylu v editoru formátovaného textu - Náhled - Jak bude text vypadat v Rich Text editoru. - CSS identifikátor nebo třída - Používá syntaxi CSS, např. "h1" nebo ".redHeader" - Styly - CSS, který by měl být použit v editoru RTF, např. "color:red;" - Kód - Rich Text editor - - Používá CSS syntaxi např.: h1, .redHeader, .blueTex - - - Nepodařilo se odstranit šablonu s ID %0% - Editovat šablonu - Sekce - Vložit obsahovou oblast - Vložit zástupce obsahové oblasti - Vložit - Vyberte, co chcete vložit do své šablony - Vložit položku slovníku - Položka slovníku je zástupný symbol pro překladatelný text, což usnadňuje vytváření návrhů pro vícejazyčné webové stránky. - Vložit makro - - Makro je konfigurovatelná součást, která je skvělá pro opakovaně použitelné části návrhu, kde potřebujete předat parametry, jako jsou galerie, formuláře a seznamy. - - Vložit pole stránky umbraco - Zobrazuje hodnotu pojmenovaného pole z aktuální stránky s možnostmi upravit hodnotu nebo alternativní hodnoty. - Částečná šablona - - Částečná šablona je samostatný soubor šablony, který lze vykreslit uvnitř jiné šablony. Je to skvělé pro opakované použití nebo pro oddělení složitých šablon. - - Nadřazená šablona - Žádný master - Vykreslit podřízenou šablonu - Zahrnout nepublikované podřízené stránky + + + Nenakonfigurovali jste žádné schválené barvy + + + Můžete vybrat pouze položky typu (typů): %0% + Vybrali jste aktuálně odstraněnou položku obsahu nebo položku v koši + Vybrali jste aktuálně odstraněné položky obsahu nebo položky v koši + + + Smazaná položka + Vybrali jste aktuálně odstraněnou položku média nebo položku v koši + Vybrali jste aktuálně odstraněné položky médií nebo položky médií v koši + V koši + + + zadejte externí odkaz + zvolte interní stránku + Nadpis + Odkaz + Otevřít v novém okně + zadejte titulek + Zadejte odkaz + + Přidat vnější odkaz + Přidat vnitřní odkaz + Přidat + Vnitřní stránka + URL + Posunout dolů + Posunout nahoru + Odebrat odkaz + + + Zrušit oříznutí + Uložit oříznutí + Přidat nové oříznutí + Hotovo + Vrátit změny + + + Vyberte verzi, kterou chcete porovnat s aktuální verzí + Současná verze + Červený text nebude ve vybrané verzi zobrazen, zelený znamená přidaný].]]> + Dokument byl vrácen na starší verzi + Tohle zobrazuje vybranou verzi jako html, jestliže chcete vidět rozdíly mezi 2 verzemi najednou, použijte rozdílové zobrazení + Vrátit starší verzi + Vybrat verzi + Zobrazení + + + Editovat skriptovací soubor + + + Obsah + Formuláře + Média + Členové + Balíčky + Nastavení + Překlad + Uživatelé + + Domovník + Kurýr + Vývojář + Průvodce nastavením Umbraca + Zpravodaje + Statistiky + Nápověda + + + Příručky + Nejlepší videopříručky Umbraco + Navštívit our.umbraco.com + Navštívit umbraco.tv + + + Výchozí šablona + Pro importování typu dokumentu vyhledejte soubor ".udt" ve svém počítači tak, že kliknete na tlačítko "Prohledat" a pak kliknete na "Import" (na následující obrazovce budete vyzváni k potvrzení) + Název nové záložky + Typ uzlu + Typ + Stylopis + Skript + Záložka + Název záložky + Záložky + Nadřazený typ obsahu povolen + Tento typ obsahu používá + jako nadřazený typ obsahu. Záložky z nadřazených typů obsahu nejsou zobrazeny a mohou byt editovány pouze na nadřazených typech obsahu samotných + Na této záložce nejsou definovány žádné vlastnosti. Pro vytvoření nové vlastnosti klikněte na odkaz "přidat novou vlastnost" nahoře. + Vytvořit odpovídající šablonu + Přidat ikonu + + + Řazení + Datum vytvoření + Třídění bylo ukončeno. + Abyste nastavili, jak mají být položky seřazeny, přetáhněte jednotlivé z nich nahoru či dolů. Anebo klikněte na hlavičku sloupce pro setřídění celé kolekce + + Tato položka nemá vnořené položky k seřazení + + + Validace + Před uložením položky je nutné opravit chyby + Chyba + Uloženo + Nedostatečná uživatelská oprávnění, operace nemohla být dokončena + Zrušeno + Operace byla zrušena doplňkem třetí strany + Typ vlastnosti už existuje + Typ vlastnosti vytvořen + Datový typ: %1%]]> + Typ vlastnosti odstraněn + Typ vlastnosti uložen + Záložka vytvořena + Záložka odstraněna + Záložka s id: %0% odstraněna + Stylopis nebyl uložen + Stylopis byl uložen + Stylopis byl uložen bez chyb + Datový typ byl uložen + Položka slovníku byla uložena + Obsah byl publikován + a je viditelný na webu + %0% dokumentů zveřejněných a viditelných na webu + %0% zveřejněných a viditelných na webu + %0% dokumentů zveřejněných pro jazyky %1% a viditelných na webu + Obsah byl uložen + Nezapomeňte na publikování, aby se změny projevily + Načasování publikování bylo aktualizováno + %0% uloženo + Odeslat ke schválení + Změny byly odeslány ke schválení + %0% změn bylo odesláno ke schválení + Médium bylo uloženo + Médium bylo uloženo bez chyb + Člen byl uložen + Skupina členů byla uložena + Vlastnost stylopisu byla uložena + Stylopis byl uložen + Šablona byla uložena + Chyba při ukládání uživatele (zkontrolujte log) + Uživatel byl uložen + Typ uživatele byl uložen + Skupina uživatelů byla uložena + Jazyky a názvy hostitelů byly uloženy + Při ukládání jazyků a názvů hostitelů došlo k chybě + Soubor nebyl uložen + soubor nemohl být uložen. Zkontrolujte, prosím, oprávnění k souboru + Soubor byl uložen + Soubor byl uložen bez chyb + Jazyk byl uložen + Typ média byl uložen + Typ člena byl uložen + Skupina členů byla uložena + Šablona nebyla uložena + Ujistěte se, prosím, že nemáte 2 šablony se stejným aliasem + Šablona byla uložena + Šablona byla uložena bez chyb! + Publikování obsahu bylo zrušeno + Varianta obsahu %0% nebyla publikována + Povinný jazyk '%0%' nebyl publikován. Všechny jazyky pro tuto položku obsahu nejsou nyní publikovány. + Částečný pohled byl uložen + Částečný pohled byl uložen bez chyb! + Částečný pohled nebyl uložen + Při ukládání souboru došlo k chybě. + Oprávnění byla uložena pro + Smazáno %0% skupin uživatelů + %0% bylo smazáno + Povoleno %0% uživatelů + Zakázáno %0% uživatelů + %0% je nyní povoleno + %0% je nyní zakázáno + Skupiny uživatelů byly nastaveny + Odemčeno %0% uživatelů + %0% je nyný odemčeno + Člen byl exportován do souboru + Při exportu člena došlo k chybě + Uživatel %0% byl smazán + Pozvat uživatele + Pozvánka byla znovu odeslána na %0% + Dokument nelze publikovat, protože %0% není publikována + Ověření pro jazyk '%0%' se nezdařilo + Typ dokumentu byl exportován do souboru + Při exportu typu dokumentu došlo k chybě + Datum vydání nemůže být v minulosti + Nelze naplánovat publikování dokumentu, protože %0% není publikována + Dokument nelze naplánovat na publikování, protože „%0%“ má datum zveřejnění později než nepovinný jazyk + Datum vypršení platnosti nemůže být v minulosti + Datum vypršení nemůže být před datem vydání + + Publikování bylo zrušeno doplňkem třetí strany + Publikování se nezdařilo, protože nadřazená stránka není publikována + + + Přidat styl + Upravit styl + Styly Rich Text editoru + Definujte styly, které by měly být k dispozici v editoru formátovaného textu pro tuto šablonu stylů + Editovat stylopis + Editovat vlastnost stylopisu + Název, který identifikuje vlastnost stylu v editoru formátovaného textu + Náhled + Jak bude text vypadat v Rich Text editoru. + CSS identifikátor nebo třída + Používá syntaxi CSS, např. "h1" nebo ".redHeader" + Styly + CSS, který by měl být použit v editoru RTF, např. "color:red;" + Kód + Rich Text editor + + Používá CSS syntaxi např.: h1, .redHeader, .blueTex + + + Nepodařilo se odstranit šablonu s ID %0% + Editovat šablonu + Sekce + Vložit obsahovou oblast + Vložit zástupce obsahové oblasti + Vložit + Vyberte, co chcete vložit do své šablony + Vložit položku slovníku + Položka slovníku je zástupný symbol pro překladatelný text, což usnadňuje vytváření návrhů pro vícejazyčné webové stránky. + Vložit makro + + Makro je konfigurovatelná součást, která je skvělá pro opakovaně použitelné části návrhu, kde potřebujete předat parametry, jako jsou galerie, formuláře a seznamy. + + Vložit pole stránky umbraco + Zobrazuje hodnotu pojmenovaného pole z aktuální stránky s možnostmi upravit hodnotu nebo alternativní hodnoty. + Částečná šablona + + Částečná šablona je samostatný soubor šablony, který lze vykreslit uvnitř jiné šablony. Je to skvělé pro opakované použití nebo pro oddělení složitých šablon. + + Nadřazená šablona + Žádný master + Vykreslit podřízenou šablonu + @RenderBody(). ]]> - Definujte pojmenovanou sekci - Definujte pojmenovanou sekci + @section {...}. Ta může být vykreslena v konkrétní oblasti nadřazené šablony pomocí @RenderSection. ]]> - Vykreslit pojmenovanou sekci - Vykreslit pojmenovanou sekci + @RenderSection(name). Tím se vykreslí oblast podřízené šablony, která je zabalena do odpovídající definice @section[name] {...}. ]]> - Název sekce - Sekce je povinná - Název sekce + Sekce je povinná + @section, jinak se zobrazí chyba. ]]> - Tvůrce dotazů - položky vráceny, do - zkopírovat do schránky - Chci - veškerý obsah - obsah typu "%0%" - z(e) - můj web - kde - a - je - není - před - před (včetně zvoleného datumu) - po - po (včetně zvoleného datumu) - rovná se - nerovná se - obsahuje - neobsahuje - větší než - větší nebo rovno - menší než - menší nebo rovno - Id - Název - Datum vytvoření - Datum poslední aktualizace - řadit podle - vzestupně - sestupně - Šablona - - Rychlá příručka k šablonovým značkám umbraca - - - Obrázek - Makro - Vybrat typ obsahu - Vybrat rozvržení - Přidat řádek - Přidat obsah - Zahodit obsah - Nastavení aplikováno - Tento obsah zde není povolen - Tento obsah je zde povolen - Klepněte pro vložení - Klepnutím vložíte obrázek - Titulek obrázku... - Zde pište... - Rozvržení mřížky - Rozvržení je celková pracovní oblast pro editor mřížky, obvykle potřebujete pouze jedno nebo dvě různá rozvržení - Přidat rozvržení mřížky - Upravte rozvržení nastavením šířky sloupců a přidáním dalších sekcí - Konfigurace řádků - Řádky jsou předdefinované buňky uspořádané vodorovně - Přidat konfiguraci řádku - Upravte řádek nastavením šířky buněk a přidáním dalších buněk - Sloupce - Celkový počet sloupců v rozvržení mřížky - Nastavení - Nakonfigurujte, jaká nastavení mohou editoři změnit - Styly - Nakonfigurujte, co mohou editoři stylů změnit - Povolit všechny editory - Povolit všechny konfigurace řádků - Maximální počet položek - Nechte prázdné nebo nastavte na 0 pro neomezené - Nastavit jako výchozí - Vyberat navíc - Zvolit výchozí - jsou přidány - Varování - Odstraňujete konfiguraci řádku - - Odstranění názvu konfigurace řádku povede ke ztrátě dat pro veškerý existující obsah založený na této konfiguraci. - - - - Složení - Skupina - Nepřidali jste žádné skupiny - Přidat skupinu - Zděděno od - Přidat vlastnost - Požadovaný popisek - Povolit zobrazení seznamu - Nakonfiguruje položku obsahu tak, aby zobrazovala seznam svých potomků a seznam potomků, které je možné prohledávat, potomci se nebudou zobrazovat ve stromu - Povolené šablony - Vyberte, kteří editoři šablon mohou používat obsah tohoto typu - Povolit jako root - Povolit editorům vytvářet obsah tohoto typu v kořenovém adresáři stromu obsahu. - Povolené typy podřízených uzlů - Povolit vytváření obsahu zadaných typů pod obsahem tohoto typu. - Vybrat podřízený uzel - Zdědí záložky a vlastnosti z existujícího typu dokumentu. Nové záložky budou přidány do aktuálního typu dokumentu nebo sloučeny, pokud existuje záložka se stejným názvem. - Tento typ obsahu se používá ve složení, a proto jej nelze poskládat. - Nejsou k dispozici žádné typy obsahu, které lze použít jako složení. - Odebráním složení odstraníte všechna související data vlastností. Jakmile uložíte typ dokumentu, již není cesta zpět. - Vytvořit nové - Použít existující - Nastavení editoru - Konfigurace - Ano, smazat - bylo přesunuto pod - bylo zkopírováno pod - Vybrat složku, kterou chcete přesunout - Vybrat složku, kterou chcete kopírovat - ve stromové struktuře níže - Všechny typy dokumentů - Všechny dokumenty - Všechny média - použití tohoto typu dokumentu bude trvale smazáno, prosím potvrďte, že je chcete také odstranit. - použití tohoto typu média bude trvale smazáno, potvrďte, že je chcete také odstranit. - použití tohoto typu člena bude trvale smazáno, potvrďte, že je chcete také odstranit - a všechny dokumenty používající tento typ - a všechny mediální položky používající tento typ - a všichni členové používající tento typ - Člen může upravovat - Povolit editaci této vlastnosti členem na jeho stránce profilu - Obsahuje citlivá data - Skrýt tuto hodnotu vlastnosti před editory obsahu, kteří nemají přístup k prohlížení citlivých informací - Zobrazit v profilu člena - Povolit zobrazení této vlastnosti na stránce profilu člena - záložka nemá žádné řazení - Kde se toto složení používá? - Toto složení se v současnosti používá ve složení následujících typů obsahu: - Povolit různé jazyky - Povolit editorům vytvářet obsah tohoto typu v různých jazycích. - Povolit různé jazyky - Typ prvku - Je typ prvku - Typ prvku je určen k použití například ve vnořeném obsahu, nikoli ve stromu. - Jakmile byl typ dokumentu použit k vytvoření jedné nebo více položek obsahu, nelze jej změnit na typ prvku. - To neplatí pro typ prvku - V této vlastnosti jste provedli změny. Opravdu je chcete zahodit? - - - Přidat jazyk - Povinný jazyk - Před publikováním uzlu je nutné vyplnit vlastnosti v tomto jazyce. - Výchozí jazyk - Web Umbraco může mít nastaven pouze jeden výchozí jazyk. - Přepnutí výchozího jazyka může mít za následek chybějící výchozí obsah. - Nahradit nepřeložený obsah za - Žádné nahrazení nepřeloženého jazyka - Chcete-li povolit automatické zobrazení vícejazyčného obsahu v jiném jazyce, pokud není v požadovaném jazyce přeložen, vyberte jej zde. - Nahrazujicí jazyk - žádný - - - Přidat parametr - Upravit parametr - Zadejte název makra - Parametry - Definujte parametry, které by měly být k dispozici při použití tohoto makra. - Vyberte soubor makra pro částečnou šablonu - - - Stavební modely - to může chvíli trvat, nebojte se - Generované modely - Modely nelze vygenerovat - Generování modelů selhalo, viz výjimka v logu Umbraca - - - Přidat záložní pole - Náhradní pole - Přidat výchozí hodnotu - Výchozí hodnota - Alternativní pole - Alternativní text - Velká a malá písmena - Kódování - Vybrat pole - Konvertovat - Ano, převést konce řádků - Nahrazuje nové řádky html tagem &lt;br&gt; - Vlastní pole - Ano, pouze datum - Formát a kódování - Formátovat jako datum - Naformátuje hodnotu jako datum nebo datum s časem podle aktivního jazyka - HTML kódování - Nahradí speciální znaky jejich HTML ekvivalentem. - Bude vloženo za hodnotou pole - Bude vloženo před hodnotou pole - Malá písmena - Upravit výstup - Nic - Ukázka výstupu - Vložit za polem - Vložit před polem - Rekurzivní - Ano, udělej to rekurzivní - Oddělovač - Standardní pole - Velká písmena - Kódování URL - Formátuje speciální znaky v URL adresách - Bude použito pouze pokud jsou pole nahoře prázdná - Toto pole bude použito pouze pokud je primární pole prázdné - Ano, s časem. Oddělovač: - - - Podrobnosti překladu - Stáhnout XML DTD - Pole - Zahrnout podstránky - Tvůrce dotazů + položky vráceny, do + zkopírovat do schránky + Chci + veškerý obsah + obsah typu "%0%" + z(e) + můj web + kde + a + je + není + před + před (včetně zvoleného datumu) + po + po (včetně zvoleného datumu) + rovná se + nerovná se + obsahuje + neobsahuje + větší než + větší nebo rovno + menší než + menší nebo rovno + Id + Název + Datum vytvoření + Datum poslední aktualizace + řadit podle + vzestupně + sestupně + Šablona + + Rychlá příručka k šablonovým značkám umbraca + + + Obrázek + Makro + Vybrat typ obsahu + Vybrat rozvržení + Přidat řádek + Přidat obsah + Zahodit obsah + Nastavení aplikováno + Tento obsah zde není povolen + Tento obsah je zde povolen + Klepněte pro vložení + Klepnutím vložíte obrázek + Titulek obrázku... + Zde pište... + Rozvržení mřížky + Rozvržení je celková pracovní oblast pro editor mřížky, obvykle potřebujete pouze jedno nebo dvě různá rozvržení + Přidat rozvržení mřížky + Upravte rozvržení nastavením šířky sloupců a přidáním dalších sekcí + Konfigurace řádků + Řádky jsou předdefinované buňky uspořádané vodorovně + Přidat konfiguraci řádku + Upravte řádek nastavením šířky buněk a přidáním dalších buněk + Sloupce + Celkový počet sloupců v rozvržení mřížky + Nastavení + Nakonfigurujte, jaká nastavení mohou editoři změnit + Styly + Nakonfigurujte, co mohou editoři stylů změnit + Povolit všechny editory + Povolit všechny konfigurace řádků + Maximální počet položek + Nechte prázdné nebo nastavte na 0 pro neomezené + Nastavit jako výchozí + Vyberat navíc + Zvolit výchozí + jsou přidány + Varování + Odstraňujete konfiguraci řádku + + Odstranění názvu konfigurace řádku povede ke ztrátě dat pro veškerý existující obsah založený na této konfiguraci. + + + + Složení + Skupina + Nepřidali jste žádné skupiny + Přidat skupinu + Zděděno od + Přidat vlastnost + Požadovaný popisek + Povolit zobrazení seznamu + Nakonfiguruje položku obsahu tak, aby zobrazovala seznam svých potomků a seznam potomků, které je možné prohledávat, potomci se nebudou zobrazovat ve stromu + Povolené šablony + Vyberte, kteří editoři šablon mohou používat obsah tohoto typu + Povolit jako root + Povolit editorům vytvářet obsah tohoto typu v kořenovém adresáři stromu obsahu. + Povolené typy podřízených uzlů + Povolit vytváření obsahu zadaných typů pod obsahem tohoto typu. + Vybrat podřízený uzel + Zdědí záložky a vlastnosti z existujícího typu dokumentu. Nové záložky budou přidány do aktuálního typu dokumentu nebo sloučeny, pokud existuje záložka se stejným názvem. + Tento typ obsahu se používá ve složení, a proto jej nelze poskládat. + Nejsou k dispozici žádné typy obsahu, které lze použít jako složení. + Odebráním složení odstraníte všechna související data vlastností. Jakmile uložíte typ dokumentu, již není cesta zpět. + Vytvořit nové + Použít existující + Nastavení editoru + Konfigurace + Ano, smazat + bylo přesunuto pod + bylo zkopírováno pod + Vybrat složku, kterou chcete přesunout + Vybrat složku, kterou chcete kopírovat + ve stromové struktuře níže + Všechny typy dokumentů + Všechny dokumenty + Všechny média + použití tohoto typu dokumentu bude trvale smazáno, prosím potvrďte, že je chcete také odstranit. + použití tohoto typu média bude trvale smazáno, potvrďte, že je chcete také odstranit. + použití tohoto typu člena bude trvale smazáno, potvrďte, že je chcete také odstranit + a všechny dokumenty používající tento typ + a všechny mediální položky používající tento typ + a všichni členové používající tento typ + Člen může upravovat + Povolit editaci této vlastnosti členem na jeho stránce profilu + Obsahuje citlivá data + Skrýt tuto hodnotu vlastnosti před editory obsahu, kteří nemají přístup k prohlížení citlivých informací + Zobrazit v profilu člena + Povolit zobrazení této vlastnosti na stránce profilu člena + záložka nemá žádné řazení + Kde se toto složení používá? + Toto složení se v současnosti používá ve složení následujících typů obsahu: + Povolit různé jazyky + Povolit editorům vytvářet obsah tohoto typu v různých jazycích. + Povolit různé jazyky + Typ prvku + Je typ prvku + Typ prvku je určen k použití například ve vnořeném obsahu, nikoli ve stromu. + Jakmile byl typ dokumentu použit k vytvoření jedné nebo více položek obsahu, nelze jej změnit na typ prvku. + To neplatí pro typ prvku + V této vlastnosti jste provedli změny. Opravdu je chcete zahodit? + + + Přidat jazyk + Povinný jazyk + Před publikováním uzlu je nutné vyplnit vlastnosti v tomto jazyce. + Výchozí jazyk + Web Umbraco může mít nastaven pouze jeden výchozí jazyk. + Přepnutí výchozího jazyka může mít za následek chybějící výchozí obsah. + Nahradit nepřeložený obsah za + Žádné nahrazení nepřeloženého jazyka + Chcete-li povolit automatické zobrazení vícejazyčného obsahu v jiném jazyce, pokud není v požadovaném jazyce přeložen, vyberte jej zde. + Nahrazujicí jazyk + žádný + + + Přidat parametr + Upravit parametr + Zadejte název makra + Parametry + Definujte parametry, které by měly být k dispozici při použití tohoto makra. + Vyberte soubor makra pro částečnou šablonu + + + Stavební modely + to může chvíli trvat, nebojte se + Generované modely + Modely nelze vygenerovat + Generování modelů selhalo, viz výjimka v logu Umbraca + + + Přidat záložní pole + Náhradní pole + Přidat výchozí hodnotu + Výchozí hodnota + Alternativní pole + Alternativní text + Velká a malá písmena + Kódování + Vybrat pole + Konvertovat + Ano, převést konce řádků + Nahrazuje nové řádky html tagem &lt;br&gt; + Vlastní pole + Ano, pouze datum + Formát a kódování + Formátovat jako datum + Naformátuje hodnotu jako datum nebo datum s časem podle aktivního jazyka + HTML kódování + Nahradí speciální znaky jejich HTML ekvivalentem. + Bude vloženo za hodnotou pole + Bude vloženo před hodnotou pole + Malá písmena + Upravit výstup + Nic + Ukázka výstupu + Vložit za polem + Vložit před polem + Rekurzivní + Ano, udělej to rekurzivní + Oddělovač + Standardní pole + Velká písmena + Kódování URL + Formátuje speciální znaky v URL adresách + Bude použito pouze pokud jsou pole nahoře prázdná + Toto pole bude použito pouze pokud je primární pole prázdné + Ano, s časem. Oddělovač: + + + Podrobnosti překladu + Stáhnout XML DTD + Pole + Zahrnout podstránky + - Žádní uživatelé překladatelé nebyli nalezeni. Vytvořte, prosím, překladatele před tím, než začnete posílat obsah k překladu - Stránka '%0%' byla poslána k překladu - Poslat stránku '%0%' k překladu - Slov celkem - Přeložit do - Překlad hotov. - Klikutím níže můžete vidět stránky, které jste právě přeložili. Jestliže je nalezena originální stránka, dostanete srovnání 2 stránek. - Překlad selhal, xml soubor může být poškozený - Možnosti překladu - Překladatel - Nahrát xml překladu - - - Obsah - Šablony obsahu - Média - Prohlížeč mezipaměti - Koš - Vytvořené balíčky - Datové typy - Slovník - Instalované balíčky - Instalovat téma - Instalovat startovní sadu - Jazyky - Instalovat místní balíček - Makra - Typy medií - Členové - Skupiny členů - Role - Typy členů - Typy dokumentů - Typy vztahů/vazeb - Balíčky - Balíčky - Částečné šablony - Makra částečných šablon - Instalovat z úložiště - Instalovat Runway - Moduly Runway - Skriptovací soubory - Skripty - Stylopisy - Šablony - Prohlížeč logu - Uživatelé - Nastavení - Šablony - Třetí strana - - Oprávnění uživatele - Typy uživatelů - - - Nová aktualizace je připrvena - %0% je připraven, klikněte zde pro stažení - Žádné spojení se serverem - Chyba při kontrole aktualizace. Zkontrolujte, prosím, trasovací zásobník pro další informace - - - Přístupy - Na základě přiřazených skupin a počátečních uzlů má uživatel přístup k následujícím uzlům - Přiřadit přístup - Administrátor - Pole kategorie - Uživatel byl vytvořen - Změnit heslo - Změnit fotku - Změnit heslo - nebyl uzamčen - Heslo nebylo změněno - Potvrdit heslo - Můžete změnit své heslo pro přístup do administrace Umbraca vyplněním formuláře níže a kliknutím na tlačítko 'Změnit Heslo' - Kanál obsahu - Vytvořit dalšího uživatele - Vytvořte nové uživatele a udělte mu přístup do Umbraco. Po vytvoření nového uživatele bude vygenerováno heslo, které s ním můžete sdílet. - Popis - Deaktivovat uživatele - Typ dokumentu - Editor - Výtah - Neúspěšné pokusy o přihlášení - Přejít na uživatelský profil - Přidáním skupin přidělte přístup a oprávnění - Pozvat dalšího uživatele - Pozvěte nové uživatele, a poskytněte jim přístup do Umbraco. Uživatelům bude zaslán e-mail s pozvánkou a s informacemi o tom, jak se přihlásit do Umbraco. Pozvánky mají platnost 72 hodin. - Jazyk - Nastavte jazyk, který uvidíte v nabídkách a dialogových oknech - Poslední datum uzamčení - Poslední přihlášení - Heslo bylo naposledy změněno - Přihlašovací jméno - Úvodní uzel v knihovně medií - Omezte knihovnu médií na konkrétní počáteční uzel - Úvodní uzly v knihovně medií - Omezte knihovnu médií na konkrétní počáteční uzly - Sekce - Deaktivovat přistup k Umbracu - se dosud nepřihlásil - Staré heslo - Heslo - Resetovat heslo - Vyše heslo bylo změněno! - Potvrďte, prosím, nové heslo - Zadejte Vaše nové heslo - Vaše nové heslo nesmí být prázdné! - Současné heslo - Neplatné současné heslo - Nové heslo a potvrzující heslo se liší. Zkuste to, prosím, znovu! - Potvrzující heslo není stejné jako nové heslo! - Nahradit oprávnění podřízených uzlů - Nyní měníte oprávnění pro stránky: - Vyberte stránky, pro které chcete měnit oprávnění - Odebrat fotografii - Výchozí oprávnění - Upřesnění oprávnění - Nastavte oprávnění pro konkrétní uzly - Profil - Prohledat všechny podřízené uzly - Přidejte sekce, do kterých mají uživatelé přístup - Vybrat skupiny uživatelů - Nebyl vybrán žádný počáteční uzel - Nebyly vybrány žádné počáteční uzly - Úvodní uzel v obsahu - Omezte strom obsahu na konkrétní počáteční uzel - Úvodní uzly obsahu - Omezte strom obsahu na konkrétní počáteční uzly - Uživatel byl naposledy aktualizován - byl vytvořen - Nový uživatel byl úspěšně vytvořen. Pro přihlášení do Umbraco použijte heslo níže. - Správa uživatelů - Uživatelské jméno - Oprávnění uživatele - Uživatelská skupina - byl pozván - Novému uživateli byla zaslána pozvánka s informacemi, jak se přihlásit do Umbraco. - Dobrý den, vítejte v Umbraco! Za pouhou 1 minutu budete moci používat Umbraco. Jenom od vás potřebujeme, abyste si nastavili heslo a přidali obrázek pro svůj avatar. - Vítejte v Umbraco! Vaše pozvánka bohužel vypršela. Obraťte se na svého správce a požádejte jej, aby jí znovu odeslal. - Nahrání vaší fotografie usnadní ostatním uživatelům, aby vás poznali. Kliknutím na kruh výše nahrajte svou fotku. - Spisovatel - Změnit - Váš profil - Vaše nedávná historie - Relace vyprší za - Pozvat uživatele - Vytvořit uživatele - Odeslat pozvánku - Zpět na seznam uživatelů - Umbraco: Pozvánka - Žádní uživatelé překladatelé nebyli nalezeni. Vytvořte, prosím, překladatele před tím, než začnete posílat obsah k překladu + Stránka '%0%' byla poslána k překladu + Poslat stránku '%0%' k překladu + Slov celkem + Přeložit do + Překlad hotov. + Klikutím níže můžete vidět stránky, které jste právě přeložili. Jestliže je nalezena originální stránka, dostanete srovnání 2 stránek. + Překlad selhal, xml soubor může být poškozený + Možnosti překladu + Překladatel + Nahrát xml překladu + + + Obsah + Šablony obsahu + Média + Prohlížeč mezipaměti + Koš + Vytvořené balíčky + Datové typy + Slovník + Instalované balíčky + Instalovat téma + Instalovat startovní sadu + Jazyky + Instalovat místní balíček + Makra + Typy medií + Členové + Skupiny členů + Role + Typy členů + Typy dokumentů + Typy vztahů/vazeb + Balíčky + Balíčky + Částečné šablony + Makra částečných šablon + Instalovat z úložiště + Instalovat Runway + Moduly Runway + Skriptovací soubory + Skripty + Stylopisy + Šablony + Prohlížeč logu + Uživatelé + Nastavení + Šablony + Třetí strana + + Oprávnění uživatele + Typy uživatelů + + + Nová aktualizace je připrvena + %0% je připraven, klikněte zde pro stažení + Žádné spojení se serverem + Chyba při kontrole aktualizace. Zkontrolujte, prosím, trasovací zásobník pro další informace + + + Přístupy + Na základě přiřazených skupin a počátečních uzlů má uživatel přístup k následujícím uzlům + Přiřadit přístup + Administrátor + Pole kategorie + Uživatel byl vytvořen + Změnit heslo + Změnit fotku + Změnit heslo + nebyl uzamčen + Heslo nebylo změněno + Potvrdit heslo + Můžete změnit své heslo pro přístup do administrace Umbraca vyplněním formuláře níže a kliknutím na tlačítko 'Změnit Heslo' + Kanál obsahu + Vytvořit dalšího uživatele + Vytvořte nové uživatele a udělte mu přístup do Umbraco. Po vytvoření nového uživatele bude vygenerováno heslo, které s ním můžete sdílet. + Popis + Deaktivovat uživatele + Typ dokumentu + Editor + Výtah + Neúspěšné pokusy o přihlášení + Přejít na uživatelský profil + Přidáním skupin přidělte přístup a oprávnění + Pozvat dalšího uživatele + Pozvěte nové uživatele, a poskytněte jim přístup do Umbraco. Uživatelům bude zaslán e-mail s pozvánkou a s informacemi o tom, jak se přihlásit do Umbraco. Pozvánky mají platnost 72 hodin. + Jazyk + Nastavte jazyk, který uvidíte v nabídkách a dialogových oknech + Poslední datum uzamčení + Poslední přihlášení + Heslo bylo naposledy změněno + Přihlašovací jméno + Úvodní uzel v knihovně medií + Omezte knihovnu médií na konkrétní počáteční uzel + Úvodní uzly v knihovně medií + Omezte knihovnu médií na konkrétní počáteční uzly + Sekce + Deaktivovat přistup k Umbracu + se dosud nepřihlásil + Staré heslo + Heslo + Resetovat heslo + Vyše heslo bylo změněno! + Potvrďte, prosím, nové heslo + Zadejte Vaše nové heslo + Vaše nové heslo nesmí být prázdné! + Současné heslo + Neplatné současné heslo + Nové heslo a potvrzující heslo se liší. Zkuste to, prosím, znovu! + Potvrzující heslo není stejné jako nové heslo! + Nahradit oprávnění podřízených uzlů + Nyní měníte oprávnění pro stránky: + Vyberte stránky, pro které chcete měnit oprávnění + Odebrat fotografii + Výchozí oprávnění + Upřesnění oprávnění + Nastavte oprávnění pro konkrétní uzly + Profil + Prohledat všechny podřízené uzly + Přidejte sekce, do kterých mají uživatelé přístup + Vybrat skupiny uživatelů + Nebyl vybrán žádný počáteční uzel + Nebyly vybrány žádné počáteční uzly + Úvodní uzel v obsahu + Omezte strom obsahu na konkrétní počáteční uzel + Úvodní uzly obsahu + Omezte strom obsahu na konkrétní počáteční uzly + Uživatel byl naposledy aktualizován + byl vytvořen + Nový uživatel byl úspěšně vytvořen. Pro přihlášení do Umbraco použijte heslo níže. + Správa uživatelů + Uživatelské jméno + Oprávnění uživatele + Uživatelská skupina + byl pozván + Novému uživateli byla zaslána pozvánka s informacemi, jak se přihlásit do Umbraco. + Dobrý den, vítejte v Umbraco! Za pouhou 1 minutu budete moci používat Umbraco. Jenom od vás potřebujeme, abyste si nastavili heslo a přidali obrázek pro svůj avatar. + Vítejte v Umbraco! Vaše pozvánka bohužel vypršela. Obraťte se na svého správce a požádejte jej, aby jí znovu odeslal. + Nahrání vaší fotografie usnadní ostatním uživatelům, aby vás poznali. Kliknutím na kruh výše nahrajte svou fotku. + Spisovatel + Změnit + Váš profil + Vaše nedávná historie + Relace vyprší za + Pozvat uživatele + Vytvořit uživatele + Odeslat pozvánku + Zpět na seznam uživatelů + Umbraco: Pozvánka + @@ -1958,348 +1957,345 @@ ]]> - Pozvat - Zasílám pozvání... - Smazat uživatele - Opravdu chcete smazat tento uživatelský účet? - Vše - Aktivní - Zakázané - Uzamčeno - Pozváno - Neaktivní - Jméno (A-Z) - Jméno (Z-A) - Nejnovější - Nejstarší - Poslední přihlášení - Nebyly přidány žádné skupiny uživatelů - - - Validace - Ověřit jako e-mailovou adresu - Ověřit jako číslo - Ověřit jako URL - ...nebo zadat vlastní ověření - Pole je povinné - Zadat chybovou zprávu pro vlastní validaci (volitelné) - Zadat regulární výraz - Zadat chybovou zprávu pro vlastní validaci (volitelné) - Musíte přidat alespoň - Můžete jen mít - položky - vybrané položky - Neplatné datum - Není číslo - Neplatný e-mail - Hodnota nemůže být nulová - Hodnota nemůže být prázdná - Hodnota je neplatná, neodpovídá správnému vzoru - Vlastní ověření - %1% více.]]> - %1% příliš mnoho.]]> - - - - Hodnota je nastavena na doporučenou hodnotu: '%0%'. - Hodnota byla nastavena na '%1%' pro XPath '%2%' v konfiguračním souboru '%3%'. - Očekávaná hodnota '%1%' pro '%2%' v konfiguračním souboru '%3%', ale nalezeno '%0%'. - Nalezena neočekávaná hodnota '%0%' pro '%2%' v konfiguračním souboru '%3%'. - - Vlastní chyby jsou nastaveny na '%0%'. - Vlastní chyby jsou aktuálně nastaveny na '%0%'. Před nasazením se doporučuje nastavit na '%1%'. - Vlastní chyby byly úspěšně nastaveny na '%0%'. - MacroErrors jsou nastaveny na '%0%'. - MakroErrors jsou nastaveny na '%0%', což zabrání úplnému načtení některých nebo všech stránek na vašem webu, pokud dojde k chybám v makrech. Náprava nastaví hodnotu na '%1%'. - MakroErrors jsou nyní nastaveny na '%0%'. - - Try Skip IIS Custom Errors je nastaveno na '%0%' a používáte verzi IIS '%1%'. - Try Skip IIS Custom Errors je aktuálně nastaveno na '%0%'. Doporučuje se nastavit %1% pro vaši verzi služby IIS (%2%). - Try Skip IIS Custom Errors úspěšně nastaveno na '%0%'. - - '% 0%' v konfiguračním souboru '% 1%'.]]> - Došlo k chybě, zkontrolujte ji v logu: %0%. - Databáze - Databázové schéma je pro tuto verzi Umbraco správné - Bylo zjištěno %0% problémů se schématem vaší databáze (podrobnosti najdete v logu) - Při ověřování databázového schématu vůči aktuální verzi Umbraco byly zjištěny některé chyby. - Certifikát vašeho webu je platný. - Chyba ověření certifikátu: '%0%' - Platnost SSL certifikátu vašeho webu vypršela. - Platnost certifikátu SSL vašeho webu vyprší za %0% dní. - Chyba při pingování adresy URL %0% - '%1%' - Aktuálně prohlížíte web pomocí schématu HTTPS. - AppSetting 'Umbraco.Core.UseHttps' je v souboru web.config nastaven na 'false'. Jakmile vstoupíte na tento web pomocí schématu HTTPS, mělo by být nastaveno na 'true'. - AppSetting 'Umbraco.Core.UseHttps' je v souboru web.config nastaven na '%0%', vaše cookies %1% jsou označeny jako zabezpečené. - V souboru web.config se nepodařilo aktualizovat nastavení 'Umbraco.Core.UseHttps'. Chyba: %0% - - Povolit HTTPS - Nastaví nastavení umbracoSSL na true v appSettings v souboru web.config. - AppSetting 'Umbraco.Core.UseHttps' je nyní nastaveno na 'true' v souboru web.config, vaše cookies budou označeny jako zabezpečené. - Fix - Nelze opravit kontrolu pro porovnání hodnot pomocí 'ShouldNotEqual'. - Nelze opravit kontrolu pro porovnání hodnot pomocí 'ShouldEqual' s poskytnutou hodnotou. - Hodnota k opravě nebyla poskytnuta. - Režim kompilace ladění je zakázán. - Režim ladění je aktuálně povolen. Před spuštěním webu se doporučuje toto nastavení deaktivovat. - Režim ladění byl úspěšně deaktivován. - Režim sledování je deaktivován. - Režim sledování je aktuálně povolen. Před spuštěním se doporučuje toto nastavení deaktivovat. - Režim sledování byl úspěšně deaktivován. - Všechny složky mají nastavena správná oprávnění. - - Soubor neexistuje: '%0%'. - - %0%.]]> - %0%. Pokud nejsou psány, není třeba podniknout žádné kroky.]]> - Všechny soubory mají nastavena správná oprávnění. - - %0%.]]> - %0%. Pokud nejsou psány, není třeba podniknout žádné kroky.]]> - X-Frame-Options, které určuje, zda může být obsah webu zobrazen na jiném webu pomocí IFRAME.]]> - X-Frame-Options, které určuje, zda může být obsah webu zobrazen na jiném webu pomocí IFRAME.]]> - Nastavit záhlaví v Konfiguraci - Přidá hodnotu do sekce httpProtocol/customHeaders do web.config, aby se zabránilo tomu, že web může být zobrazen na jiném webu pomocí IFRAME. - Do souboru web.config bylo přidáno nastavení pro vytvoření záhlaví, které zabrání jinému webu, zobrazit tento web pomocí IFRAME. - Nelze aktualizovat soubor web.config. Chyba: %0% - X-Content-Type-Options použitá k ochraně před zranitelnostmi čichání MIME.]]> - X-Content-Type-Options použité k ochraně před zranitelnostmi čichání MIME nebyly nalezeny.]]> - Přidá hodnotu do sekce httpProtocol/customHeaders v souboru web.config, která chrání před zranitelnostmi MIME. - Do souboru web.config bylo přidáno nastavení pro vytvoření záhlaví, které chrání před zranitelnostmi MIME. - Strict-Transport-Security, také známo jako HSTS-header, bylo nalezeno.]]> - Strict-Transport-Security nebylo nalezeno.]]> - Do sekce httpProtocol/customHeaders v souboru web.config přidá záhlaví 'Strict-Transport-Security' s hodnotou 'max-age = 10886400'. Tuto opravu použijte pouze v případě, že vaše domény budou spuštěny s https po dobu příštích 18 týdnů (minimálně). - Do vašeho souboru web.config bylo přidáno záhlaví HSTS. - X-XSS-Protection bylo nalezeno.]]> - X-XSS-Protection bylo nalezeno.]]> - Přidá záhlaví 'X-XSS-Protection' s hodnotou '1; mode=block' do sekce httpProtocol/customHeaders v souboru web.config. - Záhlaví X-XSS-Protection bylo přidáno do vašeho souboru web.config. - - %0%.]]> - Nebyly nalezeny žádné hlavičky odhalující informace o technologii webových stránek. - V souboru Web.config nelze najít system.net/mailsettings. - V části system.net/mailsettings v souboru web.config není hostitel nakonfigurován. - Nastavení SMTP jsou správně nakonfigurována a služba funguje jak má. - Server SMTP konfigurovaný s hostitelem '%0%' a portem '%1%' nelze nalézt. Zkontrolujte prosím, zda jsou nastavení SMTP v souboru Web.config a v sekci system.net/mailsettings správná. - %0%.]]> - %0%.]]> -

    Výsledky plánovaných kontrol Umbraco Health Checks provedených na %0% v %1% jsou následující:

    %2%]]>
    - Stav Umbraco Health Check: %0% - Zkontrolovat všechny skupiny - Zkontrolovat skupinu - - Kontrola vyhodnocuje různé oblasti vašeho webu z hlediska nastavení osvědčených postupů, konfigurace, potenciálních problémů atd. Problémy lze snadno vyřešit stisknutím tlačítka. Můžete přidat své vlastní kontroly, podívejte se na dokumentaci pro více informací o vlastních kontrolách.

    + Pozvat + Zasílám pozvání... + Smazat uživatele + Opravdu chcete smazat tento uživatelský účet? + Vše + Aktivní + Zakázané + Uzamčeno + Pozváno + Neaktivní + Jméno (A-Z) + Jméno (Z-A) + Nejnovější + Nejstarší + Poslední přihlášení + Nebyly přidány žádné skupiny uživatelů + + + Validace + Ověřit jako e-mailovou adresu + Ověřit jako číslo + Ověřit jako URL + ...nebo zadat vlastní ověření + Pole je povinné + Zadat chybovou zprávu pro vlastní validaci (volitelné) + Zadat regulární výraz + Zadat chybovou zprávu pro vlastní validaci (volitelné) + Musíte přidat alespoň + Můžete jen mít + položky + vybrané položky + Neplatné datum + Není číslo + Neplatný e-mail + Hodnota nemůže být nulová + Hodnota nemůže být prázdná + Hodnota je neplatná, neodpovídá správnému vzoru + Vlastní ověření + %1% více.]]> + %1% příliš mnoho.]]> + + + + Hodnota je nastavena na doporučenou hodnotu: '%0%'. + Hodnota byla nastavena na '%1%' pro XPath '%2%' v konfiguračním souboru '%3%'. + Očekávaná hodnota '%1%' pro '%2%' v konfiguračním souboru '%3%', ale nalezeno '%0%'. + Nalezena neočekávaná hodnota '%0%' pro '%2%' v konfiguračním souboru '%3%'. + + Vlastní chyby jsou nastaveny na '%0%'. + Vlastní chyby jsou aktuálně nastaveny na '%0%'. Před nasazením se doporučuje nastavit na '%1%'. + Vlastní chyby byly úspěšně nastaveny na '%0%'. + MacroErrors jsou nastaveny na '%0%'. + MakroErrors jsou nastaveny na '%0%', což zabrání úplnému načtení některých nebo všech stránek na vašem webu, pokud dojde k chybám v makrech. Náprava nastaví hodnotu na '%1%'. + MakroErrors jsou nyní nastaveny na '%0%'. + + Try Skip IIS Custom Errors je nastaveno na '%0%' a používáte verzi IIS '%1%'. + Try Skip IIS Custom Errors je aktuálně nastaveno na '%0%'. Doporučuje se nastavit %1% pro vaši verzi služby IIS (%2%). + Try Skip IIS Custom Errors úspěšně nastaveno na '%0%'. + + Soubor neexistuje: '%0%'. + '% 0%' v konfiguračním souboru '% 1%'.]]> + Došlo k chybě, zkontrolujte ji v logu: %0%. + Databáze - Databázové schéma je pro tuto verzi Umbraco správné + Bylo zjištěno %0% problémů se schématem vaší databáze (podrobnosti najdete v logu) + Při ověřování databázového schématu vůči aktuální verzi Umbraco byly zjištěny některé chyby. + Certifikát vašeho webu je platný. + Chyba ověření certifikátu: '%0%' + Platnost SSL certifikátu vašeho webu vypršela. + Platnost certifikátu SSL vašeho webu vyprší za %0% dní. + Chyba při pingování adresy URL %0% - '%1%' + Aktuálně prohlížíte web pomocí schématu HTTPS. + AppSetting 'Umbraco.Core.UseHttps' je v souboru web.config nastaven na 'false'. Jakmile vstoupíte na tento web pomocí schématu HTTPS, mělo by být nastaveno na 'true'. + AppSetting 'Umbraco.Core.UseHttps' je v souboru web.config nastaven na '%0%', vaše cookies %1% jsou označeny jako zabezpečené. + V souboru web.config se nepodařilo aktualizovat nastavení 'Umbraco.Core.UseHttps'. Chyba: %0% + + Povolit HTTPS + Nastaví nastavení umbracoSSL na true v appSettings v souboru web.config. + AppSetting 'Umbraco.Core.UseHttps' je nyní nastaveno na 'true' v souboru web.config, vaše cookies budou označeny jako zabezpečené. + Fix + Nelze opravit kontrolu pro porovnání hodnot pomocí 'ShouldNotEqual'. + Nelze opravit kontrolu pro porovnání hodnot pomocí 'ShouldEqual' s poskytnutou hodnotou. + Hodnota k opravě nebyla poskytnuta. + Režim kompilace ladění je zakázán. + Režim ladění je aktuálně povolen. Před spuštěním webu se doporučuje toto nastavení deaktivovat. + Režim ladění byl úspěšně deaktivován. + Režim sledování je deaktivován. + Režim sledování je aktuálně povolen. Před spuštěním se doporučuje toto nastavení deaktivovat. + Režim sledování byl úspěšně deaktivován. + Všechny složky mají nastavena správná oprávnění. + + %0%.]]> + %0%. Pokud nejsou psány, není třeba podniknout žádné kroky.]]> + Všechny soubory mají nastavena správná oprávnění. + + %0%.]]> + %0%. Pokud nejsou psány, není třeba podniknout žádné kroky.]]> + X-Frame-Options, které určuje, zda může být obsah webu zobrazen na jiném webu pomocí IFRAME.]]> + X-Frame-Options, které určuje, zda může být obsah webu zobrazen na jiném webu pomocí IFRAME.]]> + Nastavit záhlaví v Konfiguraci + Přidá hodnotu do sekce httpProtocol/customHeaders do web.config, aby se zabránilo tomu, že web může být zobrazen na jiném webu pomocí IFRAME. + Do souboru web.config bylo přidáno nastavení pro vytvoření záhlaví, které zabrání jinému webu, zobrazit tento web pomocí IFRAME. + Nelze aktualizovat soubor web.config. Chyba: %0% + X-Content-Type-Options použitá k ochraně před zranitelnostmi čichání MIME.]]> + X-Content-Type-Options použité k ochraně před zranitelnostmi čichání MIME nebyly nalezeny.]]> + Přidá hodnotu do sekce httpProtocol/customHeaders v souboru web.config, která chrání před zranitelnostmi MIME. + Do souboru web.config bylo přidáno nastavení pro vytvoření záhlaví, které chrání před zranitelnostmi MIME. + Strict-Transport-Security, také známo jako HSTS-header, bylo nalezeno.]]> + Strict-Transport-Security nebylo nalezeno.]]> + Do sekce httpProtocol/customHeaders v souboru web.config přidá záhlaví 'Strict-Transport-Security' s hodnotou 'max-age = 10886400'. Tuto opravu použijte pouze v případě, že vaše domény budou spuštěny s https po dobu příštích 18 týdnů (minimálně). + Do vašeho souboru web.config bylo přidáno záhlaví HSTS. + X-XSS-Protection bylo nalezeno.]]> + X-XSS-Protection bylo nalezeno.]]> + Přidá záhlaví 'X-XSS-Protection' s hodnotou '1; mode=block' do sekce httpProtocol/customHeaders v souboru web.config. + Záhlaví X-XSS-Protection bylo přidáno do vašeho souboru web.config. + + %0%.]]> + Nebyly nalezeny žádné hlavičky odhalující informace o technologii webových stránek. + V souboru Web.config nelze najít system.net/mailsettings. + V části system.net/mailsettings v souboru web.config není hostitel nakonfigurován. + Nastavení SMTP jsou správně nakonfigurována a služba funguje jak má. + Server SMTP konfigurovaný s hostitelem '%0%' a portem '%1%' nelze nalézt. Zkontrolujte prosím, zda jsou nastavení SMTP v souboru Web.config a v sekci system.net/mailsettings správná. + %0%.]]> + %0%.]]> +

    Výsledky plánovaných kontrol Umbraco Health Checks provedených na %0% v %1% jsou následující:

    %2%]]>
    + Stav Umbraco Health Check: %0% + Zkontrolovat všechny skupiny + Zkontrolovat skupinu + + Kontrola vyhodnocuje různé oblasti vašeho webu z hlediska nastavení osvědčených postupů, konfigurace, potenciálních problémů atd. Problémy lze snadno vyřešit stisknutím tlačítka. Můžete přidat své vlastní kontroly, podívejte se na dokumentaci pro více informací o vlastních kontrolách.

    ]]> -
    - - - Zakázat sledování URL - Povolit sledování URL - Jazyk - Originální URL - Přesměrováno na - Správa URL přesměrování - Na tuto položku obsahu přesměrovávají následující adresy URL: - Nebyla provedena žádná přesměrování - Jakmile bude publikovaná stránka přejmenována nebo přesunuta, bude automaticky provedeno přesměrování na novou stránku. - Opravdu chcete odstranit přesměrování z '%0%' na '%1%'? - Přesměrování bylo odstraněno. - Chyba při odebírání URL přesměrování. - Toto odstraní přesměrování - Opravdu chcete zakázat sledování URL adres? - Sledování URL adres je nyní zakázáno. - Při deaktivaci sledování URL adres došlo k chybě, další informace naleznete v logu. - Sledování URL adres je nyní povoleno. - Chyba při povolení sledování URL adres, další informace lze nalézt v logu. - - - Žádné položky ze slovníku na výběr - - - %0% znaků.]]> - %1% je moc.]]> - - - Obsah s ID: {0} v koši souvisí s původním nadřazeným obsahem s ID: {1} - Média s ID: {0} v koši souvisí s původním nadřazeným médiem s ID: {1} - Tuto položku nelze automaticky obnovit - Neexistuje žádné místo, kde lze tuto položku automaticky obnovit. Položku můžete přesunout ručně pomocí stromu níže. - byla obnovena pod - - - Směr - Nadřazený s potomkem - Obousměrný - Nadřazená - Potomek - Počet - Vazby - Vytvořeno - Komentář - Název - Žádné vazby pro tento typ vazby. - Typ vazby - Vazby - - - Začínáme - Správa přesměrování - Obsah - Vítejte - Správa Examine - Stav publikování - Tvůrce modelů - Health Check - Profilování - Začínáme - Instalovat Umbraco formuláře - - - Jít zpět - Aktivní rozvržení: - Skočit do - skupina - prošlo - varování - selhalo - návrh - Kontrola prošla - Kontrola selhala - Otevřít hledání v backoffice - Otevřít/zavřít nápovědu backoffice - Otevřít/zavřít možnosti vašeho profilu - Otevřít kontextové menu pro - Aktuální jazyk - Přepnout jazyk na - Vytvořit novou složku - Částečná šablona - Makro částečné šablony - Člen - Datový typ - Prohledat přesměrování - Prohledat skupiny uživatelů - Prohledat uživatele - Vytvořit položku - Vytvořit - Upravit - Název - - - Závislosti - Tento datový typ nemá žádné závislosti. - Použito v dokumentových typech - Žádné vazby na typy dokumentů. - Použito v typech médií - Žádné vazby na typy médií. - Použito v typech členů - Žádné vazby na typy členů. - Použito v - Použito v dokumentech - Použito ve členech - Použito v médiích - - - Úrovně logování - Uložená vyhledávání - Celkem položek - Časové razítko - Úroveň - Stroj - Zpráva - Výjimka - Vlastnosti - Vyhledat na Googlu - Vyhledat zprávu na Googlu - Vyhledat na Bing - Vyhledat zprávu na Bing - Prohledat naše Umbraco - Vyhledat tuto zprávu na našich fórech a dokumentech Umbraco - Vyhledat Our Umbraco na Googlu - Prohledat Our Umbraco fóra pomocí Googlu - Prohledat Umbraco Source - Vyhledat ve zdrojovém kódu Umbraco na Github - Prohledat Umbraco Issues - Prohledat Umbraco Issues na Github - Smazat toto vyhledávání - Najít logy s ID požadavku - Najít logy se jmenným prostorem - Najít logy s názvem stroje - Otevřít - - - Kopírovat %0% - %0% z %1% - Odebrat všechny položky - - - Otevřít akce vlastností - - - Čekejte - Stav obnovení - Cache paměť - - + + + Zakázat sledování URL + Povolit sledování URL + Jazyk + Originální URL + Přesměrováno na + Správa URL přesměrování + Na tuto položku obsahu přesměrovávají následující adresy URL: + Nebyla provedena žádná přesměrování + Jakmile bude publikovaná stránka přejmenována nebo přesunuta, bude automaticky provedeno přesměrování na novou stránku. + Opravdu chcete odstranit přesměrování z '%0%' na '%1%'? + Přesměrování bylo odstraněno. + Chyba při odebírání URL přesměrování. + Toto odstraní přesměrování + Opravdu chcete zakázat sledování URL adres? + Sledování URL adres je nyní zakázáno. + Při deaktivaci sledování URL adres došlo k chybě, další informace naleznete v logu. + Sledování URL adres je nyní povoleno. + Chyba při povolení sledování URL adres, další informace lze nalézt v logu. + + + Žádné položky ze slovníku na výběr + + + %0% znaků.]]> + %1% je moc.]]> + + + Obsah s ID: {0} v koši souvisí s původním nadřazeným obsahem s ID: {1} + Média s ID: {0} v koši souvisí s původním nadřazeným médiem s ID: {1} + Tuto položku nelze automaticky obnovit + Neexistuje žádné místo, kde lze tuto položku automaticky obnovit. Položku můžete přesunout ručně pomocí stromu níže. + byla obnovena pod + + + Směr + Nadřazený s potomkem + Obousměrný + Nadřazená + Potomek + Počet + Vazby + Vytvořeno + Komentář + Název + Žádné vazby pro tento typ vazby. + Typ vazby + Vazby + + + Začínáme + Správa přesměrování + Obsah + Vítejte + Správa Examine + Stav publikování + Tvůrce modelů + Health Check + Profilování + Začínáme + Instalovat Umbraco formuláře + + + Jít zpět + Aktivní rozvržení: + Skočit do + skupina + prošlo + varování + selhalo + návrh + Kontrola prošla + Kontrola selhala + Otevřít hledání v backoffice + Otevřít/zavřít nápovědu backoffice + Otevřít/zavřít možnosti vašeho profilu + Otevřít kontextové menu pro + Aktuální jazyk + Přepnout jazyk na + Vytvořit novou složku + Částečná šablona + Makro částečné šablony + Člen + Datový typ + Prohledat přesměrování + Prohledat skupiny uživatelů + Prohledat uživatele + Vytvořit položku + Vytvořit + Upravit + Název + + + Závislosti + Tento datový typ nemá žádné závislosti. + Použito v dokumentových typech + Žádné vazby na typy dokumentů. + Použito v typech médií + Žádné vazby na typy médií. + Použito v typech členů + Žádné vazby na typy členů. + Použito v + Použito v dokumentech + Použito ve členech + Použito v médiích + + + Úrovně logování + Uložená vyhledávání + Celkem položek + Časové razítko + Úroveň + Stroj + Zpráva + Výjimka + Vlastnosti + Vyhledat na Googlu + Vyhledat zprávu na Googlu + Vyhledat na Bing + Vyhledat zprávu na Bing + Prohledat naše Umbraco + Vyhledat tuto zprávu na našich fórech a dokumentech Umbraco + Vyhledat Our Umbraco na Googlu + Prohledat Our Umbraco fóra pomocí Googlu + Prohledat Umbraco Source + Vyhledat ve zdrojovém kódu Umbraco na Github + Prohledat Umbraco Issues + Prohledat Umbraco Issues na Github + Smazat toto vyhledávání + Najít logy s ID požadavku + Najít logy se jmenným prostorem + Najít logy s názvem stroje + Otevřít + + + Kopírovat %0% + %0% z %1% + Odebrat všechny položky + + + Otevřít akce vlastností + + + Čekejte + Stav obnovení + Cache paměť + + - - Znovu načíst - Cache databáze - - + Znovu načíst + Cache databáze + + Znovuvytvoření může být náročné. Použijte jej, když nestačí obnovení stránky, a domníváte se, že mezipaměť databáze nebyla správně vygenerována - což by naznačovalo možný kritický problém Umbraco. ]]> - - Obnovit - Internals - - + Obnovit + Internals + + nebudete muset používat. ]]> - - Sběr - Stav publikované mezipaměti - Mezipaměti - - - Profilování výkonu - - + Sběr + Stav publikované mezipaměti + Mezipaměti + + + Profilování výkonu + + Umbraco aktuálně běží v režimu ladění. To znamená, že můžete použít vestavěný profiler výkonu k vyhodnocení výkonu při vykreslování stránek.

    Pokud chcete aktivovat profiler pro konkrétní vykreslení stránky, jednoduše při požadavku na stránku jednoduše přidejte umbDebug=true do URL.

    Pokud chcete, aby byl profiler ve výchozím nastavení aktivován pro všechna vykreslení stránky, můžete použít přepínač níže. Ve vašem prohlížeči nastaví soubor cookie, který automaticky aktivuje profiler. Jinými slovy, profiler bude ve výchozím nastavení aktivní pouze ve vašem prohlížeči, ne v ostatních.

    ]]> -
    - Ve výchozím stavu aktivovat profiler - Přátelské připomenutí - - + Ve výchozím stavu aktivovat profiler + Přátelské připomenutí + + Nikdy byste neměli nechat produkční web běžet v režimu ladění. Režim ladění je vypnut nastavením debug="false" na elementu compilation v souboru web.config.

    ]]> -
    - - + + Umbraco v současné době neběží v režimu ladění, takže nemůžete použít vestavěný profiler. Takto by to mělo být pro produkční web.

    @@ -2307,53 +2303,53 @@ Režim ladění je zapnut nastavením debug="true" na elementu compilation v souboru web.config.

    ]]> -
    - - - Hodiny tréninkových videí Umbraco jsou blíž než si myslíte - - Chcete ovládnout Umbraco? Stačí strávit pár minut sledování jednoho z těchto videí o používání Umbraco. Nebo navštivte umbraco.tv , kde najdete ještě více videí o Umbraco

    +
    + + + Hodiny tréninkových videí Umbraco jsou blíž než si myslíte + + Chcete ovládnout Umbraco? Stačí strávit pár minut sledování jednoho z těchto videí o používání Umbraco. Nebo navštivte umbraco.tv, kde najdete ještě více videí o Umbraco

    ]]> -
    - Chcete-li začít - - - Začněte zde - Tato část obsahuje stavební bloky pro váš web Umbraco. Podle níže uvedených odkazů se dozvíte více o práci s položkami v části Nastavení - Zjistit více - - v sekci Dokumentace v Our Umbraco + + Chcete-li začít + + + Začněte zde + Tato část obsahuje stavební bloky pro váš web Umbraco. Podle níže uvedených odkazů se dozvíte více o práci s položkami v části Nastavení + Zjistit více + + v sekci Dokumentace v Our Umbraco ]]> - - - fóru komunity + + + fóru komunity ]]> - - - výuková videa (některá jsou zdarma, jiná vyžadují předplatné) + + + výuková videa (některá jsou zdarma, jiná vyžadují předplatné) ]]> - - - nástrojích zvyšujících produktivitu a komerční podpoře + + + nástrojích zvyšujících produktivitu a komerční podpoře ]]> - - - školení a certifikace + + + školení a certifikace ]]> - - - - Vítejte v přátelském CMS - Děkujeme, že jste si vybrali Umbraco - myslíme si, že by to mohl být začátek něčeho krásného. I když se to může zpočátku zdát ohromující, udělali jsme hodně pro to, aby byla křivka učení co nejhladší a nejrychlejší. - - - Umbraco formuláře - Vytvářejte formuláře pomocí intuitivního rozhraní drag and drop. Od jednoduchých kontaktních formulářů, které odesílají e-maily, až po pokročilé dotazníky, které se integrují do systémů CRM. Vaši klienti to budou milovat! - +
    + + + Vítejte v přátelském CMS + Děkujeme, že jste si vybrali Umbraco - myslíme si, že by to mohl být začátek něčeho krásného. I když se to může zpočátku zdát ohromující, udělali jsme hodně pro to, aby byla křivka učení co nejhladší a nejrychlejší. + + + Umbraco formuláře + Vytvářejte formuláře pomocí intuitivního rozhraní drag and drop. Od jednoduchých kontaktních formulářů, které odesílají e-maily, až po pokročilé dotazníky, které se integrují do systémů CRM. Vaši klienti to budou milovat! +
    diff --git a/src/Umbraco.Web.UI.NetCore/umbraco/config/lang/da.xml b/src/Umbraco.Web.UI.NetCore/umbraco/config/lang/da.xml index b6d10589fe..d7dccbc08c 100644 --- a/src/Umbraco.Web.UI.NetCore/umbraco/config/lang/da.xml +++ b/src/Umbraco.Web.UI.NetCore/umbraco/config/lang/da.xml @@ -839,7 +839,7 @@ Sætter folderrettigheder op Umbraco har behov for 'write/modify' adgang til bestemte foldere, for at kunne gemme filer som billeder og PDF'er. Umbraco gemmer også midlertidige data (eksempelvis cachen) for at forbedre ydelsen på dit website. Jeg har lyst til at begynde på bar bund - lær hvordan) Du kan stadig vælge at installere Runway senere. Gå venligst til Udvikler-sektionen og vælg Pakker.]]> + lær hvordan) Du kan stadig vælge at installere Runway senere. Gå venligst til Udvikler-sektionen og vælg Pakker.]]> Du har lige opsat en ren Umbraco-platform. Hvad ønsker du nu at gøre? Runway er installeret Dette er vores liste over anbefalede moduler. Kryds dem af du ønsker at installere eller se den fulde liste af moduler ]]> @@ -885,7 +885,7 @@ Log ind nedenfor Log ind med Din session er udløbet - © 2001 - %0%
    umbraco.com

    ]]>
    + © 2001 - %0%
    umbraco.com

    ]]>
    Glemt adgangskode? En e-mail vil blive sendt til den angivne adresse med et link til at nulstille din adgangskode En e-mail med instruktioner for nulstilling af adgangskoden vil blive sendt til den angivne adresse, hvis det matcher vores optegnelser @@ -1054,10 +1054,6 @@ Mange hilsner fra Umbraco robotten - - %0% kunne ikke udgives, fordi et 3. parts modul annullerede handlingen Medtag ikke-udgivede undersider @@ -1106,7 +1102,6 @@ Mange hilsner fra Umbraco robotten Nuværende version Rød tekst vil ikke blive vist i den valgte version. Grøn betyder tilføjet]]> Dokument tilbagerullet - Vælg en version at sammenligne med den nuværende version Her vises den valgte version som html. Hvis du ønsker at se forskellen mellem de 2 versioner på samme tid, brug 'diff'-oversigten Tilbagerulning til Vælg version @@ -1439,7 +1434,7 @@ Mange hilsner fra Umbraco robotten Dette benyttes ikke for en Element-type Du har lavet ændringer til denne egenskab. Er du sikker på at du vil kassere dem? Visning - Label hen over (fuld brede) + Label hen over (fuld bredde) Tilføj sprog @@ -1682,13 +1677,14 @@ Mange hilsner fra Umbraco robotten Indtast et regulært udtryk Du skal tilføje mindst Du kan kun have + Tilføj op til elementer elementer valgt Ugyldig dato Ikke et tal Ugyldig e-mail - %1% more.]]> - %1% too many.]]> + %1% mere.]]> + %1% for mange.]]> Slå URL tracker fra diff --git a/src/Umbraco.Web.UI.NetCore/umbraco/config/lang/de.xml b/src/Umbraco.Web.UI.NetCore/umbraco/config/lang/de.xml index 518ad58bea..7d61559280 100644 --- a/src/Umbraco.Web.UI.NetCore/umbraco/config/lang/de.xml +++ b/src/Umbraco.Web.UI.NetCore/umbraco/config/lang/de.xml @@ -709,7 +709,6 @@ Aus Ok Öffnen - Optionen An oder @@ -821,9 +820,11 @@ Die Datenbank wurde für Umbraco %0% konfiguriert. Klicken Sie auf <strong>weiter</strong>, um fortzufahren. - <p>Die angegebene Datenbank ist leider nicht erreichbar. Bitte prüfen Sie die Verbindungszeichenfolge ("Connection String") in der "web.config"-Datei.</p> - <p>Um fortzufahren, passen Sie bitte die "web.config"-Datei mit einem beliebigen Text-Editor an. Scrollen Sie dazu nach unten, fügen Sie die Verbindungszeichenfolge für die zuverbindende Datenbank als Eintrag "UmbracoDbDSN" hinzu und speichern Sie die Datei.</p> - <p>Klicken Sie nach erfolgter Anpassung auf <strong>Wiederholen</strong>.<br />Wenn Sie weitere technische Informationen benötigen, besuchen Sie <a href="https://our.umbraco.com/wiki" target="_blank">The Umbraco documentation wiki</a>.</p> + Die angegebene Datenbank ist leider nicht erreichbar. Bitte prüfen Sie die Verbindungszeichenfolge ("Connection String") in der "web.config"-Datei.

    +

    Um fortzufahren, passen Sie bitte die "web.config"-Datei mit einem beliebigen Text-Editor an. Scrollen Sie dazu nach unten, fügen Sie die Verbindungszeichenfolge für die zuverbindende Datenbank als Eintrag "UmbracoDbDSN" hinzu und speichern Sie die Datei.

    +

    Klicken Sie nach erfolgter Anpassung auf Wiederholen.
    Wenn Sie weitere technische Informationen benötigen, besuchen Sie The Umbraco documentation wik.

    + ]]>
    Um diesen Schritt abzuschließen, müssen Sie die notwendigen Informationen zur Datenbankverbindung angeben.<br />Bitte kontaktieren Sie Ihren Provider bzw. Server-Administrator für weitere Informationen. @@ -865,7 +866,7 @@ Ich möchte mit einem leeren System ohne Inhalte und Vorgaben starten Die Website ist zur Zeit komplett leer und ohne Inhalte und Vorgaben zu Erstellung eigener Dokumenttypen und Vorlagen bereit. - (<a href="http://Umbraco.tv/documentation/videos/for-site-builders/foundation/document-types">So geht's</a>) + (<a href="https://umbraco.tv/documentation/videos/for-site-builders/foundation/document-types">So geht's</a>) Sie können "Runway" auch jederzeit später installieren. Verwenden Sie hierzu den Punkt "Pakete" im Entwickler-Bereich. Die Einrichtung von Umbraco ist abgeschlossen und das Content-Management-System steht bereit. Wie soll es weitergehen? @@ -926,7 +927,7 @@ Hier anmelden: Anmelden mit Sitzung abgelaufen - <p style="text-align:right;">&copy; 2001 - %0% <br /><a href="http://umbraco.com" style="text-decoration: none" target="_blank">umbraco.org</a></p> + <p style="text-align:right;">&copy; 2001 - %0% <br /><a href="https://umbraco.com" style="text-decoration: none" target="_blank">umbraco.org</a></p> Kennwort vergessen? Es wird eine E-Mail mit einem Kennwort-Zurücksetzen-Link an die angegebene Adresse geschickt. Es wird eine E-Mail mit Anweisungen zum Zurücksetzen des Kennwortes an die angegebene Adresse geschickt sofern diese im Datenbestand gefunden wurde. @@ -1492,9 +1493,6 @@ Neuer Stil Stil bearbeiten Rich text editor Stile - - Definiere die Stile, die im 'Rich-Text-Editor' verfügbar sein sollen. - Definiere die Styles, die im Rich-Text-Editor dieses Stylesheets verfügbar sein sollen. Stylesheet bearbeiten Stylesheet-Regel bearbeiten diff --git a/src/Umbraco.Web.UI.NetCore/umbraco/config/lang/en.xml b/src/Umbraco.Web.UI.NetCore/umbraco/config/lang/en.xml index 2ab1d90b07..c7b974e208 100644 --- a/src/Umbraco.Web.UI.NetCore/umbraco/config/lang/en.xml +++ b/src/Umbraco.Web.UI.NetCore/umbraco/config/lang/en.xml @@ -26,7 +26,7 @@ Exit Move Notifications - Public access + Restrict Public Access Publish Unpublish Reload @@ -71,7 +71,7 @@ Allow access to create nodes Allow access to delete nodes Allow access to move a node - Allow access to set and change public access for a node + Allow access to set and change access restrictions for a node Allow access to publish a node Allow access to unpublish a node Allow access to change permissions for a node @@ -796,7 +796,6 @@ Other Articles Videos - Clear Installing @@ -851,8 +850,8 @@

    To proceed, please edit the "web.config" file (using Visual Studio or your favourite text editor), scroll to the bottom, add the connection string for your database in the key named "UmbracoDbDSN" and save the file.

    Click the retry button when - done.
    - More information on editing web.config here.

    ]]>
    + done.
    + More information on editing web.config here.

    ]]> Please contact your ISP if necessary. If you're installing on a local machine or server you might need information from your system administrator.]]> @@ -899,7 +898,7 @@ I want to start from scratch learn how) + (learn how) You can still choose to install Runway later on. Please go to the Developer section and choose Packages. ]]> You've just set up a clean Umbraco platform. What do you want to do next? @@ -967,7 +966,7 @@ To manage your website, simply open the Umbraco back office and start adding con Log in below Sign in with Session timed out - © 2001 - %0%
    Umbraco.com

    ]]>
    + © 2001 - %0%
    Umbraco.com

    ]]>
    Forgotten password? An email will be sent to the address specified with a link to reset your password An email with password reset instructions will be sent to the specified address if it matched our records @@ -2180,7 +2179,7 @@ To manage your website, simply open the Umbraco back office and start adding con The health checker evaluates various areas of your site for best practice settings, configuration, potential problems, etc. You can easily fix problems by pressing a button. - You can add your own health checks, have a look at the documentation for more information about custom health checks.

    + You can add your own health checks, have a look at the documentation for more information about custom health checks.

    ]]>
    @@ -2261,7 +2260,7 @@ To manage your website, simply open the Umbraco back office and start adding con Open/Close your profile options Setup Culture and Hostnames for %0% Create new node under %0% - Setup Public access on %0% + Setup access restrictions on %0% Setup Permissions on %0% Change sort order for %0% Create Content Template based on %0% @@ -2282,10 +2281,17 @@ To manage your website, simply open the Umbraco back office and start adding con Name Add new row View more options - Has translation - Missing translation - Dictionary items - Perform action %0% on the %1% node + Search the Umbraco backoffice + Search for content nodes, media nodes etc. across the backoffice. + When autocomplete results are available, press up and down arrows, or use the tab key and use the enter key to select. + Path: + Found in + Has translation + Missing translation + Dictionary items + Select one of the options to edit the node. + Perform action %0% on the %1% node + Add image caption References @@ -2430,7 +2436,7 @@ To manage your website, simply open the Umbraco back office and start adding con Hours of Umbraco training videos are only a click away Want to master Umbraco? Spend a couple of minutes learning some best practices by watching one of these videos about using Umbraco. And visit umbraco.tv for even more Umbraco videos

    +

    Want to master Umbraco? Spend a couple of minutes learning some best practices by watching one of these videos about using Umbraco. And visit umbraco.tv for even more Umbraco videos

    ]]>
    To get you started @@ -2441,27 +2447,27 @@ To manage your website, simply open the Umbraco back office and start adding con Find out more in the Documentation section of Our Umbraco + Read more about working with the items in Settings in the Documentation section of Our Umbraco ]]> Community Forum + Ask a question in the Community Forum ]]> tutorial videos (some are free, some require a subscription) + Watch our tutorial videos (some are free, some require a subscription) ]]> productivity boosting tools and commercial support + Find out about our productivity boosting tools and commercial support ]]> training and certification opportunities + Find out about real-life training and certification opportunities ]]> diff --git a/src/Umbraco.Web.UI.NetCore/umbraco/config/lang/en_us.xml b/src/Umbraco.Web.UI.NetCore/umbraco/config/lang/en_us.xml index fb6b5a22d6..7a0afb0a69 100644 --- a/src/Umbraco.Web.UI.NetCore/umbraco/config/lang/en_us.xml +++ b/src/Umbraco.Web.UI.NetCore/umbraco/config/lang/en_us.xml @@ -27,7 +27,7 @@ Exit Move Notifications - Public access + Restrict Public Access Publish Unpublish Reload @@ -72,7 +72,7 @@ Allow access to create nodes Allow access to delete nodes Allow access to move a node - Allow access to set and change public access for a node + Allow access to set and change access restrictions for a node Allow access to publish a node Allow access to unpublish a node Allow access to change permissions for a node @@ -259,7 +259,7 @@ This document is published but its URL cannot be routed Publish Published - Published (pending changes)> + Published (pending changes) Publication Status %0% and all content items underneath and thereby making their content publicly available.]]> @@ -805,7 +805,6 @@ Other Articles Videos - Clear Installing @@ -858,8 +857,8 @@

    To proceed, please edit the "web.config" file (using Visual Studio or your favourite text editor), scroll to the bottom, add the connection string for your database in the key named "UmbracoDbDSN" and save the file.

    Click the retry button when - done.
    - More information on editing web.config here.

    ]]> + done.
    + More information on editing web.config here.

    ]]> Please contact your ISP if necessary. If you're installing on a local machine or server you might need information from your system administrator.]]> @@ -906,7 +905,7 @@ I want to start from scratch learn how) + (learn how) You can still choose to install Runway later on. Please go to the Developer section and choose Packages. ]]> You've just set up a clean Umbraco platform. What do you want to do next? @@ -974,7 +973,7 @@ To manage your website, simply open the Umbraco back office and start adding con Log in below Sign in with Session timed out - © 2001 - %0%
    Umbraco.com

    ]]>
    + © 2001 - %0%
    Umbraco.com

    ]]>
    Forgotten password? An email will be sent to the address specified with a link to reset your password An email with password reset instructions will be sent to the specified address if it matched our records @@ -1367,7 +1366,6 @@ To manage your website, simply open the Umbraco back office and start adding con Current version Red text will not be shown in the selected version. , green means added]]> Document has been rolled back - Select a version to compare with the current version This displays the selected version as HTML, if you wish to see the difference between 2 versions at the same time, use the diff view Rollback to Select version @@ -1423,6 +1421,7 @@ To manage your website, simply open the Umbraco back office and start adding con Validation errors must be fixed before the item can be saved Failed Saved + Saved. To view the changes please reload your browser Insufficient user permissions, could not complete the operation Cancelled Operation was cancelled by a 3rd party add-in @@ -2200,7 +2199,7 @@ To manage your website, simply open the Umbraco back office and start adding con The health checker evaluates various areas of your site for best practice settings, configuration, potential problems, etc. You can easily fix problems by pressing a button. - You can add your own health checks, have a look at the documentation for more information about custom health checks.

    + You can add your own health checks, have a look at the documentation for more information about custom health checks.

    ]]>
    @@ -2282,7 +2281,7 @@ To manage your website, simply open the Umbraco back office and start adding con Open/Close your profile options Setup Culture and Hostnames for %0% Create new node under %0% - Setup Public access on %0% + Setup access restrictions on %0% Setup Permissions on %0% Change sort order for %0% Create Content Template based on %0% @@ -2303,10 +2302,17 @@ To manage your website, simply open the Umbraco back office and start adding con Name Add new row View more options - Has translation - Missing translation - Dictionary items - Perform action %0% on the %1% node + Search the Umbraco backoffice + Search for content nodes, media nodes etc. across the backoffice. + When autocomplete results are available, press up and down arrows, or use the tab key and use the enter key to select. + Path: + Found in + Has translation + Missing translation + Dictionary items + Select one of the options to edit the node. + Perform action %0% on the %1% node + Add image caption References @@ -2451,7 +2457,7 @@ To manage your website, simply open the Umbraco back office and start adding con Hours of Umbraco training videos are only a click away Want to master Umbraco? Spend a couple of minutes learning some best practices by watching one of these videos about using Umbraco. And visit umbraco.tv for even more Umbraco videos

    +

    Want to master Umbraco? Spend a couple of minutes learning some best practices by watching one of these videos about using Umbraco. And visit umbraco.tv for even more Umbraco videos

    ]]>
    To get you started @@ -2462,27 +2468,27 @@ To manage your website, simply open the Umbraco back office and start adding con Find out more in the Documentation section of Our Umbraco + Read more about working with the items in Settings in the Documentation section of Our Umbraco ]]> Community Forum + Ask a question in the Community Forum ]]> tutorial videos (some are free, some require a subscription) + Watch our tutorial videos (some are free, some require a subscription) ]]> productivity boosting tools and commercial support + Find out about our productivity boosting tools and commercial support ]]> training and certification opportunities + Find out about real-life training and certification opportunities ]]> diff --git a/src/Umbraco.Web.UI.NetCore/umbraco/config/lang/es.xml b/src/Umbraco.Web.UI.NetCore/umbraco/config/lang/es.xml index 202e479f48..2f4fac3450 100644 --- a/src/Umbraco.Web.UI.NetCore/umbraco/config/lang/es.xml +++ b/src/Umbraco.Web.UI.NetCore/umbraco/config/lang/es.xml @@ -504,11 +504,11 @@ Margen interno Insertar Instalar - Inválido + Inválido Justificar Etiqueta Idioma - Último + Último Diseño Cargando Bloqueado @@ -520,7 +520,7 @@ Mensaje Mover Nombre - Nuevo + Nuevo Próximo No de @@ -625,7 +625,7 @@ 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 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)

    ]]>
    + ¡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.]]> 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. ]]> @@ -652,7 +652,7 @@ Configurando los permisos de directorios 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 - 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.]]> + 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 ]]> @@ -696,7 +696,7 @@ Resplandeciente sábado Iniciar sesión La sesión ha caducado - © 2001 - %0%
    umbraco.com

    ]]>
    + © 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 ésta está registrada. diff --git a/src/Umbraco.Web.UI.NetCore/umbraco/config/lang/fr.xml b/src/Umbraco.Web.UI.NetCore/umbraco/config/lang/fr.xml index 04752bf478..498245c441 100644 --- a/src/Umbraco.Web.UI.NetCore/umbraco/config/lang/fr.xml +++ b/src/Umbraco.Web.UI.NetCore/umbraco/config/lang/fr.xml @@ -812,7 +812,7 @@

    Pour poursuivre, veuillez éditer le fichier "web.config" (avec Visual Studio ou votre éditeur de texte favori), scroller jusqu'en bas, ajouter le "connection string" pour votre base de données dans la ligne avec la clé "umbracoDbDSN" et sauvegarder le fichier.

    Cliquez sur le bouton Réessayer lorsque cela est fait. -
    +
    Plus d'informations sur l'édition du fichier web.config ici.

    ]]> Veuillez contacter votre fournisseur de services internet si nécessaire. @@ -860,7 +860,7 @@ Je veux démarrer "from scratch" Apprenez comment) + (Apprenez comment) Vous pouvez toujours choisir d'installer Runway plus tard. Pour cela, allez dans la section "Développeur" et sélectionnez "Packages". ]]> Vous venez de mettre en place une plateforme Umbraco toute nette. Que voulez-vous faire ensuite ? @@ -928,7 +928,7 @@ Pour gérer votre site, ouvrez simplement le backoffice Umbraco et commencez à Connectez-vous ci-dessous Identifiez-vous avec La session a expiré - © 2001 - %0%
    Umbraco.com

    ]]>
    + © 2001 - %0%
    Umbraco.com

    ]]>
    Mot de passe oublié? Un email contenant un lien pour ré-initialiser votre mot de passe sera envoyé à l'adresse spécifiée Un email contenant les instructions de ré-initialisation de votre mot de passe sera envoyée à l'adresse spécifiée si elle correspond à nos informations. @@ -1370,6 +1370,7 @@ Pour gérer votre site, ouvrez simplement le backoffice Umbraco et commencez à Les erreurs de validation doivent être corrigées avant de pouvoir sauvegarder l'élément Echec Sauvegardé + Sauvegardé. Veuillez rafraîchir votre navigateur pour voir les changements Permissions utilisateur insuffisantes, l'opération n'a pas pu être complétée Annulation L'opération a été annulée par une extension tierce @@ -2323,7 +2324,7 @@ Pour gérer votre site, ouvrez simplement le backoffice Umbraco et commencez à Des heures de vidéos de formation Umbraco ne sont qu'à un clic d'ici Vous voulez maîtriser Umbraco? Passez quelques minutes à apprendre certaines des meilleures pratiques en regardant une de ces vidéos à propos de l'utilisation d'Umbraco. Et visitez umbraco.tv pour encore plus de vidéos Umbraco

    +

    Vous voulez maîtriser Umbraco? Passez quelques minutes à apprendre certaines des meilleures pratiques en regardant une de ces vidéos à propos de l'utilisation d'Umbraco. Et visitez umbraco.tv pour encore plus de vidéos Umbraco

    ]]>
    Pour démarrer @@ -2334,27 +2335,27 @@ Pour gérer votre site, ouvrez simplement le backoffice Umbraco et commencez à En savoir plus dans la section Documentation de Our Umbraco + Lisez-en plus sur la façon de travailler avec les éléments dans la section Settings dans la section Documentation de Our Umbraco ]]> Community Forum + Posez une question dans le Community Forum ]]> tutoriels vidéos (certains sont gratuits, certains nécessitent un abonnement) + Regardez nos tutoriels vidéos (certains sont gratuits, certains nécessitent un abonnement) ]]> outils d'amélioration de productivité et notre support commercial + Découvrez nos outils d'amélioration de productivité et notre support commercial ]]> formations et certifications + Découvrez nos possibilités de formations et certifications ]]> diff --git a/src/Umbraco.Web.UI.NetCore/umbraco/config/lang/he.xml b/src/Umbraco.Web.UI.NetCore/umbraco/config/lang/he.xml index e100cb4301..fcc9cfb8ad 100644 --- a/src/Umbraco.Web.UI.NetCore/umbraco/config/lang/he.xml +++ b/src/Umbraco.Web.UI.NetCore/umbraco/config/lang/he.xml @@ -361,8 +361,8 @@

    To proceed, please edit the "web.config" file (using Visual Studio or your favourite text editor), scroll to the bottom, add the connection string for your database in the key named "UmbracoDbDSN" and save the file.

    Click the retry button when - done.
    - More information on editing web.config here.

    ]]>
    + done.
    + More information on editing web.config here.

    ]]> Please contact your ISP if necessary. If you're installing on a local machine or server you might need information from your system administrator.]]> @@ -409,7 +409,7 @@ אני רוצה להתחיל מאתר ריק learn how) + (learn how) You can still choose to install Runway later on. Please go to the Developer section and choose Packages. ]]> סיימת להתקין את מערכת אומברקו, מה ברצונך לעשות כעת? @@ -467,7 +467,7 @@ To manage your website, simply open the Umbraco back office and start adding con יש לבצע חידוש פעילות על מנת לשמור על התוכן - © 2001 - %0%
    umbraco.com

    ]]>
    + © 2001 - %0%
    umbraco.com

    ]]>
    לוח הבקרה diff --git a/src/Umbraco.Web.UI.NetCore/umbraco/config/lang/it.xml b/src/Umbraco.Web.UI.NetCore/umbraco/config/lang/it.xml index c7842ab5ff..812da01703 100644 --- a/src/Umbraco.Web.UI.NetCore/umbraco/config/lang/it.xml +++ b/src/Umbraco.Web.UI.NetCore/umbraco/config/lang/it.xml @@ -359,7 +359,7 @@ installa per installare il database Umbraco %0% ]]> Avanti per proseguire.]]> Database non trovato! Perfavore, controlla che le informazioni della stringa di connessione nel file "web.config" siano corrette.

    -

    Per procedere, edita il file "web.config" (utilizzando Visual Studio o l'editor di testo che preferisci), scorri in basso, aggiungi la stringa di connessione per il database chiamato "umbracoDbDSN" e salva il file.

    Clicca il tasto riprova quando hai finito.
    Maggiori dettagli per la modifica del file web.config qui.

    ]]>
    +

    Per procedere, edita il file "web.config" (utilizzando Visual Studio o l'editor di testo che preferisci), scorri in basso, aggiungi la stringa di connessione per il database chiamato "umbracoDbDSN" e salva il file.

    Clicca il tasto riprova quando hai finito.
    Maggiori dettagli per la modifica del file web.config qui.

    ]]> Premi il tasto aggiorna per aggiornare il database ad Umbraco %0%

    Non preoccuparti, il contenuto non verrà perso e tutto continuerà a funzionare dopo l'aggiornamento!

    ]]>
    Premi il tasto Avanti per continuare.]]> @@ -386,7 +386,7 @@ - Guarda come) Puoi anche installare eventuali Runway in un secondo momento. Vai nella sezione Developer e scegli Pacchetti.]]> + Guarda come) Puoi anche installare eventuali Runway in un secondo momento. Vai nella sezione Developer e scegli Pacchetti.]]> Runway è installato Riconnetti adesso per salvare il tuo lavoro - © 2001 - %0%
    umbraco.com

    ]]>
    + © 2001 - %0%
    umbraco.com

    ]]>
    Dashboard diff --git a/src/Umbraco.Web.UI.NetCore/umbraco/config/lang/ja.xml b/src/Umbraco.Web.UI.NetCore/umbraco/config/lang/ja.xml index 161a6fa0dd..80aad2c301 100644 --- a/src/Umbraco.Web.UI.NetCore/umbraco/config/lang/ja.xml +++ b/src/Umbraco.Web.UI.NetCore/umbraco/config/lang/ja.xml @@ -493,7 +493,7 @@

    続行するには"web.config"ファイルを編集(Visual Studioないし使い慣れたテキストエディタで)し、下の方にスクロールし、"umbracoDbDSN"という名前のキーでデータベースの接続文字列を追加して保存します。

    再施行ボタンをクリックして - 続けます。
    + 続けます。
    より詳細にはこちらの web.config を編集します。

    ]]> 必要ならISPに連絡するなどしてみてください。 @@ -541,7 +541,7 @@ スクラッチから始めたい どうしたらいいの?) + (どうしたらいいの?) 後からRunwayをインストールする事もできます。そうしたくなった時は、Developerセクションのパッケージへどうぞ。 ]]> Umbracoプラットフォームのクリーンセットアップが完了しました。この後はどうしますか? @@ -608,7 +608,7 @@ Runwayをインストールして作られた新しいウェブサイトがど ハッピー土曜日 ウェブサイトにログインします。 セッションタイムアウトしました。 - © 2001 - %0%
    umbraco.org

    ]]>
    + © 2001 - %0%
    umbraco.org

    ]]>
    ダッシュボード diff --git a/src/Umbraco.Web.UI.NetCore/umbraco/config/lang/ko.xml b/src/Umbraco.Web.UI.NetCore/umbraco/config/lang/ko.xml index dc2a2c8212..02f50e73b2 100644 --- a/src/Umbraco.Web.UI.NetCore/umbraco/config/lang/ko.xml +++ b/src/Umbraco.Web.UI.NetCore/umbraco/config/lang/ko.xml @@ -357,8 +357,8 @@ 데이터베이스를 찾을 수 없습니다. “web.config”파일의 "connection string"이 바르게 설정되었는지 확인하세요.

    "web.config" 파일에 맨아래에 ,키네임을 "UmbracoDbDSN"로 하여 사용하시는 데이터베이스의 connection string 정보를 입력하시고 파일을 저장하세요.

    - 완료 후재시도버튼을 누르세요.
    - web.config의 더많은 정보는 여기에 있습니다.

    ]]>
    + 완료 후재시도버튼을 누르세요.
    + web.config의 더많은 정보는 여기에 있습니다.

    ]]>
    필요하시다면 사용하시는 ISP쪽에 문의하시기 바랍니다.. 로컬 머신이나 서버에 설치되어 있다면 해당 시스템 관리자에게 문의하시기 바랍니다.]]> @@ -395,7 +395,7 @@ scratch를 시작하기 원합니다. learn how) + (learn how) Runway설치를 나중에 실행하실 수 있습니다. 개발도구 부분에서 패키지를 선택하세요. ]]> 여러분은 Umbraco 플랫폼 설치를 완료하였습니다. 다음엔 어떤 작업을 원하십니까? @@ -452,7 +452,7 @@ TRANSLATE ME: 'Renew now to save your work' - © 2001 - %0%
    umbraco.com

    ]]>
    + © 2001 - %0%
    umbraco.com

    ]]>
    대시보드 diff --git a/src/Umbraco.Web.UI.NetCore/umbraco/config/lang/nb.xml b/src/Umbraco.Web.UI.NetCore/umbraco/config/lang/nb.xml index 86bf8fa6f6..cc0b46f200 100644 --- a/src/Umbraco.Web.UI.NetCore/umbraco/config/lang/nb.xml +++ b/src/Umbraco.Web.UI.NetCore/umbraco/config/lang/nb.xml @@ -437,7 +437,7 @@ Databasekonfigurasjon installer-knappen for å installere Umbraco %0% databasen]]> Neste for å fortsette.]]> - Databasen ble ikke funnet! Vennligst sjekk at informasjonen i "connection string" i "web.config"-filen er korrekt.

    For å fortsette, vennligst rediger "web.config"-filen (bruk Visual Studio eller din favoritteditor), rull ned til bunnen, og legg til tilkoblingsstrengen for din database i nøkkelen "umbracoDbDSN" og lagre filen.

    Klikk prøv på nytt når du er ferdig.
    Mer informasjon om redigering av web.config her.

    ]]>
    + Databasen ble ikke funnet! Vennligst sjekk at informasjonen i "connection string" i "web.config"-filen er korrekt.

    For å fortsette, vennligst rediger "web.config"-filen (bruk Visual Studio eller din favoritteditor), rull ned til bunnen, og legg til tilkoblingsstrengen for din database i nøkkelen "umbracoDbDSN" og lagre filen.

    Klikk prøv på nytt når du er ferdig.
    Mer informasjon om redigering av web.config her.

    ]]>
    Vennligst kontakt din ISP om nødvendig. Hvis du installerer på en lokal maskin eller server, må du kanskje skaffe informasjonen fra din systemadministrator.]]> Trykk på knappen oppgrader for å oppgradere databasen din til Umbraco %0%

    Ikke vær urolig - intet innhold vil bli slettet og alt vil fortsette å virke etterpå!

    ]]>
    Trykk Neste for å fortsette.]]> @@ -464,7 +464,7 @@ Konfigurerer mappetillatelser Jeg ønsker å starte fra bunnen. - lær hvordan) Du kan fortsatt velge å installere Runway senere. Vennligst gå til Utvikler-seksjonen og velg Pakker.]]> + lær hvordan) Du kan fortsatt velge å installere Runway senere. Vennligst gå til Utvikler-seksjonen og velg Pakker.]]> Du har akkurat satt opp en ren Umbraco plattform. Hva vil du gjøre nå? Runway er installert Dette er vår liste av anbefalte moduler- Kryss av de du ønsker å installere, eller se denfulle listen av moduler ]]> @@ -509,7 +509,7 @@ Logg på nedenfor Logg på med Din sesjon er utløpt - © 2001 - %0%
    umbraco.com

    ]]>
    + © 2001 - %0%
    umbraco.com

    ]]>
    Skrivebord diff --git a/src/Umbraco.Web.UI.NetCore/umbraco/config/lang/nl.xml b/src/Umbraco.Web.UI.NetCore/umbraco/config/lang/nl.xml index 140cd095ff..8bb21ee97f 100644 --- a/src/Umbraco.Web.UI.NetCore/umbraco/config/lang/nl.xml +++ b/src/Umbraco.Web.UI.NetCore/umbraco/config/lang/nl.xml @@ -1,4 +1,4 @@ - + The Umbraco community @@ -8,13 +8,18 @@ Beheer domeinnamen Documentgeschiedenis Node bekijken - Wijzig documenttype + Documenttype wijzigen + Datatype aanpassen Kopiëren Nieuw + Export Nieuwe package + Groep maken Verwijderen Uitschakelen + Instellingen wijzigen Prullenbak leegmaken + Inschakelen Documenttype exporteren Documenttype importeren Package importeren @@ -27,20 +32,62 @@ Depubliceren Nodes opnieuw inladen Herpubliceer de site - Stel rechten voor pagina %0% in + Verwijder + Hernoem Herstellen + Stel rechten voor pagina %0% in + Kies waar u wilt kopiëren + Kies waar u wilt verplaatsen + naar de boomstructuur hieronder + Kies waar u de geselecteerde item(s) naartoe wilt kopiëren + Kies waar u de geselecteerde item(s) naartoe wilt verplaatsen + was verplaatst naar + was gekopieerd naar + was verwijderd Rechten Vorige versies Klaar voor publicatie Klaar voor vertalen + Groep instellen Sorteren Vertalen Bijwerken Rechten instellen Deblokkeer - Content template aanmaken + Inhoudssjabloon aanmaken Uitnodiging opnieuw versturen + + Inhoud + Administratie + Structuur + Andere + + + Toegang toestaan om cultuur- en hostnamen toe te wijzen + Toegang toestaan om het geschiedenislogboek van een node te bekijken + Toegang toestaan om een node te bekijken + Toegang toestaan om het documenttype van een node te wijzigen + Toegang toestaan om een node te kopiëren + Toegang toestaan om nodes aan te maken + Toegang toestaan om nodes te verwijderen + Toegang toestaan om een node te verplaatsen. + Toegang toestaan om openbare toegang voor een node in te stellen en te wijzigen + Toegang toestaan om een node te publiceren + Toegang toestaan om een node te depubliceren + Toegang toestaan om de machtigingen van een node te wijzigen + Toegang toestaan om een node terug te draaien naar een vorige status + Toegang toestaan om een node te verzenden voor goedkeuring voor publicatie + Toegang toestaan om een node te verzenden voor vertaling + Toegang toestaan om de volgorde van nodes te wijzigen + Toegang toestaan om een node te vertalen + Toegang toestaan om een node op te slaan + Toegang toestaan om Inhoudssjabloon aan te maken + + + Inhoud + Info + Toegang geweigerd. Nieuw domein toevoegen @@ -56,6 +103,10 @@ Domein '%0%' is bijgewerkt Bewerk huidige domeinen Overerven + + + Cultuur of erf de cultuur over van de oudernodes. Zal ook van toepassing
    zijn op de huidige node, tenzij een domein hieronder ook van toepassing is.]]>
    @@ -63,6 +114,35 @@ Tonen voor + Inhoud verwijderd + Inhoud gedepubliceerd + Inhoud gedepubliceerd voor talen: %0% + Inhoud gepubliceerd + Inhoud gepubliceerd voor talen: %0% + Inhoud bewaard + Inhoud bewaard voor talen: %0% + Inhoud verplaatst + Inhoud gekopieerd + Inhoud teruggezet + Inhoud verzonden voor publicatie + Inhoud verzonden voor publicatie voor talen: %0% + Sorteer onderliggende items door de gebruiker uitgevoerd + %0% + Kopieer + Publiceer + Publiceer + Verplaats + Bewaar + Bewaar + Verwijder + Depubliceer + Depubliceer + Terugzetten + Verzenden voor publicatie + Verzenden voor publicatie + Sorteer + Aangepast + Geschiedenis (alle varianten) Selectie ongedaan maken @@ -84,18 +164,34 @@ Nummering Macro invoegen Afbeelding invoegen + Publiceren en sluiten + Publiceren met onderliggende nodes Relaties wijzigen Terug naar overzicht Opslaan + Opslaan en sluiten Opslaan en publiceren + Opslaan en plannen Opslaan en verzenden voor goedkeuring - Sla list view op - voorbeeld bekijken - Voorbeeld bekijken is uitgeschakeld omdat er geen template is geselecteerd + Lijstweergave opslaan + Planning + Voorbeeld + Opslaan en voorbeeld bekijken + Voorbeeld bekijken is uitgeschakeld omdat er geen sjabloon is geselecteerd Stijl kiezen Stijlen tonen Tabel invoegen + Models genereren en sluiten Opslaan en models genereren + Ongedaan maken + Herhalen + Terugzetten + Tag verwijderen + Annuleren + Bevestigen + Meer publicatie opties + Indienen + Indienen en sluiten Om het documenttype voor de geselecteerde inhoud te wijzigen, selecteert u eerst uit de lijst van geldige types voor deze locatie. @@ -107,7 +203,7 @@ Documenttype gewijzigd Eigenschappen toewijzen Toewijzen aan eigenschap - Nieuwe template + Nieuw sjabloon Nieuw type geen Inhoud @@ -117,6 +213,12 @@ Toewijzen van eigenschappen kan niet worden afgerond, omdat één of meer eigenschappen meer dan één toewijzing hebben. Alleen alternatieve types geldig voor de huidige locatie worden weergegeven. + + Het maken van een map onder de bovenliggende map met ID %0% is mislukt + Het maken van een map onder de bovenliggende map met de naam %0% is mislukt + De mapnaam mag geen ongeldige tekens bevatten. + Verwijderen van item is mislukt: %0% + Is gepubliceerd Over deze pagina @@ -137,23 +239,35 @@ Laatst gepubliceerd op Er zijn geen items om weer te geven Er zijn geen items om weer te geven. + Er zijn geen subitems toegevoegd + Er zijn geen leden toegevoegd Mediatype Link naar media item(s) Ledengroep Rol Ledentype + Er zijn geen wijzigingen aangebracht Geen datum gekozen Pagina Titel + Dit media item heeft geen link + Inhoud kan niet worden toegevoegd aan dit item Eigenschappen - Dit document is gepubliceerd maar niet zichtbaar omdat de bovenliggende node '%0%' niet gepubliceerd is + Dit document is gepubliceerd maar niet zichtbaar omdat de bovenliggende pagina '%0%' niet gepubliceerd is + Deze cultuur is gepubliceerd maar is niet zichtbaar omdat het niet gepubliceerd is op de bovenliggende pagina '%0%' Dit document is gepubliceerd, maar het staat niet in de cache (interne serverfout) Kan de URL niet ophalen - Dit document is gepubliceerd, maar de URL conflicteert met %0% + Dit document is gepubliceerd maar de URL conflicteert met %0% + Dit document is gepubliceerd maar de URL kan niet worden gerouteerd Publiceren + Gepubliceerd + Gepubliceerd (hangende wijzigingen) Publicatiestatus + %0% en alle onderliggende content items en maak daarmee de inhoud openbaar.]]> + Publiceren op Depubliceren op Verwijderdatum + Datum instellen De sorteervolgorde is gewijzigd Om nodes te sorteren, sleep de nodes of klik op één van de kolomtitels. Je kan meerdere nodes tegelijk selecteren door de "shift"- of "control"knop in te drukken tijdens het selecteren. Statistieken @@ -161,43 +275,119 @@ Alternatieve tekst (optioneel) Type Depubliceren + Concept + Niet gemaakt Laatst gewijzigd Date/time this document was edited Bestand(en) verwijderen + Klik hier om de afbeelding van het media item te verwijderen + Klik hier om het bestand van het media item te verwijderen Link naar het document Lid van groep(en) Geen lid van groep(en) Subitems Doel Dit betekend de volgende tijd op de server: - Wat houd dit in?]]> + Wat houd dit in?]]> Ben je er zeker van dat je dit item wilt verwijderen? + Ben je zeker dat je alle items wilt verwijderen? Eigenschap %0% gebruikt editor %1% welke niet wordt ondersteund door Nested Content. + Er zijn geen content types geconfigureerd voor deze eigenschap. + Element type toevoegen + Selecteer een element type + Selecteer de groep waarvan je de eigenschappen wil tonen. Indien je niets selecteert, wordt de eerste groep van het elementtype gebruikt. + Voer een angular expressie in om te evalueren tegen de naam van elk item. Gebruik + om de itemindex weer te geven Voeg nog een tekstvak toe Verwijder dit tekstvak Content root + Inclusief niet-gepubliceerde inhoudsitems. Deze waarde is verborgen. Indien u toegang nodig heeft om deze waarde te bekijken, neem dan contact op met uw websitebeheerder. Deze waarde is verborgen + Welke talen wil je publiceren? Alle talen met inhoud zijn opgeslagen! + Welke talen wil je publiceren? + Welke talen wil je opslaan? + Alle talen met inhoud zijn opgeslagen bij het aanmaken! + Welke talen wil je ter goedkeuring verzenden? + Welke talen wil je plannen? + Selecteer de talen om te depubliceren. Een verplichte taal depubliceren zal alle talen depubliceren. + Gepubliceerde talen + Niet-gepubliceerde talen + Ongewijzigde talen + Deze talen zijn nog niet gemaakt + + Alle nieuwe varianten worden opgeslagen. + Welke varianten wil je publiceren? + Kies welke varianten u wilt opslaan. + Kies varianten om ter goedkeuring te verzenden. + Geplande publicatie instellen... + Selecteer de varianten om te depubliceren. Een verplichte taal depubliceren zal alle varianten depubliceren. + De volgende varianten zijn vereist om te kunnen publiceren: + + We zijn niet klaar om te publiceren + Klaar om te publiceren? + Klaar om op te slaan? + Ter goedkeuring verzenden + Selecteer de datum en tijd om het content item te publiceren en/of depubliceren. + Maak nieuw + Plakken vanaf het klembord + Dit item is in de prullenbak + + + Nieuw Inhoudssjabloon aanmaken voor '%0%' + Leeg + Selecteer een Inhoudssjabloon + Inhoudssjabloon aangemaakt + Inhoudssjabloon is aangemaakt voor '%0%' + Er bestaat al een Inhoudssjabloon met dezelfde naam + Een inhoudssjabloon is voorgedefinieerde inhoud die een editor kan selecteren om te gebruiken als basis voor het maken van nieuwe inhoud Klik om te uploaden Of klik hier om bestanden te kiezen - Dit bestand heeft niet het juiste file-type. Dit bestand kan niet geupload worden. + Je kan bestanden hier naartoe slepen om te uploaden. + Kan dit bestand niet uploaden, het heeft niet het juiste bestandstype. Maximale bestandsgrootte is + Media root + Het is niet gelukt om de media te verplaatsen + De bovenliggende map en de doelmap kunnen niet hetzelfde zijn + Kan media niet kopiëren + Kan de map onder de bovenliggende map met id %0% niet aanmaken + Kan de map met id %0% niet hernoemen + Sleep en zet je bestand(en) neer in dit gebied + Upload is niet toegelaten in deze locatie. - Maak nieuwe member aan - Alle Members + Maak nieuw lid aan + Alle leden + Ledengroepen hebben geen extra eigenschappen om te bewerken. Waar wil je de nieuwe %0% aanmaken? Aanmaken onder + Selecteer een documenttype waarvoor je een Inhoudssjabloon wil maken + Voer een mapnaam in Kies een type en een titel "Documenttypes".]]> + Documenttypes in de sectie Instellingen.]]> + De geselecteerde pagina in de boomstructuur laat geen nieuwe onderliggende paginas toe. + Rechten aanpassen voor dit documenttype + Nieuw documenttype aanmaken + Documenttypes in de sectie Instellingen, de optie Toestaan op root-niveau onder Rechten.]]> "Mediatypes".]]> - Document Type zonder template + De geselecteerde media in de boomstructuur laat niet toe dat er onderliggende media aangemaakt wordt. + Rechten aanpassen voor dit mediatype + Documenttype zonder sjabloon Nieuwe map - Nieuw data type + Nieuw datatype + Nieuw JavaScript bestand + Nieuwe lege partial view + Nieuwe partial view macro + Nieuwe partial view van fragment + Nieuwe partial view macro van fragment + Nieuwe partial view macro (zonder macro) + Nieuw style sheet bestand + Nieuw Rich Text Editor style sheet bestand Open je website @@ -212,8 +402,11 @@ Blijf op deze pagina Negeer wijzigingen Wijzigingen niet opgeslagen - Weet je zeker dat deze pagina wilt verlaten? - er zijn onopgeslagen wijzigingen - Depubliceren zal deze pagina en alle onderliggende paginas verwijderen van de site. + Weet je zeker dat deze pagina wilt verlaten? Er zijn onopgeslagen wijzigingen + Publiceren maakt de geselecteerde items zichtbaar op de site. + Depubliceren zal de geselecteerde items en alle onderliggende items verwijderen van de site. + Depubliceren zal deze pagina en alle onderliggende pagina's verwijderen van de site. + Wijzigingen niet opgeslagen. Aanpassingen aan het Documenttype zullen de wijzigingen ongedaan maken. Done @@ -241,16 +434,20 @@ Link Titel Link + Anker / querystring Naam - Beheer domeinnamen Sluit dit venster Weet je zeker dat je dit wilt verwijderen Weet je zeker dat je dit wilt uitschakelen + Weet u zeker dat u wilt verwijderen + %0% wil verwijderen]]> + %0% wil verwijderen]]> Weet je het zeker? Weet je het zeker? Knippen Pas woordenboekitem aan Taal aanpassen + Geselecteerde media bewerken Lokale link invoegen Karakter invoegen Voeg grafische titel in @@ -258,24 +455,30 @@ Link invoegen Klik om een Macro toe te voegen Tabel invoegen + Dit zal de taal verwijderen + De cultuur veranderen voor een taal kan een langdurige operatie zijn en zal ertoe leiden dat de inhoudscache en indexen opnieuw worden opgebouwd Laatst aangepast op Link Interne link: Plaats een hekje (“#”) voor voor interne links. In nieuw venster openen? + Macro instellingen Deze macro heeft geen eigenschappen die u kunt bewerken Plakken Bewerk rechten voor + Rechten instellen voor + Rechten instellen voor %0% voor gebruikersgroepf %1% + Selecteer de gebruikersgroepen waarvoor u de rechten wilt instellen De items worden nu uit de prullenbak verwijderd. Sluit dit venster niet terwijl de actie nog niet voltooid is. De prullenbak is nu leeg. Als items worden verwijderd uit de prullenbak, zijn ze voorgoed verwijderd. - regexlib.com ondervindt momenteel problemen waarover we geen controle hebben. Onze excuses voor het ongemak.]]> + regexlib.com ondervindt momenteel problemen waarover we geen controle hebben. Onze excuses voor het ongemak.]]> Zoek naar een reguliere expressie om validatie aan een formulierveld toe te voegen. Voorbeeld: 'email', 'postcode', 'URL'. Verwijder Macro Verplicht veld Site is opnieuw geïndexeerd De site is opnieuw gepubliceerd - De cache zal worden vernieuwd. Alle gepubliceerde inhoud zal worden ge-update, terwijl ongepubliceerde inhoud ongepubliceerd zal blijven. + De cache zal worden vernieuwd. Alle gepubliceerde inhoud zal worden bijgewerkt, terwijl ongepubliceerde inhoud ongepubliceerd zal blijven. Aantal kolommen Aantal regels Klik op de afbeelding voor volledige grootte @@ -283,19 +486,30 @@ Toon cache item Relateer aan origineel Onderliggende nodes meenemen - De vriendelijkste community + De vriendelijkste gemeenschap Link naar pagina Opent het gelinkte document in een nieuw venster of tab Link naar media + Selecteer content start node Selecteer media + Selecteer media type Selecteer icoon Selecteer item Selecteer link Selecteer macro Selecteer content + Selecteer content type + Selecteer media start node Selecteer member - Selecteer member group + Selecteer lid groep + Selecteer lid type + Selecteer node + Selecteer secties + Selecteer gebruiker + Selecteer gebruikers + Geen iconen gevonden Er zijn geen parameters voor deze macro + Er zijn geen macro's beschikbaar om in te voegen Externe login providers Error details Stacktrace @@ -304,15 +518,53 @@ De-Link je account Selecteer editor + Selecteer configuratie + Selecteer fragment + Dit zal de node en al zijn talen verwijderen. Als je slechts één taal wil verwijderen, moet je de node in die taal depubliceren. + %0% verwijderen.]]> + %0% verwijderen van de %1% groep]]> + Ja, verwijderen + + + Er zijn geen woordenboekitems. + ]]> Cultuurnaam + ]]> + Woordenboek overzicht + + + Ingestelde Zoekers + Toont eigenschappen en hulpmiddelen voor elke geconfigureerde Zoeker (bijv. zoals een multi-indexzoeker) + Veldwaarden + Gezondheidsstatus + De gezondheidsstatus van de index en of het kan gelezen worden + Indexeerders + Index info + De eigenschappen oplijsten van de index + Beheer de indexen van Examine + Bekijk de details van elke index en gebruik hulpmiddelen voor het beheer er van + Index opnieuw bouwen + + Afhankelijk van hoeveel inhoud er op je site staat, kan dit even duren.
    + Het wordt niet aanbevolen om een index opnieuw op te bouwen terwijl er veel verkeer op de website is of wanneer editors inhoud bewerken. + ]]> +
    + Zoekers + Zoek in de index en bekijk de resultaten + Hulpmiddelen + Hulpmiddelen om de index te beheren + velden + De index kan niet gelezen worden en moet opnieuw worden gebouwd + Het proces duurt langer dan verwacht, controleer het Umbraco logboek om te kijken of er geen fouten waren tijdens deze operatie + Deze index kan niet opnieuw worden opgebouwd want het heeft geen toegewezen + IIndexPopulator Typ jouw gebruikersnaam @@ -320,30 +572,54 @@ Bevestig jouw wachtwoord Benoem de %0%... Typ een naam... + Voer een e-mailadres in + Voer een gebruikersnaam in... Label... Voer een omschrijving in... Typ om te zoeken... Typ om te filteren... - Typ om tags toe te voegen (druk op enter na elke tag)... - Voer jouw email in - Jouw gebruikersnaam is meestal jouw email + Typ om tags toe te voegen (druk op Enter na elke tag)... + Voer jouw e-mailadres in + Voer een bericht in ... + Jouw gebruikersnaam is meestal jouw e-mailadres + #value of ?key=value + Voer een alias in... + Alias genereren... + Item aanmaken + Bewerken + Naam Maak een aangepaste lijstweergave Verwijder aangepaste lijstweergave + Een content type, media type of member type met deze alias bestaat al + + + Hernoemd + Voer een nieuwe mapnaam in + %0% is hernoemd naar %1% Prevalue toevoegen - Datebase datatype + Database datatype Data Editor GUID Render control - Buttons + Knoppen Geavanceerde instellingen inschakelen voor Context menu inschakelen Maximum standaard grootte van afbeeldingen Gerelateerde stylesheets Toon label Breedte en hoogte + Alle eigenschap types & eigenschap data + die dit datatype gebruiken zullen permanent verwijderd worden, bevestig dat u deze ook wilt verwijderen + Ja, verwijderen + en alle eigenschap types & eigenschap data die dit datatype gebruiken + Selecteer een map om te verplaatsen + naar in de boomstructuur hieronder + werd eronder verplaatst + %0% te verwijderen zullen alle eigenschappen en de data verwijderd worden van de volgende items:]]> + Ik begrijp dat deze actie alle eigenschappen en data zal verwijderen die gebaseerd is op dit datatype. Je data is opgeslagen, maar voordat je deze pagina kunt publiceren moet je eerst aan paar problemen oplossen: @@ -373,8 +649,11 @@ Geen actieve stijlen beschikbaar Plaats de cursor links van de twee cellen die je wilt samenvoegen Je kunt een cel die is samengevoegd niet delen + Deze eigenschap is ongeldig + Eigenschap '%0%' gebruikt editor '%1%' die niet ondersteund wordt in Element Types. + Opties Over Actie Acties @@ -383,19 +662,24 @@ Alles Weet je het zeker? Terug - Border + Terug naar overzicht + Rand bij - Cancel + Annuleren Cel marge Kies - Sluit + Wissen + Sluiten Sluit venster Comment Bevestig + Beperken Verhoudingen behouden - Ga verder - Copy + Inhoud + Doorgaan + Kopiëren Aanmaken + Sectie bijsnijden Database Datum Standaard @@ -403,27 +687,43 @@ Verwijderd Aan het verwijderen... Ontwerp + Woordenboek Afmetingen + Gooi weg Omlaag Download - Bewerk + Bewerken Bewerkt Elementen - Email + E-mail Fout - Vind + Veld + Zoeken + Eerste + Focus punt + Algemeen + Groepen + Groep Hoogte Help + Verbergen + Geschiedenis Icoon + Id Import + Ook in onderliggende mappen zoeken + Alleen in deze map zoeken + Info Binnenste marge Invoegen Installeren Ongeldig - Justify + Uitvullen Label Taal + Laatste Layout + Links Aan het laden Gesloten Inloggen @@ -431,37 +731,50 @@ Uitloggen Macro Verplicht + Bericht Verplaats Naam Nieuw Volgende Nee of + Uit OK Open + Aan of + Sorteren op Wachtwoord Pad Een ogenblik geduld aub... Vorige Eigenschappen - Email om formulier resultaten te ontvangen + Opnieuw opbouwen + E-mail om formulier resultaten te ontvangen Prullenbak De prullenbak is leeg + Vernieuwen Overblijvend + Verwijderen Hernoem Vernieuw Verplicht + Ophalen Opnieuw proberen Rechten + Geplande publicatie Zoeken We konden helaas niet vinden wat je zocht + Er zijn geen items toegevoegd Server + Instellingen Toon Toon pagina na verzenden Grootte Sorteer + Status Verstuur + Succes Typen Typ om te zoeken... onder @@ -489,23 +802,37 @@ huidig Embed geselecteerd + Andere + Artikels + Videos + Installeren Blauw Groep toevoegen - Property toevoegen + Eigenschap toevoegen Editor toevoegen - Template toevoegen + Sjabloon toevoegen Child node toevoegen Child toevoegen - Data type bewerken + Datatype bewerken Secties navigeren - Shortcuts - Toon shortcuts - Toggle lijstweergave - Toggle toestaan op root-niveau + Snelkoppeling + Toon snelkoppelingen + Lijstweergave in/uitschakelen + Toestaan op root-niveau in/uitschakelen + Regel in/uit commentaar zetten + Regel verwijderen + Kopieer Regels Omhoog + Kopieer Regels Omlaag + Verplaats Regels Omhoog + Verplaats Regels Omlaag + Algemeen + Editor + Cultuur varianten toestaan in/uitschakelen + Segmentatie toestaan in/uitschakelen Achtergrondkleur @@ -524,7 +851,7 @@ Database configuratie installeren om de Umbraco %0% database te installeren]]> Volgende om door te gaan.]]> - De database kon niet gevonden worden! Gelieve na te kijken of de informatie in de "connection string" van het "web.config" bestand correct is.

    Om door te gaan, gelieve het "web.config" bestand aan te passen (met behulp van Visual Studio of je favoriete tekstverwerker), scroll in het bestand naar beneden, voeg de connection string voor je database toe in de key met naam "umbracoDbDSN" en sla het bestand op.

    Klik op de knop opnieuw proberen als je hiermee klaar bent.
    Meer informatie over het aanpassen van de web.config vind je hier.

    ]]>
    + De database kon niet gevonden worden! Gelieve na te kijken of de informatie in de "connection string" van het "web.config" bestand correct is.

    Om door te gaan, gelieve het "web.config" bestand aan te passen (met behulp van Visual Studio of je favoriete tekstverwerker), scroll in het bestand naar beneden, voeg de connection string voor je database toe in de key met naam "umbracoDbDSN" en sla het bestand op.

    Klik op de knop opnieuw proberen als je hiermee klaar bent.
    Meer informatie over het aanpassen van de web.config vind je hier.

    ]]>
    Gelieve contact op te nemen met je ISP indien nodig. Wanneer je installeert op een lokale computer of server, dan heb je waarschijnlijk informatie nodig van je systeembeheerder.]]> Klik de upgrade knop om je database te upgraden naar Umbraco %0%

    Maak je geen zorgen - er zal geen inhoud worden gewist en alles blijft gewoon werken!

    ]]>
    Klik Volgende om verder te gaan.]]> @@ -553,7 +880,7 @@ Machtigingen worden aangepast Umbraco heeft write/modify toegang nodig op bepaalde mappen om bestanden zoals plaatjes en PDF's op te slaan. Het slaat ook tijdelijke data (ook bekend als 'de cache') op om de snelheid van je website te verbeteren. Ik wil met een lege website beginnen - leer hoe). Je kunt er later alsnog voor kiezen om Runway te installeren. Ga dan naar de Ontwikkelaar sectie en kies Packages.]]> + leer hoe). Je kunt er later alsnog voor kiezen om Runway te installeren. Ga dan naar de Ontwikkelaar sectie en kies Packages.]]> Je hebt zojuist een blanco Umbraco platform geinstalleerd. Wat wil je nu doen? Runway is geinstalleerd Dit is onze lijst van aanbevolen modules. Vink de modules die je wilt installeren, of bekijk de volledige lijst modules]]> @@ -591,20 +918,22 @@ Echter, Runway biedt een gemakkelijke basis om je snel op weg te helpen. Als je Vernieuw je sessie om je wijzigingen te behouden - Goede zondag - Fijne maandag + Fijne super zondag + Fijne manische maandag Fijne dinsdag - Fijne woensdag - Fijne donderdag - Fijne vrijdag + Fijne geweldige woensdag + Fijne donderende donderdag + Fijne funky vrijdag Fijne zaterdag log hieronder in Inloggen met Sessie is verlopen - © 2001 - %0%
    umbraco.com

    ]]>
    + © 2001 - %0%
    umbraco.com

    ]]>
    Wachtwoord vergeten? - Er zal een email worden gestuurd naar het emailadres van jouw account. Hierin staat een link om je wachtwoord te resetten - Een email met daarin de wachtwoord reset uitleg zal worden gestuurd als het emailadres in onze database voorkomt. + Er zal een e-mail worden gestuurd naar het e-mailadres van jouw account. Hierin staat een link om je wachtwoord te resetten + Een e-mail met daarin de wachtwoord reset uitleg zal worden gestuurd als het e-mailadres in onze database voorkomt. + Wachtwoord tonen + Wacthwoord verbergen Terug naar loginformulier Geef alsjeblieft een nieuw wachtwoord op Je wachtwoord is aangepast @@ -633,21 +962,23 @@ Echter, Runway biedt een gemakkelijke basis om je snel op weg te helpen. Als je Bewerk de notificatie voor %0% + Notificatie instellingen opgeslagen voor - Hi %0%

    + ]]>
    + De volgende talen zijn gewijzigd %0% + Hi %0%

    Dit is een geautomatiseerde mail om u op de hoogte te brengen dat de taak '%1%' is uitgevoerd op pagina '%2%' @@ -675,11 +1006,65 @@ Echter, Runway biedt een gemakkelijke basis om je snel op weg te helpen. Als je Dit is een bericht van uw Content Management Systeem.

    ]]>
    + De volgende talen zijn gewijzigd:

    + %0% + ]]>
    [%0%] Notificatie over %1% uitgevoerd op %2% Notificaties + Acties + Aangemaakt + Package aanmaken Kies een package op je computer door op "Bladeren" te klikken en de package te selecteren. Umbraco packages hebben meestal ".umb" of ".zip" als extensie. + Dit zal de package verwijderen + Neerzetten om te uploaden + Inclusief alle onderliggende nodes + of klik hier om een package bestand te kiezen + Package uploaden + Installeer een lokale package door het op je computer te selecteren. Installeer alleen packages van bronnen die je vertrouwt. + Nog een package uploaden + Annuleren en een andere package uploaden + Accepteren + gebruiksvoorwaarden + Pad naar bestand + Absoluut pad naar bestand (bv: /bin/umbraco.bin) + Geïnstalleerd + Geïnstalleerde packages + Lokaal installeren + Voltooien + Deze package heeft geen instellingen + Er zijn nog geen packages aangemaakt + Er zijn geen packages geïnstalleerd + 'Packages' rechtsboven in je scherm.]]> + Package Acties + Auteur URL + Package Inhoud + Package Bestanden + Icoon URL + Package installeren + Licentie + Licentie URL + Package Eigenschappen + Zoeken naar packages + Resultaten voor + We konden niets vinden voor + Probeer een ander pakket te zoeken of blader door de categorieën + Populair + Nieuwe releases + heeft + karma punten + Informatie + Eigenaar + Bijdragers + Aangemaakt + Huidige versie + .NET versie + Downloads + Likes + Compatibiliteit + Deze package is compatibel met de volgende versies van Umbraco, zoals gerapporteerd door de communityleden. Volledige compatibiliteit kan niet worden gegarandeerd voor versies die voor minder dan 100% worden gerapporteerd + Externe bronnen Auteur Documentatie Package meta data @@ -700,15 +1085,17 @@ Echter, Runway biedt een gemakkelijke basis om je snel op weg te helpen. Als je wees dus voorzichtig met verwijderen. Als je het niet zeker weet, neem dan contact op met de auteur van de package. ]]> Package versie - Package reeds geinstalleerd + Upgraden van versie + Package is reeds geinstalleerd Deze package kan niet worden geinstalleerd omdat minimaal Umbraco versie %0% benodigd is. - Aan het deinstalleren... - Aan het downloaden... - Aan het importeren... - Aan het installeren... - Aan het herstarten, een ongenblik geduld aub... - Geinstalleerd! Je browser zal nu automatisch ververst worden... - Klik op "finish" om de installatie te voltooien en de pagina te verversen. + Deïnstalleren... + Downloaden... + Importeren... + Installeren... + Aan het herstarten, een ogenblik geduld aub... + Geïnstalleerd! Je browser zal nu automatisch ververst worden... + Klik op "Voltooien" om de installatie te voltooien en de pagina te vernieuwen. + Package uploaden... Plakken met alle opmaak (Niet aanbevolen) @@ -717,24 +1104,30 @@ 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 selecteren die toegang hebben op de pagina - gebruik makend van Umbraco's member groups.]]> - Je moet eerst een membergroup maken voordat je kunt werken met role-based authentication. - Error Pagina + Groepsgebaseerde beveiliging + Als je toegang wilt verlenen aan alle leden van specifieke ledengroepen + Je moet een ledengroep maken voordat je op groep gebaseerde authenticatie kunt gebruiken + Foutpagina Gebruikt om te tonen als een gebruiker is ingelogd, maar geen rechten heeft om de pagina te bekijken - Hoe wil je de pagina beveiligen? - %0% is nu beveiligd - Beveiliging verwijderd van %0% + %0% beveiligen?]]> + %0% is nu beveiligd]]> + %0%]]> Login Pagina Kies de pagina met het login-formulier - Verwijder beveiliging + Beveiliging verwijderen + %0% wilt verwijderen?]]> Kies de pagina's die het login-formulier en de error-berichten bevatten - Kies de roles die toegang hebben tot deze pagina - Geef de gebruikersnaam en wachtwoord voor deze pagina - Eenvoudig: Beveilig door middel van gebruikersnaam en wachtwoord - Als je eenvoudige beveiliging wilt gebruiken met behulp van een enkele gebruikersnaam en wachtwoord + %0%]]> + %0%]]> + Specifieke bescherming voor leden + Als je toegang wilt verlenen aan bepaalde leden + Onvoldoende gebruikersmachtigingen om alle onderliggende documenten te publiceren + + @@ -742,15 +1135,16 @@ Echter, Runway biedt een gemakkelijke basis om je snel op weg te helpen. Als je %0% kon niet gepubliceerd worden omdat het item niet meer geldig is. ]]> - - Inclusief ongepubliceerde subitems + + + Validatie mislukt voor de vereiste taal '%0%'. Deze taal werd opgeslagen maar is niet gepubliceerd. Publicatie in uitvoering - even geduld... %0% van %1% pagina’s zijn gepubliceerd... %0% is gepubliceerd @@ -758,11 +1152,22 @@ Echter, Runway biedt een gemakkelijke basis om je snel op weg te helpen. Als je 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 subitems aan te vinken hieronder. - ]]>
    + ]]> Je hebt geen goedgekeurde kleuren geconfigureerd + + Je kan alleen items van de volgende type(s) selecteren: %0% + Je hebt een content-item geselecteerd dat op dit ogenblik verwijderd of in the prullenbak is + Je hebt content-items geselecteerd die op dit ogenblik verwijderd of in the prullenbak zijn + + + Verwijderd item + Je hebt een media-item geselecteerd dat op dit ogenblik verwijderd of in the prullenbak is + Je hebt media-items geselecteerd die op dit ogenblik verwijderd of in the prullenbak zijn + Weggegooid + Externe link toevoegen Interne link toevoegen @@ -773,9 +1178,17 @@ Echter, Runway biedt een gemakkelijke basis om je snel op weg te helpen. Als je Voer de link in - Reset + Uitsnede resetten + Uitsnede opslaan + Nieuwe uitsnede toevoegen + Klaar + Aanpassingen ongedaan maken + Gebruiker gedefinieerd + Wijzigingen + Aangemaakt + Selecteer een versie om te vergelijken met de huidige versie Huidige versie Rode tekst wordt niet getoond in de geselecteerde versie, groen betekent toegevoegd]]> Document is teruggezet @@ -788,23 +1201,20 @@ Echter, Runway biedt een gemakkelijke basis om je snel op weg te helpen. Als je Bewerk script-bestand - Concierge Inhoud - Courier - Ontwikkelaar - Umbraco configuratiewizard + Formulieren Media Leden - Nieuwsbrieven + Packages Instellingen - Statistieken Vertaling Gebruikers - Help - Formulieren + Rondleidingen De beste Umbraco video tutorials + Bezoek our.umbraco.com + Bezoek umbraco.tv Standaard template @@ -821,26 +1231,29 @@ Echter, Runway biedt een gemakkelijke basis om je snel op weg te helpen. Als je Dit inhoudstype gebruikt als basis inhoudstype. Tabs van basis inhoudstypes worden niet getoond en kunnen alleen worden aangepast op het basis inhoudstype zelf Geen eigenschappen gedefinieerd op dit tabblad. Klik op de link "voeg een nieuwe eigenschap" aan de bovenkant om een ​​nieuwe eigenschap te creëren. - Icon toevoegen + Maak een bijpassende sjabloon + Icoon toevoegen - Sort order - Creation date + Sorteer volgorde + Aanmaakdatum Sorteren gereed. - Sleep de pagina's omhoog of omlaag om de volgorde te veranderen. Of klik op de kolom-header om alle pagina's daarop te sorteren. + Sleep de pagina's omhoog of omlaag om de volgorde te veranderen. Of klik op de kolomkop om alle pagina's daarop te sorteren. + Dit item heeft geen subitems om te sorteren Validatie Validatiefouten moeten worden opgelost voor dit item kan worden opgeslagen Mislukt - Wegens onvoldoende rechten kon deze handeling kon niet worden uitegevoerd + Opgeslagen + Opgeslagen. Gelieve uw browser te herladen om de aanpassingen te zien + Wegens onvoldoende rechten kon deze handeling kon niet worden uitgevoerd Geannuleerd - Uitvoering is g eannuleerd door de plugin van een 3e partij - Publicatie werd geannuleerd door een plugin van een 3e partij + Uitvoering is geannuleerd door de plugin van een 3e partij Eigenschappentype bestaat al Eigenschappentype aangemaakt - Data type: %1%]]> + Datatype: %1%]]> Eigenschappentype verwijderd Inhoudstype opgeslagen Tab aangemaakt @@ -851,45 +1264,58 @@ Echter, Runway biedt een gemakkelijke basis om je snel op weg te helpen. Als je Stylesheet opgeslagen zonder fouten Datatype opgeslagen Woordenboek item opgeslagen - Publicatie is mislukt omdat de bovenliggende pagina niet gepubliceerd is Inhoud gepubliceerd en zichtbaar op de website + %0% documenten gepubliceerd en zichtbaar op de website + %0% gepubliceerd en zichtbaar op de website + %0% documenten gepubliceerd voor de talen languages %1% en zichtbaar op de website Inhoud opgeslagen Vergeet niet te publiceren om de wijzigingen zichtbaar te maken + Een planning voor publicatie is bijgewerkt + %0% bewaard Verzend voor goedkeuring - Verandering zijn verstuurd voor goedkeuring + Aanpassingen zijn verstuurd voor goedkeuring + %0% aanpassingen zijn verstuurd voor goedkeuring Media opgeslagen Media opgeslagen zonder fouten Lid opgeslagen + Ledengroep opgeslagen Stijlsheet eigenschap opgeslagen Stijlsheet opgeslagen Template opgeslagen Fout bij opslaan gebruiker (zie logboek) Gebruiker opgeslagen Gebruikerstype opgeslagen + Gebruikersgroep opgeslagen + Cultuur en hostnaam opgeslagen + Fout bij opslaan culturen en hostnamen Bestand niet opgeslagen bestand kon niet worden opgeslagen. Controleer de bestandsbeveiliging Bestand opgeslagen Bestand opgeslagen zonder fouten Taal opgeslagen - Media Type opgeslagen - Member Type opgeslagen - Template niet opgeslagen - Controleer dat je geen 2 tamplates met dezelfde naam hebt - Template opgeslagen - Template opgeslagen zonder fouten! + Mediatype opgeslagen + Ledentype opgeslagen + Ledengroep opgeslagen + Sjabloon niet opgeslagen + Controleer dat je geen 2 sjablonen met dezelfde naam hebt + Sjabloon opgeslagen + Sjabloon opgeslagen zonder fouten! Inhoud gedepubliceerd + Inhoud variatie %0% gedepubliceerd + De verplichte taal '%0%' is gedepubliceerd. Alle talen voor deze inhoud zijn nu gedepubliceerd. Partial view opgeslagen Partial view opgeslagen zonder fouten! Partial view niet opgeslagen Er is een fout opgetreden bij het opslaan van het bestand. + Rechten opgeslagen voor %0% gebruikersgroepen verwijderd %0% is verwijderd %0% gebruikers geactiveerd - %0% users gedeactiveerd + %0% gebruikers gedeactiveerd %0% is nu geactiveerd %0% is nu gedeactiveerd - Gebruikers groepen zijn ingesteld + Gebruikersgroepen zijn ingesteld %0% gebruikers gedeblokkeerd %0% is nu gedeblokkeerd Lid is geexporteerd naar een bestand @@ -897,28 +1323,122 @@ Echter, Runway biedt een gemakkelijke basis om je snel op weg te helpen. Als je Gebruiker %0% is verwijderd Gebruiker uitnodigen Uitnodiging is opnieuw gestuurd naar gebruiker %0% + Kan het document niet publiceren omdat de vereiste '%0%' niet is gepubliceerd + Validatie is mislukt voor de taal '%0%' + Documenttype is geëxporteerd naar een bestand + Er is een fout gebeurd tijdens het exporteren van het documenttype + De publicatiedatum kan niet in het verleden liggen + Kan het document niet plannen voor publicatie omdat de vereiste '%0%' niet is gepubliceerd + Kan het document niet plannen voor publicatie omdat de vereiste '%0%' een publicatiedatum heeft die later is dan een niet-verplichte taal + De vervaldatum kan niet in het verleden liggen + De vervaldatum kan niet voor de publicatiedatum liggen - Gebruik CSS syntax bijv: h1, .redHeader, .blueTex - Stijlsheet aanpassen - Bewerk stylesheet eigenschap + Stijl toevoegen + Stijl bewerken + Rich text editor stijlen + Definieer de stijlen die beschikbaar moeten zijn in de rich text editor voor deze stylesheet + Stylesheet bewerken + Stylesheet eigenschap bewerken Naam waarmee de stijl in de editor te kiezen is Voorbeeld + Hoe de tekst er zal uitzien in de rich text editor. + Selector + Gebruik CSS syntax, bv. "h1" or ".redHeader" Stijlen + De CSS die moet toegepast worden in de rich text editor, bv. "color:red;" + Code + Rich Text Editor - Template aanpassen - Invoegen inhoudsgebied - Invoegen inhoudsgebied placeholder - Invoegen dictionary item - Invoegen Macro - Invoegen Umbraco page field - Basistemplate - Quick Guide voor Umbraco template tags - Template + Kan sjabloon met ID %0% niet verwijderen + Sjabloon aanpassen + Secties + Inhoudsgebied invoegen + Een tijdelijke aanduiding voor het inhoudsgebied invoegen + Invoegen + Kies wat je wil invoegen in het sjabloon + Woordenboek item invoegen + Een woordenboekitem is een tijdelijke aanduiding voor een vertaalbaar stuk tekst, waardoor het gemakkelijk is om ontwerpen voor meertalige websites te maken. + Macro invoegen + + Een Macro is een configureerbaar component die gebruikt kan worden voor + herbruikbare delen van je ontwerp, waar je de optie nodig hebt om parameters op te geven, + zoals bij gallerijen, formulieren en lijsten. + + Umbraco pagina veld invoegen + Toont de waarde van een benoemd veld van de huidige pagina, met opties om de waarde te wijzigen of terug te vallen op alternatieve waarden. + Partial view + + Een partial view is een apart sjabloon dat kan gerendered worden in een ander sjabloon, + het is geschikt voor het hergebruiken van HTML of voor het scheiden van complexe sjablonen in afzonderlijke bestanden. + + Hoofdsjabloon + Geen hoofdsjabloon + Render onderliggend sjabloon + + @RenderBody() in te voegen. + ]]> + + Definieer een benoemde sectie + + @section { ... } te omwikkelen. Dit kan worden weergegeven + in een specifiek gebied van de bovenliggende sjabloon door @RenderSection te gebruiken. + ]]> + + Render een benoemde sectie + + @RenderSection(name) in te voegen. + This renders an area of a child template which is wrapped in a corresponding @section [name]{ ... } definition. + ]]> + + Sectienaam + Sectie is verplicht + + @section definiëren, anders wordt een fout getoond. + ]]> + + Querybouwer + items gevonden, in + kopiëren naar klembord + Ik wil + alle inhoud + inhoud van het type "%0%" + van + mijn website + waar + en + is + is niet + voor + voor (inclusief geselecteerde datum) + na + na (inclusief geselecteerde datum) + is gelijk aan + is niet gelijk aan + bevat + bevat niet + groter dan + groter dan of gelijk aan + kleiner dan + kleiner of gelijk aan + Id + Naam + Datum aangemaakt + Datum gewijzigd + sorteren op + oplopend + aflopend + Sjabloon - Image + Afbeelding Macro Item toevoegen Kies de indeling @@ -931,15 +1451,18 @@ Echter, Runway biedt een gemakkelijke basis om je snel op weg te helpen. Als je Klik om een item te embedden Klik om een afbeelding in te voegen Afbeelding ondertitel... - Typ hier...... + Typ hier... Grid lay-outs Lay-outs zijn het globale werkgebied voor de grid editor. Je hebt meestal maar één of twee verschillende lay-outs nodig - Een grid layout toevoegen + Een grid lay-out toevoegen + Grid lay-out aanpassen De lay-out aanpassen door de kolombreedte aan te passen en extra kolommen toe te voegen Rijconfiguratie Rijen zijn voorgedefinieerde cellen die horizontaal zijn gerangschikt Een rijconfiguratie toevoegen + Rijconfiguratie aanpassen De rijconfiguratie aanpassen door de breedte van de cel in te stellen en extra cellen toe te voegen + Geen verdere instellingen beschikbaar Kolommen Het totaal aantal gecombineerde kolommen in de grid layout Instellingen @@ -954,29 +1477,38 @@ Echter, Runway biedt een gemakkelijke basis om je snel op weg te helpen. Als je Kies extra Kies standaard zijn toegevoegd + Waarschuwing + Je gaat de rijconfiguratie verwijderen + + Een rijconfiguratienaam verwijderen zal er voor zorgen dat bestaande inhoud verloren gaat die gebaseerd is op deze configuratie. + Composities + Groep Er zijn nog geen groepen toegevoegd - Voeg groep toe + Groep toevoegen Inherited van - Voeg property toe + Eigenschap toevoegen Verplicht label - Zet list view aan - Laat de child nodes van het content item zien als een sorteer- en doorzoekbare lijstweergave zien. Deze child nodes worden dan niet in de boomstructuur getoond. - Toegestane Templates - Kies welke templates toegestaan zijn om door de editors op dit content-type gebruikt te worden - Sta toe op root-niveau - Sta editors toe om content van dit type aan te maken op root-niveau - Toegestane child node types - Sta content van een bepaald type toe om onder dit type aangemaakt te kunnen worden - Kies child node + Lijstweergave inschakelen + Laat de onderliggende nodes van het content item zien als een sorteer- en doorzoekbare lijstweergave. Deze onderliggende nodes worden dan niet in de boomstructuur getoond. + Toegestane Sjablonen + Kies welke sjablonen toegestaan zijn om door de editors op dit contenttype gebruikt te worden + Sta toe op hoofdniveau + Sta editors toe om inhoud van dit type aan te maken op hoofdniveau + Toegestane onderliggende node types + Sta inhoud van een bepaald type toe om onder dit type aangemaakt te kunnen worden + Kies onderliggende node Overgeërfde tabs en properties van een bestaand documenttype. Nieuwe tabs worden toegevoegd aan het huidige documenttype of samengevoegd als een tab met dezelfde naam al bestaat. Dit contenttype wordt gebruikt in een compositie en kan daarom niet zelf een compositie worden. Er zijn geen contenttypen beschikbaar om als compositie te gebruiken. + Een compositie verwijderen zal alle bijbehorende eigenschapsdata ook verwijderen. Zodra je het documenttype hebt opgeslagen is er geen weg meer terug. Beschikbare editors Herbruik Editor instellingen + Beschikbare configuraties + Nieuwe configuration aanmaken Configuratie Ja, verwijder is naar onder geplaatst @@ -988,8 +1520,8 @@ Echter, Runway biedt een gemakkelijke basis om je snel op weg te helpen. Als je Alle documenten Alle media items die gebruik maken van dit documenttype zullen permanent verwijderd worden. Bevestig aub dat je deze ook wilt verwijderen. - die gebruik maken van dit media type zullen permanent verwijderd worden. Bevestig aub dat je deze ook wilt verwijderen. - die gebruik maken van dit member type zullen permanent verwijderd worden. Bevestig aub dat je deze ook wilt verwijderen. + die gebruik maken van dit mediatype zullen permanent verwijderd worden. Bevestig aub dat je deze ook wilt verwijderen. + die gebruik maken van dit lidtype zullen permanent verwijderd worden. Bevestig aub dat je deze ook wilt verwijderen. en alle documenten van dit type en alle media items van dit type en alle leden van dit type @@ -1000,6 +1532,45 @@ Echter, Runway biedt een gemakkelijke basis om je snel op weg te helpen. Als je Toon in het profiel van leden Toelaten dat deze eigenschap wordt getoond op de profiel pagina van het lid. tab heeft geen sorteervolgorde + Waar wordt deze compositie gebruikt? + Deze samenstelling wordt momenteel gebruikt bij de samenstelling van de volgende inhoudstypen: + Variaties toestaan + Variëren per cultuur toestaan + Segmentatie toestaan + Varieer per cultuur + Varieer per segment + Editors toestaan om nieuwe inhoud aan te maken van dit type in verschillende talen. + Editors toestaan om nieuwe inhoud in verschillende talen te creëren + Editors toestaan om nieuwe segmenten van deze inhoud te creëren. + Variaties per cultuur toestaan + Segmentatie toestaan + Elementtype + Is een elementtype + Een elementtype is bedoeld om bijvoorbeeld in geneste inhoud gebruikt te worden en niet in de boomstructuur. + Een documenttype kan niet worden gewijzigd in een elementtype nadat het is gebruikt om een of meer contentitems te maken. + Dit is niet van toepassing op een elementtype + Je hebt wijzigingen aangebracht aan deze eigenschap. Ben je zeker dat je ze wil weggooien? + + + Taal toevoegen + Verplichte taal + Eigenschappen van deze taal moeten worden ingevuld voordat de node kan worden gepubliceerd. + Standaard taal + Een Umbraco site kan maar één standaardtaal hebben. + Als u de standaardtaal wijzigt, kan er standaardinhoud ontbreken. + Valt terug naar + Geen terugvaltaal + Om meertalige inhoud terug te laten vallen naar een andere taal als deze niet aanwezig is in de gevraagde taal, selecteert u deze hier. + Terugvaltaal + Geen + + + Parameter toevoegen + Parameter bewerken + Macro naam invoeren + Parameters + Definieer de parameters die beschikbaar moeten zijn bij het gebruik van deze macro. + Selecteer een partial view macro bestand Models aan het gereneren @@ -1009,25 +1580,36 @@ Echter, Runway biedt een gemakkelijke basis om je snel op weg te helpen. Als je Models generatie is mislukt, kijk in de Umbraco log voor details + Terugval veld toevoegen + Terugval veld + Standaardwaarde toevoegen + Standaardwaarde Alternatief veld Alternatieve tekst Kapitalisatie - Encoding + Codering Selecteer veld Converteer regelafbreking - ]]> + Ja, converteer regeleinden + ]]> Aangepaste velden Ja, alleen datum + Opmaak en codering Opmaken als datum + Format the value as a date, or a date with time, according to the active culture HTML-encoderen Speciale karakters worden geëncodeerd naar HTML. Zal worden ingevoegd na de veld waarde Zal worden ingevoegd voor de veld waarde Kleine letters + Uitvoer wijzigen Geen + Uitvoervoorbeeld Invoegen na veld Invoegen voor veld Recursief + Ja, recursief maken + Scheidingsteken Standaard velden Hoofdletters URL-encoderen @@ -1069,6 +1651,9 @@ Echter, Runway biedt een gemakkelijke basis om je snel op weg te helpen. Als je Vertaald XML-document uploaden + Inhoud + Inhoudssjablonen + Media Cachebrowser Prullenbak Gemaakte packages @@ -1085,17 +1670,24 @@ Echter, Runway biedt een gemakkelijke basis om je snel op weg te helpen. Als je Ledengroepen Rollen Ledentypes - Documenttypen + Documenttypes RelatieTypen Packages Packages - Installeer uit repository + Partial Views + Partial View Macro Bestanden + Installeer vanuit repository Installeer Runway Runway modules Script bestanden Scripts Stylesheets Sjablonen + Logboeken + Gebruikers + Instellingen + Sjabloon + Derde partij Nieuwe update beschikbaar @@ -1123,7 +1715,7 @@ Echter, Runway biedt een gemakkelijke basis om je snel op weg te helpen. Als je Omschrijving Geblokkeerde gebruiker Documenttype - Redacteur + Editor Samenvattingsveld Foute wachtwoord pogingen Ga naar gebruikersprofiel @@ -1147,6 +1739,7 @@ Echter, Runway biedt een gemakkelijke basis om je snel op weg te helpen. Als je Wachtwoord Reset wachtwoord Je wachtwoord is veranderd! + Wachtwoord aangepast Herhaal nieuwe wachtwoord Voer nieuwe wachtwoord in Je nieuwe wachtwoord mag niet leeg zijn! @@ -1167,10 +1760,10 @@ Echter, Runway biedt een gemakkelijke basis om je snel op weg te helpen. Als je Selecteer een gebruikersgroep Geen startnode geselecteerd Geen startnodes geselecteerd - Startnode in Content + Startnode in Inhoud Beperk de content toegang tot een specifieke startnode - Startnodes in Content - Beperk de content toegang tot specifieke startnodes + Startnodes in Inhoud + Beperk de Inhoud tot specifieke startnodes Laatste keer bijgewerkt is aangemaakt De gebruiker is aangemaakt. Om in te loggen in Umbraco gebruik je onderstaand wachtwoord. @@ -1181,6 +1774,7 @@ Echter, Runway biedt een gemakkelijke basis om je snel op weg te helpen. Als je is uitgenodigd Een uitnodiging is gestuurd naar de nieuwe gebruiker met informatie over hoe in te loggen in Umbraco Hallo en welkom in Umbraco! Binnen ongeveer één minuut kan je aan de slag. Je moet enkel je wachtwoord instellen en een foto toevoegen. + Welkom bij Umbraco! Helaas is je uitnodiging vervallen. Vraag aan je administrator om de uitnodiging opnieuw te versturen. Wijzig je foto zodat andere gebruikers je makkelijk kunnen herkennen. Auteur Wijzig @@ -1247,7 +1841,7 @@ Echter, Runway biedt een gemakkelijke basis om je snel op weg te helpen. Als je - + Klik hier om de uitnodiging te accepteren @@ -1287,14 +1881,45 @@ Echter, Runway biedt een gemakkelijke basis om je snel op weg te helpen. Als je Uitnodiging opnieuw aan het versturen... Verwijder gebruiker Weet je zeker dat je deze gebruiker wil verwijderen? + Alles + Actief + Uitgeschakeld + Vergrendeld + Uitgenodigd + Inactief + Naam (A-Z) + Naam (Z-A) + Nieuwste + Oudste + Laatste login + Er zijn geen gebruikersgroepen toegevoegd Validatie - Valideer als email + Valideer als e-mailadres Valideer als nummer Valideer als URL - ...of gebruik custom validatie + ...of gebruik aangepaste validatie Veld is verplicht + Voer een foutmelding in voor de aangepaste validatie (optioneel) + Voer een reguliere expressie in + Voer een foutmelding in voor de aangepaste validatie (optioneel) + Je hebt minstens + Je mag maximum + Geef maximum + items + URL(s) + URL(s) geselecteerd + items geselecteerd + Ongeldige datum + Geen nummer + Ongeldig e-mailadres + Waarde mag niet null zijn + Waarde mag niet leeg zijn + Ongeldige waarde, het komt niet overeen met het correcte patroon + Aangepaste validatie + %1% nodig.]]> + %1% te veel.]]> - Try Skip IIS Custom foutmeldingen is ingesteld op '%0%'. IIS versie '%1%' wordt gebruikt. - Try Skip IIS Custom foutmeldingen is ingesteld op '%0%'. Het wordt voor de gebruikte IIS versie (%2%) aangeraden deze in te stellen op '%1%'. - Try Skip IIS Custom foutmeldingen ingesteld op '%0%'. + trySkipIisCustomErrors is ingesteld op '%0%'. IIS versie '%1%' wordt gebruikt. + trySkipIisCustomErrors is ingesteld op '%0%'. Het wordt voor de gebruikte IIS versie (%2%) aangeraden deze in te stellen op '%1%'. + trySkipIisCustomErrors ingesteld op '%0%'. '%0%' kon niet gevonden worden in configuratie bestand '%1%'.]]> Er is een fout opgetreden. Bekijk de log file voor de volledige fout: %0%. + Database - Het database schema is correct voor deze versie van Umbraco + %0% problemen zijn gevonden met het databaseschema (Controleer het logboek voor details) + Enkele fouten zijn gevonden tijdens het valideren van het databaseschema tegen de huidige versie van Umbraco. Het cerficaat van de website is ongeldig. Cerficaat validatie foutmelding: '%0%' + Het SSL certificaat van de website is vervallen. + Het SSL certificaat van de website zal vervallen binnen %0% dagen. Fout bij pingen van URL %0% - '%1%' De site wordt momenteel %0% bekeken via HTTPS. De appSetting 'Umbraco.Core.UseHttps' in web.config staat op 'false'. Indien HTTPS gebruikt wordt moet deze op 'true' staan. @@ -1349,13 +1979,13 @@ Echter, Runway biedt een gemakkelijke basis om je snel op weg te helpen. Als je Trace mode staat uit. Trace mode staat momenteel aan. Wij raden aan deze instelling uit te zetten voor livegang. Trace mode uitgezet. - Alle mappen hebben de juiste permissie-instellingen! + Alle mappen hebben de juiste rechten. + --> %0%.]]> %0%. Als deze niet in gebruik zijn voor deze omgeving hoeft er geen actie te worden ondernomen.]]> - All files have the correct permissions set. + Alle bestanden hebben de juiste rechten. @@ -1363,47 +1993,393 @@ Echter, Runway biedt een gemakkelijke basis om je snel op weg te helpen. Als je - %0%.]]> - %0%. Als deze niet in gebruik zijn voor deze omgeving hoeft er geen actie te worden ondernomen.]]> + %0%.]]> + %0%. Als deze niet in gebruik zijn voor deze omgeving hoeft er geen actie te worden ondernomen.]]> X-Frame-Options header of meta-tag om IFRAMEing door andere websites te voorkomen is aanwezig!]]> X-Frame-Options header of meta-tag om IFRAMEing door andere websites te voorkomen is NIET aanwezig.]]> Voorkom IFRAMEing via web.config Voegt de instelling toe aan de httpProtocol/customHeaders section in web.config om IFRAMEing door andere websites te voorkomen. De instelling om IFRAMEing door andere websites te voorkomen is toegevoegd aan de web.config! Web.config kon niet aangepast worden door error: %0% - - %0%.]]> - Er zijn geen headers gevonden die informatie prijsgeven over de gebruikte website technologie! + %0%.]]> + Er zijn geen headers gevonden die informatie vrijgeven over de gebruikte website technologie! In de Web.config werd system.net/mailsettings niet gevonden In de Web.config sectie system.net/mailsettings is de host niet geconfigureerd. SMTP instellingen zijn correct ingesteld en werken zoals verwacht. De SMTP server geconfigureerd met host '%0%' en poort '%1%' kon niet gevonden worden. Controleer of de SMTP instellingen in Web.config file system.net/mailsettings correct zijn. - %0%.]]> - %0%.]]> + %0%.]]> + %0%.]]> +

    Resultaten van de geplande Umbraco Health Checks uitgevoerd op %0% op %1%:

    %2%]]>
    + Umbraco Health Check Status: %0% + Alle groepen controleren + Groep controleren + + De health checker evalueert verschillende delen van de website voor best practice instellingen, configuratie, mogelijke problemen, enzovoort. U kunt problemen eenvoudig oplossen met een druk op de knop. + U kunt uw eigen health checks toevoegen, kijk even naar de documentatie voor meer informatie over aangepaste health checks.

    + ]]> +
    - URL tracker uitzetten - URL tracker aanzetten + URL tracker uitschakelen + URL tracker inschakelen + Cultuur Originele URL Doorgestuurd naar + Redirect Url Beheer + De volgende URLs verwijzen naar dit content item: Er zijn geen redirects Er wordt automatisch een redirect aangemaakt als een gepubliceerde pagina hernoemd of verplaatst wordt. Weet je zeker dat je de redirect van '%0%' naar '%1%' wilt verwijderen? Redirect URL verwijderd. Fout bij verwijderen redirect URL. + Dit zal de redirect verwijderen Weet je zeker dat je de URL tracker wilt uitzetten? URL tracker staat nu uit. Fout bij het uitzetten van de URL Tracker. Meer informatie kan gevonden worden in de log file. URL tracker staat nu aan. Fout bij het aanzetten van de URL tracker. Meer informatie kan gevonden worden in de log file. + + Geen woordenboekitems om uit te kiezen + + + %0% karakters resterend.]]> + %1% te veel.]]> + Content verwijderd met id : {0} gerelateerd aan aan bovenliggend item met Id: {1} Media verwijderd met id: {0} gerelateerd aan aan bovenliggend item met Id: {1} Kan dit item niet automatisch herstellen - Er is geen 'herstel' relatie gevonden voor dit item. Gebruik de "Verplaats" optie om het manueel terug te zetten - Het item dat u wil herstellen onder ('%0%') zit in de prullenbak. Gebruik de "Verplaats" optie om het manueel terug te zetten + Er is geen locatie waar dit item automatisch kan worden hersteld. U kunt het item handmatig verplaatsen met behulp van de onderstaande boomstructuur. + was hersteld onder + + + Richting + Bovenliggend naar onderliggend + Bidirectioneel + Bovenliggend + Onderliggend + Aantal + Relaties + Gemaakt + Commentaar + Naam + Geen relaties voor dit relatietype. + Relatietype + Relaties + + + Aan de slag + Redirect URL Beheer + Inhoud + Welkom + Examine Beheer + Publicatiestatus + Models Builder + Gezondheidscontrole + Profilering + Aan de slag + Umbraco Forms installeren + + + Terug + Actieve layout: + Spring naar + groep + geslaagd + Waarschuwing + mislukt + suggestie + Controle geslaagd + Controle mislukt + Backoffice zoeken openen + Backoffice help openen/sluiten + Jouw profiel opties openen/sluiten + Cultuur en Hostnamen instellen voor %0% + Nieuwe node aanmaken onder %0% + Openbare toegang instellen op %0% + Rechten instellen op %0% + Sorteervolgorde wijzigen voor %0% + Maak een Inhoudssjabloon op basis van %0% + Open context menu voor + Huidige taal + Taal wijzigen naar + Map aanmaken + Partial View + Partial View Macro + Lid + Datatype + Zoeken in het redirect dashboard + Zoeken in de gebruikersgroep sectie + Zoeken in de gebruikers sectie + Item aanmaken + Aanmaken + Bewerken + Naam + Rij toevoegen + Bekijk meer opties + Vertaling aanwezig + Vertaling ontbreekt + Woordenboek items + + + Referenties + Dit Datatype heeft geen referenties. + Gebruikt in Documenttypes + Geen referenties naar Documenttypes. + Gebruikt in Mediatypes + Geen referenties naar Mediatypes. + Gebruikt in Ledentypes + Geen referenties naar Ledentypes. + Gebruikt door + Gebruikt in Documenten + Gebruikt in Leden + Gebruikt in Media + + + Opgeslagen zoekopdracht verwijderen + Log Niveaus + Opgeslagen Zoekopdrachten + Zoekopdracht opslaan + Enter a friendly name for your search query + Zoekopdracht filteren + Aantal items + Tijdstempel + Niveau + Machine + Bericht + Uitzondering + Eigenschappen + Zoeken Met Google + Dit bericht met Google opzoeken + Zoeken Met Bing + Dit bericht met Bing opzoeken + Zoeken in Our Umbraco + Search this message on Our Umbraco forums and docs + Our Umbraco met Google doorzoeken + Our Umbraco forums met Google doorzoeken + Umbraco broncode doorzoeken + Zoeken in Umbraco broncode op Github + Umbraco Issues doorzoeken + Umbraco Issues op Github doorzoeken + Zoekopdracht verwijderen + Logs met Request ID zoeken + Logs met Namespace zoeken + Logs met Machine Naam zoeken + Openen + Peilen + Elke 2 seconden + Elke 5 seconden + Elke 10 seconden + Elke 20 seconden + Elke 30 seconden + Elke 2s peilen + Elke 5s peilen + Elke 10s peilen + Elke 20s peilen + Elke 30s peilen + + + Kopieer %0% + %0% van %1% + Alle items verwijderen + Klembord leegmaken + + + Eigenschapsacties openen + Eigenschapsacties sluiten + + + Wachten + Status vernieuwen + Geheugencache + + + + Vernieuwen + Database Cache + + Opnieuw bouwen kan duur zijn. + Gebruik het wanneer herladen niet genoeg is en u denkt dat de databasecache niet correct + is gegenereerd—wat zou duiden op een kritiek Umbraco-probleem. + ]]> + + Opnieuw bouwen + Interne onderdelen + + niet te gebruiken. + ]]> + + Verzamelen + Gepubliceerde Cachestatus + Caches + + + Prestatieprofilering + + + Umbraco wordt uitgevoerd in de foutopsporingsmodus. Dit betekent dat u de ingebouwde prestatieprofiler kunt gebruiken om de prestaties te beoordelen bij het renderen van pagina's. +

    +

    + Als je de profiler voor een specifieke paginaweergave wilt activeren, voeg je umbDebug=true toe aan de querystring wanneer je de pagina opvraagt. +

    +

    + Als je wil dat de profiler standaard wordt geactiveerd voor alle paginaweergaven, kun je de onderstaande schakelaar gebruiken. + Het plaatst een cookie in je browser, die vervolgens de profiler automatisch activeert. + Met andere woorden, de profiler zal alleen voor jouw browser actief zijn, niet voor andere bezoekers. +

    + ]]> +
    + Activeer de profiler standaard + Vriendelijke herinnering + + + Je mag een productiesite nooit in de foutopsporingsmodus laten uitvoeren. Je kan de foutopsporingsmodus uitschakelen door de instelling debug="false" uit het <compilation /> element te verwijderen in het web.config bestand. +

    + ]]> +
    + + + Umbraco wordt op dit ogenblik niet uitgevoerd in de foutopsporingsmodus, dus je kan de ingebouwde profiler niet gebruiken. Dit is hoe het zou moeten zijn voor een productiewebsite. +

    +

    + De foutopsporingsmodus wordt ingeschakeld door debug="true" toe te voegen in het <compilation /> element in web.config. +

    + ]]> +
    + + + Je bent slechts een klik verwijderd van uren aan Umbraco trainingvideo's. + + Wil je Umbraco onder de knie krijgen? Besteed een paar minuten aan het leren van enkele best practices door een van deze video's over het gebruik van Umbraco te bekijken. Bezoek umbraco.tv voor meer Umbraco videos

    + ]]> +
    + Om je op weg te helpen + + + Start hier + Deze sectie bevat de bouwstenen voor jouw Umbraco-site. Volg de onderstaande links voor meer informatie over het werken met de items in de sectie Instellingen + Meer te weten komen + + in het Documentatiegedeelte van Our Umbraco + ]]> + + + Community Forum + ]]> + + + instructievideo's (sommige zijn gratis, andere vereisen een abonnement) + ]]> + + + productiviteitsverhogende programma's en commerciële ondersteuning + ]]> + + + training en certificering opportuniteiten + ]]> + + + + Welkom bij Het Vriendelijke CMS + Bedankt om voor Umbraco te kiezen - We denken dat dit het begin van iets moois is. Hoewel het in het begin misschien overweldigend aanvoelt, hebben we er veel aan gedaan om de leercurve zo soepel en snel mogelijk te laten verlopen. + + + Umbraco Forms + Maak formulieren met behulp van een intuïtieve interface. Van eenvoudige contactformulieren die e-mails versturen tot geavanceerde vragenlijsten die integreren met CRM-systemen. Je klanten zullen er dol op zijn! + + + Nieuwe blok aanmaken + Instellingensectie toevoegen + Weergave selecteren + Stylesheet selecteren + Miniatuur kiezen + Nieuwe aanmaken + Aangepaste stylesheet + Stylesheet toevoegen + Editor uiterlijk + Data modellen + Catalogus uiterlijk + Achtergrondkleur + Icoon kleur + Inhoud model + Label + Aangepaste weergave + Aangepaste weergave-omschrijving tonen + Overschrijf hoe dit blok wordt weergegeven in de BackOffice-gebruikersinterface. Kies een .html-bestand met je presentatie. + Instellingen model + Grootte van overlay-editor + Aangepaste weergave toevoegen + Instellingen toevoegen + Label sjabloon overschrijven + %0% wil verwijderen?]]> + %0% wil verwijderen?]]> + De inhoud van dit blok is nog steeds aanwezig, bewerken van deze inhoud is niet langer mogelijk en wordt weergegeven als niet-ondersteunde inhoud. + + Miniatuur + Miniatuur toevoegen + Lege aanmaken + Klembord + Instellingen + Geavanceerd + Inhoudseditor geforceerd verbergen + Je hebt aanpassingen gemaakt aan deze inhoud. Wil je deze wijzigingen verwerpen? + Wijzigingen opslaan? + + Fout! + Het Elementtype van dit blok bestaat niet meer + + + Wat zijn Inhoudssjablonen? + Inhoudssjablonen is vooraf gedefinieerde inhoud die kan worden geselecteerd bij het maken van een nieuwe node. + Hoe maak ik een Inhoudssjabloon? + + Er zijn 2 manieren om Inhoudssjablonen te maken:

    +
      +
    • Klik met de rechtermuisknop op een inhoudsnode en selecteer "Inhoudssjabloon aanmaken" om een nieuwe Inhoudssjabloon te maken.
    • +
    • Klik met de rechtermuisknop op Inhoudssjablonen in de boomstructuur in de sectie Instellingen en selecteer het documenttype waarvoor je een Inhoudssjabloon wilt maken.
    • +
    +

    Nadat de Inhoudssjabloon een naam heeft, kunnen redacteuren ze gaan gebruiken als basis voor hun nieuwe pagina.

    + ]]> +
    + Hoe beheer ik Inhoudssjablonen? + U kunt Inhoudssjablonen bewerken en verwijderen vanuit de boomstructuur "inhoudssjablonen" in de sectie Instellingen. Vouw het documenttype uit waarop de Inhoudssjabloon is gebaseerd en klik erop om het te bewerken of te verwijderen.
    diff --git a/src/Umbraco.Web.UI.NetCore/umbraco/config/lang/pl.xml b/src/Umbraco.Web.UI.NetCore/umbraco/config/lang/pl.xml index cd22851724..a40f7e666b 100644 --- a/src/Umbraco.Web.UI.NetCore/umbraco/config/lang/pl.xml +++ b/src/Umbraco.Web.UI.NetCore/umbraco/config/lang/pl.xml @@ -612,8 +612,8 @@ Naciśnij przycisk instaluj, aby zainstalować bazę danych Umb

    Aby kontynuować, dokonaj edycji pliku "web.config" (używając Visual Studio lub dowolnego edytora tekstu), przemieść kursor na koniec pliku, dodaj parametry połączenia do Twojej bazy danych w kluczu o nazwie "umbracoDbDSN" i zapisz plik.

    Kliknij ponów próbę kiedy - skończysz.
    - Tu znajdziesz więcej informacji na temat edycji pliku "web.config".

    ]]> + skończysz.
    + Tu znajdziesz więcej informacji na temat edycji pliku "web.config".

    ]]> Skontaktuj się z Twoim dostawą usług internetowych jeśli zajdzie taka potrzeba. W przypadku instalacji na lokalnej maszynie lub serwerze możesz potrzebować pomocy administratora.]]> @@ -660,7 +660,7 @@ Naciśnij przycisk instaluj, aby zainstalować bazę danych Umb Chcę zacząć od zera dowiedz się jak) + (dowiedz się jak) Ciągle możesz wybrać, aby zainstalować Runway w późniejszym terminie. W tym celu przejdź do sekcji Deweloper i wybierz Pakiety. ]]> Właśnie stworzyłeś czystą instalację platformy Umbraco. Co chcesz zrobić teraz? @@ -728,7 +728,7 @@ Naciśnij przycisk instaluj, aby zainstalować bazę danych Umb Zaloguj się poniżej Zaloguj się z Sesja wygasła - © 2001 - %0%
    umbraco.com

    ]]>
    + © 2001 - %0%
    umbraco.com

    ]]>
    Zapomniałeś hasła? E-mail z linkiem do zresetowania hasła zostanie wysłany na podany adres E-mail z instrukcjami do zresetowania hasła zostanie wysłany, jeśli zgadza się z naszą bazą danych diff --git a/src/Umbraco.Web.UI.NetCore/umbraco/config/lang/pt.xml b/src/Umbraco.Web.UI.NetCore/umbraco/config/lang/pt.xml index fbc70a6c47..0091cde73c 100644 --- a/src/Umbraco.Web.UI.NetCore/umbraco/config/lang/pt.xml +++ b/src/Umbraco.Web.UI.NetCore/umbraco/config/lang/pt.xml @@ -354,8 +354,8 @@ Próximo para prosseguir.]]> Banco de dados não encontrado! Favor checar se a informação no "connection string" do "web.config" esteja correta.

    Para prosseguir, favor editar o arquivo "web.config" (usando Visual Studio ou seu editor de texto favorito), role até embaixo, adicione a connection string para seu banco de dados com a chave de nome "UmbracoDbDSN" e salve o arquivo

    -

    Clique o botão tentar novamente quando terminar.
    - Mais informações em como editar o web.config aqui.

    ]]>
    +

    Clique o botão tentar novamente quando terminar.
    + Mais informações em como editar o web.config aqui.

    ]]> Favor contatar seu provedor de internet ou hospedagem web se necessário. Se você estiver instalando em uma máquina ou servidor local é possível que você precise dessas informações por um administrador de sistema.]]> Pressione o botão atualizar para atualizar seu banco de dados para Umbraco %0%

    @@ -394,7 +394,7 @@ Para correr Umbraco você vai precisar atualizar as configurações de permissõ Também guarda informações temporárias (cache) para melhorar a performance do seu website.]]>
    Eu quero começar do zero learn how) + (learn how) Você ainda pode escolher instalar Runway mais tarde. Favor ir à seção Desenvolvedor e selecione pacotes.]]> Você acabou de configurar uma plataforma Umbraco limpa. O que deseja fazer a seguir? Runway está instalado @@ -445,7 +445,7 @@ Pressione "próximo" para iniciar o assistente.]]> Renovar agora para salvar seu trabalho - © 2001 - %0%
    umbraco.com

    ]]>
    + © 2001 - %0%
    umbraco.com

    ]]>
    Painel diff --git a/src/Umbraco.Web.UI.NetCore/umbraco/config/lang/ru.xml b/src/Umbraco.Web.UI.NetCore/umbraco/config/lang/ru.xml index 651316e95c..df3c0361b9 100644 --- a/src/Umbraco.Web.UI.NetCore/umbraco/config/lang/ru.xml +++ b/src/Umbraco.Web.UI.NetCore/umbraco/config/lang/ru.xml @@ -786,8 +786,7 @@

    Для настройки откройте файл "web.config" с помощью любого текстового редактора и добавьте нужную информацию в строку подключения (параметр "UmbracoDbDSN"), затем сохраните файл.

    Нажмите кнопку "Повторить" когда все будет готово
    - Более подробно о внесении изменений в файл "web.config" рассказано здесь.

    ]]> + Более подробно о внесении изменений в файл "web.config" рассказано здесь.

    ]]> Пожалуйста, свяжитесь с Вашим хостинг-провайдером, если есть необходимость, а если устанавливаете на локальную рабочую станцию или сервер, то получите информацию у Вашего системного администратора.]]> @@ -834,7 +833,7 @@ Здесь можно узнать об этом подробнее) Вы также можете отложить установку "Runway" на более позднее время. Перейдите к разделу "Разработка" и выберите пункт "Пакеты". + (Здесь можно узнать об этом подробнее) Вы также можете отложить установку "Runway" на более позднее время. Перейдите к разделу "Разработка" и выберите пункт "Пакеты". ]]> Вы только что установили чистую платформу Umbraco. Какой шаг будет следующим? "Runway" установлен @@ -891,7 +890,7 @@ Обновите сейчас, чтобы сохранить сделанные изменения - © 2001 - %0%
    umbraco.com

    ]]>
    + © 2001 - %0%
    umbraco.com

    ]]>
    Сегодня же выходной! Понедельник — день тяжелый... Вот уже вторник... diff --git a/src/Umbraco.Web.UI.NetCore/umbraco/config/lang/sv.xml b/src/Umbraco.Web.UI.NetCore/umbraco/config/lang/sv.xml index 0e5353f477..f2cdc54657 100644 --- a/src/Umbraco.Web.UI.NetCore/umbraco/config/lang/sv.xml +++ b/src/Umbraco.Web.UI.NetCore/umbraco/config/lang/sv.xml @@ -504,7 +504,7 @@ Databaskonfiguration installera]]> Nästa för att fortsätta.]]> - Databasen kunde inte hittas! Kontrollera att informationen i databasanslutnings-inställningarna i filen "web.config" är rätt.

    För att fortsätta måste du redigera filen "web.config" (du kan använda Visual Studio eller din favorit text-redigerare), bläddra till slutet, lägg till databasanslutnings-inställningarna för din databas i fältet som heter "umbracoDbDSN" och spara filen.

    Klicka på Försök igen knappen när du är klar.
    > Mer information om att redigera web.config hittar du här.

    ]]>
    + Databasen kunde inte hittas! Kontrollera att informationen i databasanslutnings-inställningarna i filen "web.config" är rätt.

    För att fortsätta måste du redigera filen "web.config" (du kan använda Visual Studio eller din favorit text-redigerare), bläddra till slutet, lägg till databasanslutnings-inställningarna för din databas i fältet som heter "umbracoDbDSN" och spara filen.

    Klicka på Försök igen knappen när du är klar.
    Mer information om att redigera web.config hittar du här.

    ]]>
    Eventuellt kan du behöva kontakta ditt webb-hotell. Om du installerar på en lokal maskin eller server kan du få informationen från din systemadministratör.]]> Tryck Uppgradera knappen för att uppgradera din databas till Umbraco %0%

    Du behöver inte vara orolig. Inget innehåll kommer att raderas och efteråt kommer allt att fungera som vanligt!

    ]]>
    Tryck Nästa för att fortsätta.]]> @@ -532,7 +532,7 @@ Konfigurerar mapprättigheter Umbraco behöver skriv/ändra rättigheter till vissa mappar för att spara filer som bilder och PDFer. Umbraco sparar också temporär data (så kallad cache) för att öka prestandan på din webbplats. Jag vill börja från början - lär dig hur) Du kan fortfarande välja att installera Runway senare. Gå in i Utvecklarsektionen och välj Paket.]]> + lär dig hur) Du kan fortfarande välja att installera Runway senare. Gå in i Utvecklarsektionen och välj Paket.]]> Du har just installerat en ren Umbraco platform. Vad vill du göra härnäst? Runway är installerat Det här är vår lista över rekommenderade moduler, markera de moduler du vill installera, eller visa den fullständiga listan]]> @@ -567,7 +567,7 @@ Förnya nu för att spara ditt arbete - © 2001 - %0%
    umbraco.com

    ]]>
    + © 2001 - %0%
    umbraco.com

    ]]>
    Happy super Sunday Happy manic Monday Happy tremendous Tuesday @@ -589,6 +589,11 @@ eller klicka här för att välja filer Drag och släpp dina filer i denna yta + + Skapa en ny medlem + Alla medlemmar + Medlemsgrupper har inga extra egenskaper för redigering. + Välj sida ovan... %0% har kopierats till %1% diff --git a/src/Umbraco.Web.UI.NetCore/umbraco/config/lang/tr.xml b/src/Umbraco.Web.UI.NetCore/umbraco/config/lang/tr.xml index a627b9edf2..fa0f909bfb 100644 --- a/src/Umbraco.Web.UI.NetCore/umbraco/config/lang/tr.xml +++ b/src/Umbraco.Web.UI.NetCore/umbraco/config/lang/tr.xml @@ -858,7 +858,7 @@

    Devam etmek için lütfen "web.config" dosyasını düzenleyin (Visual Studio veya favori metin düzenleyicinizi kullanarak), en alta kaydırın, veritabanınız için "UmbracoDbDSN" adlı anahtara bağlantı dizesini ekleyin ve dosyayı kaydedin.

    Yeniden dene düğmesini tıklayın. - bitti.
    + bitti.
    Web.config'i düzenleme hakkında daha fazla bilgi burada.

    ]]> @@ -924,7 +924,7 @@ nasıl yapılacağını öğrenin ) + (nasıl yapılacağını öğrenin ) Yine de Runway'i daha sonra kurmayı seçebilirsiniz. Lütfen Geliştirici bölümüne gidin ve Paketleri seçin. ]]> @@ -1009,7 +1009,7 @@ Web sitenizi yönetmek için, Umbraco'nun arka ofisini açın ve içerik eklemey Aşağıda oturum açın ile oturum açın Oturum zaman aşımına uğradı - & copy; 2001 - %0%
    Umbraco.com

    ]]>
    + © 2015 - %0%
    Umbraco.com

    ]]>
    Şifrenizi mi unuttunuz? Parolanızı sıfırlamak için bir bağlantıyla belirtilen adrese bir e-posta gönderilecektir Kayıtlarımızla eşleşirse, şifre sıfırlama talimatlarını içeren bir e-posta, belirtilen adrese gönderilecektir @@ -1140,7 +1140,7 @@ Web sitenizi yönetmek için, Umbraco'nun arka ofisini açın ve içerik eklemey İyi günler! - Umbraco robotunun alkışları + Umbraco robotundan teşekkürler ]]>
    Aşağıdaki diller %0% değiştirildi @@ -1204,7 +1204,7 @@ Web sitenizi yönetmek için, Umbraco'nun arka ofisini açın ve içerik eklemey

    İyi günler dilerim!

    - Umbraco robottan Alkış + Umbraco robotundan teşekkürler

    @@ -1858,7 +1858,7 @@ Web sitenizi yönetmek için, Umbraco'nun arka ofisini açın ve içerik eklemey İyi günler! - Umbraco robotunun alkışları + Umbraco robotdan teşekkürler ]]> Çevirmen kullanıcısı bulunamadı. Lütfen çeviriye içerik göndermeye başlamadan önce bir çevirmen kullanıcısı oluşturun diff --git a/src/Umbraco.Web.UI.NetCore/umbraco/config/lang/zh.xml b/src/Umbraco.Web.UI.NetCore/umbraco/config/lang/zh.xml index 2a97b60f63..286ab88881 100644 --- a/src/Umbraco.Web.UI.NetCore/umbraco/config/lang/zh.xml +++ b/src/Umbraco.Web.UI.NetCore/umbraco/config/lang/zh.xml @@ -514,7 +514,7 @@ 数据库未找到!请检查数据库连接串设置。

    您可以自行编辑“web.config”文件,键名为 “UmbracoDbDSN”

    - 当自行编辑后,单击重试按钮
    。 + 当自行编辑后,单击重试按钮
    。 如何编辑web.config

    ]]>
    @@ -562,7 +562,7 @@ 我要从头开始 如何操作?) + (如何操作?) 您也可以安装晚一些安装“Runway”。 ]]> 您刚刚安装了一个干净的系统,要继续吗? @@ -630,7 +630,7 @@ 在下方登录 登录 会话超时 - © 2001 - %0%
    Umbraco.com

    ]]>
    + © 2001 - %0%
    Umbraco.com

    ]]>
    忘记密码? 电子邮件将发送到地址指定的链接, 以重置您的密码 如果电子邮件与我们的记录相符, 则将发送带有密码重置指令的邮件 diff --git a/src/Umbraco.Web.UI.NetCore/umbraco/config/lang/zh_tw.xml b/src/Umbraco.Web.UI.NetCore/umbraco/config/lang/zh_tw.xml index 8b619f6c26..0bdc79f052 100644 --- a/src/Umbraco.Web.UI.NetCore/umbraco/config/lang/zh_tw.xml +++ b/src/Umbraco.Web.UI.NetCore/umbraco/config/lang/zh_tw.xml @@ -507,7 +507,7 @@

    請編輯檔案"web.config" (例如使用Visual Studio或您喜歡的編輯器),移動到檔案底部,並在名稱為"UmbracoDbDSN"的字串中設定資料庫連結資訊,並存檔。

    點選重試按鈕當上述步驟完成。
    - + 在此查詢更多編輯web.config的資訊。

    ]]>
    若需要時,請聯繫您的網路公司。如果您在本地機器或伺服器安裝的話,您也許需要聯絡系統管理者。]]> @@ -553,7 +553,7 @@ 我要從頭開始 學習該怎麼做) + (學習該怎麼做) 您晚點仍可以選擇安裝Runway,請至開發者區域選擇安裝。 ]]> 您剛剛安裝了一個乾淨的系統,要繼續嗎? @@ -619,7 +619,7 @@ 下方登入 登入使用 連線時間過了 - © 2001 - %0%
    Umbraco.com

    ]]>
    + © 2001 - %0%
    Umbraco.com

    ]]>
    忘記密碼? 一封內有重設密碼連結的電子郵件已經寄出給您 一封內有重設密碼連結的電子郵件已經寄到此信箱 diff --git a/src/Umbraco.Web.UI/Umbraco.Web.UI.csproj b/src/Umbraco.Web.UI/Umbraco.Web.UI.csproj index b5bfd75aad..5b5e256a54 100644 --- a/src/Umbraco.Web.UI/Umbraco.Web.UI.csproj +++ b/src/Umbraco.Web.UI/Umbraco.Web.UI.csproj @@ -231,9 +231,9 @@ False True - 8100 + 8110 / - http://localhost:8100 + http://localhost:8110 False False @@ -261,6 +261,7 @@ + diff --git a/src/Umbraco.Web.UI/Umbraco/config/lang/cy.xml b/src/Umbraco.Web.UI/Umbraco/config/lang/cy.xml index d62680e548..eacfcde1bf 100644 --- a/src/Umbraco.Web.UI/Umbraco/config/lang/cy.xml +++ b/src/Umbraco.Web.UI/Umbraco/config/lang/cy.xml @@ -938,8 +938,8 @@

    Er mwyn parhau, newidiwch y ffeil "web.config" (gan ddefnyddio Visual Studio neu eich hoff olygydd testun), rholiwch at y gwaelod, ychwanegwch y llinyn gyswllt ar gyfer eich cronfa ddata yn yr allwedd o'r enw "UmbracoDbDSN" ac achub y ffeil.

    Cliciwch y botwm ceisio eto pan rydych wedi - gorffen.
    - Mwy o wybodaeth am newid y ffeil web.config yma.

    ]]> + gorffen.
    + Mwy o wybodaeth am newid y ffeil web.config yma.

    ]]> @@ -1004,7 +1004,7 @@ dysgwch sut) + (dysgwch sut) Gallwch ddewis i osod Runway yn hwyrach os hoffwch chi. Ewch at yr adran Datblygwr a dewiswch Pecynnau. ]]> @@ -1089,7 +1089,7 @@ Er mwyn gweinyddu eich gwefan, agorwch swyddfa gefn Umbraco a dechreuwch ychwang Mewngofnodwch isod Mewngofnodwch gyda Sesiwn wedi cyrraedd terfyn amser - © 2001 - %0%
    Umbraco.com

    ]]>
    + © 2001 - %0%
    Umbraco.com

    ]]>
    Wedi anghofio eich cyfrinair? Bydd ebost yn cael ei anfon i'r cyfeiriad darparwyd gyda dolen i ailosod eich cyfrinair Bydd ebost gyda chyfarwyddiadau ailosod cyfrinair yn cael ei anfon at y cyfeiriad darparwyd os yw'n cyfateb â'n cofnodion @@ -2438,7 +2438,7 @@ Er mwyn gweinyddu eich gwefan, agorwch swyddfa gefn Umbraco a dechreuwch ychwang Mae'r gwiriwr iechyd yn gwerthuso gwahanol rannau o'ch gwefan ar gyfer gosodiadau arfer gorau, cyfluniad, problemau posibl, ac ati. Gallwch chi drwsio problemau yn hawdd trwy wasgu botwm. - Gallwch chi ychwanegu eich gwiriadau iechyd eich hun, edrych ar y ddogfennaeth i gael mwy o wybodaeth am wiriadau iechyd arferu.

    + Gallwch chi ychwanegu eich gwiriadau iechyd eich hun, edrych ar y ddogfennaeth i gael mwy o wybodaeth am wiriadau iechyd arferu.

    ]]>
    Eich wefan gallu defnyddio y protocol gwarchodaeth TLS 1.2 wrth wneud cysylltiadau allanol i endpoints HTTPS @@ -2682,7 +2682,7 @@ Er mwyn gweinyddu eich gwefan, agorwch swyddfa gefn Umbraco a dechreuwch ychwang Oriau o fideos hyfforddiant Umbraco ddim ond un clic i fwrdd Eisiau meistroli Umbraco? Treuliwch gwpl o funudau yn dysgu rhai o'r arferion gorau gan wylio un o'r fideos hyn am sut i ddefnyddio Umbraco. Ac ymweld â umbraco.tv am fwy o fideos am Umbraco

    +

    Eisiau meistroli Umbraco? Treuliwch gwpl o funudau yn dysgu rhai o'r arferion gorau gan wylio un o'r fideos hyn am sut i ddefnyddio Umbraco. Ac ymweld â umbraco.tv am fwy o fideos am Umbraco

    ]]>
    I roi cychwyn i chi @@ -2693,27 +2693,27 @@ Er mwyn gweinyddu eich gwefan, agorwch swyddfa gefn Umbraco a dechreuwch ychwang Ddarganfod fwy fewn yr adran Dogfennaeth o Our Umbraco + Darllenwch fwy am weithio efo'r eitemau yn yr adran Gosodiadau fewn yr adran Dogfennaeth o Our Umbraco ]]> Fforwm Cymunedol + Gofynnwch gwestiwn yn y Fforwm Cymunedol ]]> fideos tiwtorial (mae rhai am ddim, ond bydd angen tanysgrifiad am rhai eraill) + Gwyliwch ein fideos tiwtorial (mae rhai am ddim, ond bydd angen tanysgrifiad am rhai eraill) ]]> hoffer hybu cynhyrchiant a chefnogaeth fasnachol + Darganfyddwch fwy am ein hoffer hybu cynhyrchiant a chefnogaeth fasnachol ]]> hyfforddi ac ardystio + Darganfyddwch fwy am gyfleoedd hyfforddi ac ardystio ]]> diff --git a/src/Umbraco.Web/Security/MembershipHelper.cs b/src/Umbraco.Web/Security/MembershipHelper.cs index 65251320ca..5cee61834e 100644 --- a/src/Umbraco.Web/Security/MembershipHelper.cs +++ b/src/Umbraco.Web/Security/MembershipHelper.cs @@ -122,7 +122,7 @@ namespace Umbraco.Web.Security { pathsWithAccess.TryGetValue(path, out var hasAccess); // if it's not found it's false anyways - result[path] = hasAccess; + result[path] = !pathsWithProtection.Contains(path) || hasAccess; } return result; } diff --git a/src/Umbraco.Web/Umbraco.Web.csproj b/src/Umbraco.Web/Umbraco.Web.csproj index 80e8024786..24d0a95eff 100644 --- a/src/Umbraco.Web/Umbraco.Web.csproj +++ b/src/Umbraco.Web/Umbraco.Web.csproj @@ -94,6 +94,9 @@ + + + 3.5.3 runtime; build; native; contentfiles; analyzers @@ -264,5 +267,8 @@ Mvc\web.config + + + \ No newline at end of file