Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -5,15 +5,21 @@
using Umbraco.Cms.Core.Mapping;
using Umbraco.Cms.Api.Management.ViewModels.Culture;
using Umbraco.Cms.Api.Common.ViewModels.Pagination;
using Umbraco.Cms.Core.Services;

namespace Umbraco.Cms.Api.Management.Controllers.Culture;

[ApiVersion("1.0")]
public class AllCultureController : CultureControllerBase
{
private readonly IUmbracoMapper _umbracoMapper;
private readonly ICultureService _cultureService;

public AllCultureController(IUmbracoMapper umbracoMapper) => _umbracoMapper = umbracoMapper;
public AllCultureController(IUmbracoMapper umbracoMapper, ICultureService cultureService)
{
_umbracoMapper = umbracoMapper;
_cultureService = cultureService;
}

/// <summary>
/// Returns all cultures available for creating languages.
Expand All @@ -24,10 +30,7 @@ public class AllCultureController : CultureControllerBase
[ProducesResponseType(typeof(PagedViewModel<CultureReponseModel>), StatusCodes.Status200OK)]
public async Task<PagedViewModel<CultureReponseModel>> GetAll(CancellationToken cancellationToken, int skip = 0, int take = 100)
{
CultureInfo[] all = CultureInfo.GetCultures(CultureTypes.AllCultures)
.DistinctBy(x => x.Name)
.OrderBy(x => x.EnglishName)
.ToArray();
CultureInfo[] all = _cultureService.GetValidCultureInfos();

var viewModel = new PagedViewModel<CultureReponseModel>
{
Expand Down
1 change: 1 addition & 0 deletions src/Umbraco.Core/DependencyInjection/UmbracoBuilder.cs
Original file line number Diff line number Diff line change
Expand Up @@ -286,6 +286,7 @@ private void AddCoreServices()
Services.AddUnique<IMediaTypeContainerService, MediaTypeContainerService>();
Services.AddUnique<IContentBlueprintContainerService, ContentBlueprintContainerService>();
Services.AddUnique<IIsoCodeValidator, IsoCodeValidator>();
Services.AddUnique<ICultureService, CultureService>();
Services.AddUnique<ILanguageService, LanguageService>();
Services.AddUnique<IMemberGroupService, MemberGroupService>();
Services.AddUnique<IRedirectUrlService, RedirectUrlService>();
Expand Down
20 changes: 20 additions & 0 deletions src/Umbraco.Core/Services/CultureService.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
using System.Globalization;

namespace Umbraco.Cms.Core.Services;

public class CultureService : ICultureService
{
private readonly IIsoCodeValidator _isoCodeValidator;

public CultureService(IIsoCodeValidator isoCodeValidator) => _isoCodeValidator = isoCodeValidator;

public CultureInfo[] GetValidCultureInfos()
{
CultureInfo[] all = CultureInfo.GetCultures(CultureTypes.AllCultures)
.Where(x=> _isoCodeValidator.IsValid(x))
.DistinctBy(x => x.Name)
.OrderBy(x => x.EnglishName)
.ToArray();
return all;
}
}
8 changes: 8 additions & 0 deletions src/Umbraco.Core/Services/ICultureService.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
using System.Globalization;

namespace Umbraco.Cms.Core.Services;

public interface ICultureService
{
CultureInfo[] GetValidCultureInfos();
}
24 changes: 22 additions & 2 deletions src/Umbraco.Core/Services/IIsoCodeValidator.cs
Original file line number Diff line number Diff line change
@@ -1,4 +1,6 @@
namespace Umbraco.Cms.Core.Services;
using System.Globalization;

namespace Umbraco.Cms.Core.Services;

/// <summary>
/// A validator for validating if an ISO code string can be is valid.
Expand All @@ -10,5 +12,23 @@ public interface IIsoCodeValidator
/// </summary>
/// <param name="isoCode">The string to validate.</param>
/// <returns>True if the string is a valid ISO code.</returns>
bool IsValid(string isoCode);
bool IsValid(string isoCode)
{
try
{
var culture = CultureInfo.GetCultureInfo(isoCode);
return culture.Name.Equals(isoCode, StringComparison.InvariantCultureIgnoreCase) && IsValid(culture);
}
catch (CultureNotFoundException)
{
return false;
}
}

/// <summary>
/// Validates that a cultureInfo is a valid culture info in Umbraco.
/// </summary>
/// <param name="culture">The culture info to validate.</param>
/// <returns>True if the CultureInfo is valid in Umbraco.</returns>
bool IsValid(CultureInfo culture);
}
13 changes: 1 addition & 12 deletions src/Umbraco.Core/Services/IsoCodeValidator.cs
Original file line number Diff line number Diff line change
Expand Up @@ -6,16 +6,5 @@ namespace Umbraco.Cms.Core.Services;
public class IsoCodeValidator : IIsoCodeValidator
{
/// <inheritdoc />
public bool IsValid(string isoCode)
{
try
{
var culture = CultureInfo.GetCultureInfo(isoCode);
return culture.Name.Equals(isoCode, StringComparison.InvariantCultureIgnoreCase) && culture.CultureTypes.HasFlag(CultureTypes.UserCustomCulture) == false;
}
catch (CultureNotFoundException)
{
return false;
}
}
public bool IsValid(CultureInfo culture) => culture.CultureTypes.HasFlag(CultureTypes.UserCustomCulture) is false;
}