Merge remote-tracking branch 'refs/remotes/origin/dev-v7' into temp-gulp-spike
# Conflicts: # build/BuildBelle.bat
This commit is contained in:
@@ -11,5 +11,5 @@ using System.Resources;
|
||||
|
||||
[assembly: AssemblyVersion("1.0.*")]
|
||||
|
||||
[assembly: AssemblyFileVersion("7.6.0")]
|
||||
[assembly: AssemblyInformationalVersion("7.6.0")]
|
||||
[assembly: AssemblyFileVersion("7.6.4")]
|
||||
[assembly: AssemblyInformationalVersion("7.6.4")]
|
||||
@@ -23,12 +23,12 @@ namespace Umbraco.Core
|
||||
: base(serviceProvider, logger, packageActions)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Gets the <see cref="IPackageAction"/> implementations.
|
||||
/// </summary>
|
||||
public IEnumerable<IAction> Actions
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Gets the <see cref="IAction"/> implementations.
|
||||
/// </summary>
|
||||
public IEnumerable<IAction> Actions
|
||||
{
|
||||
get
|
||||
{
|
||||
|
||||
@@ -48,7 +48,7 @@ namespace Umbraco.Core
|
||||
/// <param name="cache"></param>
|
||||
[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
|
||||
/// <param name="replaceContext">If set to true and the singleton is already set, it will be replaced</param>
|
||||
/// <returns></returns>
|
||||
/// <remarks>
|
||||
/// This is NOT thread safe
|
||||
/// This is NOT thread safe
|
||||
/// </remarks>
|
||||
public static ApplicationContext EnsureContext(ApplicationContext appContext, bool replaceContext)
|
||||
{
|
||||
@@ -107,14 +107,14 @@ namespace Umbraco.Core
|
||||
/// </summary>
|
||||
/// <param name="cache"></param>
|
||||
/// <param name="replaceContext">
|
||||
/// 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.
|
||||
/// </param>
|
||||
/// <param name="dbContext"></param>
|
||||
/// <param name="serviceContext"></param>
|
||||
/// <returns></returns>
|
||||
/// <remarks>
|
||||
/// This is NOT thread safe
|
||||
/// This is NOT thread safe
|
||||
/// </remarks>
|
||||
[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
|
||||
/// <param name="cache"></param>
|
||||
/// <param name="logger"></param>
|
||||
/// <param name="replaceContext">
|
||||
/// 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.
|
||||
/// </param>
|
||||
/// <param name="dbContext"></param>
|
||||
/// <param name="serviceContext"></param>
|
||||
/// <returns></returns>
|
||||
/// <remarks>
|
||||
/// This is NOT thread safe
|
||||
/// This is NOT thread safe
|
||||
/// </remarks>
|
||||
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; }
|
||||
|
||||
/// <summary>
|
||||
/// 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
|
||||
/// </summary>
|
||||
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<bool> _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<bool>(() =>
|
||||
{
|
||||
@@ -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<ApplicationContext>(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; }
|
||||
}
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// Gets the current ServiceContext
|
||||
/// </summary>
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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__";
|
||||
}
|
||||
}
|
||||
@@ -139,6 +139,12 @@ namespace Umbraco.Core.Configuration.UmbracoSettings
|
||||
internal CommaDelimitedConfigurationElement DisallowedUploadFiles
|
||||
{
|
||||
get { return GetOptionalDelimitedElement("disallowedUploadFiles", new[] {"ashx", "aspx", "ascx", "config", "cshtml", "vbhtml", "asmx", "air", "axd"}); }
|
||||
}
|
||||
|
||||
[ConfigurationProperty("allowedUploadFiles")]
|
||||
internal CommaDelimitedConfigurationElement AllowedUploadFiles
|
||||
{
|
||||
get { return GetOptionalDelimitedElement("allowedUploadFiles", new string[0]); }
|
||||
}
|
||||
|
||||
[ConfigurationProperty("cloneXmlContent")]
|
||||
@@ -307,6 +313,11 @@ namespace Umbraco.Core.Configuration.UmbracoSettings
|
||||
IEnumerable<string> IContentSection.DisallowedUploadFiles
|
||||
{
|
||||
get { return DisallowedUploadFiles; }
|
||||
}
|
||||
|
||||
IEnumerable<string> IContentSection.AllowedUploadFiles
|
||||
{
|
||||
get { return AllowedUploadFiles; }
|
||||
}
|
||||
|
||||
bool IContentSection.CloneXmlContent
|
||||
|
||||
@@ -0,0 +1,19 @@
|
||||
using System.Linq;
|
||||
|
||||
namespace Umbraco.Core.Configuration.UmbracoSettings
|
||||
{
|
||||
public static class ContentSectionExtensions
|
||||
{
|
||||
/// <summary>
|
||||
/// Determines if file extension is allowed for upload based on (optional) white list and black list
|
||||
/// held in settings.
|
||||
/// Allow upload if extension is whitelisted OR if there is no whitelist and extension is NOT blacklisted.
|
||||
/// </summary>
|
||||
public static bool IsFileAllowedForUpload(this IContentSection contentSection, string extension)
|
||||
{
|
||||
return contentSection.AllowedUploadFiles.Any(x => x.InvariantEquals(extension)) ||
|
||||
(contentSection.AllowedUploadFiles.Any() == false &&
|
||||
contentSection.DisallowedUploadFiles.Any(x => x.InvariantEquals(extension)) == false);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -52,7 +52,9 @@ namespace Umbraco.Core.Configuration.UmbracoSettings
|
||||
|
||||
MacroErrorBehaviour MacroErrorBehaviour { get; }
|
||||
|
||||
IEnumerable<string> DisallowedUploadFiles { get; }
|
||||
IEnumerable<string> DisallowedUploadFiles { get; }
|
||||
|
||||
IEnumerable<string> AllowedUploadFiles { get; }
|
||||
|
||||
bool CloneXmlContent { get; }
|
||||
|
||||
|
||||
@@ -12,6 +12,8 @@ namespace Umbraco.Core.Configuration.UmbracoSettings
|
||||
|
||||
bool ConvertUrlsToAscii { get; }
|
||||
|
||||
bool TryConvertUrlsToAscii { get; }
|
||||
|
||||
IEnumerable<IChar> CharCollection { get; }
|
||||
}
|
||||
}
|
||||
@@ -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<IChar> IRequestHandlerSection.CharCollection
|
||||
|
||||
@@ -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")]
|
||||
|
||||
@@ -6,7 +6,7 @@ namespace Umbraco.Core.Configuration
|
||||
{
|
||||
public class UmbracoVersion
|
||||
{
|
||||
private static readonly Version Version = new Version("7.6.0");
|
||||
private static readonly Version Version = new Version("7.6.4");
|
||||
|
||||
/// <summary>
|
||||
/// 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);
|
||||
}
|
||||
|
||||
@@ -212,6 +212,16 @@ namespace Umbraco.Core
|
||||
/// Guid for a Forms DataSource.
|
||||
/// </summary>
|
||||
public static readonly Guid FormsDataSourceGuid = new Guid(FormsDataSource);
|
||||
|
||||
/// <summary>
|
||||
/// Guid for a Language.
|
||||
/// </summary>
|
||||
public const string Language = "6B05D05B-EC78-49BE-A4E4-79E274F07A77";
|
||||
|
||||
/// <summary>
|
||||
/// Guid for a Forms DataSource.
|
||||
/// </summary>
|
||||
public static readonly Guid LanguageGuid = new Guid(Language);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -4,7 +4,7 @@ using Umbraco.Core.Packaging.Models;
|
||||
|
||||
namespace Umbraco.Core.Events
|
||||
{
|
||||
internal class ImportPackageEventArgs<TEntity> : CancellableEnumerableObjectEventArgs<TEntity>, IEquatable<ImportPackageEventArgs<TEntity>>
|
||||
public class ImportPackageEventArgs<TEntity> : CancellableEnumerableObjectEventArgs<TEntity>, IEquatable<ImportPackageEventArgs<TEntity>>
|
||||
{
|
||||
private readonly MetaData _packageMetaData;
|
||||
|
||||
@@ -32,7 +32,7 @@ namespace Umbraco.Core.Events
|
||||
public bool Equals(ImportPackageEventArgs<TEntity> 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);
|
||||
}
|
||||
|
||||
@@ -3,7 +3,7 @@ using Umbraco.Core.Packaging.Models;
|
||||
|
||||
namespace Umbraco.Core.Events
|
||||
{
|
||||
internal class UninstallPackageEventArgs<TEntity> : CancellableObjectEventArgs<IEnumerable<TEntity>>
|
||||
public class UninstallPackageEventArgs<TEntity> : CancellableObjectEventArgs<IEnumerable<TEntity>>
|
||||
{
|
||||
private readonly MetaData _packageMetaData;
|
||||
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -159,7 +159,7 @@ namespace Umbraco.Core.IO
|
||||
|
||||
// ReSharper disable once AssignNullToNotNullAttribute
|
||||
var filepath = UmbracoConfig.For.UmbracoSettings().Content.UploadAllowDirectories
|
||||
? Path.Combine(folder, filename)
|
||||
? Path.Combine(folder, filename).Replace('\\', '/')
|
||||
: folder + "-" + filename;
|
||||
|
||||
return filepath;
|
||||
|
||||
@@ -2,6 +2,6 @@
|
||||
{
|
||||
public interface IPartialView : IFile
|
||||
{
|
||||
|
||||
PartialViewType ViewType { get; }
|
||||
}
|
||||
}
|
||||
@@ -1,10 +1,8 @@
|
||||
using System;
|
||||
using System.Runtime.Serialization;
|
||||
using Umbraco.Core.Services;
|
||||
|
||||
namespace Umbraco.Core.Models
|
||||
{
|
||||
|
||||
/// <summary>
|
||||
/// Represents a Partial View file
|
||||
/// </summary>
|
||||
@@ -12,14 +10,21 @@ namespace Umbraco.Core.Models
|
||||
[DataContract(IsReference = true)]
|
||||
public class PartialView : File, IPartialView
|
||||
{
|
||||
[Obsolete("Use the ctor that explicitely sets the view type.")]
|
||||
public PartialView(string path)
|
||||
: this(path, null)
|
||||
: this(PartialViewType.PartialView, path, null)
|
||||
{ }
|
||||
|
||||
internal PartialView(string path, Func<File, string> getFileContent)
|
||||
public PartialView(PartialViewType viewType, string path)
|
||||
: this(viewType, path, null)
|
||||
{ }
|
||||
|
||||
internal PartialView(PartialViewType viewType, string path, Func<File, string> getFileContent)
|
||||
: base(path, getFileContent)
|
||||
{ }
|
||||
{
|
||||
ViewType = viewType;
|
||||
}
|
||||
|
||||
internal PartialViewType ViewType { get; set; }
|
||||
public PartialViewType ViewType { get; set; }
|
||||
}
|
||||
}
|
||||
@@ -1,6 +1,6 @@
|
||||
namespace Umbraco.Core.Models
|
||||
{
|
||||
internal enum PartialViewType : byte
|
||||
public enum PartialViewType : byte
|
||||
{
|
||||
Unknown = 0, // default
|
||||
PartialView = 1,
|
||||
|
||||
@@ -178,6 +178,13 @@ namespace Umbraco.Core.Models
|
||||
/// </summary>
|
||||
[UmbracoObjectType(Constants.ObjectTypes.FormsDataSource)]
|
||||
[FriendlyName("DataSource")]
|
||||
FormsDataSource
|
||||
FormsDataSource,
|
||||
|
||||
/// <summary>
|
||||
/// Language
|
||||
/// </summary>
|
||||
[UmbracoObjectType(Constants.ObjectTypes.Language)]
|
||||
[FriendlyName("Language")]
|
||||
Language
|
||||
}
|
||||
}
|
||||
@@ -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<IDataTypeDefinition> DataTypesInstalled { get; set; }
|
||||
|
||||
@@ -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; }
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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<IDataTypeDefinition> DataTypesUninstalled { get; set; }
|
||||
|
||||
@@ -23,7 +23,7 @@ namespace Umbraco.Core.Persistence.Migrations
|
||||
Logger = logger;
|
||||
}
|
||||
|
||||
public IMigrationContext Context { get; internal set; }
|
||||
public IMigrationContext Context;
|
||||
|
||||
public abstract void Up();
|
||||
public abstract void Down();
|
||||
|
||||
@@ -2,6 +2,7 @@
|
||||
using Umbraco.Core.Configuration;
|
||||
using Umbraco.Core.Logging;
|
||||
using Umbraco.Core.Models.Rdbms;
|
||||
using Umbraco.Core.Persistence.DatabaseAnnotations;
|
||||
using Umbraco.Core.Persistence.SqlSyntax;
|
||||
|
||||
namespace Umbraco.Core.Persistence.Migrations.Upgrades.TargetVersionSevenThreeZero
|
||||
@@ -16,7 +17,7 @@ namespace Umbraco.Core.Persistence.Migrations.Upgrades.TargetVersionSevenThreeZe
|
||||
|
||||
public override void Up()
|
||||
{
|
||||
var exists = Context.Database.FirstOrDefault<RelationTypeDto>("WHERE alias=@alias", new {alias = Constants.Conventions.RelationTypes.RelateParentDocumentOnDeleteAlias});
|
||||
var exists = Context.Database.FirstOrDefault<RelationTypeDtoCapture>("WHERE alias=@alias", new {alias = Constants.Conventions.RelationTypes.RelateParentDocumentOnDeleteAlias});
|
||||
if (exists == null)
|
||||
{
|
||||
Insert.IntoTable("umbracoRelationType").Row(new
|
||||
@@ -28,13 +29,42 @@ namespace Umbraco.Core.Persistence.Migrations.Upgrades.TargetVersionSevenThreeZe
|
||||
alias = Constants.Conventions.RelationTypes.RelateParentDocumentOnDeleteAlias
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
|
||||
}
|
||||
|
||||
public override void Down()
|
||||
{ }
|
||||
|
||||
// need to capture the DTO as it is modified in later migrations
|
||||
|
||||
[TableName("umbracoRelationType")]
|
||||
[PrimaryKey("id")]
|
||||
[ExplicitColumns]
|
||||
internal class RelationTypeDtoCapture
|
||||
{
|
||||
public const int NodeIdSeed = 3;
|
||||
|
||||
[Column("id")]
|
||||
[PrimaryKeyColumn(IdentitySeed = NodeIdSeed)]
|
||||
public int Id { get; set; }
|
||||
|
||||
[Column("dual")]
|
||||
public bool Dual { get; set; }
|
||||
|
||||
[Column("parentObjectType")]
|
||||
public Guid ParentObjectType { get; set; }
|
||||
|
||||
[Column("childObjectType")]
|
||||
public Guid ChildObjectType { get; set; }
|
||||
|
||||
[Column("name")]
|
||||
[Index(IndexTypes.UniqueNonClustered, Name = "IX_umbracoRelationType_name")]
|
||||
public string Name { get; set; }
|
||||
|
||||
[Column("alias")]
|
||||
[NullSetting(NullSetting = NullSettings.Null)]
|
||||
[Length(100)]
|
||||
[Index(IndexTypes.UniqueNonClustered, Name = "IX_umbracoRelationType_alias")]
|
||||
public string Alias { get; set; }
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -81,7 +81,7 @@ namespace Umbraco.Core.Persistence.Repositories
|
||||
s.Where<DocumentDto>(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<IContent>
|
||||
|
||||
@@ -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<NodeDto>(dto => dto.NodeObjectType == docObjectType, SqlSyntax);
|
||||
|
||||
|
||||
var allXmlIds = Database.Fetch<int>(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<IContent> 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<IContent>(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<ContentVersionDto>("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);
|
||||
}
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// This builds the Xml document used for the XML cache
|
||||
/// </summary>
|
||||
@@ -841,7 +844,7 @@ order by umbracoNode.{2}, umbracoNode.parentID, umbracoNode.sortOrder",
|
||||
/// </summary>
|
||||
/// <param name="entity"></param>
|
||||
/// <param name="permission"></param>
|
||||
/// <param name="userIds"></param>
|
||||
/// <param name="userIds"></param>
|
||||
public void AssignEntityPermission(IContent entity, char permission, IEnumerable<int> userIds)
|
||||
{
|
||||
var repo = new PermissionRepository<IContent>(UnitOfWork, _cacheHelper, SqlSyntax);
|
||||
@@ -899,9 +902,9 @@ order by umbracoNode.{2}, umbracoNode.parentID, umbracoNode.sortOrder",
|
||||
string orderBy, Direction orderDirection, bool orderBySystemField, IQuery<IContent> 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<Tuple<string, object[]>> filterCallback = () => new Tuple<string, object[]>(filterSql.SQL, filterSql.Arguments);
|
||||
|
||||
return GetPagedResultsByQuery<DocumentDto>(query, pageIndex, pageSize, out totalRecords,
|
||||
@@ -957,7 +960,7 @@ order by umbracoNode.{2}, umbracoNode.parentID, umbracoNode.sortOrder",
|
||||
/// </param>
|
||||
/// <param name="withCache"></param>
|
||||
/// <param name="includeAllVersions">
|
||||
/// 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
|
||||
/// </param>
|
||||
/// <returns></returns>
|
||||
@@ -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<DocumentDto, ContentVersionDto, ContentDto, NodeDto>(sqlFull);
|
||||
if (dtos.Count == 0) return Enumerable.Empty<IContent>();
|
||||
|
||||
|
||||
//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<Tuple<IContent, bool>>();
|
||||
var defs = new DocumentDefinitionCollection(includeAllVersions);
|
||||
var templateIds = new List<int>();
|
||||
|
||||
|
||||
//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<int, IContentType>();
|
||||
|
||||
|
||||
foreach (var dto in dtos)
|
||||
{
|
||||
DocumentPublishedReadOnlyDto publishedDto;
|
||||
@@ -1145,7 +1148,7 @@ ORDER BY cmsContentVersion.id DESC
|
||||
|
||||
return currentName;
|
||||
}
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// Dispose disposable properties
|
||||
/// </summary>
|
||||
|
||||
@@ -30,7 +30,7 @@ namespace Umbraco.Core.Persistence.Repositories
|
||||
var updated = FileSystem.GetLastModified(path).UtcDateTime;
|
||||
//var content = GetFileContent(path);
|
||||
|
||||
var view = new PartialView(path, file => GetFileContent(file.OriginalPath))
|
||||
var view = new PartialView(ViewType, path, file => GetFileContent(file.OriginalPath))
|
||||
{
|
||||
//id can be the hash
|
||||
Id = path.GetHashCode(),
|
||||
@@ -38,8 +38,7 @@ namespace Umbraco.Core.Persistence.Repositories
|
||||
//Content = content,
|
||||
CreateDate = created,
|
||||
UpdateDate = updated,
|
||||
VirtualPath = FileSystem.GetUrl(id),
|
||||
ViewType = ViewType
|
||||
VirtualPath = FileSystem.GetUrl(id)
|
||||
};
|
||||
|
||||
//on initial construction we don't want to have dirty properties tracked
|
||||
|
||||
@@ -42,6 +42,7 @@ namespace Umbraco.Core.Persistence.Repositories
|
||||
//Construct and execute delete statements for all trashed items by 'nodeObjectType'
|
||||
var deletes = new List<string>
|
||||
{
|
||||
FormatDeleteStatement("cmsTask", "nodeId"),
|
||||
FormatDeleteStatement("umbracoUser2NodeNotify", "nodeId"),
|
||||
FormatDeleteStatement("umbracoUser2NodePermission", "nodeId"),
|
||||
@"DELETE FROM umbracoAccessRule WHERE umbracoAccessRule.accessId IN (
|
||||
|
||||
@@ -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")]
|
||||
[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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -20,6 +20,11 @@ namespace Umbraco.Core.PropertyEditors.ValueConverters
|
||||
|
||||
public override object ConvertSourceToObject(PublishedPropertyType propertyType, object source, bool preview)
|
||||
{
|
||||
if(source == null)
|
||||
{
|
||||
return string.Empty;
|
||||
}
|
||||
|
||||
return source.ToString();
|
||||
}
|
||||
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
|
||||
@@ -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
|
||||
/// <returns><see cref="IContent"/></returns>
|
||||
public IContent GetById(Guid key)
|
||||
{
|
||||
using (var uow = UowProvider.GetUnitOfWork(readOnly: true))
|
||||
{
|
||||
var repository = RepositoryFactory.CreateContentRepository(uow);
|
||||
var query = Query<IContent>.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;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
|
||||
@@ -83,7 +83,7 @@ namespace Umbraco.Core.Services
|
||||
/// <returns></returns>
|
||||
public bool HasContainerInPath(string contentPath)
|
||||
{
|
||||
using (var uow = UowProvider.GetUnitOfWork())
|
||||
using (var uow = UowProvider.GetUnitOfWork(readOnly: true))
|
||||
{
|
||||
// can use same repo for both content and media
|
||||
var repository = RepositoryFactory.CreateContentTypeRepository(uow);
|
||||
|
||||
@@ -16,50 +16,26 @@ namespace Umbraco.Core.Services
|
||||
{
|
||||
public class EntityService : ScopeRepositoryService, IEntityService
|
||||
{
|
||||
private readonly IRuntimeCacheProvider _runtimeCache;
|
||||
private readonly Dictionary<string, Tuple<UmbracoObjectTypes, Func<int, IUmbracoEntity>>> _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<string, Tuple<UmbracoObjectTypes, Func<int, IUmbracoEntity>>>
|
||||
{
|
||||
{typeof (IDataTypeDefinition).FullName, new Tuple<UmbracoObjectTypes, Func<int, IUmbracoEntity>>(UmbracoObjectTypes.DataType, dataTypeService.GetDataTypeDefinitionById)},
|
||||
{typeof (IContent).FullName, new Tuple<UmbracoObjectTypes, Func<int, IUmbracoEntity>>(UmbracoObjectTypes.Document, contentService.GetById)},
|
||||
{typeof (IContentType).FullName, new Tuple<UmbracoObjectTypes, Func<int, IUmbracoEntity>>(UmbracoObjectTypes.DocumentType, contentTypeService1.GetContentType)},
|
||||
{typeof (IContentType).FullName, new Tuple<UmbracoObjectTypes, Func<int, IUmbracoEntity>>(UmbracoObjectTypes.DocumentType, contentTypeService.GetContentType)},
|
||||
{typeof (IMedia).FullName, new Tuple<UmbracoObjectTypes, Func<int, IUmbracoEntity>>(UmbracoObjectTypes.Media, mediaService.GetById)},
|
||||
{typeof (IMediaType).FullName, new Tuple<UmbracoObjectTypes, Func<int, IUmbracoEntity>>(UmbracoObjectTypes.MediaType, contentTypeService1.GetMediaType)},
|
||||
{typeof (IMediaType).FullName, new Tuple<UmbracoObjectTypes, Func<int, IUmbracoEntity>>(UmbracoObjectTypes.MediaType, contentTypeService.GetMediaType)},
|
||||
{typeof (IMember).FullName, new Tuple<UmbracoObjectTypes, Func<int, IUmbracoEntity>>(UmbracoObjectTypes.Member, memberService.GetById)},
|
||||
{typeof (IMemberType).FullName, new Tuple<UmbracoObjectTypes, Func<int, IUmbracoEntity>>(UmbracoObjectTypes.MemberType, memberTypeService.Get)},
|
||||
//{typeof (IUmbracoEntity).FullName, new Tuple<UmbracoObjectTypes, Func<int, IUmbracoEntity>>(UmbracoObjectTypes.EntityContainer, id =>
|
||||
//{
|
||||
// using (var uow = UowProvider.GetUnitOfWork())
|
||||
// {
|
||||
// var found = uow.Database.FirstOrDefault<NodeDto>("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; } }
|
||||
|
||||
/// <summary>
|
||||
/// Returns the integer id for a given GUID
|
||||
/// </summary>
|
||||
@@ -76,23 +54,12 @@ namespace Umbraco.Core.Services
|
||||
/// <returns></returns>
|
||||
public Attempt<int> GetIdForKey(Guid key, UmbracoObjectTypes umbracoObjectType)
|
||||
{
|
||||
var result = _runtimeCache.GetCacheItem<int?>(CacheKeys.IdToKeyCacheKey + key, () =>
|
||||
{
|
||||
using (var uow = UowProvider.GetUnitOfWork(readOnly:true))
|
||||
{
|
||||
var nodeObjectType = GetNodeObjectTypeGuid(umbracoObjectType);
|
||||
return _idkMap.GetIdForKey(key, umbracoObjectType);
|
||||
}
|
||||
|
||||
var sql = new Sql()
|
||||
.Select("id")
|
||||
.From<NodeDto>()
|
||||
.Where<NodeDto>(
|
||||
dto =>
|
||||
dto.UniqueId == key &&
|
||||
dto.NodeObjectType == nodeObjectType);
|
||||
return uow.Database.ExecuteScalar<int?>(sql);
|
||||
}
|
||||
});
|
||||
return result.HasValue ? Attempt.Succeed(result.Value) : Attempt<int>.Fail();
|
||||
public Attempt<int> GetIdForUdi(Udi udi)
|
||||
{
|
||||
return _idkMap.GetIdForUdi(udi);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
@@ -103,32 +70,7 @@ namespace Umbraco.Core.Services
|
||||
/// <returns></returns>
|
||||
public Attempt<Guid> GetKeyForId(int id, UmbracoObjectTypes umbracoObjectType)
|
||||
{
|
||||
var result = _runtimeCache.GetCacheItem<Guid?>(CacheKeys.KeyToIdCacheKey + id, () =>
|
||||
{
|
||||
using (var uow = UowProvider.GetUnitOfWork(readOnly:true))
|
||||
{
|
||||
var nodeObjectType = GetNodeObjectTypeGuid(umbracoObjectType);
|
||||
|
||||
var sql = new Sql()
|
||||
.Select("uniqueID")
|
||||
.From<NodeDto>()
|
||||
.Where<NodeDto>(
|
||||
dto =>
|
||||
dto.NodeId == id &&
|
||||
dto.NodeObjectType == nodeObjectType);
|
||||
return uow.Database.ExecuteScalar<Guid?>(sql);
|
||||
}
|
||||
});
|
||||
return result.HasValue ? Attempt.Succeed(result.Value) : Attempt<Guid>.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)
|
||||
@@ -394,7 +336,7 @@ namespace Umbraco.Core.Services
|
||||
/// <param name="totalRecords"></param>
|
||||
/// <param name="orderBy"></param>
|
||||
/// <param name="orderDirection"></param>
|
||||
/// <param name="filter"></param>
|
||||
/// <param name="filter"></param>
|
||||
/// <returns></returns>
|
||||
public IEnumerable<IUmbracoEntity> GetPagedDescendants(int id, UmbracoObjectTypes umbracoObjectType, long pageIndex, int pageSize, out long totalRecords,
|
||||
string orderBy = "path", Direction orderDirection = Direction.Ascending, string filter = "")
|
||||
@@ -407,7 +349,7 @@ namespace Umbraco.Core.Services
|
||||
var query = Query<IUmbracoEntity>.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<IUmbracoEntity> filterQuery = null;
|
||||
if (filter.IsNullOrWhiteSpace() == false)
|
||||
|
||||
@@ -14,8 +14,7 @@ namespace Umbraco.Core.Services
|
||||
{
|
||||
public ExternalLoginService(IDatabaseUnitOfWorkProvider provider, RepositoryFactory repositoryFactory, ILogger logger, IEventMessagesFactory eventMessagesFactory)
|
||||
: base(provider, repositoryFactory, logger, eventMessagesFactory)
|
||||
{
|
||||
}
|
||||
{ }
|
||||
|
||||
/// <summary>
|
||||
/// Returns all user logins assigned
|
||||
@@ -23,30 +22,32 @@ namespace Umbraco.Core.Services
|
||||
/// <param name="userId"></param>
|
||||
/// <returns></returns>
|
||||
public IEnumerable<IIdentityUserLogin> GetAll(int userId)
|
||||
{
|
||||
using (var uow = UowProvider.GetUnitOfWork())
|
||||
{
|
||||
using (var uow = UowProvider.GetUnitOfWork(readOnly: true))
|
||||
{
|
||||
// ToList is important here, must evaluate within uow!
|
||||
var repo = RepositoryFactory.CreateExternalLoginRepository(uow);
|
||||
var ret = repo.GetByQuery(new Query<IIdentityUserLogin>().Where(x => x.UserId == userId));
|
||||
uow.Commit();
|
||||
return ret;
|
||||
return repo.GetByQuery(new Query<IIdentityUserLogin>()
|
||||
.Where(x => x.UserId == userId))
|
||||
.ToList();
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Returns all logins matching the login info - generally there should only be one but in some cases
|
||||
/// Returns all logins matching the login info - generally there should only be one but in some cases
|
||||
/// there might be more than one depending on if an adminstrator has been editing/removing members
|
||||
/// </summary>
|
||||
/// <param name="login"></param>
|
||||
/// <returns></returns>
|
||||
public IEnumerable<IIdentityUserLogin> Find(UserLoginInfo login)
|
||||
{
|
||||
using (var uow = UowProvider.GetUnitOfWork())
|
||||
using (var uow = UowProvider.GetUnitOfWork(readOnly: true))
|
||||
{
|
||||
// ToList is important here, must evaluate within uow!
|
||||
var repo = RepositoryFactory.CreateExternalLoginRepository(uow);
|
||||
var ret = repo.GetByQuery(new Query<IIdentityUserLogin>().Where(x => x.ProviderKey == login.ProviderKey && x.LoginProvider == login.LoginProvider));
|
||||
uow.Commit();
|
||||
return ret;
|
||||
return repo.GetByQuery(new Query<IIdentityUserLogin>()
|
||||
.Where(x => x.ProviderKey == login.ProviderKey && x.LoginProvider == login.LoginProvider))
|
||||
.ToList();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -78,7 +79,5 @@ namespace Umbraco.Core.Services
|
||||
uow.Commit();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
@@ -28,7 +28,14 @@ namespace Umbraco.Core.Services
|
||||
/// <param name="key"></param>
|
||||
/// <param name="umbracoObjectType"></param>
|
||||
/// <returns></returns>
|
||||
Attempt<int> GetIdForKey(Guid key, UmbracoObjectTypes umbracoObjectType);
|
||||
Attempt<int> GetIdForKey(Guid key, UmbracoObjectTypes umbracoObjectType);
|
||||
|
||||
/// <summary>
|
||||
/// Returns the integer id for a given Udi
|
||||
/// </summary>
|
||||
/// <param name="udi"></param>
|
||||
/// <returns></returns>
|
||||
Attempt<int> GetIdForUdi(Udi udi);
|
||||
|
||||
/// <summary>
|
||||
/// Returns the GUID for a given integer id
|
||||
|
||||
171
src/Umbraco.Core/Services/IdkMap.cs
Normal file
171
src/Umbraco.Core/Services/IdkMap.cs
Normal file
@@ -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<int, Guid> _id2Key = new Dictionary<int, Guid>();
|
||||
private readonly Dictionary<Guid, int> _key2Id = new Dictionary<Guid, int>();
|
||||
|
||||
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<int> 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<int?>("SELECT id FROM umbracoNode WHERE uniqueId=@id AND nodeObjectType=@nodeObjectType",
|
||||
new { id = key, nodeObjectType = GetNodeObjectTypeGuid(umbracoObjectType) });
|
||||
uow.Commit();
|
||||
}
|
||||
|
||||
if (val == null) return Attempt<int>.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<int> GetIdForUdi(Udi udi)
|
||||
{
|
||||
var guidUdi = udi as GuidUdi;
|
||||
if (guidUdi == null)
|
||||
return Attempt<int>.Fail();
|
||||
|
||||
var umbracoType = Constants.UdiEntityType.ToUmbracoObjectType(guidUdi.EntityType);
|
||||
return GetIdForKey(guidUdi.Guid, umbracoType);
|
||||
}
|
||||
|
||||
public Attempt<Guid> 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<Guid?>("SELECT uniqueId FROM umbracoNode WHERE id=@id AND nodeObjectType=@nodeObjectType",
|
||||
new { id, nodeObjectType = GetNodeObjectTypeGuid(umbracoObjectType) });
|
||||
uow.Commit();
|
||||
}
|
||||
|
||||
if (val == null) return Attempt<Guid>.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();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
@@ -327,12 +329,15 @@ namespace Umbraco.Core.Services
|
||||
/// <returns><see cref="IMedia"/></returns>
|
||||
public IMedia GetById(Guid key)
|
||||
{
|
||||
using (var uow = UowProvider.GetUnitOfWork(readOnly: true))
|
||||
{
|
||||
var repository = RepositoryFactory.CreateMediaRepository(uow);
|
||||
var query = Query<IMedia>.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;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
@@ -692,11 +697,11 @@ namespace Umbraco.Core.Services
|
||||
}
|
||||
|
||||
Func<string, Sql> createSql = url => new Sql().Select("*")
|
||||
.From<PropertyDataDto>()
|
||||
.InnerJoin<PropertyTypeDto>()
|
||||
.On<PropertyDataDto, PropertyTypeDto>(left => left.PropertyTypeId, right => right.Id)
|
||||
.Where<PropertyTypeDto>(x => x.Alias == "umbracoFile")
|
||||
.Where<PropertyDataDto>(x => x.VarChar == url);
|
||||
.From<PropertyDataDto>()
|
||||
.InnerJoin<PropertyTypeDto>()
|
||||
.On<PropertyDataDto, PropertyTypeDto>(left => left.PropertyTypeId, right => right.Id)
|
||||
.Where<PropertyTypeDto>(x => x.Alias == "umbracoFile")
|
||||
.Where<PropertyDataDto>(x => x.VarChar == url);
|
||||
|
||||
var sql = createSql(umbracoFileValue);
|
||||
|
||||
@@ -900,7 +905,13 @@ namespace Umbraco.Core.Services
|
||||
}
|
||||
|
||||
var repository = RepositoryFactory.CreateMediaRepository(uow);
|
||||
media.CreatorId = userId;
|
||||
|
||||
//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));
|
||||
// generate preview for blame history?
|
||||
@@ -1048,7 +1059,7 @@ namespace Umbraco.Core.Services
|
||||
/// <param name="userId">Optional id of the user deleting the media</param>
|
||||
public void DeleteMediaOfType(int mediaTypeId, int userId = 0)
|
||||
{
|
||||
DeleteMediaOfTypes(new[] {mediaTypeId}, userId);
|
||||
DeleteMediaOfTypes(new[] { mediaTypeId }, userId);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
|
||||
@@ -89,18 +89,18 @@ namespace Umbraco.Core.Services
|
||||
/// <returns></returns>
|
||||
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<PackagingService>("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
|
||||
/// <summary>
|
||||
/// Occurs after a package is imported
|
||||
/// </summary>
|
||||
internal static event TypedEventHandler<IPackagingService, ImportPackageEventArgs<InstallationSummary>> ImportedPackage;
|
||||
public static event TypedEventHandler<IPackagingService, ImportPackageEventArgs<InstallationSummary>> ImportedPackage;
|
||||
|
||||
/// <summary>
|
||||
/// Occurs after a package is uninstalled
|
||||
/// </summary>
|
||||
internal static event TypedEventHandler<IPackagingService, UninstallPackageEventArgs<UninstallationSummary>> UninstalledPackage;
|
||||
public static event TypedEventHandler<IPackagingService, UninstallPackageEventArgs<UninstallationSummary>> UninstalledPackage;
|
||||
|
||||
#endregion
|
||||
}
|
||||
|
||||
@@ -63,6 +63,8 @@ namespace Umbraco.Core.Services
|
||||
private Lazy<IExternalLoginService> _externalLoginService;
|
||||
private Lazy<IRedirectUrlService> _redirectUrlService;
|
||||
|
||||
internal IdkMap IdkMap { get; private set; }
|
||||
|
||||
/// <summary>
|
||||
/// public ctor - will generally just be used for unit testing all items are optional and if not specified, the defaults will be used
|
||||
/// </summary>
|
||||
@@ -171,9 +173,11 @@ namespace Umbraco.Core.Services
|
||||
|
||||
EventMessagesFactory = eventMessagesFactory;
|
||||
|
||||
IdkMap = new IdkMap(provider);
|
||||
|
||||
BuildServiceCache(provider, cache,
|
||||
repositoryFactory,
|
||||
logger, eventMessagesFactory);
|
||||
logger, eventMessagesFactory, IdkMap);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
@@ -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<IMemberService>(() => new MemberService(provider, repositoryFactory, logger, eventMessagesFactory, _memberGroupService.Value, _dataTypeService.Value));
|
||||
|
||||
if (_contentService == null)
|
||||
_contentService = new Lazy<IContentService>(() => new ContentService(provider, repositoryFactory, logger, eventMessagesFactory, _dataTypeService.Value, _userService.Value));
|
||||
_contentService = new Lazy<IContentService>(() => new ContentService(provider, repositoryFactory, logger, eventMessagesFactory, _dataTypeService.Value, _userService.Value, idkMap));
|
||||
|
||||
if (_mediaService == null)
|
||||
_mediaService = new Lazy<IMediaService>(() => new MediaService(provider, repositoryFactory, logger, eventMessagesFactory, _dataTypeService.Value, _userService.Value));
|
||||
_mediaService = new Lazy<IMediaService>(() => new MediaService(provider, repositoryFactory, logger, eventMessagesFactory, _dataTypeService.Value, _userService.Value, idkMap));
|
||||
|
||||
if (_contentTypeService == null)
|
||||
_contentTypeService = new Lazy<IContentTypeService>(() => new ContentTypeService(provider, repositoryFactory, logger, eventMessagesFactory, _contentService.Value, _mediaService.Value));
|
||||
@@ -277,8 +282,7 @@ namespace Umbraco.Core.Services
|
||||
_entityService = new Lazy<IEntityService>(() => 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<IPackagingService>(() => new PackagingService(logger, _contentService.Value, _contentTypeService.Value, _mediaService.Value, _macroService.Value, _dataTypeService.Value, _fileService.Value, _localizationService.Value, _entityService.Value, _userService.Value, repositoryFactory, provider));
|
||||
|
||||
@@ -701,67 +701,72 @@ namespace Umbraco.Core
|
||||
return val;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Generates a hash of a string based on the FIPS compliance setting.
|
||||
/// </summary>
|
||||
/// <param name="str">Referrs to itself</param>
|
||||
/// <returns>The hashed string</returns>
|
||||
public static string GenerateHash(this string str)
|
||||
{
|
||||
return CryptoConfig.AllowOnlyFipsAlgorithms
|
||||
? str.ToSHA1()
|
||||
: str.ToMd5();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Converts the string to MD5
|
||||
/// </summary>
|
||||
/// <param name="stringToConvert">referrs to itself</param>
|
||||
/// <returns>the md5 hashed string</returns>
|
||||
/// <param name="stringToConvert">Referrs to itself</param>
|
||||
/// <returns>The MD5 hashed string</returns>
|
||||
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");
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Converts the string to SHA1
|
||||
/// </summary>
|
||||
/// <param name="stringToConvert">referrs to itself</param>
|
||||
/// <returns>the md5 hashed string</returns>
|
||||
/// <returns>The SHA1 hashed string</returns>
|
||||
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");
|
||||
}
|
||||
|
||||
|
||||
/// <summary>Generate a hash of a string based on the hashType passed in
|
||||
/// </summary>
|
||||
/// <param name="str">Referrs to itself</param>
|
||||
/// <param name="hashType">String with the hash type. See remarks section of the CryptoConfig Class in MSDN docs for a list of possible values.</param>
|
||||
/// <returns>The hashed string</returns>
|
||||
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();
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Decodes a string that was encoded with UrlTokenEncode
|
||||
/// </summary>
|
||||
@@ -1465,10 +1470,84 @@ namespace Umbraco.Core
|
||||
/// <returns></returns>
|
||||
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
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// The namespace for URLs (from RFC 4122, Appendix C).
|
||||
///
|
||||
/// See <a href="http://www.ietf.org/rfc/rfc4122.txt">RFC 4122</a>
|
||||
/// </summary>
|
||||
internal static readonly Guid UrlNamespace = new Guid("6ba7b811-9dad-11d1-80b4-00c04fd430c8");
|
||||
|
||||
/// <summary>
|
||||
/// Creates a name-based UUID using the algorithm from RFC 4122 §4.3.
|
||||
///
|
||||
/// See <a href="https://github.com/LogosBible/Logos.Utility/blob/master/src/Logos.Utility/GuidUtility.cs#L34">GuidUtility.cs</a> for original implementation.
|
||||
/// </summary>
|
||||
/// <param name="namespaceId">The ID of the namespace.</param>
|
||||
/// <param name="name">The name (within that namespace).</param>
|
||||
/// <param name="version">The version number of the UUID to create; this value must be either
|
||||
/// 3 (for MD5 hashing) or 5 (for SHA-1 hashing).</param>
|
||||
/// <returns>A UUID derived from the namespace and name.</returns>
|
||||
/// <remarks>See <a href="http://code.logos.com/blog/2011/04/generating_a_deterministic_guid.html">Generating a deterministic GUID</a>.</remarks>
|
||||
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;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
using System;
|
||||
using System.ComponentModel;
|
||||
using System.Linq;
|
||||
|
||||
namespace Umbraco.Core
|
||||
{
|
||||
@@ -20,7 +21,7 @@ namespace Umbraco.Core
|
||||
/// <param name="entityType">The entity type part of the udi.</param>
|
||||
/// <param name="id">The string id part of the udi.</param>
|
||||
public StringUdi(string entityType, string id)
|
||||
: base(entityType, "umb://" + entityType + "/" + id)
|
||||
: base(entityType, "umb://" + entityType + "/" + EscapeUriString(id))
|
||||
{
|
||||
Id = id;
|
||||
}
|
||||
@@ -32,7 +33,20 @@ namespace Umbraco.Core
|
||||
public StringUdi(Uri uriValue)
|
||||
: base(uriValue)
|
||||
{
|
||||
Id = uriValue.AbsolutePath.TrimStart('/');
|
||||
Id = Uri.UnescapeDataString(uriValue.AbsolutePath.TrimStart('/'));
|
||||
}
|
||||
|
||||
private static string EscapeUriString(string s)
|
||||
{
|
||||
// Uri.EscapeUriString preserves / but also [ and ] which is bad
|
||||
// Uri.EscapeDataString does not preserve / which is bad
|
||||
|
||||
// reserved = : / ? # [ ] @ ! $ & ' ( ) * + , ; =
|
||||
// unreserved = alpha digit - . _ ~
|
||||
|
||||
// we want to preserve the / and the unreserved
|
||||
// so...
|
||||
return string.Join("/", s.Split('/').Select(Uri.EscapeDataString));
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
|
||||
@@ -68,7 +68,7 @@ namespace Umbraco.Core.Strings
|
||||
/// <summary>
|
||||
/// Flag mask for encoding.
|
||||
/// </summary>
|
||||
CodeMask = Unicode | Utf8 | Ascii,
|
||||
CodeMask = Unicode | Utf8 | Ascii | TryAscii,
|
||||
|
||||
/// <summary>
|
||||
/// Unicode encoding.
|
||||
@@ -86,6 +86,10 @@ namespace Umbraco.Core.Strings
|
||||
/// </summary>
|
||||
Ascii = 0x0400,
|
||||
|
||||
/// <summary>
|
||||
/// Ascii encoding, if possible.
|
||||
/// </summary>
|
||||
TryAscii = 0x0800,
|
||||
|
||||
// role values
|
||||
|
||||
|
||||
@@ -152,12 +152,18 @@ namespace Umbraco.Core.Strings
|
||||
/// <returns>The short string helper.</returns>
|
||||
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);
|
||||
|
||||
@@ -17,8 +17,9 @@ namespace Umbraco.Core.Strings
|
||||
/// Converts an Utf8 string into an Ascii string.
|
||||
/// </summary>
|
||||
/// <param name="text">The text to convert.</param>
|
||||
/// <param name="fail">The character to used to replace characters that cannot properly be converted.</param>
|
||||
/// <returns>The converted text.</returns>
|
||||
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.
|
||||
/// </summary>
|
||||
/// <param name="text">The text to convert.</param>
|
||||
/// <param name="fail">The character to used to replace characters that cannot properly be converted.</param>
|
||||
/// <returns>The converted text.</returns>
|
||||
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
|
||||
/// </summary>
|
||||
/// <param name="input">The input array.</param>
|
||||
/// <param name="output">The output array.</param>
|
||||
/// <param name="fail">The character to used to replace characters that cannot properly be converted.</param>
|
||||
/// <returns>The number of characters in the output array.</returns>
|
||||
/// <remarks>The caller must ensure that the output array is big enough.</remarks>
|
||||
/// <exception cref="OverflowException">The output array is not big enough.</exception>
|
||||
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
|
||||
/// <param name="ipos">The input position.</param>
|
||||
/// <param name="output">The output array.</param>
|
||||
/// <param name="opos">The output position.</param>
|
||||
/// <param name="fail">The character to used to replace characters that cannot properly be converted.</param>
|
||||
/// <remarks>
|
||||
/// <para>Adapted from various sources on the 'net including <c>Lucene.Net.Analysis.ASCIIFoldingFilter</c>.</para>
|
||||
/// <para>Input should contain Utf8 characters exclusively and NOT Unicode.</para>
|
||||
/// <para>Removes controls, normalizes whitespaces, replaces symbols by '?'.</para>
|
||||
/// </remarks>
|
||||
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;
|
||||
}
|
||||
|
||||
@@ -4,6 +4,7 @@ using System.Web;
|
||||
using Umbraco.Core.Configuration;
|
||||
using Umbraco.Core.Configuration.UmbracoSettings;
|
||||
using Umbraco.Core.IO;
|
||||
using Umbraco.Core.Logging;
|
||||
|
||||
namespace Umbraco.Core.Sync
|
||||
{
|
||||
@@ -40,8 +41,9 @@ namespace Umbraco.Core.Sync
|
||||
.ToList();
|
||||
|
||||
if (serversA.Length == 0)
|
||||
{
|
||||
{
|
||||
_serverRole = ServerRole.Unknown; // config error, actually
|
||||
LogHelper.Debug<ConfigServerRegistrar>(string.Format("Server Role Unknown: DistributedCalls are enabled but no servers are listed"));
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -50,7 +52,10 @@ namespace Umbraco.Core.Sync
|
||||
var serverName = master.ServerName;
|
||||
|
||||
if (appId.IsNullOrWhiteSpace() && serverName.IsNullOrWhiteSpace())
|
||||
{
|
||||
_serverRole = ServerRole.Unknown; // config error, actually
|
||||
LogHelper.Debug<ConfigServerRegistrar>(string.Format("Server Role Unknown: Server Name or AppId missing from Server configuration in DistributedCalls settings"));
|
||||
}
|
||||
else
|
||||
_serverRole = IsCurrentServer(appId, serverName)
|
||||
? ServerRole.Master
|
||||
|
||||
@@ -101,7 +101,8 @@ namespace Umbraco.Core
|
||||
public override string ToString()
|
||||
{
|
||||
// UriValue is created in the ctor and is never null
|
||||
return UriValue.ToString();
|
||||
// use AbsoluteUri here and not ToString else it's not encoded!
|
||||
return UriValue.AbsoluteUri;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
@@ -159,7 +160,7 @@ namespace Umbraco.Core
|
||||
}
|
||||
if (udiType == UdiType.StringUdi)
|
||||
{
|
||||
udi = path == string.Empty ? GetRootUdi(uri.Host) : new StringUdi(uri.Host, path);
|
||||
udi = path == string.Empty ? GetRootUdi(uri.Host) : new StringUdi(uri.Host, Uri.UnescapeDataString(path));
|
||||
return true;
|
||||
}
|
||||
if (tryParse) return false;
|
||||
|
||||
@@ -1,5 +1,4 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using Umbraco.Core.Models;
|
||||
|
||||
namespace Umbraco.Core
|
||||
@@ -84,6 +83,8 @@ namespace Umbraco.Core
|
||||
public const string PartialViewMacro = "partial-view-macro";
|
||||
[UdiType(UdiType.StringUdi)]
|
||||
public const string Xslt = "xslt";
|
||||
[UdiType(UdiType.StringUdi)]
|
||||
public const string Language = "language";
|
||||
|
||||
public static string FromUmbracoObjectType(UmbracoObjectTypes umbracoObjectType)
|
||||
{
|
||||
@@ -123,6 +124,8 @@ namespace Umbraco.Core
|
||||
return FormsPreValue;
|
||||
case UmbracoObjectTypes.FormsDataSource:
|
||||
return FormsDataSource;
|
||||
case UmbracoObjectTypes.Language:
|
||||
return Language;
|
||||
}
|
||||
throw new NotSupportedException(string.Format("UmbracoObjectType \"{0}\" does not have a matching EntityType.", umbracoObjectType));
|
||||
}
|
||||
@@ -165,6 +168,8 @@ namespace Umbraco.Core
|
||||
return UmbracoObjectTypes.FormsPreValue;
|
||||
case FormsDataSource:
|
||||
return UmbracoObjectTypes.FormsDataSource;
|
||||
case Language:
|
||||
return UmbracoObjectTypes.Language;
|
||||
}
|
||||
throw new NotSupportedException(
|
||||
string.Format("EntityType \"{0}\" does not have a matching UmbracoObjectType.", entityType));
|
||||
|
||||
@@ -97,7 +97,7 @@ namespace Umbraco.Core
|
||||
/// </summary>
|
||||
/// <param name="entity">The entity.</param>
|
||||
/// <returns>The entity identifier of the entity.</returns>
|
||||
public static GuidUdi GetUdi(this Umbraco.Core.Models.EntityContainer entity)
|
||||
public static GuidUdi GetUdi(this EntityContainer entity)
|
||||
{
|
||||
if (entity == null) throw new ArgumentNullException("entity");
|
||||
|
||||
@@ -198,7 +198,13 @@ namespace Umbraco.Core
|
||||
public static StringUdi GetUdi(this IPartialView entity)
|
||||
{
|
||||
if (entity == null) throw new ArgumentNullException("entity");
|
||||
return new StringUdi(Constants.UdiEntityType.PartialView, entity.Path.TrimStart('/')).EnsureClosed();
|
||||
|
||||
// we should throw on Unknown but for the time being, assume it means PartialView
|
||||
var entityType = entity.ViewType == PartialViewType.PartialViewMacro
|
||||
? Constants.UdiEntityType.PartialViewMacro
|
||||
: Constants.UdiEntityType.PartialView;
|
||||
|
||||
return new StringUdi(entityType, entity.Path.TrimStart('/')).EnsureClosed();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
@@ -240,6 +246,17 @@ namespace Umbraco.Core
|
||||
return new GuidUdi(Constants.UdiEntityType.RelationType, entity.Key).EnsureClosed();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Gets the entity identifier of the entity.
|
||||
/// </summary>
|
||||
/// <param name="entity">The entity.</param>
|
||||
/// <returns>The entity identifier of the entity.</returns>
|
||||
public static StringUdi GetUdi(this ILanguage entity)
|
||||
{
|
||||
if (entity == null) throw new ArgumentNullException("entity");
|
||||
return new StringUdi(Constants.UdiEntityType.Language, entity.IsoCode).EnsureClosed();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Gets the entity identifier of the entity.
|
||||
/// </summary>
|
||||
@@ -273,7 +290,7 @@ namespace Umbraco.Core
|
||||
var dataTypeComposition = entity as IDataTypeDefinition;
|
||||
if (dataTypeComposition != null) return dataTypeComposition.GetUdi();
|
||||
|
||||
var container = entity as Umbraco.Core.Models.EntityContainer;
|
||||
var container = entity as EntityContainer;
|
||||
if (container != null) return container.GetUdi();
|
||||
|
||||
var media = entity as IMedia;
|
||||
@@ -309,6 +326,9 @@ namespace Umbraco.Core
|
||||
var relationType = entity as IRelationType;
|
||||
if (relationType != null) return relationType.GetUdi();
|
||||
|
||||
var language = entity as ILanguage;
|
||||
if (language != null) return language.GetUdi();
|
||||
|
||||
throw new NotSupportedException(string.Format("Entity type {0} is not supported.", entity.GetType().FullName));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -237,6 +237,7 @@
|
||||
<Compile Include="Configuration\UmbracoSettings\ContentError404Collection.cs" />
|
||||
<Compile Include="Configuration\UmbracoSettings\ContentErrorPageElement.cs" />
|
||||
<Compile Include="Configuration\UmbracoSettings\ContentErrorsElement.cs" />
|
||||
<Compile Include="Configuration\UmbracoSettings\ContentSectionExtensions.cs" />
|
||||
<Compile Include="Configuration\UmbracoSettings\ImagingAutoFillPropertiesCollection.cs" />
|
||||
<Compile Include="Configuration\UmbracoSettings\ImagingAutoFillUploadFieldElement.cs" />
|
||||
<Compile Include="Configuration\UmbracoSettings\ContentImagingElement.cs" />
|
||||
@@ -649,6 +650,7 @@
|
||||
<Compile Include="Services\ContentTypeServiceExtensions.cs" />
|
||||
<Compile Include="Models\RedirectUrl.cs" />
|
||||
<Compile Include="Services\IContentServiceBase.cs" />
|
||||
<Compile Include="Services\IdkMap.cs" />
|
||||
<Compile Include="Services\RedirectUrlService.cs" />
|
||||
<Compile Include="Services\DomainService.cs" />
|
||||
<Compile Include="Services\ExternalLoginService.cs" />
|
||||
|
||||
@@ -79,6 +79,7 @@
|
||||
</system.data>
|
||||
|
||||
<system.web>
|
||||
<httpRuntime targetFramework="4.5" />
|
||||
<compilation defaultLanguage="c#" debug="true" batch="false" targetFramework="4.0"></compilation>
|
||||
<machineKey validationKey="5E7B955FCE36F5F2A867C2A0D85DC61E7FEA9E15F1561E8386F78BFE9EE23FF18B21E6A44AA17300B3B9D5DBEB37AA61A2C73884A5BBEDA6D3B14BA408A7A8CD" decryptionKey="116B853D031219E404E088FCA0986D6CF2DFA77E1957B59FCC9404B8CA3909A1" validation="SHA1" decryption="AES" />
|
||||
<!--<trust level="Medium" originUrl=".*"/>-->
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Diagnostics;
|
||||
using System.Linq;
|
||||
using NUnit.Framework;
|
||||
using Umbraco.Core;
|
||||
@@ -177,6 +178,39 @@ namespace Umbraco.Tests.Configurations.UmbracoSettings
|
||||
public void DisallowedUploadFiles()
|
||||
{
|
||||
Assert.IsTrue(SettingsSection.Content.DisallowedUploadFiles.All(x => "ashx,aspx,ascx,config,cshtml,vbhtml,asmx,air,axd".Split(',').Contains(x)));
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void AllowedUploadFiles()
|
||||
{
|
||||
Assert.IsTrue(SettingsSection.Content.AllowedUploadFiles.All(x => "jpg,gif,png".Split(',').Contains(x)));
|
||||
}
|
||||
|
||||
[Test]
|
||||
[TestCase("png", true)]
|
||||
[TestCase("jpg", true)]
|
||||
[TestCase("gif", true)]
|
||||
// TODO: Why does it flip to TestingDefaults=true for these two tests on AppVeyor. WHY?
|
||||
//[TestCase("bmp", false)]
|
||||
//[TestCase("php", false)]
|
||||
[TestCase("ashx", false)]
|
||||
[TestCase("config", false)]
|
||||
public void IsFileAllowedForUpload_WithWhitelist(string extension, bool expected)
|
||||
{
|
||||
// Make really sure that defaults are NOT used
|
||||
TestingDefaults = false;
|
||||
|
||||
Debug.WriteLine("Extension being tested", extension);
|
||||
Debug.WriteLine("AllowedUploadFiles: {0}", SettingsSection.Content.AllowedUploadFiles);
|
||||
Debug.WriteLine("DisallowedUploadFiles: {0}", SettingsSection.Content.DisallowedUploadFiles);
|
||||
|
||||
var allowedContainsExtension = SettingsSection.Content.AllowedUploadFiles.Any(x => x.InvariantEquals(extension));
|
||||
var disallowedContainsExtension = SettingsSection.Content.DisallowedUploadFiles.Any(x => x.InvariantEquals(extension));
|
||||
|
||||
Debug.WriteLine("AllowedContainsExtension: {0}", allowedContainsExtension);
|
||||
Debug.WriteLine("DisallowedContainsExtension: {0}", disallowedContainsExtension);
|
||||
|
||||
Assert.AreEqual(SettingsSection.Content.IsFileAllowedForUpload(extension), expected);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
using System.Configuration;
|
||||
using System.Diagnostics;
|
||||
using System.IO;
|
||||
using NUnit.Framework;
|
||||
using Umbraco.Core.Configuration;
|
||||
using Umbraco.Core.Configuration.UmbracoSettings;
|
||||
using Umbraco.Tests.TestHelpers;
|
||||
|
||||
@@ -9,20 +9,17 @@ namespace Umbraco.Tests.Configurations.UmbracoSettings
|
||||
{
|
||||
public abstract class UmbracoSettingsTests
|
||||
{
|
||||
|
||||
protected virtual bool TestingDefaults
|
||||
{
|
||||
get { return false; }
|
||||
}
|
||||
protected virtual bool TestingDefaults { get; set; }
|
||||
|
||||
[SetUp]
|
||||
public void Init()
|
||||
{
|
||||
var config = new FileInfo(TestHelper.MapPathForTest("~/Configurations/UmbracoSettings/web.config"));
|
||||
|
||||
var fileMap = new ExeConfigurationFileMap() { ExeConfigFilename = config.FullName };
|
||||
var configuration = ConfigurationManager.OpenMappedExeConfiguration(fileMap, ConfigurationUserLevel.None);
|
||||
|
||||
var fileMap = new ExeConfigurationFileMap() { ExeConfigFilename = config.FullName };
|
||||
var configuration = ConfigurationManager.OpenMappedExeConfiguration(fileMap, ConfigurationUserLevel.None);
|
||||
|
||||
Debug.WriteLine("Testing defaults? {0}", TestingDefaults);
|
||||
if (TestingDefaults)
|
||||
{
|
||||
SettingsSection = configuration.GetSection("umbracoConfiguration/defaultSettings") as UmbracoSettingsSection;
|
||||
@@ -32,8 +29,6 @@ namespace Umbraco.Tests.Configurations.UmbracoSettings
|
||||
SettingsSection = configuration.GetSection("umbracoConfiguration/settings") as UmbracoSettingsSection;
|
||||
}
|
||||
|
||||
|
||||
|
||||
Assert.IsNotNull(SettingsSection);
|
||||
}
|
||||
|
||||
|
||||
@@ -100,6 +100,9 @@
|
||||
<!-- These file types will not be allowed to be uploaded via the upload control for media and content -->
|
||||
<disallowedUploadFiles>ashx,aspx,ascx,config,cshtml,vbhtml,asmx,air,axd</disallowedUploadFiles>
|
||||
|
||||
<!-- If completed, only the file extensions listed below will be allowed to be uploaded. If empty, disallowedUploadFiles will apply to prevent upload of specific file extensions. -->
|
||||
<allowedUploadFiles>jpg,png,gif</allowedUploadFiles>
|
||||
|
||||
<!-- Defines the default document type property used when adding properties in the back-office (if missing or empty, defaults to Textstring -->
|
||||
<defaultDocumentTypeProperty>Textstring</defaultDocumentTypeProperty>
|
||||
</content>
|
||||
|
||||
@@ -37,14 +37,14 @@ namespace Umbraco.Tests.Persistence.Repositories
|
||||
var unitOfWork = provider.GetUnitOfWork();
|
||||
var repository = new PartialViewRepository(unitOfWork, _fileSystem);
|
||||
|
||||
var partialView = new PartialView("test-path-1.cshtml") { Content = "// partialView" };
|
||||
var partialView = new PartialView(PartialViewType.PartialView, "test-path-1.cshtml") { Content = "// partialView" };
|
||||
repository.AddOrUpdate(partialView);
|
||||
unitOfWork.Commit();
|
||||
Assert.IsTrue(_fileSystem.FileExists("test-path-1.cshtml"));
|
||||
Assert.AreEqual("test-path-1.cshtml", partialView.Path);
|
||||
Assert.AreEqual("/Views/Partials/test-path-1.cshtml", partialView.VirtualPath);
|
||||
|
||||
partialView = new PartialView("path-2/test-path-2.cshtml") { Content = "// partialView" };
|
||||
partialView = new PartialView(PartialViewType.PartialView, "path-2/test-path-2.cshtml") { Content = "// partialView" };
|
||||
repository.AddOrUpdate(partialView);
|
||||
unitOfWork.Commit();
|
||||
Assert.IsTrue(_fileSystem.FileExists("path-2/test-path-2.cshtml"));
|
||||
@@ -56,7 +56,7 @@ namespace Umbraco.Tests.Persistence.Repositories
|
||||
Assert.AreEqual("path-2\\test-path-2.cshtml", partialView.Path);
|
||||
Assert.AreEqual("/Views/Partials/path-2/test-path-2.cshtml", partialView.VirtualPath);
|
||||
|
||||
partialView = new PartialView("path-2\\test-path-3.cshtml") { Content = "// partialView" };
|
||||
partialView = new PartialView(PartialViewType.PartialView, "path-2\\test-path-3.cshtml") { Content = "// partialView" };
|
||||
repository.AddOrUpdate(partialView);
|
||||
unitOfWork.Commit();
|
||||
Assert.IsTrue(_fileSystem.FileExists("path-2/test-path-3.cshtml"));
|
||||
@@ -73,7 +73,7 @@ namespace Umbraco.Tests.Persistence.Repositories
|
||||
Assert.AreEqual("path-2\\test-path-3.cshtml", partialView.Path);
|
||||
Assert.AreEqual("/Views/Partials/path-2/test-path-3.cshtml", partialView.VirtualPath);
|
||||
|
||||
partialView = new PartialView("\\test-path-4.cshtml") { Content = "// partialView" };
|
||||
partialView = new PartialView(PartialViewType.PartialView, "\\test-path-4.cshtml") { Content = "// partialView" };
|
||||
Assert.Throws<FileSecurityException>(() => // fixed in 7.3 - 7.2.8 used to strip the \
|
||||
{
|
||||
repository.AddOrUpdate(partialView);
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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<IChar>());
|
||||
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);
|
||||
|
||||
@@ -31,6 +31,57 @@ namespace Umbraco.Tests
|
||||
Assert.AreEqual("umb://" + Constants.UdiEntityType.AnyString + "/test-id", udi.ToString());
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void StringEncodingTest()
|
||||
{
|
||||
// absolute path is unescaped
|
||||
var uri = new Uri("umb://" + Constants.UdiEntityType.AnyString + "/this%20is%20a%20test");
|
||||
Assert.AreEqual("umb://" + Constants.UdiEntityType.AnyString + "/this is a test", uri.ToString());
|
||||
Assert.AreEqual("umb://" + Constants.UdiEntityType.AnyString + "/this%20is%20a%20test", uri.AbsoluteUri);
|
||||
Assert.AreEqual("/this%20is%20a%20test", uri.AbsolutePath);
|
||||
|
||||
Assert.AreEqual("/this is a test", Uri.UnescapeDataString(uri.AbsolutePath));
|
||||
Assert.AreEqual("%2Fthis%20is%20a%20test", Uri.EscapeDataString("/this is a test"));
|
||||
Assert.AreEqual("/this%20is%20a%20test", Uri.EscapeUriString("/this is a test"));
|
||||
|
||||
var udi = Udi.Parse("umb://" + Constants.UdiEntityType.AnyString + "/this%20is%20a%20test");
|
||||
Assert.AreEqual(Constants.UdiEntityType.AnyString, udi.EntityType);
|
||||
Assert.IsInstanceOf<StringUdi>(udi);
|
||||
var stringEntityId = udi as StringUdi;
|
||||
Assert.IsNotNull(stringEntityId);
|
||||
Assert.AreEqual("this is a test", stringEntityId.Id);
|
||||
Assert.AreEqual("umb://" + Constants.UdiEntityType.AnyString + "/this%20is%20a%20test", udi.ToString());
|
||||
|
||||
var udi2 = new StringUdi(Constants.UdiEntityType.AnyString, "this is a test");
|
||||
Assert.AreEqual(udi, udi2);
|
||||
|
||||
var udi3 = new StringUdi(Constants.UdiEntityType.AnyString, "path to/this is a test.xyz");
|
||||
Assert.AreEqual("umb://" + Constants.UdiEntityType.AnyString + "/path%20to/this%20is%20a%20test.xyz", udi3.ToString());
|
||||
}
|
||||
|
||||
[Test, Ignore]
|
||||
public void StringEncodingTest2()
|
||||
{
|
||||
// reserved = : / ? # [ ] @ ! $ & ' ( ) * + , ; =
|
||||
// unreserved = alpha digit - . _ ~
|
||||
|
||||
Assert.AreEqual("%3A%2F%3F%23%5B%5D%40%21%24%26%27%28%29%2B%2C%3B%3D.-_~%25", Uri.EscapeDataString(":/?#[]@!$&'()+,;=.-_~%"));
|
||||
Assert.AreEqual(":/?#[]@!$&'()+,;=.-_~%25", Uri.EscapeUriString(":/?#[]@!$&'()+,;=.-_~%"));
|
||||
|
||||
// we cannot have reserved chars at random places
|
||||
// we want to keep the / in string udis
|
||||
|
||||
var r = string.Join("/", "path/to/View[1].cshtml".Split('/').Select(Uri.EscapeDataString));
|
||||
Assert.AreEqual("path/to/View%5B1%5D.cshtml", r);
|
||||
Assert.IsTrue(Uri.IsWellFormedUriString("umb://partial-view-macro/" + r, UriKind.Absolute));
|
||||
|
||||
// with the proper fix in StringUdi this should work:
|
||||
var udi1 = new StringUdi("partial-view-macro", "path/to/View[1].cshtml");
|
||||
Assert.AreEqual("umb://partial-view-macro/path/to/View%5B1%5D.cshtml", udi1.ToString());
|
||||
var udi2 = Udi.Parse("umb://partial-view-macro/path/to/View%5B1%5D.cshtml");
|
||||
Assert.AreEqual("path/to/View[1].cshtml", ((StringUdi) udi2).Id);
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void GuidEntityCtorTest()
|
||||
{
|
||||
|
||||
@@ -61,8 +61,9 @@
|
||||
<Reference Include="Castle.Core, Version=4.0.0.0, Culture=neutral, PublicKeyToken=407dd0808d44fbdc, processorArchitecture=MSIL">
|
||||
<HintPath>..\packages\Castle.Core.4.0.0\lib\net45\Castle.Core.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="Examine, Version=0.1.82.0, Culture=neutral, processorArchitecture=MSIL">
|
||||
<HintPath>..\packages\Examine.0.1.82\lib\net45\Examine.dll</HintPath>
|
||||
<Reference Include="Examine, Version=0.1.83.0, Culture=neutral, processorArchitecture=MSIL">
|
||||
<HintPath>..\packages\Examine.0.1.83\lib\net45\Examine.dll</HintPath>
|
||||
<Private>True</Private>
|
||||
</Reference>
|
||||
<Reference Include="ICSharpCode.SharpZipLib, Version=0.86.0.518, Culture=neutral, PublicKeyToken=1b03e6acf1164f73, processorArchitecture=MSIL">
|
||||
<HintPath>..\packages\SharpZipLib.0.86.0\lib\20\ICSharpCode.SharpZipLib.dll</HintPath>
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
<package id="AspNetWebApi.SelfHost" version="4.0.20710.0" targetFramework="net45" />
|
||||
<package id="AutoMapper" version="3.3.1" targetFramework="net45" />
|
||||
<package id="Castle.Core" version="4.0.0" targetFramework="net45" />
|
||||
<package id="Examine" version="0.1.82" targetFramework="net45" />
|
||||
<package id="Examine" version="0.1.83" targetFramework="net45" />
|
||||
<package id="log4net" version="2.0.8" targetFramework="net45" />
|
||||
<package id="Log4Net.Async" version="2.0.4" targetFramework="net45" />
|
||||
<package id="Lucene.Net" version="2.9.4.1" targetFramework="net45" />
|
||||
@@ -21,6 +21,7 @@
|
||||
<package id="Moq" version="4.1.1309.0919" targetFramework="net45" />
|
||||
<package id="Newtonsoft.Json" version="10.0.2" targetFramework="net45" />
|
||||
<package id="NUnit" version="2.6.2" targetFramework="net45" />
|
||||
<package id="NUnitTestAdapter" version="2.1.1" targetFramework="net45" />
|
||||
<package id="Owin" version="1.0" targetFramework="net45" />
|
||||
<package id="Selenium.WebDriver" version="2.32.0" targetFramework="net45" />
|
||||
<package id="semver" version="1.1.2" targetFramework="net45" />
|
||||
|
||||
@@ -382,6 +382,9 @@ module.exports = function (grunt) {
|
||||
html: {
|
||||
files: ['src/views/**/*.html', 'src/*.html'],
|
||||
tasks: ['watch-html', 'timestamp']
|
||||
},
|
||||
options: {
|
||||
interval: 500
|
||||
}
|
||||
},
|
||||
|
||||
|
||||
219
src/Umbraco.Web.UI.Client/lib/tinymce/langs/da.js
Normal file
219
src/Umbraco.Web.UI.Client/lib/tinymce/langs/da.js
Normal file
@@ -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"
|
||||
});
|
||||
219
src/Umbraco.Web.UI.Client/lib/tinymce/langs/de.js
Normal file
219
src/Umbraco.Web.UI.Client/lib/tinymce/langs/de.js
Normal file
@@ -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"
|
||||
});
|
||||
1
src/Umbraco.Web.UI.Client/lib/tinymce/langs/en.js
Normal file
1
src/Umbraco.Web.UI.Client/lib/tinymce/langs/en.js
Normal file
File diff suppressed because one or more lines are too long
1
src/Umbraco.Web.UI.Client/lib/tinymce/langs/en_us.js
Normal file
1
src/Umbraco.Web.UI.Client/lib/tinymce/langs/en_us.js
Normal file
File diff suppressed because one or more lines are too long
219
src/Umbraco.Web.UI.Client/lib/tinymce/langs/fi.js
Normal file
219
src/Umbraco.Web.UI.Client/lib/tinymce/langs/fi.js
Normal file
@@ -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"
|
||||
});
|
||||
1
src/Umbraco.Web.UI.Client/lib/tinymce/langs/fr.js
Normal file
1
src/Umbraco.Web.UI.Client/lib/tinymce/langs/fr.js
Normal file
File diff suppressed because one or more lines are too long
1
src/Umbraco.Web.UI.Client/lib/tinymce/langs/he.js
Normal file
1
src/Umbraco.Web.UI.Client/lib/tinymce/langs/he.js
Normal file
File diff suppressed because one or more lines are too long
219
src/Umbraco.Web.UI.Client/lib/tinymce/langs/it.js
Normal file
219
src/Umbraco.Web.UI.Client/lib/tinymce/langs/it.js
Normal file
@@ -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"
|
||||
});
|
||||
219
src/Umbraco.Web.UI.Client/lib/tinymce/langs/ja.js
Normal file
219
src/Umbraco.Web.UI.Client/lib/tinymce/langs/ja.js
Normal file
@@ -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"
|
||||
});
|
||||
219
src/Umbraco.Web.UI.Client/lib/tinymce/langs/nl.js
Normal file
219
src/Umbraco.Web.UI.Client/lib/tinymce/langs/nl.js
Normal file
@@ -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"
|
||||
});
|
||||
1
src/Umbraco.Web.UI.Client/lib/tinymce/langs/no.js
Normal file
1
src/Umbraco.Web.UI.Client/lib/tinymce/langs/no.js
Normal file
File diff suppressed because one or more lines are too long
219
src/Umbraco.Web.UI.Client/lib/tinymce/langs/pl.js
Normal file
219
src/Umbraco.Web.UI.Client/lib/tinymce/langs/pl.js
Normal file
@@ -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"
|
||||
});
|
||||
1
src/Umbraco.Web.UI.Client/lib/tinymce/langs/pt.js
Normal file
1
src/Umbraco.Web.UI.Client/lib/tinymce/langs/pt.js
Normal file
File diff suppressed because one or more lines are too long
219
src/Umbraco.Web.UI.Client/lib/tinymce/langs/ru.js
Normal file
219
src/Umbraco.Web.UI.Client/lib/tinymce/langs/ru.js
Normal file
@@ -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"
|
||||
});
|
||||
1
src/Umbraco.Web.UI.Client/lib/tinymce/langs/sv.js
Normal file
1
src/Umbraco.Web.UI.Client/lib/tinymce/langs/sv.js
Normal file
File diff suppressed because one or more lines are too long
1
src/Umbraco.Web.UI.Client/lib/tinymce/langs/zh.js
Normal file
1
src/Umbraco.Web.UI.Client/lib/tinymce/langs/zh.js
Normal file
File diff suppressed because one or more lines are too long
@@ -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'
|
||||
});
|
||||
@@ -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'
|
||||
});
|
||||
@@ -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'
|
||||
});
|
||||
@@ -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'
|
||||
});
|
||||
@@ -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'
|
||||
});
|
||||
@@ -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'
|
||||
});
|
||||
@@ -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'
|
||||
});
|
||||
@@ -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'
|
||||
});
|
||||
@@ -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'
|
||||
});
|
||||
@@ -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'
|
||||
});
|
||||
@@ -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'
|
||||
});
|
||||
@@ -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'
|
||||
});
|
||||
@@ -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'
|
||||
});
|
||||
@@ -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'
|
||||
});
|
||||
@@ -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'
|
||||
});
|
||||
@@ -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
|
||||
*/
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
Binary file not shown.
|
Before Width: | Height: | Size: 273 KiB After Width: | Height: | Size: 310 KiB |
@@ -255,7 +255,8 @@ Use this directive to construct a header inside the main editor window.
|
||||
description: "=",
|
||||
hideDescription: "@",
|
||||
descriptionLocked: "@",
|
||||
navigation: "="
|
||||
navigation: "=",
|
||||
key: "="
|
||||
},
|
||||
link: link
|
||||
};
|
||||
|
||||
@@ -105,14 +105,14 @@ angular.module("umbraco.directives")
|
||||
});
|
||||
|
||||
//// INIT /////
|
||||
$image.load(function(){
|
||||
$timeout(function(){
|
||||
setDimensions();
|
||||
scope.loaded = true;
|
||||
if (scope.onImageLoaded) {
|
||||
scope.onImageLoaded();
|
||||
}
|
||||
});
|
||||
$image.load(function() {
|
||||
$timeout(function() {
|
||||
setDimensions();
|
||||
scope.loaded = true;
|
||||
if (angular.isFunction(scope.onImageLoaded)) {
|
||||
scope.onImageLoaded();
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
$(window).on('resize.umbImageGravity', function(){
|
||||
|
||||
@@ -134,25 +134,42 @@ Use this directive to generate a thumbnail grid of media items.
|
||||
}
|
||||
|
||||
function setItemData(item) {
|
||||
item.isFolder = !mediaHelper.hasFilePropertyType(item);
|
||||
|
||||
// check if item is a folder
|
||||
if(item.image) {
|
||||
// if is has an image path, it is not a folder
|
||||
item.isFolder = false;
|
||||
} else {
|
||||
item.isFolder = !mediaHelper.hasFilePropertyType(item);
|
||||
}
|
||||
|
||||
if (!item.isFolder) {
|
||||
item.thumbnail = mediaHelper.resolveFile(item, true);
|
||||
item.image = mediaHelper.resolveFile(item, false);
|
||||
|
||||
// handle entity
|
||||
if(item.image) {
|
||||
item.thumbnail = mediaHelper.resolveFileFromEntity(item, true);
|
||||
item.extension = mediaHelper.getFileExtension(item.image);
|
||||
// handle full media object
|
||||
} else {
|
||||
item.thumbnail = mediaHelper.resolveFile(item, true);
|
||||
item.image = mediaHelper.resolveFile(item, false);
|
||||
|
||||
var fileProp = _.find(item.properties, function (v) {
|
||||
return (v.alias === "umbracoFile");
|
||||
});
|
||||
|
||||
var fileProp = _.find(item.properties, function (v) {
|
||||
return (v.alias === "umbracoFile");
|
||||
});
|
||||
if (fileProp && fileProp.value) {
|
||||
item.file = fileProp.value;
|
||||
}
|
||||
|
||||
if (fileProp && fileProp.value) {
|
||||
item.file = fileProp.value;
|
||||
}
|
||||
var extensionProp = _.find(item.properties, function (v) {
|
||||
return (v.alias === "umbracoExtension");
|
||||
});
|
||||
|
||||
var extensionProp = _.find(item.properties, function (v) {
|
||||
return (v.alias === "umbracoExtension");
|
||||
});
|
||||
if (extensionProp && extensionProp.value) {
|
||||
item.extension = extensionProp.value;
|
||||
}
|
||||
|
||||
if (extensionProp && extensionProp.value) {
|
||||
item.extension = extensionProp.value;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user