Merge branch 'dev-v7.7' into user-group-permissions

# Conflicts:
#	src/Umbraco.Core/Persistence/Migrations/Initial/BaseDataCreation.cs
#	src/Umbraco.Tests/Services/UserServiceTests.cs
#	src/Umbraco.Web.UI.Client/src/common/services/util.service.js
#	src/Umbraco.Web.UI/config/trees.config
#	src/Umbraco.Web/Umbraco.Web.csproj
This commit is contained in:
Shannon
2017-06-23 16:37:56 +10:00
143 changed files with 5109 additions and 1214 deletions
+6 -6
View File
@@ -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
{
+6 -1
View File
@@ -56,7 +56,12 @@
/// <summary>
/// alias for the content tree.
/// </summary>
public const string Content = "content";
public const string Content = "content";
/// <summary>
/// alias for the content blueprint tree.
/// </summary>
public const string ContentBlueprints = "contentBlueprints";
/// <summary>
/// alias for the member tree.
+21 -1
View File
@@ -68,12 +68,22 @@ namespace Umbraco.Core
/// Guid for a Document object.
/// </summary>
public const string Document = "C66BA18E-EAF3-4CFF-8A22-41B16D66A972";
/// <summary>
/// Guid for a Document object.
/// </summary>
public static readonly Guid DocumentGuid = new Guid(Document);
/// <summary>
/// Guid for a Document Blueprint object.
/// </summary>
public const string DocumentBlueprint = "6EBEF410-03AA-48CF-A792-E1C1CB087ACA";
/// <summary>
/// Guid for a Document object.
/// </summary>
public static readonly Guid DocumentBlueprintGuid = new Guid(DocumentBlueprint);
/// <summary>
/// Guid for a Document Type object.
/// </summary>
@@ -212,6 +222,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);
}
}
}
+2
View File
@@ -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"
+16 -1
View File
@@ -38,6 +38,14 @@ namespace Umbraco.Core.Models
[UmbracoUdiType(Constants.UdiEntityType.Document)]
Document,
/// <summary>
/// Document
/// </summary>
[UmbracoObjectType(Constants.ObjectTypes.DocumentBlueprint, typeof(IContent))]
[FriendlyName("DocumentBlueprint")]
[UmbracoUdiType(Constants.UdiEntityType.DocumentBluePrint)]
DocumentBlueprint,
/// <summary>
/// Media
/// </summary>
@@ -178,6 +186,13 @@ namespace Umbraco.Core.Models
/// </summary>
[UmbracoObjectType(Constants.ObjectTypes.FormsDataSource)]
[FriendlyName("DataSource")]
FormsDataSource
FormsDataSource,
/// <summary>
/// Language
/// </summary>
[UmbracoObjectType(Constants.ObjectTypes.Language)]
[FriendlyName("Language")]
Language
}
}
@@ -174,9 +174,9 @@ namespace Umbraco.Core.Persistence.Migrations.Initial
private void CreateUmbracoUserGroupData()
{
_database.Insert("umbracoUserGroup", "id", false, new UserGroupDto { Id = 1, StartMediaId = null, StartContentId = null, Alias = Constants.Security.AdminGroupAlias, Name = "Administrators", DefaultPermissions = "CADMOSKTPIURZ:5F7", CreateDate = DateTime.Now, UpdateDate = DateTime.Now, Icon = "icon-medal" });
_database.Insert("umbracoUserGroup", "id", false, new UserGroupDto { Id = 1, StartMediaId = null, StartContentId = null, Alias = Constants.Security.AdminGroupAlias, Name = "Administrators", DefaultPermissions = "CADMOSKTPIURZ:5F7ï", CreateDate = DateTime.Now, UpdateDate = DateTime.Now, Icon = "icon-medal" });
_database.Insert("umbracoUserGroup", "id", false, new UserGroupDto { Id = 2, StartMediaId = null, StartContentId = null, Alias = "writer", Name = "Writers", DefaultPermissions = "CAH:F", CreateDate = DateTime.Now, UpdateDate = DateTime.Now, Icon = "icon-edit" });
_database.Insert("umbracoUserGroup", "id", false, new UserGroupDto { Id = 3, StartMediaId = null, StartContentId = null, Alias = "editor", Name = "Editors", DefaultPermissions = "CADMOSKTPUZ:5F", CreateDate = DateTime.Now, UpdateDate = DateTime.Now, Icon = "icon-tools" });
_database.Insert("umbracoUserGroup", "id", false, new UserGroupDto { Id = 3, StartMediaId = null, StartContentId = null, Alias = "editor", Name = "Editors", DefaultPermissions = "CADMOSKTPUZ:5Fï", CreateDate = DateTime.Now, UpdateDate = DateTime.Now, Icon = "icon-tools" });
_database.Insert("umbracoUserGroup", "id", false, new UserGroupDto { Id = 4, StartMediaId = null, StartContentId = null, Alias = "translator", Name = "Translators", DefaultPermissions = "AF", CreateDate = DateTime.Now, UpdateDate = DateTime.Now, Icon = "icon-globe" });
}
@@ -20,6 +20,28 @@ using Umbraco.Core.Persistence.UnitOfWork;
namespace Umbraco.Core.Persistence.Repositories
{
/// <summary>
/// Override the base content repository so we can change the node object type
/// </summary>
/// <remarks>
/// It would be nicer if we could separate most of this down into a smaller version of the ContentRepository class, however to do that
/// requires quite a lot of work since we'd need to re-organize the interhitance quite a lot or create a helper class to perform a lot of the underlying logic.
///
/// TODO: Create a helper method to conain most of the underlying logic for the ContentRepository
/// </remarks>
internal class ContentBlueprintRepository : ContentRepository
{
public ContentBlueprintRepository(IScopeUnitOfWork work, CacheHelper cacheHelper, ILogger logger, ISqlSyntaxProvider syntaxProvider, IContentTypeRepository contentTypeRepository, ITemplateRepository templateRepository, ITagRepository tagRepository, IContentSection contentSection) : base(work, cacheHelper, logger, syntaxProvider, contentTypeRepository, templateRepository, tagRepository, contentSection)
{
}
protected override Guid NodeObjectTypeId
{
get { return Constants.ObjectTypes.DocumentBlueprintGuid; }
}
}
/// <summary>
/// Represents a repository for doing CRUD operations for <see cref="IContent"/>
/// </summary>
@@ -201,7 +223,7 @@ namespace Umbraco.Core.Persistence.Repositories
protected override Guid NodeObjectTypeId
{
get { return new Guid(Constants.ObjectTypes.Document); }
get { return Constants.ObjectTypes.DocumentGuid; }
}
#endregion
@@ -267,7 +289,7 @@ namespace Umbraco.Core.Persistence.Repositories
//now delete the items that shouldn't be there
var sqlAllIds = translate(0, GetBaseQuery(BaseQueryType.Ids));
var allContentIds = Database.Fetch<int>(sqlAllIds);
var docObjectType = Guid.Parse(Constants.ObjectTypes.Document);
var docObjectType = NodeObjectTypeId;
var xmlIdsQuery = new Sql()
.Select("DISTINCT cmsContentXml.nodeId")
.From<ContentXmlDto>(SqlSyntax)
@@ -636,9 +658,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);
}
@@ -743,6 +768,18 @@ namespace Umbraco.Core.Persistence.Repositories
return ProcessQuery(translate(translatorFull), new PagingSqlQuery(translate(translatorIds)), true);
}
public IEnumerable<IContent> GetBlueprints(IQuery<IContent> query)
{
Func<SqlTranslator<IContent>, Sql> translate = t => t.Translate();
var sqlFull = GetBaseQuery(BaseQueryType.FullMultiple);
var translatorFull = new SqlTranslator<IContent>(sqlFull, query);
var sqlIds = GetBaseQuery(BaseQueryType.Ids);
var translatorIds = new SqlTranslator<IContent>(sqlIds, query);
return ProcessQuery(translate(translatorFull), new PagingSqlQuery(translate(translatorIds)), true);
}
/// <summary>
/// This builds the Xml document used for the XML cache
/// </summary>
@@ -786,7 +823,7 @@ order by umbracoNode.{2}, umbracoNode.parentID, umbracoNode.sortOrder",
XmlElement last = null;
//NOTE: Query creates a reader - does not load all into memory
foreach (var row in Database.Query<dynamic>(sql, new { type = new Guid(Constants.ObjectTypes.Document) }))
foreach (var row in Database.Query<dynamic>(sql, new { type = NodeObjectTypeId }))
{
string parentId = ((int)row.parentID).ToInvariantString();
string xml = row.xml;
@@ -110,6 +110,19 @@ namespace Umbraco.Core.Persistence.Repositories
return Database.Fetch<string>(sql);
}
public IEnumerable<int> GetAllContentTypeIds(string[] aliases)
{
if (aliases.Length == 0) return Enumerable.Empty<int>();
var sql = new Sql().Select("cmsContentType.nodeId")
.From<ContentTypeDto>(SqlSyntax)
.InnerJoin<NodeDto>(SqlSyntax)
.On<ContentTypeDto, NodeDto>(SqlSyntax, dto => dto.NodeId, dto => dto.NodeId)
.Where<ContentTypeDto>(dto => aliases.Contains(dto.Alias), SqlSyntax);
return Database.Fetch<int>(sql);
}
protected override Sql GetBaseQuery(bool isCount)
{
var sql = new Sql();
@@ -48,8 +48,8 @@ namespace Umbraco.Core.Persistence.Repositories
public IEnumerable<IUmbracoEntity> GetPagedResultsByQuery(IQuery<IUmbracoEntity> query, Guid objectTypeId, long pageIndex, int pageSize, out long totalRecords,
string orderBy, Direction orderDirection, IQuery<IUmbracoEntity> filter = null)
{
bool isContent = objectTypeId == new Guid(Constants.ObjectTypes.Document);
bool isMedia = objectTypeId == new Guid(Constants.ObjectTypes.Media);
bool isContent = objectTypeId == Constants.ObjectTypes.DocumentGuid || objectTypeId == Constants.ObjectTypes.DocumentBlueprintGuid;
bool isMedia = objectTypeId == Constants.ObjectTypes.MediaGuid;
var factory = new UmbracoEntityFactory();
var sqlClause = GetBaseWhere(GetBase, isContent, isMedia, sql =>
@@ -178,8 +178,8 @@ namespace Umbraco.Core.Persistence.Repositories
public IUmbracoEntity GetByKey(Guid key, Guid objectTypeId)
{
bool isContent = objectTypeId == new Guid(Constants.ObjectTypes.Document);
bool isMedia = objectTypeId == new Guid(Constants.ObjectTypes.Media);
bool isContent = objectTypeId == Constants.ObjectTypes.DocumentGuid || objectTypeId == Constants.ObjectTypes.DocumentBlueprintGuid;
bool isMedia = objectTypeId == Constants.ObjectTypes.MediaGuid;
var sql = GetFullSqlForEntityType(key, isContent, isMedia, objectTypeId);
@@ -225,8 +225,8 @@ namespace Umbraco.Core.Persistence.Repositories
public virtual IUmbracoEntity Get(int id, Guid objectTypeId)
{
bool isContent = objectTypeId == new Guid(Constants.ObjectTypes.Document);
bool isMedia = objectTypeId == new Guid(Constants.ObjectTypes.Media);
bool isContent = objectTypeId == Constants.ObjectTypes.DocumentGuid || objectTypeId == Constants.ObjectTypes.DocumentBlueprintGuid;
bool isMedia = objectTypeId == Constants.ObjectTypes.MediaGuid;
var sql = GetFullSqlForEntityType(id, isContent, isMedia, objectTypeId);
@@ -280,8 +280,8 @@ namespace Umbraco.Core.Persistence.Repositories
private IEnumerable<IUmbracoEntity> PerformGetAll(Guid objectTypeId, Action<Sql> filter = null)
{
bool isContent = objectTypeId == new Guid(Constants.ObjectTypes.Document);
bool isMedia = objectTypeId == new Guid(Constants.ObjectTypes.Media);
bool isContent = objectTypeId == Constants.ObjectTypes.DocumentGuid || objectTypeId == Constants.ObjectTypes.DocumentBlueprintGuid;
bool isMedia = objectTypeId == Constants.ObjectTypes.MediaGuid;
var sql = GetFullSqlForEntityType(isContent, isMedia, objectTypeId, filter);
var factory = new UmbracoEntityFactory();
@@ -324,8 +324,8 @@ namespace Umbraco.Core.Persistence.Repositories
public virtual IEnumerable<IUmbracoEntity> GetByQuery(IQuery<IUmbracoEntity> query, Guid objectTypeId)
{
bool isContent = objectTypeId == new Guid(Constants.ObjectTypes.Document);
bool isMedia = objectTypeId == new Guid(Constants.ObjectTypes.Media);
bool isContent = objectTypeId == Constants.ObjectTypes.DocumentGuid || objectTypeId == Constants.ObjectTypes.DocumentBlueprintGuid;
bool isMedia = objectTypeId == Constants.ObjectTypes.MediaGuid;
var sqlClause = GetBaseWhere(GetBase, isContent, isMedia, null, objectTypeId);
@@ -9,7 +9,7 @@ using Umbraco.Core.Persistence.DatabaseModelDefinitions;
using Umbraco.Core.Persistence.Querying;
namespace Umbraco.Core.Persistence.Repositories
{
{
public interface IContentRepository : IRepositoryVersionable<int, IContent>, IRecycleBinRepository<IContent>, IDeleteMediaFilesRepository
{
@@ -47,5 +47,7 @@ namespace Umbraco.Core.Persistence.Repositories
/// <returns>The original alias with a number appended to it, so that it is unique.</returns>
/// /// <remarks>Unique accross all content, media and member types.</remarks>
string GetUniqueAlias(string alias);
IEnumerable<int> GetAllContentTypeIds(string[] aliases);
}
}
@@ -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("umbracoUserGroup2NodePermission", "nodeId"),
@"DELETE FROM umbracoAccessRule WHERE umbracoAccessRule.accessId IN (
@@ -52,25 +52,7 @@ namespace Umbraco.Core.Persistence.Repositories
/// </summary>
/// <param name="id">Id of the <see cref="TEntity"/> to retrieve versions from</param>
/// <returns>An enumerable list of the same <see cref="TEntity"/> object with different versions</returns>
public virtual IEnumerable<TEntity> GetAllVersions(int id)
{
var sql = new Sql();
sql.Select("*")
.From<ContentVersionDto>(SqlSyntax)
.InnerJoin<ContentDto>(SqlSyntax)
.On<ContentVersionDto, ContentDto>(SqlSyntax, left => left.NodeId, right => right.NodeId)
.InnerJoin<NodeDto>(SqlSyntax)
.On<ContentDto, NodeDto>(SqlSyntax, left => left.NodeId, right => right.NodeId)
.Where<NodeDto>(x => x.NodeObjectType == NodeObjectTypeId)
.Where<NodeDto>(x => x.NodeId == id)
.OrderByDescending<ContentVersionDto>(x => x.VersionDate, SqlSyntax);
var dtos = Database.Fetch<ContentVersionDto, ContentDto, NodeDto>(sql);
foreach (var dto in dtos)
{
yield return GetByVersion(dto.VersionId);
}
}
public abstract IEnumerable<TEntity> GetAllVersions(int id);
/// <summary>
/// Gets a list of all version Ids for the given content item ordered so latest is first
@@ -145,6 +145,23 @@ namespace Umbraco.Core.Persistence
};
}
public virtual IContentRepository CreateContentBlueprintRepository(IScopeUnitOfWork uow)
{
return new ContentBlueprintRepository(
uow,
_cacheHelper,
_logger,
_sqlSyntax,
CreateContentTypeRepository(uow),
CreateTemplateRepository(uow),
CreateTagRepository(uow),
_settings.Content)
{
//duplicates are allowed
EnsureUniqueNaming = false
};
}
public virtual IContentTypeRepository CreateContentTypeRepository(IScopeUnitOfWork uow)
{
return new ContentTypeRepository(
+93 -4
View File
@@ -177,8 +177,7 @@ namespace Umbraco.Core.Services
content.WriterId = userId;
uow.Events.Dispatch(Created, this, new NewEventArgs<IContent>(content, false, contentTypeAlias, parentId));
Audit(uow, AuditType.New, string.Format("Content '{0}' was created", name), content.CreatorId, content.Id);
uow.Commit();
}
@@ -220,8 +219,7 @@ namespace Umbraco.Core.Services
content.WriterId = userId;
uow.Events.Dispatch(Created, this, new NewEventArgs<IContent>(content, false, contentTypeAlias, parent));
Audit(uow, AuditType.New, string.Format("Content '{0}' was created", name), content.CreatorId, content.Id);
uow.Commit();
}
@@ -1158,6 +1156,82 @@ namespace Umbraco.Core.Services
return ((IContentServiceOperations)this).SaveAndPublish(content, userId, raiseEvents);
}
public IContent GetBlueprintById(int id)
{
using (var uow = UowProvider.GetUnitOfWork(readOnly: true))
{
var repository = RepositoryFactory.CreateContentBlueprintRepository(uow);
return repository.Get(id);
}
}
public void SaveBlueprint(IContent content, int userId = 0)
{
//always ensure the blueprint is at the root
content.ParentId = -1;
using (new WriteLock(Locker))
{
using (var uow = UowProvider.GetUnitOfWork())
{
if (string.IsNullOrWhiteSpace(content.Name))
{
throw new ArgumentException("Cannot save content blueprint with empty name.");
}
var repository = RepositoryFactory.CreateContentBlueprintRepository(uow);
if (content.HasIdentity == false)
{
content.CreatorId = userId;
}
content.WriterId = userId;
repository.AddOrUpdate(content);
uow.Commit();
}
}
}
public void DeleteBlueprint(IContent content, int userId = 0)
{
using (new WriteLock(Locker))
{
using (var uow = UowProvider.GetUnitOfWork())
{
var repository = RepositoryFactory.CreateContentBlueprintRepository(uow);
repository.Delete(content);
uow.Commit();
}
}
}
public IContent CreateContentFromBlueprint(IContent blueprint, string name, int userId = 0)
{
if (blueprint == null) throw new ArgumentNullException("blueprint");
var contentType = blueprint.ContentType;
var content = new Content(name, -1, contentType);
content.Path = string.Concat(content.ParentId.ToString(), ",", content.Id);
using (var uow = UowProvider.GetUnitOfWork())
{
content.CreatorId = userId;
content.WriterId = userId;
//Now we need to map all of the properties over!
foreach (var property in blueprint.Properties)
{
content.SetValue(property.Alias, property.Value);
}
uow.Commit();
}
return content;
}
/// <summary>
/// Saves a single <see cref="IContent"/> object
/// </summary>
@@ -1790,6 +1864,21 @@ namespace Umbraco.Core.Services
return true;
}
public IEnumerable<IContent> GetBlueprintsForContentTypes(params int[] documentTypeIds)
{
using (var uow = UowProvider.GetUnitOfWork(readOnly: true))
{
var repository = RepositoryFactory.CreateContentBlueprintRepository(uow);
var query = new Query<IContent>();
if (documentTypeIds.Length > 0)
{
query.Where(x => documentTypeIds.Contains(x.ContentTypeId));
}
return repository.GetByQuery(query);
}
}
/// <summary>
/// Gets paged content descendants as XML by path
/// </summary>
@@ -367,6 +367,15 @@ namespace Umbraco.Core.Services
}
}
public IEnumerable<int> GetAllContentTypeIds(string[] aliases)
{
using (var uow = UowProvider.GetUnitOfWork(readOnly: true))
{
var repository = RepositoryFactory.CreateContentTypeRepository(uow);
return repository.GetAllContentTypeIds(aliases);
}
}
/// <summary>
/// Copies a content type as a child under the specified parent if specified (otherwise to the root)
/// </summary>
+10 -4
View File
@@ -16,10 +16,10 @@ namespace Umbraco.Core.Services
/// explicitly. These methods will replace the normal ones in IContentService in v8 and this will be removed.
/// </summary>
public interface IContentServiceOperations
{
//TODO: Remove this class in v8
//TODO: There's probably more that needs to be added like the EmptyRecycleBin, etc...
{
//TODO: Remove this class in v8
//TODO: There's probably more that needs to be added like the EmptyRecycleBin, etc...
/// <summary>
/// Saves a single <see cref="IContent"/> object
@@ -96,6 +96,12 @@ namespace Umbraco.Core.Services
/// </summary>
public interface IContentService : IContentServiceBase
{
IEnumerable<IContent> GetBlueprintsForContentTypes(params int[] documentTypeIds);
IContent GetBlueprintById(int id);
void SaveBlueprint(IContent content, int userId = 0);
void DeleteBlueprint(IContent content, int userId = 0);
IContent CreateContentFromBlueprint(IContent blueprint, string name, int userId = 0);
/// <summary>
/// Gets all XML entries found in the cmsContentXml table based on the given path
/// </summary>
@@ -61,6 +61,13 @@ namespace Umbraco.Core.Services
/// </param>
/// <returns></returns>
IEnumerable<string> GetAllContentTypeAliases(params Guid[] objectTypes);
/// <summary>
/// Returns all content type Ids for the aliases given
/// </summary>
/// <param name="aliases"></param>
/// <returns></returns>
IEnumerable<int> GetAllContentTypeIds(string[] aliases);
/// <summary>
/// Copies a content type as a child under the specified parent if specified (otherwise to the root)
+10 -1
View File
@@ -1,5 +1,4 @@
using System;
using System.Collections.Generic;
using Umbraco.Core.Models;
namespace Umbraco.Core
@@ -24,6 +23,10 @@ namespace Umbraco.Core
[UdiType(UdiType.GuidUdi)]
public const string Document = "document";
[UdiType(UdiType.GuidUdi)]
public const string DocumentBluePrint = "document-blueprint";
[UdiType(UdiType.GuidUdi)]
public const string Media = "media";
[UdiType(UdiType.GuidUdi)]
@@ -84,6 +87,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 +128,8 @@ namespace Umbraco.Core
return FormsPreValue;
case UmbracoObjectTypes.FormsDataSource:
return FormsDataSource;
case UmbracoObjectTypes.Language:
return Language;
}
throw new NotSupportedException(string.Format("UmbracoObjectType \"{0}\" does not have a matching EntityType.", umbracoObjectType));
}
@@ -165,6 +172,8 @@ namespace Umbraco.Core
return UmbracoObjectTypes.FormsPreValue;
case FormsDataSource:
return UmbracoObjectTypes.FormsDataSource;
case Language:
return UmbracoObjectTypes.Language;
}
throw new NotSupportedException(
string.Format("EntityType \"{0}\" does not have a matching UmbracoObjectType.", entityType));
+16 -2
View File
@@ -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");
@@ -246,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>
@@ -279,7 +290,7 @@ namespace Umbraco.Core
var dataTypeComposition = entity as IDataTypeDefinition;
if (dataTypeComposition != null) return dataTypeComposition.GetUdi();
var container = entity as Umbraco.Core.Models.EntityContainer;
var container = entity as EntityContainer;
if (container != null) return container.GetUdi();
var media = entity as IMedia;
@@ -315,6 +326,9 @@ namespace Umbraco.Core
var relationType = entity as IRelationType;
if (relationType != null) return relationType.GetUdi();
var language = entity as ILanguage;
if (language != null) return language.GetUdi();
throw new NotSupportedException(string.Format("Entity type {0} is not supported.", entity.GetType().FullName));
}
}
@@ -301,7 +301,7 @@ AnotherContentFinder
public void Resolves_Actions()
{
var actions = _manager.ResolveActions();
Assert.AreEqual(37, actions.Count());
Assert.AreEqual(38, actions.Count());
}
[Test]
@@ -46,11 +46,112 @@ namespace Umbraco.Tests.Services
VersionableRepositoryBase<int, IContent>.ThrowOnWarning = false;
base.TearDown();
}
//TODO Add test to verify there is only ONE newest document/content in cmsDocument table after updating.
}
//TODO Add test to verify there is only ONE newest document/content in cmsDocument table after updating.
//TODO Add test to delete specific version (with and without deleting prior versions) and versions by date.
[Test]
public void Create_Blueprint()
{
var contentService = ServiceContext.ContentService;
var contentTypeService = ServiceContext.ContentTypeService;
var contentType = MockedContentTypes.CreateTextpageContentType();
contentTypeService.Save(contentType);
var blueprint = MockedContent.CreateTextpageContent(contentType, "hello", -1);
blueprint.SetValue("title", "blueprint 1");
blueprint.SetValue("bodyText", "blueprint 2");
blueprint.SetValue("keywords", "blueprint 3");
blueprint.SetValue("description", "blueprint 4");
contentService.SaveBlueprint(blueprint);
var found = contentService.GetBlueprintsForContentTypes().ToArray();
Assert.AreEqual(1, found.Length);
//ensures it's not found by normal content
var contentFound = contentService.GetById(found[0].Id);
Assert.IsNull(contentFound);
}
[Test]
public void Delete_Blueprint()
{
var contentService = ServiceContext.ContentService;
var contentTypeService = ServiceContext.ContentTypeService;
var contentType = MockedContentTypes.CreateTextpageContentType();
contentTypeService.Save(contentType);
var blueprint = MockedContent.CreateTextpageContent(contentType, "hello", -1);
blueprint.SetValue("title", "blueprint 1");
blueprint.SetValue("bodyText", "blueprint 2");
blueprint.SetValue("keywords", "blueprint 3");
blueprint.SetValue("description", "blueprint 4");
contentService.SaveBlueprint(blueprint);
contentService.DeleteBlueprint(blueprint);
var found = contentService.GetBlueprintsForContentTypes().ToArray();
Assert.AreEqual(0, found.Length);
}
[Test]
public void Create_Content_From_Blueprint()
{
var contentService = ServiceContext.ContentService;
var contentTypeService = ServiceContext.ContentTypeService;
var contentType = MockedContentTypes.CreateTextpageContentType();
contentTypeService.Save(contentType);
var blueprint = MockedContent.CreateTextpageContent(contentType, "hello", -1);
blueprint.SetValue("title", "blueprint 1");
blueprint.SetValue("bodyText", "blueprint 2");
blueprint.SetValue("keywords", "blueprint 3");
blueprint.SetValue("description", "blueprint 4");
contentService.SaveBlueprint(blueprint);
var fromBlueprint = contentService.CreateContentFromBlueprint(blueprint, "hello world");
contentService.Save(fromBlueprint);
Assert.IsTrue(fromBlueprint.HasIdentity);
Assert.AreEqual("blueprint 1", fromBlueprint.Properties["title"].Value);
Assert.AreEqual("blueprint 2", fromBlueprint.Properties["bodyText"].Value);
Assert.AreEqual("blueprint 3", fromBlueprint.Properties["keywords"].Value);
Assert.AreEqual("blueprint 4", fromBlueprint.Properties["description"].Value);
}
[Test]
public void Get_All_Blueprints()
{
var contentService = ServiceContext.ContentService;
var contentTypeService = ServiceContext.ContentTypeService;
var ct1 = MockedContentTypes.CreateTextpageContentType("ct1");
contentTypeService.Save(ct1);
var ct2 = MockedContentTypes.CreateTextpageContentType("ct2");
contentTypeService.Save(ct2);
for (int i = 0; i < 10; i++)
{
var blueprint = MockedContent.CreateTextpageContent(i % 2 == 0 ? ct1 : ct2, "hello" + i, -1);
contentService.SaveBlueprint(blueprint);
}
var found = contentService.GetBlueprintsForContentTypes().ToArray();
Assert.AreEqual(10, found.Length);
found = contentService.GetBlueprintsForContentTypes(ct1.Id).ToArray();
Assert.AreEqual(5, found.Length);
found = contentService.GetBlueprintsForContentTypes(ct2.Id).ToArray();
Assert.AreEqual(5, found.Length);
}
/// <summary>
/// Ensures that we don't unpublish all nodes when a node is deleted that has an invalid path of -1
+12 -12
View File
@@ -59,9 +59,9 @@ namespace Umbraco.Tests.Services
//assert
Assert.AreEqual(3, permissions.Count());
Assert.AreEqual(17, permissions.ElementAt(0).AssignedPermissions.Length);
Assert.AreEqual(17, permissions.ElementAt(1).AssignedPermissions.Length);
Assert.AreEqual(17, permissions.ElementAt(2).AssignedPermissions.Length);
Assert.AreEqual(18, permissions.ElementAt(0).AssignedPermissions.Count());
Assert.AreEqual(18, permissions.ElementAt(1).AssignedPermissions.Count());
Assert.AreEqual(18, permissions.ElementAt(2).AssignedPermissions.Count());
}
[Test]
@@ -326,7 +326,7 @@ namespace Umbraco.Tests.Services
Assert.AreEqual(10, totalRecs);
Assert.AreEqual("test0", found.First().Username);
Assert.AreEqual("test1", found.Last().Username);
}
}
[Test]
public void Get_All_Paged_Users_For_Group()
@@ -558,15 +558,15 @@ namespace Umbraco.Tests.Services
Alias = "Group1",
Name = "Group 1"
};
userGroup1.AddAllowedSection("test");
userGroup1.AddAllowedSection("test");
var userGroup2 = new UserGroup
{
Alias = "Group2",
Name = "Group 2"
};
userGroup2.AddAllowedSection("test");
userGroup2.AddAllowedSection("test");
var userGroup3 = new UserGroup
{
Alias = "Group3",
@@ -711,10 +711,10 @@ namespace Umbraco.Tests.Services
Permissions = "ABCDEFGHIJ1234567".ToCharArray().Select(x => x.ToString())
};
userGroup.AddAllowedSection("content");
userGroup.AddAllowedSection("media");
ServiceContext.UserService.Save(userGroup);
userGroup.AddAllowedSection("content");
userGroup.AddAllowedSection("media");
ServiceContext.UserService.Save(userGroup);
return userGroup;
}
+3
View File
@@ -382,6 +382,9 @@ module.exports = function (grunt) {
html: {
files: ['src/views/**/*.html', 'src/*.html'],
tasks: ['watch-html', 'timestamp']
},
options: {
interval: 500
}
},
@@ -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"
});
@@ -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"
});
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -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"
});
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -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"
});
@@ -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&nbsp;\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"
});
@@ -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"
});
File diff suppressed because one or more lines are too long
@@ -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"
});
File diff suppressed because one or more lines are too long
@@ -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"
});
File diff suppressed because one or more lines are too long
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
*/
@@ -0,0 +1,252 @@
(function () {
'use strict';
function ContentEditController($rootScope, $scope, $routeParams, $q, $timeout, $window, appState, contentResource, entityResource, navigationService, notificationsService, angularHelper, serverValidationManager, contentEditingHelper, treeService, fileManager, formHelper, umbRequestHelper, keyboardService, umbModelMapper, editorState, $http) {
//setup scope vars
$scope.defaultButton = null;
$scope.subButtons = [];
$scope.page = {};
$scope.page.loading = false;
$scope.page.menu = {};
$scope.page.menu.currentNode = null;
$scope.page.menu.currentSection = appState.getSectionState("currentSection");
$scope.page.listViewPath = null;
$scope.page.isNew = $scope.isNew ? true : false;
$scope.page.buttonGroupState = "init";
function init(content) {
var buttons = contentEditingHelper.configureContentEditorButtons({
create: $scope.page.isNew,
content: content,
methods: {
saveAndPublish: $scope.saveAndPublish,
sendToPublish: $scope.sendToPublish,
save: $scope.save,
unPublish: $scope.unPublish
}
});
$scope.defaultButton = buttons.defaultButton;
$scope.subButtons = buttons.subButtons;
editorState.set($scope.content);
//We fetch all ancestors of the node to generate the footer breadcrumb navigation
if (!$scope.page.isNew) {
if (content.parentId && content.parentId !== -1) {
entityResource.getAncestors(content.id, "document")
.then(function (anc) {
$scope.ancestors = anc;
});
}
}
}
/** Syncs the content item to it's tree node - this occurs on first load and after saving */
function syncTreeNode(content, path, initialLoad) {
if (!$scope.content.isChildOfListView) {
navigationService.syncTree({ tree: $scope.treeAlias, path: path.split(","), forceReload: initialLoad !== true }).then(function (syncArgs) {
$scope.page.menu.currentNode = syncArgs.node;
});
}
else if (initialLoad === true) {
//it's a child item, just sync the ui node to the parent
navigationService.syncTree({ tree: $scope.treeAlias, path: path.substring(0, path.lastIndexOf(",")).split(","), forceReload: initialLoad !== true });
//if this is a child of a list view and it's the initial load of the editor, we need to get the tree node
// from the server so that we can load in the actions menu.
umbRequestHelper.resourcePromise(
$http.get(content.treeNodeUrl),
'Failed to retrieve data for child node ' + content.id).then(function (node) {
$scope.page.menu.currentNode = node;
});
}
}
// This is a helper method to reduce the amount of code repitition for actions: Save, Publish, SendToPublish
function performSave(args) {
var deferred = $q.defer();
$scope.page.buttonGroupState = "busy";
contentEditingHelper.contentEditorPerformSave({
statusMessage: args.statusMessage,
saveMethod: args.saveMethod,
scope: $scope,
content: $scope.content,
action: args.action
}).then(function (data) {
//success
init($scope.content);
syncTreeNode($scope.content, data.path);
$scope.page.buttonGroupState = "success";
deferred.resolve(data);
}, function (err) {
//error
if (err) {
editorState.set($scope.content);
}
$scope.page.buttonGroupState = "error";
deferred.reject(err);
});
return deferred.promise;
}
function resetLastListPageNumber(content) {
// We're using rootScope to store the page number for list views, so if returning to the list
// we can restore the page. If we've moved on to edit a piece of content that's not the list or it's children
// we should remove this so as not to confuse if navigating to a different list
if (!content.isChildOfListView && !content.isContainer) {
$rootScope.lastListViewPageViewed = null;
}
}
if ($scope.page.isNew) {
$scope.page.loading = true;
//we are creating so get an empty content item
$scope.getScaffoldMethod()()
.then(function (data) {
$scope.content = data;
init($scope.content);
resetLastListPageNumber($scope.content);
$scope.page.loading = false;
});
}
else {
$scope.page.loading = true;
//we are editing so get the content item from the server
$scope.getMethod()($scope.contentId)
.then(function (data) {
$scope.content = data;
if (data.isChildOfListView && data.trashed === false) {
$scope.page.listViewPath = ($routeParams.page) ?
"/content/content/edit/" + data.parentId + "?page=" + $routeParams.page :
"/content/content/edit/" + data.parentId;
}
init($scope.content);
//in one particular special case, after we've created a new item we redirect back to the edit
// route but there might be server validation errors in the collection which we need to display
// after the redirect, so we will bind all subscriptions which will show the server validation errors
// if there are any and then clear them so the collection no longer persists them.
serverValidationManager.executeAndClearAllSubscriptions();
syncTreeNode($scope.content, data.path, true);
resetLastListPageNumber($scope.content);
$scope.page.loading = false;
});
}
$scope.unPublish = function () {
if (formHelper.submitForm({ scope: $scope, statusMessage: "Unpublishing...", skipValidation: true })) {
$scope.page.buttonGroupState = "busy";
contentResource.unPublish($scope.content.id)
.then(function (data) {
formHelper.resetForm({ scope: $scope, notifications: data.notifications });
contentEditingHelper.handleSuccessfulSave({
scope: $scope,
savedContent: data,
rebindCallback: contentEditingHelper.reBindChangedProperties($scope.content, data)
});
init($scope.content);
syncTreeNode($scope.content, data.path);
$scope.page.buttonGroupState = "success";
});
}
};
$scope.sendToPublish = function () {
return performSave({ saveMethod: contentResource.sendToPublish, statusMessage: "Sending...", action: "sendToPublish" });
};
$scope.saveAndPublish = function () {
return performSave({ saveMethod: contentResource.publish, statusMessage: "Publishing...", action: "publish" });
};
$scope.save = function () {
return performSave({ saveMethod: $scope.saveMethod(), statusMessage: "Saving...", action: "save" });
};
$scope.preview = function (content) {
if (!$scope.busy) {
// Chromes popup blocker will kick in if a window is opened
// outwith the initial scoped request. This trick will fix that.
//
var previewWindow = $window.open('preview/?id=' + content.id, 'umbpreview');
$scope.save().then(function (data) {
// Build the correct path so both /#/ and #/ work.
var redirect = Umbraco.Sys.ServerVariables.umbracoSettings.umbracoPath + '/preview/?id=' + data.id;
previewWindow.location.href = redirect;
});
}
};
}
function createDirective() {
var directive = {
restrict: 'E',
replace: true,
templateUrl: 'views/components/content/edit.html',
controller: 'Umbraco.Editors.Content.EditorDirectiveController',
scope: {
contentId: "=",
isNew: "=?",
treeAlias: "@",
page: "=?",
saveMethod: "&",
getMethod: "&",
getScaffoldMethod: "&?"
}
};
return directive;
}
angular.module('umbraco.directives').controller('Umbraco.Editors.Content.EditorDirectiveController', ContentEditController);
angular.module('umbraco.directives').directive('contentEditor', createDirective);
})();
@@ -1,4 +1,4 @@
angular.module("umbraco.directives").directive('nestedContentEditor', [
angular.module("umbraco.directives").directive('umbNestedContentEditor', [
function () {
@@ -86,7 +86,7 @@ Use this directive to generate a pagination.
(function() {
'use strict';
function PaginationDirective() {
function PaginationDirective(localizationService) {
function link(scope, el, attr, ctrl) {
@@ -123,12 +123,12 @@ Use this directive to generate a pagination.
//now, if the start is greater than 0 then '1' will not be displayed, so do the elipses thing
if (start > 0) {
scope.pagination.unshift({ name: "First", val: 1, isActive: false }, {val: "...",isActive: false});
scope.pagination.unshift({ name: localizationService.localize("general_first"), val: 1, isActive: false }, {val: "...",isActive: false});
}
//same for the end
if (start < maxIndex) {
scope.pagination.push({ val: "...", isActive: false }, { name: "Last", val: scope.totalPages, isActive: false });
scope.pagination.push({ val: "...", isActive: false }, { name: localizationService.localize("general_last"), val: scope.totalPages, isActive: false });
}
}
@@ -122,7 +122,7 @@
});
$scope.showReset = function () {
return $scope.config.hasPassword && $scope.config.enableReset;
return $scope.config.enableReset;
};
$scope.showOldPass = function () {
@@ -26,11 +26,9 @@
function contentResource($q, $http, umbDataFormatter, umbRequestHelper) {
/** internal method process the saving of data and post processing the result */
function saveContentItem(content, action, files) {
function saveContentItem(content, action, files, restApiUrl) {
return umbRequestHelper.postSaveContent({
restApiUrl: umbRequestHelper.getApiUrl(
"contentApiBaseUrl",
"PostSave"),
restApiUrl: restApiUrl,
content: content,
action: action,
files: files,
@@ -269,6 +267,16 @@ function contentResource($q, $http, umbDataFormatter, umbRequestHelper) {
'Failed to delete item ' + id);
},
deleteBlueprint: function (id) {
return umbRequestHelper.resourcePromise(
$http.post(
umbRequestHelper.getApiUrl(
"contentApiBaseUrl",
"DeleteBlueprint",
[{ id: id }])),
'Failed to delete blueprint ' + id);
},
/**
* @ngdoc method
* @name umbraco.resources.contentResource#getById
@@ -300,6 +308,16 @@ function contentResource($q, $http, umbDataFormatter, umbRequestHelper) {
'Failed to retrieve data for content id ' + id);
},
getBlueprintById: function (id) {
return umbRequestHelper.resourcePromise(
$http.get(
umbRequestHelper.getApiUrl(
"contentApiBaseUrl",
"GetBlueprintById",
[{ id: id }])),
'Failed to retrieve data for content id ' + id);
},
/**
* @ngdoc method
* @name umbraco.resources.contentResource#getByIds
@@ -381,6 +399,17 @@ function contentResource($q, $http, umbDataFormatter, umbRequestHelper) {
'Failed to retrieve data for empty content item type ' + alias);
},
getBlueprintScaffold: function (blueprintId) {
return umbRequestHelper.resourcePromise(
$http.get(
umbRequestHelper.getApiUrl(
"contentApiBaseUrl",
"GetEmpty",
[{ blueprintId: blueprintId }])),
'Failed to retrieve blueprint for id ' + blueprintId);
},
/**
* @ngdoc method
* @name umbraco.resources.contentResource#getNiceUrl
@@ -564,9 +593,18 @@ function contentResource($q, $http, umbDataFormatter, umbRequestHelper) {
*
*/
save: function (content, isNew, files) {
return saveContentItem(content, "save" + (isNew ? "New" : ""), files);
var endpoint = umbRequestHelper.getApiUrl(
"contentApiBaseUrl",
"PostSave");
return saveContentItem(content, "save" + (isNew ? "New" : ""), files, endpoint);
},
saveBlueprint: function (content, isNew, files) {
var endpoint = umbRequestHelper.getApiUrl(
"contentApiBaseUrl",
"PostSaveBlueprint");
return saveContentItem(content, "save" + (isNew ? "New" : ""), files, endpoint);
},
/**
* @ngdoc method
@@ -597,7 +635,10 @@ function contentResource($q, $http, umbDataFormatter, umbRequestHelper) {
*
*/
publish: function (content, isNew, files) {
return saveContentItem(content, "publish" + (isNew ? "New" : ""), files);
var endpoint = umbRequestHelper.getApiUrl(
"contentApiBaseUrl",
"PostSave");
return saveContentItem(content, "publish" + (isNew ? "New" : ""), files, endpoint);
},
@@ -628,7 +669,10 @@ function contentResource($q, $http, umbDataFormatter, umbRequestHelper) {
*
*/
sendToPublish: function (content, isNew, files) {
return saveContentItem(content, "sendPublish" + (isNew ? "New" : ""), files);
var endpoint = umbRequestHelper.getApiUrl(
"contentApiBaseUrl",
"PostSave");
return saveContentItem(content, "sendPublish" + (isNew ? "New" : ""), files, endpoint);
},
/**
@@ -665,6 +709,17 @@ function contentResource($q, $http, umbDataFormatter, umbRequestHelper) {
[{ id: id }])),
'Failed to publish content with id ' + id);
},
createBlueprintFromContent: function (contentId, name) {
return umbRequestHelper.resourcePromise(
$http.post(
umbRequestHelper.getApiUrl("contentApiBaseUrl", "CreateBlueprintFromContent", {
contentId: contentId, name: name
})
),
"Failed to create blueprint from content with id " + contentId
);
}
@@ -123,6 +123,16 @@ function packageResource($q, $http, umbDataFormatter, umbRequestHelper) {
'Failed to install package. Error during the step "InstallFiles" ');
},
checkRestart: function (package) {
return umbRequestHelper.resourcePromise(
$http.post(
umbRequestHelper.getApiUrl(
"packageInstallApiBaseUrl",
"CheckRestart"), package),
'Failed to install package. Error during the step "CheckRestart" ');
},
installData: function (package) {
return umbRequestHelper.resourcePromise(
@@ -290,10 +290,10 @@
var propTemplate = _.find(genericTab.properties, function (item) {
return item.alias === "_umb_template";
});
saveModel.expireDate = propExpireDate.value;
saveModel.releaseDate = propReleaseDate.value;
saveModel.templateAlias = propTemplate.value;
saveModel.expireDate = propExpireDate ? propExpireDate.value : null;
saveModel.releaseDate = propReleaseDate ? propReleaseDate.value : null;
saveModel.templateAlias = propTemplate ? propTemplate.value : null;
return saveModel;
}
};
@@ -1,9 +1,25 @@
.nested-content
.nested-content
{
text-align: center;
}
.nested-content__item
.nested-content--not-supported
{
opacity: 0.3;
pointer-events: none;
}
.nested-content-overlay
{
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
z-index: 1000;
}
.nested-content__item
{
position: relative;
text-align: left;
@@ -18,7 +34,7 @@
background: #f8f8f8;
}
.nested-content__item.ui-sortable-placeholder
.nested-content__item.ui-sortable-placeholder
{
background: #f8f8f8;
border: 1px dashed #d9d9d9;
@@ -37,18 +53,18 @@
margin: 0;
}
.nested-content__header-bar
.nested-content__header-bar
{
padding: 15px 20px;
padding: 15px 20px;
border-bottom: 1px dashed #e0e0e0;
text-align: right;
cursor: pointer;
background-color: white;
-moz-user-select: none;
-khtml-user-select: none;
-webkit-user-select: none;
-o-user-select: none;
-moz-user-select: none;
-khtml-user-select: none;
-webkit-user-select: none;
-o-user-select: none;
}
.nested-content__heading
@@ -57,14 +73,14 @@
line-height: 20px;
}
.nested-content__heading i
.nested-content__heading i
{
vertical-align: text-top;
color: #999; /* same icon color as the icons in the item type picker */
margin-right: 10px;
}
.nested-content__icons
.nested-content__icons
{
margin: -6px 0;
opacity: 0;
@@ -116,19 +132,19 @@
color: white;
}
.nested-content__icon--disabled
.nested-content__icon--disabled
{
opacity: 0.3;
}
.nested-content__footer-bar
.nested-content__footer-bar
{
text-align: center;
padding-top: 20px;
}
.nested-content__content
.nested-content__content
{
border-bottom: 1px dashed #e0e0e0;
}
@@ -142,7 +158,7 @@
display: none !important;
}
.nested-content__help-text
.nested-content__help-text
{
display: inline-block;
padding: 10px 20px 10px 20px;
@@ -171,7 +187,7 @@
margin-left: 10px;
}
.form-horizontal .nested-content--narrow .controls-row
.form-horizontal .nested-content--narrow .controls-row
{
margin-left: 40% !important;
}
@@ -7,7 +7,8 @@
style="width: 100%"
ng-model="searchTerm"
class="umb-search-field search-query input-block-level"
placeholder="Filter..."
localize="plceholder"
placeholder="@placeholders_filter"
no-dirty-check>
</div>
</div>
@@ -17,12 +18,12 @@
<div class="umb-control-group">
<select ng-model="color" class="input-block-level">
<option value="">Black</option>
<option value="color-green">Green</option>
<option value="color-yellow">Yellow</option>
<option value="color-orange">Orange</option>
<option value="color-blue">Blue</option>
<option value="color-red">Red</option>
<option value=""><localize key="colors_black">Black</localize></option>
<option value="color-green"><localize key="colors_green">Green</localize></option>
<option value="color-yellow"><localize key="colors_yellow">Yellow</localize></option>
<option value="color-orange"><localize key="colors_orange">Orange</localize></option>
<option value="color-blue"><localize key="colors_blue">Blue</localize></option>
<option value="color-red"><localize key="colors_red">Red</localize></option>
</select>
</div>
@@ -3,7 +3,7 @@
<div class="umb-pane">
<p>
Are you sure you want to delete <strong>{{currentNode.name}}</strong> ?
<localize key="defaultdialogs_confirmdelete">Are you sure you want to delete</localize> <strong>{{currentNode.name}}</strong> ?
</p>
@@ -22,7 +22,7 @@
<umb-control-group label="@content_target">
<select class="umb-editor umb-dropdown" ng-model="target.target">
<option value=""></option>
<option value="_blank">Opens the linked document in a new window or tab</option>
<option value="_blank"><localize key="defaultdialogs_openInNewWindow">Opens the linked document in a new window or tab</localize></option>
<option value="_top">Opens the linked document in the full body of the window</option>
<option value="_parent">Opens the linked document in the parent frame</option>
</select>
@@ -63,7 +63,7 @@
<localize key="general_cancel">Cancel</localize>
</a>
<a href ng-click="switchToMediaPicker()" class="btn">Link to file</a>
<a href ng-click="switchToMediaPicker()" class="btn"><localize key="defaultdialogs_linkToFile">Link to file</localize></a>
<button
class="btn btn-primary"
@@ -73,4 +73,4 @@
</div>
</div>
</div>
</div>
</div>
@@ -75,7 +75,8 @@
<input type="text"
ng-model="searchTerm"
class="umb-search-field search-query"
placeholder="Filter...">
localize="placeholder"
placeholder="@placeholders_filter">
</div>
<div class="upload-button">
@@ -1,4 +1,4 @@
<form ng-controller="Umbraco.Dialogs.RteEmbedController" val-form-manager>
<form ng-controller="Umbraco.Dialogs.RteEmbedController" val-form-manager>
<div class="umb-panel">
<div class="umb-panel-body no-header with-footer">
<umb-pane>
@@ -11,7 +11,7 @@
<umb-control-group label="Size">
<input type="text" ng-model="form.width" on-blur="changeSize('width')" style="width:50px"/> x <input type="text" ng-model="form.height" on-blur="changeSize('height')" style="width:50px"/>
<label for="constrain" style="display:inline">Constrain:</label>
<label for="constrain" style="display:inline"><localize key="general_constrain">Constrain</localize>:</label>
<input id="constrain" type="checkbox" ng-model="form.constrain" style="margin-bottom: 10px;"/>
</umb-control-group>
</div>
@@ -17,7 +17,7 @@
<div class="umb-panel">
<div class="umb-panel-header">
<h1 class="headline" style="margin: 10px 0 0 0">Build a query</h1>
<h1 class="headline" style="margin: 10px 0 0 0"><localize key="template_buildQuery">Build a query</localize></h1>
</div>
<div class="umb-panel-body with-footer umb-querybuilder">
@@ -149,10 +149,10 @@
<localize key="general_close">Close</localize>
</a>
<a href ng-click="submit(result.queryExpression)" class="btn btn-primary">Insert</a>
<a href ng-click="submit(result.queryExpression)" class="btn btn-primary"><localize key="general_insert">Insert</localize></a>
</div>
</div>
</div>
</div>
</div>
</form>
</form>
@@ -29,7 +29,7 @@
<a href ng-click="close()" class="btn btn-link">
<localize key="general_close">Close</localize>
</a>
<a href ng-click="submit(section)" class="btn btn-primary">Insert</a>
<a href ng-click="submit(section)" class="btn btn-primary"><localize key="general_insert">Insert</localize></a>
</div>
</div>
</div>
@@ -42,7 +42,7 @@
<div class="umb-pane external-logins" ng-if="externalLoginProviders.length > 0 && !showPasswordFields">
<h5>External login providers</h5>
<h5><localize key="defaultdialogs_externalLoginProviders">External login providers</localize></h5>
<div ng-repeat="login in externalLoginProviders">
@@ -55,7 +55,7 @@
onclick="document.forms.oauthloginform.submit();">
<i class="fa" ng-class="login.properties.SocialIcon"></i>
Link your {{login.caption}} account
<localize key="defaultdialogs_linkYour">Link your</localize> {{login.caption}} <localize key="defaultdialogs_account">account</localize>
</button>
</form>
@@ -67,7 +67,7 @@
name="provider"
value="{{login.authType}}">
<i class="fa" ng-class="login.properties.SocialIcon"></i>
Un-link your {{login.caption}} account
<localize key="defaultdialogs_unLinkYour">Un-link your</localize> {{login.caption}} <localize key="defaultdialogs_account">account</localize>
</button>
</div>
@@ -69,12 +69,13 @@
</label>
<select class="umb-dropdown" ng-options="validationType.name for validationType in vm.validationTypes" ng-model="vm.selectedValidationType" ng-change="vm.changeValidationType(vm.selectedValidationType)">
<option value="">Validation</option>
<option value=""><localize key="validation_validation">Validation</localize></option>
</select>
<textarea
class="editor-validation-pattern"
placeholder="Enter a regular expression"
localize="placeholder"
placeholder="@validation_validationRegExp"
ng-model="model.property.validation.pattern"
ng-change="vm.changeValidationPattern()"
ng-if="vm.showValidationPattern"
@@ -17,22 +17,22 @@
<div class="umb-control-group">
<select ng-model="color" class="input-block-level">
<option value="">
<localize key="color_black">Black</localize>
<localize key="colors_black">Black</localize>
</option>
<option value="color-green">
<localize key="color_green">Green</localize>
<localize key="colors_green">Green</localize>
</option>
<option value="color-yellow">
<localize key="color_yellow">Yellow</localize>
<localize key="colors_yellow">Yellow</localize>
</option>
<option value="color-orange">
<localize key="color_orange">Orange</localize>
<localize key="colors_orange">Orange</localize>
</option>
<option value="color-blue">
<localize key="color_blue">Blue</localize>
<localize key="colors_blue">Blue</localize>
</option>
<option value="color-red">
<localize key="color_red">Red</localize>
<localize key="colors_red">Red</localize>
</option>
</select>
</div>
@@ -3,7 +3,7 @@
<!-- select field -->
<div class="control-group umb-control-group -no-border">
<div class="umb-el-wrap">
<label class="control-label" for="chooseField">Choose field</label>
<label class="control-label" for="chooseField"><localize key="templateEditor_chooseField">Choose field</localize></label>
<div class="controls">
<select ng-model="vm.field">
<optgroup localize="label" label="@templateEditor_customFields">
@@ -25,11 +25,11 @@
<!-- Fallback field -->
<div>
<i class="icon icon-add blue" ng-hide="vm.showAltField"></i>
<a href="" ng-click="vm.showAltField=true" ng-hide="vm.showAltField">Add fallback field</a>
<a href="" ng-click="vm.showAltField=true" ng-hide="vm.showAltField"><localize key="templateEditor_addFallbackField">Add fallback field</localize></a>
<div class="control-group umb-control-group -no-border" ng-hide="!vm.showAltField">
<div class="umb-el-wrap">
<label class="control-label" for="altField">Fallback field</label>
<label class="control-label" for="altField"><localize key="templateEditor_fallbackField">Fallback field</localize></label>
<div class="controls">
<select ng-model="vm.altField" >
<optgroup localize="label" label="@templateEditor_customFields">
@@ -48,12 +48,12 @@
<div>
<div style="margin-bottom: 20px;">
<i class="icon icon-add blue" ng-hide="vm.showAltText"></i>
<a href="" ng-click="vm.showAltText=true" ng-hide="vm.showAltText">Add default value</a>
<a href="" ng-click="vm.showAltText=true" ng-hide="vm.showAltText"><localize key="templateEditor_addDefaultValue">Add default value</localize></a>
</div>
<div class="control-group umb-control-group -no-border" ng-hide="!vm.showAltText">
<div class="umb-el-wrap">
<label class="control-label" for="altText">Default value</label>
<label class="control-label" for="altText"><localize key="templateEditor_defaultValue">Default value</localize></label>
<div class="controls">
<input type="text" name="altText" ng-model="vm.altText" umb-auto-focus>
</div>
@@ -66,15 +66,15 @@
<div class="umb-el-wrap">
<div class="controls">
<label class="control-label" for="recursive">
Recursive
<localize key="templateEditor_recursive">Recursive</localize>
</label>
<input type="checkbox" name="recursive" ng-model="vm.recursive">
Yes, make it recursive
<localize key="templateEditor_recursiveDescr">Yes, make it recursive</localize>
</div>
</div>
</div>
<h5>Format and encoding</h5>
<h5><localize key="templateEditor_formatAndEncoding">Format and encoding</localize></h5>
<!-- Format as date -->
<div class="control-group umb-control-group">
@@ -82,13 +82,13 @@
<div class="controls">
<div>
<label class="control-label">
Format as date
<small>Format the value as a date, or a date with time, accoring to the active culture.</small>
<localize key="templateEditor_formatAsDate">Format as date</localize>
<small><localize key="templateEditor_formatAsDateDescr">Format the value as a date, or a date with time, accoring to the active culture</localize>.</small>
</label>
</div>
<a href ng-click="vm.setDateOption('date')" class="btn"><i class="icon icon-check" ng-if="vm.date"></i> Date only</a>
<a href ng-click="vm.setDateOption('dateWithTime')" class="btn"><i class="icon icon-check" ng-if="vm.dateTime"></i> Date and time</a>
<input type="text" ng-model="vm.dateTimeSeparator" ng-hide="!vm.dateTime" placeholder="separator">
<a href ng-click="vm.setDateOption('date')" class="btn"><i class="icon icon-check" ng-if="vm.date"></i> <localize key="templateEditor_dateOnly">Date only</localize></a>
<a href ng-click="vm.setDateOption('dateWithTime')" class="btn"><i class="icon icon-check" ng-if="vm.dateTime"></i> <localize key="templateEditor_withTime">Date and time</localize></a>
<input type="text" ng-model="vm.dateTimeSeparator" ng-hide="!vm.dateTime" localize="placeholder" placeholder="@templateEditor_separator">
</div>
</div>
</div>
@@ -99,11 +99,11 @@
<div class="controls">
<div>
<label class="control-label">
Casing
<localize key="templateEditor_casing">Casing</localize>
</label>
</div>
<a href ng-click="vm.setCasingOption('uppercase')" class="btn" style="text-transform: uppercase;"><i class="icon icon-check" ng-if="vm.casingUpper"></i> Uppercase</a>
<a href ng-click="vm.setCasingOption('lowercase')" class="btn"style="text-transform: lowercase;"><i class="icon icon-check" ng-if="vm.casingLower"></i> Lowercase</a>
<a href ng-click="vm.setCasingOption('uppercase')" class="btn" style="text-transform: uppercase;"><i class="icon icon-check" ng-if="vm.casingUpper"></i> <localize key="templateEditor_uppercase">Uppercase</localize></a>
<a href ng-click="vm.setCasingOption('lowercase')" class="btn"style="text-transform: lowercase;"><i class="icon icon-check" ng-if="vm.casingLower"></i> <localize key="templateEditor_lowercase">Lowercase</localize></a>
</div>
</div>
</div>
@@ -114,8 +114,8 @@
<div class="controls">
<div>
<label class="control-label">
Encoding
<small>Will format special characters in URLs</small>
<localize key="templateEditor_encoding">Encoding</localize>
<small><localize key="templateEditor_urlEncodeHelp">Will format special characters in URLs</localize></small>
</label>
</div>
<a href ng-click="vm.setEncodingOption('html')" class="btn"><i class="icon icon-check" ng-if="vm.encodeHtml"></i> HTML</a>
@@ -124,14 +124,14 @@
</div>
</div>
<h5>Modify output</h5>
<h5><localize key="templateEditor_modifyOutput">Modify output</localize></h5>
<!-- Insert Before -->
<div class="control-group umb-control-group -no-border ng-scope">
<div class="umb-el-wrap">
<label class="control-label" for="insertBefore">
Insert before field
<small>Will be inserted before the field value</small>
<localize key="templateEditor_preContent">Insert before field</localize>
<small><localize key="templateEditor_insertedBefore">Will be inserted before the field value</localize></small>
</label>
<div class="controls">
<input type="text" name="insertBefore" class="-full-width-input" ng-model="vm.insertBefore">
@@ -143,8 +143,8 @@
<div class="control-group umb-control-group">
<div class="umb-el-wrap">
<label class="control-label" for="insertAfter">
Insert after field
<small>Will be inserted after the field value</small>
<localize key="templateEditor_postContent">Insert after field</localize>
<small><localize key="templateEditor_insertedAfter">Will be inserted after the field value</localize></small>
</label>
<div class="controls">
<input type="text" name="insertAfter" class="-full-width-input" ng-model="vm.insertAfter">
@@ -158,12 +158,12 @@
<div class="controls">
<div>
<label class="control-label" for="linebreaks">
Convert line breaks
<small>Replaces line breaks with break html tag</small>
<localize key="templateEditor_convertLineBreaks">Convert line breaks</localize>
<small><localize key="templateEditor_convertLineBreaksHelp">Replaces line breaks with break html tag</localize></small>
</label>
</div>
<input type="checkbox" name="linebreaks" ng-model="vm.convertLinebreaks">
Yes, convert line breaks
<localize key="templateEditor_convertLineBreaksDescription">Yes, convert line breaks</localize>
</div>
</div>
</div>
@@ -174,12 +174,12 @@
<div class="controls">
<div>
<label class="control-label" for="paragraph">
Remove paragraph tags
<small>Will remove any paragraph tag in the beginning and end of the text</small>
<localize key="templateEditor_removeParagraph">Remove paragraph tags</localize>
<small><localize key="templateEditor_removeParagraphHelp">Will remove any paragraph tag in the beginning and end of the text</localize></small>
</label>
</div>
<input type="checkbox" name="paragraph" ng-model="vm.removeParagraphTags">
Yes, remove paragraph tags
<localize key="templateEditor_removeParagraphDescription">Yes, remove paragraph tags</localize>
</div>
</div>
</div>
@@ -188,7 +188,7 @@
<div class="control-group umb-control-group -no-border">
<div class="umb-el-wrap">
<div class="controls">
<label class="control-label">Output sample</label>
<label class="control-label"><localize key="templateEditor_outputSample">Output sample</localize></label>
<pre>{{ vm.generateOutputSample() }}</pre>
</div>
</div>
@@ -196,4 +196,4 @@
</div>
</div>
</div>
@@ -0,0 +1,86 @@
<div>
<umb-load-indicator ng-if="page.loading"></umb-load-indicator>
<form name="contentForm"
ng-submit="save()"
novalidate
val-form-manager>
<umb-editor-view ng-if="!page.loading" umb-tabs>
<umb-editor-header
menu="page.menu"
name="content.name"
tabs="content.tabs"
hide-icon="true"
hide-description="true"
hide-alias="true">
</umb-editor-header>
<umb-editor-container>
<umb-tabs-content class="form-horizontal" view="true">
<umb-tab id="tab{{tab.id}}" ng-repeat="tab in content.tabs" rel="{{tab.id}}">
<umb-property ng-repeat="property in tab.properties" property="property">
<umb-editor model="property"></umb-editor>
</umb-property>
</umb-tab>
</umb-tabs-content>
</umb-editor-container>
<umb-editor-footer>
<umb-editor-footer-content-left>
<umb-breadcrumbs
ng-if="ancestors && ancestors.length > 0"
ancestors="ancestors"
entity-type="content">
</umb-breadcrumbs>
</umb-editor-footer-content-left>
<umb-editor-footer-content-right>
<umb-button
ng-if="page.listViewPath"
type="link"
href="#{{page.listViewPath}}"
label="Return to list"
label-key="buttons_returnToList">
</umb-button>
<umb-button
ng-if="!page.isNew && content.allowPreview"
type="button"
button-style="info"
action="preview(content)"
label="Preview page"
label-key="buttons_showPage">
</umb-button>
<umb-button-group
ng-if="defaultButton"
default-button="defaultButton"
sub-buttons="subButtons"
state="page.buttonGroupState"
direction="up"
float="right">
</umb-button-group>
</umb-editor-footer-content-right>
</umb-editor-footer>
</umb-editor-view>
</form>
</div>
@@ -11,7 +11,7 @@
<a ng-if="showBackButton()" href="" class="umb-mini-list-view__back" ng-click="exitMiniListView()">
<i class="icon-arrow-left umb-mini-list-view__back-icon"></i>
<span class="umb-mini-list-view__back-text">Back</span> /
<span class="umb-mini-list-view__back-text"><localize key="general_back">Back</localize></span> /
</a>
<umb-breadcrumbs
@@ -98,4 +98,4 @@
</div>
</div>
</div>
@@ -5,8 +5,8 @@
<div ng-if="description" class="umb-node-preview__description">{{ description }}</div>
</div>
<div class="umb-node-preview__actions">
<a class="umb-node-preview__action" title="Open" href="" ng-if="allowOpen" ng-click="onOpen()">Open</a>
<a class="umb-node-preview__action umb-node-preview__action--red" title="Remove" href="" ng-if="allowRemove" ng-click="onRemove()">Remove</i></a>
<a class="umb-node-preview__action" title="Open" href="" ng-if="allowOpen" ng-click="onOpen()"><localize key="general_open">Open</localize></a>
<a class="umb-node-preview__action umb-node-preview__action--red" title="Remove" href="" ng-if="allowRemove" ng-click="onRemove()"><localize key="general_remove">Remove</localize></i></a>
<div>
</div>
</div>
@@ -6,11 +6,67 @@
* @description
* The controller for the content creation dialog
*/
function contentCreateController($scope, $routeParams, contentTypeResource, iconHelper) {
contentTypeResource.getAllowedTypes($scope.currentNode.id).then(function(data) {
$scope.allowedTypes = iconHelper.formatContentTypeIcons(data);
function contentCreateController($scope,
$routeParams,
contentTypeResource,
iconHelper,
$location,
navigationService,
blueprintConfig) {
function initialize() {
contentTypeResource.getAllowedTypes($scope.currentNode.id).then(function (data) {
$scope.allowedTypes = iconHelper.formatContentTypeIcons(data);
});
$scope.selectContentType = true;
$scope.selectBlueprint = false;
$scope.allowBlank = blueprintConfig.allowBlank;
}
function close() {
navigationService.hideMenu();
}
function createBlank(docType) {
$location
.path("/content/content/edit/" + $scope.currentNode.id)
.search("doctype=" + docType.alias + "&create=true");
close();
}
function createOrSelectBlueprintIfAny(docType) {
var blueprintIds = _.keys(docType.blueprints || {});
$scope.docType = docType;
if (blueprintIds.length) {
if (blueprintConfig.skipSelect) {
createFromBlueprint(blueprintIds[0]);
} else {
$scope.selectContentType = false;
$scope.selectBlueprint = true;
}
} else {
createBlank(docType);
}
}
function createFromBlueprint(blueprintId) {
$location
.path("/content/content/edit/" + $scope.currentNode.id)
.search("doctype=" + $scope.docType.alias + "&create=true&blueprintId=" + blueprintId);
close();
}
$scope.createBlank = createBlank;
$scope.createOrSelectBlueprintIfAny = createOrSelectBlueprintIfAny;
$scope.createFromBlueprint = createFromBlueprint;
initialize();
}
angular.module('umbraco').controller("Umbraco.Editors.Content.CreateController", contentCreateController);
angular.module("umbraco").controller("Umbraco.Editors.Content.CreateController", contentCreateController);
angular.module("umbraco").value("blueprintConfig", {
skipSelect: false,
allowBlank: true
});
@@ -0,0 +1,56 @@
(function () {
function CreateBlueprintController(
$scope,
contentResource,
notificationsService,
navigationService,
localizationService,
formHelper,
contentEditingHelper) {
$scope.message = {
name: $scope.currentNode.name
};
var successText = {};
localizationService.localize("content_createBlueprintFrom", [$scope.message.name]).then(function (localizedVal) {
$scope.label = localizedVal;
});
$scope.cancel = function () {
navigationService.hideMenu();
};
$scope.create = function () {
if (formHelper.submitForm({
scope: $scope,
formCtrl: this.blueprintForm,
statusMessage: "Creating blueprint..."
})) {
contentResource.createBlueprintFromContent($scope.currentNode.id, $scope.message.name)
.then(function(data) {
formHelper.resetForm({ scope: $scope, notifications: data.notifications });
navigationService.hideMenu();
},
function(err) {
contentEditingHelper.handleSaveError({
redirectOnFailure: false,
err: err
});
}
);
}
};
}
angular.module("umbraco").controller("Umbraco.Editors.Content.CreateBlueprintController", CreateBlueprintController);
}());
@@ -6,227 +6,21 @@
* @description
* The controller for the content editor
*/
function ContentEditController($scope, $rootScope, $routeParams, $q, $timeout, $window, appState, contentResource, entityResource, navigationService, notificationsService, angularHelper, serverValidationManager, contentEditingHelper, treeService, fileManager, formHelper, umbRequestHelper, keyboardService, umbModelMapper, editorState, $http) {
function ContentEditController($scope, $routeParams, contentResource) {
//setup scope vars
$scope.defaultButton = null;
$scope.subButtons = [];
$scope.page = {};
$scope.page.loading = false;
$scope.page.menu = {};
$scope.page.menu.currentNode = null;
$scope.page.menu.currentSection = appState.getSectionState("currentSection");
$scope.page.listViewPath = null;
$scope.page.isNew = $routeParams.create;
$scope.page.buttonGroupState = "init";
function init(content) {
var buttons = contentEditingHelper.configureContentEditorButtons({
create: $routeParams.create,
content: content,
methods: {
saveAndPublish: $scope.saveAndPublish,
sendToPublish: $scope.sendToPublish,
save: $scope.save,
unPublish: $scope.unPublish
}
});
$scope.defaultButton = buttons.defaultButton;
$scope.subButtons = buttons.subButtons;
editorState.set($scope.content);
//We fetch all ancestors of the node to generate the footer breadcrumb navigation
if (!$routeParams.create) {
if (content.parentId && content.parentId != -1) {
entityResource.getAncestors(content.id, "document")
.then(function (anc) {
$scope.ancestors = anc;
});
}
}
}
/** Syncs the content item to it's tree node - this occurs on first load and after saving */
function syncTreeNode(content, path, initialLoad) {
if (!$scope.content.isChildOfListView) {
navigationService.syncTree({ tree: "content", path: path.split(","), forceReload: initialLoad !== true }).then(function (syncArgs) {
$scope.page.menu.currentNode = syncArgs.node;
});
}
else if (initialLoad === true) {
//it's a child item, just sync the ui node to the parent
navigationService.syncTree({ tree: "content", path: path.substring(0, path.lastIndexOf(",")).split(","), forceReload: initialLoad !== true });
//if this is a child of a list view and it's the initial load of the editor, we need to get the tree node
// from the server so that we can load in the actions menu.
umbRequestHelper.resourcePromise(
$http.get(content.treeNodeUrl),
'Failed to retrieve data for child node ' + content.id).then(function (node) {
$scope.page.menu.currentNode = node;
});
}
}
// This is a helper method to reduce the amount of code repitition for actions: Save, Publish, SendToPublish
function performSave(args) {
var deferred = $q.defer();
$scope.page.buttonGroupState = "busy";
contentEditingHelper.contentEditorPerformSave({
statusMessage: args.statusMessage,
saveMethod: args.saveMethod,
scope: $scope,
content: $scope.content,
action: args.action
}).then(function (data) {
//success
init($scope.content);
syncTreeNode($scope.content, data.path);
$scope.page.buttonGroupState = "success";
deferred.resolve(data);
}, function (err) {
//error
if (err) {
editorState.set($scope.content);
}
$scope.page.buttonGroupState = "error";
deferred.reject(err);
});
return deferred.promise;
}
function resetLastListPageNumber(content) {
// We're using rootScope to store the page number for list views, so if returning to the list
// we can restore the page. If we've moved on to edit a piece of content that's not the list or it's children
// we should remove this so as not to confuse if navigating to a different list
if (!content.isChildOfListView && !content.isContainer) {
$rootScope.lastListViewPageViewed = null;
}
}
if ($routeParams.create) {
$scope.page.loading = true;
//we are creating so get an empty content item
contentResource.getScaffold($routeParams.id, $routeParams.doctype)
.then(function (data) {
$scope.content = data;
init($scope.content);
resetLastListPageNumber($scope.content);
$scope.page.loading = false;
});
}
else {
$scope.page.loading = true;
//we are editing so get the content item from the server
contentResource.getById($routeParams.id)
.then(function (data) {
$scope.content = data;
if (data.isChildOfListView && data.trashed === false) {
$scope.page.listViewPath = ($routeParams.page)
? "/content/content/edit/" + data.parentId + "?page=" + $routeParams.page
: "/content/content/edit/" + data.parentId;
}
init($scope.content);
//in one particular special case, after we've created a new item we redirect back to the edit
// route but there might be server validation errors in the collection which we need to display
// after the redirect, so we will bind all subscriptions which will show the server validation errors
// if there are any and then clear them so the collection no longer persists them.
serverValidationManager.executeAndClearAllSubscriptions();
syncTreeNode($scope.content, data.path, true);
resetLastListPageNumber($scope.content);
$scope.page.loading = false;
});
}
$scope.unPublish = function () {
if (formHelper.submitForm({ scope: $scope, statusMessage: "Unpublishing...", skipValidation: true })) {
$scope.page.buttonGroupState = "busy";
contentResource.unPublish($scope.content.id)
.then(function (data) {
formHelper.resetForm({ scope: $scope, notifications: data.notifications });
contentEditingHelper.handleSuccessfulSave({
scope: $scope,
savedContent: data,
rebindCallback: contentEditingHelper.reBindChangedProperties($scope.content, data)
});
init($scope.content);
syncTreeNode($scope.content, data.path);
$scope.page.buttonGroupState = "success";
});
}
};
$scope.sendToPublish = function () {
return performSave({ saveMethod: contentResource.sendToPublish, statusMessage: "Sending...", action: "sendToPublish" });
};
$scope.saveAndPublish = function () {
return performSave({ saveMethod: contentResource.publish, statusMessage: "Publishing...", action: "publish" });
};
$scope.save = function () {
return performSave({ saveMethod: contentResource.save, statusMessage: "Saving...", action: "save" });
};
$scope.preview = function (content) {
if (!$scope.busy) {
// Chromes popup blocker will kick in if a window is opened
// outwith the initial scoped request. This trick will fix that.
//
var previewWindow = $window.open('preview/?id=' + content.id, 'umbpreview');
$scope.save().then(function (data) {
// Build the correct path so both /#/ and #/ work.
var redirect = Umbraco.Sys.ServerVariables.umbracoSettings.umbracoPath + '/preview/?id=' + data.id;
previewWindow.location.href = redirect;
});
}
};
function scaffoldEmpty() {
return contentResource.getScaffold($routeParams.id, $routeParams.doctype);
}
function scaffoldBlueprint() {
return contentResource.getBlueprintScaffold($routeParams.blueprintId);
}
$scope.contentId = $routeParams.id;
$scope.saveMethod = contentResource.save;
$scope.getMethod = contentResource.getById;
$scope.getScaffoldMethod = $routeParams.blueprintId ? scaffoldBlueprint : scaffoldEmpty;
$scope.page = $routeParams.page;
$scope.isNew = $routeParams.create;
}
angular.module("umbraco").controller("Umbraco.Editors.Content.EditController", ContentEditController);
@@ -1,45 +1,53 @@
<div class="umb-dialog-body with-footer" ng-controller="Umbraco.Editors.Content.CreateController" ng-cloak>
<div class="umb-pane">
<h5><localize key="create_createUnder">Create a page under</localize> {{currentNode.name}}</h5>
<p class="abstract" ng-if="allowedTypes && allowedTypes.length === 0">
<localize key="create_noDocumentTypes" />
</p>
<div class="umb-pane">
<h5 ng-show="selectContentType"><localize key="create_createUnder">Create a page under</localize> {{currentNode.name}}</h5>
<h5 ng-show="selectBlueprint"><localize key="content_selectBlueprint">Select a blueprint</localize></h5>
<ul class="umb-actions umb-actions-child">
<p class="abstract" ng-if="allowedTypes && allowedTypes.length === 0">
<localize key="create_noDocumentTypes" />
</p>
<li ng-repeat="docType in allowedTypes | orderBy:'name':false">
<a href="#content/content/edit/{{currentNode.id}}?doctype={{docType.alias}}&create=true" ng-click="nav.hideNavigation()">
<i class="large {{docType.icon}}"></i>
<ul class="umb-actions umb-actions-child" ng-show="selectContentType">
<span class="menu-label">
{{docType.name}}
<small>
{{docType.description}}
</small>
</span>
</a>
</li>
<!--
<li class="add">
<a href="#settings/documenttype/create/{{currentNode.id}}?doctype={{docType.alias}}&create=true" ng-click="nav.hideNavigation()">
<i class="large icon-add"></i>
<span class="menu-label">
Create a new document type
<small>
Design and configure a new document type
</small>
</span>
</a>
</li> -->
</ul>
</div>
<li ng-repeat="docType in allowedTypes | orderBy:'name':false">
<a ng-click="createOrSelectBlueprintIfAny(docType)">
<i class="large {{docType.icon}}"></i>
<span class="menu-label">
{{docType.name}}
<small>
{{docType.description}}
</small>
</span>
</a>
</li>
</ul>
<ul class="umb-actions umb-actions-child" ng-show="selectBlueprint">
<li ng-repeat="(key, value) in docType.blueprints | orderBy:'name':false">
<a ng-click="createFromBlueprint(key)">
<i class="large {{docType.icon}}"></i>
<span class="menu-label">
{{value}}
</span>
</a>
</li>
<li ng-show="allowBlank">
<a ng-click="createBlank(docType)">
<i class="large {{docType.icon}}"></i>
<span class="menu-label">
<localize key="content_blankBlueprint">Blank</localize>
</span>
</a>
</li>
</ul>
</div>
</div>
<div class="umb-dialog-footer btn-toolbar umb-btn-toolbar">
<button class="btn btn-info" ng-click="nav.hideDialog(true)">
<localize key="buttons_somethingElse">Do something else</localize>
</button>
<button class="btn btn-info" ng-click="nav.hideDialog(true)">
<localize key="buttons_somethingElse">Do something else</localize>
</button>
</div>
@@ -0,0 +1,32 @@
<div ng-controller="Umbraco.Editors.Content.CreateBlueprintController">
<form name="blueprintForm"
novalidate
ng-submit="create()"
val-form-manager>
<div class="umbracoDialog umb-dialog-body with-footer"
ng-cloak>
<div class="umb-pane">
<umb-control-group label="{{label}}" hide-label="false">
<input type="text" name="name" ng-model="message.name" class="umb-textstring textstring input-block-level"
val-server-field="name"
required />
<span class="help-inline" val-msg-for="name" val-toggle-msg="required"><localize key="required" /></span>
<span class="help-inline" val-msg-for="name" val-toggle-msg="valServerField"></span>
</umb-control-group>
</div>
</div>
<div class="umb-dialog-footer btn-toolbar umb-btn-toolbar">
<button type="button" class="btn umb-button btn-info" ng-click="cancel()">
<localize key="general_cancel">Cancel</localize>
</button>
<button type="submit" class="btn umb-button btn-success">
<localize key="general_create">Create blueprint</localize>
</button>
</div>
</form>
</div>
@@ -1,86 +1,11 @@
<div ng-controller="Umbraco.Editors.Content.EditController">
<umb-load-indicator ng-if="page.loading"></umb-load-indicator>
<form name="contentForm"
ng-submit="save()"
novalidate
val-form-manager>
<umb-editor-view ng-if="!page.loading" umb-tabs>
<umb-editor-header
menu="page.menu"
name="content.name"
tabs="content.tabs"
hide-icon="true"
hide-description="true"
hide-alias="true">
</umb-editor-header>
<umb-editor-container>
<umb-tabs-content class="form-horizontal" view="true">
<umb-tab id="tab{{tab.id}}" ng-repeat="tab in content.tabs" rel="{{tab.id}}">
<umb-property ng-repeat="property in tab.properties" property="property">
<umb-editor model="property"></umb-editor>
</umb-property>
</umb-tab>
</umb-tabs-content>
</umb-editor-container>
<umb-editor-footer>
<umb-editor-footer-content-left>
<umb-breadcrumbs
ng-if="ancestors && ancestors.length > 0"
ancestors="ancestors"
entity-type="content">
</umb-breadcrumbs>
</umb-editor-footer-content-left>
<umb-editor-footer-content-right>
<umb-button
ng-if="page.listViewPath"
type="link"
href="#{{page.listViewPath}}"
label="Return to list"
label-key="buttons_returnToList">
</umb-button>
<umb-button
ng-if="!page.isNew && content.allowPreview"
type="button"
button-style="info"
action="preview(content)"
label="Preview page"
label-key="buttons_showPage">
</umb-button>
<umb-button-group
ng-if="defaultButton"
default-button="defaultButton"
sub-buttons="subButtons"
state="page.buttonGroupState"
direction="up"
float="right">
</umb-button-group>
</umb-editor-footer-content-right>
</umb-editor-footer>
</umb-editor-view>
</form>
<content-editor create-options="createOptions"
content-id="contentId"
page="page"
save-method="saveMethod"
get-method="getMethod"
get-scaffold-method="getScaffoldMethod"
tree-alias="content"
is-new="isNew">
</content-editor>
</div>
@@ -0,0 +1,32 @@
/**
* @ngdoc controller
* @name Umbraco.Editors.ContentBlueprint.DeleteController
* @function
*
* @description
* The controller for deleting content blueprints
*/
function ContentBlueprintDeleteController($scope, contentResource, treeService, navigationService) {
$scope.performDelete = function() {
//mark it for deletion (used in the UI)
$scope.currentNode.loading = true;
contentResource.deleteBlueprint($scope.currentNode.id)
.then(function() {
$scope.currentNode.loading = false;
//get the root node before we remove it
var rootNode = treeService.getTreeRoot($scope.currentNode);
//TODO: Need to sync tree, etc...
treeService.removeNode($scope.currentNode);
navigationService.hideMenu();
});
};
$scope.cancel = function() {
navigationService.hideDialog();
};
}
angular.module("umbraco").controller("Umbraco.Editors.ContentBlueprint.DeleteController", ContentBlueprintDeleteController);
@@ -0,0 +1,12 @@
<div class="umb-dialog umb-pane" ng-controller="Umbraco.Editors.ContentBlueprint.DeleteController">
<div class="umb-dialog-body">
<p class="umb-abstract">
<localize key="defaultdialogs_confirmdelete">Are you sure you want to delete</localize> <strong>{{currentNode.name}}</strong> ?
</p>
<umb-confirm on-confirm="performDelete" on-cancel="cancel">
</umb-confirm>
</div>
</div>
@@ -0,0 +1,34 @@
/**
* @ngdoc controller
* @name Umbraco.Editors.Content.EditController
* @function
*
* @description
* The controller for the content editor
*/
function ContentBlueprintEditController($scope, $routeParams, contentResource) {
var excludedProps = ["_umb_urls", "_umb_releasedate", "_umb_expiredate", "_umb_template"];
function getScaffold() {
return contentResource.getScaffold(-1, $routeParams.doctype)
.then(function (scaffold) {
var lastTab = scaffold.tabs[scaffold.tabs.length - 1];
lastTab.properties = _.filter(lastTab.properties,
function(p) {
return excludedProps.indexOf(p.alias) === -1;
});
scaffold.allowPreview = false;
scaffold.allowedActions = ["A", "S", "C"];
return scaffold;
});
}
$scope.contentId = $routeParams.id;
$scope.isNew = $routeParams.id === "-1";
$scope.saveMethod = contentResource.saveBlueprint;
$scope.getMethod = contentResource.getBlueprintById;
$scope.getScaffoldMethod = getScaffold;
}
angular.module("umbraco").controller("Umbraco.Editors.ContentBlueprint.EditController", ContentBlueprintEditController);
@@ -0,0 +1,9 @@
<div ng-controller="Umbraco.Editors.ContentBlueprint.EditController">
<content-editor content-id="contentId"
save-method="saveMethod"
get-method="getMethod"
get-scaffold-method="getScaffoldMethod"
is-new="isNew"
tree-alias="contentblueprints">
</content-editor>
</div>
@@ -14,15 +14,15 @@
<div ng-switch-default>
<p>
<i class="icon-alert red"></i> <strong class="red">All property types & property data</strong>
using this data type will be deleted permanently, please confirm you want to delete these as well.
<i class="icon-alert red"></i> <strong class="red"><localize key="editdatatype_allPropTypes">All property types & property data</localize></strong>
<localize key="editdatatype_willBeDeleted">using this data type will be deleted permanently, please confirm you want to delete these as well</localize>.
</p>
<hr />
<label class="checkbox">
<input type="checkbox" ng-model="confirmed" />
Yes, delete {{currentNode.name}} and all property types & property data using this data type
<localize key="editdatatype_yesDelete">Yes, delete</localize> <strong>{{currentNode.name}}</strong> <localize key="editdatatype_andAllRelated">and all property types & property data using this data type</localize>
</label>
<umb-confirm ng-if="confirmed" on-confirm="performDelete" on-cancel="cancel">
@@ -12,7 +12,6 @@
<umb-editor-header
menu="page.menu"
name="content.name"
key="content.key"
name-locked="page.nameLocked"
hide-icon="true"
hide-description="true"
@@ -28,7 +27,7 @@
ng-model="content.selectedEditor"
required
ng-options="e.alias as e.name for e in content.availableEditors"></select>
<span class="help-inline" val-msg-for="selectedEditor" val-toggle-msg="required">Required</span>
<span class="help-inline" val-msg-for="selectedEditor" val-toggle-msg="required"><localize key="general_required">Required</localize></span>
</div>
</umb-property>
@@ -4,7 +4,7 @@
<div class="umb-pane">
<p class="abstract" ng-hide="success">
Select the folder to move <strong>{{currentNode.name}}</strong>&nbsp;to in the tree structure below
<localize key="editdatatype_selectFolder">Select the folder to move</localize> <strong>{{currentNode.name}}</strong>&nbsp;<localize key="editdatatype_inTheTree">to in the tree structure below</localize>
</p>
<div class="umb-loader-wrapper" ng-show="busy">
@@ -17,7 +17,7 @@
</div>
<div ng-show="success">
<h5 class="text-success"><strong>{{currentNode.name}}</strong> was moved underneath&nbsp;<strong>{{target.name}}</strong></h5>
<h5 class="text-success"><strong>{{currentNode.name}}</strong> <localize key="editdatatype_wasMoved">was moved underneath</localize>&nbsp;<strong>{{target.name}}</strong></h5>
<button class="btn btn-primary" ng-click="nav.hideDialog()">Ok</button>
</div>
@@ -50,7 +50,7 @@
<div class="umb-dialog-footer btn-toolbar umb-btn-toolbar" ng-hide="success">
<a class="btn btn-link" ng-click="nav.hideDialog()">Cancel</a>
<button class="btn btn-primary" ng-click="move()">Move</button>
<a class="btn btn-link" ng-click="nav.hideDialog()"><localize key="general_cancel">Cancel</localize></a>
<button class="btn btn-primary" ng-click="move()"><localize key="actions_move">Move</localize></button>
</div>
</div>
@@ -1,7 +1,7 @@
(function () {
"use strict";
function PackagesInstallLocalController($scope, $route, $location, Upload, umbRequestHelper, packageResource, localStorageService, $timeout, $window, localizationService) {
function PackagesInstallLocalController($scope, $route, $location, Upload, umbRequestHelper, packageResource, localStorageService, $timeout, $window, localizationService, $q) {
var vm = this;
vm.state = "upload";
@@ -117,10 +117,37 @@
.then(function(pack) {
vm.installState.progress = "25";
vm.installState.status = localizationService.localize("packager_installStateInstalling");
vm.installState.progress = "50";
return packageResource.installFiles(pack);
},
installError)
.then(function(pack) {
vm.installState.status = localizationService.localize("packager_installStateRestarting");
vm.installState.progress = "50";
var deferred = $q.defer();
//check if the app domain is restarted ever 2 seconds
var count = 0;
function checkRestart() {
$timeout(function () {
packageResource.checkRestart(pack).then(function (d) {
count++;
//if there is an id it means it's not restarted yet but we'll limit it to only check 10 times
if (d.isRestarting && count < 10) {
checkRestart();
}
else {
//it's restarted!
deferred.resolve(d);
}
},
installError);
}, 2000);
}
checkRestart();
return deferred.promise;
}, installError)
.then(function(pack) {
vm.installState.status = localizationService.localize("packager_installStateRestarting");
vm.installState.progress = "75";
@@ -24,7 +24,7 @@
<!-- Drag and drop illustration -->
<i class="icon-box" draggable="false"></i>
<small class="faded" draggable="false"><strong>Drop to upload</strong></small>
<small class="faded" draggable="false"><strong><localize key="packager_dropHere">Drop to upload</localize></strong></small>
<!-- Select files -->
<div class="umb-upload-local__select-file"
@@ -34,7 +34,7 @@
ngf-multiple="true"
ngf-pattern="*.zip"
ngf-max-size="{{ maxFileSize }}">
- <localize key="media_orClickHereToUpload">or click here to choose files</localize>
- <localize key="packager_orClickHereToUpload">or click here to choose files</localize>
</div>
</div>
@@ -42,9 +42,9 @@
</div>
<h3><strong>Upload package</strong></h3>
<h3><strong><localize key="packager_uploadPackage">Upload package</localize></strong></h3>
<p class="faded">
Install a local package by selecting it from your machine. Only install packages from sources you know and trust.
<localize key="packager_localPackageDescription">Install a local package by selecting it from your machine. Only install packages from sources you know and trust</localize>.
</p>
</form>
@@ -55,7 +55,7 @@
<umb-editor-sub-header>
<umb-editor-sub-header-content-left>
<a class="umb-package-details__back-link" href="" ng-click="vm.state = 'upload'">&larr; Upload another package</a>
<a class="umb-package-details__back-link" href="" ng-click="vm.state = 'upload'">&larr; <localize key="packager_uploadAnother">Upload another package</localize></a>
</umb-editor-sub-header-content-left>
</umb-editor-sub-header>
@@ -68,7 +68,7 @@
</div>
<div class="umb-package-info">
<h4 class="umb-info-local-item"><strong>Uploading package</strong></h4>
<h4 class="umb-info-local-item"><strong><localize key="packager_installStateUploading">Uploading package...</localize></strong></h4>
<umb-progress-bar
percentage="{{vm.zipFile.uploadProgress}}">
@@ -90,7 +90,7 @@
<umb-editor-sub-header>
<umb-editor-sub-header-content-left>
<a class="umb-package-details__back-link" href="" ng-click="vm.state = 'upload'">&larr; Cancel and upload another package</a>
<a class="umb-package-details__back-link" href="" ng-click="vm.state = 'upload'">&larr; <localize key="packager_cancelAndAnother">Cancel and upload another package</localize></a>
</umb-editor-sub-header-content-left>
</umb-editor-sub-header>
@@ -111,22 +111,22 @@
<h4 class="umb-info-local-item"><strong>{{ vm.localPackage.name }}</strong></h4>
<div class="umb-info-local-item">
<strong>Author</strong>
<strong><localize key="packager_packageAuthor">Author</localize></strong>
<a href="{{ vm.localPackage.authorUrl }}" target="_blank">{{ vm.localPackage.author }}</a>
</div>
<div class="umb-info-local-item">
<strong>Version</strong>
<strong><localize key="packager_packageVersion">Version</localize></strong>
{{ vm.localPackage.version }}
</div>
<div class="umb-info-local-item">
<strong>License</strong>
<strong><localize key="packager_packageLicense">License</localize></strong>
<a href="{{ vm.localPackage.licenseUrl }}" target="_blank">{{ vm.localPackage.license }}</a>
</div>
<div class="umb-info-local-item">
<strong>Read me</strong>
<strong><localize key="packager_packageReadme">Read me</localize></strong>
<br>
<small ng-bind-html-unsafe="vm.localPackage.readMe"></small>
</div>
@@ -134,14 +134,14 @@
<div class="umb-info-local-item mt4 flex items-center flex-column" ng-if="vm.installState.status == '' && vm.localPackage.isCompatible">
<label for="license-accepts" class="umb-package-installer-label">
<input type="checkbox" id="license-accepts" ng-model="vm.localPackage.packageLicenseAccept" required no-dirty-check>
<strong class="label-text">I accept <a href="{{ vm.localPackage.licenseUrl }}" target="_blank">terms of use</a></strong>
<strong class="label-text"><localize key="packager_accept">I accept</localize> <a href="{{ vm.localPackage.licenseUrl }}" target="_blank"><localize key="packager_termsOfUse">terms of use</localize></a></strong>
</label>
<button type="button"
ng-class="{'-inactive' : localPackageForm.$invalid}"
ng-disabled="localPackageForm.$invalid"
class="umb-era-button -green flex-inline mt3"
ng-click="vm.installPackage()">
Install package
<localize key="packager_packageInstall">Install package</localize>
</button>
</div>
@@ -153,7 +153,7 @@
</div>
<div class="umb-info-local-item text-error" ng-if="!vm.localPackage.isCompatible">
This package cannot be installed, it requires a minimum Umbraco version of {{vm.localPackage.umbracoVersion}}
<localize key="packager_targetVersionMismatch">This package cannot be installed, it requires a minimum Umbraco version of</localize> {{vm.localPackage.umbracoVersion}}
</div>
<div class="umb-info-local-item text-info">
<p>{{vm.installState.status}}</p>
@@ -168,7 +168,7 @@
class="btn btn-success flex-inline mt3"
ng-click="vm.reloadPage()">
Finish
<localize key="packager_installFinish">Finish</localize>
</button>
</div>
@@ -5,7 +5,7 @@
<div ng-if="vm.installedPackages.length > 0">
<div class="umb-packages-view-title">Installed packages</div>
<div class="umb-packages-view-title"><localize key="packager_installedPackages">Installed packages</localize></div>
<div class="umb-package-list">
@@ -24,7 +24,7 @@
</div>
<div class="umb-package-list__item-actions">
<a class="umb-package-list__item-action" href="" ng-click="vm.confirmUninstall(installedPackage)">Uninstall</a>
<a class="umb-package-list__item-action" href="" ng-click="vm.confirmUninstall(installedPackage)"><localize key="packager_packageUninstallHeader">Uninstall</localize></a>
</div>
</div>
@@ -36,8 +36,8 @@
<umb-empty-state
ng-if="vm.installedPackages.length === 0"
position="center">
<h4><strong>You dont have any packages installed.</strong></h4>
<p class="faded">You dont have any packages installed. Either install a local package by selecting it from your machine, or browse through available packages using the "Package" icon in the top right of your screen."</p>
<h4><strong><localize key="packager_noPackages">You dont have any packages installed</localize>.</strong></h4>
<p class="faded"><localize key="packager_noPackagesDescription">You dont have any packages installed. Either install a local package by selecting it from your machine, or browse through available packages using the "Packages" icon in the top right of your screen</localize>.</p>
</umb-empty-state>
</div>
@@ -47,7 +47,7 @@
<umb-editor-sub-header>
<umb-editor-sub-header-content-left>
<a class="umb-package-details__back-link" href="" ng-click="vm.state = 'list'">&larr; Take me back</a>
<a class="umb-package-details__back-link" href="" ng-click="vm.state = 'list'">&larr; <localize key="general_back">Back</localize></a>
</umb-editor-sub-header-content-left>
</umb-editor-sub-header>
@@ -66,22 +66,22 @@
<h4 class="umb-info-local-item"><strong>{{ vm.package.name }}</strong></h4>
<div class="umb-info-local-item">
<strong>Author</strong>
<strong><localize key="packager_packageAuthor">Author</localize></strong>
<a href="{{ vm.package.authorLink }}" target="_blank">{{ vm.package.author }}</a>
</div>
<div class="umb-info-local-item">
<strong>Version</strong>
<strong><localize key="packager_packageVersion">Version</localize></strong>
{{ vm.package.version }}
</div>
<div class="umb-info-local-item">
<strong>License</strong>
<strong><localize key="packager_packageLicense">License</localize></strong>
<a href="{{ vm.package.licenseUrl }}" target="_blank">{{ vm.package.license }}</a>
</div>
<div class="umb-info-local-item">
<strong>Read me</strong>
<strong><localize key="packager_packageReadme">Read me</localize></strong>
<br>
<small> {{ vm.package.readme }} </small>
</div>
@@ -89,14 +89,14 @@
<div class="umb-info-local-item mt4 flex items-center flex-column" ng-if="vm.installState.status == ''">
<label for="confirm-uninstall" class="umb-package-installer-label">
<input type="checkbox" id="confirm-uninstall" ng-model="vm.package.confirmUninstall" required no-dirty-check>
<strong class="label-text">Confirm package uninstall</strong>
<strong class="label-text"><localize key="packager_packageUninstallConfirm">Confirm package uninstall</localize></strong>
</label>
<button type="button"
ng-class="{'-inactive' : uninstallForm.$invalid}"
ng-disabled="uninstallForm.$invalid"
class="umb-era-button -green flex-inline mt3"
ng-click="vm.uninstallPackage(vm.package)">
Uninstall package
<localize key="packager_packageUninstallHeader">Uninstall package</localize>
</button>
</div>
@@ -193,13 +193,41 @@
.import(selectedPackage)
.then(function(pack) {
vm.installState.status = localizationService.localize("packager_installStateInstalling");
vm.installState.progress = "33";
vm.installState.progress = "25";
return packageResource.installFiles(pack);
},
error)
.then(function(pack) {
vm.installState.status = localizationService.localize("packager_installStateRestarting");
vm.installState.progress = "66";
vm.installState.progress = "50";
var deferred = $q.defer();
//check if the app domain is restarted ever 2 seconds
var count = 0;
function checkRestart() {
$timeout(function () {
packageResource.checkRestart(pack).then(function (d) {
count++;
//if there is an id it means it's not restarted yet but we'll limit it to only check 10 times
if (d.isRestarting && count < 10) {
checkRestart();
}
else {
//it's restarted!
deferred.resolve(d);
}
},
error);
}, 2000);
}
checkRestart();
return deferred.promise;
}, error)
.then(function (pack) {
vm.installState.status = localizationService.localize("packager_installStateRestarting");
vm.installState.progress = "75";
return packageResource.installData(pack);
},
error)
@@ -7,7 +7,7 @@
<div class="umb-packages-section">
<div class="umb-packages-search">
<input class="-full-width-input" type="text" name="query" placeholder="Search for packages" umb-auto-focus ng-model="vm.searchQuery" ng-change="vm.search()" no-dirty-check>
<input class="-full-width-input" type="text" name="query" localize="placeholder" placeholder="@packager_packageSearch" umb-auto-focus ng-model="vm.searchQuery" ng-change="vm.search()" no-dirty-check>
</div>
</div>
@@ -26,7 +26,7 @@
</div>
<div class="umb-packages-section" ng-if="vm.searchQuery == ''">
<h4><strong>Popular</strong></h4>
<h4><strong><localize key="packager_packagesPopular">Popular</localize></strong></h4>
<div class="umb-packages clearfix">
<div class="umb-package" ng-repeat="package in vm.popular">
@@ -58,8 +58,8 @@
<div class="umb-packages-section" ng-if="vm.packages.length > 0">
<h4 ng-if="vm.searchQuery === ''"><strong>New Releases</strong></h4>
<h4 ng-if="vm.searchQuery !== ''"><strong>Results for '{{ vm.searchQuery }}'</strong></h4>
<h4 ng-if="vm.searchQuery === ''"><strong><localize key="packager_packagesNew">New Releases</localize></strong></h4>
<h4 ng-if="vm.searchQuery !== ''"><strong><localize key="packager_packageSearchResults">Results for</localize> '{{ vm.searchQuery }}'</strong></h4>
<div class="umb-packages clearfix">
@@ -105,8 +105,8 @@
<umb-empty-state
ng-if="vm.packages.length === 0 && vm.loading === false && vm.searchQuery !== ''"
position="center">
<h4><strong>We couldn't find anything for '{{ vm.searchQuery }}'</strong></h4>
<p class="faded">Please try searching for another package or browse through the categories.</p>
<h4><strong><localize key="packager_packageNoResults">We couldn't find anything for</localize> '{{ vm.searchQuery }}'</strong></h4>
<p class="faded"><localize key="packager_packageNoResultsDescription">Please try searching for another package or browse through the categories</localize>.</p>
</umb-empty-state>
</div>
@@ -119,7 +119,7 @@
<umb-editor-sub-header>
<umb-editor-sub-header-content-left>
<a class="umb-package-details__back-link" href="" ng-click="vm.setPackageViewState('packageList');">&larr; Take me back</a>
<a class="umb-package-details__back-link" href="" ng-click="vm.setPackageViewState('packageList');">&larr; <localize key="general_back">Back</localize></a>
</umb-editor-sub-header-content-left>
</umb-editor-sub-header>
@@ -155,7 +155,7 @@
<div class="umb-package-details__section">
<button class="umb-era-button -green -full-width"
ng-if="vm.package.isValid === true"
ng-click="vm.downloadPackage(vm.package)">Install package</button>
ng-click="vm.downloadPackage(vm.package)"><localize key="packager_packageInstall">Install package</localize></button>
<button class="umb-era-button -inactive -full-width" ng-if="vm.package.isValid === false" disabled>
<localize key="packager_packageAlreadyInstalled">Package is already installed</localize>
@@ -175,55 +175,55 @@
<div>
<div class="umb-package-details__owner-profile-name">{{ vm.package.ownerInfo.owner }}</div>
<div class="umb-package-details__owner-profile-karma">
{{ vm.package.ownerInfo.owner }} has <strong>{{ vm.package.ownerInfo.karma }}</strong> karma points
{{ vm.package.ownerInfo.owner }} <localize key="packager_packageHas">has</localize> <strong>{{ vm.package.ownerInfo.karma }}</strong> <localize key="packager_packageKarmaPoints">karma points</localize>
</div>
</div>
</div>
</div>
<div class="umb-package-details__section">
<div class="umb-package-details__section-title">Information</div>
<div class="umb-package-details__section-title"><localize key="packager_packageInfo">Information</localize></div>
<div>
<div class="umb-package-details__information-item" ng-if="vm.package.ownerInfo.owner">
<div class="umb-package-details__information-item-label">Owner:</div>
<div class="umb-package-details__information-item-label"><localize key="packager_packageOwner">Owner</localize>:</div>
<div class="umb-package-details__information-item-content">{{vm.package.ownerInfo.owner}}</div>
</div>
<div class="umb-package-details__information-item" ng-if="vm.package.ownerInfo.contributors">
<div class="umb-package-details__information-item-label">Contributors:</div>
<div class="umb-package-details__information-item-label"><localize key="packager_packageContrib">Contributors</localize>:</div>
<div class="umb-package-details__information-item-content">
<span ng-repeat="contributor in vm.package.ownerInfo.contributors">{{ contributor }}<span ng-if="!$last">,&nbsp;</span></span>
</div>
</div>
<div class="umb-package-details__information-item" ng-if="vm.package.created">
<div class="umb-package-details__information-item-label">Created:</div>
<div class="umb-package-details__information-item-label"><localize key="packager_packageCreated">Created</localize>:</div>
<div class="umb-package-details__information-item-content">{{vm.package.created | date:'yyyy-MM-dd HH:mm:ss'}}</div>
</div>
<div class="umb-package-details__information-item" ng-if="vm.package.latestVersion">
<div class="umb-package-details__information-item-label">Current version:</div>
<div class="umb-package-details__information-item-label"><localize key="packager_packageCurrentVersion">Current version</localize>:</div>
<div class="umb-package-details__information-item-content">{{vm.package.latestVersion}}</div>
</div>
<div class="umb-package-details__information-item" ng-if="vm.package.information.netVersion">
<div class="umb-package-details__information-item-label">.Net Version:</div>
<div class="umb-package-details__information-item-label"><localize key="packager_packageNetVersion">.NET Version</localize>:</div>
<div class="umb-package-details__information-item-content">{{vm.package.information.netVersion}}</div>
</div>
<div class="umb-package-details__information-item" ng-if="vm.package.licenseName">
<div class="umb-package-details__information-item-label">License:</div>
<div class="umb-package-details__information-item-label"><localize key="packager_packageLicense">License</localize>:</div>
<div class="umb-package-details__information-item-content">{{vm.package.licenseName}}</div>
</div>
<div class="umb-package-details__information-item" ng-if="vm.package.downloads">
<div class="umb-package-details__information-item-label">Downloads:</div>
<div class="umb-package-details__information-item-label"><localize key="packager_packageDownloads">Downloads</localize>:</div>
<div class="umb-package-details__information-item-content">{{vm.package.downloads}}</div>
</div>
<div class="umb-package-details__information-item" ng-if="vm.package.ownerInfo.karma">
<div class="umb-package-details__information-item-label">Likes:</div>
<div class="umb-package-details__information-item-label"><localize key="packager_packageLikes">Likes</localize>:</div>
<div class="umb-package-details__information-item-content">{{vm.package.likes}}</div>
</div>
@@ -231,8 +231,8 @@
</div>
<div class="umb-package-details__section">
<div class="umb-package-details__section-title">Compatibility</div>
<div class="umb-package-details__section-description">This package is compatible with the following versions of Umbraco, as reported by community members. Full compatability cannot be gauranteed for versions reported below 100%</div>
<div class="umb-package-details__section-title"><localize key="packager_packageCompatibility">Compatibility</localize></div>
<div class="umb-package-details__section-description"><localize key="packager_packageCompatibilityDescription">This package is compatible with the following versions of Umbraco, as reported by community members. Full compatability cannot be gauranteed for versions reported below 100%</localize></div>
<div class="umb-package-details__compatability" ng-repeat="compatibility in vm.package.compatibility | filter:percentage > 0">
<div class="umb-package-details__compatability-label">
<span class="umb-package-details__information-item-label">{{compatibility.version}}</span>
@@ -247,7 +247,7 @@
</div>
<div class="umb-package-details__section" ng-if="vm.package.externalSources">
<div class="umb-package-details__section-title">External sources</div>
<div class="umb-package-details__section-title"><localize key="packager_packageExternalSources">External sources</localize></div>
<div>
<div class="umb-package-details__information-item" ng-repeat="externalSource in vm.package.externalSources">
<a class="umb-package-details__link" target="_blank" href="{{ externalSource.url }}">
@@ -269,7 +269,7 @@
<div ng-if="vm.packageViewState === 'packageInstall' && vm.loading === false">
<umb-editor-sub-header>
<umb-editor-sub-header-content-left>
<a class="umb-package-details__back-link" href="" ng-click="vm.setPackageViewState('packageDetails');">&larr; Take me back</a>
<a class="umb-package-details__back-link" href="" ng-click="vm.setPackageViewState('packageDetails');">&larr; <localize key="general_back">Back</localize></a>
</umb-editor-sub-header-content-left>
</umb-editor-sub-header>
@@ -295,17 +295,17 @@
</div>
<div class="umb-info-local-item">
<strong>Version</strong>
<strong><localize key="packager_packageVersion">Version</localize></strong>
{{ vm.localPackage.version }}
</div>
<div class="umb-info-local-item">
<strong>License</strong>
<strong><localize key="packager_packageLicense">License</localize></strong>
<a href="{{ vm.localPackage.licenseUrl }}" target="_blank">{{ vm.localPackage.license }}</a>
</div>
<div class="umb-info-local-item">
<strong>Read me</strong>
<strong><localize key="packager_packageReadme">Read me</localize></strong>
<br>
<small ng-bind-html-unsafe="vm.localPackage.readMe"></small>
</div>
@@ -313,7 +313,7 @@
<div class="umb-info-local-item mt4 flex items-center flex-column" ng-if="vm.installState.status == '' && vm.localPackage.isCompatible">
<label for="license-accept" class="umb-package-installer-label">
<input type="checkbox" id="license-accept" ng-model="vm.localPackage.packageLicenseAccept" required no-dirty-check>
<strong class="label-text">I accept <a href="{{ vm.localPackage.licenseUrl }}" target="_blank">terms of use</a></strong>
<strong class="label-text"><localize key="packager_accept">I accept</localize> <a href="{{ vm.localPackage.licenseUrl }}" target="_blank"><localize key="packager_termsOfUse">terms of use</localize></a></strong>
</label>
<button type="button"
ng-if="vm.installState.type !== 'error'"
@@ -321,7 +321,7 @@
ng-disabled="localPackageForm.$invalid"
class="umb-era-button -green flex-inline mt3"
ng-click="vm.installPackage(vm.localPackage)">
Install package
<localize key="packager_packageInstall">Install package</localize>
</button>
</div>
@@ -333,7 +333,7 @@
</div>
<div class="umb-info-local-item text-error" ng-if="!vm.localPackage.isCompatible">
This package cannot be installed, it requires a minimum Umbraco version of {{vm.localPackage.umbracoVersion}}
<localize key="packager_targetVersionMismatch">This package cannot be installed, it requires a minimum Umbraco version of</localize> {{vm.localPackage.umbracoVersion}}
</div>
<div class="umb-info-local-item text-info" ng-class="{'text-info' : vm.installState.type !== 'error'}">
@@ -346,7 +346,7 @@
<button type="button"
class="btn btn-success flex-inline mt3"
ng-click="vm.reloadPage()">
Finish
<localize key="packager_installFinish">Finish</localize>
</button>
</div>
@@ -40,7 +40,7 @@
<!-- Snippets list -->
<div ng-if="vm.showSnippets">
<h5>Select snippet</h5>
<h5><localize key="defaultdialogs_selectSnippet">Select snippet</localize></h5>
<ul class="umb-actions umb-actions-child">
<li ng-repeat="snippet in vm.snippets">
@@ -29,7 +29,7 @@
type="button"
class="umb-era-button umb-button--s"
ng-click="vm.openInsertOverlay()">
<i class="icon icon-add"></i> Insert
<i class="icon icon-add"></i> <localize key="template_insert">Insert</localize>
</button>
<a class="umb-era-button umb-button--s dropdown-toggle umb-button-group__toggle" data-toggle="dropdown">
@@ -37,9 +37,9 @@
</a>
<ul aria-labelledby="dLabel" class="dropdown-menu bottom-up umb-button-group__sub-buttons" role="menu">
<li><a href="" ng-click="vm.openPageFieldOverlay()">Value</a></li>
<li><a href="" ng-click="vm.openMacroOverlay()">Macro</a></li>
<li><a href="" ng-click="vm.openDictionaryItemOverlay()">Dictionary</a></li>
<li><a href="" ng-click="vm.openPageFieldOverlay()"><localize key="template_insertPageField">Value</localize></a></li>
<li><a href="" ng-click="vm.openMacroOverlay()"><localize key="template_insertMacro">Macro</localize></a></li>
<li><a href="" ng-click="vm.openDictionaryItemOverlay()"><localize key="template_insertDictionaryItem">Dictionary item</localize></a></li>
</ul>
</div>
@@ -49,7 +49,7 @@
style="margin-right: 10px;"
class="umb-era-button umb-button--s"
ng-click="vm.openQueryBuilderOverlay()">
<i class="icon icon-wand"></i> Query builder
<i class="icon icon-wand"></i> <localize key="template_queryBuilder">Query builder</localize>
</button>
</div>
@@ -120,4 +120,4 @@
view="vm.queryBuilderOverlay.view">
</umb-overlay>
</div>
</div>

Some files were not shown because too many files have changed in this diff Show More