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;