2012-11-07 13:56:52 -01:00
|
|
|
using System;
|
2012-10-24 12:22:52 -02:00
|
|
|
using System.Collections.Generic;
|
|
|
|
|
using System.Linq;
|
2012-12-10 14:53:36 -01:00
|
|
|
using Umbraco.Core.Auditing;
|
2015-01-09 18:53:08 +11:00
|
|
|
using Umbraco.Core.Configuration;
|
2012-12-15 10:43:03 +05:00
|
|
|
using Umbraco.Core.Events;
|
2015-01-09 18:53:08 +11:00
|
|
|
using Umbraco.Core.Logging;
|
2012-10-24 12:22:52 -02:00
|
|
|
using Umbraco.Core.Models;
|
|
|
|
|
using Umbraco.Core.Persistence;
|
|
|
|
|
using Umbraco.Core.Persistence.Querying;
|
2016-04-28 08:48:59 +02:00
|
|
|
using Umbraco.Core.Persistence.Repositories;
|
2015-01-13 13:25:36 +11:00
|
|
|
using Umbraco.Core.Persistence.SqlSyntax;
|
2012-10-24 12:22:52 -02:00
|
|
|
using Umbraco.Core.Persistence.UnitOfWork;
|
|
|
|
|
|
2012-11-12 07:40:11 -01:00
|
|
|
namespace Umbraco.Core.Services
|
2012-10-24 12:22:52 -02:00
|
|
|
{
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// Represents the Localization Service, which is an easy access to operations involving <see cref="Language"/> and <see cref="DictionaryItem"/>
|
|
|
|
|
/// </summary>
|
2015-01-19 18:37:48 +11:00
|
|
|
public class LocalizationService : RepositoryService, ILocalizationService
|
2012-10-24 12:22:52 -02:00
|
|
|
{
|
2015-07-23 20:04:40 +02:00
|
|
|
|
2012-12-14 13:06:58 -01:00
|
|
|
|
2015-07-23 20:04:40 +02:00
|
|
|
public LocalizationService(IDatabaseUnitOfWorkProvider provider, RepositoryFactory repositoryFactory, ILogger logger, IEventMessagesFactory eventMessagesFactory)
|
|
|
|
|
: base(provider, repositoryFactory, logger, eventMessagesFactory)
|
2012-10-24 12:22:52 -02:00
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
|
2015-01-12 19:39:30 +11:00
|
|
|
/// <summary>
|
|
|
|
|
/// Adds or updates a translation for a dictionary item and language
|
|
|
|
|
/// </summary>
|
|
|
|
|
/// <param name="item"></param>
|
|
|
|
|
/// <param name="language"></param>
|
|
|
|
|
/// <param name="value"></param>
|
|
|
|
|
/// <returns></returns>
|
|
|
|
|
/// <remarks>
|
|
|
|
|
/// This does not save the item, that needs to be done explicitly
|
|
|
|
|
/// </remarks>
|
|
|
|
|
public void AddOrUpdateDictionaryValue(IDictionaryItem item, ILanguage language, string value)
|
|
|
|
|
{
|
|
|
|
|
if (item == null) throw new ArgumentNullException("item");
|
|
|
|
|
if (language == null) throw new ArgumentNullException("language");
|
|
|
|
|
|
|
|
|
|
var existing = item.Translations.FirstOrDefault(x => x.Language.Id == language.Id);
|
|
|
|
|
if (existing != null)
|
|
|
|
|
{
|
|
|
|
|
existing.Value = value;
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
item.Translations = new List<IDictionaryTranslation>(item.Translations)
|
|
|
|
|
{
|
|
|
|
|
new DictionaryTranslation(language, value)
|
|
|
|
|
};
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2015-01-12 18:52:30 +11:00
|
|
|
/// <summary>
|
|
|
|
|
/// Creates and saves a new dictionary item and assigns a value to all languages if defaultValue is specified.
|
|
|
|
|
/// </summary>
|
|
|
|
|
/// <param name="key"></param>
|
|
|
|
|
/// <param name="parentId"></param>
|
|
|
|
|
/// <param name="defaultValue"></param>
|
|
|
|
|
/// <returns></returns>
|
|
|
|
|
public IDictionaryItem CreateDictionaryItemWithIdentity(string key, Guid? parentId, string defaultValue = null)
|
|
|
|
|
{
|
2016-05-02 12:12:21 +02:00
|
|
|
DictionaryItem item;
|
2016-04-28 08:48:59 +02:00
|
|
|
using (var uow = UowProvider.GetUnitOfWork())
|
2015-01-12 18:52:30 +11:00
|
|
|
{
|
2016-04-28 08:48:59 +02:00
|
|
|
var repository = uow.CreateRepository<IDictionaryRepository>();
|
2015-01-12 18:52:30 +11:00
|
|
|
//validate the parent
|
|
|
|
|
if (parentId.HasValue && parentId.Value != Guid.Empty)
|
|
|
|
|
{
|
|
|
|
|
var parent = GetDictionaryItemById(parentId.Value);
|
|
|
|
|
if (parent == null)
|
|
|
|
|
{
|
|
|
|
|
throw new ArgumentException("No parent dictionary item was found with id " + parentId.Value);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2016-05-02 12:12:21 +02:00
|
|
|
item = new DictionaryItem(parentId, key);
|
2015-01-12 18:52:30 +11:00
|
|
|
|
|
|
|
|
if (defaultValue.IsNullOrWhiteSpace() == false)
|
|
|
|
|
{
|
|
|
|
|
var langs = GetAllLanguages();
|
|
|
|
|
var translations = langs.Select(language => new DictionaryTranslation(language, defaultValue))
|
|
|
|
|
.Cast<IDictionaryTranslation>()
|
|
|
|
|
.ToList();
|
|
|
|
|
|
|
|
|
|
item.Translations = translations;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (SavingDictionaryItem.IsRaisedEventCancelled(new SaveEventArgs<IDictionaryItem>(item), this))
|
|
|
|
|
return item;
|
|
|
|
|
|
|
|
|
|
repository.AddOrUpdate(item);
|
2016-05-02 12:12:21 +02:00
|
|
|
uow.Complete();
|
|
|
|
|
}
|
2016-01-07 18:44:04 +01:00
|
|
|
|
2016-05-02 12:12:21 +02:00
|
|
|
// ensure the lazy Language callback is assigned
|
|
|
|
|
EnsureDictionaryItemLanguageCallback(item);
|
2015-01-12 18:52:30 +11:00
|
|
|
|
2016-05-02 12:12:21 +02:00
|
|
|
SavedDictionaryItem.RaiseEvent(new SaveEventArgs<IDictionaryItem>(item), this);
|
|
|
|
|
return item;
|
2015-01-12 18:52:30 +11:00
|
|
|
}
|
|
|
|
|
|
2012-10-24 12:22:52 -02:00
|
|
|
/// <summary>
|
|
|
|
|
/// Gets a <see cref="IDictionaryItem"/> by its <see cref="Int32"/> id
|
|
|
|
|
/// </summary>
|
|
|
|
|
/// <param name="id">Id of the <see cref="IDictionaryItem"/></param>
|
|
|
|
|
/// <returns><see cref="IDictionaryItem"/></returns>
|
|
|
|
|
public IDictionaryItem GetDictionaryItemById(int id)
|
|
|
|
|
{
|
2016-04-28 08:48:59 +02:00
|
|
|
using (var uow = UowProvider.GetUnitOfWork())
|
2012-12-14 13:06:58 -01:00
|
|
|
{
|
2016-04-28 08:48:59 +02:00
|
|
|
var repository = uow.CreateRepository<IDictionaryRepository>();
|
2016-01-07 18:44:04 +01:00
|
|
|
var item = repository.Get(id);
|
|
|
|
|
//ensure the lazy Language callback is assigned
|
|
|
|
|
EnsureDictionaryItemLanguageCallback(item);
|
|
|
|
|
return item;
|
2012-12-14 13:06:58 -01:00
|
|
|
}
|
2012-10-24 12:22:52 -02:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// Gets a <see cref="IDictionaryItem"/> by its <see cref="Guid"/> id
|
|
|
|
|
/// </summary>
|
|
|
|
|
/// <param name="id">Id of the <see cref="IDictionaryItem"/></param>
|
|
|
|
|
/// <returns><see cref="DictionaryItem"/></returns>
|
|
|
|
|
public IDictionaryItem GetDictionaryItemById(Guid id)
|
|
|
|
|
{
|
2016-04-28 08:48:59 +02:00
|
|
|
using (var uow = UowProvider.GetUnitOfWork())
|
2012-12-14 13:06:58 -01:00
|
|
|
{
|
2016-04-28 08:48:59 +02:00
|
|
|
var repository = uow.CreateRepository<IDictionaryRepository>();
|
2016-01-07 18:44:04 +01:00
|
|
|
var item = repository.Get(id);
|
|
|
|
|
//ensure the lazy Language callback is assigned
|
|
|
|
|
EnsureDictionaryItemLanguageCallback(item);
|
|
|
|
|
return item;
|
2012-12-14 13:06:58 -01:00
|
|
|
}
|
2012-10-24 12:22:52 -02:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// Gets a <see cref="IDictionaryItem"/> by its key
|
|
|
|
|
/// </summary>
|
|
|
|
|
/// <param name="key">Key of the <see cref="IDictionaryItem"/></param>
|
|
|
|
|
/// <returns><see cref="IDictionaryItem"/></returns>
|
|
|
|
|
public IDictionaryItem GetDictionaryItemByKey(string key)
|
|
|
|
|
{
|
2016-04-28 08:48:59 +02:00
|
|
|
using (var uow = UowProvider.GetUnitOfWork())
|
2012-12-14 13:06:58 -01:00
|
|
|
{
|
2016-04-28 08:48:59 +02:00
|
|
|
var repository = uow.CreateRepository<IDictionaryRepository>();
|
2016-01-07 18:44:04 +01:00
|
|
|
var item = repository.Get(key);
|
|
|
|
|
//ensure the lazy Language callback is assigned
|
|
|
|
|
EnsureDictionaryItemLanguageCallback(item);
|
|
|
|
|
return item;
|
2012-12-14 13:06:58 -01:00
|
|
|
}
|
2012-10-24 12:22:52 -02:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// Gets a list of children for a <see cref="IDictionaryItem"/>
|
|
|
|
|
/// </summary>
|
|
|
|
|
/// <param name="parentId">Id of the parent</param>
|
|
|
|
|
/// <returns>An enumerable list of <see cref="IDictionaryItem"/> objects</returns>
|
|
|
|
|
public IEnumerable<IDictionaryItem> GetDictionaryItemChildren(Guid parentId)
|
|
|
|
|
{
|
2016-04-28 08:48:59 +02:00
|
|
|
using (var uow = UowProvider.GetUnitOfWork())
|
2012-12-14 13:06:58 -01:00
|
|
|
{
|
2016-04-28 08:48:59 +02:00
|
|
|
var repository = uow.CreateRepository<IDictionaryRepository>();
|
2015-12-18 14:45:28 +01:00
|
|
|
var query = repository.Query.Where(x => x.ParentId == parentId);
|
2016-01-07 18:44:04 +01:00
|
|
|
var items = repository.GetByQuery(query).ToArray();
|
|
|
|
|
//ensure the lazy Language callback is assigned
|
|
|
|
|
items.ForEach(EnsureDictionaryItemLanguageCallback);
|
2012-12-14 13:06:58 -01:00
|
|
|
return items;
|
|
|
|
|
}
|
2012-10-24 12:22:52 -02:00
|
|
|
}
|
|
|
|
|
|
2015-07-22 12:10:21 +02:00
|
|
|
/// <summary>
|
|
|
|
|
/// Gets a list of descendants for a <see cref="IDictionaryItem"/>
|
|
|
|
|
/// </summary>
|
|
|
|
|
/// <param name="parentId">Id of the parent, null will return all dictionary items</param>
|
|
|
|
|
/// <returns>An enumerable list of <see cref="IDictionaryItem"/> objects</returns>
|
|
|
|
|
public IEnumerable<IDictionaryItem> GetDictionaryItemDescendants(Guid? parentId)
|
|
|
|
|
{
|
2016-04-28 08:48:59 +02:00
|
|
|
using (var uow = UowProvider.GetUnitOfWork())
|
2015-07-22 12:10:21 +02:00
|
|
|
{
|
2016-04-28 08:48:59 +02:00
|
|
|
var repository = uow.CreateRepository<IDictionaryRepository>();
|
2016-01-07 18:44:04 +01:00
|
|
|
var items = repository.GetDictionaryItemDescendants(parentId).ToArray();
|
|
|
|
|
//ensure the lazy Language callback is assigned
|
|
|
|
|
items.ForEach(EnsureDictionaryItemLanguageCallback);
|
|
|
|
|
return items;
|
2015-07-22 12:10:21 +02:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2012-10-24 12:22:52 -02:00
|
|
|
/// <summary>
|
|
|
|
|
/// Gets the root/top <see cref="IDictionaryItem"/> objects
|
|
|
|
|
/// </summary>
|
|
|
|
|
/// <returns>An enumerable list of <see cref="IDictionaryItem"/> objects</returns>
|
|
|
|
|
public IEnumerable<IDictionaryItem> GetRootDictionaryItems()
|
|
|
|
|
{
|
2016-04-28 08:48:59 +02:00
|
|
|
using (var uow = UowProvider.GetUnitOfWork())
|
2012-12-14 13:06:58 -01:00
|
|
|
{
|
2016-04-28 08:48:59 +02:00
|
|
|
var repository = uow.CreateRepository<IDictionaryRepository>();
|
2015-12-18 14:45:28 +01:00
|
|
|
var query = repository.QueryFactory.Create<IDictionaryItem>().Where(x => x.ParentId == null);
|
2016-01-07 18:44:04 +01:00
|
|
|
var items = repository.GetByQuery(query).ToArray();
|
|
|
|
|
//ensure the lazy Language callback is assigned
|
|
|
|
|
items.ForEach(EnsureDictionaryItemLanguageCallback);
|
2012-12-14 13:06:58 -01:00
|
|
|
return items;
|
|
|
|
|
}
|
2012-10-24 12:22:52 -02:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// Checks if a <see cref="IDictionaryItem"/> with given key exists
|
|
|
|
|
/// </summary>
|
|
|
|
|
/// <param name="key">Key of the <see cref="IDictionaryItem"/></param>
|
|
|
|
|
/// <returns>True if a <see cref="IDictionaryItem"/> exists, otherwise false</returns>
|
|
|
|
|
public bool DictionaryItemExists(string key)
|
|
|
|
|
{
|
2016-04-28 08:48:59 +02:00
|
|
|
using (var uow = UowProvider.GetUnitOfWork())
|
2012-12-14 13:06:58 -01:00
|
|
|
{
|
2016-04-28 08:48:59 +02:00
|
|
|
var repository = uow.CreateRepository<IDictionaryRepository>();
|
2015-01-13 13:25:36 +11:00
|
|
|
return repository.Get(key) != null;
|
2012-12-14 13:06:58 -01:00
|
|
|
}
|
2012-10-24 12:22:52 -02:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// Saves a <see cref="IDictionaryItem"/> object
|
|
|
|
|
/// </summary>
|
|
|
|
|
/// <param name="dictionaryItem"><see cref="IDictionaryItem"/> to save</param>
|
2012-12-10 14:53:36 -01:00
|
|
|
/// <param name="userId">Optional id of the user saving the dictionary item</param>
|
2013-01-25 08:58:21 -01:00
|
|
|
public void Save(IDictionaryItem dictionaryItem, int userId = 0)
|
2012-10-24 12:22:52 -02:00
|
|
|
{
|
2015-01-19 18:37:48 +11:00
|
|
|
if (SavingDictionaryItem.IsRaisedEventCancelled(new SaveEventArgs<IDictionaryItem>(dictionaryItem), this))
|
|
|
|
|
return;
|
|
|
|
|
|
2016-04-28 08:48:59 +02:00
|
|
|
using (var uow = UowProvider.GetUnitOfWork())
|
2015-01-19 18:37:48 +11:00
|
|
|
{
|
2016-04-28 08:48:59 +02:00
|
|
|
var repository = uow.CreateRepository<IDictionaryRepository>();
|
2015-01-19 18:37:48 +11:00
|
|
|
repository.AddOrUpdate(dictionaryItem);
|
2016-05-02 12:12:21 +02:00
|
|
|
uow.Complete();
|
2015-01-19 18:37:48 +11:00
|
|
|
}
|
2012-12-15 21:04:17 +05:00
|
|
|
|
2016-05-02 12:12:21 +02:00
|
|
|
// ensure the lazy Language callback is assigned
|
|
|
|
|
EnsureDictionaryItemLanguageCallback(dictionaryItem);
|
2014-01-10 14:48:31 +01:00
|
|
|
|
2016-05-02 12:12:21 +02:00
|
|
|
SavedDictionaryItem.RaiseEvent(new SaveEventArgs<IDictionaryItem>(dictionaryItem, false), this);
|
2015-01-19 18:37:48 +11:00
|
|
|
Audit(AuditType.Save, "Save DictionaryItem performed by user", userId, dictionaryItem.Id);
|
2012-10-24 12:22:52 -02:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// Deletes a <see cref="IDictionaryItem"/> object and its related translations
|
|
|
|
|
/// as well as its children.
|
|
|
|
|
/// </summary>
|
|
|
|
|
/// <param name="dictionaryItem"><see cref="IDictionaryItem"/> to delete</param>
|
2012-12-10 14:53:36 -01:00
|
|
|
/// <param name="userId">Optional id of the user deleting the dictionary item</param>
|
2013-01-25 08:58:21 -01:00
|
|
|
public void Delete(IDictionaryItem dictionaryItem, int userId = 0)
|
2012-10-24 12:22:52 -02:00
|
|
|
{
|
2015-01-19 18:37:48 +11:00
|
|
|
if (DeletingDictionaryItem.IsRaisedEventCancelled(new DeleteEventArgs<IDictionaryItem>(dictionaryItem), this))
|
|
|
|
|
return;
|
|
|
|
|
|
2016-04-28 08:48:59 +02:00
|
|
|
using (var uow = UowProvider.GetUnitOfWork())
|
2015-01-19 18:37:48 +11:00
|
|
|
{
|
2016-04-28 08:48:59 +02:00
|
|
|
var repository = uow.CreateRepository<IDictionaryRepository>();
|
2016-05-02 12:12:21 +02:00
|
|
|
repository.Delete(dictionaryItem); // recursive delete
|
|
|
|
|
uow.Complete();
|
2015-01-19 18:37:48 +11:00
|
|
|
}
|
2012-12-16 07:43:03 +05:00
|
|
|
|
2014-01-10 14:48:31 +01:00
|
|
|
DeletedDictionaryItem.RaiseEvent(new DeleteEventArgs<IDictionaryItem>(dictionaryItem, false), this);
|
2015-01-19 18:37:48 +11:00
|
|
|
Audit(AuditType.Delete, "Delete DictionaryItem performed by user", userId, dictionaryItem.Id);
|
2012-10-24 12:22:52 -02:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// Gets a <see cref="Language"/> by its id
|
|
|
|
|
/// </summary>
|
|
|
|
|
/// <param name="id">Id of the <see cref="Language"/></param>
|
|
|
|
|
/// <returns><see cref="Language"/></returns>
|
|
|
|
|
public ILanguage GetLanguageById(int id)
|
|
|
|
|
{
|
2016-04-28 08:48:59 +02:00
|
|
|
using (var uow = UowProvider.GetUnitOfWork())
|
2012-12-14 13:06:58 -01:00
|
|
|
{
|
2016-04-28 08:48:59 +02:00
|
|
|
var repository = uow.CreateRepository<ILanguageRepository>();
|
2012-12-14 13:06:58 -01:00
|
|
|
return repository.Get(id);
|
|
|
|
|
}
|
2012-10-24 12:22:52 -02:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// Gets a <see cref="Language"/> by its culture code
|
|
|
|
|
/// </summary>
|
2014-01-10 14:48:31 +01:00
|
|
|
/// <param name="cultureName">Culture Name - also refered to as the Friendly name</param>
|
|
|
|
|
/// <returns><see cref="Language"/></returns>
|
|
|
|
|
public ILanguage GetLanguageByCultureCode(string cultureName)
|
|
|
|
|
{
|
2016-04-28 08:48:59 +02:00
|
|
|
using (var uow = UowProvider.GetUnitOfWork())
|
2014-01-10 14:48:31 +01:00
|
|
|
{
|
2016-04-28 08:48:59 +02:00
|
|
|
var repository = uow.CreateRepository<ILanguageRepository>();
|
2015-01-13 13:25:36 +11:00
|
|
|
return repository.GetByCultureName(cultureName);
|
2014-01-10 14:48:31 +01:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// Gets a <see cref="Language"/> by its iso code
|
|
|
|
|
/// </summary>
|
|
|
|
|
/// <param name="isoCode">Iso Code of the language (ie. en-US)</param>
|
2012-10-24 12:22:52 -02:00
|
|
|
/// <returns><see cref="Language"/></returns>
|
2014-01-10 14:48:31 +01:00
|
|
|
public ILanguage GetLanguageByIsoCode(string isoCode)
|
2012-10-24 12:22:52 -02:00
|
|
|
{
|
2016-04-28 08:48:59 +02:00
|
|
|
using (var uow = UowProvider.GetUnitOfWork())
|
2012-12-14 13:06:58 -01:00
|
|
|
{
|
2016-04-28 08:48:59 +02:00
|
|
|
var repository = uow.CreateRepository<ILanguageRepository>();
|
2015-01-13 13:25:36 +11:00
|
|
|
return repository.GetByIsoCode(isoCode);
|
2012-12-14 13:06:58 -01:00
|
|
|
}
|
2012-10-24 12:22:52 -02:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// Gets all available languages
|
|
|
|
|
/// </summary>
|
|
|
|
|
/// <returns>An enumerable list of <see cref="ILanguage"/> objects</returns>
|
|
|
|
|
public IEnumerable<ILanguage> GetAllLanguages()
|
|
|
|
|
{
|
2016-04-28 08:48:59 +02:00
|
|
|
using (var uow = UowProvider.GetUnitOfWork())
|
2012-12-14 13:06:58 -01:00
|
|
|
{
|
2016-04-28 08:48:59 +02:00
|
|
|
var repository = uow.CreateRepository<ILanguageRepository>();
|
2012-12-14 13:06:58 -01:00
|
|
|
var languages = repository.GetAll();
|
|
|
|
|
return languages;
|
|
|
|
|
}
|
2012-10-24 12:22:52 -02:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// Saves a <see cref="ILanguage"/> object
|
|
|
|
|
/// </summary>
|
|
|
|
|
/// <param name="language"><see cref="ILanguage"/> to save</param>
|
2012-12-10 14:53:36 -01:00
|
|
|
/// <param name="userId">Optional id of the user saving the language</param>
|
2013-01-25 08:58:21 -01:00
|
|
|
public void Save(ILanguage language, int userId = 0)
|
2012-10-24 12:22:52 -02:00
|
|
|
{
|
2015-01-19 18:37:48 +11:00
|
|
|
if (SavingLanguage.IsRaisedEventCancelled(new SaveEventArgs<ILanguage>(language), this))
|
|
|
|
|
return;
|
|
|
|
|
|
2016-04-28 08:48:59 +02:00
|
|
|
using (var uow = UowProvider.GetUnitOfWork())
|
2015-01-19 18:37:48 +11:00
|
|
|
{
|
2016-04-28 08:48:59 +02:00
|
|
|
var repository = uow.CreateRepository<ILanguageRepository>();
|
2015-01-19 18:37:48 +11:00
|
|
|
repository.AddOrUpdate(language);
|
2016-05-02 12:12:21 +02:00
|
|
|
uow.Complete();
|
2015-01-19 18:37:48 +11:00
|
|
|
}
|
2012-12-15 21:04:17 +05:00
|
|
|
|
2014-01-10 14:48:31 +01:00
|
|
|
SavedLanguage.RaiseEvent(new SaveEventArgs<ILanguage>(language, false), this);
|
|
|
|
|
|
2015-01-19 18:37:48 +11:00
|
|
|
Audit(AuditType.Save, "Save Language performed by user", userId, language.Id);
|
2012-10-24 12:22:52 -02:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// Deletes a <see cref="ILanguage"/> by removing it (but not its usages) from the db
|
|
|
|
|
/// </summary>
|
|
|
|
|
/// <param name="language"><see cref="ILanguage"/> to delete</param>
|
2012-12-10 14:53:36 -01:00
|
|
|
/// <param name="userId">Optional id of the user deleting the language</param>
|
2013-01-25 08:58:21 -01:00
|
|
|
public void Delete(ILanguage language, int userId = 0)
|
2012-10-24 12:22:52 -02:00
|
|
|
{
|
2015-01-19 18:37:48 +11:00
|
|
|
if (DeletingLanguage.IsRaisedEventCancelled(new DeleteEventArgs<ILanguage>(language), this))
|
|
|
|
|
return;
|
|
|
|
|
|
2016-04-28 08:48:59 +02:00
|
|
|
using (var uow = UowProvider.GetUnitOfWork())
|
2015-01-19 18:37:48 +11:00
|
|
|
{
|
2016-04-28 08:48:59 +02:00
|
|
|
var repository = uow.CreateRepository<ILanguageRepository>();
|
2015-01-19 18:37:48 +11:00
|
|
|
//NOTE: There isn't any constraints in the db, so possible references aren't deleted
|
|
|
|
|
repository.Delete(language);
|
2016-05-02 12:12:21 +02:00
|
|
|
uow.Complete();
|
2015-01-19 18:37:48 +11:00
|
|
|
}
|
2012-12-16 07:43:03 +05:00
|
|
|
|
2014-01-10 14:48:31 +01:00
|
|
|
DeletedLanguage.RaiseEvent(new DeleteEventArgs<ILanguage>(language, false), this);
|
|
|
|
|
|
2015-01-19 18:37:48 +11:00
|
|
|
Audit(AuditType.Delete, "Delete Language performed by user", userId, language.Id);
|
2015-01-19 15:12:34 +11:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private void Audit(AuditType type, string message, int userId, int objectId)
|
|
|
|
|
{
|
2016-04-28 08:48:59 +02:00
|
|
|
using (var uow = UowProvider.GetUnitOfWork())
|
2015-01-19 15:12:34 +11:00
|
|
|
{
|
2016-04-28 08:48:59 +02:00
|
|
|
var repo = uow.CreateRepository<IAuditRepository>();
|
|
|
|
|
repo.AddOrUpdate(new AuditItem(objectId, message, type, userId));
|
2016-05-02 12:12:21 +02:00
|
|
|
uow.Complete();
|
2015-01-19 15:12:34 +11:00
|
|
|
}
|
2012-10-24 12:22:52 -02:00
|
|
|
}
|
2012-12-10 14:53:36 -01:00
|
|
|
|
2016-01-07 18:44:04 +01:00
|
|
|
/// <summary>
|
|
|
|
|
/// This is here to take care of a hack - the DictionaryTranslation model contains an ILanguage reference which we don't want but
|
|
|
|
|
/// we cannot remove it because it would be a large breaking change, so we need to make sure it's resolved lazily. This is because
|
|
|
|
|
/// if developers have a lot of dictionary items and translations, the caching and cloning size gets much much larger because of
|
|
|
|
|
/// the large object graphs. So now we don't cache or clone the attached ILanguage
|
|
|
|
|
/// </summary>
|
|
|
|
|
private void EnsureDictionaryItemLanguageCallback(IDictionaryItem d)
|
|
|
|
|
{
|
|
|
|
|
var item = d as DictionaryItem;
|
|
|
|
|
if (item == null) return;
|
|
|
|
|
|
|
|
|
|
item.GetLanguage = GetLanguageById;
|
|
|
|
|
foreach (var trans in item.Translations.OfType<DictionaryTranslation>())
|
|
|
|
|
trans.GetLanguage = GetLanguageById;
|
|
|
|
|
}
|
|
|
|
|
|
2012-12-10 14:53:36 -01:00
|
|
|
#region Event Handlers
|
2015-01-19 18:37:48 +11:00
|
|
|
/// <summary>
|
2012-12-10 14:53:36 -01:00
|
|
|
/// Occurs before Delete
|
|
|
|
|
/// </summary>
|
2015-01-19 18:37:48 +11:00
|
|
|
public static event TypedEventHandler<ILocalizationService, DeleteEventArgs<ILanguage>> DeletingLanguage;
|
2012-12-10 14:53:36 -01:00
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// Occurs after Delete
|
|
|
|
|
/// </summary>
|
2015-01-19 18:37:48 +11:00
|
|
|
public static event TypedEventHandler<ILocalizationService, DeleteEventArgs<ILanguage>> DeletedLanguage;
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// Occurs before Delete
|
|
|
|
|
/// </summary>
|
|
|
|
|
public static event TypedEventHandler<ILocalizationService, DeleteEventArgs<IDictionaryItem>> DeletingDictionaryItem;
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// Occurs after Delete
|
|
|
|
|
/// </summary>
|
|
|
|
|
public static event TypedEventHandler<ILocalizationService, DeleteEventArgs<IDictionaryItem>> DeletedDictionaryItem;
|
2012-12-10 14:53:36 -01:00
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// Occurs before Save
|
|
|
|
|
/// </summary>
|
2015-01-19 18:37:48 +11:00
|
|
|
public static event TypedEventHandler<ILocalizationService, SaveEventArgs<IDictionaryItem>> SavingDictionaryItem;
|
2012-12-10 14:53:36 -01:00
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// Occurs after Save
|
|
|
|
|
/// </summary>
|
2015-01-19 18:37:48 +11:00
|
|
|
public static event TypedEventHandler<ILocalizationService, SaveEventArgs<IDictionaryItem>> SavedDictionaryItem;
|
2012-12-15 21:04:17 +05:00
|
|
|
|
2015-01-19 18:37:48 +11:00
|
|
|
/// <summary>
|
|
|
|
|
/// Occurs before Save
|
|
|
|
|
/// </summary>
|
|
|
|
|
public static event TypedEventHandler<ILocalizationService, SaveEventArgs<ILanguage>> SavingLanguage;
|
2012-12-15 21:04:17 +05:00
|
|
|
|
2015-01-19 18:37:48 +11:00
|
|
|
/// <summary>
|
|
|
|
|
/// Occurs after Save
|
|
|
|
|
/// </summary>
|
|
|
|
|
public static event TypedEventHandler<ILocalizationService, SaveEventArgs<ILanguage>> SavedLanguage;
|
2012-12-10 14:53:36 -01:00
|
|
|
#endregion
|
2012-10-24 12:22:52 -02:00
|
|
|
}
|
|
|
|
|
}
|