From cf2adc7f6ac90cd83830aac134a72a5456e67da0 Mon Sep 17 00:00:00 2001 From: Shaun Walker Date: Mon, 8 Aug 2022 10:47:33 -0400 Subject: [PATCH] Fix satellite assembly loading issue when running on WebAssembly --- .../Controllers/InstallationController.cs | 2 +- .../OqtaneServiceCollectionExtensions.cs | 8 ++++---- .../Interfaces/ILocalizationManager.cs | 2 +- .../Infrastructure/LocalizationManager.cs | 16 +++++++++++++++- Oqtane.Server/Startup.cs | 6 +++--- 5 files changed, 24 insertions(+), 10 deletions(-) diff --git a/Oqtane.Server/Controllers/InstallationController.cs b/Oqtane.Server/Controllers/InstallationController.cs index 35e94b6f..206f7584 100644 --- a/Oqtane.Server/Controllers/InstallationController.cs +++ b/Oqtane.Server/Controllers/InstallationController.cs @@ -115,7 +115,7 @@ namespace Oqtane.Controllers var binFolder = Path.GetDirectoryName(Assembly.GetEntryAssembly().Location); // insert satellite assemblies at beginning of list - foreach (var culture in _localizationManager.GetSupportedCultures()) + foreach (var culture in _localizationManager.GetInstalledCultures()) { var assembliesFolderPath = Path.Combine(binFolder, culture); if (culture == Constants.DefaultCulture) diff --git a/Oqtane.Server/Extensions/OqtaneServiceCollectionExtensions.cs b/Oqtane.Server/Extensions/OqtaneServiceCollectionExtensions.cs index 72e013b1..fec61c63 100644 --- a/Oqtane.Server/Extensions/OqtaneServiceCollectionExtensions.cs +++ b/Oqtane.Server/Extensions/OqtaneServiceCollectionExtensions.cs @@ -29,10 +29,10 @@ namespace Microsoft.Extensions.DependencyInjection { public static class OqtaneServiceCollectionExtensions { - public static IServiceCollection AddOqtane(this IServiceCollection services, string[] supportedCultures) + public static IServiceCollection AddOqtane(this IServiceCollection services, string[] installedCultures) { LoadAssemblies(); - LoadSatelliteAssemblies(supportedCultures); + LoadSatelliteAssemblies(installedCultures); services.AddOqtaneServices(); return services; @@ -326,14 +326,14 @@ namespace Microsoft.Extensions.DependencyInjection } } - private static void LoadSatelliteAssemblies(string[] supportedCultures) + private static void LoadSatelliteAssemblies(string[] installedCultures) { AssemblyLoadContext.Default.Resolving += ResolveDependencies; foreach (var file in Directory.EnumerateFiles(Path.GetDirectoryName(Assembly.GetEntryAssembly().Location), $"*{Constants.SatelliteAssemblyExtension}", SearchOption.AllDirectories)) { var code = Path.GetFileName(Path.GetDirectoryName(file)); - if (supportedCultures.Contains(code)) + if (installedCultures.Contains(code)) { try { diff --git a/Oqtane.Server/Infrastructure/Interfaces/ILocalizationManager.cs b/Oqtane.Server/Infrastructure/Interfaces/ILocalizationManager.cs index d85f0923..b6de309a 100644 --- a/Oqtane.Server/Infrastructure/Interfaces/ILocalizationManager.cs +++ b/Oqtane.Server/Infrastructure/Interfaces/ILocalizationManager.cs @@ -3,7 +3,7 @@ namespace Oqtane.Infrastructure public interface ILocalizationManager { string GetDefaultCulture(); - string[] GetSupportedCultures(); + string[] GetInstalledCultures(); } } diff --git a/Oqtane.Server/Infrastructure/LocalizationManager.cs b/Oqtane.Server/Infrastructure/LocalizationManager.cs index cee23406..7faf27ca 100644 --- a/Oqtane.Server/Infrastructure/LocalizationManager.cs +++ b/Oqtane.Server/Infrastructure/LocalizationManager.cs @@ -1,6 +1,10 @@ +using System.Collections.Generic; using System.Globalization; +using System.IO; using System.Linq; +using System.Reflection; using Microsoft.Extensions.Options; +using Oqtane.Models; using Oqtane.Shared; namespace Oqtane.Infrastructure @@ -29,8 +33,18 @@ namespace Oqtane.Infrastructure } public string[] GetSupportedCultures() - { + { return CultureInfo.GetCultures(CultureTypes.AllCultures).Select(item => item.Name).OrderBy(c => c).ToArray(); } + + public string[] GetInstalledCultures() + { + var cultures = new List(); + foreach (var file in Directory.EnumerateFiles(Path.GetDirectoryName(Assembly.GetEntryAssembly().Location), $"Oqtane.Client{Constants.SatelliteAssemblyExtension}", SearchOption.AllDirectories)) + { + cultures.Add(Path.GetFileName(Path.GetDirectoryName(file))); + } + return cultures.OrderBy(c => c).ToArray(); + } } } diff --git a/Oqtane.Server/Startup.cs b/Oqtane.Server/Startup.cs index 4d4c2b21..309f0c09 100644 --- a/Oqtane.Server/Startup.cs +++ b/Oqtane.Server/Startup.cs @@ -23,7 +23,7 @@ namespace Oqtane { private readonly bool _useSwagger; private readonly IWebHostEnvironment _env; - private readonly string[] _supportedCultures; + private readonly string[] _installedCultures; public IConfigurationRoot Configuration { get; } @@ -35,7 +35,7 @@ namespace Oqtane .AddJsonFile($"appsettings.{env.EnvironmentName}.json", true, true); Configuration = builder.Build(); - _supportedCultures = localizationManager.GetSupportedCultures(); + _installedCultures = localizationManager.GetInstalledCultures(); //add possibility to switch off swagger on production. _useSwagger = Configuration.GetSection("UseSwagger").Value != "false"; @@ -91,7 +91,7 @@ namespace Oqtane services.AddOqtaneTransientServices(); // load the external assemblies into the app domain, install services - services.AddOqtane(_supportedCultures); + services.AddOqtane(_installedCultures); services.AddOqtaneDbContext(); services.AddAntiforgery(options =>