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();