From 02714a1291e1b548908ffd7adcd537897bf6f541 Mon Sep 17 00:00:00 2001 From: Emmanuel Hansen Date: Tue, 3 Jan 2023 18:45:08 +0000 Subject: [PATCH] Avalonia - Add source generator for locale items (#3999) * Add source generator for locale keys * use locale keys in Ui subdir --- Directory.Packages.props | 2 + Ryujinx.Ava/App.axaml.cs | 10 +-- Ryujinx.Ava/AppHost.cs | 22 ++--- Ryujinx.Ava/Common/ApplicationHelper.cs | 22 ++--- Ryujinx.Ava/Common/Locale/LocaleExtension.cs | 6 +- Ryujinx.Ava/Common/Locale/LocaleManager.cs | 22 +++-- Ryujinx.Ava/Input/AvaloniaKeyboardDriver.cs | 2 +- Ryujinx.Ava/Modules/Updater/Updater.cs | 50 +++++------ Ryujinx.Ava/Ryujinx.Ava.csproj | 4 + Ryujinx.Ava/UI/Applet/AvaHostUiHandler.cs | 18 ++-- .../UI/Applet/ErrorAppletWindow.axaml.cs | 2 +- .../UI/Applet/SwkbdAppletDialog.axaml.cs | 6 +- Ryujinx.Ava/UI/Controls/InputDialog.axaml.cs | 4 +- .../UI/Controls/NavigationDialogHost.axaml.cs | 4 +- .../ProfileImageSelectionDialog.axaml.cs | 2 +- Ryujinx.Ava/UI/Controls/SaveManager.axaml | 2 +- Ryujinx.Ava/UI/Controls/UserEditor.axaml.cs | 4 +- Ryujinx.Ava/UI/Helpers/ContentDialogHelper.cs | 36 ++++---- Ryujinx.Ava/UI/Helpers/UserErrorDialog.cs | 34 +++---- .../Models/Generic/LastPlayedSortComparer.cs | 4 +- Ryujinx.Ava/UI/Models/SaveModel.cs | 8 +- Ryujinx.Ava/UI/Models/TitleUpdateModel.cs | 4 +- .../UI/ViewModels/AmiiboWindowViewModel.cs | 20 ++--- .../ViewModels/ControllerSettingsViewModel.cs | 56 ++++++------ .../UI/ViewModels/MainWindowViewModel.cs | 90 +++++++++---------- .../UI/ViewModels/SettingsViewModel.cs | 10 +-- .../UI/ViewModels/UserProfileViewModel.cs | 10 +-- Ryujinx.Ava/UI/Windows/AboutWindow.axaml.cs | 8 +- Ryujinx.Ava/UI/Windows/AmiiboWindow.axaml.cs | 4 +- Ryujinx.Ava/UI/Windows/CheatWindow.axaml.cs | 6 +- .../Windows/ControllerSettingsWindow.axaml.cs | 10 +-- .../DownloadableContentManagerWindow.axaml.cs | 12 +-- Ryujinx.Ava/UI/Windows/MainWindow.axaml.cs | 30 +++---- .../UI/Windows/MotionSettingsWindow.axaml.cs | 6 +- .../UI/Windows/RumbleSettingsWindow.axaml.cs | 6 +- .../UI/Windows/SettingsWindow.axaml.cs | 2 +- .../UI/Windows/TitleUpdateWindow.axaml.cs | 12 +-- Ryujinx.Ui.LocaleGenerator/LocaleGenerator.cs | 30 +++++++ .../Ryujinx.Ui.LocaleGenerator.csproj | 20 +++++ Ryujinx.sln | 8 +- 40 files changed, 337 insertions(+), 271 deletions(-) create mode 100644 Ryujinx.Ui.LocaleGenerator/LocaleGenerator.cs create mode 100644 Ryujinx.Ui.LocaleGenerator/Ryujinx.Ui.LocaleGenerator.csproj diff --git a/Directory.Packages.props b/Directory.Packages.props index c02c1ae56..84d83d0d9 100644 --- a/Directory.Packages.props +++ b/Directory.Packages.props @@ -50,5 +50,7 @@ + + diff --git a/Ryujinx.Ava/App.axaml.cs b/Ryujinx.Ava/App.axaml.cs index e59f9bd39..e36cbfdd6 100644 --- a/Ryujinx.Ava/App.axaml.cs +++ b/Ryujinx.Ava/App.axaml.cs @@ -59,11 +59,11 @@ namespace Ryujinx.Ava if (ApplicationLifetime is IClassicDesktopStyleApplicationLifetime desktop) { var result = await ContentDialogHelper.CreateConfirmationDialog( - LocaleManager.Instance["DialogThemeRestartMessage"], - LocaleManager.Instance["DialogThemeRestartSubMessage"], - LocaleManager.Instance["InputDialogYes"], - LocaleManager.Instance["InputDialogNo"], - LocaleManager.Instance["DialogRestartRequiredMessage"]); + LocaleManager.Instance[LocaleKeys.DialogThemeRestartMessage], + LocaleManager.Instance[LocaleKeys.DialogThemeRestartSubMessage], + LocaleManager.Instance[LocaleKeys.InputDialogYes], + LocaleManager.Instance[LocaleKeys.InputDialogNo], + LocaleManager.Instance[LocaleKeys.DialogRestartRequiredMessage]); if (result == UserResult.Yes) { diff --git a/Ryujinx.Ava/AppHost.cs b/Ryujinx.Ava/AppHost.cs index f8bd032cb..0baa94c3b 100644 --- a/Ryujinx.Ava/AppHost.cs +++ b/Ryujinx.Ava/AppHost.cs @@ -432,10 +432,10 @@ namespace Ryujinx.Ava if (userError == UserError.NoFirmware) { UserResult result = await ContentDialogHelper.CreateConfirmationDialog( - LocaleManager.Instance["DialogFirmwareNoFirmwareInstalledMessage"], - string.Format(LocaleManager.Instance["DialogFirmwareInstallEmbeddedMessage"], firmwareVersion.VersionString), - LocaleManager.Instance["InputDialogYes"], - LocaleManager.Instance["InputDialogNo"], + LocaleManager.Instance[LocaleKeys.DialogFirmwareNoFirmwareInstalledMessage], + string.Format(LocaleManager.Instance[LocaleKeys.DialogFirmwareInstallEmbeddedMessage], firmwareVersion.VersionString), + LocaleManager.Instance[LocaleKeys.InputDialogYes], + LocaleManager.Instance[LocaleKeys.InputDialogNo], ""); if (result != UserResult.Yes) @@ -463,11 +463,11 @@ namespace Ryujinx.Ava _parent.RefreshFirmwareStatus(); await ContentDialogHelper.CreateInfoDialog( - string.Format(LocaleManager.Instance["DialogFirmwareInstalledMessage"], firmwareVersion.VersionString), - string.Format(LocaleManager.Instance["DialogFirmwareInstallEmbeddedSuccessMessage"], firmwareVersion.VersionString), - LocaleManager.Instance["InputDialogOk"], + string.Format(LocaleManager.Instance[LocaleKeys.DialogFirmwareInstalledMessage], firmwareVersion.VersionString), + string.Format(LocaleManager.Instance[LocaleKeys.DialogFirmwareInstallEmbeddedSuccessMessage], firmwareVersion.VersionString), + LocaleManager.Instance[LocaleKeys.InputDialogOk], "", - LocaleManager.Instance["RyujinxInfo"]); + LocaleManager.Instance[LocaleKeys.RyujinxInfo]); } } else @@ -869,7 +869,7 @@ namespace Ryujinx.Ava public void UpdateStatus() { // Run a status update only when a frame is to be drawn. This prevents from updating the ui and wasting a render when no frame is queued - string dockedMode = ConfigurationState.Instance.System.EnableDockedMode ? LocaleManager.Instance["Docked"] : LocaleManager.Instance["Handheld"]; + string dockedMode = ConfigurationState.Instance.System.EnableDockedMode ? LocaleManager.Instance[LocaleKeys.Docked] : LocaleManager.Instance[LocaleKeys.Handheld]; float scale = GraphicsConfig.ResScale; if (scale != 1) @@ -879,11 +879,11 @@ namespace Ryujinx.Ava StatusUpdatedEvent?.Invoke(this, new StatusUpdatedEventArgs( Device.EnableDeviceVsync, - LocaleManager.Instance["VolumeShort"] + $": {(int)(Device.GetVolume() * 100)}%", + LocaleManager.Instance[LocaleKeys.VolumeShort] + $": {(int)(Device.GetVolume() * 100)}%", Renderer.IsVulkan ? "Vulkan" : "OpenGL", dockedMode, ConfigurationState.Instance.Graphics.AspectRatio.Value.ToText(), - LocaleManager.Instance["Game"] + $": {Device.Statistics.GetGameFrameRate():00.00} FPS ({Device.Statistics.GetGameFrameTime():00.00} ms)", + LocaleManager.Instance[LocaleKeys.Game] + $": {Device.Statistics.GetGameFrameRate():00.00} FPS ({Device.Statistics.GetGameFrameTime():00.00} ms)", $"FIFO: {Device.Statistics.GetFifoPercent():00.00} %", $"GPU: {_renderer.GetHardwareInfo().GpuVendor}")); } diff --git a/Ryujinx.Ava/Common/ApplicationHelper.cs b/Ryujinx.Ava/Common/ApplicationHelper.cs index 0c562dfe0..8e5bdaec7 100644 --- a/Ryujinx.Ava/Common/ApplicationHelper.cs +++ b/Ryujinx.Ava/Common/ApplicationHelper.cs @@ -81,7 +81,7 @@ namespace Ryujinx.Ava.Common Dispatcher.UIThread.Post(async () => { await ContentDialogHelper.CreateErrorDialog( - string.Format(LocaleManager.Instance["DialogMessageCreateSaveErrorMessage"], result.ToStringWithName())); + string.Format(LocaleManager.Instance[LocaleKeys.DialogMessageCreateSaveErrorMessage], result.ToStringWithName())); }); return false; @@ -100,7 +100,7 @@ namespace Ryujinx.Ava.Common Dispatcher.UIThread.Post(async () => { - await ContentDialogHelper.CreateErrorDialog(string.Format(LocaleManager.Instance["DialogMessageFindSaveErrorMessage"], result.ToStringWithName())); + await ContentDialogHelper.CreateErrorDialog(string.Format(LocaleManager.Instance[LocaleKeys.DialogMessageFindSaveErrorMessage], result.ToStringWithName())); }); return false; @@ -151,7 +151,7 @@ namespace Ryujinx.Ava.Common public static async Task ExtractSection(NcaSectionType ncaSectionType, string titleFilePath, int programIndex = 0) { - OpenFolderDialog folderDialog = new() { Title = LocaleManager.Instance["FolderDialogExtractTitle"] }; + OpenFolderDialog folderDialog = new() { Title = LocaleManager.Instance[LocaleKeys.FolderDialogExtractTitle] }; string destination = await folderDialog.ShowAsync(_owner); @@ -164,11 +164,11 @@ namespace Ryujinx.Ava.Common Dispatcher.UIThread.Post(async () => { UserResult result = await ContentDialogHelper.CreateConfirmationDialog( - string.Format(LocaleManager.Instance["DialogNcaExtractionMessage"], ncaSectionType, Path.GetFileName(titleFilePath)), + string.Format(LocaleManager.Instance[LocaleKeys.DialogNcaExtractionMessage], ncaSectionType, Path.GetFileName(titleFilePath)), "", "", - LocaleManager.Instance["InputDialogCancel"], - LocaleManager.Instance["DialogNcaExtractionTitle"]); + LocaleManager.Instance[LocaleKeys.InputDialogCancel], + LocaleManager.Instance[LocaleKeys.DialogNcaExtractionTitle]); if (result == UserResult.Cancel) { @@ -234,7 +234,7 @@ namespace Ryujinx.Ava.Common "Extraction failure. The main NCA was not present in the selected file"); Dispatcher.UIThread.InvokeAsync(async () => { - await ContentDialogHelper.CreateErrorDialog(LocaleManager.Instance["DialogNcaExtractionMainNcaNotFoundErrorMessage"]); + await ContentDialogHelper.CreateErrorDialog(LocaleManager.Instance[LocaleKeys.DialogNcaExtractionMainNcaNotFoundErrorMessage]); }); return; } @@ -275,7 +275,7 @@ namespace Ryujinx.Ava.Common $"LibHac returned error code: {resultCode.Value.ErrorCode}"); Dispatcher.UIThread.InvokeAsync(async () => { - await ContentDialogHelper.CreateErrorDialog(LocaleManager.Instance["DialogNcaExtractionCheckLogErrorMessage"]); + await ContentDialogHelper.CreateErrorDialog(LocaleManager.Instance[LocaleKeys.DialogNcaExtractionCheckLogErrorMessage]); }); } else if (resultCode.Value.IsSuccess()) @@ -283,11 +283,11 @@ namespace Ryujinx.Ava.Common Dispatcher.UIThread.InvokeAsync(async () => { await ContentDialogHelper.CreateInfoDialog( - LocaleManager.Instance["DialogNcaExtractionSuccessMessage"], + LocaleManager.Instance[LocaleKeys.DialogNcaExtractionSuccessMessage], "", - LocaleManager.Instance["InputDialogOk"], + LocaleManager.Instance[LocaleKeys.InputDialogOk], "", - LocaleManager.Instance["DialogNcaExtractionTitle"]); + LocaleManager.Instance[LocaleKeys.DialogNcaExtractionTitle]); }); } } diff --git a/Ryujinx.Ava/Common/Locale/LocaleExtension.cs b/Ryujinx.Ava/Common/Locale/LocaleExtension.cs index 8fca1a00d..6c54becdc 100644 --- a/Ryujinx.Ava/Common/Locale/LocaleExtension.cs +++ b/Ryujinx.Ava/Common/Locale/LocaleExtension.cs @@ -7,16 +7,16 @@ namespace Ryujinx.Ava.Common.Locale { internal class LocaleExtension : MarkupExtension { - public LocaleExtension(string key) + public LocaleExtension(LocaleKeys key) { Key = key; } - public string Key { get; } + public LocaleKeys Key { get; } public override object ProvideValue(IServiceProvider serviceProvider) { - string keyToUse = Key; + LocaleKeys keyToUse = Key; ReflectionBindingExtension binding = new($"[{keyToUse}]") { diff --git a/Ryujinx.Ava/Common/Locale/LocaleManager.cs b/Ryujinx.Ava/Common/Locale/LocaleManager.cs index acbbf2dff..c2251f851 100644 --- a/Ryujinx.Ava/Common/Locale/LocaleManager.cs +++ b/Ryujinx.Ava/Common/Locale/LocaleManager.cs @@ -2,6 +2,7 @@ using Ryujinx.Common; using Ryujinx.Common.Utilities; using Ryujinx.Ui.Common.Configuration; +using System; using System.Collections.Concurrent; using System.Collections.Generic; using System.Globalization; @@ -13,17 +14,17 @@ namespace Ryujinx.Ava.Common.Locale { private const string DefaultLanguageCode = "en_US"; - private Dictionary _localeStrings; - private ConcurrentDictionary _dynamicValues; + private Dictionary _localeStrings; + private ConcurrentDictionary _dynamicValues; public static LocaleManager Instance { get; } = new LocaleManager(); - public Dictionary LocaleStrings { get => _localeStrings; set => _localeStrings = value; } + public Dictionary LocaleStrings { get => _localeStrings; set => _localeStrings = value; } public LocaleManager() { - _localeStrings = new Dictionary(); - _dynamicValues = new ConcurrentDictionary(); + _localeStrings = new Dictionary(); + _dynamicValues = new ConcurrentDictionary(); Load(); } @@ -49,7 +50,7 @@ namespace Ryujinx.Ava.Common.Locale } } - public string this[string key] + public string this[LocaleKeys key] { get { @@ -63,7 +64,7 @@ namespace Ryujinx.Ava.Common.Locale return value; } - return key; + return key.ToString(); } set { @@ -73,7 +74,7 @@ namespace Ryujinx.Ava.Common.Locale } } - public void UpdateDynamicValue(string key, params object[] values) + public void UpdateDynamicValue(LocaleKeys key, params object[] values) { _dynamicValues[key] = values; @@ -98,7 +99,10 @@ namespace Ryujinx.Ava.Common.Locale foreach (var item in strings) { - this[item.Key] = item.Value; + if (Enum.TryParse(item.Key, out var key)) + { + this[key] = item.Value; + } } if (Program.PreviewerDetached) diff --git a/Ryujinx.Ava/Input/AvaloniaKeyboardDriver.cs b/Ryujinx.Ava/Input/AvaloniaKeyboardDriver.cs index 31a53c32c..b107898e4 100644 --- a/Ryujinx.Ava/Input/AvaloniaKeyboardDriver.cs +++ b/Ryujinx.Ava/Input/AvaloniaKeyboardDriver.cs @@ -56,7 +56,7 @@ namespace Ryujinx.Ava.Input return null; } - return new AvaloniaKeyboard(this, _keyboardIdentifers[0], LocaleManager.Instance["AllKeyboards"]); + return new AvaloniaKeyboard(this, _keyboardIdentifers[0], LocaleManager.Instance[LocaleKeys.AllKeyboards]); } protected virtual void Dispose(bool disposing) diff --git a/Ryujinx.Ava/Modules/Updater/Updater.cs b/Ryujinx.Ava/Modules/Updater/Updater.cs index d495131f0..7bf147fe4 100644 --- a/Ryujinx.Ava/Modules/Updater/Updater.cs +++ b/Ryujinx.Ava/Modules/Updater/Updater.cs @@ -84,7 +84,7 @@ namespace Ryujinx.Modules Logger.Error?.Print(LogClass.Application, "Failed to convert the current Ryujinx version!"); Dispatcher.UIThread.Post(async () => { - await ContentDialogHelper.CreateWarningDialog(LocaleManager.Instance["DialogUpdaterConvertFailedMessage"], LocaleManager.Instance["DialogUpdaterCancelUpdateMessage"]); + await ContentDialogHelper.CreateWarningDialog(LocaleManager.Instance[LocaleKeys.DialogUpdaterConvertFailedMessage], LocaleManager.Instance[LocaleKeys.DialogUpdaterCancelUpdateMessage]); }); return; @@ -119,7 +119,7 @@ namespace Ryujinx.Modules { Dispatcher.UIThread.Post(async () => { - await ContentDialogHelper.CreateUpdaterInfoDialog(LocaleManager.Instance["DialogUpdaterAlreadyOnLatestVersionMessage"], ""); + await ContentDialogHelper.CreateUpdaterInfoDialog(LocaleManager.Instance[LocaleKeys.DialogUpdaterAlreadyOnLatestVersionMessage], ""); }); } @@ -137,7 +137,7 @@ namespace Ryujinx.Modules { Dispatcher.UIThread.Post(async () => { - await ContentDialogHelper.CreateUpdaterInfoDialog(LocaleManager.Instance["DialogUpdaterAlreadyOnLatestVersionMessage"], ""); + await ContentDialogHelper.CreateUpdaterInfoDialog(LocaleManager.Instance[LocaleKeys.DialogUpdaterAlreadyOnLatestVersionMessage], ""); }); } @@ -150,7 +150,7 @@ namespace Ryujinx.Modules Logger.Error?.Print(LogClass.Application, exception.Message); Dispatcher.UIThread.Post(async () => { - await ContentDialogHelper.CreateErrorDialog(LocaleManager.Instance["DialogUpdaterFailedToGetVersionMessage"]); + await ContentDialogHelper.CreateErrorDialog(LocaleManager.Instance[LocaleKeys.DialogUpdaterFailedToGetVersionMessage]); }); return; @@ -165,7 +165,7 @@ namespace Ryujinx.Modules Logger.Error?.Print(LogClass.Application, "Failed to convert the received Ryujinx version from Github!"); Dispatcher.UIThread.Post(async () => { - await ContentDialogHelper.CreateWarningDialog(LocaleManager.Instance["DialogUpdaterConvertFailedGithubMessage"], LocaleManager.Instance["DialogUpdaterCancelUpdateMessage"]); + await ContentDialogHelper.CreateWarningDialog(LocaleManager.Instance[LocaleKeys.DialogUpdaterConvertFailedGithubMessage], LocaleManager.Instance[LocaleKeys.DialogUpdaterCancelUpdateMessage]); }); return; @@ -177,7 +177,7 @@ namespace Ryujinx.Modules { Dispatcher.UIThread.Post(async () => { - await ContentDialogHelper.CreateUpdaterInfoDialog(LocaleManager.Instance["DialogUpdaterAlreadyOnLatestVersionMessage"], ""); + await ContentDialogHelper.CreateUpdaterInfoDialog(LocaleManager.Instance[LocaleKeys.DialogUpdaterAlreadyOnLatestVersionMessage], ""); }); } @@ -210,8 +210,8 @@ namespace Ryujinx.Modules Dispatcher.UIThread.Post(async () => { // Show a message asking the user if they want to update - var shouldUpdate = await ContentDialogHelper.CreateChoiceDialog(LocaleManager.Instance["RyujinxUpdater"], - LocaleManager.Instance["RyujinxUpdaterMessage"], + var shouldUpdate = await ContentDialogHelper.CreateChoiceDialog(LocaleManager.Instance[LocaleKeys.RyujinxUpdater], + LocaleManager.Instance[LocaleKeys.RyujinxUpdaterMessage], $"{Program.Version} -> {newVersion}"); if (shouldUpdate) @@ -247,8 +247,8 @@ namespace Ryujinx.Modules var taskDialog = new TaskDialog() { - Header = LocaleManager.Instance["RyujinxUpdater"], - SubHeader = LocaleManager.Instance["UpdaterDownloading"], + Header = LocaleManager.Instance[LocaleKeys.RyujinxUpdater], + SubHeader = LocaleManager.Instance[LocaleKeys.UpdaterDownloading], IconSource = new SymbolIconSource { Symbol = Symbol.Download }, Buttons = { }, ShowProgressBar = true @@ -272,9 +272,9 @@ namespace Ryujinx.Modules if (UpdateSuccessful) { - var shouldRestart = await ContentDialogHelper.CreateChoiceDialog(LocaleManager.Instance["RyujinxUpdater"], - LocaleManager.Instance["DialogUpdaterCompleteMessage"], - LocaleManager.Instance["DialogUpdaterRestartMessage"]); + var shouldRestart = await ContentDialogHelper.CreateChoiceDialog(LocaleManager.Instance[LocaleKeys.RyujinxUpdater], + LocaleManager.Instance[LocaleKeys.DialogUpdaterCompleteMessage], + LocaleManager.Instance[LocaleKeys.DialogUpdaterRestartMessage]); if (shouldRestart) { @@ -478,7 +478,7 @@ namespace Ryujinx.Modules private static async void InstallUpdate(TaskDialog taskDialog, string updateFile) { // Extract Update - taskDialog.SubHeader = LocaleManager.Instance["UpdaterExtracting"]; + taskDialog.SubHeader = LocaleManager.Instance[LocaleKeys.UpdaterExtracting]; taskDialog.SetProgressBarState(0, TaskDialogProgressState.Normal); if (OperatingSystem.IsLinux()) @@ -556,7 +556,7 @@ namespace Ryujinx.Modules List allFiles = EnumerateFilesToDelete().ToList(); - taskDialog.SubHeader = LocaleManager.Instance["UpdaterRenaming"]; + taskDialog.SubHeader = LocaleManager.Instance[LocaleKeys.UpdaterRenaming]; taskDialog.SetProgressBarState(0, TaskDialogProgressState.Normal); // Replace old files @@ -577,13 +577,13 @@ namespace Ryujinx.Modules } catch { - Logger.Warning?.Print(LogClass.Application, string.Format(LocaleManager.Instance["UpdaterRenameFailed"], file)); + Logger.Warning?.Print(LogClass.Application, string.Format(LocaleManager.Instance[LocaleKeys.UpdaterRenameFailed], file)); } } Dispatcher.UIThread.Post(() => { - taskDialog.SubHeader = LocaleManager.Instance["UpdaterAddingFiles"]; + taskDialog.SubHeader = LocaleManager.Instance[LocaleKeys.UpdaterAddingFiles]; taskDialog.SetProgressBarState(0, TaskDialogProgressState.Normal); }); @@ -607,8 +607,8 @@ namespace Ryujinx.Modules { if (showWarnings) { - ContentDialogHelper.CreateWarningDialog(LocaleManager.Instance["DialogUpdaterArchNotSupportedMessage"], - LocaleManager.Instance["DialogUpdaterArchNotSupportedSubMessage"]); + ContentDialogHelper.CreateWarningDialog(LocaleManager.Instance[LocaleKeys.DialogUpdaterArchNotSupportedMessage], + LocaleManager.Instance[LocaleKeys.DialogUpdaterArchNotSupportedSubMessage]); } return false; @@ -618,8 +618,8 @@ namespace Ryujinx.Modules { if (showWarnings) { - ContentDialogHelper.CreateWarningDialog(LocaleManager.Instance["DialogUpdaterNoInternetMessage"], - LocaleManager.Instance["DialogUpdaterNoInternetSubMessage"]); + ContentDialogHelper.CreateWarningDialog(LocaleManager.Instance[LocaleKeys.DialogUpdaterNoInternetMessage], + LocaleManager.Instance[LocaleKeys.DialogUpdaterNoInternetSubMessage]); } return false; @@ -629,8 +629,8 @@ namespace Ryujinx.Modules { if (showWarnings) { - ContentDialogHelper.CreateWarningDialog(LocaleManager.Instance["DialogUpdaterDirtyBuildMessage"], - LocaleManager.Instance["DialogUpdaterDirtyBuildSubMessage"]); + ContentDialogHelper.CreateWarningDialog(LocaleManager.Instance[LocaleKeys.DialogUpdaterDirtyBuildMessage], + LocaleManager.Instance[LocaleKeys.DialogUpdaterDirtyBuildSubMessage]); } return false; @@ -642,11 +642,11 @@ namespace Ryujinx.Modules { if (ReleaseInformations.IsFlatHubBuild()) { - ContentDialogHelper.CreateWarningDialog(LocaleManager.Instance["UpdaterDisabledWarningTitle"], LocaleManager.Instance["DialogUpdaterFlatpakNotSupportedMessage"]); + ContentDialogHelper.CreateWarningDialog(LocaleManager.Instance[LocaleKeys.UpdaterDisabledWarningTitle], LocaleManager.Instance[LocaleKeys.DialogUpdaterFlatpakNotSupportedMessage]); } else { - ContentDialogHelper.CreateWarningDialog(LocaleManager.Instance["UpdaterDisabledWarningTitle"], LocaleManager.Instance["DialogUpdaterDirtyBuildSubMessage"]); + ContentDialogHelper.CreateWarningDialog(LocaleManager.Instance[LocaleKeys.UpdaterDisabledWarningTitle], LocaleManager.Instance[LocaleKeys.DialogUpdaterDirtyBuildSubMessage]); } } diff --git a/Ryujinx.Ava/Ryujinx.Ava.csproj b/Ryujinx.Ava/Ryujinx.Ava.csproj index 6da118491..3e3bdc8c7 100644 --- a/Ryujinx.Ava/Ryujinx.Ava.csproj +++ b/Ryujinx.Ava/Ryujinx.Ava.csproj @@ -58,6 +58,7 @@ + @@ -158,4 +159,7 @@ + + + diff --git a/Ryujinx.Ava/UI/Applet/AvaHostUiHandler.cs b/Ryujinx.Ava/UI/Applet/AvaHostUiHandler.cs index a8e76275c..f4d9bc806 100644 --- a/Ryujinx.Ava/UI/Applet/AvaHostUiHandler.cs +++ b/Ryujinx.Ava/UI/Applet/AvaHostUiHandler.cs @@ -33,15 +33,15 @@ namespace Ryujinx.Ava.UI.Applet ? args.PlayerCountMin.ToString() : $"{args.PlayerCountMin}-{args.PlayerCountMax}"; - string key = args.PlayerCountMin == args.PlayerCountMax ? "DialogControllerAppletMessage" : "DialogControllerAppletMessagePlayerRange"; + LocaleKeys key = args.PlayerCountMin == args.PlayerCountMax ? LocaleKeys.DialogControllerAppletMessage : LocaleKeys.DialogControllerAppletMessagePlayerRange; string message = string.Format(LocaleManager.Instance[key], playerCount, args.SupportedStyles, string.Join(", ", args.SupportedPlayers), - args.IsDocked ? LocaleManager.Instance["DialogControllerAppletDockModeSet"] : ""); + args.IsDocked ? LocaleManager.Instance[LocaleKeys.DialogControllerAppletDockModeSet] : ""); - return DisplayMessageDialog(LocaleManager.Instance["DialogControllerAppletTitle"], message); + return DisplayMessageDialog(LocaleManager.Instance[LocaleKeys.DialogControllerAppletTitle], message); } public bool DisplayMessageDialog(string title, string message) @@ -62,9 +62,9 @@ namespace Ryujinx.Ava.UI.Applet title, message, "", - LocaleManager.Instance["DialogOpenSettingsWindowLabel"], + LocaleManager.Instance[LocaleKeys.DialogOpenSettingsWindowLabel], "", - LocaleManager.Instance["SettingsButtonClose"], + LocaleManager.Instance[LocaleKeys.SettingsButtonClose], (int)Symbol.Important, deferEvent, async (window) => @@ -92,7 +92,7 @@ namespace Ryujinx.Ava.UI.Applet } catch (Exception ex) { - await ContentDialogHelper.CreateErrorDialog(string.Format(LocaleManager.Instance["DialogMessageDialogErrorExceptionMessage"], ex)); + await ContentDialogHelper.CreateErrorDialog(string.Format(LocaleManager.Instance[LocaleKeys.DialogMessageDialogErrorExceptionMessage], ex)); dialogCloseEvent.Set(); } @@ -115,7 +115,7 @@ namespace Ryujinx.Ava.UI.Applet { try { - var response = await SwkbdAppletDialog.ShowInputDialog(_parent, LocaleManager.Instance["SoftwareKeyboard"], args); + var response = await SwkbdAppletDialog.ShowInputDialog(_parent, LocaleManager.Instance[LocaleKeys.SoftwareKeyboard], args); if (response.Result == UserResult.Ok) { @@ -126,7 +126,7 @@ namespace Ryujinx.Ava.UI.Applet catch (Exception ex) { error = true; - await ContentDialogHelper.CreateErrorDialog(string.Format(LocaleManager.Instance["DialogSoftwareKeyboardErrorExceptionMessage"], ex)); + await ContentDialogHelper.CreateErrorDialog(string.Format(LocaleManager.Instance[LocaleKeys.DialogSoftwareKeyboardErrorExceptionMessage], ex)); } finally { @@ -181,7 +181,7 @@ namespace Ryujinx.Ava.UI.Applet catch (Exception ex) { dialogCloseEvent.Set(); - await ContentDialogHelper.CreateErrorDialog(string.Format(LocaleManager.Instance["DialogErrorAppletErrorExceptionMessage"], ex)); + await ContentDialogHelper.CreateErrorDialog(string.Format(LocaleManager.Instance[LocaleKeys.DialogErrorAppletErrorExceptionMessage], ex)); } }); diff --git a/Ryujinx.Ava/UI/Applet/ErrorAppletWindow.axaml.cs b/Ryujinx.Ava/UI/Applet/ErrorAppletWindow.axaml.cs index a17826f88..4134797ba 100644 --- a/Ryujinx.Ava/UI/Applet/ErrorAppletWindow.axaml.cs +++ b/Ryujinx.Ava/UI/Applet/ErrorAppletWindow.axaml.cs @@ -34,7 +34,7 @@ namespace Ryujinx.Ava.UI.Applet } else { - AddButton(LocaleManager.Instance["InputDialogOk"], 0); + AddButton(LocaleManager.Instance[LocaleKeys.InputDialogOk], 0); } } diff --git a/Ryujinx.Ava/UI/Applet/SwkbdAppletDialog.axaml.cs b/Ryujinx.Ava/UI/Applet/SwkbdAppletDialog.axaml.cs index 80be29798..78e6f237e 100644 --- a/Ryujinx.Ava/UI/Applet/SwkbdAppletDialog.axaml.cs +++ b/Ryujinx.Ava/UI/Applet/SwkbdAppletDialog.axaml.cs @@ -86,7 +86,7 @@ namespace Ryujinx.Ava.UI.Controls contentDialog.PrimaryButtonText = args.SubmitText; contentDialog.IsPrimaryButtonEnabled = content._checkLength(content.Message.Length); contentDialog.SecondaryButtonText = ""; - contentDialog.CloseButtonText = LocaleManager.Instance["InputDialogCancel"]; + contentDialog.CloseButtonText = LocaleManager.Instance[LocaleKeys.InputDialogCancel]; contentDialog.Content = content; TypedEventHandler handler = (sender, eventArgs) => @@ -139,14 +139,14 @@ namespace Ryujinx.Ava.UI.Controls else if (_inputMin > 0 && _inputMax == int.MaxValue) { Error.IsVisible = true; - Error.Text = string.Format(LocaleManager.Instance["SwkbdMinCharacters"], _inputMin); + Error.Text = string.Format(LocaleManager.Instance[LocaleKeys.SwkbdMinCharacters], _inputMin); _checkLength = length => _inputMin <= length; } else { Error.IsVisible = true; - Error.Text = string.Format(LocaleManager.Instance["SwkbdMinRangeCharacters"], _inputMin, _inputMax); + Error.Text = string.Format(LocaleManager.Instance[LocaleKeys.SwkbdMinRangeCharacters], _inputMin, _inputMax); _checkLength = length => _inputMin <= length && length <= _inputMax; } diff --git a/Ryujinx.Ava/UI/Controls/InputDialog.axaml.cs b/Ryujinx.Ava/UI/Controls/InputDialog.axaml.cs index abaabd3b3..8dba5e2b4 100644 --- a/Ryujinx.Ava/UI/Controls/InputDialog.axaml.cs +++ b/Ryujinx.Ava/UI/Controls/InputDialog.axaml.cs @@ -39,9 +39,9 @@ namespace Ryujinx.Ava.UI.Controls ContentDialog contentDialog = new ContentDialog { Title = title, - PrimaryButtonText = LocaleManager.Instance["InputDialogOk"], + PrimaryButtonText = LocaleManager.Instance[LocaleKeys.InputDialogOk], SecondaryButtonText = "", - CloseButtonText = LocaleManager.Instance["InputDialogCancel"], + CloseButtonText = LocaleManager.Instance[LocaleKeys.InputDialogCancel], Content = content, PrimaryButtonCommand = MiniCommand.Create(() => { diff --git a/Ryujinx.Ava/UI/Controls/NavigationDialogHost.axaml.cs b/Ryujinx.Ava/UI/Controls/NavigationDialogHost.axaml.cs index 98f9e9e3d..0c3002675 100644 --- a/Ryujinx.Ava/UI/Controls/NavigationDialogHost.axaml.cs +++ b/Ryujinx.Ava/UI/Controls/NavigationDialogHost.axaml.cs @@ -65,10 +65,10 @@ namespace Ryujinx.Ava.UI.Controls var content = new NavigationDialogHost(ownerAccountManager, ownerContentManager, ownerVirtualFileSystem, ownerHorizonClient); ContentDialog contentDialog = new ContentDialog { - Title = LocaleManager.Instance["UserProfileWindowTitle"], + Title = LocaleManager.Instance[LocaleKeys.UserProfileWindowTitle], PrimaryButtonText = "", SecondaryButtonText = "", - CloseButtonText = LocaleManager.Instance["UserProfilesClose"], + CloseButtonText = LocaleManager.Instance[LocaleKeys.UserProfilesClose], Content = content, Padding = new Thickness(0) }; diff --git a/Ryujinx.Ava/UI/Controls/ProfileImageSelectionDialog.axaml.cs b/Ryujinx.Ava/UI/Controls/ProfileImageSelectionDialog.axaml.cs index 00183b698..46a2f5079 100644 --- a/Ryujinx.Ava/UI/Controls/ProfileImageSelectionDialog.axaml.cs +++ b/Ryujinx.Ava/UI/Controls/ProfileImageSelectionDialog.axaml.cs @@ -55,7 +55,7 @@ namespace Ryujinx.Ava.UI.Controls OpenFileDialog dialog = new(); dialog.Filters.Add(new FileDialogFilter { - Name = LocaleManager.Instance["AllSupportedFormats"], + Name = LocaleManager.Instance[LocaleKeys.AllSupportedFormats], Extensions = { "jpg", "jpeg", "png", "bmp" } }); dialog.Filters.Add(new FileDialogFilter { Name = "JPEG", Extensions = { "jpg", "jpeg" } }); diff --git a/Ryujinx.Ava/UI/Controls/SaveManager.axaml b/Ryujinx.Ava/UI/Controls/SaveManager.axaml index b0dc4c6f7..64674b65b 100644 --- a/Ryujinx.Ava/UI/Controls/SaveManager.axaml +++ b/Ryujinx.Ava/UI/Controls/SaveManager.axaml @@ -62,7 +62,7 @@