diff --git a/Oqtane.Client/Modules/Admin/Site/Index.razor b/Oqtane.Client/Modules/Admin/Site/Index.razor index 63b59984..a87f6cf2 100644 --- a/Oqtane.Client/Modules/Admin/Site/Index.razor +++ b/Oqtane.Client/Modules/Admin/Site/Index.razor @@ -721,7 +721,7 @@ if (site != null) { _timezones = TimeZoneService.GetTimeZones(); - _cultures = await LocalizationService.GetCulturesAsync(false); + _cultures = await LocalizationService.GetNeutralCulturesAsync(); var settings = await SettingService.GetSiteSettingsAsync(site.SiteId); _pages = await PageService.GetPagesAsync(PageState.Site.SiteId); diff --git a/Oqtane.Client/Services/LocalizationService.cs b/Oqtane.Client/Services/LocalizationService.cs index 97948b40..53eb3abf 100644 --- a/Oqtane.Client/Services/LocalizationService.cs +++ b/Oqtane.Client/Services/LocalizationService.cs @@ -1,5 +1,4 @@ using System.Collections.Generic; -using System.Linq; using System.Net.Http; using System.Threading.Tasks; using Oqtane.Documentation; @@ -14,10 +13,16 @@ namespace Oqtane.Services public interface ILocalizationService { /// - /// Returns a collection of supported cultures + /// Returns a collection of supported or installed cultures /// /// Task> GetCulturesAsync(bool installed); + + /// + /// Returns a collection of neutral cultures + /// + /// + Task> GetNeutralCulturesAsync(); } [PrivateApi("Don't show in the documentation, as everything should use the Interface")] @@ -31,5 +36,10 @@ namespace Oqtane.Services { return await GetJsonAsync>($"{Apiurl}?installed={installed}"); } + + public async Task> GetNeutralCulturesAsync() + { + return await GetJsonAsync>($"{Apiurl}/neutral"); + } } } diff --git a/Oqtane.Server/Controllers/LocalizationController.cs b/Oqtane.Server/Controllers/LocalizationController.cs index 7dd1452d..9f52c714 100644 --- a/Oqtane.Server/Controllers/LocalizationController.cs +++ b/Oqtane.Server/Controllers/LocalizationController.cs @@ -3,10 +3,8 @@ using System.Collections.Generic; using System.Globalization; using System.Linq; using Microsoft.AspNetCore.Mvc; -using Oqtane.Extensions; using Oqtane.Infrastructure; using Oqtane.Models; -using Oqtane.Repository; using Oqtane.Shared; namespace Oqtane.Controllers @@ -15,33 +13,27 @@ namespace Oqtane.Controllers public class LocalizationController : Controller { private readonly ILocalizationManager _localizationManager; - private readonly ISiteRepository _siteRepository; - private readonly ISiteGroupRepository _siteGroupRepository; - private readonly IAliasRepository _aliasRepository; - public LocalizationController(ILocalizationManager localizationManager, ISiteRepository siteRepository, ISiteGroupRepository siteGroupRepository, IAliasRepository aliasRepository) + public LocalizationController(ILocalizationManager localizationManager) { _localizationManager = localizationManager; - _siteRepository = siteRepository; - _siteGroupRepository = siteGroupRepository; - _aliasRepository = aliasRepository; } - // GET: api/localization + // GET: api/localization?installed=true/false [HttpGet()] public IEnumerable Get(bool installed) { - string[] culturecodes; + string[] cultureCodes; if (installed) { - culturecodes = _localizationManager.GetInstalledCultures(); + cultureCodes = _localizationManager.GetInstalledCultures(); } else { - culturecodes = _localizationManager.GetSupportedCultures(); + cultureCodes = _localizationManager.GetSupportedCultures(); } - var cultures = culturecodes.Select(c => new Culture + var cultures = cultureCodes.Select(c => new Culture { Name = CultureInfo.GetCultureInfo(c).Name, DisplayName = CultureInfo.GetCultureInfo(c).DisplayName, @@ -56,5 +48,26 @@ namespace Oqtane.Controllers return cultures.OrderBy(item => item.DisplayName); } + + // GET: api/localization/neutral + [HttpGet("neutral")] + public IEnumerable Get() + { + var cultureCodes = _localizationManager.GetNeutralCultures(); + + var cultures = cultureCodes.Select(c => new Culture + { + Name = CultureInfo.GetCultureInfo(c).Name, + DisplayName = CultureInfo.GetCultureInfo(c).DisplayName, + IsDefault = false + }).ToList(); + + if (cultures.Count == 0) + { + cultures.Add(new Culture { Name = "en", DisplayName = "English", IsDefault = false }); + } + + return cultures.OrderBy(item => item.DisplayName); + } } } diff --git a/Oqtane.Server/Infrastructure/LocalizationManager.cs b/Oqtane.Server/Infrastructure/LocalizationManager.cs index 50bda160..9ffd2708 100644 --- a/Oqtane.Server/Infrastructure/LocalizationManager.cs +++ b/Oqtane.Server/Infrastructure/LocalizationManager.cs @@ -14,6 +14,7 @@ namespace Oqtane.Infrastructure string GetDefaultCulture(); string[] GetSupportedCultures(); string[] GetInstalledCultures(); + string[] GetNeutralCultures(); } public class LocalizationManager : ILocalizationManager @@ -42,7 +43,6 @@ namespace Oqtane.Infrastructure public string[] GetSupportedCultures() { return CultureInfo.GetCultures(CultureTypes.AllCultures) - .Where(item => item.Name.Length == 2) // major languages only (this could be configurable) .Select(item => item.Name).OrderBy(c => c).ToArray(); } @@ -51,7 +51,14 @@ namespace Oqtane.Infrastructure return GetSatelliteAssemblyCultures(); } - // method is static as it is called during startup + public string[] GetNeutralCultures() + { + return CultureInfo.GetCultures(CultureTypes.AllCultures) + .Where(item => item.IsNeutralCulture) + .Select(item => item.Name).OrderBy(c => c).ToArray(); + } + + // note: method is public and static as it is called during startup public static string[] GetSatelliteAssemblyCultures() { var cultures = new List();