diff --git a/Oqtane.Client/Modules/Admin/Languages/Add.razor b/Oqtane.Client/Modules/Admin/Languages/Add.razor
index 1cd92ac3..c72f21cd 100644
--- a/Oqtane.Client/Modules/Admin/Languages/Add.razor
+++ b/Oqtane.Client/Modules/Admin/Languages/Add.razor
@@ -32,7 +32,7 @@ else
@@ -161,33 +161,32 @@ else
}
@code {
- private ElementReference form;
- private bool validated = false;
+ private ElementReference form;
+ private bool validated = false;
- private string _code = string.Empty;
- private string _isDefault = "False";
- private string _message;
- private IEnumerable _supportedCultures;
- private IEnumerable _availableCultures;
- private List _packages;
- private string _price = "free";
- private string _search = "";
- private string _productname = "";
- private string _license = "";
- private string _packageid = "";
- private string _version = "";
+ private string _code = string.Empty;
+ private string _isDefault = "False";
+ private string _message;
+ private IEnumerable _supportedCultures;
+ private IEnumerable _availableCultures;
+ private List _packages;
+ private string _price = "free";
+ private string _search = "";
+ private string _productname = "";
+ private string _license = "";
+ private string _packageid = "";
+ private string _version = "";
- public override SecurityAccessLevel SecurityAccessLevel => SecurityAccessLevel.Admin;
+ public override SecurityAccessLevel SecurityAccessLevel => SecurityAccessLevel.Admin;
- protected override async Task OnParametersSetAsync()
- {
- var languages = await LanguageService.GetLanguagesAsync(PageState.Site.SiteId);
- var languagesCodes = languages.Select(l => l.Code).ToList();
+ protected override async Task OnParametersSetAsync()
+ {
+ var languages = await LanguageService.GetLanguagesAsync(PageState.Site.SiteId);
+ var languagesCodes = languages.Select(l => l.Code).ToList();
- _supportedCultures = await LocalizationService.GetCulturesAsync();
- _availableCultures = _supportedCultures
- .Where(c => !c.Name.Equals(Constants.DefaultCulture) && !languagesCodes.Contains(c.Name));
- await LoadTranslations();
+ _supportedCultures = await LocalizationService.GetCulturesAsync();
+ _availableCultures = _supportedCultures.Where(c => !c.Name.Equals(Constants.DefaultCulture) && !languagesCodes.Contains(c.Name));
+ await LoadTranslations();
if (_supportedCultures.Count() == 1)
{
diff --git a/Oqtane.Server/Controllers/LanguageController.cs b/Oqtane.Server/Controllers/LanguageController.cs
index c4683eae..ef9b0aa1 100644
--- a/Oqtane.Server/Controllers/LanguageController.cs
+++ b/Oqtane.Server/Controllers/LanguageController.cs
@@ -12,6 +12,7 @@ using Oqtane.Shared;
using System.Linq;
using System.Diagnostics;
using System.Globalization;
+using System;
namespace Oqtane.Controllers
{
@@ -42,7 +43,7 @@ namespace Oqtane.Controllers
packagename = "Oqtane";
}
var languages = _languages.GetLanguages(SiteId).ToList();
- foreach (var file in Directory.EnumerateFiles(Path.GetDirectoryName(Assembly.GetEntryAssembly().Location), packagename + ".Client.resources.dll", SearchOption.AllDirectories))
+ foreach (var file in Directory.EnumerateFiles(Path.GetDirectoryName(Assembly.GetEntryAssembly().Location), $"{packagename}.*{Constants.SatelliteAssemblyExtension}", SearchOption.AllDirectories))
{
var code = Path.GetFileName(Path.GetDirectoryName(file));
if (languages.Any(item => item.Code == code))
diff --git a/Oqtane.Server/Controllers/LocalizationController.cs b/Oqtane.Server/Controllers/LocalizationController.cs
index ace825a0..433d816e 100644
--- a/Oqtane.Server/Controllers/LocalizationController.cs
+++ b/Oqtane.Server/Controllers/LocalizationController.cs
@@ -22,11 +22,15 @@ namespace Oqtane.Controllers
// GET: api/localization
[HttpGet()]
public IEnumerable Get()
- => _localizationManager.GetSupportedCultures().Select(c => new Culture {
- Name = CultureInfo.GetCultureInfo(c).Name,
- DisplayName = CultureInfo.GetCultureInfo(c).DisplayName,
- IsDefault = _localizationManager.GetDefaultCulture()
+ {
+ var cultures = _localizationManager.GetSupportedCultures().Select(c => new Culture
+ {
+ Name = CultureInfo.GetCultureInfo(c).Name,
+ DisplayName = CultureInfo.GetCultureInfo(c).DisplayName,
+ IsDefault = _localizationManager.GetDefaultCulture()
.Equals(CultureInfo.GetCultureInfo(c).Name, StringComparison.OrdinalIgnoreCase)
- });
+ });
+ return cultures.OrderBy(item => item.DisplayName);
+ }
}
}
diff --git a/Oqtane.Server/Extensions/OqtaneServiceCollectionExtensions.cs b/Oqtane.Server/Extensions/OqtaneServiceCollectionExtensions.cs
index 31132a00..e190936f 100644
--- a/Oqtane.Server/Extensions/OqtaneServiceCollectionExtensions.cs
+++ b/Oqtane.Server/Extensions/OqtaneServiceCollectionExtensions.cs
@@ -5,6 +5,7 @@ using System.Linq;
using System.Net;
using System.Net.Http;
using System.Reflection;
+using System.Reflection.Metadata;
using System.Runtime.Loader;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Authentication.OAuth;
@@ -17,6 +18,7 @@ using Microsoft.Extensions.Hosting;
using Microsoft.Extensions.Logging;
using Microsoft.OpenApi.Models;
using Oqtane.Infrastructure;
+using Oqtane.Models;
using Oqtane.Modules;
using Oqtane.Repository;
using Oqtane.Security;
@@ -315,52 +317,26 @@ namespace Microsoft.Extensions.DependencyInjection
private static void LoadSatelliteAssemblies(string[] supportedCultures)
{
- var assemblies = AppDomain.CurrentDomain.GetAssemblies();
- var assemblyPath = Path.GetDirectoryName(Assembly.GetEntryAssembly()?.Location);
- if (assemblyPath == null)
- {
- return;
- }
-
AssemblyLoadContext.Default.Resolving += ResolveDependencies;
- foreach (var culture in supportedCultures)
+ foreach (var file in Directory.EnumerateFiles(Path.GetDirectoryName(Assembly.GetEntryAssembly().Location), $"*{Constants.SatelliteAssemblyExtension}", SearchOption.AllDirectories))
{
- if (culture == Constants.DefaultCulture)
+ var code = Path.GetFileName(Path.GetDirectoryName(file));
+ if (supportedCultures.Contains(code))
{
- continue;
- }
-
- var assembliesFolder = new DirectoryInfo(Path.Combine(assemblyPath, culture));
- if (assembliesFolder.Exists)
- {
- foreach (var assemblyFile in assembliesFolder.EnumerateFiles($"*{Constants.SatelliteAssemblyExtension}"))
+ try
{
- AssemblyName assemblyName;
- try
- {
- assemblyName = AssemblyName.GetAssemblyName(assemblyFile.FullName);
- }
- catch
- {
- Debug.WriteLine($"Oqtane Error: Cannot Get Satellite Assembly Name For {assemblyFile.Name}");
- continue;
- }
-
- try
- {
- Assembly assembly = AssemblyLoadContext.Default.LoadFromStream(new MemoryStream(System.IO.File.ReadAllBytes(assemblyFile.FullName)));
- Debug.WriteLine($"Oqtane Info: Loaded Assembly {assemblyName}");
- }
- catch (Exception ex)
- {
- Debug.WriteLine($"Oqtane Error: Unable To Load Assembly {assemblyName} - {ex}");
- }
+ Assembly assembly = AssemblyLoadContext.Default.LoadFromStream(new MemoryStream(System.IO.File.ReadAllBytes(file)));
+ Debug.WriteLine($"Oqtane Info: Loaded Satellite Assembly {file}");
+ }
+ catch (Exception ex)
+ {
+ Debug.WriteLine($"Oqtane Error: Unable To Load Satellite Assembly {file} - {ex}");
}
}
else
{
- Debug.WriteLine($"Oqtane Error: The Satellite Assembly Folder For {culture} Does Not Exist");
+ Debug.WriteLine($"Oqtane Error: Culture Not Supported For Satellite Assembly {file}");
}
}
}
diff --git a/Oqtane.Server/Infrastructure/LocalizationManager.cs b/Oqtane.Server/Infrastructure/LocalizationManager.cs
index ddc25096..cee23406 100644
--- a/Oqtane.Server/Infrastructure/LocalizationManager.cs
+++ b/Oqtane.Server/Infrastructure/LocalizationManager.cs
@@ -1,9 +1,5 @@
-using System;
-using System.Collections.Generic;
using System.Globalization;
-using System.IO;
using System.Linq;
-using System.Reflection;
using Microsoft.Extensions.Options;
using Oqtane.Shared;
@@ -12,7 +8,6 @@ namespace Oqtane.Infrastructure
public class LocalizationManager : ILocalizationManager
{
private static readonly string DefaultCulture = Constants.DefaultCulture;
- private static readonly string[] DefaultSupportedCultures = new[] { DefaultCulture };
private readonly LocalizationOptions _localizationOptions;