diff --git a/src/Umbraco.Core/Models/ContentEditing/Language.cs b/src/Umbraco.Core/Models/ContentEditing/Language.cs index bc9aa6f881..0a0ed03a2a 100644 --- a/src/Umbraco.Core/Models/ContentEditing/Language.cs +++ b/src/Umbraco.Core/Models/ContentEditing/Language.cs @@ -1,4 +1,3 @@ -using System.ComponentModel; using System.ComponentModel.DataAnnotations; using System.Runtime.Serialization; @@ -12,10 +11,9 @@ namespace Umbraco.Cms.Core.Models.ContentEditing [DataMember(Name = "culture", IsRequired = true)] [Required(AllowEmptyStrings = false)] - public string? IsoCode { get; set; } + public string IsoCode { get; set; } = null!; [DataMember(Name = "name")] - [ReadOnly(true)] public string? Name { get; set; } [DataMember(Name = "isDefault")] diff --git a/src/Umbraco.Core/Models/ILanguage.cs b/src/Umbraco.Core/Models/ILanguage.cs index fc20642464..de5170cff6 100644 --- a/src/Umbraco.Core/Models/ILanguage.cs +++ b/src/Umbraco.Core/Models/ILanguage.cs @@ -1,4 +1,4 @@ -using System.Globalization; +using System.Globalization; using System.Runtime.Serialization; using Umbraco.Cms.Core.Models.Entities; @@ -19,7 +19,7 @@ namespace Umbraco.Cms.Core.Models /// Gets or sets the culture name of the language. /// [DataMember] - string? CultureName { get; set; } + string CultureName { get; set; } /// /// Gets the object for the language. diff --git a/src/Umbraco.Core/Models/Language.cs b/src/Umbraco.Core/Models/Language.cs index 4d976e7f26..20d936af61 100644 --- a/src/Umbraco.Core/Models/Language.cs +++ b/src/Umbraco.Core/Models/Language.cs @@ -1,7 +1,5 @@ -using System; using System.Globalization; using System.Runtime.Serialization; -using System.Threading; using Umbraco.Cms.Core.Configuration.Models; using Umbraco.Cms.Core.Models.Entities; @@ -14,18 +12,28 @@ namespace Umbraco.Cms.Core.Models [DataContract(IsReference = true)] public class Language : EntityBase, ILanguage { - private readonly GlobalSettings _globalSettings; - - private string _isoCode = null!; - private string? _cultureName; + private string _isoCode; + private string _cultureName; private bool _isDefaultVariantLanguage; private bool _mandatory; private int? _fallbackLanguageId; + /// + /// Initializes a new instance of the class. + /// + /// The ISO code of the language. + /// The name of the language. + public Language(string isoCode, string cultureName) + { + _isoCode = isoCode ?? throw new ArgumentNullException(nameof(isoCode)); + _cultureName = cultureName ?? throw new ArgumentNullException(nameof(cultureName)); + } + + [Obsolete("Use the constructor not requiring global settings and accepting an explicit name instead, scheduled for removal in V11.")] public Language(GlobalSettings globalSettings, string isoCode) { - IsoCode = isoCode; - _globalSettings = globalSettings; + _isoCode = isoCode ?? throw new ArgumentNullException(nameof(isoCode)); + _cultureName = CultureInfo.GetCultureInfo(isoCode).EnglishName; } /// @@ -33,64 +41,25 @@ namespace Umbraco.Cms.Core.Models public string IsoCode { get => _isoCode; - set => SetPropertyValueAndDetectChanges(value, ref _isoCode!, nameof(IsoCode)); + set + { + ArgumentNullException.ThrowIfNull(value); + + SetPropertyValueAndDetectChanges(value, ref _isoCode!, nameof(IsoCode)); + } } /// [DataMember] - public string? CultureName + public string CultureName { - // CultureInfo.DisplayName is the name in the installed .NET language - // .NativeName is the name in culture info's language - // .EnglishName is the name in English - // - // there is no easy way to get the name in a specified culture (which would need to be installed on the server) - // this works: - // var rm = new ResourceManager("mscorlib", typeof(int).Assembly); - // var name = rm.GetString("Globalization.ci_" + culture.Name, displayCulture); - // but can we rely on it? - // - // and... DisplayName is captured and cached in culture infos returned by GetCultureInfo(), using - // the value for the current thread culture at the moment it is first retrieved - whereas creating - // a new CultureInfo() creates a new instance, which _then_ can get DisplayName again in a different - // culture - // - // I assume that, on a site, all language names should be in the SAME language, in DB, - // and that would be the Umbraco.Core.DefaultUILanguage (app setting) - BUT if by accident - // ANY culture has been retrieved with another current thread culture - it's now corrupt - // - // so, the logic below ensures that the name always end up being the correct name - // see also LanguageController.GetAllCultures which is doing the same - // - // all this, including the ugly settings injection, because se store language names in db, - // otherwise it would be ok to simply return new CultureInfo(IsoCode).DisplayName to get the name - // in whatever culture is current - we should not do it, see task #3623 - // - // but then, some tests that compare audit strings (for culture names) would need to be fixed - - get + get => _cultureName; + set { - if (_cultureName != null) return _cultureName; + ArgumentNullException.ThrowIfNull(value); - // capture - var threadUiCulture = Thread.CurrentThread.CurrentUICulture; - - try - { - var defaultUiCulture = CultureInfo.GetCultureInfo(_globalSettings.DefaultUILanguage); - Thread.CurrentThread.CurrentUICulture = defaultUiCulture; - - // get name - new-ing an instance to get proper display name - return new CultureInfo(IsoCode).DisplayName; - } - finally - { - // restore - Thread.CurrentThread.CurrentUICulture = threadUiCulture; - } + SetPropertyValueAndDetectChanges(value, ref _cultureName!, nameof(CultureName)); } - - set => SetPropertyValueAndDetectChanges(value, ref _cultureName, nameof(CultureName)); } /// diff --git a/src/Umbraco.Core/Models/Mapping/DictionaryMapDefinition.cs b/src/Umbraco.Core/Models/Mapping/DictionaryMapDefinition.cs index 6d46ffc673..a5db1d4b96 100644 --- a/src/Umbraco.Core/Models/Mapping/DictionaryMapDefinition.cs +++ b/src/Umbraco.Core/Models/Mapping/DictionaryMapDefinition.cs @@ -84,7 +84,7 @@ namespace Umbraco.Cms.Core.Models.Mapping target.Translations.Add(new DictionaryTranslationDisplay { IsoCode = lang.IsoCode, - DisplayName = lang.CultureInfo?.DisplayName, + DisplayName = lang.CultureName, Translation = translation?.Value ?? string.Empty, LanguageId = lang.Id }); @@ -106,7 +106,7 @@ namespace Umbraco.Cms.Core.Models.Mapping target.Translations.Add( new DictionaryOverviewTranslationDisplay { - DisplayName = lang.CultureInfo?.DisplayName, + DisplayName = lang.CultureName, HasTranslation = translation != null && string.IsNullOrEmpty(translation.Value) == false }); } diff --git a/src/Umbraco.Core/Models/Mapping/LanguageMapDefinition.cs b/src/Umbraco.Core/Models/Mapping/LanguageMapDefinition.cs index 8234244e38..7450ec62b4 100644 --- a/src/Umbraco.Core/Models/Mapping/LanguageMapDefinition.cs +++ b/src/Umbraco.Core/Models/Mapping/LanguageMapDefinition.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Collections.Generic; using System.Linq; using Umbraco.Cms.Core.Mapping; @@ -31,7 +31,7 @@ namespace Umbraco.Cms.Core.Models.Mapping { target.Id = source.Id; target.IsoCode = source.IsoCode; - target.Name = source.CultureInfo?.DisplayName; + target.Name = source.CultureName; target.IsDefault = source.IsDefault; target.IsMandatory = source.IsMandatory; target.FallbackLanguageId = source.FallbackLanguageId; diff --git a/src/Umbraco.Infrastructure/DependencyInjection/UmbracoBuilder.CoreServices.cs b/src/Umbraco.Infrastructure/DependencyInjection/UmbracoBuilder.CoreServices.cs index 546b216aab..05eda0e94d 100644 --- a/src/Umbraco.Infrastructure/DependencyInjection/UmbracoBuilder.CoreServices.cs +++ b/src/Umbraco.Infrastructure/DependencyInjection/UmbracoBuilder.CoreServices.cs @@ -1,4 +1,3 @@ -using System.Runtime.InteropServices; using Examine; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Logging; @@ -47,7 +46,6 @@ using Umbraco.Cms.Infrastructure.Media; using Umbraco.Cms.Infrastructure.Migrations; using Umbraco.Cms.Infrastructure.Migrations.Install; using Umbraco.Cms.Infrastructure.Migrations.PostMigrations; -using Umbraco.Cms.Infrastructure.Packaging; using Umbraco.Cms.Infrastructure.Migrations.Upgrade.V_8_0_0.DataTypes; using Umbraco.Cms.Infrastructure.Persistence; using Umbraco.Cms.Infrastructure.Persistence.Mappers; @@ -55,7 +53,6 @@ using Umbraco.Cms.Infrastructure.Runtime; using Umbraco.Cms.Infrastructure.Scoping; using Umbraco.Cms.Infrastructure.Search; using Umbraco.Cms.Infrastructure.Serialization; -using Umbraco.Cms.Infrastructure.Services; using Umbraco.Cms.Infrastructure.Services.Implement; using Umbraco.Extensions; @@ -104,7 +101,6 @@ namespace Umbraco.Cms.Infrastructure.DependencyInjection builder.Services.AddSingleton(f => f.GetRequiredService()); builder.Services.AddSingleton(f => f.GetRequiredService()); - builder.Services.AddScoped(); builder.Services.AddSingleton(); @@ -202,8 +198,6 @@ namespace Umbraco.Cms.Infrastructure.DependencyInjection builder.Services.AddSingleton(SixLabors.ImageSharp.Configuration.Default); builder.Services.AddSingleton(); - builder.Services.AddSingleton(); - builder.Services.AddTransient(); builder.AddInstaller(); diff --git a/src/Umbraco.Infrastructure/DependencyInjection/UmbracoBuilder.Services.cs b/src/Umbraco.Infrastructure/DependencyInjection/UmbracoBuilder.Services.cs index 7fa36bc910..eff921077c 100644 --- a/src/Umbraco.Infrastructure/DependencyInjection/UmbracoBuilder.Services.cs +++ b/src/Umbraco.Infrastructure/DependencyInjection/UmbracoBuilder.Services.cs @@ -1,21 +1,23 @@ -using System; -using System.IO; -using System.Linq; using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Hosting; using Microsoft.Extensions.Logging; using Microsoft.Extensions.Options; using Umbraco.Cms.Core; using Umbraco.Cms.Core.Cache; using Umbraco.Cms.Core.Configuration.Models; using Umbraco.Cms.Core.DependencyInjection; -using Umbraco.Cms.Core.Hosting; +using Umbraco.Cms.Core.Extensions; using Umbraco.Cms.Core.IO; using Umbraco.Cms.Core.Packaging; +using Umbraco.Cms.Core.PropertyEditors; using Umbraco.Cms.Core.Routing; +using Umbraco.Cms.Core.Serialization; using Umbraco.Cms.Core.Services; using Umbraco.Cms.Core.Services.Implement; +using Umbraco.Cms.Core.Strings; using Umbraco.Cms.Infrastructure.Packaging; using Umbraco.Cms.Infrastructure.Persistence.Repositories.Implement; +using Umbraco.Cms.Infrastructure.Scoping; using Umbraco.Cms.Infrastructure.Services; using Umbraco.Cms.Infrastructure.Services.Implement; using Umbraco.Cms.Infrastructure.Telemetry.Providers; @@ -45,10 +47,10 @@ namespace Umbraco.Cms.Infrastructure.DependencyInjection builder.Services.AddUnique(); builder.Services.AddUnique(); builder.Services.AddUnique(); - builder.Services.AddTransient(LocalizedTextServiceFileSourcesFactory); + builder.Services.AddTransient(CreateLocalizedTextServiceFileSourcesFactory); builder.Services.AddUnique(factory => CreatePackageRepository(factory, "createdPackages.config")); builder.Services.AddUnique(); - builder.Services.AddSingleton(); + builder.Services.AddSingleton(CreatePackageDataInstallation); builder.Services.AddUnique(); builder.Services.AddUnique(); builder.Services.AddTransient(); @@ -56,10 +58,21 @@ namespace Umbraco.Cms.Infrastructure.DependencyInjection builder.Services.AddTransient(); builder.Services.AddTransient(); - return builder; } + private static LocalizedTextServiceFileSources CreateLocalizedTextServiceFileSourcesFactory(IServiceProvider container) + { + var hostEnvironment = container.GetRequiredService(); + var mainLangFolder = new DirectoryInfo(hostEnvironment.MapPathContentRoot(WebPath.Combine(Constants.SystemDirectories.Umbraco, "config", "lang"))); + + return new LocalizedTextServiceFileSources( + container.GetRequiredService>(), + container.GetRequiredService(), + mainLangFolder, + container.GetServices()); + } + private static PackagesRepository CreatePackageRepository(IServiceProvider factory, string packageRepoFileName) => new PackagesRepository( factory.GetRequiredService(), @@ -68,7 +81,7 @@ namespace Umbraco.Cms.Infrastructure.DependencyInjection factory.GetRequiredService(), factory.GetRequiredService(), factory.GetRequiredService(), - factory.GetRequiredService(), + factory.GetRequiredService(), factory.GetRequiredService(), factory.GetRequiredService>(), factory.GetRequiredService(), @@ -77,16 +90,24 @@ namespace Umbraco.Cms.Infrastructure.DependencyInjection factory.GetRequiredService(), packageRepoFileName); - private static LocalizedTextServiceFileSources LocalizedTextServiceFileSourcesFactory(IServiceProvider container) - { - var hostingEnvironment = container.GetRequiredService(); - var mainLangFolder = new DirectoryInfo(hostingEnvironment.MapPathContentRoot(WebPath.Combine(Constants.SystemDirectories.Umbraco, "config", "lang"))); + // Factory registration is only required because of ambiguous constructor + private static PackageDataInstallation CreatePackageDataInstallation(IServiceProvider factory) + => new PackageDataInstallation( + factory.GetRequiredService(), + factory.GetRequiredService>(), + factory.GetRequiredService(), + factory.GetRequiredService(), + factory.GetRequiredService(), + factory.GetRequiredService(), + factory.GetRequiredService(), + factory.GetRequiredService(), + factory.GetRequiredService(), + factory.GetRequiredService(), + factory.GetRequiredService(), + factory.GetRequiredService(), + factory.GetRequiredService(), + factory.GetRequiredService(), + factory.GetRequiredService()); - return new LocalizedTextServiceFileSources( - container.GetRequiredService>(), - container.GetRequiredService(), - mainLangFolder, - container.GetServices()); - } } } diff --git a/src/Umbraco.Infrastructure/Packaging/PackageDataInstallation.cs b/src/Umbraco.Infrastructure/Packaging/PackageDataInstallation.cs index 1a72fa19b5..69271baf2c 100644 --- a/src/Umbraco.Infrastructure/Packaging/PackageDataInstallation.cs +++ b/src/Umbraco.Infrastructure/Packaging/PackageDataInstallation.cs @@ -1,7 +1,4 @@ -using System; -using System.Collections.Generic; using System.Globalization; -using System.Linq; using System.Net; using System.Xml.Linq; using System.Xml.XPath; @@ -16,10 +13,10 @@ using Umbraco.Cms.Core.Models.Entities; using Umbraco.Cms.Core.Models.Packaging; using Umbraco.Cms.Core.Packaging; using Umbraco.Cms.Core.PropertyEditors; -using Umbraco.Cms.Core.Scoping; using Umbraco.Cms.Core.Serialization; using Umbraco.Cms.Core.Services; using Umbraco.Cms.Core.Strings; +using Umbraco.Cms.Infrastructure.Scoping; using Umbraco.Extensions; namespace Umbraco.Cms.Infrastructure.Packaging @@ -35,11 +32,9 @@ namespace Umbraco.Cms.Infrastructure.Packaging private readonly PropertyEditorCollection _propertyEditors; private readonly IScopeProvider _scopeProvider; private readonly IShortStringHelper _shortStringHelper; - private readonly GlobalSettings _globalSettings; private readonly IConfigurationEditorJsonSerializer _serializer; private readonly IMediaService _mediaService; private readonly IMediaTypeService _mediaTypeService; - private readonly IHostingEnvironment _hostingEnvironment; private readonly IEntityService _entityService; private readonly IContentTypeService _contentTypeService; private readonly IContentService _contentService; @@ -57,11 +52,9 @@ namespace Umbraco.Cms.Infrastructure.Packaging PropertyEditorCollection propertyEditors, IScopeProvider scopeProvider, IShortStringHelper shortStringHelper, - IOptions globalSettings, IConfigurationEditorJsonSerializer serializer, IMediaService mediaService, - IMediaTypeService mediaTypeService, - IHostingEnvironment hostingEnvironment) + IMediaTypeService mediaTypeService) { _dataValueEditorFactory = dataValueEditorFactory; _logger = logger; @@ -69,22 +62,58 @@ namespace Umbraco.Cms.Infrastructure.Packaging _macroService = macroService; _localizationService = localizationService; _dataTypeService = dataTypeService; - _propertyEditors = propertyEditors; - _scopeProvider = scopeProvider; - _shortStringHelper = shortStringHelper; - _globalSettings = globalSettings.Value; - _serializer = serializer; - _mediaService = mediaService; - _mediaTypeService = mediaTypeService; - _hostingEnvironment = hostingEnvironment; _entityService = entityService; _contentTypeService = contentTypeService; _contentService = contentService; + _propertyEditors = propertyEditors; + _scopeProvider = scopeProvider; + _shortStringHelper = shortStringHelper; + _serializer = serializer; + _mediaService = mediaService; + _mediaTypeService = mediaTypeService; } + // Also remove factory service registration when this constructor is removed + [Obsolete("Use the constructor with Infrastructure.IScopeProvider and without global settings and hosting environment instead.")] + public PackageDataInstallation( + IDataValueEditorFactory dataValueEditorFactory, + ILogger logger, + IFileService fileService, + IMacroService macroService, + ILocalizationService localizationService, + IDataTypeService dataTypeService, + IEntityService entityService, + IContentTypeService contentTypeService, + IContentService contentService, + PropertyEditorCollection propertyEditors, + Core.Scoping.IScopeProvider scopeProvider, + IShortStringHelper shortStringHelper, + IOptions globalSettings, + IConfigurationEditorJsonSerializer serializer, + IMediaService mediaService, + IMediaTypeService mediaTypeService, + IHostingEnvironment hostingEnvironment) + : this( + dataValueEditorFactory, + logger, + fileService, + macroService, + localizationService, + dataTypeService, + entityService, + contentTypeService, + contentService, + propertyEditors, + scopeProvider, + shortStringHelper, + serializer, + mediaService, + mediaTypeService) + { } + #region Install/Uninstall - public InstallationSummary InstallPackageData(CompiledPackage compiledPackage, int userId) + public InstallationSummary InstallPackageData(CompiledPackage compiledPackage, int userId) { using (var scope = _scopeProvider.CreateScope()) { @@ -1435,14 +1464,22 @@ namespace Umbraco.Cms.Infrastructure.Packaging foreach (var languageElement in languageElements) { var isoCode = languageElement.AttributeValue("CultureAlias"); + if (string.IsNullOrEmpty(isoCode)) + { + continue; + } + var existingLanguage = _localizationService.GetLanguageByIsoCode(isoCode); if (existingLanguage != null) - continue; - var langauge = new Language(_globalSettings, isoCode!) { - CultureName = languageElement.AttributeValue("FriendlyName")! - }; + continue; + } + + var cultureName = languageElement.AttributeValue("FriendlyName") ?? isoCode; + + var langauge = new Language(isoCode, cultureName); _localizationService.Save(langauge, userId); + list.Add(langauge); } diff --git a/src/Umbraco.Infrastructure/Persistence/Factories/LanguageFactory.cs b/src/Umbraco.Infrastructure/Persistence/Factories/LanguageFactory.cs index 2de56aa44d..2c7c6c081e 100644 --- a/src/Umbraco.Infrastructure/Persistence/Factories/LanguageFactory.cs +++ b/src/Umbraco.Infrastructure/Persistence/Factories/LanguageFactory.cs @@ -1,5 +1,3 @@ -using System.Globalization; -using Umbraco.Cms.Core.Configuration.Models; using Umbraco.Cms.Core.Models; using Umbraco.Cms.Infrastructure.Persistence.Dtos; @@ -7,28 +5,36 @@ namespace Umbraco.Cms.Infrastructure.Persistence.Factories { internal static class LanguageFactory { - public static ILanguage BuildEntity(GlobalSettings globalSettings, LanguageDto dto) + public static ILanguage BuildEntity(LanguageDto dto) { - var lang = new Language(globalSettings, dto.IsoCode!) + ArgumentNullException.ThrowIfNull(dto); + if (dto.IsoCode == null || dto.CultureName == null) + { + throw new InvalidOperationException("Language ISO code and/or culture name can't be null."); + } + + var lang = new Language(dto.IsoCode, dto.CultureName) { - CultureName = dto.CultureName, Id = dto.Id, IsDefault = dto.IsDefault, IsMandatory = dto.IsMandatory, FallbackLanguageId = dto.FallbackLanguageId }; - // reset dirty initial properties (U4-1946) + // Reset dirty initial properties lang.ResetDirtyProperties(false); + return lang; } public static LanguageDto BuildDto(ILanguage entity) { + ArgumentNullException.ThrowIfNull(entity); + var dto = new LanguageDto { - CultureName = entity.CultureName, IsoCode = entity.IsoCode, + CultureName = entity.CultureName, IsDefault = entity.IsDefault, IsMandatory = entity.IsMandatory, FallbackLanguageId = entity.FallbackLanguageId @@ -36,7 +42,7 @@ namespace Umbraco.Cms.Infrastructure.Persistence.Factories if (entity.HasIdentity) { - dto.Id = short.Parse(entity.Id.ToString(CultureInfo.InvariantCulture)); + dto.Id = (short)entity.Id; } return dto; diff --git a/src/Umbraco.Infrastructure/Persistence/Repositories/Implement/LanguageRepository.cs b/src/Umbraco.Infrastructure/Persistence/Repositories/Implement/LanguageRepository.cs index 92806b0043..bf1bc4f4b4 100644 --- a/src/Umbraco.Infrastructure/Persistence/Repositories/Implement/LanguageRepository.cs +++ b/src/Umbraco.Infrastructure/Persistence/Repositories/Implement/LanguageRepository.cs @@ -23,15 +23,12 @@ namespace Umbraco.Cms.Infrastructure.Persistence.Repositories.Implement /// internal class LanguageRepository : EntityRepositoryBase, ILanguageRepository { - private readonly GlobalSettings _globalSettings; private readonly Dictionary _codeIdMap = new Dictionary(StringComparer.OrdinalIgnoreCase); private readonly Dictionary _idCodeMap = new Dictionary(); - public LanguageRepository(IScopeAccessor scopeAccessor, AppCaches cache, ILogger logger, IOptions globalSettings) + public LanguageRepository(IScopeAccessor scopeAccessor, AppCaches cache, ILogger logger) : base(scopeAccessor, cache, logger) - { - _globalSettings = globalSettings.Value; - } + { } protected override IRepositoryCachePolicy CreateCachePolicy() { @@ -238,17 +235,15 @@ namespace Umbraco.Cms.Infrastructure.Persistence.Repositories.Implement #endregion protected ILanguage ConvertFromDto(LanguageDto dto) - { - var entity = LanguageFactory.BuildEntity(_globalSettings, dto); - return entity; - } + => LanguageFactory.BuildEntity(dto); public ILanguage? GetByIsoCode(string isoCode) { // ensure cache is populated, in a non-expensive way if (TypedCachePolicy != null) + { TypedCachePolicy.GetAllCached(PerformGetAll); - + } var id = GetIdByIsoCode(isoCode, throwOnNotFound: false); return id.HasValue ? Get(id.Value) : null; diff --git a/src/Umbraco.Web.BackOffice/Controllers/LanguageController.cs b/src/Umbraco.Web.BackOffice/Controllers/LanguageController.cs index cef800fcb6..1ed6efe9c6 100644 --- a/src/Umbraco.Web.BackOffice/Controllers/LanguageController.cs +++ b/src/Umbraco.Web.BackOffice/Controllers/LanguageController.cs @@ -1,9 +1,7 @@ -using System; -using System.Collections.Generic; using System.Globalization; -using System.Linq; using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; +using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Options; using Umbraco.Cms.Core.Configuration.Models; using Umbraco.Cms.Core.Mapping; @@ -25,36 +23,26 @@ namespace Umbraco.Cms.Web.BackOffice.Controllers { private readonly ILocalizationService _localizationService; private readonly IUmbracoMapper _umbracoMapper; - private readonly GlobalSettings _globalSettings; - public LanguageController(ILocalizationService localizationService, - IUmbracoMapper umbracoMapper, - IOptionsSnapshot globalSettings) + [ActivatorUtilitiesConstructor] + public LanguageController(ILocalizationService localizationService, IUmbracoMapper umbracoMapper) { _localizationService = localizationService ?? throw new ArgumentNullException(nameof(localizationService)); _umbracoMapper = umbracoMapper ?? throw new ArgumentNullException(nameof(umbracoMapper)); - _globalSettings = globalSettings.Value ?? throw new ArgumentNullException(nameof(globalSettings)); } + [Obsolete("Use the constructor without global settings instead, scheduled for removal in V11.")] + public LanguageController(ILocalizationService localizationService, IUmbracoMapper umbracoMapper, IOptionsSnapshot globalSettings) + : this(localizationService, umbracoMapper) + { } + /// /// Returns all cultures available for creating languages. /// /// [HttpGet] public IDictionary GetAllCultures() - { - // get cultures - new-ing instances to get proper display name, - // in the current culture, and not the cached one - // (see notes in Language class about culture info names) - // TODO: Fix this requirement, see https://github.com/umbraco/Umbraco-CMS/issues/3623 - return CultureInfo.GetCultures(CultureTypes.AllCultures) - .Select(x=>x.Name) - .Distinct() - .Where(x => !x.IsNullOrWhiteSpace()) - .Select(x => new CultureInfo(x)) // important! - .OrderBy(x => x.EnglishName) - .ToDictionary(x => x.Name, x => x.EnglishName); - } + => CultureInfo.GetCultures(CultureTypes.AllCultures).DistinctBy(x => x.Name).OrderBy(x => x.EnglishName).ToDictionary(x => x.Name, x => x.EnglishName); /// /// Returns all currently configured languages. @@ -73,7 +61,9 @@ namespace Umbraco.Cms.Web.BackOffice.Controllers { var lang = _localizationService.GetLanguageById(id); if (lang == null) + { return NotFound(); + } return _umbracoMapper.Map(lang); } @@ -101,7 +91,6 @@ namespace Umbraco.Cms.Web.BackOffice.Controllers // service is happy deleting a language that's fallback for another language, // will just remove it - so no need to check here - _localizationService.Delete(language); return Ok(); @@ -115,7 +104,9 @@ namespace Umbraco.Cms.Web.BackOffice.Controllers public ActionResult SaveLanguage(Language language) { if (!ModelState.IsValid) + { return ValidationProblem(ModelState); + } // this is prone to race conditions but the service will not let us proceed anyways var existingByCulture = _localizationService.GetLanguageByIsoCode(language.IsoCode); @@ -129,17 +120,15 @@ namespace Umbraco.Cms.Web.BackOffice.Controllers if (existingByCulture != null && language.Id != existingByCulture.Id) { - //someone is trying to create a language that already exist + // Someone is trying to create a language that already exist ModelState.AddModelError("IsoCode", "The language " + language.IsoCode + " already exists"); return ValidationProblem(ModelState); } var existingById = language.Id != default ? _localizationService.GetLanguageById(language.Id) : null; - if (existingById == null) { - //Creating a new lang... - + // Creating a new lang... CultureInfo culture; try { @@ -152,9 +141,8 @@ namespace Umbraco.Cms.Web.BackOffice.Controllers } // create it (creating a new language cannot create a fallback cycle) - var newLang = new Cms.Core.Models.Language(_globalSettings, culture.Name) + var newLang = new Core.Models.Language(culture.Name, language.Name ?? culture.EnglishName) { - CultureName = culture.DisplayName, IsDefault = language.IsDefault, IsMandatory = language.IsMandatory, FallbackLanguageId = language.FallbackLanguageId @@ -164,7 +152,11 @@ namespace Umbraco.Cms.Web.BackOffice.Controllers return _umbracoMapper.Map(newLang); } - existingById.IsMandatory = language.IsMandatory; + existingById.IsoCode = language.IsoCode; + if (!string.IsNullOrEmpty(language.Name)) + { + existingById.CultureName = language.Name; + } // note that the service will prevent the default language from being "un-defaulted" // but does not hurt to test here - though the UI should prevent it too @@ -174,22 +166,9 @@ namespace Umbraco.Cms.Web.BackOffice.Controllers return ValidationProblem(ModelState); } - // Update language - CultureInfo cultureAfterChange; - try - { - // language has the CultureName of the previous lang so we get information about new culture. - cultureAfterChange = CultureInfo.GetCultureInfo(language.IsoCode!); - } - catch (CultureNotFoundException) - { - ModelState.AddModelError("IsoCode", "No Culture found with name " + language.IsoCode); - return ValidationProblem(ModelState); - } - existingById.CultureName = cultureAfterChange.DisplayName; existingById.IsDefault = language.IsDefault; + existingById.IsMandatory = language.IsMandatory; existingById.FallbackLanguageId = language.FallbackLanguageId; - existingById.IsoCode = language.IsoCode!; // modifying an existing language can create a fallback, verify // note that the service will check again, dealing with race conditions @@ -201,6 +180,7 @@ namespace Umbraco.Cms.Web.BackOffice.Controllers ModelState.AddModelError("FallbackLanguage", "The selected fall back language does not exist."); return ValidationProblem(ModelState); } + if (CreatesCycle(existingById, languages)) { ModelState.AddModelError("FallbackLanguage", $"The selected fall back language {languages[existingById.FallbackLanguageId.Value].IsoCode} would create a circular path."); @@ -216,13 +196,24 @@ namespace Umbraco.Cms.Web.BackOffice.Controllers private bool CreatesCycle(ILanguage language, IDictionary languages) { // a new language is not referenced yet, so cannot be part of a cycle - if (!language.HasIdentity) return false; + if (!language.HasIdentity) + { + return false; + } var id = language.FallbackLanguageId; while (true) // assuming languages does not already contains a cycle, this must end { - if (!id.HasValue) return false; // no fallback means no cycle - if (id.Value == language.Id) return true; // back to language = cycle! + if (!id.HasValue) + { + return false; // no fallback means no cycle + } + + if (id.Value == language.Id) + { + return true; // back to language = cycle! + } + id = languages[id.Value].FallbackLanguageId; // else keep chaining } } diff --git a/src/Umbraco.Web.Common/Templates/TemplateRenderer.cs b/src/Umbraco.Web.Common/Templates/TemplateRenderer.cs index 982ec53ed9..55a70e4f81 100644 --- a/src/Umbraco.Web.Common/Templates/TemplateRenderer.cs +++ b/src/Umbraco.Web.Common/Templates/TemplateRenderer.cs @@ -93,7 +93,7 @@ namespace Umbraco.Cms.Web.Common.Templates requestBuilder.SetCulture(defaultLanguage == null ? CultureInfo.CurrentUICulture.Name - : defaultLanguage.CultureInfo?.Name); + : defaultLanguage.IsoCode); } else { diff --git a/src/Umbraco.Web.UI.Client/src/views/components/html/umb-control-group.html b/src/Umbraco.Web.UI.Client/src/views/components/html/umb-control-group.html index ae9edd4143..1d635d2bc5 100644 --- a/src/Umbraco.Web.UI.Client/src/views/components/html/umb-control-group.html +++ b/src/Umbraco.Web.UI.Client/src/views/components/html/umb-control-group.html @@ -1,5 +1,5 @@ - + diff --git a/src/Umbraco.Web.UI.Client/src/views/languages/edit.controller.js b/src/Umbraco.Web.UI.Client/src/views/languages/edit.controller.js index 167c5ffaf5..b545bd2a7c 100644 --- a/src/Umbraco.Web.UI.Client/src/views/languages/edit.controller.js +++ b/src/Umbraco.Web.UI.Client/src/views/languages/edit.controller.js @@ -2,16 +2,15 @@ "use strict"; function LanguagesEditController($scope, $q, $timeout, $location, $routeParams, overlayService, navigationService, notificationsService, localizationService, languageResource, contentEditingHelper, formHelper, eventsService) { - var vm = this; - vm.page = {}; - vm.showBackButton = true; + vm.isNew = false; + vm.initIsDefault = false; + vm.language = {}; vm.availableCultures = null; vm.breadcrumbs = []; vm.labels = {}; - vm.initIsDefault = false; vm.showDefaultLanguageInfo = false; vm.save = save; vm.back = back; @@ -19,126 +18,99 @@ vm.toggleMandatory = toggleMandatory; vm.toggleDefault = toggleDefault; - var currCulture = null; - + var initCulture = null; + function init() { - - // localize labels - var labelKeys = [ - "treeHeaders_languages", - "languages_mandatoryLanguage", - "languages_mandatoryLanguageHelp", - "languages_defaultLanguage", - "languages_defaultLanguageHelp", - "languages_addLanguage", - "languages_noFallbackLanguageOption", - "languages_fallbackLanguageDescription", - "languages_fallbackLanguage", - "defaultdialogs_confirmSure", - "defaultdialogs_editlanguage" - ]; - - localizationService.localizeMany(labelKeys).then(function (values) { - vm.labels.languages = values[0]; - vm.labels.mandatoryLanguage = values[1]; - vm.labels.mandatoryLanguageHelp = values[2]; - vm.labels.defaultLanguage = values[3]; - vm.labels.defaultLanguageHelp = values[4]; - vm.labels.addLanguage = values[5]; - vm.labels.noFallbackLanguageOption = values[6]; - vm.labels.areYouSure = values[9]; - vm.labels.editLanguage = values[10]; - - $scope.properties = { - fallbackLanguage: { - alias: "fallbackLanguage", - description: values[7], - label: values[8] - } - }; - - if ($routeParams.create) { - vm.page.name = vm.labels.addLanguage; - $scope.$emit("$changeTitle", vm.labels.addLanguage); - } - }); - vm.loading = true; var promises = []; - //load all culture/languages - promises.push(languageResource.getCultures().then(function (culturesDictionary) { - var cultures = []; - Object.entries(culturesDictionary).forEach(function ([key, value]) { - cultures.push({ - name: key, - displayName: value - }); - }); - vm.availableCultures = cultures; + // Localize labels + promises.push(localizationService.localizeMany([ + "treeHeaders_languages", + "languages_addLanguage", + "defaultdialogs_confirmSure", + "defaultdialogs_editlanguage" + ]).then(function (values) { + vm.labels.languages = values[0]; + vm.labels.addLanguage = values[1]; + vm.labels.areYouSure = values[2]; + vm.labels.editLanguage = values[3]; + + if ($routeParams.create) { + vm.isNew = true; + vm.language.name = vm.labels.addLanguage; + } })); - //load all possible fallback languages + // Load all culture/languages + promises.push(languageResource.getCultures().then(function (culturesDictionary) { + vm.availableCultures = culturesDictionary; + })); + + // Load all possible fallback languages promises.push(languageResource.getAll().then(function (languages) { vm.availableLanguages = languages.filter(function (l) { return $routeParams.id != l.id; }); - vm.loading = false; })); if (!$routeParams.create) { - - promises.push(languageResource.getById($routeParams.id).then(function(lang) { + promises.push(languageResource.getById($routeParams.id).then(function (lang) { vm.language = lang; - vm.page.name = vm.language.name; - $scope.$emit("$changeTitle", vm.labels.editLanguage + ": " + vm.page.name); - /* we need to store the initial default state so we can disable the toggle if it is the default. - we need to prevent from not having a default language. */ + // We need to store the initial default state so we can disable the toggle if it is the default. + // We need to prevent from not having a default language. vm.initIsDefault = Utilities.copy(vm.language.isDefault); makeBreadcrumbs(); - //store to check if we are changing the lang culture - currCulture = vm.language.culture; + // Store to check if we are changing the lang culture + initCulture = vm.language.culture; })); } - $q.all(promises, function () { + $q.all(promises).then(function () { + if ($routeParams.create) { + $scope.$emit("$changeTitle", vm.labels.addLanguage); + } else { + $scope.$emit("$changeTitle", vm.labels.editLanguage + ": " + vm.language.name); + } + vm.loading = false; }); + // Activate tree node $timeout(function () { - navigationService.syncTree({ tree: "languages", path: "-1" }); + navigationService.syncTree({ tree: $routeParams.tree, path: [-1], activate: true }); }); } function save() { + // Set new language name to culture name + if (vm.isNew && vm.language.culture && vm.availableCultures) { + vm.language.name = vm.availableCultures[vm.language.culture]; + } if (formHelper.submitForm({ scope: $scope })) { - vm.page.saveButtonState = "busy"; + vm.saveButtonState = "busy"; - //check if the culture is being changed - if (currCulture && vm.language.culture !== currCulture) { - - const changeCultureAlert = { + // Check if the culture is being changed + if (initCulture && vm.language.culture !== initCulture) { + overlayService.open({ title: vm.labels.areYouSure, view: "views/languages/overlays/change.html", submitButtonLabelKey: "general_continue", - submit: function (model) { + submit: function () { saveLanguage(); overlayService.close(); }, close: function () { overlayService.close(); - vm.page.saveButtonState = "init"; + vm.saveButtonState = "init"; } - }; - - overlayService.open(changeCultureAlert); - } - else { + }); + } else { saveLanguage(); } } @@ -146,26 +118,28 @@ function saveLanguage() { languageResource.save(vm.language).then(function (lang) { - formHelper.resetForm({ scope: $scope }); vm.language = lang; - vm.page.saveButtonState = "success"; + vm.saveButtonState = "success"; + + $scope.$emit("$changeTitle", vm.labels.editLanguage + ": " + vm.language.name); + localizationService.localize("speechBubbles_languageSaved").then(function (value) { notificationsService.success(value); }); - // emit event when language is created or updated/saved - var args = { language: lang, isNew: $routeParams.create ? true : false }; - eventsService.emit("editors.languages.languageSaved", args); - - back(); + // Emit event when language is created or updated/saved + eventsService.emit("editors.languages.languageSaved", { + language: lang, + isNew: vm.isNew + }); + vm.isNew = false; }, function (err) { - vm.page.saveButtonState = "error"; + vm.saveButtonState = "error"; formHelper.resetForm({ scope: $scope, hasErrors: true }); formHelper.handleError(err); - }); } @@ -182,8 +156,7 @@ } function toggleDefault() { - - // it shouldn't be possible to uncheck the default language + // It shouldn't be possible to uncheck the default language if (vm.initIsDefault) { return; } @@ -209,9 +182,7 @@ } init(); - } angular.module("umbraco").controller("Umbraco.Editors.Languages.EditController", LanguagesEditController); - })(); diff --git a/src/Umbraco.Web.UI.Client/src/views/languages/edit.html b/src/Umbraco.Web.UI.Client/src/views/languages/edit.html index 57e655f2f8..b9a492cb21 100644 --- a/src/Umbraco.Web.UI.Client/src/views/languages/edit.html +++ b/src/Umbraco.Web.UI.Client/src/views/languages/edit.html @@ -1,61 +1,62 @@ - + - + + + - + - - - + - + - + Required {{editLanguageForm.newLang.errorMsg}} - + + + + + - - + + - - {{vm.labels.defaultLanguage}} - {{vm.labels.defaultLanguageHelp}} + + + - + - {{vm.labels.mandatoryLanguage}} - {{vm.labels.mandatoryLanguageHelp}} + + @@ -65,41 +66,36 @@ - - - - {{vm.labels.noFallbackLanguageOption}} - - - + + + + + - + - + - + diff --git a/src/Umbraco.Web.UI.Client/src/views/languages/overview.controller.js b/src/Umbraco.Web.UI.Client/src/views/languages/overview.controller.js index a64dcc19fd..ef46bcf84d 100644 --- a/src/Umbraco.Web.UI.Client/src/views/languages/overview.controller.js +++ b/src/Umbraco.Web.UI.Client/src/views/languages/overview.controller.js @@ -1,8 +1,7 @@ (function () { "use strict"; - function LanguagesOverviewController($location, $timeout, navigationService, localizationService, languageResource, eventsService, overlayService,$scope) { - + function LanguagesOverviewController($q, $timeout, $location, $routeParams, navigationService, localizationService, languageResource, eventsService, overlayService, $scope) { var vm = this; vm.page = {}; @@ -12,7 +11,6 @@ vm.addLanguage = addLanguage; vm.editLanguage = editLanguage; vm.deleteLanguage = deleteLanguage; - vm.getLanguageById = function(id) { for (var i = 0; i < vm.languages.length; i++) { if (vm.languages[i].id === id) { @@ -24,34 +22,28 @@ }; function init() { - vm.loading = true; - // localize labels - var labelKeys = [ - "treeHeaders_languages", - "general_mandatory", - "general_default", - "languages_fallsbackToLabel" - ]; + var promises = []; - localizationService.localizeMany(labelKeys).then(function (values) { - vm.labels.languages = values[0]; - vm.labels.mandatory = values[1]; - vm.labels.general = values[2]; - vm.labels.fallsbackTo = values[3]; - // set page name - vm.page.name = vm.labels.languages; - $scope.$emit("$changeTitle", vm.labels.languages); - }); + // Localize labels + promises.push(localizationService.localize("treeHeaders_languages").then(function (value) { + vm.page.name = value; + $scope.$emit("$changeTitle", value); + })); - languageResource.getAll().then(function (languages) { + // Load all languages + promises.push(languageResource.getAll().then(function (languages) { vm.languages = languages; + })); + + $q.all(promises).then(function () { vm.loading = false; }); + // Activate tree node $timeout(function () { - navigationService.syncTree({ tree: "languages", path: "-1" }); + navigationService.syncTree({ tree: $routeParams.tree, path: [-1], activate: true }); }); } @@ -66,7 +58,6 @@ } function deleteLanguage(language, event) { - const dialog = { view: "views/languages/overlays/delete.html", language: language, @@ -94,24 +85,21 @@ language.deleteButtonState = "busy"; languageResource.deleteById(language.id).then(function () { + // Emit event when language is deleted + eventsService.emit("editors.languages.languageDeleted", { + language: language + }); - // emit event - var args = { language: language }; - eventsService.emit("editors.languages.languageDeleted", args); - - // remove from list + // Remove from list var index = vm.languages.indexOf(language); vm.languages.splice(index, 1); - - }, function (err) { + }, function () { language.deleteButtonState = "error"; }); } init(); - } angular.module("umbraco").controller("Umbraco.Editors.Languages.OverviewController", LanguagesOverviewController); - })(); diff --git a/src/Umbraco.Web.UI.Client/src/views/languages/overview.html b/src/Umbraco.Web.UI.Client/src/views/languages/overview.html index 2cecb2b345..3fb917ce9d 100644 --- a/src/Umbraco.Web.UI.Client/src/views/languages/overview.html +++ b/src/Umbraco.Web.UI.Client/src/views/languages/overview.html @@ -16,9 +16,9 @@ - @@ -28,11 +28,11 @@ - Language - ISO - Default - Mandatory - Fallback + + + + + @@ -42,7 +42,7 @@ {{ language.name }} - {{ language.culture }} + {{ language.culture }} - {{vm.getLanguageById(language.fallbackLanguageId).name}} - - (none) - + {{ vm.getLanguageById(language.fallbackLanguageId).name }} + () diff --git a/src/Umbraco.Web.UI/umbraco/config/lang/en.xml b/src/Umbraco.Web.UI/umbraco/config/lang/en.xml index ce717100c4..1b93cacf01 100644 --- a/src/Umbraco.Web.UI/umbraco/config/lang/en.xml +++ b/src/Umbraco.Web.UI/umbraco/config/lang/en.xml @@ -1865,6 +1865,7 @@ To manage your website, simply open the Umbraco backoffice and start adding cont Add language + ISO code Mandatory language Properties on this language have to be filled out before the node can be published. diff --git a/src/Umbraco.Web.UI/umbraco/config/lang/en_us.xml b/src/Umbraco.Web.UI/umbraco/config/lang/en_us.xml index 669a722253..b1dd754861 100644 --- a/src/Umbraco.Web.UI/umbraco/config/lang/en_us.xml +++ b/src/Umbraco.Web.UI/umbraco/config/lang/en_us.xml @@ -1928,6 +1928,7 @@ To manage your website, simply open the Umbraco backoffice and start adding cont Add language + ISO code Mandatory language Properties on this language have to be filled out before the node can be published. diff --git a/tests/Umbraco.Tests.AcceptanceTest/cypress/integration/Content/routing.ts b/tests/Umbraco.Tests.AcceptanceTest/cypress/integration/Content/routing.ts index d5119db073..25ec683606 100644 --- a/tests/Umbraco.Tests.AcceptanceTest/cypress/integration/Content/routing.ts +++ b/tests/Umbraco.Tests.AcceptanceTest/cypress/integration/Content/routing.ts @@ -35,6 +35,7 @@ context('Routing', () => { const swedishRequestBody = { culture: swedishCulture } + cy.umbracoApiRequest(url, "POST", swedishRequestBody).then((responseBody) => { swedishLanguageId = responseBody["id"]; }); diff --git a/tests/Umbraco.Tests.Common/Builders/LanguageBuilder.cs b/tests/Umbraco.Tests.Common/Builders/LanguageBuilder.cs index 61d60334b5..649e642673 100644 --- a/tests/Umbraco.Tests.Common/Builders/LanguageBuilder.cs +++ b/tests/Umbraco.Tests.Common/Builders/LanguageBuilder.cs @@ -70,7 +70,6 @@ namespace Umbraco.Cms.Tests.Common.Builders { CultureInfo cultureInfo = _cultureInfo ?? CultureInfo.GetCultureInfo("en-US"); var cultureName = _cultureName ?? cultureInfo.EnglishName; - var globalSettings = new GlobalSettings { DefaultUILanguage = cultureInfo.Name }; Guid key = _key ?? Guid.NewGuid(); DateTime createDate = _createDate ?? DateTime.Now; DateTime updateDate = _updateDate ?? DateTime.Now; @@ -79,11 +78,9 @@ namespace Umbraco.Cms.Tests.Common.Builders var isDefault = _isDefault ?? false; var isMandatory = _isMandatory ?? false; - return new Language(globalSettings, cultureInfo.Name) + return new Language(cultureInfo.Name, cultureName) { Id = _id ?? 0, - CultureName = cultureName, - IsoCode = cultureInfo.Name, Key = key, CreateDate = createDate, UpdateDate = updateDate, diff --git a/tests/Umbraco.Tests.Integration/Testing/SqliteTestDatabase.cs b/tests/Umbraco.Tests.Integration/Testing/SqliteTestDatabase.cs index 073824a97d..f4dda7891e 100644 --- a/tests/Umbraco.Tests.Integration/Testing/SqliteTestDatabase.cs +++ b/tests/Umbraco.Tests.Integration/Testing/SqliteTestDatabase.cs @@ -123,7 +123,8 @@ public class SqliteTestDatabase : BaseTestDatabase, ITestDatabase var schemaCreator = new DatabaseSchemaCreator( database, - _loggerFactory.CreateLogger(), _loggerFactory, + _loggerFactory.CreateLogger(), + _loggerFactory, new UmbracoVersion(), Mock.Of(), options); diff --git a/tests/Umbraco.Tests.Integration/Umbraco.Infrastructure/Packaging/PackageDataInstallationTests.cs b/tests/Umbraco.Tests.Integration/Umbraco.Infrastructure/Packaging/PackageDataInstallationTests.cs index 70a9b2969f..cc446e0ea6 100644 --- a/tests/Umbraco.Tests.Integration/Umbraco.Infrastructure/Packaging/PackageDataInstallationTests.cs +++ b/tests/Umbraco.Tests.Integration/Umbraco.Infrastructure/Packaging/PackageDataInstallationTests.cs @@ -4,11 +4,9 @@ using System; using System.Collections.Generic; using System.Linq; -using System.Threading; using System.Xml.Linq; using NUnit.Framework; using Umbraco.Cms.Core.Composing; -using Umbraco.Cms.Core.Configuration.Models; using Umbraco.Cms.Core.Models; using Umbraco.Cms.Core.Models.Packaging; using Umbraco.Cms.Core.PropertyEditors; @@ -842,9 +840,8 @@ namespace Umbraco.Cms.Tests.Integration.Umbraco.Infrastructure.Packaging private void AddLanguages() { - var globalSettings = new GlobalSettings(); - var norwegian = new Language(globalSettings, "nb-NO"); - var english = new Language(globalSettings, "en-GB"); + var norwegian = new Language("nb-NO", "Norwegian Bokmål (Norway)"); + var english = new Language("en-GB", "English (United Kingdom)"); LocalizationService.Save(norwegian, 0); LocalizationService.Save(english, 0); } diff --git a/tests/Umbraco.Tests.Integration/Umbraco.Infrastructure/Persistence/Repositories/DictionaryRepositoryTest.cs b/tests/Umbraco.Tests.Integration/Umbraco.Infrastructure/Persistence/Repositories/DictionaryRepositoryTest.cs index 21d92f2b93..0ceb0f1732 100644 --- a/tests/Umbraco.Tests.Integration/Umbraco.Infrastructure/Persistence/Repositories/DictionaryRepositoryTest.cs +++ b/tests/Umbraco.Tests.Integration/Umbraco.Infrastructure/Persistence/Repositories/DictionaryRepositoryTest.cs @@ -5,7 +5,6 @@ using System; using System.Collections.Generic; using System.Linq; using NUnit.Framework; -using Umbraco.Cms.Core.Configuration.Models; using Umbraco.Cms.Core.Models; using Umbraco.Cms.Core.Persistence.Querying; using Umbraco.Cms.Core.Persistence.Repositories; @@ -288,8 +287,7 @@ namespace Umbraco.Cms.Tests.Integration.Umbraco.Infrastructure.Persistence.Repos { IDictionaryRepository repository = CreateRepository(); - var globalSettings = new GlobalSettings(); - var languageNo = new Language(globalSettings, "nb-NO") { CultureName = "nb-NO" }; + var languageNo = new Language("nb-NO", "Norwegian Bokmål (Norway)"); localizationService.Save(languageNo); // Act @@ -371,25 +369,24 @@ namespace Umbraco.Cms.Tests.Integration.Umbraco.Infrastructure.Persistence.Repos ILocalizationService localizationService = GetRequiredService(); ILanguage language = localizationService.GetLanguageByIsoCode("en-US"); - var globalSettings = new GlobalSettings(); - var languageDK = new Language(globalSettings, "da-DK") { CultureName = "da-DK" }; - localizationService.Save(languageDK); // Id 2 + var languageDK = new Language("da-DK", "Danish (Denmark)"); + localizationService.Save(languageDK);//Id 2 var readMore = new DictionaryItem("Read More"); var translations = new List - { - new DictionaryTranslation(language, "Read More"), - new DictionaryTranslation(languageDK, "Læs mere") - }; + { + new DictionaryTranslation(language, "Read More"), + new DictionaryTranslation(languageDK, "Læs mere") + }; readMore.Translations = translations; localizationService.Save(readMore); // Id 1 var article = new DictionaryItem("Article"); var translations2 = new List - { - new DictionaryTranslation(language, "Article"), - new DictionaryTranslation(languageDK, "Artikel") - }; + { + new DictionaryTranslation(language, "Article"), + new DictionaryTranslation(languageDK, "Artikel") + }; article.Translations = translations2; localizationService.Save(article); // Id 2 } diff --git a/tests/Umbraco.Tests.Integration/Umbraco.Infrastructure/Persistence/Repositories/DocumentRepositoryTest.cs b/tests/Umbraco.Tests.Integration/Umbraco.Infrastructure/Persistence/Repositories/DocumentRepositoryTest.cs index 3960fc8107..7c4b0865fd 100644 --- a/tests/Umbraco.Tests.Integration/Umbraco.Infrastructure/Persistence/Repositories/DocumentRepositoryTest.cs +++ b/tests/Umbraco.Tests.Integration/Umbraco.Infrastructure/Persistence/Repositories/DocumentRepositoryTest.cs @@ -115,14 +115,12 @@ namespace Umbraco.Cms.Tests.Integration.Umbraco.Infrastructure.Persistence.Repos private DocumentRepository CreateRepository(IScopeAccessor scopeAccessor, out ContentTypeRepository contentTypeRepository, out TemplateRepository templateRepository, AppCaches appCaches = null) { - IOptions globalSettings = Options.Create(new GlobalSettings()); - appCaches ??= AppCaches; templateRepository = new TemplateRepository(scopeAccessor, appCaches, LoggerFactory.CreateLogger(), FileSystems, IOHelper, ShortStringHelper, Mock.Of()); var tagRepository = new TagRepository(scopeAccessor, appCaches, LoggerFactory.CreateLogger()); var commonRepository = new ContentTypeCommonRepository(scopeAccessor, templateRepository, appCaches, ShortStringHelper); - var languageRepository = new LanguageRepository(scopeAccessor, appCaches, LoggerFactory.CreateLogger(), globalSettings); + var languageRepository = new LanguageRepository(scopeAccessor, appCaches, LoggerFactory.CreateLogger()); contentTypeRepository = new ContentTypeRepository(scopeAccessor, appCaches, LoggerFactory.CreateLogger(), commonRepository, languageRepository, ShortStringHelper); var relationTypeRepository = new RelationTypeRepository(scopeAccessor, AppCaches.Disabled, LoggerFactory.CreateLogger()); var entityRepository = new EntityRepository(scopeAccessor, AppCaches.Disabled); diff --git a/tests/Umbraco.Tests.Integration/Umbraco.Infrastructure/Persistence/Repositories/DomainRepositoryTest.cs b/tests/Umbraco.Tests.Integration/Umbraco.Infrastructure/Persistence/Repositories/DomainRepositoryTest.cs index a842a1ac61..24e99d49a9 100644 --- a/tests/Umbraco.Tests.Integration/Umbraco.Infrastructure/Persistence/Repositories/DomainRepositoryTest.cs +++ b/tests/Umbraco.Tests.Integration/Umbraco.Infrastructure/Persistence/Repositories/DomainRepositoryTest.cs @@ -43,8 +43,7 @@ namespace Umbraco.Cms.Tests.Integration.Umbraco.Infrastructure.Persistence.Repos IScopeProvider provider = ScopeProvider; using (IScope scope = provider.CreateScope()) { - var globalSettings = new GlobalSettings(); - var lang = new Language(globalSettings, isoName); + var lang = new Language(isoName, isoName); LanguageRepository.Save(lang); ct = ContentTypeBuilder.CreateBasicContentType("test", "Test"); @@ -174,7 +173,7 @@ namespace Umbraco.Cms.Tests.Integration.Umbraco.Infrastructure.Persistence.Repos // more test data ILanguage lang1 = LanguageRepository.GetByIsoCode("en-AU"); var globalSettings = new GlobalSettings(); - var lang2 = new Language(globalSettings, "es"); + var lang2 = new Language("es", "Spanish"); LanguageRepository.Save(lang2); var content2 = new Content("test", -1, ct) { CreatorId = 0, WriterId = 0 }; DocumentRepository.Save(content2); diff --git a/tests/Umbraco.Tests.Integration/Umbraco.Infrastructure/Persistence/Repositories/LanguageRepositoryTest.cs b/tests/Umbraco.Tests.Integration/Umbraco.Infrastructure/Persistence/Repositories/LanguageRepositoryTest.cs index 03928ccecb..8a2c3fb7eb 100644 --- a/tests/Umbraco.Tests.Integration/Umbraco.Infrastructure/Persistence/Repositories/LanguageRepositoryTest.cs +++ b/tests/Umbraco.Tests.Integration/Umbraco.Infrastructure/Persistence/Repositories/LanguageRepositoryTest.cs @@ -8,7 +8,6 @@ using System.Linq; using Microsoft.Extensions.Logging; using NUnit.Framework; using Umbraco.Cms.Core.Cache; -using Umbraco.Cms.Core.Configuration.Models; using Umbraco.Cms.Core.Models; using Umbraco.Cms.Core.Persistence.Querying; using Umbraco.Cms.Core.Scoping; @@ -27,13 +26,10 @@ namespace Umbraco.Cms.Tests.Integration.Umbraco.Infrastructure.Persistence.Repos [UmbracoTest(Database = UmbracoTestOptions.Database.NewSchemaPerTest)] public class LanguageRepositoryTest : UmbracoIntegrationTest { - private GlobalSettings _globalSettings; - [SetUp] public void SetUp() { CreateTestData(); - _globalSettings = new GlobalSettings(); } [Test] @@ -67,9 +63,8 @@ namespace Umbraco.Cms.Tests.Integration.Umbraco.Infrastructure.Persistence.Repos LanguageRepository repository = CreateRepository(provider); var au = CultureInfo.GetCultureInfo("en-AU"); - var language = (ILanguage)new Language(_globalSettings, au.Name) + ILanguage language = new Language(au.Name, au.EnglishName) { - CultureName = au.DisplayName, FallbackLanguageId = 1 }; repository.Save(language); @@ -80,7 +75,7 @@ namespace Umbraco.Cms.Tests.Integration.Umbraco.Infrastructure.Persistence.Repos // Assert Assert.That(language, Is.Not.Null); Assert.That(language.HasIdentity, Is.True); - Assert.That(language.CultureName, Is.EqualTo(au.DisplayName)); + Assert.That(language.CultureName, Is.EqualTo(au.EnglishName)); Assert.That(language.IsoCode, Is.EqualTo(au.Name)); Assert.That(language.FallbackLanguageId, Is.EqualTo(1)); } @@ -159,7 +154,7 @@ namespace Umbraco.Cms.Tests.Integration.Umbraco.Infrastructure.Persistence.Repos // Assert Assert.That(result, Is.Not.Null); Assert.That(result.Any(), Is.True); - Assert.That(result.FirstOrDefault().CultureName, Is.EqualTo("da-DK")); + Assert.That(result.FirstOrDefault().IsoCode, Is.EqualTo("da-DK")); } } @@ -191,7 +186,7 @@ namespace Umbraco.Cms.Tests.Integration.Umbraco.Infrastructure.Persistence.Repos LanguageRepository repository = CreateRepository(provider); // Act - var languageBR = new Language(_globalSettings, "pt-BR") { CultureName = "pt-BR" }; + var languageBR = new Language("pt-BR", "Portuguese (Brazil)"); repository.Save(languageBR); // Assert @@ -213,7 +208,11 @@ namespace Umbraco.Cms.Tests.Integration.Umbraco.Infrastructure.Persistence.Repos LanguageRepository repository = CreateRepository(provider); // Act - var languageBR = new Language(_globalSettings, "pt-BR") { CultureName = "pt-BR", IsDefault = true, IsMandatory = true }; + var languageBR = new Language("pt-BR", "Portuguese (Brazil)") + { + IsDefault = true, + IsMandatory = true + }; repository.Save(languageBR); // Assert @@ -235,9 +234,8 @@ namespace Umbraco.Cms.Tests.Integration.Umbraco.Infrastructure.Persistence.Repos LanguageRepository repository = CreateRepository(provider); // Act - var languageBR = new Language(_globalSettings, "pt-BR") + var languageBR = new Language("pt-BR", "Portuguese (Brazil)") { - CultureName = "pt-BR", FallbackLanguageId = 1 }; repository.Save(languageBR); @@ -258,16 +256,24 @@ namespace Umbraco.Cms.Tests.Integration.Umbraco.Infrastructure.Persistence.Repos { LanguageRepository repository = CreateRepository(provider); - var languageBR = (ILanguage)new Language(_globalSettings, "pt-BR") { CultureName = "pt-BR", IsDefault = true, IsMandatory = true }; + ILanguage languageBR = new Language("pt-BR", "Portuguese (Brazil)") + { + IsDefault = true, + IsMandatory = true + }; repository.Save(languageBR); - var languageEN = new Language(_globalSettings, "en-AU") { CultureName = "en-AU" }; + var languageEN = new Language("en-AU", "English (Australia)"); repository.Save(languageEN); Assert.IsTrue(languageBR.IsDefault); Assert.IsTrue(languageBR.IsMandatory); // Act - var languageNZ = new Language(_globalSettings, "en-NZ") { CultureName = "en-NZ", IsDefault = true, IsMandatory = true }; + var languageNZ = new Language("en-NZ", "English (New Zealand)") + { + IsDefault = true, + IsMandatory = true + }; repository.Save(languageNZ); languageBR = repository.Get(languageBR.Id); @@ -289,7 +295,7 @@ namespace Umbraco.Cms.Tests.Integration.Umbraco.Infrastructure.Persistence.Repos // Act ILanguage language = repository.Get(5); language.IsoCode = "pt-BR"; - language.CultureName = "pt-BR"; + language.CultureName = "Portuguese (Brazil)"; language.FallbackLanguageId = 1; repository.Save(language); @@ -299,7 +305,7 @@ namespace Umbraco.Cms.Tests.Integration.Umbraco.Infrastructure.Persistence.Repos // Assert Assert.That(languageUpdated, Is.Not.Null); Assert.That(languageUpdated.IsoCode, Is.EqualTo("pt-BR")); - Assert.That(languageUpdated.CultureName, Is.EqualTo("pt-BR")); + Assert.That(languageUpdated.CultureName, Is.EqualTo("Portuguese (Brazil)")); Assert.That(languageUpdated.FallbackLanguageId, Is.EqualTo(1)); } } @@ -316,7 +322,7 @@ namespace Umbraco.Cms.Tests.Integration.Umbraco.Infrastructure.Persistence.Repos // Act ILanguage language = repository.Get(5); language.IsoCode = "da-DK"; - language.CultureName = "da-DK"; + language.CultureName = "Danish (Denmark)"; Assert.Throws(() => repository.Save(language)); } @@ -385,23 +391,25 @@ namespace Umbraco.Cms.Tests.Integration.Umbraco.Infrastructure.Persistence.Repos } } - private LanguageRepository CreateRepository(IScopeProvider provider) => new LanguageRepository((IScopeAccessor)provider, AppCaches.Disabled, LoggerFactory.CreateLogger(), Microsoft.Extensions.Options.Options.Create(_globalSettings)); + private LanguageRepository CreateRepository(IScopeProvider provider) => new LanguageRepository((IScopeAccessor)provider, AppCaches.Disabled, LoggerFactory.CreateLogger()); private void CreateTestData() { - // Id 1 is en-US - when Umbraco is installed ILocalizationService localizationService = GetRequiredService(); - var languageDK = new Language(_globalSettings, "da-DK") { CultureName = "da-DK" }; - localizationService.Save(languageDK); // Id 2 - var languageSE = new Language(_globalSettings, "sv-SE") { CultureName = "sv-SE" }; - localizationService.Save(languageSE); // Id 3 + //Id 1 is en-US - when Umbraco is installed - var languageDE = new Language(_globalSettings, "de-DE") { CultureName = "de-DE" }; - localizationService.Save(languageDE); // Id 4 + var languageDK = new Language("da-DK", "Danish (Denmark)"); + localizationService.Save(languageDK);//Id 2 - var languagePT = new Language(_globalSettings, "pt-PT") { CultureName = "pt-PT" }; - localizationService.Save(languagePT); // Id 5 + var languageSE = new Language("sv-SE", "Swedish (Sweden)"); + localizationService.Save(languageSE);//Id 3 + + var languageDE = new Language("de-DE", "German (Germany)"); + localizationService.Save(languageDE);//Id 4 + + var languagePT = new Language("pt-PT", "Portuguese (Portugal)"); + localizationService.Save(languagePT);//Id 5 } } } diff --git a/tests/Umbraco.Tests.Integration/Umbraco.Infrastructure/Persistence/Repositories/MediaRepositoryTest.cs b/tests/Umbraco.Tests.Integration/Umbraco.Infrastructure/Persistence/Repositories/MediaRepositoryTest.cs index 7e4a1462ee..a1dc79a8de 100644 --- a/tests/Umbraco.Tests.Integration/Umbraco.Infrastructure/Persistence/Repositories/MediaRepositoryTest.cs +++ b/tests/Umbraco.Tests.Integration/Umbraco.Infrastructure/Persistence/Repositories/MediaRepositoryTest.cs @@ -62,7 +62,7 @@ namespace Umbraco.Cms.Tests.Integration.Umbraco.Infrastructure.Persistence.Repos var scopeAccessor = (IScopeAccessor)provider; var globalSettings = new GlobalSettings(); var commonRepository = new ContentTypeCommonRepository(scopeAccessor, TemplateRepository, appCaches, ShortStringHelper); - var languageRepository = new LanguageRepository(scopeAccessor, appCaches, LoggerFactory.CreateLogger(), Microsoft.Extensions.Options.Options.Create(globalSettings)); + var languageRepository = new LanguageRepository(scopeAccessor, appCaches, LoggerFactory.CreateLogger()); mediaTypeRepository = new MediaTypeRepository(scopeAccessor, appCaches, LoggerFactory.CreateLogger(), commonRepository, languageRepository, ShortStringHelper); var tagRepository = new TagRepository(scopeAccessor, appCaches, LoggerFactory.CreateLogger()); var relationTypeRepository = new RelationTypeRepository(scopeAccessor, AppCaches.Disabled, LoggerFactory.CreateLogger()); diff --git a/tests/Umbraco.Tests.Integration/Umbraco.Infrastructure/Persistence/Repositories/TemplateRepositoryTest.cs b/tests/Umbraco.Tests.Integration/Umbraco.Infrastructure/Persistence/Repositories/TemplateRepositoryTest.cs index 8d81d9c4a8..b2315d16b5 100644 --- a/tests/Umbraco.Tests.Integration/Umbraco.Infrastructure/Persistence/Repositories/TemplateRepositoryTest.cs +++ b/tests/Umbraco.Tests.Integration/Umbraco.Infrastructure/Persistence/Repositories/TemplateRepositoryTest.cs @@ -266,7 +266,7 @@ namespace Umbraco.Cms.Tests.Integration.Umbraco.Infrastructure.Persistence.Repos var serializer = new JsonNetSerializer(); var tagRepository = new TagRepository(scopeAccessor, AppCaches.Disabled, LoggerFactory.CreateLogger()); var commonRepository = new ContentTypeCommonRepository(scopeAccessor, templateRepository, AppCaches, ShortStringHelper); - var languageRepository = new LanguageRepository(scopeAccessor, AppCaches.Disabled, LoggerFactory.CreateLogger(), Microsoft.Extensions.Options.Options.Create(globalSettings)); + var languageRepository = new LanguageRepository(scopeAccessor, AppCaches.Disabled, LoggerFactory.CreateLogger()); var contentTypeRepository = new ContentTypeRepository(scopeAccessor, AppCaches.Disabled, LoggerFactory.CreateLogger(), commonRepository, languageRepository, ShortStringHelper); var relationTypeRepository = new RelationTypeRepository(scopeAccessor, AppCaches.Disabled, LoggerFactory.CreateLogger()); var entityRepository = new EntityRepository(scopeAccessor, AppCaches.Disabled); diff --git a/tests/Umbraco.Tests.Integration/Umbraco.Infrastructure/Scoping/ScopedRepositoryTests.cs b/tests/Umbraco.Tests.Integration/Umbraco.Infrastructure/Scoping/ScopedRepositoryTests.cs index 4cd8b3ff2f..b59bd1b834 100644 --- a/tests/Umbraco.Tests.Integration/Umbraco.Infrastructure/Scoping/ScopedRepositoryTests.cs +++ b/tests/Umbraco.Tests.Integration/Umbraco.Infrastructure/Scoping/ScopedRepositoryTests.cs @@ -149,7 +149,7 @@ namespace Umbraco.Cms.Tests.Integration.Umbraco.Infrastructure.Scoping ILocalizationService service = LocalizationService; IAppPolicyCache globalCache = AppCaches.IsolatedCaches.GetOrCreate(typeof(ILanguage)); - var lang = (ILanguage)new Language(GlobalSettings, "fr-FR"); + ILanguage lang = new Language("fr-FR", "French (France)"); service.Save(lang); // global cache has been flushed, reload @@ -242,7 +242,7 @@ namespace Umbraco.Cms.Tests.Integration.Umbraco.Infrastructure.Scoping ILocalizationService service = LocalizationService; IAppPolicyCache globalCache = AppCaches.IsolatedCaches.GetOrCreate(typeof(IDictionaryItem)); - var lang = (ILanguage)new Language(GlobalSettings, "fr-FR"); + var lang = new Language("fr-FR", "French (France)"); service.Save(lang); var item = (IDictionaryItem)new DictionaryItem("item-key"); diff --git a/tests/Umbraco.Tests.Integration/Umbraco.Infrastructure/Services/ContentServiceNotificationTests.cs b/tests/Umbraco.Tests.Integration/Umbraco.Infrastructure/Services/ContentServiceNotificationTests.cs index 56b2dc9169..49d94258e6 100644 --- a/tests/Umbraco.Tests.Integration/Umbraco.Infrastructure/Services/ContentServiceNotificationTests.cs +++ b/tests/Umbraco.Tests.Integration/Umbraco.Infrastructure/Services/ContentServiceNotificationTests.cs @@ -70,7 +70,7 @@ namespace Umbraco.Cms.Tests.Integration.Umbraco.Infrastructure.Services [Test] public void Saving_Culture() { - LocalizationService.Save(new Language(_globalSettings, "fr-FR")); + LocalizationService.Save(new Language("fr-FR", "French (France)")); _contentType.Variations = ContentVariation.Culture; foreach (IPropertyType propertyType in _contentType.PropertyTypes) @@ -181,7 +181,7 @@ namespace Umbraco.Cms.Tests.Integration.Umbraco.Infrastructure.Services [Test] public void Publishing_Culture() { - LocalizationService.Save(new Language(_globalSettings, "fr-FR")); + LocalizationService.Save(new Language("fr-FR", "French (France)")); _contentType.Variations = ContentVariation.Culture; foreach (IPropertyType propertyType in _contentType.PropertyTypes) @@ -340,7 +340,7 @@ namespace Umbraco.Cms.Tests.Integration.Umbraco.Infrastructure.Services [Test] public void Unpublishing_Culture() { - LocalizationService.Save(new Language(_globalSettings, "fr-FR")); + LocalizationService.Save(new Language("fr-FR", "French (France)")); _contentType.Variations = ContentVariation.Culture; foreach (IPropertyType propertyType in _contentType.PropertyTypes) @@ -350,18 +350,16 @@ namespace Umbraco.Cms.Tests.Integration.Umbraco.Infrastructure.Services ContentTypeService.Save(_contentType); - var contentService = (ContentService)ContentService; - IContent document = new Content("content", -1, _contentType); document.SetCultureName("hello", "en-US"); document.SetCultureName("bonjour", "fr-FR"); - contentService.SaveAndPublish(document); + ContentService.SaveAndPublish(document); Assert.IsTrue(document.IsCulturePublished("fr-FR")); Assert.IsTrue(document.IsCulturePublished("en-US")); // re-get - dirty properties need resetting - document = contentService.GetById(document.Id); + document = ContentService.GetById(document.Id); document.UnpublishCulture("fr-FR"); @@ -402,7 +400,7 @@ namespace Umbraco.Cms.Tests.Integration.Umbraco.Infrastructure.Services try { - contentService.CommitDocumentChanges(document); + ContentService.CommitDocumentChanges(document); Assert.IsTrue(publishingWasCalled); Assert.IsTrue(publishedWasCalled); } @@ -412,7 +410,7 @@ namespace Umbraco.Cms.Tests.Integration.Umbraco.Infrastructure.Services ContentNotificationHandler.PublishedContent = null; } - document = contentService.GetById(document.Id); + document = ContentService.GetById(document.Id); Assert.IsFalse(document.IsCulturePublished("fr-FR")); Assert.IsTrue(document.IsCulturePublished("en-US")); diff --git a/tests/Umbraco.Tests.Integration/Umbraco.Infrastructure/Services/ContentServicePublishBranchTests.cs b/tests/Umbraco.Tests.Integration/Umbraco.Infrastructure/Services/ContentServicePublishBranchTests.cs index 79c55f494b..a52b834e93 100644 --- a/tests/Umbraco.Tests.Integration/Umbraco.Infrastructure/Services/ContentServicePublishBranchTests.cs +++ b/tests/Umbraco.Tests.Integration/Umbraco.Infrastructure/Services/ContentServicePublishBranchTests.cs @@ -440,13 +440,14 @@ namespace Umbraco.Cms.Tests.Integration.Umbraco.Infrastructure.Services private void CreateTypes(out IContentType iContentType, out IContentType vContentType) { - var globalSettings = new GlobalSettings(); - - var langDe = new Language(globalSettings, "de") { IsDefault = true }; + var langDe = new Language("de", "German") + { + IsDefault = true + }; LocalizationService.Save(langDe); - var langRu = new Language(globalSettings, "ru"); + var langRu = new Language("ru", "Russian"); LocalizationService.Save(langRu); - var langEs = new Language(globalSettings, "es"); + var langEs = new Language("es", "Spanish"); LocalizationService.Save(langEs); iContentType = new ContentType(ShortStringHelper, -1) diff --git a/tests/Umbraco.Tests.Integration/Umbraco.Infrastructure/Services/ContentTypeServiceVariantsTests.cs b/tests/Umbraco.Tests.Integration/Umbraco.Infrastructure/Services/ContentTypeServiceVariantsTests.cs index 92f9d73a89..eb4e22e43a 100644 --- a/tests/Umbraco.Tests.Integration/Umbraco.Infrastructure/Services/ContentTypeServiceVariantsTests.cs +++ b/tests/Umbraco.Tests.Integration/Umbraco.Infrastructure/Services/ContentTypeServiceVariantsTests.cs @@ -274,9 +274,7 @@ namespace Umbraco.Cms.Tests.Integration.Umbraco.Infrastructure.Services string nlContentName = "Content nl-NL"; string nlCulture = "nl-NL"; - var globalSettings = new GlobalSettings(); - - LocalizationService.Save(new Language(globalSettings, nlCulture)); + LocalizationService.Save(new Language(nlCulture, "Dutch (Netherlands)")); bool includeCultureNames = contentType.Variations.HasFlag(ContentVariation.Culture); @@ -664,9 +662,12 @@ namespace Umbraco.Cms.Tests.Integration.Umbraco.Infrastructure.Services // can then switch one property to variant var globalSettings = new GlobalSettings(); - var languageEn = new Language(globalSettings, "en") { IsDefault = true }; + var languageEn = new Language("en", "English") + { + IsDefault = true + }; LocalizationService.Save(languageEn); - var languageFr = new Language(globalSettings, "fr"); + var languageFr = new Language("fr", "French"); LocalizationService.Save(languageFr); IContentType contentType = CreateContentType(ContentVariation.Nothing); @@ -1316,10 +1317,12 @@ namespace Umbraco.Cms.Tests.Integration.Umbraco.Infrastructure.Services private void CreateFrenchAndEnglishLangs() { - var globalSettings = new GlobalSettings(); - var languageEn = new Language(globalSettings, "en") { IsDefault = true }; + var languageEn = new Language("en", "English") + { + IsDefault = true + }; LocalizationService.Save(languageEn); - var languageFr = new Language(globalSettings, "fr"); + var languageFr = new Language("fr", "French"); LocalizationService.Save(languageFr); } diff --git a/tests/Umbraco.Tests.Integration/Umbraco.Infrastructure/Services/EntityServiceTests.cs b/tests/Umbraco.Tests.Integration/Umbraco.Infrastructure/Services/EntityServiceTests.cs index 4a8a933cce..a7fc3ca0e5 100644 --- a/tests/Umbraco.Tests.Integration/Umbraco.Infrastructure/Services/EntityServiceTests.cs +++ b/tests/Umbraco.Tests.Integration/Umbraco.Infrastructure/Services/EntityServiceTests.cs @@ -51,9 +51,8 @@ namespace Umbraco.Cms.Tests.Integration.Umbraco.Infrastructure.Services { if (_langFr == null && _langEs == null) { - var globalSettings = new GlobalSettings(); - _langFr = new Language(globalSettings, "fr-FR"); - _langEs = new Language(globalSettings, "es-ES"); + _langFr = new Language("fr-FR", "French (France)"); + _langEs = new Language("es-ES", "Spanish (Spain)"); LocalizationService.Save(_langFr); LocalizationService.Save(_langEs); } diff --git a/tests/Umbraco.Tests.Integration/Umbraco.Infrastructure/Services/EntityXmlSerializerTests.cs b/tests/Umbraco.Tests.Integration/Umbraco.Infrastructure/Services/EntityXmlSerializerTests.cs index ed9b54882f..7c8330d428 100644 --- a/tests/Umbraco.Tests.Integration/Umbraco.Infrastructure/Services/EntityXmlSerializerTests.cs +++ b/tests/Umbraco.Tests.Integration/Umbraco.Infrastructure/Services/EntityXmlSerializerTests.cs @@ -91,7 +91,7 @@ namespace Umbraco.Cms.Tests.Integration.Umbraco.Infrastructure.Services ILanguage languageNbNo = new LanguageBuilder() .WithCultureInfo("nb-NO") - .WithCultureName("Norwegian") + .WithCultureName("Norwegian Bokmål (Norway)") .Build(); localizationService.Save(languageNbNo); diff --git a/tests/Umbraco.Tests.Integration/Umbraco.Infrastructure/Services/Importing/Dictionary-Package.xml b/tests/Umbraco.Tests.Integration/Umbraco.Infrastructure/Services/Importing/Dictionary-Package.xml index 2f2360037c..6920e27040 100644 --- a/tests/Umbraco.Tests.Integration/Umbraco.Infrastructure/Services/Importing/Dictionary-Package.xml +++ b/tests/Umbraco.Tests.Integration/Umbraco.Infrastructure/Services/Importing/Dictionary-Package.xml @@ -17,7 +17,7 @@ - + diff --git a/tests/Umbraco.Tests.UnitTests/Umbraco.Core/Routing/GetContentUrlsTests.cs b/tests/Umbraco.Tests.UnitTests/Umbraco.Core/Routing/GetContentUrlsTests.cs index f54442e467..983d632aa9 100644 --- a/tests/Umbraco.Tests.UnitTests/Umbraco.Core/Routing/GetContentUrlsTests.cs +++ b/tests/Umbraco.Tests.UnitTests/Umbraco.Core/Routing/GetContentUrlsTests.cs @@ -66,9 +66,8 @@ namespace Umbraco.Cms.Tests.UnitTests.Umbraco.Core.Routing { var allLangs = isoCodes .Select(CultureInfo.GetCultureInfo) - .Select(culture => new Language(GlobalSettings, culture.Name) + .Select(culture => new Language(culture.Name, culture.EnglishName) { - CultureName = culture.DisplayName, IsDefault = true, IsMandatory = true }).ToArray(); diff --git a/tests/Umbraco.Tests.UnitTests/Umbraco.Infrastructure/PublishedCache/PublishedContentLanguageVariantTests.cs b/tests/Umbraco.Tests.UnitTests/Umbraco.Infrastructure/PublishedCache/PublishedContentLanguageVariantTests.cs index 3098dc6752..a1182a9205 100644 --- a/tests/Umbraco.Tests.UnitTests/Umbraco.Infrastructure/PublishedCache/PublishedContentLanguageVariantTests.cs +++ b/tests/Umbraco.Tests.UnitTests/Umbraco.Infrastructure/PublishedCache/PublishedContentLanguageVariantTests.cs @@ -63,15 +63,49 @@ namespace Umbraco.Cms.Tests.UnitTests.Umbraco.Infrastructure.PublishedCache var languages = new List { - new Language(GlobalSettings, "en-US") { Id = 1, CultureName = "English", IsDefault = true }, - new Language(GlobalSettings, "fr") { Id = 2, CultureName = "French" }, - new Language(GlobalSettings, "es") { Id = 3, CultureName = "Spanish", FallbackLanguageId = 1 }, - new Language(GlobalSettings, "it") { Id = 4, CultureName = "Italian", FallbackLanguageId = 3 }, - new Language(GlobalSettings, "de") { Id = 5, CultureName = "German" }, - new Language(GlobalSettings, "da") { Id = 6, CultureName = "Danish", FallbackLanguageId = 8 }, - new Language(GlobalSettings, "sv") { Id = 7, CultureName = "Swedish", FallbackLanguageId = 6 }, - new Language(GlobalSettings, "no") { Id = 8, CultureName = "Norweigan", FallbackLanguageId = 7 }, - new Language(GlobalSettings, "nl") { Id = 9, CultureName = "Dutch", FallbackLanguageId = 1 } + new Language("en-US", "English (United States)") + { + Id = 1, + IsDefault = true + }, + new Language("fr", "French") + { + Id = 2, + }, + new Language("es", "Spanish") + { + Id = 3, + FallbackLanguageId = 1 + }, + new Language("it", "Italian") + { + Id = 4, + FallbackLanguageId = 3 + }, + new Language("de", "German") + { + Id = 5 + }, + new Language("da", "Danish") + { + Id = 6, + FallbackLanguageId = 8 + }, + new Language("sv", "Swedish") + { + Id = 7, + FallbackLanguageId = 6 + }, + new Language("no", "Norweigan") + { + Id = 8, + FallbackLanguageId = 7 + }, + new Language("nl", "Dutch") + { + Id = 9, + FallbackLanguageId = 1 + } }; localizationService.Setup(x => x.GetAllLanguages()).Returns(languages);