From 5cab761e088dc28b4ff66d126749638301a0edbe Mon Sep 17 00:00:00 2001 From: Drombeys Date: Wed, 24 Apr 2024 12:17:49 +0300 Subject: [PATCH] Fix excessive memory allocation in `AxamlLocaleManager` class --- .../Manager/AxamlLocaleManager.cs | 47 ++++++++++++------- .../Manager/UserManager.cs | 2 +- 2 files changed, 32 insertions(+), 17 deletions(-) diff --git a/src/ImeSense.Launchers.Belarus.Avalonia/Manager/AxamlLocaleManager.cs b/src/ImeSense.Launchers.Belarus.Avalonia/Manager/AxamlLocaleManager.cs index 072ae62..761cb76 100644 --- a/src/ImeSense.Launchers.Belarus.Avalonia/Manager/AxamlLocaleManager.cs +++ b/src/ImeSense.Launchers.Belarus.Avalonia/Manager/AxamlLocaleManager.cs @@ -1,40 +1,55 @@ -using Avalonia.Controls; using Avalonia.Markup.Xaml.Styling; using ImeSense.Launchers.Belarus.Core.Manager; +using Microsoft.Extensions.Logging; + using ReactiveUI; using ReactiveUI.Fody.Helpers; namespace ImeSense.Launchers.Belarus.Avalonia.Manager; -public class AxamlLocaleManager : ReactiveObject, IApplicationLocaleManager +public class AxamlLocaleManager(ILogger logger) : ReactiveObject, IApplicationLocaleManager { - [Reactive] - public string Locale { get; private set; } = string.Empty; + private readonly ILogger _logger = logger; + private ResourceInclude? _resources; + + [Reactive] public string Locale { get; private set; } = string.Empty; public void SetLocale(string locale) { Locale = locale; App.Current?.Resources.Clear(); - var resource = new ResourceInclude(new Uri("avares://SBLauncher/Assets/Locales/")) { - Source = new Uri($"avares://SBLauncher/Assets/Locales/{Locale}.axaml"), - }; - App.Current?.Resources.MergedDictionaries.Add(resource); + LoadLocalizedResources(); + } + + private void LoadLocalizedResources() + { + try { + _resources = new ResourceInclude(new Uri("avares://SBLauncher/Assets/Locales/")) { + Source = new Uri($"avares://SBLauncher/Assets/Locales/{Locale}.axaml") + }; + App.Current?.Resources.MergedDictionaries.Add(_resources); + } catch (Exception ex) { + _logger.LogError(ex, "Failed to load localized resources for locale: {Locale}", Locale); + throw; + } } public string GetStringByKey(string key) { - var resources = new ResourceInclude(new Uri("avares://SBLauncher/Assets/Locales/")) { - Source = new Uri($"avares://SBLauncher/Assets/Locales/{Locale}.axaml"), - }; - var control = new Control { - Resources = resources.Loaded, - }; - if (control.TryFindResource(key, out var value)) { + if (_resources is null) { + _logger.LogError("Resource include is not initialized"); + return string.Empty; + } + + var resources = _resources.Loaded; + if (resources.TryGetValue(key, out var value)) { return (string) value!; + } else { + _logger.LogError("Resource with key '{Key}' not found for locale '{Locale}'", key, Locale); + return string.Empty; } - return string.Empty; } } diff --git a/src/ImeSense.Launchers.Belarus.Core/Manager/UserManager.cs b/src/ImeSense.Launchers.Belarus.Core/Manager/UserManager.cs index b4823e1..9c8f6c3 100644 --- a/src/ImeSense.Launchers.Belarus.Core/Manager/UserManager.cs +++ b/src/ImeSense.Launchers.Belarus.Core/Manager/UserManager.cs @@ -19,7 +19,7 @@ public class UserManager(ILogger? logger, private readonly IStartGameValidator _startGameValidator = startGameValidator; private readonly ILauncherStorage _launcherStorage = launcherStorage; - public UserSettings? UserSettings { get; set; } + public UserSettings? UserSettings { get; private set; } public async Task LoadAsync() {