diff --git a/build/NuSpecs/UmbracoCms.Core.nuspec b/build/NuSpecs/UmbracoCms.Core.nuspec index c4aaf7344e..e62185d4b2 100644 --- a/build/NuSpecs/UmbracoCms.Core.nuspec +++ b/build/NuSpecs/UmbracoCms.Core.nuspec @@ -34,7 +34,7 @@ - + diff --git a/build/UmbracoVersion.txt b/build/UmbracoVersion.txt index e591b5dfcb..c12ac783cc 100644 --- a/build/UmbracoVersion.txt +++ b/build/UmbracoVersion.txt @@ -1,2 +1,2 @@ # Usage: on line 2 put the release version, on line 3 put the version comment (example: beta) -7.6.3 \ No newline at end of file +7.6.4 \ No newline at end of file diff --git a/src/SolutionInfo.cs b/src/SolutionInfo.cs index d7e4c9a204..fe3be21eb7 100644 --- a/src/SolutionInfo.cs +++ b/src/SolutionInfo.cs @@ -11,5 +11,5 @@ using System.Resources; [assembly: AssemblyVersion("1.0.*")] -[assembly: AssemblyFileVersion("7.6.3")] -[assembly: AssemblyInformationalVersion("7.6.3")] \ No newline at end of file +[assembly: AssemblyFileVersion("7.6.4")] +[assembly: AssemblyInformationalVersion("7.6.4")] \ No newline at end of file diff --git a/src/Umbraco.Core/ActionsResolver.cs b/src/Umbraco.Core/ActionsResolver.cs index 2da95a3416..206182c6f2 100644 --- a/src/Umbraco.Core/ActionsResolver.cs +++ b/src/Umbraco.Core/ActionsResolver.cs @@ -23,12 +23,12 @@ namespace Umbraco.Core : base(serviceProvider, logger, packageActions) { - } - - /// - /// Gets the implementations. - /// - public IEnumerable Actions + } + + /// + /// Gets the implementations. + /// + public IEnumerable Actions { get { diff --git a/src/Umbraco.Core/ApplicationContext.cs b/src/Umbraco.Core/ApplicationContext.cs index 384ff6e34c..79180550f0 100644 --- a/src/Umbraco.Core/ApplicationContext.cs +++ b/src/Umbraco.Core/ApplicationContext.cs @@ -48,7 +48,7 @@ namespace Umbraco.Core /// [Obsolete("Use the other constructor specifying a ProfilingLogger instead")] public ApplicationContext(DatabaseContext dbContext, ServiceContext serviceContext, CacheHelper cache) - : this(dbContext, serviceContext, cache, + : this(dbContext, serviceContext, cache, new ProfilingLogger(LoggerResolver.Current.Logger, ProfilerResolver.Current.Profiler)) { } @@ -89,7 +89,7 @@ namespace Umbraco.Core /// If set to true and the singleton is already set, it will be replaced /// /// - /// This is NOT thread safe + /// This is NOT thread safe /// public static ApplicationContext EnsureContext(ApplicationContext appContext, bool replaceContext) { @@ -107,14 +107,14 @@ namespace Umbraco.Core /// /// /// - /// If set to true will replace the current singleton instance - This should only be used for unit tests or on app + /// If set to true will replace the current singleton instance - This should only be used for unit tests or on app /// startup if for some reason the boot manager is not the umbraco boot manager. /// /// /// /// /// - /// This is NOT thread safe + /// This is NOT thread safe /// [Obsolete("Use the other method specifying an ProfilingLogger instead")] public static ApplicationContext EnsureContext(DatabaseContext dbContext, ServiceContext serviceContext, CacheHelper cache, bool replaceContext) @@ -135,14 +135,14 @@ namespace Umbraco.Core /// /// /// - /// If set to true will replace the current singleton instance - This should only be used for unit tests or on app + /// If set to true will replace the current singleton instance - This should only be used for unit tests or on app /// startup if for some reason the boot manager is not the umbraco boot manager. /// /// /// /// /// - /// This is NOT thread safe + /// This is NOT thread safe /// public static ApplicationContext EnsureContext(DatabaseContext dbContext, ServiceContext serviceContext, CacheHelper cache, ProfilingLogger logger, bool replaceContext) { @@ -175,7 +175,7 @@ namespace Umbraco.Core public CacheHelper ApplicationCache { get; private set; } /// - /// Exposes the global ProfilingLogger - this should generally not be accessed via the UmbracoContext and should normally just be exposed + /// Exposes the global ProfilingLogger - this should generally not be accessed via the UmbracoContext and should normally just be exposed /// on most base classes or injected with IoC /// public ProfilingLogger ProfilingLogger { get; private set; } @@ -213,7 +213,7 @@ namespace Umbraco.Core // GlobalSettings.CurrentVersion returns the hard-coded "current version" // the system is configured if they match // if they don't, install runs, updates web.config (presumably) and updates GlobalSettings.ConfiguredStatus - + public bool IsConfigured { get { return _configured.Value; } @@ -226,8 +226,8 @@ namespace Umbraco.Core { get { - if (IsConfigured == false - && DatabaseContext != null + if (IsConfigured == false + && DatabaseContext != null && DatabaseContext.IsDatabaseConfigured) { var schemaresult = DatabaseContext.ValidateDatabaseSchema(); @@ -274,12 +274,12 @@ namespace Umbraco.Core private Lazy _configured; internal MainDom MainDom { get; private set; } - + private void Init() { MainDom = new MainDom(ProfilingLogger.Logger); MainDom.Acquire(); - + //Create the lazy value to resolve whether or not the application is 'configured' _configured = new Lazy(() => { @@ -289,7 +289,7 @@ namespace Umbraco.Core var currentVersion = UmbracoVersion.GetSemanticVersion(); var ok = - //we are not configured if this is null + //we are not configured if this is null string.IsNullOrWhiteSpace(configStatus) == false //they must match && configStatus == currentVersion; @@ -303,7 +303,7 @@ namespace Umbraco.Core var found = Services.MigrationEntryService.FindEntry(Constants.System.UmbracoMigrationName, UmbracoVersion.GetSemanticVersion()); if (found == null) { - //we haven't executed this migration in this environment, so even though the config versions match, + //we haven't executed this migration in this environment, so even though the config versions match, // this db has not been updated. ProfilingLogger.Logger.Debug(string.Format("The migration for version: '{0} has not been executed, there is no record in the database", currentVersion.ToSemanticString())); ok = false; @@ -323,7 +323,7 @@ namespace Umbraco.Core return false; } - }); + }); } private string ConfigurationStatus @@ -338,7 +338,7 @@ namespace Umbraco.Core { return String.Empty; } - } + } } private void AssertIsNotReady() @@ -363,7 +363,7 @@ namespace Umbraco.Core } internal set { _databaseContext = value; } } - + /// /// Gets the current ServiceContext /// @@ -417,7 +417,7 @@ namespace Umbraco.Core ResolverCollection.ResetAll(); //reset resolution itself (though this should be taken care of by resetting any of the resolvers above) Resolution.Reset(); - + //reset the instance objects this.ApplicationCache = null; if (_databaseContext != null) //need to check the internal field here @@ -430,14 +430,14 @@ namespace Umbraco.Core /* if (DatabaseContext.IsDatabaseConfigured && DatabaseContext.Database != null) { - DatabaseContext.Database.Dispose(); - } - */ + DatabaseContext.Database.Dispose(); + } + */ } this.DatabaseContext = null; this.Services = null; this._isReady = false; //set the internal field - + // Indicate that the instance has been disposed. _disposed = true; } diff --git a/src/Umbraco.Core/Cache/CacheKeys.cs b/src/Umbraco.Core/Cache/CacheKeys.cs index 3b9ee9c63a..81fe4dc2f2 100644 --- a/src/Umbraco.Core/Cache/CacheKeys.cs +++ b/src/Umbraco.Core/Cache/CacheKeys.cs @@ -89,7 +89,7 @@ namespace Umbraco.Core.Cache public const string DataTypeCacheKey = "UmbracoDataTypeDefinition"; public const string DataTypePreValuesCacheKey = "UmbracoPreVal"; - public const string IdToKeyCacheKey = "UI2K"; - public const string KeyToIdCacheKey = "UK2I"; + public const string IdToKeyCacheKey = "UI2K__"; + public const string KeyToIdCacheKey = "UK2I__"; } } \ No newline at end of file diff --git a/src/Umbraco.Core/Configuration/UmbracoSettings/IRequestHandlerSection.cs b/src/Umbraco.Core/Configuration/UmbracoSettings/IRequestHandlerSection.cs index 2d78e68bf5..a8b8d17ad9 100644 --- a/src/Umbraco.Core/Configuration/UmbracoSettings/IRequestHandlerSection.cs +++ b/src/Umbraco.Core/Configuration/UmbracoSettings/IRequestHandlerSection.cs @@ -12,6 +12,8 @@ namespace Umbraco.Core.Configuration.UmbracoSettings bool ConvertUrlsToAscii { get; } + bool TryConvertUrlsToAscii { get; } + IEnumerable CharCollection { get; } } } \ No newline at end of file diff --git a/src/Umbraco.Core/Configuration/UmbracoSettings/RequestHandlerElement.cs b/src/Umbraco.Core/Configuration/UmbracoSettings/RequestHandlerElement.cs index 779d33c8b8..c040c83708 100644 --- a/src/Umbraco.Core/Configuration/UmbracoSettings/RequestHandlerElement.cs +++ b/src/Umbraco.Core/Configuration/UmbracoSettings/RequestHandlerElement.cs @@ -111,7 +111,12 @@ namespace Umbraco.Core.Configuration.UmbracoSettings bool IRequestHandlerSection.ConvertUrlsToAscii { - get { return UrlReplacing.ConvertUrlsToAscii; } + get { return UrlReplacing.ConvertUrlsToAscii.InvariantEquals("true"); } + } + + bool IRequestHandlerSection.TryConvertUrlsToAscii + { + get { return UrlReplacing.ConvertUrlsToAscii.InvariantEquals("try"); } } IEnumerable IRequestHandlerSection.CharCollection diff --git a/src/Umbraco.Core/Configuration/UmbracoSettings/UrlReplacingElement.cs b/src/Umbraco.Core/Configuration/UmbracoSettings/UrlReplacingElement.cs index a378a27dcd..887528fb4a 100644 --- a/src/Umbraco.Core/Configuration/UmbracoSettings/UrlReplacingElement.cs +++ b/src/Umbraco.Core/Configuration/UmbracoSettings/UrlReplacingElement.cs @@ -11,10 +11,10 @@ namespace Umbraco.Core.Configuration.UmbracoSettings get { return (bool) base["removeDoubleDashes"]; } } - [ConfigurationProperty("toAscii", DefaultValue = false)] - internal bool ConvertUrlsToAscii + [ConfigurationProperty("toAscii", DefaultValue = "false")] + internal string ConvertUrlsToAscii { - get { return (bool)base["toAscii"]; } + get { return (string) base["toAscii"]; } } [ConfigurationCollection(typeof(CharCollection), AddItemName = "char")] diff --git a/src/Umbraco.Core/Configuration/UmbracoVersion.cs b/src/Umbraco.Core/Configuration/UmbracoVersion.cs index 28952540b2..85b9bf3685 100644 --- a/src/Umbraco.Core/Configuration/UmbracoVersion.cs +++ b/src/Umbraco.Core/Configuration/UmbracoVersion.cs @@ -6,7 +6,7 @@ namespace Umbraco.Core.Configuration { public class UmbracoVersion { - private static readonly Version Version = new Version("7.6.3"); + private static readonly Version Version = new Version("7.6.4"); /// /// Gets the current version of Umbraco. @@ -33,9 +33,9 @@ namespace Umbraco.Core.Configuration public static SemVersion GetSemanticVersion() { return new SemVersion( - Current.Major, + Current.Major, Current.Minor, - Current.Build, + Current.Build, CurrentComment.IsNullOrWhiteSpace() ? null : CurrentComment, Current.Revision > 0 ? Current.Revision.ToInvariantString() : null); } diff --git a/src/Umbraco.Core/Constants-ObjectTypes.cs b/src/Umbraco.Core/Constants-ObjectTypes.cs index adc154174a..4a79437c61 100644 --- a/src/Umbraco.Core/Constants-ObjectTypes.cs +++ b/src/Umbraco.Core/Constants-ObjectTypes.cs @@ -212,6 +212,16 @@ namespace Umbraco.Core /// Guid for a Forms DataSource. /// public static readonly Guid FormsDataSourceGuid = new Guid(FormsDataSource); + + /// + /// Guid for a Language. + /// + public const string Language = "6B05D05B-EC78-49BE-A4E4-79E274F07A77"; + + /// + /// Guid for a Forms DataSource. + /// + public static readonly Guid LanguageGuid = new Guid(Language); } } } \ No newline at end of file diff --git a/src/Umbraco.Core/Events/ImportPackageEventArgs.cs b/src/Umbraco.Core/Events/ImportPackageEventArgs.cs index 4477faea50..ae7b14dbd5 100644 --- a/src/Umbraco.Core/Events/ImportPackageEventArgs.cs +++ b/src/Umbraco.Core/Events/ImportPackageEventArgs.cs @@ -4,7 +4,7 @@ using Umbraco.Core.Packaging.Models; namespace Umbraco.Core.Events { - internal class ImportPackageEventArgs : CancellableEnumerableObjectEventArgs, IEquatable> + public class ImportPackageEventArgs : CancellableEnumerableObjectEventArgs, IEquatable> { private readonly MetaData _packageMetaData; @@ -32,7 +32,7 @@ namespace Umbraco.Core.Events public bool Equals(ImportPackageEventArgs other) { if (ReferenceEquals(null, other)) return false; - if (ReferenceEquals(this, other)) return true; + if (ReferenceEquals(this, other)) return true; //TODO: MetaData for package metadata has no equality operators :/ return base.Equals(other) && _packageMetaData.Equals(other._packageMetaData); } diff --git a/src/Umbraco.Core/Events/UninstallPackageEventArgs.cs b/src/Umbraco.Core/Events/UninstallPackageEventArgs.cs index 324867a8f7..301d98c595 100644 --- a/src/Umbraco.Core/Events/UninstallPackageEventArgs.cs +++ b/src/Umbraco.Core/Events/UninstallPackageEventArgs.cs @@ -3,7 +3,7 @@ using Umbraco.Core.Packaging.Models; namespace Umbraco.Core.Events { - internal class UninstallPackageEventArgs : CancellableObjectEventArgs> + public class UninstallPackageEventArgs : CancellableObjectEventArgs> { private readonly MetaData _packageMetaData; diff --git a/src/Umbraco.Core/IO/FileSystemProviderManager.cs b/src/Umbraco.Core/IO/FileSystemProviderManager.cs index df922fb2b0..d2ae8a0612 100644 --- a/src/Umbraco.Core/IO/FileSystemProviderManager.cs +++ b/src/Umbraco.Core/IO/FileSystemProviderManager.cs @@ -19,6 +19,8 @@ namespace Umbraco.Core.IO private ShadowWrapper _macroPartialFileSystem; private ShadowWrapper _partialViewsFileSystem; + private ShadowWrapper _macroScriptsFileSystem; + private ShadowWrapper _userControlsFileSystem; private ShadowWrapper _stylesheetsFileSystem; private ShadowWrapper _scriptsFileSystem; private ShadowWrapper _xsltFileSystem; @@ -61,6 +63,8 @@ namespace Umbraco.Core.IO { var macroPartialFileSystem = new PhysicalFileSystem(SystemDirectories.MacroPartials); var partialViewsFileSystem = new PhysicalFileSystem(SystemDirectories.PartialViews); + var macroScriptsFileSystem = new PhysicalFileSystem(SystemDirectories.MacroScripts); + var userControlsFileSystem = new PhysicalFileSystem(SystemDirectories.UserControls); var stylesheetsFileSystem = new PhysicalFileSystem(SystemDirectories.Css); var scriptsFileSystem = new PhysicalFileSystem(SystemDirectories.Scripts); var xsltFileSystem = new PhysicalFileSystem(SystemDirectories.Xslt); @@ -69,6 +73,8 @@ namespace Umbraco.Core.IO _macroPartialFileSystem = new ShadowWrapper(macroPartialFileSystem, "Views/MacroPartials", ScopeProvider); _partialViewsFileSystem = new ShadowWrapper(partialViewsFileSystem, "Views/Partials", ScopeProvider); + _macroScriptsFileSystem = new ShadowWrapper(macroScriptsFileSystem, "macroScripts", ScopeProvider); + _userControlsFileSystem = new ShadowWrapper(userControlsFileSystem, "usercontrols", ScopeProvider); _stylesheetsFileSystem = new ShadowWrapper(stylesheetsFileSystem, "css", ScopeProvider); _scriptsFileSystem = new ShadowWrapper(scriptsFileSystem, "scripts", ScopeProvider); _xsltFileSystem = new ShadowWrapper(xsltFileSystem, "xslt", ScopeProvider); @@ -85,6 +91,10 @@ namespace Umbraco.Core.IO public IFileSystem2 MacroPartialsFileSystem { get { return _macroPartialFileSystem; } } public IFileSystem2 PartialViewsFileSystem { get { return _partialViewsFileSystem; } } + // Legacy /macroScripts folder + public IFileSystem2 MacroScriptsFileSystem { get { return _macroScriptsFileSystem; } } + // Legacy /usercontrols folder + public IFileSystem2 UserControlsFileSystem { get { return _userControlsFileSystem; } } public IFileSystem2 StylesheetsFileSystem { get { return _stylesheetsFileSystem; } } public IFileSystem2 ScriptsFileSystem { get { return _scriptsFileSystem; } } public IFileSystem2 XsltFileSystem { get { return _xsltFileSystem; } } @@ -252,13 +262,15 @@ namespace Umbraco.Core.IO internal ICompletable Shadow(Guid id) { var typed = _wrappers.ToArray(); - var wrappers = new ShadowWrapper[typed.Length + 7]; + var wrappers = new ShadowWrapper[typed.Length + 9]; var i = 0; while (i < typed.Length) wrappers[i] = typed[i++]; wrappers[i++] = _macroPartialFileSystem; + wrappers[i++] = _macroScriptsFileSystem; wrappers[i++] = _partialViewsFileSystem; wrappers[i++] = _stylesheetsFileSystem; wrappers[i++] = _scriptsFileSystem; + wrappers[i++] = _userControlsFileSystem; wrappers[i++] = _xsltFileSystem; wrappers[i++] = _masterPagesFileSystem; wrappers[i] = _mvcViewsFileSystem; diff --git a/src/Umbraco.Core/IO/IOHelper.cs b/src/Umbraco.Core/IO/IOHelper.cs index 2ee0463435..d017505b4c 100644 --- a/src/Umbraco.Core/IO/IOHelper.cs +++ b/src/Umbraco.Core/IO/IOHelper.cs @@ -97,6 +97,8 @@ namespace Umbraco.Core.IO public static string MapPath(string path, bool useHttpContext) { + if (path == null) throw new ArgumentNullException("path"); + // Check if the path is already mapped if ((path.Length >= 2 && path[1] == Path.VolumeSeparatorChar) || path.StartsWith(@"\\")) //UNC Paths start with "\\". If the site is running off a network drive mapped paths will look like "\\Whatever\Boo\Bar" diff --git a/src/Umbraco.Core/Models/IUserControl.cs b/src/Umbraco.Core/Models/IUserControl.cs new file mode 100644 index 0000000000..2660567258 --- /dev/null +++ b/src/Umbraco.Core/Models/IUserControl.cs @@ -0,0 +1,7 @@ +namespace Umbraco.Core.Models +{ + public interface IUserControl : IFile + { + + } +} \ No newline at end of file diff --git a/src/Umbraco.Core/Models/Member.cs b/src/Umbraco.Core/Models/Member.cs index 02d6b9aece..1ed11af93e 100644 --- a/src/Umbraco.Core/Models/Member.cs +++ b/src/Umbraco.Core/Models/Member.cs @@ -109,6 +109,30 @@ namespace Umbraco.Core.Models IsApproved = true; } + /// + /// Constructor for creating a Member object + /// + /// + /// + /// + /// + /// The password value passed in to this parameter should be the encoded/encrypted/hashed format of the member's password + /// + /// + /// + public Member(string name, string email, string username, string rawPasswordValue, IMemberType contentType, bool isApproved) + : base(name, -1, contentType, new PropertyCollection()) + { + Mandate.ParameterNotNull(contentType, "contentType"); + + _contentTypeAlias = contentType.Alias; + _contentType = contentType; + _email = email; + _username = username; + _rawPasswordValue = rawPasswordValue; + IsApproved = isApproved; + } + private static readonly Lazy Ps = new Lazy(); private class PropertySelectors diff --git a/src/Umbraco.Core/Models/PartialViewType.cs b/src/Umbraco.Core/Models/PartialViewType.cs index 6204b6e165..6740d1fdd9 100644 --- a/src/Umbraco.Core/Models/PartialViewType.cs +++ b/src/Umbraco.Core/Models/PartialViewType.cs @@ -4,6 +4,7 @@ { Unknown = 0, // default PartialView = 1, - PartialViewMacro = 2 + PartialViewMacro = 2, + MacroScript = 3 } } diff --git a/src/Umbraco.Core/Models/UmbracoObjectTypes.cs b/src/Umbraco.Core/Models/UmbracoObjectTypes.cs index 0df7a21e57..d0136a10a4 100644 --- a/src/Umbraco.Core/Models/UmbracoObjectTypes.cs +++ b/src/Umbraco.Core/Models/UmbracoObjectTypes.cs @@ -178,6 +178,13 @@ namespace Umbraco.Core.Models /// [UmbracoObjectType(Constants.ObjectTypes.FormsDataSource)] [FriendlyName("DataSource")] - FormsDataSource + FormsDataSource, + + /// + /// Language + /// + [UmbracoObjectType(Constants.ObjectTypes.Language)] + [FriendlyName("Language")] + Language } } \ No newline at end of file diff --git a/src/Umbraco.Core/Models/UserControl.cs b/src/Umbraco.Core/Models/UserControl.cs new file mode 100644 index 0000000000..6af4cd74cc --- /dev/null +++ b/src/Umbraco.Core/Models/UserControl.cs @@ -0,0 +1,32 @@ +using System; +using System.Runtime.Serialization; + +namespace Umbraco.Core.Models +{ + /// + /// Represents a UserControl file + /// + [Serializable] + [DataContract(IsReference = true)] + public class UserControl : File, IUserControl + { + public UserControl(string path) + : this(path, (Func)null) + { } + + internal UserControl(string path, Func getFileContent) + : base(path, getFileContent) + { } + + /// + /// Indicates whether the current entity has an identity, which in this case is a path/name. + /// + /// + /// Overrides the default Entity identity check. + /// + public override bool HasIdentity + { + get { return string.IsNullOrEmpty(Path) == false; } + } + } +} \ No newline at end of file diff --git a/src/Umbraco.Core/Packaging/Models/InstallationSummary.cs b/src/Umbraco.Core/Packaging/Models/InstallationSummary.cs index a3c394946a..4e95df455c 100644 --- a/src/Umbraco.Core/Packaging/Models/InstallationSummary.cs +++ b/src/Umbraco.Core/Packaging/Models/InstallationSummary.cs @@ -7,7 +7,7 @@ namespace Umbraco.Core.Packaging.Models { [Serializable] [DataContract(IsReference = true)] - internal class InstallationSummary + public class InstallationSummary { public MetaData MetaData { get; set; } public IEnumerable DataTypesInstalled { get; set; } diff --git a/src/Umbraco.Core/Packaging/Models/MetaData.cs b/src/Umbraco.Core/Packaging/Models/MetaData.cs index 28f1af230e..f57fa9e329 100644 --- a/src/Umbraco.Core/Packaging/Models/MetaData.cs +++ b/src/Umbraco.Core/Packaging/Models/MetaData.cs @@ -5,7 +5,7 @@ namespace Umbraco.Core.Packaging.Models { [Serializable] [DataContract(IsReference = true)] - internal class MetaData + public class MetaData { public string Name { get; set; } public string Version { get; set; } diff --git a/src/Umbraco.Core/Packaging/Models/PackageAction.cs b/src/Umbraco.Core/Packaging/Models/PackageAction.cs index 0e20786a72..58f7de8078 100644 --- a/src/Umbraco.Core/Packaging/Models/PackageAction.cs +++ b/src/Umbraco.Core/Packaging/Models/PackageAction.cs @@ -4,7 +4,7 @@ using System.Xml.Linq; namespace Umbraco.Core.Packaging.Models { - internal enum ActionRunAt + public enum ActionRunAt { Undefined = 0, Install, @@ -13,7 +13,7 @@ namespace Umbraco.Core.Packaging.Models [Serializable] [DataContract(IsReference = true)] - internal class PackageAction + public class PackageAction { private ActionRunAt _runAt; private bool? _undo; diff --git a/src/Umbraco.Core/Packaging/Models/UninstallationSummary.cs b/src/Umbraco.Core/Packaging/Models/UninstallationSummary.cs index 13bb4bfc77..95f7c7d791 100644 --- a/src/Umbraco.Core/Packaging/Models/UninstallationSummary.cs +++ b/src/Umbraco.Core/Packaging/Models/UninstallationSummary.cs @@ -7,7 +7,7 @@ namespace Umbraco.Core.Packaging.Models { [Serializable] [DataContract(IsReference = true)] - internal class UninstallationSummary + public class UninstallationSummary { public MetaData MetaData { get; set; } public IEnumerable DataTypesUninstalled { get; set; } diff --git a/src/Umbraco.Core/Persistence/Repositories/ContentRepository.cs b/src/Umbraco.Core/Persistence/Repositories/ContentRepository.cs index a34a77d3b4..f3d199e175 100644 --- a/src/Umbraco.Core/Persistence/Repositories/ContentRepository.cs +++ b/src/Umbraco.Core/Persistence/Repositories/ContentRepository.cs @@ -81,7 +81,7 @@ namespace Umbraco.Core.Persistence.Repositories s.Where(x => x.Newest, SqlSyntax); return s; }; - + var sqlBaseFull = GetBaseQuery(BaseQueryType.FullMultiple); var sqlBaseIds = GetBaseQuery(BaseQueryType.Ids); @@ -107,7 +107,7 @@ namespace Umbraco.Core.Persistence.Repositories return ProcessQuery(translate(translatorFull), new PagingSqlQuery(translate(translatorIds))); } - #endregion + #endregion #region Overrides of PetaPocoRepositoryBase @@ -142,8 +142,8 @@ namespace Umbraco.Core.Persistence.Repositories { //The only reason we apply this left outer join is to be able to pull back the DocumentPublishedReadOnlyDto //information with the entire data set, so basically this will get both the latest document and also it's published - //version if it has one. When performing a count or when retrieving Ids like in paging, this is unecessary - //and causes huge performance overhead for the SQL server, especially when sorting the result. + //version if it has one. When performing a count or when retrieving Ids like in paging, this is unecessary + //and causes huge performance overhead for the SQL server, especially when sorting the result. //We also don't include this outer join when querying for multiple entities since it is much faster to fetch this information //in a separate query. For a single entity this is ok. @@ -234,7 +234,7 @@ namespace Umbraco.Core.Persistence.Repositories }; var baseId = 0; - + while (true) { // get the next group of nodes @@ -284,7 +284,7 @@ namespace Umbraco.Core.Persistence.Repositories } xmlIdsQuery.Where(dto => dto.NodeObjectType == docObjectType, SqlSyntax); - + var allXmlIds = Database.Fetch(xmlIdsQuery); var toRemove = allXmlIds.Except(allContentIds).ToArray(); @@ -293,9 +293,9 @@ namespace Umbraco.Core.Persistence.Repositories foreach (var idGroup in toRemove.InGroupsOf(2000)) { Database.Execute("DELETE FROM cmsContentXml WHERE nodeId IN (@ids)", new { ids = idGroup }); - } + } } - + } public override IEnumerable GetAllVersions(int id) @@ -308,7 +308,7 @@ namespace Umbraco.Core.Persistence.Repositories var sqlFull = translate(GetBaseQuery(BaseQueryType.FullMultiple)); var sqlIds = translate(GetBaseQuery(BaseQueryType.Ids)); - + return ProcessQuery(sqlFull, new PagingSqlQuery(sqlIds), true, includeAllVersions:true); } @@ -388,7 +388,7 @@ namespace Umbraco.Core.Persistence.Repositories protected override void PersistDeletedItem(IContent entity) { - //We need to clear out all access rules but we need to do this in a manual way since + //We need to clear out all access rules but we need to do this in a manual way since // nothing in that table is joined to a content id var subQuery = new Sql() .Select("umbracoAccessRule.accessId") @@ -449,7 +449,7 @@ namespace Umbraco.Core.Persistence.Repositories entity.Level = level; //Assign the same permissions to it as the parent node - // http://issues.umbraco.org/issue/U4-2161 + // http://issues.umbraco.org/issue/U4-2161 var permissionsRepo = new PermissionRepository(UnitOfWork, _cacheHelper, SqlSyntax); var parentPermissions = permissionsRepo.GetPermissionsForEntity(entity.ParentId).ToArray(); //if there are parent permissions then assign them, otherwise leave null and permissions will become the @@ -516,7 +516,7 @@ namespace Umbraco.Core.Persistence.Repositories VersionDate = dto.UpdateDate, Newest = true, NodeId = dto.NodeId, - Published = true + Published = true }; ((Content) entity).PublishedVersionGuid = dto.VersionId; ((Content) entity).PublishedDate = dto.UpdateDate; @@ -636,9 +636,12 @@ namespace Umbraco.Core.Persistence.Repositories { //In order to update the ContentVersion we need to retrieve its primary key id var contentVerDto = Database.SingleOrDefault("WHERE VersionId = @Version", new { Version = entity.Version }); - contentVersionDto.Id = contentVerDto.Id; - - Database.Update(contentVersionDto); + if (contentVerDto != null) + { + contentVersionDto.Id = contentVerDto.Id; + Database.Update(contentVersionDto); + } + Database.Update(dto); } @@ -742,7 +745,7 @@ namespace Umbraco.Core.Persistence.Repositories return ProcessQuery(translate(translatorFull), new PagingSqlQuery(translate(translatorIds)), true); } - + /// /// This builds the Xml document used for the XML cache /// @@ -841,7 +844,7 @@ order by umbracoNode.{2}, umbracoNode.parentID, umbracoNode.sortOrder", /// /// /// - /// + /// public void AssignEntityPermission(IContent entity, char permission, IEnumerable userIds) { var repo = new PermissionRepository(UnitOfWork, _cacheHelper, SqlSyntax); @@ -899,9 +902,9 @@ order by umbracoNode.{2}, umbracoNode.parentID, umbracoNode.sortOrder", string orderBy, Direction orderDirection, bool orderBySystemField, IQuery filter = null) { - //NOTE: This uses the GetBaseQuery method but that does not take into account the required 'newest' field which is + //NOTE: This uses the GetBaseQuery method but that does not take into account the required 'newest' field which is // what we always require for a paged result, so we'll ensure it's included in the filter - + var filterSql = new Sql().Append("AND (cmsDocument.newest = 1)"); if (filter != null) { @@ -910,7 +913,7 @@ order by umbracoNode.{2}, umbracoNode.parentID, umbracoNode.sortOrder", filterSql.Append(string.Format("AND ({0})", filterClaus.Item1), filterClaus.Item2); } } - + Func> filterCallback = () => new Tuple(filterSql.SQL, filterSql.Arguments); return GetPagedResultsByQuery(query, pageIndex, pageSize, out totalRecords, @@ -957,7 +960,7 @@ order by umbracoNode.{2}, umbracoNode.parentID, umbracoNode.sortOrder", /// /// /// - /// Generally when querying for content we only want to return the most recent version of the content item, however in some cases like when + /// Generally when querying for content we only want to return the most recent version of the content item, however in some cases like when /// we want to return all versions of a content item, we can't simply return the latest /// /// @@ -966,7 +969,7 @@ order by umbracoNode.{2}, umbracoNode.parentID, umbracoNode.sortOrder", // fetch returns a list so it's ok to iterate it in this method var dtos = Database.Fetch(sqlFull); if (dtos.Count == 0) return Enumerable.Empty(); - + //Go and get all of the published version data separately for this data, this is because when we are querying //for multiple content items we don't include the outer join to fetch this data in the same query because //it is insanely slow. Instead we just fetch the published version data separately in one query. @@ -978,7 +981,7 @@ order by umbracoNode.{2}, umbracoNode.parentID, umbracoNode.sortOrder", if (parsedOriginalSql.InvariantContains("ORDER BY ")) { parsedOriginalSql = parsedOriginalSql.Substring(0, parsedOriginalSql.LastIndexOf("ORDER BY ", StringComparison.Ordinal)); - } + } //order by update date DESC, if there is corrupted published flags we only want the latest! var publishedSql = new Sql(@"SELECT cmsDocument.nodeId, cmsDocument.published, cmsDocument.versionId, cmsDocument.updateDate, cmsDocument.newest @@ -1004,12 +1007,12 @@ ORDER BY cmsContentVersion.id DESC var content = new List>(); var defs = new DocumentDefinitionCollection(includeAllVersions); var templateIds = new List(); - + //track the looked up content types, even though the content types are cached // they still need to be deep cloned out of the cache and we don't want to add // the overhead of deep cloning them on every item in this loop var contentTypes = new Dictionary(); - + foreach (var dto in dtos) { DocumentPublishedReadOnlyDto publishedDto; @@ -1145,7 +1148,7 @@ ORDER BY cmsContentVersion.id DESC return currentName; } - + /// /// Dispose disposable properties /// diff --git a/src/Umbraco.Core/Persistence/Repositories/Interfaces/IUserControlRepository.cs b/src/Umbraco.Core/Persistence/Repositories/Interfaces/IUserControlRepository.cs new file mode 100644 index 0000000000..7efb29b0a5 --- /dev/null +++ b/src/Umbraco.Core/Persistence/Repositories/Interfaces/IUserControlRepository.cs @@ -0,0 +1,13 @@ +using System.IO; +using Umbraco.Core.Models; + +namespace Umbraco.Core.Persistence.Repositories +{ + public interface IUserControlRepository : IRepository + { + bool ValidateUserControl(UserControl userControl); + Stream GetFileContentStream(string filepath); + void SetFileContent(string filepath, Stream content); + long GetFileSize(string filepath); + } +} \ No newline at end of file diff --git a/src/Umbraco.Core/Persistence/Repositories/MacroScriptRepository.cs b/src/Umbraco.Core/Persistence/Repositories/MacroScriptRepository.cs new file mode 100644 index 0000000000..0f335173ad --- /dev/null +++ b/src/Umbraco.Core/Persistence/Repositories/MacroScriptRepository.cs @@ -0,0 +1,15 @@ +using Umbraco.Core.IO; +using Umbraco.Core.Models; +using Umbraco.Core.Persistence.UnitOfWork; + +namespace Umbraco.Core.Persistence.Repositories +{ + internal class MacroScriptRepository : PartialViewRepository + { + public MacroScriptRepository(IUnitOfWork work, IFileSystem fileSystem) + : base(work, fileSystem) + { } + + protected override PartialViewType ViewType { get { return PartialViewType.MacroScript; } } + } +} \ No newline at end of file diff --git a/src/Umbraco.Core/Persistence/Repositories/RecycleBinRepository.cs b/src/Umbraco.Core/Persistence/Repositories/RecycleBinRepository.cs index cb5f7c8810..1d3c5d6670 100644 --- a/src/Umbraco.Core/Persistence/Repositories/RecycleBinRepository.cs +++ b/src/Umbraco.Core/Persistence/Repositories/RecycleBinRepository.cs @@ -42,6 +42,7 @@ namespace Umbraco.Core.Persistence.Repositories //Construct and execute delete statements for all trashed items by 'nodeObjectType' var deletes = new List { + FormatDeleteStatement("cmsTask", "nodeId"), FormatDeleteStatement("umbracoUser2NodeNotify", "nodeId"), FormatDeleteStatement("umbracoUser2NodePermission", "nodeId"), @"DELETE FROM umbracoAccessRule WHERE umbracoAccessRule.accessId IN ( diff --git a/src/Umbraco.Core/Persistence/Repositories/UserControlRepository.cs b/src/Umbraco.Core/Persistence/Repositories/UserControlRepository.cs new file mode 100644 index 0000000000..77ad09cb57 --- /dev/null +++ b/src/Umbraco.Core/Persistence/Repositories/UserControlRepository.cs @@ -0,0 +1,135 @@ +using System.Collections.Generic; +using System.IO; +using System.Linq; +using Umbraco.Core.IO; +using Umbraco.Core.Models; +using Umbraco.Core.Persistence.UnitOfWork; + +namespace Umbraco.Core.Persistence.Repositories +{ + /// + /// Represents the UserControl Repository + /// + internal class UserControlRepository : FileRepository, IUserControlRepository + { + public UserControlRepository(IUnitOfWork work, IFileSystem fileSystem) + : base(work, fileSystem) + { + } + + public override UserControl Get(string id) + { + var path = FileSystem.GetRelativePath(id); + + path = path.EnsureEndsWith(".ascx"); + + if (FileSystem.FileExists(path) == false) + return null; + + var created = FileSystem.GetCreated(path).UtcDateTime; + var updated = FileSystem.GetLastModified(path).UtcDateTime; + + var userControl = new UserControl(path, file => GetFileContent(file.OriginalPath)) + { + Key = path.EncodeAsGuid(), + CreateDate = created, + UpdateDate = updated, + Id = path.GetHashCode(), + VirtualPath = FileSystem.GetUrl(path) + }; + + //on initial construction we don't want to have dirty properties tracked + // http://issues.umbraco.org/issue/U4-1946 + userControl.ResetDirtyProperties(false); + + return userControl; + } + + public override void AddOrUpdate(UserControl entity) + { + base.AddOrUpdate(entity); + + // ensure that from now on, content is lazy-loaded + if (entity.GetFileContent == null) + entity.GetFileContent = file => GetFileContent(file.OriginalPath); + } + + public override IEnumerable GetAll(params string[] ids) + { + ids = ids + .Select(x => StringExtensions.EnsureEndsWith(x, ".ascx")) + .Distinct() + .ToArray(); + + if (ids.Any()) + { + foreach (var id in ids) + { + yield return Get(id); + } + } + else + { + var files = FindAllFiles("", "*.ascx"); + foreach (var file in files) + { + yield return Get(file); + } + } + } + + /// + /// Gets a list of all that exist at the relative path specified. + /// + /// + /// If null or not specified, will return the UserControl files at the root path relative to the IFileSystem + /// + /// + public IEnumerable GetUserControlsAtPath(string rootPath = null) + { + return FileSystem.GetFiles(rootPath ?? string.Empty, "*.ascx").Select(Get); + } + + private static readonly List ValidExtensions = new List { "ascx" }; + + public bool ValidateUserControl(UserControl userControl) + { + // get full path + string fullPath; + try + { + // may throw for security reasons + fullPath = FileSystem.GetFullPath(userControl.Path); + } + catch + { + return false; + } + + // validate path and extension + var validDir = SystemDirectories.UserControls; + var isValidPath = IOHelper.VerifyEditPath(fullPath, validDir); + var isValidExtension = IOHelper.VerifyFileExtension(userControl.Path, ValidExtensions); + return isValidPath && isValidExtension; + } + + public Stream GetFileContentStream(string filepath) + { + if (FileSystem.FileExists(filepath) == false) return null; + + try + { + return FileSystem.OpenFile(filepath); + } + catch + { + return null; // deal with race conds + } + } + + public void SetFileContent(string filepath, Stream content) + { + FileSystem.AddFile(filepath, content, true); + } + } +} \ No newline at end of file diff --git a/src/Umbraco.Core/Persistence/RepositoryFactory.cs b/src/Umbraco.Core/Persistence/RepositoryFactory.cs index afb93f620f..631c292eac 100644 --- a/src/Umbraco.Core/Persistence/RepositoryFactory.cs +++ b/src/Umbraco.Core/Persistence/RepositoryFactory.cs @@ -231,6 +231,18 @@ namespace Umbraco.Core.Persistence return new PartialViewMacroRepository(uow, FileSystemProviderManager.Current.MacroPartialsFileSystem); } + [Obsolete("MacroScripts are obsolete - this is for backwards compatibility with upgraded sites.")] + internal virtual IPartialViewRepository CreateMacroScriptRepository(IUnitOfWork uow) + { + return new MacroScriptRepository(uow, FileSystemProviderManager.Current.MacroScriptsFileSystem); + } + + [Obsolete("UserControls are obsolete - this is for backwards compatibility with upgraded sites.")] + internal virtual IUserControlRepository CreateUserControlRepository(IUnitOfWork uow) + { + return new UserControlRepository(uow, FileSystemProviderManager.Current.UserControlsFileSystem); + } + public virtual IStylesheetRepository CreateStylesheetRepository(IUnitOfWork uow) { return new StylesheetRepository(uow, FileSystemProviderManager.Current.StylesheetsFileSystem); diff --git a/src/Umbraco.Core/Properties/AssemblyInfo.cs b/src/Umbraco.Core/Properties/AssemblyInfo.cs index 7d94f51fbe..35ff0beb22 100644 --- a/src/Umbraco.Core/Properties/AssemblyInfo.cs +++ b/src/Umbraco.Core/Properties/AssemblyInfo.cs @@ -39,7 +39,6 @@ using System.Security.Permissions; [assembly: InternalsVisibleTo("UmbracoExamine")] [assembly: InternalsVisibleTo("Concorde.Sync")] -[assembly: InternalsVisibleTo("Umbraco.VisualStudio")] [assembly: InternalsVisibleTo("Umbraco.Courier.Core")] [assembly: InternalsVisibleTo("Umbraco.Courier.Persistence")] @@ -52,4 +51,8 @@ using System.Security.Permissions; [assembly: InternalsVisibleTo("Umbraco.Forms.Web")] //allow this to be mocked in our unit tests -[assembly: InternalsVisibleTo("DynamicProxyGenAssembly2")] \ No newline at end of file +[assembly: InternalsVisibleTo("DynamicProxyGenAssembly2")] + +//allow custom unit-testing code to access internals through custom adapters +[assembly: InternalsVisibleTo("Umbraco.VisualStudio")] // backwards compat. +[assembly: InternalsVisibleTo("Umbraco.UnitTesting.Adapter")] // new, more imperative name diff --git a/src/Umbraco.Core/PropertyEditors/ValueConverters/DecimalValueConverter.cs b/src/Umbraco.Core/PropertyEditors/ValueConverters/DecimalValueConverter.cs index 89af76ea12..10b3b7188e 100644 --- a/src/Umbraco.Core/PropertyEditors/ValueConverters/DecimalValueConverter.cs +++ b/src/Umbraco.Core/PropertyEditors/ValueConverters/DecimalValueConverter.cs @@ -22,7 +22,7 @@ namespace Umbraco.Core.PropertyEditors.ValueConverters if (sourceString != null) { decimal d; - return (decimal.TryParse(sourceString, NumberStyles.AllowDecimalPoint, CultureInfo.InvariantCulture, out d)) ? d : 0M; + return (decimal.TryParse(sourceString, NumberStyles.AllowDecimalPoint | NumberStyles.AllowLeadingSign, CultureInfo.InvariantCulture, out d)) ? d : 0M; } // in the database an a decimal is an a decimal diff --git a/src/Umbraco.Core/Security/BackOfficeUserStore.cs b/src/Umbraco.Core/Security/BackOfficeUserStore.cs index 889c7004d7..7d5774c870 100644 --- a/src/Umbraco.Core/Security/BackOfficeUserStore.cs +++ b/src/Umbraco.Core/Security/BackOfficeUserStore.cs @@ -494,7 +494,7 @@ namespace Umbraco.Core.Security //the stamp cannot be null, so if it is currently null then we'll just return a hash of the password return Task.FromResult(user.SecurityStamp.IsNullOrWhiteSpace() - ? user.PasswordHash.ToMd5() + ? user.PasswordHash.GenerateHash() : user.SecurityStamp); } diff --git a/src/Umbraco.Core/Services/ContentService.cs b/src/Umbraco.Core/Services/ContentService.cs index c00b226d3e..3cf8dfcff4 100644 --- a/src/Umbraco.Core/Services/ContentService.cs +++ b/src/Umbraco.Core/Services/ContentService.cs @@ -32,6 +32,7 @@ namespace Umbraco.Core.Services private readonly EntityXmlSerializer _entitySerializer = new EntityXmlSerializer(); private readonly IDataTypeService _dataTypeService; private readonly IUserService _userService; + private readonly IdkMap _idkMap; //Support recursive locks because some of the methods that require locking call other methods that require locking. //for example, the Move method needs to be locked but this calls the Save method which also needs to be locked. @@ -43,7 +44,8 @@ namespace Umbraco.Core.Services ILogger logger, IEventMessagesFactory eventMessagesFactory, IDataTypeService dataTypeService, - IUserService userService) + IUserService userService, + IdkMap idkMap) : base(provider, repositoryFactory, logger, eventMessagesFactory) { if (dataTypeService == null) throw new ArgumentNullException("dataTypeService"); @@ -51,6 +53,7 @@ namespace Umbraco.Core.Services _publishingStrategy = new PublishingStrategy(UowProvider.ScopeProvider, eventMessagesFactory, logger); _dataTypeService = dataTypeService; _userService = userService; + _idkMap = idkMap; } #region Static Queries @@ -382,13 +385,13 @@ namespace Umbraco.Core.Services /// public IContent GetById(Guid key) { - using (var uow = UowProvider.GetUnitOfWork(readOnly: true)) - { - var repository = RepositoryFactory.CreateContentRepository(uow); - var query = Query.Builder.Where(x => x.Key == key); - var contents = repository.GetByQuery(query); - return contents.SingleOrDefault(); - } + // the repository implements a cache policy on int identifiers, not guids, + // and we are not changing it now, but we still would like to rely on caching + // instead of running a full query against the database, so relying on the + // id-key map, which is fast. + + var a = _idkMap.GetIdForKey(key, UmbracoObjectTypes.Document); + return a.Success ? GetById(a.Result) : null; } /// diff --git a/src/Umbraco.Core/Services/EntityService.cs b/src/Umbraco.Core/Services/EntityService.cs index ca014c5d8e..04d6c276b2 100644 --- a/src/Umbraco.Core/Services/EntityService.cs +++ b/src/Umbraco.Core/Services/EntityService.cs @@ -16,50 +16,26 @@ namespace Umbraco.Core.Services { public class EntityService : ScopeRepositoryService, IEntityService { - private readonly IRuntimeCacheProvider _runtimeCache; private readonly Dictionary>> _supportedObjectTypes; - + private readonly IdkMap _idkMap; public EntityService(IDatabaseUnitOfWorkProvider provider, RepositoryFactory repositoryFactory, ILogger logger, IEventMessagesFactory eventMessagesFactory, IContentService contentService, IContentTypeService contentTypeService, IMediaService mediaService, IDataTypeService dataTypeService, - IMemberService memberService, IMemberTypeService memberTypeService, IRuntimeCacheProvider runtimeCache) + IMemberService memberService, IMemberTypeService memberTypeService, IdkMap idkMap) : base(provider, repositoryFactory, logger, eventMessagesFactory) { - _runtimeCache = runtimeCache; - IContentTypeService contentTypeService1 = contentTypeService; + _idkMap = idkMap; _supportedObjectTypes = new Dictionary>> { {typeof (IDataTypeDefinition).FullName, new Tuple>(UmbracoObjectTypes.DataType, dataTypeService.GetDataTypeDefinitionById)}, {typeof (IContent).FullName, new Tuple>(UmbracoObjectTypes.Document, contentService.GetById)}, - {typeof (IContentType).FullName, new Tuple>(UmbracoObjectTypes.DocumentType, contentTypeService1.GetContentType)}, + {typeof (IContentType).FullName, new Tuple>(UmbracoObjectTypes.DocumentType, contentTypeService.GetContentType)}, {typeof (IMedia).FullName, new Tuple>(UmbracoObjectTypes.Media, mediaService.GetById)}, - {typeof (IMediaType).FullName, new Tuple>(UmbracoObjectTypes.MediaType, contentTypeService1.GetMediaType)}, + {typeof (IMediaType).FullName, new Tuple>(UmbracoObjectTypes.MediaType, contentTypeService.GetMediaType)}, {typeof (IMember).FullName, new Tuple>(UmbracoObjectTypes.Member, memberService.GetById)}, {typeof (IMemberType).FullName, new Tuple>(UmbracoObjectTypes.MemberType, memberTypeService.Get)}, - //{typeof (IUmbracoEntity).FullName, new Tuple>(UmbracoObjectTypes.EntityContainer, id => - //{ - // using (var uow = UowProvider.GetUnitOfWork()) - // { - // var found = uow.Database.FirstOrDefault("SELECT * FROM umbracoNode WHERE id=@id", new { id = id }); - // return found == null ? null : new UmbracoEntity(found.Trashed) - // { - // Id = found.NodeId, - // Name = found.Text, - // Key = found.UniqueId, - // SortOrder = found.SortOrder, - // Path = found.Path, - // NodeObjectTypeId = found.NodeObjectType.Value, - // CreateDate = found.CreateDate, - // CreatorId = found.UserId.Value, - // Level = found.Level, - // ParentId = found.ParentId - // }; - // } - - //})} }; - } #region Static Queries @@ -68,6 +44,8 @@ namespace Umbraco.Core.Services #endregion + internal IdkMap IdkMap { get { return _idkMap; } } + /// /// Returns the integer id for a given GUID /// @@ -76,33 +54,12 @@ namespace Umbraco.Core.Services /// public Attempt GetIdForKey(Guid key, UmbracoObjectTypes umbracoObjectType) { - var result = _runtimeCache.GetCacheItem(CacheKeys.IdToKeyCacheKey + key, () => - { - using (var uow = UowProvider.GetUnitOfWork(readOnly:true)) - { - var nodeObjectType = GetNodeObjectTypeGuid(umbracoObjectType); - - var sql = new Sql() - .Select("id") - .From() - .Where( - dto => - dto.UniqueId == key && - dto.NodeObjectType == nodeObjectType); - return uow.Database.ExecuteScalar(sql); - } - }); - return result.HasValue ? Attempt.Succeed(result.Value) : Attempt.Fail(); + return _idkMap.GetIdForKey(key, umbracoObjectType); } public Attempt GetIdForUdi(Udi udi) { - var guidUdi = udi as GuidUdi; - if (guidUdi == null) - return Attempt.Fail(); - - var umbracoType = Constants.UdiEntityType.ToUmbracoObjectType(guidUdi.EntityType); - return GetIdForKey(guidUdi.Guid, umbracoType); + return _idkMap.GetIdForUdi(udi); } /// @@ -113,32 +70,7 @@ namespace Umbraco.Core.Services /// public Attempt GetKeyForId(int id, UmbracoObjectTypes umbracoObjectType) { - var result = _runtimeCache.GetCacheItem(CacheKeys.KeyToIdCacheKey + id, () => - { - using (var uow = UowProvider.GetUnitOfWork(readOnly:true)) - { - var nodeObjectType = GetNodeObjectTypeGuid(umbracoObjectType); - - var sql = new Sql() - .Select("uniqueID") - .From() - .Where( - dto => - dto.NodeId == id && - dto.NodeObjectType == nodeObjectType); - return uow.Database.ExecuteScalar(sql); - } - }); - return result.HasValue ? Attempt.Succeed(result.Value) : Attempt.Fail(); - } - - private static Guid GetNodeObjectTypeGuid(UmbracoObjectTypes umbracoObjectType) - { - var guid = umbracoObjectType.GetGuid(); - if (guid == Guid.Empty) - throw new NotSupportedException("Unsupported object type (" + umbracoObjectType + ")."); - - return guid; + return _idkMap.GetKeyForId(id, umbracoObjectType); } public IUmbracoEntity GetByKey(Guid key, bool loadBaseType = true) @@ -404,7 +336,7 @@ namespace Umbraco.Core.Services /// /// /// - /// + /// /// public IEnumerable GetPagedDescendants(int id, UmbracoObjectTypes umbracoObjectType, long pageIndex, int pageSize, out long totalRecords, string orderBy = "path", Direction orderDirection = Direction.Ascending, string filter = "") @@ -417,7 +349,7 @@ namespace Umbraco.Core.Services var query = Query.Builder; //if the id is System Root, then just get all if (id != Constants.System.Root) - query.Where(x => x.Path.SqlContains(string.Format(",{0},", id), TextColumnType.NVarchar)); + query.Where(x => x.Path.SqlContains(string.Format(",{0},", id), TextColumnType.NVarchar)); IQuery filterQuery = null; if (filter.IsNullOrWhiteSpace() == false) diff --git a/src/Umbraco.Core/Services/FileService.cs b/src/Umbraco.Core/Services/FileService.cs index 28fb07fe9e..4833401df8 100644 --- a/src/Umbraco.Core/Services/FileService.cs +++ b/src/Umbraco.Core/Services/FileService.cs @@ -621,6 +621,34 @@ namespace Umbraco.Core.Services } } + public Stream GetMacroScriptFileContentStream(string filepath) + { + using (var uow = UowProvider.GetUnitOfWork(readOnly: true)) + { + var repository = RepositoryFactory.CreateMacroScriptRepository(uow); + return repository.GetFileContentStream(filepath); + } + } + + public void SetMacroScriptFileContent(string filepath, Stream content) + { + using (var uow = UowProvider.GetUnitOfWork()) + { + var repository = RepositoryFactory.CreateMacroScriptRepository(uow); + repository.SetFileContent(filepath, content); + uow.Commit(); + } + } + + public long GetMacroScriptFileSize(string filepath) + { + using (var uow = UowProvider.GetUnitOfWork(readOnly: true)) + { + var repository = RepositoryFactory.CreateMacroScriptRepository(uow); + return repository.GetFileSize(filepath); + } + } + #endregion public Stream GetStylesheetFileContentStream(string filepath) @@ -679,6 +707,34 @@ namespace Umbraco.Core.Services } } + public Stream GetUserControlFileContentStream(string filepath) + { + using (var uow = UowProvider.GetUnitOfWork(readOnly: true)) + { + var repository = RepositoryFactory.CreateUserControlRepository(uow); + return repository.GetFileContentStream(filepath); + } + } + + public void SetUserControlFileContent(string filepath, Stream content) + { + using (var uow = UowProvider.GetUnitOfWork()) + { + var repository = RepositoryFactory.CreateUserControlRepository(uow); + repository.SetFileContent(filepath, content); + uow.Commit(); + } + } + + public long GetUserControlFileSize(string filepath) + { + using (var uow = UowProvider.GetUnitOfWork(readOnly: true)) + { + var repository = RepositoryFactory.CreateUserControlRepository(uow); + return repository.GetFileSize(filepath); + } + } + public Stream GetXsltFileContentStream(string filepath) { using (var uow = UowProvider.GetUnitOfWork(readOnly: true)) @@ -783,6 +839,26 @@ namespace Umbraco.Core.Services } } + [Obsolete("MacroScripts are obsolete - this is for backwards compatibility with upgraded sites.")] + public IPartialView GetMacroScript(string path) + { + using (var uow = UowProvider.GetUnitOfWork(readOnly: true)) + { + var repository = RepositoryFactory.CreateMacroScriptRepository(uow); + return repository.Get(path); + } + } + + [Obsolete("UserControls are obsolete - this is for backwards compatibility with upgraded sites.")] + public IUserControl GetUserControl(string path) + { + using (var uow = UowProvider.GetUnitOfWork(readOnly: true)) + { + var repository = RepositoryFactory.CreateUserControlRepository(uow); + return repository.Get(path); + } + } + public IEnumerable GetPartialViewMacros(params string[] names) { using (var uow = UowProvider.GetUnitOfWork(readOnly: true)) diff --git a/src/Umbraco.Core/Services/IFileService.cs b/src/Umbraco.Core/Services/IFileService.cs index e8f1065219..74de0861d8 100644 --- a/src/Umbraco.Core/Services/IFileService.cs +++ b/src/Umbraco.Core/Services/IFileService.cs @@ -17,6 +17,10 @@ namespace Umbraco.Core.Services void DeletePartialViewMacroFolder(string folderPath); IPartialView GetPartialView(string path); IPartialView GetPartialViewMacro(string path); + [Obsolete("MacroScripts are obsolete - this is for backwards compatibility with upgraded sites.")] + IPartialView GetMacroScript(string path); + [Obsolete("UserControls are obsolete - this is for backwards compatibility with upgraded sites.")] + IUserControl GetUserControl(string path); IEnumerable GetPartialViewMacros(params string[] names); IXsltFile GetXsltFile(string path); IEnumerable GetXsltFiles(params string[] names); @@ -263,6 +267,27 @@ namespace Umbraco.Core.Services /// The size of the template. long GetTemplateFileSize(string filepath); + /// + /// Gets the content of a macroscript as a stream. + /// + /// The filesystem path to the macroscript. + /// The content of the macroscript. + Stream GetMacroScriptFileContentStream(string filepath); + + /// + /// Sets the content of a macroscript. + /// + /// The filesystem path to the macroscript. + /// The content of the macroscript. + void SetMacroScriptFileContent(string filepath, Stream content); + + /// + /// Gets the size of a macroscript. + /// + /// The filesystem path to the macroscript. + /// The size of the macroscript. + long GetMacroScriptFileSize(string filepath); + /// /// Gets the content of a stylesheet as a stream. /// @@ -305,6 +330,27 @@ namespace Umbraco.Core.Services /// The size of the script file. long GetScriptFileSize(string filepath); + /// + /// Gets the content of a usercontrol as a stream. + /// + /// The filesystem path to the usercontrol. + /// The content of the usercontrol. + Stream GetUserControlFileContentStream(string filepath); + + /// + /// Sets the content of a usercontrol. + /// + /// The filesystem path to the usercontrol. + /// The content of the usercontrol. + void SetUserControlFileContent(string filepath, Stream content); + + /// + /// Gets the size of a usercontrol. + /// + /// The filesystem path to the usercontrol. + /// The size of the usercontrol. + long GetUserControlFileSize(string filepath); + /// /// Gets the content of a XSLT file as a stream. /// diff --git a/src/Umbraco.Core/Services/IMembershipMemberService.cs b/src/Umbraco.Core/Services/IMembershipMemberService.cs index 801f88d9ac..7736a4f609 100644 --- a/src/Umbraco.Core/Services/IMembershipMemberService.cs +++ b/src/Umbraco.Core/Services/IMembershipMemberService.cs @@ -72,6 +72,18 @@ namespace Umbraco.Core.Services /// T CreateWithIdentity(string username, string email, string passwordValue, string memberTypeAlias); + /// + /// Creates and persists a new + /// + /// An can be of type or + /// Username of the to create + /// Email of the to create + /// This value should be the encoded/encrypted/hashed value for the password that will be stored in the database + /// Alias of the Type + /// IsApproved of the to create + /// + T CreateWithIdentity(string username, string email, string passwordValue, string memberTypeAlias, bool isApproved); + /// /// Gets an by its provider key /// diff --git a/src/Umbraco.Core/Services/IdkMap.cs b/src/Umbraco.Core/Services/IdkMap.cs new file mode 100644 index 0000000000..63b203aa0f --- /dev/null +++ b/src/Umbraco.Core/Services/IdkMap.cs @@ -0,0 +1,171 @@ +using System; +using System.Collections.Generic; +using System.Threading; +using Umbraco.Core.Models; +using Umbraco.Core.Persistence.UnitOfWork; + +namespace Umbraco.Core.Services +{ + public class IdkMap + { + private readonly IDatabaseUnitOfWorkProvider _uowProvider; + private readonly ReaderWriterLockSlim _locker = new ReaderWriterLockSlim(); + private readonly Dictionary _id2Key = new Dictionary(); + private readonly Dictionary _key2Id = new Dictionary(); + + public IdkMap(IDatabaseUnitOfWorkProvider uowProvider) + { + _uowProvider = uowProvider; + } + + // note - no need for uow, scope would be enough, but a pain to wire + // note - for pure read-only we might want to *not* enforce a transaction? + + public Attempt GetIdForKey(Guid key, UmbracoObjectTypes umbracoObjectType) + { + int id; + try + { + _locker.EnterReadLock(); + if (_key2Id.TryGetValue(key, out id)) return Attempt.Succeed(id); + } + finally + { + if (_locker.IsReadLockHeld) + _locker.ExitReadLock(); + } + + int? val; + using (var uow = _uowProvider.GetUnitOfWork()) + { + val = uow.Database.ExecuteScalar("SELECT id FROM umbracoNode WHERE uniqueId=@id AND nodeObjectType=@nodeObjectType", + new { id = key, nodeObjectType = GetNodeObjectTypeGuid(umbracoObjectType) }); + uow.Commit(); + } + + if (val == null) return Attempt.Fail(); + id = val.Value; + + try + { + _locker.EnterWriteLock(); + _id2Key[id] = key; + _key2Id[key] = id; + } + finally + { + if (_locker.IsWriteLockHeld) + _locker.ExitWriteLock(); + } + + return Attempt.Succeed(id); + } + + public Attempt GetIdForUdi(Udi udi) + { + var guidUdi = udi as GuidUdi; + if (guidUdi == null) + return Attempt.Fail(); + + var umbracoType = Constants.UdiEntityType.ToUmbracoObjectType(guidUdi.EntityType); + return GetIdForKey(guidUdi.Guid, umbracoType); + } + + public Attempt GetKeyForId(int id, UmbracoObjectTypes umbracoObjectType) + { + Guid key; + try + { + _locker.EnterReadLock(); + if (_id2Key.TryGetValue(id, out key)) return Attempt.Succeed(key); + } + finally + { + if (_locker.IsReadLockHeld) + _locker.ExitReadLock(); + } + + Guid? val; + using (var uow = _uowProvider.GetUnitOfWork()) + { + val = uow.Database.ExecuteScalar("SELECT uniqueId FROM umbracoNode WHERE id=@id AND nodeObjectType=@nodeObjectType", + new { id, nodeObjectType = GetNodeObjectTypeGuid(umbracoObjectType) }); + uow.Commit(); + } + + if (val == null) return Attempt.Fail(); + key = val.Value; + + try + { + _locker.EnterWriteLock(); + _id2Key[id] = key; + _key2Id[key] = id; + } + finally + { + if (_locker.IsWriteLockHeld) + _locker.ExitWriteLock(); + } + + return Attempt.Succeed(key); + } + + private static Guid GetNodeObjectTypeGuid(UmbracoObjectTypes umbracoObjectType) + { + var guid = umbracoObjectType.GetGuid(); + if (guid == Guid.Empty) + throw new NotSupportedException("Unsupported object type (" + umbracoObjectType + ")."); + return guid; + } + + public void ClearCache() + { + try + { + _locker.EnterWriteLock(); + _id2Key.Clear(); + _key2Id.Clear(); + } + finally + { + if (_locker.IsWriteLockHeld) + _locker.ExitWriteLock(); + } + } + + public void ClearCache(int id) + { + try + { + _locker.EnterWriteLock(); + Guid key; + if (_id2Key.TryGetValue(id, out key) == false) return; + _id2Key.Remove(id); + _key2Id.Remove(key); + } + finally + { + if (_locker.IsWriteLockHeld) + _locker.ExitWriteLock(); + } + } + + public void ClearCache(Guid key) + { + try + { + _locker.EnterWriteLock(); + int id; + if (_key2Id.TryGetValue(key, out id) == false) return; + _id2Key.Remove(id); + _key2Id.Remove(key); + } + finally + { + if (_locker.IsWriteLockHeld) + _locker.ExitWriteLock(); + } + } + } +} \ No newline at end of file diff --git a/src/Umbraco.Core/Services/MediaService.cs b/src/Umbraco.Core/Services/MediaService.cs index 22b7fe8225..38c0c20eb2 100644 --- a/src/Umbraco.Core/Services/MediaService.cs +++ b/src/Umbraco.Core/Services/MediaService.cs @@ -35,14 +35,16 @@ namespace Umbraco.Core.Services private readonly IDataTypeService _dataTypeService; private readonly IUserService _userService; private readonly MediaFileSystem _mediaFileSystem = FileSystemProviderManager.Current.MediaFileSystem; + private readonly IdkMap _idkMap; - public MediaService(IDatabaseUnitOfWorkProvider provider, RepositoryFactory repositoryFactory, ILogger logger, IEventMessagesFactory eventMessagesFactory, IDataTypeService dataTypeService, IUserService userService) + public MediaService(IDatabaseUnitOfWorkProvider provider, RepositoryFactory repositoryFactory, ILogger logger, IEventMessagesFactory eventMessagesFactory, IDataTypeService dataTypeService, IUserService userService, IdkMap idkMap) : base(provider, repositoryFactory, logger, eventMessagesFactory) { if (dataTypeService == null) throw new ArgumentNullException("dataTypeService"); if (userService == null) throw new ArgumentNullException("userService"); _dataTypeService = dataTypeService; _userService = userService; + _idkMap = idkMap; } /// @@ -327,12 +329,15 @@ namespace Umbraco.Core.Services /// public IMedia GetById(Guid key) { - using (var uow = UowProvider.GetUnitOfWork(readOnly: true)) - { - var repository = RepositoryFactory.CreateMediaRepository(uow); - var query = Query.Builder.Where(x => x.Key == key); - return repository.GetByQuery(query).SingleOrDefault(); - } + // the repository implements a cache policy on int identifiers, not guids, + // and we are not changing it now, but we still would like to rely on caching + // instead of running a full query against the database, so relying on the + // id-key map, which is fast. + // + // we should inject the id-key map but ... breaking changes ... yada + + var a = _idkMap.GetIdForKey(key, UmbracoObjectTypes.Media); + return a.Success ? GetById(a.Result) : null; } /// @@ -899,13 +904,13 @@ namespace Umbraco.Core.Services throw new ArgumentException("Cannot save media with empty name."); } - var repository = RepositoryFactory.CreateMediaRepository(uow); - + var repository = RepositoryFactory.CreateMediaRepository(uow); + //set the creator id if it's new if (media.HasIdentity == false) { media.CreatorId = userId; - } + } repository.AddOrUpdate(media); repository.AddOrUpdateContentXml(media, m => _entitySerializer.Serialize(this, _dataTypeService, _userService, m)); diff --git a/src/Umbraco.Core/Services/MemberService.cs b/src/Umbraco.Core/Services/MemberService.cs index ca1f27129c..26e74f66cc 100644 --- a/src/Umbraco.Core/Services/MemberService.cs +++ b/src/Umbraco.Core/Services/MemberService.cs @@ -826,6 +826,22 @@ namespace Umbraco.Core.Services return CreateMemberWithIdentity(username, email, username, passwordValue, memberType); } + /// + /// Creates and persists a new + /// + /// An can be of type or + /// Username of the to create + /// Email of the to create + /// This value should be the encoded/encrypted/hashed value for the password that will be stored in the database + /// Alias of the Type + /// Is the member approved + /// + IMember IMembershipMemberService.CreateWithIdentity(string username, string email, string passwordValue, string memberTypeAlias, bool isApproved) + { + var memberType = FindMemberTypeByAlias(memberTypeAlias); + return CreateMemberWithIdentity(username, email, username, passwordValue, memberType, isApproved); + } + /// /// Creates and persists a Member /// @@ -836,12 +852,13 @@ namespace Umbraco.Core.Services /// Name of the Member to create /// This value should be the encoded/encrypted/hashed value for the password that will be stored in the database /// MemberType the Member should be based on + /// Optional IsApproved of the Member to create /// - private IMember CreateMemberWithIdentity(string username, string email, string name, string passwordValue, IMemberType memberType) + private IMember CreateMemberWithIdentity(string username, string email, string name, string passwordValue, IMemberType memberType, bool isApproved = true) { if (memberType == null) throw new ArgumentNullException("memberType"); - var member = new Member(name, email.ToLower().Trim(), username, passwordValue, memberType); + var member = new Member(name, email.ToLower().Trim(), username, passwordValue, memberType, isApproved); using (var uow = UowProvider.GetUnitOfWork()) { diff --git a/src/Umbraco.Core/Services/PackagingService.cs b/src/Umbraco.Core/Services/PackagingService.cs index fbf3a7ee8f..6fa4a54a4b 100644 --- a/src/Umbraco.Core/Services/PackagingService.cs +++ b/src/Umbraco.Core/Services/PackagingService.cs @@ -89,18 +89,18 @@ namespace Umbraco.Core.Services /// public string FetchPackageFile(Guid packageId, Version umbracoVersion, int userId) { - var packageRepo = UmbracoConfig.For.UmbracoSettings().PackageRepositories.GetDefault(); + var packageRepo = UmbracoConfig.For.UmbracoSettings().PackageRepositories.GetDefault(); using (var httpClient = new HttpClient()) using (var uow = _uowProvider.GetUnitOfWork()) - { + { //includeHidden = true because we don't care if it's hidden we want to get the file regardless var url = string.Format("{0}/{1}?version={2}&includeHidden=true&asFile=true", packageRepo.RestApiUrl, packageId, umbracoVersion.ToString(3)); byte[] bytes; - try - { - bytes = httpClient.GetByteArrayAsync(url).GetAwaiter().GetResult(); - } + try + { + bytes = httpClient.GetByteArrayAsync(url).GetAwaiter().GetResult(); + } catch (HttpRequestException ex) { throw new ConnectionException("An error occuring downloading the package from " + url, ex); @@ -109,20 +109,20 @@ namespace Umbraco.Core.Services //successfull if (bytes.Length > 0) { - var packagePath = IOHelper.MapPath(SystemDirectories.Packages); + var packagePath = IOHelper.MapPath(SystemDirectories.Packages); // Check for package directory if (Directory.Exists(packagePath) == false) Directory.CreateDirectory(packagePath); - var packageFilePath = Path.Combine(packagePath, packageId + ".umb"); + var packageFilePath = Path.Combine(packagePath, packageId + ".umb"); using (var fs1 = new FileStream(packageFilePath, FileMode.Create)) { fs1.Write(bytes, 0, bytes.Length); return "packages\\" + packageId + ".umb"; } - } + } Audit(uow, AuditType.PackagerInstall, string.Format("Package {0} fetched from {1}", packageId, packageRepo.Id), userId, -1); return null; @@ -133,7 +133,7 @@ namespace Umbraco.Core.Services { var auditRepo = _repositoryFactory.CreateAuditRepository(uow); auditRepo.AddOrUpdate(new AuditItem(objectId, message, type, userId)); - } + } #region Content @@ -285,6 +285,7 @@ namespace Umbraco.Core.Services var nodeName = element.Attribute("nodeName").Value; var path = element.Attribute("path").Value; var template = element.Attribute("template").Value; + var key = Guid.Empty; var properties = from property in element.Elements() where property.Attribute("isDoc") == null @@ -302,6 +303,12 @@ namespace Umbraco.Core.Services SortOrder = int.Parse(sortOrder) }; + if (element.Attribute("key") != null && Guid.TryParse(element.Attribute("key").Value, out key)) + { + // update the Guid (for UDI support) + content.Key = key; + } + foreach (var property in properties) { string propertyTypeAlias = isLegacySchema ? property.Attribute("alias").Value : property.Name.LocalName; @@ -520,7 +527,7 @@ namespace Umbraco.Core.Services { var foldersAttribute = documentType.Attribute("Folders"); var infoElement = documentType.Element("Info"); - if (foldersAttribute != null && infoElement != null + if (foldersAttribute != null && infoElement != null //don't import any folder if this is a child doc type - the parent doc type will need to //exist which contains it's folders && ((string)infoElement.Element("Master")).IsNullOrWhiteSpace()) @@ -1041,7 +1048,7 @@ namespace Umbraco.Core.Services { _logger.Error("Could not create folder: " + rootFolder, tryCreateFolder.Exception); throw tryCreateFolder.Exception; - } + } current = _dataTypeService.GetContainer(tryCreateFolder.Result.Entity.Id); } @@ -1091,14 +1098,14 @@ namespace Umbraco.Core.Services if (dataTypeDefinition != null) { var valuesWithoutKeys = prevaluesElement.Elements("PreValue") - .Where(x => ((string) x.Attribute("Alias")).IsNullOrWhiteSpace()) + .Where(x => ((string)x.Attribute("Alias")).IsNullOrWhiteSpace()) .Select(x => x.Attribute("Value").Value); var valuesWithKeys = prevaluesElement.Elements("PreValue") - .Where(x => ((string) x.Attribute("Alias")).IsNullOrWhiteSpace() == false) + .Where(x => ((string)x.Attribute("Alias")).IsNullOrWhiteSpace() == false) .ToDictionary( - key => (string) key.Attribute("Alias"), - val => new PreValue((string) val.Attribute("Value"))); + key => (string)key.Attribute("Alias"), + val => new PreValue((string)val.Attribute("Value"))); //save the values with keys _dataTypeService.SavePreValues(dataTypeDefinition, valuesWithKeys); @@ -1956,12 +1963,12 @@ namespace Umbraco.Core.Services /// /// Occurs after a package is imported /// - internal static event TypedEventHandler> ImportedPackage; + public static event TypedEventHandler> ImportedPackage; /// /// Occurs after a package is uninstalled /// - internal static event TypedEventHandler> UninstalledPackage; + public static event TypedEventHandler> UninstalledPackage; #endregion } diff --git a/src/Umbraco.Core/Services/ServiceContext.cs b/src/Umbraco.Core/Services/ServiceContext.cs index 08959a3c19..3da10e132b 100644 --- a/src/Umbraco.Core/Services/ServiceContext.cs +++ b/src/Umbraco.Core/Services/ServiceContext.cs @@ -63,6 +63,8 @@ namespace Umbraco.Core.Services private Lazy _externalLoginService; private Lazy _redirectUrlService; + internal IdkMap IdkMap { get; private set; } + /// /// public ctor - will generally just be used for unit testing all items are optional and if not specified, the defaults will be used /// @@ -171,9 +173,11 @@ namespace Umbraco.Core.Services EventMessagesFactory = eventMessagesFactory; + IdkMap = new IdkMap(provider); + BuildServiceCache(provider, cache, repositoryFactory, - logger, eventMessagesFactory); + logger, eventMessagesFactory, IdkMap); } /// @@ -184,7 +188,8 @@ namespace Umbraco.Core.Services CacheHelper cache, RepositoryFactory repositoryFactory, ILogger logger, - IEventMessagesFactory eventMessagesFactory) + IEventMessagesFactory eventMessagesFactory, + IdkMap idkMap) { EventMessagesFactory = eventMessagesFactory; @@ -256,10 +261,10 @@ namespace Umbraco.Core.Services _memberService = new Lazy(() => new MemberService(provider, repositoryFactory, logger, eventMessagesFactory, _memberGroupService.Value, _dataTypeService.Value)); if (_contentService == null) - _contentService = new Lazy(() => new ContentService(provider, repositoryFactory, logger, eventMessagesFactory, _dataTypeService.Value, _userService.Value)); + _contentService = new Lazy(() => new ContentService(provider, repositoryFactory, logger, eventMessagesFactory, _dataTypeService.Value, _userService.Value, idkMap)); if (_mediaService == null) - _mediaService = new Lazy(() => new MediaService(provider, repositoryFactory, logger, eventMessagesFactory, _dataTypeService.Value, _userService.Value)); + _mediaService = new Lazy(() => new MediaService(provider, repositoryFactory, logger, eventMessagesFactory, _dataTypeService.Value, _userService.Value, idkMap)); if (_contentTypeService == null) _contentTypeService = new Lazy(() => new ContentTypeService(provider, repositoryFactory, logger, eventMessagesFactory, _contentService.Value, _mediaService.Value)); @@ -277,8 +282,7 @@ namespace Umbraco.Core.Services _entityService = new Lazy(() => new EntityService( provider, repositoryFactory, logger, eventMessagesFactory, _contentService.Value, _contentTypeService.Value, _mediaService.Value, _dataTypeService.Value, _memberService.Value, _memberTypeService.Value, - //TODO: Consider making this an isolated cache instead of using the global one - cache.RuntimeCache)); + idkMap)); if (_packagingService == null) _packagingService = new Lazy(() => new PackagingService(logger, _contentService.Value, _contentTypeService.Value, _mediaService.Value, _macroService.Value, _dataTypeService.Value, _fileService.Value, _localizationService.Value, _entityService.Value, _userService.Value, repositoryFactory, provider)); diff --git a/src/Umbraco.Core/Services/UserService.cs b/src/Umbraco.Core/Services/UserService.cs index dd9892e47c..68aa66e231 100644 --- a/src/Umbraco.Core/Services/UserService.cs +++ b/src/Umbraco.Core/Services/UserService.cs @@ -19,7 +19,6 @@ namespace Umbraco.Core.Services /// public class UserService : ScopeRepositoryService, IUserService { - //TODO: We need to change the isUpgrading flag to use an app state enum as described here: http://issues.umbraco.org/issue/U4-6816 // in the meantime, we will use a boolean which we are currently using during upgrades to ensure that a user object is not persisted during this phase, otherwise // exceptions can occur if the db is not in it's correct state. @@ -113,6 +112,26 @@ namespace Umbraco.Core.Services return CreateUserWithIdentity(username, email, passwordValue, userType); } + /// + /// Creates and persists a new + /// + /// Username of the to create + /// Email of the to create + /// This value should be the encoded/encrypted/hashed value for the password that will be stored in the database + /// Alias of the Type + /// Is the member approved + /// + IUser IMembershipMemberService.CreateWithIdentity(string username, string email, string passwordValue, string memberTypeAlias, bool isApproved) + { + var userType = GetUserTypeByAlias(memberTypeAlias); + if (userType == null) + { + throw new EntityNotFoundException("The user type " + memberTypeAlias + " could not be resolved"); + } + + return CreateUserWithIdentity(username, email, passwordValue, userType, isApproved); + } + /// /// Creates and persists a Member /// @@ -122,8 +141,9 @@ namespace Umbraco.Core.Services /// Email of the Member to create /// This value should be the encoded/encrypted/hashed value for the password that will be stored in the database /// MemberType the Member should be based on + /// Is the user approved /// - private IUser CreateUserWithIdentity(string username, string email, string passwordValue, IUserType userType) + private IUser CreateUserWithIdentity(string username, string email, string passwordValue, IUserType userType, bool isApproved = true) { if (userType == null) throw new ArgumentNullException("userType"); @@ -152,7 +172,7 @@ namespace Umbraco.Core.Services StartContentId = -1, StartMediaId = -1, IsLockedOut = false, - IsApproved = true + IsApproved = isApproved }; //adding default sections content and media user.AddAllowedSection("content"); diff --git a/src/Umbraco.Core/StringExtensions.cs b/src/Umbraco.Core/StringExtensions.cs index 225ac99ff7..dba7f2cfee 100644 --- a/src/Umbraco.Core/StringExtensions.cs +++ b/src/Umbraco.Core/StringExtensions.cs @@ -701,67 +701,72 @@ namespace Umbraco.Core return val; } + /// + /// Generates a hash of a string based on the FIPS compliance setting. + /// + /// Referrs to itself + /// The hashed string + public static string GenerateHash(this string str) + { + return CryptoConfig.AllowOnlyFipsAlgorithms + ? str.ToSHA1() + : str.ToMd5(); + } + /// /// Converts the string to MD5 /// - /// referrs to itself - /// the md5 hashed string + /// Referrs to itself + /// The MD5 hashed string public static string ToMd5(this string stringToConvert) { - //create an instance of the MD5CryptoServiceProvider - var md5Provider = new MD5CryptoServiceProvider(); - - //convert our string into byte array - var byteArray = Encoding.UTF8.GetBytes(stringToConvert); - - //get the hashed values created by our MD5CryptoServiceProvider - var hashedByteArray = md5Provider.ComputeHash(byteArray); - - //create a StringBuilder object - var stringBuilder = new StringBuilder(); - - //loop to each each byte - foreach (var b in hashedByteArray) - { - //append it to our StringBuilder - stringBuilder.Append(b.ToString("x2").ToLower()); - } - - //return the hashed value - return stringBuilder.ToString(); + return stringToConvert.GenerateHash("MD5"); } /// /// Converts the string to SHA1 /// /// referrs to itself - /// the md5 hashed string + /// The SHA1 hashed string public static string ToSHA1(this string stringToConvert) { - //create an instance of the SHA1CryptoServiceProvider - var md5Provider = new SHA1CryptoServiceProvider(); - - //convert our string into byte array - var byteArray = Encoding.UTF8.GetBytes(stringToConvert); - - //get the hashed values created by our SHA1CryptoServiceProvider - var hashedByteArray = md5Provider.ComputeHash(byteArray); - - //create a StringBuilder object - var stringBuilder = new StringBuilder(); - - //loop to each each byte - foreach (var b in hashedByteArray) - { - //append it to our StringBuilder - stringBuilder.Append(b.ToString("x2").ToLower()); - } - - //return the hashed value - return stringBuilder.ToString(); + return stringToConvert.GenerateHash("SHA1"); } + /// Generate a hash of a string based on the hashType passed in + /// + /// Referrs to itself + /// String with the hash type. See remarks section of the CryptoConfig Class in MSDN docs for a list of possible values. + /// The hashed string + private static string GenerateHash(this string str, string hashType) + { + //create an instance of the correct hashing provider based on the type passed in + var hasher = HashAlgorithm.Create(hashType); + if (hasher == null) throw new InvalidOperationException("No hashing type found by name " + hashType); + using (hasher) + { + //convert our string into byte array + var byteArray = Encoding.UTF8.GetBytes(str); + + //get the hashed values created by our selected provider + var hashedByteArray = hasher.ComputeHash(byteArray); + + //create a StringBuilder object + var stringBuilder = new StringBuilder(); + + //loop to each each byte + foreach (var b in hashedByteArray) + { + //append it to our StringBuilder + stringBuilder.Append(b.ToString("x2").ToLower()); + } + + //return the hashed value + return stringBuilder.ToString(); + } + } + /// /// Decodes a string that was encoded with UrlTokenEncode /// @@ -1465,10 +1470,84 @@ namespace Umbraco.Core /// internal static Guid ToGuid(this string text) { - var md5 = MD5.Create(); - byte[] myStringBytes = Encoding.ASCII.GetBytes(text); - byte[] hash = md5.ComputeHash(myStringBytes); - return new Guid(hash); + return CreateGuidFromHash(UrlNamespace, + text, + CryptoConfig.AllowOnlyFipsAlgorithms + ? 5 // SHA1 + : 3); // MD5 + } + + /// + /// The namespace for URLs (from RFC 4122, Appendix C). + /// + /// See RFC 4122 + /// + internal static readonly Guid UrlNamespace = new Guid("6ba7b811-9dad-11d1-80b4-00c04fd430c8"); + + /// + /// Creates a name-based UUID using the algorithm from RFC 4122 §4.3. + /// + /// See GuidUtility.cs for original implementation. + /// + /// The ID of the namespace. + /// The name (within that namespace). + /// The version number of the UUID to create; this value must be either + /// 3 (for MD5 hashing) or 5 (for SHA-1 hashing). + /// A UUID derived from the namespace and name. + /// See Generating a deterministic GUID. + internal static Guid CreateGuidFromHash(Guid namespaceId, string name, int version) + { + if (name == null) + throw new ArgumentNullException("name"); + if (version != 3 && version != 5) + throw new ArgumentOutOfRangeException("version", "version must be either 3 or 5."); + + // convert the name to a sequence of octets (as defined by the standard or conventions of its namespace) (step 3) + // ASSUME: UTF-8 encoding is always appropriate + byte[] nameBytes = Encoding.UTF8.GetBytes(name); + + // convert the namespace UUID to network order (step 3) + byte[] namespaceBytes = namespaceId.ToByteArray(); + SwapByteOrder(namespaceBytes); + + // comput the hash of the name space ID concatenated with the name (step 4) + byte[] hash; + using (HashAlgorithm algorithm = version == 3 ? (HashAlgorithm)MD5.Create() : SHA1.Create()) + { + algorithm.TransformBlock(namespaceBytes, 0, namespaceBytes.Length, null, 0); + algorithm.TransformFinalBlock(nameBytes, 0, nameBytes.Length); + hash = algorithm.Hash; + } + + // most bytes from the hash are copied straight to the bytes of the new GUID (steps 5-7, 9, 11-12) + byte[] newGuid = new byte[16]; + Array.Copy(hash, 0, newGuid, 0, 16); + + // set the four most significant bits (bits 12 through 15) of the time_hi_and_version field to the appropriate 4-bit version number from Section 4.1.3 (step 8) + newGuid[6] = (byte)((newGuid[6] & 0x0F) | (version << 4)); + + // set the two most significant bits (bits 6 and 7) of the clock_seq_hi_and_reserved to zero and one, respectively (step 10) + newGuid[8] = (byte)((newGuid[8] & 0x3F) | 0x80); + + // convert the resulting UUID to local byte order (step 13) + SwapByteOrder(newGuid); + return new Guid(newGuid); + } + + // Converts a GUID (expressed as a byte array) to/from network order (MSB-first). + internal static void SwapByteOrder(byte[] guid) + { + SwapBytes(guid, 0, 3); + SwapBytes(guid, 1, 2); + SwapBytes(guid, 4, 5); + SwapBytes(guid, 6, 7); + } + + private static void SwapBytes(byte[] guid, int left, int right) + { + byte temp = guid[left]; + guid[left] = guid[right]; + guid[right] = temp; } } } diff --git a/src/Umbraco.Core/Strings/CleanStringType.cs b/src/Umbraco.Core/Strings/CleanStringType.cs index 0e0a7c9908..c8c99be869 100644 --- a/src/Umbraco.Core/Strings/CleanStringType.cs +++ b/src/Umbraco.Core/Strings/CleanStringType.cs @@ -68,7 +68,7 @@ namespace Umbraco.Core.Strings /// /// Flag mask for encoding. /// - CodeMask = Unicode | Utf8 | Ascii, + CodeMask = Unicode | Utf8 | Ascii | TryAscii, /// /// Unicode encoding. @@ -86,6 +86,10 @@ namespace Umbraco.Core.Strings /// Ascii = 0x0400, + /// + /// Ascii encoding, if possible. + /// + TryAscii = 0x0800, // role values diff --git a/src/Umbraco.Core/Strings/DefaultShortStringHelper.cs b/src/Umbraco.Core/Strings/DefaultShortStringHelper.cs index 96b8187e22..40a0c71778 100644 --- a/src/Umbraco.Core/Strings/DefaultShortStringHelper.cs +++ b/src/Umbraco.Core/Strings/DefaultShortStringHelper.cs @@ -152,12 +152,18 @@ namespace Umbraco.Core.Strings /// The short string helper. public DefaultShortStringHelper WithDefaultConfig() { + var urlSegmentConvertTo = CleanStringType.Utf8; + if (_umbracoSettings.RequestHandler.ConvertUrlsToAscii) + urlSegmentConvertTo = CleanStringType.Ascii; + if (_umbracoSettings.RequestHandler.TryConvertUrlsToAscii) + urlSegmentConvertTo = CleanStringType.TryAscii; + return WithConfig(CleanStringType.UrlSegment, new Config { PreFilter = ApplyUrlReplaceCharacters, PostFilter = x => CutMaxLength(x, 240), IsTerm = (c, leading) => char.IsLetterOrDigit(c) || c == '_', // letter, digit or underscore - StringType = (_umbracoSettings.RequestHandler.ConvertUrlsToAscii ? CleanStringType.Ascii : CleanStringType.Utf8) | CleanStringType.LowerCase, + StringType = urlSegmentConvertTo | CleanStringType.LowerCase, BreakTermsOnUpper = false, Separator = '-' }).WithConfig(CleanStringType.FileName, new Config @@ -542,9 +548,20 @@ function validateSafeAlias(input, value, immediate, callback) {{ // recode var codeType = stringType & CleanStringType.CodeMask; - text = codeType == CleanStringType.Ascii - ? Utf8ToAsciiConverter.ToAsciiString(text) - : RemoveSurrogatePairs(text); + switch (codeType) + { + case CleanStringType.Ascii: + text = Utf8ToAsciiConverter.ToAsciiString(text); + break; + case CleanStringType.TryAscii: + const char ESC = (char) 27; + var ctext = Utf8ToAsciiConverter.ToAsciiString(text, ESC); + if (ctext.Contains(ESC) == false) text = ctext; + break; + default: + text = RemoveSurrogatePairs(text); + break; + } // clean text = CleanCodeString(text, stringType, separator.Value, culture, config); diff --git a/src/Umbraco.Core/Strings/Utf8ToAsciiConverter.cs b/src/Umbraco.Core/Strings/Utf8ToAsciiConverter.cs index e08defdedd..7a25f18c11 100644 --- a/src/Umbraco.Core/Strings/Utf8ToAsciiConverter.cs +++ b/src/Umbraco.Core/Strings/Utf8ToAsciiConverter.cs @@ -17,8 +17,9 @@ namespace Umbraco.Core.Strings /// Converts an Utf8 string into an Ascii string. /// /// The text to convert. + /// The character to used to replace characters that cannot properly be converted. /// The converted text. - public static string ToAsciiString(string text) + public static string ToAsciiString(string text, char fail = '?') { var input = text.ToCharArray(); @@ -26,7 +27,7 @@ namespace Umbraco.Core.Strings // but... we should be filtering short strings only... var output = new char[input.Length * 3]; // *3 because of things such as OE - var len = ToAscii(input, output); + var len = ToAscii(input, output, fail); return new string(output, 0, len); //var output = new StringBuilder(input.Length + 16); // default is 16, start with at least input length + little extra @@ -38,8 +39,9 @@ namespace Umbraco.Core.Strings /// Converts an Utf8 string into an array of Ascii characters. /// /// The text to convert. + /// The character to used to replace characters that cannot properly be converted. /// The converted text. - public static char[] ToAsciiCharArray(string text) + public static char[] ToAsciiCharArray(string text, char fail = '?') { var input = text.ToCharArray(); @@ -47,7 +49,7 @@ namespace Umbraco.Core.Strings // but... we should be filtering short strings only... var output = new char[input.Length * 3]; // *3 because of things such as OE - var len = ToAscii(input, output); + var len = ToAscii(input, output, fail); var array = new char[len]; Array.Copy(output, array, len); return array; @@ -64,10 +66,11 @@ namespace Umbraco.Core.Strings /// /// The input array. /// The output array. + /// The character to used to replace characters that cannot properly be converted. /// The number of characters in the output array. /// The caller must ensure that the output array is big enough. /// The output array is not big enough. - private static int ToAscii(char[] input, char[] output) + private static int ToAscii(char[] input, char[] output, char fail = '?') { var opos = 0; @@ -75,10 +78,10 @@ namespace Umbraco.Core.Strings if (char.IsSurrogate(input[ipos])) // ignore high surrogate { ipos++; // and skip low surrogate - output[opos++] = '?'; + output[opos++] = fail; } else - ToAscii(input, ipos, output, ref opos); + ToAscii(input, ipos, output, ref opos, fail); return opos; } @@ -109,12 +112,13 @@ namespace Umbraco.Core.Strings /// The input position. /// The output array. /// The output position. + /// The character to used to replace characters that cannot properly be converted. /// /// Adapted from various sources on the 'net including Lucene.Net.Analysis.ASCIIFoldingFilter. /// Input should contain Utf8 characters exclusively and NOT Unicode. /// Removes controls, normalizes whitespaces, replaces symbols by '?'. /// - private static void ToAscii(char[] input, int ipos, char[] output, ref int opos) + private static void ToAscii(char[] input, int ipos, char[] output, ref int opos, char fail = '?') { var c = input[ipos]; @@ -3583,7 +3587,7 @@ namespace Umbraco.Core.Strings // output[opos++] = c; // strict ASCII - output[opos++] = '?'; + output[opos++] = fail; break; } diff --git a/src/Umbraco.Core/UdiEntityType.cs b/src/Umbraco.Core/UdiEntityType.cs index f6b9b1e3b0..8fb5d99338 100644 --- a/src/Umbraco.Core/UdiEntityType.cs +++ b/src/Umbraco.Core/UdiEntityType.cs @@ -1,5 +1,4 @@ using System; -using System.Collections.Generic; using Umbraco.Core.Models; namespace Umbraco.Core @@ -70,6 +69,10 @@ namespace Umbraco.Core [UdiType(UdiType.StringUdi)] public const string AnyString = "any-string"; // that one is for tests + [UdiType(UdiType.StringUdi)] + public const string Language = "language"; + [UdiType(UdiType.StringUdi)] + public const string MacroScript = "macroscript"; [UdiType(UdiType.StringUdi)] public const string MediaFile = "media-file"; [UdiType(UdiType.StringUdi)] @@ -83,6 +86,8 @@ namespace Umbraco.Core [UdiType(UdiType.StringUdi)] public const string PartialViewMacro = "partial-view-macro"; [UdiType(UdiType.StringUdi)] + public const string UserControl = "usercontrol"; + [UdiType(UdiType.StringUdi)] public const string Xslt = "xslt"; public static string FromUmbracoObjectType(UmbracoObjectTypes umbracoObjectType) @@ -123,6 +128,8 @@ namespace Umbraco.Core return FormsPreValue; case UmbracoObjectTypes.FormsDataSource: return FormsDataSource; + case UmbracoObjectTypes.Language: + return Language; } throw new NotSupportedException(string.Format("UmbracoObjectType \"{0}\" does not have a matching EntityType.", umbracoObjectType)); } @@ -165,6 +172,8 @@ namespace Umbraco.Core return UmbracoObjectTypes.FormsPreValue; case FormsDataSource: return UmbracoObjectTypes.FormsDataSource; + case Language: + return UmbracoObjectTypes.Language; } throw new NotSupportedException( string.Format("EntityType \"{0}\" does not have a matching UmbracoObjectType.", entityType)); diff --git a/src/Umbraco.Core/UdiGetterExtensions.cs b/src/Umbraco.Core/UdiGetterExtensions.cs index 3d829c8a1a..4ae6b05dca 100644 --- a/src/Umbraco.Core/UdiGetterExtensions.cs +++ b/src/Umbraco.Core/UdiGetterExtensions.cs @@ -97,7 +97,7 @@ namespace Umbraco.Core /// /// The entity. /// The entity identifier of the entity. - public static GuidUdi GetUdi(this Umbraco.Core.Models.EntityContainer entity) + public static GuidUdi GetUdi(this EntityContainer entity) { if (entity == null) throw new ArgumentNullException("entity"); @@ -190,6 +190,17 @@ namespace Umbraco.Core return new GuidUdi(Constants.UdiEntityType.Macro, entity.Key).EnsureClosed(); } + /// + /// Gets the entity identifier of the entity. + /// + /// The entity. + /// The entity identifier of the entity. + public static StringUdi GetUdi(this IUserControl entity) + { + if (entity == null) throw new ArgumentNullException("entity"); + return new StringUdi(Constants.UdiEntityType.UserControl, entity.Path.TrimStart('/')).EnsureClosed(); + } + /// /// Gets the entity identifier of the entity. /// @@ -246,6 +257,17 @@ namespace Umbraco.Core return new GuidUdi(Constants.UdiEntityType.RelationType, entity.Key).EnsureClosed(); } + /// + /// Gets the entity identifier of the entity. + /// + /// The entity. + /// The entity identifier of the entity. + public static StringUdi GetUdi(this ILanguage entity) + { + if (entity == null) throw new ArgumentNullException("entity"); + return new StringUdi(Constants.UdiEntityType.Language, entity.IsoCode).EnsureClosed(); + } + /// /// Gets the entity identifier of the entity. /// @@ -279,7 +301,7 @@ namespace Umbraco.Core var dataTypeComposition = entity as IDataTypeDefinition; if (dataTypeComposition != null) return dataTypeComposition.GetUdi(); - var container = entity as Umbraco.Core.Models.EntityContainer; + var container = entity as EntityContainer; if (container != null) return container.GetUdi(); var media = entity as IMedia; @@ -315,6 +337,9 @@ namespace Umbraco.Core var relationType = entity as IRelationType; if (relationType != null) return relationType.GetUdi(); + var language = entity as ILanguage; + if (language != null) return language.GetUdi(); + throw new NotSupportedException(string.Format("Entity type {0} is not supported.", entity.GetType().FullName)); } } diff --git a/src/Umbraco.Core/Umbraco.Core.csproj b/src/Umbraco.Core/Umbraco.Core.csproj index e55eab43e2..24fdf32150 100644 --- a/src/Umbraco.Core/Umbraco.Core.csproj +++ b/src/Umbraco.Core/Umbraco.Core.csproj @@ -344,7 +344,9 @@ + + @@ -576,12 +578,15 @@ + + + @@ -650,6 +655,7 @@ + diff --git a/src/Umbraco.Tests/Membership/UmbracoServiceMembershipProviderTests.cs b/src/Umbraco.Tests/Membership/UmbracoServiceMembershipProviderTests.cs index 72900351b2..0f37a4aa26 100644 --- a/src/Umbraco.Tests/Membership/UmbracoServiceMembershipProviderTests.cs +++ b/src/Umbraco.Tests/Membership/UmbracoServiceMembershipProviderTests.cs @@ -1,6 +1,4 @@ -using System; -using System.Collections.Specialized; -using System.Configuration.Provider; +using System.Collections.Specialized; using System.Web.Security; using Moq; using NUnit.Framework; @@ -83,10 +81,10 @@ namespace Umbraco.Tests.Membership mServiceMock.Setup(service => service.GetByEmail("test@test.com")).Returns(() => null); mServiceMock.Setup(service => service.GetDefaultMemberType()).Returns("Member"); mServiceMock.Setup( - service => service.CreateWithIdentity(It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny())) - .Callback((string u, string e, string p, string m) => + service => service.CreateWithIdentity(It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny())) + .Callback((string u, string e, string p, string m, bool isApproved) => { - createdMember = new Member("test", e, u, p, memberType); + createdMember = new Member("test", e, u, p, memberType, isApproved); }) .Returns(() => createdMember); var provider = new MembersMembershipProvider(mServiceMock.Object); @@ -114,10 +112,10 @@ namespace Umbraco.Tests.Membership mServiceMock.Setup(service => service.GetByEmail("test@test.com")).Returns(() => null); mServiceMock.Setup(service => service.GetDefaultMemberType()).Returns("Member"); mServiceMock.Setup( - service => service.CreateWithIdentity(It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny())) - .Callback((string u, string e, string p, string m) => + service => service.CreateWithIdentity(It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny())) + .Callback((string u, string e, string p, string m, bool isApproved) => { - createdMember = new Member("test", e, u, p, memberType); + createdMember = new Member("test", e, u, p, memberType, isApproved); }) .Returns(() => createdMember); @@ -147,10 +145,10 @@ namespace Umbraco.Tests.Membership mServiceMock.Setup(service => service.GetByEmail("test@test.com")).Returns(() => null); mServiceMock.Setup(service => service.GetDefaultMemberType()).Returns("Member"); mServiceMock.Setup( - service => service.CreateWithIdentity(It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny())) - .Callback((string u, string e, string p, string m) => + service => service.CreateWithIdentity(It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny())) + .Callback((string u, string e, string p, string m, bool isApproved) => { - createdMember = new Member("test", e, u, p, memberType); + createdMember = new Member("test", e, u, p, memberType, isApproved); }) .Returns(() => createdMember); diff --git a/src/Umbraco.Tests/PropertyEditors/PropertyEditorValueConverterTests.cs b/src/Umbraco.Tests/PropertyEditors/PropertyEditorValueConverterTests.cs index 8134924c61..73abf62eba 100644 --- a/src/Umbraco.Tests/PropertyEditors/PropertyEditorValueConverterTests.cs +++ b/src/Umbraco.Tests/PropertyEditors/PropertyEditorValueConverterTests.cs @@ -96,5 +96,25 @@ namespace Umbraco.Tests.PropertyEditors Assert.AreEqual(expected, result); } + + [TestCase(null, "1", false, 1)] + [TestCase(null, "1", true, 1)] + [TestCase(null, "0", false, 0)] + [TestCase(null, "0", true, 0)] + [TestCase(null, null, false, 0)] + [TestCase(null, null, true, 0)] + [TestCase(null, "-1", false, -1)] + [TestCase(null, "-1", true, -1)] + [TestCase(null, "1.65", false, 1.65)] + [TestCase(null, "1.65", true, 1.65)] + [TestCase(null, "-1.65", false, -1.65)] + [TestCase(null, "-1.65", true, -1.65)] + public void CanConvertDecimalAliasPropertyEditor(Core.Models.PublishedContent.PublishedPropertyType propertyType, object value, bool preview, double expected) + { + var converter = new DecimalValueConverter(); + var result = converter.ConvertDataToSource(propertyType, value, preview); + + Assert.AreEqual(expected, result); + } } } diff --git a/src/Umbraco.Tests/Services/ContentServiceTests.cs b/src/Umbraco.Tests/Services/ContentServiceTests.cs index c598b272d7..79bf91716e 100644 --- a/src/Umbraco.Tests/Services/ContentServiceTests.cs +++ b/src/Umbraco.Tests/Services/ContentServiceTests.cs @@ -1403,6 +1403,7 @@ namespace Umbraco.Tests.Services })); Assert.IsTrue(ServiceContext.PublicAccessService.AddRule(content1, "test2", "test2").Success); + // how is that one even working since "test" is more than 1 char? Assert.IsNotNull(ServiceContext.NotificationService.CreateNotification(ServiceContext.UserService.GetUserById(0), content1, "test")); ServiceContext.ContentService.AssignContentPermission(content1, 'A', new[] {0}); @@ -1411,7 +1412,7 @@ namespace Umbraco.Tests.Services { RootContentId = content1.Id }).Success); - + // Act ServiceContext.ContentService.EmptyRecycleBin(); var contents = ServiceContext.ContentService.GetContentInRecycleBin(); @@ -1814,7 +1815,7 @@ namespace Umbraco.Tests.Services var c1 = MockedContent.CreateSimpleContent(contentType); ServiceContext.ContentService.Save(c1); } - + long total; var entities = service.GetPagedChildren(-1, 0, 6, out total).ToArray(); Assert.That(entities.Length, Is.EqualTo(6)); @@ -1834,7 +1835,7 @@ namespace Umbraco.Tests.Services var contentType = MockedContentTypes.CreateSimpleContentType(); ServiceContext.ContentTypeService.Save(contentType); - // only add 9 as we also add a content with children + // only add 9 as we also add a content with children for (int i = 0; i < 9; i++) { var c1 = MockedContent.CreateSimpleContent(contentType); diff --git a/src/Umbraco.Tests/Services/ContentTypeServiceTests.cs b/src/Umbraco.Tests/Services/ContentTypeServiceTests.cs index 9c3bbab42c..16829198ba 100644 --- a/src/Umbraco.Tests/Services/ContentTypeServiceTests.cs +++ b/src/Umbraco.Tests/Services/ContentTypeServiceTests.cs @@ -222,7 +222,7 @@ namespace Umbraco.Tests.Services var root = MockedContent.CreateSimpleContent(contentType1, "Root", -1); ServiceContext.ContentService.Save(root); ServiceContext.ContentService.Publish(root); - + var level1 = MockedContent.CreateSimpleContent(contentType2, "L1", root.Id); ServiceContext.ContentService.Save(level1); ServiceContext.ContentService.Publish(level1); @@ -520,7 +520,7 @@ namespace Umbraco.Tests.Services var deletedContent = cs.GetById(content.Id); var deletedChildContentType = cts.GetContentType(childContentType.Id); var deletedContentType = cts.GetContentType(contentType.Id); - + Assert.IsNull(deletedChildContentType); Assert.IsNull(deletedContent); Assert.IsNull(deletedContentType); @@ -980,7 +980,7 @@ namespace Umbraco.Tests.Services { // Arrange var contentType = MockedContentTypes.CreateSimpleContentType("contentType", string.Empty); - + // Act & Assert Assert.Throws(() => ServiceContext.ContentTypeService.Save(contentType)); } @@ -1542,7 +1542,8 @@ namespace Umbraco.Tests.Services SortOrder = 1, DataTypeDefinitionId = -88 }; - var authorAdded = basePage.AddPropertyType(authorPropertyType, "Content"); + Assert.IsTrue(basePage.AddPropertyType(authorPropertyType, "Content")); + var titlePropertyType = new PropertyType(Constants.PropertyEditors.TextboxAlias, DataTypeDatabaseType.Ntext, "title") { Name = "Title", @@ -1551,20 +1552,20 @@ namespace Umbraco.Tests.Services SortOrder = 1, DataTypeDefinitionId = -88 }; - var titleAdded = basePage.AddPropertyType(authorPropertyType, "Meta"); + Assert.IsTrue(basePage.AddPropertyType(titlePropertyType, "Meta")); service.Save(basePage); - basePage = service.GetContentType(basePage.Id); - var totalPt = basePage.PropertyTypes.Count(); + var count = basePage.PropertyTypes.Count(); + Assert.AreEqual(2, count); basePage.RemovePropertyGroup("Content"); - service.Save(basePage); + service.Save(basePage); basePage = service.GetContentType(basePage.Id); - Assert.AreEqual(totalPt, basePage.PropertyTypes.Count()); + Assert.AreEqual(count, basePage.PropertyTypes.Count()); } [Test] diff --git a/src/Umbraco.Tests/Strings/DefaultShortStringHelperTests.cs b/src/Umbraco.Tests/Strings/DefaultShortStringHelperTests.cs index 58b0451995..b528e81131 100644 --- a/src/Umbraco.Tests/Strings/DefaultShortStringHelperTests.cs +++ b/src/Umbraco.Tests/Strings/DefaultShortStringHelperTests.cs @@ -16,7 +16,7 @@ using Umbraco.Tests.TestHelpers; namespace Umbraco.Tests.Strings { [TestFixture] - public class DefaultShortStringHelperTests + public class DefaultShortStringHelperTests { private DefaultShortStringHelper _helper; @@ -145,6 +145,33 @@ namespace Umbraco.Tests.Strings Assert.AreEqual("aeoa-and-aeoa-and-and-and-grosser-bbddzhzh-page", output); } + [Test] + public void U4_4056_TryAscii() + { + var settings = SettingsForTests.GenerateMockSettings(); + var contentMock = Mock.Get(settings.RequestHandler); + contentMock.Setup(x => x.CharCollection).Returns(Enumerable.Empty()); + contentMock.Setup(x => x.ConvertUrlsToAscii).Returns(false); + SettingsForTests.ConfigureSettings(settings); + + const string input1 = "ÆØÅ and æøå and 中文测试 and אודות האתר and größer БбДдЖж page"; + const string input2 = "ÆØÅ and æøå and größer БбДдЖж page"; + + var helper = new DefaultShortStringHelper(settings).WithDefaultConfig(); // unicode + Assert.AreEqual("æøå-and-æøå-and-中文测试-and-אודות-האתר-and-größer-ббдджж-page", helper.CleanStringForUrlSegment(input1)); + Assert.AreEqual("æøå-and-æøå-and-größer-ббдджж-page", helper.CleanStringForUrlSegment(input2)); + + helper = new DefaultShortStringHelper(SettingsForTests.GetDefault()) + .WithConfig(CleanStringType.UrlSegment, new DefaultShortStringHelper.Config + { + IsTerm = (c, leading) => char.IsLetterOrDigit(c) || c == '_', + StringType = CleanStringType.LowerCase | CleanStringType.TryAscii, // try ascii + Separator = '-' + }); + Assert.AreEqual("æøå-and-æøå-and-中文测试-and-אודות-האתר-and-größer-ббдджж-page", helper.CleanStringForUrlSegment(input1)); + Assert.AreEqual("aeoa-and-aeoa-and-grosser-bbddzhzh-page", helper.CleanStringForUrlSegment(input2)); + } + [Test] public void CleanStringUnderscoreInTerm() { @@ -339,7 +366,7 @@ namespace Umbraco.Tests.Strings Separator = '*' }); Assert.AreEqual("house*2", helper.CleanString("house (2)", CleanStringType.Alias)); - + // FIXME but for a filename we want to keep them! // FIXME and what about a url? } @@ -574,7 +601,7 @@ namespace Umbraco.Tests.Strings { var output = _helper.SplitPascalCasing(input, ' '); Assert.AreEqual(expected, output); - + output = _helper.SplitPascalCasing(input, '*'); expected = expected.Replace(' ', '*'); Assert.AreEqual(expected, output); diff --git a/src/Umbraco.Tests/Umbraco.Tests.csproj b/src/Umbraco.Tests/Umbraco.Tests.csproj index eb57d210fc..067109d8bf 100644 --- a/src/Umbraco.Tests/Umbraco.Tests.csproj +++ b/src/Umbraco.Tests/Umbraco.Tests.csproj @@ -61,8 +61,9 @@ ..\packages\Castle.Core.4.0.0\lib\net45\Castle.Core.dll - - ..\packages\Examine.0.1.82\lib\net45\Examine.dll + + ..\packages\Examine.0.1.83\lib\net45\Examine.dll + True ..\packages\SharpZipLib.0.86.0\lib\20\ICSharpCode.SharpZipLib.dll diff --git a/src/Umbraco.Tests/packages.config b/src/Umbraco.Tests/packages.config index 4458fd06c5..231329a75b 100644 --- a/src/Umbraco.Tests/packages.config +++ b/src/Umbraco.Tests/packages.config @@ -3,7 +3,7 @@ - + diff --git a/src/Umbraco.Web.UI.Client/gruntFile.js b/src/Umbraco.Web.UI.Client/gruntFile.js index 6c785489c4..83cb15df64 100644 --- a/src/Umbraco.Web.UI.Client/gruntFile.js +++ b/src/Umbraco.Web.UI.Client/gruntFile.js @@ -382,6 +382,9 @@ module.exports = function (grunt) { html: { files: ['src/views/**/*.html', 'src/*.html'], tasks: ['watch-html', 'timestamp'] + }, + options: { + interval: 500 } }, diff --git a/src/Umbraco.Web.UI.Client/lib/tinymce/langs/da.js b/src/Umbraco.Web.UI.Client/lib/tinymce/langs/da.js new file mode 100644 index 0000000000..d295bf5750 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/lib/tinymce/langs/da.js @@ -0,0 +1,219 @@ +tinymce.addI18n('da',{ +"Cut": "Klip", +"Heading 5": "Overskrift 5", +"Header 2": "Overskrift 2", +"Your browser doesn't support direct access to the clipboard. Please use the Ctrl+X\/C\/V keyboard shortcuts instead.": "Din browser underst\u00f8tter ikke direkte adgang til clipboard. Benyt Ctrl+X\/C\/ keybord shortcuts i stedet for.", +"Heading 4": "Overskrift 4", +"Div": "Div", +"Heading 2": "Overskrift 2", +"Paste": "Inds\u00e6t", +"Close": "Luk", +"Font Family": "Skrifttype", +"Pre": "Pre", +"Align right": "H\u00f8jrejusteret", +"New document": "Nyt dokument", +"Blockquote": "Indrykning", +"Numbered list": "Nummerering", +"Heading 1": "Overskrift 1", +"Headings": "Overskrifter", +"Increase indent": "For\u00f8g indrykning", +"Formats": "Formater", +"Headers": "Overskrifter", +"Select all": "V\u00e6lg alle", +"Header 3": "Overskrift 3", +"Blocks": "Blokke", +"Undo": "Fortryd", +"Strikethrough": "Gennemstreg", +"Bullet list": "Punkt tegn", +"Header 1": "Overskrift 1", +"Superscript": "H\u00e6vet", +"Clear formatting": "Nulstil formattering", +"Font Sizes": "Skriftst\u00f8rrelse", +"Subscript": "S\u00e6nket", +"Header 6": "Overskrift 6", +"Redo": "Genopret", +"Paragraph": "S\u00e6tning", +"Ok": "Ok", +"Bold": "Fed", +"Code": "Code", +"Italic": "Kursiv", +"Align center": "Centreret", +"Header 5": "Overskrift 5", +"Heading 6": "Overskrift 6", +"Heading 3": "Overskrift 3", +"Decrease indent": "Formindsk indrykning", +"Header 4": "Overskrift 4", +"Paste is now in plain text mode. Contents will now be pasted as plain text until you toggle this option off.": "S\u00e6t ind er indstillet til at inds\u00e6tte som ren tekst. Indhold bliver nu indsat uden formatering indtil du \u00e6ndrer indstillingen.", +"Underline": "Understreg", +"Cancel": "Fortryd", +"Justify": "Justering", +"Inline": "Inline", +"Copy": "Kopier", +"Align left": "Venstrejusteret", +"Visual aids": "Visuel hj\u00e6lp", +"Lower Greek": "Lower Gr\u00e6sk", +"Square": "Kvadrat", +"Default": "Standard", +"Lower Alpha": "Lower Alpha", +"Circle": "Cirkel", +"Disc": "Disk", +"Upper Alpha": "Upper Alpha", +"Upper Roman": "Upper Roman", +"Lower Roman": "Lower Roman", +"Name": "Navn", +"Anchor": "Anchor", +"You have unsaved changes are you sure you want to navigate away?": "Du har ikke gemte \u00e6ndringer. Er du sikker p\u00e5 at du vil forts\u00e6tte?", +"Restore last draft": "Genopret sidste kladde", +"Special character": "Specielle tegn", +"Source code": "Kildekode", +"B": "B", +"R": "R", +"G": "G", +"Color": "Farve", +"Right to left": "H\u00f8jre til venstre", +"Left to right": "Venstre til h\u00f8jre", +"Emoticons": "Emot-ikoner", +"Robots": "Robotter", +"Document properties": "Dokument egenskaber", +"Title": "Titel", +"Keywords": "S\u00f8geord", +"Encoding": "Kodning", +"Description": "Beskrivelse", +"Author": "Forfatter", +"Fullscreen": "Fuldsk\u00e6rm", +"Horizontal line": "Vandret linie", +"Horizontal space": "Vandret afstand", +"Insert\/edit image": "Inds\u00e6t\/ret billede", +"General": "Generet", +"Advanced": "Avanceret", +"Source": "Kilde", +"Border": "Kant", +"Constrain proportions": "Behold propertioner", +"Vertical space": "Lodret afstand", +"Image description": "Billede beskrivelse", +"Style": "Stil", +"Dimensions": "Dimensioner", +"Insert image": "Inds\u00e6t billede", +"Zoom in": "Zoom ind", +"Contrast": "Kontrast", +"Back": "Tilbage", +"Gamma": "Gamma", +"Flip horizontally": "Flip horisontalt", +"Resize": "Skaler", +"Sharpen": "G\u00f8r skarpere", +"Zoom out": "Zoom ud", +"Image options": "Billede indstillinger", +"Apply": "Anvend", +"Brightness": "Lysstyrke", +"Rotate clockwise": "Drej med urets retning", +"Rotate counterclockwise": "Drej modsat urets retning", +"Edit image": "Rediger billede", +"Color levels": "Farve niveauer", +"Crop": "Besk\u00e6r", +"Orientation": "Retning", +"Flip vertically": "Flip vertikalt", +"Invert": "Inverter", +"Insert date\/time": "Inds\u00e6t dato\/klokkeslet", +"Remove link": "Fjern link", +"Url": "Url", +"Text to display": "Vis tekst", +"Anchors": "Ankre", +"Insert link": "Inds\u00e6t link", +"New window": "Nyt vindue", +"None": "Ingen", +"The URL you entered seems to be an external link. Do you want to add the required http:\/\/ prefix?": "URLen som du angav ser ud til at v\u00e6re et eksternt link. \u00d8nsker du at tilf\u00f8je det kr\u00e6vede prefiks http:\/\/ ?", +"Target": "Target", +"The URL you entered seems to be an email address. Do you want to add the required mailto: prefix?": "URLen som du angav ser ud til at v\u00e6re en email adresse. \u00d8nsker du at tilf\u00f8je det kr\u00e6vede prefiks mailto: ?", +"Insert\/edit link": "Inds\u00e6t\/ret link", +"Insert\/edit video": "Inds\u00e6t\/ret video", +"Poster": "Poster", +"Alternative source": "Alternativ kilde", +"Paste your embed code below:": "Inds\u00e6t din embed kode herunder:", +"Insert video": "Inds\u00e6t video", +"Embed": "Integrer", +"Nonbreaking space": "H\u00e5rdt mellemrum", +"Page break": "Sideskift", +"Paste as text": "Inds\u00e6t som ren tekst", +"Preview": "Forh\u00e5ndsvisning", +"Print": "Udskriv", +"Save": "Gem", +"Could not find the specified string.": "Kunne ikke finde s\u00f8getekst", +"Replace": "Erstat", +"Next": "N\u00e6ste", +"Whole words": "Hele ord", +"Find and replace": "Find og erstat", +"Replace with": "Erstat med", +"Find": "Find", +"Replace all": "Erstat alt", +"Match case": "STORE og sm\u00e5 bogstaver", +"Prev": "Forrige", +"Spellcheck": "Stavekontrol", +"Finish": "F\u00e6rdig", +"Ignore all": "Ignorer alt", +"Ignore": "Ignorer", +"Add to Dictionary": "Tilf\u00f8j til ordbog", +"Insert row before": "Inds\u00e6t r\u00e6kke f\u00f8r", +"Rows": "R\u00e6kker", +"Height": "H\u00f8jde", +"Paste row after": "Inds\u00e6t r\u00e6kke efter", +"Alignment": "Tilpasning", +"Border color": "Kant farve", +"Column group": "Kolonne gruppe", +"Row": "R\u00e6kke", +"Insert column before": "Inds\u00e6t kolonne f\u00f8r", +"Split cell": "Split celle", +"Cell padding": "Celle padding", +"Cell spacing": "Celle afstand", +"Row type": "R\u00e6kke type", +"Insert table": "Inds\u00e6t tabel", +"Body": "Krop", +"Caption": "Tekst", +"Footer": "Sidefod", +"Delete row": "Slet r\u00e6kke", +"Paste row before": "Inds\u00e6t r\u00e6kke f\u00f8r", +"Scope": "Anvendelsesomr\u00e5de", +"Delete table": "Slet tabel", +"H Align": "H juster", +"Top": "Top", +"Header cell": "Sidehoved celle", +"Column": "Kolonne", +"Row group": "R\u00e6kke gruppe", +"Cell": "Celle", +"Middle": "Midt", +"Cell type": "Celle type", +"Copy row": "Kopier r\u00e6kke", +"Row properties": "R\u00e6kke egenskaber", +"Table properties": "Tabel egenskaber", +"Bottom": "Bund", +"V Align": "V juster", +"Header": "Sidehoved", +"Right": "H\u00f8jre", +"Insert column after": "Inds\u00e6t kolonne efter", +"Cols": "Kolonne", +"Insert row after": "Inds\u00e6t r\u00e6kke efter", +"Width": "Bredde", +"Cell properties": "Celle egenskaber", +"Left": "Venstre", +"Cut row": "Klip r\u00e6kke", +"Delete column": "Slet kolonne", +"Center": "Centrering", +"Merge cells": "Flet celler", +"Insert template": "Inds\u00e6t skabelon", +"Templates": "Skabeloner", +"Background color": "Baggrunds farve", +"Custom...": "Brugerdefineret...", +"Custom color": "Brugerdefineret farve", +"No color": "Ingen farve", +"Text color": "Tekst farve", +"Show blocks": "Vis klokke", +"Show invisible characters": "Vis usynlige tegn", +"Words: {0}": "Ord: {0}", +"Insert": "Inds\u00e6t", +"File": "Fil", +"Edit": "Rediger", +"Rich Text Area. Press ALT-F9 for menu. Press ALT-F10 for toolbar. Press ALT-0 for help": "Rich Text omr\u00e5de. Tryk ALT-F9 for menu. Tryk ALT-F10 for toolbar. Tryk ALT-0 for hj\u00e6lp", +"Tools": "V\u00e6rkt\u00f8j", +"View": "Vis", +"Table": "Tabel", +"Format": "Format" +}); \ No newline at end of file diff --git a/src/Umbraco.Web.UI.Client/lib/tinymce/langs/de.js b/src/Umbraco.Web.UI.Client/lib/tinymce/langs/de.js new file mode 100644 index 0000000000..9a31056850 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/lib/tinymce/langs/de.js @@ -0,0 +1,219 @@ +tinymce.addI18n('de',{ +"Cut": "Ausschneiden", +"Heading 5": "\u00dcberschrift 5", +"Header 2": "\u00dcberschrift 2", +"Your browser doesn't support direct access to the clipboard. Please use the Ctrl+X\/C\/V keyboard shortcuts instead.": "Ihr Browser unterst\u00fctzt leider keinen direkten Zugriff auf die Zwischenablage. Bitte benutzen Sie die Strg + X \/ C \/ V Tastenkombinationen.", +"Heading 4": "\u00dcberschrift 4", +"Div": "Textblock", +"Heading 2": "\u00dcberschrift 2", +"Paste": "Einf\u00fcgen", +"Close": "Schlie\u00dfen", +"Font Family": "Schriftart", +"Pre": "Vorformatierter Text", +"Align right": "Rechtsb\u00fcndig ausrichten", +"New document": "Neues Dokument", +"Blockquote": "Zitat", +"Numbered list": "Nummerierte Liste", +"Heading 1": "\u00dcberschrift 1", +"Headings": "\u00dcberschriften", +"Increase indent": "Einzug vergr\u00f6\u00dfern", +"Formats": "Formate", +"Headers": "\u00dcberschriften", +"Select all": "Alles ausw\u00e4hlen", +"Header 3": "\u00dcberschrift 3", +"Blocks": "Absatzformate", +"Undo": "R\u00fcckg\u00e4ngig", +"Strikethrough": "Durchgestrichen", +"Bullet list": "Aufz\u00e4hlung", +"Header 1": "\u00dcberschrift 1", +"Superscript": "Hochgestellt", +"Clear formatting": "Formatierung entfernen", +"Font Sizes": "Schriftgr\u00f6\u00dfe", +"Subscript": "Tiefgestellt", +"Header 6": "\u00dcberschrift 6", +"Redo": "Wiederholen", +"Paragraph": "Absatz", +"Ok": "Ok", +"Bold": "Fett", +"Code": "Quelltext", +"Italic": "Kursiv", +"Align center": "Zentriert ausrichten", +"Header 5": "\u00dcberschrift 5", +"Heading 6": "\u00dcberschrift 6", +"Heading 3": "\u00dcberschrift 3", +"Decrease indent": "Einzug verkleinern", +"Header 4": "\u00dcberschrift 4", +"Paste is now in plain text mode. Contents will now be pasted as plain text until you toggle this option off.": "Einf\u00fcgen ist nun im einfachen Textmodus. Inhalte werden ab jetzt als unformatierter Text eingef\u00fcgt, bis Sie diese Einstellung wieder ausschalten!", +"Underline": "Unterstrichen", +"Cancel": "Abbrechen", +"Justify": "Blocksatz", +"Inline": "Zeichenformate", +"Copy": "Kopieren", +"Align left": "Linksb\u00fcndig ausrichten", +"Visual aids": "Visuelle Hilfen", +"Lower Greek": "Griechische Kleinbuchstaben", +"Square": "Quadrat", +"Default": "Standard", +"Lower Alpha": "Kleinbuchstaben", +"Circle": "Kreis", +"Disc": "Punkt", +"Upper Alpha": "Gro\u00dfbuchstaben", +"Upper Roman": "R\u00f6mische Zahlen (Gro\u00dfbuchstaben)", +"Lower Roman": "R\u00f6mische Zahlen (Kleinbuchstaben)", +"Name": "Name", +"Anchor": "Textmarke", +"You have unsaved changes are you sure you want to navigate away?": "Die \u00c4nderungen wurden noch nicht gespeichert, sind Sie sicher, dass Sie diese Seite verlassen wollen?", +"Restore last draft": "Letzten Entwurf wiederherstellen", +"Special character": "Sonderzeichen", +"Source code": "Quelltext", +"B": "B", +"R": "R", +"G": "G", +"Color": "Farbe", +"Right to left": "Von rechts nach links", +"Left to right": "Von links nach rechts", +"Emoticons": "Emoticons", +"Robots": "Robots", +"Document properties": "Dokumenteigenschaften", +"Title": "Titel", +"Keywords": "Sch\u00fcsselw\u00f6rter", +"Encoding": "Zeichenkodierung", +"Description": "Beschreibung", +"Author": "Verfasser", +"Fullscreen": "Vollbild", +"Horizontal line": "Horizontale Linie", +"Horizontal space": "Horizontaler Abstand", +"Insert\/edit image": "Bild einf\u00fcgen\/bearbeiten", +"General": "Allgemein", +"Advanced": "Erweitert", +"Source": "Quelle", +"Border": "Rahmen", +"Constrain proportions": "Seitenverh\u00e4ltnis beibehalten", +"Vertical space": "Vertikaler Abstand", +"Image description": "Bildbeschreibung", +"Style": "Stil", +"Dimensions": "Abmessungen", +"Insert image": "Bild einf\u00fcgen", +"Zoom in": "Ansicht vergr\u00f6\u00dfern", +"Contrast": "Kontrast", +"Back": "Zur\u00fcck", +"Gamma": "Gamma", +"Flip horizontally": "Horizontal spiegeln", +"Resize": "Skalieren", +"Sharpen": "Sch\u00e4rfen", +"Zoom out": "Ansicht verkleinern", +"Image options": "Bildeigenschaften", +"Apply": "Anwenden", +"Brightness": "Helligkeit", +"Rotate clockwise": "Im Uhrzeigersinn drehen", +"Rotate counterclockwise": "Gegen den Uhrzeigersinn drehen", +"Edit image": "Bild bearbeiten", +"Color levels": "Farbwerte", +"Crop": "Bescheiden", +"Orientation": "Ausrichtung", +"Flip vertically": "Vertikal spiegeln", +"Invert": "Invertieren", +"Insert date\/time": "Datum\/Uhrzeit einf\u00fcgen ", +"Remove link": "Link entfernen", +"Url": "URL", +"Text to display": "Anzuzeigender Text", +"Anchors": "Textmarken", +"Insert link": "Link einf\u00fcgen", +"New window": "Neues Fenster", +"None": "Keine", +"The URL you entered seems to be an external link. Do you want to add the required http:\/\/ prefix?": "Diese Adresse scheint ein externer Link zu sein. M\u00f6chten Sie das dazu ben\u00f6tigte \"http:\/\/\" voranstellen?", +"Target": "Ziel", +"The URL you entered seems to be an email address. Do you want to add the required mailto: prefix?": "Diese Adresse scheint eine E-Mail-Adresse zu sein. M\u00f6chten Sie das dazu ben\u00f6tigte \"mailto:\" voranstellen?", +"Insert\/edit link": "Link einf\u00fcgen\/bearbeiten", +"Insert\/edit video": "Video einf\u00fcgen\/bearbeiten", +"Poster": "Poster", +"Alternative source": "Alternative Quelle", +"Paste your embed code below:": "F\u00fcgen Sie Ihren Einbettungscode hier ein:", +"Insert video": "Video einf\u00fcgen", +"Embed": "Einbetten", +"Nonbreaking space": "Gesch\u00fctztes Leerzeichen", +"Page break": "Seitenumbruch", +"Paste as text": "Als Text einf\u00fcgen", +"Preview": "Vorschau", +"Print": "Drucken", +"Save": "Speichern", +"Could not find the specified string.": "Die Zeichenfolge wurde nicht gefunden.", +"Replace": "Ersetzen", +"Next": "Weiter", +"Whole words": "Nur ganze W\u00f6rter", +"Find and replace": "Suchen und ersetzen", +"Replace with": "Ersetzen durch", +"Find": "Suchen", +"Replace all": "Alles ersetzen", +"Match case": "Gro\u00df-\/Kleinschreibung beachten", +"Prev": "Zur\u00fcck", +"Spellcheck": "Rechtschreibpr\u00fcfung", +"Finish": "Ende", +"Ignore all": "Alles Ignorieren", +"Ignore": "Ignorieren", +"Add to Dictionary": "Zum W\u00f6rterbuch hinzuf\u00fcgen", +"Insert row before": "Neue Zeile davor einf\u00fcgen ", +"Rows": "Zeilen", +"Height": "H\u00f6he", +"Paste row after": "Zeile danach einf\u00fcgen", +"Alignment": "Ausrichtung", +"Border color": "Rahmenfarbe", +"Column group": "Spaltengruppe", +"Row": "Zeile", +"Insert column before": "Neue Spalte davor einf\u00fcgen", +"Split cell": "Zelle aufteilen", +"Cell padding": "Zelleninnenabstand", +"Cell spacing": "Zellenabstand", +"Row type": "Zeilentyp", +"Insert table": "Tabelle einf\u00fcgen", +"Body": "Inhalt", +"Caption": "Beschriftung", +"Footer": "Fu\u00dfzeile", +"Delete row": "Zeile l\u00f6schen", +"Paste row before": "Zeile davor einf\u00fcgen", +"Scope": "G\u00fcltigkeitsbereich", +"Delete table": "Tabelle l\u00f6schen", +"H Align": "Horizontale Ausrichtung", +"Top": "Oben", +"Header cell": "Kopfzelle", +"Column": "Spalte", +"Row group": "Zeilengruppe", +"Cell": "Zelle", +"Middle": "Mitte", +"Cell type": "Zellentyp", +"Copy row": "Zeile kopieren", +"Row properties": "Zeileneigenschaften", +"Table properties": "Tabelleneigenschaften", +"Bottom": "Unten", +"V Align": "Vertikale Ausrichtung", +"Header": "Kopfzeile", +"Right": "Rechtsb\u00fcndig", +"Insert column after": "Neue Spalte danach einf\u00fcgen", +"Cols": "Spalten", +"Insert row after": "Neue Zeile danach einf\u00fcgen", +"Width": "Breite", +"Cell properties": "Zelleneigenschaften", +"Left": "Linksb\u00fcndig", +"Cut row": "Zeile ausschneiden", +"Delete column": "Spalte l\u00f6schen", +"Center": "Zentriert", +"Merge cells": "Zellen verbinden", +"Insert template": "Vorlage einf\u00fcgen ", +"Templates": "Vorlagen", +"Background color": "Hintergrundfarbe", +"Custom...": "Benutzerdefiniert...", +"Custom color": "Benutzerdefinierte Farbe", +"No color": "Keine Farbe", +"Text color": "Textfarbe", +"Show blocks": " Bl\u00f6cke anzeigen", +"Show invisible characters": "Unsichtbare Zeichen anzeigen", +"Words: {0}": "W\u00f6rter: {0}", +"Insert": "Einf\u00fcgen", +"File": "Datei", +"Edit": "Bearbeiten", +"Rich Text Area. Press ALT-F9 for menu. Press ALT-F10 for toolbar. Press ALT-0 for help": "Rich-Text- Area. Dr\u00fccken Sie ALT-F9 f\u00fcr das Men\u00fc. Dr\u00fccken Sie ALT-F10 f\u00fcr Symbolleiste. Dr\u00fccken Sie ALT-0 f\u00fcr Hilfe", +"Tools": "Werkzeuge", +"View": "Ansicht", +"Table": "Tabelle", +"Format": "Format" +}); \ No newline at end of file diff --git a/src/Umbraco.Web.UI.Client/lib/tinymce/langs/en.js b/src/Umbraco.Web.UI.Client/lib/tinymce/langs/en.js new file mode 100644 index 0000000000..19324f74cd --- /dev/null +++ b/src/Umbraco.Web.UI.Client/lib/tinymce/langs/en.js @@ -0,0 +1 @@ +tinyMCE.addI18n({en:{common:{"more_colors":"More Colors...","invalid_data":"Error: Invalid values entered, these are marked in red.","popup_blocked":"Sorry, but we have noticed that your popup-blocker has disabled a window that provides application functionality. You will need to disable popup blocking on this site in order to fully utilize this tool.","clipboard_no_support":"Currently not supported by your browser, use keyboard shortcuts instead.","clipboard_msg":"Copy/Cut/Paste is not available in Mozilla and Firefox.\nDo you want more information about this issue?","not_set":"-- Not Set --","class_name":"Class",browse:"Browse",close:"Close",cancel:"Cancel",update:"Update",insert:"Insert",apply:"Apply","edit_confirm":"Do you want to use the WYSIWYG mode for this textarea?","invalid_data_number":"{#field} must be a number","invalid_data_min":"{#field} must be a number greater than {#min}","invalid_data_size":"{#field} must be a number or percentage",value:"(value)"},contextmenu:{full:"Full",right:"Right",center:"Center",left:"Left",align:"Alignment"},insertdatetime:{"day_short":"Sun,Mon,Tue,Wed,Thu,Fri,Sat,Sun","day_long":"Sunday,Monday,Tuesday,Wednesday,Thursday,Friday,Saturday,Sunday","months_short":"Jan,Feb,Mar,Apr,May,Jun,Jul,Aug,Sep,Oct,Nov,Dec","months_long":"January,February,March,April,May,June,July,August,September,October,November,December","inserttime_desc":"Insert Time","insertdate_desc":"Insert Date","time_fmt":"%H:%M:%S","date_fmt":"%Y-%m-%d"},print:{"print_desc":"Print"},preview:{"preview_desc":"Preview"},directionality:{"rtl_desc":"Direction Right to Left","ltr_desc":"Direction Left to Right"},layer:{content:"New layer...","absolute_desc":"Toggle Absolute Positioning","backward_desc":"Move Backward","forward_desc":"Move Forward","insertlayer_desc":"Insert New Layer"},save:{"save_desc":"Save","cancel_desc":"Cancel All Changes"},nonbreaking:{"nonbreaking_desc":"Insert Non-Breaking Space Character"},iespell:{download:"ieSpell not detected. Do you want to install it now?","iespell_desc":"Check Spelling"},advhr:{"delta_height":"","delta_width":"","advhr_desc":"Insert Horizontal Line"},emotions:{"delta_height":"","delta_width":"","emotions_desc":"Emotions"},searchreplace:{"replace_desc":"Find/Replace","delta_width":"","delta_height":"","search_desc":"Find"},advimage:{"delta_width":"","image_desc":"Insert/Edit Image","delta_height":""},advlink:{"delta_height":"","delta_width":"","link_desc":"Insert/Edit Link"},xhtmlxtras:{"attribs_delta_height":"","attribs_delta_width":"","ins_delta_height":"","ins_delta_width":"","del_delta_height":"","del_delta_width":"","acronym_delta_height":"","acronym_delta_width":"","abbr_delta_height":"","abbr_delta_width":"","cite_delta_height":"","cite_delta_width":"","attribs_desc":"Insert/Edit Attributes","ins_desc":"Insertion","del_desc":"Deletion","acronym_desc":"Acronym","abbr_desc":"Abbreviation","cite_desc":"Citation"},style:{"delta_height":"","delta_width":"",desc:"Edit CSS Style"},paste:{"plaintext_mode_stick":"Paste is now in plain text mode. Click again to toggle back to regular paste mode.","plaintext_mode":"Paste is now in plain text mode. Click again to toggle back to regular paste mode. After you paste something you will be returned to regular paste mode.","selectall_desc":"Select All","paste_word_desc":"Paste from Word","paste_text_desc":"Paste as Plain Text"},"paste_dlg":{"word_title":"Use Ctrl+V on your keyboard to paste the text into the window.","text_linebreaks":"Keep Linebreaks","text_title":"Use Ctrl+V on your keyboard to paste the text into the window."},table:{"merge_cells_delta_height":"","merge_cells_delta_width":"","table_delta_height":"","table_delta_width":"","cellprops_delta_height":"","cellprops_delta_width":"","rowprops_delta_height":"","rowprops_delta_width":"",cell:"Cell",col:"Column",row:"Row",del:"Delete Table","copy_row_desc":"Copy Table Row","cut_row_desc":"Cut Table Row","paste_row_after_desc":"Paste Table Row After","paste_row_before_desc":"Paste Table Row Before","props_desc":"Table Properties","cell_desc":"Table Cell Properties","row_desc":"Table Row Properties","merge_cells_desc":"Merge Table Cells","split_cells_desc":"Split Merged Table Cells","delete_col_desc":"Delete Column","col_after_desc":"Insert Column After","col_before_desc":"Insert Column Before","delete_row_desc":"Delete Row","row_after_desc":"Insert Row After","row_before_desc":"Insert Row Before",desc:"Insert/Edit Table"},autosave:{"warning_message":"If you restore the saved content, you will lose all the content that is currently in the editor.\n\nAre you sure you want to restore the saved content?","restore_content":"Restore auto-saved content.","unload_msg":"The changes you made will be lost if you navigate away from this page."},fullscreen:{desc:"Toggle Full Screen Mode"},media:{"delta_height":"","delta_width":"",edit:"Edit Embedded Media",desc:"Insert/Edit Embedded Media"},fullpage:{desc:"Document Properties","delta_width":"","delta_height":""},template:{desc:"Insert Predefined Template Content"},visualchars:{desc:"Show/Hide Visual Control Characters"},spellchecker:{desc:"Toggle Spell Checker",menu:"Spell Checker Settings","ignore_word":"Ignore Word","ignore_words":"Ignore All",langs:"Languages",wait:"Please wait...",sug:"Suggestions","no_sug":"No Suggestions","no_mpell":"No misspellings found.","learn_word":"Learn word"},pagebreak:{desc:"Insert Page Break for Printing"},advlist:{types:"Types",def:"Default","lower_alpha":"Lower Alpha","lower_greek":"Lower Greek","lower_roman":"Lower Roman","upper_alpha":"Upper Alpha","upper_roman":"Upper Roman",circle:"Circle",disc:"Disc",square:"Square"},colors:{"333300":"Dark olive","993300":"Burnt orange","000000":"Black","003300":"Dark green","003366":"Dark azure","000080":"Navy Blue","333399":"Indigo","333333":"Very dark gray","800000":"Maroon",FF6600:"Orange","808000":"Olive","008000":"Green","008080":"Teal","0000FF":"Blue","666699":"Grayish blue","808080":"Gray",FF0000:"Red",FF9900:"Amber","99CC00":"Yellow green","339966":"Sea green","33CCCC":"Turquoise","3366FF":"Royal blue","800080":"Purple","999999":"Medium gray",FF00FF:"Magenta",FFCC00:"Gold",FFFF00:"Yellow","00FF00":"Lime","00FFFF":"Aqua","00CCFF":"Sky blue","993366":"Brown",C0C0C0:"Silver",FF99CC:"Pink",FFCC99:"Peach",FFFF99:"Light yellow",CCFFCC:"Pale green",CCFFFF:"Pale cyan","99CCFF":"Light sky blue",CC99FF:"Plum",FFFFFF:"White"},aria:{"rich_text_area":"Rich Text Area"},wordcount:{words:"Words:"},visualblocks:{desc:'Show/hide block elements'}}}); \ No newline at end of file diff --git a/src/Umbraco.Web.UI.Client/lib/tinymce/langs/en_us.js b/src/Umbraco.Web.UI.Client/lib/tinymce/langs/en_us.js new file mode 100644 index 0000000000..4e94198e5a --- /dev/null +++ b/src/Umbraco.Web.UI.Client/lib/tinymce/langs/en_us.js @@ -0,0 +1 @@ +tinyMCE.addI18n({en_us:{common:{"more_colors":"More Colors...","invalid_data":"Error: Invalid values entered, these are marked in red.","popup_blocked":"Sorry, but we have noticed that your popup-blocker has disabled a window that provides application functionality. You will need to disable popup blocking on this site in order to fully utilize this tool.","clipboard_no_support":"Currently not supported by your browser, use keyboard shortcuts instead.","clipboard_msg":"Copy/Cut/Paste is not available in Mozilla and Firefox.\nDo you want more information about this issue?","not_set":"-- Not Set --","class_name":"Class",browse:"Browse",close:"Close",cancel:"Cancel",update:"Update",insert:"Insert",apply:"Apply","edit_confirm":"Do you want to use the WYSIWYG mode for this textarea?","invalid_data_number":"{#field} must be a number","invalid_data_min":"{#field} must be a number greater than {#min}","invalid_data_size":"{#field} must be a number or percentage",value:"(value)"},contextmenu:{full:"Full",right:"Right",center:"Center",left:"Left",align:"Alignment"},insertdatetime:{"day_short":"Sun,Mon,Tue,Wed,Thu,Fri,Sat,Sun","day_long":"Sunday,Monday,Tuesday,Wednesday,Thursday,Friday,Saturday,Sunday","months_short":"Jan,Feb,Mar,Apr,May,Jun,Jul,Aug,Sep,Oct,Nov,Dec","months_long":"January,February,March,April,May,June,July,August,September,October,November,December","inserttime_desc":"Insert Time","insertdate_desc":"Insert Date","time_fmt":"%H:%M:%S","date_fmt":"%Y-%m-%d"},print:{"print_desc":"Print"},preview:{"preview_desc":"Preview"},directionality:{"rtl_desc":"Direction Right to Left","ltr_desc":"Direction Left to Right"},layer:{content:"New layer...","absolute_desc":"Toggle Absolute Positioning","backward_desc":"Move Backward","forward_desc":"Move Forward","insertlayer_desc":"Insert New Layer"},save:{"save_desc":"Save","cancel_desc":"Cancel All Changes"},nonbreaking:{"nonbreaking_desc":"Insert Non-Breaking Space Character"},iespell:{download:"ieSpell not detected. Do you want to install it now?","iespell_desc":"Check Spelling"},advhr:{"delta_height":"","delta_width":"","advhr_desc":"Insert Horizontal Line"},emotions:{"delta_height":"","delta_width":"","emotions_desc":"Emotions"},searchreplace:{"replace_desc":"Find/Replace","delta_width":"","delta_height":"","search_desc":"Find"},advimage:{"delta_width":"","image_desc":"Insert/Edit Image","delta_height":""},advlink:{"delta_height":"","delta_width":"","link_desc":"Insert/Edit Link"},xhtmlxtras:{"attribs_delta_height":"","attribs_delta_width":"","ins_delta_height":"","ins_delta_width":"","del_delta_height":"","del_delta_width":"","acronym_delta_height":"","acronym_delta_width":"","abbr_delta_height":"","abbr_delta_width":"","cite_delta_height":"","cite_delta_width":"","attribs_desc":"Insert/Edit Attributes","ins_desc":"Insertion","del_desc":"Deletion","acronym_desc":"Acronym","abbr_desc":"Abbreviation","cite_desc":"Citation"},style:{"delta_height":"","delta_width":"",desc:"Edit CSS Style"},paste:{"plaintext_mode_stick":"Paste is now in plain text mode. Click again to toggle back to regular paste mode.","plaintext_mode":"Paste is now in plain text mode. Click again to toggle back to regular paste mode. After you paste something you will be returned to regular paste mode.","selectall_desc":"Select All","paste_word_desc":"Paste from Word","paste_text_desc":"Paste as Plain Text"},"paste_dlg":{"word_title":"Use Ctrl+V on your keyboard to paste the text into the window.","text_linebreaks":"Keep Linebreaks","text_title":"Use Ctrl+V on your keyboard to paste the text into the window."},table:{"merge_cells_delta_height":"","merge_cells_delta_width":"","table_delta_height":"","table_delta_width":"","cellprops_delta_height":"","cellprops_delta_width":"","rowprops_delta_height":"","rowprops_delta_width":"",cell:"Cell",col:"Column",row:"Row",del:"Delete Table","copy_row_desc":"Copy Table Row","cut_row_desc":"Cut Table Row","paste_row_after_desc":"Paste Table Row After","paste_row_before_desc":"Paste Table Row Before","props_desc":"Table Properties","cell_desc":"Table Cell Properties","row_desc":"Table Row Properties","merge_cells_desc":"Merge Table Cells","split_cells_desc":"Split Merged Table Cells","delete_col_desc":"Delete Column","col_after_desc":"Insert Column After","col_before_desc":"Insert Column Before","delete_row_desc":"Delete Row","row_after_desc":"Insert Row After","row_before_desc":"Insert Row Before",desc:"Insert/Edit Table"},autosave:{"warning_message":"If you restore the saved content, you will lose all the content that is currently in the editor.\n\nAre you sure you want to restore the saved content?","restore_content":"Restore auto-saved content.","unload_msg":"The changes you made will be lost if you navigate away from this page."},fullscreen:{desc:"Toggle Full Screen Mode"},media:{"delta_height":"","delta_width":"",edit:"Edit Embedded Media",desc:"Insert/Edit Embedded Media"},fullpage:{desc:"Document Properties","delta_width":"","delta_height":""},template:{desc:"Insert Predefined Template Content"},visualchars:{desc:"Show/Hide Visual Control Characters"},spellchecker:{desc:"Toggle Spell Checker",menu:"Spell Checker Settings","ignore_word":"Ignore Word","ignore_words":"Ignore All",langs:"Languages",wait:"Please wait...",sug:"Suggestions","no_sug":"No Suggestions","no_mpell":"No misspellings found.","learn_word":"Learn word"},pagebreak:{desc:"Insert Page Break for Printing"},advlist:{types:"Types",def:"Default","lower_alpha":"Lower Alpha","lower_greek":"Lower Greek","lower_roman":"Lower Roman","upper_alpha":"Upper Alpha","upper_roman":"Upper Roman",circle:"Circle",disc:"Disc",square:"Square"},colors:{"333300":"Dark olive","993300":"Burnt orange","000000":"Black","003300":"Dark green","003366":"Dark azure","000080":"Navy Blue","333399":"Indigo","333333":"Very dark gray","800000":"Maroon",FF6600:"Orange","808000":"Olive","008000":"Green","008080":"Teal","0000FF":"Blue","666699":"Grayish blue","808080":"Gray",FF0000:"Red",FF9900:"Amber","99CC00":"Yellow green","339966":"Sea green","33CCCC":"Turquoise","3366FF":"Royal blue","800080":"Purple","999999":"Medium gray",FF00FF:"Magenta",FFCC00:"Gold",FFFF00:"Yellow","00FF00":"Lime","00FFFF":"Aqua","00CCFF":"Sky blue","993366":"Brown",C0C0C0:"Silver",FF99CC:"Pink",FFCC99:"Peach",FFFF99:"Light yellow",CCFFCC:"Pale green",CCFFFF:"Pale cyan","99CCFF":"Light sky blue",CC99FF:"Plum",FFFFFF:"White"},aria:{"rich_text_area":"Rich Text Area"},wordcount:{words:"Words:"},visualblocks:{desc:'Show/hide block elements'}}}); \ No newline at end of file diff --git a/src/Umbraco.Web.UI.Client/lib/tinymce/langs/fi.js b/src/Umbraco.Web.UI.Client/lib/tinymce/langs/fi.js new file mode 100644 index 0000000000..87677bd3ff --- /dev/null +++ b/src/Umbraco.Web.UI.Client/lib/tinymce/langs/fi.js @@ -0,0 +1,219 @@ +tinymce.addI18n('fi',{ +"Cut": "Leikkaa", +"Heading 5": "Otsikko 5", +"Header 2": "Otsikko 2", +"Your browser doesn't support direct access to the clipboard. Please use the Ctrl+X\/C\/V keyboard shortcuts instead.": "Selaimesi ei tue leikep\u00f6yd\u00e4n suoraa k\u00e4ytt\u00e4mist\u00e4. Ole hyv\u00e4 ja k\u00e4yt\u00e4 n\u00e4pp\u00e4imist\u00f6n Ctrl+X\/C\/V n\u00e4pp\u00e4inyhdistelmi\u00e4.", +"Heading 4": "Otsikko 4", +"Div": "Div", +"Heading 2": "Otsikko 2", +"Paste": "Liit\u00e4", +"Close": "Sulje", +"Font Family": "Fontti", +"Pre": "Esimuotoiltu", +"Align right": "Tasaa oikealle", +"New document": "Uusi dokumentti", +"Blockquote": "Lainauslohko", +"Numbered list": "J\u00e4rjestetty lista", +"Heading 1": "Otsikko 1", +"Headings": "Otsikot", +"Increase indent": "Loitonna", +"Formats": "Muotoilut", +"Headers": "Otsikot", +"Select all": "Valitse kaikki", +"Header 3": "Otsikko 3", +"Blocks": "Lohkot", +"Undo": "Peru", +"Strikethrough": "Yliviivaus", +"Bullet list": "J\u00e4rjest\u00e4m\u00e4t\u00f6n lista", +"Header 1": "Otsikko 1", +"Superscript": "Yl\u00e4indeksi", +"Clear formatting": "Poista muotoilu", +"Font Sizes": "Fonttikoko", +"Subscript": "Alaindeksi", +"Header 6": "Otsikko 6", +"Redo": "Tee uudelleen", +"Paragraph": "Kappale", +"Ok": "Ok", +"Bold": "Lihavointi", +"Code": "Koodi", +"Italic": "Kursivointi", +"Align center": "Keskit\u00e4", +"Header 5": "Otsikko 5", +"Heading 6": "Otsikko 6", +"Heading 3": "Otsikko 3", +"Decrease indent": "Sisenn\u00e4", +"Header 4": "Otsikko 4", +"Paste is now in plain text mode. Contents will now be pasted as plain text until you toggle this option off.": "Liitt\u00e4minen on nyt pelk\u00e4n tekstin -tilassa. Sis\u00e4ll\u00f6t liitet\u00e4\u00e4n nyt pelkk\u00e4n\u00e4 tekstin\u00e4, kunnes otat vaihtoehdon pois k\u00e4yt\u00f6st\u00e4.", +"Underline": "Alleviivaus", +"Cancel": "Peruuta", +"Justify": "Tasaa", +"Inline": "Samalla rivill\u00e4", +"Copy": "Kopioi", +"Align left": "Tasaa vasemmalle", +"Visual aids": "Visuaaliset neuvot", +"Lower Greek": "pienet kirjaimet: \u03b1, \u03b2, \u03b3", +"Square": "Neli\u00f6", +"Default": "Oletus", +"Lower Alpha": "pienet kirjaimet: a, b, c", +"Circle": "Pallo", +"Disc": "Ympyr\u00e4", +"Upper Alpha": "isot kirjaimet: A, B, C", +"Upper Roman": "isot kirjaimet: I, II, III", +"Lower Roman": "pienet kirjaimet: i, ii, iii", +"Name": "Nimi", +"Anchor": "Ankkuri", +"You have unsaved changes are you sure you want to navigate away?": "Sinulla on tallentamattomia muutoksia, haluatko varmasti siirty\u00e4 toiselle sivulle?", +"Restore last draft": "Palauta aiempi luonnos", +"Special character": "Erikoismerkki", +"Source code": "L\u00e4hdekoodi", +"B": "B", +"R": "R", +"G": "G", +"Color": "V\u00e4ri", +"Right to left": "Oikealta vasemmalle", +"Left to right": "Vasemmalta oikealle", +"Emoticons": "Hymi\u00f6t", +"Robots": "Robotit", +"Document properties": "Dokumentin ominaisuudet", +"Title": "Otsikko", +"Keywords": "Avainsanat", +"Encoding": "Merkist\u00f6", +"Description": "Kuvaus", +"Author": "Tekij\u00e4", +"Fullscreen": "Koko ruutu", +"Horizontal line": "Vaakasuora viiva", +"Horizontal space": "Horisontaalinen tila", +"Insert\/edit image": "Lis\u00e4\u00e4\/muokkaa kuva", +"General": "Yleiset", +"Advanced": "Lis\u00e4asetukset", +"Source": "L\u00e4hde", +"Border": "Reunus", +"Constrain proportions": "S\u00e4ilyt\u00e4 mittasuhteet", +"Vertical space": "Vertikaalinen tila", +"Image description": "Kuvaus", +"Style": "Tyyli", +"Dimensions": "Mittasuhteet", +"Insert image": "Lis\u00e4\u00e4 kuva", +"Zoom in": "L\u00e4henn\u00e4", +"Contrast": "Kontrasti", +"Back": "Takaisin", +"Gamma": "Gamma", +"Flip horizontally": "K\u00e4\u00e4nn\u00e4 vaakasuunnassa", +"Resize": "Kuvan koon muutos", +"Sharpen": "Ter\u00e4vyys", +"Zoom out": "Loitonna", +"Image options": "Kuvan asetukset", +"Apply": "Aseta", +"Brightness": "Kirkkaus", +"Rotate clockwise": "Kierr\u00e4 my\u00f6t\u00e4p\u00e4iv\u00e4\u00e4n", +"Rotate counterclockwise": "Kierr\u00e4 vastap\u00e4iv\u00e4\u00e4n", +"Edit image": "Muokkaa kuvaa", +"Color levels": "V\u00e4ritasot", +"Crop": "Rajaa valintaan", +"Orientation": "Suunta", +"Flip vertically": "K\u00e4\u00e4nn\u00e4 pystysuunnassa", +"Invert": "K\u00e4\u00e4nteinen", +"Insert date\/time": "Lis\u00e4\u00e4 p\u00e4iv\u00e4m\u00e4\u00e4r\u00e4 tai aika", +"Remove link": "Poista linkki", +"Url": "Osoite", +"Text to display": "N\u00e4ytett\u00e4v\u00e4 teksti", +"Anchors": "Ankkurit", +"Insert link": "Lis\u00e4\u00e4 linkki", +"New window": "Uusi ikkuna", +"None": "Ei mit\u00e4\u00e4n", +"The URL you entered seems to be an external link. Do you want to add the required http:\/\/ prefix?": "Antamasi osoite n\u00e4ytt\u00e4\u00e4 olevan ulkoinen linkki. Haluatko lis\u00e4t\u00e4 osoitteeseen vaaditun http:\/\/ -etuliitteen?", +"Target": "Kohde", +"The URL you entered seems to be an email address. Do you want to add the required mailto: prefix?": "Antamasi osoite n\u00e4ytt\u00e4\u00e4 olevan s\u00e4hk\u00f6postiosoite. Haluatko lis\u00e4t\u00e4 osoitteeseen vaaditun mailto: -etuliitteen?", +"Insert\/edit link": "Lis\u00e4\u00e4\/muokkaa linkki", +"Insert\/edit video": "Lis\u00e4\u00e4\/muokkaa video", +"Poster": "L\u00e4hett\u00e4j\u00e4", +"Alternative source": "Vaihtoehtoinen l\u00e4hde", +"Paste your embed code below:": "Liit\u00e4 upotuskoodisi alapuolelle:", +"Insert video": "Lis\u00e4\u00e4 video", +"Embed": "Upota", +"Nonbreaking space": "Sitova v\u00e4lily\u00f6nti", +"Page break": "Sivunvaihto", +"Paste as text": "Liit\u00e4 tekstin\u00e4", +"Preview": "Esikatselu", +"Print": "Tulosta", +"Save": "Tallenna", +"Could not find the specified string.": "Haettua merkkijonoa ei l\u00f6ytynyt.", +"Replace": "Korvaa", +"Next": "Seur.", +"Whole words": "Koko sanat", +"Find and replace": "Etsi ja korvaa", +"Replace with": "Korvaa", +"Find": "Etsi", +"Replace all": "Korvaa kaikki", +"Match case": "Erota isot ja pienet kirjaimet", +"Prev": "Edel.", +"Spellcheck": "Oikolue", +"Finish": "Lopeta", +"Ignore all": "\u00c4l\u00e4 huomioi mit\u00e4\u00e4n", +"Ignore": "\u00c4l\u00e4 huomioi", +"Add to Dictionary": "Lis\u00e4\u00e4 sanakirjaan", +"Insert row before": "Lis\u00e4\u00e4 rivi ennen", +"Rows": "Rivit", +"Height": "Korkeus", +"Paste row after": "Liit\u00e4 rivi j\u00e4lkeen", +"Alignment": "Tasaus", +"Border color": "Reunuksen v\u00e4ri", +"Column group": "Sarakeryhm\u00e4", +"Row": "Rivi", +"Insert column before": "Lis\u00e4\u00e4 rivi ennen", +"Split cell": "Jaa solu", +"Cell padding": "Solun tyhj\u00e4 tila", +"Cell spacing": "Solun v\u00e4li", +"Row type": "Rivityyppi", +"Insert table": "Lis\u00e4\u00e4 taulukko", +"Body": "Runko", +"Caption": "Seloste", +"Footer": "Alaosa", +"Delete row": "Poista rivi", +"Paste row before": "Liit\u00e4 rivi ennen", +"Scope": "Laajuus", +"Delete table": "Poista taulukko", +"H Align": "H tasaus", +"Top": "Yl\u00e4reuna", +"Header cell": "Otsikkosolu", +"Column": "Sarake", +"Row group": "Riviryhm\u00e4", +"Cell": "Solu", +"Middle": "Keskikohta", +"Cell type": "Solun tyyppi", +"Copy row": "Kopioi rivi", +"Row properties": "Rivin ominaisuudet", +"Table properties": "Taulukon ominaisuudet", +"Bottom": "Alareuna", +"V Align": "V tasaus", +"Header": "Otsikko", +"Right": "Oikea", +"Insert column after": "Lis\u00e4\u00e4 rivi j\u00e4lkeen", +"Cols": "Sarakkeet", +"Insert row after": "Lis\u00e4\u00e4 rivi j\u00e4lkeen", +"Width": "Leveys", +"Cell properties": "Solun ominaisuudet", +"Left": "Vasen", +"Cut row": "Leikkaa rivi", +"Delete column": "Poista sarake", +"Center": "Keskell\u00e4", +"Merge cells": "Yhdist\u00e4 solut", +"Insert template": "Lis\u00e4\u00e4 pohja", +"Templates": "Pohjat", +"Background color": "Taustan v\u00e4ri", +"Custom...": "Mukauta...", +"Custom color": "Mukautettu v\u00e4ri", +"No color": "Ei v\u00e4ri\u00e4", +"Text color": "Tekstin v\u00e4ri", +"Show blocks": "N\u00e4yt\u00e4 lohkot", +"Show invisible characters": "N\u00e4yt\u00e4 n\u00e4kym\u00e4tt\u00f6m\u00e4t merkit", +"Words: {0}": "Sanat: {0}", +"Insert": "Lis\u00e4\u00e4", +"File": "Tiedosto", +"Edit": "Muokkaa", +"Rich Text Area. Press ALT-F9 for menu. Press ALT-F10 for toolbar. Press ALT-0 for help": "Rikastetun tekstin alue. Paina ALT-F9 valikkoon. Paina ALT-F10 ty\u00f6kaluriviin. Paina ALT-0 ohjeeseen.", +"Tools": "Ty\u00f6kalut", +"View": "N\u00e4yt\u00e4", +"Table": "Taulukko", +"Format": "Muotoilu" +}); \ No newline at end of file diff --git a/src/Umbraco.Web.UI.Client/lib/tinymce/langs/fr.js b/src/Umbraco.Web.UI.Client/lib/tinymce/langs/fr.js new file mode 100644 index 0000000000..b9cfd8b515 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/lib/tinymce/langs/fr.js @@ -0,0 +1 @@ +tinyMCE.addI18n({fr:{common:{"more_colors":"Plus de couleurs","invalid_data":"Erreur : saisie de valeurs incorrectes. Elles sont mises en \u00e9vidence en rouge.","popup_blocked":"D\u00e9sol\u00e9, nous avons d\u00e9tect\u00e9 que votre bloqueur de popup a bloqu\u00e9 une fen\u00eatre dont l\'application a besoin. Vous devez d\u00e9sactiver votre bloqueur de popup pour pouvoir utiliser cet outil.","clipboard_no_support":"Actuellement non support\u00e9 par votre navigateur.\n Veuillez utiliser les raccourcis clavier \u00e0 la place.","clipboard_msg":"Les fonctions Copier/Couper/Coller ne sont pas valables sur Mozilla et Firefox.\nSouhaitez-vous avoir plus d\'informations sur ce sujet ?","not_set":"-- non d\u00e9fini --","class_name":"Classe",browse:"parcourir",close:"Fermer",cancel:"Annuler",update:"Mettre \u00e0 jour",insert:"Ins\u00e9rer",apply:"Appliquer","edit_confirm":"Souhaitez-vous utiliser le mode WYSIWYG pour cette zone de texte ?","invalid_data_number":"{#field} doit \u00eatre un nombre","invalid_data_min":"{#field} doit \u00eatre un nombre plus grand que {#min}","invalid_data_size":"{#field} doit \u00eatre un nombre ou un pourcentage",value:"(valeur)"},contextmenu:{full:"Justifi\u00e9",right:"Droite",center:"Centr\u00e9",left:"Gauche",align:"Alignement"},insertdatetime:{"day_short":"Dim,Lun,Mar,Mer,Jeu,Ven,Sam,Dim","day_long":"Dimanche,Lundi,Mardi,Mercredi,Jeudi,Vendredi,Samedi,Dimanche","months_short":"Jan,F\u00e9v,Mar,Avr,Mai,Juin,Juil,Ao\u00fbt,Sep,Oct,Nov,D\u00e9c","months_long":"Janvier,F\u00e9vrier,Mars,Avril,Mai,Juin,Juillet,Ao\u00fbt,Septembre,Octobre,Novembre,D\u00e9cembre","inserttime_desc":"Ins\u00e9rer l\'heure","insertdate_desc":"Ins\u00e9rer la date","time_fmt":"%H:%M:%S","date_fmt":"%d-%m-%Y"},print:{"print_desc":"Imprimer"},preview:{"preview_desc":"Pr\u00e9visualiser"},directionality:{"rtl_desc":"\u00c9criture de droite \u00e0 gauche","ltr_desc":"\u00c9criture de gauche \u00e0 droite"},layer:{content:"Nouvelle couche\u2026","absolute_desc":"Activer le positionnement absolu","backward_desc":"D\u00e9placer vers l\'arri\u00e8re","forward_desc":"D\u00e9placer vers l\'avant","insertlayer_desc":"Ins\u00e9rer une nouvelle couche"},save:{"save_desc":"Enregistrer","cancel_desc":"Annuler toutes les modifications"},nonbreaking:{"nonbreaking_desc":"Ins\u00e9rer une espace ins\u00e9cable"},iespell:{download:"ieSpell n\'est pas install\u00e9. Souhaitez-vous l\'installer maintenant ?","iespell_desc":"Lancer le v\u00e9rificateur d\'orthographe"},advhr:{"delta_height":"Ecart de hauteur","delta_width":"Ecart de largeur","advhr_desc":"Ins\u00e9rer un trait horizontal"},emotions:{"delta_height":"delta_height","delta_width":"delta_width","emotions_desc":"\u00c9motic\u00f4nes"},searchreplace:{"replace_desc":"Rechercher / remplacer","search_desc":"Rechercher","delta_width":"","delta_height":""},advimage:{"image_desc":"Ins\u00e9rer / \u00e9diter une image","delta_width":"","delta_height":""},advlink:{"link_desc":"Ins\u00e9rer / \u00e9diter un lien","delta_height":"","delta_width":""},xhtmlxtras:{"attribs_desc":"Ins\u00e9rer / \u00e9diter les attributs","ins_desc":"Ins\u00e9r\u00e9","del_desc":"Barr\u00e9","acronym_desc":"Acronyme","abbr_desc":"Abr\u00e9viation","cite_desc":"Citation","attribs_delta_height":"","attribs_delta_width":"","ins_delta_height":"","ins_delta_width":"","del_delta_height":"","del_delta_width":"","acronym_delta_height":"","acronym_delta_width":"","abbr_delta_height":"","abbr_delta_width":"","cite_delta_height":"","cite_delta_width":""},style:{desc:"\u00c9diter la feuille de style (CSS)","delta_height":"","delta_width":""},paste:{"plaintext_mode":"Le collage est actuellement en mode texte non format\u00e9. Cliquez \u00e0 nouveau pour revenir en mode de collage ordinaire.","plaintext_mode_sticky":"Le collage est actuellement en mode texte non format\u00e9. Cliquez \u00e0 nouveau pour revenir en mode de collage ordinaire. Apr\u00e8s avoir coll\u00e9 quelque chose, vous retournerez en mode de collage ordinaire.","selectall_desc":"Tout s\u00e9lectionner","paste_word_desc":"Coller un texte cr\u00e9\u00e9 sous Word","paste_text_desc":"Coller comme texte brut"},"paste_dlg":{"word_title":"Utilisez CTRL+V sur votre clavier pour coller le texte dans la fen\u00eatre.","text_linebreaks":"Conserver les retours \u00e0 la ligne","text_title":"Utilisez CTRL+V sur votre clavier pour coller le texte dans la fen\u00eatre."},table:{cell:"Cellule",col:"Colonne",row:"Ligne",del:"Effacer le tableau","copy_row_desc":"Copier la ligne","cut_row_desc":"Couper la ligne","paste_row_after_desc":"Coller la ligne apr\u00e8s","paste_row_before_desc":"Coller la ligne avant","props_desc":"Propri\u00e9t\u00e9s du tableau","cell_desc":"Propri\u00e9t\u00e9s de la cellule","row_desc":"Propri\u00e9t\u00e9s de la ligne","merge_cells_desc":"Fusionner les cellules","split_cells_desc":"Scinder les cellules fusionn\u00e9es","delete_col_desc":"Effacer la colonne","col_after_desc":"Ins\u00e9rer une colonne apr\u00e8s","col_before_desc":"Ins\u00e9rer une colonne avant","delete_row_desc":"Effacer la ligne","row_after_desc":"Ins\u00e9rer une ligne apr\u00e8s","row_before_desc":"Ins\u00e9rer une ligne avant",desc:"Ins\u00e9rer un nouveau tableau","merge_cells_delta_height":"","merge_cells_delta_width":"","table_delta_height":"","table_delta_width":"","cellprops_delta_height":"","cellprops_delta_width":"","rowprops_delta_height":"","rowprops_delta_width":""},autosave:{"warning_message":"Si vous restaurez le contenu sauv\u00e9, vous perdrez le contenu qui est actuellement dans l\'\u00e9diteur.\n\n\u00cates-vous s\u00fbr de vouloir restaurer le contenu sauv\u00e9 ?","restore_content":"Restaurer le contenu auto-sauvegard\u00e9.","unload_msg":"Les modifications apport\u00e9es seront perdues si vous quittez cette page."},fullscreen:{desc:"Passer en mode plein \u00e9cran"},media:{edit:"\u00c9diter un m\u00e9dia incorpor\u00e9",desc:"Ins\u00e9rer / \u00e9diter un m\u00e9dia incorpor\u00e9","delta_height":"","delta_width":""},fullpage:{desc:"Propri\u00e9t\u00e9s du document","delta_width":"","delta_height":""},template:{desc:"Ins\u00e9rer un mod\u00e8le pr\u00e9d\u00e9fini."},visualchars:{desc:"Activer les caract\u00e8res de mise en page."},spellchecker:{desc:"Activer le v\u00e9rificateur d\'orthographe",menu:"Param\u00e8tres du v\u00e9rificateur d\'orthographe","ignore_word":"Ignorer le mot","ignore_words":"Tout ignorer",langs:"Langues",wait:"Veuillez patienter\u2026",sug:"Suggestions","no_sug":"Aucune suggestion","no_mpell":"Aucune erreur trouv\u00e9e.","learn_word":"Apprendre le mot"},pagebreak:{desc:"Ins\u00e9rer un saut de page."},advlist:{types:"Types",def:"D\u00e9faut","lower_alpha":"Alpha minuscule","lower_greek":"Grec minuscule","lower_roman":"Romain minuscule","upper_alpha":"Alpha majuscule","upper_roman":"Romain majuscule",circle:"Cercle",disc:"Disque",square:"Carr\u00e9"},colors:{"333300":"Olive fonc\u00e9","993300":"Orange br\u00fbl\u00e9","000000":"Noir","003300":"Vert fonc\u00e9","003366":"Azur fonc\u00e9","000080":"Bleu marine","333399":"Indigo","333333":"Gris tr\u00e8s fonc\u00e9","800000":"Bordeaux",FF6600:"Orange","808000":"Olive","008000":"Vert","008080":"Sarcelle","0000FF":"Bleu","666699":"Bleu gris\u00e2tre","808080":"Gris",FF0000:"Rouge",FF9900:"Ambre","99CC00":"Jaune vert","339966":"Mer verte","33CCCC":"Turquoise","3366FF":"Bleu royal","800080":"Violet","999999":"Gris moyen",FF00FF:"Magenta",FFCC00:"Or",FFFF00:"Jaune","00FF00":"Lime","00FFFF":"Bleu vert","00CCFF":"Bleu ciel","993366":"Brun",C0C0C0:"Argent",FF99CC:"Rose",FFCC99:"P\u00eache",FFFF99:"Jaune clair",CCFFCC:"Vert p\u00e2le",CCFFFF:"Cyan p\u00e2le","99CCFF":"Bleu ciel clair",CC99FF:"Prune",FFFFFF:"Blanc"},aria:{"rich_text_area":"Texte riche"},wordcount:{words:"Mots:"}}}); \ No newline at end of file diff --git a/src/Umbraco.Web.UI.Client/lib/tinymce/langs/he.js b/src/Umbraco.Web.UI.Client/lib/tinymce/langs/he.js new file mode 100644 index 0000000000..0f4e12d7b5 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/lib/tinymce/langs/he.js @@ -0,0 +1 @@ +tinyMCE.addI18n({he:{common:{"more_colors":"\u05e2\u05d5\u05d3 \u05e6\u05d1\u05e2\u05d9\u05dd","invalid_data":"\u05e9\u05d2\u05d9\u05d0\u05d4: \u05d4\u05d5\u05e7\u05dc\u05d3 \u05de\u05d9\u05d3\u05e2 \u05dc\u05d0 \u05ea\u05e7\u05e0\u05d9. \u05d4\u05de\u05d9\u05d3\u05e2 \u05e1\u05d5\u05de\u05df \u05d1\u05d0\u05d3\u05d5\u05dd.","popup_blocked":"\u05d7\u05d5\u05e1\u05dd \u05e4\u05e8\u05d9\u05d8\u05d9\u05dd \u05de\u05d5\u05e7\u05e4\u05e6\u05d9\u05dd \u05de\u05e0\u05e2 \u05de\u05d7\u05dc\u05d5\u05df \u05d7\u05e9\u05d5\u05d1 \u05de\u05dc\u05d4\u05e4\u05ea\u05d7,\u05d0\u05dd \u05d1\u05e8\u05e6\u05d5\u05e0\u05da \u05dc\u05d4\u05e9\u05ea\u05de\u05e9 \u05d1\u05db\u05dc\u05d9 \u05d6\u05d4 \u05e2\u05dc\u05d9\u05da \u05dc\u05d1\u05d8\u05dc \u05d0\u05ea \u05d7\u05d5\u05e1\u05dd \u05d4\u05e4\u05e8\u05d9\u05d8\u05d9\u05dd","clipboard_no_support":"\u05db\u05e8\u05d2\u05e2 \u05dc\u05d0 \u05e0\u05ea\u05de\u05da \u05e2\u05dc \u05d9\u05d3\u05d9 \u05d4\u05d3\u05e4\u05d3\u05e4\u05df \u05e9\u05dc\u05da. \u05d4\u05e9\u05ea\u05de\u05e9 \u05d1\u05e7\u05d9\u05e6\u05d5\u05e8\u05d9 \u05d4\u05de\u05e7\u05dc\u05d3\u05ea.","clipboard_msg":"\n \u05d4\u05e2\u05ea\u05e7\u05d4/\u05d2\u05d6\u05d9\u05e8\u05d4 \u05d5\u05d4\u05d3\u05d1\u05e7\u05d4 \u05d0\u05d9\u05e0\u05dd \u05d6\u05de\u05d9\u05e0\u05d9\u05dd \u05d1 Mozilla \u05d5\u05d1-Firefox.\n \u05d4\u05d0\u05dd \u05d1\u05e8\u05e6\u05d5\u05e0\u05da \u05dc\u05e7\u05d1\u05dc \u05de\u05d9\u05d3\u05e2 \u05e0\u05d5\u05e1\u05e3 \u05e2\u05dc \u05d4\u05e0\u05d5\u05e9\u05d0?\n ","not_set":"-- \u05dc\u05d0 \u05d4\u05d5\u05d2\u05d3\u05e8 --","class_name":"\u05de\u05d7\u05dc\u05e7\u05d4",browse:"\u05e2\u05d9\u05d5\u05df",close:"\u05e1\u05d2\u05d9\u05e8\u05d4",cancel:"\u05d1\u05d9\u05d8\u05d5\u05dc",update:"\u05e2\u05d3\u05db\u05d5\u05df",insert:"\u05d4\u05d5\u05e1\u05e4\u05d4",apply:"\u05d0\u05d9\u05e9\u05d5\u05e8","edit_confirm":"\u05d1\u05e8\u05e6\u05d5\u05e0\u05da \u05dc\u05d4\u05e9\u05ea\u05de\u05e9 \u05d1\u05e2\u05d5\u05e8\u05da \u05d4\u05de\u05ea\u05e7\u05d3\u05dd?","invalid_data_number":"{#field} \u05d7\u05d9\u05d9\u05d1 \u05dc\u05d4\u05d9\u05d5\u05ea \u05de\u05e1\u05e4\u05e8","invalid_data_min":"{#field} \u05d4\u05de\u05e1\u05e4\u05e8 \u05d7\u05d9\u05d9\u05d1 \u05dc\u05d4\u05d9\u05d5\u05ea \u05d2\u05d3\u05d5\u05dc \u05de-{#min}","invalid_data_size":"{#field} \u05d4\u05e2\u05e8\u05da \u05d7\u05d9\u05d9\u05d1 \u05dc\u05d4\u05d9\u05d5\u05ea \u05de\u05e1\u05e4\u05e8 \u05d0\u05d5 \u05d0\u05d7\u05d5\u05d6",value:"(\u05e2\u05e8\u05da)"},contextmenu:{full:"\u05e9\u05e0\u05d9 \u05d4\u05e6\u05d3\u05d3\u05d9\u05dd",right:"\u05d9\u05de\u05d9\u05df",center:"\u05d0\u05de\u05e6\u05e2",left:"\u05e9\u05de\u05d0\u05dc",align:"\u05d9\u05d9\u05e9\u05d5\u05e8"},insertdatetime:{"day_short":"\u05d9\u05d5\u05dd \u05d0\',\u05d9\u05d5\u05dd \u05d1\',\u05d9\u05d5\u05dd \u05d2\',\u05d9\u05d5\u05dd \u05d3\',\u05d9\u05d5\u05dd \u05d4\',\u05d9\u05d5\u05dd \u05d5\',\u05e9\u05d1\u05ea,\u05d9\u05d5\u05dd \u05d0\'","day_long":"\u05d9\u05d5\u05dd \u05e8\u05d0\u05e9\u05d5\u05df,\u05d9\u05d5\u05dd \u05e9\u05e0\u05d9,\u05d9\u05d5\u05dd \u05e9\u05dc\u05d9\u05e9\u05d9,\u05d9\u05d5\u05dd \u05e8\u05d1\u05d9\u05e2\u05d9,\u05d9\u05d5\u05dd \u05d7\u05de\u05d9\u05e9\u05d9,\u05d9\u05d5\u05dd \u05e9\u05d9\u05e9,\u05d9\u05d5\u05dd \u05e9\u05d1\u05ea,\u05d9\u05d5\u05dd \u05e8\u05d0\u05e9\u05d5\u05df","months_short":"\u05d9\u05e0\u05d5\u05d0\u05e8,\u05e4\u05d1\u05e8\u05d5\u05d0\u05e8,\u05de\u05e8\u05e5,\u05d0\u05e4\u05e8\u05d9\u05dc,\u05de\u05d0\u05d9,\u05d9\u05d5\u05e0\u05e2,\u05d9\u05d5\u05dc\u05d9,\u05d0\u05d5\u05d2\u05d5\u05e1\u05d8,\u05e1\u05e4\u05d8\u05de\u05d1\u05e8,\u05d0\u05d5\u05e7\u05d8\u05d5\u05d1\u05e8,\u05e0\u05d5\u05d1\u05de\u05d1\u05e8,\u05d3\u05e6\u05de\u05d1\u05e8","months_long":"\u05d9\u05e0\u05d5\u05d0\u05e8,\u05e4\u05d1\u05e8\u05d5\u05d0\u05e8,\u05de\u05e8\u05e5,\u05d0\u05e4\u05e8\u05d9\u05dc,\u05de\u05d0\u05d9,\u05d9\u05d5\u05e0\u05e2,\u05d9\u05d5\u05dc\u05d9,\u05d0\u05d5\u05d2\u05d5\u05e1\u05d8,\u05e1\u05e4\u05d8\u05de\u05d1\u05e8,\u05d0\u05d5\u05e7\u05d8\u05d5\u05d1\u05e8,\u05e0\u05d5\u05d1\u05de\u05d1\u05e8,\u05d3\u05e6\u05de\u05d1\u05e8","inserttime_desc":"\u05d4\u05d5\u05e1\u05e4\u05ea \u05d6\u05de\u05df","insertdate_desc":"\u05d4\u05d5\u05e1\u05e4\u05ea \u05ea\u05d0\u05e8\u05d9\u05da","time_fmt":"%H:%M:%S","date_fmt":"%d-%m-%Y"},print:{"print_desc":"\u05d4\u05d3\u05e4\u05e1\u05d4"},preview:{"preview_desc":"\u05ea\u05e6\u05d5\u05d2\u05d4 \u05de\u05e7\u05d3\u05d9\u05de\u05d4"},directionality:{"rtl_desc":"\u05db\u05d9\u05d5\u05d5\u05df \u05d8\u05e7\u05e1\u05d8 \u05de\u05d9\u05de\u05d9\u05df \u05dc\u05e9\u05de\u05d0\u05dc","ltr_desc":"\u05db\u05d9\u05d5\u05d5\u05df \u05d8\u05e7\u05e1\u05d8 \u05de\u05e9\u05de\u05d0\u05dc \u05dc\u05d9\u05de\u05d9\u05df"},layer:{content:"\u05e9\u05db\u05d1\u05d4 \u05d7\u05d3\u05e9\u05d4...","absolute_desc":"\u05d1\u05d7\u05d9\u05e8\u05ea \u05de\u05d9\u05e7\u05d5\u05dd \u05de\u05d5\u05d7\u05dc\u05d8","backward_desc":"\u05d4\u05e2\u05d1\u05e8\u05d4 \u05d0\u05d7\u05d5\u05e8\u05d4","forward_desc":"\u05d4\u05e2\u05d1\u05e8\u05d4 \u05e7\u05d3\u05d9\u05de\u05d4","insertlayer_desc":"\u05d4\u05d5\u05e1\u05e4\u05ea \u05e9\u05db\u05d1\u05d4 \u05d7\u05d3\u05e9\u05d4"},save:{"save_desc":"\u05e9\u05de\u05d9\u05e8\u05d4","cancel_desc":"\u05d1\u05d9\u05d8\u05d5\u05dc \u05db\u05dc \u05d4\u05e9\u05d9\u05e0\u05d5\u05d9\u05dd"},nonbreaking:{"nonbreaking_desc":"\u05d4\u05d5\u05e1\u05e4\u05ea \u05e8\u05d5\u05d5\u05d7"},iespell:{download:" \u05dc\u05d0 \u05e0\u05de\u05e6\u05d0 ieSpell. \u05d4\u05d0\u05dd \u05d1\u05e8\u05e6\u05d5\u05e0\u05da \u05dc\u05d4\u05ea\u05e7\u05d9\u05df?","iespell_desc":"\u05d1\u05d3\u05d9\u05e7\u05ea \u05d0\u05d9\u05d5\u05ea \u05d1\u05d0\u05e0\u05d2\u05dc\u05d9\u05ea"},advhr:{"advhr_desc":"\u05e7\u05d5 \u05d0\u05d5\u05e4\u05e7\u05d9","delta_height":"","delta_width":""},emotions:{"emotions_desc":"\u05e1\u05de\u05d9\u05d9\u05dc\u05d9\u05dd","delta_height":"","delta_width":""},searchreplace:{"replace_desc":"\u05d4\u05d7\u05dc\u05e4\u05d4","search_desc":"\u05d7\u05d9\u05e4\u05d5\u05e9","delta_width":"","delta_height":""},advimage:{"image_desc":"\u05d4\u05d5\u05e1\u05e4\u05d4/\u05e2\u05e8\u05d9\u05db\u05ea \u05ea\u05de\u05d5\u05e0\u05d4","delta_width":"","delta_height":""},advlink:{"link_desc":"\u05d4\u05d5\u05e1\u05e4\u05ea/\u05e2\u05e8\u05d9\u05db\u05ea \u05e7\u05d9\u05e9\u05d5\u05e8","delta_height":"","delta_width":""},xhtmlxtras:{"attribs_desc":"\u05d4\u05db\u05e0\u05e1/\u05e2\u05e8\u05d5\u05da \u05ea\u05db\u05d5\u05e0\u05d5\u05ea","ins_desc":"\u05d4\u05db\u05e0\u05e1\u05d4","del_desc":"\u05de\u05d7\u05d9\u05e7\u05d4","acronym_desc":"\u05e8\u05d0\u05e9\u05d9 \u05ea\u05d9\u05d1\u05d5\u05ea","abbr_desc":"\u05e7\u05d9\u05e6\u05d5\u05e8","cite_desc":"\u05e6\u05d9\u05d8\u05d5\u05d8","attribs_delta_height":"","attribs_delta_width":"","ins_delta_height":"","ins_delta_width":"","del_delta_height":"","del_delta_width":"","acronym_delta_height":"","acronym_delta_width":"","abbr_delta_height":"","abbr_delta_width":"","cite_delta_height":"","cite_delta_width":""},style:{desc:"\u05e2\u05d3\u05db\u05d5\u05df \u05d4\u05d2\u05d3\u05e8\u05d5\u05ea CSS","delta_height":"","delta_width":""},paste:{"plaintext_mode":"Paste is now in plain text mode. Click again to toggle back to regular paste mode.","plaintext_mode_sticky":"Paste is now in plain text mode. Click again to toggle back to regular paste mode. After you paste something you will be returned to regular paste mode.","selectall_desc":"\u05d1\u05d7\u05e8 \u05d4\u05db\u05dc","paste_word_desc":"\u05d4\u05d3\u05d1\u05e7\u05d4 \u05de-WORD","paste_text_desc":"\u05d4\u05d3\u05d1\u05e7\u05d4 \u05db\u05d8\u05e7\u05e1\u05d8 \u05d1\u05dc\u05d1\u05d3"},"paste_dlg":{"word_title":"\u05d4\u05d3\u05d1\u05d9\u05e7\u05d5 \u05d1\u05d7\u05dc\u05d5\u05df \u05d6\u05d4 \u05d0\u05ea \u05d4\u05d8\u05e7\u05e1\u05d8 \u05d1\u05d0\u05de\u05e6\u05e2\u05d5\u05ea \u05d4\u05de\u05e7\u05e9\u05d9\u05dd CTRL+V.","text_linebreaks":"\u05d4\u05e9\u05d0\u05e8 \u05d0\u05ea \u05e9\u05d5\u05e8\u05d5\u05ea \u05d4\u05e8\u05d5\u05d5\u05d7","text_title":"\u05d4\u05d3\u05d1\u05d9\u05e7\u05d5 \u05d1\u05d7\u05dc\u05d5\u05df \u05d6\u05d4 \u05d0\u05ea \u05d4\u05d8\u05e7\u05e1\u05d8 \u05d1\u05d0\u05de\u05e6\u05e2\u05d5\u05ea \u05d4\u05de\u05e7\u05e9\u05d9\u05dd CTRL+V."},table:{cell:"\u05ea\u05d0",col:"\u05e2\u05de\u05d5\u05d3\u05d4",row:"\u05e9\u05d5\u05e8\u05d4",del:"\u05de\u05d7\u05d9\u05e7\u05ea \u05d8\u05d1\u05dc\u05d4","copy_row_desc":"\u05d4\u05e2\u05ea\u05e7\u05ea \u05e9\u05d5\u05e8\u05d4 \u05d1\u05d8\u05d1\u05dc\u05d4","cut_row_desc":"\u05d2\u05d6\u05d9\u05e8\u05ea \u05e9\u05d5\u05e8\u05d4 \u05d1\u05d8\u05d1\u05dc\u05d4","paste_row_after_desc":"\u05d4\u05d3\u05d1\u05e7\u05ea \u05e9\u05d5\u05e8\u05d4 \u05d1\u05d8\u05d1\u05dc\u05d4 \u05d0\u05d7\u05e8\u05d9","paste_row_before_desc":"\u05d4\u05d3\u05d1\u05e7\u05ea \u05e9\u05d5\u05e8\u05d4 \u05d1\u05d8\u05d1\u05dc\u05d4 \u05dc\u05e4\u05e0\u05d9","props_desc":"\u05ea\u05db\u05d5\u05e0\u05d5\u05ea \u05d4\u05d8\u05d1\u05dc\u05d4","cell_desc":"\u05ea\u05db\u05d5\u05e0\u05d5\u05ea \u05ea\u05d0 \u05d1\u05d8\u05d1\u05dc\u05d4","row_desc":"\u05ea\u05db\u05d5\u05e0\u05d5\u05ea \u05e9\u05d5\u05e8\u05d4 \u05d1\u05d8\u05d1\u05dc\u05d4","merge_cells_desc":"\u05d0\u05d9\u05d7\u05d5\u05d3 \u05ea\u05d0\u05d9\u05dd \u05d1\u05d8\u05d1\u05dc\u05d4","split_cells_desc":"\u05e4\u05d9\u05e6\u05d5\u05dc \u05ea\u05d0\u05d9\u05dd \u05d1\u05d8\u05d1\u05dc\u05d4","delete_col_desc":"\u05d4\u05e1\u05e8\u05ea \u05e2\u05de\u05d5\u05d3\u05d4","col_after_desc":"\u05d4\u05db\u05e0\u05e1\u05ea \u05e2\u05de\u05d5\u05d3\u05d4 \u05de\u05e9\u05de\u05d0\u05dc","col_before_desc":"\u05d4\u05db\u05e0\u05e1\u05ea \u05e2\u05de\u05d5\u05d3\u05d4 \u05de\u05d9\u05de\u05d9\u05df","delete_row_desc":"\u05de\u05d7\u05d9\u05e7\u05ea \u05e9\u05d5\u05e8\u05d4","row_after_desc":"\u05d4\u05db\u05e0\u05e1\u05ea \u05e9\u05d5\u05e8\u05d4 \u05de\u05ea\u05d7\u05ea","row_before_desc":"\u05d4\u05db\u05e0\u05e1\u05ea \u05e9\u05d5\u05e8\u05d4 \u05de\u05e2\u05dc",desc:"\u05d4\u05db\u05e0\u05e1\u05ea \u05d0\u05d5 \u05e2\u05e8\u05d9\u05db\u05ea \u05d8\u05d1\u05dc\u05d4","merge_cells_delta_height":"","merge_cells_delta_width":"","table_delta_height":"","table_delta_width":"","cellprops_delta_height":"","cellprops_delta_width":"","rowprops_delta_height":"","rowprops_delta_width":""},autosave:{"warning_message":"\u05d0\u05dd \u05ea\u05e9\u05d7\u05d6\u05e8 \u05d0\u05ea \u05d4\u05ea\u05d5\u05db\u05df \u05dc\u05d2\u05e8\u05d9\u05e1\u05d0 \u05d4\u05e9\u05de\u05d5\u05e8\u05d4, \u05ea\u05d0\u05d1\u05d3 \u05d0\u05ea \u05db\u05dc \u05d4\u05ea\u05d5\u05db\u05df \u05e9\u05e0\u05de\u05e6\u05d0 \u05db\u05e2\u05ea \u05d1\u05e2\u05d5\u05e8\u05da. \u05d4\u05d0\u05dd \u05d0\u05ea\u05d4 \u05d1\u05d8\u05d5\u05d7 \u05e9\u05d0\u05ea\u05d4 \u05e8\u05d5\u05e6\u05d4 \u05dc\u05e9\u05d7\u05d6\u05e8 \u05d0\u05ea \u05d4\u05ea\u05d5\u05db\u05df \u05dc\u05d2\u05d9\u05e8\u05e1\u05d0 \u05d4\u05e9\u05de\u05d5\u05e8\u05d4?.","restore_content":"\u05e9\u05d7\u05d6\u05d5\u05e8 \u05dc\u05d2\u05d9\u05e8\u05e1\u05d0 \u05e9\u05de\u05d5\u05e8\u05d4 \u05d0\u05d5\u05d8\u05d5\u05de\u05d8\u05d9\u05ea","unload_msg":"\u05d4\u05e9\u05d9\u05e0\u05d5\u05d9\u05d9\u05dd \u05e9\u05d1\u05d9\u05e6\u05e2\u05ea \u05dc\u05d0 \u05d9\u05e9\u05de\u05e8\u05d5 \u05d0\u05dd \u05ea\u05e2\u05d1\u05d5\u05e8 \u05de\u05d3\u05e3 \u05d6\u05d4"},fullscreen:{desc:"\u05de\u05e2\u05d1\u05e8 \u05dc\u05de\u05e1\u05da \u05de\u05dc\u05d0/\u05d7\u05dc\u05e7\u05d9"},media:{edit:"\u05e2\u05e8\u05d9\u05db\u05ea \u05e1\u05e8\u05d8\u05d5\u05df",desc:"\u05d4\u05d5\u05e1\u05e4\u05ea/\u05e2\u05e8\u05d9\u05db\u05ea \u05e1\u05e8\u05d8\u05d5\u05df","delta_height":"","delta_width":""},fullpage:{desc:"\u05de\u05d0\u05e4\u05d9\u05d9\u05e0\u05d9 \u05e2\u05de\u05d5\u05d3","delta_width":"","delta_height":""},template:{desc:"Insert predefined template content"},visualchars:{desc:"\u05d4\u05e6\u05d2/\u05d4\u05e1\u05ea\u05e8 \u05ea\u05d5\u05d5\u05d9 \u05d1\u05e7\u05e8\u05d4"},spellchecker:{desc:"\u05d4\u05e4\u05e2\u05dc\u05ea \u05d1\u05d5\u05d3\u05e7 \u05d0\u05d9\u05d5\u05ea",menu:"\u05d4\u05d2\u05d3\u05e8\u05d5\u05ea \u05d1\u05d5\u05d3\u05e7 \u05d0\u05d9\u05d5\u05ea","ignore_word":"\u05dc\u05d4\u05ea\u05e2\u05dc\u05dd \u05de\u05d4\u05de\u05d9\u05dc\u05d4","ignore_words":"\u05dc\u05d4\u05ea\u05e2\u05dc\u05dd \u05de\u05d4\u05db\u05dc",langs:"\u05e9\u05e4\u05d5\u05ea",wait:"\u05e0\u05d0 \u05dc\u05d4\u05de\u05ea\u05d9\u05df..",sug:"\u05d4\u05e6\u05e2\u05d5\u05ea","no_sug":"\u05d0\u05d9\u05df \u05d4\u05e6\u05e2\u05d5\u05ea","no_mpell":"\u05dc\u05d0 \u05e0\u05de\u05e6\u05d0\u05d5 \u05e9\u05d2\u05d9\u05d0\u05d5\u05ea \u05d0\u05d9\u05d5\u05ea","learn_word":"\u05dc\u05de\u05d3 \u05de\u05d9\u05dc\u05d9\u05dd"},pagebreak:{desc:"\u05d4\u05d5\u05e1\u05e4\u05ea \u05de\u05e2\u05d1\u05e8 \u05d3\u05e3"},advlist:{types:"\u05e1\u05d5\u05d2\u05d9\u05dd",def:"\u05d1\u05e8\u05d9\u05e8\u05ea \u05de\u05d7\u05d3\u05dc","lower_alpha":"Lower alpha","lower_greek":"Lower greek","lower_roman":"Lower roman","upper_alpha":"Upper alpha","upper_roman":"Upper roman",circle:"\u05e2\u05d2\u05d5\u05dc",disc:"\u05d3\u05d9\u05e1\u05e7",square:"\u05de\u05e8\u05d5\u05d1\u05e2"},colors:{"333300":"\u05d6\u05d9\u05ea \u05db\u05d4\u05d4","993300":"\u05db\u05ea\u05d5\u05dd \u05db\u05d4\u05d4","000000":"\u05e9\u05d7\u05d5\u05e8","003300":"\u05d9\u05e8\u05d5\u05e7 \u05db\u05d4\u05d4","003366":"\u05d8\u05d5\u05e8\u05e7\u05d9\u05d6 \u05db\u05d4\u05d4","000080":"\u05db\u05d7\u05d5\u05dc \u05e6\u05d9","333399":"\u05d0\u05d9\u05e0\u05d3\u05d9\u05d2\u05d5","333333":"\u05d0\u05e4\u05d5\u05e8 \u05db\u05d4\u05d4 \u05de\u05d0\u05d5\u05d3","800000":"\u05e2\u05e8\u05de\u05d5\u05e0\u05d9",FF6600:"\u05db\u05ea\u05d5\u05dd","808000":"\u05d6\u05d9\u05ea","008000":"\u05d9\u05e8\u05d5\u05e7","008080":"\u05d9\u05e8\u05d5\u05e7-\u05db\u05d7\u05d5\u05dc \u05e2\u05de\u05d5\u05e7","0000FF":"\u05db\u05d7\u05d5\u05dc","666699":"\u05db\u05d7\u05d5\u05dc \u05d0\u05e4\u05e8\u05e4\u05e8","808080":"\u05d0\u05e4\u05d5\u05e8",FF0000:"\u05d0\u05d3\u05d5\u05dd",FF9900:"\u05e2\u05e0\u05d1\u05e8","99CC00":"\u05d9\u05e8\u05d5\u05e7 \u05e6\u05d4\u05d1\u05d4\u05d1","339966":"\u05d9\u05e8\u05d5\u05e7 \u05d9\u05dd","33CCCC":"\u05d8\u05d5\u05e8\u05e7\u05d9\u05d6","3366FF":"\u05db\u05d7\u05d5\u05dc \u05e8\u05d5\u05d9\u05d0\u05dc","800080":"\u05e1\u05d2\u05d5\u05dc","999999":"\u05d0\u05e4\u05d5\u05e8 \u05d1\u05d9\u05e0\u05d9\u05d9\u05dd",FF00FF:"\u05e1\u05d2\u05d5\u05dc-\u05d5\u05e8\u05d5\u05d3 (\u05de\u05d2\u05f3\u05e0\u05d8\u05d4)",FFCC00:"\u05d6\u05d4\u05d1",FFFF00:"\u05e6\u05d4\u05d5\u05d1","00FF00":"\u05dc\u05d9\u05d9\u05dd","00FFFF":"\u05d8\u05d5\u05e8\u05e7\u05d9\u05d6 \u05de\u05d9\u05dd","00CCFF":"\u05ea\u05db\u05dc\u05ea","993366":"\u05d7\u05d5\u05dd",C0C0C0:"\u05db\u05e1\u05e3",FF99CC:"\u05d5\u05e8\u05d5\u05d3",FFCC99:"\u05d0\u05e4\u05e8\u05e1\u05e7",FFFF99:"\u05e6\u05d4\u05d5\u05d1 \u05d1\u05d4\u05d9\u05e8",CCFFCC:"\u05d9\u05e8\u05d5\u05e7 \u05d7\u05d9\u05d5\u05d5\u05e8",CCFFFF:"\u05d8\u05d5\u05e8\u05e7\u05d9\u05d6 \u05d1\u05d4\u05d9\u05e8","99CCFF":"\u05ea\u05db\u05dc\u05ea \u05d1\u05d4\u05d9\u05e8",CC99FF:"\u05d5\u05e8\u05d5\u05d3 \u05e2\u05de\u05d5\u05e7",FFFFFF:"\u05dc\u05d1\u05df"},aria:{"rich_text_area":"\u05d0\u05d6\u05d5\u05e8 \u05e2\u05d5\u05e8\u05da \u05d8\u05e7\u05e1\u05d8 \u05e2\u05e9\u05d9\u05e8"},wordcount:{words:"\u05de\u05d9\u05dc\u05d9\u05dd:"}}}); \ No newline at end of file diff --git a/src/Umbraco.Web.UI.Client/lib/tinymce/langs/it.js b/src/Umbraco.Web.UI.Client/lib/tinymce/langs/it.js new file mode 100644 index 0000000000..d97803d2b3 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/lib/tinymce/langs/it.js @@ -0,0 +1,219 @@ +tinymce.addI18n('it',{ +"Cut": "Taglia", +"Heading 5": "Intestazione 5", +"Header 2": "Header 2", +"Your browser doesn't support direct access to the clipboard. Please use the Ctrl+X\/C\/V keyboard shortcuts instead.": "Il tuo browser non supporta l'accesso diretto negli Appunti. Per favore usa i tasti di scelta rapida Ctrl+X\/C\/V.", +"Heading 4": "Intestazione 4", +"Div": "Div", +"Heading 2": "Intestazione 2", +"Paste": "Incolla", +"Close": "Chiudi", +"Font Family": "Famiglia font", +"Pre": "Pre", +"Align right": "Allinea a Destra", +"New document": "Nuovo Documento", +"Blockquote": "Blockquote", +"Numbered list": "Elenchi Numerati", +"Heading 1": "Intestazione 1", +"Headings": "Intestazioni", +"Increase indent": "Aumenta Rientro", +"Formats": "Formattazioni", +"Headers": "Intestazioni", +"Select all": "Seleziona Tutto", +"Header 3": "Intestazione 3", +"Blocks": "Blocchi", +"Undo": "Indietro", +"Strikethrough": "Barrato", +"Bullet list": "Elenchi Puntati", +"Header 1": "Intestazione 1", +"Superscript": "Apice", +"Clear formatting": "Cancella Formattazione", +"Font Sizes": "Dimensioni font", +"Subscript": "Pedice", +"Header 6": "Intestazione 6", +"Redo": "Ripeti", +"Paragraph": "Paragrafo", +"Ok": "Ok", +"Bold": "Grassetto", +"Code": "Codice", +"Italic": "Corsivo", +"Align center": "Allinea al Cento", +"Header 5": "Intestazione 5", +"Heading 6": "Intestazione 6", +"Heading 3": "Intestazione 3", +"Decrease indent": "Riduci Rientro", +"Header 4": "Intestazione 4", +"Paste is now in plain text mode. Contents will now be pasted as plain text until you toggle this option off.": "Incolla \u00e8 in modalit\u00e0 testo normale. I contenuti sono incollati come testo normale se non disattivi l'opzione.", +"Underline": "Sottolineato", +"Cancel": "Annulla", +"Justify": "Giustifica", +"Inline": "Inlinea", +"Copy": "Copia", +"Align left": "Allinea a Sinistra", +"Visual aids": "Elementi Visivi", +"Lower Greek": "Greek Minore", +"Square": "Quadrato", +"Default": "Default", +"Lower Alpha": "Alpha Minore", +"Circle": "Cerchio", +"Disc": "Disco", +"Upper Alpha": "Alpha Superiore", +"Upper Roman": "Roman Superiore", +"Lower Roman": "Roman Minore", +"Name": "Nome", +"Anchor": "Fissa", +"You have unsaved changes are you sure you want to navigate away?": "Non hai salvato delle modifiche, sei sicuro di andartene?", +"Restore last draft": "Ripristina l'ultima bozza.", +"Special character": "Carattere Speciale", +"Source code": "Codice Sorgente", +"B": "B", +"R": "R", +"G": "G", +"Color": "Colore", +"Right to left": "Da Destra a Sinistra", +"Left to right": "Da Sinistra a Destra", +"Emoticons": "Emoction", +"Robots": "Robot", +"Document properties": "Propriet\u00e0 Documento", +"Title": "Titolo", +"Keywords": "Parola Chiave", +"Encoding": "Codifica", +"Description": "Descrizione", +"Author": "Autore", +"Fullscreen": "Schermo Intero", +"Horizontal line": "Linea Orizzontale", +"Horizontal space": "Spazio Orizzontale", +"Insert\/edit image": "Aggiungi\/Modifica Immagine", +"General": "Generale", +"Advanced": "Avanzato", +"Source": "Fonte", +"Border": "Bordo", +"Constrain proportions": "Mantieni Proporzioni", +"Vertical space": "Spazio Verticale", +"Image description": "Descrizione Immagine", +"Style": "Stile", +"Dimensions": "Dimenzioni", +"Insert image": "Inserisci immagine", +"Zoom in": "Ingrandisci", +"Contrast": "Contrasto", +"Back": "Indietro", +"Gamma": "Gamma", +"Flip horizontally": "Rifletti orizzontalmente", +"Resize": "Ridimensiona", +"Sharpen": "Contrasta", +"Zoom out": "Rimpicciolisci", +"Image options": "Opzioni immagine", +"Apply": "Applica", +"Brightness": "Luminosit\u00e0", +"Rotate clockwise": "Ruota in senso orario", +"Rotate counterclockwise": "Ruota in senso antiorario", +"Edit image": "Modifica immagine", +"Color levels": "Livelli colore", +"Crop": "Taglia", +"Orientation": "Orientamento", +"Flip vertically": "Rifletti verticalmente", +"Invert": "Inverti", +"Insert date\/time": "Inserisci Data\/Ora", +"Remove link": "Rimuovi link", +"Url": "Url", +"Text to display": "Testo da Visualizzare", +"Anchors": "Anchors", +"Insert link": "Inserisci il Link", +"New window": "Nuova Finestra", +"None": "No", +"The URL you entered seems to be an external link. Do you want to add the required http:\/\/ prefix?": "L'URL inserito sembra essere un collegamento esterno. Vuoi aggiungere il prefisso necessario http:\/\/?", +"Target": "Target", +"The URL you entered seems to be an email address. Do you want to add the required mailto: prefix?": "L'URL inserito sembra essere un indirizzo email. Vuoi aggiungere il prefisso necessario mailto:?", +"Insert\/edit link": "Inserisci\/Modifica Link", +"Insert\/edit video": "Inserisci\/Modifica Video", +"Poster": "Anteprima", +"Alternative source": "Alternativo", +"Paste your embed code below:": "Incolla il codice d'incorporamento qui:", +"Insert video": "Inserisci Video", +"Embed": "Incorporare", +"Nonbreaking space": "Spazio unificatore", +"Page break": "Interruzione di pagina", +"Paste as text": "incolla come testo", +"Preview": "Anteprima", +"Print": "Stampa", +"Save": "Salva", +"Could not find the specified string.": "Impossibile trovare la parola specifica.", +"Replace": "Sostituisci", +"Next": "Successivo", +"Whole words": "Parole Sbagliate", +"Find and replace": "Trova e Sostituisci", +"Replace with": "Sostituisci Con", +"Find": "Trova", +"Replace all": "Sostituisci Tutto", +"Match case": "Maiuscole\/Minuscole ", +"Prev": "Precedente", +"Spellcheck": "Controllo ortografico", +"Finish": "Termina", +"Ignore all": "Ignora Tutto", +"Ignore": "Ignora", +"Add to Dictionary": "Aggiungi al Dizionario", +"Insert row before": "Inserisci una Riga Prima", +"Rows": "Righe", +"Height": "Altezza", +"Paste row after": "Incolla una Riga Dopo", +"Alignment": "Allineamento", +"Border color": "Colore bordo", +"Column group": "Gruppo di Colonne", +"Row": "Riga", +"Insert column before": "Inserisci una Colonna Prima", +"Split cell": "Dividi Cella", +"Cell padding": "Padding della Cella", +"Cell spacing": "Spaziatura della Cella", +"Row type": "Tipo di Riga", +"Insert table": "Inserisci Tabella", +"Body": "Body", +"Caption": "Didascalia", +"Footer": "Footer", +"Delete row": "Cancella Riga", +"Paste row before": "Incolla una Riga Prima", +"Scope": "Campo", +"Delete table": "Cancella Tabella", +"H Align": "Allineamento H", +"Top": "In alto", +"Header cell": "cella d'intestazione", +"Column": "Colonna", +"Row group": "Gruppo di Righe", +"Cell": "Cella", +"Middle": "In mezzo", +"Cell type": "Tipo di Cella", +"Copy row": "Copia Riga", +"Row properties": "Propriet\u00e0 della Riga", +"Table properties": "Propiet\u00e0 della Tabella", +"Bottom": "In fondo", +"V Align": "Allineamento V", +"Header": "Header", +"Right": "Destra", +"Insert column after": "Inserisci una Colonna Dopo", +"Cols": "Colonne", +"Insert row after": "Inserisci una Riga Dopo", +"Width": "Larghezza", +"Cell properties": "Propiet\u00e0 della Cella", +"Left": "Sinistra", +"Cut row": "Taglia Riga", +"Delete column": "Cancella Colonna", +"Center": "Centro", +"Merge cells": "Unisci Cella", +"Insert template": "Inserisci Template", +"Templates": "Template", +"Background color": "Colore Background", +"Custom...": "Personalizzato...", +"Custom color": "Colore personalizzato", +"No color": "Nessun colore", +"Text color": "Colore Testo", +"Show blocks": "Mostra Blocchi", +"Show invisible characters": "Mostra Caratteri Invisibili", +"Words: {0}": "Parole: {0}", +"Insert": "Inserisci", +"File": "File", +"Edit": "Modifica", +"Rich Text Area. Press ALT-F9 for menu. Press ALT-F10 for toolbar. Press ALT-0 for help": "Rich Text Area. Premi ALT-F9 per il men\u00f9. Premi ALT-F10 per la barra degli strumenti. Premi ALT-0 per l'aiuto.", +"Tools": "Strumenti", +"View": "Visualiza", +"Table": "Tabella", +"Format": "Formato" +}); \ No newline at end of file diff --git a/src/Umbraco.Web.UI.Client/lib/tinymce/langs/ja.js b/src/Umbraco.Web.UI.Client/lib/tinymce/langs/ja.js new file mode 100644 index 0000000000..848cbd36b9 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/lib/tinymce/langs/ja.js @@ -0,0 +1,219 @@ +tinymce.addI18n('ja',{ +"Cut": "\u5207\u308a\u53d6\u308a", +"Heading 5": "\u898b\u51fa\u3057 5", +"Header 2": "\u30d8\u30c3\u30c0\u30fc 2", +"Your browser doesn't support direct access to the clipboard. Please use the Ctrl+X\/C\/V keyboard shortcuts instead.": "\u304a\u4f7f\u3044\u306e\u30d6\u30e9\u30a6\u30b6\u3067\u306f\u30af\u30ea\u30c3\u30d7\u30dc\u30fc\u30c9\u6a5f\u80fd\u3092\u5229\u7528\u3059\u308b\u3053\u3068\u304c\u3067\u304d\u307e\u305b\u3093\u3002\u30ad\u30fc\u30dc\u30fc\u30c9\u306e\u30b7\u30e7\u30fc\u30c8\u30ab\u30c3\u30c8\uff08Ctrl+X, Ctrl+C, Ctrl+V\uff09\u3092\u304a\u4f7f\u3044\u4e0b\u3055\u3044\u3002", +"Heading 4": "\u898b\u51fa\u3057 4", +"Div": "Div", +"Heading 2": "\u898b\u51fa\u3057 2", +"Paste": "\u8cbc\u308a\u4ed8\u3051", +"Close": "\u9589\u3058\u308b", +"Font Family": "\u30d5\u30a9\u30f3\u30c8\u30d5\u30a1\u30df\u30ea\u30fc", +"Pre": "Pre", +"Align right": "\u53f3\u5bc4\u305b", +"New document": "\u65b0\u898f\u30c9\u30ad\u30e5\u30e1\u30f3\u30c8", +"Blockquote": "\u5f15\u7528", +"Numbered list": "\u756a\u53f7\u4ed8\u304d\u7b87\u6761\u66f8\u304d", +"Heading 1": "\u898b\u51fa\u3057 1", +"Headings": "\u898b\u51fa\u3057", +"Increase indent": "\u30a4\u30f3\u30c7\u30f3\u30c8\u3092\u5897\u3084\u3059", +"Formats": "\u66f8\u5f0f", +"Headers": "\u30d8\u30c3\u30c0\u30fc", +"Select all": "\u5168\u3066\u3092\u9078\u629e", +"Header 3": "\u30d8\u30c3\u30c0\u30fc 3", +"Blocks": "\u30d6\u30ed\u30c3\u30af", +"Undo": "\u5143\u306b\u623b\u3059", +"Strikethrough": "\u53d6\u308a\u6d88\u3057\u7dda", +"Bullet list": "\u7b87\u6761\u66f8\u304d", +"Header 1": "\u30d8\u30c3\u30c0\u30fc 1", +"Superscript": "\u4e0a\u4ed8\u304d\u6587\u5b57", +"Clear formatting": "\u66f8\u5f0f\u3092\u30af\u30ea\u30a2", +"Font Sizes": "\u30d5\u30a9\u30f3\u30c8\u30b5\u30a4\u30ba", +"Subscript": "\u4e0b\u4ed8\u304d\u6587\u5b57", +"Header 6": "\u30d8\u30c3\u30c0\u30fc 6", +"Redo": "\u3084\u308a\u76f4\u3059", +"Paragraph": "\u6bb5\u843d", +"Ok": "OK", +"Bold": "\u592a\u5b57", +"Code": "\u30b3\u30fc\u30c9", +"Italic": "\u659c\u4f53", +"Align center": "\u4e2d\u592e\u63c3\u3048", +"Header 5": "\u30d8\u30c3\u30c0\u30fc 5", +"Heading 6": "\u898b\u51fa\u3057 6", +"Heading 3": "\u898b\u51fa\u3057 3", +"Decrease indent": "\u30a4\u30f3\u30c7\u30f3\u30c8\u3092\u6e1b\u3089\u3059", +"Header 4": "\u30d8\u30c3\u30c0\u30fc 4", +"Paste is now in plain text mode. Contents will now be pasted as plain text until you toggle this option off.": "\u8cbc\u308a\u4ed8\u3051\u306f\u73fe\u5728\u30d7\u30ec\u30fc\u30f3\u30c6\u30ad\u30b9\u30c8\u30e2\u30fc\u30c9\u3067\u3059\u3002\u3053\u306e\u30aa\u30d7\u30b7\u30e7\u30f3\u3092\u30aa\u30d5\u306b\u3057\u306a\u3044\u9650\u308a\u5185\u5bb9\u306f\u30d7\u30ec\u30fc\u30f3\u30c6\u30ad\u30b9\u30c8\u3068\u3057\u3066\u8cbc\u308a\u4ed8\u3051\u3089\u308c\u307e\u3059\u3002", +"Underline": "\u4e0b\u7dda", +"Cancel": "\u30ad\u30e3\u30f3\u30bb\u30eb", +"Justify": "\u4e21\u7aef\u63c3\u3048", +"Inline": "\u30a4\u30f3\u30e9\u30a4\u30f3", +"Copy": "\u30b3\u30d4\u30fc", +"Align left": "\u5de6\u5bc4\u305b", +"Visual aids": "\u8868\u306e\u67a0\u7dda\u3092\u70b9\u7dda\u3067\u8868\u793a", +"Lower Greek": "\u5c0f\u6587\u5b57\u306e\u30ae\u30ea\u30b7\u30e3\u6587\u5b57", +"Square": "\u56db\u89d2", +"Default": "\u30c7\u30d5\u30a9\u30eb\u30c8", +"Lower Alpha": "\u5c0f\u6587\u5b57\u306e\u30a2\u30eb\u30d5\u30a1\u30d9\u30c3\u30c8", +"Circle": "\u5186", +"Disc": "\u70b9", +"Upper Alpha": "\u5927\u6587\u5b57\u306e\u30a2\u30eb\u30d5\u30a1\u30d9\u30c3\u30c8", +"Upper Roman": "\u5927\u6587\u5b57\u306e\u30ed\u30fc\u30de\u6570\u5b57", +"Lower Roman": "\u5c0f\u6587\u5b57\u306e\u30ed\u30fc\u30de\u6570\u5b57", +"Name": "\u30a2\u30f3\u30ab\u30fc\u540d", +"Anchor": "\u30a2\u30f3\u30ab\u30fc\uff08\u30ea\u30f3\u30af\u306e\u5230\u9054\u70b9\uff09", +"You have unsaved changes are you sure you want to navigate away?": "\u307e\u3060\u4fdd\u5b58\u3057\u3066\u3044\u306a\u3044\u5909\u66f4\u304c\u3042\u308a\u307e\u3059\u304c\u3001\u672c\u5f53\u306b\u3053\u306e\u30da\u30fc\u30b8\u3092\u96e2\u308c\u307e\u3059\u304b\uff1f", +"Restore last draft": "\u524d\u56de\u306e\u4e0b\u66f8\u304d\u3092\u5fa9\u6d3b\u3055\u305b\u308b", +"Special character": "\u7279\u6b8a\u6587\u5b57", +"Source code": "\u30bd\u30fc\u30b9\u30b3\u30fc\u30c9", +"B": "B", +"R": "R", +"G": "G", +"Color": "\u30ab\u30e9\u30fc", +"Right to left": "\u53f3\u304b\u3089\u5de6", +"Left to right": "\u5de6\u304b\u3089\u53f3", +"Emoticons": "\u7d75\u6587\u5b57", +"Robots": "\u30ed\u30dc\u30c3\u30c4", +"Document properties": "\u30c9\u30ad\u30e5\u30e1\u30f3\u30c8\u306e\u30d7\u30ed\u30d1\u30c6\u30a3", +"Title": "\u30bf\u30a4\u30c8\u30eb", +"Keywords": "\u30ad\u30fc\u30ef\u30fc\u30c9", +"Encoding": "\u30a8\u30f3\u30b3\u30fc\u30c7\u30a3\u30f3\u30b0", +"Description": "\u30c6\u30f3\u30d7\u30ec\u30fc\u30c8\u306e\u5185\u5bb9", +"Author": "\u8457\u8005", +"Fullscreen": "\u5168\u753b\u9762\u8868\u793a", +"Horizontal line": "\u6c34\u5e73\u7f6b\u7dda", +"Horizontal space": "\u6a2a\u65b9\u5411\u306e\u4f59\u767d", +"Insert\/edit image": "\u753b\u50cf\u306e\u633f\u5165\u30fb\u7de8\u96c6", +"General": "\u4e00\u822c", +"Advanced": "\u8a73\u7d30\u8a2d\u5b9a", +"Source": "\u753b\u50cf\u306e\u30bd\u30fc\u30b9", +"Border": "\u67a0\u7dda", +"Constrain proportions": "\u7e26\u6a2a\u6bd4\u3092\u4fdd\u6301\u3059\u308b", +"Vertical space": "\u7e26\u65b9\u5411\u306e\u4f59\u767d", +"Image description": "\u753b\u50cf\u306e\u8aac\u660e\u6587", +"Style": "\u30b9\u30bf\u30a4\u30eb", +"Dimensions": "\u753b\u50cf\u30b5\u30a4\u30ba\uff08\u6a2a\u30fb\u7e26\uff09", +"Insert image": "\u753b\u50cf\u306e\u633f\u5165", +"Zoom in": "\u30ba\u30fc\u30e0\u30a4\u30f3", +"Contrast": "\u30b3\u30f3\u30c8\u30e9\u30b9\u30c8", +"Back": "\u623b\u308b", +"Gamma": "\u30ac\u30f3\u30de", +"Flip horizontally": "\u6c34\u5e73\u306b\u53cd\u8ee2", +"Resize": "\u30ea\u30b5\u30a4\u30ba", +"Sharpen": "\u30b7\u30e3\u30fc\u30d7\u5316", +"Zoom out": "\u30ba\u30fc\u30e0\u30a2\u30a6\u30c8", +"Image options": "\u753b\u50cf\u30aa\u30d7\u30b7\u30e7\u30f3", +"Apply": "\u9069\u7528", +"Brightness": "\u660e\u308b\u3055", +"Rotate clockwise": "\u6642\u8a08\u56de\u308a\u306b\u56de\u8ee2", +"Rotate counterclockwise": "\u53cd\u6642\u8a08\u56de\u308a\u306b\u56de\u8ee2", +"Edit image": "\u753b\u50cf\u306e\u7de8\u96c6", +"Color levels": "\u30ab\u30e9\u30fc\u30ec\u30d9\u30eb", +"Crop": "\u30af\u30ed\u30c3\u30d7", +"Orientation": "\u5411\u304d", +"Flip vertically": "\u4e0a\u4e0b\u306b\u53cd\u8ee2", +"Invert": "\u53cd\u8ee2", +"Insert date\/time": "\u65e5\u4ed8\u30fb\u6642\u523b", +"Remove link": "\u30ea\u30f3\u30af\u306e\u524a\u9664", +"Url": "\u30ea\u30f3\u30af\u5148URL", +"Text to display": "\u30ea\u30f3\u30af\u5143\u30c6\u30ad\u30b9\u30c8", +"Anchors": "\u30a2\u30f3\u30ab\u30fc\uff08\u30ea\u30f3\u30af\u306e\u5230\u9054\u70b9\uff09", +"Insert link": "\u30ea\u30f3\u30af", +"New window": "\u65b0\u898f\u30a6\u30a3\u30f3\u30c9\u30a6", +"None": "\u306a\u3057", +"The URL you entered seems to be an external link. Do you want to add the required http:\/\/ prefix?": "\u5165\u529b\u3055\u308c\u305fURL\u306f\u5916\u90e8\u30ea\u30f3\u30af\u306e\u3088\u3046\u3067\u3059\u3002\u300chttp:\/\/\u300d\u30d7\u30ec\u30d5\u30a3\u30c3\u30af\u30b9\u3092\u8ffd\u52a0\u3057\u307e\u3059\u304b\uff1f", +"Target": "\u30bf\u30fc\u30b2\u30c3\u30c8\u5c5e\u6027", +"The URL you entered seems to be an email address. Do you want to add the required mailto: prefix?": "\u5165\u529b\u3055\u308c\u305fURL\u306f\u30e1\u30fc\u30eb\u30a2\u30c9\u30ec\u30b9\u306e\u3088\u3046\u3067\u3059\u3002\u300cmailto:\u300d\u30d7\u30ec\u30d5\u30a3\u30c3\u30af\u30b9\u3092\u8ffd\u52a0\u3057\u307e\u3059\u304b\uff1f", +"Insert\/edit link": "\u30ea\u30f3\u30af\u306e\u633f\u5165\u30fb\u7de8\u96c6", +"Insert\/edit video": "\u52d5\u753b\u306e\u633f\u5165\u30fb\u7de8\u96c6", +"Poster": "\u4ee3\u66ff\u753b\u50cf\u306e\u5834\u6240", +"Alternative source": "\u4ee3\u66ff\u52d5\u753b\u306e\u5834\u6240", +"Paste your embed code below:": "\u57cb\u3081\u8fbc\u307f\u7528\u30b3\u30fc\u30c9\u3092\u4e0b\u8a18\u306b\u8cbc\u308a\u4ed8\u3051\u3066\u304f\u3060\u3055\u3044\u3002", +"Insert video": "\u52d5\u753b", +"Embed": "\u57cb\u3081\u8fbc\u307f", +"Nonbreaking space": "\u56fa\u5b9a\u30b9\u30da\u30fc\u30b9\uff08 \uff09", +"Page break": "\u30da\u30fc\u30b8\u533a\u5207\u308a", +"Paste as text": "\u30c6\u30ad\u30b9\u30c8\u3068\u3057\u3066\u8cbc\u308a\u4ed8\u3051", +"Preview": "\u30d7\u30ec\u30d3\u30e5\u30fc", +"Print": "\u5370\u5237", +"Save": "\u4fdd\u5b58", +"Could not find the specified string.": "\u304a\u63a2\u3057\u306e\u6587\u5b57\u304c\u898b\u3064\u304b\u308a\u307e\u305b\u3093\u3067\u3057\u305f\u3002", +"Replace": "\u7f6e\u304d\u63db\u3048", +"Next": "\u6b21", +"Whole words": "\u5358\u8a9e\u5358\u4f4d\u3067\u691c\u7d22\u3059\u308b", +"Find and replace": "\u691c\u7d22\u3068\u7f6e\u304d\u63db\u3048", +"Replace with": "\u7f6e\u304d\u63db\u3048\u308b\u6587\u5b57", +"Find": "\u691c\u7d22", +"Replace all": "\u5168\u3066\u3092\u7f6e\u304d\u63db\u3048\u308b", +"Match case": "\u5927\u6587\u5b57\u30fb\u5c0f\u6587\u5b57\u3092\u533a\u5225\u3059\u308b", +"Prev": "\u524d", +"Spellcheck": "\u30b9\u30da\u30eb\u30c1\u30a7\u30c3\u30af", +"Finish": "\u7d42\u4e86", +"Ignore all": "\u5168\u3066\u3092\u7121\u8996", +"Ignore": "\u7121\u8996", +"Add to Dictionary": "\u8f9e\u66f8\u306b\u8ffd\u52a0", +"Insert row before": "\u4e0a\u5074\u306b\u884c\u3092\u633f\u5165", +"Rows": "\u884c\u6570", +"Height": "\u9ad8\u3055", +"Paste row after": "\u4e0b\u5074\u306b\u884c\u3092\u8cbc\u308a\u4ed8\u3051", +"Alignment": "\u914d\u7f6e", +"Border color": "\u67a0\u7dda\u306e\u8272", +"Column group": "\u5217\u30b0\u30eb\u30fc\u30d7", +"Row": "\u884c", +"Insert column before": "\u5de6\u5074\u306b\u5217\u3092\u633f\u5165", +"Split cell": "\u30bb\u30eb\u306e\u5206\u5272", +"Cell padding": "\u30bb\u30eb\u5185\u4f59\u767d\uff08\u30d1\u30c7\u30a3\u30f3\u30b0\uff09", +"Cell spacing": "\u30bb\u30eb\u306e\u9593\u9694", +"Row type": "\u884c\u30bf\u30a4\u30d7", +"Insert table": "\u8868\u306e\u633f\u5165", +"Body": "\u30dc\u30c7\u30a3\u30fc", +"Caption": "\u8868\u984c", +"Footer": "\u30d5\u30c3\u30bf\u30fc", +"Delete row": "\u884c\u306e\u524a\u9664", +"Paste row before": "\u4e0a\u5074\u306b\u884c\u3092\u8cbc\u308a\u4ed8\u3051", +"Scope": "\u30b9\u30b3\u30fc\u30d7", +"Delete table": "\u8868\u306e\u524a\u9664", +"H Align": "\u6c34\u5e73\u65b9\u5411\u306e\u914d\u7f6e", +"Top": "\u4e0a", +"Header cell": "\u30d8\u30c3\u30c0\u30fc\u30bb\u30eb", +"Column": "\u5217", +"Row group": "\u884c\u30b0\u30eb\u30fc\u30d7", +"Cell": "\u30bb\u30eb", +"Middle": "\u4e2d\u592e", +"Cell type": "\u30bb\u30eb\u30bf\u30a4\u30d7", +"Copy row": "\u884c\u306e\u30b3\u30d4\u30fc", +"Row properties": "\u884c\u306e\u8a73\u7d30\u8a2d\u5b9a", +"Table properties": "\u8868\u306e\u8a73\u7d30\u8a2d\u5b9a", +"Bottom": "\u4e0b", +"V Align": "\u5782\u76f4\u65b9\u5411\u306e\u914d\u7f6e", +"Header": "\u30d8\u30c3\u30c0\u30fc", +"Right": "\u53f3\u5bc4\u305b", +"Insert column after": "\u53f3\u5074\u306b\u5217\u3092\u633f\u5165", +"Cols": "\u5217\u6570", +"Insert row after": "\u4e0b\u5074\u306b\u884c\u3092\u633f\u5165", +"Width": "\u5e45", +"Cell properties": "\u30bb\u30eb\u306e\u8a73\u7d30\u8a2d\u5b9a", +"Left": "\u5de6\u5bc4\u305b", +"Cut row": "\u884c\u306e\u5207\u308a\u53d6\u308a", +"Delete column": "\u5217\u306e\u524a\u9664", +"Center": "\u4e2d\u592e\u63c3\u3048", +"Merge cells": "\u30bb\u30eb\u306e\u7d50\u5408", +"Insert template": "\u30c6\u30f3\u30d7\u30ec\u30fc\u30c8\u306e\u633f\u5165", +"Templates": "\u30c6\u30f3\u30d7\u30ec\u30fc\u30c8\u540d", +"Background color": "\u80cc\u666f\u8272", +"Custom...": "\u30ab\u30b9\u30bf\u30e0...", +"Custom color": "\u30ab\u30b9\u30bf\u30e0\u30ab\u30e9\u30fc", +"No color": "\u30ab\u30e9\u30fc\u306a\u3057", +"Text color": "\u30c6\u30ad\u30b9\u30c8\u306e\u8272", +"Show blocks": "\u6587\u7ae0\u306e\u533a\u5207\u308a\u3092\u70b9\u7dda\u3067\u8868\u793a", +"Show invisible characters": "\u4e0d\u53ef\u8996\u6587\u5b57\u3092\u8868\u793a", +"Words: {0}": "\u5358\u8a9e\u6570: {0}", +"Insert": "\u633f\u5165", +"File": "\u30d5\u30a1\u30a4\u30eb", +"Edit": "\u7de8\u96c6", +"Rich Text Area. Press ALT-F9 for menu. Press ALT-F10 for toolbar. Press ALT-0 for help": "\u66f8\u5f0f\u4ed8\u304d\u30c6\u30ad\u30b9\u30c8\u306e\u7de8\u96c6\u753b\u9762\u3002ALT-F9\u3067\u30e1\u30cb\u30e5\u30fc\u3001ALT-F10\u3067\u30c4\u30fc\u30eb\u30d0\u30fc\u3001ALT-0\u3067\u30d8\u30eb\u30d7\u304c\u8868\u793a\u3055\u308c\u307e\u3059\u3002", +"Tools": "\u30c4\u30fc\u30eb", +"View": "\u8868\u793a", +"Table": "\u8868", +"Format": "\u66f8\u5f0f" +}); \ No newline at end of file diff --git a/src/Umbraco.Web.UI.Client/lib/tinymce/langs/nl.js b/src/Umbraco.Web.UI.Client/lib/tinymce/langs/nl.js new file mode 100644 index 0000000000..ee1f335624 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/lib/tinymce/langs/nl.js @@ -0,0 +1,219 @@ +tinymce.addI18n('nl',{ +"Cut": "Knippen", +"Heading 5": "Kop 5", +"Header 2": "Kop 2", +"Your browser doesn't support direct access to the clipboard. Please use the Ctrl+X\/C\/V keyboard shortcuts instead.": "Uw browser ondersteunt geen toegang tot het clipboard. Gelieve ctrl+X\/C\/V sneltoetsen te gebruiken.", +"Heading 4": "Kop 4", +"Div": "Div", +"Heading 2": "Kop 2", +"Paste": "Plakken", +"Close": "Sluiten", +"Font Family": "Lettertype", +"Pre": "Pre", +"Align right": "Rechts uitlijnen", +"New document": "Nieuw document", +"Blockquote": "Quote", +"Numbered list": "Nummering", +"Heading 1": "Kop 1", +"Headings": "Koppen", +"Increase indent": "Inspringen vergroten", +"Formats": "Opmaak", +"Headers": "Kopteksten", +"Select all": "Alles selecteren", +"Header 3": "Kop 3", +"Blocks": "Blok", +"Undo": "Ongedaan maken", +"Strikethrough": "Doorhalen", +"Bullet list": "Opsommingsteken", +"Header 1": "Kop 1", +"Superscript": "Superscript", +"Clear formatting": "Opmaak verwijderen", +"Font Sizes": "Tekengrootte", +"Subscript": "Subscript", +"Header 6": "Kop 6", +"Redo": "Opnieuw", +"Paragraph": "Paragraaf", +"Ok": "Ok\u00e9", +"Bold": "Vet", +"Code": "Code", +"Italic": "Cursief", +"Align center": "Centreren", +"Header 5": "Kop 5", +"Heading 6": "Kop 6", +"Heading 3": "Kop 3", +"Decrease indent": "Inspringen verkleinen", +"Header 4": "Kop 4", +"Paste is now in plain text mode. Contents will now be pasted as plain text until you toggle this option off.": "Plakken gebeurt nu als platte tekst. Tekst wordt nu ingevoegd zonder opmaak tot deze optie uitgeschakeld wordt.", +"Underline": "Onderstreept", +"Cancel": "Annuleren", +"Justify": "Uitlijnen", +"Inline": "Inlijn", +"Copy": "Kopi\u00ebren", +"Align left": "Links uitlijnen", +"Visual aids": "Hulpmiddelen", +"Lower Greek": "Griekse letters", +"Square": "Vierkant", +"Default": "Standaard", +"Lower Alpha": "Kleine letters", +"Circle": "Cirkel", +"Disc": "Bolletje", +"Upper Alpha": "Hoofdletters", +"Upper Roman": "Romeinse cijfers groot", +"Lower Roman": "Romeinse cijfers klein", +"Name": "Naam", +"Anchor": "Anker", +"You have unsaved changes are you sure you want to navigate away?": "U hebt niet alles opgeslagen bent u zeker dat u de pagina wenst te verlaten?", +"Restore last draft": "Herstel het laatste concept", +"Special character": "Speciale karakters", +"Source code": "Broncode", +"B": "Blauw", +"R": "Rood", +"G": "Groen", +"Color": "Kleur", +"Right to left": "Rechts naar links", +"Left to right": "Links naar rechts", +"Emoticons": "Emoticons", +"Robots": "Robots", +"Document properties": "Document eigenschappen", +"Title": "Titel", +"Keywords": "Sleutelwoorden", +"Encoding": "Codering", +"Description": "Omschrijving", +"Author": "Auteur", +"Fullscreen": "Volledig scherm", +"Horizontal line": "Horizontale lijn", +"Horizontal space": "Horizontale ruimte", +"Insert\/edit image": "Afbeelding invoegen\/bewerken", +"General": "Algemeen", +"Advanced": "Geavanceerd", +"Source": "Bron", +"Border": "Rand", +"Constrain proportions": "Verhoudingen behouden", +"Vertical space": "Verticale ruimte", +"Image description": "Afbeelding omschrijving", +"Style": "Stijl", +"Dimensions": "Afmetingen", +"Insert image": "Afbeelding invoegen", +"Zoom in": "Inzoomen", +"Contrast": "Contrast", +"Back": "Terug", +"Gamma": "Gamma", +"Flip horizontally": "Horizontaal spiegelen", +"Resize": "Formaat aanpassen", +"Sharpen": "Scherpte", +"Zoom out": "Uitzoomen", +"Image options": "Afbeelding opties", +"Apply": "Toepassen", +"Brightness": "Helderheid", +"Rotate clockwise": "Rechtsom draaien", +"Rotate counterclockwise": "Linksom draaien", +"Edit image": "Bewerk afbeelding", +"Color levels": "Kleurniveau's", +"Crop": "Uitsnijden", +"Orientation": "Orientatie", +"Flip vertically": "Verticaal spiegelen", +"Invert": "Omkeren", +"Insert date\/time": "Voeg datum\/tijd in", +"Remove link": "Link verwijderen", +"Url": "Url", +"Text to display": "Linktekst", +"Anchors": "Anker", +"Insert link": "Hyperlink invoegen", +"New window": "Nieuw venster", +"None": "Geen", +"The URL you entered seems to be an external link. Do you want to add the required http:\/\/ prefix?": "De ingegeven URL verwijst naar een extern adres. Wil je er \"http:\/\/\" aan toevoegen?", +"Target": "Doel", +"The URL you entered seems to be an email address. Do you want to add the required mailto: prefix?": "De ingegeven URL lijkt op een e-mailadres. Wil je er \"mailto:\" aan toevoegen?", +"Insert\/edit link": "Hyperlink invoegen\/bewerken", +"Insert\/edit video": "Video invoegen\/bewerken", +"Poster": "Poster", +"Alternative source": "Alternatieve bron", +"Paste your embed code below:": "Plak u in te sluiten code hieronder:", +"Insert video": "Video invoegen", +"Embed": "Insluiten", +"Nonbreaking space": "Vaste spatie invoegen", +"Page break": "Pagina einde", +"Paste as text": "Plakken als tekst", +"Preview": "Voorbeeld", +"Print": "Print", +"Save": "Opslaan", +"Could not find the specified string.": "Geen resultaten gevonden", +"Replace": "Vervangen", +"Next": "Volgende", +"Whole words": "Alleen hele woorden", +"Find and replace": "Zoek en vervang", +"Replace with": "Vervangen door", +"Find": "Zoeken", +"Replace all": "Alles vervangen", +"Match case": "Identieke hoofd\/kleine letters", +"Prev": "Vorige", +"Spellcheck": "Spellingscontrole", +"Finish": "Einde", +"Ignore all": "Alles negeren", +"Ignore": "Negeren", +"Add to Dictionary": "Toevoegen aan woordenlijst", +"Insert row before": "Voeg rij boven toe", +"Rows": "Rijen", +"Height": "Hoogte", +"Paste row after": "Plak rij onder", +"Alignment": "Uitlijning", +"Border color": "Randkleur", +"Column group": "Kolomgroep", +"Row": "Rij", +"Insert column before": "Voeg kolom in voor", +"Split cell": "Cel splitsen", +"Cell padding": "Ruimte binnen cel", +"Cell spacing": "Celruimte", +"Row type": "Rijtype", +"Insert table": "Tabel invoegen", +"Body": "Body", +"Caption": "Onderschrift", +"Footer": "Voettekst", +"Delete row": "Verwijder rij", +"Paste row before": "Plak rij boven", +"Scope": "Bereik", +"Delete table": "Verwijder tabel", +"H Align": "Links uitlijnen", +"Top": "Bovenaan", +"Header cell": "Kopcel", +"Column": "Kolom", +"Row group": "Rijgroep", +"Cell": "Cel", +"Middle": "Centreren", +"Cell type": "Celtype", +"Copy row": "Kopieer rij", +"Row properties": "Rij eigenschappen", +"Table properties": "Tabel eigenschappen", +"Bottom": "Onderaan", +"V Align": "Boven uitlijnen", +"Header": "Koptekst", +"Right": "Rechts", +"Insert column after": "Voeg kolom in na", +"Cols": "Kolommen", +"Insert row after": "Voeg rij onder toe", +"Width": "Breedte", +"Cell properties": "Cel eigenschappen", +"Left": "Links", +"Cut row": "Knip rij", +"Delete column": "Verwijder kolom", +"Center": "Midden", +"Merge cells": "Cellen samenvoegen", +"Insert template": "Sjabloon invoegen", +"Templates": "Sjablonen", +"Background color": "Achtergrondkleur", +"Custom...": "Eigen...", +"Custom color": "Eigen kleur", +"No color": "Geen kleur", +"Text color": "Tekstkleur", +"Show blocks": "Blokken tonen", +"Show invisible characters": "Onzichtbare karakters tonen", +"Words: {0}": "Woorden: {0}", +"Insert": "Invoegen", +"File": "Bestand", +"Edit": "Bewerken", +"Rich Text Area. Press ALT-F9 for menu. Press ALT-F10 for toolbar. Press ALT-0 for help": "Rich Text Area. Druk ALT-F9 voor het menu. Druk ALT-F10 voor de toolbar. Druk ALT-0 voor help.", +"Tools": "Gereedschap", +"View": "Beeld", +"Table": "Tabel", +"Format": "Opmaak" +}); \ No newline at end of file diff --git a/src/Umbraco.Web.UI.Client/lib/tinymce/langs/no.js b/src/Umbraco.Web.UI.Client/lib/tinymce/langs/no.js new file mode 100644 index 0000000000..69ded56dab --- /dev/null +++ b/src/Umbraco.Web.UI.Client/lib/tinymce/langs/no.js @@ -0,0 +1 @@ +tinyMCE.addI18n({no:{common:{"more_colors":"Flere farger","invalid_data":"Feil: Ugyldig verdi er skrevet inn, disse er merket med r\u00f8dt","popup_blocked":"Beklager, men vi har registrert at din popup-sperrer har blokkert et vindu i nettleseren. Du m\u00e5 oppheve popup-sperren for at nettstedet skal f\u00e5 tilgang til dette verkt\u00f8yet","clipboard_no_support":"For tiden ikke st\u00f8ttet av din nettleser, bruk tastatursnarveier i stedet.","clipboard_msg":"Klipp ut / Kopier /Lim inn fungerer ikke i Mozilla og Firefox. Vil du vite mer om dette?","not_set":"--Ikke satt--","class_name":"Klasse",browse:"Bla gjennom",close:"Lukk",cancel:"Avbryt",update:"Oppdater",insert:"Sett inn",apply:"Bruk","edit_confirm":"Vil du bruke WYSIWYG-editoren for dette tekstfeltet?","invalid_data_number":"{#field} m\u00e5 v\u00e6re et nummer","invalid_data_min":"{#field} m\u00e5 v\u00e6re et nummber st\u00f8rre en {#min}","invalid_data_size":"{#field} m\u00e5 v\u00e6re et nummer eller prosent av",value:"(verdi)"},contextmenu:{full:"Full",right:"H\u00f8yre",center:"Midtstilt",left:"Venstre",align:"Justering"},insertdatetime:{"day_short":"S\u00f8n,Man,Tir,Ons,Tor,Fre,L\u00f8r,S\u00f8n","day_long":"s\u00f8ndag,mandag,tirsdag,onsdag,torsdag,fredag,l\u00f8rdag,s\u00f8ndag","months_short":"jan,feb,mar,apr,mai,jun,jul,aug,sep,okt,nov,des","months_long":"januar,februar,mars,april,mai,juni,juli,august,september,oktober,november,desember","inserttime_desc":"Sett inn tid","insertdate_desc":"Sett inn dato","time_fmt":"%H:%M:%S","date_fmt":"%d-%m-%Y"},print:{"print_desc":"Skriv ut"},preview:{"preview_desc":"Forh\u00e5ndsvisning"},directionality:{"rtl_desc":"Retning h\u00f8yre mot venstre","ltr_desc":"Retning venstre mot h\u00f8yre"},layer:{content:"Nytt lag ...","absolute_desc":"Sl\u00e5 p\u00e5/av absolutt plassering","backward_desc":"Flytt bakover","forward_desc":"Flytt fremover","insertlayer_desc":"Sett inn nytt lag"},save:{"save_desc":"Lagre","cancel_desc":"Kanseller alle endringer"},nonbreaking:{"nonbreaking_desc":"Sett inn tegn for hardt mellomrom"},iespell:{download:"ieSpell ikke funnet. \u00d8nsker du \u00e5 installere ieSpell?","iespell_desc":"Stavekontroll"},advhr:{"advhr_desc":"Horisontal linje","delta_height":"","delta_width":""},emotions:{"emotions_desc":"Hum\u00f8rfjes","delta_height":"","delta_width":""},searchreplace:{"replace_desc":"S\u00f8k/Erstatt","search_desc":"S\u00f8k","delta_width":"","delta_height":""},advimage:{"image_desc":"Sett inn / rediger bilde","delta_width":"","delta_height":""},advlink:{"link_desc":"Sett inn / rediger lenke","delta_height":"","delta_width":""},xhtmlxtras:{"attribs_desc":"Sett inn / rediger attributter","ins_desc":"Innsetting","del_desc":"Sletting","acronym_desc":"Akronym","abbr_desc":"Forkortelse","cite_desc":"Sitat","attribs_delta_height":"","attribs_delta_width":"","ins_delta_height":"","ins_delta_width":"","del_delta_height":"","del_delta_width":"","acronym_delta_height":"","acronym_delta_width":"","abbr_delta_height":"","abbr_delta_width":"","cite_delta_height":"","cite_delta_width":""},style:{desc:"Rediger CSS-stil","delta_height":"","delta_width":""},paste:{"plaintext_mode":"Lim inn er n\u00e5 i vanlig tekst modus. Klikk igjen for \u00e5 bytte til vanlig innlimings modus.","plaintext_mode_sticky":"Lim inn er n\u00e5 i vanlig tekst modus. Klikk igjen for \u00e5 bytte til vanlig innlimings modus. Etter at du limer inn noe vil du g\u00e5 tilbake til ordin\u00e6r innliming.","selectall_desc":"Merk alt","paste_word_desc":"Lim inn fra Word","paste_text_desc":"Lim inn som ren tekst"},"paste_dlg":{"word_title":"Bruk CTRL+V p\u00e5 tastaturet for \u00e5 lime inn teksten i dette vinduet.","text_linebreaks":"Behold tekstbryting","text_title":"Bruk CTRL+V p\u00e5 tastaturet for \u00e5 lime inn teksten i dette vinduet."},table:{cell:"Celle",col:"Kolonne",row:"Rad",del:"Slett tabell","copy_row_desc":"Kopier rad","cut_row_desc":"Slett rad","paste_row_after_desc":"Lim inn rad etter","paste_row_before_desc":"Lim inn rad foran","props_desc":"Tabellegenskaper","cell_desc":"Celleegenskaper","row_desc":"Radegenskaper","merge_cells_desc":"Sl\u00e5 sammen celler","split_cells_desc":"Splitt sammensl\u00e5tte celler","delete_col_desc":"Slett kolonne","col_after_desc":"Sett inn kolonne etter","col_before_desc":"Sett inn kolonne foran","delete_row_desc":"Slett rad","row_after_desc":"Sett inn rad etter","row_before_desc":"Sett inn rad foran",desc:"Sett inn ny tabell","merge_cells_delta_height":"","merge_cells_delta_width":"","table_delta_height":"","table_delta_width":"","cellprops_delta_height":"","cellprops_delta_width":"","rowprops_delta_height":"","rowprops_delta_width":""},autosave:{"warning_message":"Hvis du gjenoppretter tidligere lagret innhold s\u00e5 vil du miste alt n\u00e5v\u00e6rende innhold i editoren.\n\nEr du sikker p\u00e5 at du vil gjenopprette tidligere lagret innhold?.","restore_content":"Gjenopprett autolagret innhold.","unload_msg":"Utf\u00f8rte endringer g\u00e5r tapt hvis du navigerer vekk fra denne siden!"},fullscreen:{desc:"Sl\u00e5 fullskjermsmodus av/p\u00e5"},media:{edit:"Rediger innebygd objekt",desc:"Sett inn / rediger innebygd objekt","delta_height":"","delta_width":""},fullpage:{desc:"Dokumentegenskaper","delta_width":"","delta_height":""},template:{desc:"Sett inn forh\u00e5ndsdefinert malinnhold"},visualchars:{desc:"Visuelle konktrolltegn p\u00e5/av"},spellchecker:{desc:"Stavekontroll p\u00e5/av",menu:"Oppsett stavekontroll","ignore_word":"Ignorer ord","ignore_words":"Ignorer alt",langs:"Spr\u00e5k",wait:"Vennligst vent ...",sug:"Forslag","no_sug":"Ingen forslag","no_mpell":"Ingen stavefeil funnet.","learn_word":"L\u00e6r ordet"},pagebreak:{desc:"Sett inn sideskift"},advlist:{types:"Types",def:"Standard","lower_alpha":"Sm\u00e5 alfanumerisk","lower_greek":"Sm\u00e5 gresk","lower_roman":"Sm\u00e5 roman","upper_alpha":"Store alfanumerisk","upper_roman":"Store roman",circle:"Sirkel",disc:"Plate",square:"Firkant"},colors:{"333300":"M\u00f8rk olivengr\u00f8nn","993300":"Brent oransje","000000":"Svart","003300":"M\u00f8rkegr\u00f8nn","003366":"M\u00f8rk asurbl\u00e5","000080":"Marinebl\u00e5","333399":"Indigobl\u00e5","333333":"M\u00f8rk m\u00f8rkegr\u00e5","800000":"R\u00f8dbrun",FF6600:"Oransje","808000":"Olivengr\u00f8nn","008000":"Gr\u00f8nn","008080":"M\u00f8rk gr\u00f8nnbl\u00e5","0000FF":"Bl\u00e5","666699":"Gr\u00e5bl\u00e5","808080":"Gr\u00e5",FF0000:"R\u00f8d",FF9900:"Amber","99CC00":"Gulgr\u00f8nn","339966":"Havgr\u00f8nn","33CCCC":"Turkis","3366FF":"Kongebl\u00e5","800080":"Purpur","999999":"Medium gr\u00e5",FF00FF:"Magentar\u00f8d",FFCC00:"Gull",FFFF00:"Gul","00FF00":"Limegr\u00f8nn","00FFFF":"Cyanbl\u00e5","00CCFF":"Himmelbl\u00e5","993366":"Brun",C0C0C0:"S\u00f8lv",FF99CC:"Rosa",FFCC99:"Fersken",FFFF99:"Lysgul",CCFFCC:"Lysegr\u00f8nn",CCFFFF:"Lys cyanbl\u00e5","99CCFF":"Lys himmelbl\u00e5",CC99FF:"Plomme",FFFFFF:"Hvit"},aria:{"rich_text_area":"Rikt tekstfelt"},wordcount:{words:"Ord:"}}}); \ No newline at end of file diff --git a/src/Umbraco.Web.UI.Client/lib/tinymce/langs/pl.js b/src/Umbraco.Web.UI.Client/lib/tinymce/langs/pl.js new file mode 100644 index 0000000000..b80cb7bc95 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/lib/tinymce/langs/pl.js @@ -0,0 +1,219 @@ +tinymce.addI18n('pl',{ +"Cut": "Wytnij", +"Heading 5": "Nag\u0142\u00f3wek 5", +"Header 2": "Nag\u0142\u00f3wek 2", +"Your browser doesn't support direct access to the clipboard. Please use the Ctrl+X\/C\/V keyboard shortcuts instead.": "Twoja przegl\u0105darka nie obs\u0142uguje bezpo\u015bredniego dost\u0119pu do schowka. U\u017cyj zamiast tego kombinacji klawiszy Ctrl+X\/C\/V.", +"Heading 4": "Nag\u0142\u00f3wek 4", +"Div": "Div", +"Heading 2": "Nag\u0142\u00f3wek 2", +"Paste": "Wklej", +"Close": "Zamknij", +"Font Family": "Kr\u00f3j fontu", +"Pre": "Sformatowany tekst", +"Align right": "Wyr\u00f3wnaj do prawej", +"New document": "Nowy dokument", +"Blockquote": "Blok cytatu", +"Numbered list": "Lista numerowana", +"Heading 1": "Nag\u0142\u00f3wek 1", +"Headings": "Nag\u0142\u00f3wki", +"Increase indent": "Zwi\u0119ksz wci\u0119cie", +"Formats": "Formaty", +"Headers": "Nag\u0142\u00f3wki", +"Select all": "Zaznacz wszystko", +"Header 3": "Nag\u0142\u00f3wek 3", +"Blocks": "Bloki", +"Undo": "Cofnij", +"Strikethrough": "Przekre\u015blenie", +"Bullet list": "Lista wypunktowana", +"Header 1": "Nag\u0142\u00f3wek 1", +"Superscript": "Indeks g\u00f3rny", +"Clear formatting": "Wyczy\u015b\u0107 formatowanie", +"Font Sizes": "Rozmiar fontu", +"Subscript": "Indeks dolny", +"Header 6": "Nag\u0142\u00f3wek 6", +"Redo": "Pon\u00f3w", +"Paragraph": "Akapit", +"Ok": "Ok", +"Bold": "Pogrubienie", +"Code": "Kod \u017ar\u00f3d\u0142owy", +"Italic": "Kursywa", +"Align center": "Wyr\u00f3wnaj do \u015brodka", +"Header 5": "Nag\u0142\u00f3wek 5", +"Heading 6": "Nag\u0142\u00f3wek 6", +"Heading 3": "Nag\u0142\u00f3wek 3", +"Decrease indent": "Zmniejsz wci\u0119cie", +"Header 4": "Nag\u0142\u00f3wek 4", +"Paste is now in plain text mode. Contents will now be pasted as plain text until you toggle this option off.": "Wklejanie jest w trybie tekstowym. Zawarto\u015b\u0107 zostanie wklejona jako zwyk\u0142y tekst dop\u00f3ki nie wy\u0142\u0105czysz tej opcji.", +"Underline": "Podkre\u015blenie", +"Cancel": "Anuluj", +"Justify": "Do lewej i prawej", +"Inline": "W tek\u015bcie", +"Copy": "Kopiuj", +"Align left": "Wyr\u00f3wnaj do lewej", +"Visual aids": "Pomoce wizualne", +"Lower Greek": "Ma\u0142e greckie", +"Square": "Kwadrat", +"Default": "Domy\u015blne", +"Lower Alpha": "Ma\u0142e litery", +"Circle": "K\u00f3\u0142ko", +"Disc": "Dysk", +"Upper Alpha": "Wielkie litery", +"Upper Roman": "Wielkie rzymskie", +"Lower Roman": "Ma\u0142e rzymskie", +"Name": "Nazwa", +"Anchor": "Kotwica", +"You have unsaved changes are you sure you want to navigate away?": "Masz niezapisane zmiany. Czy na pewno chcesz opu\u015bci\u0107 stron\u0119?", +"Restore last draft": "Przywr\u00f3\u0107 ostatni szkic", +"Special character": "Znak specjalny", +"Source code": "Kod \u017ar\u00f3d\u0142owy", +"B": "B", +"R": "R", +"G": "G", +"Color": "Kolor", +"Right to left": "Od prawej do lewej", +"Left to right": "Od lewej do prawej", +"Emoticons": "Ikony emocji", +"Robots": "Roboty", +"Document properties": "W\u0142a\u015bciwo\u015bci dokumentu", +"Title": "Tytu\u0142", +"Keywords": "S\u0142owa kluczowe", +"Encoding": "Kodowanie", +"Description": "Opis", +"Author": "Autor", +"Fullscreen": "Pe\u0142ny ekran", +"Horizontal line": "Pozioma linia", +"Horizontal space": "Odst\u0119p poziomy", +"Insert\/edit image": "Wstaw\/edytuj obrazek", +"General": "Og\u00f3lne", +"Advanced": "Zaawansowane", +"Source": "\u0179r\u00f3d\u0142o", +"Border": "Ramka", +"Constrain proportions": "Zachowaj proporcje", +"Vertical space": "Odst\u0119p pionowy", +"Image description": "Opis obrazka", +"Style": "Styl", +"Dimensions": "Wymiary", +"Insert image": "Wstaw obrazek", +"Zoom in": "Powi\u0119ksz", +"Contrast": "Kontrast", +"Back": "Cofnij", +"Gamma": "Gamma", +"Flip horizontally": "Przerzu\u0107 w poziomie", +"Resize": "Zmiana rozmiaru", +"Sharpen": "Wyostrz", +"Zoom out": "Pomniejsz", +"Image options": "Opcje obrazu", +"Apply": "Zaakceptuj", +"Brightness": "Jasno\u015b\u0107", +"Rotate clockwise": "Obr\u00f3\u0107 w prawo", +"Rotate counterclockwise": "Obr\u00f3\u0107 w lewo", +"Edit image": "Edytuj obrazek", +"Color levels": "Poziom koloru", +"Crop": "Przytnij", +"Orientation": "Orientacja", +"Flip vertically": "Przerzu\u0107 w pionie", +"Invert": "Odwr\u00f3\u0107", +"Insert date\/time": "Wstaw dat\u0119\/czas", +"Remove link": "Usu\u0144 \u0142\u0105cze", +"Url": "URL", +"Text to display": "Tekst do wy\u015bwietlenia", +"Anchors": "Kotwice", +"Insert link": "Wstaw \u0142\u0105cze", +"New window": "Nowe okno", +"None": "\u017baden", +"The URL you entered seems to be an external link. Do you want to add the required http:\/\/ prefix?": "URL, kt\u00f3ry wprowadzi\u0142e\u015b wygl\u0105da na link zewn\u0119trzny. Czy chcesz doda\u0107 http:\/\/ jako prefiks?", +"Target": "Cel", +"The URL you entered seems to be an email address. Do you want to add the required mailto: prefix?": "URL, kt\u00f3ry wprowadzi\u0142e\u015b wygl\u0105da na adres e-mail. Czy chcesz doda\u0107 mailto: jako prefiks?", +"Insert\/edit link": "Wstaw\/edytuj \u0142\u0105cze", +"Insert\/edit video": "Wstaw\/edytuj wideo", +"Poster": "Plakat", +"Alternative source": "Alternatywne \u017ar\u00f3d\u0142o", +"Paste your embed code below:": "Wklej tutaj kod do osadzenia:", +"Insert video": "Wstaw wideo", +"Embed": "Osad\u017a", +"Nonbreaking space": "Nie\u0142amliwa spacja", +"Page break": "Podzia\u0142 strony", +"Paste as text": "Wklej jako zwyk\u0142y tekst", +"Preview": "Podgl\u0105d", +"Print": "Drukuj", +"Save": "Zapisz", +"Could not find the specified string.": "Nie znaleziono szukanego tekstu.", +"Replace": "Zamie\u0144", +"Next": "Nast.", +"Whole words": "Ca\u0142e s\u0142owa", +"Find and replace": "Znajd\u017a i zamie\u0144", +"Replace with": "Zamie\u0144 na", +"Find": "Znajd\u017a", +"Replace all": "Zamie\u0144 wszystko", +"Match case": "Dopasuj wielko\u015b\u0107 liter", +"Prev": "Poprz.", +"Spellcheck": "Sprawdzanie pisowni", +"Finish": "Zako\u0144cz", +"Ignore all": "Ignoruj wszystko", +"Ignore": "Ignoruj", +"Add to Dictionary": "Dodaj do s\u0142ownika", +"Insert row before": "Wstaw wiersz przed", +"Rows": "Wiersz.", +"Height": "Wysoko\u015b\u0107", +"Paste row after": "Wklej wiersz po", +"Alignment": "Wyr\u00f3wnanie", +"Border color": "Kolor ramki", +"Column group": "Grupa kolumn", +"Row": "Wiersz", +"Insert column before": "Wstaw kolumn\u0119 przed", +"Split cell": "Podziel kom\u00f3rk\u0119", +"Cell padding": "Dope\u0142nienie kom\u00f3rki", +"Cell spacing": "Odst\u0119py kom\u00f3rek", +"Row type": "Typ wiersza", +"Insert table": "Wstaw tabel\u0119", +"Body": "Tre\u015b\u0107", +"Caption": "Tytu\u0142", +"Footer": "Stopka", +"Delete row": "Usu\u0144 wiersz", +"Paste row before": "Wklej wiersz przed", +"Scope": "Kontekst", +"Delete table": "Usu\u0144 tabel\u0119", +"H Align": "Wyr\u00f3wnanie w pionie", +"Top": "G\u00f3ra", +"Header cell": "Kom\u00f3rka nag\u0142\u00f3wka", +"Column": "Kolumna", +"Row group": "Grupa wierszy", +"Cell": "Kom\u00f3rka", +"Middle": "\u015arodek", +"Cell type": "Typ kom\u00f3rki", +"Copy row": "Kopiuj wiersz", +"Row properties": "W\u0142a\u015bciwo\u015bci wiersza", +"Table properties": "W\u0142a\u015bciwo\u015bci tabeli", +"Bottom": "D\u00f3\u0142", +"V Align": "Wyr\u00f3wnanie w poziomie", +"Header": "Nag\u0142\u00f3wek", +"Right": "Prawo", +"Insert column after": "Wstaw kolumn\u0119 po", +"Cols": "Kol.", +"Insert row after": "Wstaw wiersz po", +"Width": "Szeroko\u015b\u0107", +"Cell properties": "W\u0142a\u015bciwo\u015bci kom\u00f3rki", +"Left": "Lewo", +"Cut row": "Wytnij wiersz", +"Delete column": "Usu\u0144 kolumn\u0119", +"Center": "\u015arodek", +"Merge cells": "\u0141\u0105cz kom\u00f3rki", +"Insert template": "Wstaw szablon", +"Templates": "Szablony", +"Background color": "Kolor t\u0142a", +"Custom...": "Niestandardowy...", +"Custom color": "Kolor niestandardowy", +"No color": "Bez koloru", +"Text color": "Kolor tekstu", +"Show blocks": "Poka\u017c bloki", +"Show invisible characters": "Poka\u017c niewidoczne znaki", +"Words: {0}": "S\u0142\u00f3w: {0}", +"Insert": "Wstaw", +"File": "Plik", +"Edit": "Edycja", +"Rich Text Area. Press ALT-F9 for menu. Press ALT-F10 for toolbar. Press ALT-0 for help": "Obszar Edycji. ALT-F9 - menu. ALT-F10 - pasek narz\u0119dzi. ALT-0 - pomoc", +"Tools": "Narz\u0119dzia", +"View": "Widok", +"Table": "Tabela", +"Format": "Format" +}); \ No newline at end of file diff --git a/src/Umbraco.Web.UI.Client/lib/tinymce/langs/pt.js b/src/Umbraco.Web.UI.Client/lib/tinymce/langs/pt.js new file mode 100644 index 0000000000..809f1c2d9b --- /dev/null +++ b/src/Umbraco.Web.UI.Client/lib/tinymce/langs/pt.js @@ -0,0 +1 @@ +tinyMCE.addI18n({pt:{common:{"more_colors":"Mais Cores","invalid_data":"Erro: Valores inv\u00e1lidos marcados em vermelho.","popup_blocked":"Detectamos que o seu bloqueador de popups bloqueou uma janela que \u00e9 essencial para a aplica\u00e7\u00e3o. Voc\u00ea precisa desativar o bloqueador de janelas de popups para utilizar esta ferramenta.","clipboard_no_support":"O seu browser n\u00e3o suporta esta fun\u00e7\u00e3o, use os atalhos do teclado.","clipboard_msg":"Copiar/recortar/colar n\u00e3o est\u00e1 dispon\u00edvel no Mozilla e Firefox. Deseja mais informa\u00e7\u00f5es sobre este problema?","not_set":"-- N/A --","class_name":"Classe",browse:"Procurar",close:"Fechar",cancel:"Cancelar",update:"Atualizar",insert:"Inserir",apply:"Aplicar","edit_confirm":"Deseja usar o modo de edi\u00e7\u00e3o avan\u00e7ado neste campo de texto?","invalid_data_number":"{#field} deve ser um n\u00famero","invalid_data_min":"{#field} deve ser um n\u00famero maior que {#min}","invalid_data_size":"{#field} deve ser um n\u00famero ou uma percentagem",value:"(valor)"},contextmenu:{full:"Justificado",right:"Direita",center:"Centro",left:"Esquerda",align:"Alinhamento"},insertdatetime:{"day_short":"Dom,Seg,Ter,Qua,Qui,Sex,Sab,Dom","day_long":"Domingo,Segunda-feira,Ter\u00e7a-feira,Quarta-feira,Quinta-feira,Sexta-feira,S\u00e1bado,Domingo","months_short":"Jan,Fev,Mar,Abr,Mai,Jun,Jul,Ago,Set,Out,Nov,Dez","months_long":"Janeiro,Fevereiro,Mar\u00e7o,Abril,Maio,Junho,Julho,Agosto,Setembro,Outubro,Novembro,Dezembro","inserttime_desc":"Inserir hora","insertdate_desc":"Inserir data","time_fmt":"%H:%M:%S","date_fmt":"%d-%m-%Y"},print:{"print_desc":"Imprimir"},preview:{"preview_desc":"Pr\u00e9-visualizar"},directionality:{"rtl_desc":"Da direita para esquerda","ltr_desc":"Da esquerda para direita"},layer:{content:"Nova camada...","absolute_desc":"Alternar o posicionamento absoluto","backward_desc":"Mover para tr\u00e1s","forward_desc":"Mover para frente","insertlayer_desc":"Inserir nova camada"},save:{"save_desc":"Salvar","cancel_desc":"Cancelar todas as altera\u00e7\u00f5es"},nonbreaking:{"nonbreaking_desc":"Inserir um espa\u00e7o \"sem quebra\""},iespell:{download:"Plugin de ortografia n\u00e3o-detectado. Deseja instalar agora?","iespell_desc":"Verificar ortografia"},advhr:{"advhr_desc":"Separador horizontal","delta_height":"","delta_width":""},emotions:{"emotions_desc":"Emoticons","delta_height":"","delta_width":""},searchreplace:{"replace_desc":"Localizar/substituir","search_desc":"Localizar","delta_width":"","delta_height":""},advimage:{"image_desc":"Inserir/editar imagem","delta_width":"","delta_height":""},advlink:{"delta_width":"50","link_desc":"Inserir/editar hyperlink","delta_height":""},xhtmlxtras:{"attribs_desc":"Inserir/Editar atributos","ins_desc":"Inserir","del_desc":"Apagar","acronym_desc":"Acr\u00f4nimo","abbr_desc":"Abrevia\u00e7\u00e3o","cite_desc":"Cita\u00e7\u00e3o","attribs_delta_height":"","attribs_delta_width":"","ins_delta_height":"","ins_delta_width":"","del_delta_height":"","del_delta_width":"","acronym_delta_height":"","acronym_delta_width":"","abbr_delta_height":"","abbr_delta_width":"","cite_delta_height":"","cite_delta_width":""},style:{desc:"Editar CSS","delta_height":"","delta_width":""},paste:{"plaintext_mode":"Comando colar est\u00e1 em modo texto simples. Clique novamente para voltar para o modo normal.","plaintext_mode_sticky":"Comando colar est\u00e1 em modo texto simples. Clique novamente para voltar para o modo normal. Depois de colar alguma coisa retornar\u00e1 para o modo normal.","selectall_desc":"Selecionar tudo","paste_word_desc":"Colar (copiado do WORD)","paste_text_desc":"Colar como texto simples"},"paste_dlg":{"word_title":"Use CTRL+V para colar o texto na janela.","text_linebreaks":"Manter quebras de linha","text_title":"Use CTRL+V para colar o texto na janela."},table:{cell:"C\u00e9lula",col:"Coluna",row:"Linha",del:"Apagar tabela","copy_row_desc":"Copiar linha","cut_row_desc":"Recortar linha","paste_row_after_desc":"Colar linha depois","paste_row_before_desc":"Colar linha antes","props_desc":"Propriedades da tabela","cell_desc":"Propriedades das c\u00e9lulas","row_desc":"Propriedades das linhas","merge_cells_desc":"Unir c\u00e9lulas","split_cells_desc":"Dividir c\u00e9lulas","delete_col_desc":"Remover coluna","col_after_desc":"Inserir coluna depois","col_before_desc":"Inserir coluna antes","delete_row_desc":"Apagar linha","row_after_desc":"Inserir linha depois","row_before_desc":"Inserir linha antes",desc:"Inserir nova tabela","merge_cells_delta_height":"","merge_cells_delta_width":"","table_delta_height":"","table_delta_width":"","cellprops_delta_height":"","cellprops_delta_width":"","rowprops_delta_height":"","rowprops_delta_width":""},autosave:{"warning_message":"Se restaurar o conte\u00fado, voc\u00ea ir\u00e1 perder tudo que est\u00e1 atualmente no editor.\n\nTem certeza que quer restaurar o conte\u00fado salvo?","restore_content":"Restaura conte\u00fado salvo automaticamente.","unload_msg":"As mudan\u00e7as efetuadas ser\u00e3o perdidas se sair desta p\u00e1gina."},fullscreen:{desc:"Tela Inteira"},media:{edit:"Editar m\u00eddia embutida",desc:"Inserir/Editar m\u00eddia embutida","delta_height":"","delta_width":""},fullpage:{desc:"Propriedades do Documento","delta_width":"","delta_height":""},template:{desc:"Inserir template"},visualchars:{desc:"Caracteres de controle visual ligado/desligado"},spellchecker:{desc:"Alternar verifica\u00e7\u00e3o ortogr\u00e1fica",menu:"Configura\u00e7\u00f5es de ortografia","ignore_word":"Ignorar palavra","ignore_words":"Ignorar tudo",langs:"Linguagens",wait:"Aguarde...",sug:"Sugest\u00f5es","no_sug":"Sem sugest\u00f5es","no_mpell":"N\u00e3o foram detectados erros de ortografia.","learn_word":"Aprender palavra"},pagebreak:{desc:"Inserir quebra de p\u00e1gina."},advlist:{types:"Tipos",def:"Padr\u00e3o","lower_alpha":"Alfabeto min\u00fasculo","lower_greek":"Alfabeto grego","lower_roman":"Num. romanos min\u00fasculos","upper_alpha":"Alfabeto mai\u00fasculos","upper_roman":"Num. romanos mai\u00fasculos",circle:"C\u00edrculo",disc:"Disco",square:"Quadrado"},colors:{"333300":"Oliva escuro","993300":"Laranja queimado","000000":"Preto","003300":"Verde escuro","003366":"Azul escuro","000080":"Azul marinho","333399":"\u00cdndigo","333333":"Cinza muito escuro","800000":"Marrom 1",FF6600:"Laranja","808000":"Oliva","008000":"Verde","008080":"Verde azulado","0000FF":"Azul","666699":"Azul acinzentado","808080":"Cinza",FF0000:"Vermelho",FF9900:"\u00c2mbar","99CC00":"Amarelo esverdeado","339966":"Verde mar","33CCCC":"Turquesa","3366FF":"Azul real","800080":"Roxo","999999":"Cinza m\u00e9dio",FF00FF:"Magenta",FFCC00:"Ouro",FFFF00:"Amarelo","00FF00":"Lima","00FFFF":"\u00c1gua","00CCFF":"Azul celeste","993366":"Marrom 2",C0C0C0:"Prata",FF99CC:"Rosa",FFCC99:"P\u00eassego",FFFF99:"Amarelo claro",CCFFCC:"Verde p\u00e1lido",CCFFFF:"Ciano p\u00e1lido","99CCFF":"Azul celeste claro",CC99FF:"Ameixa",FFFFFF:"Branco"},aria:{"rich_text_area":"\u00c1rea de texto rico"},wordcount:{words:"Palavras:"}}}); \ No newline at end of file diff --git a/src/Umbraco.Web.UI.Client/lib/tinymce/langs/ru.js b/src/Umbraco.Web.UI.Client/lib/tinymce/langs/ru.js new file mode 100644 index 0000000000..110a978002 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/lib/tinymce/langs/ru.js @@ -0,0 +1,219 @@ +tinymce.addI18n('ru',{ +"Cut": "\u0412\u044b\u0440\u0435\u0437\u0430\u0442\u044c", +"Heading 5": "\u0417\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a 5", +"Header 2": "\u0417\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a 2", +"Your browser doesn't support direct access to the clipboard. Please use the Ctrl+X\/C\/V keyboard shortcuts instead.": "\u0412\u0430\u0448 \u0431\u0440\u0430\u0443\u0437\u0435\u0440 \u043d\u0435 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442 \u043f\u0440\u044f\u043c\u043e\u0439 \u0434\u043e\u0441\u0442\u0443\u043f \u043a \u0431\u0443\u0444\u0435\u0440\u0443 \u043e\u0431\u043c\u0435\u043d\u0430. \u041f\u043e\u0436\u0430\u043b\u0443\u0439\u0441\u0442\u0430, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0439\u0442\u0435 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u0441\u043e\u0447\u0435\u0442\u0430\u043d\u0438\u044f \u043a\u043b\u0430\u0432\u0438\u0448: Ctrl+X\/C\/V.", +"Heading 4": "\u0417\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a 4", +"Div": "\u0411\u043b\u043e\u043a", +"Heading 2": "\u0417\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a 2", +"Paste": "\u0412\u0441\u0442\u0430\u0432\u0438\u0442\u044c", +"Close": "\u0417\u0430\u043a\u0440\u044b\u0442\u044c", +"Font Family": "\u0428\u0440\u0438\u0444\u0442", +"Pre": "\u041f\u0440\u0435\u0434\u0432\u0430\u0440\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0435 \u0444\u043e\u0440\u043c\u0430\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435", +"Align right": "\u041f\u043e \u043f\u0440\u0430\u0432\u043e\u043c\u0443 \u043a\u0440\u0430\u044e", +"New document": "\u041d\u043e\u0432\u044b\u0439 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442", +"Blockquote": "\u0426\u0438\u0442\u0430\u0442\u0430", +"Numbered list": "\u041d\u0443\u043c\u0435\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u0441\u043f\u0438\u0441\u043e\u043a", +"Heading 1": "\u0417\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a 1", +"Headings": "\u0417\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0438", +"Increase indent": "\u0423\u0432\u0435\u043b\u0438\u0447\u0438\u0442\u044c \u043e\u0442\u0441\u0442\u0443\u043f", +"Formats": "\u0424\u043e\u0440\u043c\u0430\u0442", +"Headers": "\u0417\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0438", +"Select all": "\u0412\u044b\u0434\u0435\u043b\u0438\u0442\u044c \u0432\u0441\u0435", +"Header 3": "\u0417\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a 3", +"Blocks": "\u0411\u043b\u043e\u043a\u0438", +"Undo": "\u0412\u0435\u0440\u043d\u0443\u0442\u044c", +"Strikethrough": "\u0417\u0430\u0447\u0435\u0440\u043a\u043d\u0443\u0442\u044b\u0439", +"Bullet list": "\u041c\u0430\u0440\u043a\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u0441\u043f\u0438\u0441\u043e\u043a", +"Header 1": "\u0417\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a 1", +"Superscript": "\u0412\u0435\u0440\u0445\u043d\u0438\u0439 \u0438\u043d\u0434\u0435\u043a\u0441", +"Clear formatting": "\u041e\u0447\u0438\u0441\u0442\u0438\u0442\u044c \u0444\u043e\u0440\u043c\u0430\u0442", +"Font Sizes": "\u0420\u0430\u0437\u043c\u0435\u0440 \u0448\u0440\u0438\u0444\u0442\u0430", +"Subscript": "\u041d\u0438\u0436\u043d\u0438\u0439 \u0438\u043d\u0434\u0435\u043a\u0441", +"Header 6": "\u0417\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a 6", +"Redo": "\u041e\u0442\u043c\u0435\u043d\u0438\u0442\u044c", +"Paragraph": "\u041f\u0430\u0440\u0430\u0433\u0440\u0430\u0444", +"Ok": "\u041e\u043a", +"Bold": "\u041f\u043e\u043b\u0443\u0436\u0438\u0440\u043d\u044b\u0439", +"Code": "\u041a\u043e\u0434", +"Italic": "\u041a\u0443\u0440\u0441\u0438\u0432", +"Align center": "\u041f\u043e \u0446\u0435\u043d\u0442\u0440\u0443", +"Header 5": "\u0417\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a 5", +"Heading 6": "\u0417\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a 6", +"Heading 3": "\u0417\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a 3", +"Decrease indent": "\u0423\u043c\u0435\u043d\u044c\u0448\u0438\u0442\u044c \u043e\u0442\u0441\u0442\u0443\u043f", +"Header 4": "\u0417\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a 4", +"Paste is now in plain text mode. Contents will now be pasted as plain text until you toggle this option off.": "\u0412\u0441\u0442\u0430\u0432\u043a\u0430 \u043e\u0441\u0443\u0449\u0435\u0441\u0442\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0432 \u0432\u0438\u0434\u0435 \u043f\u0440\u043e\u0441\u0442\u043e\u0433\u043e \u0442\u0435\u043a\u0441\u0442\u0430, \u043f\u043e\u043a\u0430 \u043d\u0435 \u043e\u0442\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u0434\u0430\u043d\u043d\u0443\u044e \u043e\u043f\u0446\u0438\u044e.", +"Underline": "\u041f\u043e\u0434\u0447\u0435\u0440\u043a\u043d\u0443\u0442\u044b\u0439", +"Cancel": "\u041e\u0442\u043c\u0435\u043d\u0438\u0442\u044c", +"Justify": "\u041f\u043e \u0448\u0438\u0440\u0438\u043d\u0435", +"Inline": "\u0421\u0442\u0440\u043e\u0447\u043d\u044b\u0435", +"Copy": "\u041a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u0442\u044c", +"Align left": "\u041f\u043e \u043b\u0435\u0432\u043e\u043c\u0443 \u043a\u0440\u0430\u044e", +"Visual aids": "\u041f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0442\u044c \u043a\u043e\u043d\u0442\u0443\u0440\u044b", +"Lower Greek": "\u0421\u0442\u0440\u043e\u0447\u043d\u044b\u0435 \u0433\u0440\u0435\u0447\u0435\u0441\u043a\u0438\u0435 \u0431\u0443\u043a\u0432\u044b", +"Square": "\u041a\u0432\u0430\u0434\u0440\u0430\u0442\u044b", +"Default": "\u0421\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u0439", +"Lower Alpha": "\u0421\u0442\u0440\u043e\u0447\u043d\u044b\u0435 \u043b\u0430\u0442\u0438\u043d\u0441\u043a\u0438\u0435 \u0431\u0443\u043a\u0432\u044b", +"Circle": "\u041e\u043a\u0440\u0443\u0436\u043d\u043e\u0441\u0442\u0438", +"Disc": "\u041a\u0440\u0443\u0433\u0438", +"Upper Alpha": "\u0417\u0430\u0433\u043b\u0430\u0432\u043d\u044b\u0435 \u043b\u0430\u0442\u0438\u043d\u0441\u043a\u0438\u0435 \u0431\u0443\u043a\u0432\u044b", +"Upper Roman": "\u0417\u0430\u0433\u043b\u0430\u0432\u043d\u044b\u0435 \u0440\u0438\u043c\u0441\u043a\u0438\u0435 \u0446\u0438\u0444\u0440\u044b", +"Lower Roman": "\u0421\u0442\u0440\u043e\u0447\u043d\u044b\u0435 \u0440\u0438\u043c\u0441\u043a\u0438\u0435 \u0446\u0438\u0444\u0440\u044b", +"Name": "\u0418\u043c\u044f", +"Anchor": "\u042f\u043a\u043e\u0440\u044c", +"You have unsaved changes are you sure you want to navigate away?": "\u0423 \u0432\u0430\u0441 \u0435\u0441\u0442\u044c \u043d\u0435 \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u043d\u044b\u0435 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f. \u0412\u044b \u0443\u0432\u0435\u0440\u0435\u043d\u044b, \u0447\u0442\u043e \u0445\u043e\u0442\u0438\u0442\u0435 \u0443\u0439\u0442\u0438?", +"Restore last draft": "\u0412\u043e\u0441\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0433\u043e \u043f\u0440\u043e\u0435\u043a\u0442\u0430", +"Special character": "\u0421\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u044b\u0435 \u0441\u0438\u043c\u0432\u043e\u043b\u044b", +"Source code": "\u0418\u0441\u0445\u043e\u0434\u043d\u044b\u0439 \u043a\u043e\u0434", +"B": "B", +"R": "R", +"G": "G", +"Color": "\u0426\u0432\u0435\u0442", +"Right to left": "\u041d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0441\u043f\u0440\u0430\u0432\u0430 \u043d\u0430\u043b\u0435\u0432\u043e", +"Left to right": "\u041d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0441\u043b\u0435\u0432\u0430 \u043d\u0430\u043f\u0440\u0430\u0432\u043e", +"Emoticons": "\u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0441\u043c\u0430\u0439\u043b", +"Robots": "\u0420\u043e\u0431\u043e\u0442\u044b", +"Document properties": "\u0421\u0432\u043e\u0439\u0441\u0442\u0432\u0430 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430", +"Title": "\u0417\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a", +"Keywords": "\u041a\u043b\u044e\u0447\u0438\u0432\u044b\u0435 \u0441\u043b\u043e\u0432\u0430", +"Encoding": "\u041a\u043e\u0434\u0438\u0440\u043e\u0432\u043a\u0430", +"Description": "\u041e\u043f\u0438\u0441\u0430\u043d\u0438\u0435", +"Author": "\u0410\u0432\u0442\u043e\u0440", +"Fullscreen": "\u041f\u043e\u043b\u043d\u043e\u044d\u043a\u0440\u0430\u043d\u043d\u044b\u0439 \u0440\u0435\u0436\u0438\u043c", +"Horizontal line": "\u0413\u043e\u0440\u0438\u0437\u043e\u043d\u0442\u0430\u043b\u044c\u043d\u0430\u044f \u043b\u0438\u043d\u0438\u044f", +"Horizontal space": "\u0413\u043e\u0440\u0438\u0437\u043e\u043d\u0442\u0430\u043b\u044c\u043d\u044b\u0439 \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b", +"Insert\/edit image": "\u0412\u0441\u0442\u0430\u0432\u0438\u0442\u044c\/\u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435", +"General": "\u041e\u0431\u0449\u0435\u0435", +"Advanced": "\u0420\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u043d\u044b\u0435", +"Source": "\u0418\u0441\u0442\u043e\u0447\u043d\u0438\u043a", +"Border": "\u0420\u0430\u043c\u043a\u0430", +"Constrain proportions": "\u0421\u043e\u0445\u0440\u0430\u043d\u044f\u0442\u044c \u043f\u0440\u043e\u043f\u043e\u0440\u0446\u0438\u0438", +"Vertical space": "\u0412\u0435\u0440\u0442\u0438\u043a\u0430\u043b\u044c\u043d\u044b\u0439 \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b", +"Image description": "\u041e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f", +"Style": "\u0421\u0442\u0438\u043b\u044c", +"Dimensions": "\u0420\u0430\u0437\u043c\u0435\u0440", +"Insert image": "\u0412\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435", +"Zoom in": "\u041f\u0440\u0438\u0431\u043b\u0438\u0437\u0438\u0442\u044c", +"Contrast": "\u041a\u043e\u043d\u0442\u0440\u0430\u0441\u0442", +"Back": "\u041d\u0430\u0437\u0430\u0434", +"Gamma": "\u0413\u0430\u043c\u043c\u0430", +"Flip horizontally": "\u041e\u0442\u0440\u0430\u0437\u0438\u0442\u044c \u043f\u043e \u0433\u043e\u0440\u0438\u0437\u043e\u043d\u0442\u0430\u043b\u0438", +"Resize": "\u0418\u0437\u043c\u0435\u043d\u0438\u0442\u044c \u0440\u0430\u0437\u043c\u0435\u0440", +"Sharpen": "\u0427\u0435\u0442\u043a\u043e\u0441\u0442\u044c", +"Zoom out": "\u041e\u0442\u0434\u0430\u043b\u0438\u0442\u044c", +"Image options": "\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f", +"Apply": "\u041f\u0440\u0438\u043c\u0435\u043d\u0438\u0442\u044c", +"Brightness": "\u042f\u0440\u043a\u043e\u0441\u0442\u044c", +"Rotate clockwise": "\u041f\u043e\u0432\u0435\u0440\u043d\u0443\u0442\u044c \u043f\u043e \u0447\u0430\u0441\u043e\u0432\u043e\u0439 \u0441\u0442\u0440\u0435\u043b\u043a\u0435", +"Rotate counterclockwise": "\u041f\u043e\u0432\u0435\u0440\u043d\u0443\u0442\u044c \u043f\u0440\u043e\u0442\u0438\u0432 \u0447\u0430\u0441\u043e\u0432\u043e\u0439 \u0441\u0442\u0440\u0435\u043b\u043a\u0438", +"Edit image": "\u0420\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435", +"Color levels": "\u0426\u0432\u0435\u0442\u043e\u0432\u044b\u0435 \u0443\u0440\u043e\u0432\u043d\u0438", +"Crop": "\u041e\u0431\u0440\u0435\u0437\u0430\u0442\u044c", +"Orientation": "\u041e\u0440\u0438\u0435\u043d\u0442\u0430\u0446\u0438\u044f", +"Flip vertically": "\u041e\u0442\u0440\u0430\u0437\u0438\u0442\u044c \u043f\u043e \u0432\u0435\u0440\u0442\u0438\u043a\u0430\u043b\u0438", +"Invert": "\u0418\u043d\u0432\u0435\u0440\u0441\u0438\u044f", +"Insert date\/time": "\u0412\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0434\u0430\u0442\u0443\/\u0432\u0440\u0435\u043c\u044f", +"Remove link": "\u0423\u0434\u0430\u043b\u0438\u0442\u044c \u0441\u0441\u044b\u043b\u043a\u0443", +"Url": "\u0410\u0434\u0440\u0435\u0441 \u0441\u0441\u044b\u043b\u043a\u0438", +"Text to display": "\u041e\u0442\u043e\u0431\u0440\u0430\u0436\u0430\u0435\u043c\u044b\u0439 \u0442\u0435\u043a\u0441\u0442", +"Anchors": "\u042f\u043a\u043e\u0440\u044f", +"Insert link": "\u0412\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0441\u0441\u044b\u043b\u043a\u0443", +"New window": "\u0412 \u043d\u043e\u0432\u043e\u043c \u043e\u043a\u043d\u0435", +"None": "\u041d\u0435\u0442", +"The URL you entered seems to be an external link. Do you want to add the required http:\/\/ prefix?": "\u0412\u0432\u0435\u0434\u0451\u043d\u043d\u044b\u0439 URL \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0432\u043d\u0435\u0448\u043d\u0435\u0439 \u0441\u0441\u044b\u043b\u043a\u043e\u0439. \u0412\u044b \u0436\u0435\u043b\u0430\u0435\u0442\u0435 \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043f\u0440\u0435\u0444\u0438\u043a\u0441 \u00abhttp:\/\/\u00bb?", +"Target": "\u041e\u0442\u043a\u0440\u044b\u0432\u0430\u0442\u044c \u0441\u0441\u044b\u043b\u043a\u0443", +"The URL you entered seems to be an email address. Do you want to add the required mailto: prefix?": "\u0412\u0432\u0435\u0434\u0451\u043d\u043d\u044b\u0439 URL \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u044b\u043c \u0430\u0434\u0440\u0435\u0441\u043e\u043c \u044d\u043b\u0435\u043a\u0442\u0440\u043e\u043d\u043d\u043e\u0439 \u043f\u043e\u0447\u0442\u044b. \u0412\u044b \u0436\u0435\u043b\u0430\u0435\u0442\u0435 \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043f\u0440\u0435\u0444\u0438\u043a\u0441 \u00abmailto:\u00bb?", +"Insert\/edit link": "\u0412\u0441\u0442\u0430\u0432\u0438\u0442\u044c\/\u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0441\u0441\u044b\u043b\u043a\u0443", +"Insert\/edit video": "\u0412\u0441\u0442\u0430\u0432\u0438\u0442\u044c\/\u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0432\u0438\u0434\u0435\u043e", +"Poster": "\u0418\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435", +"Alternative source": "\u0410\u043b\u044c\u0442\u0435\u0440\u043d\u0430\u0442\u0438\u0432\u043d\u044b\u0439 \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a", +"Paste your embed code below:": "\u0412\u0441\u0442\u0430\u0432\u044c\u0442\u0435 \u0432\u0430\u0448 \u043a\u043e\u0434 \u043d\u0438\u0436\u0435:", +"Insert video": "\u0412\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0432\u0438\u0434\u0435\u043e", +"Embed": "\u041a\u043e\u0434 \u0434\u043b\u044f \u0432\u0441\u0442\u0430\u0432\u043a\u0438", +"Nonbreaking space": "\u041d\u0435\u0440\u0430\u0437\u0440\u044b\u0432\u043d\u044b\u0439 \u043f\u0440\u043e\u0431\u0435\u043b", +"Page break": "\u0420\u0430\u0437\u0440\u044b\u0432 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b", +"Paste as text": "\u0412\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u043a\u0430\u043a \u0442\u0435\u043a\u0441\u0442", +"Preview": "\u041f\u0440\u0435\u0434\u043f\u0440\u043e\u0441\u043c\u043e\u0442\u0440", +"Print": "\u041f\u0435\u0447\u0430\u0442\u044c", +"Save": "\u0421\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c", +"Could not find the specified string.": "\u0417\u0430\u0434\u0430\u043d\u043d\u0430\u044f \u0441\u0442\u0440\u043e\u043a\u0430 \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d\u0430", +"Replace": "\u0417\u0430\u043c\u0435\u043d\u0438\u0442\u044c", +"Next": "\u0412\u043d\u0438\u0437", +"Whole words": "\u0421\u043b\u043e\u0432\u043e \u0446\u0435\u043b\u0438\u043a\u043e\u043c", +"Find and replace": "\u041f\u043e\u0438\u0441\u043a \u0438 \u0437\u0430\u043c\u0435\u043d\u0430", +"Replace with": "\u0417\u0430\u043c\u0435\u043d\u0438\u0442\u044c \u043d\u0430", +"Find": "\u041d\u0430\u0439\u0442\u0438", +"Replace all": "\u0417\u0430\u043c\u0435\u043d\u0438\u0442\u044c \u0432\u0441\u0435", +"Match case": "\u0423\u0447\u0438\u0442\u044b\u0432\u0430\u0442\u044c \u0440\u0435\u0433\u0438\u0441\u0442\u0440", +"Prev": "\u0412\u0432\u0435\u0440\u0445", +"Spellcheck": "\u041f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c \u043f\u0440\u0430\u0432\u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435", +"Finish": "\u0417\u0430\u043a\u043e\u043d\u0447\u0438\u0442\u044c", +"Ignore all": "\u0418\u0433\u043d\u043e\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0432\u0441\u0435", +"Ignore": "\u0418\u0433\u043d\u043e\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c", +"Add to Dictionary": "\u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0432 \u0441\u043b\u043e\u0432\u0430\u0440\u044c", +"Insert row before": "\u0412\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u043f\u0443\u0441\u0442\u0443\u044e \u0441\u0442\u0440\u043e\u043a\u0443 \u0441\u0432\u0435\u0440\u0445\u0443", +"Rows": "\u0421\u0442\u0440\u043e\u043a\u0438", +"Height": "\u0412\u044b\u0441\u043e\u0442\u0430", +"Paste row after": "\u0412\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0441\u0442\u0440\u043e\u043a\u0443 \u0441\u043d\u0438\u0437\u0443", +"Alignment": "\u0412\u044b\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u043d\u0438\u0435", +"Border color": "\u0426\u0432\u0435\u0442 \u0440\u0430\u043c\u043a\u0438", +"Column group": "\u0413\u0440\u0443\u043f\u043f\u0430 \u043a\u043e\u043b\u043e\u043d\u043e\u043a", +"Row": "\u0421\u0442\u0440\u043e\u043a\u0430", +"Insert column before": "\u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0441\u0442\u043e\u043b\u0431\u0435\u0446 \u0441\u043b\u0435\u0432\u0430", +"Split cell": "\u0420\u0430\u0437\u0431\u0438\u0442\u044c \u044f\u0447\u0435\u0439\u043a\u0443", +"Cell padding": "\u0412\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0438\u0439 \u043e\u0442\u0441\u0442\u0443\u043f", +"Cell spacing": "\u0412\u043d\u0435\u0448\u043d\u0438\u0439 \u043e\u0442\u0441\u0442\u0443\u043f", +"Row type": "\u0422\u0438\u043f \u0441\u0442\u0440\u043e\u043a\u0438", +"Insert table": "\u0412\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0442\u0430\u0431\u043b\u0438\u0446\u0443", +"Body": "\u0422\u0435\u043b\u043e", +"Caption": "\u0417\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a", +"Footer": "\u041d\u0438\u0437", +"Delete row": "\u0423\u0434\u0430\u043b\u0438\u0442\u044c \u0441\u0442\u0440\u043e\u043a\u0443", +"Paste row before": "\u0412\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0441\u0442\u0440\u043e\u043a\u0443 \u0441\u0432\u0435\u0440\u0445\u0443", +"Scope": "Scope", +"Delete table": "\u0423\u0434\u0430\u043b\u0438\u0442\u044c \u0442\u0430\u0431\u043b\u0438\u0446\u0443", +"H Align": "\u0413\u043e\u0440\u0438\u0437\u043e\u043d\u0442\u0430\u043b\u044c\u043d\u043e\u0435 \u0432\u044b\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u043d\u0438\u0435", +"Top": "\u041f\u043e \u0432\u0435\u0440\u0445\u0443", +"Header cell": "\u0417\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a", +"Column": "\u0421\u0442\u043e\u043b\u0431\u0435\u0446", +"Row group": "\u0413\u0440\u0443\u043f\u043f\u0430 \u0441\u0442\u0440\u043e\u043a", +"Cell": "\u042f\u0447\u0435\u0439\u043a\u0430", +"Middle": "\u041f\u043e \u0441\u0435\u0440\u0435\u0434\u0438\u043d\u0435", +"Cell type": "\u0422\u0438\u043f \u044f\u0447\u0435\u0439\u043a\u0438", +"Copy row": "\u041a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0441\u0442\u0440\u043e\u043a\u0443", +"Row properties": "\u041f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u0441\u0442\u0440\u043e\u043a\u0438", +"Table properties": "\u0421\u0432\u043e\u0439\u0441\u0442\u0432\u0430 \u0442\u0430\u0431\u043b\u0438\u0446\u044b", +"Bottom": "\u041f\u043e \u043d\u0438\u0437\u0443", +"V Align": "\u0412\u0435\u0440\u0442\u0438\u043a\u0430\u043b\u044c\u043d\u043e\u0435 \u0432\u044b\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u043d\u0438\u0435", +"Header": "\u0428\u0430\u043f\u043a\u0430", +"Right": "\u041f\u043e \u043f\u0440\u0430\u0432\u043e\u043c\u0443 \u043a\u0440\u0430\u044e", +"Insert column after": "\u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0441\u0442\u043e\u043b\u0431\u0435\u0446 \u0441\u043f\u0440\u0430\u0432\u0430", +"Cols": "\u0421\u0442\u043e\u043b\u0431\u0446\u044b", +"Insert row after": "\u0412\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u043f\u0443\u0441\u0442\u0443\u044e \u0441\u0442\u0440\u043e\u043a\u0443 \u0441\u043d\u0438\u0437\u0443", +"Width": "\u0428\u0438\u0440\u0438\u043d\u0430", +"Cell properties": "\u041f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u044f\u0447\u0435\u0439\u043a\u0438", +"Left": "\u041f\u043e \u043b\u0435\u0432\u043e\u043c\u0443 \u043a\u0440\u0430\u044e", +"Cut row": "\u0412\u044b\u0440\u0435\u0437\u0430\u0442\u044c \u0441\u0442\u0440\u043e\u043a\u0443", +"Delete column": "\u0423\u0434\u0430\u043b\u0438\u0442\u044c \u0441\u0442\u043e\u043b\u0431\u0435\u0446", +"Center": "\u041f\u043e \u0446\u0435\u043d\u0442\u0440\u0443", +"Merge cells": "\u041e\u0431\u044a\u0435\u0434\u0438\u043d\u0438\u0442\u044c \u044f\u0447\u0435\u0439\u043a\u0438", +"Insert template": "\u0412\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0448\u0430\u0431\u043b\u043e\u043d", +"Templates": "\u0428\u0430\u0431\u043b\u043e\u043d\u044b", +"Background color": "\u0426\u0432\u0435\u0442 \u0444\u043e\u043d\u0430", +"Custom...": "\u0412\u044b\u0431\u0440\u0430\u0442\u044c\u2026", +"Custom color": "\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u0441\u043a\u0438\u0439 \u0446\u0432\u0435\u0442", +"No color": "\u0411\u0435\u0437 \u0446\u0432\u0435\u0442\u0430", +"Text color": "\u0426\u0432\u0435\u0442 \u0442\u0435\u043a\u0441\u0442\u0430", +"Show blocks": "\u041f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0442\u044c \u0431\u043b\u043e\u043a\u0438", +"Show invisible characters": "\u041f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0442\u044c \u043d\u0435\u0432\u0438\u0434\u0438\u043c\u044b\u0435 \u0441\u0438\u043c\u0432\u043e\u043b\u044b", +"Words: {0}": "\u041a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0441\u043b\u043e\u0432: {0}", +"Insert": "\u0412\u0441\u0442\u0430\u0432\u0438\u0442\u044c", +"File": "\u0424\u0430\u0439\u043b", +"Edit": "\u0418\u0437\u043c\u0435\u043d\u0438\u0442\u044c", +"Rich Text Area. Press ALT-F9 for menu. Press ALT-F10 for toolbar. Press ALT-0 for help": "\u0422\u0435\u043a\u0441\u0442\u043e\u0432\u043e\u0435 \u043f\u043e\u043b\u0435. \u041d\u0430\u0436\u043c\u0438\u0442\u0435 ALT-F9 \u0447\u0442\u043e\u0431\u044b \u0432\u044b\u0437\u0432\u0430\u0442\u044c \u043c\u0435\u043d\u044e, ALT-F10 \u043f\u0430\u043d\u0435\u043b\u044c \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u043e\u0432, ALT-0 \u0434\u043b\u044f \u0432\u044b\u0437\u043e\u0432\u0430 \u043f\u043e\u043c\u043e\u0449\u0438.", +"Tools": "\u0418\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u044b", +"View": "\u0412\u0438\u0434", +"Table": "\u0422\u0430\u0431\u043b\u0438\u0446\u0430", +"Format": "\u0424\u043e\u0440\u043c\u0430\u0442" +}); \ No newline at end of file diff --git a/src/Umbraco.Web.UI.Client/lib/tinymce/langs/sv.js b/src/Umbraco.Web.UI.Client/lib/tinymce/langs/sv.js new file mode 100644 index 0000000000..a2a3d77ffd --- /dev/null +++ b/src/Umbraco.Web.UI.Client/lib/tinymce/langs/sv.js @@ -0,0 +1 @@ +tinyMCE.addI18n({sv:{common:{"more_colors":"Fler f\u00e4rger","invalid_data":"Fel: Inkorrekta v\u00e4rden har matats in, dessa \u00e4r markerade i r\u00f6tt.","popup_blocked":"Popup blockerare detekterad. St\u00e4ng av den s\u00e5 att dialogerna kan \u00f6ppnas.","clipboard_no_support":"Funktionen \u00e4r inte tillg\u00e4nglig i din webbl\u00e4sare, anv\u00e4nd tangentbordsgenv\u00e4garna i st\u00e4llet.","clipboard_msg":"Kopiera/klipp ut/klistra in \u00e4r inte tillg\u00e4ngligt i din webbl\u00e4sare.\nVill du veta mer?","not_set":"-- Inte satt --","class_name":"Klass",browse:"Bl\u00e4ddra",close:"St\u00e4ng",cancel:"Avbryt",update:"Uppdatera",insert:"Infoga",apply:"Applicera","edit_confirm":"Vill du anv\u00e4nda WYSIWYG f\u00f6r denna textarea?","invalid_data_number":"{#field} m\u00e5ste vara ett nummer","invalid_data_min":"{#field} m\u00e5ste vara ett nummer st\u00f6rren \u00e4n {#min}","invalid_data_size":"{#field} m\u00e5ste vara ett nummer eller i procent",value:"(V\u00e4rde)"},contextmenu:{full:"Utfyllnad",right:"H\u00f6ger",center:"Centrerad",left:"V\u00e4nster",align:"Justering"},insertdatetime:{"day_short":"S\u00f6n,M\u00e5n,Tis,Ons,Tors,Fre,L\u00f6r,S\u00f6n","day_long":"S\u00f6ndag,M\u00e5ndag,Tisdag,Onsdag,Torsdag,Fredag,L\u00f6rdag,S\u00f6ndag","months_short":"Jan,Feb,Mar,Apr,Maj,Jun,Jul,Aug,Sep,Okt,Nov,Dec","months_long":"Januari,Februari,Mars,April,Maj,Juni,Juli,Augusti,September,Oktober,November,December","inserttime_desc":"Infoga tid","insertdate_desc":"Infoga datum","time_fmt":"%H:%M:%S","date_fmt":"%Y-%m-%d "},print:{"print_desc":"Skriv ut"},preview:{"preview_desc":"F\u00f6rhandsgranska"},directionality:{"rtl_desc":"Skriftl\u00e4ge - h\u00f6ger till v\u00e4nster","ltr_desc":"Skriftl\u00e4ge - v\u00e4nster till h\u00f6ger"},layer:{content:"Nytt lager...","absolute_desc":"Sl\u00e5 av/p\u00e5 absolut positionering","backward_desc":"Flytta bak\u00e5t","forward_desc":"Flytta fram\u00e5t","insertlayer_desc":"Infoga nytt lager"},save:{"save_desc":"Spara","cancel_desc":"Hoppa \u00f6ver alla f\u00f6r\u00e4ndringar"},nonbreaking:{"nonbreaking_desc":"Infoga icke radbrytande mellanslag"},iespell:{download:"ieSpell kunde inte hittas, vill du installera denna nu?","iespell_desc":"R\u00e4ttstava"},advhr:{"advhr_desc":"Horisontell skiljelinje","delta_height":"","delta_width":""},emotions:{"emotions_desc":"Smileys","delta_height":"","delta_width":""},searchreplace:{"replace_desc":"S\u00f6k/ers\u00e4tt","search_desc":"S\u00f6k","delta_width":"","delta_height":""},advimage:{"image_desc":"Infoga/redigera bild","delta_width":"","delta_height":""},advlink:{"link_desc":"Infoga/redigera l\u00e4nk","delta_height":"","delta_width":""},xhtmlxtras:{"attribs_desc":"Redigera attribut","ins_desc":"Markera som tillagt","del_desc":"Markera som struket","acronym_desc":"Akronym","abbr_desc":"F\u00f6rkortning","cite_desc":"citat","attribs_delta_height":"","attribs_delta_width":"","ins_delta_height":"","ins_delta_width":"","del_delta_height":"","del_delta_width":"","acronym_delta_height":"","acronym_delta_width":"","abbr_delta_height":"","abbr_delta_width":"","cite_delta_height":"","cite_delta_width":""},style:{desc:"Redigera inline CSS","delta_height":"","delta_width":""},paste:{"plaintext_mode":"Inklistring \u00e4r nu i textl\u00e4ge.","plaintext_mode_sticky":"Inklistring \u00e4r nu i textl\u00e4ge. Efter att du klistrat in kommer den att \u00e5terg\u00e5 till normall\u00e4ge.","selectall_desc":"Markera allt","paste_word_desc":"Klistra in fr\u00e5n Word","paste_text_desc":"Klistra in som text"},"paste_dlg":{"word_title":"Anv\u00e4nd ctrl-v p\u00e5 ditt tangentbord f\u00f6r att klistra in i detta f\u00f6nster.","text_linebreaks":"Spara radbrytningar","text_title":"Anv\u00e4nd ctrl-v p\u00e5 ditt tangentbord f\u00f6r att klistra in i detta f\u00f6nster."},table:{cell:"Cell",col:"Kolumn",row:"Rad",del:"Radera tabell","copy_row_desc":"Klistra in rad","cut_row_desc":"Klipp ut rad","paste_row_after_desc":"Klistra in rad efter","paste_row_before_desc":"Klistra in rad ovanf\u00f6r","props_desc":"Tabellinst\u00e4llningar","cell_desc":"Tabellcellsinst\u00e4llningar","row_desc":"Tabellradsinst\u00e4llningar","merge_cells_desc":"Sammanfoga celler","split_cells_desc":"Separera sammansatta celler","delete_col_desc":"Radera kolumn","col_after_desc":"Infoga kolumn efter","col_before_desc":"Infoga kolumn f\u00f6re","delete_row_desc":"Radera rad","row_after_desc":"Infoga ny rad efter","row_before_desc":"Infoga ny rad f\u00f6re",desc:"Infoga/redigera ny tabell","merge_cells_delta_height":"","merge_cells_delta_width":"","table_delta_height":"","table_delta_width":"","cellprops_delta_height":"","cellprops_delta_width":"","rowprops_delta_height":"","rowprops_delta_width":""},autosave:{"warning_message":"Om du \u00e5terskapar inneh\u00e5ll s\u00e5 kommer det nuvarande inneh\u00e5llet i f\u00e4ltet att raderas.\n\n\u00c4r du s\u00e4ker p\u00e5 att du vill g\u00f6ra detta?","restore_content":"\u00c5terskapa automatiskt sparat inneh\u00e5ll.","unload_msg":"De f\u00f6r\u00e4ndringar som du gjort kommer att g\u00e5 f\u00f6rlorade om du l\u00e4mnar sidan."},fullscreen:{desc:"Sl\u00e5 av/p\u00e5 fullsk\u00e4rmsl\u00e4ge"},media:{edit:"Redigera inb\u00e4ddad media",desc:"Infoga/redigera inb\u00e4ddad media","delta_height":"","delta_width":""},fullpage:{desc:"Dokumentinst\u00e4llningar","delta_width":"","delta_height":""},template:{desc:"Infoga en f\u00e4rdig mall"},visualchars:{desc:"Visa osynliga tecken"},spellchecker:{desc:"Sl\u00e5 av/p\u00e5 r\u00e4ttstavningskontroll",menu:"R\u00e4ttstavningsinst\u00e4llningar","ignore_word":"Ignorera ord","ignore_words":"Ignorera alla",langs:"Spr\u00e5k",wait:"Var god v\u00e4nta...",sug:"F\u00f6rslag","no_sug":"Inga f\u00f6rslag","no_mpell":"Inga felstavningar funna.","learn_word":"L\u00e4r ord"},pagebreak:{desc:"Infoga sidbrytning"},advlist:{types:"Typer",def:"Standard","lower_alpha":"Lower alpha","lower_greek":"Lower greek","lower_roman":"Lower roman","upper_alpha":"Upper alpha","upper_roman":"Upper roman",circle:"Cirkel",disc:"Disc",square:"Fyrkant"},colors:{"333300":"M\u00f6rkoliv","993300":"Br\u00e4ndorange","000000":"Svart","003300":"M\u00f6rkgr\u00f6n","003366":"M\u00f6rkazur","000080":"Marinbl\u00e5","333399":"Indigo","333333":"Mycket m\u00f6rkgr\u00e5","800000":"R\u00f6dbrun",FF6600:"Orange","808000":"Oliv","008000":"Gr\u00f6n","008080":"Kricka","0000FF":"Bl\u00e5","666699":"Gr\u00e5bl\u00e5","808080":"Gr\u00e5",FF0000:"R\u00f6d",FF9900:"B\u00e4rnsten","99CC00":"Gulgr\u00f6n","339966":"Havsbl\u00e5","33CCCC":"Turkos","3366FF":"Kungligtbl\u00e5tt","800080":"Lila","999999":"Medelgr\u00e5",FF00FF:"Magenta",FFCC00:"Guld",FFFF00:"Gul","00FF00":"Lime","00FFFF":"Vatten","00CCFF":"Himmelsbl\u00e5","993366":"Brun",C0C0C0:"Silver",FF99CC:"Rosa",FFCC99:"Periska",FFFF99:"Ljusgul",CCFFCC:"Blekgr\u00f6n",CCFFFF:"Blekcyan","99CCFF":"Ljus himmel",CC99FF:"Plommon",FFFFFF:"Vitt"},aria:{"rich_text_area":"Redigeringsarea"},wordcount:{words:"Ord:"}}}); \ No newline at end of file diff --git a/src/Umbraco.Web.UI.Client/lib/tinymce/langs/zh.js b/src/Umbraco.Web.UI.Client/lib/tinymce/langs/zh.js new file mode 100644 index 0000000000..42f7abbc96 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/lib/tinymce/langs/zh.js @@ -0,0 +1 @@ +tinyMCE.addI18n({"zh-cn":{common:{"more_colors":"\u66f4\u591a\u989c\u8272","invalid_data":"\u9519\u8bef\uff1a\u6807\u8bb0\u4e3a\u7ea2\u8272\u7684\u90e8\u5206\u6709\u8bef\u3002","popup_blocked":"\u62b1\u6b49\uff0c\u60a8\u7981\u7528\u4e86\u5f39\u51fa\u7a97\u53e3\u529f\u80fd\u3002\u4e3a\u4e86\u4f7f\u7528\u8be5\u5de5\u5177\u7684\u5168\u90e8\u529f\u80fd\uff0c\u60a8\u9700\u8981\u5141\u8bb8\u5f39\u51fa\u7a97\u53e3\u3002","clipboard_no_support":"\u60a8\u7684\u6d4f\u89c8\u5668\u4e0d\u652f\u6301\uff0c\u4f7f\u7528\u5feb\u6377\u952e\u4ee3\u66ff\u3002","clipboard_msg":"\u5728Mozilla\u548cFirefox\u4e2d\u4e0d\u80fd\u4f7f\u7528\u590d\u5236/\u7c98\u8d34/\u526a\u5207\u3002\u60a8\u8981\u67e5\u770b\u8be5\u95ee\u9898\u66f4\u591a\u7684\u4fe1\u606f\u5417\uff1f","not_set":"-- \u672a\u8bbe\u7f6e --","class_name":"\u7c7b\u522b",browse:"\u6d4f\u89c8",close:"\u5173\u95ed",cancel:"\u53d6\u6d88",update:"\u66f4\u65b0",insert:"\u63d2\u5165",apply:"\u5e94\u7528","edit_confirm":"\u8be5\u6587\u672c\u57df\u662f\u5426\u9700\u8981\u4f7f\u7528\u6240\u89c1\u5373\u6240\u5f97\u6a21\u5f0f\uff1f","invalid_data_number":"{#field} \u5fc5\u987b\u4e3a\u6570\u5b57","invalid_data_min":"{#field} \u5fc5\u987b\u4e3a\u5927\u4e8e {#min} \u7684\u6570\u5b57","invalid_data_size":"{#field} \u5fc5\u987b\u4e3a\u6570\u5b57\u6216\u767e\u5206\u6570",value:"(value)"},contextmenu:{full:"\u4e24\u7aef\u5bf9\u9f50",right:"\u53f3\u5bf9\u9f50",center:"\u5c45\u4e2d",left:"\u5de6\u5bf9\u9f50",align:"\u5bf9\u9f50"},insertdatetime:{"day_short":"\u5468\u65e5,\u5468\u4e00,\u5468\u4e8c,\u5468\u4e09,\u5468\u56db,\u5468\u4e94,\u5468\u516d,\u5468\u65e5","day_long":"\u661f\u671f\u65e5,\u661f\u671f\u4e00,\u661f\u671f\u4e8c,\u661f\u671f\u4e09,\u661f\u671f\u56db,\u661f\u671f\u4e94,\u661f\u671f\u516d,\u661f\u671f\u65e5","months_short":"1\u6708,2\u6708,3\u6708,4\u6708,5\u6708,6\u6708,7\u6708,8\u6708,9\u6708,10\u6708,11\u6708,12\u6708","months_long":"\u4e00\u6708,\u4e8c\u6708,\u4e09\u6708,\u56db\u6708,\u4e94\u6708,\u516d\u6708,\u4e03\u6708,\u516b\u6708,\u4e5d\u6708,\u5341\u6708,\u5341\u4e00\u6708,\u5341\u4e8c\u6708","inserttime_desc":"\u63d2\u5165\u65f6\u95f4","insertdate_desc":"\u63d2\u5165\u65e5\u671f","time_fmt":"%H:%M:%S","date_fmt":"%Y-%m-%d"},print:{"print_desc":"\u6253\u5370"},preview:{"preview_desc":"\u9884\u89c8"},directionality:{"rtl_desc":"\u6587\u5b57\u65b9\u5411\u4e3a\u4ece\u53f3\u5230\u5de6","ltr_desc":"\u6587\u5b57\u65b9\u5411\u4e3a\u4ece\u5de6\u5230\u53f3"},layer:{content:"\u65b0\u5efa\u5c42...","absolute_desc":"\u5207\u6362\u5230\u7edd\u5bf9\u4f4d\u7f6e","backward_desc":"\u7f6e\u540e","forward_desc":"\u7f6e\u524d","insertlayer_desc":"\u63d2\u5165\u65b0\u5c42"},save:{"save_desc":"\u4fdd\u5b58","cancel_desc":"\u53d6\u6d88\u66f4\u6539"},nonbreaking:{"nonbreaking_desc":"\u63d2\u5165\u4e0d\u95f4\u65ad\u7a7a\u683c\u7b26"},iespell:{download:"\u62fc\u5199\u68c0\u67e5\u672a\u5b89\u88c5\uff0c\u662f\u5426\u9a6c\u4e0a\u5b89\u88c5\uff1f","iespell_desc":"\u62fc\u5199\u68c0\u67e5"},advhr:{"delta_height":"\u9ad8\u5ea6","delta_width":"\u5bbd\u5ea6","advhr_desc":"\u6c34\u5e73\u7ebf"},emotions:{"emotions_desc":"\u8868\u60c5","delta_height":"","delta_width":""},searchreplace:{"replace_desc":"\u67e5\u627e/\u66ff\u6362","search_desc":"\u67e5\u627e","delta_width":"","delta_height":""},advimage:{"image_desc":"\u63d2\u5165/\u7f16\u8f91 \u56fe\u7247","delta_width":"","delta_height":""},advlink:{"link_desc":"\u63d2\u5165/\u7f16\u8f91 \u8d85\u94fe\u63a5","delta_height":"","delta_width":""},xhtmlxtras:{"attribs_desc":"\u63d2\u5165/\u7f16\u8f91\u5c5e\u6027","ins_desc":"\u63d2\u5165","del_desc":"\u5220\u9664","acronym_desc":"\u9996\u5b57\u6bcd\u7f29\u5199","abbr_desc":"\u7f29\u5199","cite_desc":"\u5f15\u7528","attribs_delta_height":"","attribs_delta_width":"","ins_delta_height":"","ins_delta_width":"","del_delta_height":"","del_delta_width":"","acronym_delta_height":"","acronym_delta_width":"","abbr_delta_height":"","abbr_delta_width":"","cite_delta_height":"","cite_delta_width":""},style:{desc:"\u7f16\u8f91CSS\u6837\u5f0f","delta_height":"","delta_width":""},paste:{"plaintext_mode":"\u5f53\u524d\u4e3a\u7eaf\u6587\u672c\u6a21\u5f0f\u7c98\u8d34\uff0c\u518d\u6b21\u70b9\u51fb\u8fd4\u56de\u666e\u901a\u7c98\u8d34\u6a21\u5f0f\u3002","plaintext_mode_sticky":"\u5f53\u524d\u4e3a\u7eaf\u6587\u672c\u6a21\u5f0f\u7c98\u8d34\u3002\u518d\u6b21\u70b9\u51fb\u8fd4\u56de\u666e\u901a\u7c98\u8d34\u6a21\u5f0f\uff0c\u5728\u60a8\u7c98\u8d34\u5185\u5bb9\u540e\u5c06\u8fd4\u56de\u666e\u901a\u7c98\u8d34\u6a21\u5f0f\u3002","selectall_desc":"\u5168\u9009","paste_word_desc":"\u4eceWord\u7c98\u8d34","paste_text_desc":"\u4ee5\u7eaf\u6587\u672c\u7c98\u8d34"},"paste_dlg":{"word_title":"\u4f7f\u7528CTRL V\u7c98\u8d34\u6587\u672c\u5230\u7a97\u53e3\u4e2d\u3002","text_linebreaks":"\u4fdd\u7559\u65ad\u884c","text_title":"\u4f7f\u7528CTRL V\u7c98\u8d34\u6587\u672c\u5230\u7a97\u53e3\u4e2d\u3002"},table:{cell:"\u5355\u5143\u683c",col:"\u5217",row:"\u884c",del:"\u5220\u9664\u8868\u683c","copy_row_desc":"\u590d\u5236\u884c","cut_row_desc":"\u526a\u5207\u884c","paste_row_after_desc":"\u5728\u4e0b\u65b9\u7c98\u8d34\u884c","paste_row_before_desc":"\u5728\u4e0a\u65b9\u7c98\u8d34\u884c","props_desc":"\u8868\u683c\u5c5e\u6027","cell_desc":"\u5355\u5143\u683c\u5c5e\u6027","row_desc":"\u884c\u5c5e\u6027","merge_cells_desc":"\u5408\u5e76\u5355\u5143\u683c","split_cells_desc":"\u5206\u5272\u5355\u5143\u683c","delete_col_desc":"\u5220\u9664\u5217","col_after_desc":"\u5728\u53f3\u4fa7\u63d2\u5165\u5217","col_before_desc":"\u5728\u5de6\u4fa7\u63d2\u5165\u5217","delete_row_desc":"\u5220\u9664\u884c","row_after_desc":"\u5728\u4e0b\u65b9\u63d2\u5165\u884c","row_before_desc":"\u5728\u4e0a\u65b9\u63d2\u5165\u884c",desc:"\u63d2\u5165\u65b0\u8868\u683c","merge_cells_delta_height":"","merge_cells_delta_width":"","table_delta_height":"","table_delta_width":"","cellprops_delta_height":"","cellprops_delta_width":"","rowprops_delta_height":"","rowprops_delta_width":""},autosave:{"warning_message":"\u5982\u679c\u6062\u590d\u4fdd\u5b58\u7684\u5185\u5bb9\uff0c\u60a8\u5f53\u524d\u7f16\u8f91\u7684\u6240\u6709\u7684\u5185\u5bb9\u5c06\u4e22\u5931\u3002nn\u60a8\u786e\u5b9a\u8981\u6062\u590d\u4fdd\u5b58\u7684\u5185\u5bb9\u5417\uff1f","restore_content":"\u6062\u590d\u81ea\u52a8\u4fdd\u5b58\u7684\u5185\u5bb9\u3002","unload_msg":"\u5982\u679c\u9000\u51fa\u8be5\u9875\uff0c\u60a8\u6240\u505a\u7684\u66f4\u6539\u5c06\u4e22\u5931\u3002"},fullscreen:{desc:"\u5207\u6362\u5168\u5c4f\u6a21\u5f0f"},media:{edit:"\u7f16\u8f91\u5d4c\u5165\u5f0f\u5a92\u4f53",desc:"\u63d2\u5165/\u7f16\u8f91 \u5d4c\u5165\u5f0f\u5a92\u4f53","delta_height":"","delta_width":""},fullpage:{desc:"\u6587\u4ef6\u5c5e\u6027","delta_width":"\u5bbd\u5ea6","delta_height":"\u9ad8\u5ea6"},template:{desc:"\u63d2\u5165\u9884\u8bbe\u7684\u6a21\u677f\u5185\u5bb9"},visualchars:{desc:"\u663e\u793a/\u9690\u85cf \u975e\u53ef\u89c1\u5b57\u7b26"},spellchecker:{desc:"\u62fc\u5199\u68c0\u67e5",menu:"\u62fc\u5199\u68c0\u67e5\u8bbe\u7f6e","ignore_word":"\u5ffd\u7565","ignore_words":"\u5168\u90e8\u5ffd\u7565",langs:"\u8bed\u8a00",wait:"\u8bf7\u7a0d\u5019...",sug:"\u5efa\u8bae","no_sug":"\u65e0\u5efa\u8bae","no_mpell":"\u65e0\u62fc\u5199\u9519\u8bef","learn_word":"\u5b66\u4e60\u8bcd\u7ec4"},pagebreak:{desc:"\u63d2\u5165\u5206\u9875\u7b26"},advlist:{types:"\u6837\u5f0f",def:"\u9ed8\u8ba4","lower_alpha":"\u5c0f\u5199\u5b57\u6bcd","lower_greek":"\u5c0f\u5199\u5e0c\u814a\u5b57\u6bcd","lower_roman":"\u5c0f\u5199\u7f57\u9a6c\u6570\u5b57","upper_alpha":"\u5927\u5199\u5b57\u6bcd","upper_roman":"\u5927\u5199\u7f57\u9a6c\u6570\u5b57",circle:"\u5706\u5708",disc:"\u5706\u70b9",square:"\u65b9\u5757"},colors:{"333300":"Dark olive","993300":"Burnt orange","000000":"Black","003300":"Dark green","003366":"Dark azure","000080":"Navy Blue","333399":"Indigo","333333":"Very dark gray","800000":"Maroon",FF6600:"Orange","808000":"Olive","008000":"Green","008080":"Teal","0000FF":"Blue","666699":"Grayish blue","808080":"Gray",FF0000:"Red",FF9900:"Amber","99CC00":"Yellow green","339966":"Sea green","33CCCC":"Turquoise","3366FF":"Royal blue","800080":"Purple","999999":"Medium gray",FF00FF:"Magenta",FFCC00:"Gold",FFFF00:"Yellow","00FF00":"Lime","00FFFF":"Aqua","00CCFF":"Sky blue","993366":"Brown",C0C0C0:"Silver",FF99CC:"Pink",FFCC99:"Peach",FFFF99:"Light yellow",CCFFCC:"Pale green",CCFFFF:"Pale cyan","99CCFF":"Light sky blue",CC99FF:"Plum",FFFFFF:"White"},aria:{"rich_text_area":"\u5bcc\u6587\u672c\u57df"},wordcount:{words:"\u5b57\u6570:"}}}); \ No newline at end of file diff --git a/src/Umbraco.Web.UI.Client/lib/tinymce/plugins/codemirror/langs/da.js b/src/Umbraco.Web.UI.Client/lib/tinymce/plugins/codemirror/langs/da.js new file mode 100644 index 0000000000..d5e0bbde43 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/lib/tinymce/plugins/codemirror/langs/da.js @@ -0,0 +1,8 @@ +tinymce.addI18n('en',{ + 'HTML source code': 'HTML source code', + 'Start search': 'Start search', + 'Find next': 'Find next', + 'Find previous': 'Find previous', + 'Replace': 'Replace', + 'Replace all': 'Replace all' +}); diff --git a/src/Umbraco.Web.UI.Client/lib/tinymce/plugins/codemirror/langs/de.js b/src/Umbraco.Web.UI.Client/lib/tinymce/plugins/codemirror/langs/de.js new file mode 100644 index 0000000000..d5e0bbde43 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/lib/tinymce/plugins/codemirror/langs/de.js @@ -0,0 +1,8 @@ +tinymce.addI18n('en',{ + 'HTML source code': 'HTML source code', + 'Start search': 'Start search', + 'Find next': 'Find next', + 'Find previous': 'Find previous', + 'Replace': 'Replace', + 'Replace all': 'Replace all' +}); diff --git a/src/Umbraco.Web.UI.Client/lib/tinymce/plugins/codemirror/langs/en_us.js b/src/Umbraco.Web.UI.Client/lib/tinymce/plugins/codemirror/langs/en_us.js new file mode 100644 index 0000000000..d5e0bbde43 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/lib/tinymce/plugins/codemirror/langs/en_us.js @@ -0,0 +1,8 @@ +tinymce.addI18n('en',{ + 'HTML source code': 'HTML source code', + 'Start search': 'Start search', + 'Find next': 'Find next', + 'Find previous': 'Find previous', + 'Replace': 'Replace', + 'Replace all': 'Replace all' +}); diff --git a/src/Umbraco.Web.UI.Client/lib/tinymce/plugins/codemirror/langs/fi.js b/src/Umbraco.Web.UI.Client/lib/tinymce/plugins/codemirror/langs/fi.js new file mode 100644 index 0000000000..d5e0bbde43 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/lib/tinymce/plugins/codemirror/langs/fi.js @@ -0,0 +1,8 @@ +tinymce.addI18n('en',{ + 'HTML source code': 'HTML source code', + 'Start search': 'Start search', + 'Find next': 'Find next', + 'Find previous': 'Find previous', + 'Replace': 'Replace', + 'Replace all': 'Replace all' +}); diff --git a/src/Umbraco.Web.UI.Client/lib/tinymce/plugins/codemirror/langs/fr.js b/src/Umbraco.Web.UI.Client/lib/tinymce/plugins/codemirror/langs/fr.js new file mode 100644 index 0000000000..d5e0bbde43 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/lib/tinymce/plugins/codemirror/langs/fr.js @@ -0,0 +1,8 @@ +tinymce.addI18n('en',{ + 'HTML source code': 'HTML source code', + 'Start search': 'Start search', + 'Find next': 'Find next', + 'Find previous': 'Find previous', + 'Replace': 'Replace', + 'Replace all': 'Replace all' +}); diff --git a/src/Umbraco.Web.UI.Client/lib/tinymce/plugins/codemirror/langs/he.js b/src/Umbraco.Web.UI.Client/lib/tinymce/plugins/codemirror/langs/he.js new file mode 100644 index 0000000000..d5e0bbde43 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/lib/tinymce/plugins/codemirror/langs/he.js @@ -0,0 +1,8 @@ +tinymce.addI18n('en',{ + 'HTML source code': 'HTML source code', + 'Start search': 'Start search', + 'Find next': 'Find next', + 'Find previous': 'Find previous', + 'Replace': 'Replace', + 'Replace all': 'Replace all' +}); diff --git a/src/Umbraco.Web.UI.Client/lib/tinymce/plugins/codemirror/langs/it.js b/src/Umbraco.Web.UI.Client/lib/tinymce/plugins/codemirror/langs/it.js new file mode 100644 index 0000000000..d5e0bbde43 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/lib/tinymce/plugins/codemirror/langs/it.js @@ -0,0 +1,8 @@ +tinymce.addI18n('en',{ + 'HTML source code': 'HTML source code', + 'Start search': 'Start search', + 'Find next': 'Find next', + 'Find previous': 'Find previous', + 'Replace': 'Replace', + 'Replace all': 'Replace all' +}); diff --git a/src/Umbraco.Web.UI.Client/lib/tinymce/plugins/codemirror/langs/ja.js b/src/Umbraco.Web.UI.Client/lib/tinymce/plugins/codemirror/langs/ja.js new file mode 100644 index 0000000000..d5e0bbde43 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/lib/tinymce/plugins/codemirror/langs/ja.js @@ -0,0 +1,8 @@ +tinymce.addI18n('en',{ + 'HTML source code': 'HTML source code', + 'Start search': 'Start search', + 'Find next': 'Find next', + 'Find previous': 'Find previous', + 'Replace': 'Replace', + 'Replace all': 'Replace all' +}); diff --git a/src/Umbraco.Web.UI.Client/lib/tinymce/plugins/codemirror/langs/nl.js b/src/Umbraco.Web.UI.Client/lib/tinymce/plugins/codemirror/langs/nl.js new file mode 100644 index 0000000000..d5e0bbde43 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/lib/tinymce/plugins/codemirror/langs/nl.js @@ -0,0 +1,8 @@ +tinymce.addI18n('en',{ + 'HTML source code': 'HTML source code', + 'Start search': 'Start search', + 'Find next': 'Find next', + 'Find previous': 'Find previous', + 'Replace': 'Replace', + 'Replace all': 'Replace all' +}); diff --git a/src/Umbraco.Web.UI.Client/lib/tinymce/plugins/codemirror/langs/no.js b/src/Umbraco.Web.UI.Client/lib/tinymce/plugins/codemirror/langs/no.js new file mode 100644 index 0000000000..d5e0bbde43 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/lib/tinymce/plugins/codemirror/langs/no.js @@ -0,0 +1,8 @@ +tinymce.addI18n('en',{ + 'HTML source code': 'HTML source code', + 'Start search': 'Start search', + 'Find next': 'Find next', + 'Find previous': 'Find previous', + 'Replace': 'Replace', + 'Replace all': 'Replace all' +}); diff --git a/src/Umbraco.Web.UI.Client/lib/tinymce/plugins/codemirror/langs/pl.js b/src/Umbraco.Web.UI.Client/lib/tinymce/plugins/codemirror/langs/pl.js new file mode 100644 index 0000000000..d5e0bbde43 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/lib/tinymce/plugins/codemirror/langs/pl.js @@ -0,0 +1,8 @@ +tinymce.addI18n('en',{ + 'HTML source code': 'HTML source code', + 'Start search': 'Start search', + 'Find next': 'Find next', + 'Find previous': 'Find previous', + 'Replace': 'Replace', + 'Replace all': 'Replace all' +}); diff --git a/src/Umbraco.Web.UI.Client/lib/tinymce/plugins/codemirror/langs/pt.js b/src/Umbraco.Web.UI.Client/lib/tinymce/plugins/codemirror/langs/pt.js new file mode 100644 index 0000000000..d5e0bbde43 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/lib/tinymce/plugins/codemirror/langs/pt.js @@ -0,0 +1,8 @@ +tinymce.addI18n('en',{ + 'HTML source code': 'HTML source code', + 'Start search': 'Start search', + 'Find next': 'Find next', + 'Find previous': 'Find previous', + 'Replace': 'Replace', + 'Replace all': 'Replace all' +}); diff --git a/src/Umbraco.Web.UI.Client/lib/tinymce/plugins/codemirror/langs/ru.js b/src/Umbraco.Web.UI.Client/lib/tinymce/plugins/codemirror/langs/ru.js new file mode 100644 index 0000000000..d5e0bbde43 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/lib/tinymce/plugins/codemirror/langs/ru.js @@ -0,0 +1,8 @@ +tinymce.addI18n('en',{ + 'HTML source code': 'HTML source code', + 'Start search': 'Start search', + 'Find next': 'Find next', + 'Find previous': 'Find previous', + 'Replace': 'Replace', + 'Replace all': 'Replace all' +}); diff --git a/src/Umbraco.Web.UI.Client/lib/tinymce/plugins/codemirror/langs/sv.js b/src/Umbraco.Web.UI.Client/lib/tinymce/plugins/codemirror/langs/sv.js new file mode 100644 index 0000000000..d5e0bbde43 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/lib/tinymce/plugins/codemirror/langs/sv.js @@ -0,0 +1,8 @@ +tinymce.addI18n('en',{ + 'HTML source code': 'HTML source code', + 'Start search': 'Start search', + 'Find next': 'Find next', + 'Find previous': 'Find previous', + 'Replace': 'Replace', + 'Replace all': 'Replace all' +}); diff --git a/src/Umbraco.Web.UI.Client/lib/tinymce/plugins/codemirror/langs/zh.js b/src/Umbraco.Web.UI.Client/lib/tinymce/plugins/codemirror/langs/zh.js new file mode 100644 index 0000000000..d5e0bbde43 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/lib/tinymce/plugins/codemirror/langs/zh.js @@ -0,0 +1,8 @@ +tinymce.addI18n('en',{ + 'HTML source code': 'HTML source code', + 'Start search': 'Start search', + 'Find next': 'Find next', + 'Find previous': 'Find previous', + 'Replace': 'Replace', + 'Replace all': 'Replace all' +}); diff --git a/src/Umbraco.Web.UI.Client/lib/tinymce/plugins/umbracolink/plugin.min.js b/src/Umbraco.Web.UI.Client/lib/tinymce/plugins/umbracolink/plugin.min.js index d1757de319..b05334243a 100644 --- a/src/Umbraco.Web.UI.Client/lib/tinymce/plugins/umbracolink/plugin.min.js +++ b/src/Umbraco.Web.UI.Client/lib/tinymce/plugins/umbracolink/plugin.min.js @@ -1,285 +1,5 @@ /** - * Umbraco Link Plugin, based on the original link plugin by MoxieCode - * swapped out the dialog implementation with our own dialog service - * and support for passing in localLinks - */ - -/*global tinymce:true */ - -tinymce.PluginManager.add('umbracolink', function(editor) { - function createLinkList(callback) { - return function() { - var linkList = editor.settings.link_list; - - if (typeof(linkList) == "string") { - tinymce.util.XHR.send({ - url: linkList, - success: function(text) { - callback(tinymce.util.JSON.parse(text)); - } - }); - } else { - callback(linkList); - } - }; - } - - function showDialog(linkList) { - var data = {}, selection = editor.selection, dom = editor.dom, selectedElm, anchorElm, initialText; - var win, linkListCtrl, relListCtrl, targetListCtrl; - - function linkListChangeHandler(e) { - var textCtrl = win.find('#text'); - - if (!textCtrl.value() || (e.lastControl && textCtrl.value() == e.lastControl.text())) { - textCtrl.value(e.control.text()); - } - - win.find('#href').value(e.control.value()); - } - - function buildLinkList() { - var linkListItems = [{text: 'None', value: ''}]; - - tinymce.each(linkList, function(link) { - linkListItems.push({ - text: link.text || link.title, - value: link.value || link.url, - menu: link.menu - }); - }); - - return linkListItems; - } - - function buildRelList(relValue) { - var relListItems = [{text: 'None', value: ''}]; - - tinymce.each(editor.settings.rel_list, function(rel) { - relListItems.push({ - text: rel.text || rel.title, - value: rel.value, - selected: relValue === rel.value - }); - }); - - return relListItems; - } - - function buildTargetList(targetValue) { - var targetListItems = [{text: 'None', value: ''}]; - - if (!editor.settings.target_list) { - targetListItems.push({text: 'New window', value: '_blank'}); - } - - tinymce.each(editor.settings.target_list, function(target) { - targetListItems.push({ - text: target.text || target.title, - value: target.value, - selected: targetValue === target.value - }); - }); - - return targetListItems; - } - - function buildAnchorListControl(url) { - var anchorList = []; - - tinymce.each(editor.dom.select('a:not([href])'), function(anchor) { - var id = anchor.name || anchor.id; - - if (id) { - anchorList.push({ - text: id, - value: '#' + id, - selected: url.indexOf('#' + id) != -1 - }); - } - }); - - if (anchorList.length) { - anchorList.unshift({text: 'None', value: ''}); - - return { - name: 'anchor', - type: 'listbox', - label: 'Anchors', - values: anchorList, - onselect: linkListChangeHandler - }; - } - } - - function updateText() { - if (!initialText && data.text.length === 0) { - this.parent().parent().find('#text')[0].value(this.value()); - } - } - - selectedElm = selection.getNode(); - anchorElm = dom.getParent(selectedElm, 'a[href]'); - - data.text = initialText = anchorElm ? (anchorElm.innerText || anchorElm.textContent) : selection.getContent({format: 'text'}); - data.href = anchorElm ? dom.getAttrib(anchorElm, 'href') : ''; - data.target = anchorElm ? dom.getAttrib(anchorElm, 'target') : ''; - data.rel = anchorElm ? dom.getAttrib(anchorElm, 'rel') : ''; - - if (selectedElm.nodeName == "IMG") { - data.text = initialText = " "; - } - - if (linkList) { - linkListCtrl = { - type: 'listbox', - label: 'Link list', - values: buildLinkList(), - onselect: linkListChangeHandler - }; - } - - if (editor.settings.target_list !== false) { - targetListCtrl = { - name: 'target', - type: 'listbox', - label: 'Target', - values: buildTargetList(data.target) - }; - } - - if (editor.settings.rel_list) { - relListCtrl = { - name: 'rel', - type: 'listbox', - label: 'Rel', - values: buildRelList(data.rel) - }; - } - - var injector = angular.element(document.getElementById("umbracoMainPageBody")).injector(); - var dialogService = injector.get("dialogService"); - var currentTarget = undefined; - - //if we already have a link selected, we want to pass that data over to the dialog - if(anchorElm){ - var anchor = $(anchorElm); - currentTarget = { - name: anchor.attr("title"), - url: anchor.attr("href"), - target: anchor.attr("target") - }; - - //locallink detection, we do this here, to avoid poluting the dialogservice - //so the dialog service can just expect to get a node-like structure - if (currentTarget.url.indexOf("localLink:") > 0) { - var linkId = currentTarget.url.substring(currentTarget.url.indexOf(":") + 1, currentTarget.url.length - 1); - //we need to check if this is an INT or a UDI - var parsedIntId = parseInt(linkId, 10); - if (isNaN(parsedIntId)) { - //it's a UDI - currentTarget.udi = linkId; - } - else { - currentTarget.id = linkId; - } - } - } - - dialogService.linkPicker({ - currentTarget: currentTarget, - callback: function (data) { - if (data) { - var href = data.url; - // We want to use the Udi. If it is set, we use it, else fallback to id, and finally to null - var hasUdi = data.udi ? true : false; - var id = hasUdi ? data.udi : (data.id ? data.id : null); - - //Create a json obj used to create the attributes for the tag - function createElemAttributes() { - var a = { - href: href, - title: data.name, - target: data.target ? data.target : null, - rel: data.rel ? data.rel : null - }; - if (hasUdi) { - a["data-udi"] = data.udi; - } - else if (data.id) { - a["data-id"] = data.id; - } - } - - function insertLink() { - if (anchorElm) { - dom.setAttribs(anchorElm, createElemAttributes()); - - selection.select(anchorElm); - editor.execCommand('mceEndTyping'); - } else { - editor.execCommand('mceInsertLink', false, createElemAttributes()); - } - } - - if (!href) { - editor.execCommand('unlink'); - return; - } - - //if we have an id, it must be a locallink:id, aslong as the isMedia flag is not set - if (id && (angular.isUndefined(data.isMedia) || !data.isMedia)){ - - href = "/{localLink:" + id + "}"; - - insertLink(); - return; - } - - // Is email and not //user@domain.com - if (href.indexOf('@') > 0 && href.indexOf('//') == -1 && href.indexOf('mailto:') == -1) { - href = 'mailto:' + href; - insertLink(); - return; - } - - // Is www. prefixed - if (/^\s*www\./i.test(href)) { - href = 'http://' + href; - insertLink(); - return; - } - insertLink(); - } - } - }); - } - - editor.addButton('link', { - icon: 'link', - tooltip: 'Insert/edit link', - shortcut: 'Ctrl+K', - onclick: createLinkList(showDialog), - stateSelector: 'a[href]' - }); - - editor.addButton('unlink', { - icon: 'unlink', - tooltip: 'Remove link', - cmd: 'unlink', - stateSelector: 'a[href]' - }); - - editor.addShortcut('Ctrl+K', '', createLinkList(showDialog)); - this.showDialog = showDialog; - - editor.addMenuItem('link', { - icon: 'link', - text: 'Insert link', - shortcut: 'Ctrl+K', - onclick: createLinkList(showDialog), - stateSelector: 'a[href]', - context: 'insert', - prependToContext: true - }); -}); + * This file is intentionally left empty + * For reference, see: http://issues.umbraco.org/issue/U4-9724 + * The logic for the umbracoLink plugin now lives in ~/Umbraco/Js/umbraco.services.js + */ \ No newline at end of file diff --git a/src/Umbraco.Web.UI.Client/src/app.js b/src/Umbraco.Web.UI.Client/src/app.js index 64f468712a..e7b7288f43 100644 --- a/src/Umbraco.Web.UI.Client/src/app.js +++ b/src/Umbraco.Web.UI.Client/src/app.js @@ -39,7 +39,7 @@ angular.module("umbraco.viewcache", []) $delegate.get = function (url, config) { if (Umbraco.Sys.ServerVariables.application && url.startsWith("views/") && url.endsWith(".html")) { - var rnd = Umbraco.Sys.ServerVariables.application.version + "." + Umbraco.Sys.ServerVariables.application.cdf; + var rnd = Umbraco.Sys.ServerVariables.application.cacheBuster; var _op = (url.indexOf("?") > 0) ? "&" : "?"; url += _op + "umb__rnd=" + rnd; } diff --git a/src/Umbraco.Web.UI.Client/src/assets/img/installer.jpg b/src/Umbraco.Web.UI.Client/src/assets/img/installer.jpg index b380efc495..def9226482 100644 Binary files a/src/Umbraco.Web.UI.Client/src/assets/img/installer.jpg and b/src/Umbraco.Web.UI.Client/src/assets/img/installer.jpg differ diff --git a/src/Umbraco.Web.UI.Client/src/common/directives/components/editor/umbeditorheader.directive.js b/src/Umbraco.Web.UI.Client/src/common/directives/components/editor/umbeditorheader.directive.js index 4d9222fa45..8ef43df47b 100644 --- a/src/Umbraco.Web.UI.Client/src/common/directives/components/editor/umbeditorheader.directive.js +++ b/src/Umbraco.Web.UI.Client/src/common/directives/components/editor/umbeditorheader.directive.js @@ -255,7 +255,8 @@ Use this directive to construct a header inside the main editor window. description: "=", hideDescription: "@", descriptionLocked: "@", - navigation: "=" + navigation: "=", + key: "=" }, link: link }; diff --git a/src/Umbraco.Web.UI.Client/src/common/directives/components/umbpagination.directive.js b/src/Umbraco.Web.UI.Client/src/common/directives/components/umbpagination.directive.js index 610f8546a3..84b3adb471 100644 --- a/src/Umbraco.Web.UI.Client/src/common/directives/components/umbpagination.directive.js +++ b/src/Umbraco.Web.UI.Client/src/common/directives/components/umbpagination.directive.js @@ -86,7 +86,7 @@ Use this directive to generate a pagination. (function() { 'use strict'; - function PaginationDirective() { + function PaginationDirective(localizationService) { function link(scope, el, attr, ctrl) { @@ -123,12 +123,12 @@ Use this directive to generate a pagination. //now, if the start is greater than 0 then '1' will not be displayed, so do the elipses thing if (start > 0) { - scope.pagination.unshift({ name: "First", val: 1, isActive: false }, {val: "...",isActive: false}); + scope.pagination.unshift({ name: localizationService.localize("general_first"), val: 1, isActive: false }, {val: "...",isActive: false}); } //same for the end if (start < maxIndex) { - scope.pagination.push({ val: "...", isActive: false }, { name: "Last", val: scope.totalPages, isActive: false }); + scope.pagination.push({ val: "...", isActive: false }, { name: localizationService.localize("general_last"), val: scope.totalPages, isActive: false }); } } diff --git a/src/Umbraco.Web.UI.Client/src/common/filters/preserveNewLineInHtml.filter.js b/src/Umbraco.Web.UI.Client/src/common/filters/preserveNewLineInHtml.filter.js new file mode 100644 index 0000000000..8105282020 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/common/filters/preserveNewLineInHtml.filter.js @@ -0,0 +1,15 @@ +/** +* @ngdoc filter +* @name umbraco.filters.preserveNewLineInHtml +* @description +* Used when rendering a string as HTML (i.e. with ng-bind-html) to convert line-breaks to
tags +**/ +angular.module("umbraco.filters").filter('preserveNewLineInHtml', function () { + return function (text) { + if (!text) { + return ''; + } + return text.replace(/\n/g, '
'); + }; +}); + \ No newline at end of file diff --git a/src/Umbraco.Web.UI.Client/src/common/resources/log.resource.js b/src/Umbraco.Web.UI.Client/src/common/resources/log.resource.js index d74c7d82ac..a5e8149952 100644 --- a/src/Umbraco.Web.UI.Client/src/common/resources/log.resource.js +++ b/src/Umbraco.Web.UI.Client/src/common/resources/log.resource.js @@ -67,7 +67,7 @@ function logResource($q, $http, umbRequestHelper) { umbRequestHelper.getApiUrl( "logApiBaseUrl", "GetCurrentUserLog", - [{ logtype: type, sinceDate: since }])), + [{ logtype: type}, {sinceDate: since }])), 'Failed to retrieve log data for current user of type ' + type + ' since ' + since); }, @@ -98,7 +98,7 @@ function logResource($q, $http, umbRequestHelper) { umbRequestHelper.getApiUrl( "logApiBaseUrl", "GetLog", - [{ logtype: type, sinceDate: since }])), + [{ logtype: type}, {sinceDate: since }])), 'Failed to retrieve log data of type ' + type + ' since ' + since); } }; diff --git a/src/Umbraco.Web.UI.Client/src/common/resources/package.resource.js b/src/Umbraco.Web.UI.Client/src/common/resources/package.resource.js index c9a501ba24..cb810c6edb 100644 --- a/src/Umbraco.Web.UI.Client/src/common/resources/package.resource.js +++ b/src/Umbraco.Web.UI.Client/src/common/resources/package.resource.js @@ -123,6 +123,16 @@ function packageResource($q, $http, umbDataFormatter, umbRequestHelper) { 'Failed to install package. Error during the step "InstallFiles" '); }, + checkRestart: function (package) { + + return umbRequestHelper.resourcePromise( + $http.post( + umbRequestHelper.getApiUrl( + "packageInstallApiBaseUrl", + "CheckRestart"), package), + 'Failed to install package. Error during the step "CheckRestart" '); + }, + installData: function (package) { return umbRequestHelper.resourcePromise( diff --git a/src/Umbraco.Web.UI.Client/src/common/services/assets.service.js b/src/Umbraco.Web.UI.Client/src/common/services/assets.service.js index ff54c5c222..a84be208ba 100644 --- a/src/Umbraco.Web.UI.Client/src/common/services/assets.service.js +++ b/src/Umbraco.Web.UI.Client/src/common/services/assets.service.js @@ -50,7 +50,7 @@ angular.module('umbraco.services') return url; } - var rnd = Umbraco.Sys.ServerVariables.application.version + "." + Umbraco.Sys.ServerVariables.application.cdf; + var rnd = Umbraco.Sys.ServerVariables.application.cacheBuster; var _op = (url.indexOf("?") > 0) ? "&" : "?"; url = url + _op + "umb__rnd=" + rnd; return url; diff --git a/src/Umbraco.Web.UI.Client/src/installer/installer.service.js b/src/Umbraco.Web.UI.Client/src/installer/installer.service.js index 5cb8e6230f..54b4733529 100644 --- a/src/Umbraco.Web.UI.Client/src/installer/installer.service.js +++ b/src/Umbraco.Web.UI.Client/src/installer/installer.service.js @@ -17,11 +17,11 @@ angular.module("umbraco.install").factory('installerService', function($rootScop //add to umbraco installer facts here var facts = ['Umbraco helped millions of people watch a man jump from the edge of space', - 'Over 370 000 websites are currently powered by Umbraco', + 'Over 420 000 websites are currently powered by Umbraco', "At least 2 people have named their cat 'Umbraco'", 'On an average day, more than 1000 people download Umbraco', - 'umbraco.tv is the premier source of Umbraco video tutorials to get you started', - 'You can find the world\'s friendliest CMS community at our.umbraco.org', + 'umbraco.tv is the premier source of Umbraco video tutorials to get you started', + 'You can find the world\'s friendliest CMS community at our.umbraco.org', 'You can become a certified Umbraco developer by attending one of the official courses', 'Umbraco works really well on tablets', 'You have 100% control over your markup and design when crafting a website in Umbraco', @@ -31,7 +31,7 @@ angular.module("umbraco.install").factory('installerService', function($rootScop "At least 4 people have the Umbraco logo tattooed on them", "'Umbraco' is the danish name for an allen key", "Umbraco has been around since 2005, that's a looong time in IT", - "More than 400 people from all over the world meet each year in Denmark in June for our annual conference CodeGarden", + "More than 550 people from all over the world meet each year in Denmark in June for our annual conference CodeGarden", "While you are installing Umbraco someone else on the other side of the planet is probably doing it too", "You can extend Umbraco without modifying the source code using either JavaScript or C#", "Umbraco was installed in more than 165 countries in 2015" diff --git a/src/Umbraco.Web.UI.Client/src/less/forms.less b/src/Umbraco.Web.UI.Client/src/less/forms.less index 869d0b7740..480b96b804 100644 --- a/src/Umbraco.Web.UI.Client/src/less/forms.less +++ b/src/Umbraco.Web.UI.Client/src/less/forms.less @@ -66,8 +66,9 @@ label.control-label, .control-label { } .form-search .icon, .form-search .icon-search { position: absolute; + z-index: 1; top: 6px; - left: 4px; + left: 6px; color: @gray-8; } @@ -86,6 +87,9 @@ label.control-label, .control-label { background: @white } +.form-search .icon-search + .search-input { + padding-left: 25px !important; +} .form-search .search-input { font-weight: bold; @@ -191,7 +195,7 @@ input[type="tel"], input[type="color"], .uneditable-input { display: inline-block; - height: 30px; + height: @inputHeight; padding: 4px 6px; margin-bottom: @baseLineHeight / 2; font-size: @baseFontSize; @@ -206,7 +210,6 @@ input.-full-width-input { width: 100%; box-sizing: border-box; padding: 4px 6px; - height: 30px; } // Reset appearance properties for textual inputs and textarea @@ -579,9 +582,9 @@ input[type="checkbox"][readonly] { .add-on { display: inline-block; width: auto; - height: @baseLineHeight; - min-width: 16px; - padding: 4px 5px; + height: 22px; + min-width: 18px; + padding: 4px 6px; font-size: @baseFontSize; font-weight: normal; line-height: @baseLineHeight; @@ -653,29 +656,21 @@ input.search-query { padding-left: 14px; padding-left: 4px \9; /* IE7-8 doesn't have border-radius, so don't indent the padding */ margin: 0; // Remove the default margin on all inputs - .border-radius(0px); } /* Allow for input prepend/append in search forms */ -.form-search .input-append .search-query, -.form-search .input-prepend .search-query { - .border-radius(0); // Override due to specificity +.form-search { + .input-prepend { + .btn { + .border-radius(0 @borderRadiusSmall @borderRadiusSmall 0); + } + } + .input-append { + .btn { + .border-radius(0 @borderRadiusSmall @borderRadiusSmall 0); + } + } } -.form-search .input-append .search-query { - .border-radius(14px 0 0 14px); -} -.form-search .input-append .btn { - .border-radius(0 14px 14px 0); -} -.form-search .input-prepend .search-query { - .border-radius(0 14px 14px 0); -} -.form-search .input-prepend .btn { - .border-radius(14px 0 0 14px); -} - - - // HORIZONTAL & VERTICAL FORMS // --------------------------- diff --git a/src/Umbraco.Web.UI.Client/src/less/main.less b/src/Umbraco.Web.UI.Client/src/less/main.less index 1b573bbe0b..222fa2474e 100644 --- a/src/Umbraco.Web.UI.Client/src/less/main.less +++ b/src/Umbraco.Web.UI.Client/src/less/main.less @@ -47,10 +47,25 @@ h5.-black { background: none; border: none } -.datepicker td.active, -.datepicker td span.active { - background: @turquoise !important; +.bootstrap-datetimepicker-widget { + td { + &.active, span.active { + background: @turquoise !important; + } + &.today:not(.active):before { + border-bottom-color: @purple-l1 !important; + } + a[data-action] { + padding: 0 !important; + } + .timepicker-hour, + .timepicker-minute, + .timepicker-second { + margin: 8px 0; + } + } } + .umb-datetime-picker div.info { vertical-align: middle } diff --git a/src/Umbraco.Web.UI.Client/src/less/panel.less b/src/Umbraco.Web.UI.Client/src/less/panel.less index 6bc2a2b2de..7c18b79c81 100644 --- a/src/Umbraco.Web.UI.Client/src/less/panel.less +++ b/src/Umbraco.Web.UI.Client/src/less/panel.less @@ -446,8 +446,8 @@ input.umb-panel-header-name-input { margin-bottom: 0; font-weight: bold; box-sizing: border-box; - height: 30px; - line-height: 30px; + height: 32px; + line-height: 32px; width: 100%; &:hover { background: @white; diff --git a/src/Umbraco.Web.UI.Client/src/less/variables.less b/src/Umbraco.Web.UI.Client/src/less/variables.less index c173f122cb..666941b914 100644 --- a/src/Umbraco.Web.UI.Client/src/less/variables.less +++ b/src/Umbraco.Web.UI.Client/src/less/variables.less @@ -190,7 +190,7 @@ @inputBorderRadius: 0; @inputDisabledBackground: @gray-10; @formActionsBackground: @gray-9; -@inputHeight: @baseLineHeight + 10px; // base line-height + 8px vertical padding + 2px top/bottom border +@inputHeight: @baseLineHeight + 12px; // base line-height + 8px vertical padding + 2px top/bottom border @controlRequiredColor: @red; diff --git a/src/Umbraco.Web.UI.Client/src/views/common/dialogs/iconpicker.html b/src/Umbraco.Web.UI.Client/src/views/common/dialogs/iconpicker.html index 96ab990447..c159aafd6e 100644 --- a/src/Umbraco.Web.UI.Client/src/views/common/dialogs/iconpicker.html +++ b/src/Umbraco.Web.UI.Client/src/views/common/dialogs/iconpicker.html @@ -7,7 +7,8 @@ style="width: 100%" ng-model="searchTerm" class="umb-search-field search-query input-block-level" - placeholder="Filter..." + localize="plceholder" + placeholder="@placeholders_filter" no-dirty-check> @@ -17,12 +18,12 @@
diff --git a/src/Umbraco.Web.UI.Client/src/views/common/dialogs/legacydelete.html b/src/Umbraco.Web.UI.Client/src/views/common/dialogs/legacydelete.html index 287e16049e..e6c757ef1e 100644 --- a/src/Umbraco.Web.UI.Client/src/views/common/dialogs/legacydelete.html +++ b/src/Umbraco.Web.UI.Client/src/views/common/dialogs/legacydelete.html @@ -3,7 +3,7 @@

- Are you sure you want to delete {{currentNode.name}} ? + Are you sure you want to delete {{currentNode.name}} ?

diff --git a/src/Umbraco.Web.UI.Client/src/views/common/dialogs/linkpicker.html b/src/Umbraco.Web.UI.Client/src/views/common/dialogs/linkpicker.html index be9024045e..badcc14487 100644 --- a/src/Umbraco.Web.UI.Client/src/views/common/dialogs/linkpicker.html +++ b/src/Umbraco.Web.UI.Client/src/views/common/dialogs/linkpicker.html @@ -22,7 +22,7 @@ @@ -63,7 +63,7 @@ Cancel - Link to file + Link to file
- \ No newline at end of file + diff --git a/src/Umbraco.Web.UI.Client/src/views/common/dialogs/mediapicker.html b/src/Umbraco.Web.UI.Client/src/views/common/dialogs/mediapicker.html index 194752f2bc..99102fed19 100644 --- a/src/Umbraco.Web.UI.Client/src/views/common/dialogs/mediapicker.html +++ b/src/Umbraco.Web.UI.Client/src/views/common/dialogs/mediapicker.html @@ -75,7 +75,8 @@ + localize="placeholder" + placeholder="@placeholders_filter">
diff --git a/src/Umbraco.Web.UI.Client/src/views/common/dialogs/rteembed.html b/src/Umbraco.Web.UI.Client/src/views/common/dialogs/rteembed.html index 62b0340769..9acb92401b 100644 --- a/src/Umbraco.Web.UI.Client/src/views/common/dialogs/rteembed.html +++ b/src/Umbraco.Web.UI.Client/src/views/common/dialogs/rteembed.html @@ -1,4 +1,4 @@ -
+
diff --git a/src/Umbraco.Web.UI.Client/src/views/common/dialogs/template/querybuilder.html b/src/Umbraco.Web.UI.Client/src/views/common/dialogs/template/querybuilder.html index 1c0aaf7209..80ea07d003 100644 --- a/src/Umbraco.Web.UI.Client/src/views/common/dialogs/template/querybuilder.html +++ b/src/Umbraco.Web.UI.Client/src/views/common/dialogs/template/querybuilder.html @@ -17,7 +17,7 @@
-

Build a query

+

Build a query

- \ No newline at end of file + diff --git a/src/Umbraco.Web.UI.Client/src/views/common/dialogs/template/snippet.html b/src/Umbraco.Web.UI.Client/src/views/common/dialogs/template/snippet.html index 7b5187303e..0d6c05091c 100644 --- a/src/Umbraco.Web.UI.Client/src/views/common/dialogs/template/snippet.html +++ b/src/Umbraco.Web.UI.Client/src/views/common/dialogs/template/snippet.html @@ -29,7 +29,7 @@ Close - Insert + Insert diff --git a/src/Umbraco.Web.UI.Client/src/views/common/dialogs/user.html b/src/Umbraco.Web.UI.Client/src/views/common/dialogs/user.html index 2b2d3bd1cf..a6798d5199 100644 --- a/src/Umbraco.Web.UI.Client/src/views/common/dialogs/user.html +++ b/src/Umbraco.Web.UI.Client/src/views/common/dialogs/user.html @@ -42,7 +42,7 @@
-
External login providers
+
External login providers
@@ -55,7 +55,7 @@ onclick="document.forms.oauthloginform.submit();"> - Link your {{login.caption}} account + Link your {{login.caption}} account @@ -67,7 +67,7 @@ name="provider" value="{{login.authType}}"> - Un-link your {{login.caption}} account + Un-link your {{login.caption}} account
diff --git a/src/Umbraco.Web.UI.Client/src/views/common/overlays/contenttypeeditor/propertysettings/propertysettings.html b/src/Umbraco.Web.UI.Client/src/views/common/overlays/contenttypeeditor/propertysettings/propertysettings.html index 7c457ac4c9..03ae935f47 100644 --- a/src/Umbraco.Web.UI.Client/src/views/common/overlays/contenttypeeditor/propertysettings/propertysettings.html +++ b/src/Umbraco.Web.UI.Client/src/views/common/overlays/contenttypeeditor/propertysettings/propertysettings.html @@ -69,12 +69,13 @@ diff --git a/src/Umbraco.Web.UI.Client/src/views/propertyeditors/textarea/textarea.html b/src/Umbraco.Web.UI.Client/src/views/propertyeditors/textarea/textarea.html index 0d1fae3f6f..aba4c52ed3 100644 --- a/src/Umbraco.Web.UI.Client/src/views/propertyeditors/textarea/textarea.html +++ b/src/Umbraco.Web.UI.Client/src/views/propertyeditors/textarea/textarea.html @@ -1,3 +1,3 @@ - -Required - \ No newline at end of file + +Required + diff --git a/src/Umbraco.Web.UI.Client/src/views/propertyeditors/textbox/textbox.html b/src/Umbraco.Web.UI.Client/src/views/propertyeditors/textbox/textbox.html index c55fc350fa..1848574f8b 100644 --- a/src/Umbraco.Web.UI.Client/src/views/propertyeditors/textbox/textbox.html +++ b/src/Umbraco.Web.UI.Client/src/views/propertyeditors/textbox/textbox.html @@ -1,9 +1,9 @@ -
+
- Required + Required
diff --git a/src/Umbraco.Web.UI.Client/src/views/templates/edit.html b/src/Umbraco.Web.UI.Client/src/views/templates/edit.html index ec8ca3e9b4..2d59b644d0 100644 --- a/src/Umbraco.Web.UI.Client/src/views/templates/edit.html +++ b/src/Umbraco.Web.UI.Client/src/views/templates/edit.html @@ -13,6 +13,7 @@ ..\packages\dotless.1.5.2\lib\dotless.Core.dll - - ..\packages\Examine.0.1.82\lib\net45\Examine.dll + + ..\packages\Examine.0.1.83\lib\net45\Examine.dll + True False @@ -567,6 +568,7 @@ + @@ -2376,9 +2378,9 @@ xcopy "$(ProjectDir)"..\packages\SqlServerCE.4.0.0.1\x86\*.* "$(TargetDir)x86\" True True - 7630 + 7640 / - http://localhost:7630 + http://localhost:7640 False False diff --git a/src/Umbraco.Web.UI/Umbraco/PartialViewMacros/Templates/Breadcrumb.cshtml b/src/Umbraco.Web.UI/Umbraco/PartialViewMacros/Templates/Breadcrumb.cshtml old mode 100644 new mode 100755 index ff63081996..5dd44df7f9 --- a/src/Umbraco.Web.UI/Umbraco/PartialViewMacros/Templates/Breadcrumb.cshtml +++ b/src/Umbraco.Web.UI/Umbraco/PartialViewMacros/Templates/Breadcrumb.cshtml @@ -1,13 +1,13 @@ @inherits Umbraco.Web.Macros.PartialViewMacroPage @* - This snippet makes a breadcrumb of parents using an unordered html list. + This snippet makes a breadcrumb of parents using an unordered HTML list. How it works: - It uses the Ancestors() method to get all parents and then generates links so the visitor can go back - Finally it outputs the name of the current page (without a link) *@ -@{ var selection = CurrentPage.Ancestors(); } +@{ var selection = Model.Content.Ancestors(); } @if (selection.Any()) { @@ -19,6 +19,6 @@ } @* Display the current page as the last item in the list *@ -
  • @CurrentPage.Name
  • +
  • @Model.Content.Name
  • } \ No newline at end of file diff --git a/src/Umbraco.Web.UI/Umbraco/PartialViewMacros/Templates/Gallery.cshtml b/src/Umbraco.Web.UI/Umbraco/PartialViewMacros/Templates/Gallery.cshtml old mode 100644 new mode 100755 index f7c5954c5a..7ed0e01680 --- a/src/Umbraco.Web.UI/Umbraco/PartialViewMacros/Templates/Gallery.cshtml +++ b/src/Umbraco.Web.UI/Umbraco/PartialViewMacros/Templates/Gallery.cshtml @@ -1,50 +1,50 @@ @inherits Umbraco.Web.Macros.PartialViewMacroPage @* - Macro to display a gallery of images from media the media section. + Macro to display a gallery of images from the Media section. Works with either a 'Single Media Picker' or a 'Multiple Media Picker' macro parameter (see below). How it works: - Confirm the macro parameter has been passed in with a value - - Loop through all the media Id's passed in (might be a single item, might be many) + - Loop through all the media Ids passed in (might be a single item, might be many) - Display any individual images, as well as any folders of images Macro Parameters To Create, for this macro to work: Alias:mediaIds Name:Select folders and/or images Type: Multiple Media Picker - Type: (note: you can use a Single Media Picker if that's more appropriate to your needs) + Type: (note: You can use a Single Media Picker if that's more appropriate to your needs) *@ -@{ var mediaIds = Model.MacroParameters["mediaIds"]; } +@{ var mediaIds = Model.MacroParameters["mediaIds"] as string; } + @if (mediaIds != null) { -
      - @foreach (var mediaId in mediaIds.ToString().Split(',')) +
      + @foreach (var mediaId in mediaIds.Split(',')) { - var media = Umbraco.Media(mediaId); + var media = Umbraco.TypedMedia(mediaId); @* a single image *@ if (media.DocumentTypeAlias == "Image") { - @Render(media); + @Render(media as Image); } @* a folder with images under it *@ - if (media.Children("Image").Any()) + if (media.Children().Any()) { - foreach (var image in media.Children("Image")) + foreach (var image in media.Children()) { @Render(image); } } - } -
    +
    } -@helper Render(dynamic item) +@helper Render(Image item) { -
  • - - @item.Name +
  • +
    } \ No newline at end of file diff --git a/src/Umbraco.Web.UI/Umbraco/PartialViewMacros/Templates/ListAncestorsFromCurrentPage.cshtml b/src/Umbraco.Web.UI/Umbraco/PartialViewMacros/Templates/ListAncestorsFromCurrentPage.cshtml old mode 100644 new mode 100755 index b7ca9d06e4..8d4d897b89 --- a/src/Umbraco.Web.UI/Umbraco/PartialViewMacros/Templates/ListAncestorsFromCurrentPage.cshtml +++ b/src/Umbraco.Web.UI/Umbraco/PartialViewMacros/Templates/ListAncestorsFromCurrentPage.cshtml @@ -1,24 +1,24 @@ @inherits Umbraco.Web.Macros.PartialViewMacroPage @* - This snippet makes a list of links to the of parents of the current page using an unordered html list. + This snippet makes a list of links to the of parents of the current page using an unordered HTML list. How it works: - It uses the Ancestors() method to get all parents and then generates links so the visitor can go back - Finally it outputs the name of the current page (without a link) *@ -@{ var selection = CurrentPage.Ancestors(); } +@{ var selection = Model.Content.Ancestors(); } @if (selection.Any()) {
      @* For each page in the ancestors collection which have been ordered by Level (so we start with the highest top node first) *@ - @foreach (var item in selection.OrderBy("Level")) + @foreach (var item in selection.OrderBy(x => x.Level)) {
    • @item.Name »
    • } @* Display the current page as the last item in the list *@ -
    • @CurrentPage.Name
    • +
    • @Model.Content.Name
    } diff --git a/src/Umbraco.Web.UI/Umbraco/PartialViewMacros/Templates/ListChildPagesFromChangeableSource.cshtml b/src/Umbraco.Web.UI/Umbraco/PartialViewMacros/Templates/ListChildPagesFromChangeableSource.cshtml old mode 100644 new mode 100755 index 2fa2aab07c..3af1291be4 --- a/src/Umbraco.Web.UI/Umbraco/PartialViewMacros/Templates/ListChildPagesFromChangeableSource.cshtml +++ b/src/Umbraco.Web.UI/Umbraco/PartialViewMacros/Templates/ListChildPagesFromChangeableSource.cshtml @@ -13,20 +13,19 @@ *@ @{ var startNodeId = Model.MacroParameters["startNodeId"]; } + @if (startNodeId != null) { @* Get the starting page *@ - var startNode = Umbraco.Content(startNodeId); - var selection = startNode.Children.Where("Visible"); + var startNode = Umbraco.TypedContent(startNodeId); + var selection = startNode.Children.Where(x => x.IsVisible()); if (selection.Any()) { } diff --git a/src/Umbraco.Web.UI/Umbraco/PartialViewMacros/Templates/ListChildPagesFromCurrentPage.cshtml b/src/Umbraco.Web.UI/Umbraco/PartialViewMacros/Templates/ListChildPagesFromCurrentPage.cshtml old mode 100644 new mode 100755 index 9bd13f68a2..09144cff47 --- a/src/Umbraco.Web.UI/Umbraco/PartialViewMacros/Templates/ListChildPagesFromCurrentPage.cshtml +++ b/src/Umbraco.Web.UI/Umbraco/PartialViewMacros/Templates/ListChildPagesFromCurrentPage.cshtml @@ -1,6 +1,14 @@ @inherits Umbraco.Web.Macros.PartialViewMacroPage -@{ var selection = CurrentPage.Children.Where("Visible"); } +@* + This snippet makes a list of links to the of children of the current page using an unordered HTML list. + + How it works: + - It uses the Children method to get all child pages + - It then generates links so the visitor can go to each page +*@ + +@{ var selection = Model.Content.Children.Where(x => x.IsVisible()); } @if (selection.Any()) { diff --git a/src/Umbraco.Web.UI/Umbraco/PartialViewMacros/Templates/ListChildPagesOrderedByDate.cshtml b/src/Umbraco.Web.UI/Umbraco/PartialViewMacros/Templates/ListChildPagesOrderedByDate.cshtml old mode 100644 new mode 100755 index c8cbdf7d32..5cd74a62f9 --- a/src/Umbraco.Web.UI/Umbraco/PartialViewMacros/Templates/ListChildPagesOrderedByDate.cshtml +++ b/src/Umbraco.Web.UI/Umbraco/PartialViewMacros/Templates/ListChildPagesOrderedByDate.cshtml @@ -1,11 +1,22 @@ @inherits Umbraco.Web.Macros.PartialViewMacroPage -@{ var selection = CurrentPage.Children.Where("Visible").OrderBy("CreateDate desc"); } -@* OrderBy() takes the property to sort by and optionally order desc/asc *@ +@* + This snippet makes a list of links to the of children of the current page using an unordered HTML list. -
      - @foreach (var item in selection) - { -
    • @item.Name
    • - } -
    + How it works: + - It uses the Children method to get all child pages + - It then uses the OrderByDescending() method, which takes the property to sort. In this case the page's creation date. + - It then generates links so the visitor can go to each page +*@ + +@{ var selection = Model.Content.Children.Where(x => x.IsVisible()).OrderByDescending(x => x.CreateDate); } + +@if (selection.Any()) +{ +
      + @foreach (var item in selection) + { +
    • @item.Name
    • + } +
    +} diff --git a/src/Umbraco.Web.UI/Umbraco/PartialViewMacros/Templates/ListChildPagesOrderedByName.cshtml b/src/Umbraco.Web.UI/Umbraco/PartialViewMacros/Templates/ListChildPagesOrderedByName.cshtml old mode 100644 new mode 100755 index da73ff8164..643855006f --- a/src/Umbraco.Web.UI/Umbraco/PartialViewMacros/Templates/ListChildPagesOrderedByName.cshtml +++ b/src/Umbraco.Web.UI/Umbraco/PartialViewMacros/Templates/ListChildPagesOrderedByName.cshtml @@ -1,11 +1,22 @@ @inherits Umbraco.Web.Mvc.UmbracoTemplatePage -@{ var selection = CurrentPage.Children.Where("Visible").OrderBy("Name"); } -@* OrderBy() takes the property to sort by *@ +@* + This snippet makes a list of links to the of children of the current page using an unordered HTML list. -
      - @foreach (var item in selection) - { -
    • @item.Name
    • - } -
    + How it works: + - It uses the Children method to get all child pages + - It then uses the OrderBy() method, which takes the property to sort. In this case, the page's name. + - It then generates links so the visitor can go to each page +*@ + +@{ var selection = Model.Content.Children.Where(x => x.IsVisible()).OrderBy(x => x.Name); } + +@if (selection.Any()) +{ +
      + @foreach (var item in selection) + { +
    • @item.Name
    • + } +
    +} diff --git a/src/Umbraco.Web.UI/Umbraco/PartialViewMacros/Templates/ListChildPagesOrderedByProperty.cshtml b/src/Umbraco.Web.UI/Umbraco/PartialViewMacros/Templates/ListChildPagesOrderedByProperty.cshtml old mode 100644 new mode 100755 index 436faf1ef5..e2eeb08204 --- a/src/Umbraco.Web.UI/Umbraco/PartialViewMacros/Templates/ListChildPagesOrderedByProperty.cshtml +++ b/src/Umbraco.Web.UI/Umbraco/PartialViewMacros/Templates/ListChildPagesOrderedByProperty.cshtml @@ -15,12 +15,15 @@ @{ var propertyAlias = Model.MacroParameters["propertyAlias"]; } @if (propertyAlias != null) { - var selection = CurrentPage.Children.Where("Visible").OrderBy(propertyAlias); + var selection = Model.Content.Children.Where(x => x.IsVisible()).OrderBy(x => x.GetPropertyValue(propertyAlias.ToString())); -
      - @foreach (var item in selection) - { -
    • @item.Name
    • - } -
    + @if (selection.Any()) + { +
      + @foreach (var item in selection) + { +
    • @item.Name
    • + } +
    + } } diff --git a/src/Umbraco.Web.UI/Umbraco/PartialViewMacros/Templates/ListChildPagesWithDoctype.cshtml b/src/Umbraco.Web.UI/Umbraco/PartialViewMacros/Templates/ListChildPagesWithDoctype.cshtml old mode 100644 new mode 100755 index 4ca6f93c71..9ac71a4fd2 --- a/src/Umbraco.Web.UI/Umbraco/PartialViewMacros/Templates/ListChildPagesWithDoctype.cshtml +++ b/src/Umbraco.Web.UI/Umbraco/PartialViewMacros/Templates/ListChildPagesWithDoctype.cshtml @@ -1,17 +1,13 @@ @inherits Umbraco.Web.Macros.PartialViewMacroPage @* - This snippet shows how simple it is to fetch only children of a certain Document Type using Razor. - Be sure to change "DocumentTypeAlias" below to match your needs, such as "TextPage" or "NewsItems". + This snippet shows how simple it is to fetch only children of a certain Document Type. + + Be sure to change "IPublishedContent" below to match your needs, such as "TextPage" or "NewsItem". (You can find the alias of your Document Type by editing it in the Settings section) *@ -@{ var selection = CurrentPage.Children("DocumentTypeAlias").Where("Visible"); } -@* - As an example of more querying, if you have a true/false property with the alias of shouldBeFeatured: - var selection= CurrentPage.Children("DocumentTypeAlias").Where("shouldBeFeatured == true").Where("Visible"); -*@ - +@{ var selection = Model.Content.Children().Where(x => x.IsVisible()); } @if (selection.Any()) { diff --git a/src/Umbraco.Web.UI/Umbraco/PartialViewMacros/Templates/ListDescendantsFromCurrentPage.cshtml b/src/Umbraco.Web.UI/Umbraco/PartialViewMacros/Templates/ListDescendantsFromCurrentPage.cshtml old mode 100644 new mode 100755 index 1e2274bcc0..e649328cfb --- a/src/Umbraco.Web.UI/Umbraco/PartialViewMacros/Templates/ListDescendantsFromCurrentPage.cshtml +++ b/src/Umbraco.Web.UI/Umbraco/PartialViewMacros/Templates/ListDescendantsFromCurrentPage.cshtml @@ -2,27 +2,27 @@ @* This snippet creates links for every single page (no matter how deep) below - the page currently being viewed by the website visitor, displayed as nested unordered html lists. + the page currently being viewed by the website visitor, displayed as nested unordered HTML lists. *@ -@{ var selection = CurrentPage.Children.Where("Visible"); } +@{ var selection = Model.Content.Children.Where(x => x.IsVisible()); } @* Ensure that the Current Page has children *@ @if (selection.Any()) { @* Get the first page in the children, where the property umbracoNaviHide is not True *@ - var naviLevel = CurrentPage.FirstChild().Where("Visible").Level; + var naviLevel = Model.Content.FirstChild(x => x.IsVisible()).Level; @* Add in level for a CSS hook *@
      - @* For each child page where the property umbracoNaviHide is not True *@ + @* Loop through the selection *@ @foreach (var item in selection) {
    • @item.Name @* if this child page has any children, where the property umbracoNaviHide is not True *@ - @if (item.Children.Where("Visible").Any()) + @if (item.Children.Where(x => x.IsVisible()).Any()) { @* Call our helper to display the children *@ @childPages(item.Children) @@ -33,7 +33,7 @@ } -@helper childPages(dynamic selection) +@helper childPages(IEnumerable selection) { @* Ensure that we have a collection of pages *@ if (selection.Any()) @@ -43,13 +43,13 @@ @* Add in level for a CSS hook *@
        - @foreach (var item in selection.Where("Visible")) + @foreach (var item in selection.Where(x => x.IsVisible())) {
      • @item.Name @* if the this page has any children, where the property umbracoNaviHide is not True *@ - @if (item.Children.Where("Visible").Any()) + @if (item.Children.Where(x => x.IsVisible()).Any()) { @* Call our helper to display the children *@ @childPages(item.Children) diff --git a/src/Umbraco.Web.UI/Umbraco/PartialViewMacros/Templates/ListImagesFromMediaFolder.cshtml b/src/Umbraco.Web.UI/Umbraco/PartialViewMacros/Templates/ListImagesFromMediaFolder.cshtml old mode 100644 new mode 100755 index 1549c1eed2..6e5d68b829 --- a/src/Umbraco.Web.UI/Umbraco/PartialViewMacros/Templates/ListImagesFromMediaFolder.cshtml +++ b/src/Umbraco.Web.UI/Umbraco/PartialViewMacros/Templates/ListImagesFromMediaFolder.cshtml @@ -5,7 +5,7 @@ How it works: - Confirm the macro parameter has been passed in with a value - - Loop through all the media Id's passed in (might be a single item, might be many) + - Loop through all the media Ids passed in (might be a single item, might be many) - Display any individual images, as well as any folders of images Macro Parameters To Create, for this macro to work: @@ -15,9 +15,9 @@ @{ var mediaId = Model.MacroParameters["mediaId"]; } @if (mediaId != null) { - @* Get all the media item associated with the id passed in *@ - var media = Umbraco.Media(mediaId); - var selection = media.Children("Image"); + @* Get the media item associated with the id passed in *@ + var media = Umbraco.TypedMedia(mediaId); + var selection = media.Children(); if (selection.Any()) { @@ -25,7 +25,7 @@ @foreach (var item in selection) {
      • - @item.Name + @item.Name
      • }
      diff --git a/src/Umbraco.Web.UI/Umbraco/PartialViewMacros/Templates/MultinodeTree-picker.cshtml b/src/Umbraco.Web.UI/Umbraco/PartialViewMacros/Templates/MultinodeTree-picker.cshtml old mode 100644 new mode 100755 index ae8e427449..379b5b0ea0 --- a/src/Umbraco.Web.UI/Umbraco/PartialViewMacros/Templates/MultinodeTree-picker.cshtml +++ b/src/Umbraco.Web.UI/Umbraco/PartialViewMacros/Templates/MultinodeTree-picker.cshtml @@ -1,21 +1,23 @@ @inherits Umbraco.Web.Macros.PartialViewMacroPage @* - This snippet lists the items from a Multinode tree picker, using the pickers default settings. - Content Values stored as xml. + This snippet lists the items from a Multinode tree picker, using the picker's default settings. + Content Values stored as XML. To get it working with any site's data structure, set the selection equal to the property which has the multinode treepicker (so: replace "PropertyWithPicker" with the alias of your property). *@ -@{ var selection = CurrentPage.PropertyWithPicker.Split(','); } +@{ var selection = Model.Content.GetPropertyValue>("PropertyWithPicker"); } -
        - @foreach (var id in selection) - { - var item = Umbraco.Content(id); -
      • - @item.Name -
      • - } -
      \ No newline at end of file +@if (selection.Any()) +{ +
        + @foreach (var item in selection) + { +
      • + @item.Name +
      • + } +
      +} \ No newline at end of file diff --git a/src/Umbraco.Web.UI/Umbraco/PartialViewMacros/Templates/Navigation.cshtml b/src/Umbraco.Web.UI/Umbraco/PartialViewMacros/Templates/Navigation.cshtml old mode 100644 new mode 100755 index f2a4920a12..94870a37c4 --- a/src/Umbraco.Web.UI/Umbraco/PartialViewMacros/Templates/Navigation.cshtml +++ b/src/Umbraco.Web.UI/Umbraco/PartialViewMacros/Templates/Navigation.cshtml @@ -3,16 +3,19 @@ @* This snippet displays a list of links of the pages immediately under the top-most page in the content tree. This is the home page for a standard website. - It also highlights the current active page/section in the navigation with the css class "current". + It also highlights the current active page/section in the navigation with the CSS class "current". *@ -@{ var selection = CurrentPage.Site().Children.Where("Visible"); } +@{ var selection = Model.Content.Site().Children.Where(x => x.IsVisible()); } -
        - @foreach (var item in selection) - { -
      • - @item.Name -
      • - } -
      +@if (selection.Any()) +{ +
        + @foreach (var item in selection) + { +
      • + @item.Name +
      • + } +
      +} diff --git a/src/Umbraco.Web.UI/Umbraco/PartialViewMacros/Templates/SiteMap.cshtml b/src/Umbraco.Web.UI/Umbraco/PartialViewMacros/Templates/SiteMap.cshtml old mode 100644 new mode 100755 index 0aef1eb3a4..7630b26ed1 --- a/src/Umbraco.Web.UI/Umbraco/PartialViewMacros/Templates/SiteMap.cshtml +++ b/src/Umbraco.Web.UI/Umbraco/PartialViewMacros/Templates/SiteMap.cshtml @@ -1,13 +1,13 @@ @inherits Umbraco.Web.Macros.PartialViewMacroPage @* - This snippet makes a list of links of all visible pages of the site, as nested unordered html lists. + This snippet makes a list of links of all visible pages of the site, as nested unordered HTML lists. How it works: - It uses a custom Razor helper called Traverse() to select and display the markup and links. *@ -@{ var selection = CurrentPage.Site(); } +@{ var selection = Model.Content.Site(); }
      @* Render the sitemap by passing the root node to the traverse helper, below *@ @@ -15,14 +15,14 @@
      -@* Helper method to travers through all descendants *@ -@helper Traverse(dynamic node) +@* Helper method to traverse through all descendants *@ +@helper Traverse(IPublishedContent node) { @* Update the level to reflect how deep you want the sitemap to go *@ var maxLevelForSitemap = 4; @* Select visible children *@ - var selection = node.Children.Where("Visible").Where("Level <= " + maxLevelForSitemap); + var selection = node.Children.Where(x => x.IsVisible() && x.Level <= maxLevelForSitemap); @* If any items are returned, render a list *@ if (selection.Any()) diff --git a/src/Umbraco.Web.UI/Umbraco/config/lang/cs.xml b/src/Umbraco.Web.UI/Umbraco/config/lang/cs.xml index 3ee2c563f7..5ca5078e72 100644 --- a/src/Umbraco.Web.UI/Umbraco/config/lang/cs.xml +++ b/src/Umbraco.Web.UI/Umbraco/config/lang/cs.xml @@ -911,8 +911,6 @@ Vložit za polem Vložit před polem Rekurzivní - Odstranit tagy odstavce - Odstraní jakékoliv &lt;P&gt; na začátku a na konci textu Standardní pole Velká písmena Kódování URL diff --git a/src/Umbraco.Web.UI/Umbraco/config/lang/nb.xml b/src/Umbraco.Web.UI/Umbraco/config/lang/nb.xml index e20bbf57e5..c6c6093395 100644 --- a/src/Umbraco.Web.UI/Umbraco/config/lang/nb.xml +++ b/src/Umbraco.Web.UI/Umbraco/config/lang/nb.xml @@ -884,8 +884,6 @@ Vennlig hilsen Umbraco roboten Sett inn etter felt Sett inn før felt Rekursivt - Fjern paragraftagger - Fjerner eventuelle <P> rundt teksten Standardfelter Store bokstaver URL koding diff --git a/src/Umbraco.Web.UI/Umbraco/config/lang/zh_tw.xml b/src/Umbraco.Web.UI/Umbraco/config/lang/zh_tw.xml new file mode 100644 index 0000000000..53e893ea23 --- /dev/null +++ b/src/Umbraco.Web.UI/Umbraco/config/lang/zh_tw.xml @@ -0,0 +1,1356 @@ + + + + The Umbraco community + http://our.umbraco.org/documentation/Extending-Umbraco/Language-Files + + + 管理主機名稱 + 跟蹤審計 + 流覽節點 + 改變文檔類型 + 複製 + 創建 + 創建擴展包 + 刪除 + 禁用 + 清空回收站 + 匯出文檔類型 + 導入文檔類型 + 導入擴展包 + 即時編輯模式 + 退出 + 移動 + 提醒 + 公眾存取權限 + 發佈 + 取消發佈 + 重新載入節點 + 重新發佈整站 + 回復 + 許可權 + 回滾 + 提交至發佈者 + 發送給翻譯 + 排序 + 提交至發佈者 + 翻譯 + 更新 + 預設值 + + + 禁止訪問 + 添加功能變數名稱 + 移除 + 錯誤的節點 + 功能變數名稱錯誤 + 功能變數名稱重複 + 語言 + 功能變數名稱 + 新功能變數名稱 '%0%' 已創建 + 功能變數名稱 '%0%' 已刪除 + 功能變數名稱 '%0%' 已使用 + 功能變數名稱 '%0%' 已更新 + 編輯當前功能變數名稱 + + 繼承 + 語言 + 或從父節點繼承文化設定。
      + 也會改變目前節點設定,除非下方網域有其他項目。]]>
      + 功能變數名稱 + + + 查看 + + + 清除選擇 + 選擇 + 選擇目前資料夾 + 做別的事情 + 粗體 + 取消段落縮進 + 插入表單字段 + 插入圖片標題 + 編輯Html + 段落縮進 + 斜體 + 居中 + 左對齊 + 右對齊 + 插入連結 + 插入本地連結(錨點) + 圓點列表 + 數字清單 + 插入巨集 + 插入圖片 + 編輯關聯 + 回到清單 + 保存 + 保存並發佈 + 保存並提交審核 + 保存清單檢視 + 預覽 + 因未設置範本無法預覽 + 選擇樣式 + 顯示樣式 + 插入表格 + 產生模組 + + + 要更改所選節點的文檔類型,先在列表中選擇合適的文檔類型。 + 然後設置當前文檔類型到新文檔類型的各欄位間的對應映射關係並保存。 + 內容已被重新發佈 + 當前屬性 + 當前類型 + 不能改變文檔類型,因為沒有可替代的類型。 + 文檔類型已更改 + 要映射的欄位 + 映射欄位 + 新範本 + 新類型 + + 內容 + 選擇新的文檔類型 + 選中文檔的類型已被成功更改為[new type],以下欄位被映射: + + 不能完成欄位映射,因為存在一個欄位映射至多欄位的問題。 + 僅顯示可作為替代的文檔類型。 + + + 已發表 + 關於本頁 + 別名 + (圖片的替代文本) + 替代連結 + 點擊編輯 + 創建者 + 創建者 + 更新者 + 創建時間 + 此文件創建的日期時間 + 文檔類型 + 編輯 + 過期於 + 該項發佈之後有更改 + 該項沒有發佈 + 最近發佈 + 沒有可供顯示的項目 + 此列表中沒有可供顯示的項目 + 媒體類型 + 媒體連結位址 + 會員組 + 角色 + 會員類型 + 沒有選擇時間 + 頁標題 + 屬性 + 該文檔不可見,因為其上級 '%0%' 未發佈。 + 糟糕:該文檔已發佈,但是沒有更新至緩存(內部錯誤) + 糟糕:沒辦法連結到此網址(內部錯誤-請參見記錄) + 糟糕:此文件已經發表,但是網址和其他內容相衝 %0% + 發佈 + 發佈狀態 + 發佈於 + 取消發表於 + 清空時間 + 排序完成 + 拖拽項目或按一下列頭即可排序,可以按住Shift多選。 + 統計 + 標題(可選) + 其他說明文字(可選) + 類型 + 取消發佈 + 最近編輯 + 本文件修改時間 + 移除文件 + 連結到文檔 + 會員組成員 + 非會員組成員 + 子項目 + 目標 + 預計發表的時間(伺服器端) + 這是什麼意思?]]> + + + 點選以便上傳 + 拖曳檔案至此... + 媒體連結 + 或按這裡選擇檔案 + 只允許檔案類型為 + 檔案大小上限為 + + + 新增一位會員 + 所有會員 + + + 您想在哪裡創建 %0% + 創建在 + 選擇類型和標題 + "文檔類型"處變更。]]> + "媒體類型"處變更。]]> + 文檔類型沒有相關範本 + 沒有資料夾 + 新資料類別 + + + 流覽您的網站 + - 隱藏 + 如果Umbraco沒有打開,您可能需要允許彈出式視窗。 + 已經在新視窗中打開 + 重啟 + 訪問 + 歡迎 + + + 留下 + 放棄變更 + 您有未存檔的變更 + 您確定要離開本頁? - 您有未存檔的變更 + + + 完成 + 刪除 %0% 個項目 + 刪除 %0% 個項目 + 刪除 %1% 個中的 %0% 個項目 + 刪除 %1% 個中的 %0% 個項目 + 已發佈 %0% 個項目 + 已發佈 %0% 個項目 + 已發佈 %1% 個中的 %0% 個項目 + 已發佈 %1% 個中的 %0% 個項目 + 取消發佈 %0% 個項目 + 取消發佈 %0% 個項目 + 取消發佈 %1 個中的 %0% 個項目 + 取消發佈 %1 個中的 %0% 個項目 + 移動 %0% 個項目 + 移動 %0% 個項目 + 移動 %1 個中的 %0% 個項目 + 移動 %1 個中的 %0% 個項目 + 複製 %0% 個項目 + 複製 %0% 個項目 + 複製 %1 個中的 %0% 個項目 + 複製 %1 個中的 %0% 個項目 + + + 錨點名稱 + 管理主機名稱 + 關閉窗口 + 您確定要刪除嗎 + 您確定要禁用嗎 + 按一下此框確定刪除%0%項 + 您確定嗎? + 您確定嗎? + 剪切 + 編輯字典項 + 編輯語言 + 插入本地連結 + 插入字元 + 插入圖片標題 + 插入圖片 + 插入連結 + 插入巨集 + 插入表格 + 最近編輯 + 連結 + 內部連結: + 本地連結請用“#”號開頭 + 在新視窗中打開? + 巨集設置 + 本巨集沒有包含您可以編輯的屬性 + 粘貼 + 編輯許可權 + 正在清空回收站,請不要關閉窗口。 + 回收站已清空 + 從回收站刪除的項目將不可恢復 + regexlib.com的網站服務目前出現些狀況,而我們無能為力。我們對此不便感到十分抱歉。]]> + 查找規則運算式來驗證輸入,如: 'email、'zip-code'、'url'。 + 移除巨集 + 必填項目 + 網站已重建索引 + 網站緩存已刷新,所有已發佈的內容更新生效。 + 網站緩存將會刷新,所有已發佈的內容將會更新。 + 表格列數 + 表格行數 + 設定預留位置代碼 以便您要在子範本中插入內容到本範本時,填入此代碼到 <asp:content /> 裡面。]]> + 選擇預留位置代碼 於此清單中。您只能選擇目前父範本中的代碼。]]> + 點擊圖片查看完整大小 + 拾取項 + 查看緩存項 + 新增資料夾... + 與原本相關 + 最友善的社群 + 頁面連結 + 打開此連結文檔至新視窗或標籤頁 + 打開此連結文檔至全新視窗 + 打開此連結文檔在原本視窗中 + 媒體連結 + 選擇媒體 + 選擇圖示 + 選擇項目 + 選擇連結 + 選擇巨集 + 選擇內容 + 選擇會員 + 選擇會員群組 + 沒有找到任何圖示 + 本巨集沒有需要參數 + 外部登入提供者 + 例外細節 + 詳細記錄 + 內部例外 + 連結您的 + 取消連結您的 + 帳戶 + 選擇編輯器 + + + %0%' 編輯不同語言版本,
      您可以在左方選單「語言」中增添新的語言 + ]]>
      + 語言名稱 + + + 輸入您的使用者名稱 + 輸入您的密碼 + 確認您的密碼 + 命名此 %0%... + 輸入一個名稱 + 標籤... + 輸入一段描述... + 搜尋請輸入... + 過濾請輸入... + 增加標籤(每個標籤後請按輸入鍵)... + 輸入您的電子郵件 + + + 允許放置於根節點 + 只有勾選「允許放置於根節點」的內容種類可以放在內容樹或媒體樹的最頂端 + 允許子項節點類型 + 文檔種類集合 + 創建 + 刪除選項卡 + 描述 + 新建選項卡 + 選項卡 + 縮略圖 + 允許清單檢視 + 允許內容項目顯示成可以排列及搜尋的清單,子項目不會被顯示 + 目前清單檢視 + 作用中的清單檢視資料類別 + 新增自訂清單檢視 + 移除自訂清單檢視 + + + 添加預設值 + 資料庫資料類型 + 資料類型唯一標識 + 渲染控制項 + 按鈕 + 允許高級設置 + 允許快顯功能表 + 插入圖片預設最大 + 關聯的樣式表 + 顯示標籤 + 寬和高 + + + 資料已保存,但是發佈前您需要修正一些錯誤: + 當前成員提供程式不支援修改密碼(EnablePasswordRetrieval的值應該為true) + %0% 已存在 + 發現錯誤: + 發現錯誤: + 密碼最少%0%位元,且至少包含%1%位元非字母數位記號 + %0% 必須是整數 + %1% 中的 %0% 欄位是必填項 + %0% 是必填項 + %1% 中的 %0% 格式不正確 + %0% 格式不正確 + + + 收到伺服器傳來的錯誤 + 該檔案類型已被管理員禁用 + 注意,儘管配置中允許CodeMirror,但是它在IE上不夠穩定,所以無法在IE運行。 + 請為新的屬性類型填寫名稱和別名! + 許可權有問題,訪問指定文檔或資料夾失敗! + 讀取片段視圖腳本錯誤(檔案:%0%) + 讀取使用者控制項 %0% 錯誤 + 讀取使用者控制項 %0% 錯誤(組件:%0%,類別:%1%) + 讀取巨集引擎腳本錯誤(檔案:%0%) + 分析XSLT檔案錯誤:%0% + 讀取XSLT檔案錯誤:%0% + 請輸入標題 + 請選擇類型 + 圖片尺寸大於原始尺寸不會提高圖片品質,您確定要把圖片尺寸變大嗎? + python腳本錯誤 + python腳本未保存,因為包含錯誤。 + 預設打開頁面不存在,請聯繫管理員 + 請先選擇內容,再設置樣式。 + 沒有可用的樣式 + 請把游標放在您要合併的兩個儲存格中的左邊儲存格 + 非合併儲存格不能分離。 + XSLT源碼出錯 + XSLT未保存,因為包含錯誤。 + 這是此屬性所使用的資料類別設定錯誤,請檢查資料類別 + + + 關於 + 操作 + 操作 + 添加 + 別名 + 所有 + 您確定嗎? + 回去 + 邊框 + + 取消 + 儲存格邊距 + 選擇 + 關閉 + 關閉窗口 + 備註 + 確認 + 強制屬性 + 繼續 + 複製 + 創建 + 資料庫 + 時間 + 默認 + 刪除 + 已刪除 + 正在刪除… + 設計 + 規格 + + 下載 + 編輯 + 已編輯 + 元素 + 郵箱 + 錯誤 + 查找文檔 + + 幫助 + 圖示 + 導入 + 內邊距 + 插入 + 安裝 + 不合格 + 對齊 + 語言 + 佈局 + 載入中 + 鎖定 + 登入 + 退出 + 登出 + 巨集 + 必要 + 移動 + 更多 + 名稱 + 新的 + 下一步 + + 屬於 + 確定 + 打開 + + 密碼 + 路徑 + 預留位置代碼 + 請稍候… + 上一步 + 屬性 + 接收資料郵箱 + 回收站 + 保持狀態中 + 重命名 + 更新 + 必要 + 重試 + 許可權 + 搜索 + 伺服器 + 顯示 + 在發送時預覽 + 大小 + 排序 + 送出 + 類型 + 輸入內容開始搜尋… + + 更新 + 更新 + 上傳 + 連結位址 + 用戶 + 用戶名 + + 查看 + 歡迎… + + + 資料夾 + 搜尋結果 + 重新排列 + 我已經完成排列 + 預覽 + 更改密碼 + + 清單檢視 + 存檔中... + 目前 + 內嵌 + 選取的 + + + + + + + + + + + 增加標籤頁 + 增加屬性 + 增加編輯器 + 增加範本 + 增加子節點 + 增加子項目 + 編輯資料類別 + 瀏覽區塊 + 捷徑 + 顯示捷徑 + 開關清單檢視 + 開關是否允許為根項目 + + + 背景色 + 粗體 + 前景色 + 字體 + 文本 + + + 頁面 + + + 無法連接到資料庫。 + 無法保存web.config檔,請手工修改。 + 發現資料庫 + 資料庫配置 + 安裝 按鈕來安裝Umbraco資料庫 %0% + ]]> + 下一步繼續。]]> + 沒有找到資料庫!請確認檔案"web.config"中的字串"connection string"是否正確。

      +

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

      +

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

      ]]>
      + + 若需要時,請聯繫您的網路公司。如果您在本地機器或伺服器安裝的話,您也許需要聯絡系統管理者。]]> + + 點選升級按鈕來升級Umbraco資料庫 %0%

      +

      + 請別擔心 - 不會刪除任何資料而且馬上就會繼續運作! +

      + ]]>
      + 點選下一步繼續。]]> + 下一步繼續設定精靈。]]> + 預設使用者的密碼必須更改!]]> + 預設使用者已經被暫停或沒有Umbraco的使用權!

      不需更多的操作步驟。點選下一步繼續。]]> + 安裝後預設使用者的密碼已經成功修改!

      不需更多的操作步驟。點選下一步繼續。]]> + 密碼已更改 + + Umbraco新增一預設使用者,名稱為('admin'),密碼為('default')。修改此密碼是十分重要的事情。

      +

      + 這個步驟會檢查預設使用者的密碼並在需要時建議修改。 +

      + ]]>
      + 作為入門者,從視頻教程開始吧! + 點擊下一步 (或在Web.config中自行修改UmbracoConfigurationStatus),意味著您接受上述授權合約。 + 安裝失敗。 + 受影響的檔和資料夾 + 此處查看更多資訊 + 您需要對以下檔和資料夾授於ASP.NET用戶修改許可權 + 您的權限設定幾近完美!

      + 您可以正常執行Umbraco沒有任何問題,只差您將沒有辦法安裝那些建議需要全部許可權的插件。]]>
      + 如何解決 + 點擊閱讀文字版 + 影片教學來瞭解如何設定Umbraco的資料夾權限或閱讀文字版本。]]> + 您的權限可能有點小問題! +

      + 您可以正常執行Umbraco沒有任何問題,然而您將無法新增資料夾或安裝那些可以讓Umbraco發揮全力的插件。]]>
      + 您的權限設定尚未未完成! +

      + 您需要更新權限設定才能執行Umbraco。]]>
      + 您的權限設定完美無瑕!

      + 您已經準備好執行Umbraco和安裝插件!]]>
      + 解決資料夾問題 + 點此查看ASP.NET和創建資料夾的問題解決方案 + 設置資料夾許可權 + + 我要從頭開始 + 學習該怎麼做) + 您晚點仍可以選擇安裝Runway,請至開發者區域選擇安裝。 + ]]> + 您剛剛安裝了一個乾淨的系統,要繼續嗎? + “Runway”已安裝 + + 這是我們的模組推薦清單,選取您想要安裝的項目,或者至 查詢完整清單。 + ]]> + 僅推薦高級用戶使用 + 給我一個簡單的網站 + + "Runway"是一個提供基本檔案類別和範本的簡單網站。安裝程式會自動幫您設定Runway, + 但你仍可輕易編輯,擴充或移除它。它並非必要項目而且您可以在沒它的情況下完美執行Umbraco。然而, + Runway提供一個輕鬆簡便但基於寶貴經驗的平台讓您可以更快開始。 + 如果您安裝Runway,您還可以選擇名為「Runway模組」的基本區塊來加強Runway頁面。 +

      + + 內含於Runway: 首頁,準備開始頁面,模組安裝頁面。
      + 可選模組: 上方瀏覽列,網站地圖,聯絡,藝廊。 +
      + ]]>
      + “Runway”是什麼? + 步驟 1/5:接受授權合約 + 步驟 2/5:資料庫配置 + 步驟 3/5:文件許可權驗證 + 步驟 4/5:系統安全性 + 步驟 5/5:一切就緒,可以開始使用系統。 + 感謝選擇我們的產品 + 參觀您的新網站 +您剛安裝好Runway,何不瞧瞧它的模樣。]]> + 更多的幫忙與資訊 +從我們獲獎的社群得到幫助,瀏覽文件,或觀看免費影片來瞭解如何輕鬆架設網站,如何使用插件,和瞭解Umbraco項目名稱的快速上手指引。]]> + 系統 %0% 安裝完畢 + /web.config 檔案並且更新AppSetting中的字串UmbracoConfigurationStatus 內容為 '%0%'。]]> + 快速開始指引。
      如果您是Umbraco的新成員, +您可以在其中找到相當多的資源。]]>
      + 啟動Umbraco +想要管理您的網站時,只需開啟Umbraco後台便可增加內容,更新範本和樣式表,或增添新功能。]]> + 無法連接到資料庫。 + 系統版本 3 + 系統版本 4 + 觀看 +
      + 點選"下一步"來啟動精靈。]]>
      + + + 語言代碼 + 語言名稱 + + + 使用者在空閒狀態下將會自動登出 + 已更新,繼續工作。 + + + 超級星期天快樂 + 瘋狂星期一快樂 + 熱鬧星期二快樂 + 美妙星期三快樂 + 悅耳星期四快樂 + 時髦星期五快樂 + 喵喵星期六快樂 + 下方登入 + 登入使用 + 連線時間過了 + © 2001 - %0%
      Umbraco.com

      ]]>
      + 忘記密碼? + 一封內有重設密碼連結的電子郵件已經寄出給您 + 一封內有重設密碼連結的電子郵件已經寄到此信箱 + 回到登入畫面 + 請輸入新密碼 + 您的密碼已經更新 + 您點選的連結是無效或過期的 + Umbraco:重設密碼 + 您登入到後台的使用者名稱是:%0%

      點選這裡來重設您的密碼或將此連結複製/貼上到您的瀏覽器:

      %1%

      ]]>
      + + + 儀錶板 + 區域 + 內容 + + + 選擇上面的頁面… + %0% 被複製到 %1% + 將 %0% 複製到 + %0% 已被移動到 %1% + 將 %0% 移動到 + 作為內容的根結點,點“確定”。 + 尚未選擇節點,請選擇一個節點點擊“確定”。 + 類型不符不允許選擇 + 該項不能移到其子項 + 當前節點不能建在根節點下 + 您在子項的許可權不夠,不允許該操作。 + 複本和原本建立關聯 + + + 為 %0% 編寫通知 + + 哈嘍 %0%

      + +

      這是一封自動產生的信件來通知您 %1% 工作 + 已經在頁面 %2% 上由使用者 %3% 執行完成 +

      + +

      +

      更新摘要:

      + + %6% +
      +

      + + + +

      祝您有美好的一天!

      + Umbraco機器人 謹上 +

      ]]>
      + 在 %2%,[%0%] 關於 %1% 的通告已執行。 + 通知 + + + + 按鈕並點選該檔案。Umbraco擴展包通常有「.zip」的副檔名。 + ]]> + 作者 + 演示 + 文檔 + 中繼資料 + 名稱 + 擴展包不含任何項 +
      + 您可以點選下方「移除擴展包」來安全地移除此項目。]]>
      + 無可用更新 + 選項 + 說明 + 程式庫 + 確認卸載 + 已卸載 + 擴展包卸載成功 + 卸載 + + 注意: 任何文檔,媒體或需要這些項目才能運作的物件將會停止運作,並可能使得系統不穩定, + 請小心移除。若有疑慮,請聯絡擴展包作者。]]> + 從程式庫下載更新 + 更新擴展包 + 更新說明 + 擴展包有可用的更新,您可以從程式庫網站更新。 + 版本 + 版本歷史 + 訪問擴展包網站 + 擴展包已安裝 + 這個擴展包無法安裝,它需要Umbraco至少是版本 %0% + 移除中... + 下載中... + 匯入中... + 安裝中... + 重新啟動中,請稍後... + 都好了,您的瀏覽器將重新整理,請稍待... + + + 帶格式粘貼(不推薦) + 您所粘貼的文本含有特殊字元或格式,Umbraco將清除以適應網頁。 + 無格式粘貼 + 粘貼並移除格式(推薦) + + + 基於角色的保護 + 請使用Umbraco的會員群組。]]> + 使用基於角色的授權需要首先建立會員組。 + 錯誤頁 + 當用戶登錄後訪問沒有許可權的頁時顯示該頁 + 選擇限制訪問此頁的方式 + %0% 現在處於受保護狀態 + %0% 的保護被取消 + 登錄頁 + 選擇公開的登錄入口 + 取消保護 + 選擇一個包含登錄表單和提示資訊的頁 + 選擇訪問該頁的角色類型 + 為此頁設置帳號和密碼 + 單用戶保護 + 如果您只希望提供一個用戶名和密碼就能訪問 + + + + + + + + 包含未發佈的子項 + 正在發佈,請稍候… + %0% 中的 %1% 頁面已發佈… + %0% 已發佈 + %0% 及其子項已發佈 + 發佈 %0% 及其子項 + 發佈按鈕來將%0%的內容設定為公開。

      + 您可以同時發佈本頁以及其子項目若您點選下面的包含子頁。 + ]]>
      + + + 您尚未設定任何許可顏色 + + + 輸入外部連結 + 選擇內部連結 + 標題 + 連結 + 新視窗 + 輸入新標題 + 輸入連結 + + + 重設 + + + 當前版本 + 紅色 文字將不會顯示於所選版本,而綠色表示增加部分。]]> + 文檔已回滾 + 這顯示所選版本的HTML格式,如果您想要比較兩版本的差異,請使用比較檢視 + 回滾至 + 選擇版本 + 查看 + + + 編輯腳本 + + + Concierge + 內容 + Courier + 開發 + 設定精靈 + 媒體 + 會員 + 消息 + 設置 + 統計 + 翻譯 + 用戶 + 說明 + 表單 + 統計 + + + 移至 + 說明主題為 + 影片主題為 + 最好的Umbraco影片教學 + + + 預設範本 + 字典鍵 + 要導入文檔類型,請點擊“流覽”按鈕,再點擊“導入”,然後在您電腦上查找 ".udt"檔導入(下一頁中需要您再次確認) + 新建選項卡標題 + 節點類型 + 類型 + 樣式表 + 腳本 + 樣式表屬性 + 選項卡 + 選項卡標題 + 選項卡 + 主控文件類型啟動 + 該文檔類型使用 + 作為主控文件類型. 主控文件類型的標籤只能在主控文件類型裡修改。 + 沒有欄位設置在該標籤頁 + 主文檔類別 + 新增對應範本 + 增加圖示 + + + 排列順序 + 增添時間 + 排序完成。 + 上下拖拽項目或按一下列頭進行排序 +
      排序中請不要關閉視窗。]]>
      + + + 驗證 + 驗證錯誤一定要修正才能儲存項目 + 失敗 + 使用者權限不足,無法完成操作 + 已取消 + 操作被協力廠商外掛程式取消 + 發佈被協力廠商外掛程式取消 + 屬性類型已存在 + 屬性類型已創建 + 資料類別:%1%]]> + 屬性類型已刪除 + 內容類別型已保存 + 選項卡已創建 + 選項卡已刪除 + id為%0%的選項卡已刪除 + 樣式表未保存 + 樣式表已保存 + 樣式表保存,無錯誤。 + 資料類型已保存 + 字典項已保存 + 因為上級頁面未發佈導致發佈失敗! + 內容已發佈 + 公眾可見 + 內容已保存 + 請發佈以使更改生效 + 提交審核 + 更改已提交審核 + 媒體已保存 + 媒體已保存 + 會員已保存 + 樣式表屬性已保存 + 樣式表已保存 + 範本已保存 + 保存使用者出錯(請查看日誌) + 用戶已保存 + 用戶類型已保存 + 檔未保存 + 檔無法保存,請檢查許可權。 + 檔保存 + 檔保存,無錯誤。 + 語言已保存 + 媒體類別已儲存 + 會員類別已儲存 + Python腳本未保存 + Python腳本因為錯誤未能保存 + Python已保存 + Python腳本無錯誤 + 範本未保存 + 範本別名相同 + 範本已保存 + 範本保存,無錯誤。 + XSLT未保存 + XSLT有錯誤 + XSLT無法保存,請檢查許可權。 + XSLT已保存 + XSLT無錯誤 + 內容已取消發佈 + 片段視圖已保存 + 片段視圖保存,無錯誤。 + 片段視圖未保存 + 片段視圖因為錯誤未能保存 + 腳本視圖已儲存 + 腳本視圖已儲存,沒有任何錯誤! + 腳本視圖未儲存 + 儲存檔案時發生錯誤 + 儲存檔案時發生錯誤 + + + 使用CSS語法,如:h1、.redHeader、.blueTex。 + 編輯樣式表 + 編輯樣式屬性 + 編輯器中的樣式屬性名 + 預覽 + 樣式 + + + 編輯範本 + 插入內容區 + 插入內容預留位置 + 插入字典項 + 插入巨集 + 插入頁欄位 + 母版 + 範本標籤快速指南 + 範本 + + + 選擇內容類別 + 選擇排列方式 + 新增一行 + 新增內容 + 放棄內容 + 設定已儲存 + 此處不允許有內容 + 此處允許有內容 + 點選來內嵌 + 點選來插入圖片 + 圖片標題... + 在此填寫... + 網格排列方式 + 排列是指網格編輯器的整體工作區域,通常您只需要一種或兩種排列方式 + 增加網格排列方式 + 藉由設定列寬以及增加新的區域來調整排列方式 + 行設定 + 行是預先水平排列的格子 + 增加行設定 + 藉由設定小格寬度和增添小格來調整此行 + + 網格排列方式的列總數 + 設定 + 調整設定編輯器可以改變的項目 + 樣式 + 調整樣式編輯器可以改變的項目 + 當JSON格式正確時設定才可以儲存 + 允許所有編輯器 + 允許所有行設定 + 定為預設 + 選擇額外 + 選擇預設 + 已增加 + + + 組合 + 您沒有增加任何選項卡 + 增加新的選項卡 + 增加另外的選項卡 + 繼承的表格 + 增加屬性 + 必要標籤 + 允許清單檢視 + 允許內容項目顯示成可以排列及搜尋的清單,子項目不會被顯示 + 允許的範本 + 選擇哪些範本編輯器可以使用於此類別的內容 + 允許為根項目 + 允許編輯器新增此類別的內容為根項目 + 是的 - 允許此類別內容為根項目 + 允許子節點種類 + 允許某些特定種類能夠成為此種類內容的子項目 + 選擇子節點 + 從已存在的文檔類別中繼承選項卡以及屬性。新選項卡將被新增至目前文檔種類或合併至已存在同名的選項卡中。 + 此內容種類已經用於集合中,因此不能重複添加本身。 + 沒有可用於集合的內容種類。 + 可用的編輯器 + 重複使用 + 編輯器設定 + 設定 + 是,刪除 + 已移至下層 + 已複製至下層 + 選擇要移動的資料夾 + 選擇要複製的資料夾 + 至下方樹狀結構 + 所有文檔種類 + 所有文檔 + 所有媒體項目 + 使用此文檔種類的將被永久刪除,請確認您也想要將它們刪除。 + 使用此媒體種類的將被永久刪除,請確認您也想要將它們刪除。 + 使用此會員種類的將被永久刪除,請確認您也想要將它們刪除。 + 以及所有使用此種類的文件項目 + 以及所有使用此種類的媒體項目 + 以及所有使用此種類的會員項目 + 使用此編輯器將會套用新設定 + 會員可以編輯 + 顯示於會員資料 + + + 替代欄位 + 替代文本 + 大小寫 + 編碼 + 選取欄位 + 轉換分行符號 + 將換行符號取代成為HTML標籤 &lt;br&gt; + 自訂欄位 + 是,僅日期 + 格式化時間 + HTML編碼 + 將替換HTML中的特殊字元 + 將在欄位值後插入 + 將在欄位值前插入 + 小寫 + + 欄位後插入 + 欄位前插入 + 遞迴 + 標準欄位 + 大寫 + URL編碼 + 將格式化URL中的特殊字元 + 當上面欄位值為空時使用 + 該欄位僅在主欄位為空時使用 + 是,含時間,分隔符號為: + + + 標記為您的任務 + 指派給您。請按「翻譯詳情」或頁面名稱觀看包含回應的詳細檢視畫面。 + 您也可以將此頁面下載成為XML格式檔案,請按「下載XML」按鈕。
      + 若想要關閉翻譯任務,請至細節頁面點選「結束」按鈕。 + ]]>
      + 關閉任務 + 翻譯詳情 + 將翻譯任務下載為XML + 下載 XML + 下載 XML DTD + 欄位 + 包含子頁 + + [%0%]翻譯任務:%1% + 沒有翻譯員,請創建翻譯員角色的用戶。 + 您創建的任務 + 由您創建的頁面。要瀏覽包含回應的詳細檢視畫面, + 點選「詳情」或頁面名稱。您可以下載此頁面成為XML格式檔案,請點選「下載XML」連結。 + 若要關閉翻譯任務,請至詳情檢視並點選「關閉」按鈕。 + ]]> + 頁面'%0%'已經發送給翻譯 + 請選擇本內容應該被翻譯成的語言 + 發送頁面'%0%'以便翻譯 + 分配者 + 任務開啟 + 總字數 + 翻譯到 + 翻譯完成。 + 您可以流覽剛翻譯的頁面,如果原始頁存在,您將得到兩者的比較。 + 翻譯失敗,XML可能損壞了。 + 翻譯選項 + 翻譯員 + 上傳翻譯的xml + + + 緩存流覽 + 回收站 + 創建擴展包 + 資料類型 + 字典 + 已安裝的擴展包 + 安裝皮膚 + 安裝新手套件 + 語言 + 安裝本地擴展包 + 巨集 + 媒體類型 + 會員 + 會員組 + 角色 + 會員類型 + 文檔類型 + 相關類型 + 擴展包 + 擴展包 + Python文件 + 從線上程式庫安裝 + 安裝Runway + Runway模組 + Scripting文件 + 腳本 + 樣式表 + 範本 + XSLT文件 + 統計 + + + 有可用更新 + %0%已就緒,點擊這裡下載 + 無到伺服器的連接 + 檢查更新失敗 + + + 管理員 + 分類欄位 + 更改密碼 + 更改密碼 + 確認新密碼 + 要改變密碼,請在框中輸入新密碼,然後按一下“更改密碼”。 + 內容頻道 + 描述欄位 + 禁用用戶 + 文檔類型 + 編輯 + 排除欄位 + 語言 + 登錄 + 默認打開媒體項 + 區域 + 禁用後臺管理介面 + 舊的密碼 + 密碼 + 重設密碼 + 您的密碼已更改! + 重輸密碼 + 輸入新密碼 + 新密碼不能為空! + 當前密碼 + 密碼錯誤 + 新密碼和重輸入的密碼不一致,請重試! + 重輸的密碼和原密碼不一致! + 替換子項許可權設置 + 您正在修改存取權限的頁面: + 選擇要修改許可權的頁 + 搜索子物件 + 預設打開內容項 + 用戶名 + 用戶許可權 + 用戶類型 + 用戶類型 + 撰稿人 + 翻譯者 + 改變 + 您的個人檔案 + 您的歷程記錄 + 連線到期於 + + + 驗證 + 以電子郵件驗證 + 以數字驗證 + 以網址驗證 + ...或輸入自訂驗證 + 必要欄位 + + + + 數值已設為推薦值:%0% + 在設定檔 %3% 中XPath %2% 的數值設為 %1% 。 + 在設定檔 %3% 中XPath %2% 的預期值設為 %1% ,但卻是 %0%。 + 在設定檔 %3% 中XPath %2% 的值為非預期值 %0%。 + + 自訂錯誤設定為 %0% + 自訂錯誤設定為 %0。建議在上線前改為 %1%。 + 自訂錯誤成功設定為 %0% + 巨集錯誤設為 %0% + 巨集錯誤設為 %0%,如此一來,當巨集有任何錯誤時會阻止某些或全部頁面正常載入。改正會將此設定 %1%。 + 巨集錯誤已設為 %0% + + 嘗試略過IIS自訂錯誤目前設為 %0%,而且您使用的IIS版本為 %1%。 + 嘗試略過IIS自訂錯誤目前設為 %0%,然而在您使用的IIS版本為 %2% 時,建議設定是 %1%。 + 嘗試略過IIS自訂錯誤已成功設為 %0%。 + + 檔案不存在:%0%。 + '%1%'中無法找到'%0%'。]]> + 有錯誤產生,請參閱下列錯誤的紀錄:%0%。 + 成員 - 所有XML:%0%,總共:%1%,不合格:%2% + 媒體 - 所有XML:%0%,總共發佈:%1%,不合格:%2% + 內容 - 所有XML:%0%,總共發佈:%1%,不合格:%2% + 憑證驗證錯誤:%0% + 網址探查錯誤:%0% - '%1%' + 您目前使用HTTPS瀏覽本站:%0% + 在您的web.config檔案中,appSetting的umbracoUseSSL是設為false。當您開始使用HTTPS時,應將其改為 true。 + 在您的web.config檔案中,appSetting的umbracoUseSSL是設為 %0%,您的cookies %0% 標成安全。 + 無法在您的web.config檔案中,更新appSetting的umbracoUseSSL設定,錯誤訊息:%0% + + 開啟HTTPS + 在web.config檔案中,將appSetting的umbracoUseSSL設true。 + 在您的web.config檔案中,appSetting的umbracoUseSSL已設為 true,您的cookies 將被標成安全。 + 修正 + 無法修正比較種類檢查為'ShouldNotEqual'。 + 用提供的數值無法修正比較種類檢查為'ShouldEqual'。 + 沒有提供要修正檢查的數值。 + 偵錯編輯模式關閉。 + 偵錯編輯模式目前已開啟。上線前建議將其關閉。 + 偵錯編輯模式已成功關閉。 + 詳細記錄模式已關閉。 + 詳細記錄模式目前已開啟。上線前建議將其關閉。 + 詳細記錄模式已成功關閉。 + 所有資料夾已有正確權限設定。 + + %0%。]]> + %0%。如果無須寫入,不需採取行動。]]> + 所有檔案已有正確權限設定。 + + %0%。]]> + %0%。如果無須寫入,不需採取行動。]]> + X-Frame-Options 設定能控制網站是否可以被其他人IFRAMEd已找到。]]> + X-Frame-Options 設定能控制網站是否可以被其他人IFRAMEd沒有找到。]]> + 調整設定的標頭 + 在 web.config 的 httpProtocol/customHeaders 區域增加設定來防止本站被別的網站IFRAMEd。 + 在 web.config 的 httpProtocol/customHeaders 區域已經增加設定來防止本站被別的網站IFRAMEd。 + 無法更新web.config檔案,錯誤:%0% + + %0%。]]> + 在標頭中沒有找到揭露網站技術的資訊。 + 在 Web.config 檔案中,找不到 system.net/mailsettings。 + 在 Web.config 檔案中的 system.net/mailsettings,沒有設定 host 。 + SMTP設定正確,而且服務正常運作。 + SMTP伺服器 %0% : %1% 無法連接。請確認在Web.config 檔案中 system.net/mailsettings 設定正確。 + %0%。]]> + %0%。]]> + + + 停止網址追蹤器 + 啟動網址追蹤器 + 原本網址 + 轉址成 + 沒有任何轉址 + 當發佈後的頁面改名或移動時,會自動轉址至新網頁。 + 移除 + 您確定要移除從 %0% 到 %1% 的轉址嗎? + 轉址已移除。 + 移除轉址錯誤。 + + 您確定要停止轉址追蹤器? + 轉址追蹤器已停止。 + 停止轉址追蹤器錯誤,更多資訊請參閱您的紀錄檔。 + 轉址追蹤器已開啟。 + 啟動轉址追蹤器錯誤,更多資訊請參閱您的紀錄檔。 + +
      \ No newline at end of file diff --git a/src/Umbraco.Web.UI/packages.config b/src/Umbraco.Web.UI/packages.config index 555740eda3..8b22708406 100644 --- a/src/Umbraco.Web.UI/packages.config +++ b/src/Umbraco.Web.UI/packages.config @@ -4,7 +4,7 @@ - + diff --git a/src/Umbraco.Web.UI/umbraco/config/lang/da.xml b/src/Umbraco.Web.UI/umbraco/config/lang/da.xml index 281dbacdbd..bc3fccfd34 100644 --- a/src/Umbraco.Web.UI/umbraco/config/lang/da.xml +++ b/src/Umbraco.Web.UI/umbraco/config/lang/da.xml @@ -89,8 +89,8 @@ Gem og udgiv Gem og send til udgivelse Gem listevisning - Se siden - Preview er deaktiveret fordi der ikke er nogen skabelon tildelt + Forhåndsvisning + Forhåndsvisning er deaktiveret fordi der ikke er nogen skabelon tildelt Vælg formattering Vis koder Indsæt tabel @@ -1145,8 +1145,6 @@ Mange hilsner fra Umbraco robotten Indsæt efter felt Indsæt før felt Rekursivt - Fjern paragraf-tags - Fjerner eventuelle &lt;P&gt; omkring teksten Standard felter Uppercase URL encode @@ -1202,9 +1200,10 @@ Mange hilsner fra Umbraco robotten Medlemstype Dokumenttyper Relationstyper - Pakker Pakker + Partial Views + Partial View Makro Filer Python Installer fra "repository" Installer Runway diff --git a/src/Umbraco.Web.UI/umbraco/config/lang/de.xml b/src/Umbraco.Web.UI/umbraco/config/lang/de.xml index 776a23183b..7dade3efa7 100644 --- a/src/Umbraco.Web.UI/umbraco/config/lang/de.xml +++ b/src/Umbraco.Web.UI/umbraco/config/lang/de.xml @@ -859,7 +859,7 @@ Wenn Sie sich für Runway entscheiden, können Sie optional Blöcke nutzen, die Element hinzufügen Zeilenlayout auswählen - Einfach auf <i class="icon icon-add blue"></i> klicken, um das erste Element anzulegen + Element mit <i class="icon icon-add blue"></i> hinzufügen Drop content Klicken, um Inhalt einzubetten Klicken, um Abbildung einzufügen @@ -903,8 +903,6 @@ Wenn Sie sich für Runway entscheiden, können Sie optional Blöcke nutzen, die An den Feldinhalt anhängen Dem Feldinhalt voranstellen Rekursiv - Textabsatz entfernen - Alle <p> am Anfang und am Ende des Feldinhalts werden entfernt Standardfelder Großbuchstaben URL kodieren diff --git a/src/Umbraco.Web.UI/umbraco/config/lang/en.xml b/src/Umbraco.Web.UI/umbraco/config/lang/en.xml index d99cd8f43f..fc5861165d 100644 --- a/src/Umbraco.Web.UI/umbraco/config/lang/en.xml +++ b/src/Umbraco.Web.UI/umbraco/config/lang/en.xml @@ -177,6 +177,8 @@ Target This translates to the following time on the server: What does this mean?]]> + Add another text box + Remove this text box Click to upload @@ -304,6 +306,7 @@ Link to page Opens the linked document in a new window or tab Link to media + Link to file Select media Select icon Select item @@ -320,9 +323,10 @@ Stacktrace Inner Exception Link your - Un-Link your + Un-link your account Select editor + Select snippet Related stylesheets Show label Width and height + All property types & property data + using this data type will be deleted permanently, please confirm you want to delete these as well + Yes, delete + and all property types & property data using this data type + Select the folder to move + to in the tree structure below + was moved underneath Your data has been saved, but before you can publish this page there are some errors you need to fix first: @@ -438,6 +449,7 @@ Close Window Comment Confirm + Constrain Constrain proportions Continue Copy @@ -449,6 +461,7 @@ Deleted Deleting... Design + Dictionary Dimensions Down Download @@ -458,6 +471,7 @@ Email Error Find + First Height Help Icon @@ -468,6 +482,7 @@ Invalid Justify Language + Last Layout Loading Locked @@ -495,6 +510,7 @@ Email to receive form data Recycle Bin Remaining + Remove Rename Renew Required @@ -806,6 +822,39 @@ To manage your website, simply open the Umbraco back office and start adding con Choose Package from your machine, by clicking the Browse
      button and locating the package. Umbraco packages usually have a ".zip" extension. ]]> + Drop to upload + or click here to choose files + Upload package + Install a local package by selecting it from your machine. Only install packages from sources you know and trust + Upload another package + Cancel and upload another package + License + I accept + terms of use + Install package + Finish + Installed packages + You don’t have any packages installed + 'Packages' icon in the top right of your screen]]> + Search for packages + Results for + We couldn’t find anything for + Please try searching for another package or browse through the categories + Popular + New releases + has + karma points + Information + Owner + Contributors + Created + Current version + .NET version + Downloads + Likes + Compatibility + This package is compatible with the following versions of Umbraco, as reported by community members. Full compatability cannot be gauranteed for versions reported below 100% + External sources Author Demonstration Documentation @@ -818,7 +867,7 @@ To manage your website, simply open the Umbraco back office and start adding con Package options Package readme Package repository - Confirm uninstall + Confirm package uninstall Package was uninstalled The package was successfully uninstalled Uninstall package @@ -833,14 +882,15 @@ To manage your website, simply open the Umbraco back office and start adding con Package version history View package website Package already installed - This package cannot be installed, it requires a minimum Umbraco version of %0% + This package cannot be installed, it requires a minimum Umbraco version of Uninstalling... Downloading... Importing... Installing... Restarting, please wait... All done, your browser will now refresh, please wait... - Please click finish to complete installation and reload page. + Please click 'Finish' to complete installation and reload the page. + Uploading package... Paste with full formatting (Not recommended) @@ -908,6 +958,10 @@ To manage your website, simply open the Umbraco back office and start adding con Reset + Define crop + Give the crop an alias and its default width and height + Save crop + Add new crop Current version @@ -1116,6 +1170,7 @@ To manage your website, simply open the Umbraco back office and start adding con Query builder + Build a query items returned, in I want @@ -1261,34 +1316,43 @@ To manage your website, simply open the Umbraco back office and start adding con + Add fallback field + Fallback field + Add default value + Default value Alternative field Alternative Text Casing Encoding Choose field Convert line breaks - Replaces line breaks with html-tag &lt;br&gt; + Yes, convert line breaks + Replaces line breaks with 'br' html tag Custom Fields - Yes, Date only + Date only + Format and encoding Format as date + Format the value as a date, or a date with time, according to the active culture HTML encode Will replace special characters by their HTML equivalent. Will be inserted after the field value Will be inserted before the field value Lowercase + Modify output None + Output sample Insert after field Insert before field Recursive - Remove Paragraph tags - Will remove any &lt;P&gt; in the beginning and end of the text + Yes, make it recursive + Separator Standard Fields Uppercase URL encode Will format special characters in URLs Will only be used when the field values above are empty This field will only be used if the primary field is empty - Yes, with time. Separator: + Date and time Tasks assigned to you @@ -1360,6 +1424,8 @@ To manage your website, simply open the Umbraco back office and start adding con Relation Types Packages Packages + Partial Views + Partial View Macro Files Python Files Install from repository Install Runway @@ -1370,8 +1436,6 @@ To manage your website, simply open the Umbraco back office and start adding con Templates XSLT Files Analytics - Partial Views - Partial View Macro Files New update ready @@ -1425,12 +1489,20 @@ To manage your website, simply open the Umbraco back office and start adding con Session expires in - Validation - Validate as email - Validate as a number - Validate as a Url - ...or enter a custom validation - Field is mandatory + Validation + Validate as email + Validate as a number + Validate as a Url + ...or enter a custom validation + Field is mandatory + Enter a regular expression + You need to add at least + You can only have + items + items selected + Invalid date + Not a number + Invalid email + Wartość jest ustawiona na rekomendowaną wartość: '%0%'. + Wartość została ustawiona na '%1%' dla XPath '%2%' w pliku konfiguracyjnym '%3%'. + Oczekiwana jest wartość '%1%' dla '%2%' w pliku konfiguracyjnym '%3%', ale znaleziono '%0%'. + Znaleziono nieoczekiwaną wartość '%0%' dla '%2%' w pliku konfiguracyjnym '%3%'. + + + Niestandardowe błędy są ustawione na '%0%'. + Niestandardowe błędy są obecnie ustawione na '%0%'. Zaleca się ustawienie ich na '%1%' przed wypuszczeniem strony na produkcję. + Niestandardowe błędy zostały z powodzeniem ustawione na '%0%'. + + MacroErrors są ustawione na '%0%'. + MacroErrors są ustawione na '%0%' co uniemożliwi częściowe lub całkowite załadowanie stron w Twojej witrynie jeśli wystąpią jakiekolwiek błędy w makro. Korekta ustawi wartość na '%1%'. + MacroErrors są teraz ustawione na '%0%'. + + + Try Skip IIS Custom Errors jest ustawione na '%0%' a Ty używasz IIS w wersji '%1%'. + Try Skip IIS Custom Errors wynosi obecnie '%0%'. Zalecane jest ustawienie go na '%1%' dla Twojego IIS w wersji (%2%). + Try Skip IIS Custom Errors ustawiono z powodzeniem na '%0%'. + + + Plik nie istnieje: '%0%'. + '%0%' w pliku konfiguracyjnym '%1%'.]]> + Wystąpił błąd, sprawdź logi, aby wyświetlić pełen opis błędu: %0%. + + Członkowie - Suma XML: %0%, Suma: %1%, Suma niepoprawnych: %2% + Media - Suma XML: %0%, Suma: %1%, Suma niepoprawnych: %2% + Zawartość - Suma XML: %0%, Suma opublikowanych: %1%, Suma niepoprawnych: %2% + + Certifikat Twojej strony został oznaczony jako poprawny. + Błąd walidacji certyfikatu: '%0%' + Błąd pingowania adresu URL %0% - '%1%' + Oglądasz %0% stronę używając HTTPS. + appSetting 'umbracoUseSSL' został ustawiony na 'false' w Twoim pliku web.config. Po uzyskaniu dostępu do strony, używając HTTPS, powinieneś go ustawić na 'true'. + appSetting 'umbracoUseSSL' został ustawiony na '%0%' w Twoim pliku web.config, Twoje ciasteczka są %1% ustawione jako bezpieczne. + Nie można zaktualizaować ustawień 'umbracoUseSSL' w Twoim pliku web.config file. Błąd: %0% + + + Włącz HTTPS + Ustawia umbracoSSL na 'true' w appSettings pliku web.config. + appSetting 'umbracoUseSSL' jest teraz ustawione na 'true' w Twoim pliku web.config, Twoje ciasteczka będą oznaczone jako bezpieczne. + + Napraw + Nie można naprawić sprawdzenia z wartością typu porównania 'ShouldNotEqual'. + Nie można naprawić sprawdzenia z wartością typu porównania 'ShouldEqual' z wprowadzoną wartością. + Nie wprowadzono wartości do naprawy sprawdzenia. + + Tryb kompilacji debugowania jest wyłączony. + Tryb kompilacji debugowania jest obecnie włączony. Zaleca się wyłączenie tego ustawienia przed wypuszczeniem strony na produkcję. + Tryb komplikacji debugowania został wyłączony z powodzeniem. + + Tryb śledzenia jest wyłączony. + Tryb śledzenia jest obecnie włączony. Zaleca się wyłączenie tego ustawienia przed wypuszczeniem strony na produkcję. + Tryb śledzenia został wyłączony z powodzeniem + + Wszystkie foldery mają ustawione poprawne ustawienia. + + %0%.]]> + %0%. Jeśli nie będzie nic w nich pisane, żadne działania nie muszą być podejmowane.]]> + + Wszystkie pliki mają ustawione poprawne uprawnienia. + + %0%.]]> + %0%. Jeśli nie będzie nic w nich pisane, żadne działania nie muszą być podejmowane.]]> + + X-Frame-Options używany do kontrolowania czy strona może być IFRAME'owana przez inną został znaleziony.]]> + X-Frame-Options używany do kontrolowania czy strona może być IFRAME'owana przez inną nie został znaleziony.]]> + Ustaw nagłówek w Config + Dodaje wartość do sekcji httpProtocol/customHeaders pliku web.config, aby zapobiec IFRAME'owania strony przez inne witryny. + Ustawienie do tworzenia nagłówka, zapobiegającego IFRAME'owania strony przez inne witryny zostało dodane do Twojego pliku web.config. + Nie można zaktualizować pliku web.config. Błąd: %0% + + + %0%.]]> + Nie znaleziono żadnych nagłówków, ujawniających informacji o technologii strony. + + Nie znaleziono system.net/mailsettings w pliku Web.config. + Host nie jest skonfigurowany w sekcji system.net/mailsettings pliku Web.config. + Ustawienia SMTP są skonfigurowane poprawnie i serwis działa według oczekiwań. + Nie można połączyć się z serwerem SMTP skonfigurowanym z hostem '%0%' i portem '%1%'. Proszę sprawdzić ponownie, czy ustawienia system.net/mailsettings w pliku Web.config są poprawne. + + %0%.]]> + %0%.]]> + + + Wyłącz śledzenie URL + Włącz śledzenie URL + Oryginalny URL + Przekierowane do + Nie stworzono żadnych przekierowań + Kiedy nazwa opublikowanej strony zostanie zmieniona lub zostanie ona przeniesiona, zostanie stworzone automatyczne przekierowanie na nową stronę. + Usuń + Czy jesteś pewien, że chcesz usunąć przekierowanie z '%0%' do '%1%'? + Przekierowanie URL zostało usunięte. + Wystąpił błąd podczas usuwania przekierowania URL. + Czy jesteś pewien, że chcesz wyłączyć śledzenie URL? + Śledzenie URL zostało wyłączone. + Wystąpił błąd podczas wyłączania śledzenia URL, więcej informacji znajdziesz w pliku z logami. + Śledzenie URL zostało włączone. + Wystąpił błąd podczas włączania śledzenia URL, więcej informacji znajdziesz w pliku z logami. + + + Brak elementów słownika do wyboru + + diff --git a/src/Umbraco.Web.UI/umbraco/config/lang/pt.xml b/src/Umbraco.Web.UI/umbraco/config/lang/pt.xml index adc26ca46a..1953dac8f8 100644 --- a/src/Umbraco.Web.UI/umbraco/config/lang/pt.xml +++ b/src/Umbraco.Web.UI/umbraco/config/lang/pt.xml @@ -783,8 +783,6 @@ Você pode publicar esta página e todas suas sub-páginas ao selecionar pub Inserir após campo Inserir antes do campo Recursivo - Remover etiquetas de parágrafo - Removerá quaisquer &lt;P&gt; do começo ao fim do texto Maiúscula Codificar URL Vai formatar caracteres especiais em URLs diff --git a/src/Umbraco.Web.UI/umbraco/config/lang/ru.xml b/src/Umbraco.Web.UI/umbraco/config/lang/ru.xml index 11ce7a3252..72f8b37a28 100644 --- a/src/Umbraco.Web.UI/umbraco/config/lang/ru.xml +++ b/src/Umbraco.Web.UI/umbraco/config/lang/ru.xml @@ -187,12 +187,12 @@ Ссылка на медиа-элементы Тип медиа-контента Группа участников - Член групп(ы) + Включен в группу(ы) Роль участника Тип участника Дата не указана Заголовок ссылки - Не является членом групп(ы) + Доступные группы Свойства Этот документ опубликован, но скрыт, потому что его родительский документ '%0%' не опубликован ВНИМАНИЕ: этот документ опубликован, но его нет в глобальном кэше (внутренняя ошибка - подробности в системном журнале) @@ -216,13 +216,15 @@ Обновлено Удалить файл Ссылка на документ + Добавить новое поле текста + Удалить это поле текста Композиции Вы не добавили ни одной вкладки Добавить вкладку Добавить новую вкладку - Унаследован от + Унаследовано от Добавить свойство Обязательная метка @@ -364,6 +366,7 @@ Выбрать участника Выбрать группу участников Это макрос без параметров + Нет макросов доступных для вставки в редактор Провайдеры аутентификации Подробное сообщение об ошибке Трассировка стека @@ -372,6 +375,7 @@ Разорвать связь учетную запись Выбрать редактор + Выбрать образец Сопоставленные стили CSS Показать метку Ширина и высота + ВСЕ типы свойств и данные в свойствах документов, + использующие этот тип данных, будут удалены безвозвратно, подтвердите их удаление + Да, можно удалить + и все типы свойств и данные свойств, использующие этот тип данных + Выберите папку, чтобы переместить в нее + в структуре дерева ниже + был перемещен в папку Нет доступных элементов словаря @@ -487,6 +498,7 @@ Удалено Удаляется... Дизайн + Словарь Размеры Вниз Скачать @@ -496,6 +508,7 @@ Email адрес Ошибка Найти + Начало Папка Высота Справка @@ -508,10 +521,11 @@ Выравнивание Название Язык + Конец Макет Загрузка БЛОКИРОВКА - Логин + Войти Выйти Выход Макрос @@ -520,7 +534,7 @@ Переместить Название Новый - Следующий + След Нет из Ok @@ -530,12 +544,13 @@ Путь Идентификатор контейнера Минуточку... - Предыдущий + Пред Свойства Email адрес для получения данных Корзина Ваша корзина пуста Осталось + Удалить Переименовать Обновить Обязательное @@ -731,6 +746,10 @@ Сбросить + Задать рамку + Задайте рамке имя (алиас), а также ширину и высоту по-умолчанию + Сохранить рамку + Добавить новую рамку Программа установки не может установить подключение к базе данных. @@ -799,7 +818,7 @@ Здесь можно узнать об этом подробнее) Вы также можете отложить установку "Runway" на более позднее время. Перейдите к разделу "Для разработчиков" и выберите пункт "Пакеты". + (Здесь можно узнать об этом подробнее) Вы также можете отложить установку "Runway" на более позднее время. Перейдите к разделу "Разработка" и выберите пункт "Пакеты". ]]> Вы только что установили чистую платформу Umbraco. Какой шаг будет следующим? "Runway" установлен @@ -968,6 +987,39 @@ Выберите файл пакета на своем компьютере, нажав на кнопку 'Обзор'
      и указав на нужный файл. Пакеты Umbraco обычно являются архивами с расширением ".umb" или ".zip". ]]> + Перетащите сюда + или нажмите здесь для выбора файла пакета + Загрузить пакет + Установите локальный пакет из файла, расположенного на Вашем компьютере. Остерегайтесь устанавливать пакеты из непроверенных источников! + Загрузить еще один пакет + Отменить и загрузить другой пакет + Лицензия + Я принимаю + условия использования + Установить пакет + Завершить + Установленные пакеты + Ни одного пакета еще не установлено + 'Packages' наверху справа]]> + Поиск по пакетам + Результаты поиска по + Ничего не найдено по запросу + Пожалуйста, повторите поиск, уточнив запрос, или воспользуйтесь просмотром по категориям + Популярные + Недавно созданные + имеет на счету + очков кармы + Информация + Владелец + Соавторы + Создан + Текущая версия + Версия .NET + Загрузок + Нравится + Совместимость + Этот пакет совместим со следующими версиями Umbraco, по сообщениям участников сообщества. Полная совместимость не гарантируется для версий со значением ниже 100% + Внешние источники Автор Демонстрация Документация (описание) @@ -980,7 +1032,7 @@ Опции пакета Краткий обзор пакета Репозиторий пакета - Подтверждение деинсталляции + Подтверждение деинсталляции пакета Пакет деинсталлирован Указанный пакет успешно удален из системы Деинсталлировать пакет @@ -995,14 +1047,15 @@ История версий пакета Перейти на веб-сайт пакета Этот пакет уже установлен в системе - Этот пакет не может быть установлен, он требует наличия Umbraco версии как минимум %0% + Этот пакет не может быть установлен, он требует наличия Umbraco версии как минимум Удаление... Загрузка... Импорт... Установка... Перезапуск, подождите, пожалуйста... Все готово, сейчас браузер перезагрузит страницу, подождите, пожалуйста... - Пожалуйста, нажмите кнопку 'finish' для завершения установки и перезагрузки страницы. + Пожалуйста, нажмите кнопку 'Завершить' для завершения установки и перезагрузки страницы. + Загрузка пакета... Вставить, полностью сохранив форматирование (не рекомендуется) @@ -1119,7 +1172,7 @@ Смотритель Содержимое Курьер - Для Разработчиков + Разработка Формы Помощь Мастер конфигурирования Umbraco @@ -1184,7 +1237,7 @@ Порядок сортировки Дата создания Сортировка завершена - Перетаскивайте элементы на нужное место вверх или вниз для определения необходимого Вам порядка сортировки. Также можно щелкнуть по заголовкам столбцов, чтобы отсортировать все элементы сразу. + Перетаскивайте элементы на нужное место вверх или вниз для определения необходимого Вам порядка сортировки. Также можно использовать заголовки столбцов, чтобы отсортировать все элементы сразу.
      Не закрывайте это окно до окончания процесса сортировки.]]>
      @@ -1330,6 +1383,7 @@ Генератор запросов + Построить запрос элементов в результате, за Мне нужны @@ -1367,34 +1421,40 @@ Шаблон + Добавить поле замены + Добавить значение по-умолчанию Альтернативное поле - Альтернативный текст + Текст по-умолчанию Регистр Выбрать поле Преобразовать переводы строк - Заменяет переводы строк на тэг html <br> + Заменяет переводы строк на тэг html 'br' Пользовательские Только дата Кодировка + Форматирование и кодировка Форматировать как дату + Форматировать значение как дату, или как дату и время, в соответствии с текущей культурой Кодировка HTML Заменяет спецсимволы эквивалентами в формате HTML Будет добавлено после поля Будет вставлено перед полем В нижнем регистре + Модификации при выводе -Не указано- + Пример результата Вставить после поля Вставить перед полем Рекурсивно - Удалить тэги параграфов - Удаляются тэги <p> в начале и в конце абзацев + Да, использовать рекурсию + Разделитель Стандартные В верхнем регистре Кодирование URL Форматирование специальных символов в URL Это значение будет использовано только если предыдущие поля пусты Это значение будет использовано только если первичное поле пусто - Дата и время. Разделитель: + Дата и время Задачи, назначенные Вам @@ -1535,5 +1595,13 @@ Валидация по формату Url ...или указать свои правила валидации Обязательно к заполнению + Задайте регулярное выражение + Необходимо выбрать как минимум + Возможно выбрать максимум + элементов + элементов + Неверный формат даты + Не является числом + неверный формат email-адреса diff --git a/src/Umbraco.Web.UI/umbraco/config/lang/sv.xml b/src/Umbraco.Web.UI/umbraco/config/lang/sv.xml index 75bb41e35c..51c780f57e 100644 --- a/src/Umbraco.Web.UI/umbraco/config/lang/sv.xml +++ b/src/Umbraco.Web.UI/umbraco/config/lang/sv.xml @@ -820,8 +820,6 @@ Infoga efter fält Infoga före fält Rekursiv - Avlägsna stycke-taggar - Kommer att avlägsna alla &lt;P&gt; i början och slutet av texten Standardfält Versaler URL-koda diff --git a/src/Umbraco.Web.UI/umbraco/config/lang/zh.xml b/src/Umbraco.Web.UI/umbraco/config/lang/zh.xml index 0341316f25..55a01d299e 100644 --- a/src/Umbraco.Web.UI/umbraco/config/lang/zh.xml +++ b/src/Umbraco.Web.UI/umbraco/config/lang/zh.xml @@ -46,7 +46,7 @@ 添加域名 移除 错误的节点 - 域名错误 + 域名错误 域名重复 语言 域名 @@ -55,13 +55,17 @@ 域名 '%0%' 已使用 域名 '%0%' 已更新 编辑当前域名 - + + https://www.example.com/、example.com/en、……使用 * 代表任意域名,
      - 只需要设置语言部分即可。]]>
      + 只需要设置语言部分即可。]]> +
      继承 语言 - - 也可以从父节点继承。]]> + + + 也可以从父节点继承。]]> + 域名 @@ -100,27 +104,29 @@ 显示样式 插入表格 生成模型 + 撤销 + 重做 要更改所选节点的文档类型,先在列表中选择合适的文档类型。 然后设置当前文档类型到新文档类型的各字段间的对应映射关系并保存。 - 内容已被重新发布 + 内容已被重新发布 当前属性 当前类型 不能改变文档类型,因为没有可替代的类型。 - 文档类型已更改 + 文档类型已更改 要映射的字段 映射字段 新模板 新类型 - + 内容 选择新的文档类型 选中文档的类型已被成功更改为[new type],以下字段被映射: 不能完成字段映射,因为存在一个字段映射至多字段的问题。 - 仅显示可作为替代的文档类型。 - + 仅显示可作为替代的文档类型。 + 已发布 关于本页 @@ -151,8 +157,8 @@ 属性 该文档不可见,因为其上级 '%0%' 未发布。 该文档已发布,但是没有更新至缓存(内部错误) - Could not get the url - This document is published but its url would collide with content %0% + 无法获取网址 + 此文档已发布,但其url将与内容相冲突 %0% 发布 发布状态 发布于 @@ -162,7 +168,7 @@ 拖拽项目或单击列头即可排序,可以按住Shift多选。 统计 标题(可选) - Alternative text (optional) + 备选 (可选) 类型 取消发布 最近编辑 @@ -175,11 +181,13 @@ 目标 这将转换到服务器上的以下时间: 这是什么意思?]]> + 添加其他文本框 + 删除此文本框 点击上传 将文件放在此处.. - 链接到媒体 + 链接到媒体 或单击此处选择文件 仅允许的文件类型为 最大文件大小为 @@ -197,6 +205,13 @@ 没有模板的文档类型 新建文件夹 新数据类型 + 新建 javascript 文件 + 新建空分部视图 + 新的分部视图宏 + 从代码段中新建分部视图 + 新的空分部视图宏 + 从代码段中新建分部视图宏 + 新的分部视图宏 (不带宏) 浏览您的网站 @@ -213,29 +228,24 @@ 您有未保存的更改 确实要离开此页吗?-您有未保存的更改 - + 完成 - 已删除 %0% 项 已删除 %0% 项 已删除 %0% 项,共 %1% 项 已删除 %0% 项,共 %1% 项 - 已发布 %0% 项 已发布 %0% 项 已发布 %0% 项,共 %1% 项 已发布 %0% 项,共 %1% 项 - 已取消发布 %0% 项 已取消发布 %0% 项 已取消发布 %0% 项,共 %1% 项 已取消发布 %0% 项,共 %1% 项 - 已移动 %0% 项 已移动 %0% 项 已移动 %0% 项,共 %1% 项 已移动 %0% 项,共 %1% 项 - 已复制 %0% 项 已复制 %0% 项 已复制 %0% 项,共 %1% 项 @@ -281,10 +291,14 @@ 网站缓存将会刷新,所有已发布的内容将会更新。 表格列数 表格行数 - 设置一个占位符id 您可以在子模板中通过该ID来插入内容, - 引用格式: <asp:content />。]]> - 选择一个 - 占位符id。]]> + + 设置一个占位符id 您可以在子模板中通过该ID来插入内容, + 引用格式: <asp:content />。]]> + + + 选择一个 + 占位符id。]]> + 点击图片查看完整大小 拾取项 查看缓存项 @@ -313,11 +327,16 @@ 取消链接您的 帐户 选择编辑器 + 帐号 + 选择编辑器 + 选择代码段 - + %0%

      您可以在左侧的“语言”中添加一种语言 - ]]> + ]]> + 语言名称 编辑字典项的键。 @@ -338,6 +357,7 @@ 输入过滤词... 键入添加tags (在每个tag之后按 enter)... 输入您的电子邮件 + 您的用户名通常是您的电子邮件 允许在根目录 @@ -369,6 +389,13 @@ 关联的样式表 显示标签 宽和高 + 所有属性类型 & 属性数据 + 使用此数据类型将被永久删除, 请确认您还要删除这些 + 是, 删除 + 以及使用此数据类型的所有属性类型 & 属性数据 + 选择要移动的文件夹 + 在树结构下面 + 被移到下面 数据已保存,但是发布前您需要修正一些错误: @@ -427,6 +454,7 @@ 关闭窗口 备注 确认 + 约束 强制属性 继续 复制 @@ -438,6 +466,7 @@ 已删除 正在删除… 设计 + 字典 规格 下载 @@ -447,6 +476,7 @@ 邮箱 错误 查找文档 + 第一 帮助 图标 @@ -457,6 +487,7 @@ 无效 对齐 语言 + 最后 布局 加载中 锁定 @@ -484,18 +515,22 @@ 接收数据邮箱 回收站 保持状态中 + 移除 重命名 更新 必填 重试 权限 搜索 + 对不起, 我们找不到你要找的东西。 + 未添加任何项目 服务器 显示 在发送时预览 大小 排序 - 提交 + 提交 + 类型 输入内容开始查找… @@ -534,22 +569,26 @@ - 添加选项卡 - 添加属性 - 添加编辑器 - 添加模板 - 添加子节点 - 添加子项 - - 编辑数据类型 - - 导航节 - - 快捷方式 - 显示快捷方式 - - 切换列表视图 - 切换允许作为根 + 添加选项卡 + 添加属性 + 添加编辑器 + 添加模板 + 添加子节点 + 添加子项 + 编辑数据类型 + 导航节 + 快捷方式 + 显示快捷方式 + 切换列表视图 + 切换允许作为根 + 注释/取消注释行 + 移除行 + 向上复制行 + 向下复制行 + 向上移动行 + 向下移动线条 + 一般 + 编辑 @@ -568,26 +607,34 @@ 无法保存web.config文件,请手工修改。 发现数据库 数据库配置 - + 安装进行 %0% 数据库配置 - ]]> + ]]> + 下一步继续。]]> - 数据库未找到!请检查数据库连接串设置。

      + + 数据库未找到!请检查数据库连接串设置。

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

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

      - ]]>
      - + ]]> + + + 如有必要,请联系您的系统管理员。 - 如果您是本机安装,请使用管理员账号。]]> - + + + 点击更新来更新系统到 %0%

      不用担心更新会丢失数据!

      - ]]>
      + ]]> +
      点击下一步继续。]]> 下一步继续]]> @@ -595,7 +642,8 @@ 默认账户已禁用或无权访问系统!

      点击下一步继续。]]> 安装过程中默认用户密码已更改

      点击下一步继续。]]> 密码已更改 - + 系统创建了一个默认用户(‘admin’)和默认密码(‘default’)。 现在密码是随机的。 @@ -603,48 +651,64 @@

      该步骤建议您修改默认密码。

      - ]]>
      + ]]> + 作为入门者,从视频教程开始吧! 点击下一步 (或在Web.config中自行修改UmbracoConfigurationStatus),意味着您接受上述许可协议。 安装失败。 受影响的文件和文件夹 此处查看更多信息 您需要对以下文件和文件夹授于ASP.NET用户修改权限 - 您当前的安全设置满足要求!

      - 您可以毫无问题的运行系统,但您不能安装系统所推荐的扩展包的完整功能。]]>
      + + 您当前的安全设置满足要求!

      + 您可以毫无问题的运行系统,但您不能安装系统所推荐的扩展包的完整功能。]]> +
      如何解决 点击阅读文字版 视频教程 ]]> - 您当前的安全设置有问题! + + 您当前的安全设置有问题!

      - 您可以毫无问题的运行系统,但您不能新建文件夹、也不能安装系统所推荐的包的完整功能。 ]]>
      - 您当前的安全设置不适合于系统! + 您可以毫无问题的运行系统,但您不能新建文件夹、也不能安装系统所推荐的包的完整功能。 ]]> + + + 您当前的安全设置不适合于系统!

      - 您需要修改系统访问权限。]]>
      - 您当前的权限设置正确!

      - 您可以运行系统并安装其它扩展包!]]>
      + 您需要修改系统访问权限。]]> +
      + + 您当前的权限设置正确!

      + 您可以运行系统并安装其它扩展包!]]> +
      解决文件夹问题 点此查看ASP.NET和创建文件夹的问题解决方案 设置文件夹权限 - + + ]]> + 我要从头开始 - + 如何操作?) 您也可以安装晚一些安装“Runway”。 - ]]> + ]]> + 您刚刚安装了一个干净的系统,要继续吗? “Runway”已安装 - + 这是我们推荐的模块,您也可以查看 全部模块 - ]]> + ]]> + 仅推荐高级用户使用 给我一个简单的网站 - + “Runway”是一个简单的,包含文件类型和模板的示例网站。安装程序会自动为您安装。 您可以自行编辑和删除之。 @@ -655,7 +719,8 @@ Runway: 主页, 开始页, 安装模块页.
      可选模块: 顶部导航, 站点地图, 联系我们, 图库. - ]]>
      + ]]> + “Runway”是什么? 步骤 1/5:接受许可协议 步骤 2/5:数据库配置 @@ -663,24 +728,34 @@ 步骤 4/5:系统安全性 步骤 5/5:一切就绪,可以开始使用系统。 感谢选择我们的产品 - 浏览您的新站点 -您安装了“Runway”,那么来瞧瞧吧。]]> - 更多的帮助信息 -从社区获取帮助]]> + + 浏览您的新站点 +您安装了“Runway”,那么来瞧瞧吧。]]> + + + 更多的帮助信息 +从社区获取帮助]]> + 系统 %0% 安装完毕 - /web.config file 的 AppSetting 键 - UmbracoConfigurationStatus'%0%'。]]> + + /web.config file 的 AppSetting 键 + UmbracoConfigurationStatus'%0%'。]]> + 立即开始请点“运行系统”
      如果您是新手, 您可以得到相当丰富的学习资源。]]>
      - 运行系统 + + 运行系统 管理您的网站, 运行后台添加内容, -也可以添加模板和功能。]]> +也可以添加模板和功能。]]> + 无法连接到数据库。 系统版本 3 系统版本 4 观看 - +
      -按 “下一步”进入向导。]]>
      +按 “下一步”进入向导。]]> + 语言代码 @@ -735,7 +810,8 @@ 为 %0% 编写通知 - + - %0%:

      + ]]> +
      + + %0%:

      您好!这是一封自动发送的邮件,告诉您任务'%1%' 已在'%2%' @@ -774,23 +852,61 @@

      祝您愉快!

      该信息由系统自动发送 -

      ]]>
      +

      ]]> + 在 %2%,[%0%] 关于 %1% 的通告已执行。 通知 - + 选择 ".umb" 或者 ".zip" 文件 - ]]> + ]]> + + 拖入上传 + 或单击此处选择文件 + 上传包 + 通过从计算机中选择一个本地包来安装它。仅从您知道和信任的来源安装软件包 + 上传另一包 + 取消并上载另一个包 + 许可证 + 我接受 + 使用条款 + 安装包 + 完成 + 已安装的软件包 + 您没有安装任何软件包 + "程序包" 图标浏览可用的包]]> + 搜索包 + 结果为 + 我们找不到任何东西 + 请尝试搜索其他包或浏览类别 + 流行 + 新版本 + + karma 点 + 信息 + 所有者 + 贡献者 + 创建 + 当前版本 + .NET 版本 + 下载 + 喜欢 + 兼容性 + 此软件包与社区成员报告的 Umbraco 的以下版本兼容。报告100% 以下版本不能保证完全兼容 + 外部来源 作者 演示 文档 元数据 名称 扩展包不含任何项 -
      - 点击下面的“卸载”,您可以安全的删除。]]>
      + +
      + 点击下面的“卸载”,您可以安全的删除。]]> +
      无可用更新 选项 说明 @@ -799,9 +915,11 @@ 已卸载 扩展包卸载成功 卸载 - + + 注意: - 卸载包将导致所有依赖该包的东西失效,请确认。 ]]> + 卸载包将导致所有依赖该包的东西失效,请确认。 ]]> + 从程序库下载更新 更新扩展包 更新说明 @@ -818,6 +936,7 @@ 重启中, 请稍候... 所有完成后, 您的浏览器将立即刷新, 请稍候... 请单击 "完成" 以完成安装和重新加载页面。 + Uploading package... 带格式粘贴(不推荐) @@ -849,27 +968,37 @@ %0% 无法发布, 因为该项在计划发布中。 ]]> - + - + + + - + + + - + + + + ]]> + 包含未发布的子项 正在发布,请稍候… %0% 中的 %1% 页面已发布… %0% 已发布 %0% 及其子项已发布 发布 %0% 及其子项 - 确定 发布 %0%

      + + 确定 发布 %0%

      要发布当前页和所有子页,请选中 全部发布 发布所有子页。 - ]]>
      + ]]> +
      您没有配置任何认可的颜色 @@ -885,6 +1014,10 @@ Reset + Define crop + Give the crop an alias and its default width and height + Save crop + Add new crop 当前版本 @@ -950,8 +1083,8 @@
      请不要关闭窗口]]>
      - 验证 - 在保存项之前必须修复验证错误 + 验证 + 在保存项之前必须修复验证错误 失败 用户权限不足, 无法完成操作 取消 @@ -1027,15 +1160,90 @@ 编辑模板 + 部分 插入内容区 插入内容占位符 + 插入 + 选择要插入到模板中的内容 插入字典项 + 字典项是可翻译的文本部分的占位符, 这使得为多语言网站创建设计变得容易。 插入宏 + + 宏是一个可配置的组件, 对于 + 设计的可重用部分, 在这里您需要提供参数的选项, + 如画廊、表格和列表。 + 插入页字段 + 显示当前页中指定字段的值, 其中有用于修改值或回退到替代值的选项。 + 分部视图 + + 分部视图是可以在另一个模板内呈现的单独的模板文件, + 它对于重用标记或将复杂的模板分离到单独的文件中非常重要。 + 母版 - 模板标签快速指南 + 无主模板 + 无主 + 呈现子模板 + + @RenderBody(). + ]]> + + 定义命名节 + + @section { ... }. 这可以呈现在 + 此模板的父级的特定区域, 请使用 @RenderSection. + ]]> + + 呈现命名节 + + @RenderSection(name). + 这将呈现子模板的一个区域, 它被包装在相应的 @section [名称] {...} 定义中. + ]]> + + 节名称 + 节是必需的 + + 如果强制, 子模板必须包含 @section 定义, 否则将显示错误。 + + 查询生成器 + 生成查询 + 返回的项, 在 + 我要 + 所有内容 + 类型 "%0%"的内容 + from + 我的网站 + where + and + is + is not + before + before (包含选定日期) + after + after (包含选定日期) + equals + does not equal + contains + does not contain + greater than + greater than or equal to + less than + less than or equal to + Id + Name + Created Date + Last Updated Date + order by + ascending + descending 模板 + 选择内容类别 选择一项布局 @@ -1043,15 +1251,12 @@ 添加内容 丢弃内容 设置已应用 - 此处不允许有该内容 此处允许有该内容 - 点击嵌入 点击添加图片 图片说明... 在这里输入... - 网格布局 布局是网格编辑器的整体工作区域, 通常只需要一个或两个不同的布局 添加网络布局 @@ -1060,18 +1265,13 @@ 行是水平排列的预定义单元格 添加行配置 通过设置单元格宽度和添加其他单元格来调整行 - 网格布局中的总和列数 - 设置 配置编辑器可以更改的设置 - 样式 配置编辑器可以更改的样式 - 输入的 json 配置有效, 设置才可保存 - 允许所有的编辑器 允许所有行配置 设置为默认值 @@ -1081,89 +1281,81 @@ - - 组合 - 您没有添加任何选项卡 - 添加新选项卡 - 添加其他选项卡 - 继承自 - 添加属性 - 必需的标签 - - 启用列表视图 - 配置内容项以显示其子项的可排序和搜索列表, 这些子项将不会显示在树中 - - 允许的模板 - 选择允许在该类型的内容上使用哪些模板编辑器 - - 允许作为根 - 允许编辑器在内容树的根目录中创建此类型的内容 - 是 - 允许根中的此类型的内容 - - 允许的子节点类型 - 允许在该类型的内容下方创建指定类型的内容 - - 选择子节点 - - 从现有文档类型继承选项卡和属性。如果存在同名的选项卡, 则新选项卡将添加到当前文档类型或合并。 - 此内容类型在组合中使用, 因此不能自行组成。 - 没有可供组合使用的内容类型。 - - 可用编辑器 - 重用 - 编辑器设置 - - 配置 - - 是,删除 - - 被移动到下方 - 被复制到下面 - 选择要移动的文件夹 - 选择要复制的文件夹 - 在下面的树结构中 - - 所有文档类型 - 所有文档 - 所有媒体项目 - - 使用此文档类型将被永久删除, 请确认您还要删除这些文件。 - 使用此媒体类型将被永久删除, 请确认您也要删除这些。 - 使用此成员类型将被永久删除, 请确认您想要删除这些 - - 和所有使用此类型的文档 - 和所有使用此类型的媒体项目 - 和使用此类型的所有成员 - - 使用此编辑器将用新设置更新 - - 成员可编辑 - 显示成员配置文件 - + 组合 + 您没有添加任何选项卡 + 添加新选项卡 + 添加其他选项卡 + 继承自 + 添加属性 + 必需的标签 + 启用列表视图 + 配置内容项以显示其子项的可排序和搜索列表, 这些子项将不会显示在树中 + 允许的模板 + 选择允许在该类型的内容上使用哪些模板编辑器 + 允许作为根 + 允许编辑器在内容树的根目录中创建此类型的内容 + 是 - 允许根中的此类型的内容 + 允许的子节点类型 + 允许在该类型的内容下方创建指定类型的内容 + 选择子节点 + 从现有文档类型继承选项卡和属性。如果存在同名的选项卡, 则新选项卡将添加到当前文档类型或合并。 + 此内容类型在组合中使用, 因此不能自行组成。 + 没有可供组合使用的内容类型。 + 可用编辑器 + 重用 + 编辑器设置 + 配置 + 是,删除 + 被移动到下方 + 被复制到下面 + 选择要移动的文件夹 + 选择要复制的文件夹 + 在下面的树结构中 + 所有文档类型 + 所有文档 + 所有媒体项目 + 使用此文档类型将被永久删除, 请确认您还要删除这些文件。 + 使用此媒体类型将被永久删除, 请确认您也要删除这些。 + 使用此成员类型将被永久删除, 请确认您想要删除这些 + 和所有使用此类型的文档 + 和所有使用此类型的媒体项目 + 和使用此类型的所有成员 + 使用此编辑器将用新设置更新 + 成员可编辑 + 显示成员配置文件 + 添加后备字段 + 后备字段 + 添加默认值 + 默认值 替代字段 替代文本 大小写 + 编码 选取字段 转换换行符 + 是, 转换换行符 将换行符转化为&lt;br&gt; 自定义字段 是,仅日期 - 编码 + 格式和编码 格式化时间 + 根据活动区域性将该值设置为日期或日期。 HTML编码 将替换HTML中的特殊字符 将在字段值后插入 将在字段值前插入 小写 + 修改输出 + 输出示例 字段后插入 字段前插入 递归 - 移除段落符号 - 将移除&lt;P&gt;标签 + 是, 让它递归 + 分隔符 标准字段 大写 URL编码 @@ -1174,10 +1366,12 @@ 标记为您的任务 - 分配给您. 查看详情, 点击“详情”或页名。 + + 分配给您. 查看详情, 点击“详情”或页名。 如果需要XML格式,请点击“下载 XML”链接。
      关闭翻译任务,请返回详细视图点击“关闭”按钮。 - ]]>
      + ]]> +
      关闭任务 翻译详情 将翻译任务下载为xml @@ -1185,7 +1379,8 @@ 下载 XML DTD 字段 包含子页 - + + ]]> + [%0%]翻译任务:%1% 没有翻译员,请创建翻译员角色的用户。 您创建的任务 - 您创建的页面. 查看详情, 点击“详情” 或页名. + + 您创建的页面. 查看详情, 点击“详情” 或页名. 如果需要XML格式,请点击“下载 Xml”链接。
      关闭翻译任务,请返回详细视图点击“关闭”按钮。 - ]]>
      + ]]> +
      页面'%0%'已经发送给翻译 请选择内容应翻译成的语言 发送页面'%0%'以便翻译 @@ -1242,6 +1440,8 @@ 关系类型 扩展包 扩展包 + 分部视图 + 分部视图宏文件 Python文件 从在线程序库安装 安装Runway @@ -1252,8 +1452,6 @@ 模板 XSLT文件 分析 - 分部视图 - 分部视图宏文件 有可用更新 @@ -1307,95 +1505,94 @@ 会话过期于 - 验证 - 验证为电子邮件 - 验证为数字 - 验证为 url - ...或输入自定义验证 - 字段是强制性的 + 验证 + 验证为电子邮件 + 验证为数字 + 验证为 url + ...或输入自定义验证 + 字段是强制性的 + 输入正则表达式 + 您需要添加至少 + 你只能有 + + 选定的项 + 无效日期 + 不是一个数字 + 无效的电子邮件 - + Value is set to the recommended value: '%0%'. - Value was set to '%1%' for XPath '%2%' in configuration file '%3%'. + Value was set to '%1%' for XPath '%2%' in configuration file '%3%'. Expected value '%1%' for '%2%' in configuration file '%3%', but found '%0%'. Found unexpected value '%0%' for '%2%' in configuration file '%3%'. - - Custom errors are set to '%0%'. - Custom errors are currently set to '%0%'. It is recommended to set this to '%1%' before go live. - Custom errors successfully set to '%0%'. + + Custom errors are set to '%0%'. + Custom errors are currently set to '%0%'. It is recommended to set this to '%1%' before go live. + Custom errors successfully set to '%0%'. + MacroErrors are set to '%0%'. + MacroErrors are set to '%0%' which will prevent some or all pages in your site from loading completely if there are any errors in macros. Rectifying this will set the value to '%1%'. + MacroErrors are now set to '%0%'. - MacroErrors are set to '%0%'. - MacroErrors are set to '%0%' which will prevent some or all pages in your site from loading completely if there are any errors in macros. Rectifying this will set the value to '%1%'. - MacroErrors are now set to '%0%'. + + Try Skip IIS Custom Errors is set to '%0%' and you're using IIS version '%1%'. + Try Skip IIS Custom Errors is currently '%0%'. It is recommended to set this to '%1%' for your IIS version (%2%). + Try Skip IIS Custom Errors successfully set to '%0%'. - - Try Skip IIS Custom Errors is set to '%0%' and you're using IIS version '%1%'. - Try Skip IIS Custom Errors is currently '%0%'. It is recommended to set this to '%1%' for your IIS version (%2%). - Try Skip IIS Custom Errors successfully set to '%0%'. + + File does not exist: '%0%'. + '%0%' in config file '%1%'.]]> + There was an error, check log for full error: %0%. + Members - Total XML: %0%, Total: %1%, Total invalid: %2% + Media - Total XML: %0%, Total: %1%, Total invalid: %2% + Content - Total XML: %0%, Total published: %1%, Total invalid: %2% + Your site certificate was marked as valid. + Certificate validation error: '%0%' + Error pinging the URL %0% - '%1%' + You are currently %0% viewing the site using the HTTPS scheme. + The appSetting 'umbracoUseSSL' is set to 'false' in your web.config file. Once you access this site using the HTTPS scheme, that should be set to 'true'. + The appSetting 'umbracoUseSSL' is set to '%0%' in your web.config file, your cookies are %1% marked as secure. + Could not update the 'umbracoUseSSL' setting in your web.config file. Error: %0% - - File does not exist: '%0%'. - '%0%' in config file '%1%'.]]> - There was an error, check log for full error: %0%. - - Members - Total XML: %0%, Total: %1%, Total invalid: %2% - Media - Total XML: %0%, Total: %1%, Total invalid: %2% - Content - Total XML: %0%, Total published: %1%, Total invalid: %2% - - Your site certificate was marked as valid. - Certificate validation error: '%0%' - Error pinging the URL %0% - '%1%' - You are currently %0% viewing the site using the HTTPS scheme. - The appSetting 'umbracoUseSSL' is set to 'false' in your web.config file. Once you access this site using the HTTPS scheme, that should be set to 'true'. - The appSetting 'umbracoUseSSL' is set to '%0%' in your web.config file, your cookies are %1% marked as secure. - Could not update the 'umbracoUseSSL' setting in your web.config file. Error: %0% - - - Enable HTTPS - Sets umbracoSSL setting to true in the appSettings of the web.config file. - The appSetting 'umbracoUseSSL' is now set to 'true' in your web.config file, your cookies will be marked as secure. - - Fix + + Enable HTTPS + Sets umbracoSSL setting to true in the appSettings of the web.config file. + The appSetting 'umbracoUseSSL' is now set to 'true' in your web.config file, your cookies will be marked as secure. + Fix Cannot fix a check with a value comparison type of 'ShouldNotEqual'. Cannot fix a check with a value comparison type of 'ShouldEqual' with a provided value. Value to fix check not provided. - - Debug compilation mode is disabled. - Debug compilation mode is currently enabled. It is recommended to disable this setting before go live. - Debug compilation mode successfully disabled. - - Trace mode is disabled. - Trace mode is currently enabled. It is recommended to disable this setting before go live. - Trace mode successfully disabled. - + Debug compilation mode is disabled. + Debug compilation mode is currently enabled. It is recommended to disable this setting before go live. + Debug compilation mode successfully disabled. + Trace mode is disabled. + Trace mode is currently enabled. It is recommended to disable this setting before go live. + Trace mode successfully disabled. All folders have the correct permissions set. + 0: Comma delimitted list of failed folder paths + --> %0%.]]> %0%. If they aren't being written to no action need be taken.]]> - All files have the correct permissions set. + 0: Comma delimitted list of failed folder paths + --> %0%.]]> %0%. If they aren't being written to no action need be taken.]]> - X-Frame-Options used to control whether a site can be IFRAMEd by another was found.]]> X-Frame-Options used to control whether a site can be IFRAMEd by another was not found.]]> Set Header in Config @@ -1404,16 +1601,14 @@ Could not update web.config file. Error: %0% + 0: Comma delimitted list of headers found + --> %0%.]]> No headers revealing information about the website technology were found. - In the Web.config file, system.net/mailsettings could not be found. In the Web.config file system.net/mailsettings section, the host is not configured. SMTP settings are configured correctly and the service is operating as expected. The SMTP server configured with host '%0%' and port '%1%' could not be reached. Please check to ensure the SMTP settings in the Web.config file system.net/mailsettings are correct. - %0%.]]> %0%.]]> @@ -1434,4 +1629,7 @@ 现在已启用 url 跟踪程序。 启用 url 跟踪程序时出错, 可以在日志文件中找到更多信息。 + + 没有可供选择的词典项目 + diff --git a/src/Umbraco.Web.UI/umbraco/developer/Macros/editMacro.aspx b/src/Umbraco.Web.UI/umbraco/developer/Macros/editMacro.aspx index ee0dfe02bd..05bfab1115 100644 --- a/src/Umbraco.Web.UI/umbraco/developer/Macros/editMacro.aspx +++ b/src/Umbraco.Web.UI/umbraco/developer/Macros/editMacro.aspx @@ -58,6 +58,9 @@ + + + diff --git a/src/Umbraco.Web/Cache/ContentTypeCacheRefresher.cs b/src/Umbraco.Web/Cache/ContentTypeCacheRefresher.cs index 955be82783..e83050dd26 100644 --- a/src/Umbraco.Web/Cache/ContentTypeCacheRefresher.cs +++ b/src/Umbraco.Web/Cache/ContentTypeCacheRefresher.cs @@ -185,11 +185,10 @@ namespace Umbraco.Web.Cache { var needsContentRefresh = false; - ApplicationContext.Current.ApplicationCache.RuntimeCache.ClearCacheByKeySearch(CacheKeys.IdToKeyCacheKey); - ApplicationContext.Current.ApplicationCache.RuntimeCache.ClearCacheByKeySearch(CacheKeys.KeyToIdCacheKey); - foreach (var payload in payloads) { + ApplicationContext.Current.Services.IdkMap.ClearCache(payload.Id); + //clear the cache for each item ClearContentTypeCache(payload); diff --git a/src/Umbraco.Web/Cache/DataTypeCacheRefresher.cs b/src/Umbraco.Web/Cache/DataTypeCacheRefresher.cs index 34ca2ceec0..6b001d24fa 100644 --- a/src/Umbraco.Web/Cache/DataTypeCacheRefresher.cs +++ b/src/Umbraco.Web/Cache/DataTypeCacheRefresher.cs @@ -100,18 +100,17 @@ namespace Umbraco.Web.Cache ClearAllIsolatedCacheByEntityType(); ClearAllIsolatedCacheByEntityType(); ClearAllIsolatedCacheByEntityType(); - ApplicationContext.Current.ApplicationCache.RuntimeCache.ClearCacheByKeySearch(CacheKeys.IdToKeyCacheKey); - ApplicationContext.Current.ApplicationCache.RuntimeCache.ClearCacheByKeySearch(CacheKeys.KeyToIdCacheKey); var dataTypeCache = ApplicationContext.Current.ApplicationCache.IsolatedRuntimeCache.GetCache(); - payloads.ForEach(payload => + foreach (var payload in payloads) { //clears the prevalue cache if (dataTypeCache) dataTypeCache.Result.ClearCacheByKeySearch(string.Format("{0}_{1}", CacheKeys.DataTypePreValuesCacheKey, payload.Id)); + ApplicationContext.Current.Services.IdkMap.ClearCache(payload.Id); PublishedContentType.ClearDataType(payload.Id); - }); + } TagsValueConverter.ClearCaches(); MultipleMediaPickerPropertyConverter.ClearCaches(); diff --git a/src/Umbraco.Web/Cache/MediaCacheRefresher.cs b/src/Umbraco.Web/Cache/MediaCacheRefresher.cs index a0e037e110..fc589b530b 100644 --- a/src/Umbraco.Web/Cache/MediaCacheRefresher.cs +++ b/src/Umbraco.Web/Cache/MediaCacheRefresher.cs @@ -153,13 +153,13 @@ namespace Umbraco.Web.Cache private static void ClearCache(params JsonPayload[] payloads) { if (payloads == null) return; - - ApplicationContext.Current.ApplicationCache.RuntimeCache.ClearCacheByKeySearch(CacheKeys.IdToKeyCacheKey); - ApplicationContext.Current.ApplicationCache.RuntimeCache.ClearCacheByKeySearch(CacheKeys.KeyToIdCacheKey); + ApplicationContext.Current.ApplicationCache.ClearPartialViewCache(); - payloads.ForEach(payload => + foreach (var payload in payloads) { + ApplicationContext.Current.Services.IdkMap.ClearCache(payload.Id); + var mediaCache = ApplicationContext.Current.ApplicationCache.IsolatedRuntimeCache.GetCache(); //if there's no path, then just use id (this will occur on permanent deletion like emptying recycle bin) @@ -190,9 +190,7 @@ namespace Umbraco.Web.Cache // published cache... PublishedMediaCache.ClearCache(payload.Id); - }); - - + } } } } \ No newline at end of file diff --git a/src/Umbraco.Web/Cache/MemberCacheRefresher.cs b/src/Umbraco.Web/Cache/MemberCacheRefresher.cs index 32e6a69717..e20359fb10 100644 --- a/src/Umbraco.Web/Cache/MemberCacheRefresher.cs +++ b/src/Umbraco.Web/Cache/MemberCacheRefresher.cs @@ -60,8 +60,7 @@ namespace Umbraco.Web.Cache private void ClearCache(int id) { - ApplicationContext.Current.ApplicationCache.RuntimeCache.ClearCacheByKeySearch(CacheKeys.IdToKeyCacheKey); - ApplicationContext.Current.ApplicationCache.RuntimeCache.ClearCacheByKeySearch(CacheKeys.KeyToIdCacheKey); + ApplicationContext.Current.Services.IdkMap.ClearCache(id); ApplicationContext.Current.ApplicationCache.ClearPartialViewCache(); ApplicationContext.Current.ApplicationCache.RuntimeCache. diff --git a/src/Umbraco.Web/Cache/TemplateCacheRefresher.cs b/src/Umbraco.Web/Cache/TemplateCacheRefresher.cs index 4d6c0c612b..04f3d2b4fb 100644 --- a/src/Umbraco.Web/Cache/TemplateCacheRefresher.cs +++ b/src/Umbraco.Web/Cache/TemplateCacheRefresher.cs @@ -60,8 +60,7 @@ namespace Umbraco.Web.Cache private void RemoveFromCache(int id) { - ApplicationContext.Current.ApplicationCache.RuntimeCache.ClearCacheByKeySearch(CacheKeys.IdToKeyCacheKey); - ApplicationContext.Current.ApplicationCache.RuntimeCache.ClearCacheByKeySearch(CacheKeys.KeyToIdCacheKey); + ApplicationContext.Current.Services.IdkMap.ClearCache(id); ApplicationContext.Current.ApplicationCache.RuntimeCache.ClearCacheItem( string.Format("{0}{1}", CacheKeys.TemplateFrontEndCacheKey, id)); diff --git a/src/Umbraco.Web/Cache/UnpublishedPageCacheRefresher.cs b/src/Umbraco.Web/Cache/UnpublishedPageCacheRefresher.cs index a36ac657a7..e352c8108a 100644 --- a/src/Umbraco.Web/Cache/UnpublishedPageCacheRefresher.cs +++ b/src/Umbraco.Web/Cache/UnpublishedPageCacheRefresher.cs @@ -77,8 +77,7 @@ namespace Umbraco.Web.Cache public override void RefreshAll() { - ApplicationContext.Current.ApplicationCache.RuntimeCache.ClearCacheByKeySearch(CacheKeys.IdToKeyCacheKey); - ApplicationContext.Current.ApplicationCache.RuntimeCache.ClearCacheByKeySearch(CacheKeys.KeyToIdCacheKey); + ApplicationContext.Current.Services.IdkMap.ClearCache(); ClearAllIsolatedCacheByEntityType(); ClearAllIsolatedCacheByEntityType(); DistributedCache.Instance.ClearDomainCacheOnCurrentServer(); @@ -87,8 +86,7 @@ namespace Umbraco.Web.Cache public override void Refresh(int id) { - ApplicationContext.Current.ApplicationCache.RuntimeCache.ClearCacheByKeySearch(CacheKeys.IdToKeyCacheKey); - ApplicationContext.Current.ApplicationCache.RuntimeCache.ClearCacheByKeySearch(CacheKeys.KeyToIdCacheKey); + ApplicationContext.Current.Services.IdkMap.ClearCache(id); ClearRepositoryCacheItemById(id); ClearAllIsolatedCacheByEntityType(); content.Instance.UpdateSortOrder(id); @@ -98,8 +96,7 @@ namespace Umbraco.Web.Cache public override void Remove(int id) { - ApplicationContext.Current.ApplicationCache.RuntimeCache.ClearCacheByKeySearch(CacheKeys.IdToKeyCacheKey); - ApplicationContext.Current.ApplicationCache.RuntimeCache.ClearCacheByKeySearch(CacheKeys.KeyToIdCacheKey); + ApplicationContext.Current.Services.IdkMap.ClearCache(id); ClearRepositoryCacheItemById(id); ClearAllIsolatedCacheByEntityType(); DistributedCache.Instance.ClearDomainCacheOnCurrentServer(); @@ -109,8 +106,7 @@ namespace Umbraco.Web.Cache public override void Refresh(IContent instance) { - ApplicationContext.Current.ApplicationCache.RuntimeCache.ClearCacheByKeySearch(CacheKeys.IdToKeyCacheKey); - ApplicationContext.Current.ApplicationCache.RuntimeCache.ClearCacheByKeySearch(CacheKeys.KeyToIdCacheKey); + ApplicationContext.Current.Services.IdkMap.ClearCache(instance.Id); ClearRepositoryCacheItemById(instance.Id); ClearAllIsolatedCacheByEntityType(); content.Instance.UpdateSortOrder(instance); @@ -120,8 +116,7 @@ namespace Umbraco.Web.Cache public override void Remove(IContent instance) { - ApplicationContext.Current.ApplicationCache.RuntimeCache.ClearCacheByKeySearch(CacheKeys.IdToKeyCacheKey); - ApplicationContext.Current.ApplicationCache.RuntimeCache.ClearCacheByKeySearch(CacheKeys.KeyToIdCacheKey); + ApplicationContext.Current.Services.IdkMap.ClearCache(instance.Id); ClearRepositoryCacheItemById(instance.Id); ClearAllIsolatedCacheByEntityType(); DistributedCache.Instance.ClearDomainCacheOnCurrentServer(); @@ -134,12 +129,11 @@ namespace Umbraco.Web.Cache /// public void Refresh(string jsonPayload) { - ApplicationContext.Current.ApplicationCache.RuntimeCache.ClearCacheByKeySearch(CacheKeys.IdToKeyCacheKey); - ApplicationContext.Current.ApplicationCache.RuntimeCache.ClearCacheByKeySearch(CacheKeys.KeyToIdCacheKey); ClearAllIsolatedCacheByEntityType(); foreach (var payload in DeserializeFromJsonPayload(jsonPayload)) { + ApplicationContext.Current.Services.IdkMap.ClearCache(payload.Id); ClearRepositoryCacheItemById(payload.Id); content.Instance.UpdateSortOrder(payload.Id); } @@ -157,6 +151,5 @@ namespace Umbraco.Web.Cache contentCache.Result.ClearCacheItem(RepositoryBase.GetCacheIdKey(id)); } } - } } \ No newline at end of file diff --git a/src/Umbraco.Web/Editors/BackOfficeController.cs b/src/Umbraco.Web/Editors/BackOfficeController.cs index a72b9ac85e..f8419fef1e 100644 --- a/src/Umbraco.Web/Editors/BackOfficeController.cs +++ b/src/Umbraco.Web/Editors/BackOfficeController.cs @@ -707,8 +707,9 @@ namespace Umbraco.Web.Editors var version = UmbracoVersion.GetSemanticVersion().ToSemanticString(); + app.Add("cacheBuster", string.Format("{0}.{1}", version, ClientDependencySettings.Instance.Version).GenerateHash()); app.Add("version", version); - app.Add("cdf", ClientDependencySettings.Instance.Version); + //useful for dealing with virtual paths on the client side when hosted in virtual directories especially app.Add("applicationPath", HttpContext.Request.ApplicationPath.EnsureEndsWith('/')); @@ -717,11 +718,19 @@ namespace Umbraco.Web.Editors return app; } - + + /// + /// A lazy reference to all tree controller types + /// + /// + /// We are doing this because if we constantly resolve the tree controller types from the PluginManager it will re-scan and also re-log that + /// it's resolving which is unecessary and annoying. + /// + private static readonly Lazy> TreeControllerTypes = new Lazy>(() => PluginManager.Current.ResolveAttributedTreeControllers().ToArray()); private IEnumerable> GetTreePluginsMetaData() { - var treeTypes = PluginManager.Current.ResolveAttributedTreeControllers(); + var treeTypes = TreeControllerTypes.Value; //get all plugin trees with their attributes var treesWithAttributes = treeTypes.Select(x => new { diff --git a/src/Umbraco.Web/Editors/GravatarController.cs b/src/Umbraco.Web/Editors/GravatarController.cs index f1e184dce7..23c4a731c2 100644 --- a/src/Umbraco.Web/Editors/GravatarController.cs +++ b/src/Umbraco.Web/Editors/GravatarController.cs @@ -1,5 +1,6 @@ using System; using System.Net; +using System.Security.Cryptography; using Umbraco.Core; using Umbraco.Web.Mvc; @@ -13,6 +14,14 @@ namespace Umbraco.Web.Editors { public string GetCurrentUserGravatarUrl() { + // If FIPS is required, never check the Gravatar service as it only supports MD5 hashing. + // Unfortunately, if the FIPS setting is enabled on Windows, using MD5 will throw an exception + // and the website will not run. + if (CryptoConfig.AllowOnlyFipsAlgorithms) + { + return null; + } + var userService = Services.UserService; var user = userService.GetUserById(UmbracoContext.Security.CurrentUser.Id); var gravatarHash = user.Email.ToMd5(); diff --git a/src/Umbraco.Web/Editors/PackageInstallController.cs b/src/Umbraco.Web/Editors/PackageInstallController.cs index d3771ce82c..6b5f460171 100644 --- a/src/Umbraco.Web/Editors/PackageInstallController.cs +++ b/src/Umbraco.Web/Editors/PackageInstallController.cs @@ -543,6 +543,26 @@ namespace Umbraco.Web.Editors var ins = new global::umbraco.cms.businesslogic.packager.Installer(Security.CurrentUser.Id); ins.LoadConfig(IOHelper.MapPath(model.TemporaryDirectoryPath)); ins.InstallFiles(model.Id, IOHelper.MapPath(model.TemporaryDirectoryPath)); + + //set a restarting marker and reset the app pool + ApplicationContext.RestartApplicationPool(Request.TryGetHttpContext().Result); + + model.IsRestarting = true; + + return model; + } + + [HttpPost] + public PackageInstallModel CheckRestart(PackageInstallModel model) + { + if (model.IsRestarting == false) return model; + + //check for the key, if it's not there we're are restarted + if (Request.TryGetHttpContext().Result.Application.AllKeys.Contains("AppPoolRestarting") == false) + { + //reset it + model.IsRestarting = false; + } return model; } diff --git a/src/Umbraco.Web/HealthCheck/Checks/Config/AbstractConfigCheck.cs b/src/Umbraco.Web/HealthCheck/Checks/Config/AbstractConfigCheck.cs index 001bd4e3e8..2cec88d616 100644 --- a/src/Umbraco.Web/HealthCheck/Checks/Config/AbstractConfigCheck.cs +++ b/src/Umbraco.Web/HealthCheck/Checks/Config/AbstractConfigCheck.cs @@ -43,6 +43,14 @@ namespace Umbraco.Web.HealthCheck.Checks.Config /// public abstract ValueComparisonType ValueComparisonType { get; } + /// + /// Gets the flag indicating if the check is considered successful if the config value is missing (defaults to false - an error - if missing) + /// + public virtual bool ValidIfConfigMissing + { + get { return false; } + } + protected AbstractConfigCheck(HealthCheckContext healthCheckContext) : base(healthCheckContext) { _textService = healthCheckContext.ApplicationContext.Services.TextService; @@ -132,11 +140,18 @@ namespace Umbraco.Web.HealthCheck.Checks.Config public override IEnumerable GetStatus() { + var successMessage = string.Format(CheckSuccessMessage, FileName, XPath, Values, CurrentValue); + var configValue = _configurationService.GetConfigurationValue(); if (configValue.Success == false) { - var message = configValue.Result; - return new[] { new HealthCheckStatus(message) { ResultType = StatusResultType.Error } }; + if (ValidIfConfigMissing) + { + return new[] { new HealthCheckStatus(successMessage) { ResultType = StatusResultType.Success } }; + } + + var errorMessage = configValue.Result; + return new[] { new HealthCheckStatus(errorMessage) { ResultType = StatusResultType.Error } }; } CurrentValue = configValue.Result; @@ -144,8 +159,7 @@ namespace Umbraco.Web.HealthCheck.Checks.Config var valueFound = Values.Any(value => string.Equals(CurrentValue, value.Value, StringComparison.InvariantCultureIgnoreCase)); if (ValueComparisonType == ValueComparisonType.ShouldEqual && valueFound || ValueComparisonType == ValueComparisonType.ShouldNotEqual && valueFound == false) { - var message = string.Format(CheckSuccessMessage, FileName, XPath, Values, CurrentValue); - return new[] { new HealthCheckStatus(message) { ResultType = StatusResultType.Success } }; + return new[] { new HealthCheckStatus(successMessage) { ResultType = StatusResultType.Success } }; } // Declare the action for rectifying the config value diff --git a/src/Umbraco.Web/HealthCheck/Checks/Config/CompilationDebugCheck.cs b/src/Umbraco.Web/HealthCheck/Checks/Config/CompilationDebugCheck.cs index 989046b464..6612b77b26 100644 --- a/src/Umbraco.Web/HealthCheck/Checks/Config/CompilationDebugCheck.cs +++ b/src/Umbraco.Web/HealthCheck/Checks/Config/CompilationDebugCheck.cs @@ -30,6 +30,11 @@ namespace Umbraco.Web.HealthCheck.Checks.Config get { return ValueComparisonType.ShouldEqual; } } + public override bool ValidIfConfigMissing + { + get { return true; } + } + public override IEnumerable Values { get diff --git a/src/Umbraco.Web/HtmlHelperBackOfficeExtensions.cs b/src/Umbraco.Web/HtmlHelperBackOfficeExtensions.cs index 1de50f5b71..dc05b3ffa5 100644 --- a/src/Umbraco.Web/HtmlHelperBackOfficeExtensions.cs +++ b/src/Umbraco.Web/HtmlHelperBackOfficeExtensions.cs @@ -52,8 +52,7 @@ namespace Umbraco.Web }, ""application"": { ""applicationPath"": """ + html.ViewContext.HttpContext.Request.ApplicationPath + @""", - ""version"": """ + version + @""", - ""cdf"": """ + ClientDependencySettings.Instance.Version + @""" + ""cacheBuster"": """ + string.Format("{0}.{1}", version, ClientDependencySettings.Instance.Version).GenerateHash() + @""" }, ""isDebuggingEnabled"" : " + html.ViewContext.HttpContext.IsDebuggingEnabled.ToString().ToLowerInvariant() + @" }; diff --git a/src/Umbraco.Web/Install/InstallHelper.cs b/src/Umbraco.Web/Install/InstallHelper.cs index 8bc21a2334..6c088365a1 100644 --- a/src/Umbraco.Web/Install/InstallHelper.cs +++ b/src/Umbraco.Web/Install/InstallHelper.cs @@ -50,7 +50,7 @@ namespace Umbraco.Web.Install new DatabaseConfigureStep(_umbContext.Application), new DatabaseInstallStep(_umbContext.Application), new DatabaseUpgradeStep(_umbContext.Application), - new StarterKitDownloadStep(_umbContext.Application, _umbContext.Security), + new StarterKitDownloadStep(_umbContext.Application, _umbContext.Security, _umbContext.HttpContext), new StarterKitInstallStep(_umbContext.Application, _umbContext.HttpContext), new StarterKitCleanupStep(_umbContext.Application), new SetUmbracoVersionStep(_umbContext.Application, _umbContext.HttpContext), diff --git a/src/Umbraco.Web/Install/InstallSteps/StarterKitDownloadStep.cs b/src/Umbraco.Web/Install/InstallSteps/StarterKitDownloadStep.cs index a8f55d3b2c..fd0c15bd61 100644 --- a/src/Umbraco.Web/Install/InstallSteps/StarterKitDownloadStep.cs +++ b/src/Umbraco.Web/Install/InstallSteps/StarterKitDownloadStep.cs @@ -11,16 +11,19 @@ using Umbraco.Web.Security; namespace Umbraco.Web.Install.InstallSteps { [InstallSetupStep(InstallationType.NewInstall, - "StarterKitDownload", "starterKit", 30, "Adding a simple website to Umbraco, will make it easier for you to get started")] + "StarterKitDownload", "starterKit", 30, "Adding a simple website to Umbraco, will make it easier for you to get started", + PerformsAppRestart = true)] internal class StarterKitDownloadStep : InstallSetupStep { private readonly ApplicationContext _applicationContext; private readonly WebSecurity _security; + private readonly HttpContextBase _httpContext; - public StarterKitDownloadStep(ApplicationContext applicationContext, WebSecurity security) + public StarterKitDownloadStep(ApplicationContext applicationContext, WebSecurity security, HttpContextBase httpContext) { _applicationContext = applicationContext; _security = security; + _httpContext = httpContext; } private const string RepoGuid = "65194810-1f85-11dd-bd0b-0800200c9a66"; @@ -46,6 +49,8 @@ namespace Umbraco.Web.Install.InstallSteps var result = DownloadPackageFiles(starterKitId.Value); + _applicationContext.RestartApplicationPool(_httpContext); + return new InstallSetupResult(new Dictionary { {"manifestId", result.Item2}, diff --git a/src/Umbraco.Web/Models/ContentEditing/TemplateDisplay.cs b/src/Umbraco.Web/Models/ContentEditing/TemplateDisplay.cs index 91c1aefdb0..ffa4e4e100 100644 --- a/src/Umbraco.Web/Models/ContentEditing/TemplateDisplay.cs +++ b/src/Umbraco.Web/Models/ContentEditing/TemplateDisplay.cs @@ -1,11 +1,7 @@ using System; using System.Collections.Generic; using System.ComponentModel.DataAnnotations; -using System.Linq; using System.Runtime.Serialization; -using System.Text; -using System.Threading.Tasks; -using Umbraco.Core.Models.Validation; namespace Umbraco.Web.Models.ContentEditing { @@ -24,6 +20,9 @@ namespace Umbraco.Web.Models.ContentEditing [DataMember(Name = "alias")] public string Alias { get; set; } + [DataMember(Name = "key")] + public Guid Key { get; set; } + [DataMember(Name = "content")] public string Content { get; set; } diff --git a/src/Umbraco.Web/Models/ImageCropDataSet.cs b/src/Umbraco.Web/Models/ImageCropDataSet.cs index 4c5a68a6b9..00f46dd2d7 100644 --- a/src/Umbraco.Web/Models/ImageCropDataSet.cs +++ b/src/Umbraco.Web/Models/ImageCropDataSet.cs @@ -76,7 +76,7 @@ namespace Umbraco.Web.Models public bool HasImage() { - return string.IsNullOrEmpty(Src); + return ! string.IsNullOrEmpty(Src); } public string ToHtmlString() diff --git a/src/Umbraco.Web/Models/Mapping/ContentModelMapper.cs b/src/Umbraco.Web/Models/Mapping/ContentModelMapper.cs index 37b002d297..a33921b7b9 100644 --- a/src/Umbraco.Web/Models/Mapping/ContentModelMapper.cs +++ b/src/Umbraco.Web/Models/Mapping/ContentModelMapper.cs @@ -108,7 +108,7 @@ namespace Umbraco.Web.Models.Mapping } //fill in the template config to be passed to the template drop down. - var templateItemConfig = new Dictionary {{"", "Choose..."}}; + var templateItemConfig = new Dictionary {{"", localizedText.Localize("general/choose")}}; foreach (var t in content.ContentType.AllowedTemplates .Where(t => t.Alias.IsNullOrWhiteSpace() == false && t.Name.IsNullOrWhiteSpace() == false)) { diff --git a/src/Umbraco.Web/Models/Mapping/TemplateModelMapper.cs b/src/Umbraco.Web/Models/Mapping/TemplateModelMapper.cs index 19677fccc8..6111941084 100644 --- a/src/Umbraco.Web/Models/Mapping/TemplateModelMapper.cs +++ b/src/Umbraco.Web/Models/Mapping/TemplateModelMapper.cs @@ -15,7 +15,6 @@ namespace Umbraco.Web.Models.Mapping config.CreateMap() .ForMember(x => x.DeletedDate, exp => exp.Ignore()) - .ForMember(x => x.Key, exp => exp.Ignore()) .ForMember(x => x.Path, exp => exp.Ignore()) .ForMember(x => x.CreateDate, exp => exp.Ignore()) .ForMember(x => x.UpdateDate, exp => exp.Ignore()) diff --git a/src/Umbraco.Web/Models/Mapping/UserModelMapper.cs b/src/Umbraco.Web/Models/Mapping/UserModelMapper.cs index 72093b19a8..eedc2cafca 100644 --- a/src/Umbraco.Web/Models/Mapping/UserModelMapper.cs +++ b/src/Umbraco.Web/Models/Mapping/UserModelMapper.cs @@ -23,7 +23,7 @@ namespace Umbraco.Web.Models.Mapping .ForMember(detail => detail.Culture, opt => opt.MapFrom(user => user.GetUserCulture(applicationContext.Services.TextService))) .ForMember( detail => detail.EmailHash, - opt => opt.MapFrom(user => user.Email.ToLowerInvariant().Trim().ToMd5())) + opt => opt.MapFrom(user => user.Email.ToLowerInvariant().Trim().GenerateHash())) .ForMember(detail => detail.SecondsUntilTimeout, opt => opt.Ignore()); config.CreateMap() @@ -35,7 +35,7 @@ namespace Umbraco.Web.Models.Mapping .ForMember(detail => detail.AllowedSections, opt => opt.MapFrom(user => user.AllowedSections)) .ForMember( detail => detail.EmailHash, - opt => opt.MapFrom(user => user.Email.ToLowerInvariant().Trim().ToMd5())) + opt => opt.MapFrom(user => user.Email.ToLowerInvariant().Trim().GenerateHash())) .ForMember(detail => detail.SecondsUntilTimeout, opt => opt.Ignore()); config.CreateMap() diff --git a/src/Umbraco.Web/Models/PackageInstallModel.cs b/src/Umbraco.Web/Models/PackageInstallModel.cs index f903fc1880..7748129a40 100644 --- a/src/Umbraco.Web/Models/PackageInstallModel.cs +++ b/src/Umbraco.Web/Models/PackageInstallModel.cs @@ -24,6 +24,10 @@ namespace Umbraco.Web.Models [DataMember(Name = "zipFilePath")] public string ZipFilePath { get; set; } - + /// + /// During installation this can be used to track any pending appdomain restarts + /// + [DataMember(Name = "isRestarting")] + public bool IsRestarting { get; set; } } } diff --git a/src/Umbraco.Web/Properties/AssemblyInfo.cs b/src/Umbraco.Web/Properties/AssemblyInfo.cs index c9e792fcc6..c016d328a9 100644 --- a/src/Umbraco.Web/Properties/AssemblyInfo.cs +++ b/src/Umbraco.Web/Properties/AssemblyInfo.cs @@ -38,7 +38,6 @@ using System.Security; [assembly: InternalsVisibleTo("Umbraco.Deploy")] [assembly: InternalsVisibleTo("Umbraco.Deploy.UI")] [assembly: InternalsVisibleTo("Umbraco.Deploy.Cloud")] -[assembly: InternalsVisibleTo("Umbraco.VisualStudio")] [assembly: InternalsVisibleTo("Umbraco.ModelsBuilder")] [assembly: InternalsVisibleTo("Umbraco.ModelsBuilder.AspNet")] [assembly: InternalsVisibleTo("DynamicProxyGenAssembly2")] @@ -47,3 +46,7 @@ using System.Security; [assembly: InternalsVisibleTo("Umbraco.Forms.Core.Providers")] [assembly: InternalsVisibleTo("Umbraco.Forms.Web")] + +//allow custom unit-testing code to access internals through custom adapters +[assembly: InternalsVisibleTo("Umbraco.VisualStudio")] // backwards compat. +[assembly: InternalsVisibleTo("Umbraco.UnitTesting.Adapter")] // new, more imperative name diff --git a/src/Umbraco.Web/PropertyEditors/ListViewPropertyEditor.cs b/src/Umbraco.Web/PropertyEditors/ListViewPropertyEditor.cs index f744e4d807..70bdbbb2a3 100644 --- a/src/Umbraco.Web/PropertyEditors/ListViewPropertyEditor.cs +++ b/src/Umbraco.Web/PropertyEditors/ListViewPropertyEditor.cs @@ -42,7 +42,7 @@ namespace Umbraco.Web.PropertyEditors allowBulkPublish = true, allowBulkUnpublish = true, allowBulkCopy = true, - allowBulkMove = true, + allowBulkMove = false, allowBulkDelete = true }} }; diff --git a/src/Umbraco.Web/Security/Identity/ExternalSignInAutoLinkOptions.cs b/src/Umbraco.Web/Security/Identity/ExternalSignInAutoLinkOptions.cs index 832f0b3a30..3f8a1480a4 100644 --- a/src/Umbraco.Web/Security/Identity/ExternalSignInAutoLinkOptions.cs +++ b/src/Umbraco.Web/Security/Identity/ExternalSignInAutoLinkOptions.cs @@ -10,7 +10,7 @@ namespace Umbraco.Web.Security.Identity /// /// Options used to configure auto-linking external OAuth providers /// - public sealed class ExternalSignInAutoLinkOptions + public class ExternalSignInAutoLinkOptions { public ExternalSignInAutoLinkOptions( bool autoLinkExternalAccount = false, diff --git a/src/Umbraco.Web/Security/Providers/UmbracoMembershipProvider.cs b/src/Umbraco.Web/Security/Providers/UmbracoMembershipProvider.cs index 8482eb72a2..71e2b1d0f3 100644 --- a/src/Umbraco.Web/Security/Providers/UmbracoMembershipProvider.cs +++ b/src/Umbraco.Web/Security/Providers/UmbracoMembershipProvider.cs @@ -166,11 +166,11 @@ namespace Umbraco.Web.Security.Providers username, email, FormatPasswordForStorage(encodedPassword, salt), - memberTypeAlias); + memberTypeAlias, + isApproved); member.PasswordQuestion = passwordQuestion; member.RawPasswordAnswerValue = EncryptString(passwordAnswer); - member.IsApproved = isApproved; member.LastLoginDate = DateTime.Now; member.LastPasswordChangeDate = DateTime.Now; diff --git a/src/Umbraco.Web/Trees/PartialViewMacrosTreeController.cs b/src/Umbraco.Web/Trees/PartialViewMacrosTreeController.cs index 9b2bf0eb0d..34fc18b582 100644 --- a/src/Umbraco.Web/Trees/PartialViewMacrosTreeController.cs +++ b/src/Umbraco.Web/Trees/PartialViewMacrosTreeController.cs @@ -7,7 +7,7 @@ namespace Umbraco.Web.Trees /// /// Tree for displaying partial view macros in the developer app /// - [Tree(Constants.Applications.Developer, "partialViewMacros", "Partial View Macro Files", sortOrder: 6)] + [Tree(Constants.Applications.Developer, "partialViewMacros", null, sortOrder: 6)] public class PartialViewMacrosTreeController : FileSystemTreeController2 { protected override IFileSystem2 FileSystem diff --git a/src/Umbraco.Web/Trees/PartialViewsTreeController.cs b/src/Umbraco.Web/Trees/PartialViewsTreeController.cs index 971ff4026b..81bef4b13e 100644 --- a/src/Umbraco.Web/Trees/PartialViewsTreeController.cs +++ b/src/Umbraco.Web/Trees/PartialViewsTreeController.cs @@ -7,7 +7,7 @@ namespace Umbraco.Web.Trees /// /// Tree for displaying partial views in the settings app /// - [Tree(Constants.Applications.Settings, "partialViews", "Partial Views", sortOrder: 2)] + [Tree(Constants.Applications.Settings, "partialViews", null, sortOrder: 2)] public class PartialViewsTreeController : FileSystemTreeController2 { protected override IFileSystem2 FileSystem diff --git a/src/Umbraco.Web/Trees/ScriptTreeController.cs b/src/Umbraco.Web/Trees/ScriptTreeController.cs index dcfa195131..cb9954019b 100644 --- a/src/Umbraco.Web/Trees/ScriptTreeController.cs +++ b/src/Umbraco.Web/Trees/ScriptTreeController.cs @@ -4,7 +4,7 @@ using Umbraco.Web.Models.Trees; namespace Umbraco.Web.Trees { - [Tree(Constants.Applications.Settings, "scripts", "Scripts", sortOrder: 4)] + [Tree(Constants.Applications.Settings, "scripts", null, sortOrder: 4)] public class ScriptTreeController : FileSystemTreeController2 { protected override IFileSystem2 FileSystem diff --git a/src/Umbraco.Web/Umbraco.Web.csproj b/src/Umbraco.Web/Umbraco.Web.csproj index 59ad401f5c..44b3258c84 100644 --- a/src/Umbraco.Web/Umbraco.Web.csproj +++ b/src/Umbraco.Web/Umbraco.Web.csproj @@ -116,8 +116,8 @@ ..\packages\dotless.1.5.2\lib\dotless.Core.dll - - ..\packages\Examine.0.1.82\lib\net45\Examine.dll + + ..\packages\Examine.0.1.83\lib\net45\Examine.dll True diff --git a/src/Umbraco.Web/UmbracoApplication.cs b/src/Umbraco.Web/UmbracoApplication.cs index 0f6fc03b80..b9650a8230 100644 --- a/src/Umbraco.Web/UmbracoApplication.cs +++ b/src/Umbraco.Web/UmbracoApplication.cs @@ -34,9 +34,9 @@ namespace Umbraco.Web var appPluginFolder = IOHelper.MapPath("~/App_Plugins/"); if (Directory.Exists(appPluginFolder)) { - _mw = new ManifestWatcher(LoggerResolver.Current.Logger); - _mw.Start(Directory.GetDirectories(IOHelper.MapPath("~/App_Plugins/"))); - } + _mw = new ManifestWatcher(LoggerResolver.Current.Logger); + _mw.Start(Directory.GetDirectories(appPluginFolder)); + } } } diff --git a/src/Umbraco.Web/UmbracoHelper.cs b/src/Umbraco.Web/UmbracoHelper.cs index fec4e144fb..6f3da17254 100644 --- a/src/Umbraco.Web/UmbracoHelper.cs +++ b/src/Umbraco.Web/UmbracoHelper.cs @@ -1317,20 +1317,33 @@ namespace Umbraco.Web return _stringUtilities.ReplaceLineBreaksForHtml(text); } - /// - /// Returns an MD5 hash of the string specified - /// - /// The text to create a hash from - /// Md5 has of the string - public string CreateMd5Hash(string text) - { - return text.ToMd5(); - } + /// + /// Returns an MD5 hash of the string specified + /// + /// The text to create a hash from + /// Md5 hash of the string + [Obsolete("Please use the CreateHash method instead. This may be removed in future versions")] + [EditorBrowsable(EditorBrowsableState.Never)] + public string CreateMd5Hash(string text) + { + return text.ToMd5(); + } - /// - /// Strips all html tags from a given string, all contents of the tags will remain. - /// - public HtmlString StripHtml(IHtmlString html, params string[] tags) + /// + /// Generates a hash based on the text string passed in. This method will detect the + /// security requirements (is FIPS enabled) and return an appropriate hash. + /// + /// The text to create a hash from + /// Hash of the text string + public string CreateHash(string text) + { + return text.GenerateHash(); + } + + /// + /// Strips all html tags from a given string, all contents of the tags will remain. + /// + public HtmlString StripHtml(IHtmlString html, params string[] tags) { return StripHtml(html.ToHtmlString(), tags); } diff --git a/src/Umbraco.Web/UrlHelperExtensions.cs b/src/Umbraco.Web/UrlHelperExtensions.cs index 1893a36c89..9b017e1bd4 100644 --- a/src/Umbraco.Web/UrlHelperExtensions.cs +++ b/src/Umbraco.Web/UrlHelperExtensions.cs @@ -176,22 +176,14 @@ namespace Umbraco.Web //make a hash of umbraco and client dependency version //in case the user bypasses the installer and just bumps the web.config or clientdep config - var versionHash = new HashCodeCombiner(); - //if in debug mode, always burst the cache if (GlobalSettings.DebugMode) { - versionHash.AddCaseInsensitiveString(DateTime.Now.Ticks.ToString(CultureInfo.InvariantCulture)); - } - else - { - //create a unique hash code of the current umb version and the current cdf version - - versionHash.AddCaseInsensitiveString(UmbracoVersion.Current.ToString()); - versionHash.AddCaseInsensitiveString(ClientDependencySettings.Instance.Version.ToString(CultureInfo.InvariantCulture)); - } + return DateTime.Now.Ticks.ToString(CultureInfo.InvariantCulture).GenerateHash(); + } - return versionHash.GetCombinedHashCode(); + var version = UmbracoVersion.GetSemanticVersion().ToSemanticString(); + return string.Format("{0}.{1}", version, ClientDependencySettings.Instance.Version).GenerateHash(); } } } \ No newline at end of file diff --git a/src/Umbraco.Web/UrlHelperRenderExtensions.cs b/src/Umbraco.Web/UrlHelperRenderExtensions.cs index 614c815f79..a451503803 100644 --- a/src/Umbraco.Web/UrlHelperRenderExtensions.cs +++ b/src/Umbraco.Web/UrlHelperRenderExtensions.cs @@ -343,5 +343,24 @@ namespace Umbraco.Web { return url.SurfaceAction(action, typeof (T), additionalRouteVals); } + + /// + /// Generates a Absolute Media Item URL based on the current context + /// + /// + /// + /// + public static string GetAbsoluteMediaUrl(this UrlHelper urlHelper, IPublishedContent mediaItem) + { + if (urlHelper == null) throw new ArgumentNullException("urlHelper"); + if (mediaItem == null) throw new ArgumentNullException("mediaItem"); + + if (urlHelper.RequestContext.HttpContext.Request.Url != null) + { + var requestUrl = urlHelper.RequestContext.HttpContext.Request.Url.GetLeftPart(UriPartial.Authority); + return string.Format("{0}{1}", requestUrl, mediaItem.Url); + } + return null; + } } } \ No newline at end of file diff --git a/src/Umbraco.Web/WebBootManager.cs b/src/Umbraco.Web/WebBootManager.cs index 29565065e2..43d130529b 100644 --- a/src/Umbraco.Web/WebBootManager.cs +++ b/src/Umbraco.Web/WebBootManager.cs @@ -227,10 +227,12 @@ namespace Umbraco.Web //Now ensure webapi is initialized after everything GlobalConfiguration.Configuration.EnsureInitialized(); - + return this; } + + internal static void ConfigureGlobalFilters() { GlobalFilters.Filters.Add(new EnsurePartialViewMacroViewContextFilterAttribute()); diff --git a/src/Umbraco.Web/packages.config b/src/Umbraco.Web/packages.config index b7625770a3..daef6ee7fd 100644 --- a/src/Umbraco.Web/packages.config +++ b/src/Umbraco.Web/packages.config @@ -3,7 +3,7 @@ - + diff --git a/src/Umbraco.Web/umbraco.presentation/library.cs b/src/Umbraco.Web/umbraco.presentation/library.cs index 8bd94aa5b6..38b8b1b95d 100644 --- a/src/Umbraco.Web/umbraco.presentation/library.cs +++ b/src/Umbraco.Web/umbraco.presentation/library.cs @@ -1,4 +1,5 @@ using System; +using System.ComponentModel; using System.Globalization; using System.IO; using System.Linq; @@ -660,10 +661,23 @@ namespace umbraco /// Returns an MD5 hash of the string specified /// /// The text to create a hash from - /// Md5 has of the string + /// Md5 hash of the string + [Obsolete("Please use the CreateHash method instead. This may be removed in future versions")] + [EditorBrowsable(EditorBrowsableState.Never)] public static string md5(string text) { - return text.ToMd5(); + return text.ToMd5(); + } + + /// + /// Generates a hash based on the text string passed in. This method will detect the + /// security requirements (is FIPS enabled) and return an appropriate hash. + /// + /// The text to create a hash from + /// hash of the string + public static string CreateHash(string text) + { + return text.GenerateHash(); } /// diff --git a/src/Umbraco.Web/umbraco.presentation/macro.cs b/src/Umbraco.Web/umbraco.presentation/macro.cs index 6d2936cd9a..dac3c0e1bf 100644 --- a/src/Umbraco.Web/umbraco.presentation/macro.cs +++ b/src/Umbraco.Web/umbraco.presentation/macro.cs @@ -46,6 +46,7 @@ using System.Linq; using File = System.IO.File; using MacroTypes = umbraco.cms.businesslogic.macro.MacroTypes; using Member = umbraco.cms.businesslogic.member.Member; +using UserControl = System.Web.UI.UserControl; namespace umbraco { diff --git a/src/Umbraco.Web/umbraco.presentation/umbraco/developer/Macros/assemblyBrowser.aspx.cs b/src/Umbraco.Web/umbraco.presentation/umbraco/developer/Macros/assemblyBrowser.aspx.cs index d186d9ef50..273318cbff 100644 --- a/src/Umbraco.Web/umbraco.presentation/umbraco/developer/Macros/assemblyBrowser.aspx.cs +++ b/src/Umbraco.Web/umbraco.presentation/umbraco/developer/Macros/assemblyBrowser.aspx.cs @@ -19,6 +19,7 @@ using Umbraco.Core.PropertyEditors; using umbraco.BusinessLogic; using System.Collections.Generic; using MacroProperty = umbraco.cms.businesslogic.macro.MacroProperty; +using UserControl = System.Web.UI.UserControl; namespace umbraco.developer { diff --git a/src/Umbraco.Web/umbraco.presentation/umbraco/developer/Macros/editMacro.aspx.cs b/src/Umbraco.Web/umbraco.presentation/umbraco/developer/Macros/editMacro.aspx.cs index b40515578b..73800ca117 100644 --- a/src/Umbraco.Web/umbraco.presentation/umbraco/developer/Macros/editMacro.aspx.cs +++ b/src/Umbraco.Web/umbraco.presentation/umbraco/developer/Macros/editMacro.aspx.cs @@ -88,6 +88,7 @@ namespace umbraco.cms.presentation.developer { macroName.Text = macro.Name; macroAlias.Text = macro.Alias; + macroKey.Text = macro.Key.ToString(); macroXslt.Text = macro.XsltPath; macroPython.Text = macro.ScriptPath; cachePeriod.Text = macro.CacheDuration.ToInvariantString(); @@ -209,7 +210,7 @@ namespace umbraco.cms.presentation.developer } protected IEnumerable GetMacroParameterEditors() - { + { // we need to show the depracated ones for backwards compatibility return ParameterEditorResolver.Current.GetParameterEditors(true); } @@ -433,14 +434,23 @@ namespace umbraco.cms.presentation.developer /// protected global::System.Web.UI.WebControls.TextBox macroAlias; - /// - /// Pane1_2 control. - /// - /// - /// Auto-generated field. - /// To modify move field declaration from designer file to code-behind file. - /// - protected global::umbraco.uicontrols.Pane Pane1_2; + /// + /// macroAlias control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.Label macroKey; + + /// + /// Pane1_2 control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::umbraco.uicontrols.Pane Pane1_2; /// /// macroXslt control. diff --git a/src/Umbraco.Web/umbraco.presentation/umbraco/developer/Packages/installer.aspx.cs b/src/Umbraco.Web/umbraco.presentation/umbraco/developer/Packages/installer.aspx.cs index bdcbfaa775..a9bf7b5e43 100644 --- a/src/Umbraco.Web/umbraco.presentation/umbraco/developer/Packages/installer.aspx.cs +++ b/src/Umbraco.Web/umbraco.presentation/umbraco/developer/Packages/installer.aspx.cs @@ -134,7 +134,7 @@ namespace umbraco.presentation.developer.packages protected void fetchProtectedPackage(object sender, EventArgs e) { //we auth against the webservice. This key will be used to fetch the protected package. - string memberGuid = _repo.Webservice.authenticate(tb_email.Text, library.md5(tb_password.Text)); + string memberGuid = _repo.Webservice.authenticate(tb_email.Text, library.CreateHash(tb_password.Text)); //if we auth correctly and get a valid key back, we will fetch the file from the repo webservice. if (string.IsNullOrEmpty(memberGuid) == false) diff --git a/src/Umbraco.Web/umbraco.presentation/umbraco/plugins/tinymce3/GzipCompressor.cs b/src/Umbraco.Web/umbraco.presentation/umbraco/plugins/tinymce3/GzipCompressor.cs index d03dca1d6d..c9df806242 100644 --- a/src/Umbraco.Web/umbraco.presentation/umbraco/plugins/tinymce3/GzipCompressor.cs +++ b/src/Umbraco.Web/umbraco.presentation/umbraco/plugins/tinymce3/GzipCompressor.cs @@ -12,6 +12,7 @@ using System.IO; using System.IO.Compression; using System.Security.Cryptography; using System.Text; +using Umbraco.Core; namespace umbraco.presentation.plugins.tinymce3 { @@ -91,7 +92,7 @@ namespace umbraco.presentation.plugins.tinymce3 key += item.Data; } - key = MD5(key); + key = Hash(key); if (this.NoCompression) { this.SendPlainText(key, to_stream); return; @@ -224,12 +225,10 @@ namespace umbraco.presentation.plugins.tinymce3 } } - private string MD5(string str) { - MD5 md5 = new MD5CryptoServiceProvider(); - byte[] result = md5.ComputeHash(Encoding.ASCII.GetBytes(str)); - str = BitConverter.ToString(result); + private string Hash(string str) + { + return str.GenerateHash(); - return str.Replace("-", ""); } #endregion diff --git a/src/UmbracoExamine/LocalStorage/AzureLocalStorageDirectory.cs b/src/UmbracoExamine/LocalStorage/AzureLocalStorageDirectory.cs index 56d1b414c5..72a894f32f 100644 --- a/src/UmbracoExamine/LocalStorage/AzureLocalStorageDirectory.cs +++ b/src/UmbracoExamine/LocalStorage/AzureLocalStorageDirectory.cs @@ -16,7 +16,7 @@ namespace UmbracoExamine.LocalStorage { public DirectoryInfo GetLocalStorageDirectory(NameValueCollection config, string configuredPath) { - var appDomainHash = HttpRuntime.AppDomainAppId.ToMd5(); + var appDomainHash = HttpRuntime.AppDomainAppId.GenerateHash(); var cachePath = Path.Combine(Environment.ExpandEnvironmentVariables("%temp%"), "LuceneDir", //include the appdomain hash is just a safety check, for example if a website is moved from worker A to worker B and then back // to worker A again, in theory the %temp% folder should already be empty but we really want to make sure that its not diff --git a/src/UmbracoExamine/UmbracoExamine.csproj b/src/UmbracoExamine/UmbracoExamine.csproj index 19abcf9313..9a3299fb7e 100644 --- a/src/UmbracoExamine/UmbracoExamine.csproj +++ b/src/UmbracoExamine/UmbracoExamine.csproj @@ -82,8 +82,8 @@ ..\Solution Items\TheFARM-Public.snk - - ..\packages\Examine.0.1.82\lib\net45\Examine.dll + + ..\packages\Examine.0.1.83\lib\net45\Examine.dll True diff --git a/src/UmbracoExamine/packages.config b/src/UmbracoExamine/packages.config index 17c77f7284..10206f1d14 100644 --- a/src/UmbracoExamine/packages.config +++ b/src/UmbracoExamine/packages.config @@ -1,6 +1,6 @@  - + \ No newline at end of file diff --git a/src/umbraco.MacroEngines/RazorCore/RazorMacroEngine.cs b/src/umbraco.MacroEngines/RazorCore/RazorMacroEngine.cs index e3c7a22bd0..f3f488ac1b 100644 --- a/src/umbraco.MacroEngines/RazorCore/RazorMacroEngine.cs +++ b/src/umbraco.MacroEngines/RazorCore/RazorMacroEngine.cs @@ -1,5 +1,6 @@ using System; using System.Collections.Generic; +using System.ComponentModel; using System.IO; using System.Text; using System.Threading; @@ -26,8 +27,21 @@ namespace umbraco.MacroEngines return "~/" + physicalPath; } - public string GetMd5(string text) { - return text.ToMd5(); + [Obsolete("Please use the GetHash method instead. This may be removed in future versions")] + [EditorBrowsable(EditorBrowsableState.Never)] + public string GetMd5(string text) + { + return text.ToMd5(); + } + + /// + /// Generates a hash based on the text string passed in. This method will detect the + /// security requirements (is FIPS enabled) and return an appropriate hash. + /// + /// String value to hash + /// The hash of the text string + public string GetHash(string text) { + return text.GenerateHash(); } /// @@ -145,7 +159,7 @@ namespace umbraco.MacroEngines //Get Rid Of Whitespace From Start/End razorSyntax = razorSyntax.Trim(); //Use MD5 as a cache key - var syntaxMd5 = GetMd5(razorSyntax); + var syntaxMd5 = GetHash(razorSyntax); var fileName = "inline-" + syntaxMd5 + "." + scriptLanguage; return CreateTemporaryRazorFile(razorSyntax, fileName, true); } diff --git a/src/umbraco.MacroEngines/packages.config b/src/umbraco.MacroEngines/packages.config index e125024a28..7479987df2 100644 --- a/src/umbraco.MacroEngines/packages.config +++ b/src/umbraco.MacroEngines/packages.config @@ -1,6 +1,6 @@  - + diff --git a/src/umbraco.MacroEngines/umbraco.MacroEngines.csproj b/src/umbraco.MacroEngines/umbraco.MacroEngines.csproj index 33cfdacd2f..07b70e24a4 100644 --- a/src/umbraco.MacroEngines/umbraco.MacroEngines.csproj +++ b/src/umbraco.MacroEngines/umbraco.MacroEngines.csproj @@ -45,8 +45,8 @@ false - - ..\packages\Examine.0.1.82\lib\net45\Examine.dll + + ..\packages\Examine.0.1.83\lib\net45\Examine.dll True diff --git a/src/umbraco.businesslogic/ApplicationBase.cs b/src/umbraco.businesslogic/ApplicationBase.cs index 9678db5fc2..141f3bb87c 100644 --- a/src/umbraco.businesslogic/ApplicationBase.cs +++ b/src/umbraco.businesslogic/ApplicationBase.cs @@ -9,11 +9,11 @@ using umbraco.interfaces; namespace umbraco.BusinessLogic { /// - /// ApplicationBase provides an easy to use base class to install event handlers in umbraco. - /// Class inhiriting from ApplcationBase are automaticly registered and instantiated by umbraco on application start. - /// To use, inhirite the ApplicationBase Class and add an empty constructor. + /// ApplicationBase provides an easy to use base class to install event handlers in Umbraco. + /// Classes inheriting from ApplcationBase are automatically registered and instantiated by Umbraco on application start. + /// To use, inherit the ApplicationBase Class and add an empty constructor. /// - [Obsolete("ApplicationBase has been depricated. Please use ApplicationStartupHandler instead.")] + [Obsolete("ApplicationBase has been deprecated. Please use ApplicationStartupHandler instead.")] public abstract class ApplicationBase : IApplicationStartupHandler { } diff --git a/src/umbraco.businesslogic/Exceptions/FileSecurityException.cs b/src/umbraco.businesslogic/Exceptions/FileSecurityException.cs index 1b9f084003..188e72c97d 100644 --- a/src/umbraco.businesslogic/Exceptions/FileSecurityException.cs +++ b/src/umbraco.businesslogic/Exceptions/FileSecurityException.cs @@ -5,7 +5,7 @@ using System.Text; namespace umbraco.businesslogic.Exceptions { - [Obsolete("This class has been superceded by Umbraco.Core.UI.FileSecurityException")] + [Obsolete("This class has been superceded by Umbraco.Core.IO.FileSecurityException")] public class FileSecurityException : Umbraco.Core.IO.FileSecurityException { public FileSecurityException() diff --git a/src/umbraco.businesslogic/IO/SystemFiles.cs b/src/umbraco.businesslogic/IO/SystemFiles.cs index 3c5841a31b..a97dc74ba1 100644 --- a/src/umbraco.businesslogic/IO/SystemFiles.cs +++ b/src/umbraco.businesslogic/IO/SystemFiles.cs @@ -10,7 +10,7 @@ using System.Web; namespace umbraco.IO { - [Obsolete("Use Umbraco.Core.UI.SystemFiles instead")] + [Obsolete("Use Umbraco.Core.IO.SystemFiles instead")] public class SystemFiles { [Obsolete("This file is no longer used and should not be accessed!")] diff --git a/src/umbraco.editorControls/tinyMCE3/webcontrol/plugin/GzipCompressor.cs b/src/umbraco.editorControls/tinyMCE3/webcontrol/plugin/GzipCompressor.cs index cbd2fc24d8..d84453fa03 100644 --- a/src/umbraco.editorControls/tinyMCE3/webcontrol/plugin/GzipCompressor.cs +++ b/src/umbraco.editorControls/tinyMCE3/webcontrol/plugin/GzipCompressor.cs @@ -12,6 +12,7 @@ using System.IO; using System.IO.Compression; using System.Security.Cryptography; using System.Text; +using Umbraco.Core; namespace umbraco.editorControls.tinyMCE3.webcontrol.plugin { @@ -93,7 +94,7 @@ namespace umbraco.editorControls.tinyMCE3.webcontrol.plugin key += item.Data; } - key = MD5(key); + key = Hash(key); if (this.NoCompression) { this.SendPlainText(key, to_stream); return; @@ -226,12 +227,9 @@ namespace umbraco.editorControls.tinyMCE3.webcontrol.plugin } } - private string MD5(string str) { - MD5 md5 = new MD5CryptoServiceProvider(); - byte[] result = md5.ComputeHash(Encoding.ASCII.GetBytes(str)); - str = BitConverter.ToString(result); - - return str.Replace("-", ""); + private string Hash(string str) + { + return str.GenerateHash(); } #endregion