using Microsoft.AspNetCore.Components.WebAssembly.Hosting; using EnvelopeGenerator.Server.Client.Services; using EnvelopeGenerator.Server.Client.Options; using DevExpress.Blazor.Reporting; using DevExpress.XtraReports.Web.Extensions; using DevExpress.DataAccess.Web; using DevExpress.XtraReports.Services; using System.Globalization; var builder = WebAssemblyHostBuilder.CreateDefault(args); var initialCulture = await ResolveInitialCultureAsync(builder.HostEnvironment.BaseAddress); var cultureInfo = new CultureInfo(initialCulture); CultureInfo.DefaultThreadCurrentCulture = cultureInfo; CultureInfo.DefaultThreadCurrentUICulture = cultureInfo; builder.Services.AddLocalization(); // Named HttpClient for API calls (both for services and DevExpress components) builder.Services.AddHttpClient("EnvelopeGenerator.Server", client => { client.BaseAddress = new Uri(builder.HostEnvironment.BaseAddress); }); // Default HttpClient (DevExpress PdfViewer requires this) builder.Services.AddScoped(sp => new HttpClient { BaseAddress = new Uri(builder.HostEnvironment.BaseAddress) }); // Configuration Options builder.Services.Configure(opts => builder.Configuration.GetSection(PdfViewerOptions.SectionName).Bind(opts)); // Business Services builder.Services.AddScoped(); builder.Services.AddScoped(); builder.Services.AddScoped(); builder.Services.AddScoped(); builder.Services.AddScoped(); builder.Services.AddScoped(); builder.Services.AddSingleton(); builder.Services.AddScoped(); builder.Services.AddScoped(); // UI Preferences & Theme builder.Services.AddScoped(); builder.Services.AddScoped(); // Logo configuration (loaded once after login, in-memory cached) builder.Services.AddScoped(); // DevExpress WASM builder.Services.AddDevExpressWebAssemblyBlazorPdfViewer(); builder.Services.AddDevExpressWebAssemblyBlazorReportViewer(); builder.Services.AddDevExpressBlazorReportingWebAssembly(configure => { configure.UseDevelopmentMode(); }); // Reporting Services builder.Services.AddScoped(); builder.Services.AddScoped(); builder.Services.AddScoped(); DevExpress.Utils.DeserializationSettings.RegisterTrustedClass(typeof(EnvelopeGenerator.Server.Client.Data.DataItemList)); DevExpress.Utils.DeserializationSettings.RegisterTrustedClass(typeof(EnvelopeGenerator.Server.Client.PredefinedReports.Report)); builder.Services.AddSingleton(); builder.Services.AddSingleton(sp => sp.GetRequiredService()); builder.Services.AddScoped(); ReportStorageWebExtension.RegisterExtensionGlobal(new InMemoryReportStorageWebExtension()); var host = builder.Build(); await FontLoader.LoadFonts(host.Services.GetRequiredService(), new List { "opensans.ttf" }); await host.RunAsync(); static async Task ResolveInitialCultureAsync(string baseAddress) { try { using var http = new HttpClient { BaseAddress = new Uri(baseAddress) }; var response = await http.GetAsync("/api/Localization/lang"); if (!response.IsSuccessStatusCode) return "de-DE"; var value = await response.Content.ReadAsStringAsync(); var culture = value.Trim().Trim('"'); return string.IsNullOrWhiteSpace(culture) ? "de-DE" : culture; } catch { return "de-DE"; } }