From 4d7350fc6e512f22d80261b5014fd759d3e5ce74 Mon Sep 17 00:00:00 2001 From: Evan Husted Date: Tue, 24 Dec 2024 13:23:43 -0600 Subject: [PATCH 01/60] UI: Copy Title ID by clicking on it. --- src/Ryujinx/App.axaml.cs | 3 +++ .../UI/Controls/ApplicationListView.axaml | 20 ++++++++++++---- .../UI/Controls/ApplicationListView.axaml.cs | 23 +++++++++++++++++++ src/Ryujinx/UI/Windows/MainWindow.axaml.cs | 3 +++ 4 files changed, 44 insertions(+), 5 deletions(-) diff --git a/src/Ryujinx/App.axaml.cs b/src/Ryujinx/App.axaml.cs index 15ada201c..9c1170d08 100644 --- a/src/Ryujinx/App.axaml.cs +++ b/src/Ryujinx/App.axaml.cs @@ -32,6 +32,9 @@ namespace Ryujinx.Ava .ApplicationLifetime.Cast() .MainWindow.Cast(); + public static IClassicDesktopStyleApplicationLifetime DesktopLifetime => Current! + .ApplicationLifetime.Cast(); + public static void SetTaskbarProgress(TaskBarProgressBarState state) => MainWindow.PlatformFeatures.SetTaskBarProgressBarState(state); public static void SetTaskbarProgressValue(ulong current, ulong total) => MainWindow.PlatformFeatures.SetTaskBarProgressBarValue(current, total); public static void SetTaskbarProgressValue(long current, long total) => SetTaskbarProgressValue(Convert.ToUInt64(current), Convert.ToUInt64(total)); diff --git a/src/Ryujinx/UI/Controls/ApplicationListView.axaml b/src/Ryujinx/UI/Controls/ApplicationListView.axaml index 8a72ebfbf..90b657ee0 100644 --- a/src/Ryujinx/UI/Controls/ApplicationListView.axaml +++ b/src/Ryujinx/UI/Controls/ApplicationListView.axaml @@ -101,11 +101,21 @@ VerticalAlignment="Top" Orientation="Vertical" Spacing="5"> - + it.IdString == idText.Text); + if (appData is null) + return; + + await clipboard.SetTextAsync(appData.IdString); + + NotificationHelper.Show("Copied Title ID", $"{appData.Name} ({appData.IdString})", NotificationType.Information); + } + } } } diff --git a/src/Ryujinx/UI/Windows/MainWindow.axaml.cs b/src/Ryujinx/UI/Windows/MainWindow.axaml.cs index c433d7fdb..88e82c89e 100644 --- a/src/Ryujinx/UI/Windows/MainWindow.axaml.cs +++ b/src/Ryujinx/UI/Windows/MainWindow.axaml.cs @@ -98,6 +98,9 @@ namespace Ryujinx.Ava.UI.Windows StatusBarHeight = StatusBarView.StatusBar.MinHeight; MenuBarHeight = MenuBar.MinHeight; + ApplicationList.DataContext = DataContext; + ApplicationGrid.DataContext = DataContext; + SetWindowSizePosition(); if (Program.PreviewerDetached) From 16a60fdf123c54e5f98d887e8ceb5352c3c5b18f Mon Sep 17 00:00:00 2001 From: Evan Husted Date: Tue, 24 Dec 2024 13:39:48 -0600 Subject: [PATCH 02/60] UI: Rename App to RyujinxApp Add more NotificationHelper methods Simplify ID copy logic --- src/Ryujinx/Common/ApplicationHelper.cs | 9 ++-- src/Ryujinx/Program.cs | 6 +-- src/Ryujinx/{App.axaml => RyujinxApp.axaml} | 2 +- .../{App.axaml.cs => RyujinxApp.axaml.cs} | 12 +++-- .../UI/Controls/ApplicationListView.axaml.cs | 20 +++++---- src/Ryujinx/UI/Helpers/NotificationHelper.cs | 45 +++++++++++++++++-- .../UI/ViewModels/AboutWindowViewModel.cs | 4 +- .../UI/ViewModels/MainWindowViewModel.cs | 2 +- src/Ryujinx/UI/Windows/AmiiboWindow.axaml.cs | 4 +- src/Ryujinx/UI/Windows/CheatWindow.axaml.cs | 4 +- src/Ryujinx/UI/Windows/MainWindow.axaml.cs | 4 +- .../UI/Windows/SettingsWindow.axaml.cs | 2 +- src/Ryujinx/Updater.cs | 8 ++-- 13 files changed, 82 insertions(+), 40 deletions(-) rename src/Ryujinx/{App.axaml => RyujinxApp.axaml} (94%) rename src/Ryujinx/{App.axaml.cs => RyujinxApp.axaml.cs} (94%) diff --git a/src/Ryujinx/Common/ApplicationHelper.cs b/src/Ryujinx/Common/ApplicationHelper.cs index db5961347..1c6b53dee 100644 --- a/src/Ryujinx/Common/ApplicationHelper.cs +++ b/src/Ryujinx/Common/ApplicationHelper.cs @@ -146,7 +146,7 @@ namespace Ryujinx.Ava.Common var cancellationToken = new CancellationTokenSource(); UpdateWaitWindow waitingDialog = new( - App.FormatTitle(LocaleKeys.DialogNcaExtractionTitle), + RyujinxApp.FormatTitle(LocaleKeys.DialogNcaExtractionTitle), LocaleManager.Instance.UpdateAndGetDynamicValue(LocaleKeys.DialogNcaExtractionMessage, ncaSectionType, Path.GetFileName(titleFilePath)), cancellationToken); @@ -268,10 +268,9 @@ namespace Ryujinx.Ava.Common { Dispatcher.UIThread.Post(waitingDialog.Close); - NotificationHelper.Show( - App.FormatTitle(LocaleKeys.DialogNcaExtractionTitle), - $"{titleName}\n\n{LocaleManager.Instance[LocaleKeys.DialogNcaExtractionSuccessMessage]}", - NotificationType.Information); + NotificationHelper.ShowInformation( + RyujinxApp.FormatTitle(LocaleKeys.DialogNcaExtractionTitle), + $"{titleName}\n\n{LocaleManager.Instance[LocaleKeys.DialogNcaExtractionSuccessMessage]}"); } } diff --git a/src/Ryujinx/Program.cs b/src/Ryujinx/Program.cs index 3c24b8e27..2ec60ac70 100644 --- a/src/Ryujinx/Program.cs +++ b/src/Ryujinx/Program.cs @@ -65,7 +65,7 @@ namespace Ryujinx.Ava } public static AppBuilder BuildAvaloniaApp() => - AppBuilder.Configure() + AppBuilder.Configure() .UsePlatformDetect() .With(new X11PlatformOptions { @@ -100,7 +100,7 @@ namespace Ryujinx.Ava // Delete backup files after updating. Task.Run(Updater.CleanupUpdate); - Console.Title = $"{App.FullAppName} Console {Version}"; + Console.Title = $"{RyujinxApp.FullAppName} Console {Version}"; // Hook unhandled exception and process exit events. AppDomain.CurrentDomain.UnhandledException += (sender, e) @@ -225,7 +225,7 @@ namespace Ryujinx.Ava private static void PrintSystemInfo() { - Logger.Notice.Print(LogClass.Application, $"{App.FullAppName} Version: {Version}"); + Logger.Notice.Print(LogClass.Application, $"{RyujinxApp.FullAppName} Version: {Version}"); SystemInfo.Gather().Print(); var enabledLogLevels = Logger.GetEnabledLevels().ToArray(); diff --git a/src/Ryujinx/App.axaml b/src/Ryujinx/RyujinxApp.axaml similarity index 94% rename from src/Ryujinx/App.axaml rename to src/Ryujinx/RyujinxApp.axaml index 5c96f97f2..e07d7ff26 100644 --- a/src/Ryujinx/App.axaml +++ b/src/Ryujinx/RyujinxApp.axaml @@ -1,5 +1,5 @@ diff --git a/src/Ryujinx/App.axaml.cs b/src/Ryujinx/RyujinxApp.axaml.cs similarity index 94% rename from src/Ryujinx/App.axaml.cs rename to src/Ryujinx/RyujinxApp.axaml.cs index 9c1170d08..bbef20aa0 100644 --- a/src/Ryujinx/App.axaml.cs +++ b/src/Ryujinx/RyujinxApp.axaml.cs @@ -1,5 +1,6 @@ using Avalonia; using Avalonia.Controls.ApplicationLifetimes; +using Avalonia.Input.Platform; using Avalonia.Markup.Xaml; using Avalonia.Platform; using Avalonia.Styling; @@ -19,7 +20,7 @@ using System.Diagnostics; namespace Ryujinx.Ava { - public class App : Application + public class RyujinxApp : Application { internal static string FormatTitle(LocaleKeys? windowTitleKey = null) => windowTitleKey is null @@ -32,8 +33,11 @@ namespace Ryujinx.Ava .ApplicationLifetime.Cast() .MainWindow.Cast(); - public static IClassicDesktopStyleApplicationLifetime DesktopLifetime => Current! - .ApplicationLifetime.Cast(); + public static bool IsClipboardAvailable(out IClipboard clipboard) + { + clipboard = MainWindow.Clipboard; + return clipboard != null; + } public static void SetTaskbarProgress(TaskBarProgressBarState state) => MainWindow.PlatformFeatures.SetTaskBarProgressBarState(state); public static void SetTaskbarProgressValue(ulong current, ulong total) => MainWindow.PlatformFeatures.SetTaskBarProgressBarValue(current, total); @@ -135,7 +139,7 @@ namespace Ryujinx.Ava }; public static ThemeVariant DetectSystemTheme() => - Current is App { PlatformSettings: not null } app + Current is RyujinxApp { PlatformSettings: not null } app ? ConvertThemeVariant(app.PlatformSettings.GetColorValues().ThemeVariant) : ThemeVariant.Default; } diff --git a/src/Ryujinx/UI/Controls/ApplicationListView.axaml.cs b/src/Ryujinx/UI/Controls/ApplicationListView.axaml.cs index 6cdff3463..5b0730d5a 100644 --- a/src/Ryujinx/UI/Controls/ApplicationListView.axaml.cs +++ b/src/Ryujinx/UI/Controls/ApplicationListView.axaml.cs @@ -43,17 +43,19 @@ namespace Ryujinx.Ava.UI.Controls if (sender is not Button { Content: TextBlock idText }) return; + + if (!RyujinxApp.IsClipboardAvailable(out var clipboard)) + return; - if (App.MainWindow.Clipboard is { } clipboard) - { - var appData = mwvm.Applications.FirstOrDefault(it => it.IdString == idText.Text); - if (appData is null) - return; + var appData = mwvm.Applications.FirstOrDefault(it => it.IdString == idText.Text); + if (appData is null) + return; + + await clipboard.SetTextAsync(appData.IdString); - await clipboard.SetTextAsync(appData.IdString); - - NotificationHelper.Show("Copied Title ID", $"{appData.Name} ({appData.IdString})", NotificationType.Information); - } + NotificationHelper.ShowInformation( + "Copied Title ID", + $"{appData.Name} ({appData.IdString})"); } } } diff --git a/src/Ryujinx/UI/Helpers/NotificationHelper.cs b/src/Ryujinx/UI/Helpers/NotificationHelper.cs index 656a8b52f..74029a4b1 100644 --- a/src/Ryujinx/UI/Helpers/NotificationHelper.cs +++ b/src/Ryujinx/UI/Helpers/NotificationHelper.cs @@ -62,9 +62,46 @@ namespace Ryujinx.Ava.UI.Helpers _notifications.Add(new Notification(title, text, type, delay, onClick, onClose)); } - public static void ShowError(string message) - { - Show(LocaleManager.Instance[LocaleKeys.DialogErrorTitle], $"{LocaleManager.Instance[LocaleKeys.DialogErrorMessage]}\n\n{message}", NotificationType.Error); - } + public static void ShowError(string message) => + ShowError( + LocaleManager.Instance[LocaleKeys.DialogErrorTitle], + $"{LocaleManager.Instance[LocaleKeys.DialogErrorMessage]}\n\n{message}" + ); + + public static void ShowInformation(string title, string text, bool waitingExit = false, Action onClick = null, Action onClose = null) => + Show( + title, + text, + NotificationType.Information, + waitingExit, + onClick, + onClose); + + public static void ShowSuccess(string title, string text, bool waitingExit = false, Action onClick = null, Action onClose = null) => + Show( + title, + text, + NotificationType.Success, + waitingExit, + onClick, + onClose); + + public static void ShowWarning(string title, string text, bool waitingExit = false, Action onClick = null, Action onClose = null) => + Show( + title, + text, + NotificationType.Warning, + waitingExit, + onClick, + onClose); + + public static void ShowError(string title, string text, bool waitingExit = false, Action onClick = null, Action onClose = null) => + Show( + title, + text, + NotificationType.Error, + waitingExit, + onClick, + onClose); } } diff --git a/src/Ryujinx/UI/ViewModels/AboutWindowViewModel.cs b/src/Ryujinx/UI/ViewModels/AboutWindowViewModel.cs index 23d0f963c..607bff792 100644 --- a/src/Ryujinx/UI/ViewModels/AboutWindowViewModel.cs +++ b/src/Ryujinx/UI/ViewModels/AboutWindowViewModel.cs @@ -51,7 +51,7 @@ namespace Ryujinx.Ava.UI.ViewModels public AboutWindowViewModel() { - Version = App.FullAppName + "\n" + Program.Version; + Version = RyujinxApp.FullAppName + "\n" + Program.Version; UpdateLogoTheme(ConfigurationState.Instance.UI.BaseStyle.Value); ThemeManager.ThemeChanged += ThemeManager_ThemeChanged; @@ -64,7 +64,7 @@ namespace Ryujinx.Ava.UI.ViewModels private void UpdateLogoTheme(string theme) { - bool isDarkTheme = theme == "Dark" || (theme == "Auto" && App.DetectSystemTheme() == ThemeVariant.Dark); + bool isDarkTheme = theme == "Dark" || (theme == "Auto" && RyujinxApp.DetectSystemTheme() == ThemeVariant.Dark); string basePath = "resm:Ryujinx.UI.Common.Resources."; string themeSuffix = isDarkTheme ? "Dark.png" : "Light.png"; diff --git a/src/Ryujinx/UI/ViewModels/MainWindowViewModel.cs b/src/Ryujinx/UI/ViewModels/MainWindowViewModel.cs index f7cd83ed6..3ff05785a 100644 --- a/src/Ryujinx/UI/ViewModels/MainWindowViewModel.cs +++ b/src/Ryujinx/UI/ViewModels/MainWindowViewModel.cs @@ -2051,7 +2051,7 @@ namespace Ryujinx.Ava.UI.ViewModels Dispatcher.UIThread.InvokeAsync(() => { - Title = App.FormatTitle(); + Title = RyujinxApp.FormatTitle(); }); } diff --git a/src/Ryujinx/UI/Windows/AmiiboWindow.axaml.cs b/src/Ryujinx/UI/Windows/AmiiboWindow.axaml.cs index 6182e6b50..9a940c938 100644 --- a/src/Ryujinx/UI/Windows/AmiiboWindow.axaml.cs +++ b/src/Ryujinx/UI/Windows/AmiiboWindow.axaml.cs @@ -16,7 +16,7 @@ namespace Ryujinx.Ava.UI.Windows InitializeComponent(); - Title = App.FormatTitle(LocaleKeys.Amiibo); + Title = RyujinxApp.FormatTitle(LocaleKeys.Amiibo); } public AmiiboWindow() @@ -27,7 +27,7 @@ namespace Ryujinx.Ava.UI.Windows if (Program.PreviewerDetached) { - Title = App.FormatTitle(LocaleKeys.Amiibo); + Title = RyujinxApp.FormatTitle(LocaleKeys.Amiibo); } } diff --git a/src/Ryujinx/UI/Windows/CheatWindow.axaml.cs b/src/Ryujinx/UI/Windows/CheatWindow.axaml.cs index 8c8d56b34..2fc9617fb 100644 --- a/src/Ryujinx/UI/Windows/CheatWindow.axaml.cs +++ b/src/Ryujinx/UI/Windows/CheatWindow.axaml.cs @@ -28,7 +28,7 @@ namespace Ryujinx.Ava.UI.Windows InitializeComponent(); - Title = App.FormatTitle(LocaleKeys.CheatWindowTitle); + Title = RyujinxApp.FormatTitle(LocaleKeys.CheatWindowTitle); } public CheatWindow(VirtualFileSystem virtualFileSystem, string titleId, string titleName, string titlePath) @@ -93,7 +93,7 @@ namespace Ryujinx.Ava.UI.Windows DataContext = this; - Title = App.FormatTitle(LocaleKeys.CheatWindowTitle); + Title = RyujinxApp.FormatTitle(LocaleKeys.CheatWindowTitle); } public void Save() diff --git a/src/Ryujinx/UI/Windows/MainWindow.axaml.cs b/src/Ryujinx/UI/Windows/MainWindow.axaml.cs index 88e82c89e..e621b42ec 100644 --- a/src/Ryujinx/UI/Windows/MainWindow.axaml.cs +++ b/src/Ryujinx/UI/Windows/MainWindow.axaml.cs @@ -86,7 +86,7 @@ namespace Ryujinx.Ava.UI.Windows UiHandler = new AvaHostUIHandler(this); - ViewModel.Title = App.FormatTitle(); + ViewModel.Title = RyujinxApp.FormatTitle(); TitleBar.ExtendsContentIntoTitleBar = !ConfigurationState.Instance.ShowTitleBar; TitleBar.TitleBarHitTestType = (ConfigurationState.Instance.ShowTitleBar) ? TitleBarHitTestType.Simple : TitleBarHitTestType.Complex; @@ -117,7 +117,7 @@ namespace Ryujinx.Ava.UI.Windows /// private static void OnPlatformColorValuesChanged(object sender, PlatformColorValues e) { - if (Application.Current is App app) + if (Application.Current is RyujinxApp app) app.ApplyConfiguredTheme(ConfigurationState.Instance.UI.BaseStyle); } diff --git a/src/Ryujinx/UI/Windows/SettingsWindow.axaml.cs b/src/Ryujinx/UI/Windows/SettingsWindow.axaml.cs index b004d9fba..0c0345107 100644 --- a/src/Ryujinx/UI/Windows/SettingsWindow.axaml.cs +++ b/src/Ryujinx/UI/Windows/SettingsWindow.axaml.cs @@ -14,7 +14,7 @@ namespace Ryujinx.Ava.UI.Windows public SettingsWindow(VirtualFileSystem virtualFileSystem, ContentManager contentManager) { - Title = App.FormatTitle(LocaleKeys.Settings); + Title = RyujinxApp.FormatTitle(LocaleKeys.Settings); DataContext = ViewModel = new SettingsViewModel(virtualFileSystem, contentManager); diff --git a/src/Ryujinx/Updater.cs b/src/Ryujinx/Updater.cs index 21d991d97..3d4f11317 100644 --- a/src/Ryujinx/Updater.cs +++ b/src/Ryujinx/Updater.cs @@ -76,7 +76,7 @@ namespace Ryujinx.Ava if (!Version.TryParse(Program.Version, out Version currentVersion)) { - Logger.Error?.Print(LogClass.Application, $"Failed to convert the current {App.FullAppName} version!"); + Logger.Error?.Print(LogClass.Application, $"Failed to convert the current {RyujinxApp.FullAppName} version!"); await ContentDialogHelper.CreateWarningDialog( LocaleManager.Instance[LocaleKeys.DialogUpdaterConvertFailedMessage], @@ -159,7 +159,7 @@ namespace Ryujinx.Ava if (!Version.TryParse(_buildVer, out Version newVersion)) { - Logger.Error?.Print(LogClass.Application, $"Failed to convert the received {App.FullAppName} version from GitHub!"); + Logger.Error?.Print(LogClass.Application, $"Failed to convert the received {RyujinxApp.FullAppName} version from GitHub!"); await ContentDialogHelper.CreateWarningDialog( LocaleManager.Instance[LocaleKeys.DialogUpdaterConvertFailedGithubMessage], @@ -266,7 +266,7 @@ namespace Ryujinx.Ava SubHeader = LocaleManager.Instance[LocaleKeys.UpdaterDownloading], IconSource = new SymbolIconSource { Symbol = Symbol.Download }, ShowProgressBar = true, - XamlRoot = App.MainWindow, + XamlRoot = RyujinxApp.MainWindow, }; taskDialog.Opened += (s, e) => @@ -490,7 +490,7 @@ namespace Ryujinx.Ava bytesWritten += readSize; taskDialog.SetProgressBarState(GetPercentage(bytesWritten, totalBytes), TaskDialogProgressState.Normal); - App.SetTaskbarProgressValue(bytesWritten, totalBytes); + RyujinxApp.SetTaskbarProgressValue(bytesWritten, totalBytes); updateFileStream.Write(buffer, 0, readSize); } From a0a4f78cff86d44edee680edf3a7ecc1059ebd9c Mon Sep 17 00:00:00 2001 From: Evan Husted Date: Tue, 24 Dec 2024 20:47:14 -0600 Subject: [PATCH 03/60] UI: Thin down the borders of the app icon a little bit and trim down the file size significantly. --- src/Ryujinx.HLE/FileSystem/ContentManager.cs | 26 ++++++++++-------- .../Resources/Logo_Ryujinx_AntiAlias.png | Bin 0 -> 12236 bytes .../Resources/Logo_Thiccjinx.png | Bin 623701 -> 0 bytes .../Ryujinx.UI.Common.csproj | 2 +- .../UI/ViewModels/MainWindowViewModel.cs | 2 +- .../UI/Views/Main/MainMenuBarView.axaml | 2 +- 6 files changed, 17 insertions(+), 15 deletions(-) create mode 100644 src/Ryujinx.UI.Common/Resources/Logo_Ryujinx_AntiAlias.png delete mode 100644 src/Ryujinx.UI.Common/Resources/Logo_Thiccjinx.png diff --git a/src/Ryujinx.HLE/FileSystem/ContentManager.cs b/src/Ryujinx.HLE/FileSystem/ContentManager.cs index 9bda759a5..ec0f58b01 100644 --- a/src/Ryujinx.HLE/FileSystem/ContentManager.cs +++ b/src/Ryujinx.HLE/FileSystem/ContentManager.cs @@ -1034,16 +1034,16 @@ namespace Ryujinx.HLE.FileSystem switch (fileName) { case "prod.keys": - verified = verifyKeys(lines, genericPattern); + verified = VerifyKeys(lines, genericPattern); break; case "title.keys": - verified = verifyKeys(lines, titlePattern); + verified = VerifyKeys(lines, titlePattern); break; case "console.keys": - verified = verifyKeys(lines, genericPattern); + verified = VerifyKeys(lines, genericPattern); break; case "dev.keys": - verified = verifyKeys(lines, genericPattern); + verified = VerifyKeys(lines, genericPattern); break; default: throw new FormatException($"Keys file name \"{fileName}\" not supported. Only \"prod.keys\", \"title.keys\", \"console.keys\", \"dev.keys\" are supported."); @@ -1056,20 +1056,22 @@ namespace Ryujinx.HLE.FileSystem { throw new FileNotFoundException($"Keys file not found at \"{filePath}\"."); } - } - private bool verifyKeys(string[] lines, string regex) - { - foreach (string line in lines) + return; + + bool VerifyKeys(string[] lines, string regex) { - if (!Regex.IsMatch(line, regex)) + foreach (string line in lines) { - return false; + if (!Regex.IsMatch(line, regex)) + { + return false; + } } + return true; } - return true; } - + public bool AreKeysAlredyPresent(string pathToCheck) { string[] fileNames = { "prod.keys", "title.keys", "console.keys", "dev.keys" }; diff --git a/src/Ryujinx.UI.Common/Resources/Logo_Ryujinx_AntiAlias.png b/src/Ryujinx.UI.Common/Resources/Logo_Ryujinx_AntiAlias.png new file mode 100644 index 0000000000000000000000000000000000000000..a00c7ce68ca8571bef818609284190f2b133159b GIT binary patch literal 12236 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 z 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

$i`fKCNV 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 - + diff --git a/src/Ryujinx/UI/ViewModels/MainWindowViewModel.cs b/src/Ryujinx/UI/ViewModels/MainWindowViewModel.cs index 3ff05785a..04881b58d 100644 --- a/src/Ryujinx/UI/ViewModels/MainWindowViewModel.cs +++ b/src/Ryujinx/UI/ViewModels/MainWindowViewModel.cs @@ -131,7 +131,7 @@ namespace Ryujinx.Ava.UI.ViewModels // For an example of this, download canary 1.2.95, then open the settings menu, and look at the icon in the top-left. // The border gets reduced to colored pixels in the 4 corners. public static readonly Bitmap IconBitmap = - new(Assembly.GetAssembly(typeof(ConfigurationState))!.GetManifestResourceStream("Ryujinx.UI.Common.Resources.Logo_Thiccjinx.png")!); + new(Assembly.GetAssembly(typeof(ConfigurationState))!.GetManifestResourceStream("Ryujinx.UI.Common.Resources.Logo_Ryujinx_AntiAlias.png")!); public MainWindow Window { get; init; } diff --git a/src/Ryujinx/UI/Views/Main/MainMenuBarView.axaml b/src/Ryujinx/UI/Views/Main/MainMenuBarView.axaml index 7d8135dcf..8207f8e03 100644 --- a/src/Ryujinx/UI/Views/Main/MainMenuBarView.axaml +++ b/src/Ryujinx/UI/Views/Main/MainMenuBarView.axaml @@ -18,7 +18,7 @@ Height="25" Width="25" ToolTip.Tip="{Binding Title}" - Source="resm:Ryujinx.UI.Common.Resources.Logo_Thiccjinx.png?assembly=Ryujinx.UI.Common" /> + Source="resm:Ryujinx.UI.Common.Resources.Logo_Ryujinx_AntiAlias.png?assembly=Ryujinx.UI.Common" /> Date: Tue, 24 Dec 2024 21:00:41 -0600 Subject: [PATCH 04/60] UI: Make custom title bar window controls extend exactly as long as the menu bar is tall --- src/Ryujinx/UI/Windows/MainWindow.axaml.cs | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/Ryujinx/UI/Windows/MainWindow.axaml.cs b/src/Ryujinx/UI/Windows/MainWindow.axaml.cs index e621b42ec..660caa605 100644 --- a/src/Ryujinx/UI/Windows/MainWindow.axaml.cs +++ b/src/Ryujinx/UI/Windows/MainWindow.axaml.cs @@ -91,12 +91,14 @@ namespace Ryujinx.Ava.UI.Windows TitleBar.ExtendsContentIntoTitleBar = !ConfigurationState.Instance.ShowTitleBar; TitleBar.TitleBarHitTestType = (ConfigurationState.Instance.ShowTitleBar) ? TitleBarHitTestType.Simple : TitleBarHitTestType.Complex; - // Correctly size window when 'TitleBar' is enabled (Nov. 14, 2024) - TitleBarHeight = (ConfigurationState.Instance.ShowTitleBar ? TitleBar.Height : 0); - // NOTE: Height of MenuBar and StatusBar is not usable here, since it would still be 0 at this point. StatusBarHeight = StatusBarView.StatusBar.MinHeight; MenuBarHeight = MenuBar.MinHeight; + + TitleBar.Height = MenuBarHeight; + + // Correctly size window when 'TitleBar' is enabled (Nov. 14, 2024) + TitleBarHeight = (ConfigurationState.Instance.ShowTitleBar ? TitleBar.Height : 0); ApplicationList.DataContext = DataContext; ApplicationGrid.DataContext = DataContext; From 41acc4b1f39e6586ee1462e6e42a8b9c3717809a Mon Sep 17 00:00:00 2001 From: Evan Husted Date: Tue, 24 Dec 2024 21:14:17 -0600 Subject: [PATCH 05/60] UI: misc: Collapse repeated identical Border usages into a helper control. --- .../UI/Views/Main/MainStatusBarView.axaml | 71 +++---------------- .../UI/Views/Main/MainStatusBarView.axaml.cs | 23 ++++++ 2 files changed, 32 insertions(+), 62 deletions(-) diff --git a/src/Ryujinx/UI/Views/Main/MainStatusBarView.axaml b/src/Ryujinx/UI/Views/Main/MainStatusBarView.axaml index 6e72a8b4b..ea00927d8 100644 --- a/src/Ryujinx/UI/Views/Main/MainStatusBarView.axaml +++ b/src/Ryujinx/UI/Views/Main/MainStatusBarView.axaml @@ -7,6 +7,7 @@ xmlns:ext="clr-namespace:Ryujinx.Ava.Common.Markup" xmlns:ui="clr-namespace:FluentAvalonia.UI.Controls;assembly=FluentAvalonia" xmlns:viewModels="clr-namespace:Ryujinx.Ava.UI.ViewModels" + xmlns:local="clr-namespace:Ryujinx.Ava.UI.Views.Main" xmlns:config="clr-namespace:Ryujinx.Common.Configuration;assembly=Ryujinx.Common" mc:Ignorable="d" d:DesignWidth="800" d:DesignHeight="450" x:Class="Ryujinx.Ava.UI.Views.Main.MainStatusBarView" @@ -132,14 +133,7 @@ - + - + - + - + - + - + - + - + */ + } } From f0aa7eedf633e8ba2342cc83b5da52692065f961 Mon Sep 17 00:00:00 2001 From: Evan Husted Date: Tue, 24 Dec 2024 21:15:13 -0600 Subject: [PATCH 06/60] lol --- src/Ryujinx/UI/Views/Main/MainStatusBarView.axaml.cs | 9 --------- 1 file changed, 9 deletions(-) diff --git a/src/Ryujinx/UI/Views/Main/MainStatusBarView.axaml.cs b/src/Ryujinx/UI/Views/Main/MainStatusBarView.axaml.cs index ba391ba0a..12d5473ea 100644 --- a/src/Ryujinx/UI/Views/Main/MainStatusBarView.axaml.cs +++ b/src/Ryujinx/UI/Views/Main/MainStatusBarView.axaml.cs @@ -85,14 +85,5 @@ namespace Ryujinx.Ava.UI.Views.Main Background = Brushes.Gray; BorderThickness = new Thickness(1); } - /* - */ } } From 0ca4d6e921d3f1ea9827d3a242c9a838c6b7ddf1 Mon Sep 17 00:00:00 2001 From: Evan Husted Date: Tue, 24 Dec 2024 21:55:12 -0600 Subject: [PATCH 07/60] misc: Move StatusBarSeparator into Controls namespace, rename to MiniVerticalSeparator add bulk property change event method give each markup extension its own property name --- src/Ryujinx/Common/LocaleManager.cs | 4 +- .../Common/Markup/BasicMarkupExtension.cs | 2 +- src/Ryujinx/Common/Markup/MarkupExtensions.cs | 3 ++ ...{SliderScroll.axaml.cs => SliderScroll.cs} | 0 src/Ryujinx/UI/Controls/StatusBarSeparator.cs | 19 +++++++ src/Ryujinx/UI/ViewModels/BaseModel.cs | 9 ++++ .../UI/ViewModels/SettingsViewModel.cs | 15 +++--- .../UI/ViewModels/XCITrimmerViewModel.cs | 50 ++++++++++--------- .../UI/Views/Main/MainStatusBarView.axaml | 16 +++--- .../UI/Views/Main/MainStatusBarView.axaml.cs | 21 +------- 10 files changed, 78 insertions(+), 61 deletions(-) rename src/Ryujinx/UI/Controls/{SliderScroll.axaml.cs => SliderScroll.cs} (100%) create mode 100644 src/Ryujinx/UI/Controls/StatusBarSeparator.cs diff --git a/src/Ryujinx/Common/LocaleManager.cs b/src/Ryujinx/Common/LocaleManager.cs index f29efb15a..270b666df 100644 --- a/src/Ryujinx/Common/LocaleManager.cs +++ b/src/Ryujinx/Common/LocaleManager.cs @@ -109,7 +109,7 @@ namespace Ryujinx.Ava.Common.Locale { _dynamicValues[key] = values; - OnPropertyChanged("Item"); + OnPropertyChanged("Translation"); return this[key]; } @@ -138,7 +138,7 @@ namespace Ryujinx.Ava.Common.Locale _localeStrings[key] = val; } - OnPropertyChanged("Item"); + OnPropertyChanged("Translation"); LocaleChanged?.Invoke(); } diff --git a/src/Ryujinx/Common/Markup/BasicMarkupExtension.cs b/src/Ryujinx/Common/Markup/BasicMarkupExtension.cs index b1b7361a6..364c08c0b 100644 --- a/src/Ryujinx/Common/Markup/BasicMarkupExtension.cs +++ b/src/Ryujinx/Common/Markup/BasicMarkupExtension.cs @@ -14,7 +14,7 @@ namespace Ryujinx.Ava.Common.Markup { internal abstract class BasicMarkupExtension : MarkupExtension { - public virtual string Name => "Item"; + public abstract string Name { get; } public virtual Action? Setter => null; protected abstract T? Value { get; } diff --git a/src/Ryujinx/Common/Markup/MarkupExtensions.cs b/src/Ryujinx/Common/Markup/MarkupExtensions.cs index cae6d8c2c..9e8ff00ef 100644 --- a/src/Ryujinx/Common/Markup/MarkupExtensions.cs +++ b/src/Ryujinx/Common/Markup/MarkupExtensions.cs @@ -6,16 +6,19 @@ namespace Ryujinx.Ava.Common.Markup { internal class IconExtension(string iconString) : BasicMarkupExtension { + public override string Name => "Icon"; protected override Icon Value => new() { Value = iconString }; } internal class SpinningIconExtension(string iconString) : BasicMarkupExtension { + public override string Name => "SIcon"; protected override Icon Value => new() { Value = iconString, Animation = IconAnimation.Spin }; } internal class LocaleExtension(LocaleKeys key) : BasicMarkupExtension { + public override string Name => "Translation"; protected override string Value => LocaleManager.Instance[key]; protected override void ConfigureBindingExtension(CompiledBindingExtension bindingExtension) diff --git a/src/Ryujinx/UI/Controls/SliderScroll.axaml.cs b/src/Ryujinx/UI/Controls/SliderScroll.cs similarity index 100% rename from src/Ryujinx/UI/Controls/SliderScroll.axaml.cs rename to src/Ryujinx/UI/Controls/SliderScroll.cs diff --git a/src/Ryujinx/UI/Controls/StatusBarSeparator.cs b/src/Ryujinx/UI/Controls/StatusBarSeparator.cs new file mode 100644 index 000000000..7888879f5 --- /dev/null +++ b/src/Ryujinx/UI/Controls/StatusBarSeparator.cs @@ -0,0 +1,19 @@ +using Avalonia; +using Avalonia.Controls; +using Avalonia.Media; + +namespace Ryujinx.Ava.UI.Controls +{ + public class MiniVerticalSeparator : Border + { + public MiniVerticalSeparator() + { + Width = 2; + Height = 12; + Margin = new Thickness(); + BorderBrush = Brushes.Gray; + Background = Brushes.Gray; + BorderThickness = new Thickness(1); + } + } +} diff --git a/src/Ryujinx/UI/ViewModels/BaseModel.cs b/src/Ryujinx/UI/ViewModels/BaseModel.cs index 4db9cf812..d8f2e9096 100644 --- a/src/Ryujinx/UI/ViewModels/BaseModel.cs +++ b/src/Ryujinx/UI/ViewModels/BaseModel.cs @@ -1,3 +1,4 @@ +using System; using System.ComponentModel; using System.Runtime.CompilerServices; @@ -11,5 +12,13 @@ namespace Ryujinx.Ava.UI.ViewModels { PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); } + + protected void OnPropertiesChanged(params ReadOnlySpan propertyNames) + { + foreach (var propertyName in propertyNames) + { + OnPropertyChanged(propertyName); + } + } } } diff --git a/src/Ryujinx/UI/ViewModels/SettingsViewModel.cs b/src/Ryujinx/UI/ViewModels/SettingsViewModel.cs index 85ba203f9..7504147b2 100644 --- a/src/Ryujinx/UI/ViewModels/SettingsViewModel.cs +++ b/src/Ryujinx/UI/ViewModels/SettingsViewModel.cs @@ -71,8 +71,7 @@ namespace Ryujinx.Ava.UI.ViewModels { _resolutionScale = value; - OnPropertyChanged(nameof(CustomResolutionScale)); - OnPropertyChanged(nameof(IsCustomResolutionScaleActive)); + OnPropertiesChanged(nameof(CustomResolutionScale), nameof(IsCustomResolutionScaleActive)); } } @@ -181,8 +180,9 @@ namespace Ryujinx.Ava.UI.ViewModels int newInterval = (int)((value / 100f) * 60); _customVSyncInterval = newInterval; _customVSyncIntervalPercentageProxy = value; - OnPropertyChanged((nameof(CustomVSyncInterval))); - OnPropertyChanged((nameof(CustomVSyncIntervalPercentageText))); + OnPropertiesChanged( + nameof(CustomVSyncInterval), + nameof(CustomVSyncIntervalPercentageText)); } } @@ -190,7 +190,7 @@ namespace Ryujinx.Ava.UI.ViewModels { get { - string text = CustomVSyncIntervalPercentageProxy.ToString() + "%"; + string text = CustomVSyncIntervalPercentageProxy + "%"; return text; } } @@ -221,8 +221,9 @@ namespace Ryujinx.Ava.UI.ViewModels _customVSyncInterval = value; int newPercent = (int)((value / 60f) * 100); _customVSyncIntervalPercentageProxy = newPercent; - OnPropertyChanged(nameof(CustomVSyncIntervalPercentageProxy)); - OnPropertyChanged(nameof(CustomVSyncIntervalPercentageText)); + OnPropertiesChanged( + nameof(CustomVSyncIntervalPercentageProxy), + nameof(CustomVSyncIntervalPercentageText)); OnPropertyChanged(); } } diff --git a/src/Ryujinx/UI/ViewModels/XCITrimmerViewModel.cs b/src/Ryujinx/UI/ViewModels/XCITrimmerViewModel.cs index e1f9eead5..1bca27330 100644 --- a/src/Ryujinx/UI/ViewModels/XCITrimmerViewModel.cs +++ b/src/Ryujinx/UI/ViewModels/XCITrimmerViewModel.cs @@ -91,39 +91,42 @@ namespace Ryujinx.Ava.UI.ViewModels private void SortingChanged() { - OnPropertyChanged(nameof(IsSortedByName)); - OnPropertyChanged(nameof(IsSortedBySaved)); - OnPropertyChanged(nameof(SortingAscending)); - OnPropertyChanged(nameof(SortingField)); - OnPropertyChanged(nameof(SortingFieldName)); + OnPropertiesChanged( + nameof(IsSortedByName), + nameof(IsSortedBySaved), + nameof(SortingAscending), + nameof(SortingField), + nameof(SortingFieldName)); + SortAndFilter(); } private void DisplayedChanged() { - OnPropertyChanged(nameof(Status)); - OnPropertyChanged(nameof(DisplayedXCIFiles)); - OnPropertyChanged(nameof(SelectedDisplayedXCIFiles)); + OnPropertiesChanged(nameof(Status), nameof(DisplayedXCIFiles), nameof(SelectedDisplayedXCIFiles)); } private void ApplicationsChanged() { - OnPropertyChanged(nameof(AllXCIFiles)); - OnPropertyChanged(nameof(Status)); - OnPropertyChanged(nameof(PotentialSavings)); - OnPropertyChanged(nameof(ActualSavings)); - OnPropertyChanged(nameof(CanTrim)); - OnPropertyChanged(nameof(CanUntrim)); + OnPropertiesChanged( + nameof(AllXCIFiles), + nameof(Status), + nameof(PotentialSavings), + nameof(ActualSavings), + nameof(CanTrim), + nameof(CanUntrim)); + DisplayedChanged(); SortAndFilter(); } private void SelectionChanged(bool displayedChanged = true) { - OnPropertyChanged(nameof(Status)); - OnPropertyChanged(nameof(CanTrim)); - OnPropertyChanged(nameof(CanUntrim)); - OnPropertyChanged(nameof(SelectedXCIFiles)); + OnPropertiesChanged( + nameof(Status), + nameof(CanTrim), + nameof(CanUntrim), + nameof(SelectedXCIFiles)); if (displayedChanged) OnPropertyChanged(nameof(SelectedDisplayedXCIFiles)); @@ -131,11 +134,12 @@ namespace Ryujinx.Ava.UI.ViewModels private void ProcessingChanged() { - OnPropertyChanged(nameof(Processing)); - OnPropertyChanged(nameof(Cancel)); - OnPropertyChanged(nameof(Status)); - OnPropertyChanged(nameof(CanTrim)); - OnPropertyChanged(nameof(CanUntrim)); + OnPropertiesChanged( + nameof(Processing), + nameof(Cancel), + nameof(Status), + nameof(CanTrim), + nameof(CanUntrim)); } private IEnumerable GetSelectedDisplayedXCIFiles() diff --git a/src/Ryujinx/UI/Views/Main/MainStatusBarView.axaml b/src/Ryujinx/UI/Views/Main/MainStatusBarView.axaml index ea00927d8..6871fd3f9 100644 --- a/src/Ryujinx/UI/Views/Main/MainStatusBarView.axaml +++ b/src/Ryujinx/UI/Views/Main/MainStatusBarView.axaml @@ -133,7 +133,7 @@ - + - + - + - + - + - + - + - + 0, - > 1 => 1, - _ => newValue, - }; + Window.ViewModel.Volume = Math.Clamp(newValue, 0, 1); e.Handled = true; } } - - public class StatusBarSeparator : Border - { - public StatusBarSeparator() - { - Width = 2; - Height = 12; - Margin = new Thickness(); - BorderBrush = Brushes.Gray; - Background = Brushes.Gray; - BorderThickness = new Thickness(1); - } - } } From 0bacdb8765988d2d9aff3a859d9c6cb64cc5e142 Mon Sep 17 00:00:00 2001 From: Evan Husted Date: Tue, 24 Dec 2024 22:19:58 -0600 Subject: [PATCH 08/60] Improve locale file parsing error descriptions --- src/Ryujinx/Common/LocaleManager.cs | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/src/Ryujinx/Common/LocaleManager.cs b/src/Ryujinx/Common/LocaleManager.cs index 270b666df..e788a3adc 100644 --- a/src/Ryujinx/Common/LocaleManager.cs +++ b/src/Ryujinx/Common/LocaleManager.cs @@ -143,11 +143,7 @@ namespace Ryujinx.Ava.Common.Locale LocaleChanged?.Invoke(); } - #nullable enable - private static LocalesJson? _localeData; - - #nullable disable private static Dictionary LoadJsonLanguage(string languageCode) { @@ -158,18 +154,28 @@ namespace Ryujinx.Ava.Common.Locale foreach (LocalesEntry locale in _localeData.Value.Locales) { - if (locale.Translations.Count != _localeData.Value.Languages.Count) + if (locale.Translations.Count < _localeData.Value.Languages.Count) { throw new Exception($"Locale key {{{locale.ID}}} is missing languages! Has {locale.Translations.Count} translations, expected {_localeData.Value.Languages.Count}!"); + } + + if (locale.Translations.Count > _localeData.Value.Languages.Count) + { + throw new Exception($"Locale key {{{locale.ID}}} has too many languages! Has {locale.Translations.Count} translations, expected {_localeData.Value.Languages.Count}!"); } if (!Enum.TryParse(locale.ID, out var localeKey)) continue; localeStrings[localeKey] = - locale.Translations.TryGetValue(languageCode, out string val) && val != string.Empty + locale.Translations.TryGetValue(languageCode, out string val) && !string.IsNullOrEmpty(val) ? val : locale.Translations[DefaultLanguageCode]; + + if (string.IsNullOrEmpty(localeStrings[localeKey])) + { + throw new Exception($"Locale key '{locale.ID}' has no valid translations for desired language {languageCode}! {DefaultLanguageCode} is an empty string or null"); + } } return localeStrings; From e6644626fceaed218b6a393deb7ee382aa304750 Mon Sep 17 00:00:00 2001 From: Evan Husted Date: Wed, 25 Dec 2024 00:06:29 -0600 Subject: [PATCH 09/60] UI: Fix negative space savings in XCI trimmer --- .../UI/Helpers/XCITrimmerFileSpaceSavingsConverter.cs | 5 +++-- src/Ryujinx/UI/ViewModels/XCITrimmerViewModel.cs | 2 +- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/src/Ryujinx/UI/Helpers/XCITrimmerFileSpaceSavingsConverter.cs b/src/Ryujinx/UI/Helpers/XCITrimmerFileSpaceSavingsConverter.cs index c6e814e90..14e8e178a 100644 --- a/src/Ryujinx/UI/Helpers/XCITrimmerFileSpaceSavingsConverter.cs +++ b/src/Ryujinx/UI/Helpers/XCITrimmerFileSpaceSavingsConverter.cs @@ -1,6 +1,7 @@ using Avalonia; using Avalonia.Data; using Avalonia.Data.Converters; +using Gommon; using Ryujinx.Ava.Common.Locale; using Ryujinx.UI.Common.Models; using System; @@ -32,11 +33,11 @@ namespace Ryujinx.Ava.UI.Helpers if (app.CurrentSavingsB < app.PotentialSavingsB) { - return LocaleManager.Instance.UpdateAndGetDynamicValue(LocaleKeys.TitleXCICanSaveLabel, (app.PotentialSavingsB - app.CurrentSavingsB) / _bytesPerMB); + return LocaleManager.Instance.UpdateAndGetDynamicValue(LocaleKeys.TitleXCICanSaveLabel, ((app.PotentialSavingsB - app.CurrentSavingsB) / _bytesPerMB).CoerceAtLeast(0)); } else { - return LocaleManager.Instance.UpdateAndGetDynamicValue(LocaleKeys.TitleXCISavingLabel, app.CurrentSavingsB / _bytesPerMB); + return LocaleManager.Instance.UpdateAndGetDynamicValue(LocaleKeys.TitleXCISavingLabel, (app.CurrentSavingsB / _bytesPerMB).CoerceAtLeast(0)); } } diff --git a/src/Ryujinx/UI/ViewModels/XCITrimmerViewModel.cs b/src/Ryujinx/UI/ViewModels/XCITrimmerViewModel.cs index 1bca27330..402b182af 100644 --- a/src/Ryujinx/UI/ViewModels/XCITrimmerViewModel.cs +++ b/src/Ryujinx/UI/ViewModels/XCITrimmerViewModel.cs @@ -364,7 +364,7 @@ namespace Ryujinx.Ava.UI.ViewModels value = _processingApplication.Value with { PercentageProgress = null }; if (value.HasValue) - _displayedXCIFiles.ReplaceWith(value.Value); + _displayedXCIFiles.ReplaceWith(value); _processingApplication = value; OnPropertyChanged(); From 412d4065b89df44ddeb86e96e8e0cc54545e8d05 Mon Sep 17 00:00:00 2001 From: Evan Husted Date: Wed, 25 Dec 2024 00:56:01 -0600 Subject: [PATCH 10/60] UI: Abstract applet launch logic for future potential applets Optimize locale loading (remove always loading english, that was only needed with the old system) --- .../Helper/AppletMetadata.cs | 64 +++++++++++++++++++ src/Ryujinx/Common/LocaleManager.cs | 47 ++++---------- .../UI/Views/Main/MainMenuBarView.axaml.cs | 25 ++------ 3 files changed, 81 insertions(+), 55 deletions(-) create mode 100644 src/Ryujinx.UI.Common/Helper/AppletMetadata.cs diff --git a/src/Ryujinx.UI.Common/Helper/AppletMetadata.cs b/src/Ryujinx.UI.Common/Helper/AppletMetadata.cs new file mode 100644 index 000000000..644b7fe74 --- /dev/null +++ b/src/Ryujinx.UI.Common/Helper/AppletMetadata.cs @@ -0,0 +1,64 @@ +using LibHac.Common; +using LibHac.Ncm; +using LibHac.Ns; +using LibHac.Tools.FsSystem.NcaUtils; +using Ryujinx.HLE; +using Ryujinx.HLE.FileSystem; +using Ryujinx.UI.App.Common; + +namespace Ryujinx.UI.Common.Helper +{ + public readonly struct AppletMetadata + { + private readonly ContentManager _contentManager; + + public string Name { get; } + public ulong ProgramId { get; } + + public string Version { get; } + + public AppletMetadata(ContentManager contentManager, string name, ulong programId, string version = "1.0.0") + : this(name, programId, version) + { + _contentManager = contentManager; + } + + public AppletMetadata(string name, ulong programId, string version = "1.0.0") + { + Name = name; + ProgramId = programId; + Version = version; + } + + public string GetContentPath(ContentManager contentManager) + => (contentManager ?? _contentManager) + .GetInstalledContentPath(ProgramId, StorageId.BuiltInSystem, NcaContentType.Program); + + public bool CanStart(ContentManager contentManager, out ApplicationData appData, out BlitStruct appControl) + { + contentManager ??= _contentManager; + if (contentManager == null) + { + appData = null; + appControl = new BlitStruct(0); + return false; + } + + appData = new() + { + Name = Name, + Id = ProgramId, + Path = GetContentPath(contentManager) + }; + + if (string.IsNullOrEmpty(appData.Path)) + { + appControl = new BlitStruct(0); + return false; + } + + appControl = StructHelpers.CreateCustomNacpData(Name, Version); + return true; + } + } +} diff --git a/src/Ryujinx/Common/LocaleManager.cs b/src/Ryujinx/Common/LocaleManager.cs index e788a3adc..70b04ec95 100644 --- a/src/Ryujinx/Common/LocaleManager.cs +++ b/src/Ryujinx/Common/LocaleManager.cs @@ -1,7 +1,6 @@ using Gommon; using Ryujinx.Ava.UI.ViewModels; using Ryujinx.Common; -using Ryujinx.Common.Logging; using Ryujinx.Common.Utilities; using Ryujinx.UI.Common.Configuration; using System; @@ -17,7 +16,6 @@ namespace Ryujinx.Ava.Common.Locale private const string DefaultLanguageCode = "en_US"; private readonly Dictionary _localeStrings; - private Dictionary _localeDefaultStrings; private readonly ConcurrentDictionary _dynamicValues; private string _localeLanguageCode; @@ -27,7 +25,6 @@ namespace Ryujinx.Ava.Common.Locale public LocaleManager() { _localeStrings = new Dictionary(); - _localeDefaultStrings = new Dictionary(); _dynamicValues = new ConcurrentDictionary(); Load(); @@ -37,9 +34,7 @@ namespace Ryujinx.Ava.Common.Locale { var localeLanguageCode = !string.IsNullOrEmpty(ConfigurationState.Instance.UI.LanguageCode.Value) ? ConfigurationState.Instance.UI.LanguageCode.Value : CultureInfo.CurrentCulture.Name.Replace('-', '_'); - - // Load en_US as default, if the target language translation is missing or incomplete. - LoadDefaultLanguage(); + LoadLanguage(localeLanguageCode); // Save whatever we ended up with. @@ -66,26 +61,14 @@ namespace Ryujinx.Ava.Common.Locale } catch { - // If formatting failed use the default text instead. - if (_localeDefaultStrings.TryGetValue(key, out value)) - try - { - return string.Format(value, dynamicValue); - } - catch - { - // If formatting the default text failed return the key. - return key.ToString(); - } + // If formatting the text failed, + // continue to the below line & return the text without formatting. } return value; } - - // If the locale doesn't contain the key return the default one. - return _localeDefaultStrings.TryGetValue(key, out string defaultValue) - ? defaultValue - : key.ToString(); // If the locale text doesn't exist return the key. + + return key.ToString(); // If the locale text doesn't exist return the key. } set { @@ -114,11 +97,6 @@ namespace Ryujinx.Ava.Common.Locale return this[key]; } - private void LoadDefaultLanguage() - { - _localeDefaultStrings = LoadJsonLanguage(DefaultLanguageCode); - } - public void LoadLanguage(string languageCode) { var locale = LoadJsonLanguage(languageCode); @@ -126,7 +104,7 @@ namespace Ryujinx.Ava.Common.Locale if (locale == null) { _localeLanguageCode = DefaultLanguageCode; - locale = _localeDefaultStrings; + locale = LoadJsonLanguage(_localeLanguageCode); } else { @@ -167,15 +145,16 @@ namespace Ryujinx.Ava.Common.Locale if (!Enum.TryParse(locale.ID, out var localeKey)) continue; - localeStrings[localeKey] = - locale.Translations.TryGetValue(languageCode, out string val) && !string.IsNullOrEmpty(val) - ? val - : locale.Translations[DefaultLanguageCode]; - - if (string.IsNullOrEmpty(localeStrings[localeKey])) + var str = locale.Translations.TryGetValue(languageCode, out string val) && !string.IsNullOrEmpty(val) + ? val + : locale.Translations[DefaultLanguageCode]; + + if (string.IsNullOrEmpty(str)) { throw new Exception($"Locale key '{locale.ID}' has no valid translations for desired language {languageCode}! {DefaultLanguageCode} is an empty string or null"); } + + localeStrings[localeKey] = str; } return localeStrings; diff --git a/src/Ryujinx/UI/Views/Main/MainMenuBarView.axaml.cs b/src/Ryujinx/UI/Views/Main/MainMenuBarView.axaml.cs index fa900be81..be8a000e7 100644 --- a/src/Ryujinx/UI/Views/Main/MainMenuBarView.axaml.cs +++ b/src/Ryujinx/UI/Views/Main/MainMenuBarView.axaml.cs @@ -3,8 +3,6 @@ using Avalonia.Controls; using Avalonia.Interactivity; using Avalonia.Threading; using Gommon; -using LibHac.Ncm; -using LibHac.Tools.FsSystem.NcaUtils; using Ryujinx.Ava.Common.Locale; using Ryujinx.Ava.UI.Helpers; using Ryujinx.Ava.UI.ViewModels; @@ -12,8 +10,6 @@ using Ryujinx.Ava.UI.Windows; using Ryujinx.Common; using Ryujinx.Common.Utilities; using Ryujinx.HLE.HOS.Services.Nfc.AmiiboDecryption; -using Ryujinx.HLE; -using Ryujinx.UI.App.Common; using Ryujinx.UI.Common; using Ryujinx.UI.Common.Configuration; using Ryujinx.UI.Common.Helper; @@ -124,26 +120,13 @@ namespace Ryujinx.Ava.UI.Views.Main ViewModel.LoadConfigurableHotKeys(); } + public static readonly AppletMetadata MiiApplet = new("miiEdit", 0x0100000000001009); + public async void OpenMiiApplet(object sender, RoutedEventArgs e) { - const string AppletName = "miiEdit"; - const ulong AppletProgramId = 0x0100000000001009; - const string AppletVersion = "1.0.0"; - - string contentPath = ViewModel.ContentManager.GetInstalledContentPath(AppletProgramId, StorageId.BuiltInSystem, NcaContentType.Program); - - if (!string.IsNullOrEmpty(contentPath)) + if (MiiApplet.CanStart(ViewModel.ContentManager, out var appData, out var nacpData)) { - ApplicationData applicationData = new() - { - Name = AppletName, - Id = AppletProgramId, - Path = contentPath - }; - - var nacpData = StructHelpers.CreateCustomNacpData(AppletName, AppletVersion); - - await ViewModel.LoadApplication(applicationData, ViewModel.IsFullScreen || ViewModel.StartGamesInFullscreen, nacpData); + await ViewModel.LoadApplication(appData, ViewModel.IsFullScreen || ViewModel.StartGamesInFullscreen, nacpData); } } From 2bf48f57d2f63cc2a3e459e38837646c7e15fc60 Mon Sep 17 00:00:00 2001 From: Otozinclus <58051309+Otozinclus@users.noreply.github.com> Date: Wed, 25 Dec 2024 21:19:53 +0100 Subject: [PATCH 11/60] Add more games to metal list (#447) Mario Kart 8 Deluxe and Deltarune got tested by Isaac with help from Peri previosly (His video: https://www.youtube.com/watch?v=GEVre_0ZVUg ) Captain Toad, Cuphead and Animal Crossing I tested myself (side-by-side Video comparison: https://youtu.be/auNS9MmZMPI ) Additional information: Cuphead has flickering issues with certain UI elements on Vulkan via MoltenVK. Metal fixes those and introduces no new issues, according to my testing. Animal Crossing is accurate, except for it having broken backgrounds in interiors, causing them to appear as white instead of black. This is caused by a hardware level sampler bug, that isaac never got to find a workaround for. However, this issue happens with Vulkan via MoltenVK as well, both Metal and Vulkan have this issue, therefore Metal shouldn't have any downside compared to using Vulkan in this game. --- src/Ryujinx/UI/Renderer/RendererHost.axaml.cs | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/src/Ryujinx/UI/Renderer/RendererHost.axaml.cs b/src/Ryujinx/UI/Renderer/RendererHost.axaml.cs index c66b266c0..93481a075 100644 --- a/src/Ryujinx/UI/Renderer/RendererHost.axaml.cs +++ b/src/Ryujinx/UI/Renderer/RendererHost.axaml.cs @@ -33,11 +33,16 @@ namespace Ryujinx.Ava.UI.Renderer public static readonly string[] KnownGreatMetalTitles = [ + "01006f8002326000", // Animal Crossings: New Horizons + "01009bf0072d4000", // Captain Toad: Treasure Tracker + "0100a5c00d162000", // Cuphead + "010023800d64a000", // Deltarune + "010028600EBDA000", // Mario 3D World + "0100152000022000", // Mario Kart 8 Deluxe + "01005CA01580E000", // Persona 5 + "01008C0016544000", // Sea of Stars "01006A800016E000", // Smash Ultimate "0100000000010000", // Super Mario Odyessy - "01008C0016544000", // Sea of Stars - "01005CA01580E000", // Persona 5 - "010028600EBDA000", // Mario 3D World ]; public GraphicsBackend Backend => From 17233d30da931e9ede25061ef6207e201b3cd7d6 Mon Sep 17 00:00:00 2001 From: Evan Husted Date: Thu, 26 Dec 2024 00:29:00 -0600 Subject: [PATCH 12/60] misc: give various threads dedicated names Move all title ID lists into a TitleIDs class in Ryujinx.Common, with helpers. Unify & simplify Auto graphics backend selection logic --- .../Translation/PTC/PtcProfiler.cs | 12 +- src/Ryujinx.Common/TitleIDs.cs | 190 ++++++++++++++++++ .../Queries/CounterQueue.cs | 2 +- .../Queries/CounterQueue.cs | 2 +- .../HOS/Kernel/Threading/KThread.cs | 2 +- .../DiscordIntegrationModule.cs | 148 +------------- src/Ryujinx/AppHost.cs | 40 +--- src/Ryujinx/UI/Renderer/RendererHost.axaml.cs | 25 +-- 8 files changed, 212 insertions(+), 209 deletions(-) create mode 100644 src/Ryujinx.Common/TitleIDs.cs diff --git a/src/ARMeilleure/Translation/PTC/PtcProfiler.cs b/src/ARMeilleure/Translation/PTC/PtcProfiler.cs index 7e630ae10..bdb9abd05 100644 --- a/src/ARMeilleure/Translation/PTC/PtcProfiler.cs +++ b/src/ARMeilleure/Translation/PTC/PtcProfiler.cs @@ -1,4 +1,5 @@ using ARMeilleure.State; +using Humanizer; using Ryujinx.Common; using Ryujinx.Common.Logging; using Ryujinx.Common.Memory; @@ -58,8 +59,8 @@ namespace ARMeilleure.Translation.PTC { _ptc = ptc; - _timer = new Timer(SaveInterval * 1000d); - _timer.Elapsed += PreSave; + _timer = new Timer(SaveInterval.Seconds()); + _timer.Elapsed += TimerElapsed; _outerHeaderMagic = BinaryPrimitives.ReadUInt64LittleEndian(EncodingCache.UTF8NoBOM.GetBytes(OuterHeaderMagicString).AsSpan()); @@ -72,6 +73,9 @@ namespace ARMeilleure.Translation.PTC Enabled = false; } + private void TimerElapsed(object _, ElapsedEventArgs __) + => new Thread(PreSave) { Name = "Ptc.DiskWriter" }.Start(); + public void AddEntry(ulong address, ExecutionMode mode, bool highCq) { if (IsAddressInStaticCodeRange(address)) @@ -262,7 +266,7 @@ namespace ARMeilleure.Translation.PTC compressedStream.SetLength(0L); } - private void PreSave(object source, ElapsedEventArgs e) + private void PreSave() { _waitEvent.Reset(); @@ -428,7 +432,7 @@ namespace ARMeilleure.Translation.PTC { _disposed = true; - _timer.Elapsed -= PreSave; + _timer.Elapsed -= TimerElapsed; _timer.Dispose(); Wait(); diff --git a/src/Ryujinx.Common/TitleIDs.cs b/src/Ryujinx.Common/TitleIDs.cs new file mode 100644 index 000000000..b75ee1299 --- /dev/null +++ b/src/Ryujinx.Common/TitleIDs.cs @@ -0,0 +1,190 @@ +using Gommon; +using Ryujinx.Common.Configuration; +using System; +using System.Linq; +using System.Runtime.InteropServices; + +namespace Ryujinx.Common +{ + public static class TitleIDs + { + public static GraphicsBackend SelectGraphicsBackend(string titleId, GraphicsBackend currentBackend) + { + switch (currentBackend) + { + case GraphicsBackend.OpenGl when OperatingSystem.IsMacOS(): + return GraphicsBackend.Vulkan; + case GraphicsBackend.Vulkan or GraphicsBackend.OpenGl or GraphicsBackend.Metal: + return currentBackend; + } + + if (!(OperatingSystem.IsMacOS() && RuntimeInformation.ProcessArchitecture is Architecture.Arm64)) + return GraphicsBackend.Vulkan; + + return GreatMetalTitles.ContainsIgnoreCase(titleId) ? GraphicsBackend.Metal : GraphicsBackend.Vulkan; + } + + public static readonly string[] GreatMetalTitles = + [ + "01006f8002326000", // Animal Crossings: New Horizons + "01009bf0072d4000", // Captain Toad: Treasure Tracker + "0100a5c00d162000", // Cuphead + "010023800d64a000", // Deltarune + "010028600EBDA000", // Mario 3D World + "0100152000022000", // Mario Kart 8 Deluxe + "01005CA01580E000", // Persona 5 + "01008C0016544000", // Sea of Stars + "01006A800016E000", // Smash Ultimate + "0100000000010000", // Super Mario Odyessy + ]; + + public static string GetDiscordGameAsset(string titleId) + => DiscordGameAssetKeys.Contains(titleId) ? titleId : "game"; + + public static readonly string[] DiscordGameAssetKeys = + [ + "010055d009f78000", // Fire Emblem: Three Houses + "0100a12011cc8000", // Fire Emblem: Shadow Dragon + "0100a6301214e000", // Fire Emblem Engage + "0100f15003e64000", // Fire Emblem Warriors + "010071f0143ea000", // Fire Emblem Warriors: Three Hopes + + "01007e3006dda000", // Kirby Star Allies + "01004d300c5ae000", // Kirby and the Forgotten Land + "01006b601380e000", // Kirby's Return to Dream Land Deluxe + "01003fb00c5a8000", // Super Kirby Clash + "0100227010460000", // Kirby Fighters 2 + "0100a8e016236000", // Kirby's Dream Buffet + + "01007ef00011e000", // The Legend of Zelda: Breath of the Wild + "01006bb00c6f0000", // The Legend of Zelda: Link's Awakening + "01002da013484000", // The Legend of Zelda: Skyward Sword HD + "0100f2c0115b6000", // The Legend of Zelda: Tears of the Kingdom + "01008cf01baac000", // The Legend of Zelda: Echoes of Wisdom + "01000b900d8b0000", // Cadence of Hyrule + "0100ae00096ea000", // Hyrule Warriors: Definitive Edition + "01002b00111a2000", // Hyrule Warriors: Age of Calamity + + "010048701995e000", // Luigi's Mansion 2 HD + "0100dca0064a6000", // Luigi's Mansion 3 + + "010093801237c000", // Metroid Dread + "010012101468c000", // Metroid Prime Remastered + + "0100000000010000", // SUPER MARIO ODYSSEY + "0100ea80032ea000", // Super Mario Bros. U Deluxe + "01009b90006dc000", // Super Mario Maker 2 + "010049900f546000", // Super Mario 3D All-Stars + "010049900F546001", // ^ 64 + "010049900F546002", // ^ Sunshine + "010049900F546003", // ^ Galaxy + "010028600ebda000", // Super Mario 3D World + Bowser's Fury + "010015100b514000", // Super Mario Bros. Wonder + "0100152000022000", // Mario Kart 8 Deluxe + "010036b0034e4000", // Super Mario Party + "01006fe013472000", // Mario Party Superstars + "0100965017338000", // Super Mario Party Jamboree + "01006d0017f7a000", // Mario & Luigi: Brothership + "010067300059a000", // Mario + Rabbids: Kingdom Battle + "0100317013770000", // Mario + Rabbids: Sparks of Hope + "0100a3900c3e2000", // Paper Mario: The Origami King + "0100ecd018ebe000", // Paper Mario: The Thousand-Year Door + "0100bc0018138000", // Super Mario RPG + "0100bde00862a000", // Mario Tennis Aces + "0100c9c00e25c000", // Mario Golf: Super Rush + "010019401051c000", // Mario Strikers: Battle League + "010003000e146000", // Mario & Sonic at the Olympic Games Tokyo 2020 + "0100b99019412000", // Mario vs. Donkey Kong + + "0100aa80194b0000", // Pikmin 1 + "0100d680194b2000", // Pikmin 2 + "0100f4c009322000", // Pikmin 3 Deluxe + "0100b7c00933a000", // Pikmin 4 + + "010003f003a34000", // Pokémon: Let's Go Pikachu! + "0100187003a36000", // Pokémon: Let's Go Eevee! + "0100abf008968000", // Pokémon Sword + "01008db008c2c000", // Pokémon Shield + "0100000011d90000", // Pokémon Brilliant Diamond + "010018e011d92000", // Pokémon Shining Pearl + "01001f5010dfa000", // Pokémon Legends: Arceus + "0100a3d008c5c000", // Pokémon Scarlet + "01008f6008c5e000", // Pokémon Violet + "0100b3f000be2000", // Pokkén Tournament DX + "0100f4300bf2c000", // New Pokémon Snap + + "01003bc0000a0000", // Splatoon 2 (US) + "0100f8f0000a2000", // Splatoon 2 (EU) + "01003c700009c000", // Splatoon 2 (JP) + "0100c2500fc20000", // Splatoon 3 + "0100ba0018500000", // Splatoon 3: Splatfest World Premiere + + "010040600c5ce000", // Tetris 99 + "0100277011f1a000", // Super Mario Bros. 35 + "0100ad9012510000", // PAC-MAN 99 + "0100ccf019c8c000", // F-ZERO 99 + "0100d870045b6000", // NES - Nintendo Switch Online + "01008d300c50c000", // SNES - Nintendo Switch Online + "0100c9a00ece6000", // N64 - Nintendo Switch Online + "0100e0601c632000", // N64 - Nintendo Switch Online 18+ + "0100c62011050000", // GB - Nintendo Switch Online + "010012f017576000", // GBA - Nintendo Switch Online + + "01000320000cc000", // 1-2 Switch + "0100300012f2a000", // Advance Wars 1+2: Re-Boot Camp + "01006f8002326000", // Animal Crossing: New Horizons + "0100620012d6e000", // Big Brain Academy: Brain vs. Brain + "010018300d006000", // BOXBOY! + BOXGIRL! + "0100c1f0051b6000", // Donkey Kong Country: Tropical Freeze + "0100ed000d390000", // Dr. Kawashima's Brain Training + "010067b017588000", // Endless Ocean Luminous + "0100d2f00d5c0000", // Nintendo Switch Sports + "01006b5012b32000", // Part Time UFO + "0100704000B3A000", // Snipperclips + "01006a800016e000", // Super Smash Bros. Ultimate + "0100a9400c9c2000", // Tokyo Mirage Sessions #FE Encore + + "010076f0049a2000", // Bayonetta + "01007960049a0000", // Bayonetta 2 + "01004a4010fea000", // Bayonetta 3 + "0100cf5010fec000", // Bayonetta Origins: Cereza and the Lost Demon + + "0100dcd01525a000", // Persona 3 Portable + "010062b01525c000", // Persona 4 Golden + "010075a016a3a000", // Persona 4 Arena Ultimax + "01005ca01580e000", // Persona 5 Royal + "0100801011c3e000", // Persona 5 Strikers + "010087701b092000", // Persona 5 Tactica + + "01009aa000faa000", // Sonic Mania + "01004ad014bf0000", // Sonic Frontiers + "01005ea01c0fc000", // SONIC X SHADOW GENERATIONS + "01005ea01c0fc001", // ^ + + "010056e00853a000", // A Hat in Time + "0100dbf01000a000", // Burnout Paradise Remastered + "0100744001588000", // Cars 3: Driven to Win + "0100b41013c82000", // Cruis'n Blast + "01001b300b9be000", // Diablo III: Eternal Collection + "01008c8012920000", // Dying Light Platinum Edition + "010073c01af34000", // LEGO Horizon Adventures + "0100770008dd8000", // Monster Hunter Generations Ultimate + "0100b04011742000", // Monster Hunter Rise + "0100853015e86000", // No Man's Sky + "01007bb017812000", // Portal + "0100abd01785c000", // Portal 2 + "01008e200c5c2000", // Muse Dash + "01007820196a6000", // Red Dead Redemption + "01002f7013224000", // Rune Factory 5 + "01008d100d43e000", // Saints Row IV + "0100de600beee000", // Saints Row: The Third - The Full Package + "01001180021fa000", // Shovel Knight: Specter of Torment + "0100d7a01b7a2000", // Star Wars: Bounty Hunter + "0100800015926000", // Suika Game + "0100e46006708000", // Terraria + "01000a10041ea000", // The Elder Scrolls V: Skyrim + "010057a01e4d4000", // TSUKIHIME -A piece of blue glass moon- + "010080b00ad66000", // Undertale + ]; + } +} diff --git a/src/Ryujinx.Graphics.OpenGL/Queries/CounterQueue.cs b/src/Ryujinx.Graphics.OpenGL/Queries/CounterQueue.cs index 7e0311407..88cdec983 100644 --- a/src/Ryujinx.Graphics.OpenGL/Queries/CounterQueue.cs +++ b/src/Ryujinx.Graphics.OpenGL/Queries/CounterQueue.cs @@ -42,7 +42,7 @@ namespace Ryujinx.Graphics.OpenGL.Queries _current = new CounterQueueEvent(this, glType, 0); - _consumerThread = new Thread(EventConsumer); + _consumerThread = new Thread(EventConsumer) { Name = "CPU.CounterQueue." + (int)type }; _consumerThread.Start(); } diff --git a/src/Ryujinx.Graphics.Vulkan/Queries/CounterQueue.cs b/src/Ryujinx.Graphics.Vulkan/Queries/CounterQueue.cs index fa10f13b9..8dd94a42d 100644 --- a/src/Ryujinx.Graphics.Vulkan/Queries/CounterQueue.cs +++ b/src/Ryujinx.Graphics.Vulkan/Queries/CounterQueue.cs @@ -52,7 +52,7 @@ namespace Ryujinx.Graphics.Vulkan.Queries _current = new CounterQueueEvent(this, type, 0); - _consumerThread = new Thread(EventConsumer); + _consumerThread = new Thread(EventConsumer) { Name = "CPU.CounterQueue." + (int)type }; _consumerThread.Start(); } diff --git a/src/Ryujinx.HLE/HOS/Kernel/Threading/KThread.cs b/src/Ryujinx.HLE/HOS/Kernel/Threading/KThread.cs index 4abc0ddf3..35ff74cb3 100644 --- a/src/Ryujinx.HLE/HOS/Kernel/Threading/KThread.cs +++ b/src/Ryujinx.HLE/HOS/Kernel/Threading/KThread.cs @@ -181,7 +181,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Threading is64Bits = true; } - HostThread = new Thread(ThreadStart); + HostThread = new Thread(ThreadStart) { Name = "HLE.KThread" }; Context = owner?.CreateExecutionContext() ?? new ProcessExecutionContext(); diff --git a/src/Ryujinx.UI.Common/DiscordIntegrationModule.cs b/src/Ryujinx.UI.Common/DiscordIntegrationModule.cs index 338d28531..0cb9779ff 100644 --- a/src/Ryujinx.UI.Common/DiscordIntegrationModule.cs +++ b/src/Ryujinx.UI.Common/DiscordIntegrationModule.cs @@ -76,7 +76,7 @@ namespace Ryujinx.UI.Common { Assets = new Assets { - LargeImageKey = _discordGameAssetKeys.Contains(procRes.ProgramIdText) ? procRes.ProgramIdText : "game", + LargeImageKey = TitleIDs.GetDiscordGameAsset(procRes.ProgramIdText), LargeImageText = TruncateToByteLength($"{appMeta.Title} (v{procRes.DisplayVersion})"), SmallImageKey = "ryujinx", SmallImageText = TruncateToByteLength(_description) @@ -122,151 +122,5 @@ namespace Ryujinx.UI.Common { _discordClient?.Dispose(); } - - private static readonly string[] _discordGameAssetKeys = - [ - "010055d009f78000", // Fire Emblem: Three Houses - "0100a12011cc8000", // Fire Emblem: Shadow Dragon - "0100a6301214e000", // Fire Emblem Engage - "0100f15003e64000", // Fire Emblem Warriors - "010071f0143ea000", // Fire Emblem Warriors: Three Hopes - - "01007e3006dda000", // Kirby Star Allies - "01004d300c5ae000", // Kirby and the Forgotten Land - "01006b601380e000", // Kirby's Return to Dream Land Deluxe - "01003fb00c5a8000", // Super Kirby Clash - "0100227010460000", // Kirby Fighters 2 - "0100a8e016236000", // Kirby's Dream Buffet - - "01007ef00011e000", // The Legend of Zelda: Breath of the Wild - "01006bb00c6f0000", // The Legend of Zelda: Link's Awakening - "01002da013484000", // The Legend of Zelda: Skyward Sword HD - "0100f2c0115b6000", // The Legend of Zelda: Tears of the Kingdom - "01008cf01baac000", // The Legend of Zelda: Echoes of Wisdom - "01000b900d8b0000", // Cadence of Hyrule - "0100ae00096ea000", // Hyrule Warriors: Definitive Edition - "01002b00111a2000", // Hyrule Warriors: Age of Calamity - - "010048701995e000", // Luigi's Mansion 2 HD - "0100dca0064a6000", // Luigi's Mansion 3 - - "010093801237c000", // Metroid Dread - "010012101468c000", // Metroid Prime Remastered - - "0100000000010000", // SUPER MARIO ODYSSEY - "0100ea80032ea000", // Super Mario Bros. U Deluxe - "01009b90006dc000", // Super Mario Maker 2 - "010049900f546000", // Super Mario 3D All-Stars - "010049900F546001", // ^ 64 - "010049900F546002", // ^ Sunshine - "010049900F546003", // ^ Galaxy - "010028600ebda000", // Super Mario 3D World + Bowser's Fury - "010015100b514000", // Super Mario Bros. Wonder - "0100152000022000", // Mario Kart 8 Deluxe - "010036b0034e4000", // Super Mario Party - "01006fe013472000", // Mario Party Superstars - "0100965017338000", // Super Mario Party Jamboree - "01006d0017f7a000", // Mario & Luigi: Brothership - "010067300059a000", // Mario + Rabbids: Kingdom Battle - "0100317013770000", // Mario + Rabbids: Sparks of Hope - "0100a3900c3e2000", // Paper Mario: The Origami King - "0100ecd018ebe000", // Paper Mario: The Thousand-Year Door - "0100bc0018138000", // Super Mario RPG - "0100bde00862a000", // Mario Tennis Aces - "0100c9c00e25c000", // Mario Golf: Super Rush - "010019401051c000", // Mario Strikers: Battle League - "010003000e146000", // Mario & Sonic at the Olympic Games Tokyo 2020 - "0100b99019412000", // Mario vs. Donkey Kong - - "0100aa80194b0000", // Pikmin 1 - "0100d680194b2000", // Pikmin 2 - "0100f4c009322000", // Pikmin 3 Deluxe - "0100b7c00933a000", // Pikmin 4 - - "010003f003a34000", // Pokémon: Let's Go Pikachu! - "0100187003a36000", // Pokémon: Let's Go Eevee! - "0100abf008968000", // Pokémon Sword - "01008db008c2c000", // Pokémon Shield - "0100000011d90000", // Pokémon Brilliant Diamond - "010018e011d92000", // Pokémon Shining Pearl - "01001f5010dfa000", // Pokémon Legends: Arceus - "0100a3d008c5c000", // Pokémon Scarlet - "01008f6008c5e000", // Pokémon Violet - "0100b3f000be2000", // Pokkén Tournament DX - "0100f4300bf2c000", // New Pokémon Snap - - "01003bc0000a0000", // Splatoon 2 (US) - "0100f8f0000a2000", // Splatoon 2 (EU) - "01003c700009c000", // Splatoon 2 (JP) - "0100c2500fc20000", // Splatoon 3 - "0100ba0018500000", // Splatoon 3: Splatfest World Premiere - - "010040600c5ce000", // Tetris 99 - "0100277011f1a000", // Super Mario Bros. 35 - "0100ad9012510000", // PAC-MAN 99 - "0100ccf019c8c000", // F-ZERO 99 - "0100d870045b6000", // NES - Nintendo Switch Online - "01008d300c50c000", // SNES - Nintendo Switch Online - "0100c9a00ece6000", // N64 - Nintendo Switch Online - "0100e0601c632000", // N64 - Nintendo Switch Online 18+ - "0100c62011050000", // GB - Nintendo Switch Online - "010012f017576000", // GBA - Nintendo Switch Online - - "01000320000cc000", // 1-2 Switch - "0100300012f2a000", // Advance Wars 1+2: Re-Boot Camp - "01006f8002326000", // Animal Crossing: New Horizons - "0100620012d6e000", // Big Brain Academy: Brain vs. Brain - "010018300d006000", // BOXBOY! + BOXGIRL! - "0100c1f0051b6000", // Donkey Kong Country: Tropical Freeze - "0100ed000d390000", // Dr. Kawashima's Brain Training - "010067b017588000", // Endless Ocean Luminous - "0100d2f00d5c0000", // Nintendo Switch Sports - "01006b5012b32000", // Part Time UFO - "0100704000B3A000", // Snipperclips - "01006a800016e000", // Super Smash Bros. Ultimate - "0100a9400c9c2000", // Tokyo Mirage Sessions #FE Encore - - "010076f0049a2000", // Bayonetta - "01007960049a0000", // Bayonetta 2 - "01004a4010fea000", // Bayonetta 3 - "0100cf5010fec000", // Bayonetta Origins: Cereza and the Lost Demon - - "0100dcd01525a000", // Persona 3 Portable - "010062b01525c000", // Persona 4 Golden - "010075a016a3a000", // Persona 4 Arena Ultimax - "01005ca01580e000", // Persona 5 Royal - "0100801011c3e000", // Persona 5 Strikers - "010087701b092000", // Persona 5 Tactica - - "01009aa000faa000", // Sonic Mania - "01004ad014bf0000", // Sonic Frontiers - "01005ea01c0fc000", // SONIC X SHADOW GENERATIONS - "01005ea01c0fc001", // ^ - - "010056e00853a000", // A Hat in Time - "0100dbf01000a000", // Burnout Paradise Remastered - "0100744001588000", // Cars 3: Driven to Win - "0100b41013c82000", // Cruis'n Blast - "01001b300b9be000", // Diablo III: Eternal Collection - "01008c8012920000", // Dying Light Platinum Edition - "010073c01af34000", // LEGO Horizon Adventures - "0100770008dd8000", // Monster Hunter Generations Ultimate - "0100b04011742000", // Monster Hunter Rise - "0100853015e86000", // No Man's Sky - "01007bb017812000", // Portal - "0100abd01785c000", // Portal 2 - "01008e200c5c2000", // Muse Dash - "01007820196a6000", // Red Dead Redemption - "01002f7013224000", // Rune Factory 5 - "01008d100d43e000", // Saints Row IV - "0100de600beee000", // Saints Row: The Third - The Full Package - "01001180021fa000", // Shovel Knight: Specter of Torment - "0100d7a01b7a2000", // Star Wars: Bounty Hunter - "0100800015926000", // Suika Game - "0100e46006708000", // Terraria - "01000a10041ea000", // The Elder Scrolls V: Skyrim - "010057a01e4d4000", // TSUKIHIME -A piece of blue glass moon- - "010080b00ad66000", // Undertale - ]; } } diff --git a/src/Ryujinx/AppHost.cs b/src/Ryujinx/AppHost.cs index 86b5eafa1..f976ecdf1 100644 --- a/src/Ryujinx/AppHost.cs +++ b/src/Ryujinx/AppHost.cs @@ -143,23 +143,6 @@ namespace Ryujinx.Ava public ulong ApplicationId { get; private set; } public bool ScreenshotRequested { get; set; } - public bool ShouldInitMetal - { - get - { - return OperatingSystem.IsMacOS() && RuntimeInformation.ProcessArchitecture == Architecture.Arm64 && - ( - ( - ( - ConfigurationState.Instance.Graphics.GraphicsBackend.Value == GraphicsBackend.Auto && - RendererHost.KnownGreatMetalTitles.ContainsIgnoreCase(ApplicationId.ToString("X16")) - ) || - ConfigurationState.Instance.Graphics.GraphicsBackend.Value == GraphicsBackend.Metal - ) - ); - } - } - public AppHost( RendererHost renderer, InputManager inputManager, @@ -912,27 +895,20 @@ namespace Ryujinx.Ava VirtualFileSystem.ReloadKeySet(); // Initialize Renderer. - IRenderer renderer; - GraphicsBackend backend = ConfigurationState.Instance.Graphics.GraphicsBackend; + GraphicsBackend backend = TitleIDs.SelectGraphicsBackend(ApplicationId.ToString("X16"), ConfigurationState.Instance.Graphics.GraphicsBackend); - if (ShouldInitMetal) + IRenderer renderer = backend switch { #pragma warning disable CA1416 // This call site is reachable on all platforms - // The condition does a check for Mac, on top of checking if it's an ARM Mac. This isn't a problem. - renderer = new MetalRenderer((RendererHost.EmbeddedWindow as EmbeddedWindowMetal)!.CreateSurface); + // SelectGraphicsBackend does a check for Mac, on top of checking if it's an ARM Mac. This isn't a problem. + GraphicsBackend.Metal => new MetalRenderer((RendererHost.EmbeddedWindow as EmbeddedWindowMetal)!.CreateSurface), #pragma warning restore CA1416 - } - else if (backend == GraphicsBackend.Vulkan || (backend == GraphicsBackend.Auto && !ShouldInitMetal)) - { - renderer = VulkanRenderer.Create( + GraphicsBackend.Vulkan => VulkanRenderer.Create( ConfigurationState.Instance.Graphics.PreferredGpu, (RendererHost.EmbeddedWindow as EmbeddedWindowVulkan)!.CreateSurface, - VulkanHelper.GetRequiredInstanceExtensions); - } - else - { - renderer = new OpenGLRenderer(); - } + VulkanHelper.GetRequiredInstanceExtensions), + _ => new OpenGLRenderer() + }; BackendThreading threadingMode = ConfigurationState.Instance.Graphics.BackendThreading; diff --git a/src/Ryujinx/UI/Renderer/RendererHost.axaml.cs b/src/Ryujinx/UI/Renderer/RendererHost.axaml.cs index 93481a075..71c0e1432 100644 --- a/src/Ryujinx/UI/Renderer/RendererHost.axaml.cs +++ b/src/Ryujinx/UI/Renderer/RendererHost.axaml.cs @@ -1,6 +1,7 @@ using Avalonia; using Avalonia.Controls; using Gommon; +using Ryujinx.Common; using Ryujinx.Common.Configuration; using Ryujinx.Common.Logging; using Ryujinx.UI.Common.Configuration; @@ -31,20 +32,6 @@ namespace Ryujinx.Ava.UI.Renderer Initialize(); } - public static readonly string[] KnownGreatMetalTitles = - [ - "01006f8002326000", // Animal Crossings: New Horizons - "01009bf0072d4000", // Captain Toad: Treasure Tracker - "0100a5c00d162000", // Cuphead - "010023800d64a000", // Deltarune - "010028600EBDA000", // Mario 3D World - "0100152000022000", // Mario Kart 8 Deluxe - "01005CA01580E000", // Persona 5 - "01008C0016544000", // Sea of Stars - "01006A800016E000", // Smash Ultimate - "0100000000010000", // Super Mario Odyessy - ]; - public GraphicsBackend Backend => EmbeddedWindow switch { @@ -58,16 +45,8 @@ namespace Ryujinx.Ava.UI.Renderer { InitializeComponent(); - switch (ConfigurationState.Instance.Graphics.GraphicsBackend.Value) + switch (TitleIDs.SelectGraphicsBackend(titleId, ConfigurationState.Instance.Graphics.GraphicsBackend)) { - case GraphicsBackend.Auto: - EmbeddedWindow = - OperatingSystem.IsMacOS() && - RuntimeInformation.ProcessArchitecture == Architecture.Arm64 && - KnownGreatMetalTitles.ContainsIgnoreCase(titleId) - ? new EmbeddedWindowMetal() - : new EmbeddedWindowVulkan(); - break; case GraphicsBackend.OpenGl: EmbeddedWindow = new EmbeddedWindowOpenGL(); break; From c9b2a6b1f155b45ee7385be0e1532a1c95fd13a8 Mon Sep 17 00:00:00 2001 From: Evan Husted Date: Thu, 26 Dec 2024 22:42:39 -0600 Subject: [PATCH 13/60] metal: Try and see if this lets VSync turn off. (cherry picked from commit 9558b3771634d144501dedf3f081afc485a49d9d) --- Ryujinx.sln | 11 ++++++++-- .../CAMetalLayerExtensions.cs | 21 +++++++++++++++++++ ...Graphics.Metal.SharpMetalExtensions.csproj | 10 +++++++++ .../Ryujinx.Graphics.Metal.csproj | 9 +++----- src/Ryujinx.Graphics.Metal/Window.cs | 11 +++++++++- 5 files changed, 53 insertions(+), 9 deletions(-) create mode 100644 src/Ryujinx.Graphics.Metal.SharpMetalExtensions/CAMetalLayerExtensions.cs create mode 100644 src/Ryujinx.Graphics.Metal.SharpMetalExtensions/Ryujinx.Graphics.Metal.SharpMetalExtensions.csproj diff --git a/Ryujinx.sln b/Ryujinx.sln index 71d5f6dd9..e9f57df39 100644 --- a/Ryujinx.sln +++ b/Ryujinx.sln @@ -80,11 +80,16 @@ EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Ryujinx.Horizon.Kernel.Generators", "src\Ryujinx.Horizon.Kernel.Generators\Ryujinx.Horizon.Kernel.Generators.csproj", "{7F55A45D-4E1D-4A36-ADD3-87F29A285AA2}" EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Ryujinx.HLE.Generators", "src\Ryujinx.HLE.Generators\Ryujinx.HLE.Generators.csproj", "{B575BCDE-2FD8-4A5D-8756-31CDD7FE81F0}" +EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Ryujinx.Graphics.Metal", "src\Ryujinx.Graphics.Metal\Ryujinx.Graphics.Metal.csproj", "{C08931FA-1191-417A-864F-3882D93E683B}" ProjectSection(ProjectDependencies) = postProject {A602AE97-91A5-4608-8DF1-EBF4ED7A0B9E} = {A602AE97-91A5-4608-8DF1-EBF4ED7A0B9E} EndProjectSection EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Ryujinx.BuildValidationTasks", "src\Ryujinx.BuildValidationTasks\Ryujinx.BuildValidationTasks.csproj", "{4A89A234-4F19-497D-A576-DDE8CDFC5B22}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Ryujinx.Graphics.Metal.SharpMetalExtensions", "src/Ryujinx.Graphics.Metal.SharpMetalExtensions\Ryujinx.Graphics.Metal.SharpMetalExtensions.csproj", "{81EA598C-DBA1-40B0-8DA4-4796B78F2037}" +EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{36F870C1-3E5F-485F-B426-F0645AF78751}" ProjectSection(SolutionItems) = preProject .editorconfig = .editorconfig @@ -94,8 +99,6 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution .github\workflows\release.yml = .github\workflows\release.yml EndProjectSection EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Ryujinx.BuildValidationTasks", "src\Ryujinx.BuildValidationTasks\Ryujinx.BuildValidationTasks.csproj", "{4A89A234-4F19-497D-A576-DDE8CDFC5B22}" -EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -265,6 +268,10 @@ Global {C08931FA-1191-417A-864F-3882D93E683B}.Debug|Any CPU.Build.0 = Debug|Any CPU {C08931FA-1191-417A-864F-3882D93E683B}.Release|Any CPU.ActiveCfg = Release|Any CPU {C08931FA-1191-417A-864F-3882D93E683B}.Release|Any CPU.Build.0 = Release|Any CPU + {81EA598C-DBA1-40B0-8DA4-4796B78F2037}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {81EA598C-DBA1-40B0-8DA4-4796B78F2037}.Debug|Any CPU.Build.0 = Debug|Any CPU + {81EA598C-DBA1-40B0-8DA4-4796B78F2037}.Release|Any CPU.ActiveCfg = Release|Any CPU + {81EA598C-DBA1-40B0-8DA4-4796B78F2037}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE diff --git a/src/Ryujinx.Graphics.Metal.SharpMetalExtensions/CAMetalLayerExtensions.cs b/src/Ryujinx.Graphics.Metal.SharpMetalExtensions/CAMetalLayerExtensions.cs new file mode 100644 index 000000000..361419658 --- /dev/null +++ b/src/Ryujinx.Graphics.Metal.SharpMetalExtensions/CAMetalLayerExtensions.cs @@ -0,0 +1,21 @@ +using SharpMetal; +using SharpMetal.ObjectiveCCore; +using SharpMetal.QuartzCore; +using System.Runtime.Versioning; +// ReSharper disable InconsistentNaming + +namespace Ryujinx.Graphics.Metal.SharpMetalExtensions +{ + [SupportedOSPlatform("OSX")] + public static class CAMetalLayerExtensions + { + private static readonly Selector sel_displaySyncEnabled = "displaySyncEnabled"; + private static readonly Selector sel_setDisplaySyncEnabled = "setDisplaySyncEnabled:"; + + public static bool IsDisplaySyncEnabled(this CAMetalLayer metalLayer) + => ObjectiveCRuntime.bool_objc_msgSend(metalLayer.NativePtr, sel_displaySyncEnabled); + + public static void SetDisplaySyncEnabled(this CAMetalLayer metalLayer, bool enabled) + => ObjectiveCRuntime.objc_msgSend(metalLayer.NativePtr, sel_setDisplaySyncEnabled, enabled); + } +} diff --git a/src/Ryujinx.Graphics.Metal.SharpMetalExtensions/Ryujinx.Graphics.Metal.SharpMetalExtensions.csproj b/src/Ryujinx.Graphics.Metal.SharpMetalExtensions/Ryujinx.Graphics.Metal.SharpMetalExtensions.csproj new file mode 100644 index 000000000..9836063a3 --- /dev/null +++ b/src/Ryujinx.Graphics.Metal.SharpMetalExtensions/Ryujinx.Graphics.Metal.SharpMetalExtensions.csproj @@ -0,0 +1,10 @@ + + + enable + enable + + + + + + diff --git a/src/Ryujinx.Graphics.Metal/Ryujinx.Graphics.Metal.csproj b/src/Ryujinx.Graphics.Metal/Ryujinx.Graphics.Metal.csproj index 02afb150a..364aa5a8b 100644 --- a/src/Ryujinx.Graphics.Metal/Ryujinx.Graphics.Metal.csproj +++ b/src/Ryujinx.Graphics.Metal/Ryujinx.Graphics.Metal.csproj @@ -5,12 +5,9 @@ - - - - - - + + + diff --git a/src/Ryujinx.Graphics.Metal/Window.cs b/src/Ryujinx.Graphics.Metal/Window.cs index 65a47d217..29099e7b1 100644 --- a/src/Ryujinx.Graphics.Metal/Window.cs +++ b/src/Ryujinx.Graphics.Metal/Window.cs @@ -1,6 +1,7 @@ using Ryujinx.Common.Logging; using Ryujinx.Graphics.GAL; using Ryujinx.Graphics.Metal.Effects; +using Ryujinx.Graphics.Metal.SharpMetalExtensions; using SharpMetal.ObjectiveCCore; using SharpMetal.QuartzCore; using System; @@ -140,7 +141,15 @@ namespace Ryujinx.Graphics.Metal public void ChangeVSyncMode(VSyncMode vSyncMode) { - //_vSyncMode = vSyncMode; + switch (vSyncMode) + { + case VSyncMode.Unbounded: + _metalLayer.SetDisplaySyncEnabled(false); + break; + case VSyncMode.Switch: + _metalLayer.SetDisplaySyncEnabled(true); + break; + } } public void SetAntiAliasing(AntiAliasing effect) From d7b3dd12d14ef0409d9dd59328b9fcfcba8ab495 Mon Sep 17 00:00:00 2001 From: Evan Husted Date: Thu, 26 Dec 2024 22:58:49 -0600 Subject: [PATCH 14/60] UI: Set title bar icon to the already loaded one --- src/Ryujinx/UI/Views/Main/MainMenuBarView.axaml | 3 +-- src/Ryujinx/UI/Views/Main/MainMenuBarView.axaml.cs | 1 + 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Ryujinx/UI/Views/Main/MainMenuBarView.axaml b/src/Ryujinx/UI/Views/Main/MainMenuBarView.axaml index 8207f8e03..2c07bd8ef 100644 --- a/src/Ryujinx/UI/Views/Main/MainMenuBarView.axaml +++ b/src/Ryujinx/UI/Views/Main/MainMenuBarView.axaml @@ -17,8 +17,7 @@ Margin="7, 0" Height="25" Width="25" - ToolTip.Tip="{Binding Title}" - Source="resm:Ryujinx.UI.Common.Resources.Logo_Ryujinx_AntiAlias.png?assembly=Ryujinx.UI.Common" /> + ToolTip.Tip="{Binding Title}" /> Date: Thu, 26 Dec 2024 23:13:35 -0600 Subject: [PATCH 15/60] UI: Redirect IME errors to Debug instead of error --- src/Ryujinx/UI/Helpers/LoggerAdapter.cs | 10 +++++----- src/Ryujinx/UI/Views/Main/MainStatusBarView.axaml | 1 - 2 files changed, 5 insertions(+), 6 deletions(-) diff --git a/src/Ryujinx/UI/Helpers/LoggerAdapter.cs b/src/Ryujinx/UI/Helpers/LoggerAdapter.cs index 7982c17a6..2d26bd090 100644 --- a/src/Ryujinx/UI/Helpers/LoggerAdapter.cs +++ b/src/Ryujinx/UI/Helpers/LoggerAdapter.cs @@ -19,7 +19,7 @@ namespace Ryujinx.Ava.UI.Helpers AvaLogger.Sink = new LoggerAdapter(); } - private static RyuLogger.Log? GetLog(AvaLogLevel level) + private static RyuLogger.Log? GetLog(AvaLogLevel level, string area) { return level switch { @@ -27,7 +27,7 @@ namespace Ryujinx.Ava.UI.Helpers AvaLogLevel.Debug => RyuLogger.Debug, AvaLogLevel.Information => RyuLogger.Debug, AvaLogLevel.Warning => RyuLogger.Debug, - AvaLogLevel.Error => RyuLogger.Error, + AvaLogLevel.Error => area is "IME" ? RyuLogger.Debug : RyuLogger.Error, AvaLogLevel.Fatal => RyuLogger.Error, _ => throw new ArgumentOutOfRangeException(nameof(level), level, null), }; @@ -35,17 +35,17 @@ namespace Ryujinx.Ava.UI.Helpers public bool IsEnabled(AvaLogLevel level, string area) { - return GetLog(level) != null; + return GetLog(level, area) != null; } public void Log(AvaLogLevel level, string area, object source, string messageTemplate) { - GetLog(level)?.PrintMsg(RyuLogClass.UI, Format(level, area, messageTemplate, source, null)); + GetLog(level, area)?.PrintMsg(RyuLogClass.UI, Format(level, area, messageTemplate, source, null)); } public void Log(AvaLogLevel level, string area, object source, string messageTemplate, params object[] propertyValues) { - GetLog(level)?.PrintMsg(RyuLogClass.UI, Format(level, area, messageTemplate, source, propertyValues)); + GetLog(level, area)?.PrintMsg(RyuLogClass.UI, Format(level, area, messageTemplate, source, propertyValues)); } private static string Format(AvaLogLevel level, string area, string template, object source, object[] v) diff --git a/src/Ryujinx/UI/Views/Main/MainStatusBarView.axaml b/src/Ryujinx/UI/Views/Main/MainStatusBarView.axaml index 6871fd3f9..a0259c723 100644 --- a/src/Ryujinx/UI/Views/Main/MainStatusBarView.axaml +++ b/src/Ryujinx/UI/Views/Main/MainStatusBarView.axaml @@ -7,7 +7,6 @@ xmlns:ext="clr-namespace:Ryujinx.Ava.Common.Markup" xmlns:ui="clr-namespace:FluentAvalonia.UI.Controls;assembly=FluentAvalonia" xmlns:viewModels="clr-namespace:Ryujinx.Ava.UI.ViewModels" - xmlns:local="clr-namespace:Ryujinx.Ava.UI.Views.Main" xmlns:config="clr-namespace:Ryujinx.Common.Configuration;assembly=Ryujinx.Common" mc:Ignorable="d" d:DesignWidth="800" d:DesignHeight="450" x:Class="Ryujinx.Ava.UI.Views.Main.MainStatusBarView" From 9754d247b59a064f9888423ef6c227c6f209e784 Mon Sep 17 00:00:00 2001 From: Evan Husted Date: Thu, 26 Dec 2024 23:32:53 -0600 Subject: [PATCH 16/60] UI: Directly proxy window properties on the view model back to the stored window --- src/Ryujinx/RyujinxApp.axaml.cs | 7 +-- .../UI/ViewModels/MainWindowViewModel.cs | 45 +++++-------------- src/Ryujinx/UI/Windows/MainWindow.axaml | 5 --- 3 files changed, 14 insertions(+), 43 deletions(-) diff --git a/src/Ryujinx/RyujinxApp.axaml.cs b/src/Ryujinx/RyujinxApp.axaml.cs index bbef20aa0..c2f92f2f7 100644 --- a/src/Ryujinx/RyujinxApp.axaml.cs +++ b/src/Ryujinx/RyujinxApp.axaml.cs @@ -33,11 +33,8 @@ namespace Ryujinx.Ava .ApplicationLifetime.Cast() .MainWindow.Cast(); - public static bool IsClipboardAvailable(out IClipboard clipboard) - { - clipboard = MainWindow.Clipboard; - return clipboard != null; - } + public static bool IsClipboardAvailable(out IClipboard clipboard) + => (clipboard = MainWindow.Clipboard) != null; public static void SetTaskbarProgress(TaskBarProgressBarState state) => MainWindow.PlatformFeatures.SetTaskBarProgressBarState(state); public static void SetTaskbarProgressValue(ulong current, ulong total) => MainWindow.PlatformFeatures.SetTaskBarProgressBarValue(current, total); diff --git a/src/Ryujinx/UI/ViewModels/MainWindowViewModel.cs b/src/Ryujinx/UI/ViewModels/MainWindowViewModel.cs index 04881b58d..d0ea64c37 100644 --- a/src/Ryujinx/UI/ViewModels/MainWindowViewModel.cs +++ b/src/Ryujinx/UI/ViewModels/MainWindowViewModel.cs @@ -109,13 +109,8 @@ namespace Ryujinx.Ava.UI.ViewModels private bool _areMimeTypesRegistered = FileAssociationHelper.AreMimeTypesRegistered; private bool _canUpdate = true; - private Cursor _cursor; - private string _title; private ApplicationData _currentApplicationData; private readonly AutoResetEvent _rendererWaitEvent; - private WindowState _windowState; - private double _windowWidth; - private double _windowHeight; private int _customVSyncInterval; private int _customVSyncIntervalPercentageProxy; @@ -216,7 +211,7 @@ namespace Ryujinx.Ava.UI.ViewModels public bool CanUpdate { - get => _canUpdate && EnableNonGameRunningControls && Updater.CanUpdate(false); + get => _canUpdate && EnableNonGameRunningControls && Updater.CanUpdate(); set { _canUpdate = value; @@ -226,12 +221,8 @@ namespace Ryujinx.Ava.UI.ViewModels public Cursor Cursor { - get => _cursor; - set - { - _cursor = value; - OnPropertyChanged(); - } + get => Window.Cursor; + set => Window.Cursor = value; } public ReadOnlyObservableCollection AppsObservableList @@ -813,35 +804,23 @@ namespace Ryujinx.Ava.UI.ViewModels public WindowState WindowState { - get => _windowState; + get => Window.WindowState; internal set { - _windowState = value; - - OnPropertyChanged(); + Window.WindowState = value; } } public double WindowWidth { - get => _windowWidth; - set - { - _windowWidth = value; - - OnPropertyChanged(); - } + get => Window.Width; + set => Window.Width = value; } public double WindowHeight { - get => _windowHeight; - set - { - _windowHeight = value; - - OnPropertyChanged(); - } + get => Window.Height; + set => Window.Height = value; } public bool IsGrid => Glyph == Glyph.Grid; @@ -889,11 +868,11 @@ namespace Ryujinx.Ava.UI.ViewModels public string Title { - get => _title; + get => Window.Title; set { - _title = value; - + Window.Title = value; + OnPropertyChanged(); } } diff --git a/src/Ryujinx/UI/Windows/MainWindow.axaml b/src/Ryujinx/UI/Windows/MainWindow.axaml index cb2e5936d..e3b6cf912 100644 --- a/src/Ryujinx/UI/Windows/MainWindow.axaml +++ b/src/Ryujinx/UI/Windows/MainWindow.axaml @@ -9,11 +9,6 @@ xmlns:helpers="clr-namespace:Ryujinx.Ava.UI.Helpers" xmlns:controls="clr-namespace:Ryujinx.Ava.UI.Controls" xmlns:main="clr-namespace:Ryujinx.Ava.UI.Views.Main" - Cursor="{Binding Cursor}" - Title="{Binding Title}" - WindowState="{Binding WindowState}" - Width="{Binding WindowWidth}" - Height="{Binding WindowHeight}" MinWidth="800" MinHeight="500" d:DesignHeight="720" From c73b5bdf4604be24a6ae78c4aa5b5ae94ec0e6fa Mon Sep 17 00:00:00 2001 From: Evan Husted Date: Thu, 26 Dec 2024 23:58:55 -0600 Subject: [PATCH 17/60] metal: wip: allow getting/setting developerHUDProperies --- .../CAMetalLayerExtensions.cs | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/src/Ryujinx.Graphics.Metal.SharpMetalExtensions/CAMetalLayerExtensions.cs b/src/Ryujinx.Graphics.Metal.SharpMetalExtensions/CAMetalLayerExtensions.cs index 361419658..91e94fb2c 100644 --- a/src/Ryujinx.Graphics.Metal.SharpMetalExtensions/CAMetalLayerExtensions.cs +++ b/src/Ryujinx.Graphics.Metal.SharpMetalExtensions/CAMetalLayerExtensions.cs @@ -6,16 +6,25 @@ using System.Runtime.Versioning; namespace Ryujinx.Graphics.Metal.SharpMetalExtensions { - [SupportedOSPlatform("OSX")] + [SupportedOSPlatform("macOS")] public static class CAMetalLayerExtensions { private static readonly Selector sel_displaySyncEnabled = "displaySyncEnabled"; private static readonly Selector sel_setDisplaySyncEnabled = "setDisplaySyncEnabled:"; + private static readonly Selector sel_developerHUDProperties = "developerHUDProperties"; + private static readonly Selector sel_setDeveloperHUDProperties = "setDeveloperHUDProperties:"; + public static bool IsDisplaySyncEnabled(this CAMetalLayer metalLayer) => ObjectiveCRuntime.bool_objc_msgSend(metalLayer.NativePtr, sel_displaySyncEnabled); public static void SetDisplaySyncEnabled(this CAMetalLayer metalLayer, bool enabled) => ObjectiveCRuntime.objc_msgSend(metalLayer.NativePtr, sel_setDisplaySyncEnabled, enabled); + + public static nint GetDeveloperHudProperties(this CAMetalLayer metalLayer) + => ObjectiveCRuntime.IntPtr_objc_msgSend(metalLayer.NativePtr, sel_developerHUDProperties); + + public static void SetDeveloperHudProperties(this CAMetalLayer metalLayer, nint dictionaryPointer) + => ObjectiveCRuntime.objc_msgSend(metalLayer.NativePtr, sel_setDisplaySyncEnabled, dictionaryPointer); } } From 9df1366fa1d6c149e46148215cb32aad3fa48648 Mon Sep 17 00:00:00 2001 From: Evan Husted Date: Fri, 27 Dec 2024 00:00:29 -0600 Subject: [PATCH 18/60] I may be stu-- nah. I am here. I am stupid for this one. --- .../CAMetalLayerExtensions.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Ryujinx.Graphics.Metal.SharpMetalExtensions/CAMetalLayerExtensions.cs b/src/Ryujinx.Graphics.Metal.SharpMetalExtensions/CAMetalLayerExtensions.cs index 91e94fb2c..0d29a502b 100644 --- a/src/Ryujinx.Graphics.Metal.SharpMetalExtensions/CAMetalLayerExtensions.cs +++ b/src/Ryujinx.Graphics.Metal.SharpMetalExtensions/CAMetalLayerExtensions.cs @@ -25,6 +25,6 @@ namespace Ryujinx.Graphics.Metal.SharpMetalExtensions => ObjectiveCRuntime.IntPtr_objc_msgSend(metalLayer.NativePtr, sel_developerHUDProperties); public static void SetDeveloperHudProperties(this CAMetalLayer metalLayer, nint dictionaryPointer) - => ObjectiveCRuntime.objc_msgSend(metalLayer.NativePtr, sel_setDisplaySyncEnabled, dictionaryPointer); + => ObjectiveCRuntime.objc_msgSend(metalLayer.NativePtr, sel_setDeveloperHUDProperties, dictionaryPointer); } } From 0733b7d0a1bdfe4063af2c9d73528d03b62f02fe Mon Sep 17 00:00:00 2001 From: Evan Husted Date: Fri, 27 Dec 2024 00:38:12 -0600 Subject: [PATCH 19/60] chore: Remove duplicate VSyncMode enum in GAL --- src/Ryujinx.Graphics.GAL/IWindow.cs | 1 + .../Multithreading/ThreadedWindow.cs | 1 + src/Ryujinx.Graphics.GAL/VSyncMode.cs | 9 --------- src/Ryujinx.Graphics.Metal/Window.cs | 3 +++ src/Ryujinx.Graphics.OpenGL/Window.cs | 3 +++ src/Ryujinx.Graphics.Vulkan/Window.cs | 3 +++ src/Ryujinx.Graphics.Vulkan/WindowBase.cs | 3 +++ src/Ryujinx.HLE/HLEConfiguration.cs | 1 - .../HOS/Services/SurfaceFlinger/SurfaceFlinger.cs | 1 - 9 files changed, 14 insertions(+), 11 deletions(-) delete mode 100644 src/Ryujinx.Graphics.GAL/VSyncMode.cs diff --git a/src/Ryujinx.Graphics.GAL/IWindow.cs b/src/Ryujinx.Graphics.GAL/IWindow.cs index 12686cb28..48144f0b0 100644 --- a/src/Ryujinx.Graphics.GAL/IWindow.cs +++ b/src/Ryujinx.Graphics.GAL/IWindow.cs @@ -1,3 +1,4 @@ +using Ryujinx.Common.Configuration; using System; namespace Ryujinx.Graphics.GAL diff --git a/src/Ryujinx.Graphics.GAL/Multithreading/ThreadedWindow.cs b/src/Ryujinx.Graphics.GAL/Multithreading/ThreadedWindow.cs index 102fdb1bb..7a4836982 100644 --- a/src/Ryujinx.Graphics.GAL/Multithreading/ThreadedWindow.cs +++ b/src/Ryujinx.Graphics.GAL/Multithreading/ThreadedWindow.cs @@ -1,3 +1,4 @@ +using Ryujinx.Common.Configuration; using Ryujinx.Graphics.GAL.Multithreading.Commands.Window; using Ryujinx.Graphics.GAL.Multithreading.Model; using Ryujinx.Graphics.GAL.Multithreading.Resources; diff --git a/src/Ryujinx.Graphics.GAL/VSyncMode.cs b/src/Ryujinx.Graphics.GAL/VSyncMode.cs deleted file mode 100644 index c5794b8f7..000000000 --- a/src/Ryujinx.Graphics.GAL/VSyncMode.cs +++ /dev/null @@ -1,9 +0,0 @@ -namespace Ryujinx.Graphics.GAL -{ - public enum VSyncMode - { - Switch, - Unbounded, - Custom - } -} diff --git a/src/Ryujinx.Graphics.Metal/Window.cs b/src/Ryujinx.Graphics.Metal/Window.cs index 29099e7b1..203a29ebc 100644 --- a/src/Ryujinx.Graphics.Metal/Window.cs +++ b/src/Ryujinx.Graphics.Metal/Window.cs @@ -1,3 +1,4 @@ +using Ryujinx.Common.Configuration; using Ryujinx.Common.Logging; using Ryujinx.Graphics.GAL; using Ryujinx.Graphics.Metal.Effects; @@ -6,6 +7,8 @@ using SharpMetal.ObjectiveCCore; using SharpMetal.QuartzCore; using System; using System.Runtime.Versioning; +using AntiAliasing = Ryujinx.Graphics.GAL.AntiAliasing; +using ScalingFilter = Ryujinx.Graphics.GAL.ScalingFilter; namespace Ryujinx.Graphics.Metal { diff --git a/src/Ryujinx.Graphics.OpenGL/Window.cs b/src/Ryujinx.Graphics.OpenGL/Window.cs index 1dc8a51f6..8c35663ab 100644 --- a/src/Ryujinx.Graphics.OpenGL/Window.cs +++ b/src/Ryujinx.Graphics.OpenGL/Window.cs @@ -1,9 +1,12 @@ using OpenTK.Graphics.OpenGL; +using Ryujinx.Common.Configuration; using Ryujinx.Graphics.GAL; using Ryujinx.Graphics.OpenGL.Effects; using Ryujinx.Graphics.OpenGL.Effects.Smaa; using Ryujinx.Graphics.OpenGL.Image; using System; +using AntiAliasing = Ryujinx.Graphics.GAL.AntiAliasing; +using ScalingFilter = Ryujinx.Graphics.GAL.ScalingFilter; namespace Ryujinx.Graphics.OpenGL { diff --git a/src/Ryujinx.Graphics.Vulkan/Window.cs b/src/Ryujinx.Graphics.Vulkan/Window.cs index 3e8d3b375..d135d0076 100644 --- a/src/Ryujinx.Graphics.Vulkan/Window.cs +++ b/src/Ryujinx.Graphics.Vulkan/Window.cs @@ -1,9 +1,12 @@ +using Ryujinx.Common.Configuration; using Ryujinx.Graphics.GAL; using Ryujinx.Graphics.Vulkan.Effects; using Silk.NET.Vulkan; using Silk.NET.Vulkan.Extensions.KHR; using System; using System.Linq; +using AntiAliasing = Ryujinx.Graphics.GAL.AntiAliasing; +using ScalingFilter = Ryujinx.Graphics.GAL.ScalingFilter; using VkFormat = Silk.NET.Vulkan.Format; namespace Ryujinx.Graphics.Vulkan diff --git a/src/Ryujinx.Graphics.Vulkan/WindowBase.cs b/src/Ryujinx.Graphics.Vulkan/WindowBase.cs index ca06ec0b8..807bb65e5 100644 --- a/src/Ryujinx.Graphics.Vulkan/WindowBase.cs +++ b/src/Ryujinx.Graphics.Vulkan/WindowBase.cs @@ -1,5 +1,8 @@ +using Ryujinx.Common.Configuration; using Ryujinx.Graphics.GAL; using System; +using AntiAliasing = Ryujinx.Graphics.GAL.AntiAliasing; +using ScalingFilter = Ryujinx.Graphics.GAL.ScalingFilter; namespace Ryujinx.Graphics.Vulkan { diff --git a/src/Ryujinx.HLE/HLEConfiguration.cs b/src/Ryujinx.HLE/HLEConfiguration.cs index f75ead588..52c2b3da4 100644 --- a/src/Ryujinx.HLE/HLEConfiguration.cs +++ b/src/Ryujinx.HLE/HLEConfiguration.cs @@ -9,7 +9,6 @@ using Ryujinx.HLE.HOS.Services.Account.Acc; using Ryujinx.HLE.HOS.SystemState; using Ryujinx.HLE.UI; using System; -using VSyncMode = Ryujinx.Common.Configuration.VSyncMode; namespace Ryujinx.HLE { diff --git a/src/Ryujinx.HLE/HOS/Services/SurfaceFlinger/SurfaceFlinger.cs b/src/Ryujinx.HLE/HOS/Services/SurfaceFlinger/SurfaceFlinger.cs index 23bf8bcfc..935e9895e 100644 --- a/src/Ryujinx.HLE/HOS/Services/SurfaceFlinger/SurfaceFlinger.cs +++ b/src/Ryujinx.HLE/HOS/Services/SurfaceFlinger/SurfaceFlinger.cs @@ -10,7 +10,6 @@ using System.Collections.Generic; using System.Diagnostics; using System.Linq; using System.Threading; -using VSyncMode = Ryujinx.Common.Configuration.VSyncMode; namespace Ryujinx.HLE.HOS.Services.SurfaceFlinger { From 1bc0159139cedcdcf2010d55adef97bad06f750f Mon Sep 17 00:00:00 2001 From: Evan Husted Date: Fri, 27 Dec 2024 00:41:50 -0600 Subject: [PATCH 20/60] Once again, I am stupid --- src/Ryujinx/AppHost.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Ryujinx/AppHost.cs b/src/Ryujinx/AppHost.cs index f976ecdf1..9a9c1d226 100644 --- a/src/Ryujinx/AppHost.cs +++ b/src/Ryujinx/AppHost.cs @@ -311,7 +311,7 @@ namespace Ryujinx.Ava Device.VSyncMode = e.NewValue; Device.UpdateVSyncInterval(); } - _renderer.Window?.ChangeVSyncMode((Ryujinx.Graphics.GAL.VSyncMode)e.NewValue); + _renderer.Window?.ChangeVSyncMode(e.NewValue); _viewModel.ShowCustomVSyncIntervalPicker = (e.NewValue == VSyncMode.Custom); } @@ -1074,7 +1074,7 @@ namespace Ryujinx.Ava Device.Gpu.SetGpuThread(); Device.Gpu.InitializeShaderCache(_gpuCancellationTokenSource.Token); - _renderer.Window.ChangeVSyncMode((Ryujinx.Graphics.GAL.VSyncMode)Device.VSyncMode); + _renderer.Window.ChangeVSyncMode(Device.VSyncMode); while (_isActive) { From c69881a0a22104986a7141f40f8c4dd0e2963f09 Mon Sep 17 00:00:00 2001 From: Evan Husted Date: Fri, 27 Dec 2024 00:47:57 -0600 Subject: [PATCH 21/60] UI: chore: remove direct static MainWindowViewModel reference --- src/Ryujinx/UI/Models/SaveModel.cs | 3 ++- src/Ryujinx/UI/ViewModels/SettingsViewModel.cs | 2 +- src/Ryujinx/UI/Windows/MainWindow.axaml.cs | 4 +--- 3 files changed, 4 insertions(+), 5 deletions(-) diff --git a/src/Ryujinx/UI/Models/SaveModel.cs b/src/Ryujinx/UI/Models/SaveModel.cs index cfc397c6e..578538d21 100644 --- a/src/Ryujinx/UI/Models/SaveModel.cs +++ b/src/Ryujinx/UI/Models/SaveModel.cs @@ -1,3 +1,4 @@ +using Gommon; using LibHac.Fs; using LibHac.Ncm; using Ryujinx.Ava.UI.ViewModels; @@ -47,7 +48,7 @@ namespace Ryujinx.Ava.UI.Models TitleId = info.ProgramId; UserId = info.UserId; - var appData = MainWindow.MainWindowViewModel.Applications.FirstOrDefault(x => x.IdString.Equals(TitleIdString, StringComparison.OrdinalIgnoreCase)); + var appData = RyujinxApp.MainWindow.ViewModel.Applications.FirstOrDefault(x => x.IdString.EqualsIgnoreCase(TitleIdString)); InGameList = appData != null; diff --git a/src/Ryujinx/UI/ViewModels/SettingsViewModel.cs b/src/Ryujinx/UI/ViewModels/SettingsViewModel.cs index 7504147b2..9feaaba9b 100644 --- a/src/Ryujinx/UI/ViewModels/SettingsViewModel.cs +++ b/src/Ryujinx/UI/ViewModels/SettingsViewModel.cs @@ -750,7 +750,7 @@ namespace Ryujinx.Ava.UI.ViewModels config.ToFileFormat().SaveConfig(Program.ConfigurationPath); MainWindow.UpdateGraphicsConfig(); - MainWindow.MainWindowViewModel.VSyncModeSettingChanged(); + RyujinxApp.MainWindow.ViewModel.VSyncModeSettingChanged(); SaveSettingsEvent?.Invoke(); diff --git a/src/Ryujinx/UI/Windows/MainWindow.axaml.cs b/src/Ryujinx/UI/Windows/MainWindow.axaml.cs index 660caa605..ca91b180f 100644 --- a/src/Ryujinx/UI/Windows/MainWindow.axaml.cs +++ b/src/Ryujinx/UI/Windows/MainWindow.axaml.cs @@ -39,8 +39,6 @@ namespace Ryujinx.Ava.UI.Windows { public partial class MainWindow : StyleableAppWindow { - internal static MainWindowViewModel MainWindowViewModel { get; private set; } - public MainWindowViewModel ViewModel { get; } internal readonly AvaHostUIHandler UiHandler; @@ -76,7 +74,7 @@ namespace Ryujinx.Ava.UI.Windows public MainWindow() { - DataContext = ViewModel = MainWindowViewModel = new MainWindowViewModel + DataContext = ViewModel = new MainWindowViewModel { Window = this }; From d3bc3a1081863d07fc8d4bdc48e6b69fafa5e41c Mon Sep 17 00:00:00 2001 From: Evan Husted Date: Fri, 27 Dec 2024 01:32:23 -0600 Subject: [PATCH 22/60] UI: Simplify LDN data logic --- src/Ryujinx.UI.Common/App/ApplicationData.cs | 2 ++ .../App/ApplicationLibrary.cs | 9 ++++--- src/Ryujinx.UI.Common/App/LdnGameDataList.cs | 24 +++++++++++++++++++ .../UI/ViewModels/MainWindowViewModel.cs | 6 +++-- src/Ryujinx/UI/Windows/MainWindow.axaml.cs | 18 ++++++++------ 5 files changed, 45 insertions(+), 14 deletions(-) create mode 100644 src/Ryujinx.UI.Common/App/LdnGameDataList.cs diff --git a/src/Ryujinx.UI.Common/App/ApplicationData.cs b/src/Ryujinx.UI.Common/App/ApplicationData.cs index 657b9a022..ee5545dde 100644 --- a/src/Ryujinx.UI.Common/App/ApplicationData.cs +++ b/src/Ryujinx.UI.Common/App/ApplicationData.cs @@ -36,6 +36,8 @@ namespace Ryujinx.UI.App.Common public string Path { get; set; } public BlitStruct ControlHolder { get; set; } + public bool HasControlHolder => ControlHolder.ByteSpan.Length > 0; + public string TimePlayedString => ValueFormatUtils.FormatTimeSpan(TimePlayed); public string LastPlayedString => ValueFormatUtils.FormatDateTime(LastPlayed)?.Replace(" ", "\n") ?? LocalizedNever(); diff --git a/src/Ryujinx.UI.Common/App/ApplicationLibrary.cs b/src/Ryujinx.UI.Common/App/ApplicationLibrary.cs index cb6467f5e..e78af3121 100644 --- a/src/Ryujinx.UI.Common/App/ApplicationLibrary.cs +++ b/src/Ryujinx.UI.Common/App/ApplicationLibrary.cs @@ -789,16 +789,15 @@ namespace Ryujinx.UI.App.Common using HttpClient httpClient = new HttpClient(); string ldnGameDataArrayString = await httpClient.GetStringAsync($"https://{ldnWebHost}/api/public_games"); ldnGameDataArray = JsonHelper.Deserialize(ldnGameDataArrayString, _ldnDataSerializerContext.IEnumerableLdnGameData); - var evt = new LdnGameDataReceivedEventArgs + LdnGameDataReceived?.Invoke(null, new LdnGameDataReceivedEventArgs { LdnData = ldnGameDataArray - }; - LdnGameDataReceived?.Invoke(null, evt); + }); } catch (Exception ex) { Logger.Warning?.Print(LogClass.Application, $"Failed to fetch the public games JSON from the API. Player and game count in the game list will be unavailable.\n{ex.Message}"); - LdnGameDataReceived?.Invoke(null, new LdnGameDataReceivedEventArgs() + LdnGameDataReceived?.Invoke(null, new LdnGameDataReceivedEventArgs { LdnData = Array.Empty() }); @@ -806,7 +805,7 @@ namespace Ryujinx.UI.App.Common } else { - LdnGameDataReceived?.Invoke(null, new LdnGameDataReceivedEventArgs() + LdnGameDataReceived?.Invoke(null, new LdnGameDataReceivedEventArgs { LdnData = Array.Empty() }); diff --git a/src/Ryujinx.UI.Common/App/LdnGameDataList.cs b/src/Ryujinx.UI.Common/App/LdnGameDataList.cs new file mode 100644 index 000000000..d98fd081d --- /dev/null +++ b/src/Ryujinx.UI.Common/App/LdnGameDataList.cs @@ -0,0 +1,24 @@ +using LibHac.Ns; +using System; +using System.Collections.Generic; +using System.Linq; + +namespace Ryujinx.UI.App.Common +{ + public class LdnGameDataArray + { + private readonly LdnGameData[] _ldnDatas; + + public LdnGameDataArray(IEnumerable receivedData, ref ApplicationControlProperty acp) + { + LibHac.Common.FixedArrays.Array8 communicationId = acp.LocalCommunicationId; + + _ldnDatas = receivedData.Where(game => + communicationId.Items.Contains(Convert.ToUInt64(game.TitleId, 16)) + ).ToArray(); + } + + public int PlayerCount => _ldnDatas.Sum(it => it.PlayerCount); + public int GameCount => _ldnDatas.Length; + } +} diff --git a/src/Ryujinx/UI/ViewModels/MainWindowViewModel.cs b/src/Ryujinx/UI/ViewModels/MainWindowViewModel.cs index d0ea64c37..3b98a7aa3 100644 --- a/src/Ryujinx/UI/ViewModels/MainWindowViewModel.cs +++ b/src/Ryujinx/UI/ViewModels/MainWindowViewModel.cs @@ -9,6 +9,7 @@ using Avalonia.Threading; using DynamicData; using DynamicData.Binding; using FluentAvalonia.UI.Controls; +using Gommon; using LibHac.Common; using LibHac.Ns; using Ryujinx.Ava.Common; @@ -119,8 +120,9 @@ namespace Ryujinx.Ava.UI.ViewModels public ApplicationData ListSelectedApplication; public ApplicationData GridSelectedApplication; - - public IEnumerable LastLdnGameData; + + // Key is Title ID + public SafeDictionary LdnData = []; // The UI specifically uses a thicker bordered variant of the icon to avoid crunching out the border at lower resolutions. // For an example of this, download canary 1.2.95, then open the settings menu, and look at the icon in the top-left. diff --git a/src/Ryujinx/UI/Windows/MainWindow.axaml.cs b/src/Ryujinx/UI/Windows/MainWindow.axaml.cs index ca91b180f..832674541 100644 --- a/src/Ryujinx/UI/Windows/MainWindow.axaml.cs +++ b/src/Ryujinx/UI/Windows/MainWindow.axaml.cs @@ -167,24 +167,28 @@ namespace Ryujinx.Ava.UI.Windows { Dispatcher.UIThread.Post(() => { - var ldnGameDataArray = e.LdnData; - ViewModel.LastLdnGameData = ldnGameDataArray; + var ldnGameDataArray = e.LdnData.ToList(); + ViewModel.LdnData.Clear(); foreach (var application in ViewModel.Applications) { + ViewModel.LdnData[application.IdString] = new LdnGameDataArray( + ldnGameDataArray, + ref application.ControlHolder.Value + ); + UpdateApplicationWithLdnData(application); } + ViewModel.RefreshView(); }); } private void UpdateApplicationWithLdnData(ApplicationData application) { - if (application.ControlHolder.ByteSpan.Length > 0 && ViewModel.LastLdnGameData != null) + if (application.HasControlHolder && ViewModel.LdnData.TryGetValue(application.IdString, out var ldnGameDatas)) { - IEnumerable ldnGameData = ViewModel.LastLdnGameData.Where(game => application.ControlHolder.Value.LocalCommunicationId.Items.Contains(Convert.ToUInt64(game.TitleId, 16))); - - application.PlayerCount = ldnGameData.Sum(game => game.PlayerCount); - application.GameCount = ldnGameData.Count(); + application.PlayerCount = ldnGameDatas.PlayerCount; + application.GameCount = ldnGameDatas.GameCount; } else { From 4c646721d6b57d462186f96de69b88de5f9f314e Mon Sep 17 00:00:00 2001 From: Evan Husted Date: Fri, 27 Dec 2024 01:38:51 -0600 Subject: [PATCH 23/60] infra: Testing moving canary to the future home of this fork --- .github/workflows/canary.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/canary.yml b/.github/workflows/canary.yml index 3100671e9..cc57e7d5b 100644 --- a/.github/workflows/canary.yml +++ b/.github/workflows/canary.yml @@ -21,7 +21,7 @@ env: DOTNET_CLI_TELEMETRY_OPTOUT: 1 RYUJINX_BASE_VERSION: "1.2" RYUJINX_TARGET_RELEASE_CHANNEL_NAME: "canary" - RYUJINX_TARGET_RELEASE_CHANNEL_OWNER: "GreemDev" + RYUJINX_TARGET_RELEASE_CHANNEL_OWNER: "Hydra-NX" RYUJINX_TARGET_RELEASE_CHANNEL_SOURCE_REPO: "Ryujinx" RYUJINX_TARGET_RELEASE_CHANNEL_REPO: "Ryujinx-Canary" RELEASE: 1 From 01c2e67334fc84ebc781c9413aa7f3f7a5203555 Mon Sep 17 00:00:00 2001 From: Evan Husted Date: Fri, 27 Dec 2024 01:41:48 -0600 Subject: [PATCH 24/60] lol --- .github/workflows/canary.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/canary.yml b/.github/workflows/canary.yml index cc57e7d5b..03247ff6d 100644 --- a/.github/workflows/canary.yml +++ b/.github/workflows/canary.yml @@ -23,7 +23,7 @@ env: RYUJINX_TARGET_RELEASE_CHANNEL_NAME: "canary" RYUJINX_TARGET_RELEASE_CHANNEL_OWNER: "Hydra-NX" RYUJINX_TARGET_RELEASE_CHANNEL_SOURCE_REPO: "Ryujinx" - RYUJINX_TARGET_RELEASE_CHANNEL_REPO: "Ryujinx-Canary" + RYUJINX_TARGET_RELEASE_CHANNEL_REPO: "Canary-Releases" RELEASE: 1 jobs: From ccddaa77d1dd422dd8f09dc8f89ab5e4704f8b30 Mon Sep 17 00:00:00 2001 From: Evan Husted Date: Fri, 27 Dec 2024 01:59:29 -0600 Subject: [PATCH 25/60] infra: Org --- .github/workflows/release.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 59c31c71b..825a23ae6 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -21,7 +21,7 @@ env: DOTNET_CLI_TELEMETRY_OPTOUT: 1 RYUJINX_BASE_VERSION: "1.2" RYUJINX_TARGET_RELEASE_CHANNEL_NAME: "release" - RYUJINX_TARGET_RELEASE_CHANNEL_OWNER: "GreemDev" + RYUJINX_TARGET_RELEASE_CHANNEL_OWNER: "Hydra-NX" RYUJINX_TARGET_RELEASE_CHANNEL_REPO: "Ryujinx" RELEASE: 1 From 9eb273a0f754ac50de1485e3d5782652993af647 Mon Sep 17 00:00:00 2001 From: Evan Husted Date: Fri, 27 Dec 2024 02:05:37 -0600 Subject: [PATCH 26/60] Org rename (they call me indecisive) --- .github/workflows/canary.yml | 2 +- .github/workflows/release.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/canary.yml b/.github/workflows/canary.yml index 03247ff6d..ffbf1ebf7 100644 --- a/.github/workflows/canary.yml +++ b/.github/workflows/canary.yml @@ -21,7 +21,7 @@ env: DOTNET_CLI_TELEMETRY_OPTOUT: 1 RYUJINX_BASE_VERSION: "1.2" RYUJINX_TARGET_RELEASE_CHANNEL_NAME: "canary" - RYUJINX_TARGET_RELEASE_CHANNEL_OWNER: "Hydra-NX" + RYUJINX_TARGET_RELEASE_CHANNEL_OWNER: "Ryubing" RYUJINX_TARGET_RELEASE_CHANNEL_SOURCE_REPO: "Ryujinx" RYUJINX_TARGET_RELEASE_CHANNEL_REPO: "Canary-Releases" RELEASE: 1 diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 825a23ae6..066b978c5 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -21,7 +21,7 @@ env: DOTNET_CLI_TELEMETRY_OPTOUT: 1 RYUJINX_BASE_VERSION: "1.2" RYUJINX_TARGET_RELEASE_CHANNEL_NAME: "release" - RYUJINX_TARGET_RELEASE_CHANNEL_OWNER: "Hydra-NX" + RYUJINX_TARGET_RELEASE_CHANNEL_OWNER: "Ryubing" RYUJINX_TARGET_RELEASE_CHANNEL_REPO: "Ryujinx" RELEASE: 1 From 07074272ca327cb3ae1c2d34c0d5bbef290e6d26 Mon Sep 17 00:00:00 2001 From: Evan Husted Date: Fri, 27 Dec 2024 15:24:57 -0600 Subject: [PATCH 27/60] Revert "UI: Directly proxy window properties on the view model back to the stored window" This reverts commit 9754d247b59a064f9888423ef6c227c6f209e784. --- src/Ryujinx/RyujinxApp.axaml.cs | 7 ++- .../UI/ViewModels/MainWindowViewModel.cs | 45 ++++++++++++++----- src/Ryujinx/UI/Windows/MainWindow.axaml | 5 +++ 3 files changed, 43 insertions(+), 14 deletions(-) diff --git a/src/Ryujinx/RyujinxApp.axaml.cs b/src/Ryujinx/RyujinxApp.axaml.cs index c2f92f2f7..bbef20aa0 100644 --- a/src/Ryujinx/RyujinxApp.axaml.cs +++ b/src/Ryujinx/RyujinxApp.axaml.cs @@ -33,8 +33,11 @@ namespace Ryujinx.Ava .ApplicationLifetime.Cast() .MainWindow.Cast(); - public static bool IsClipboardAvailable(out IClipboard clipboard) - => (clipboard = MainWindow.Clipboard) != null; + public static bool IsClipboardAvailable(out IClipboard clipboard) + { + clipboard = MainWindow.Clipboard; + return clipboard != null; + } public static void SetTaskbarProgress(TaskBarProgressBarState state) => MainWindow.PlatformFeatures.SetTaskBarProgressBarState(state); public static void SetTaskbarProgressValue(ulong current, ulong total) => MainWindow.PlatformFeatures.SetTaskBarProgressBarValue(current, total); diff --git a/src/Ryujinx/UI/ViewModels/MainWindowViewModel.cs b/src/Ryujinx/UI/ViewModels/MainWindowViewModel.cs index 3b98a7aa3..39799c117 100644 --- a/src/Ryujinx/UI/ViewModels/MainWindowViewModel.cs +++ b/src/Ryujinx/UI/ViewModels/MainWindowViewModel.cs @@ -110,8 +110,13 @@ namespace Ryujinx.Ava.UI.ViewModels private bool _areMimeTypesRegistered = FileAssociationHelper.AreMimeTypesRegistered; private bool _canUpdate = true; + private Cursor _cursor; + private string _title; private ApplicationData _currentApplicationData; private readonly AutoResetEvent _rendererWaitEvent; + private WindowState _windowState; + private double _windowWidth; + private double _windowHeight; private int _customVSyncInterval; private int _customVSyncIntervalPercentageProxy; @@ -213,7 +218,7 @@ namespace Ryujinx.Ava.UI.ViewModels public bool CanUpdate { - get => _canUpdate && EnableNonGameRunningControls && Updater.CanUpdate(); + get => _canUpdate && EnableNonGameRunningControls && Updater.CanUpdate(false); set { _canUpdate = value; @@ -223,8 +228,12 @@ namespace Ryujinx.Ava.UI.ViewModels public Cursor Cursor { - get => Window.Cursor; - set => Window.Cursor = value; + get => _cursor; + set + { + _cursor = value; + OnPropertyChanged(); + } } public ReadOnlyObservableCollection AppsObservableList @@ -806,23 +815,35 @@ namespace Ryujinx.Ava.UI.ViewModels public WindowState WindowState { - get => Window.WindowState; + get => _windowState; internal set { - Window.WindowState = value; + _windowState = value; + + OnPropertyChanged(); } } public double WindowWidth { - get => Window.Width; - set => Window.Width = value; + get => _windowWidth; + set + { + _windowWidth = value; + + OnPropertyChanged(); + } } public double WindowHeight { - get => Window.Height; - set => Window.Height = value; + get => _windowHeight; + set + { + _windowHeight = value; + + OnPropertyChanged(); + } } public bool IsGrid => Glyph == Glyph.Grid; @@ -870,11 +891,11 @@ namespace Ryujinx.Ava.UI.ViewModels public string Title { - get => Window.Title; + get => _title; set { - Window.Title = value; - + _title = value; + OnPropertyChanged(); } } diff --git a/src/Ryujinx/UI/Windows/MainWindow.axaml b/src/Ryujinx/UI/Windows/MainWindow.axaml index e3b6cf912..cb2e5936d 100644 --- a/src/Ryujinx/UI/Windows/MainWindow.axaml +++ b/src/Ryujinx/UI/Windows/MainWindow.axaml @@ -9,6 +9,11 @@ xmlns:helpers="clr-namespace:Ryujinx.Ava.UI.Helpers" xmlns:controls="clr-namespace:Ryujinx.Ava.UI.Controls" xmlns:main="clr-namespace:Ryujinx.Ava.UI.Views.Main" + Cursor="{Binding Cursor}" + Title="{Binding Title}" + WindowState="{Binding WindowState}" + Width="{Binding WindowWidth}" + Height="{Binding WindowHeight}" MinWidth="800" MinHeight="500" d:DesignHeight="720" From 56e45ae64861b3d0b61b7e918e7c4c9aad94a0a5 Mon Sep 17 00:00:00 2001 From: Evan Husted Date: Fri, 27 Dec 2024 15:33:31 -0600 Subject: [PATCH 28/60] misc: Collapse LdnGameDataArray into the main class as an inner class - privated the constructor; only obtainable by the static helper on the main LdnGameData class. - constructor logic now in the static helper; constructor just directly sets the data it's given. --- src/Ryujinx.UI.Common/App/LdnGameData.cs | 26 +++++++++++++++++++ src/Ryujinx.UI.Common/App/LdnGameDataList.cs | 24 ----------------- .../UI/ViewModels/MainWindowViewModel.cs | 2 +- src/Ryujinx/UI/Windows/MainWindow.axaml.cs | 9 ++++--- 4 files changed, 33 insertions(+), 28 deletions(-) delete mode 100644 src/Ryujinx.UI.Common/App/LdnGameDataList.cs diff --git a/src/Ryujinx.UI.Common/App/LdnGameData.cs b/src/Ryujinx.UI.Common/App/LdnGameData.cs index 6c784c991..f7a98e136 100644 --- a/src/Ryujinx.UI.Common/App/LdnGameData.cs +++ b/src/Ryujinx.UI.Common/App/LdnGameData.cs @@ -1,4 +1,7 @@ +using LibHac.Ns; +using System; using System.Collections.Generic; +using System.Linq; namespace Ryujinx.UI.App.Common { @@ -12,5 +15,28 @@ namespace Ryujinx.UI.App.Common public string Mode { get; set; } public string Status { get; set; } public IEnumerable Players { get; set; } + + public static Array GetArrayForApp( + IEnumerable receivedData, ref ApplicationControlProperty acp) + { + LibHac.Common.FixedArrays.Array8 communicationId = acp.LocalCommunicationId; + + return new Array(receivedData.Where(game => + communicationId.Items.Contains(Convert.ToUInt64(game.TitleId, 16)) + )); + } + + public class Array + { + private readonly LdnGameData[] _ldnDatas; + + internal Array(IEnumerable receivedData) + { + _ldnDatas = receivedData.ToArray(); + } + + public int PlayerCount => _ldnDatas.Sum(it => it.PlayerCount); + public int GameCount => _ldnDatas.Length; + } } } diff --git a/src/Ryujinx.UI.Common/App/LdnGameDataList.cs b/src/Ryujinx.UI.Common/App/LdnGameDataList.cs deleted file mode 100644 index d98fd081d..000000000 --- a/src/Ryujinx.UI.Common/App/LdnGameDataList.cs +++ /dev/null @@ -1,24 +0,0 @@ -using LibHac.Ns; -using System; -using System.Collections.Generic; -using System.Linq; - -namespace Ryujinx.UI.App.Common -{ - public class LdnGameDataArray - { - private readonly LdnGameData[] _ldnDatas; - - public LdnGameDataArray(IEnumerable receivedData, ref ApplicationControlProperty acp) - { - LibHac.Common.FixedArrays.Array8 communicationId = acp.LocalCommunicationId; - - _ldnDatas = receivedData.Where(game => - communicationId.Items.Contains(Convert.ToUInt64(game.TitleId, 16)) - ).ToArray(); - } - - public int PlayerCount => _ldnDatas.Sum(it => it.PlayerCount); - public int GameCount => _ldnDatas.Length; - } -} diff --git a/src/Ryujinx/UI/ViewModels/MainWindowViewModel.cs b/src/Ryujinx/UI/ViewModels/MainWindowViewModel.cs index 39799c117..2f1800290 100644 --- a/src/Ryujinx/UI/ViewModels/MainWindowViewModel.cs +++ b/src/Ryujinx/UI/ViewModels/MainWindowViewModel.cs @@ -127,7 +127,7 @@ namespace Ryujinx.Ava.UI.ViewModels public ApplicationData GridSelectedApplication; // Key is Title ID - public SafeDictionary LdnData = []; + public SafeDictionary LdnData = []; // The UI specifically uses a thicker bordered variant of the icon to avoid crunching out the border at lower resolutions. // For an example of this, download canary 1.2.95, then open the settings menu, and look at the icon in the top-left. diff --git a/src/Ryujinx/UI/Windows/MainWindow.axaml.cs b/src/Ryujinx/UI/Windows/MainWindow.axaml.cs index 832674541..da4314e79 100644 --- a/src/Ryujinx/UI/Windows/MainWindow.axaml.cs +++ b/src/Ryujinx/UI/Windows/MainWindow.axaml.cs @@ -171,9 +171,12 @@ namespace Ryujinx.Ava.UI.Windows ViewModel.LdnData.Clear(); foreach (var application in ViewModel.Applications) { - ViewModel.LdnData[application.IdString] = new LdnGameDataArray( - ldnGameDataArray, - ref application.ControlHolder.Value + ref var controlHolder = ref application.ControlHolder.Value; + + ViewModel.LdnData[application.IdString] = + LdnGameData.GetArrayForApp( + ldnGameDataArray, + ref controlHolder ); UpdateApplicationWithLdnData(application); From 1faa72f22f687cf33b77f7a30ff580e83ea2bfdc Mon Sep 17 00:00:00 2001 From: Evan Husted Date: Fri, 27 Dec 2024 15:44:20 -0600 Subject: [PATCH 29/60] infra: fix big tables in releases --- .github/workflows/canary.yml | 16 ++++++++-------- .github/workflows/release.yml | 24 ++++++++++++------------ 2 files changed, 20 insertions(+), 20 deletions(-) diff --git a/.github/workflows/canary.yml b/.github/workflows/canary.yml index ffbf1ebf7..0172e1fe6 100644 --- a/.github/workflows/canary.yml +++ b/.github/workflows/canary.yml @@ -64,7 +64,7 @@ jobs: | Windows 64-bit | [Canary Windows Artifact](https://github.com/${{ env.RYUJINX_TARGET_RELEASE_CHANNEL_OWNER }}/${{ env.RYUJINX_TARGET_RELEASE_CHANNEL_REPO }}/releases/download/${{ steps.version_info.outputs.build_version }}/ryujinx-canary-${{ steps.version_info.outputs.build_version }}-win_x64.zip) | | Linux 64-bit | [Canary Linux Artifact](https://github.com/${{ env.RYUJINX_TARGET_RELEASE_CHANNEL_OWNER }}/${{ env.RYUJINX_TARGET_RELEASE_CHANNEL_REPO }}/releases/download/${{ steps.version_info.outputs.build_version }}/ryujinx-canary-${{ steps.version_info.outputs.build_version }}-linux_x64.tar.gz) | | Linux ARM 64-bit | [Canary Linux ARM Artifact](https://github.com/${{ env.RYUJINX_TARGET_RELEASE_CHANNEL_OWNER }}/${{ env.RYUJINX_TARGET_RELEASE_CHANNEL_REPO }}/releases/download/${{ steps.version_info.outputs.build_version }}/ryujinx-canary-${{ steps.version_info.outputs.build_version }}-linux_arm64.tar.gz) | - | macOS | [Canary macOS artifact](https://github.com/${{ env.RYUJINX_TARGET_RELEASE_CHANNEL_OWNER }}/${{ env.RYUJINX_TARGET_RELEASE_CHANNEL_REPO }}/releases/download/${{ steps.version_info.outputs.build_version }}/ryujinx-canary-${{ steps.version_info.outputs.build_version }}-macos_universal.app.tar.gz) | + | macOS | [Canary macOS Artifact](https://github.com/${{ env.RYUJINX_TARGET_RELEASE_CHANNEL_OWNER }}/${{ env.RYUJINX_TARGET_RELEASE_CHANNEL_REPO }}/releases/download/${{ steps.version_info.outputs.build_version }}/ryujinx-canary-${{ steps.version_info.outputs.build_version }}-macos_universal.app.tar.gz) | **Full Changelog**: https://github.com/${{ env.RYUJINX_TARGET_RELEASE_CHANNEL_OWNER }}/${{ env.RYUJINX_TARGET_RELEASE_CHANNEL_SOURCE_REPO }}/compare/Canary-${{ steps.version_info.outputs.prev_build_version }}...Canary-${{ steps.version_info.outputs.build_version }} omitBodyDuringUpdate: true @@ -196,16 +196,16 @@ jobs: body: | # Canary builds: - These builds are experimental and may sometimes not work, use [regular builds](https://github.com/GreemDev/Ryujinx/releases/latest) instead if that sounds like something you don't want to deal with. - + These builds are experimental and may sometimes not work, use [regular builds](https://github.com/${{ github.repository }}/releases/latest) instead if that sounds like something you don't want to deal with. + | Platform | Artifact | |--|--| - | Windows 64-bit | https://github.com/${{ github.repository }}/releases/download/${{ steps.version_info.outputs.build_version }}/ryujinx-canary-${{ steps.version_info.outputs.build_version }}-win_x64.zip | - | Linux 64-bit | https://github.com/${{ github.repository }}/releases/download/${{ steps.version_info.outputs.build_version }}/ryujinx-canary-${{ steps.version_info.outputs.build_version }}-linux_x64.tar.gz | - | Linux ARM 64-bit | https://github.com/${{ github.repository }}/releases/download/${{ steps.version_info.outputs.build_version }}/ryujinx-canary-${{ steps.version_info.outputs.build_version }}-linux_arm64.tar.gz | - | macOS | https://github.com/${{ github.repository }}/releases/download/${{ steps.version_info.outputs.build_version }}/ryujinx-canary-${{ steps.version_info.outputs.build_version }}-macos_universal.app.tar.gz | + | Windows 64-bit | [Canary Windows Artifact](https://github.com/${{ env.RYUJINX_TARGET_RELEASE_CHANNEL_OWNER }}/${{ env.RYUJINX_TARGET_RELEASE_CHANNEL_REPO }}/releases/download/${{ steps.version_info.outputs.build_version }}/ryujinx-canary-${{ steps.version_info.outputs.build_version }}-win_x64.zip) | + | Linux 64-bit | [Canary Linux Artifact](https://github.com/${{ env.RYUJINX_TARGET_RELEASE_CHANNEL_OWNER }}/${{ env.RYUJINX_TARGET_RELEASE_CHANNEL_REPO }}/releases/download/${{ steps.version_info.outputs.build_version }}/ryujinx-canary-${{ steps.version_info.outputs.build_version }}-linux_x64.tar.gz) | + | Linux ARM 64-bit | [Canary Linux ARM Artifact](https://github.com/${{ env.RYUJINX_TARGET_RELEASE_CHANNEL_OWNER }}/${{ env.RYUJINX_TARGET_RELEASE_CHANNEL_REPO }}/releases/download/${{ steps.version_info.outputs.build_version }}/ryujinx-canary-${{ steps.version_info.outputs.build_version }}-linux_arm64.tar.gz) | + | macOS | [Canary macOS Artifact](https://github.com/${{ env.RYUJINX_TARGET_RELEASE_CHANNEL_OWNER }}/${{ env.RYUJINX_TARGET_RELEASE_CHANNEL_REPO }}/releases/download/${{ steps.version_info.outputs.build_version }}/ryujinx-canary-${{ steps.version_info.outputs.build_version }}-macos_universal.app.tar.gz) | - "**Full Changelog**: https://github.com/${{ env.RYUJINX_TARGET_RELEASE_CHANNEL_OWNER }}/${{ env.RYUJINX_TARGET_RELEASE_CHANNEL_SOURCE_REPO }}/compare/Canary-${{ steps.version_info.outputs.prev_build_version }}...Canary-${{ steps.version_info.outputs.build_version }}" + **Full Changelog**: https://github.com/${{ env.RYUJINX_TARGET_RELEASE_CHANNEL_OWNER }}/${{ env.RYUJINX_TARGET_RELEASE_CHANNEL_SOURCE_REPO }}/compare/Canary-${{ steps.version_info.outputs.prev_build_version }}...Canary-${{ steps.version_info.outputs.build_version }} omitBodyDuringUpdate: true allowUpdates: true replacesArtifacts: true diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 066b978c5..9086a7ff6 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -54,13 +54,13 @@ jobs: name: ${{ steps.version_info.outputs.build_version }} tag: ${{ steps.version_info.outputs.build_version }} body: | - # Regular builds: + # Stable builds: | Platform | Artifact | |--|--| - | Windows 64-bit | [Release Windows Artifact](https://github.com/${{ env.RYUJINX_TARGET_RELEASE_CHANNEL_OWNER }}/${{ env.RYUJINX_TARGET_RELEASE_CHANNEL_REPO }}/releases/download/${{ steps.version_info.outputs.build_version }}/ryujinx-${{ steps.version_info.outputs.build_version }}-win_x64.zip) | - | Linux 64-bit | [Release Linux Artifact](https://github.com/${{ env.RYUJINX_TARGET_RELEASE_CHANNEL_OWNER }}/${{ env.RYUJINX_TARGET_RELEASE_CHANNEL_REPO }}/releases/download/${{ steps.version_info.outputs.build_version }}/ryujinx-${{ steps.version_info.outputs.build_version }}-linux_x64.tar.gz) | - | Linux ARM 64-bit | [Release Linux ARM Artifact](https://github.com/${{ env.RYUJINX_TARGET_RELEASE_CHANNEL_OWNER }}/${{ env.RYUJINX_TARGET_RELEASE_CHANNEL_REPO }}/releases/download/${{ steps.version_info.outputs.build_version }}/ryujinx-${{ steps.version_info.outputs.build_version }}-linux_arm64.tar.gz) | - | macOS | [Release macOS Artifact](https://github.com/${{ env.RYUJINX_TARGET_RELEASE_CHANNEL_OWNER }}/${{ env.RYUJINX_TARGET_RELEASE_CHANNEL_REPO }}/releases/download/${{ steps.version_info.outputs.build_version }}/ryujinx-${{ steps.version_info.outputs.build_version }}-macos_universal.app.tar.gz) | + | Windows 64-bit | [Stable Windows Artifact](https://github.com/${{ env.RYUJINX_TARGET_RELEASE_CHANNEL_OWNER }}/${{ env.RYUJINX_TARGET_RELEASE_CHANNEL_REPO }}/releases/download/${{ steps.version_info.outputs.build_version }}/ryujinx-${{ steps.version_info.outputs.build_version }}-win_x64.zip) | + | Linux 64-bit | [Stable Linux Artifact](https://github.com/${{ env.RYUJINX_TARGET_RELEASE_CHANNEL_OWNER }}/${{ env.RYUJINX_TARGET_RELEASE_CHANNEL_REPO }}/releases/download/${{ steps.version_info.outputs.build_version }}/ryujinx-${{ steps.version_info.outputs.build_version }}-linux_x64.tar.gz) | + | Linux ARM 64-bit | [Stable Linux ARM Artifact](https://github.com/${{ env.RYUJINX_TARGET_RELEASE_CHANNEL_OWNER }}/${{ env.RYUJINX_TARGET_RELEASE_CHANNEL_REPO }}/releases/download/${{ steps.version_info.outputs.build_version }}/ryujinx-${{ steps.version_info.outputs.build_version }}-linux_arm64.tar.gz) | + | macOS | [Stable macOS Artifact](https://github.com/${{ env.RYUJINX_TARGET_RELEASE_CHANNEL_OWNER }}/${{ env.RYUJINX_TARGET_RELEASE_CHANNEL_REPO }}/releases/download/${{ steps.version_info.outputs.build_version }}/ryujinx-${{ steps.version_info.outputs.build_version }}-macos_universal.app.tar.gz) | **Full Changelog**: https://github.com/${{ env.RYUJINX_TARGET_RELEASE_CHANNEL_OWNER }}/${{ env.RYUJINX_TARGET_RELEASE_CHANNEL_REPO }}/compare/${{ steps.version_info.outputs.prev_build_version }}...${{ steps.version_info.outputs.build_version }} omitBodyDuringUpdate: true @@ -186,15 +186,15 @@ jobs: artifacts: "release_output/*.tar.gz,release_output/*.zip,release_output/*AppImage*" tag: ${{ steps.version_info.outputs.build_version }} body: | - # Regular builds: + # Stable builds: | Platform | Artifact | |--|--| - | Windows 64-bit | https://github.com/${{ github.repository }}/releases/download/${{ steps.version_info.outputs.build_version }}/ryujinx-${{ steps.version_info.outputs.build_version }}-win_x64.zip | - | Linux 64-bit | https://github.com/${{ github.repository }}/releases/download/${{ steps.version_info.outputs.build_version }}/ryujinx-${{ steps.version_info.outputs.build_version }}-linux_x64.tar.gz | - | Linux ARM 64-bit | https://github.com/${{ github.repository }}/releases/download/${{ steps.version_info.outputs.build_version }}/ryujinx-${{ steps.version_info.outputs.build_version }}-linux_arm64.tar.gz | - | macOS | https://github.com/${{ github.repository }}/releases/download/${{ steps.version_info.outputs.build_version }}/ryujinx-${{ steps.version_info.outputs.build_version }}-macos_universal.app.tar.gz | - - "**Full Changelog**: https://github.com/${{ github.repository }}/compare/${{ steps.version_info.outputs.prev_build_version }}...${{ steps.version_info.outputs.build_version }}" + | Windows 64-bit | [Stable Windows Artifact](https://github.com/${{ env.RYUJINX_TARGET_RELEASE_CHANNEL_OWNER }}/${{ env.RYUJINX_TARGET_RELEASE_CHANNEL_REPO }}/releases/download/${{ steps.version_info.outputs.build_version }}/ryujinx-${{ steps.version_info.outputs.build_version }}-win_x64.zip) | + | Linux 64-bit | [Stable Linux Artifact](https://github.com/${{ env.RYUJINX_TARGET_RELEASE_CHANNEL_OWNER }}/${{ env.RYUJINX_TARGET_RELEASE_CHANNEL_REPO }}/releases/download/${{ steps.version_info.outputs.build_version }}/ryujinx-${{ steps.version_info.outputs.build_version }}-linux_x64.tar.gz) | + | Linux ARM 64-bit | [Stable Linux ARM Artifact](https://github.com/${{ env.RYUJINX_TARGET_RELEASE_CHANNEL_OWNER }}/${{ env.RYUJINX_TARGET_RELEASE_CHANNEL_REPO }}/releases/download/${{ steps.version_info.outputs.build_version }}/ryujinx-${{ steps.version_info.outputs.build_version }}-linux_arm64.tar.gz) | + | macOS | [Stable macOS Artifact](https://github.com/${{ env.RYUJINX_TARGET_RELEASE_CHANNEL_OWNER }}/${{ env.RYUJINX_TARGET_RELEASE_CHANNEL_REPO }}/releases/download/${{ steps.version_info.outputs.build_version }}/ryujinx-${{ steps.version_info.outputs.build_version }}-macos_universal.app.tar.gz) | + + **Full Changelog**: https://github.com/${{ env.RYUJINX_TARGET_RELEASE_CHANNEL_OWNER }}/${{ env.RYUJINX_TARGET_RELEASE_CHANNEL_REPO }}/compare/${{ steps.version_info.outputs.prev_build_version }}...${{ steps.version_info.outputs.build_version }} omitBodyDuringUpdate: true allowUpdates: true replacesArtifacts: true From 38833ff60a2b9bd0d90b096a333423488af9a8a3 Mon Sep 17 00:00:00 2001 From: Evan Husted Date: Fri, 27 Dec 2024 16:07:23 -0600 Subject: [PATCH 30/60] i dont know why this is failing this is stupid --- .github/workflows/canary.yml | 4 ++-- .github/workflows/release.yml | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/workflows/canary.yml b/.github/workflows/canary.yml index 0172e1fe6..57b2958c7 100644 --- a/.github/workflows/canary.yml +++ b/.github/workflows/canary.yml @@ -43,8 +43,8 @@ jobs: with: script: | github.rest.git.createRef({ - owner: context.repo.owner, - repo: context.repo.repo, + owner: ${{ RYUJINX_TARGET_RELEASE_CHANNEL_OWNER }}, + repo: ${{ RYUJINX_TARGET_RELEASE_CHANNEL_SOURCE_REPO }}, ref: 'refs/tags/Canary-${{ steps.version_info.outputs.build_version }}', sha: context.sha }) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 9086a7ff6..e0ae71171 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -42,8 +42,8 @@ jobs: with: script: | github.rest.git.createRef({ - owner: context.repo.owner, - repo: context.repo.repo, + owner: ${{ RYUJINX_TARGET_RELEASE_CHANNEL_OWNER }}, + repo: ${{ RYUJINX_TARGET_RELEASE_CHANNEL_REPO }}, ref: 'refs/tags/${{ steps.version_info.outputs.build_version }}', sha: context.sha }) From 9408452f933fad387fa91f86d0a4d1f302ce96f8 Mon Sep 17 00:00:00 2001 From: Evan Husted Date: Fri, 27 Dec 2024 16:10:03 -0600 Subject: [PATCH 31/60] ok that one was my fault --- .github/workflows/canary.yml | 4 ++-- .github/workflows/release.yml | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/workflows/canary.yml b/.github/workflows/canary.yml index 57b2958c7..a68f4cb97 100644 --- a/.github/workflows/canary.yml +++ b/.github/workflows/canary.yml @@ -43,8 +43,8 @@ jobs: with: script: | github.rest.git.createRef({ - owner: ${{ RYUJINX_TARGET_RELEASE_CHANNEL_OWNER }}, - repo: ${{ RYUJINX_TARGET_RELEASE_CHANNEL_SOURCE_REPO }}, + owner: ${{ env.RYUJINX_TARGET_RELEASE_CHANNEL_OWNER }}, + repo: ${{ env.RYUJINX_TARGET_RELEASE_CHANNEL_SOURCE_REPO }}, ref: 'refs/tags/Canary-${{ steps.version_info.outputs.build_version }}', sha: context.sha }) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index e0ae71171..bfc04e228 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -42,8 +42,8 @@ jobs: with: script: | github.rest.git.createRef({ - owner: ${{ RYUJINX_TARGET_RELEASE_CHANNEL_OWNER }}, - repo: ${{ RYUJINX_TARGET_RELEASE_CHANNEL_REPO }}, + owner: ${{ env.RYUJINX_TARGET_RELEASE_CHANNEL_OWNER }}, + repo: ${{ env.RYUJINX_TARGET_RELEASE_CHANNEL_REPO }}, ref: 'refs/tags/${{ steps.version_info.outputs.build_version }}', sha: context.sha }) From 44ee4190e62d508020ff81b146e0b32260e244ad Mon Sep 17 00:00:00 2001 From: Evan Husted Date: Fri, 27 Dec 2024 16:11:23 -0600 Subject: [PATCH 32/60] JAVASCRIPT LOL --- .github/workflows/canary.yml | 4 ++-- .github/workflows/release.yml | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/workflows/canary.yml b/.github/workflows/canary.yml index a68f4cb97..c17b06046 100644 --- a/.github/workflows/canary.yml +++ b/.github/workflows/canary.yml @@ -43,8 +43,8 @@ jobs: with: script: | github.rest.git.createRef({ - owner: ${{ env.RYUJINX_TARGET_RELEASE_CHANNEL_OWNER }}, - repo: ${{ env.RYUJINX_TARGET_RELEASE_CHANNEL_SOURCE_REPO }}, + owner: "${{ env.RYUJINX_TARGET_RELEASE_CHANNEL_OWNER }}", + repo: "${{ env.RYUJINX_TARGET_RELEASE_CHANNEL_SOURCE_REPO }}", ref: 'refs/tags/Canary-${{ steps.version_info.outputs.build_version }}', sha: context.sha }) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index bfc04e228..a24b58a5d 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -42,8 +42,8 @@ jobs: with: script: | github.rest.git.createRef({ - owner: ${{ env.RYUJINX_TARGET_RELEASE_CHANNEL_OWNER }}, - repo: ${{ env.RYUJINX_TARGET_RELEASE_CHANNEL_REPO }}, + owner: "${{ env.RYUJINX_TARGET_RELEASE_CHANNEL_OWNER }}", + repo: "${{ env.RYUJINX_TARGET_RELEASE_CHANNEL_REPO }}", ref: 'refs/tags/${{ steps.version_info.outputs.build_version }}', sha: context.sha }) From e1e4e5d2d58fbc56c4eaea4679900f61b3468a5b Mon Sep 17 00:00:00 2001 From: Daniel Nylander Date: Sat, 28 Dec 2024 00:58:58 +0100 Subject: [PATCH 33/60] Swedish translation (#446) Co-authored-by: LotP1 <68976644+LotP1@users.noreply.github.com> --- src/Ryujinx/Assets/locales.json | 924 +++++++++++++++++++++++++++++++- 1 file changed, 914 insertions(+), 10 deletions(-) diff --git a/src/Ryujinx/Assets/locales.json b/src/Ryujinx/Assets/locales.json index cdf43f474..6cebc1364 100644 --- a/src/Ryujinx/Assets/locales.json +++ b/src/Ryujinx/Assets/locales.json @@ -14,6 +14,7 @@ "pl_PL", "pt_BR", "ru_RU", + "sv_SE", "th_TH", "tr_TR", "uk_UA", @@ -38,6 +39,7 @@ "pl_PL": "Polski", "pt_BR": "Português (BR)", "ru_RU": "Русский (RU)", + "sv_SE": "Svenska", "th_TH": "ภาษาไทย", "tr_TR": "Türkçe", "uk_UA": "Українська", @@ -62,6 +64,7 @@ "pl_PL": "Otwórz Aplet", "pt_BR": "Abrir Applet", "ru_RU": "Открыть апплет", + "sv_SE": "Öppna applet", "th_TH": "เปิด Applet", "tr_TR": "Applet'i Aç", "uk_UA": "Відкрити аплет", @@ -86,6 +89,7 @@ "pl_PL": "", "pt_BR": "", "ru_RU": "", + "sv_SE": "Redigera Mii-applet", "th_TH": "", "tr_TR": "", "uk_UA": "Аплет для редагування Mii", @@ -110,6 +114,7 @@ "pl_PL": "Otwórz aplet Mii Editor w trybie indywidualnym", "pt_BR": "Abrir editor Mii em modo avulso", "ru_RU": "Открывает апплет Mii Editor в автономном режиме", + "sv_SE": "Öppna Mii Editor Applet i fristående läge", "th_TH": "เปิดโปรแกรม Mii Editor Applet", "tr_TR": "Mii Editör Applet'ini Bağımsız Mod'da Aç", "uk_UA": "Відкрити аплет Mii Editor в автономному режимі", @@ -134,6 +139,7 @@ "pl_PL": "Bezpośredni dostęp do myszy", "pt_BR": "Acesso direto ao mouse", "ru_RU": "Прямой ввод мыши", + "sv_SE": "Direkt musåtkomst", "th_TH": "เข้าถึงเมาส์ได้โดยตรง", "tr_TR": "Doğrudan Mouse Erişimi", "uk_UA": "Прямий доступ мишею", @@ -158,6 +164,7 @@ "pl_PL": "Tryb menedżera pamięci:", "pt_BR": "Modo de gerenciamento de memória:", "ru_RU": "Режим менеджера памяти:", + "sv_SE": "Läge för minnehanterare:", "th_TH": "โหมดจัดการหน่วยความจำ:", "tr_TR": "Hafıza Yönetim Modu:", "uk_UA": "Режим диспетчера пам’яті:", @@ -182,6 +189,7 @@ "pl_PL": "Oprogramowanie", "pt_BR": "", "ru_RU": "Программное обеспечение", + "sv_SE": "Programvara", "th_TH": "ซอฟต์แวร์", "tr_TR": "Yazılım", "uk_UA": "Програмне забезпечення", @@ -206,6 +214,7 @@ "pl_PL": "Gospodarz (szybki)", "pt_BR": "Hóspede (rápido)", "ru_RU": "Хост (быстро)", + "sv_SE": "Värd (snabb)", "th_TH": "โฮสต์ (เร็ว)", "tr_TR": "Host (hızlı)", "uk_UA": "Хост (швидко)", @@ -230,6 +239,7 @@ "pl_PL": "Gospodarza (NIESPRAWDZONY, najszybszy, niebezpieczne)", "pt_BR": "Hóspede sem verificação (mais rápido, inseguro)", "ru_RU": "Хост не установлен (самый быстрый, небезопасный)", + "sv_SE": "Värd inte kontrollerad (snabbaste, osäkert)", "th_TH": "ไม่ได้ตรวจสอบโฮสต์ (เร็วที่สุด, แต่ไม่ปลอดภัย)", "tr_TR": "Host Unchecked (en hızlısı, tehlikeli)", "uk_UA": "Неперевірений хост (найшвидший, небезпечний)", @@ -254,6 +264,7 @@ "pl_PL": "Użyj Hipernadzorcy", "pt_BR": "Usar Hipervisor", "ru_RU": "Использовать Hypervisor", + "sv_SE": "Använd Hypervisor", "th_TH": "ใช้งาน Hypervisor", "tr_TR": "Hypervisor Kullan", "uk_UA": "Використовувати гіпервізор", @@ -278,6 +289,7 @@ "pl_PL": "_Plik", "pt_BR": "_Arquivo", "ru_RU": "_Файл", + "sv_SE": "_Arkiv", "th_TH": "ไฟล์", "tr_TR": "_Dosya", "uk_UA": "_Файл", @@ -302,6 +314,7 @@ "pl_PL": "_Załaduj aplikację z pliku", "pt_BR": "_Abrir ROM do jogo...", "ru_RU": "_Добавить приложение из файла", + "sv_SE": "_Läs in applikation från fil", "th_TH": "โหลดแอปพลิเคชั่นจากไฟล์", "tr_TR": "_Dosyadan Uygulama Aç", "uk_UA": "_Завантажити програму з файлу", @@ -326,6 +339,7 @@ "pl_PL": "", "pt_BR": "Nenhum aplicativo encontrado no arquivo selecionado.", "ru_RU": "", + "sv_SE": "Inga applikationer hittades i vald fil.", "th_TH": "ไม่พบแอปพลิเคชั่นจากไฟล์ที่เลือก", "tr_TR": "", "uk_UA": "У вибраному файлі не знайдено жодних додатків.", @@ -350,6 +364,7 @@ "pl_PL": "Załaduj _rozpakowaną grę", "pt_BR": "Abrir jogo _extraído...", "ru_RU": "Добавить _распакованную игру", + "sv_SE": "Läs in _uppackat spel", "th_TH": "โหลดเกมที่แตกไฟล์แล้ว", "tr_TR": "_Sıkıştırılmamış Oyun Aç", "uk_UA": "Завантажити _розпаковану гру", @@ -374,6 +389,7 @@ "pl_PL": "", "pt_BR": "Carregar DLC da Pasta", "ru_RU": "", + "sv_SE": "Läs in DLC från mapp", "th_TH": "โหลด DLC จากโฟลเดอร์", "tr_TR": "", "uk_UA": "Завантажити DLC з теки", @@ -398,6 +414,7 @@ "pl_PL": "", "pt_BR": "Carregar Atualizações de Jogo da Pasta", "ru_RU": "", + "sv_SE": "Läs in titeluppdateringar från mapp", "th_TH": "โหลดไฟล์อัพเดตจากโฟลเดอร์", "tr_TR": "", "uk_UA": "Завантажити оновлення заголовків з теки", @@ -422,6 +439,7 @@ "pl_PL": "Otwórz folder Ryujinx", "pt_BR": "Abrir diretório do e_mulador...", "ru_RU": "Открыть папку Ryujinx", + "sv_SE": "Öppna Ryujinx-mapp", "th_TH": "เปิดโฟลเดอร์ Ryujinx", "tr_TR": "Ryujinx Klasörünü aç", "uk_UA": "Відкрити теку Ryujinx", @@ -446,6 +464,7 @@ "pl_PL": "Otwórz folder plików dziennika zdarzeń", "pt_BR": "Abrir diretório de _logs...", "ru_RU": "Открыть папку с логами", + "sv_SE": "Öppna loggmapp", "th_TH": "เปิดโฟลเดอร์ Logs", "tr_TR": "Logs Klasörünü aç", "uk_UA": "Відкрити теку журналів змін", @@ -470,6 +489,7 @@ "pl_PL": "_Wyjdź", "pt_BR": "_Sair", "ru_RU": "_Выход", + "sv_SE": "A_vsluta", "th_TH": "_ออก", "tr_TR": "_Çıkış", "uk_UA": "_Вихід", @@ -494,6 +514,7 @@ "pl_PL": "_Opcje", "pt_BR": "_Opções", "ru_RU": "_Настройки", + "sv_SE": "I_nställningar", "th_TH": "_ตัวเลือก", "tr_TR": "_Seçenekler", "uk_UA": "_Параметри", @@ -518,6 +539,7 @@ "pl_PL": "Przełącz na tryb pełnoekranowy", "pt_BR": "_Mudar para tela cheia", "ru_RU": "Включить полноэкранный режим", + "sv_SE": "Växla helskärm", "th_TH": "สลับเป็นโหมดเต็มหน้าจอ", "tr_TR": "Tam Ekran Modunu Aç", "uk_UA": "На весь екран", @@ -542,6 +564,7 @@ "pl_PL": "Uruchamiaj gry w trybie pełnoekranowym", "pt_BR": "Iniciar jogos em tela cheia", "ru_RU": "Запускать игры в полноэкранном режиме", + "sv_SE": "Starta spel i helskärmsläge", "th_TH": "เริ่มเกมในโหมดเต็มหน้าจอ", "tr_TR": "Oyunları Tam Ekran Modunda Başlat", "uk_UA": "Запускати ігри на весь екран", @@ -566,6 +589,7 @@ "pl_PL": "Zatrzymaj emulację", "pt_BR": "_Encerrar emulação", "ru_RU": "Остановить эмуляцию", + "sv_SE": "Stoppa emulering", "th_TH": "หยุดการจำลอง", "tr_TR": "Emülasyonu Durdur", "uk_UA": "Зупинити емуляцію", @@ -590,6 +614,7 @@ "pl_PL": "_Ustawienia", "pt_BR": "_Configurações", "ru_RU": "_Параметры", + "sv_SE": "_Inställningar", "th_TH": "_ตั้งค่า", "tr_TR": "_Seçenekler", "uk_UA": "_Налаштування", @@ -614,6 +639,7 @@ "pl_PL": "_Zarządzaj profilami użytkowników", "pt_BR": "_Gerenciar perfis de usuário", "ru_RU": "_Менеджер учетных записей", + "sv_SE": "_Hantera användarprofiler", "th_TH": "_จัดการโปรไฟล์ผู้ใช้งาน", "tr_TR": "_Kullanıcı Profillerini Yönet", "uk_UA": "_Керувати профілями користувачів", @@ -638,6 +664,7 @@ "pl_PL": "_Akcje", "pt_BR": "_Ações", "ru_RU": "_Действия", + "sv_SE": "Åt_gärder", "th_TH": "การดำเนินการ", "tr_TR": "_Eylemler", "uk_UA": "_Дії", @@ -662,6 +689,7 @@ "pl_PL": "Symuluj wiadomość wybudzania", "pt_BR": "_Simular mensagem de acordar console", "ru_RU": "Имитировать сообщение пробуждения", + "sv_SE": "Simulera uppvakningsmeddelande", "th_TH": "จำลองข้อความปลุก", "tr_TR": "Uyandırma Mesajı Simüle Et", "uk_UA": "Симулювати повідомлення про пробудження", @@ -686,6 +714,7 @@ "pl_PL": "Skanuj Amiibo", "pt_BR": "Escanear um Amiibo", "ru_RU": "Сканировать Amiibo", + "sv_SE": "Skanna en Amiibo", "th_TH": "สแกนหา Amiibo", "tr_TR": "Bir Amiibo Tara", "uk_UA": "Сканувати Amiibo", @@ -710,6 +739,7 @@ "pl_PL": "", "pt_BR": "", "ru_RU": "", + "sv_SE": "Skanna en Amiibo (från bin-fil)", "th_TH": "", "tr_TR": "", "uk_UA": "", @@ -734,6 +764,7 @@ "pl_PL": "_Narzędzia", "pt_BR": "_Ferramentas", "ru_RU": "_Инструменты", + "sv_SE": "V_erktyg", "th_TH": "_เครื่องมือ", "tr_TR": "_Araçlar", "uk_UA": "_Інструменти", @@ -758,6 +789,7 @@ "pl_PL": "Zainstaluj oprogramowanie", "pt_BR": "_Instalar firmware", "ru_RU": "Установка прошивки", + "sv_SE": "Installera firmware", "th_TH": "ติดตั้งเฟิร์มแวร์", "tr_TR": "Yazılım Yükle", "uk_UA": "Установити прошивку", @@ -782,6 +814,7 @@ "pl_PL": "Zainstaluj oprogramowanie z XCI lub ZIP", "pt_BR": "Instalar firmware a partir de um arquivo ZIP/XCI", "ru_RU": "Установить прошивку из XCI или ZIP", + "sv_SE": "Installera en firmware från XCI eller ZIP", "th_TH": "ติดตั้งเฟิร์มแวร์จาก ไฟล์ XCI หรือ ไฟล์ ZIP", "tr_TR": "XCI veya ZIP'ten Yazılım Yükle", "uk_UA": "Установити прошивку з XCI або ZIP", @@ -806,6 +839,7 @@ "pl_PL": "Zainstaluj oprogramowanie z katalogu", "pt_BR": "Instalar firmware a partir de um diretório", "ru_RU": "Установить прошивку из папки", + "sv_SE": "Installera en firmware från en katalog", "th_TH": "ติดตั้งเฟิร์มแวร์จากไดเร็กทอรี", "tr_TR": "Bir Dizin Üzerinden Yazılım Yükle", "uk_UA": "Установити прошивку з теки", @@ -830,6 +864,7 @@ "pl_PL": "", "pt_BR": "", "ru_RU": "", + "sv_SE": "Installera nycklar", "th_TH": "", "tr_TR": "", "uk_UA": "", @@ -854,6 +889,7 @@ "pl_PL": "", "pt_BR": "", "ru_RU": "", + "sv_SE": "Installera nycklar från KEYS eller ZIP", "th_TH": "", "tr_TR": "", "uk_UA": "", @@ -878,6 +914,7 @@ "pl_PL": "", "pt_BR": "", "ru_RU": "", + "sv_SE": "Installera nycklar från en katalog", "th_TH": "", "tr_TR": "", "uk_UA": "", @@ -902,6 +939,7 @@ "pl_PL": "Zarządzaj rodzajami plików", "pt_BR": "Gerenciar tipos de arquivo", "ru_RU": "Управление типами файлов", + "sv_SE": "Hantera filtyper", "th_TH": "จัดการประเภทไฟล์", "tr_TR": "Dosya uzantılarını yönet", "uk_UA": "Керувати типами файлів", @@ -926,6 +964,7 @@ "pl_PL": "Typy plików instalacyjnych", "pt_BR": "Instalar tipos de arquivo", "ru_RU": "Установить типы файлов", + "sv_SE": "Installera filtyper", "th_TH": "ติดตั้งประเภทไฟล์", "tr_TR": "Dosya uzantılarını yükle", "uk_UA": "Установити типи файлів", @@ -950,6 +989,7 @@ "pl_PL": "Typy plików dezinstalacyjnych", "pt_BR": "Desinstalar tipos de arquivos", "ru_RU": "Удалить типы файлов", + "sv_SE": "Avinstallera filtyper", "th_TH": "ถอนการติดตั้งประเภทไฟล์", "tr_TR": "Dosya uzantılarını kaldır", "uk_UA": "Видалити типи файлів", @@ -974,6 +1014,7 @@ "pl_PL": "", "pt_BR": "", "ru_RU": "", + "sv_SE": "Optimera XCI-filer", "th_TH": "", "tr_TR": "", "uk_UA": "Обрізати XCI файли", @@ -998,6 +1039,7 @@ "pl_PL": "", "pt_BR": "", "ru_RU": "_Вид", + "sv_SE": "_Visa", "th_TH": "_มุมมอง", "tr_TR": "_Görüntüle", "uk_UA": "_Вид", @@ -1022,6 +1064,7 @@ "pl_PL": "", "pt_BR": "", "ru_RU": "Размер окна", + "sv_SE": "Fönsterstorlek", "th_TH": "ขนาดหน้าต่าง", "tr_TR": "Pencere Boyutu", "uk_UA": "Розмір вікна", @@ -1046,6 +1089,7 @@ "pl_PL": "", "pt_BR": "", "ru_RU": "", + "sv_SE": "720p", "th_TH": "", "tr_TR": "", "uk_UA": "", @@ -1070,6 +1114,7 @@ "pl_PL": "", "pt_BR": "", "ru_RU": "", + "sv_SE": "1080p", "th_TH": "", "tr_TR": "", "uk_UA": "", @@ -1094,6 +1139,7 @@ "pl_PL": "", "pt_BR": "", "ru_RU": "", + "sv_SE": "1440p", "th_TH": "", "tr_TR": "", "uk_UA": "", @@ -1118,6 +1164,7 @@ "pl_PL": "", "pt_BR": "", "ru_RU": "", + "sv_SE": "2160p", "th_TH": "", "tr_TR": "", "uk_UA": "", @@ -1142,6 +1189,7 @@ "pl_PL": "_Pomoc", "pt_BR": "_Ajuda", "ru_RU": "_Помощь", + "sv_SE": "_Hjälp", "th_TH": "_ช่วยเหลือ", "tr_TR": "_Yardım", "uk_UA": "_Допомога", @@ -1166,6 +1214,7 @@ "pl_PL": "Sprawdź aktualizacje", "pt_BR": "_Verificar se há atualizações", "ru_RU": "Проверить наличие обновлений", + "sv_SE": "Leta efter uppdateringar", "th_TH": "ตรวจสอบอัปเดต", "tr_TR": "Güncellemeleri Denetle", "uk_UA": "Перевірити оновлення", @@ -1190,6 +1239,7 @@ "pl_PL": "", "pt_BR": "", "ru_RU": "", + "sv_SE": "Frågor, svar och guider", "th_TH": "", "tr_TR": "", "uk_UA": "", @@ -1214,6 +1264,7 @@ "pl_PL": "", "pt_BR": "", "ru_RU": "", + "sv_SE": "Frågor, svar och felsökningssida", "th_TH": "", "tr_TR": "", "uk_UA": "", @@ -1238,6 +1289,7 @@ "pl_PL": "", "pt_BR": "", "ru_RU": "", + "sv_SE": "Öppnar Frågor, svar och felsökningssidan på den officiella Ryujinx-wikin", "th_TH": "", "tr_TR": "", "uk_UA": "", @@ -1262,6 +1314,7 @@ "pl_PL": "", "pt_BR": "", "ru_RU": "", + "sv_SE": "Konfigurationsguide", "th_TH": "", "tr_TR": "", "uk_UA": "", @@ -1286,6 +1339,7 @@ "pl_PL": "", "pt_BR": "", "ru_RU": "", + "sv_SE": "Öppnar konfigurationsguiden på den officiella Ryujinx-wikin", "th_TH": "", "tr_TR": "", "uk_UA": "", @@ -1310,6 +1364,7 @@ "pl_PL": "", "pt_BR": "", "ru_RU": "", + "sv_SE": "Flerspelarguide (LDN/LAN)", "th_TH": "", "tr_TR": "", "uk_UA": "", @@ -1334,6 +1389,7 @@ "pl_PL": "", "pt_BR": "", "ru_RU": "", + "sv_SE": "Öppnar flerspelarguiden på den officiella Ryujinx-wikin", "th_TH": "", "tr_TR": "", "uk_UA": "", @@ -1358,6 +1414,7 @@ "pl_PL": "O programie", "pt_BR": "_Sobre", "ru_RU": "О программе", + "sv_SE": "Om", "th_TH": "เกี่ยวกับ", "tr_TR": "Hakkında", "uk_UA": "Про застосунок", @@ -1382,6 +1439,7 @@ "pl_PL": "Wyszukaj...", "pt_BR": "Buscar...", "ru_RU": "Поиск...", + "sv_SE": "Sök...", "th_TH": "กำลังค้นหา...", "tr_TR": "Ara...", "uk_UA": "Пошук...", @@ -1406,6 +1464,7 @@ "pl_PL": "Ulubione", "pt_BR": "Favorito", "ru_RU": "Избранное", + "sv_SE": "Favorit", "th_TH": "ชื่นชอบ", "tr_TR": "Favori", "uk_UA": "Обране", @@ -1430,6 +1489,7 @@ "pl_PL": "Ikona", "pt_BR": "Ícone", "ru_RU": "Значок", + "sv_SE": "Ikon", "th_TH": "ไอคอน", "tr_TR": "Simge", "uk_UA": "Значок", @@ -1454,6 +1514,7 @@ "pl_PL": "Nazwa", "pt_BR": "Nome", "ru_RU": "Название", + "sv_SE": "Namn", "th_TH": "ชื่อ", "tr_TR": "Oyun Adı", "uk_UA": "Назва", @@ -1478,6 +1539,7 @@ "pl_PL": "Twórca", "pt_BR": "Desenvolvedor", "ru_RU": "Разработчик", + "sv_SE": "Utvecklare", "th_TH": "ผู้พัฒนา", "tr_TR": "Geliştirici", "uk_UA": "Розробник", @@ -1502,6 +1564,7 @@ "pl_PL": "Wersja", "pt_BR": "Versão", "ru_RU": "Версия", + "sv_SE": "Version", "th_TH": "เวอร์ชั่น", "tr_TR": "Sürüm", "uk_UA": "Версія", @@ -1526,6 +1589,7 @@ "pl_PL": "Czas w grze:", "pt_BR": "Tempo de jogo", "ru_RU": "Время в игре", + "sv_SE": "Speltid", "th_TH": "เล่นไปแล้ว", "tr_TR": "Oynama Süresi", "uk_UA": "Зіграно часу", @@ -1550,6 +1614,7 @@ "pl_PL": "Ostatnio grane", "pt_BR": "Último jogo", "ru_RU": "Последний запуск", + "sv_SE": "Senast spelad", "th_TH": "เล่นล่าสุด", "tr_TR": "Son Oynama Tarihi", "uk_UA": "Востаннє зіграно", @@ -1574,6 +1639,7 @@ "pl_PL": "Rozszerzenie pliku", "pt_BR": "Extensão", "ru_RU": "Расширение файла", + "sv_SE": "Filänd", "th_TH": "นามสกุลไฟล์", "tr_TR": "Dosya Uzantısı", "uk_UA": "Розширення файлу", @@ -1598,6 +1664,7 @@ "pl_PL": "Rozmiar pliku", "pt_BR": "Tamanho", "ru_RU": "Размер файла", + "sv_SE": "Filstorlek", "th_TH": "ขนาดไฟล์", "tr_TR": "Dosya Boyutu", "uk_UA": "Розмір файлу", @@ -1622,6 +1689,7 @@ "pl_PL": "Ścieżka", "pt_BR": "Caminho", "ru_RU": "Путь", + "sv_SE": "Sökväg", "th_TH": "ที่อยู่ไฟล์", "tr_TR": "Yol", "uk_UA": "Шлях", @@ -1646,6 +1714,7 @@ "pl_PL": "Otwórz katalog zapisów użytkownika", "pt_BR": "Abrir diretório de saves do usuário", "ru_RU": "Открыть папку с сохранениями", + "sv_SE": "Öppna användarkatalog för sparningar", "th_TH": "เปิดไดเร็กทอรี่บันทึกของผู้ใช้", "tr_TR": "Kullanıcı Kayıt Dosyası Dizinini Aç", "uk_UA": "Відкрити теку збереження користувача", @@ -1670,6 +1739,7 @@ "pl_PL": "Otwiera katalog, który zawiera zapis użytkownika dla tej aplikacji", "pt_BR": "Abre o diretório que contém jogos salvos para o usuário atual", "ru_RU": "Открывает папку с пользовательскими сохранениями", + "sv_SE": "Öppnar katalogen som innehåller applikationens användarsparade spel", "th_TH": "เปิดไดเร็กทอรี่ซึ่งมีการบันทึกข้อมูลของผู้ใช้แอปพลิเคชัน", "tr_TR": "Uygulamanın Kullanıcı Kaydı'nın bulunduğu dizini açar", "uk_UA": "Відкриває каталог, який містить збереження користувача програми", @@ -1694,6 +1764,7 @@ "pl_PL": "Otwórz katalog zapisów urządzenia", "pt_BR": "Abrir diretório de saves de dispositivo do usuário", "ru_RU": "Открыть папку сохраненных устройств", + "sv_SE": "Öppna enhetens katalog för sparade spel", "th_TH": "เปิดไดเร็กทอรี่บันทึกของอุปกรณ์", "tr_TR": "Kullanıcı Cihaz Dizinini Aç", "uk_UA": "Відкрити каталог пристроїв користувача", @@ -1718,6 +1789,7 @@ "pl_PL": "Otwiera katalog, który zawiera zapis urządzenia dla tej aplikacji", "pt_BR": "Abre o diretório que contém saves do dispositivo para o usuário atual", "ru_RU": "Открывает папку, содержащую сохраненные устройства", + "sv_SE": "Öppnar katalogen som innehåller applikationens sparade spel på enheten", "th_TH": "เปิดไดเรกทอรี่ซึ่งมีบันทึกข้อมูลของอุปกรณ์ในแอปพลิเคชัน", "tr_TR": "Uygulamanın Kullanıcı Cihaz Kaydı'nın bulunduğu dizini açar", "uk_UA": "Відкриває каталог, який містить збереження пристрою програми", @@ -1742,6 +1814,7 @@ "pl_PL": "Otwórz katalog zapisu BCAT obecnego użytkownika", "pt_BR": "Abrir diretório de saves BCAT do usuário", "ru_RU": "Открыть папку сохраненных BCAT", + "sv_SE": "Öppna katalog för BCAT-sparningar", "th_TH": "เปิดไดเรกทอรี่บันทึกของ BCAT", "tr_TR": "Kullanıcı BCAT Dizinini Aç", "uk_UA": "Відкрити каталог користувача BCAT", @@ -1766,6 +1839,7 @@ "pl_PL": "Otwiera katalog, który zawiera zapis BCAT dla tej aplikacji", "pt_BR": "Abre o diretório que contém saves BCAT para o usuário atual", "ru_RU": "Открывает папку, содержащую сохраненные BCAT", + "sv_SE": "Öppnar katalogen som innehåller applikationens BCAT-sparningar", "th_TH": "เปิดไดเรกทอรี่ซึ่งมีการบันทึกข้อมูลของ BCAT ในแอปพลิเคชัน", "tr_TR": "Uygulamanın Kullanıcı BCAT Kaydı'nın bulunduğu dizini açar", "uk_UA": "Відкриває каталог, який містить BCAT-збереження програми", @@ -1790,6 +1864,7 @@ "pl_PL": "Zarządzaj aktualizacjami", "pt_BR": "Gerenciar atualizações do jogo", "ru_RU": "Управление обновлениями", + "sv_SE": "Hantera speluppdateringar", "th_TH": "จัดการเวอร์ชั่นอัปเดต", "tr_TR": "Oyun Güncellemelerini Yönet", "uk_UA": "Керування оновленнями заголовків", @@ -1814,6 +1889,7 @@ "pl_PL": "Otwiera okno zarządzania aktualizacjami danej aplikacji", "pt_BR": "Abre a janela de gerenciamento de atualizações", "ru_RU": "Открывает окно управления обновлениями приложения", + "sv_SE": "Öppnar spelets hanteringsfönster för uppdateringar", "th_TH": "เปิดหน้าต่างการจัดการเวอร์ชั่นการอัพเดต", "tr_TR": "Oyun Güncelleme Yönetim Penceresini Açar", "uk_UA": "Відкриває вікно керування оновленням заголовка", @@ -1838,6 +1914,7 @@ "pl_PL": "Zarządzaj dodatkową zawartością (DLC)", "pt_BR": "Gerenciar DLCs", "ru_RU": "Управление DLC", + "sv_SE": "Hantera DLC", "th_TH": "จัดการ DLC", "tr_TR": "DLC'leri Yönet", "uk_UA": "Керування DLC", @@ -1862,6 +1939,7 @@ "pl_PL": "Otwiera okno zarządzania dodatkową zawartością", "pt_BR": "Abre a janela de gerenciamento de DLCs", "ru_RU": "Открывает окно управления DLC", + "sv_SE": "Öppnar DLC-hanteringsfönstret", "th_TH": "เปิดหน้าต่างจัดการ DLC", "tr_TR": "DLC yönetim penceresini açar", "uk_UA": "Відкриває вікно керування DLC", @@ -1886,6 +1964,7 @@ "pl_PL": "Zarządzanie Cache", "pt_BR": "Gerenciamento de cache", "ru_RU": "Управление кэшем", + "sv_SE": "Cachehantering", "th_TH": "จัดการแคช", "tr_TR": "Önbellek Yönetimi", "uk_UA": "Керування кешем", @@ -1910,6 +1989,7 @@ "pl_PL": "Zakolejkuj rekompilację PPTC", "pt_BR": "Limpar cache PPTC", "ru_RU": "Перестроить очередь PPTC", + "sv_SE": "Kölägg PPTC Rebuild", "th_TH": "เพิ่มคิวการสร้าง PPTC ใหม่", "tr_TR": "PPTC Yeniden Yapılandırmasını Başlat", "uk_UA": "Очистити кеш PPTC", @@ -1934,6 +2014,7 @@ "pl_PL": "Zainicjuj Rekompilację PPTC przy następnym uruchomieniu gry", "pt_BR": "Deleta o cache PPTC armazenado em disco do jogo", "ru_RU": "Запускает перестройку PPTC во время следующего запуска игры.", + "sv_SE": "Gör så att PPTC bygger om vid uppstart när nästa spel startas", "th_TH": "ให้ PPTC สร้างใหม่ในเวลาบูตเมื่อเปิดเกมครั้งถัดไป", "tr_TR": "Oyunun bir sonraki açılışında PPTC'yi yeniden yapılandır", "uk_UA": "Видаляє кеш PPTC програми", @@ -1958,6 +2039,7 @@ "pl_PL": "Wyczyść pamięć podręczną cieni", "pt_BR": "Limpar cache de Shader", "ru_RU": "Очистить кэш шейдеров", + "sv_SE": "Töm shader cache", "th_TH": "ล้างแคช แสงเงา", "tr_TR": "Shader Önbelleğini Temizle", "uk_UA": "Очистити кеш шейдерів", @@ -1982,6 +2064,7 @@ "pl_PL": "Usuwa pamięć podręczną cieni danej aplikacji", "pt_BR": "Deleta o cache de Shader armazenado em disco do jogo", "ru_RU": "Удаляет кеш шейдеров приложения", + "sv_SE": "Tar bort applikationens shader cache", "th_TH": "ลบแคช แสงเงา ของแอปพลิเคชัน", "tr_TR": "Uygulamanın shader önbelleğini temizler", "uk_UA": "Видаляє кеш шейдерів програми", @@ -2006,6 +2089,7 @@ "pl_PL": "Otwórz katalog PPTC", "pt_BR": "Abrir diretório do cache PPTC", "ru_RU": "Открыть папку PPTC", + "sv_SE": "Öppna PPTC-katalog", "th_TH": "เปิดไดเรกทอรี่ PPTC", "tr_TR": "PPTC Dizinini Aç", "uk_UA": "Відкрити каталог PPTC", @@ -2030,6 +2114,7 @@ "pl_PL": "Otwiera katalog, który zawiera pamięć podręczną PPTC aplikacji", "pt_BR": "Abre o diretório contendo os arquivos do cache PPTC", "ru_RU": "Открывает папку, содержащую PPTC кэш приложений и игр", + "sv_SE": "Öppnar katalogen som innehåller applikationens PPTC-cache", "th_TH": "เปิดไดเร็กทอรี่ของ แคช PPTC ในแอปพลิเคชัน", "tr_TR": "Uygulamanın PPTC Önbelleğinin bulunduğu dizini açar", "uk_UA": "Відкриває каталог, який містить кеш PPTC програми", @@ -2054,6 +2139,7 @@ "pl_PL": "Otwórz katalog pamięci podręcznej cieni", "pt_BR": "Abrir diretório do cache de Shader", "ru_RU": "Открыть папку с кэшем шейдеров", + "sv_SE": "Öppna katalog för shader cache", "th_TH": "เปิดไดเรกทอรี่ แคช แสงเงา", "tr_TR": "Shader Önbelleği Dizinini Aç", "uk_UA": "Відкрити каталог кешу шейдерів", @@ -2078,6 +2164,7 @@ "pl_PL": "Otwiera katalog, który zawiera pamięć podręczną cieni aplikacji", "pt_BR": "Abre o diretório contendo os arquivos do cache de Shader", "ru_RU": "Открывает папку, содержащую кэш шейдеров приложений и игр", + "sv_SE": "Öppnar katalogen som innehåller applikationens shader cache", "th_TH": "เปิดไดเรกทอรี่ของ แคช แสงเงา ในแอปพลิเคชัน", "tr_TR": "Uygulamanın shader önbelleğinin bulunduğu dizini açar", "uk_UA": "Відкриває каталог, який містить кеш шейдерів програми", @@ -2102,6 +2189,7 @@ "pl_PL": "Wypakuj dane", "pt_BR": "Extrair dados", "ru_RU": "Извлечь данные", + "sv_SE": "Extrahera data", "th_TH": "แยกส่วนข้อมูล", "tr_TR": "Veriyi Ayıkla", "uk_UA": "Видобути дані", @@ -2126,6 +2214,7 @@ "pl_PL": "", "pt_BR": "", "ru_RU": "", + "sv_SE": "ExeFS", "th_TH": "", "tr_TR": "", "uk_UA": "", @@ -2150,6 +2239,7 @@ "pl_PL": "Wyodrębnij sekcję ExeFS z bieżącej konfiguracji aplikacji (w tym aktualizacje)", "pt_BR": "Extrai a seção ExeFS do jogo (incluindo atualizações)", "ru_RU": "Извлечение раздела ExeFS из текущих настроек приложения (включая обновления)", + "sv_SE": "Extrahera ExeFS-sektionen från applikationens aktuella konfiguration (inkl uppdateringar)", "th_TH": "แยกส่วน ExeFS ออกจากการตั้งค่าปัจจุบันของแอปพลิเคชัน (รวมถึงอัปเดต)", "tr_TR": "Uygulamanın geçerli yapılandırmasından ExeFS kısmını ayıkla (Güncellemeler dahil)", "uk_UA": "Видобуває розділ ExeFS із поточної конфігурації програми (включаючи оновлення)", @@ -2174,6 +2264,7 @@ "pl_PL": "", "pt_BR": "", "ru_RU": "", + "sv_SE": "RomFS", "th_TH": "", "tr_TR": "", "uk_UA": "", @@ -2198,6 +2289,7 @@ "pl_PL": "Wyodrębnij sekcję RomFS z bieżącej konfiguracji aplikacji (w tym aktualizacje)", "pt_BR": "Extrai a seção RomFS do jogo (incluindo atualizações)", "ru_RU": "Извлечение раздела RomFS из текущих настроек приложения (включая обновления)", + "sv_SE": "Extrahera RomFS-sektionen från applikationens aktuella konfiguration (inkl uppdateringar)", "th_TH": "แยกส่วน RomFS ออกจากการตั้งค่าปัจจุบันของแอปพลิเคชัน (รวมถึงอัพเดต)", "tr_TR": "Uygulamanın geçerli yapılandırmasından RomFS kısmını ayıkla (Güncellemeler dahil)", "uk_UA": "Видобуває розділ RomFS із поточної конфігурації програми (включаючи оновлення)", @@ -2222,6 +2314,7 @@ "pl_PL": "", "pt_BR": "", "ru_RU": "Логотип", + "sv_SE": "Logotyp", "th_TH": "โลโก้", "tr_TR": "Simge", "uk_UA": "Логотип", @@ -2246,6 +2339,7 @@ "pl_PL": "Wyodrębnij sekcję z logiem z bieżącej konfiguracji aplikacji (w tym aktualizacje)", "pt_BR": "Extrai a seção Logo do jogo (incluindo atualizações)", "ru_RU": "Извлечение раздела с логотипом из текущих настроек приложения (включая обновления)", + "sv_SE": "Extrahera Logo-sektionen från applikationens aktuella konfiguration (inkl uppdateringar)", "th_TH": "แยกส่วน โลโก้ ออกจากการตั้งค่าปัจจุบันของแอปพลิเคชัน (รวมถึงอัปเดต)", "tr_TR": "Uygulamanın geçerli yapılandırmasından Logo kısmını ayıkla (Güncellemeler dahil)", "uk_UA": "Видобуває розділ логотипу з поточної конфігурації програми (включаючи оновлення)", @@ -2270,6 +2364,7 @@ "pl_PL": "Utwórz skrót aplikacji", "pt_BR": "Criar atalho da aplicação", "ru_RU": "Создать ярлык приложения", + "sv_SE": "Skapa genväg till applikation", "th_TH": "สร้างทางลัดของแอปพลิเคชัน", "tr_TR": "Uygulama Kısayolu Oluştur", "uk_UA": "Створити ярлик застосунку", @@ -2294,6 +2389,7 @@ "pl_PL": "Utwórz skrót na pulpicie, który uruchamia wybraną aplikację", "pt_BR": "Criar um atalho de área de trabalho que inicia o aplicativo selecionado", "ru_RU": "Создает ярлык на рабочем столе, с помощью которого можно запустить игру или приложение", + "sv_SE": "Skapa en skrivbordsgenväg som startar vald applikation", "th_TH": "สร้างทางลัดบนเดสก์ท็อปสำหรับใช้แอปพลิเคชันที่เลือก", "tr_TR": "Seçilmiş uygulamayı çalıştıracak bir masaüstü kısayolu oluştur", "uk_UA": "Створити ярлик на робочому столі, який запускає вибраний застосунок", @@ -2318,6 +2414,7 @@ "pl_PL": "Utwórz skrót w folderze 'Aplikacje' w systemie macOS, który uruchamia wybraną aplikację", "pt_BR": "Crie um atalho na pasta Aplicativos do macOS que abre o Aplicativo selecionado", "ru_RU": "Создает ярлык игры или приложения в папке Программы macOS", + "sv_SE": "Skapa en genväg i macOS-programmapp som startar vald applikation", "th_TH": "สร้างทางลัดในโฟลเดอร์ Applications ของ macOS สำหรับใช้แอปพลิเคชันที่เลือก", "tr_TR": "", "uk_UA": "Створити ярлик у каталозі macOS програм, що запускає обраний Додаток", @@ -2342,6 +2439,7 @@ "pl_PL": "Otwórz katalog modów", "pt_BR": "Abrir pasta de Mods", "ru_RU": "Открыть папку с модами", + "sv_SE": "Öppna Mods-katalog", "th_TH": "เปิดไดเร็กทอรี่ Mods", "tr_TR": "Mod Dizinini Aç", "uk_UA": "Відкрити теку з модами", @@ -2366,6 +2464,7 @@ "pl_PL": "Otwiera katalog zawierający mody dla danej aplikacji", "pt_BR": "Abre a pasta que contém os mods da aplicação ", "ru_RU": "Открывает папку, содержащую моды для приложений и игр", + "sv_SE": "Öppnar katalogen som innehåller applikationens Mods", "th_TH": "เปิดไดเร็กทอรี่ Mods ของแอปพลิเคชัน", "tr_TR": "", "uk_UA": "Відкриває каталог, який містить модифікації Додатків", @@ -2390,6 +2489,7 @@ "pl_PL": "Otwórz katalog modów Atmosphere", "pt_BR": "Abrir diretório de mods Atmosphere", "ru_RU": "Открыть папку с модами Atmosphere", + "sv_SE": "Öppna Atmosphere Mods-katalogen", "th_TH": "เปิดไดเร็กทอรี่ Mods Atmosphere", "tr_TR": "", "uk_UA": "Відкрити каталог модифікацій Atmosphere", @@ -2414,6 +2514,7 @@ "pl_PL": "Otwiera alternatywny katalog Atmosphere na karcie SD, który zawiera mody danej aplikacji. Przydatne dla modów przygotowanych pod prawdziwy sprzęt.", "pt_BR": "", "ru_RU": "Открывает папку Atmosphere на альтернативной SD-карте, которая содержит моды для приложений и игр. Полезно для модов, сделанных для реальной консоли.", + "sv_SE": "Öppnar den alternativa Atmosphere-katalogen på SD-kort som innehåller applikationens Mods. Användbart för Mods som är paketerade för riktig hårdvara.", "th_TH": "เปิดไดเร็กทอรี่ Atmosphere ของการ์ด SD สำรองซึ่งมี Mods ของแอปพลิเคชัน ซึ่งมีประโยชน์สำหรับ Mods ที่บรรจุมากับฮาร์ดแวร์จริง", "tr_TR": "", "uk_UA": "Відкриває альтернативний каталог SD-карти Atmosphere, що містить модифікації Додатків. Корисно для модифікацій, зроблених для реального обладнання.", @@ -2438,6 +2539,7 @@ "pl_PL": "", "pt_BR": "", "ru_RU": "", + "sv_SE": "Kontrollera och optimera XCI-fil", "th_TH": "", "tr_TR": "", "uk_UA": "Перевірка та Нарізка XCI Файлів", @@ -2462,6 +2564,7 @@ "pl_PL": "", "pt_BR": "", "ru_RU": "", + "sv_SE": "Kontrollera och optimera XCI-fil för att spara diskutrymme", "th_TH": "", "tr_TR": "", "uk_UA": "Перевірка та Нарізка XCI Файлів для збереження місця на диску", @@ -2486,6 +2589,7 @@ "pl_PL": "{0}/{1} Załadowane gry", "pt_BR": "{0}/{1} jogos carregados", "ru_RU": "{0}/{1} игр загружено", + "sv_SE": "{0}/{1} spel inlästa", "th_TH": "เกมส์โหลดแล้ว {0}/{1}", "tr_TR": "{0}/{1} Oyun Yüklendi", "uk_UA": "{0}/{1} ігор завантажено", @@ -2510,6 +2614,7 @@ "pl_PL": "", "pt_BR": "Versão do firmware: {0}", "ru_RU": "Версия прошивки: {0}", + "sv_SE": "Firmware-version: {0}", "th_TH": "", "tr_TR": "", "uk_UA": "", @@ -2534,6 +2639,7 @@ "pl_PL": "", "pt_BR": "", "ru_RU": "", + "sv_SE": "Optimerar XCI-filen '{0}'", "th_TH": "", "tr_TR": "", "uk_UA": "Обрізано XCI Файлів '{0}'", @@ -2558,6 +2664,7 @@ "pl_PL": "Wykryto niski limit dla przypisań pamięci", "pt_BR": "Limite baixo para mapeamentos de memória detectado", "ru_RU": "Обнаружен низкий лимит разметки памяти", + "sv_SE": "Låg gräns för minnesmappningar upptäcktes", "th_TH": "การตั้งค่าหน่วยความถึงขีดจำกัดต่ำสุดแล้ว", "tr_TR": "Bellek Haritaları İçin Düşük Limit Tespit Edildi ", "uk_UA": "Виявлено низьку межу для відображення памʼяті", @@ -2582,6 +2689,7 @@ "pl_PL": "Czy chcesz zwiększyć wartość vm.max_map_count do {0}", "pt_BR": "Você gostaria de aumentar o valor de vm.max_map_count para {0}", "ru_RU": "Хотите увеличить значение vm.max_map_count до {0}", + "sv_SE": "Vill du öka värdet för vm.max_map_count till {0}", "th_TH": "คุณต้องเพิ่มค่า vm.max_map_count ไปยัง {0}", "tr_TR": "vm.max_map_count değerini {0} sayısına yükseltmek ister misiniz", "uk_UA": "Бажаєте збільшити значення vm.max_map_count на {0}", @@ -2606,6 +2714,7 @@ "pl_PL": "Niektóre gry mogą próbować przypisać sobie więcej pamięci niż obecnie, jest to dozwolone. Ryujinx ulegnie awarii, gdy limit zostanie przekroczony.", "pt_BR": "Alguns jogos podem tentar criar mais mapeamentos de memória do que o atualmente permitido. Ryujinx irá falhar assim que este limite for excedido.", "ru_RU": "Некоторые игры могут создавать большую разметку памяти, чем разрешено на данный момент по умолчанию. Ryujinx вылетит при превышении этого лимита.", + "sv_SE": "Vissa spel kan försöka att skapa fler minnesmappningar än vad som tillåts. Ryujinx kommer att krascha så snart som denna gräns överstigs.", "th_TH": "บางเกมอาจพยายามใช้งานหน่วยความจำมากกว่าที่ได้รับอนุญาตในปัจจุบัน Ryujinx จะปิดตัวลงเมื่อเกินขีดจำกัดนี้", "tr_TR": "Bazı oyunlar şu an izin verilen bellek haritası limitinden daha fazlasını yaratmaya çalışabilir. Ryujinx bu limitin geçildiği takdirde kendini kapatıcaktır.", "uk_UA": "Деякі ігри можуть спробувати створити більше відображень памʼяті, ніж дозволено наразі. Ryujinx завершить роботу, щойно цей ліміт буде перевищено.", @@ -2630,6 +2739,7 @@ "pl_PL": "Tak, do następnego ponownego uruchomienia", "pt_BR": "Sim, até a próxima reinicialização", "ru_RU": "Да, до следующего перезапуска", + "sv_SE": "Ja, tills nästa omstart", "th_TH": "ใช่, จนกว่าจะรีสตาร์ทครั้งถัดไป", "tr_TR": "Evet, bir sonraki yeniden başlatmaya kadar", "uk_UA": "Так, до наст. перезапуску", @@ -2654,6 +2764,7 @@ "pl_PL": "Tak, permanentnie ", "pt_BR": "Sim, permanentemente", "ru_RU": "Да, постоянно", + "sv_SE": "Ja, permanent", "th_TH": "ใช่, อย่างถาวร", "tr_TR": "Evet, kalıcı olarak", "uk_UA": "Так, назавжди", @@ -2678,6 +2789,7 @@ "pl_PL": "Maksymalna ilość przypisanej pamięci jest mniejsza niż zalecana.", "pt_BR": "A quantidade máxima de mapeamentos de memória é menor que a recomendada.", "ru_RU": "Максимальная разметка памяти меньше, чем рекомендуется.", + "sv_SE": "Maximal mängd minnesmappningar är lägre än rekommenderat.", "th_TH": "จำนวนสูงสุดของการจัดการหน่วยความจำ ต่ำกว่าที่แนะนำ", "tr_TR": "İzin verilen maksimum bellek haritası değeri tavsiye edildiğinden daha düşük. ", "uk_UA": "Максимальна кількість відображення памʼяті менша, ніж рекомендовано.", @@ -2702,6 +2814,7 @@ "pl_PL": "Obecna wartość vm.max_map_count ({0}) jest mniejsza niż {1}. Niektóre gry mogą próbować stworzyć więcej mapowań pamięci niż obecnie jest to dozwolone. Ryujinx napotka crash, gdy dojdzie do takiej sytuacji.\n\nMożesz chcieć ręcznie zwiększyć limit lub zainstalować pkexec, co pozwala Ryujinx na pomoc w tym zakresie.", "pt_BR": "O valor atual de vm.max_map_count ({0}) é menor que {1}. Alguns jogos podem tentar criar mais mapeamentos de memória do que o permitido no momento. Ryujinx vai falhar assim que este limite for excedido.\n\nTalvez você queira aumentar o limite manualmente ou instalar pkexec, o que permite que Ryujinx ajude com isso.", "ru_RU": "Текущее значение vm.max_map_count ({0}) меньше, чем {1}. Некоторые игры могут попытаться создать большую разметку памяти, чем разрешено в данный момент. Ryujinx вылетит как только этот лимит будет превышен.\n\nВозможно, вам потребуется вручную увеличить лимит или установить pkexec, что позволит Ryujinx помочь справиться с превышением лимита.", + "sv_SE": "Det aktuella värdet för vm.max_map_count ({0}) är lägre än {1}. Vissa spel kan försöka att skapa fler minnesmappningar än vad som tillåts. Ryujinx kommer att krascha så snart som denna gräns överstigs.\n\nDu kanske vill manuellt öka gränsen eller installera pkexec, vilket tillåter att Ryujinx hjälper till med det.", "th_TH": "ค่าปัจจุบันของ vm.max_map_count ({0}) มีค่าต่ำกว่า {1} บางเกมอาจพยายามใช้หน่วยความจำมากกว่าที่ได้รับอนุญาตในปัจจุบัน Ryujinx จะปิดตัวลงเมื่อเกินขีดจำกัดนี้\n\nคุณอาจต้องการตั้งค่าเพิ่มขีดจำกัดด้วยตนเองหรือติดตั้ง pkexec ซึ่งอนุญาตให้ Ryujinx ช่วยเหลือคุณได้", "tr_TR": "Şu anki vm.max_map_count değeri {0}, bu {1} değerinden daha az. Bazı oyunlar şu an izin verilen bellek haritası limitinden daha fazlasını yaratmaya çalışabilir. Ryujinx bu limitin geçildiği takdirde kendini kapatıcaktır.\n\nManuel olarak bu limiti arttırmayı deneyebilir ya da pkexec'i yükleyebilirsiniz, bu da Ryujinx'in yardımcı olmasına izin verir.", "uk_UA": "Поточне значення vm.max_map_count ({0}) менше за {1}. Деякі ігри можуть спробувати створити більше відображень пам’яті, ніж дозволено наразі. Ryujinx завершить роботу, щойно цей ліміт буде перевищено.\n\nВи можете збільшити ліміт вручну або встановити pkexec, який дозволяє Ryujinx допомогти з цим.", @@ -2726,6 +2839,7 @@ "pl_PL": "Ustawienia", "pt_BR": "Configurações", "ru_RU": "Параметры", + "sv_SE": "Inställningar", "th_TH": "ตั้งค่า", "tr_TR": "Ayarlar", "uk_UA": "Налаштування", @@ -2750,6 +2864,7 @@ "pl_PL": "Interfejs użytkownika", "pt_BR": "Geral", "ru_RU": "Интерфейс", + "sv_SE": "Användargränssnitt", "th_TH": "หน้าจอผู้ใช้", "tr_TR": "Kullancı Arayüzü", "uk_UA": "Інтерфейс користувача", @@ -2774,6 +2889,7 @@ "pl_PL": "Ogólne", "pt_BR": "Geral", "ru_RU": "Общее", + "sv_SE": "Allmänt", "th_TH": "ทั่วไป", "tr_TR": "Genel", "uk_UA": "Загальні", @@ -2798,6 +2914,7 @@ "pl_PL": "Włącz Bogatą Obecność Discord", "pt_BR": "Habilitar Rich Presence do Discord", "ru_RU": "Статус активности в Discord", + "sv_SE": "Aktivera Discord Rich Presence", "th_TH": "เปิดใช้งาน Discord Rich Presence", "tr_TR": "Discord Zengin İçerik'i Etkinleştir", "uk_UA": "Увімкнути розширену присутність Discord", @@ -2822,6 +2939,7 @@ "pl_PL": "Sprawdzaj aktualizacje przy uruchomieniu", "pt_BR": "Verificar se há atualizações ao iniciar", "ru_RU": "Проверять наличие обновлений при запуске", + "sv_SE": "Leta efter uppdatering vid uppstart", "th_TH": "ตรวจหาการอัปเดตเมื่อเปิดโปรแกรม", "tr_TR": "Her Açılışta Güncellemeleri Denetle", "uk_UA": "Перевіряти наявність оновлень під час запуску", @@ -2846,6 +2964,7 @@ "pl_PL": "Pokazuj okno dialogowe \"Potwierdź wyjście\"", "pt_BR": "Exibir diálogo de confirmação ao sair", "ru_RU": "Подтверждать выход из приложения", + "sv_SE": "Visa \"Bekräfta avslut\"-dialog", "th_TH": "แสดง \"ปุ่มยืนยันการออก\" เมื่อออกเกม", "tr_TR": "\"Çıkışı Onayla\" Diyaloğunu Göster", "uk_UA": "Показати діалогове вікно «Підтвердити вихід».", @@ -2870,6 +2989,7 @@ "pl_PL": "", "pt_BR": "Lembrar tamanho/posição da Janela", "ru_RU": "Запомнить размер/положение окна", + "sv_SE": "Kom ihåg fönstrets storlek/position", "th_TH": "จดจำ ขนาดหน้าต่างแอพพลิเคชั่น/คำแหน่ง", "tr_TR": "", "uk_UA": "Запам'ятати Розмір/Позицію вікна", @@ -2894,6 +3014,7 @@ "pl_PL": "", "pt_BR": "", "ru_RU": "", + "sv_SE": "Visa titelrad (kräver omstart)", "th_TH": "", "tr_TR": "", "uk_UA": "Показувати рядок заголовка (Потрібен перезапуск)", @@ -2918,6 +3039,7 @@ "pl_PL": "Ukryj kursor:", "pt_BR": "Esconder o cursor do mouse:", "ru_RU": "Скрывать курсор", + "sv_SE": "Dölj markör:", "th_TH": "ซ่อน เคอร์เซอร์:", "tr_TR": "İşaretçiyi Gizle:", "uk_UA": "Сховати вказівник:", @@ -2942,6 +3064,7 @@ "pl_PL": "Nigdy", "pt_BR": "Nunca", "ru_RU": "Никогда", + "sv_SE": "Aldrig", "th_TH": "ไม่ต้อง", "tr_TR": "Hiçbir Zaman", "uk_UA": "Ніколи", @@ -2966,6 +3089,7 @@ "pl_PL": "Gdy bezczynny", "pt_BR": "Esconder o cursor quando ocioso", "ru_RU": "В простое", + "sv_SE": "Vid overksam", "th_TH": "เมื่อไม่ได้ใช้งาน", "tr_TR": "Hareketsiz Durumda", "uk_UA": "Сховати у режимі очікування", @@ -2990,6 +3114,7 @@ "pl_PL": "Zawsze", "pt_BR": "Sempre", "ru_RU": "Всегда", + "sv_SE": "Alltid", "th_TH": "ตลอดเวลา", "tr_TR": "Her Zaman", "uk_UA": "Завжди", @@ -3014,6 +3139,7 @@ "pl_PL": "Katalogi gier", "pt_BR": "Diretórios de jogo", "ru_RU": "Папки с играми", + "sv_SE": "Spelkataloger", "th_TH": "ไดเรกทอรี่ของเกม", "tr_TR": "Oyun Dizinleri", "uk_UA": "Тека ігор", @@ -3038,6 +3164,7 @@ "pl_PL": "", "pt_BR": "Carregar Automaticamente Diretórios de DLC/Atualizações", "ru_RU": "", + "sv_SE": "Läs automatisk in DLC/speluppdateringar", "th_TH": "โหลดไดเรกทอรี DLC/ไฟล์อัปเดต อัตโนมัติ", "tr_TR": "", "uk_UA": "Автозавантаження каталогів DLC/Оновлень", @@ -3062,6 +3189,7 @@ "pl_PL": "", "pt_BR": "DLCs e Atualizações que se referem a arquivos ausentes serão descarregadas automaticamente", "ru_RU": "", + "sv_SE": "DLC och speluppdateringar som refererar till saknade filer kommer inte att läsas in automatiskt", "th_TH": "", "tr_TR": "", "uk_UA": "DLC та Оновлення, які посилаються на відсутні файли, будуть автоматично вимкнуті.", @@ -3086,6 +3214,7 @@ "pl_PL": "Dodaj", "pt_BR": "Adicionar", "ru_RU": "Добавить", + "sv_SE": "Lägg till", "th_TH": "เพิ่ม", "tr_TR": "Ekle", "uk_UA": "Додати", @@ -3110,6 +3239,7 @@ "pl_PL": "Usuń", "pt_BR": "Remover", "ru_RU": "Удалить", + "sv_SE": "Ta bort", "th_TH": "เอาออก", "tr_TR": "Kaldır", "uk_UA": "Видалити", @@ -3134,6 +3264,7 @@ "pl_PL": "", "pt_BR": "Sistema", "ru_RU": "Система", + "sv_SE": "System", "th_TH": "ระบบ", "tr_TR": "Sistem", "uk_UA": "Система", @@ -3158,6 +3289,7 @@ "pl_PL": "Główne", "pt_BR": "Principal", "ru_RU": "Основные настройки", + "sv_SE": "Kärna", "th_TH": "แกนกลาง", "tr_TR": "Çekirdek", "uk_UA": "Ядро", @@ -3182,6 +3314,7 @@ "pl_PL": "Region systemu:", "pt_BR": "Região do sistema:", "ru_RU": "Регион прошивки:", + "sv_SE": "Systemregion:", "th_TH": "ภูมิภาคของระบบ:", "tr_TR": "Sistem Bölgesi:", "uk_UA": "Регіон системи:", @@ -3206,6 +3339,7 @@ "pl_PL": "Japonia", "pt_BR": "Japão", "ru_RU": "Япония", + "sv_SE": "Japan", "th_TH": "ญี่ปุ่น", "tr_TR": "Japonya", "uk_UA": "Японія", @@ -3230,6 +3364,7 @@ "pl_PL": "Stany Zjednoczone", "pt_BR": "EUA", "ru_RU": "США", + "sv_SE": "USA", "th_TH": "สหรัฐอเมริกา", "tr_TR": "ABD", "uk_UA": "США", @@ -3254,6 +3389,7 @@ "pl_PL": "Europa", "pt_BR": "Europa", "ru_RU": "Европа", + "sv_SE": "Europa", "th_TH": "ยุโรป", "tr_TR": "Avrupa", "uk_UA": "Європа", @@ -3278,6 +3414,7 @@ "pl_PL": "", "pt_BR": "Austrália", "ru_RU": "Австралия", + "sv_SE": "Australien", "th_TH": "ออสเตรเลีย", "tr_TR": "Avustralya", "uk_UA": "Австралія", @@ -3302,6 +3439,7 @@ "pl_PL": "Chiny", "pt_BR": "", "ru_RU": "Китай", + "sv_SE": "Kina", "th_TH": "จีน", "tr_TR": "Çin", "uk_UA": "Китай", @@ -3326,6 +3464,7 @@ "pl_PL": "", "pt_BR": "Coreia", "ru_RU": "Корея", + "sv_SE": "Korea", "th_TH": "เกาหลี", "tr_TR": "Kore", "uk_UA": "Корея", @@ -3350,6 +3489,7 @@ "pl_PL": "Tajwan", "pt_BR": "", "ru_RU": "Тайвань", + "sv_SE": "Taiwan", "th_TH": "ไต้หวัน", "tr_TR": "Tayvan", "uk_UA": "Тайвань", @@ -3374,6 +3514,7 @@ "pl_PL": "Język systemu:", "pt_BR": "Idioma do sistema:", "ru_RU": "Язык прошивки:", + "sv_SE": "Systemspråk:", "th_TH": "ภาษาของระบบ:", "tr_TR": "Sistem Dili:", "uk_UA": "Мова системи:", @@ -3398,6 +3539,7 @@ "pl_PL": "Japoński", "pt_BR": "Japonês", "ru_RU": "Японский", + "sv_SE": "Japanska", "th_TH": "ญี่ปุ่น", "tr_TR": "Japonca", "uk_UA": "Японська", @@ -3422,6 +3564,7 @@ "pl_PL": "Angielski (Stany Zjednoczone)", "pt_BR": "Inglês americano", "ru_RU": "Английский (США)", + "sv_SE": "Amerikansk engelska", "th_TH": "อังกฤษ (อเมริกัน)", "tr_TR": "Amerikan İngilizcesi", "uk_UA": "Англійська (США)", @@ -3446,6 +3589,7 @@ "pl_PL": "Francuski", "pt_BR": "Francês", "ru_RU": "Французский", + "sv_SE": "Franska", "th_TH": "ฝรั่งเศส", "tr_TR": "Fransızca", "uk_UA": "Французька", @@ -3470,6 +3614,7 @@ "pl_PL": "Niemiecki", "pt_BR": "Alemão", "ru_RU": "Германский", + "sv_SE": "Tyska", "th_TH": "เยอรมัน", "tr_TR": "Almanca", "uk_UA": "Німецька", @@ -3494,6 +3639,7 @@ "pl_PL": "Włoski", "pt_BR": "Italiano", "ru_RU": "Итальянский", + "sv_SE": "Italienska", "th_TH": "อิตาลี", "tr_TR": "İtalyanca", "uk_UA": "Італійська", @@ -3518,6 +3664,7 @@ "pl_PL": "Hiszpański", "pt_BR": "Espanhol", "ru_RU": "Испанский", + "sv_SE": "Spanska", "th_TH": "สเปน", "tr_TR": "İspanyolca", "uk_UA": "Іспанська", @@ -3542,6 +3689,7 @@ "pl_PL": "Chiński", "pt_BR": "Chinês", "ru_RU": "Китайский", + "sv_SE": "Kinesiska", "th_TH": "จีน", "tr_TR": "Çince", "uk_UA": "Китайська", @@ -3566,6 +3714,7 @@ "pl_PL": "Koreański", "pt_BR": "Coreano", "ru_RU": "Корейский", + "sv_SE": "Koreanska", "th_TH": "เกาหลี", "tr_TR": "Korece", "uk_UA": "Корейська", @@ -3590,6 +3739,7 @@ "pl_PL": "Holenderski", "pt_BR": "Holandês", "ru_RU": "Нидерландский", + "sv_SE": "Nederländska", "th_TH": "ดัตช์", "tr_TR": "Flemenkçe", "uk_UA": "Нідерландська", @@ -3614,6 +3764,7 @@ "pl_PL": "Portugalski", "pt_BR": "Português", "ru_RU": "Португальский", + "sv_SE": "Portugisiska", "th_TH": "โปรตุเกส", "tr_TR": "Portekizce", "uk_UA": "Португальська", @@ -3638,6 +3789,7 @@ "pl_PL": "Rosyjski", "pt_BR": "Russo", "ru_RU": "Русский", + "sv_SE": "Ryska", "th_TH": "รัสเซีย", "tr_TR": "Rusça", "uk_UA": "Російська", @@ -3662,6 +3814,7 @@ "pl_PL": "Tajwański", "pt_BR": "Taiwanês", "ru_RU": "Тайванский", + "sv_SE": "Taiwanesiska", "th_TH": "จีนตัวเต็ม (ไต้หวัน)", "tr_TR": "Tayvanca", "uk_UA": "Тайванська", @@ -3686,6 +3839,7 @@ "pl_PL": "Angielski (Wielka Brytania)", "pt_BR": "Inglês britânico", "ru_RU": "Английский (Британия)", + "sv_SE": "Brittisk engelska", "th_TH": "อังกฤษ (บริติช)", "tr_TR": "İngiliz İngilizcesi", "uk_UA": "Англійська (Великобританія)", @@ -3710,6 +3864,7 @@ "pl_PL": "Kanadyjski Francuski", "pt_BR": "Francês canadense", "ru_RU": "Французский (Канада)", + "sv_SE": "Kanadensisk franska", "th_TH": "ฝรั่งเศส (แคนาดา)", "tr_TR": "Kanada Fransızcası", "uk_UA": "Французька (Канада)", @@ -3734,6 +3889,7 @@ "pl_PL": "Hiszpański (Ameryka Łacińska)", "pt_BR": "Espanhol latino", "ru_RU": "Испанский (Латинская Америка)", + "sv_SE": "Latinamerikansk spanska", "th_TH": "สเปน (ลาตินอเมริกา)", "tr_TR": "Latin Amerika İspanyolcası", "uk_UA": "Іспанська (Латиноамериканська)", @@ -3758,6 +3914,7 @@ "pl_PL": "Chiński (Uproszczony)", "pt_BR": "Chinês simplificado", "ru_RU": "Китайский (упрощённый)", + "sv_SE": "Förenklad kinesiska", "th_TH": "จีน (ตัวย่อ)", "tr_TR": "Basitleştirilmiş Çince", "uk_UA": "Спрощена китайська", @@ -3782,6 +3939,7 @@ "pl_PL": "Chiński (Tradycyjny)", "pt_BR": "Chinês tradicional", "ru_RU": "Китайский (традиционный)", + "sv_SE": "Traditionell kinesiska", "th_TH": "จีน (ดั้งเดิม)", "tr_TR": "Geleneksel Çince", "uk_UA": "Традиційна китайська", @@ -3806,6 +3964,7 @@ "pl_PL": "Strefa czasowa systemu:", "pt_BR": "Fuso horário do sistema:", "ru_RU": "Часовой пояс прошивки:", + "sv_SE": "Systemets tidszon:", "th_TH": "เขตเวลาของระบบ:", "tr_TR": "Sistem Saat Dilimi:", "uk_UA": "Часовий пояс системи:", @@ -3830,6 +3989,7 @@ "pl_PL": "Czas systemu:", "pt_BR": "Hora do sistema:", "ru_RU": "Системное время в прошивке:", + "sv_SE": "Systemtid:", "th_TH": "เวลาของระบบ:", "tr_TR": "Sistem Saati:", "uk_UA": "Час системи:", @@ -3854,6 +4014,7 @@ "pl_PL": "", "pt_BR": "", "ru_RU": "", + "sv_SE": "Återsynka till datorns datum och tid", "th_TH": "", "tr_TR": "", "uk_UA": "", @@ -3878,6 +4039,7 @@ "pl_PL": "PPTC (Profilowana pamięć podręczna trwałych łłumaczeń)", "pt_BR": "Habilitar PPTC (Profiled Persistent Translation Cache)", "ru_RU": "Использовать PPTC (Profiled Persistent Translation Cache)", + "sv_SE": "PPTC (Profilerad bestående översättningscache)", "th_TH": "PPTC (แคชโปรไฟล์การแปลแบบถาวร)", "tr_TR": "PPTC (Profilli Sürekli Çeviri Önbelleği)", "uk_UA": "PPTC (профільований постійний кеш перекладу)", @@ -3902,6 +4064,7 @@ "pl_PL": "Low-power PPTC", "pt_BR": "Low-power PPTC", "ru_RU": "Low-power PPTC", + "sv_SE": "PPTC med låg strömförbrukning", "th_TH": "PPTC แบบพลังงานตํ่า", "tr_TR": "Low-power PPTC", "uk_UA": "Low-power PPTC", @@ -3926,6 +4089,7 @@ "pl_PL": "Sprawdzanie integralności systemu plików", "pt_BR": "Habilitar verificação de integridade do sistema de arquivos", "ru_RU": "Проверка целостности файловой системы", + "sv_SE": "Integritetskontroller av filsystem", "th_TH": "ตรวจสอบความถูกต้องของ FS", "tr_TR": "FS Bütünlük Kontrolleri", "uk_UA": "Перевірка цілісності FS", @@ -3950,6 +4114,7 @@ "pl_PL": "Backend Dżwięku:", "pt_BR": "Biblioteca de saída de áudio:", "ru_RU": "Аудио бэкенд:", + "sv_SE": "Ljudbakände:", "th_TH": "ระบบเสียงเบื้องหลัง:", "tr_TR": "Ses Motoru:", "uk_UA": "Аудіосистема:", @@ -3974,6 +4139,7 @@ "pl_PL": "Atrapa", "pt_BR": "Nenhuma", "ru_RU": "Без звука", + "sv_SE": "Dummy", "th_TH": "", "tr_TR": "Yapay", "uk_UA": "", @@ -3998,6 +4164,7 @@ "pl_PL": "", "pt_BR": "", "ru_RU": "", + "sv_SE": "OpenAL", "th_TH": "", "tr_TR": "", "uk_UA": "", @@ -4022,6 +4189,7 @@ "pl_PL": "", "pt_BR": "", "ru_RU": "", + "sv_SE": "SoundIO", "th_TH": "", "tr_TR": "", "uk_UA": "", @@ -4046,6 +4214,7 @@ "pl_PL": "", "pt_BR": "", "ru_RU": "", + "sv_SE": "SDL2", "th_TH": "", "tr_TR": "", "uk_UA": "", @@ -4070,6 +4239,7 @@ "pl_PL": "Hacki", "pt_BR": "", "ru_RU": "Хаки", + "sv_SE": "Hack", "th_TH": "แฮ็ก", "tr_TR": "Hack'ler", "uk_UA": "Хитрощі", @@ -4094,6 +4264,7 @@ "pl_PL": " (mogą powodować niestabilność)", "pt_BR": " (Pode causar instabilidade)", "ru_RU": "Возможна нестабильная работа", + "sv_SE": "Kan orsaka instabilitet", "th_TH": "อาจทำให้เกิดข้อผิดพลาดได้", "tr_TR": " (dengesizlik oluşturabilir)", "uk_UA": " (може викликати нестабільність)", @@ -4118,6 +4289,7 @@ "pl_PL": "Użyj alternatywnego układu pamięci (Deweloperzy)", "pt_BR": "Tamanho da DRAM:", "ru_RU": "Использовать альтернативный макет памяти (для разработчиков)", + "sv_SE": "DRAM-storlek:", "th_TH": "ใช้หน่วยความจำสำรอง (โหมดนักพัฒนา)", "tr_TR": "Alternatif bellek düzeni kullan (Geliştirici)", "uk_UA": "Використовувати альтернативне розташування пам'яті (для розробників)", @@ -4142,6 +4314,7 @@ "pl_PL": "", "pt_BR": "", "ru_RU": "", + "sv_SE": "4GiB", "th_TH": "", "tr_TR": "", "uk_UA": "4Гб", @@ -4166,6 +4339,7 @@ "pl_PL": "", "pt_BR": "", "ru_RU": "", + "sv_SE": "6GiB", "th_TH": "", "tr_TR": "", "uk_UA": "6Гб", @@ -4190,6 +4364,7 @@ "pl_PL": "", "pt_BR": "", "ru_RU": "", + "sv_SE": "8GiB", "th_TH": "", "tr_TR": "", "uk_UA": "8Гб", @@ -4214,6 +4389,7 @@ "pl_PL": "", "pt_BR": "", "ru_RU": "", + "sv_SE": "12GiB", "th_TH": "", "tr_TR": "", "uk_UA": "12Гб", @@ -4238,6 +4414,7 @@ "pl_PL": "Ignoruj Brakujące Usługi", "pt_BR": "Ignorar serviços não implementados", "ru_RU": "Игнорировать отсутствующие службы", + "sv_SE": "Ignorera saknade tjänster", "th_TH": "เมินเฉยบริการที่หายไป", "tr_TR": "Eksik Servisleri Görmezden Gel", "uk_UA": "Ігнорувати відсутні служби", @@ -4262,6 +4439,7 @@ "pl_PL": "Ignoruj ​​aplet", "pt_BR": "Ignorar applet", "ru_RU": "Игнорировать Апплет", + "sv_SE": "Ignorera applet", "th_TH": "เมินเฉย Applet", "tr_TR": "", "uk_UA": "Ігнорувати Аплет", @@ -4286,6 +4464,7 @@ "pl_PL": "Grafika", "pt_BR": "Gráficos", "ru_RU": "Графика", + "sv_SE": "Grafik", "th_TH": "กราฟฟิก", "tr_TR": "Grafikler", "uk_UA": "Графіка", @@ -4310,6 +4489,7 @@ "pl_PL": "Graficzne API", "pt_BR": "API gráfica", "ru_RU": "Графические API", + "sv_SE": "Grafik-API", "th_TH": "API กราฟฟิก", "tr_TR": "Grafikler API", "uk_UA": "Графічний API", @@ -4334,6 +4514,7 @@ "pl_PL": "Włącz pamięć podręczną cieni", "pt_BR": "Habilitar cache de shader", "ru_RU": "Кэшировать шейдеры", + "sv_SE": "Aktivera Shader Cache", "th_TH": "เปิดใช้งาน แคชแสงเงา", "tr_TR": "Shader Önbelleğini Etkinleştir", "uk_UA": "Увімкнути кеш шейдерів", @@ -4358,6 +4539,7 @@ "pl_PL": "Filtrowanie anizotropowe:", "pt_BR": "Filtragem anisotrópica:", "ru_RU": "Анизотропная фильтрация:", + "sv_SE": "Anisotropisk filtrering:", "th_TH": "ตัวกรองแบบ Anisotropic:", "tr_TR": "Eşyönsüz Doku Süzmesi:", "uk_UA": "Анізотропна фільтрація:", @@ -4382,6 +4564,7 @@ "pl_PL": "Automatyczne", "pt_BR": "Automático", "ru_RU": "Автоматически", + "sv_SE": "Automatiskt", "th_TH": "อัตโนมัติ", "tr_TR": "Otomatik", "uk_UA": "Авто", @@ -4406,6 +4589,7 @@ "pl_PL": "", "pt_BR": "", "ru_RU": "", + "sv_SE": "2x", "th_TH": "", "tr_TR": "", "uk_UA": "", @@ -4430,6 +4614,7 @@ "pl_PL": "", "pt_BR": "", "ru_RU": "", + "sv_SE": "4x", "th_TH": "", "tr_TR": "", "uk_UA": "", @@ -4454,6 +4639,7 @@ "pl_PL": "", "pt_BR": "", "ru_RU": "", + "sv_SE": "8x", "th_TH": "", "tr_TR": "", "uk_UA": "", @@ -4478,6 +4664,7 @@ "pl_PL": "", "pt_BR": "", "ru_RU": "", + "sv_SE": "16x", "th_TH": "", "tr_TR": "", "uk_UA": "", @@ -4502,6 +4689,7 @@ "pl_PL": "Skalowanie rozdzielczości:", "pt_BR": "Escala de resolução:", "ru_RU": "Масштабирование:", + "sv_SE": "Upplösningsskalning:", "th_TH": "อัตราส่วนความละเอียด:", "tr_TR": "Çözünürlük Ölçeği:", "uk_UA": "Роздільна здатність:", @@ -4526,6 +4714,7 @@ "pl_PL": "Niestandardowa (Niezalecane)", "pt_BR": "Customizada (não recomendado)", "ru_RU": "Пользовательское (не рекомендуется)", + "sv_SE": "Anpassad (rekommenderas inte)", "th_TH": "กำหนดเอง (ไม่แนะนำ)", "tr_TR": "Özel (Tavsiye Edilmez)", "uk_UA": "Користувацька (не рекомендовано)", @@ -4550,6 +4739,7 @@ "pl_PL": "Natywna (720p/1080p)", "pt_BR": "Nativa (720p/1080p)", "ru_RU": "Нативное (720p/1080p)", + "sv_SE": "Inbyggd (720p/1080p)", "th_TH": "พื้นฐานระบบ (720p/1080p)", "tr_TR": "Yerel (720p/1080p)", "uk_UA": "Стандартний (720p/1080p)", @@ -4574,6 +4764,7 @@ "pl_PL": "", "pt_BR": "", "ru_RU": "", + "sv_SE": "2x (1440p/2160p)", "th_TH": "", "tr_TR": "", "uk_UA": "", @@ -4598,6 +4789,7 @@ "pl_PL": "", "pt_BR": "", "ru_RU": "", + "sv_SE": "3x (2160p/3240p)", "th_TH": "", "tr_TR": "", "uk_UA": "", @@ -4622,6 +4814,7 @@ "pl_PL": "4x (2880p/4320p) (niezalecane)", "pt_BR": "4x (2880p/4320p) (não recomendado)", "ru_RU": "4x (2880p/4320p) (не рекомендуется)", + "sv_SE": "4x (2880p/4320p) (rekommenderas inte)", "th_TH": "4x (2880p/4320p) (ไม่แนะนำ)", "tr_TR": "4x (2880p/4320p) (Tavsiye Edilmez)", "uk_UA": "4x (2880p/4320p) (Не рекомендується)", @@ -4646,6 +4839,7 @@ "pl_PL": "Format obrazu:", "pt_BR": "Proporção:", "ru_RU": "Соотношение сторон:", + "sv_SE": "Bildförhållande:", "th_TH": "อัตราส่วนภาพ:", "tr_TR": "En-Boy Oranı:", "uk_UA": "Співвідношення сторін:", @@ -4670,6 +4864,7 @@ "pl_PL": "", "pt_BR": "", "ru_RU": "", + "sv_SE": "4:3", "th_TH": "", "tr_TR": "", "uk_UA": "", @@ -4694,6 +4889,7 @@ "pl_PL": "", "pt_BR": "", "ru_RU": "", + "sv_SE": "16:9", "th_TH": "", "tr_TR": "", "uk_UA": "", @@ -4718,6 +4914,7 @@ "pl_PL": "", "pt_BR": "", "ru_RU": "", + "sv_SE": "16:10", "th_TH": "", "tr_TR": "", "uk_UA": "", @@ -4742,6 +4939,7 @@ "pl_PL": "", "pt_BR": "", "ru_RU": "", + "sv_SE": "21:9", "th_TH": "", "tr_TR": "", "uk_UA": "", @@ -4766,6 +4964,7 @@ "pl_PL": "", "pt_BR": "", "ru_RU": "", + "sv_SE": "32:9", "th_TH": "", "tr_TR": "", "uk_UA": "", @@ -4790,6 +4989,7 @@ "pl_PL": "Rozciągnij do Okna", "pt_BR": "Esticar até caber", "ru_RU": "Растянуть до размеров окна", + "sv_SE": "Sträck ut för att passa fönster", "th_TH": "ยืดภาพเพื่อให้พอดีกับหน้าต่าง", "tr_TR": "Pencereye Sığdırmak İçin Genişlet", "uk_UA": "Розтягнути до розміру вікна", @@ -4814,6 +5014,7 @@ "pl_PL": "Opcje programisty", "pt_BR": "Opções do desenvolvedor", "ru_RU": "Параметры разработчика", + "sv_SE": "Utvecklarinställningar", "th_TH": "ตัวเลือกนักพัฒนา", "tr_TR": "Geliştirici Seçenekleri", "uk_UA": "Параметри розробника", @@ -4838,6 +5039,7 @@ "pl_PL": "Ścieżka do zgranych cieni graficznych:", "pt_BR": "Diretório para despejo de shaders:", "ru_RU": "Путь дампа графических шейдеров", + "sv_SE": "Sökväg för Graphics Shader Dump:", "th_TH": "ที่เก็บ ดัมพ์ไฟล์ แสงเงา:", "tr_TR": "Grafik Shader Döküm Yolu:", "uk_UA": "Шлях скидання графічного шейдера:", @@ -4862,6 +5064,7 @@ "pl_PL": "Dziennik zdarzeń", "pt_BR": "Log", "ru_RU": "Журналирование", + "sv_SE": "Loggning", "th_TH": "ประวัติ", "tr_TR": "Loglama", "uk_UA": "Налагодження", @@ -4886,6 +5089,7 @@ "pl_PL": "Dziennik zdarzeń", "pt_BR": "Log", "ru_RU": "Журналирование", + "sv_SE": "Loggning", "th_TH": "ประวัติ", "tr_TR": "Loglama", "uk_UA": "Налагодження", @@ -4910,6 +5114,7 @@ "pl_PL": "Włącz rejestrowanie zdarzeń do pliku", "pt_BR": "Salvar logs em arquivo", "ru_RU": "Включить запись в файл", + "sv_SE": "Aktivera loggning till fil", "th_TH": "เปิดใช้งานการบันทึกประวัติ ไปยังไฟล์", "tr_TR": "Logları Dosyaya Kaydetmeyi Etkinleştir", "uk_UA": "Увімкнути налагодження у файл", @@ -4934,6 +5139,7 @@ "pl_PL": "Wlącz Skróty Logów", "pt_BR": "Habilitar logs de stub", "ru_RU": "Включить журнал-заглушку", + "sv_SE": "Aktivera stubbloggar", "th_TH": "เปิดใช้งานการบันทึกประวัติ", "tr_TR": "Stub Loglarını Etkinleştir", "uk_UA": "Увімкнути журнали заглушки", @@ -4958,6 +5164,7 @@ "pl_PL": "Włącz Logi Informacyjne", "pt_BR": "Habilitar logs de informação", "ru_RU": "Включить информационный журнал", + "sv_SE": "Aktivera informationsloggar", "th_TH": "เปิดใช้งานการบันทึกประวัติการใช้งาน", "tr_TR": "Bilgi Loglarını Etkinleştir", "uk_UA": "Увімкнути інформаційні журнали", @@ -4982,6 +5189,7 @@ "pl_PL": "Włącz Logi Ostrzeżeń", "pt_BR": "Habilitar logs de alerta", "ru_RU": "Включить журнал предупреждений", + "sv_SE": "Aktivera varningsloggar", "th_TH": "เปิดใช้งานการบันทึกประวัติคำเตือน", "tr_TR": "Uyarı Loglarını Etkinleştir", "uk_UA": "Увімкнути журнали попереджень", @@ -5006,6 +5214,7 @@ "pl_PL": "Włącz Logi Błędów", "pt_BR": "Habilitar logs de erro", "ru_RU": "Включить журнал ошибок", + "sv_SE": "Aktivera felloggar", "th_TH": "เปิดใช้งานการบันทึกประวัติข้อผิดพลาด", "tr_TR": "Hata Loglarını Etkinleştir", "uk_UA": "Увімкнути журнали помилок", @@ -5030,6 +5239,7 @@ "pl_PL": "Włącz Logi Śledzenia", "pt_BR": "Habilitar logs de rastreamento", "ru_RU": "Включить журнал трассировки", + "sv_SE": "Aktivera spårloggar", "th_TH": "เปิดใช้งานการบันทึกประวัติการติดตาม", "tr_TR": "Trace Loglarını Etkinleştir", "uk_UA": "Увімкнути журнали трасування", @@ -5054,6 +5264,7 @@ "pl_PL": "Włącz Logi Gości", "pt_BR": "Habilitar logs do programa convidado", "ru_RU": "Включить гостевые журналы", + "sv_SE": "Aktivera gästloggar", "th_TH": "เปิดใช้งานการบันทึกประวัติผู้เยี่ยมชม", "tr_TR": "Guest Loglarını Etkinleştir", "uk_UA": "Увімкнути журнали гостей", @@ -5078,6 +5289,7 @@ "pl_PL": "Włącz Logi Dostępu do Systemu Plików", "pt_BR": "Habilitar logs de acesso ao sistema de arquivos", "ru_RU": "Включить журналы доступа файловой системы", + "sv_SE": "Aktivera loggar för filsystemsåtkomst", "th_TH": "เปิดใช้งานการบันทึกประวัติการเข้าถึง Fs", "tr_TR": "Fs Erişim Loglarını Etkinleştir", "uk_UA": "Увімкнути журнали доступу Fs", @@ -5102,6 +5314,7 @@ "pl_PL": "Tryb globalnego dziennika zdarzeń systemu plików:", "pt_BR": "Modo global de logs do sistema de arquivos:", "ru_RU": "Режим журнала глобального доступа файловой системы:", + "sv_SE": "Loggläge för global filsystemsåtkomst:", "th_TH": "โหมด การเข้าถึงประวัติส่วนกลาง:", "tr_TR": "Fs Evrensel Erişim Log Modu:", "uk_UA": "Режим журналу глобального доступу Fs:", @@ -5126,6 +5339,7 @@ "pl_PL": "Opcje programisty (UWAGA: wpływa na wydajność)", "pt_BR": "Opções do desenvolvedor (AVISO: Vai reduzir a performance)", "ru_RU": "Параметры разработчика", + "sv_SE": "Utvecklarinställningar", "th_TH": "ตัวเลือกนักพัฒนา", "tr_TR": "Geliştirici Seçenekleri (UYARI: Performansı düşürecektir)", "uk_UA": "Параметри розробника (УВАГА: шкодить продуктивності!)", @@ -5150,6 +5364,7 @@ "pl_PL": "UWAGA: Pogrorszy wydajność", "pt_BR": "AVISO: Reduzirá o desempenho", "ru_RU": "ВНИМАНИЕ: эти настройки снижают производительность", + "sv_SE": "VARNING: Kommer att reducera prestandan", "th_TH": "คำเตือน: จะทำให้ประสิทธิภาพลดลง", "tr_TR": "UYARI: Oyun performansı azalacak", "uk_UA": "УВАГА: Зміна параметрів нижче негативно впливає на продуктивність", @@ -5174,6 +5389,7 @@ "pl_PL": "Poziom rejestrowania do dziennika zdarzeń Backendu Graficznego:", "pt_BR": "Nível de log do backend gráfico:", "ru_RU": "Уровень журнала бэкенда графики:", + "sv_SE": "Loggnivå för grafikbakände:", "th_TH": "ระดับการบันทึกประวัติ กราฟิกเบื้องหลัง:", "tr_TR": "Grafik Arka Uç Günlük Düzeyi", "uk_UA": "Рівень журналу графічного сервера:", @@ -5198,6 +5414,7 @@ "pl_PL": "Nic", "pt_BR": "Nenhum", "ru_RU": "Нет", + "sv_SE": "Ingen", "th_TH": "ไม่มี", "tr_TR": "Hiçbiri", "uk_UA": "Немає", @@ -5222,6 +5439,7 @@ "pl_PL": "Błędy", "pt_BR": "Erro", "ru_RU": "Ошибка", + "sv_SE": "Fel", "th_TH": "ผิดพลาด", "tr_TR": "Hata", "uk_UA": "Помилка", @@ -5246,6 +5464,7 @@ "pl_PL": "Spowolnienia", "pt_BR": "Lentidão", "ru_RU": "Замедления", + "sv_SE": "Långsamheter", "th_TH": "ช้าลง", "tr_TR": "Yavaşlamalar", "uk_UA": "Уповільнення", @@ -5270,6 +5489,7 @@ "pl_PL": "Wszystko", "pt_BR": "Todos", "ru_RU": "Всё", + "sv_SE": "Alla", "th_TH": "ทั้งหมด", "tr_TR": "Hepsi", "uk_UA": "Все", @@ -5294,6 +5514,7 @@ "pl_PL": "Włącz dzienniki zdarzeń do debugowania", "pt_BR": "Habilitar logs de depuração", "ru_RU": "Включить журнал отладки", + "sv_SE": "Aktivera felsökningsloggar", "th_TH": "เปิดใช้งาน ประวัติข้อบกพร่อง", "tr_TR": "Hata Ayıklama Loglarını Etkinleştir", "uk_UA": "Увімкнути журнали налагодження", @@ -5318,6 +5539,7 @@ "pl_PL": "Sterowanie", "pt_BR": "Controle", "ru_RU": "Управление", + "sv_SE": "Inmatning", "th_TH": "ป้อนข้อมูล", "tr_TR": "Giriş Yöntemi", "uk_UA": "Введення", @@ -5342,6 +5564,7 @@ "pl_PL": "Tryb zadokowany", "pt_BR": "Habilitar modo TV", "ru_RU": "Стационарный режим", + "sv_SE": "Dockat läge", "th_TH": "ด็อกโหมด", "tr_TR": "Docked Modu Etkinleştir", "uk_UA": "Режим док-станції", @@ -5366,6 +5589,7 @@ "pl_PL": "Bezpośredni dostęp do klawiatury", "pt_BR": "Acesso direto ao teclado", "ru_RU": "Прямой ввод клавиатуры", + "sv_SE": "Direkt tangentbordsåtkomst", "th_TH": "เข้าถึงคีย์บอร์ดโดยตรง", "tr_TR": "Doğrudan Klavye Erişimi", "uk_UA": "Прямий доступ з клавіатури", @@ -5390,6 +5614,7 @@ "pl_PL": "Zapisz", "pt_BR": "Salvar", "ru_RU": "Сохранить", + "sv_SE": "Spara", "th_TH": "บันทึก", "tr_TR": "Kaydet", "uk_UA": "Зберегти", @@ -5414,6 +5639,7 @@ "pl_PL": "Zamknij", "pt_BR": "Fechar", "ru_RU": "Закрыть", + "sv_SE": "Stäng", "th_TH": "ปิด", "tr_TR": "Kapat", "uk_UA": "Закрити", @@ -5438,6 +5664,7 @@ "pl_PL": "", "pt_BR": "", "ru_RU": "Ок", + "sv_SE": "Ok", "th_TH": "ตกลง", "tr_TR": "Tamam", "uk_UA": "Гаразд", @@ -5462,6 +5689,7 @@ "pl_PL": "Anuluj", "pt_BR": "Cancelar", "ru_RU": "Отмена", + "sv_SE": "Avbryt", "th_TH": "ยกเลิก", "tr_TR": "İptal", "uk_UA": "Скасувати", @@ -5486,6 +5714,7 @@ "pl_PL": "Zastosuj", "pt_BR": "Aplicar", "ru_RU": "Применить", + "sv_SE": "Verkställ", "th_TH": "นำไปใช้", "tr_TR": "Uygula", "uk_UA": "Застосувати", @@ -5510,6 +5739,7 @@ "pl_PL": "Gracz", "pt_BR": "Jogador", "ru_RU": "Игрок", + "sv_SE": "Spelare", "th_TH": "ผู้เล่น", "tr_TR": "Oyuncu", "uk_UA": "Гравець", @@ -5534,6 +5764,7 @@ "pl_PL": "Gracz 1", "pt_BR": "Jogador 1", "ru_RU": "Игрок 1", + "sv_SE": "Spelare 1", "th_TH": "ผู้เล่นคนที่ 1", "tr_TR": "Oyuncu 1", "uk_UA": "Гравець 1", @@ -5558,6 +5789,7 @@ "pl_PL": "Gracz 2", "pt_BR": "Jogador 2", "ru_RU": "Игрок 2", + "sv_SE": "Spelare 2", "th_TH": "ผู้เล่นคนที่ 2", "tr_TR": "Oyuncu 2", "uk_UA": "Гравець 2", @@ -5582,6 +5814,7 @@ "pl_PL": "Gracz 3", "pt_BR": "Jogador 3", "ru_RU": "Игрок 3", + "sv_SE": "Spelare 3", "th_TH": "ผู้เล่นคนที่ 3", "tr_TR": "Oyuncu 3", "uk_UA": "Гравець 3", @@ -5606,6 +5839,7 @@ "pl_PL": "Gracz 4", "pt_BR": "Jogador 4", "ru_RU": "Игрок 4", + "sv_SE": "Spelare 4", "th_TH": "ผู้เล่นคนที่ 4", "tr_TR": "Oyuncu 4", "uk_UA": "Гравець 4", @@ -5630,6 +5864,7 @@ "pl_PL": "Gracz 5", "pt_BR": "Jogador 5", "ru_RU": "Игрок 5", + "sv_SE": "Spelare 5", "th_TH": "ผู้เล่นคนที่ 5", "tr_TR": "Oyuncu 5", "uk_UA": "Гравець 5", @@ -5654,6 +5889,7 @@ "pl_PL": "Gracz 6", "pt_BR": "Jogador 6", "ru_RU": "Игрок 6", + "sv_SE": "Spelare 6", "th_TH": "ผู้เล่นคนที่ 6", "tr_TR": "Oyuncu 6", "uk_UA": "Гравець 6", @@ -5678,6 +5914,7 @@ "pl_PL": "Gracz 7", "pt_BR": "Jogador 7", "ru_RU": "Игрок 7", + "sv_SE": "Spelare 7", "th_TH": "ผู้เล่นคนที่ 7", "tr_TR": "Oyuncu 7", "uk_UA": "Гравець 7", @@ -5702,6 +5939,7 @@ "pl_PL": "Gracz 8", "pt_BR": "Jogador 8", "ru_RU": "Игрок 8", + "sv_SE": "Spelare 8", "th_TH": "ผู้เล่นคนที่ 8", "tr_TR": "Oyuncu 8", "uk_UA": "Гравець 8", @@ -5726,6 +5964,7 @@ "pl_PL": "Przenośny", "pt_BR": "Portátil", "ru_RU": "Портативный", + "sv_SE": "Handhållen", "th_TH": "แฮนด์เฮลด์โหมด", "tr_TR": "Portatif Mod", "uk_UA": "Портативний", @@ -5750,6 +5989,7 @@ "pl_PL": "Urządzenie wejściowe", "pt_BR": "Dispositivo de entrada", "ru_RU": "Устройство ввода", + "sv_SE": "Inmatningsenhet", "th_TH": "อุปกรณ์ป้อนข้อมูล", "tr_TR": "Giriş Cihazı", "uk_UA": "Пристрій введення", @@ -5774,6 +6014,7 @@ "pl_PL": "Odśwież", "pt_BR": "Atualizar", "ru_RU": "Обновить", + "sv_SE": "Uppdatera", "th_TH": "รีเฟรช", "tr_TR": "Yenile", "uk_UA": "Оновити", @@ -5798,6 +6039,7 @@ "pl_PL": "Wyłączone", "pt_BR": "Desabilitado", "ru_RU": "Отключить", + "sv_SE": "Inaktiverad", "th_TH": "ปิดการใช้งาน", "tr_TR": "Devre Dışı", "uk_UA": "Вимкнено", @@ -5822,6 +6064,7 @@ "pl_PL": "Typ kontrolera", "pt_BR": "Tipo do controle", "ru_RU": "Тип контроллера", + "sv_SE": "Kontrollertyp", "th_TH": "ประเภทคอนโทรลเลอร์", "tr_TR": "Kumanda Tipi", "uk_UA": "Тип контролера", @@ -5846,6 +6089,7 @@ "pl_PL": "Przenośny", "pt_BR": "Portátil", "ru_RU": "Портативный", + "sv_SE": "Handhållen", "th_TH": "แฮนด์เฮลด์", "tr_TR": "Portatif Mod", "uk_UA": "Портативний", @@ -5870,6 +6114,7 @@ "pl_PL": "Pro Kontroler", "pt_BR": "", "ru_RU": "", + "sv_SE": "Pro Controller", "th_TH": "โปรคอนโทรลเลอร์", "tr_TR": "Profesyonel Kumanda", "uk_UA": "Контролер Pro", @@ -5894,6 +6139,7 @@ "pl_PL": "Para JoyCon-ów", "pt_BR": "Par de JoyCon", "ru_RU": "JoyCon (пара)", + "sv_SE": "JoyCon (par)", "th_TH": "จับคู่ จอยคอน", "tr_TR": "JoyCon Çifti", "uk_UA": "Обидва JoyCon", @@ -5918,6 +6164,7 @@ "pl_PL": "Lewy JoyCon", "pt_BR": "JoyCon esquerdo", "ru_RU": "JoyCon (левый)", + "sv_SE": "JoyCon vänster", "th_TH": "จอยคอน ด้านซ้าย", "tr_TR": "JoyCon Sol", "uk_UA": "Лівий JoyCon", @@ -5942,6 +6189,7 @@ "pl_PL": "Prawy JoyCon", "pt_BR": "JoyCon direito", "ru_RU": "JoyCon (правый)", + "sv_SE": "JoyCon höger", "th_TH": "จอยคอน ด้านขวา", "tr_TR": "JoyCon Sağ", "uk_UA": "Правий JoyCon", @@ -5966,6 +6214,7 @@ "pl_PL": "Profil", "pt_BR": "Perfil", "ru_RU": "Профиль", + "sv_SE": "Profil", "th_TH": "โปรไฟล์", "tr_TR": "Profil", "uk_UA": "Профіль", @@ -5990,6 +6239,7 @@ "pl_PL": "Domyślny", "pt_BR": "Padrão", "ru_RU": "По умолчанию", + "sv_SE": "Standard", "th_TH": "ค่าเริ่มต้น", "tr_TR": "Varsayılan", "uk_UA": "Типовий", @@ -6014,6 +6264,7 @@ "pl_PL": "Wczytaj", "pt_BR": "Carregar", "ru_RU": "Загрузить", + "sv_SE": "Läs in", "th_TH": "โหลด", "tr_TR": "Yükle", "uk_UA": "Завантажити", @@ -6038,6 +6289,7 @@ "pl_PL": "Dodaj", "pt_BR": "Adicionar", "ru_RU": "Добавить", + "sv_SE": "Lägg till", "th_TH": "เพิ่ม", "tr_TR": "Ekle", "uk_UA": "Додати", @@ -6062,6 +6314,7 @@ "pl_PL": "Usuń", "pt_BR": "Remover", "ru_RU": "Удалить", + "sv_SE": "Ta bort", "th_TH": "เอาออก", "tr_TR": "Kaldır", "uk_UA": "Видалити", @@ -6086,6 +6339,7 @@ "pl_PL": "Przyciski", "pt_BR": "Botões", "ru_RU": "Кнопки", + "sv_SE": "Knappar", "th_TH": "ปุ่มกด", "tr_TR": "Tuşlar", "uk_UA": "Кнопки", @@ -6110,6 +6364,7 @@ "pl_PL": "", "pt_BR": "", "ru_RU": "", + "sv_SE": "A", "th_TH": "", "tr_TR": "", "uk_UA": "", @@ -6134,6 +6389,7 @@ "pl_PL": "", "pt_BR": "", "ru_RU": "", + "sv_SE": "B", "th_TH": "", "tr_TR": "", "uk_UA": "", @@ -6158,6 +6414,7 @@ "pl_PL": "", "pt_BR": "", "ru_RU": "", + "sv_SE": "X", "th_TH": "", "tr_TR": "", "uk_UA": "", @@ -6182,6 +6439,7 @@ "pl_PL": "", "pt_BR": "", "ru_RU": "", + "sv_SE": "Y", "th_TH": "", "tr_TR": "", "uk_UA": "", @@ -6206,6 +6464,7 @@ "pl_PL": "", "pt_BR": "", "ru_RU": "", + "sv_SE": "+", "th_TH": "", "tr_TR": "", "uk_UA": "", @@ -6230,6 +6489,7 @@ "pl_PL": "", "pt_BR": "", "ru_RU": "", + "sv_SE": "-", "th_TH": "", "tr_TR": "", "uk_UA": "", @@ -6254,6 +6514,7 @@ "pl_PL": "Krzyżak (D-Pad)", "pt_BR": "Direcional", "ru_RU": "Кнопки направления", + "sv_SE": "Riktningsknappar", "th_TH": "ปุ่มลูกศร", "tr_TR": "Yön Tuşları", "uk_UA": "Панель направлення", @@ -6278,6 +6539,7 @@ "pl_PL": "Góra", "pt_BR": "Cima", "ru_RU": "Вверх", + "sv_SE": "Upp", "th_TH": "ขึ้น", "tr_TR": "Yukarı", "uk_UA": "Вгору", @@ -6302,6 +6564,7 @@ "pl_PL": "Dół", "pt_BR": "Baixo", "ru_RU": "Вниз", + "sv_SE": "Ner", "th_TH": "ลง", "tr_TR": "Aşağı", "uk_UA": "Вниз", @@ -6326,6 +6589,7 @@ "pl_PL": "Lewo", "pt_BR": "Esquerda", "ru_RU": "Влево", + "sv_SE": "Vänster", "th_TH": "ซ้าย", "tr_TR": "Sol", "uk_UA": "Вліво", @@ -6350,6 +6614,7 @@ "pl_PL": "Prawo", "pt_BR": "Direita", "ru_RU": "Вправо", + "sv_SE": "Höger", "th_TH": "ขวา", "tr_TR": "Sağ", "uk_UA": "Вправо", @@ -6374,6 +6639,7 @@ "pl_PL": "Przycisk", "pt_BR": "Botão", "ru_RU": "Нажатие на стик", + "sv_SE": "Knapp", "th_TH": "ปุ่ม", "tr_TR": "Tuş", "uk_UA": "Кнопка", @@ -6398,6 +6664,7 @@ "pl_PL": "Góra ", "pt_BR": "Cima", "ru_RU": "Вверх", + "sv_SE": "Upp", "th_TH": "ขึ้น", "tr_TR": "Yukarı", "uk_UA": "Уверх", @@ -6422,6 +6689,7 @@ "pl_PL": "Dół ", "pt_BR": "Baixo", "ru_RU": "Вниз", + "sv_SE": "Ner", "th_TH": "ลง", "tr_TR": "Aşağı", "uk_UA": "Униз", @@ -6446,6 +6714,7 @@ "pl_PL": "Lewo", "pt_BR": "Esquerda", "ru_RU": "Влево", + "sv_SE": "Vänster", "th_TH": "ซ้าย", "tr_TR": "Sol", "uk_UA": "Ліворуч", @@ -6470,6 +6739,7 @@ "pl_PL": "Prawo", "pt_BR": "Direita", "ru_RU": "Вправо", + "sv_SE": "Höger", "th_TH": "ขวา", "tr_TR": "Sağ", "uk_UA": "Праворуч", @@ -6494,6 +6764,7 @@ "pl_PL": "Gałka", "pt_BR": "Analógico", "ru_RU": "Стик", + "sv_SE": "Spak", "th_TH": "จอยสติ๊ก", "tr_TR": "Analog", "uk_UA": "Стик", @@ -6518,6 +6789,7 @@ "pl_PL": "Odwróć gałkę X", "pt_BR": "Inverter eixo X", "ru_RU": "Инвертировать ось X", + "sv_SE": "Invertera Spak X", "th_TH": "กลับทิศทางของแกน X", "tr_TR": "X Eksenini Tersine Çevir", "uk_UA": "Обернути вісь стику X", @@ -6542,6 +6814,7 @@ "pl_PL": "Odwróć gałkę Y", "pt_BR": "Inverter eixo Y", "ru_RU": "Инвертировать ось Y", + "sv_SE": "Invertera Spak Y", "th_TH": "กลับทิศทางของแกน Y", "tr_TR": "Y Eksenini Tersine Çevir", "uk_UA": "Обернути вісь стику Y", @@ -6566,6 +6839,7 @@ "pl_PL": "Martwa strefa:", "pt_BR": "Zona morta:", "ru_RU": "Мёртвая зона:", + "sv_SE": "Dödläge:", "th_TH": "โซนที่ไม่ทำงานของ จอยสติ๊ก:", "tr_TR": "Ölü Bölge", "uk_UA": "Мертва зона:", @@ -6590,6 +6864,7 @@ "pl_PL": "Lewa Gałka", "pt_BR": "Analógico esquerdo", "ru_RU": "Левый стик", + "sv_SE": "Vänster spak", "th_TH": "จอยสติ๊ก ด้านซ้าย", "tr_TR": "Sol Analog", "uk_UA": "Лівий джойстик", @@ -6614,6 +6889,7 @@ "pl_PL": "Prawa Gałka", "pt_BR": "Analógico direito", "ru_RU": "Правый стик", + "sv_SE": "Höger spak", "th_TH": "จอยสติ๊ก ด้านขวา", "tr_TR": "Sağ Analog", "uk_UA": "Правий джойстик", @@ -6638,6 +6914,7 @@ "pl_PL": "Lewe Triggery", "pt_BR": "Gatilhos esquerda", "ru_RU": "Триггеры слева", + "sv_SE": "Avtryckare vänster", "th_TH": "ทริกเกอร์ ด้านซ้าย", "tr_TR": "Tetikler Sol", "uk_UA": "Тригери ліворуч", @@ -6662,6 +6939,7 @@ "pl_PL": "Prawe Triggery", "pt_BR": "Gatilhos direita", "ru_RU": "Триггеры справа", + "sv_SE": "Avtryckare höger", "th_TH": "ทริกเกอร์ ด้านขวา", "tr_TR": "Tetikler Sağ", "uk_UA": "Тригери праворуч", @@ -6686,6 +6964,7 @@ "pl_PL": "Lewe Przyciski Triggerów", "pt_BR": "Botões de gatilho esquerda", "ru_RU": "Триггерные кнопки слева", + "sv_SE": "Avtryckare knappar vänster", "th_TH": "ปุ่มทริกเกอร์ ด้านซ้าย", "tr_TR": "Tetik Tuşları Sol", "uk_UA": "Кнопки тригерів ліворуч", @@ -6710,6 +6989,7 @@ "pl_PL": "Prawe Przyciski Triggerów", "pt_BR": "Botões de gatilho direita", "ru_RU": "Триггерные кнопки справа", + "sv_SE": "Avtryckare knappar höger", "th_TH": "ปุ่มทริกเกอร์ ด้านขวา", "tr_TR": "Tetik Tuşları Sağ", "uk_UA": "Кнопки тригерів праворуч", @@ -6734,6 +7014,7 @@ "pl_PL": "Triggery", "pt_BR": "Gatilhos", "ru_RU": "Триггеры", + "sv_SE": "Avtryckare", "th_TH": "ทริกเกอร์", "tr_TR": "Tetikler", "uk_UA": "Тригери", @@ -6758,6 +7039,7 @@ "pl_PL": "", "pt_BR": "", "ru_RU": "", + "sv_SE": "L", "th_TH": "", "tr_TR": "", "uk_UA": "", @@ -6782,6 +7064,7 @@ "pl_PL": "", "pt_BR": "", "ru_RU": "", + "sv_SE": "R", "th_TH": "", "tr_TR": "", "uk_UA": "", @@ -6806,6 +7089,7 @@ "pl_PL": "", "pt_BR": "", "ru_RU": "", + "sv_SE": "ZL", "th_TH": "", "tr_TR": "", "uk_UA": "", @@ -6830,6 +7114,7 @@ "pl_PL": "", "pt_BR": "", "ru_RU": "", + "sv_SE": "ZR", "th_TH": "", "tr_TR": "", "uk_UA": "", @@ -6854,6 +7139,7 @@ "pl_PL": "", "pt_BR": "", "ru_RU": "", + "sv_SE": "SL", "th_TH": "", "tr_TR": "", "uk_UA": "", @@ -6878,6 +7164,7 @@ "pl_PL": "", "pt_BR": "", "ru_RU": "", + "sv_SE": "SR", "th_TH": "", "tr_TR": "", "uk_UA": "", @@ -6902,6 +7189,7 @@ "pl_PL": "", "pt_BR": "", "ru_RU": "", + "sv_SE": "SL", "th_TH": "", "tr_TR": "", "uk_UA": "", @@ -6926,6 +7214,7 @@ "pl_PL": "", "pt_BR": "", "ru_RU": "", + "sv_SE": "SR", "th_TH": "", "tr_TR": "", "uk_UA": "", @@ -6950,6 +7239,7 @@ "pl_PL": "Lewe Przyciski", "pt_BR": "Botões esquerda", "ru_RU": "Левые кнопки", + "sv_SE": "Knappar vänster", "th_TH": "ปุ่มกดเสริม ด้านซ้าย", "tr_TR": "Tuşlar Sol", "uk_UA": "Кнопки ліворуч", @@ -6974,6 +7264,7 @@ "pl_PL": "Prawe Przyciski", "pt_BR": "Botões direita", "ru_RU": "Правые кнопки", + "sv_SE": "Knappar höger", "th_TH": "ปุ่มกดเสริม ด้านขวา", "tr_TR": "Tuşlar Sağ", "uk_UA": "Кнопки праворуч", @@ -6998,6 +7289,7 @@ "pl_PL": "Różne", "pt_BR": "Miscelâneas", "ru_RU": "Разное", + "sv_SE": "Diverse", "th_TH": "การควบคุมเพิ่มเติม", "tr_TR": "Diğer", "uk_UA": "Різне", @@ -7022,6 +7314,7 @@ "pl_PL": "Próg Triggerów:", "pt_BR": "Sensibilidade do gatilho:", "ru_RU": "Порог срабатывания:", + "sv_SE": "Tröskelvärde avtryckare:", "th_TH": "ตั้งค่าขีดจำกัดการกด:", "tr_TR": "Tetik Eşiği:", "uk_UA": "Поріг спрацьовування:", @@ -7046,6 +7339,7 @@ "pl_PL": "Ruch", "pt_BR": "Sensor de movimento", "ru_RU": "Движение", + "sv_SE": "Rörelse", "th_TH": "การเคลื่อนไหว", "tr_TR": "Hareket", "uk_UA": "Рух", @@ -7070,6 +7364,7 @@ "pl_PL": "Użyj ruchu zgodnego z CemuHook", "pt_BR": "Usar sensor compatível com CemuHook", "ru_RU": "Включить совместимость с CemuHook", + "sv_SE": "Använd CemuHook-kompatibel rörelse", "th_TH": "ใช้การเคลื่อนไหวที่เข้ากันได้กับ CemuHook", "tr_TR": "CemuHook uyumlu hareket kullan", "uk_UA": "Використовувати рух, сумісний з CemuHook", @@ -7094,6 +7389,7 @@ "pl_PL": "Slot Kontrolera:", "pt_BR": "Slot do controle:", "ru_RU": "Слот контроллера:", + "sv_SE": "Kontrollerplats:", "th_TH": "ช่องเสียบ คอนโทรลเลอร์:", "tr_TR": "Kumanda Yuvası:", "uk_UA": "Слот контролера:", @@ -7118,6 +7414,7 @@ "pl_PL": "Odzwierciedlaj Sterowanie", "pt_BR": "Espelhar movimento", "ru_RU": "Зеркальный ввод", + "sv_SE": "Spegla inmatning", "th_TH": "นำเข้าการสะท้อน การควบคุม", "tr_TR": "Girişi Aynala", "uk_UA": "Дзеркальний вхід", @@ -7142,6 +7439,7 @@ "pl_PL": "Prawy Slot JoyCon:", "pt_BR": "Slot do JoyCon direito:", "ru_RU": "Слот правого JoyCon:", + "sv_SE": "Höger JoyCon-plats:", "th_TH": "ช่องเสียบ จอยคอน ด้านขวา:", "tr_TR": "Sağ JoyCon Yuvası:", "uk_UA": "Правий слот JoyCon:", @@ -7166,6 +7464,7 @@ "pl_PL": "Host Serwera:", "pt_BR": "Endereço do servidor:", "ru_RU": "Хост сервера:", + "sv_SE": "Servervärd:", "th_TH": "เจ้าของเซิร์ฟเวอร์:", "tr_TR": "Sunucu Sahibi:", "uk_UA": "Хост сервера:", @@ -7190,6 +7489,7 @@ "pl_PL": "Czułość Żyroskopu:", "pt_BR": "Sensibilidade do giroscópio:", "ru_RU": "Чувствительность гироскопа:", + "sv_SE": "Känslighet för gyro:", "th_TH": "ความไวของ Gyro:", "tr_TR": "Gyro Hassasiyeti:", "uk_UA": "Чутливість гіроскопа:", @@ -7214,6 +7514,7 @@ "pl_PL": "Deadzone Żyroskopu:", "pt_BR": "Zona morta do giroscópio:", "ru_RU": "Мертвая зона гироскопа:", + "sv_SE": "Dödläge för gyro:", "th_TH": "ส่วนไม่ทำงานของ Gyro:", "tr_TR": "Gyro Ölü Bölgesi:", "uk_UA": "Мертва зона гіроскопа:", @@ -7238,6 +7539,7 @@ "pl_PL": "Zapisz", "pt_BR": "Salvar", "ru_RU": "Сохранить", + "sv_SE": "Spara", "th_TH": "บันทึก", "tr_TR": "Kaydet", "uk_UA": "Зберегти", @@ -7262,6 +7564,7 @@ "pl_PL": "Zamknij", "pt_BR": "Fechar", "ru_RU": "Закрыть", + "sv_SE": "Stäng", "th_TH": "ปิด", "tr_TR": "Kapat", "uk_UA": "Закрити", @@ -7286,6 +7589,7 @@ "pl_PL": "", "pt_BR": "", "ru_RU": "Неизвестно", + "sv_SE": "Okänd", "th_TH": "ไม่รู้จัก", "tr_TR": "", "uk_UA": "Невідома", @@ -7310,6 +7614,7 @@ "pl_PL": "", "pt_BR": "", "ru_RU": "Левый Shift", + "sv_SE": "Skift vänster", "th_TH": "", "tr_TR": "Sol Shift", "uk_UA": "Shift Лівий", @@ -7334,6 +7639,7 @@ "pl_PL": "", "pt_BR": "", "ru_RU": "Правый Shift", + "sv_SE": "Skift höger", "th_TH": "", "tr_TR": "Sağ Shift", "uk_UA": "Shift Правий", @@ -7358,6 +7664,7 @@ "pl_PL": "", "pt_BR": "", "ru_RU": "Левый Ctrl", + "sv_SE": "Ctrl vänster", "th_TH": "", "tr_TR": "Sol Ctrl", "uk_UA": "Ctrl Лівий", @@ -7382,6 +7689,7 @@ "pl_PL": "", "pt_BR": "", "ru_RU": "Левый ⌃", + "sv_SE": "^ Vänster", "th_TH": "", "tr_TR": "⌃ Sol", "uk_UA": "⌃ Лівий", @@ -7406,6 +7714,7 @@ "pl_PL": "", "pt_BR": "", "ru_RU": "Правый Ctrl", + "sv_SE": "Ctrl höger", "th_TH": "", "tr_TR": "Sağ Control", "uk_UA": "Ctrl Правий", @@ -7430,6 +7739,7 @@ "pl_PL": "", "pt_BR": "", "ru_RU": "Правый ⌃", + "sv_SE": "^ Höger", "th_TH": "", "tr_TR": "⌃ Sağ", "uk_UA": "⌃ Правий", @@ -7454,6 +7764,7 @@ "pl_PL": "", "pt_BR": "", "ru_RU": "Левый Alt", + "sv_SE": "Alt vänster", "th_TH": "", "tr_TR": "Sol Alt", "uk_UA": "Alt Лівий", @@ -7478,6 +7789,7 @@ "pl_PL": "", "pt_BR": "", "ru_RU": "Левый ⌥", + "sv_SE": "⌥ vänster", "th_TH": "", "tr_TR": "⌥ Sol", "uk_UA": "⌥ Лівий", @@ -7502,6 +7814,7 @@ "pl_PL": "", "pt_BR": "", "ru_RU": "Правый Alt", + "sv_SE": "Alt höger", "th_TH": "", "tr_TR": "Sağ Alt", "uk_UA": "Alt Правий", @@ -7526,6 +7839,7 @@ "pl_PL": "", "pt_BR": "", "ru_RU": "Правый ⌥", + "sv_SE": "⌥ höger", "th_TH": "", "tr_TR": "⌥ Sağ", "uk_UA": "⌥ Правий", @@ -7550,6 +7864,7 @@ "pl_PL": "", "pt_BR": "", "ru_RU": "Левый ⊞", + "sv_SE": "⊞ vänster", "th_TH": "", "tr_TR": "⊞ Sol", "uk_UA": "⊞ Лівий", @@ -7574,6 +7889,7 @@ "pl_PL": "", "pt_BR": "", "ru_RU": "Левый ⌘", + "sv_SE": "⌘ vänster", "th_TH": "", "tr_TR": "⌘ Sol", "uk_UA": "⌘ Лівий", @@ -7598,6 +7914,7 @@ "pl_PL": "", "pt_BR": "", "ru_RU": "Правый ⊞", + "sv_SE": "⊞ höger", "th_TH": "", "tr_TR": "⊞ Sağ", "uk_UA": "⊞ Правий", @@ -7622,6 +7939,7 @@ "pl_PL": "", "pt_BR": "", "ru_RU": "Правый ⌘", + "sv_SE": "⌘ höger", "th_TH": "", "tr_TR": "⌘ Sağ", "uk_UA": "⌘ Правий", @@ -7646,6 +7964,7 @@ "pl_PL": "", "pt_BR": "", "ru_RU": "Меню", + "sv_SE": "Meny", "th_TH": "", "tr_TR": "Menü", "uk_UA": "", @@ -7670,6 +7989,7 @@ "pl_PL": "", "pt_BR": "", "ru_RU": "Вверх", + "sv_SE": "Upp", "th_TH": "", "tr_TR": "Yukarı", "uk_UA": "", @@ -7694,6 +8014,7 @@ "pl_PL": "", "pt_BR": "", "ru_RU": "Вниз", + "sv_SE": "Ner", "th_TH": "", "tr_TR": "Aşağı", "uk_UA": "", @@ -7718,6 +8039,7 @@ "pl_PL": "", "pt_BR": "", "ru_RU": "Влево", + "sv_SE": "Vänster", "th_TH": "", "tr_TR": "Sol", "uk_UA": "Вліво", @@ -7742,6 +8064,7 @@ "pl_PL": "", "pt_BR": "", "ru_RU": "Вправо", + "sv_SE": "Höger", "th_TH": "", "tr_TR": "Sağ", "uk_UA": "Вправо", @@ -7766,6 +8089,7 @@ "pl_PL": "", "pt_BR": "", "ru_RU": "", + "sv_SE": "Enter", "th_TH": "", "tr_TR": "", "uk_UA": "", @@ -7790,6 +8114,7 @@ "pl_PL": "", "pt_BR": "", "ru_RU": "", + "sv_SE": "Escape", "th_TH": "", "tr_TR": "Esc", "uk_UA": "", @@ -7814,6 +8139,7 @@ "pl_PL": "", "pt_BR": "", "ru_RU": "Пробел", + "sv_SE": "Blanksteg", "th_TH": "", "tr_TR": "", "uk_UA": "Пробіл", @@ -7838,6 +8164,7 @@ "pl_PL": "", "pt_BR": "", "ru_RU": "", + "sv_SE": "Tab", "th_TH": "", "tr_TR": "", "uk_UA": "", @@ -7862,6 +8189,7 @@ "pl_PL": "", "pt_BR": "", "ru_RU": "", + "sv_SE": "Backspace", "th_TH": "", "tr_TR": "Geri tuşu", "uk_UA": "", @@ -7886,6 +8214,7 @@ "pl_PL": "", "pt_BR": "", "ru_RU": "", + "sv_SE": "Insert", "th_TH": "", "tr_TR": "", "uk_UA": "", @@ -7910,6 +8239,7 @@ "pl_PL": "", "pt_BR": "", "ru_RU": "", + "sv_SE": "Delete", "th_TH": "", "tr_TR": "", "uk_UA": "", @@ -7934,6 +8264,7 @@ "pl_PL": "", "pt_BR": "", "ru_RU": "", + "sv_SE": "Page Up", "th_TH": "", "tr_TR": "", "uk_UA": "", @@ -7958,6 +8289,7 @@ "pl_PL": "", "pt_BR": "", "ru_RU": "", + "sv_SE": "Page Down", "th_TH": "", "tr_TR": "", "uk_UA": "", @@ -7982,6 +8314,7 @@ "pl_PL": "", "pt_BR": "", "ru_RU": "", + "sv_SE": "Home", "th_TH": "", "tr_TR": "", "uk_UA": "", @@ -8006,6 +8339,7 @@ "pl_PL": "", "pt_BR": "", "ru_RU": "", + "sv_SE": "End", "th_TH": "", "tr_TR": "", "uk_UA": "", @@ -8030,6 +8364,7 @@ "pl_PL": "", "pt_BR": "", "ru_RU": "", + "sv_SE": "Caps Lock", "th_TH": "", "tr_TR": "", "uk_UA": "", @@ -8054,6 +8389,7 @@ "pl_PL": "", "pt_BR": "", "ru_RU": "", + "sv_SE": "Scroll Lock", "th_TH": "", "tr_TR": "", "uk_UA": "", @@ -8078,6 +8414,7 @@ "pl_PL": "", "pt_BR": "", "ru_RU": "", + "sv_SE": "Print Screen", "th_TH": "", "tr_TR": "", "uk_UA": "", @@ -8102,6 +8439,7 @@ "pl_PL": "", "pt_BR": "", "ru_RU": "", + "sv_SE": "Pause", "th_TH": "", "tr_TR": "", "uk_UA": "", @@ -8126,6 +8464,7 @@ "pl_PL": "", "pt_BR": "", "ru_RU": "", + "sv_SE": "Num Lock", "th_TH": "", "tr_TR": "", "uk_UA": "", @@ -8150,6 +8489,7 @@ "pl_PL": "", "pt_BR": "", "ru_RU": "Очистить", + "sv_SE": "Töm", "th_TH": "", "tr_TR": "", "uk_UA": "Очистити", @@ -8174,6 +8514,7 @@ "pl_PL": "", "pt_BR": "", "ru_RU": "Блок цифр 0", + "sv_SE": "Keypad 0", "th_TH": "", "tr_TR": "", "uk_UA": "", @@ -8198,6 +8539,7 @@ "pl_PL": "", "pt_BR": "", "ru_RU": "Блок цифр 1", + "sv_SE": "Keypad 1", "th_TH": "", "tr_TR": "", "uk_UA": "", @@ -8222,6 +8564,7 @@ "pl_PL": "", "pt_BR": "", "ru_RU": "Блок цифр 2", + "sv_SE": "Keypad 2", "th_TH": "", "tr_TR": "", "uk_UA": "", @@ -8246,6 +8589,7 @@ "pl_PL": "", "pt_BR": "", "ru_RU": "Блок цифр 3", + "sv_SE": "Keypad 3", "th_TH": "", "tr_TR": "", "uk_UA": "", @@ -8270,6 +8614,7 @@ "pl_PL": "", "pt_BR": "", "ru_RU": "Блок цифр 4", + "sv_SE": "Keypad 4", "th_TH": "", "tr_TR": "", "uk_UA": "", @@ -8294,6 +8639,7 @@ "pl_PL": "", "pt_BR": "", "ru_RU": "Блок цифр 5", + "sv_SE": "Keypad 5", "th_TH": "", "tr_TR": "", "uk_UA": "", @@ -8318,6 +8664,7 @@ "pl_PL": "", "pt_BR": "", "ru_RU": "Блок цифр 6", + "sv_SE": "Keypad 6", "th_TH": "", "tr_TR": "", "uk_UA": "", @@ -8342,6 +8689,7 @@ "pl_PL": "", "pt_BR": "", "ru_RU": "Блок цифр 7", + "sv_SE": "Keypad 7", "th_TH": "", "tr_TR": "", "uk_UA": "", @@ -8366,6 +8714,7 @@ "pl_PL": "", "pt_BR": "", "ru_RU": "Блок цифр 8", + "sv_SE": "Keypad 8", "th_TH": "", "tr_TR": "", "uk_UA": "", @@ -8390,6 +8739,7 @@ "pl_PL": "", "pt_BR": "", "ru_RU": "Блок цифр 9", + "sv_SE": "Keypad 9", "th_TH": "", "tr_TR": "", "uk_UA": "", @@ -8414,6 +8764,7 @@ "pl_PL": "", "pt_BR": "", "ru_RU": "/ (блок цифр)", + "sv_SE": "Keypad /", "th_TH": "", "tr_TR": "", "uk_UA": "", @@ -8438,6 +8789,7 @@ "pl_PL": "", "pt_BR": "", "ru_RU": "* (блок цифр)", + "sv_SE": "Keypad *", "th_TH": "", "tr_TR": "", "uk_UA": "", @@ -8462,6 +8814,7 @@ "pl_PL": "", "pt_BR": "", "ru_RU": "- (блок цифр)", + "sv_SE": "Keypad -", "th_TH": "", "tr_TR": "", "uk_UA": "", @@ -8486,6 +8839,7 @@ "pl_PL": "", "pt_BR": "", "ru_RU": "+ (блок цифр)", + "sv_SE": "Keypad +", "th_TH": "", "tr_TR": "", "uk_UA": "", @@ -8510,6 +8864,7 @@ "pl_PL": "", "pt_BR": "", "ru_RU": ". (блок цифр)", + "sv_SE": "Keypad ,", "th_TH": "", "tr_TR": "", "uk_UA": "", @@ -8534,6 +8889,7 @@ "pl_PL": "", "pt_BR": "", "ru_RU": "Enter (блок цифр)", + "sv_SE": "Keypad Enter", "th_TH": "", "tr_TR": "", "uk_UA": "", @@ -8558,6 +8914,7 @@ "pl_PL": "", "pt_BR": "", "ru_RU": "", + "sv_SE": "", "th_TH": "", "tr_TR": "", "uk_UA": "", @@ -8582,6 +8939,7 @@ "pl_PL": "", "pt_BR": "", "ru_RU": "", + "sv_SE": "", "th_TH": "", "tr_TR": "", "uk_UA": "", @@ -8606,6 +8964,7 @@ "pl_PL": "", "pt_BR": "", "ru_RU": "", + "sv_SE": "", "th_TH": "", "tr_TR": "", "uk_UA": "", @@ -8630,6 +8989,7 @@ "pl_PL": "", "pt_BR": "", "ru_RU": "", + "sv_SE": "", "th_TH": "", "tr_TR": "", "uk_UA": "", @@ -8654,6 +9014,7 @@ "pl_PL": "", "pt_BR": "", "ru_RU": "", + "sv_SE": "", "th_TH": "", "tr_TR": "", "uk_UA": "", @@ -8678,6 +9039,7 @@ "pl_PL": "", "pt_BR": "", "ru_RU": "", + "sv_SE": "", "th_TH": "", "tr_TR": "", "uk_UA": "", @@ -8702,6 +9064,7 @@ "pl_PL": "", "pt_BR": "", "ru_RU": "", + "sv_SE": "", "th_TH": "", "tr_TR": "", "uk_UA": "", @@ -8726,6 +9089,7 @@ "pl_PL": "", "pt_BR": "", "ru_RU": "", + "sv_SE": "", "th_TH": "", "tr_TR": "", "uk_UA": "", @@ -8750,6 +9114,7 @@ "pl_PL": "", "pt_BR": "", "ru_RU": "", + "sv_SE": "", "th_TH": "", "tr_TR": "", "uk_UA": "", @@ -8774,6 +9139,7 @@ "pl_PL": "", "pt_BR": "", "ru_RU": "", + "sv_SE": "", "th_TH": "", "tr_TR": "", "uk_UA": "", @@ -8798,6 +9164,7 @@ "pl_PL": "", "pt_BR": "", "ru_RU": "", + "sv_SE": "", "th_TH": "", "tr_TR": "", "uk_UA": "", @@ -8822,6 +9189,7 @@ "pl_PL": "", "pt_BR": "", "ru_RU": "", + "sv_SE": "", "th_TH": "", "tr_TR": "", "uk_UA": "", @@ -8846,6 +9214,7 @@ "pl_PL": "", "pt_BR": "", "ru_RU": "", + "sv_SE": "", "th_TH": "", "tr_TR": "", "uk_UA": "", @@ -8870,6 +9239,7 @@ "pl_PL": "", "pt_BR": "", "ru_RU": "", + "sv_SE": "", "th_TH": "", "tr_TR": "", "uk_UA": "", @@ -8894,6 +9264,7 @@ "pl_PL": "", "pt_BR": "", "ru_RU": "", + "sv_SE": "", "th_TH": "", "tr_TR": "", "uk_UA": "", @@ -8918,6 +9289,7 @@ "pl_PL": "", "pt_BR": "", "ru_RU": "", + "sv_SE": "", "th_TH": "", "tr_TR": "", "uk_UA": "", @@ -8942,6 +9314,7 @@ "pl_PL": "", "pt_BR": "", "ru_RU": "", + "sv_SE": "", "th_TH": "", "tr_TR": "", "uk_UA": "", @@ -8966,6 +9339,7 @@ "pl_PL": "", "pt_BR": "", "ru_RU": "", + "sv_SE": "", "th_TH": "", "tr_TR": "", "uk_UA": "", @@ -8990,6 +9364,7 @@ "pl_PL": "", "pt_BR": "", "ru_RU": "", + "sv_SE": "", "th_TH": "", "tr_TR": "", "uk_UA": "", @@ -9014,6 +9389,7 @@ "pl_PL": "", "pt_BR": "", "ru_RU": "", + "sv_SE": "", "th_TH": "", "tr_TR": "", "uk_UA": "", @@ -9038,6 +9414,7 @@ "pl_PL": "", "pt_BR": "", "ru_RU": "", + "sv_SE": "", "th_TH": "", "tr_TR": "", "uk_UA": "", @@ -9062,6 +9439,7 @@ "pl_PL": "", "pt_BR": "", "ru_RU": "", + "sv_SE": "", "th_TH": "", "tr_TR": "", "uk_UA": "", @@ -9086,6 +9464,7 @@ "pl_PL": "", "pt_BR": "", "ru_RU": "Не привязано", + "sv_SE": "Obunden", "th_TH": "", "tr_TR": "", "uk_UA": "Відв'язати", @@ -9110,6 +9489,7 @@ "pl_PL": "", "pt_BR": "", "ru_RU": "Кнопка лев. стика", + "sv_SE": "L-spakknapp", "th_TH": "", "tr_TR": "", "uk_UA": "L Кнопка Стіку", @@ -9134,6 +9514,7 @@ "pl_PL": "", "pt_BR": "", "ru_RU": "Кнопка пр. стика", + "sv_SE": "R-spakknapp", "th_TH": "", "tr_TR": "", "uk_UA": "R Кнопка Стіку", @@ -9158,6 +9539,7 @@ "pl_PL": "", "pt_BR": "", "ru_RU": "Левый бампер", + "sv_SE": "Vänster kantknapp", "th_TH": "", "tr_TR": "", "uk_UA": "Лівий Бампер", @@ -9182,6 +9564,7 @@ "pl_PL": "", "pt_BR": "", "ru_RU": "Правый бампер", + "sv_SE": "Höger kantknapp", "th_TH": "", "tr_TR": "", "uk_UA": "Правий Бампер", @@ -9206,6 +9589,7 @@ "pl_PL": "", "pt_BR": "", "ru_RU": "Левый триггер", + "sv_SE": "Vänster avtryckare", "th_TH": "", "tr_TR": "", "uk_UA": "Лівий Тригер", @@ -9230,6 +9614,7 @@ "pl_PL": "", "pt_BR": "", "ru_RU": "Правый триггер", + "sv_SE": "Höger avtryckare", "th_TH": "", "tr_TR": "", "uk_UA": "Правий Тригер", @@ -9254,6 +9639,7 @@ "pl_PL": "", "pt_BR": "", "ru_RU": "Вверх", + "sv_SE": "Upp", "th_TH": "", "tr_TR": "", "uk_UA": "Вверх", @@ -9278,6 +9664,7 @@ "pl_PL": "", "pt_BR": "", "ru_RU": "Вниз", + "sv_SE": "Ner", "th_TH": "", "tr_TR": "", "uk_UA": "Вниз", @@ -9302,6 +9689,7 @@ "pl_PL": "", "pt_BR": "", "ru_RU": "Влево", + "sv_SE": "Vänster", "th_TH": "", "tr_TR": "", "uk_UA": "Вліво", @@ -9326,6 +9714,7 @@ "pl_PL": "", "pt_BR": "", "ru_RU": "Вправо", + "sv_SE": "Höger", "th_TH": "", "tr_TR": "Sağ", "uk_UA": "Вправо", @@ -9350,6 +9739,7 @@ "pl_PL": "", "pt_BR": "", "ru_RU": "", + "sv_SE": "", "th_TH": "", "tr_TR": "", "uk_UA": "", @@ -9374,6 +9764,7 @@ "pl_PL": "", "pt_BR": "", "ru_RU": "", + "sv_SE": "", "th_TH": "", "tr_TR": "4", "uk_UA": "", @@ -9398,6 +9789,7 @@ "pl_PL": "", "pt_BR": "", "ru_RU": "Кнопка Xbox", + "sv_SE": "Guide", "th_TH": "", "tr_TR": "Rehber", "uk_UA": "", @@ -9422,6 +9814,7 @@ "pl_PL": "", "pt_BR": "", "ru_RU": "Прочее", + "sv_SE": "Diverse", "th_TH": "", "tr_TR": "Diğer", "uk_UA": "", @@ -9446,6 +9839,7 @@ "pl_PL": "", "pt_BR": "", "ru_RU": "Доп.кнопка 1", + "sv_SE": "", "th_TH": "", "tr_TR": "Pedal 1", "uk_UA": "", @@ -9470,6 +9864,7 @@ "pl_PL": "", "pt_BR": "", "ru_RU": "Доп.кнопка 2", + "sv_SE": "", "th_TH": "", "tr_TR": "Pedal 2", "uk_UA": "", @@ -9494,6 +9889,7 @@ "pl_PL": "", "pt_BR": "", "ru_RU": "Доп.кнопка 3", + "sv_SE": "", "th_TH": "", "tr_TR": "Pedal 3", "uk_UA": "", @@ -9518,6 +9914,7 @@ "pl_PL": "", "pt_BR": "", "ru_RU": "Доп.кнопка 4", + "sv_SE": "", "th_TH": "", "tr_TR": "Pedal 4", "uk_UA": "", @@ -9542,6 +9939,7 @@ "pl_PL": "", "pt_BR": "", "ru_RU": "Тачпад", + "sv_SE": "", "th_TH": "", "tr_TR": "", "uk_UA": "", @@ -9566,6 +9964,7 @@ "pl_PL": "", "pt_BR": "", "ru_RU": "Левый триггер 0", + "sv_SE": "Vänster avtryckare 0", "th_TH": "", "tr_TR": "Sol Tetik 0", "uk_UA": "Лівий Тригер 0", @@ -9590,6 +9989,7 @@ "pl_PL": "", "pt_BR": "", "ru_RU": "Правый триггер 0", + "sv_SE": "Höger avtryckare 0", "th_TH": "", "tr_TR": "Sağ Tetik 0", "uk_UA": "Правий Тригер 0", @@ -9614,6 +10014,7 @@ "pl_PL": "", "pt_BR": "", "ru_RU": "Левый триггер 1", + "sv_SE": "Vänster avtryckare 1", "th_TH": "", "tr_TR": "Sol Tetik 1", "uk_UA": "Лівий Тригер 1", @@ -9638,6 +10039,7 @@ "pl_PL": "", "pt_BR": "", "ru_RU": "Правый триггер 1", + "sv_SE": "Höger avtryckare 1", "th_TH": "", "tr_TR": "Sağ Tetik 1", "uk_UA": "Правий Тригер 1", @@ -9662,6 +10064,7 @@ "pl_PL": "", "pt_BR": "", "ru_RU": "Левый стик", + "sv_SE": "Vänster spak", "th_TH": "", "tr_TR": "Sol Çubuk", "uk_UA": "Лівий Стік", @@ -9686,6 +10089,7 @@ "pl_PL": "", "pt_BR": "", "ru_RU": "Правый стик", + "sv_SE": "Höger spak", "th_TH": "", "tr_TR": "Sağ çubuk", "uk_UA": "Правий Стік", @@ -9710,6 +10114,7 @@ "pl_PL": "Wybrany profil użytkownika:", "pt_BR": "Perfil de usuário selecionado:", "ru_RU": "Выбранный пользовательский профиль:", + "sv_SE": "Vald användarprofil:", "th_TH": "เลือกโปรไฟล์ผู้ใช้งาน:", "tr_TR": "Seçili Kullanıcı Profili:", "uk_UA": "Вибраний профіль користувача:", @@ -9734,6 +10139,7 @@ "pl_PL": "Zapisz nazwę profilu", "pt_BR": "Salvar nome de perfil", "ru_RU": "Сохранить пользовательский профиль", + "sv_SE": "Spara profilnamn", "th_TH": "บันทึกชื่อโปรไฟล์", "tr_TR": "Profil İsmini Kaydet", "uk_UA": "Зберегти ім'я профілю", @@ -9758,6 +10164,7 @@ "pl_PL": "Zmień obrazek profilu", "pt_BR": "Mudar imagem de perfil", "ru_RU": "Изменить аватар", + "sv_SE": "Byt profilbild", "th_TH": "เปลี่ยนรูปโปรไฟล์", "tr_TR": "Profil Resmini Değiştir", "uk_UA": "Змінити зображення профілю", @@ -9782,6 +10189,7 @@ "pl_PL": "Dostępne profile użytkownika:", "pt_BR": "Perfis de usuário disponíveis:", "ru_RU": "Доступные профили пользователей:", + "sv_SE": "Tillgängliga användarprofiler:", "th_TH": "โปรไฟล์ผู้ใช้ที่ใช้งานได้:", "tr_TR": "Mevcut Kullanıcı Profilleri:", "uk_UA": "Доступні профілі користувачів:", @@ -9806,6 +10214,7 @@ "pl_PL": "Utwórz profil", "pt_BR": "Adicionar novo perfil", "ru_RU": "Добавить новый профиль", + "sv_SE": "Skapa profil", "th_TH": "สร้างโปรไฟล์ใหม่", "tr_TR": "Yeni Profil Ekle", "uk_UA": "Створити профіль", @@ -9830,6 +10239,7 @@ "pl_PL": "Usuń", "pt_BR": "Apagar", "ru_RU": "Удалить", + "sv_SE": "Ta bort", "th_TH": "ลบ", "tr_TR": "Sil", "uk_UA": "Видалити", @@ -9854,6 +10264,7 @@ "pl_PL": "Zamknij", "pt_BR": "Fechar", "ru_RU": "Закрыть", + "sv_SE": "Stäng", "th_TH": "ปิด", "tr_TR": "Kapat", "uk_UA": "Закрити", @@ -9878,6 +10289,7 @@ "pl_PL": "Wybierz pseudonim", "pt_BR": "Escolha um apelido", "ru_RU": "Укажите никнейм", + "sv_SE": "Välj ett smeknamn", "th_TH": "เลือก ชื่อเล่น", "tr_TR": "Kullanıcı Adı Seç", "uk_UA": "Оберіть псевдонім", @@ -9902,6 +10314,7 @@ "pl_PL": "Wybór Obrazu Profilu", "pt_BR": "Seleção da imagem de perfil", "ru_RU": "Выбор изображения профиля", + "sv_SE": "Välj profilbild", "th_TH": "เลือก รูปโปรไฟล์ ของคุณ", "tr_TR": "Profil Resmi Seçimi", "uk_UA": "Вибір зображення профілю", @@ -9926,6 +10339,7 @@ "pl_PL": "Wybierz zdjęcie profilowe", "pt_BR": "Escolha uma imagem de perfil", "ru_RU": "Выбор аватара", + "sv_SE": "Välj en profilbild", "th_TH": "เลือก รูปโปรไฟล์", "tr_TR": "Profil Resmi Seç", "uk_UA": "Виберіть зображення профілю", @@ -9950,6 +10364,7 @@ "pl_PL": "Możesz zaimportować niestandardowy obraz profilu lub wybrać awatar z firmware'u systemowego", "pt_BR": "Você pode importar uma imagem customizada, ou selecionar um avatar do firmware", "ru_RU": "Вы можете импортировать собственное изображение или выбрать аватар из системной прошивки.", + "sv_SE": "Du kan importera en anpassad profilbild eller välja en avatar från systemets firmware", "th_TH": "คุณสามารถนำเข้ารูปโปรไฟล์ที่กำหนดเองได้ หรือ เลือกรูปที่มีจากระบบ", "tr_TR": "Özel bir profil resmi içeri aktarabilir veya sistem avatarlarından birini seçebilirsiniz", "uk_UA": "Ви можете імпортувати власне зображення профілю або вибрати аватар із мікропрограми системи", @@ -9974,6 +10389,7 @@ "pl_PL": "Importuj Plik Obrazu", "pt_BR": "Importar arquivo de imagem", "ru_RU": "Импорт изображения", + "sv_SE": "Importera bildfil", "th_TH": "นำเข้า ไฟล์รูปภาพ", "tr_TR": "Resim İçeri Aktar", "uk_UA": "Імпорт файлу зображення", @@ -9998,6 +10414,7 @@ "pl_PL": "Wybierz domyślny awatar z oprogramowania konsoli", "pt_BR": "Selecionar avatar do firmware", "ru_RU": "Встроенные аватары", + "sv_SE": "Välj avatar från firmware", "th_TH": "เลือก รูปอวาต้า จากระบบ", "tr_TR": "Yazılım Avatarı Seç", "uk_UA": "Виберіть аватар прошивки ", @@ -10022,6 +10439,7 @@ "pl_PL": "Okno Dialogowe Wprowadzania", "pt_BR": "Diálogo de texto", "ru_RU": "Диалоговое окно ввода", + "sv_SE": "Inmatningsdialog", "th_TH": "กล่องโต้ตอบการป้อนข้อมูล", "tr_TR": "Giriş Yöntemi Diyaloğu", "uk_UA": "Діалог введення", @@ -10046,6 +10464,7 @@ "pl_PL": "", "pt_BR": "", "ru_RU": "ОК", + "sv_SE": "Ok", "th_TH": "ตกลง", "tr_TR": "Tamam", "uk_UA": "Гаразд", @@ -10070,6 +10489,7 @@ "pl_PL": "Anuluj", "pt_BR": "Cancelar", "ru_RU": "Отмена", + "sv_SE": "Avbryt", "th_TH": "ยกเลิก", "tr_TR": "İptal", "uk_UA": "Скасувати", @@ -10094,6 +10514,7 @@ "pl_PL": "", "pt_BR": "", "ru_RU": "", + "sv_SE": "Avbryter", "th_TH": "", "tr_TR": "", "uk_UA": "Скасування", @@ -10118,6 +10539,7 @@ "pl_PL": "", "pt_BR": "", "ru_RU": "", + "sv_SE": "Stäng", "th_TH": "", "tr_TR": "", "uk_UA": "Закрити", @@ -10142,6 +10564,7 @@ "pl_PL": "Wybierz nazwę profilu", "pt_BR": "Escolha o nome de perfil", "ru_RU": "Выберите никнейм", + "sv_SE": "Välj ett profilnamn", "th_TH": "เลือก ชื่อโปรไฟล์", "tr_TR": "Profil İsmini Seç", "uk_UA": "Виберіть ім'я профілю", @@ -10166,6 +10589,7 @@ "pl_PL": "Wprowadź nazwę profilu", "pt_BR": "Escreva o nome do perfil", "ru_RU": "Пожалуйста, введите никнейм", + "sv_SE": "Ange ett profilnamn", "th_TH": "กรุณาใส่ชื่อโปรไฟล์", "tr_TR": "Lütfen Bir Profil İsmi Girin", "uk_UA": "Будь ласка, введіть ім'я профілю", @@ -10190,6 +10614,7 @@ "pl_PL": "(Maksymalna długość: {0})", "pt_BR": "(Máximo de caracteres: {0})", "ru_RU": "(Максимальная длина: {0})", + "sv_SE": "(Max längd: {0})", "th_TH": "(ความยาวสูงสุด: {0})", "tr_TR": "(Maksimum Uzunluk: {0})", "uk_UA": "(Макс. довжина: {0})", @@ -10214,6 +10639,7 @@ "pl_PL": "Wybierz awatar", "pt_BR": "Escolher", "ru_RU": "Выбрать аватар", + "sv_SE": "Välj avatar", "th_TH": "เลือก รูปอวาต้า ของคุณ", "tr_TR": "Seç", "uk_UA": "Вибрати", @@ -10238,6 +10664,7 @@ "pl_PL": "Ustaw kolor tła", "pt_BR": "Definir cor de fundo", "ru_RU": "Установить цвет фона", + "sv_SE": "Välj bakgrundsfärg", "th_TH": "ตั้งค่าสีพื้นหลัง", "tr_TR": "Arka Plan Rengi Ayarla", "uk_UA": "Встановити колір фону", @@ -10262,6 +10689,7 @@ "pl_PL": "Zamknij", "pt_BR": "Fechar", "ru_RU": "Закрыть", + "sv_SE": "Stäng", "th_TH": "ปิด", "tr_TR": "Kapat", "uk_UA": "Закрити", @@ -10286,6 +10714,7 @@ "pl_PL": "Wczytaj profil", "pt_BR": "Carregar perfil", "ru_RU": "Загрузить профиль", + "sv_SE": "Läs in profil", "th_TH": "โหลด โปรไฟล์", "tr_TR": "Profil Yükle", "uk_UA": "Завантажити профіль", @@ -10310,6 +10739,7 @@ "pl_PL": "", "pt_BR": "", "ru_RU": "", + "sv_SE": "Visa profil", "th_TH": "", "tr_TR": "", "uk_UA": "Показати профіль", @@ -10334,6 +10764,7 @@ "pl_PL": "Dodaj profil", "pt_BR": "Adicionar perfil", "ru_RU": "Добавить профиль", + "sv_SE": "Lägg till profil", "th_TH": "เพิ่ม โปรไฟล์", "tr_TR": "Profil Ekle", "uk_UA": "Додати профіль", @@ -10358,6 +10789,7 @@ "pl_PL": "Usuń profil", "pt_BR": "Remover perfil", "ru_RU": "Удалить профиль", + "sv_SE": "Ta bort profil", "th_TH": "ลบ โปรไฟล์", "tr_TR": "Profili Kaldır", "uk_UA": "Видалити профіль", @@ -10382,6 +10814,7 @@ "pl_PL": "Zapisz profil", "pt_BR": "Salvar perfil", "ru_RU": "Сохранить профиль", + "sv_SE": "Spara profil", "th_TH": "บันทึก โปรไฟล์", "tr_TR": "Profili Kaydet", "uk_UA": "Зберегти профіль", @@ -10406,6 +10839,7 @@ "pl_PL": "Zrób zrzut ekranu", "pt_BR": "Salvar captura de tela", "ru_RU": "Сделать снимок экрана", + "sv_SE": "Ta skärmbild", "th_TH": "ถ่ายภาพหน้าจอ", "tr_TR": "Ekran Görüntüsü Al", "uk_UA": "Зробити знімок екрана", @@ -10430,6 +10864,7 @@ "pl_PL": "Ukryj interfejs użytkownika", "pt_BR": "Esconder Interface", "ru_RU": "Скрыть интерфейс", + "sv_SE": "Dölj gränssnittet", "th_TH": "ซ่อน UI", "tr_TR": "Arayüzü Gizle", "uk_UA": "Сховати інтерфейс", @@ -10454,6 +10889,7 @@ "pl_PL": "Uruchom aplikację ", "pt_BR": "Executar Aplicativo", "ru_RU": "Запуск приложения", + "sv_SE": "Kör applikation", "th_TH": "เปิดใช้งานแอปพลิเคชัน", "tr_TR": "Uygulamayı Çalıştır", "uk_UA": "Запустити додаток", @@ -10478,6 +10914,7 @@ "pl_PL": "Przełącz na ulubione", "pt_BR": "Alternar favorito", "ru_RU": "Добавить в избранное", + "sv_SE": "Växla som favorit", "th_TH": "สลับรายการโปรด", "tr_TR": "Favori Ayarla", "uk_UA": "Перемкнути вибране", @@ -10502,6 +10939,7 @@ "pl_PL": "Przełącz status Ulubionej Gry", "pt_BR": "Marca ou desmarca jogo como favorito", "ru_RU": "Добавляет игру в избранное и помечает звездочкой", + "sv_SE": "Växla favoritstatus för spelet", "th_TH": "สลับสถานะเกมที่ชื่นชอบ", "tr_TR": "Oyunu Favorilere Ekle/Çıkar", "uk_UA": "Перемкнути улюблений статус гри", @@ -10526,6 +10964,7 @@ "pl_PL": "Motyw:", "pt_BR": "Tema:", "ru_RU": "Тема:", + "sv_SE": "Tema:", "th_TH": "ธีม:", "tr_TR": "Tema:", "uk_UA": "Тема:", @@ -10550,6 +10989,7 @@ "pl_PL": "", "pt_BR": "Automático", "ru_RU": "", + "sv_SE": "Automatiskt", "th_TH": "อัตโนมัติ", "tr_TR": "", "uk_UA": "Авто.", @@ -10574,6 +11014,7 @@ "pl_PL": "Ciemny", "pt_BR": "Escuro", "ru_RU": "Темная", + "sv_SE": "Mörkt", "th_TH": "มืด", "tr_TR": "Karanlık", "uk_UA": "Темна", @@ -10598,6 +11039,7 @@ "pl_PL": "Jasny", "pt_BR": "Claro", "ru_RU": "Светлая", + "sv_SE": "Ljust", "th_TH": "สว่าง", "tr_TR": "Aydınlık", "uk_UA": "Світла", @@ -10622,6 +11064,7 @@ "pl_PL": "Konfiguruj", "pt_BR": "Configurar", "ru_RU": "Настройка", + "sv_SE": "Konfigurera", "th_TH": "กำหนดค่า", "tr_TR": "Ayarla", "uk_UA": "Налаштування", @@ -10646,6 +11089,7 @@ "pl_PL": "Wibracje", "pt_BR": "Vibração", "ru_RU": "Вибрация", + "sv_SE": "Vibration", "th_TH": "การสั่นไหว", "tr_TR": "Titreşim", "uk_UA": "Вібрація", @@ -10670,6 +11114,7 @@ "pl_PL": "Mnożnik mocnych wibracji", "pt_BR": "Multiplicador de vibração forte", "ru_RU": "Множитель сильной вибрации", + "sv_SE": "Försvaga stark vibration", "th_TH": "เพิ่มความแรงการสั่น", "tr_TR": "Güçlü Titreşim Çoklayıcı", "uk_UA": "Множник сильної вібрації", @@ -10694,6 +11139,7 @@ "pl_PL": "Mnożnik słabych wibracji", "pt_BR": "Multiplicador de vibração fraca", "ru_RU": "Множитель слабой вибрации", + "sv_SE": "Förstärk svag vibration", "th_TH": "ลดความแรงการสั่น", "tr_TR": "Zayıf Titreşim Seviyesi", "uk_UA": "Множник слабкої вібрації", @@ -10718,6 +11164,7 @@ "pl_PL": "Nie ma zapisanych danych dla {0} [{1:x16}]", "pt_BR": "Não há jogos salvos para {0} [{1:x16}]", "ru_RU": "Нет сохранений для {0} [{1:x16}]", + "sv_SE": "Det finns inget sparat spel för {0} [{1:x16}]", "th_TH": "ไม่มีข้อมูลบันทึกไว้สำหรับ {0} [{1:x16}]", "tr_TR": "{0} [{1:x16}] için kayıt verisi bulunamadı", "uk_UA": "Немає збережених даних для {0} [{1:x16}]", @@ -10742,6 +11189,7 @@ "pl_PL": "Czy chcesz utworzyć zapis danych dla tej gry?", "pt_BR": "Gostaria de criar o diretório de salvamento para esse jogo?", "ru_RU": "Создать сохранение для этой игры?", + "sv_SE": "Vill du skapa sparat spel för detta spel?", "th_TH": "คุณต้องการสร้างบันทึกข้อมูลสำหรับเกมนี้หรือไม่?", "tr_TR": "Bu oyun için kayıt verisi oluşturmak ister misiniz?", "uk_UA": "Хочете створити дані збереження для цієї гри?", @@ -10766,6 +11214,7 @@ "pl_PL": "Ryujinx - Potwierdzenie", "pt_BR": "Ryujinx - Confirmação", "ru_RU": "Ryujinx - Подтверждение", + "sv_SE": "Ryujinx - Bekräftelse", "th_TH": "Ryujinx - ยืนยัน", "tr_TR": "Ryujinx - Onay", "uk_UA": "Ryujinx - Підтвердження", @@ -10790,6 +11239,7 @@ "pl_PL": "Ryujinx - Asystent aktualizacji", "pt_BR": "Ryujinx - Atualizador", "ru_RU": "Ryujinx - Обновление", + "sv_SE": "Ryujinx - Uppdatering", "th_TH": "Ryujinx - อัพเดต", "tr_TR": "Ryujinx - Güncelleyici", "uk_UA": "Ryujinx - Програма оновлення", @@ -10814,6 +11264,7 @@ "pl_PL": "Ryujinx - Błąd", "pt_BR": "Ryujinx - Erro", "ru_RU": "Ryujinx - Ошибка", + "sv_SE": "Ryujinx - Fel", "th_TH": "Ryujinx - ผิดพลาด", "tr_TR": "Ryujinx - Hata", "uk_UA": "Ryujinx - Помилка", @@ -10838,6 +11289,7 @@ "pl_PL": "Ryujinx - Ostrzeżenie", "pt_BR": "Ryujinx - Alerta", "ru_RU": "Ryujinx - Предупреждение", + "sv_SE": "Ryujinx - Varning", "th_TH": "Ryujinx - คำเตือน", "tr_TR": "Ryujinx - Uyarı", "uk_UA": "Ryujinx - Попередження", @@ -10862,6 +11314,7 @@ "pl_PL": "Ryujinx - Wyjdź", "pt_BR": "Ryujinx - Sair", "ru_RU": "Ryujinx - Выход", + "sv_SE": "Ryujinx - Avslut", "th_TH": "Ryujinx - ออก", "tr_TR": "Ryujinx - Çıkış", "uk_UA": "Ryujinx - Вихід", @@ -10886,6 +11339,7 @@ "pl_PL": "Ryujinx napotkał błąd", "pt_BR": "Ryujinx encontrou um erro", "ru_RU": "Ryujinx обнаружил ошибку", + "sv_SE": "Ryujinx har påträffat ett fel", "th_TH": "Ryujinx พบข้อผิดพลาด", "tr_TR": "Ryujinx bir hata ile karşılaştı", "uk_UA": "У Ryujinx сталася помилка", @@ -10910,6 +11364,7 @@ "pl_PL": "Czy na pewno chcesz zamknąć Ryujinx?", "pt_BR": "Tem certeza que deseja fechar o Ryujinx?", "ru_RU": "Вы уверены, что хотите выйти из Ryujinx?", + "sv_SE": "Är du säker på att du vill avsluta Ryujinx?", "th_TH": "คุณแน่ใจหรือไม่ว่าต้องการปิด Ryujinx หรือไม่?", "tr_TR": "Ryujinx'i kapatmak istediğinizden emin misiniz?", "uk_UA": "Ви впевнені, що бажаєте закрити Ryujinx?", @@ -10934,6 +11389,7 @@ "pl_PL": "Wszystkie niezapisane dane zostaną utracone!", "pt_BR": "Todos os dados que não foram salvos serão perdidos!", "ru_RU": "Все несохраненные данные будут потеряны", + "sv_SE": "Allt data som inte sparats kommer att förloras!", "th_TH": "ข้อมูลทั้งหมดที่ไม่ได้บันทึกทั้งหมดจะสูญหาย!", "tr_TR": "Kaydedilmeyen bütün veriler kaybedilecek!", "uk_UA": "Усі незбережені дані буде втрачено!", @@ -10958,6 +11414,7 @@ "pl_PL": "Wystąpił błąd podczas tworzenia określonych zapisanych danych: {0}", "pt_BR": "Ocorreu um erro ao criar o diretório de salvamento: {0}", "ru_RU": "Произошла ошибка при создании указанных данных сохранения: {0}", + "sv_SE": "Det inträffade ett fel vid skapandet av angivet sparat spel: {0}", "th_TH": "มีข้อผิดพลาดในการสร้างข้อมูลบันทึกที่ระบุ: {0}", "tr_TR": "Belirtilen kayıt verisi oluşturulurken bir hata oluştu: {0}", "uk_UA": "Під час створення вказаних даних збереження сталася помилка: {0}", @@ -10982,6 +11439,7 @@ "pl_PL": "Wystąpił błąd podczas próby znalezienia określonych zapisanych danych: {0}", "pt_BR": "Ocorreu um erro ao tentar encontrar o diretório de salvamento: {0}", "ru_RU": "Произошла ошибка при поиске указанных данных сохранения: {0}", + "sv_SE": "Det inträffade ett fel vid sökandet av angivet sparat spel: {0}", "th_TH": "มีข้อผิดพลาดในการค้นหาข้อมูลบันทึกที่ระบุไว้: {0}", "tr_TR": "Belirtilen kayıt verisi bulunmaya çalışırken hata: {0}", "uk_UA": "Під час пошуку вказаних даних збереження сталася помилка: {0}", @@ -11006,6 +11464,7 @@ "pl_PL": "Wybierz folder, do którego chcesz rozpakować", "pt_BR": "Escolha o diretório onde os arquivos serão extraídos", "ru_RU": "Выберите папку для извлечения", + "sv_SE": "Välj en mapp att extrahera till", "th_TH": "เลือกโฟลเดอร์ที่จะแตกไฟล์เข้าไป", "tr_TR": "İçine ayıklanacak klasörü seç", "uk_UA": "Виберіть теку для видобування", @@ -11030,6 +11489,7 @@ "pl_PL": "Wypakowywanie sekcji {0} z {1}...", "pt_BR": "Extraindo seção {0} de {1}...", "ru_RU": "Извлечение {0} раздела из {1}...", + "sv_SE": "Extraherar {0}-sektion från {1}...", "th_TH": "กำลังแตกไฟล์ {0} จากส่วน {1}...", "tr_TR": "{1} den {0} kısmı ayıklanıyor...", "uk_UA": "Видобування розділу {0} з {1}...", @@ -11054,6 +11514,7 @@ "pl_PL": "Asystent wypakowania sekcji NCA", "pt_BR": "Extrator de seções NCA", "ru_RU": "Извлечение разделов NCA", + "sv_SE": "Ryujinx - Extrahera NCA-sektion", "th_TH": "เครื่องมือแตกไฟล์ของ NCA", "tr_TR": "NCA Kısmı Ayıklayıcısı", "uk_UA": "Екстрактор розділів NCA", @@ -11078,6 +11539,7 @@ "pl_PL": "Niepowodzenie podczas wypakowywania. W wybranym pliku nie było głównego NCA.", "pt_BR": "Falha na extração. O NCA principal não foi encontrado no arquivo selecionado.", "ru_RU": "Ошибка извлечения. Основной NCA не присутствовал в выбранном файле.", + "sv_SE": "Fel vid extrahering. Main NCA hittades inte i vald fil.", "th_TH": "เกิดความล้มเหลวในการแตกไฟล์เนื่องจากไม่พบ NCA หลักในไฟล์ที่เลือก", "tr_TR": "Ayıklama hatası. Ana NCA seçilen dosyada bulunamadı.", "uk_UA": "Помилка видобування. Основний NCA не був присутній у вибраному файлі.", @@ -11102,6 +11564,7 @@ "pl_PL": "Niepowodzenie podczas wypakowywania. Przeczytaj plik dziennika, aby uzyskać więcej informacji.", "pt_BR": "Falha na extração. Leia o arquivo de log para mais informações.", "ru_RU": "Ошибка извлечения. Прочтите файл журнала для получения дополнительной информации.", + "sv_SE": "Fel vid extrahering. Läs i loggfilen för mer information.", "th_TH": "เกิดความล้มเหลวในการแตกไฟล์ โปรดอ่านไฟล์บันทึกประวัติเพื่อดูข้อมูลเพิ่มเติม", "tr_TR": "Ayıklama hatası. Ek bilgi için kayıt dosyasını okuyun.", "uk_UA": "Помилка видобування. Прочитайте файл журналу для отримання додаткової інформації.", @@ -11126,6 +11589,7 @@ "pl_PL": "Wypakowywanie zakończone pomyślnie.", "pt_BR": "Extração concluída com êxito.", "ru_RU": "Извлечение завершено успешно.", + "sv_SE": "Extraheringen lyckades.", "th_TH": "การแตกไฟล์เสร็จสมบูรณ์แล้ว", "tr_TR": "Ayıklama başarıyla tamamlandı.", "uk_UA": "Видобування успішно завершено.", @@ -11150,6 +11614,7 @@ "pl_PL": "Nie udało się przekonwertować obecnej wersji Ryujinx.", "pt_BR": "Falha ao converter a versão atual do Ryujinx.", "ru_RU": "Не удалось преобразовать текущую версию Ryujinx.", + "sv_SE": "Misslyckades med att konvertera aktuell Ryujinx-version.", "th_TH": "ไม่สามารถแปลงเวอร์ชั่น Ryujinx ปัจจุบันได้", "tr_TR": "Güncel Ryujinx sürümü dönüştürülemedi.", "uk_UA": "Не вдалося конвертувати поточну версію Ryujinx.", @@ -11174,6 +11639,7 @@ "pl_PL": "Anulowanie aktualizacji!", "pt_BR": "Cancelando atualização!", "ru_RU": "Отмена обновления...", + "sv_SE": "Avbryter uppdatering!", "th_TH": "ยกเลิกการอัพเดต!", "tr_TR": "Güncelleme iptal ediliyor!", "uk_UA": "Скасування оновлення!", @@ -11198,6 +11664,7 @@ "pl_PL": "Używasz już najnowszej wersji Ryujinx!", "pt_BR": "Você já está usando a versão mais recente do Ryujinx!", "ru_RU": "Вы используете самую последнюю версию Ryujinx", + "sv_SE": "Du använder redan den senaste versionen av Ryujinx!", "th_TH": "คุณกำลังใช้ Ryujinx เวอร์ชั่นที่อัปเดตล่าสุด!", "tr_TR": "Zaten Ryujinx'in en güncel sürümünü kullanıyorsunuz!", "uk_UA": "Ви вже використовуєте останню версію Ryujinx!", @@ -11222,6 +11689,7 @@ "pl_PL": "Wystąpił błąd podczas próby uzyskania informacji o obecnej wersji z GitHub Release. Może to być spowodowane nową wersją kompilowaną przez GitHub Actions. Spróbuj ponownie za kilka minut.", "pt_BR": "Ocorreu um erro ao tentar obter as informações de atualização do GitHub Release. Isso pode ser causado se uma nova versão estiver sendo compilado pelas Ações do GitHub. Tente novamente em alguns minutos.", "ru_RU": "Произошла ошибка при попытке получить информацию о выпуске от GitHub Release. Это может быть вызвано тем, что в данный момент в GitHub Actions компилируется новый релиз. Повторите попытку позже.", + "sv_SE": "Ett fel inträffade vid försök att hämta information om utgåvan från GitHub. Detta kan hända om en ny utgåva har kompilerats av GitHub Actions. Försök igen om några minuter.", "th_TH": "เกิดข้อผิดพลาดขณะพยายามรับข้อมูลเวอร์ชั่นจาก GitHub Release ปัญหานี้อาจเกิดขึ้นได้หากมีการรวบรวมเวอร์ชั่นใหม่โดย GitHub โปรดลองอีกครั้งในอีกไม่กี่นาทีข้างหน้า", "tr_TR": "GitHub tarafından sürüm bilgileri alınırken bir hata oluştu. Eğer yeni sürüm için hazırlıklar yapılıyorsa bu hatayı almanız olasıdır. Lütfen birkaç dakika sonra tekrar deneyiniz.", "uk_UA": "Під час спроби отримати інформацію про випуск із GitHub Release сталася помилка. Це може бути спричинено, якщо новий випуск компілюється GitHub Actions. Повторіть спробу через кілька хвилин.", @@ -11246,6 +11714,7 @@ "pl_PL": "Nie udało się przekonwertować otrzymanej wersji Ryujinx z Github Release.", "pt_BR": "Falha ao converter a versão do Ryujinx recebida do AppVeyor.", "ru_RU": "Не удалось преобразовать полученную версию Ryujinx из GitHub Release.", + "sv_SE": "Misslyckades med att konvertera mottagen Ryujinx-version från GitHub.", "th_TH": "ไม่สามารถแปลงเวอร์ชั่น Ryujinx ที่ได้รับจาก GitHub Release", "tr_TR": "Github Release'den alınan Ryujinx sürümü dönüştürülemedi.", "uk_UA": "Не вдалося конвертувати отриману версію Ryujinx із випуску GitHub.", @@ -11270,6 +11739,7 @@ "pl_PL": "Pobieranie aktualizacji...", "pt_BR": "Baixando atualização...", "ru_RU": "Загрузка обновления...", + "sv_SE": "Hämtar uppdatering...", "th_TH": "กำลังดาวน์โหลดอัปเดต...", "tr_TR": "Güncelleme İndiriliyor...", "uk_UA": "Завантаження оновлення...", @@ -11294,6 +11764,7 @@ "pl_PL": "Wypakowywanie Aktualizacji...", "pt_BR": "Extraindo atualização...", "ru_RU": "Извлечение обновления...", + "sv_SE": "Extraherar uppdatering...", "th_TH": "กำลังแตกไฟล์อัปเดต...", "tr_TR": "Güncelleme Ayıklanıyor...", "uk_UA": "Видобування оновлення...", @@ -11318,6 +11789,7 @@ "pl_PL": "Zmiana Nazwy Aktualizacji...", "pt_BR": "Renomeando atualização...", "ru_RU": "Переименование обновления...", + "sv_SE": "Byter namn på uppdatering...", "th_TH": "กำลังลบไฟล์เก่า...", "tr_TR": "Güncelleme Yeniden Adlandırılıyor...", "uk_UA": "Перейменування оновлення...", @@ -11342,6 +11814,7 @@ "pl_PL": "Dodawanie Nowej Aktualizacji...", "pt_BR": "Adicionando nova atualização...", "ru_RU": "Добавление нового обновления...", + "sv_SE": "Lägger till ny uppdatering...", "th_TH": "กำลังเพิ่มไฟล์อัปเดตใหม่...", "tr_TR": "Yeni Güncelleme Ekleniyor...", "uk_UA": "Додавання нового оновлення...", @@ -11366,6 +11839,7 @@ "pl_PL": "", "pt_BR": "", "ru_RU": "", + "sv_SE": "Visa ändringslogg", "th_TH": "", "tr_TR": "", "uk_UA": "Показати список змін", @@ -11390,6 +11864,7 @@ "pl_PL": "Aktualizacja Zakończona!", "pt_BR": "Atualização concluída!", "ru_RU": "Обновление завершено", + "sv_SE": "Uppdatering färdig!", "th_TH": "อัปเดตเสร็จสมบูรณ์แล้ว!", "tr_TR": "Güncelleme Tamamlandı!", "uk_UA": "Оновлення завершено!", @@ -11414,6 +11889,7 @@ "pl_PL": "Czy chcesz teraz zrestartować Ryujinx?", "pt_BR": "Deseja reiniciar o Ryujinx agora?", "ru_RU": "Перезапустить Ryujinx?", + "sv_SE": "Vill du starta om Ryujinx nu?", "th_TH": "คุณต้องการรีสตาร์ท Ryujinx ตอนนี้หรือไม่?", "tr_TR": "Ryujinx'i şimdi yeniden başlatmak istiyor musunuz?", "uk_UA": "Перезапустити Ryujinx зараз?", @@ -11438,6 +11914,7 @@ "pl_PL": "Nie masz połączenia z Internetem!", "pt_BR": "Você não está conectado à Internet!", "ru_RU": "Вы не подключены к интернету", + "sv_SE": "Du är inte ansluten till internet!", "th_TH": "คุณไม่ได้เชื่อมต่อกับอินเทอร์เน็ต!", "tr_TR": "İnternete bağlı değilsiniz!", "uk_UA": "Ви не підключені до Інтернету!", @@ -11462,6 +11939,7 @@ "pl_PL": "Sprawdź, czy masz działające połączenie internetowe!", "pt_BR": "Por favor, certifique-se de que você tem uma conexão funcional à Internet!", "ru_RU": "Убедитесь, что у вас работает подключение к интернету", + "sv_SE": "Försäkra dig om att du har en fungerande internetanslutning!", "th_TH": "โปรดตรวจสอบว่าคุณมีการเชื่อมต่ออินเทอร์เน็ตว่ามีการใช้งานได้หรือไม่!", "tr_TR": "Lütfen aktif bir internet bağlantınız olduğunu kontrol edin!", "uk_UA": "Будь ласка, переконайтеся, що у вас є робоче підключення до Інтернету!", @@ -11486,6 +11964,7 @@ "pl_PL": "Nie możesz zaktualizować Dirty wersji Ryujinx!", "pt_BR": "Você não pode atualizar uma compilação Dirty do Ryujinx!", "ru_RU": "Вы не можете обновлять Dirty Build", + "sv_SE": "Du kan inte uppdatera en Dirty build av Ryujinx!", "th_TH": "คุณไม่สามารถอัปเดต Dirty build ของ Ryujinx ได้!", "tr_TR": "Ryujinx'in Dirty build'lerini güncelleyemezsiniz!", "uk_UA": "Ви не можете оновити брудну збірку Ryujinx!", @@ -11506,10 +11985,11 @@ "it_IT": "Scarica Ryujinx da https://ryujinx.app/download se stai cercando una versione supportata.", "ja_JP": "サポートされているバージョンをお探しなら, https://ryujinx.app/download で Ryujinx をダウンロードしてください.", "ko_KR": "지원되는 버전을 찾으신다면 https://ryujinx.app/download 에서 Ryujinx를 내려받으세요.", - "no_NO": "Vennligst last ned Ryujinx på https://ryujinx.org/ hvis du ser etter en støttet versjon.", + "no_NO": "Vennligst last ned Ryujinx på https://ryujinx.app/download hvis du ser etter en støttet versjon.", "pl_PL": "Pobierz Ryujinx ze strony https://ryujinx.app/download, jeśli szukasz obsługiwanej wersji.", "pt_BR": "Por favor, baixe o Ryujinx em https://ryujinx.app/download se está procurando por uma versão suportada.", "ru_RU": "Загрузите Ryujinx по адресу https://ryujinx.app/download если вам нужна поддерживаемая версия.", + "sv_SE": "Hämta Ryujinx från https://ryujinx.app/download om du letar efter en version som stöds.", "th_TH": "โปรดดาวน์โหลด Ryujinx ได้ที่ https://ryujinx.app/download หากคุณกำลังมองหาเวอร์ชั่นที่รองรับ", "tr_TR": "Desteklenen bir sürüm için lütfen Ryujinx'i https://ryujinx.app/download sitesinden indirin.", "uk_UA": "Будь ласка, завантажте Ryujinx на https://ryujinx.app/download, якщо ви шукаєте підтримувану версію.", @@ -11534,6 +12014,7 @@ "pl_PL": "Wymagane Ponowne Uruchomienie", "pt_BR": "Reinicialização necessária", "ru_RU": "Требуется перезагрузка", + "sv_SE": "Omstart krävs", "th_TH": "จำเป็นต้องรีสตาร์ทเพื่อให้การอัพเดตสามารถให้งานได้", "tr_TR": "Yeniden Başlatma Gerekli", "uk_UA": "Потрібен перезапуск", @@ -11558,6 +12039,7 @@ "pl_PL": "Motyw został zapisany. Aby zastosować motyw, konieczne jest ponowne uruchomienie.", "pt_BR": "O tema foi salvo. Uma reinicialização é necessária para aplicar o tema.", "ru_RU": "Тема сохранена. Для применения темы требуется перезапуск.", + "sv_SE": "Temat har sparats. En omstart krävs för att verkställa ändringen.", "th_TH": "บันทึกธีมแล้ว จำเป็นต้องรีสตาร์ทเพื่อใช้ธีม", "tr_TR": "Tema kaydedildi. Temayı uygulamak için yeniden başlatma gerekiyor.", "uk_UA": "Тему збережено. Щоб застосувати тему, потрібен перезапуск.", @@ -11582,6 +12064,7 @@ "pl_PL": "Czy chcesz uruchomić ponownie?", "pt_BR": "Deseja reiniciar?", "ru_RU": "Хотите перезапустить", + "sv_SE": "Vill du starta om", "th_TH": "คุณต้องการรีสตาร์ทหรือไม่?", "tr_TR": "Yeniden başlatmak ister misiniz", "uk_UA": "Ви хочете перезапустити", @@ -11606,6 +12089,7 @@ "pl_PL": "Czy chcesz zainstalować firmware wbudowany w tę grę? (Firmware {0})", "pt_BR": "Gostaria de instalar o firmware incluso neste jogo? (Firmware {0})", "ru_RU": "Хотите установить прошивку, встроенную в эту игру? (Прошивка {0})", + "sv_SE": "Vill du installera det firmware som är inbäddat i detta spel? (Firmware {0})", "th_TH": "คุณต้องการติดตั้งเฟิร์มแวร์ที่ฝังอยู่ในเกมนี้หรือไม่? (เฟิร์มแวร์ {0})", "tr_TR": "Bu oyunun içine gömülü olan yazılımı yüklemek ister misiniz? (Firmware {0})", "uk_UA": "Бажаєте встановити прошивку, вбудовану в цю гру? (Прошивка {0})", @@ -11630,6 +12114,7 @@ "pl_PL": "Nie znaleziono zainstalowanego oprogramowania, ale Ryujinx był w stanie zainstalować oprogramowanie {0} z dostarczonej gry.\n\nEmulator uruchomi się teraz.", "pt_BR": "Nenhum firmware instalado foi encontrado, mas o Ryujinx conseguiu instalar o firmware {0} a partir do jogo fornecido.\nO emulador será iniciado agora.", "ru_RU": "Установленная прошивка не была найдена, но Ryujinx удалось установить прошивку {0} из предоставленной игры.\nТеперь эмулятор запустится.", + "sv_SE": "Inget installerat firmware hittades men Ryujinx kunde installera firmware {0} från angiven spel.\nEmulatorn kommer nu att startas.", "th_TH": "ไม่พบเฟิร์มแวร์ที่ติดตั้งไว้ แต่ Ryujinx จะติดตั้งเฟิร์มแวร์ได้ {0} จากเกมที่ให้มา\nขณะนี้โปรแกรมจำลองจะเริ่มทำงาน", "tr_TR": "", "uk_UA": "Встановлену прошивку не знайдено, але Ryujinx вдалося встановити прошивку {0} з наданої гри.\nТепер запуститься емулятор.", @@ -11654,6 +12139,7 @@ "pl_PL": "Brak Zainstalowanego Firmware'u", "pt_BR": "Firmware não foi instalado", "ru_RU": "Прошивка не установлена", + "sv_SE": "Inget firmware installerat", "th_TH": "ไม่มีการติดตั้งเฟิร์มแวร์", "tr_TR": "Yazılım Yüklü Değil", "uk_UA": "Прошивка не встановлена", @@ -11678,6 +12164,7 @@ "pl_PL": "Firmware {0} został zainstalowany", "pt_BR": "Firmware {0} foi instalado", "ru_RU": "Прошивка {0} была установлена", + "sv_SE": "Firmware {0} installerades", "th_TH": "เฟิร์มแวร์ {0} ติดตั้งแล้ว", "tr_TR": "Yazılım {0} yüklendi", "uk_UA": "Встановлено прошивку {0}", @@ -11702,6 +12189,7 @@ "pl_PL": "Pomyślnie zainstalowano typy plików!", "pt_BR": "Tipos de arquivo instalados com sucesso!", "ru_RU": "Типы файлов успешно установлены", + "sv_SE": "Filtyper har installerats!", "th_TH": "ติดตั้งตามประเภทของไฟล์สำเร็จแล้ว!", "tr_TR": "Dosya uzantıları başarıyla yüklendi!", "uk_UA": "Успішно встановлено типи файлів!", @@ -11726,6 +12214,7 @@ "pl_PL": "Nie udało się zainstalować typów plików.", "pt_BR": "Falha ao instalar tipos de arquivo.", "ru_RU": "Не удалось установить типы файлов.", + "sv_SE": "Misslyckades med att installera filtyper.", "th_TH": "ติดตั้งตามประเภทของไฟล์ไม่สำเร็จ", "tr_TR": "Dosya uzantıları yükleme işlemi başarısız oldu.", "uk_UA": "Не вдалося встановити типи файлів.", @@ -11750,6 +12239,7 @@ "pl_PL": "Pomyślnie odinstalowano typy plików!", "pt_BR": "Tipos de arquivo desinstalados com sucesso!", "ru_RU": "Типы файлов успешно удалены", + "sv_SE": "Filtyper avinstallerades!", "th_TH": "ถอนการติดตั้งตามประเภทของไฟล์สำเร็จแล้ว!", "tr_TR": "Dosya uzantıları başarıyla kaldırıldı!", "uk_UA": "Успішно видалено типи файлів!", @@ -11774,6 +12264,7 @@ "pl_PL": "Nie udało się odinstalować typów plików.", "pt_BR": "Falha ao desinstalar tipos de arquivo.", "ru_RU": "Не удалось удалить типы файлов.", + "sv_SE": "Misslyckades med att avinstallera filtyper.", "th_TH": "ไม่สามารถถอนการติดตั้งตามประเภทของไฟล์ได้", "tr_TR": "Dosya uzantıları kaldırma işlemi başarısız oldu.", "uk_UA": "Не вдалося видалити типи файлів.", @@ -11798,6 +12289,7 @@ "pl_PL": "Otwórz Okno Ustawień", "pt_BR": "Abrir janela de configurações", "ru_RU": "Открывает окно параметров", + "sv_SE": "Öppna inställningar", "th_TH": "เปิดหน้าต่างการตั้งค่า", "tr_TR": "Seçenekler Penceresini Aç", "uk_UA": "Відкрити вікно налаштувань", @@ -11822,6 +12314,7 @@ "pl_PL": "", "pt_BR": "", "ru_RU": "", + "sv_SE": "XCI-optimerare", "th_TH": "", "tr_TR": "", "uk_UA": "", @@ -11846,6 +12339,7 @@ "pl_PL": "Aplet Kontrolera", "pt_BR": "Applet de controle", "ru_RU": "Апплет контроллера", + "sv_SE": "Handkontroller-applet", "th_TH": "คอนโทรลเลอร์ Applet", "tr_TR": "Kumanda Applet'i", "uk_UA": "Аплет контролера", @@ -11870,6 +12364,7 @@ "pl_PL": "Błąd wyświetlania okna Dialogowego Wiadomości: {0}", "pt_BR": "Erro ao exibir diálogo de mensagem: {0}", "ru_RU": "Ошибка отображения сообщения: {0}", + "sv_SE": "Fel vid visning av meddelandedialog: {0}", "th_TH": "เกิดข้อผิดพลาดในการแสดงกล่องโต้ตอบข้อความ: {0}", "tr_TR": "Mesaj diyaloğu gösterilirken hata: {0}", "uk_UA": "Помилка показу діалогового вікна повідомлення: {0}", @@ -11894,6 +12389,7 @@ "pl_PL": "Błąd wyświetlania Klawiatury Oprogramowania: {0}", "pt_BR": "Erro ao exibir teclado virtual: {0}", "ru_RU": "Ошибка отображения программной клавиатуры: {0}", + "sv_SE": "Fel vid visning av programvarutangentbord: {0}", "th_TH": "เกิดข้อผิดพลาดในการแสดงซอฟต์แวร์แป้นพิมพ์: {0}", "tr_TR": "Mesaj diyaloğu gösterilirken hata: {0}", "uk_UA": "Помилка показу програмної клавіатури: {0}", @@ -11918,6 +12414,7 @@ "pl_PL": "Błąd wyświetlania okna Dialogowego ErrorApplet: {0}", "pt_BR": "Erro ao exibir applet ErrorApplet: {0}", "ru_RU": "Ошибка отображения диалогового окна ErrorApplet: {0}", + "sv_SE": "Fel vid visning av ErrorApplet-dialog: {0}", "th_TH": "เกิดข้อผิดพลาดในการแสดงกล่องโต้ตอบ ข้อผิดพลาดของ Applet: {0}", "tr_TR": "Applet diyaloğu gösterilirken hata: {0}", "uk_UA": "Помилка показу діалогового вікна ErrorApplet: {0}", @@ -11942,6 +12439,7 @@ "pl_PL": "", "pt_BR": "", "ru_RU": "", + "sv_SE": "", "th_TH": "", "tr_TR": "", "uk_UA": "", @@ -11966,6 +12464,7 @@ "pl_PL": "\nAby uzyskać więcej informacji o tym, jak naprawić ten błąd, zapoznaj się z naszym Przewodnikiem instalacji.", "pt_BR": "\nPara mais informações sobre como corrigir esse erro, siga nosso Guia de Configuração.", "ru_RU": "\nДля получения дополнительной информации о том, как исправить эту ошибку, следуйте нашему Руководству по установке.", + "sv_SE": "\nFölj vår konfigurationsguide för mer information om hur man rättar till detta fel.", "th_TH": "\nสำหรับข้อมูลเพิ่มเติมเกี่ยวกับวิธีแก้ไขข้อผิดพลาดนี้ โปรดทำตามคำแนะนำในการตั้งค่าของเรา", "tr_TR": "\nBu hatayı düzeltmek adına daha fazla bilgi için kurulum kılavuzumuzu takip edin.", "uk_UA": "\nДля отримання додаткової інформації про те, як виправити цю помилку, дотримуйтесь нашого посібника з налаштування.", @@ -11990,6 +12489,7 @@ "pl_PL": "Błąd Ryujinxa ({0})", "pt_BR": "Erro do Ryujinx ({0})", "ru_RU": "Ошибка Ryujinx ({0})", + "sv_SE": "Ryujinx-fel ({0}", "th_TH": "ข้อผิดพลาด Ryujinx ({0})", "tr_TR": "Ryujinx Hatası ({0})", "uk_UA": "Помилка Ryujinx ({0})", @@ -12014,6 +12514,7 @@ "pl_PL": "API Amiibo", "pt_BR": "API Amiibo", "ru_RU": "", + "sv_SE": "Amiibo-API", "th_TH": "", "tr_TR": "", "uk_UA": "", @@ -12038,6 +12539,7 @@ "pl_PL": "Wystąpił błąd podczas pobierania informacji z API.", "pt_BR": "Um erro ocorreu ao tentar obter informações da API.", "ru_RU": "Произошла ошибка при получении информации из API.", + "sv_SE": "Ett fel inträffade vid hämtning av information från API.", "th_TH": "เกิดข้อผิดพลาดขณะเรียกข้อมูลจาก API", "tr_TR": "API'dan bilgi alırken bir hata oluştu.", "uk_UA": "Під час отримання інформації з API сталася помилка.", @@ -12062,6 +12564,7 @@ "pl_PL": "Nie można połączyć się z serwerem API Amiibo. Usługa może nie działać lub może być konieczne sprawdzenie, czy połączenie internetowe jest online.", "pt_BR": "Não foi possível conectar ao servidor da API Amiibo. O serviço pode estar fora do ar ou você precisa verificar sua conexão com a Internet.", "ru_RU": "Не удалось подключиться к серверу Amiibo API. Служба может быть недоступна или вам может потребоваться проверить ваше интернет-соединение.", + "sv_SE": "Kunde inte ansluta till Amiibo API-server. Tjänsten kanske är nere eller så behöver du kontrollera att din internetanslutning fungerar.", "th_TH": "ไม่สามารถเชื่อมต่อกับเซิร์ฟเวอร์ Amiibo API บางบริการอาจหยุดทำงาน หรือไม่คุณต้องทำการตรวจสอบว่าอินเทอร์เน็ตของคุณอยู่ในสถานะเชื่อมต่ออยู่หรือไม่", "tr_TR": "Amiibo API sunucusuna bağlanılamadı. Sunucu çevrimdışı olabilir veya uygun bir internet bağlantınızın olduğunu kontrol etmeniz gerekebilir.", "uk_UA": "Неможливо підключитися до сервера Amiibo API. Можливо, служба не працює або вам потрібно перевірити, чи є підключення до Інтернету.", @@ -12086,6 +12589,7 @@ "pl_PL": "Profil {0} jest niezgodny z bieżącym systemem konfiguracji sterowania.", "pt_BR": "Perfil {0} é incompatível com o sistema de configuração de controle atual.", "ru_RU": "Профиль {0} несовместим с текущей системой конфигурации ввода.", + "sv_SE": "Profilen {0} är inte kompatibel med aktuell konfiguration för inmatning.", "th_TH": "โปรไฟล์ {0} ไม่สามารถทำงานได้กับระบบกำหนดค่าอินพุตปัจจุบัน", "tr_TR": "Profil {0} güncel giriş konfigürasyon sistemi ile uyumlu değil.", "uk_UA": "Профіль {0} несумісний із поточною системою конфігурації вводу.", @@ -12110,6 +12614,7 @@ "pl_PL": "Profil Domyślny nie może zostać nadpisany", "pt_BR": "O perfil Padrão não pode ser substituído", "ru_RU": "Профиль по умолчанию не может быть перезаписан", + "sv_SE": "Standardprofilen kan inte skrivas över", "th_TH": "โปรไฟล์เริ่มต้นไม่สามารถเขียนทับได้", "tr_TR": "Varsayılan Profil'in üstüne yazılamaz", "uk_UA": "Стандартний профіль не можна перезаписати", @@ -12134,6 +12639,7 @@ "pl_PL": "Usuwanie Profilu", "pt_BR": "Apagando perfil", "ru_RU": "Удаление профиля", + "sv_SE": "Tar bort profilen", "th_TH": "กำลังลบโปรไฟล์", "tr_TR": "Profil Siliniyor", "uk_UA": "Видалення профілю", @@ -12158,6 +12664,7 @@ "pl_PL": "Ta czynność jest nieodwracalna, czy na pewno chcesz kontynuować?", "pt_BR": "Essa ação é irreversível, tem certeza que deseja continuar?", "ru_RU": "Это действие необратимо. Вы уверены, что хотите продолжить?", + "sv_SE": "Denna åtgärd går inte att ångra. Är du säker på att du vill fortsätta?", "th_TH": "การดำเนินการนี้ไม่สามารถย้อนกลับได้ คุณแน่ใจหรือไม่ว่าต้องการดำเนินการต่อหรือไม่?", "tr_TR": "Bu eylem geri döndürülemez, devam etmek istediğinizden emin misiniz?", "uk_UA": "Цю дію неможливо скасувати. Ви впевнені, що бажаєте продовжити?", @@ -12182,6 +12689,7 @@ "pl_PL": "Uwaga", "pt_BR": "Alerta", "ru_RU": "Внимание", + "sv_SE": "Varning", "th_TH": "คำเตือน", "tr_TR": "Uyarı", "uk_UA": "Увага", @@ -12206,6 +12714,7 @@ "pl_PL": "Masz zamiar umieścić w kolejce rekompilację PPTC przy następnym uruchomieniu:\n\n{0}\n\nCzy na pewno chcesz kontynuować?", "pt_BR": "Você está prestes a apagar o cache PPTC para :\n\n{0}\n\nTem certeza que deseja continuar?", "ru_RU": "Вы собираетесь перестроить кэш PPTC при следующем запуске для:\n\n{0}\n\nВы уверены, что хотите продолжить?", + "sv_SE": "Du är på väg att kölägga en PPTC rebuild vid nästa uppstart av:\n\n{0}\n\nÄr du säker på att du vill fortsätta?", "th_TH": "คุณกำลังตั้งค่าให้มีการสร้าง PPTC ใหม่ในการบูตครั้งถัดไป:\n\n{0}\n\nคุณแน่ใจหรือไม่ว่าต้องการดำเนินการต่อหรือไม่?", "tr_TR": "Belirtilen PPTC cache silinecek :\n\n{0}\n\nDevam etmek istediğinizden emin misiniz?", "uk_UA": "Ви збираєтеся видалити кеш PPTC для:\n\n{0}\n\nВи впевнені, що бажаєте продовжити?", @@ -12230,6 +12739,7 @@ "pl_PL": "Błąd czyszczenia cache PPTC w {0}: {1}", "pt_BR": "Erro apagando cache PPTC em {0}: {1}", "ru_RU": "Ошибка очистки кэша PPTC в {0}: {1}", + "sv_SE": "Fel vid tömning av PPTC-cache i {0}: {1}", "th_TH": "มีข้อผิดพลาดในการล้างแคช PPTC {0}: {1}", "tr_TR": "Belirtilen PPTC cache temizlenirken hata {0}: {1}", "uk_UA": "Помилка очищення кешу PPTC на {0}: {1}", @@ -12254,6 +12764,7 @@ "pl_PL": "Zamierzasz usunąć cache Shaderów dla :\n\n{0}\n\nNa pewno chcesz kontynuować?", "pt_BR": "Você está prestes a apagar o cache de Shader para :\n\n{0}\n\nTem certeza que deseja continuar?", "ru_RU": "Вы собираетесь удалить кэш шейдеров для:\n\n{0}\n\nВы уверены, что хотите продолжить?", + "sv_SE": "Du är på väg att ta bort shader cache för :\n\n{0}\n\nÄr du säker på att du vill fortsätta?", "th_TH": "คุณกำลังจะลบแคชแสงเงา:\n\n{0}\n\nคุณแน่ใจหรือไม่ว่าต้องการดำเนินการต่อหรือไม่?", "tr_TR": "Belirtilen Shader cache silinecek :\n\n{0}\n\nDevam etmek istediğinizden emin misiniz?", "uk_UA": "Ви збираєтеся видалити кеш шейдерів для:\n\n{0}\n\nВи впевнені, що бажаєте продовжити?", @@ -12278,6 +12789,7 @@ "pl_PL": "Błąd czyszczenia cache Shaderów w {0}: {1}", "pt_BR": "Erro apagando o cache de Shader em {0}: {1}", "ru_RU": "Ошибка очистки кэша шейдеров в {0}: {1}", + "sv_SE": "Fel vid tömning av shader cache i {0}: {1}", "th_TH": "เกิดข้อผิดพลาดในการล้าง แคชแสงเงา {0}: {1}", "tr_TR": "Belirtilen Shader cache temizlenirken hata {0}: {1}", "uk_UA": "Помилка очищення кешу шейдерів на {0}: {1}", @@ -12302,6 +12814,7 @@ "pl_PL": "Ryujinx napotkał błąd", "pt_BR": "Ryujinx encontrou um erro", "ru_RU": "Ryujinx обнаружил ошибку", + "sv_SE": "Ryujinx har påträffat ett fel", "th_TH": "Ryujinx พบข้อผิดพลาด", "tr_TR": "Ryujinx bir hata ile karşılaştı", "uk_UA": "У Ryujinx сталася помилка", @@ -12326,6 +12839,7 @@ "pl_PL": "Błąd UI: Wybrana gra nie miała prawidłowego ID tytułu", "pt_BR": "Erro de interface: O jogo selecionado não tem um ID de título válido", "ru_RU": "Ошибка пользовательского интерфейса: выбранная игра не имеет действительного ID.", + "sv_SE": "Gränssnittsfel: Angivet spel saknar ett giltigt title ID", "th_TH": "ข้อผิดพลาดของ UI: เกมที่เลือกไม่มีชื่อ ID ที่ถูกต้อง", "tr_TR": "Arayüz hatası: Seçilen oyun geçerli bir title ID'ye sahip değil", "uk_UA": "Помилка інтерфейсу: вибрана гра не мала дійсного ідентифікатора назви", @@ -12350,6 +12864,7 @@ "pl_PL": "Nie znaleziono prawidłowego firmware'u systemowego w {0}.", "pt_BR": "Um firmware de sistema válido não foi encontrado em {0}.", "ru_RU": "Валидная системная прошивка не найдена в {0}.", + "sv_SE": "Ett giltigt systemfirmware hittades inte i {0}.", "th_TH": "ไม่พบเฟิร์มแวร์ของระบบที่ถูกต้อง {0}.", "tr_TR": "{0} da geçerli bir sistem firmware'i bulunamadı.", "uk_UA": "Дійсна прошивка системи не знайдена в {0}.", @@ -12374,6 +12889,7 @@ "pl_PL": "Zainstaluj Firmware {0}", "pt_BR": "Instalar firmware {0}", "ru_RU": "Установить прошивку {0}", + "sv_SE": "Installera firmware {0}", "th_TH": "ติดตั้งเฟิร์มแวร์ {0}", "tr_TR": "Firmware {0} Yükle", "uk_UA": "Встановити прошивку {0}", @@ -12398,6 +12914,7 @@ "pl_PL": "Wersja systemu {0} zostanie zainstalowana.", "pt_BR": "A versão do sistema {0} será instalada.", "ru_RU": "Будет установлена версия прошивки {0}.", + "sv_SE": "Systemversion {0} kommer att installeras.", "th_TH": "ระบบเวอร์ชั่น {0} ได้รับการติดตั้งเร็วๆ นี้", "tr_TR": "Sistem sürümü {0} yüklenecek.", "uk_UA": "Буде встановлено версію системи {0}.", @@ -12422,6 +12939,7 @@ "pl_PL": "\n\nZastąpi to obecną wersję systemu {0}.", "pt_BR": "\n\nIsso substituirá a versão do sistema atual {0}.", "ru_RU": "\n\nЭто заменит текущую версию прошивки {0}.", + "sv_SE": "\n\nDetta kommer att ersätta aktuella systemversionen {0}.", "th_TH": "\n\nสิ่งนี้จะแทนที่เวอร์ชั่นของระบบเวอร์ชั่นปัจจุบัน {0}.", "tr_TR": "\n\nBu şimdiki sistem sürümünün yerini alacak {0}.", "uk_UA": "\n\nЦе замінить поточну версію системи {0}.", @@ -12446,6 +12964,7 @@ "pl_PL": "\n\nCzy chcesz kontynuować?", "pt_BR": "\n\nDeseja continuar?", "ru_RU": "\n\nПродолжить?", + "sv_SE": "\n\nVill du fortsätta?", "th_TH": "\n\nคุณต้องการดำเนินการต่อหรือไม่?", "tr_TR": "\n\nDevam etmek istiyor musunuz?", "uk_UA": "\n\nВи хочете продовжити?", @@ -12470,6 +12989,7 @@ "pl_PL": "Instalowanie firmware'u...", "pt_BR": "Instalando firmware...", "ru_RU": "Установка прошивки...", + "sv_SE": "Installerar firmware...", "th_TH": "กำลังติดตั้งเฟิร์มแวร์...", "tr_TR": "Firmware yükleniyor...", "uk_UA": "Встановлення прошивки...", @@ -12494,6 +13014,7 @@ "pl_PL": "Wersja systemu {0} została pomyślnie zainstalowana.", "pt_BR": "Versão do sistema {0} instalada com sucesso.", "ru_RU": "Прошивка версии {0} успешно установлена.", + "sv_SE": "Systemversion {0} har installerats.", "th_TH": "ระบบเวอร์ชั่น {0} ติดตั้งเรียบร้อยแล้ว", "tr_TR": "Sistem sürümü {0} başarıyla yüklendi.", "uk_UA": "Версію системи {0} успішно встановлено.", @@ -12518,6 +13039,7 @@ "pl_PL": "", "pt_BR": "", "ru_RU": "", + "sv_SE": "En ogiltig nyckelfil hittades i {0}", "th_TH": "", "tr_TR": "", "uk_UA": "", @@ -12542,6 +13064,7 @@ "pl_PL": "", "pt_BR": "", "ru_RU": "", + "sv_SE": "Installera nycklar", "th_TH": "", "tr_TR": "", "uk_UA": "Встановлення Ключів", @@ -12566,6 +13089,7 @@ "pl_PL": "", "pt_BR": "", "ru_RU": "", + "sv_SE": "Ny nyckelfil kommer att installeras.", "th_TH": "", "tr_TR": "", "uk_UA": "Новий файл Ключів буде встановлено", @@ -12590,6 +13114,7 @@ "pl_PL": "", "pt_BR": "", "ru_RU": "", + "sv_SE": "\n\nDetta kan ersätta några av de redan installerade nycklarna.", "th_TH": "", "tr_TR": "", "uk_UA": "\n\nЦе замінить собою поточні файли Ключів.", @@ -12614,6 +13139,7 @@ "pl_PL": "", "pt_BR": "", "ru_RU": "", + "sv_SE": "\n\nVill du fortsätta?", "th_TH": "", "tr_TR": "", "uk_UA": "\n\nВи хочете продовжити?", @@ -12638,6 +13164,7 @@ "pl_PL": "", "pt_BR": "", "ru_RU": "", + "sv_SE": "Installerar nycklar...", "th_TH": "", "tr_TR": "", "uk_UA": "Встановлення Ключів...", @@ -12662,6 +13189,7 @@ "pl_PL": "", "pt_BR": "", "ru_RU": "", + "sv_SE": "Ny nyckelfil installerades.", "th_TH": "", "tr_TR": "", "uk_UA": "Нові ключі встановлено.", @@ -12686,6 +13214,7 @@ "pl_PL": "Nie będzie innych profili do otwarcia, jeśli wybrany profil zostanie usunięty", "pt_BR": "Não haveria nenhum perfil selecionado se o perfil atual fosse deletado", "ru_RU": "Если выбранный профиль будет удален, другие профили не будут открываться.", + "sv_SE": "Det skulle inte finnas några andra profiler att öppnas om angiven profil tas bort", "th_TH": "จะไม่มีโปรไฟล์อื่นให้เปิดหากโปรไฟล์ที่เลือกถูกลบ", "tr_TR": "Seçilen profil silinirse kullanılabilen başka profil kalmayacak", "uk_UA": "Якщо вибраний профіль буде видалено, інші профілі не відкриватимуться", @@ -12710,6 +13239,7 @@ "pl_PL": "Czy chcesz usunąć wybrany profil", "pt_BR": "Deseja deletar o perfil selecionado", "ru_RU": "Удалить выбранный профиль?", + "sv_SE": "Vill du ta bort den valda profilen", "th_TH": "คุณต้องการลบโปรไฟล์ที่เลือกหรือไม่?", "tr_TR": "Seçilen profili silmek istiyor musunuz", "uk_UA": "Ви хочете видалити вибраний профіль", @@ -12734,6 +13264,7 @@ "pl_PL": "Uwaga - Niezapisane zmiany", "pt_BR": "Alerta - Alterações não salvas", "ru_RU": "Внимание - Несохраненные изменения", + "sv_SE": "Varning - Ej sparade ändringar", "th_TH": "คำเตือน - มีการเปลี่ยนแปลงที่ไม่ได้บันทึก", "tr_TR": "Uyarı - Kaydedilmemiş Değişiklikler", "uk_UA": "Увага — Незбережені зміни", @@ -12758,6 +13289,7 @@ "pl_PL": "Wprowadziłeś zmiany dla tego profilu użytkownika, które nie zostały zapisane.", "pt_BR": "Você fez alterações para este perfil de usuário que não foram salvas.", "ru_RU": "В эту учетную запись внесены изменения, которые не были сохранены.", + "sv_SE": "Du har gjort ändringar i denna användarprofil som inte har sparats.", "th_TH": "คุณได้ทำการเปลี่ยนแปลงโปรไฟล์ผู้ใช้นี้โดยไม่ได้รับการบันทึก", "tr_TR": "Kullanıcı profilinizde kaydedilmemiş değişiklikler var.", "uk_UA": "Ви зробили зміни у цьому профілю користувача які не було збережено.", @@ -12782,6 +13314,7 @@ "pl_PL": "Czy chcesz odrzucić zmiany?", "pt_BR": "Deseja descartar as alterações?", "ru_RU": "Отменить изменения?", + "sv_SE": "Vill du förkasta dina ändringar?", "th_TH": "คุณต้องการทิ้งการเปลี่ยนแปลงของคุณหรือไม่?", "tr_TR": "Yaptığınız değişiklikleri iptal etmek istediğinize emin misiniz?", "uk_UA": "Бажаєте скасувати зміни?", @@ -12806,6 +13339,7 @@ "pl_PL": "Aktualne ustawienia kontrolera zostały zaktualizowane.", "pt_BR": "As configurações de controle atuais foram atualizadas.", "ru_RU": "Текущие настройки управления обновлены.", + "sv_SE": "Aktuella kontrollerinställningar har uppdaterats.", "th_TH": "การตั้งค่าคอนโทรลเลอร์ปัจจุบันได้รับการอัปเดตแล้ว", "tr_TR": "Geçerli kumanda seçenekleri güncellendi.", "uk_UA": "Поточні налаштування контролера оновлено.", @@ -12830,6 +13364,7 @@ "pl_PL": "Czy chcesz zapisać?", "pt_BR": "Deseja salvar?", "ru_RU": "Сохранить?", + "sv_SE": "Vill du spara?", "th_TH": "คุณต้องการบันทึกหรือไม่?", "tr_TR": "Kaydetmek istiyor musunuz?", "uk_UA": "Ви хочете зберегти?", @@ -12854,6 +13389,7 @@ "pl_PL": "{0}. Błędny plik: {1}", "pt_BR": "{0}. Arquivo com erro: {1}", "ru_RU": "{0}. Файл с ошибкой: {1}", + "sv_SE": "{0}. Fel i filen: {1}", "th_TH": "{0} ไฟล์เกิดข้อผิดพลาด: {1}", "tr_TR": "{0}. Hatalı Dosya: {1}", "uk_UA": "{0}. Файл з помилкою: {1}", @@ -12878,6 +13414,7 @@ "pl_PL": "Modyfikacja już istnieje", "pt_BR": "O mod já existe", "ru_RU": "Мод уже существует", + "sv_SE": "Modd finns redan", "th_TH": "มีม็อดนี้อยู่แล้ว", "tr_TR": "Mod zaten var", "uk_UA": "Модифікація вже існує", @@ -12902,6 +13439,7 @@ "pl_PL": "Podany katalog nie zawiera modyfikacji!", "pt_BR": "O diretório especificado não contém um mod!", "ru_RU": "Выбранная папка не содержит модов", + "sv_SE": "Den angivna katalogen innehåller inte en modd!", "th_TH": "ไดเร็กทอรีที่ระบุไม่มี ม็อดอยู่!", "tr_TR": "", "uk_UA": "Вказаний каталог не містить модифікації!", @@ -12926,6 +13464,7 @@ "pl_PL": "Nie udało się usunąć: Nie można odnaleźć katalogu nadrzędnego dla modyfikacji \"{0}\"!", "pt_BR": "Falha ao excluir: Não foi possível encontrar o diretório pai do mod \"{0}\"!", "ru_RU": "Невозможно удалить: не удалось найти папку мода \"{0}\"", + "sv_SE": "Misslyckades med att ta bort: Kunde inte hitta föräldrakatalogen för modden \"{0}\"!", "th_TH": "ไม่สามารถลบ: ไม่พบไดเร็กทอรีหลักสำหรับ ม็อด \"{0}\"!", "tr_TR": "Silme Başarısız: \"{0}\" Modu için üst dizin bulunamadı! ", "uk_UA": "Не видалено: Не знайдено батьківський каталог для модифікації \"{0}\"!", @@ -12950,6 +13489,7 @@ "pl_PL": "Określony plik nie zawiera DLC dla wybranego tytułu!", "pt_BR": "O arquivo especificado não contém DLCs para o título selecionado!", "ru_RU": "Указанный файл не содержит DLC для выбранной игры", + "sv_SE": "Den angivna filen innehåller inte en DLC för angivet spel!", "th_TH": "ไฟล์ที่ระบุไม่มี DLC สำหรับชื่อที่เลือก!", "tr_TR": "Belirtilen dosya seçilen oyun için DLC içermiyor!", "uk_UA": "Зазначений файл не містить DLC для вибраного заголовку!", @@ -12974,6 +13514,7 @@ "pl_PL": "Masz włączone rejestrowanie śledzenia, które jest przeznaczone tylko dla programistów.", "pt_BR": "Os logs de depuração estão ativos, esse recurso é feito para ser usado apenas por desenvolvedores.", "ru_RU": "У вас включено ведение журнала отладки, предназначенное только для разработчиков.", + "sv_SE": "Du har spårloggning aktiverat som endast är designat att användas av utvecklare.", "th_TH": "คุณได้เปิดใช้งานการบันทึกการติดตาม ซึ่งออกแบบมาเพื่อให้นักพัฒนาใช้เท่านั้น", "tr_TR": "Sadece geliştiriler için dizayn edilen Trace Loglama seçeneği etkin.", "uk_UA": "Ви увімкнули журнал налагодження, призначений лише для розробників.", @@ -12998,6 +13539,7 @@ "pl_PL": "Aby uzyskać optymalną wydajność, zaleca się wyłączenie rejestrowania śledzenia. Czy chcesz teraz wyłączyć rejestrowanie śledzenia?", "pt_BR": "Para melhor performance, é recomendável desabilitar os logs de depuração. Gostaria de desabilitar os logs de depuração agora?", "ru_RU": "Для оптимальной производительности рекомендуется отключить ведение журнала отладки. Хотите отключить ведение журнала отладки?", + "sv_SE": "Det rekommenderas att inaktivera spårloggning för optimal prestanda. Vill du inaktivera spårloggning nu?", "th_TH": "เพื่อประสิทธิภาพสูงสุด ขอแนะนำให้ปิดใช้งานการบันทึกการติดตาม คุณต้องการปิดใช้การบันทึกการติดตามตอนนี้หรือไม่?", "tr_TR": "En iyi performans için trace loglama'nın devre dışı bırakılması tavsiye edilir. Trace loglama seçeneğini şimdi devre dışı bırakmak ister misiniz?", "uk_UA": "Для оптимальної продуктивності рекомендується вимкнути ведення журналу налагодження. Ви хочете вимкнути ведення журналу налагодження зараз?", @@ -13022,6 +13564,7 @@ "pl_PL": "Masz włączone zrzucanie shaderów, które jest przeznaczone tylko dla programistów.", "pt_BR": "O despejo de shaders está ativo, esse recurso é feito para ser usado apenas por desenvolvedores.", "ru_RU": "У вас включен дамп шейдеров, который предназначен только для разработчиков.", + "sv_SE": "Du har aktiverat shader dumping som endast är designat att användas av utvecklare.", "th_TH": "คุณได้เปิดใช้งาน การดัมพ์เชเดอร์ ซึ่งออกแบบมาเพื่อให้นักพัฒนาใช้งานเท่านั้น", "tr_TR": "Sadece geliştiriler için dizayn edilen Shader Dumping seçeneği etkin.", "uk_UA": "Ви увімкнули скидання шейдерів, призначений лише для розробників.", @@ -13046,6 +13589,7 @@ "pl_PL": "Aby uzyskać optymalną wydajność, zaleca się wyłączenie zrzucania shaderów. Czy chcesz teraz wyłączyć zrzucanie shaderów?", "pt_BR": "Para melhor performance, é recomendável desabilitar o despejo de shaders. Gostaria de desabilitar o despejo de shaders agora?", "ru_RU": "Для оптимальной производительности рекомендуется отключить дамп шейдеров. Хотите отключить дамп шейдеров?", + "sv_SE": "Det rekommenderas att inaktivera shader dumping för optimal prestanda. Vill du inaktivera shader dumping nu?", "th_TH": "เพื่อประสิทธิภาพสูงสุด ขอแนะนำให้ปิดใช้การดัมพ์เชเดอร์ คุณต้องการปิดการใช้งานการ ดัมพ์เชเดอร์ ตอนนี้หรือไม่?", "tr_TR": "En iyi performans için Shader Dumping'in devre dışı bırakılması tavsiye edilir. Shader Dumping seçeneğini şimdi devre dışı bırakmak ister misiniz?", "uk_UA": "Для оптимальної продуктивності рекомендується вимкнути скидання шейдерів. Ви хочете вимкнути скидання шейдерів зараз?", @@ -13070,6 +13614,7 @@ "pl_PL": "Gra została już załadowana", "pt_BR": "Um jogo já foi carregado", "ru_RU": "Игра уже загружена", + "sv_SE": "Ett spel har redan lästs in", "th_TH": "ทำการโหลดเกมเรียบร้อยแล้ว", "tr_TR": "Bir oyun zaten yüklendi", "uk_UA": "Гру вже завантажено", @@ -13094,6 +13639,7 @@ "pl_PL": "Zatrzymaj emulację lub zamknij emulator przed uruchomieniem innej gry.", "pt_BR": "Por favor, pare a emulação ou feche o emulador antes de abrir outro jogo.", "ru_RU": "Пожалуйста, остановите эмуляцию или закройте эмулятор перед запуском другой игры.", + "sv_SE": "Stoppa emuleringen eller stäng emulatorn innan du startar ett annat spel.", "th_TH": "โปรดหยุดการจำลอง หรือปิดโปรแกรมจำลองก่อนที่จะเปิดเกมอื่น", "tr_TR": "Lütfen yeni bir oyun açmadan önce emülasyonu durdurun veya emülatörü kapatın.", "uk_UA": "Зупиніть емуляцію або закрийте емулятор перед запуском іншої гри.", @@ -13118,6 +13664,7 @@ "pl_PL": "Określony plik nie zawiera aktualizacji dla wybranego tytułu!", "pt_BR": "O arquivo especificado não contém atualizações para o título selecionado!", "ru_RU": "Указанный файл не содержит обновлений для выбранного приложения", + "sv_SE": "Angiven fil innehåller inte en uppdatering för angivet spel!", "th_TH": "ไฟล์ที่ระบุไม่มีการอัพเดตสำหรับชื่อเรื่องที่เลือก!", "tr_TR": "Belirtilen dosya seçilen oyun için güncelleme içermiyor!", "uk_UA": "Зазначений файл не містить оновлення для вибраного заголовка!", @@ -13142,6 +13689,7 @@ "pl_PL": "Ostrzeżenie — Wątki Backend", "pt_BR": "Alerta - Threading da API gráfica", "ru_RU": "Предупреждение: многопоточность в бэкенде", + "sv_SE": "Varning - Backend Threading", "th_TH": "คำเตือน - การทำเธรดแบ็กเอนด์", "tr_TR": "Uyarı - Backend Threading", "uk_UA": "Попередження - потокове керування сервером", @@ -13166,6 +13714,7 @@ "pl_PL": "Ryujinx musi zostać ponownie uruchomiony po zmianie tej opcji, aby działał w pełni. W zależności od platformy może być konieczne ręczne wyłączenie sterownika wielowątkowości podczas korzystania z Ryujinx.", "pt_BR": "Ryujinx precisa ser reiniciado após mudar essa opção para que ela tenha efeito. Dependendo da sua plataforma, pode ser preciso desabilitar o multithreading do driver de vídeo quando usar o Ryujinx.", "ru_RU": "Для применения этой настройки необходимо перезапустить Ryujinx. В зависимости от используемой вами операционной системы вам может потребоваться вручную отключить многопоточность драйвера при использовании Ryujinx.", + "sv_SE": "Ryujinx måste startas om efter att denna inställning ändras för att verkställa den. Beroende på din plattform så kanske du måste manuellt inaktivera drivrutinens egna multithreading när Ryujinx används.", "th_TH": "Ryujinx ต้องรีสตาร์ทหลังจากเปลี่ยนตัวเลือกนี้จึงจะใช้งานได้อย่างสมบูรณ์ คุณอาจต้องปิดการใช้งาน มัลติเธรด ของไดรเวอร์ของคุณด้วยตนเองเมื่อใช้ Ryujinx ทั้งนี้ขึ้นอยู่กับแพลตฟอร์มของคุณ", "tr_TR": "Bu seçeneğin tamamen uygulanması için Ryujinx'in kapatıp açılması gerekir. Kullandığınız işletim sistemine bağlı olarak, Ryujinx'in multithreading'ini kullanırken driver'ınızın multithreading seçeneğini kapatmanız gerekebilir.", "uk_UA": "Ryujinx потрібно перезапустити після зміни цього параметра, щоб він застосовувався повністю. Залежно від вашої платформи вам може знадобитися вручну вимкнути власну багатопотоковість драйвера під час використання Ryujinx.", @@ -13190,6 +13739,7 @@ "pl_PL": "Zamierzasz usunąć modyfikacje: {0}\n\nCzy na pewno chcesz kontynuować?", "pt_BR": "Você está prestes a excluir o mod: {0}\n\nTem certeza de que deseja continuar?", "ru_RU": "Вы сейчас удалите мод: {0}\n\nВы уверены, что хотите продолжить?", + "sv_SE": "Du är på väg att ta bort modden: {0}\n\nÄr du säker på att du vill fortsätta?", "th_TH": "คุณกำลังจะลบ ม็อด: {0}\n\nคุณแน่ใจหรือไม่ว่าต้องการดำเนินการต่อ?", "tr_TR": "", "uk_UA": "Ви збираєтесь видалити модифікацію: {0}\n\nВи дійсно бажаєте продовжити?", @@ -13214,6 +13764,7 @@ "pl_PL": "Zamierzasz usunąć wszystkie modyfikacje dla wybranego tytułu: {0}\n\nCzy na pewno chcesz kontynuować?", "pt_BR": "Você está prestes a excluir todos os mods para este jogo.\n\nTem certeza de que deseja continuar?", "ru_RU": "Вы сейчас удалите все выбранные моды для этой игры.\n\nВы уверены, что хотите продолжить?", + "sv_SE": "Du är på väg att ta bort alla moddar för detta spel.\n\nÄr du säker på att du vill fortsätta?", "th_TH": "คุณกำลังจะลบม็อดทั้งหมดสำหรับชื่อนี้\n\nคุณแน่ใจหรือไม่ว่าต้องการดำเนินการต่อ?", "tr_TR": "", "uk_UA": "Ви збираєтесь видалити всі модифікації для цього Додатка.\n\nВи дійсно бажаєте продовжити?", @@ -13238,6 +13789,7 @@ "pl_PL": "Funkcje", "pt_BR": "Recursos", "ru_RU": "Функции & Улучшения", + "sv_SE": "Funktioner", "th_TH": "คุณสมบัติ", "tr_TR": "Özellikler", "uk_UA": "Особливості", @@ -13262,6 +13814,7 @@ "pl_PL": "Wielowątkowość Backendu Graficznego:", "pt_BR": "Multithreading da API gráfica:", "ru_RU": "Многопоточность графического бэкенда:", + "sv_SE": "Multithreading för grafikbakände:", "th_TH": "มัลติเธรด กราฟิกเบื้องหลัง:", "tr_TR": "Grafik Backend Multithreading:", "uk_UA": "Багатопотоковість графічного сервера:", @@ -13286,6 +13839,7 @@ "pl_PL": "", "pt_BR": "Automático", "ru_RU": "Автоматически", + "sv_SE": "Automatiskt", "th_TH": "อัตโนมัติ", "tr_TR": "Otomatik", "uk_UA": "Авто", @@ -13310,6 +13864,7 @@ "pl_PL": "Wyłączone", "pt_BR": "Desligado", "ru_RU": "Выключено", + "sv_SE": "Av", "th_TH": "ปิดการใช้งาน", "tr_TR": "Kapalı", "uk_UA": "Вимкнути", @@ -13334,6 +13889,7 @@ "pl_PL": "Włączone", "pt_BR": "Ligado", "ru_RU": "Включено", + "sv_SE": "På", "th_TH": "เปิดใช้งาน", "tr_TR": "Açık", "uk_UA": "Увімкнути", @@ -13358,6 +13914,7 @@ "pl_PL": "Tak", "pt_BR": "Sim", "ru_RU": "Да", + "sv_SE": "Ja", "th_TH": "ใช่", "tr_TR": "Evet", "uk_UA": "Так", @@ -13382,6 +13939,7 @@ "pl_PL": "Nie", "pt_BR": "Não", "ru_RU": "Нет", + "sv_SE": "Nej", "th_TH": "ไม่ใช่", "tr_TR": "Hayır", "uk_UA": "Ні", @@ -13406,6 +13964,7 @@ "pl_PL": "Nazwa pliku zawiera nieprawidłowe znaki. Proszę spróbuj ponownie.", "pt_BR": "O nome do arquivo contém caracteres inválidos. Por favor, tente novamente.", "ru_RU": "Имя файла содержит недопустимые символы. Пожалуйста, попробуйте еще раз.", + "sv_SE": "Filnamnet innehåller ogiltiga tecken. Försök igen.", "th_TH": "ชื่อไฟล์ประกอบด้วยอักขระที่ไม่ถูกต้อง กรุณาลองอีกครั้ง", "tr_TR": "Dosya adı geçersiz karakter içeriyor. Lütfen tekrar deneyin.", "uk_UA": "Ім'я файлу містить неприпустимі символи. Будь ласка, спробуйте ще раз.", @@ -13430,6 +13989,7 @@ "pl_PL": "Pauza", "pt_BR": "Pausar", "ru_RU": "Пауза эмуляции", + "sv_SE": "Paus", "th_TH": "หยุดชั่วคราว", "tr_TR": "Durdur", "uk_UA": "Пауза", @@ -13454,6 +14014,7 @@ "pl_PL": "Wznów", "pt_BR": "Resumir", "ru_RU": "Продолжить", + "sv_SE": "Återuppta", "th_TH": "ดำเนินการต่อ", "tr_TR": "Devam Et", "uk_UA": "Продовжити", @@ -13478,6 +14039,7 @@ "pl_PL": "Kliknij, aby otworzyć stronę Ryujinx w domyślnej przeglądarce.", "pt_BR": "Clique para abrir o site do Ryujinx no seu navegador padrão.", "ru_RU": "Нажмите, чтобы открыть веб-сайт Ryujinx", + "sv_SE": "Klicka för att öppna Ryujinx webbsida i din webbläsare.", "th_TH": "คลิกเพื่อเปิดเว็บไซต์ Ryujinx บนเบราว์เซอร์เริ่มต้นของคุณ", "tr_TR": "Ryujinx'in websitesini varsayılan tarayıcınızda açmak için tıklayın.", "uk_UA": "Натисніть, щоб відкрити сайт Ryujinx у браузері за замовчування.", @@ -13502,6 +14064,7 @@ "pl_PL": "Ryujinx nie jest w żaden sposób powiązany z Nintendo™,\nani z żadnym z jej partnerów.", "pt_BR": "Ryujinx não é afiliado com a Nintendo™,\nou qualquer um de seus parceiros, de nenhum modo.", "ru_RU": "Ryujinx никоим образом не связан ни с Nintendo™, ни с кем-либо из ее партнеров.", + "sv_SE": "Ryujinx har ingen koppling till Nintendo™,\neller någon av dess samarbetspartners.", "th_TH": "ทางผู้พัฒนาโปรแกรม Ryujinx ไม่มีส่วนเกี่ยวข้องกับทางบริษัท Nintendo™\nหรือพันธมิตรใดๆ ทั้งสิ้น!", "tr_TR": "Ryujinx, Nintendo™ veya ortaklarıyla herhangi bir şekilde bağlantılı değildir.", "uk_UA": "Ryujinx жодним чином не пов’язаний з Nintendo™,\nчи будь-яким із їхніх партнерів.", @@ -13526,6 +14089,7 @@ "pl_PL": "AmiiboAPI (www.amiiboapi.com) jest używane\nw naszej emulacji Amiibo.", "pt_BR": "AmiiboAPI (www.amiiboapi.com) é usado\nem nossa emulação de Amiibo.", "ru_RU": "Amiibo API (www.amiiboapi.com) используется для эмуляции Amiibo.", + "sv_SE": "AmiiboAPI (www.amiiboapi.com) används\ni vår Amiibo-emulation.", "th_TH": "AmiiboAPI (www.amiiboapi.com) ถูกใช้\nในการจำลอง อะมิโบ ของเรา", "tr_TR": "Amiibo emülasyonumuzda \nAmiiboAPI (www.amiiboapi.com) kullanılmaktadır.", "uk_UA": "AmiiboAPI (www.amiiboapi.com) використовується в нашій емуляції Amiibo.", @@ -13550,6 +14114,7 @@ "pl_PL": "Kliknij, aby otworzyć stronę GitHub Ryujinx w domyślnej przeglądarce.", "pt_BR": "Clique para abrir a página do GitHub do Ryujinx no seu navegador padrão.", "ru_RU": "Нажмите, чтобы открыть страницу Ryujinx на GitHub", + "sv_SE": "Klicka för att öppna Ryujinx GitHub-sida i din webbläsare.", "th_TH": "คลิกเพื่อเปิดหน้า Github ของ Ryujinx บนเบราว์เซอร์เริ่มต้นของคุณ", "tr_TR": "Ryujinx'in GitHub sayfasını varsayılan tarayıcınızda açmak için tıklayın.", "uk_UA": "Натисніть, щоб відкрити сторінку GitHub Ryujinx у браузері за замовчуванням.", @@ -13574,6 +14139,7 @@ "pl_PL": "Kliknij, aby otworzyć zaproszenie na serwer Discord Ryujinx w domyślnej przeglądarce.", "pt_BR": "Clique para abrir um convite ao servidor do Discord do Ryujinx no seu navegador padrão.", "ru_RU": "Нажмите, чтобы открыть приглашение на сервер Ryujinx в Discord", + "sv_SE": "Klicka för att öppna en inbjudan till Ryujinx Discord-server i din webbläsare.", "th_TH": "คลิกเพื่อเปิดคำเชิญเข้าสู่เซิร์ฟเวอร์ Discord ของ Ryujinx บนเบราว์เซอร์เริ่มต้นของคุณ", "tr_TR": "Varsayılan tarayıcınızda Ryujinx'in Discord'una bir davet açmak için tıklayın.", "uk_UA": "Натисніть, щоб відкрити запрошення на сервер Discord Ryujinx у браузері за замовчуванням.", @@ -13598,6 +14164,7 @@ "pl_PL": "O Aplikacji:", "pt_BR": "Sobre:", "ru_RU": "О программе:", + "sv_SE": "Om:", "th_TH": "เกี่ยวกับ:", "tr_TR": "Hakkında:", "uk_UA": "Про програму:", @@ -13622,6 +14189,7 @@ "pl_PL": "", "pt_BR": "", "ru_RU": "", + "sv_SE": "Ryujinx är en emulator för Nintendo Switch™.\nFå de senaste nyheterna via vår Discord.\nUtvecklare som är intresserade att bidra kan hitta mer info på vår GitHub eller Discord.", "th_TH": "", "tr_TR": "", "uk_UA": "Ryujinx — це емулятор для Nintendo Switch™.\nОтримуйте всі останні новини в нашому Discord.\nРозробники, які хочуть зробити внесок, можуть дізнатися більше на нашому GitHub або в Discord.", @@ -13646,6 +14214,7 @@ "pl_PL": "Utrzymywany Przez:", "pt_BR": "Mantido por:", "ru_RU": "Разработка:", + "sv_SE": "Underhålls av:", "th_TH": "ได้รับการดูแลโดย:", "tr_TR": "Geliştiriciler:", "uk_UA": "Підтримується:", @@ -13670,6 +14239,7 @@ "pl_PL": "", "pt_BR": "", "ru_RU": "", + "sv_SE": "Underhölls tidigare av:", "th_TH": "", "tr_TR": "", "uk_UA": "Минулі розробники:", @@ -13694,6 +14264,7 @@ "pl_PL": "Kliknij, aby otworzyć stronę Współtwórcy w domyślnej przeglądarce.", "pt_BR": "Clique para abrir a página de contribuidores no seu navegador padrão.", "ru_RU": "Нажмите, чтобы открыть страницу с участниками", + "sv_SE": "Klicka för att öppna sidan över personer som bidragit till projektet i din webbläsare.", "th_TH": "คลิกเพื่อเปิดหน้าผู้มีส่วนร่วมบนเบราว์เซอร์เริ่มต้นของคุณ", "tr_TR": "Katkıda bulunanlar sayfasını varsayılan tarayıcınızda açmak için tıklayın.", "uk_UA": "Натисніть, щоб відкрити сторінку співавторів у вашому браузері за замовчування.", @@ -13718,6 +14289,7 @@ "pl_PL": "Seria Amiibo", "pt_BR": "Franquia Amiibo", "ru_RU": "Серия Amiibo", + "sv_SE": "Amiibo Series", "th_TH": "", "tr_TR": "Amiibo Serisi", "uk_UA": "Серія Amiibo", @@ -13742,6 +14314,7 @@ "pl_PL": "Postać", "pt_BR": "Personagem", "ru_RU": "Персонаж", + "sv_SE": "Karaktär", "th_TH": "ตัวละคร", "tr_TR": "Karakter", "uk_UA": "Персонаж", @@ -13766,6 +14339,7 @@ "pl_PL": "Zeskanuj", "pt_BR": "Escanear", "ru_RU": "Сканировать", + "sv_SE": "Skanna den", "th_TH": "สแกนเลย", "tr_TR": "Tarat", "uk_UA": "Сканувати", @@ -13790,6 +14364,7 @@ "pl_PL": "Pokaż Wszystkie Amiibo", "pt_BR": "Exibir todos os Amiibos", "ru_RU": "Показать все Amiibo", + "sv_SE": "Visa alla Amiibo", "th_TH": "แสดง Amiibo ทั้งหมด", "tr_TR": "Tüm Amiibo'ları Göster", "uk_UA": "Показати всі Amiibo", @@ -13814,6 +14389,7 @@ "pl_PL": "Hack: Użyj losowego UUID tagu", "pt_BR": "Hack: Usar Uuid de tag aleatório", "ru_RU": "Хак: Использовать случайный тег Uuid", + "sv_SE": "Hack: Använd slumpmässig tagg för Uuid", "th_TH": "แฮ็ค: สุ่มแท็ก Uuid", "tr_TR": "Hack: Rastgele bir Uuid kullan", "uk_UA": "Хитрість: Використовувати випадковий тег Uuid", @@ -13838,6 +14414,7 @@ "pl_PL": "Włączone", "pt_BR": "Habilitado", "ru_RU": "Включено", + "sv_SE": "Aktiverad", "th_TH": "เปิดใช้งานแล้ว", "tr_TR": "Etkin", "uk_UA": "Увімкнено", @@ -13862,6 +14439,7 @@ "pl_PL": "ID Tytułu", "pt_BR": "ID do título", "ru_RU": "ID приложения", + "sv_SE": "Titel-ID", "th_TH": "ชื่อไอดี", "tr_TR": "Başlık ID", "uk_UA": "ID заголовка", @@ -13886,6 +14464,7 @@ "pl_PL": "Ścieżka Kontenera", "pt_BR": "Caminho do container", "ru_RU": "Путь к контейнеру", + "sv_SE": "Container-sökväg", "th_TH": "คอนเทนเนอร์เก็บไฟล์", "tr_TR": "Container Yol", "uk_UA": "Шлях до контейнеру", @@ -13910,6 +14489,7 @@ "pl_PL": "Pełna Ścieżka", "pt_BR": "Caminho completo", "ru_RU": "Полный путь", + "sv_SE": "Fullständig sökväg", "th_TH": "ที่เก็บไฟล์แบบเต็ม", "tr_TR": "Tam Yol", "uk_UA": "Повний шлях", @@ -13934,6 +14514,7 @@ "pl_PL": "Usuń Wszystkie", "pt_BR": "Remover todos", "ru_RU": "Удалить все", + "sv_SE": "Ta bort allt", "th_TH": "ลบทั้งหมด", "tr_TR": "Tümünü kaldır", "uk_UA": "Видалити все", @@ -13958,6 +14539,7 @@ "pl_PL": "Włącz Wszystkie", "pt_BR": "Habilitar todos", "ru_RU": "Включить все", + "sv_SE": "Aktivera allt", "th_TH": "เปิดใช้งานทั้งหมด", "tr_TR": "Tümünü Aktif Et", "uk_UA": "Увімкнути всі", @@ -13982,6 +14564,7 @@ "pl_PL": "Wyłącz Wszystkie", "pt_BR": "Desabilitar todos", "ru_RU": "Отключить все", + "sv_SE": "Inaktivera allt", "th_TH": "ปิดใช้งานทั้งหมด", "tr_TR": "Tümünü Devre Dışı Bırak", "uk_UA": "Вимкнути всі", @@ -14006,6 +14589,7 @@ "pl_PL": "Usuń wszystko", "pt_BR": "Apagar Tudo", "ru_RU": "Удалить все", + "sv_SE": "Ta bort allt", "th_TH": "ลบทั้งหมด", "tr_TR": "Hepsini Sil", "uk_UA": "Видалити все", @@ -14030,6 +14614,7 @@ "pl_PL": "Zmień język", "pt_BR": "Mudar idioma", "ru_RU": "Сменить язык", + "sv_SE": "Byt språk", "th_TH": "เปลี่ยนภาษา", "tr_TR": "Dili Değiştir", "uk_UA": "Змінити мову", @@ -14054,6 +14639,7 @@ "pl_PL": "Pokaż typy plików", "pt_BR": "Mostrar tipos de arquivo", "ru_RU": "Показывать форматы файлов", + "sv_SE": "Visa filtyper", "th_TH": "แสดงประเภทของไฟล์", "tr_TR": "Dosya Uzantılarını Göster", "uk_UA": "Показати типи файлів", @@ -14078,6 +14664,7 @@ "pl_PL": "Sortuj", "pt_BR": "Ordenar", "ru_RU": "Сортировка", + "sv_SE": "Sortera", "th_TH": "เรียงลำดับ", "tr_TR": "Sırala", "uk_UA": "Сортувати", @@ -14102,6 +14689,7 @@ "pl_PL": "Pokaż Nazwy", "pt_BR": "Exibir nomes", "ru_RU": "Показывать названия", + "sv_SE": "Visa namn", "th_TH": "แสดงชื่อ", "tr_TR": "İsimleri Göster", "uk_UA": "Показати назви", @@ -14126,6 +14714,7 @@ "pl_PL": "Ulubione", "pt_BR": "Favorito", "ru_RU": "Избранное", + "sv_SE": "Favorit", "th_TH": "สิ่งที่ชื่นชอบ", "tr_TR": "Favori", "uk_UA": "Вибрані", @@ -14150,6 +14739,7 @@ "pl_PL": "Rosnąco", "pt_BR": "Ascendente", "ru_RU": "По возрастанию", + "sv_SE": "Stigande", "th_TH": "จากน้อยไปมาก", "tr_TR": "Artan", "uk_UA": "За зростанням", @@ -14174,6 +14764,7 @@ "pl_PL": "Malejąco", "pt_BR": "Descendente", "ru_RU": "По убыванию", + "sv_SE": "Fallande", "th_TH": "จากมากไปน้อย", "tr_TR": "Azalan", "uk_UA": "За спаданням", @@ -14198,6 +14789,7 @@ "pl_PL": "Funkcje i Ulepszenia", "pt_BR": "Recursos & Melhorias", "ru_RU": "Функции", + "sv_SE": "Funktioner och förbättringar", "th_TH": "คุณสมบัติ และ การเพิ่มประสิทธิภาพ", "tr_TR": "Özellikler & İyileştirmeler", "uk_UA": "Функції та вдосконалення", @@ -14222,6 +14814,7 @@ "pl_PL": "Okno Błędu", "pt_BR": "Janela de erro", "ru_RU": "Окно ошибки", + "sv_SE": "Felfönster", "th_TH": "หน้าต่างแสดงข้อผิดพลาด", "tr_TR": "Hata Penceresi", "uk_UA": "Вікно помилок", @@ -14246,6 +14839,7 @@ "pl_PL": "Wybierz, czy chcesz wyświetlać Ryujinx w swojej \"aktualnie grane\" aktywności Discord", "pt_BR": "Habilita ou desabilita Discord Rich Presence", "ru_RU": "Включает или отключает отображение статуса \"Играет в игру\" в Discord", + "sv_SE": "Välj huruvida Ryujinx ska visas på din \"spelar för tillfället\" Discord-aktivitet", "th_TH": "เลือกว่าจะแสดง Ryujinx ในกิจกรรม Discord \"ที่กำลังเล่นอยู่\" ของคุณหรือไม่?", "tr_TR": "Ryujinx'i \"şimdi oynanıyor\" Discord aktivitesinde göstermeyi veya göstermemeyi seçin", "uk_UA": "Виберіть, чи відображати Ryujinx у вашій «поточній грі» в Discord", @@ -14270,6 +14864,7 @@ "pl_PL": "Wprowadź katalog gier aby dodać go do listy", "pt_BR": "Escreva um diretório de jogo para adicionar à lista", "ru_RU": "Введите путь к папке с играми для добавления ее в список выше", + "sv_SE": "Ange en spelkatalog att lägga till i listan", "th_TH": "ป้อนไดเรกทอรี่เกมที่จะทำการเพิ่มลงในรายการ", "tr_TR": "Listeye eklemek için oyun dizini seçin", "uk_UA": "Введіть каталог ігор, щоб додати до списку", @@ -14294,6 +14889,7 @@ "pl_PL": "Dodaj katalog gier do listy", "pt_BR": "Adicionar um diretório de jogo à lista", "ru_RU": "Добавить папку с играми в список", + "sv_SE": "Lägg till en spelkatalog till listan", "th_TH": "เพิ่มไดเรกทอรี่เกมลงในรายการ", "tr_TR": "Listeye oyun dizini ekle", "uk_UA": "Додати каталог гри до списку", @@ -14318,6 +14914,7 @@ "pl_PL": "Usuń wybrany katalog gier", "pt_BR": "Remover diretório de jogo selecionado", "ru_RU": "Удалить выбранную папку игры", + "sv_SE": "Ta bort vald spelkatalog", "th_TH": "ลบไดเรกทอรี่เกมที่เลือก", "tr_TR": "Seçili oyun dizinini kaldır", "uk_UA": "Видалити вибраний каталог гри", @@ -14342,6 +14939,7 @@ "pl_PL": "", "pt_BR": "Insira um diretório de carregamento automático para adicionar à lista", "ru_RU": "", + "sv_SE": "Ange en katalog att automatiskt läsa in till listan", "th_TH": "ป้อนไดเร็กทอรีสำหรับโหลดอัตโนมัติเพื่อเพิ่มลงในรายการ", "tr_TR": "", "uk_UA": "Введіть шлях автозавантаження для додавання до списку", @@ -14366,6 +14964,7 @@ "pl_PL": "", "pt_BR": "Adicionar um diretório de carregamento automático à lista", "ru_RU": "", + "sv_SE": "Lägg till en katalog att automatiskt läsa in till listan", "th_TH": "ป้อนไดเร็กทอรีสำหรับโหลดอัตโนมัติเพื่อเพิ่มลงในรายการ", "tr_TR": "", "uk_UA": "Додайте шлях автозавантаження для додавання до списку", @@ -14390,6 +14989,7 @@ "pl_PL": "", "pt_BR": "Remover o diretório de carregamento automático selecionado", "ru_RU": "", + "sv_SE": "Ta bort markerad katalog för automatisk inläsning", "th_TH": "ลบไดเรกทอรีสำหรับโหลดอัตโนมัติที่เลือก", "tr_TR": "", "uk_UA": "Видалити вибраний каталог автозавантаження", @@ -14414,6 +15014,7 @@ "pl_PL": "Użyj niestandardowego motywu Avalonia dla GUI, aby zmienić wygląd menu emulatora", "pt_BR": "Habilita ou desabilita temas customizados na interface gráfica", "ru_RU": "Включить или отключить пользовательские темы", + "sv_SE": "Använd ett anpassat Avalonia-tema för gränssnittet för att ändra utseendet i emulatormenyerna", "th_TH": "ใช้ธีม Avalonia แบบกำหนดเองสำหรับ GUI เพื่อเปลี่ยนรูปลักษณ์ของเมนูโปรแกรมจำลอง", "tr_TR": "Emülatör pencerelerinin görünümünü değiştirmek için özel bir Avalonia teması kullan", "uk_UA": "Використовуйте користувацьку тему Avalonia для графічного інтерфейсу, щоб змінити вигляд меню емулятора", @@ -14438,6 +15039,7 @@ "pl_PL": "Ścieżka do niestandardowego motywu GUI", "pt_BR": "Diretório do tema customizado", "ru_RU": "Путь к пользовательской теме для интерфейса", + "sv_SE": "Sökväg till anpassat gränssnittstema", "th_TH": "ไปยังที่เก็บไฟล์ธีม GUI แบบกำหนดเอง", "tr_TR": "Özel arayüz temasının yolu", "uk_UA": "Шлях до користувацької теми графічного інтерфейсу", @@ -14462,6 +15064,7 @@ "pl_PL": "Wyszukaj niestandardowy motyw GUI", "pt_BR": "Navegar até um tema customizado", "ru_RU": "Просмотр пользовательской темы интерфейса", + "sv_SE": "Bläddra efter ett anpassat gränssnittstema", "th_TH": "เรียกดูธีม GUI ที่กำหนดเอง", "tr_TR": "Özel arayüz teması için göz at", "uk_UA": "Огляд користувацької теми графічного інтерфейсу", @@ -14486,6 +15089,7 @@ "pl_PL": "Tryb Zadokowany sprawia, że emulowany system zachowuje się jak zadokowany Nintendo Switch. Poprawia to jakość grafiki w większości gier. I odwrotnie, wyłączenie tej opcji sprawi, że emulowany system będzie zachowywał się jak przenośny Nintendo Switch, zmniejszając jakość grafiki.\n\nSkonfiguruj sterowanie gracza 1, jeśli planujesz używać trybu Zadokowanego; Skonfiguruj sterowanie przenośne, jeśli planujesz używać trybu przenośnego.\n\nPozostaw WŁĄCZONY, jeśli nie masz pewności.", "pt_BR": "O modo TV faz o sistema emulado se comportar como um Nintendo Switch na TV, o que melhora a fidelidade gráfica na maioria dos jogos. Por outro lado, desativar essa opção fará o sistema emulado se comportar como um Nintendo Switch portátil, reduzindo a qualidade gráfica.\n\nConfigure os controles do jogador 1 se planeja usar o modo TV; configure os controles de portátil se planeja usar o modo Portátil.\n\nMantenha ativado se estiver em dúvida.", "ru_RU": "\"Стационарный\" режим запускает эмулятор, как если бы Nintendo Switch находилась в доке, что улучшает графику и разрешение в большинстве игр. И наоборот, при отключении этого режима эмулятор будет запускать игры в \"Портативном\" режиме, снижая качество графики.\n\nНастройте управление для Игрока 1 если планируете использовать в \"Стационарном\" режиме; настройте портативное управление если планируете использовать эмулятор в \"Портативном\" режиме.\n\nРекомендуется оставить включенным.", + "sv_SE": "Dockat läge gör att det emulerade systemet beter sig som en dockad Nintendo Switch. Detta förbättrar grafiken i de flesta spel. Inaktiveras detta så kommer det emulerade systemet att bete sig som en handhållen Nintendo Switch, vilket reducerar grafikkvaliteten.\n\nKonfigurera kontrollen för Spelare 1 om du planerar att använda dockat läge; konfigurera handhållna kontroller om du planerar att använda handhållet läge.\n\nLämna PÅ om du är osäker.", "th_TH": "ด็อกโหมด ทำให้ระบบจำลองการทำงานเสมือน Nintendo ที่กำลังเชื่อมต่ออยู่ด็อก สิ่งนี้จะปรับปรุงความเสถียรภาพของกราฟิกในเกมส่วนใหญ่ ในทางกลับกัน การปิดใช้จะทำให้ระบบจำลองทำงานเหมือนกับ Nintendo Switch แบบพกพา ส่งผลให้คุณภาพกราฟิกลดลง\n\nแนะนำกำหนดค่าควบคุมของผู้เล่น 1 หากวางแผนที่จะใช้ด็อกโหมด กำหนดค่าการควบคุมแบบ แฮนด์เฮลด์ หากวางแผนที่จะใช้โหมดแฮนด์เฮลด์\n\nเปิดทิ้งไว้หากคุณไม่แน่ใจ", "tr_TR": "Docked modu emüle edilen sistemin yerleşik Nintendo Switch gibi davranmasını sağlar. Bu çoğu oyunda grafik kalitesini arttırır. Diğer yandan, bu seçeneği devre dışı bırakmak emüle edilen sistemin portatif Ninendo Switch gibi davranmasını sağlayıp grafik kalitesini düşürür.\n\nDocked modu kullanmayı düşünüyorsanız 1. Oyuncu kontrollerini; Handheld modunu kullanmak istiyorsanız portatif kontrollerini konfigüre edin.\n\nEmin değilseniz aktif halde bırakın.", "uk_UA": "У режимі док-станції емульована система веде себе як приєднаний Nintendo Switch. Це покращує точність графіки в більшості ігор. І навпаки, вимкнення цього призведе до того, що емульована система поводитиметься як портативний комутатор Nintendo, погіршуючи якість графіки.\n\nНалаштуйте елементи керування для гравця 1, якщо плануєте використовувати режим док-станції; налаштуйте ручні елементи керування, якщо плануєте використовувати портативний режим.\n\nЗалиште увімкненим, якщо не впевнені.", @@ -14510,6 +15114,7 @@ "pl_PL": "Obsługa bezpośredniego dostępu do klawiatury (HID). Zapewnia dostęp gier do klawiatury jako urządzenia do wprowadzania tekstu.\n\nDziała tylko z grami, które natywnie wspierają użycie klawiatury w urządzeniu Switch hardware.\n\nPozostaw wyłączone w razie braku pewności.", "pt_BR": "Suporte para acesso direto ao teclado (HID). Permite que os jogos acessem seu teclado como um dispositivo de entrada de texto.\n\nFunciona apenas com jogos que suportam o uso de teclado nativamente no hardware do Switch.\n\nDeixe desativado se estiver em dúvida.", "ru_RU": "Поддержка прямого ввода с клавиатуры (HID). Предоставляет игре прямой доступ к клавиатуре в качестве устройства ввода текста.\nРаботает только с играми, которые изначально поддерживают использование клавиатуры с Switch.\nРекомендуется оставить выключенным.", + "sv_SE": "Stöd för direkt tangentbordsåtkomst (HID). Ger spel åtkomst till ditt tangentbord som en textinmatningsenhet.\n\nFungerar endast med spel som har inbyggt stöd för tangentbordsanvändning på Switch-hårdvara.\n\nLämna AV om du är osäker.", "th_TH": "รองรับการเข้าถึงแป้นพิมพ์โดยตรง (HID) ให้เกมเข้าถึงคีย์บอร์ดของคุณเป็นอุปกรณ์ป้อนข้อความ\n\nใช้งานได้กับเกมที่รองรับการใช้งานคีย์บอร์ดบนฮาร์ดแวร์ของ Switch เท่านั้น\n\nหากคุณไม่แน่ใจให้ปิดใช้งานไว้", "tr_TR": "", "uk_UA": "Підтримка прямого доступу до клавіатури (HID). Надає іграм доступ до клавіатури для вводу тексту.\n\nПрацює тільки з іграми, які підтримують клавіатуру на обладнанні Switch.\n\nЗалиште вимкненим, якщо не впевнені.", @@ -14534,6 +15139,7 @@ "pl_PL": "Obsługa bezpośredniego dostępu do myszy (HID). Zapewnia dostęp gier do myszy jako urządzenia wskazującego.\n\nDziała tylko z grami, które natywnie obsługują przyciski myszy w urządzeniu Switch, które są nieliczne i daleko między nimi.\n\nPo włączeniu funkcja ekranu dotykowego może nie działać.\n\nPozostaw wyłączone w razie wątpliwości.", "pt_BR": "Suporte para acesso direto ao mouse (HID). Permite que os jogos acessem seu mouse como um dispositivo de apontamento.\n\nFunciona apenas com jogos que suportam controles de mouse nativamente no hardware do Switch, o que é raro.\n\nQuando ativado, a funcionalidade de tela sensível ao toque pode não funcionar.\n\nDeixe desativado se estiver em dúvida.", "ru_RU": "Поддержка прямого ввода мыши (HID). Предоставляет игре прямой доступ к мыши в качестве указывающего устройства.\nРаботает только с играми, которые изначально поддерживают использование мыши совместно с железом Switch.\nРекомендуется оставить выключенным.", + "sv_SE": "Stöd för direkt musåtkomst (HID). Ger spel åtkomst till din mus som pekdon.\n\nFungerar endast med spel som har inbyggt stöd för muskontroller på Switch-hårdvara, som är endast ett fåtal.\n\nViss pekskärmsfunktionalitet kanske inte fungerar när aktiverat.\n\nLämna AV om du är osäker.", "th_TH": "รองรับการเข้าถึงเมาส์โดยตรง (HID) ให้เกมเข้าถึงเมาส์ของคุณเป็นอุปกรณ์ชี้ตำแหน่ง\n\nใช้งานได้เฉพาะกับเกมที่รองรับการควบคุมเมาส์บนฮาร์ดแวร์ของ Switch เท่านั้น ซึ่งมีอยู่ไม่มากนัก\n\nเมื่อเปิดใช้งาน ฟังก์ชั่นหน้าจอสัมผัสอาจไม่ทำงาน\n\nหากคุณไม่แน่ใจให้ปิดใช้งานไว้", "tr_TR": "", "uk_UA": "Підтримка прямого доступу до миші (HID). Надає іграм доступ до миші, як пристрій вказування.\n\nПрацює тільки з іграми, які підтримують мишу на обладнанні Switch, їх небагато.\n\nФункціонал сенсорного екрана може не працювати, якщо функція ввімкнена.\n\nЗалиште вимкненим, якщо не впевнені.", @@ -14558,6 +15164,7 @@ "pl_PL": "Zmień Region Systemu", "pt_BR": "Mudar a região do sistema", "ru_RU": "Сменяет регион прошивки", + "sv_SE": "Ändra systemets region", "th_TH": "เปลี่ยนภูมิภาคของระบบ", "tr_TR": "Sistem Bölgesini Değiştir", "uk_UA": "Змінити регіон системи", @@ -14582,6 +15189,7 @@ "pl_PL": "Zmień język systemu", "pt_BR": "Mudar o idioma do sistema", "ru_RU": "Меняет язык прошивки", + "sv_SE": "Ändra systemets språk", "th_TH": "เปลี่ยนภาษาของระบบ", "tr_TR": "Sistem Dilini Değiştir", "uk_UA": "Змінити мову системи", @@ -14606,6 +15214,7 @@ "pl_PL": "Zmień Strefę Czasową Systemu", "pt_BR": "Mudar o fuso-horário do sistema", "ru_RU": "Меняет часовой пояс прошивки", + "sv_SE": "Ändra systemets tidszon", "th_TH": "เปลี่ยนโซนเวลาของระบบ", "tr_TR": "Sistem Saat Dilimini Değiştir", "uk_UA": "Змінити часовий пояс системи", @@ -14630,6 +15239,7 @@ "pl_PL": "Zmień czas systemowy", "pt_BR": "Mudar a hora do sistema", "ru_RU": "Меняет системное время прошивки", + "sv_SE": "Ändra systemtid", "th_TH": "เปลี่ยนเวลาของระบบ", "tr_TR": "Sistem Saatini Değiştir", "uk_UA": "Змінити час системи", @@ -14654,6 +15264,7 @@ "pl_PL": "", "pt_BR": "", "ru_RU": "", + "sv_SE": "Återsynkronisera systemtiden för att matcha din dators aktuella datum och tid.\n\nDetta är inte en aktiv inställning och den kan tappa synken och om det händer så kan du klicka på denna knapp igen.", "th_TH": "", "tr_TR": "", "uk_UA": "", @@ -14678,6 +15289,7 @@ "pl_PL": "Synchronizacja pionowa emulowanej konsoli. Zasadniczo ogranicznik klatek dla większości gier; wyłączenie jej może spowodować, że gry będą działać z większą szybkością, ekrany wczytywania wydłużą się lub nawet utkną.\n\nMoże być przełączana w grze za pomocą preferowanego skrótu klawiszowego. Zalecamy to zrobić, jeśli planujesz ją wyłączyć.\n\nW razie wątpliwości pozostaw WŁĄCZONĄ.", "pt_BR": "V-Sync do console emulado. Funciona essencialmente como um limitador de quadros para a maioria dos jogos; desativá-lo pode fazer com que os jogos rodem em uma velocidade mais alta ou que telas de carregamento demorem mais ou travem.\n\nPode ser alternado durante o jogo com uma tecla de atalho de sua preferência (F1 por padrão). Recomendamos isso caso planeje desativá-lo.\n\nMantenha ligado se estiver em dúvida.", "ru_RU": "Эмуляция вертикальной синхронизации консоли, которая ограничивает количество кадров в секунду в большинстве игр; отключение может привести к тому, что игры будут запущены с более высокой частотой кадров, но загрузка игры может занять больше времени, либо игра не запустится вообще.\n\nМожно включать и выключать эту настройку непосредственно в игре с помощью горячих клавиш (F1 по умолчанию). Если планируете отключить вертикальную синхронизацию, рекомендуем настроить горячие клавиши.\n\nРекомендуется оставить включенным.", + "sv_SE": "Emulerade konsollens vertikala synk. I grund och botten en begränsare för bitrutor för de flesta spel; inaktivera den kan orsaka att spel kör på en högre hastighet eller gör att skärmar tar längre tid att läsa eller fastnar i dem.\n\nKan växlas inne i spelet med en snabbtangent som du väljer (F1 som standard). Vi rekommenderar att göra detta om du planerar att inaktivera den.\n\nLämna PÅ om du är osäker.", "th_TH": "Vertical Sync ของคอนโซลจำลอง โดยพื้นฐานแล้วเป็นตัวจำกัดเฟรมสำหรับเกมส่วนใหญ่ การปิดใช้งานอาจทำให้เกมทำงานด้วยความเร็วสูงขึ้น หรือทำให้หน้าจอการโหลดใช้เวลานานขึ้นหรือค้าง\n\nสามารถสลับได้ในเกมด้วยปุ่มลัดตามที่คุณต้องการ (F1 เป็นค่าเริ่มต้น) เราขอแนะนำให้ทำเช่นนี้หากคุณวางแผนที่จะปิดการใช้งาน\n\nเปิดทิ้งไว้หากคุณไม่แน่ใจ", "tr_TR": "", "uk_UA": "Емульована вертикальна синхронізація консолі. По суті, обмежувач кадрів для більшості ігор; його вимкнення може призвести до того, що ігри працюватимуть на вищій швидкості, екрани завантаження триватимуть довше чи зупинятимуться.\n\nМожна перемикати в грі гарячою клавішею (За умовчанням F1). Якщо ви плануєте вимкнути функцію, рекомендуємо зробити це через гарячу клавішу.\n\nЗалиште увімкненим, якщо не впевнені.", @@ -14702,6 +15314,7 @@ "pl_PL": "Zapisuje przetłumaczone funkcje JIT, dzięki czemu nie muszą być tłumaczone za każdym razem, gdy gra się ładuje.\n\nZmniejsza zacinanie się i znacznie przyspiesza uruchamianie po pierwszym uruchomieniu gry.\n\nJeśli nie masz pewności, pozostaw WŁĄCZONE", "pt_BR": "Habilita ou desabilita PPTC", "ru_RU": "Сохраняет скомпилированные JIT-функции для того, чтобы не преобразовывать их по новой каждый раз при запуске игры.\n\nУменьшает статтеры и значительно ускоряет последующую загрузку игр.\n\nРекомендуется оставить включенным.", + "sv_SE": "Sparar översatta JIT-funktioner så att de inte behöver översättas varje gång som spelet läses in.\n\nMinskar stuttering och snabbare på uppstartstiden väsentligt efter första uppstarten av ett spel.\n\nLämna PÅ om du är osäker.", "th_TH": "บันทึกฟังก์ชั่น JIT ที่แปลแล้ว ดังนั้นจึงไม่จำเป็นต้องแปลทุกครั้งที่โหลดเกม\n\nลดอาการกระตุกและเร่งความเร็วการบูตได้อย่างมากหลังจากการบูตครั้งแรกของเกม\n\nเปิดทิ้งไว้หากคุณไม่แน่ใจ", "tr_TR": "Çevrilen JIT fonksiyonlarını oyun her açıldığında çevrilmek zorunda kalmaması için kaydeder.\n\nTeklemeyi azaltır ve ilk açılıştan sonra oyunların ilk açılış süresini ciddi biçimde hızlandırır.\n\nEmin değilseniz aktif halde bırakın.", "uk_UA": "Зберігає перекладені функції JIT, щоб їх не потрібно було перекладати кожного разу, коли гра завантажується.\n\nЗменшує заїкання та значно прискорює час завантаження після першого завантаження гри.\n\nЗалиште увімкненим, якщо не впевнені.", @@ -14726,6 +15339,7 @@ "pl_PL": "", "pt_BR": "Carregar o PPTC usando um terço da quantidade de núcleos.", "ru_RU": "", + "sv_SE": "Läs in PPTC med en tredjedel av mängden kärnor.", "th_TH": "โหลด PPTC โดยใช้หนึ่งในสามของจำนวนคอร์", "tr_TR": "", "uk_UA": "Завантажувати PPTC використовуючи третину від кількості ядер.", @@ -14750,6 +15364,7 @@ "pl_PL": "Sprawdza pliki podczas uruchamiania gry i jeśli zostaną wykryte uszkodzone pliki, wyświetla w dzienniku błąd hash.\n\nNie ma wpływu na wydajność i ma pomóc w rozwiązywaniu problemów.\n\nPozostaw WŁĄCZONE, jeśli nie masz pewności.", "pt_BR": "Habilita ou desabilita verificação de integridade dos arquivos do jogo", "ru_RU": "Проверяет файлы при загрузке игры и если обнаружены поврежденные файлы, выводит сообщение о поврежденном хэше в журнале.\n\nНе влияет на производительность и необходим для помощи в устранении неполадок.\n\nРекомендуется оставить включенным.", + "sv_SE": "Letar efter skadade filer när ett spel startas upp, och om skadade filer hittas, visas ett kontrollsummefel i loggen.\n\nHar ingen påverkan på prestandan och är tänkt att hjälpa felsökningen.\n\nLämna PÅ om du är osäker.", "th_TH": "ตรวจสอบไฟล์ที่เสียหายเมื่อบูตเกม และหากตรวจพบไฟล์ที่เสียหาย จะแสดงข้อผิดพลาดของแฮชในบันทึก\n\nไม่มีผลกระทบต่อประสิทธิภาพการทำงานและมีไว้เพื่อช่วยในการแก้ไขปัญหา\n\nเปิดทิ้งไว้หากคุณไม่แน่ใจ", "tr_TR": "Oyun açarken hatalı dosyaların olup olmadığını kontrol eder, ve hatalı dosya bulursa log dosyasında hash hatası görüntüler.\n\nPerformansa herhangi bir etkisi yoktur ve sorun gidermeye yardımcı olur.\n\nEmin değilseniz aktif halde bırakın.", "uk_UA": "Перевіряє наявність пошкоджених файлів під час завантаження гри, і якщо виявлено пошкоджені файли, показує помилку хешу в журналі.\n\nНе впливає на продуктивність і призначений для усунення несправностей.\n\nЗалиште увімкненим, якщо не впевнені.", @@ -14774,6 +15389,7 @@ "pl_PL": "Zmienia backend używany do renderowania dźwięku.\n\nSDL2 jest preferowany, podczas gdy OpenAL i SoundIO są używane jako rezerwy. Dummy nie będzie odtwarzać dźwięku.\n\nW razie wątpliwości ustaw SDL2.", "pt_BR": "Mudar biblioteca de áudio", "ru_RU": "Изменяет используемый аудио бэкенд для рендера звука.\n\nSDL2 является предпочтительным вариантом, в то время как OpenAL и SoundIO используются в качестве резервных.\n\nРекомендуется использование SDL2.", + "sv_SE": "Ändrar bakänden som används för att rendera ljud.\n\nSDL2 är den föredragna, men OpenAL och SoundIO används för att falla tillbaka på. Dummy har inget ljud.\n\nStäll in till SDL2 om du är osäker.", "th_TH": "เปลี่ยนแบ็กเอนด์ที่ใช้ในการเรนเดอร์เสียง\n\nแนะนำเป็น SDL2 ในขณะที่ OpenAL และ SoundIO ถูกใช้เป็นทางเลือกสำรอง ดัมมี่จะไม่มีเสียง\n\nตั้งค่าเป็น SDL2 หากคุณไม่แน่ใจ", "tr_TR": "Ses çıkış motorunu değiştirir.\n\nSDL2 tercih edilen seçenektir, OpenAL ve SoundIO ise alternatif olarak kullanılabilir. Dummy seçeneğinde ses çıkışı olmayacaktır.\n\nEmin değilseniz SDL2 seçeneğine ayarlayın.", "uk_UA": "Змінює серверну частину, яка використовується для відтворення аудіо.\n\nSDL2 є кращим, тоді як OpenAL і SoundIO використовуються як резервні варіанти. Dummy не матиме звуку.\n\nВстановіть SDL2, якщо не впевнені.", @@ -14798,6 +15414,7 @@ "pl_PL": "Zmień sposób mapowania i uzyskiwania dostępu do pamięci gości. Znacznie wpływa na wydajność emulowanego procesora.\n\nUstaw na HOST UNCHECKED, jeśli nie masz pewności.", "pt_BR": "Muda como a memória do sistema convidado é acessada. Tem um grande impacto na performance da CPU emulada.", "ru_RU": "Меняет разметку и доступ к гостевой памяти. Значительно влияет на производительность процессора.\n\nРекомендуется оставить \"Хост не установлен\"", + "sv_SE": "Ändra hur gästminne mappas och ges åtkomst till. Påverkar emulerad CPU-prestanda mycket.\n\nStäll in till \"Värd inte kontrollerad\" om du är osäker.", "th_TH": "เปลี่ยนวิธีการเข้าถึงหน่วยความจำของผู้เยี่ยมชม ส่งผลอย่างมากต่อประสิทธิภาพการทำงานของ CPU ที่จำลอง\n\nตั้งค่าเป็น ไม่ได้ตรวจสอบโฮสต์ หากคุณไม่แน่ใจ", "tr_TR": "Guest hafızasının nasıl tahsis edilip erişildiğini değiştirir. Emüle edilen CPU performansını ciddi biçimde etkiler.\n\nEmin değilseniz HOST UNCHECKED seçeneğine ayarlayın.", "uk_UA": "Змінює спосіб відображення та доступу до гостьової пам’яті. Значно впливає на продуктивність емульованого ЦП.\n\nВстановіть «Неперевірений хост», якщо не впевнені.", @@ -14822,6 +15439,7 @@ "pl_PL": "Użyj tabeli stron oprogramowania do translacji adresów. Najwyższa celność, ale najwolniejsza wydajność.", "pt_BR": "Usar uma tabela de página via software para tradução de endereços. Maior precisão, porém performance mais baixa.", "ru_RU": "Использует таблицу страниц для преобразования адресов. \nСамая высокая точность, но самая низкая производительность.", + "sv_SE": "Använd en programvarubaserad page table för adressöversättning. Högsta noggrannhet men lägsta prestanda.", "th_TH": "ใช้ตารางหน้าซอฟต์แวร์สำหรับการแปลที่อยู่ ความแม่นยำสูงสุดแต่ประสิทธิภาพช้าที่สุด", "tr_TR": "Adres çevirisi için bir işlemci sayfası kullanır. En yüksek doğruluğu ve en yavaş performansı sunar.", "uk_UA": "Використовує програмну таблицю сторінок для перекладу адрес. Найвища точність, але найповільніша продуктивність.", @@ -14846,6 +15464,7 @@ "pl_PL": "Bezpośrednio mapuj pamięć w przestrzeni adresowej hosta. Znacznie szybsza kompilacja i wykonanie JIT.", "pt_BR": "Mapeia memória no espaço de endereço hóspede diretamente. Compilação e execução do JIT muito mais rápida.", "ru_RU": "Прямая разметка памяти в адресном пространстве хоста. \nЗначительно более быстрые запуск и компиляция JIT.", + "sv_SE": "Direkt mappning av minne i host address space. Mycket snabbare JIT-kompilering och körning.", "th_TH": "แมปหน่วยความจำในพื้นที่ที่อยู่โฮสต์โดยตรง การคอมไพล์และดำเนินการของ JIT เร็วขึ้นมาก", "tr_TR": "Hafızayı doğrudan host adres aralığında tahsis eder. Çok daha hızlı JIT derleme ve işletimi sunar.", "uk_UA": "Пряме відображення пам'яті в адресному просторі хосту. Набагато швидша компіляція та виконання JIT.", @@ -14870,6 +15489,7 @@ "pl_PL": "Bezpośrednio mapuj pamięć, ale nie maskuj adresu w przestrzeni adresowej gościa przed uzyskaniem dostępu. Szybciej, ale kosztem bezpieczeństwa. Aplikacja gościa może uzyskać dostęp do pamięci z dowolnego miejsca w Ryujinx, więc w tym trybie uruchamiaj tylko programy, którym ufasz.", "pt_BR": "Mapeia memória diretamente, mas sem limitar o acesso ao espaço de endereçamento do sistema convidado. Mais rápido, porém menos seguro. O aplicativo convidado pode acessar memória de qualquer parte do Ryujinx, então apenas rode programas em que você confia nesse modo.", "ru_RU": "Производит прямую разметку памяти, но не маскирует адрес в гостевом адресном пространстве перед получением доступа. \nБыстро, но небезопасно. Гостевое приложение может получить доступ к памяти из Ryujinx, поэтому в этом режиме рекомендуется запускать только те программы, которым вы доверяете.", + "sv_SE": "Direkt mappning av minne, men maskera inte adressen inom guest address space innan åtkomst. Snabbare men kostar säkerhet. Gästapplikationen kan komma åt minne från överallt i Ryujinx, så kör endast program som du litar på i detta läge.", "th_TH": "แมปหน่วยความจำโดยตรง แต่อย่าตั้งค่าที่อยู่ของผู้เยี่ยมชมก่อนที่จะเข้าถึง เร็วกว่า แต่ต้องแลกกับความปลอดภัย แอปพลิเคชั่นของผู้เยี่ยมชมสามารถเข้าถึงหน่วยความจำได้จากทุกที่ใน Ryujinx แนะนำให้รันเฉพาะโปรแกรมที่คุณเชื่อถือในโหมดนี้", "tr_TR": "Hafızayı doğrudan tahsis eder, ancak host aralığına erişimden önce adresi maskelemez. Daha iyi performansa karşılık emniyetten ödün verir. Misafir uygulama Ryujinx içerisinden istediği hafızaya erişebilir, bu sebeple bu seçenek ile sadece güvendiğiniz uygulamaları çalıştırın.", "uk_UA": "Пряме відображення пам’яті, але не маскує адресу в гостьовому адресному просторі перед доступом. Швидше, але ціною безпеки. Гостьова програма може отримати доступ до пам’яті з будь-якого місця в Ryujinx, тому запускайте в цьому режимі лише програми, яким ви довіряєте.", @@ -14894,6 +15514,7 @@ "pl_PL": "Użyj Hiperwizora zamiast JIT. Znacznie poprawia wydajność, gdy jest dostępny, ale może być niestabilny w swoim obecnym stanie ", "pt_BR": "Usa o Hypervisor em vez de JIT (recompilador dinâmico). Melhora significativamente o desempenho quando disponível, mas pode ser instável no seu estado atual.", "ru_RU": "Использует Hypervisor вместо JIT. Значительно увеличивает производительность, но может работать нестабильно.", + "sv_SE": "Använd hypervisor istället för JIT. Förbättrar prestandan avsevärt när den finns tillgänglig men kan ge ostabilitet i dess aktuella tillstånd.", "th_TH": "ใช้ Hypervisor แทน JIT ปรับปรุงประสิทธิภาพอย่างมากเมื่อพร้อมใช้งาน แต่อาจไม่เสถียรในสถานะปัจจุบัน", "tr_TR": "JIT yerine Hypervisor kullan. Uygun durumlarda performansı büyük oranda arttırır. Ancak şu anki halinde stabil durumda çalışmayabilir.", "uk_UA": "Використання гіпервізор замість JIT. Значно покращує продуктивність, коли доступний, але може бути нестабільним у поточному стані.", @@ -14918,6 +15539,7 @@ "pl_PL": "Wykorzystuje alternatywny układ MemoryMode, aby naśladować model rozwojowy Switcha.\n\nJest to przydatne tylko w przypadku pakietów tekstur o wyższej rozdzielczości lub modów w rozdzielczości 4k. NIE poprawia wydajności.\n\nW razie wątpliwości pozostaw WYŁĄCZONE.", "pt_BR": "Expande a memória do sistema emulado de 4GiB para 6GiB", "ru_RU": "Использует альтернативный макет MemoryMode для имитации использования Nintendo Switch в режиме разработчика.\n\nПолезно только для пакетов текстур с высоким разрешением или модов добавляющих разрешение 4К. Не улучшает производительность.\n\nРекомендуется оставить выключенным.", + "sv_SE": "Använder ett alternativt minnesläge med 8GiB av DRAM för att efterlikna en utvecklingsmodell av Switch.\n\nDetta är endast användbart för texturpaket med högre upplösning eller moddar för 4k-upplösning. Det förbättrar INTE prestandan.\n\nLämna AV om du är osäker.", "th_TH": "ใช้รูปแบบ MemoryMode ทางเลือกเพื่อเลียนแบบโมเดลการพัฒนาสวิตช์\n\nสิ่งนี้มีประโยชน์สำหรับแพ็กพื้นผิวที่มีความละเอียดสูงกว่าหรือม็อดที่มีความละเอียด 4k เท่านั้น\n\nปล่อยให้ปิดหากคุณไม่แน่ใจ", "tr_TR": "Emüle edilen sistem hafızasını 4GiB'dan 6GiB'a yükseltir.\n\nBu seçenek yalnızca yüksek çözünürlük doku paketleri veya 4k çözünürlük modları için kullanılır. Performansı artırMAZ!\n\nEmin değilseniz devre dışı bırakın.", "uk_UA": "Використовує альтернативний макет MemoryMode для імітації моделі розробки Switch.\n\nЦе корисно лише для пакетів текстур з вищою роздільною здатністю або модифікацій із роздільною здатністю 4K. НЕ покращує продуктивність.\n\nЗалиште вимкненим, якщо не впевнені.", @@ -14942,6 +15564,7 @@ "pl_PL": "Ignoruje niezaimplementowane usługi Horizon OS. Może to pomóc w ominięciu awarii podczas uruchamiania niektórych gier.\n\nW razie wątpliwości pozostaw WYŁĄCZONE.", "pt_BR": "Habilita ou desabilita a opção de ignorar serviços não implementados", "ru_RU": "Игнорирует нереализованные сервисы Horizon в новых прошивках. Эта настройка поможет избежать вылеты при запуске определенных игр.\n\nРекомендуется оставить выключенным.", + "sv_SE": "Ignorerar Horizon OS-tjänster som inte har implementerats. Detta kan avhjälpa krascher när vissa spel startar upp.\n\nLämna AV om du är osäker.", "th_TH": "ละเว้นบริการ Horizon OS ที่ยังไม่ได้ใช้งาน วิธีนี้อาจช่วยในการหลีกเลี่ยงข้อผิดพลาดเมื่อบูตเกมบางเกม\n\nปล่อยให้ปิดหากคุณไม่แน่ใจ", "tr_TR": "Henüz programlanmamış Horizon işletim sistemi servislerini görmezden gelir. Bu seçenek belirli oyunların açılırken çökmesinin önüne geçmeye yardımcı olabilir.\n\nEmin değilseniz devre dışı bırakın.", "uk_UA": "Ігнорує нереалізовані служби Horizon OS. Це може допомогти в обході збоїв під час завантаження певних ігор.\n\nЗалиште вимкненим, якщо не впевнені.", @@ -14966,6 +15589,7 @@ "pl_PL": "Zewnętrzny dialog \"Controller Applet\" nie pojawi się, jeśli gamepad zostanie odłączony podczas rozgrywki. Nie pojawi się monit o zamknięcie dialogu lub skonfigurowanie nowego kontrolera. Po ponownym podłączeniu poprzednio odłączonego kontrolera gra zostanie automatycznie wznowiona.", "pt_BR": "O diálogo externo \"Controller Applet\" não aparecerá se o gamepad for desconectado durante o jogo. Não haverá prompt para fechar o diálogo ou configurar um novo controle. Assim que o controle desconectado anteriormente for reconectado, o jogo será retomado automaticamente.", "ru_RU": "Внешний диалог \"Апплет контроллера\" не появится, если геймпад будет отключен во время игры. Не будет предложено закрыть диалог или настроить новый контроллер. После повторного подключения ранее отключенного контроллера игра автоматически возобновится.", + "sv_SE": "Den externa dialogen \"Handkontroller-applet\" kommer inte att visas om din gamepad är frånkopplad under spel. Det finns ingen fråga att stänga dialogen eller konfigurera en ny handkontroller. När den tidigare frånkopplade handkontrollern återansluts så kommer spelet att automatiskt återupptas.", "th_TH": "กล่องโต้ตอบภายนอก \"แอปเพล็ตตัวควบคุม\" จะไม่ปรากฏขึ้นหากแป้นเกมถูกตัดการเชื่อมต่อระหว่างการเล่นเกม จะไม่มีข้อความแจ้งให้ปิดกล่องโต้ตอบหรือตั้งค่าตัวควบคุมใหม่ เมื่อเชื่อมต่อคอนโทรลเลอร์ที่ตัดการเชื่อมต่อก่อนหน้านี้อีกครั้ง เกมจะดำเนินการต่อโดยอัตโนมัติ", "tr_TR": "Oyun sırasında oyun kumandasının bağlantısı kesilirse, harici \"Controller Applet\" iletişim kutusu görünmez. İletişim kutusunu kapatma veya yeni bir kumanda ayarlama isteği olmaz. Daha önce bağlantısı kesilen kumanda tekrar bağlandığında oyun otomatik olarak devam eder.", "uk_UA": "Зовнішнє діалогове вікно \"Аплет контролера\" не з’являтиметься, якщо геймпад буде від’єднано під час гри. Не буде запиту закрити діалогове вікно чи налаштувати новий контролер. Після повторного підключення раніше від’єднаного контролера гра автоматично відновиться.", @@ -14990,6 +15614,7 @@ "pl_PL": "Wykonuje polecenia backend'u graficznego w drugim wątku.\n\nPrzyspiesza kompilację shaderów, zmniejsza zacinanie się i poprawia wydajność sterowników GPU bez własnej obsługi wielowątkowości. Nieco lepsza wydajność w sterownikach z wielowątkowością.\n\nUstaw na AUTO, jeśli nie masz pewności.", "pt_BR": "Habilita multithreading do backend gráfico", "ru_RU": "Выполняет команды графического бэкенда на втором потоке.\n\nУскоряет компиляцию шейдеров, уменьшает статтеры и повышает производительность на драйверах видеоадаптера без поддержки многопоточности. Производительность на драйверах с многопоточностью немного выше.\n\nРекомендуется оставить Автоматически.", + "sv_SE": "Kör kommandon för grafikbakände i en andra tråd.\n\nSnabbar upp shader compilation, minskar stuttering och förbättrar prestandan på GPU-drivrutiner utan stöd för egen multithreading. Något bättre prestanda på drivrutiner med multithreading.\n\nStäll in till AUTO om du är osäker.", "th_TH": "ดำเนินการคำสั่งแบ็กเอนด์กราฟิกบนเธรดที่สอง\n\nเร่งความเร็วการคอมไพล์ ลดการกระตุก และปรับปรุงประสิทธิภาพการทำงานของไดรเวอร์ GPU โดยไม่ต้องรองรับมัลติเธรดในตัว ประสิทธิภาพที่ดีขึ้นเล็กน้อยสำหรับไดรเวอร์ที่มีมัลติเธรด\n\nตั้งเป็น อัตโนมัติ หากคุณไม่แน่ใจ", "tr_TR": "Grafik arka uç komutlarını ikinci bir iş parçacığında işletir.\n\nKendi multithreading desteği olmayan sürücülerde shader derlemeyi hızlandırıp performansı artırır. Multithreading desteği olan sürücülerde çok az daha iyi performans sağlar.\n\nEmin değilseniz Otomatik seçeneğine ayarlayın.", "uk_UA": "Виконує команди графічного сервера в другому потоці.\n\nПрискорює компіляцію шейдерів, зменшує затримки та покращує продуктивність драйверів GPU без власної підтримки багатопоточності. Трохи краща продуктивність на драйверах з багатопотоковістю.\nВстановіть значення «Авто», якщо не впевнені", @@ -15014,6 +15639,7 @@ "pl_PL": "Wykonuje polecenia backend'u graficznego w drugim wątku.\n\nPrzyspiesza kompilację shaderów, zmniejsza zacinanie się i poprawia wydajność sterowników GPU bez własnej obsługi wielowątkowości. Nieco lepsza wydajność w sterownikach z wielowątkowością.\n\nUstaw na AUTO, jeśli nie masz pewności.", "pt_BR": "Executa comandos do backend gráfico em uma segunda thread. Permite multithreading em tempo de execução da compilação de shader, diminui os travamentos, e melhora performance em drivers sem suporte embutido a multithreading. Pequena variação na performance máxima em drivers com suporte a multithreading. Ryujinx pode precisar ser reiniciado para desabilitar adequadamente o multithreading embutido do driver, ou você pode precisar fazer isso manualmente para ter a melhor performance.", "ru_RU": "Выполняет команды графического бэкенда на втором потоке.\n\nУскоряет компиляцию шейдеров, уменьшает статтеры и повышает производительность на драйверах видеоадаптера без поддержки многопоточности. Производительность на драйверах с многопоточностью немного выше.\n\nРекомендуется оставить Автоматически.", + "sv_SE": "Kör kommandon för grafikbakände i en andra tråd.\n\nSnabbar upp shader compilation, minskar stuttering och förbättrar prestandan på GPU-drivrutiner utan stöd för egen multithreading. Något bättre prestanda på drivrutiner med multithreading.\n\nStäll in till AUTO om du är osäker.", "th_TH": "ดำเนินการคำสั่งแบ็กเอนด์กราฟิกบนเธรดที่สอง\n\nเร่งความเร็วการคอมไพล์เชเดอร์ ลดการกระตุก และปรับปรุงประสิทธิภาพการทำงานของไดรเวอร์ GPU โดยไม่ต้องรองรับมัลติเธรดในตัว ประสิทธิภาพที่ดีขึ้นเล็กน้อยสำหรับไดรเวอร์ที่มีมัลติเธรด\n\nตั้งเป็น อัตโนมัติ หากคุณไม่แน่ใจ", "tr_TR": "Grafik arka uç komutlarını ikinci bir iş parçacığında işletir.\n\nKendi multithreading desteği olmayan sürücülerde shader derlemeyi hızlandırıp performansı artırır. Multithreading desteği olan sürücülerde çok az daha iyi performans sağlar.\n\nEmin değilseniz Otomatik seçeneğine ayarlayın.", "uk_UA": "Виконує команди графічного сервера в другому потоці.\n\nПрискорює компіляцію шейдерів, зменшує затримки та покращує продуктивність драйверів GPU без власної підтримки багатопоточності. Трохи краща продуктивність на драйверах з багатопотоковістю.\n\nВстановіть значення «Авто», якщо не впевнені.", @@ -15038,6 +15664,7 @@ "pl_PL": "Zapisuje pamięć podręczną shaderów na dysku, co zmniejsza zacinanie się w kolejnych uruchomieniach.\n\nPozostaw WŁĄCZONE, jeśli nie masz pewności.", "pt_BR": "Habilita ou desabilita o cache de shader", "ru_RU": "Сохраняет кэш шейдеров на диске, для уменьшения статтеров при последующих запусках.\n\nРекомендуется оставить включенным.", + "sv_SE": "Sparar en disk shader cache som minskar stuttering i efterföljande körningar.\n\nLämna PÅ om du är osäker.", "th_TH": "บันทึกแคชแสงเงาของดิสก์ซึ่งช่วยลดการกระตุกในการรันครั้งต่อๆ ไป\n\nเปิดทิ้งไว้หากคุณไม่แน่ใจ", "tr_TR": "Sonraki çalışmalarda takılmaları engelleyen bir gölgelendirici disk önbelleğine kaydeder.", "uk_UA": "Зберігає кеш дискового шейдера, що зменшує затримки під час наступних запусків.\n\nЗалиште увімкненим, якщо не впевнені.", @@ -15062,6 +15689,7 @@ "pl_PL": "", "pt_BR": "Multiplica a resolução de renderização do jogo.\n\nAlguns jogos podem não funcionar bem com essa opção e apresentar uma aparência pixelada, mesmo com o aumento da resolução; para esses jogos, talvez seja necessário encontrar mods que removam o anti-aliasing ou aumentem a resolução de renderização interna. Ao usar a segunda opção, provavelmente desejará selecionar Nativa.\n\nEssa opção pode ser alterada enquanto um jogo está em execução, clicando em \"Aplicar\" abaixo; basta mover a janela de configurações para o lado e experimentar até encontrar o visual preferido para o jogo.\n\nLembre-se de que 4x é exagerado para praticamente qualquer configuração.", "ru_RU": "Увеличивает разрешение рендера игры.\n\nНекоторые игры могут не работать с этой настройкой и выглядеть смазано даже когда разрешение увеличено. Для таких игр может потребоваться установка модов, которые убирают сглаживание или увеличивают разрешение рендеринга. \nДля использования последнего, вам нужно будет выбрать опцию \"Нативное\".\n\nЭта опция может быть изменена во время игры по нажатию кнопки \"Применить\" ниже. Вы можете просто переместить окно настроек в сторону и поэкспериментировать, пока не подберете подходящие настройки для конкретной игры.\n\nИмейте в виду, что \"4x\" является излишеством.", + "sv_SE": "Multiplicerar spelets renderingsupplösning.\n\nNågra spel kanske inte fungerar med detta och ser pixelerade ut även när upplösningen ökas; för dessa spel så kan du behöva hitta moddar som tar bort anti-aliasing eller som ökar deras interna renderingsupplösning. För att använda det senare, kommer du sannolikt vilja välja Inbyggd.\n\nDet här alternativet kan ändras medan ett spel körs genom att klicka på \"Tillämpa\" nedan. du kan helt enkelt flytta inställningsfönstret åt sidan och experimentera tills du hittar ditt föredragna utseende för ett spel.\n\nTänk på att 4x är overkill för praktiskt taget alla maskiner.", "th_TH": "คูณความละเอียดการเรนเดอร์ของเกม\n\nเกมบางเกมอาจไม่สามารถใช้งานได้และดูเป็นพิกเซลแม้ว่าความละเอียดจะเพิ่มขึ้นก็ตาม สำหรับเกมเหล่านั้น คุณอาจต้องค้นหาม็อดที่ลบรอยหยักของภาพหรือเพิ่มความละเอียดในการเรนเดอร์ภายใน หากต้องการใช้อย่างหลัง คุณอาจต้องเลือก Native\n\nตัวเลือกนี้สามารถเปลี่ยนแปลงได้ในขณะที่เกมกำลังทำงานอยู่โดยคลิก \"นำมาใช้\" ด้านล่าง คุณสามารถย้ายหน้าต่างการตั้งค่าไปด้านข้างและทดลองจนกว่าคุณจะพบรูปลักษณ์ที่คุณต้องการสำหรับเกม\n\nโปรดทราบว่า 4x นั้นเกินความจำเป็นสำหรับการตั้งค่าแทบทุกประเภท", "tr_TR": "", "uk_UA": "Множить роздільну здатність гри.\n\nДеякі ігри можуть не працювати з цією функцією, і виглядатимуть піксельними; для цих ігор треба знайти модифікації, що зупиняють згладжування або підвищують роздільну здатність. Для останніх модифікацій, вибирайте \"Native\".\n\nЦей параметр можна міняти коли гра запущена кліком на \"Застосувати\"; ви можете перемістити вікно налаштувань і поекспериментувати з видом гри.\n\nМайте на увазі, що 4x це занадто для будь-якого комп'ютера.", @@ -15086,6 +15714,7 @@ "pl_PL": "Skala rozdzielczości zmiennoprzecinkowej, np. 1,5. Skale niecałkowite częściej powodują problemy lub awarie.", "pt_BR": "Escala de resolução de ponto flutuante, como 1.5. Valores não inteiros tem probabilidade maior de causar problemas ou quebras.", "ru_RU": "Масштабирование разрешения с плавающей запятой, например 1,5. Неинтегральное масштабирование с большой вероятностью вызовет сбои в работе.", + "sv_SE": "Skala för floating point resolution, såsom 1.5. Icke-heltalsskalor är mer benägna att orsaka problem eller krasch.", "th_TH": "สเกลความละเอียดจุดทศนิยม เช่น 1.5 ไม่ใช่จำนวนเต็มของสเกล มีแนวโน้มที่จะก่อให้เกิดปัญหาหรือความผิดพลาดได้", "tr_TR": "Küsüratlı çözünürlük ölçeği, 1.5 gibi. Küsüratlı ölçekler hata oluşturmaya ve çökmeye daha yatkındır.", "uk_UA": "Масштаб роздільної здатності з плаваючою комою, наприклад 1,5. Не інтегральні масштаби, швидше за все, спричинять проблеми або збій.", @@ -15110,6 +15739,7 @@ "pl_PL": "", "pt_BR": "Nível de Filtragem Anisotrópica. Defina como Automático para usar o valor solicitado pelo jogo.", "ru_RU": "Уровень анизотропной фильтрации. \n\nУстановите значение Автоматически, чтобы использовать значение по умолчанию игры.", + "sv_SE": "Nivå av anisotropisk filtrering. Ställ in till Automatiskt för att använda det värde som begärts av spelet.", "th_TH": "ระดับของ Anisotropic ตั้งค่าเป็นอัตโนมัติเพื่อใช้ค่าพื้นฐานของเกม", "tr_TR": "", "uk_UA": "Рівень анізотропної фільтрації. Встановіть на «Авто», щоб використовувати значення, яке вимагає гра.", @@ -15134,6 +15764,7 @@ "pl_PL": "", "pt_BR": "Proporção de Tela aplicada à janela do renderizador.\n\nAltere isso apenas se estiver usando um mod de proporção para o seu jogo; caso contrário, os gráficos ficarão esticados.\n\nMantenha em 16:9 se estiver em dúvida.", "ru_RU": "Соотношение сторон окна рендерера.\n\nИзмените эту настройку только если вы используете мод для соотношения сторон, иначе изображение будет растянуто.\n\nРекомендуется настройка 16:9.", + "sv_SE": "Bildförhållande att appliceras på renderarfönstret.\n\nÄndra endast detta om du använder en modd för bildförhållande till ditt spel, annars kommer grafiken att sträckas ut.\n\nLämna den till 16:9 om du är osäker.", "th_TH": "อัตราส่วนภาพที่ใช้กับหน้าต่างตัวแสดงภาพ\n\nเปลี่ยนสิ่งนี้หากคุณใช้ตัวดัดแปลงอัตราส่วนกว้างยาวสำหรับเกมของคุณ ไม่เช่นนั้นกราฟิกจะถูกยืดออก\n\nทิ้งไว้ที่ 16:9 หากไม่แน่ใจ", "tr_TR": "", "uk_UA": "Співвідношення сторін застосовано до вікна рендера.\n\nМіняйте тільки, якщо використовуєте модифікацію співвідношення сторін для гри, інакше графіка буде розтягнута.\n\nЗалиште на \"16:9\", якщо не впевнені.", @@ -15158,6 +15789,7 @@ "pl_PL": "Ścieżka Zrzutu Shaderów Grafiki", "pt_BR": "Diretòrio de despejo de shaders", "ru_RU": "Путь с дампами графических шейдеров", + "sv_SE": "Sökväg för Graphics Shaders Dump", "th_TH": "ที่เก็บ ดัมพ์ไฟล์เชเดอร์", "tr_TR": "Grafik Shader Döküm Yolu", "uk_UA": "Шлях скидання графічних шейдерів", @@ -15182,6 +15814,7 @@ "pl_PL": "Zapisuje logowanie konsoli w pliku dziennika na dysku. Nie wpływa na wydajność.", "pt_BR": "Habilita ou desabilita log para um arquivo no disco", "ru_RU": "Включает ведение журнала в файл на диске. Не влияет на производительность.", + "sv_SE": "Sparar konsolloggning till en loggfil på disk. Påverkar inte prestandan.", "th_TH": "บันทึกประวัติคอนโซลลงในไฟล์บันทึก จะไม่ส่งผลกระทบต่อประสิทธิภาพการทำงาน", "tr_TR": "Konsol loglarını diskte bir log dosyasına kaydeder. Performansı etkilemez.", "uk_UA": "Зберігає журнал консолі у файл журналу на диску. Не впливає на продуктивність.", @@ -15206,6 +15839,7 @@ "pl_PL": "Wyświetla w konsoli skrótowe komunikaty dziennika. Nie wpływa na wydajność.", "pt_BR": "Habilita ou desabilita exibição de mensagens de stub", "ru_RU": "Включает ведение журнала-заглушки. Не влияет на производительность.", + "sv_SE": "Skriver ut stubbloggmeddelanden i konsollen. Påverkar inte prestandan.", "th_TH": "พิมพ์ข้อความประวัติในคอนโซล จะไม่ส่งผลกระทบต่อประสิทธิภาพการทำงาน", "tr_TR": "Stub log mesajlarını konsola yazdırır. Performansı etkilemez.", "uk_UA": "Друкує повідомлення журналу-заглушки на консолі. Не впливає на продуктивність.", @@ -15230,6 +15864,7 @@ "pl_PL": "Wyświetla komunikaty dziennika informacyjnego w konsoli. Nie wpływa na wydajność.", "pt_BR": "Habilita ou desabilita exibição de mensagens informativas", "ru_RU": "Включает вывод сообщений информационного журнала в консоль. Не влияет на производительность.", + "sv_SE": "Skriver ut informationsloggmeddelanden i konsollen. Påverkar inte prestandan.", "th_TH": "พิมพ์ข้อความบันทึกข้อมูลในคอนโซล จะไม่ส่งผลกระทบต่อประสิทธิภาพการทำงาน", "tr_TR": "Bilgi log mesajlarını konsola yazdırır. Performansı etkilemez.", "uk_UA": "Друкує повідомлення інформаційного журналу на консолі. Не впливає на продуктивність.", @@ -15254,6 +15889,7 @@ "pl_PL": "Wyświetla komunikaty dziennika ostrzeżeń w konsoli. Nie wpływa na wydajność.", "pt_BR": "Habilita ou desabilita exibição de mensagens de alerta", "ru_RU": "Включает вывод сообщений журнала предупреждений в консоль. Не влияет на производительность.", + "sv_SE": "Skriver ut varningsloggmeddelanden i konsollen. Påverkar inte prestandan.", "th_TH": "พิมพ์ข้อความประวัติการเตือนในคอนโซล จะไม่ส่งผลกระทบต่อประสิทธิภาพการทำงาน", "tr_TR": "Uyarı log mesajlarını konsola yazdırır. Performansı etkilemez.", "uk_UA": "Друкує повідомлення журналу попереджень у консолі. Не впливає на продуктивність.", @@ -15278,6 +15914,7 @@ "pl_PL": "Wyświetla w konsoli komunikaty dziennika błędów. Nie wpływa na wydajność.", "pt_BR": "Habilita ou desabilita exibição de mensagens de erro", "ru_RU": "Включает вывод сообщений журнала ошибок. Не влияет на производительность.", + "sv_SE": "Skriver ut felloggmeddelanden i konsollen. Påverkar inte prestandan.", "th_TH": "พิมพ์ข้อความบันทึกข้อผิดพลาดในคอนโซล จะไม่ส่งผลกระทบต่อประสิทธิภาพการทำงาน", "tr_TR": "Hata log mesajlarını konsola yazdırır. Performansı etkilemez.", "uk_UA": "Друкує повідомлення журналу помилок у консолі. Не впливає на продуктивність.", @@ -15302,6 +15939,7 @@ "pl_PL": "Wyświetla komunikaty dziennika śledzenia w konsoli. Nie wpływa na wydajność.", "pt_BR": "Habilita ou desabilita exibição de mensagens de rastreamento", "ru_RU": "Выводит сообщения журнала трассировки в консоли. Не влияет на производительность.", + "sv_SE": "Skriver ut spårloggmeddelanden i konsollen. Påverkar inte prestandan.", "th_TH": "พิมพ์ข้อความประวัติการติดตามในคอนโซล ไม่ส่งผลกระทบต่อประสิทธิภาพการทำงาน", "tr_TR": "Trace log mesajlarını konsola yazdırır. Performansı etkilemez.", "uk_UA": "Друкує повідомлення журналу трасування на консолі. Не впливає на продуктивність.", @@ -15326,6 +15964,7 @@ "pl_PL": "Wyświetla komunikaty dziennika gości w konsoli. Nie wpływa na wydajność.", "pt_BR": "Habilita ou desabilita exibição de mensagens do programa convidado", "ru_RU": "Включает вывод сообщений гостевого журнала. Не влияет на производительность.", + "sv_SE": "Skriver ut gästloggmeddelanden i konsollen. Påverkar inte prestandan.", "th_TH": "พิมพ์ข้อความประวัติของผู้เยี่ยมชมในคอนโซล ไม่ส่งผลกระทบต่อประสิทธิภาพการทำงาน", "tr_TR": "Guest log mesajlarını konsola yazdırır. Performansı etkilemez.", "uk_UA": "Друкує повідомлення журналу гостей у консолі. Не впливає на продуктивність.", @@ -15350,6 +15989,7 @@ "pl_PL": "Wyświetla w konsoli komunikaty dziennika dostępu do plików.", "pt_BR": "Habilita ou desabilita exibição de mensagens do acesso de arquivos", "ru_RU": "Включает вывод сообщений журнала доступа к файлам.", + "sv_SE": "Skriver ut loggmeddelanden för filåtkomst i konsollen.", "th_TH": "พิมพ์ข้อความบันทึกการเข้าถึงไฟล์ในคอนโซล", "tr_TR": "Dosya sistemi erişim log mesajlarını konsola yazdırır.", "uk_UA": "Друкує повідомлення журналу доступу до файлів у консолі.", @@ -15374,6 +16014,7 @@ "pl_PL": "Włącza wyjście dziennika dostępu FS do konsoli. Możliwe tryby to 0-3", "pt_BR": "Habilita exibição de mensagens de acesso ao sistema de arquivos no console. Modos permitidos são 0-3", "ru_RU": "Включает вывод журнала доступа к файловой системе. Возможные режимы: 0-3", + "sv_SE": "Aktiverar loggutdata för filsystemsåtkomst i konsollen. Möjliga lägen är 0-3", "th_TH": "เปิดใช้งาน เอาต์พุตประวัติการเข้าถึง FS ไปยังคอนโซล โหมดที่เป็นไปได้คือ 0-3", "tr_TR": "Konsola FS erişim loglarının yazılmasını etkinleştirir. Kullanılabilir modlar 0-3'tür", "uk_UA": "Вмикає виведення журналу доступу до FS на консоль. Можливі режими 0-3", @@ -15398,6 +16039,7 @@ "pl_PL": "Używaj ostrożnie", "pt_BR": "Use com cuidado", "ru_RU": "Используйте с осторожностью", + "sv_SE": "Använd med försiktighet", "th_TH": "โปรดใช้ด้วยความระมัดระวัง", "tr_TR": "Dikkatli kullanın", "uk_UA": "Використовуйте з обережністю", @@ -15422,6 +16064,7 @@ "pl_PL": "Wymaga włączonych odpowiednich poziomów logów", "pt_BR": "Requer que os níveis de log apropriados estejaam habilitados", "ru_RU": "Требует включения соответствующих уровней ведения журнала", + "sv_SE": "Kräver att lämpliga loggnivåer aktiveras", "th_TH": "จำเป็นต้องเปิดใช้งานระดับบันทึกที่เหมาะสม", "tr_TR": "Uygun log seviyesinin aktif olmasını gerektirir", "uk_UA": "Потрібно увімкнути відповідні рівні журналу", @@ -15446,6 +16089,7 @@ "pl_PL": "Wyświetla komunikaty dziennika debugowania w konsoli.\n\nUżywaj tego tylko na wyraźne polecenie członka załogi, ponieważ utrudni to odczytanie dzienników i pogorszy wydajność emulatora.", "pt_BR": "Habilita exibição de mensagens de depuração", "ru_RU": "Выводит журнал сообщений отладки в консоли.\n\nИспользуйте только в случае просьбы разработчика, так как включение этой функции затруднит чтение журналов и ухудшит работу эмулятора.", + "sv_SE": "Skriver ut felsökningsloggmeddelanden i konsolen.\n\nAnvänd endast detta om det är specifikt instruerat av en medarbetare, eftersom det kommer att göra loggar svåra att läsa och försämra emulatorprestanda.", "th_TH": "พิมพ์ข้อความประวัติการแก้ไขข้อบกพร่องในคอนโซล\n\nใช้สิ่งนี้เฉพาะเมื่อได้รับคำแนะนำจากผู้ดูแลเท่านั้น เนื่องจากจะทำให้บันทึกอ่านยากและทำให้ประสิทธิภาพของโปรแกรมจำลองแย่ลง", "tr_TR": "Debug log mesajlarını konsola yazdırır.\n\nBu seçeneği yalnızca geliştirici üyemiz belirtirse aktifleştirin, çünkü bu seçenek log dosyasını okumayı zorlaştırır ve emülatörün performansını düşürür.", "uk_UA": "Друкує повідомлення журналу налагодження на консолі.\n\nВикористовуйте це лише за спеціальною вказівкою співробітника, оскільки це ускладнить читання журналів і погіршить роботу емулятора.", @@ -15470,6 +16114,7 @@ "pl_PL": "Otwórz eksplorator plików, aby wybrać plik kompatybilny z Switch do wczytania", "pt_BR": "Abre o navegador de arquivos para seleção de um arquivo do Switch compatível a ser carregado", "ru_RU": "Открывает файловый менеджер для выбора файла, совместимого с Nintendo Switch.", + "sv_SE": "Öppna en filutforskare för att välja en Switch-kompatibel fil att läsa in", "th_TH": "เปิดตัวสำรวจไฟล์เพื่อเลือกไฟล์ที่เข้ากันได้กับ Switch ที่จะโหลด", "tr_TR": "Switch ile uyumlu bir dosya yüklemek için dosya tarayıcısını açar", "uk_UA": "Відкриває файловий провідник, щоб вибрати для завантаження сумісний файл Switch", @@ -15494,6 +16139,7 @@ "pl_PL": "Otwórz eksplorator plików, aby wybrać zgodną z Switch, rozpakowaną aplikację do załadowania", "pt_BR": "Abre o navegador de pastas para seleção de pasta extraída do Switch compatível a ser carregada", "ru_RU": "Открывает файловый менеджер для выбора распакованного приложения, совместимого с Nintendo Switch.", + "sv_SE": "Öppna en filutforskare för att välja en Switch-kompatibel, uppackad applikation att läsa in", "th_TH": "เปิดตัวสำรวจไฟล์เพื่อเลือกไฟล์ที่เข้ากันได้กับ Switch ที่จะโหลด", "tr_TR": "Switch ile uyumlu ayrıştırılmamış bir uygulama yüklemek için dosya tarayıcısını açar", "uk_UA": "Відкриває файловий провідник, щоб вибрати сумісну з комутатором розпаковану програму для завантаження", @@ -15518,6 +16164,7 @@ "pl_PL": "", "pt_BR": "", "ru_RU": "", + "sv_SE": "Öppna en filutforskare för att välja en eller flera mappar att läsa in alla DLC från", "th_TH": "เปิดตัวสำรวจไฟล์เพื่อเลือกหนึ่งโฟลเดอร์ขึ้นไปเพื่อโหลด DLC จำนวนมาก", "tr_TR": "", "uk_UA": "Відкрийте провідник файлів, щоб вибрати одну або кілька папок для масового завантаження DLC", @@ -15542,6 +16189,7 @@ "pl_PL": "", "pt_BR": "Abra o explorador de arquivos para selecionar uma ou mais pastas e carregar atualizações de jogo em massa.", "ru_RU": "", + "sv_SE": "Öppna en filutforskare för att välja en eller flera mappar att läsa in alla titeluppdateringar från", "th_TH": "เปิดตัวสำรวจไฟล์เพื่อเลือกหนึ่งโฟลเดอร์ขึ้นไปเพื่อโหลดไฟล์อัปเดตจำนวนมาก", "tr_TR": "", "uk_UA": "Відкрийте провідник файлів, щоб вибрати одну або кілька папок для масового завантаження оновлень заголовків", @@ -15566,6 +16214,7 @@ "pl_PL": "Otwórz folder systemu plików Ryujinx", "pt_BR": "Abre o diretório do sistema de arquivos do Ryujinx", "ru_RU": "Открывает папку с файлами Ryujinx. ", + "sv_SE": "Öppna Ryujinx-filsystemsmappen", "th_TH": "เปิดโฟลเดอร์ระบบไฟล์ Ryujinx", "tr_TR": "Ryujinx dosya sistem klasörünü açar", "uk_UA": "Відкриває теку файлової системи Ryujinx", @@ -15590,6 +16239,7 @@ "pl_PL": "Otwiera folder, w którym zapisywane są logi", "pt_BR": "Abre o diretório onde os logs são salvos", "ru_RU": "Открывает папку в которую записываются логи", + "sv_SE": "Öppnar mappen där loggarna har skrivits till", "th_TH": "เปิดโฟลเดอร์ ที่เก็บไฟล์ประวัติ", "tr_TR": "Log dosyalarının bulunduğu klasörü açar", "uk_UA": "Відкриває теку, куди записуються журнали", @@ -15614,6 +16264,7 @@ "pl_PL": "Wyjdź z Ryujinx", "pt_BR": "Sair do Ryujinx", "ru_RU": "Выйти из Ryujinx", + "sv_SE": "Avsluta Ryujinx", "th_TH": "ออกจากโปรแกรม Ryujinx", "tr_TR": "Ryujinx'ten çıkış yapmayı sağlar", "uk_UA": "Виходить з Ryujinx", @@ -15638,6 +16289,7 @@ "pl_PL": "Otwórz okno ustawień", "pt_BR": "Abrir janela de configurações", "ru_RU": "Открывает окно параметров", + "sv_SE": "Öppna inställningar", "th_TH": "เปิดหน้าต่างการตั้งค่า", "tr_TR": "Seçenekler penceresini açar", "uk_UA": "Відкриває вікно налаштувань", @@ -15662,6 +16314,7 @@ "pl_PL": "Otwórz okno Menedżera Profili Użytkownika", "pt_BR": "Abrir janela de gerenciamento de perfis", "ru_RU": "Открыть менеджер учетных записей", + "sv_SE": "Öppna hanterare för användarprofiler", "th_TH": "เปิดหน้าต่างตัวจัดการโปรไฟล์ผู้ใช้", "tr_TR": "Kullanıcı profil yöneticisi penceresini açar", "uk_UA": "Відкриває вікно диспетчера профілів користувачів", @@ -15686,6 +16339,7 @@ "pl_PL": "Zatrzymaj emulację bieżącej gry i wróć do wyboru gier", "pt_BR": "Parar emulação do jogo atual e voltar a seleção de jogos", "ru_RU": "Остановка эмуляции текущей игры и возврат к списку игр", + "sv_SE": "Stoppa emulering av aktuellt spel och återgå till spelväljaren", "th_TH": "หยุดการจำลองของเกมที่เปิดอยู่ในปัจจุบันและกลับไปยังการเลือกเกม", "tr_TR": "Oynanmakta olan oyunun emülasyonunu durdurup oyun seçimine geri döndürür", "uk_UA": "Зупиняє емуляцію поточної гри та повертається до вибору гри", @@ -15710,6 +16364,7 @@ "pl_PL": "Sprawdź aktualizacje Ryujinx", "pt_BR": "Verificar por atualizações para o Ryujinx", "ru_RU": "Проверяет наличие обновлений для Ryujinx", + "sv_SE": "Leta efter uppdateringar för Ryujinx", "th_TH": "ตรวจสอบอัปเดตของ Ryujinx", "tr_TR": "Ryujinx güncellemelerini denetlemeyi sağlar", "uk_UA": "Перевіряє наявність оновлень для Ryujinx", @@ -15734,6 +16389,7 @@ "pl_PL": "Otwórz Okno Informacje", "pt_BR": "Abrir janela sobre", "ru_RU": "Открывает окно «О программе»", + "sv_SE": "Öppna Om-fönstret", "th_TH": "เปิดหน้าต่าง เกี่ยวกับ", "tr_TR": "Hakkında penceresini açar", "uk_UA": "Відкриває вікно «Про програму».", @@ -15758,6 +16414,7 @@ "pl_PL": "Wielkość siatki", "pt_BR": "Tamanho da grade", "ru_RU": "Размер сетки", + "sv_SE": "Rutnätsstorlek", "th_TH": "ขนาดตาราง", "tr_TR": "Öge Boyutu", "uk_UA": "Розмір сітки", @@ -15782,6 +16439,7 @@ "pl_PL": "Zmień rozmiar elementów siatki", "pt_BR": "Mudar tamanho dos items da grade", "ru_RU": "Меняет размер сетки элементов", + "sv_SE": "Ändra objektstorleken för rutnätet", "th_TH": "เปลี่ยนขนาด ของตาราง", "tr_TR": "Grid ögelerinin boyutunu değiştirmeyi sağlar", "uk_UA": "Змінити розмір елементів сітки", @@ -15806,6 +16464,7 @@ "pl_PL": "Brazylijski Portugalski", "pt_BR": "Português do Brasil", "ru_RU": "Португальский язык (Бразилия)", + "sv_SE": "Portugisiska (braziliansk)", "th_TH": "บราซิล โปรตุเกส", "tr_TR": "Brezilya Portekizcesi", "uk_UA": "Португальська (Бразилія)", @@ -15830,6 +16489,7 @@ "pl_PL": "Zobacz Wszystkich Współtwórców", "pt_BR": "Ver todos os contribuidores", "ru_RU": "Посмотреть всех участников", + "sv_SE": "Visa alla som bidragit", "th_TH": "ดูผู้มีส่วนร่วมทั้งหมด", "tr_TR": "Tüm katkıda bulunanları gör", "uk_UA": "Переглянути всіх співавторів", @@ -15854,6 +16514,7 @@ "pl_PL": "Głośność: ", "pt_BR": "Volume:", "ru_RU": "Громкость: ", + "sv_SE": "Volym: ", "th_TH": "ระดับเสียง: ", "tr_TR": "Ses Seviyesi: ", "uk_UA": "Гучність: ", @@ -15878,6 +16539,7 @@ "pl_PL": "Zmień Głośność Dźwięku", "pt_BR": "Mudar volume do áudio", "ru_RU": "Изменяет громкость звука", + "sv_SE": "Ändra ljudvolym", "th_TH": "ปรับระดับเสียง", "tr_TR": "Ses seviyesini değiştirir", "uk_UA": "Змінити гучність звуку", @@ -15902,6 +16564,7 @@ "pl_PL": "Dostęp do Internetu Gościa/Tryb LAN", "pt_BR": "Habilitar acesso à internet do programa convidado", "ru_RU": "Гостевой доступ в интернет/сетевой режим", + "sv_SE": "Gäståtkomst för Internet/LAN-läge", "th_TH": "การเข้าถึงอินเทอร์เน็ตของผู้เยี่ยมชม/โหมด LAN", "tr_TR": "Guest Internet Erişimi/LAN Modu", "uk_UA": "Гостьовий доступ до Інтернету/режим LAN", @@ -15926,6 +16589,7 @@ "pl_PL": "Pozwala emulowanej aplikacji na łączenie się z Internetem.\n\nGry w trybie LAN mogą łączyć się ze sobą, gdy ta opcja jest włączona, a systemy są połączone z tym samym punktem dostępu. Dotyczy to również prawdziwych konsol.\n\nNie pozwala na łączenie się z serwerami Nintendo. Może powodować awarie niektórych gier, które próbują połączyć się z Internetem.\n\nPozostaw WYŁĄCZONE, jeśli nie masz pewności.", "pt_BR": "Habilita acesso à internet do programa convidado. Se habilitado, o aplicativo vai se comportar como se o sistema Switch emulado estivesse conectado a Internet. Note que em alguns casos, aplicativos podem acessar a Internet mesmo com essa opção desabilitada", "ru_RU": "Позволяет эмулированному приложению подключаться к Интернету.\n\nПри включении этой функции игры с возможностью сетевой игры могут подключаться друг к другу, если все эмуляторы (или реальные консоли) подключены к одной и той же точке доступа.\n\nНЕ разрешает подключение к серверам Nintendo. Может вызвать сбой в некоторых играх, которые пытаются подключиться к Интернету.\n\nРекомендутеся оставить выключенным.", + "sv_SE": "Tillåter det emulerade programmet att ansluta till internet.\n\nSpel med ett LAN-läge kan ansluta till varandra när detta är aktiverat och systemen är anslutna till samma åtkomstpunkt. Detta inkluderar riktiga konsoler också.\n\nTillåter INTE anslutning till Nintendo-servrar. Kan orsaka kraschar i vissa spel som försöker ansluta till internet.\n\nLämna AV om du är osäker.", "th_TH": "อนุญาตให้แอปพลิเคชันจำลองเชื่อมต่ออินเทอร์เน็ต\n\nเกมที่มีโหมด LAN สามารถเชื่อมต่อระหว่างกันได้เมื่อเปิดใช้งานและระบบเชื่อมต่อกับจุดเชื่อมต่อเดียวกัน รวมถึงคอนโซลจริงด้วย\n\nไม่อนุญาตให้มีการเชื่อมต่อกับเซิร์ฟเวอร์ Nintendo อาจทำให้เกิดการหยุดทำงานในบางเกมที่พยายามเชื่อมต่ออินเทอร์เน็ต\n\nปล่อยให้ปิดหากคุณไม่แน่ใจ", "tr_TR": "Emüle edilen uygulamanın internete bağlanmasını sağlar.\n\nLAN modu bulunan oyunlar bu seçenek ile birbirine bağlanabilir ve sistemler aynı access point'e bağlanır. Bu gerçek konsolları da kapsar.\n\nNintendo sunucularına bağlanmayı sağlaMAZ. Internete bağlanmaya çalışan baz oyunların çökmesine sebep olabilr.\n\nEmin değilseniz devre dışı bırakın.", "uk_UA": "Дозволяє емульованій програмі підключатися до Інтернету.\n\nІгри з режимом локальної мережі можуть підключатися одна до одної, якщо це увімкнено, і системи підключені до однієї точки доступу. Сюди входять і справжні консолі.\n\nНЕ дозволяє підключатися до серверів Nintendo. Може призвести до збою в деяких іграх, які намагаються підключитися до Інтернету.\n\nЗалиште вимкненим, якщо не впевнені.", @@ -15950,6 +16614,7 @@ "pl_PL": "Zarządzaj Kodami", "pt_BR": "Gerenciar Cheats", "ru_RU": "Открывает окно управления читами", + "sv_SE": "Hantera fusk", "th_TH": "ฟังก์ชั่นจัดการสูตรโกง", "tr_TR": "Hileleri yönetmeyi sağlar", "uk_UA": "Керування читами", @@ -15974,6 +16639,7 @@ "pl_PL": "Zarządzaj Kodami", "pt_BR": "Gerenciar Cheats", "ru_RU": "Управление читами", + "sv_SE": "Hantera fusk", "th_TH": "ฟังก์ชั่นจัดการสูตรโกง", "tr_TR": "Hileleri Yönet", "uk_UA": "Керування читами", @@ -15998,6 +16664,7 @@ "pl_PL": "Zarządzaj modyfikacjami", "pt_BR": "Gerenciar Mods", "ru_RU": "Открывает окно управления модами", + "sv_SE": "Hantera moddar", "th_TH": "ฟังก์ชั่นจัดการม็อด", "tr_TR": "Modları Yönet", "uk_UA": "Керування модами", @@ -16022,6 +16689,7 @@ "pl_PL": "Zarządzaj modyfikacjami", "pt_BR": "Gerenciar Mods", "ru_RU": "Управление модами", + "sv_SE": "Hantera moddar", "th_TH": "ฟังก์ชั่นจัดการม็อด", "tr_TR": "Modları Yönet", "uk_UA": "Керування модами", @@ -16046,6 +16714,7 @@ "pl_PL": "Zasięg:", "pt_BR": "Intervalo:", "ru_RU": "Диапазон:", + "sv_SE": "Omfång:", "th_TH": "ขอบเขต:", "tr_TR": "Menzil:", "uk_UA": "Діапазон:", @@ -16070,6 +16739,7 @@ "pl_PL": "Ryujinx - Zatrzymaj Emulację", "pt_BR": "Ryujinx - Parar emulação", "ru_RU": "Ryujinx - Остановка эмуляции", + "sv_SE": "Ryujinx - Stoppa emulering", "th_TH": "Ryujinx - หยุดการจำลอง", "tr_TR": "Ryujinx - Emülasyonu Durdur", "uk_UA": "Ryujinx - Зупинити емуляцію", @@ -16094,6 +16764,7 @@ "pl_PL": "Czy na pewno chcesz zatrzymać emulację?", "pt_BR": "Tem certeza que deseja parar a emulação?", "ru_RU": "Вы уверены, что хотите остановить эмуляцию?", + "sv_SE": "Är du säker på att du vill stoppa emuleringen?", "th_TH": "คุณแน่ใจหรือไม่ว่าต้องการหยุดการจำลองหรือไม่?", "tr_TR": "Emülasyonu durdurmak istediğinizden emin misiniz?", "uk_UA": "Ви впевнені, що хочете зупинити емуляцію?", @@ -16118,6 +16789,7 @@ "pl_PL": "", "pt_BR": "", "ru_RU": "Процессор", + "sv_SE": "Processor", "th_TH": "ซีพียู", "tr_TR": "İşlemci", "uk_UA": "ЦП", @@ -16142,6 +16814,7 @@ "pl_PL": "Dżwięk", "pt_BR": "Áudio", "ru_RU": "Аудио", + "sv_SE": "Ljud", "th_TH": "เสียง", "tr_TR": "Ses", "uk_UA": "Аудіо", @@ -16166,6 +16839,7 @@ "pl_PL": "Sieć", "pt_BR": "Rede", "ru_RU": "Сеть", + "sv_SE": "Nätverk", "th_TH": "เครือข่าย", "tr_TR": "Ağ", "uk_UA": "Мережа", @@ -16190,6 +16864,7 @@ "pl_PL": "Połączenie Sieciowe", "pt_BR": "Conexão de rede", "ru_RU": "Подключение к сети", + "sv_SE": "Nätverksanslutning", "th_TH": "การเชื่อมต่อเครือข่าย", "tr_TR": "Ağ Bağlantısı", "uk_UA": "Підключення до мережі", @@ -16214,6 +16889,7 @@ "pl_PL": "Cache CPU", "pt_BR": "Cache da CPU", "ru_RU": "Кэш процессора", + "sv_SE": "CPU-cache", "th_TH": "แคชซีพียู", "tr_TR": "İşlemci Belleği", "uk_UA": "Кеш ЦП", @@ -16238,6 +16914,7 @@ "pl_PL": "Pamięć CPU", "pt_BR": "Memória da CPU", "ru_RU": "Режим процессора", + "sv_SE": "CPU-läge", "th_TH": "โหมดซีพียู", "tr_TR": "CPU Hafızası", "uk_UA": "Пам'ять ЦП", @@ -16262,6 +16939,7 @@ "pl_PL": "Aktualizator Wyłączony!", "pt_BR": "Atualizador desabilitado!", "ru_RU": "Средство обновления отключено", + "sv_SE": "Uppdateringar inaktiverade!", "th_TH": "ปิดใช้งานการอัปเดตแล้ว!", "tr_TR": "Güncelleyici Devre Dışı!", "uk_UA": "Програму оновлення вимкнено!", @@ -16286,6 +16964,7 @@ "pl_PL": "Obróć o 90° w Prawo", "pt_BR": "Rodar 90° sentido horário", "ru_RU": "Повернуть на 90° по часовой стрелке", + "sv_SE": "Rotera 90° medurs", "th_TH": "หมุน 90 องศา ตามเข็มนาฬิกา", "tr_TR": "Saat yönünde 90° Döndür", "uk_UA": "Повернути на 90° за годинниковою стрілкою", @@ -16310,6 +16989,7 @@ "pl_PL": "Rozmiar ikon", "pt_BR": "Tamanho do ícone", "ru_RU": "Размер обложек", + "sv_SE": "Ikonstorlek", "th_TH": "ขนาดไอคอน", "tr_TR": "Ikon Boyutu", "uk_UA": "Розмір значка", @@ -16334,6 +17014,7 @@ "pl_PL": "Zmień rozmiar ikon gry", "pt_BR": "Muda o tamanho do ícone do jogo", "ru_RU": "Меняет размер обложек", + "sv_SE": "Ändra storleken för spelikonerna", "th_TH": "เปลี่ยนขนาดของไอคอนเกม", "tr_TR": "Oyun ikonlarının boyutunu değiştirmeyi sağlar", "uk_UA": "Змінити розмір значків гри", @@ -16358,6 +17039,7 @@ "pl_PL": "Pokaż Konsolę", "pt_BR": "Exibir console", "ru_RU": "Показать консоль", + "sv_SE": "Visa konsoll", "th_TH": "แสดง คอนโซล", "tr_TR": "Konsol'u Göster", "uk_UA": "Показати консоль", @@ -16382,6 +17064,7 @@ "pl_PL": "Błąd podczas czyszczenia cache shaderów w {0}: {1}", "pt_BR": "Erro ao deletar o shader em {0}: {1}", "ru_RU": "Ошибка очистки кэша шейдеров в {0}: {1}", + "sv_SE": "Fel vid tömning av shader cache i {0}: {1}", "th_TH": "เกิดข้อผิดพลาดในการล้างแคชแสงเงา {0}: {1}", "tr_TR": "Belirtilen shader cache temizlenirken hata {0}: {1}", "uk_UA": "Помилка очищення кешу шейдера {0}: {1}", @@ -16406,6 +17089,7 @@ "pl_PL": "Nie znaleziono kluczy", "pt_BR": "Chaves não encontradas", "ru_RU": "Ключи не найдены", + "sv_SE": "Nycklarna hittades inte", "th_TH": "ไม่พบ คีย์", "tr_TR": "Keys bulunamadı", "uk_UA": "Ключі не знайдено", @@ -16430,6 +17114,7 @@ "pl_PL": "Nie znaleziono firmware'u", "pt_BR": "Firmware não encontrado", "ru_RU": "Прошивка не найдена", + "sv_SE": "Firmware hittades inte", "th_TH": "ไม่พบ เฟิร์มแวร์", "tr_TR": "Firmware bulunamadı", "uk_UA": "Прошивка не знайдена", @@ -16454,6 +17139,7 @@ "pl_PL": "Błąd parsowania firmware'u", "pt_BR": "Erro na leitura do Firmware", "ru_RU": "Ошибка извлечения прошивки", + "sv_SE": "Tolkningsfel i firmware", "th_TH": "เกิดข้อผิดพลาดในการวิเคราะห์เฟิร์มแวร์", "tr_TR": "Firmware çözümleme hatası", "uk_UA": "Помилка аналізу прошивки", @@ -16478,6 +17164,7 @@ "pl_PL": "Aplikacja nie znaleziona", "pt_BR": "Aplicativo não encontrado", "ru_RU": "Приложение не найдено", + "sv_SE": "Applikationen hittades inte", "th_TH": "ไม่พบ แอปพลิเคชัน", "tr_TR": "Uygulama bulunamadı", "uk_UA": "Додаток не знайдено", @@ -16502,6 +17189,7 @@ "pl_PL": "Nieznany błąd", "pt_BR": "Erro desconhecido", "ru_RU": "Неизвестная ошибка", + "sv_SE": "Okänt fel", "th_TH": "ข้อผิดพลาดที่ไม่รู้จัก", "tr_TR": "Bilinmeyen hata", "uk_UA": "Невідома помилка", @@ -16526,6 +17214,7 @@ "pl_PL": "Niezdefiniowany błąd", "pt_BR": "Erro indefinido", "ru_RU": "Неопределенная ошибка", + "sv_SE": "Odefinierat fel", "th_TH": "ข้อผิดพลาดที่ไม่ได้ระบุ", "tr_TR": "Tanımlanmayan hata", "uk_UA": "Невизначена помилка", @@ -16550,6 +17239,7 @@ "pl_PL": "Ryujinx nie mógł znaleźć twojego pliku 'prod.keys'", "pt_BR": "Ryujinx não conseguiu encontrar o seu arquivo 'prod.keys'", "ru_RU": "Ryujinx не удалось найти ваш 'prod.keys' файл", + "sv_SE": "Ryujinx kunde inte hitta din 'prod.keys'-fil", "th_TH": "Ryujinx ไม่พบไฟล์ 'prod.keys' ในเครื่องของคุณ", "tr_TR": "Ryujinx 'prod.keys' dosyasını bulamadı", "uk_UA": "Ryujinx не вдалося знайти ваш файл «prod.keys».", @@ -16574,6 +17264,7 @@ "pl_PL": "Ryujinx nie mógł znaleźć żadnego zainstalowanego firmware'u", "pt_BR": "Ryujinx não conseguiu encontrar nenhum Firmware instalado", "ru_RU": "Ryujinx не удалось найти ни одной установленной прошивки", + "sv_SE": "Ryujinx kunde inte hitta några installerade firmwares", "th_TH": "Ryujinx ไม่พบ เฟิร์มแวร์ที่ติดตั้งไว้ในเครื่องของคุณ", "tr_TR": "Ryujinx yüklü herhangi firmware bulamadı", "uk_UA": "Ryujinx не вдалося знайти встановлену прошивку", @@ -16598,6 +17289,7 @@ "pl_PL": "Ryujinx nie był w stanie zparsować dostarczonego firmware'u. Jest to zwykle spowodowane nieaktualnymi kluczami.", "pt_BR": "Ryujinx não conseguiu ler o Firmware fornecido. Geralmente isso é causado por chaves desatualizadas.", "ru_RU": "Ryujinx не удалось распаковать выбранную прошивку. Обычно это вызвано устаревшими ключами.", + "sv_SE": "Ryujinx kunde inte tolka angiven firmware. Detta sker oftast med utdaterade nycklar.", "th_TH": "Ryujinx ไม่สามารถวิเคราะห์เฟิร์มแวร์ที่ให้มาได้ ซึ่งมักมีสาเหตุมาจากคีย์ที่เก่าจนเกินไป", "tr_TR": "Ryujinx temin edilen firmware'i çözümleyemedi. Bu durum genellikle güncel olmayan keys'den kaynaklanır.", "uk_UA": "Ryujinx не вдалося проаналізувати прошивку. Зазвичай це спричинено застарілими ключами.", @@ -16622,6 +17314,7 @@ "pl_PL": "Ryujinx nie mógł znaleźć prawidłowej aplikacji na podanej ścieżce.", "pt_BR": "Ryujinx não conseguiu encontrar um aplicativo válido no caminho fornecido.", "ru_RU": "Ryujinx не удалось найти валидное приложение по указанному пути.", + "sv_SE": "Ryujinx kunde inte hitta en giltig applikation i angiven sökväg.", "th_TH": "Ryujinx ไม่พบแอปพลิเคชันที่ถูกต้องในที่เก็บไฟล์ที่กำหนด", "tr_TR": "Ryujinx belirtilen yolda geçerli bir uygulama bulamadı.", "uk_UA": "Ryujinx не вдалося знайти дійсний додаток за вказаним шляхом", @@ -16646,6 +17339,7 @@ "pl_PL": "Wystąpił nieznany błąd!", "pt_BR": "Um erro desconhecido foi encontrado!", "ru_RU": "Произошла неизвестная ошибка", + "sv_SE": "Ett okänt fel inträffade!", "th_TH": "เกิดข้อผิดพลาดที่ไม่รู้จัก!", "tr_TR": "Bilinmeyen bir hata oluştu!", "uk_UA": "Сталася невідома помилка!", @@ -16670,6 +17364,7 @@ "pl_PL": "Wystąpił niezdefiniowany błąd! To nie powinno się zdarzyć, skontaktuj się z deweloperem!", "pt_BR": "Um erro indefinido occoreu! Isso não deveria acontecer, por favor contate um desenvolvedor!", "ru_RU": "Произошла неизвестная ошибка. Этого не должно происходить, пожалуйста, свяжитесь с разработчиками.", + "sv_SE": "Ett odefinierat fel inträffade! Detta ska inte hända. Kontakta en utvecklare!", "th_TH": "เกิดข้อผิดพลาดที่ไม่สามารถระบุได้! สิ่งนี้ไม่ควรเกิดขึ้น โปรดติดต่อผู้พัฒนา!", "tr_TR": "Tanımlanmayan bir hata oluştu! Bu durum ile karşılaşılmamalıydı, lütfen bir geliştirici ile iletişime geçin!", "uk_UA": "Сталася невизначена помилка! Цього не повинно статися, зверніться до розробника!", @@ -16694,6 +17389,7 @@ "pl_PL": "Otwórz Podręcznik Konfiguracji", "pt_BR": "Abrir o guia de configuração", "ru_RU": "Открыть руководство по установке", + "sv_SE": "Öppna konfigurationsguiden", "th_TH": "เปิดคู่มือการตั้งค่า", "tr_TR": "Kurulum Kılavuzunu Aç", "uk_UA": "Відкрити посібник із налаштування", @@ -16718,6 +17414,7 @@ "pl_PL": "Brak Aktualizacji", "pt_BR": "Sem atualizações", "ru_RU": "Без обновлений", + "sv_SE": "Ingen uppdatering", "th_TH": "ไม่มีการอัปเดต", "tr_TR": "Güncelleme Yok", "uk_UA": "Немає оновлень", @@ -16731,22 +17428,23 @@ "ar_SA": "الإصدار: {0}", "de_DE": "Version {0} - {1}", "el_GR": "Version {0} - {1}", - "en_US": "Version {0}", + "en_US": "Version {0} - {1}", "es_ES": "Versión {0} - {1}", "fr_FR": "", - "he_IL": "גרסה {0}", - "it_IT": "Versione {0}", + "he_IL": "גרסה {0} - {1}", + "it_IT": "Versione {0} - {1}", "ja_JP": "バージョン {0} - {1}", - "ko_KR": "버전 {0}", - "no_NO": "Versjon {0}", + "ko_KR": "버전 {0} - {1}", + "no_NO": "Versjon {0} - {1}", "pl_PL": "Wersja {0} - {1}", - "pt_BR": "Versão {0}", + "pt_BR": "Versão {0} - {1}", "ru_RU": "Version {0} - {1}", - "th_TH": "เวอร์ชั่น {0}", + "sv_SE": "Version {0} - {1}", + "th_TH": "เวอร์ชั่น {0} - {1}", "tr_TR": "Sürüm {0} - {1}", "uk_UA": "Версія {0} - {1}", - "zh_CN": "游戏更新的版本 {0}", - "zh_TW": "版本 {0}" + "zh_CN": "游戏更新的版本 {0} - {1}", + "zh_TW": "版本 {0} - {1}" } }, { @@ -16766,6 +17464,7 @@ "pl_PL": "", "pt_BR": "Empacotado: Versão {0}", "ru_RU": "", + "sv_SE": "Bundlad: Version {0}", "th_TH": "Bundled: เวอร์ชั่น {0}", "tr_TR": "", "uk_UA": "Комплектні: Версія {0}", @@ -16790,6 +17489,7 @@ "pl_PL": "", "pt_BR": "Empacotado:", "ru_RU": "", + "sv_SE": "Bundlad:", "th_TH": "", "tr_TR": "", "uk_UA": "Комплектні:", @@ -16814,6 +17514,7 @@ "pl_PL": "", "pt_BR": "", "ru_RU": "", + "sv_SE": "Delvis", "th_TH": "", "tr_TR": "", "uk_UA": "Часткові", @@ -16838,6 +17539,7 @@ "pl_PL": "", "pt_BR": "", "ru_RU": "", + "sv_SE": "Inte optimerad", "th_TH": "", "tr_TR": "", "uk_UA": "Необрізані", @@ -16862,6 +17564,7 @@ "pl_PL": "", "pt_BR": "", "ru_RU": "", + "sv_SE": "Optimerad", "th_TH": "", "tr_TR": "", "uk_UA": "Обрізані", @@ -16886,6 +17589,7 @@ "pl_PL": "", "pt_BR": "", "ru_RU": "", + "sv_SE": "(misslyckades)", "th_TH": "", "tr_TR": "", "uk_UA": "(Невдача)", @@ -16910,6 +17614,7 @@ "pl_PL": "", "pt_BR": "", "ru_RU": "", + "sv_SE": "Spara {0:n0} Mb", "th_TH": "", "tr_TR": "", "uk_UA": "Зберегти {0:n0} Мб", @@ -16934,6 +17639,7 @@ "pl_PL": "", "pt_BR": "", "ru_RU": "", + "sv_SE": "Sparade {0:n0} Mb", "th_TH": "", "tr_TR": "", "uk_UA": "Збережено {0:n0} Мб", @@ -16958,6 +17664,7 @@ "pl_PL": "", "pt_BR": "Ryujinx - Informação", "ru_RU": "Ryujinx - Информация", + "sv_SE": "Ryujinx - Info", "th_TH": "Ryujinx – ข้อมูล", "tr_TR": "Ryujinx - Bilgi", "uk_UA": "Ryujin x - Інформація", @@ -16982,6 +17689,7 @@ "pl_PL": "Ryujinx - Potwierdzenie", "pt_BR": "Ryujinx - Confirmação", "ru_RU": "Ryujinx - Подтверждение", + "sv_SE": "Ryujinx - Bekräfta", "th_TH": "Ryujinx - ยืนยัน", "tr_TR": "Ryujinx - Doğrulama", "uk_UA": "Ryujinx - Підтвердження", @@ -17006,6 +17714,7 @@ "pl_PL": "Wszystkie typy", "pt_BR": "Todos os tipos", "ru_RU": "Все типы", + "sv_SE": "Alla typer", "th_TH": "ทุกประเภท", "tr_TR": "Tüm türler", "uk_UA": "Всі типи", @@ -17030,6 +17739,7 @@ "pl_PL": "Nigdy", "pt_BR": "Nunca", "ru_RU": "Никогда", + "sv_SE": "Aldrig", "th_TH": "ไม่ต้อง", "tr_TR": "Hiçbir Zaman", "uk_UA": "Ніколи", @@ -17054,6 +17764,7 @@ "pl_PL": "Musi mieć co najmniej {0} znaków", "pt_BR": "Deve ter pelo menos {0} caracteres", "ru_RU": "Должно быть не менее {0} символов.", + "sv_SE": "Får endast vara minst {0} tecken långt", "th_TH": "ต้องมีความยาวของตัวอักษรอย่างน้อย {0} ตัว", "tr_TR": "En az {0} karakter uzunluğunda olmalı", "uk_UA": "Мінімальна кількість символів: {0}", @@ -17078,6 +17789,7 @@ "pl_PL": "Musi mieć długość od {0}-{1} znaków", "pt_BR": "Deve ter entre {0}-{1} caracteres", "ru_RU": "Должно быть {0}-{1} символов", + "sv_SE": "Får endast vara {0}-{1} tecken långt", "th_TH": "ต้องมีความยาวของตัวอักษร {0}-{1} ตัว", "tr_TR": "{0}-{1} karakter uzunluğunda olmalı", "uk_UA": "Має бути {0}-{1} символів", @@ -17102,6 +17814,7 @@ "pl_PL": "", "pt_BR": "", "ru_RU": "", + "sv_SE": "Cabinet-dialog", "th_TH": "", "tr_TR": "", "uk_UA": "", @@ -17126,6 +17839,7 @@ "pl_PL": "", "pt_BR": "", "ru_RU": "", + "sv_SE": "Ange nya namnet för din Amiibo", "th_TH": "", "tr_TR": "", "uk_UA": "Вкажіть Ваше нове ім'я Amiibo", @@ -17150,6 +17864,7 @@ "pl_PL": "", "pt_BR": "", "ru_RU": "", + "sv_SE": "Skanna din Amiibo nu.", "th_TH": "", "tr_TR": "", "uk_UA": "Будь ласка, проскануйте Ваш Amiibo.", @@ -17174,6 +17889,7 @@ "pl_PL": "Klawiatura Oprogramowania", "pt_BR": "Teclado por Software", "ru_RU": "Программная клавиатура", + "sv_SE": "Programvarutangentbord", "th_TH": "ซอฟต์แวร์คีย์บอร์ด", "tr_TR": "Yazılım Klavyesi", "uk_UA": "Програмна клавіатура", @@ -17198,6 +17914,7 @@ "pl_PL": "Może składać się jedynie z 0-9 lub '.'", "pt_BR": "Deve ser somente 0-9 ou '.'", "ru_RU": "Должно быть в диапазоне 0-9 или '.'", + "sv_SE": "Får endast vara 0-9 eller '.'", "th_TH": "ต้องเป็น 0-9 หรือ '.' เท่านั้น", "tr_TR": "Sadece 0-9 veya '.' olabilir", "uk_UA": "Повинно бути лише 0-9 або “.”", @@ -17222,6 +17939,7 @@ "pl_PL": "Nie może zawierać znaków CJK", "pt_BR": "Apenas devem ser caracteres não CJK.", "ru_RU": "Не должно быть CJK-символов", + "sv_SE": "Får endast vara icke-CJK-tecken", "th_TH": "ต้องเป็นตัวอักษรที่ไม่ใช่ประเภท CJK เท่านั้น", "tr_TR": "Sadece CJK-characters olmayan karakterler olabilir", "uk_UA": "Повинно бути лише не CJK-символи", @@ -17246,6 +17964,7 @@ "pl_PL": "Musi zawierać tylko tekst ASCII", "pt_BR": "Deve ser apenas texto ASCII", "ru_RU": "Текст должен быть только в ASCII кодировке", + "sv_SE": "Får endast vara ASCII-text", "th_TH": "ต้องเป็นตัวอักษร ASCII เท่านั้น", "tr_TR": "Sadece ASCII karakterler olabilir", "uk_UA": "Повинно бути лише ASCII текст", @@ -17270,6 +17989,7 @@ "pl_PL": "Obsługiwane Kontrolery:", "pt_BR": "", "ru_RU": "Поддерживаемые геймпады:", + "sv_SE": "Handkontroller som stöds:", "th_TH": "คอนโทรลเลอร์ที่รองรับ:", "tr_TR": "Desteklenen Kumandalar:", "uk_UA": "Підтримувані контролери:", @@ -17294,6 +18014,7 @@ "pl_PL": "Gracze:", "pt_BR": "Jogadores:", "ru_RU": "Игроки:", + "sv_SE": "Spelare:", "th_TH": "ผู้เล่น:", "tr_TR": "Oyuncular:", "uk_UA": "Гравці:", @@ -17318,6 +18039,7 @@ "pl_PL": "Twoja aktualna konfiguracja jest nieprawidłowa. Otwórz ustawienia i skonfiguruj swoje wejścia.", "pt_BR": "", "ru_RU": "Текущая конфигурация некорректна. Откройте параметры и перенастройте управление.", + "sv_SE": "Din aktuella konfiguration är ogiltig. Öppna inställningarna och konfigurera om din inmatning.", "th_TH": "การกำหนดค่าปัจจุบันของคุณไม่ถูกต้อง กรุณาเปิดการตั้งค่าและกำหนดค่าอินพุตของคุณใหม่", "tr_TR": "Halihazırdaki konfigürasyonunuz geçersiz. Ayarları açın ve girişlerinizi yeniden konfigüre edin.", "uk_UA": "Поточна конфігурація невірна. Відкрийте налаштування та переналаштуйте Ваші дані.", @@ -17342,6 +18064,7 @@ "pl_PL": "Ustawiony tryb zadokowany. Sterowanie przenośne powinno być wyłączone.", "pt_BR": "", "ru_RU": "Используется стационарный режим. Управление в портативном режиме должно быть отключено.", + "sv_SE": "Dockat läge angivet. Handhållna kontroller bör inaktiveras.", "th_TH": "ตั้งค่าด็อกโหมด ควรปิดใช้งานการควบคุมแบบแฮนด์เฮลด์", "tr_TR": "Docked mod ayarlandı. Portatif denetim devre dışı bırakılmalı.", "uk_UA": "Встановлений режим в док-станції. Вимкніть портативні контролери.", @@ -17366,6 +18089,7 @@ "pl_PL": "Zmienianie Nazw Starych Plików...", "pt_BR": "Renomeando arquivos antigos...", "ru_RU": "Переименование старых файлов...", + "sv_SE": "Byter namn på gamla filer...", "th_TH": "กำลังเปลี่ยนชื่อไฟล์เก่า...", "tr_TR": "Eski dosyalar yeniden adlandırılıyor...", "uk_UA": "Перейменування старих файлів...", @@ -17390,6 +18114,7 @@ "pl_PL": "Aktualizator nie mógł zmienić nazwy pliku: {0}", "pt_BR": "O atualizador não conseguiu renomear o arquivo: {0}", "ru_RU": "Программе обновления не удалось переименовать файл: {0}", + "sv_SE": "Uppdateraren kunde inte byta namn på filen: {0}", "th_TH": "โปรแกรมอัปเดตไม่สามารถเปลี่ยนชื่อไฟล์ได้: {0}", "tr_TR": "Güncelleyici belirtilen dosyayı yeniden adlandıramadı: {0}", "uk_UA": "Програмі оновлення не вдалося перейменувати файл: {0}", @@ -17414,6 +18139,7 @@ "pl_PL": "Dodawanie Nowych Plików...", "pt_BR": "Adicionando novos arquivos...", "ru_RU": "Добавление новых файлов...", + "sv_SE": "Lägger till nya filer...", "th_TH": "กำลังเพิ่มไฟล์ใหม่...", "tr_TR": "Yeni Dosyalar Ekleniyor...", "uk_UA": "Додавання нових файлів...", @@ -17438,6 +18164,7 @@ "pl_PL": "Wypakowywanie Aktualizacji...", "pt_BR": "Extraíndo atualização...", "ru_RU": "Извлечение обновления...", + "sv_SE": "Extraherar uppdatering...", "th_TH": "กำลังแยกการอัปเดต...", "tr_TR": "Güncelleme Ayrıştırılıyor...", "uk_UA": "Видобування оновлення...", @@ -17462,6 +18189,7 @@ "pl_PL": "Pobieranie Aktualizacji...", "pt_BR": "Baixando atualização...", "ru_RU": "Загрузка обновления...", + "sv_SE": "Hämtar uppdatering...", "th_TH": "กำลังดาวน์โหลดอัปเดต...", "tr_TR": "Güncelleme İndiriliyor...", "uk_UA": "Завантаження оновлення...", @@ -17486,6 +18214,7 @@ "pl_PL": "Zadokowany", "pt_BR": "TV", "ru_RU": "Стационарный режим", + "sv_SE": "Dockad", "th_TH": "ด็อก", "tr_TR": "", "uk_UA": "Док-станція", @@ -17510,6 +18239,7 @@ "pl_PL": "Przenośny", "pt_BR": "Portátil", "ru_RU": "Портативный режим", + "sv_SE": "Handhållen", "th_TH": "แฮนด์เฮลด์", "tr_TR": "El tipi", "uk_UA": "Портативний", @@ -17534,6 +18264,7 @@ "pl_PL": "Błąd Połączenia.", "pt_BR": "Erro de conexão.", "ru_RU": "Ошибка соединения", + "sv_SE": "Anslutningsfel.", "th_TH": "การเชื่อมต่อล้มเหลว", "tr_TR": "Bağlantı Hatası.", "uk_UA": "Помилка з'єднання.", @@ -17558,6 +18289,7 @@ "pl_PL": "{0} i więcej...", "pt_BR": "{0} e mais...", "ru_RU": "{0} и другие...", + "sv_SE": "{0} och fler...", "th_TH": "{0} และอื่นๆ ...", "tr_TR": "{0} ve daha fazla...", "uk_UA": "{0} та інші...", @@ -17582,6 +18314,7 @@ "pl_PL": "Błąd API.", "pt_BR": "Erro de API.", "ru_RU": "Ошибка API.", + "sv_SE": "API-fel.", "th_TH": "ข้อผิดพลาดของ API", "tr_TR": "API Hatası.", "uk_UA": "Помилка API.", @@ -17606,6 +18339,7 @@ "pl_PL": "Wczytywanie {0}", "pt_BR": "Carregando {0}", "ru_RU": "Загрузка {0}", + "sv_SE": "Läser in {0}", "th_TH": "กำลังโหลด {0}", "tr_TR": "{0} Yükleniyor", "uk_UA": "Завантаження {0}", @@ -17630,6 +18364,7 @@ "pl_PL": "Kompilowanie PTC", "pt_BR": "Compilando PTC", "ru_RU": "Компиляция PTC", + "sv_SE": "Kompilerar PTC", "th_TH": "กำลังคอมไพล์ PTC", "tr_TR": "PTC Derleniyor", "uk_UA": "Компіляція PTC", @@ -17654,6 +18389,7 @@ "pl_PL": "Kompilowanie Shaderów", "pt_BR": "Compilando Shaders", "ru_RU": "Компиляция шейдеров", + "sv_SE": "Kompilerar shaders", "th_TH": "กำลังคอมไพล์ พื้นผิวและแสงเงา", "tr_TR": "Shaderlar Derleniyor", "uk_UA": "Компіляція шейдерів", @@ -17678,6 +18414,7 @@ "pl_PL": "Wszystkie klawiatury", "pt_BR": "Todos os teclados", "ru_RU": "Все клавиатуры", + "sv_SE": "Alla tangentbord", "th_TH": "คีย์บอร์ดทั้งหมด", "tr_TR": "Tüm Klavyeler", "uk_UA": "Всі клавіатури", @@ -17702,6 +18439,7 @@ "pl_PL": "Wybierz obsługiwany plik do otwarcia", "pt_BR": "Selecione um arquivo suportado para abrir", "ru_RU": "Выберите совместимый файл для открытия", + "sv_SE": "Välj en fil som stöds att öppna", "th_TH": "เลือกไฟล์ที่สนับสนุนเพื่อเปิด", "tr_TR": "Açmak için desteklenen bir dosya seçin", "uk_UA": "Виберіть підтримуваний файл для відкриття", @@ -17726,6 +18464,7 @@ "pl_PL": "Wybierz folder z rozpakowaną grą", "pt_BR": "Selecione um diretório com um jogo extraído", "ru_RU": "Выберите папку с распакованной игрой", + "sv_SE": "Välj en mapp med ett uppackat spel", "th_TH": "เลือกโฟลเดอร์ที่มีเกมที่แตกไฟล์แล้ว", "tr_TR": "Ayrıştırılmamış oyun içeren bir klasör seçin", "uk_UA": "Виберіть теку з розпакованою грою", @@ -17750,6 +18489,7 @@ "pl_PL": "Wszystkie Obsługiwane Formaty", "pt_BR": "Todos os formatos suportados", "ru_RU": "Все поддерживаемые форматы", + "sv_SE": "Alla format som stöds", "th_TH": "รูปแบบที่รองรับทั้งหมด", "tr_TR": "Tüm Desteklenen Formatlar", "uk_UA": "Усі підтримувані формати", @@ -17774,6 +18514,7 @@ "pl_PL": "Aktualizator Ryujinx", "pt_BR": "Atualizador do Ryujinx", "ru_RU": "Ryujinx - Обновление", + "sv_SE": "Uppdaterare för Ryujinx", "th_TH": "ตัวอัปเดต Ryujinx", "tr_TR": "Ryujinx Güncelleyicisi", "uk_UA": "Програма оновлення Ryujinx", @@ -17798,6 +18539,7 @@ "pl_PL": "Skróty Klawiszowe Klawiatury", "pt_BR": "Atalhos do teclado", "ru_RU": "Горячие клавиши", + "sv_SE": "Snabbtangenter för tangentbord", "th_TH": "ปุ่มลัดของคีย์บอร์ด", "tr_TR": "Klavye Kısayolları", "uk_UA": "Гарячі клавіші клавіатури", @@ -17822,6 +18564,7 @@ "pl_PL": "Skróty Klawiszowe Klawiatury", "pt_BR": "Atalhos do teclado", "ru_RU": "Горячие клавиши", + "sv_SE": "Snabbtangenter för tangentbord", "th_TH": "ปุ่มลัดของคีย์บอร์ด", "tr_TR": "Klavye Kısayolları", "uk_UA": "Гарячі клавіші клавіатури", @@ -17846,6 +18589,7 @@ "pl_PL": "Zrzut Ekranu:", "pt_BR": "Captura de tela:", "ru_RU": "Сделать скриншот:", + "sv_SE": "Skärmbild:", "th_TH": "ภาพหน้าจอ:", "tr_TR": "Ekran Görüntüsü Al:", "uk_UA": "Знімок екрана:", @@ -17870,6 +18614,7 @@ "pl_PL": "Pokaż UI:", "pt_BR": "Exibir UI:", "ru_RU": "Показать интерфейс:", + "sv_SE": "Visa gränssnitt:", "th_TH": "แสดง UI:", "tr_TR": "Arayüzü Göster:", "uk_UA": "Показати інтерфейс:", @@ -17894,6 +18639,7 @@ "pl_PL": "Pauza:", "pt_BR": "Pausar:", "ru_RU": "Пауза эмуляции:", + "sv_SE": "Paus:", "th_TH": "หยุดชั่วคราว:", "tr_TR": "Durdur:", "uk_UA": "Пауза:", @@ -17918,6 +18664,7 @@ "pl_PL": "Wycisz:", "pt_BR": "Mudo:", "ru_RU": "Выключить звук:", + "sv_SE": "Tyst:", "th_TH": "ปิดเสียง:", "tr_TR": "Sustur:", "uk_UA": "Вимкнути звук:", @@ -17942,6 +18689,7 @@ "pl_PL": "Ustawienia Sterowania Ruchowego", "pt_BR": "Configurações do controle de movimento", "ru_RU": "Настройки управления движением", + "sv_SE": "Inställningar för rörelsekontroller", "th_TH": "ตั้งค่าควบคุมการเคลื่อนไหว", "tr_TR": "Hareket Kontrol Seçenekleri", "uk_UA": "Налаштування керування рухом", @@ -17966,6 +18714,7 @@ "pl_PL": "Ustawienia Wibracji", "pt_BR": "Configurações de vibração", "ru_RU": "Настройки вибрации", + "sv_SE": "Inställningar för vibration", "th_TH": "ตั้งค่าการสั่นไหว", "tr_TR": "Titreşim Seçenekleri", "uk_UA": "Налаштування вібрації", @@ -17990,6 +18739,7 @@ "pl_PL": "Wybierz Plik Motywu", "pt_BR": "Selecionar arquivo do tema", "ru_RU": "Выбрать файл темы", + "sv_SE": "Välj temafil", "th_TH": "เลือกธีมไฟล์", "tr_TR": "Tema Dosyası Seç", "uk_UA": "Виберіть файл теми", @@ -18014,6 +18764,7 @@ "pl_PL": "Plik Motywu Xaml", "pt_BR": "Arquivo de tema Xaml", "ru_RU": "Файл темы Xaml", + "sv_SE": "Xaml-temafil", "th_TH": "ไฟล์ธีมรูปแบบ XAML", "tr_TR": "Xaml Tema Dosyası", "uk_UA": "Файл теми Xaml", @@ -18038,6 +18789,7 @@ "pl_PL": "Zarządzaj Kontami — Avatar", "pt_BR": "Gerenciar contas - Avatar", "ru_RU": "Управление аккаунтами - Аватар", + "sv_SE": "Hantera konton - Avatar", "th_TH": "จัดการบัญชี - อวาต้า", "tr_TR": "Hesapları Yönet - Avatar", "uk_UA": "Керування обліковими записами - Аватар", @@ -18062,6 +18814,7 @@ "pl_PL": "", "pt_BR": "", "ru_RU": "", + "sv_SE": "Amiibo", "th_TH": "", "tr_TR": "", "uk_UA": "", @@ -18086,6 +18839,7 @@ "pl_PL": "Nieznane", "pt_BR": "Desconhecido", "ru_RU": "Неизвестно", + "sv_SE": "Okänt", "th_TH": "ไม่รู้จัก", "tr_TR": "Bilinmeyen", "uk_UA": "Невідомо", @@ -18110,6 +18864,7 @@ "pl_PL": "Użycie", "pt_BR": "Uso", "ru_RU": "Применение", + "sv_SE": "Användning", "th_TH": "การใช้งาน", "tr_TR": "Kullanım", "uk_UA": "Використання", @@ -18134,6 +18889,7 @@ "pl_PL": "Zapisywalne", "pt_BR": "Gravável", "ru_RU": "Доступно для записи", + "sv_SE": "Skrivbar", "th_TH": "สามารถเขียนทับได้", "tr_TR": "Yazılabilir", "uk_UA": "Можливість запису", @@ -18158,6 +18914,7 @@ "pl_PL": "Wybierz pliki DLC", "pt_BR": "Selecionar arquivos de DLC", "ru_RU": "Выберите файлы DLC", + "sv_SE": "Välj DLC-filer", "th_TH": "เลือกไฟล์ DLC", "tr_TR": "DLC dosyalarını seç", "uk_UA": "Виберіть файли DLC", @@ -18182,6 +18939,7 @@ "pl_PL": "Wybierz pliki aktualizacji", "pt_BR": "Selecionar arquivos de atualização", "ru_RU": "Выберите файлы обновлений", + "sv_SE": "Välj uppdateringsfiler", "th_TH": "เลือกไฟล์อัพเดต", "tr_TR": "Güncelleme dosyalarını seç", "uk_UA": "Виберіть файли оновлення", @@ -18206,6 +18964,7 @@ "pl_PL": "Wybierz katalog modów", "pt_BR": "", "ru_RU": "Выбрать папку с модами", + "sv_SE": "Välj moddkatalog", "th_TH": "เลือกไดเรกทอรี Mods", "tr_TR": "Mod Dizinini Seç", "uk_UA": "Виберіть теку з модами", @@ -18230,6 +18989,7 @@ "pl_PL": "", "pt_BR": "", "ru_RU": "", + "sv_SE": "Kontrollera och optimera XCI-filer", "th_TH": "", "tr_TR": "", "uk_UA": "Перевірити та Обрізати XCI файл", @@ -18254,6 +19014,7 @@ "pl_PL": "", "pt_BR": "", "ru_RU": "", + "sv_SE": "Denna funktion kommer först att kontrollera ledigt utrymme och sedan optimera XCI-filen för att spara diskutrymme.", "th_TH": "", "tr_TR": "", "uk_UA": "Ця функція спочатку перевірить вільний простір, а потім обрізатиме файл XCI для економії місця на диску.", @@ -18278,6 +19039,7 @@ "pl_PL": "", "pt_BR": "", "ru_RU": "", + "sv_SE": "Aktuell filstorlek: {0:n} MB\nStorlek för speldata: {1:n} MB\nSparat diskutrymme: {2:n} MB", "th_TH": "", "tr_TR": "", "uk_UA": "Поточний розмір файла: {0:n} MB\nРозмір файлів гри: {1:n} MB\nЕкономія місця: {2:n} MB", @@ -18302,6 +19064,7 @@ "pl_PL": "", "pt_BR": "", "ru_RU": "", + "sv_SE": "XCI-filen behöver inte optimeras. Kontrollera loggen för mer information", "th_TH": "", "tr_TR": "", "uk_UA": "XCI файл не потребує обрізання. Перевірте журнали для додаткової інформації", @@ -18326,6 +19089,7 @@ "pl_PL": "", "pt_BR": "", "ru_RU": "", + "sv_SE": "XCI-filen kan inte avoptimeras. Kontrollera loggen för mer information", "th_TH": "", "tr_TR": "", "uk_UA": "XCI файл не може бути обрізаний. Перевірте журнали для додаткової інформації", @@ -18350,6 +19114,7 @@ "pl_PL": "", "pt_BR": "", "ru_RU": "", + "sv_SE": "XCI-filen är skrivskyddad och kunde inte göras skrivbar. Kontrollera loggen för mer information", "th_TH": "", "tr_TR": "", "uk_UA": "XCI файл Тільки для Читання і не може бути прочитаним. Перевірте журнали додаткової інформації", @@ -18374,6 +19139,7 @@ "pl_PL": "", "pt_BR": "", "ru_RU": "", + "sv_SE": "XCI-filen har ändrats i storlek sedan den lästes av. Kontrollera att filen inte skrivs till och försök igen.", "th_TH": "", "tr_TR": "", "uk_UA": "Розмір файлу XCI змінився з моменту сканування. Перевірте, чи не записується файл, та спробуйте знову", @@ -18398,6 +19164,7 @@ "pl_PL": "", "pt_BR": "", "ru_RU": "", + "sv_SE": "XCI-filen har data i det lediga utrymmet. Den är inte säker att optimera", "th_TH": "", "tr_TR": "", "uk_UA": "Файл XCI містить дані в зоні вільного простору, тому обрізка небезпечна", @@ -18422,6 +19189,7 @@ "pl_PL": "", "pt_BR": "", "ru_RU": "", + "sv_SE": "XCI-filen innehåller ogiltig data. Kontrollera loggen för mer information", "th_TH": "", "tr_TR": "", "uk_UA": "XCI Файл містить недійсні дані. Перевірте журнали для додаткової інформації", @@ -18446,6 +19214,7 @@ "pl_PL": "", "pt_BR": "", "ru_RU": "", + "sv_SE": "XCI-filen kunde inte öppnas för skrivning. Kontrollera loggen för mer information", "th_TH": "", "tr_TR": "", "uk_UA": "XCI Файл файл не вдалося відкрити для запису. Перевірте журнали для додаткової інформації", @@ -18470,6 +19239,7 @@ "pl_PL": "", "pt_BR": "", "ru_RU": "", + "sv_SE": "Optimering av XCI-filen misslyckades", "th_TH": "", "tr_TR": "", "uk_UA": "Не вдалося обрізати файл XCI", @@ -18494,6 +19264,7 @@ "pl_PL": "", "pt_BR": "", "ru_RU": "", + "sv_SE": "Åtgärden avbröts", "th_TH": "", "tr_TR": "", "uk_UA": "Операція перервана", @@ -18518,6 +19289,7 @@ "pl_PL": "", "pt_BR": "", "ru_RU": "", + "sv_SE": "Ingen åtgärd genomfördes", "th_TH": "", "tr_TR": "", "uk_UA": "Операція не проводилася", @@ -18542,6 +19314,7 @@ "pl_PL": "Menedżer Profili Użytkowników", "pt_BR": "Gerenciador de perfis de usuário", "ru_RU": "Менеджер учетных записей", + "sv_SE": "Hanterare för användarprofiler", "th_TH": "จัดการโปรไฟล์ผู้ใช้", "tr_TR": "Kullanıcı Profillerini Yönet", "uk_UA": "Менеджер профілів користувачів", @@ -18566,6 +19339,7 @@ "pl_PL": "Menedżer Kodów", "pt_BR": "Gerenciador de Cheats", "ru_RU": "Менеджер читов", + "sv_SE": "Fuskhanterare", "th_TH": "จัดการสูตรโกง", "tr_TR": "Oyun Hilelerini Yönet", "uk_UA": "Менеджер читів", @@ -18590,6 +19364,7 @@ "pl_PL": "Menedżer Zawartości do Pobrania", "pt_BR": "Gerenciador de DLC", "ru_RU": "Управление DLC для {0} ({1})", + "sv_SE": "Hantera hämtningsbart innehåll för {0} ({1})", "th_TH": "จัดการ DLC ที่ดาวน์โหลดได้สำหรับ {0} ({1})", "tr_TR": "Oyun DLC'lerini Yönet", "uk_UA": "Менеджер вмісту для завантаження", @@ -18614,6 +19389,7 @@ "pl_PL": "Zarządzaj modami dla {0} ({1})", "pt_BR": "Gerenciar Mods para {0} ({1})", "ru_RU": "Управление модами для {0} ({1})", + "sv_SE": "Hantera moddar för {0} ({1})", "th_TH": "จัดการม็อดที่ดาวน์โหลดได้สำหรับ {0} ({1})", "tr_TR": "", "uk_UA": "Керувати модами для {0} ({1})", @@ -18638,6 +19414,7 @@ "pl_PL": "Menedżer Aktualizacji Tytułu", "pt_BR": "Gerenciador de atualizações", "ru_RU": "Менеджер обновлений игр", + "sv_SE": "Hanterare för speluppdateringar", "th_TH": "จัดการอัปเดตหัวข้อ", "tr_TR": "Oyun Güncellemelerini Yönet", "uk_UA": "Менеджер оновлення назв", @@ -18662,6 +19439,7 @@ "pl_PL": "", "pt_BR": "", "ru_RU": "", + "sv_SE": "Optimera XCI-filer", "th_TH": "", "tr_TR": "", "uk_UA": "Обрізка XCI Файлів", @@ -18686,6 +19464,7 @@ "pl_PL": "", "pt_BR": "", "ru_RU": "", + "sv_SE": "{0} av {1} spel markerade", "th_TH": "", "tr_TR": "", "uk_UA": "{0} з {1} тайтл(ів) обрано", @@ -18710,6 +19489,7 @@ "pl_PL": "", "pt_BR": "", "ru_RU": "", + "sv_SE": "{0} av {1} spel markerade ({2} visade)", "th_TH": "", "tr_TR": "", "uk_UA": "{0} з {1} тайтл(ів) обрано ({2} відображається)", @@ -18734,6 +19514,7 @@ "pl_PL": "", "pt_BR": "", "ru_RU": "", + "sv_SE": "Optimerar {0} spel...", "th_TH": "", "tr_TR": "", "uk_UA": "Обрізка {0} тайтл(ів)...", @@ -18758,6 +19539,7 @@ "pl_PL": "", "pt_BR": "", "ru_RU": "", + "sv_SE": "Avoptimerar {0} spel...", "th_TH": "", "tr_TR": "", "uk_UA": "Необрізаних {0} тайтл(ів)...", @@ -18782,6 +19564,7 @@ "pl_PL": "", "pt_BR": "", "ru_RU": "", + "sv_SE": "Misslyckades", "th_TH": "", "tr_TR": "", "uk_UA": "Невдача", @@ -18806,6 +19589,7 @@ "pl_PL": "", "pt_BR": "", "ru_RU": "", + "sv_SE": "Möjlig besparning", "th_TH": "", "tr_TR": "", "uk_UA": "Потенційна економія", @@ -18830,6 +19614,7 @@ "pl_PL": "", "pt_BR": "", "ru_RU": "", + "sv_SE": "Faktisk besparning", "th_TH": "", "tr_TR": "", "uk_UA": "Зекономлено", @@ -18854,6 +19639,7 @@ "pl_PL": "", "pt_BR": "", "ru_RU": "", + "sv_SE": "{0:n0} Mb", "th_TH": "", "tr_TR": "", "uk_UA": "{0:n0} Мб", @@ -18878,6 +19664,7 @@ "pl_PL": "", "pt_BR": "", "ru_RU": "", + "sv_SE": "Markera visade", "th_TH": "", "tr_TR": "", "uk_UA": "Вибрати показане", @@ -18902,6 +19689,7 @@ "pl_PL": "", "pt_BR": "", "ru_RU": "", + "sv_SE": "Avmarkera visade", "th_TH": "", "tr_TR": "", "uk_UA": "Скасувати вибір показаного", @@ -18926,6 +19714,7 @@ "pl_PL": "", "pt_BR": "", "ru_RU": "", + "sv_SE": "Titel", "th_TH": "", "tr_TR": "", "uk_UA": "Заголовок", @@ -18950,6 +19739,7 @@ "pl_PL": "", "pt_BR": "", "ru_RU": "", + "sv_SE": "Utrymmesbesparning", "th_TH": "", "tr_TR": "", "uk_UA": "Економія місця", @@ -18974,6 +19764,7 @@ "pl_PL": "", "pt_BR": "", "ru_RU": "", + "sv_SE": "Optimera", "th_TH": "", "tr_TR": "", "uk_UA": "Обрізка", @@ -18998,6 +19789,7 @@ "pl_PL": "", "pt_BR": "", "ru_RU": "", + "sv_SE": "Avoptimera", "th_TH": "", "tr_TR": "", "uk_UA": "Зшивання", @@ -19022,6 +19814,7 @@ "pl_PL": "", "pt_BR": "{0} nova(s) atualização(ões) adicionada(s)", "ru_RU": "", + "sv_SE": "{0} nya uppdatering(ar) lades till", "th_TH": "{0} อัพเดตที่เพิ่มมาใหม่", "tr_TR": "", "uk_UA": "{0} нове оновлення додано", @@ -19046,6 +19839,7 @@ "pl_PL": "", "pt_BR": "Atualizações incorporadas não podem ser removidas, apenas desativadas.", "ru_RU": "", + "sv_SE": "Bundlade uppdateringar kan inte tas bort, endast inaktiveras.", "th_TH": "แพ็คที่อัพเดตมาไม่สามารถลบทิ้งได้ สามารถปิดใช้งานได้เท่านั้น", "tr_TR": "", "uk_UA": "Вбудовані оновлення не можуть бути видалені, лише вимкнені.", @@ -19070,6 +19864,7 @@ "pl_PL": "Kody Dostępne dla {0} [{1}]", "pt_BR": "Cheats disponíveis para {0} [{1}]", "ru_RU": "Доступные читы для {0} [{1}]", + "sv_SE": "Fusk tillgängliga för {0} [{1}]", "th_TH": "สูตรโกงมีให้สำหรับ {0} [{1}]", "tr_TR": "{0} için Hile mevcut [{1}]", "uk_UA": "Коди доступні для {0} [{1}]", @@ -19094,6 +19889,7 @@ "pl_PL": "Identyfikator wersji:", "pt_BR": "ID da Build:", "ru_RU": "ID версии:", + "sv_SE": "Bygg-id:", "th_TH": "รหัสการสร้าง:", "tr_TR": "", "uk_UA": "ID збірки:", @@ -19118,6 +19914,7 @@ "pl_PL": "", "pt_BR": "DLCs incorporadas não podem ser removidas, apenas desativadas.", "ru_RU": "", + "sv_SE": "Bundlade DLC kan inte tas bort, endast inaktiveras.", "th_TH": "แพ็ค DLC ไม่สามารถลบทิ้งได้ สามารถปิดใช้งานได้เท่านั้น", "tr_TR": "", "uk_UA": "Вбудований DLC не може бути видаленим, лише вимкненим.", @@ -19142,6 +19939,7 @@ "pl_PL": "", "pt_BR": "", "ru_RU": "", + "sv_SE": "{0} DLC(er) tillgängliga", "th_TH": "", "tr_TR": "", "uk_UA": "{0} DLC доступно", @@ -19166,6 +19964,7 @@ "pl_PL": "", "pt_BR": "{0} novo(s) conteúdo(s) para download adicionado(s)", "ru_RU": "", + "sv_SE": "{0} nya hämtningsbara innehåll lades till", "th_TH": "{0} DLC ใหม่ที่เพิ่มเข้ามา", "tr_TR": "", "uk_UA": "{0} нового завантажувального вмісту додано", @@ -19190,6 +19989,7 @@ "pl_PL": "", "pt_BR": "{0} novo(s) conteúdo(s) para download adicionado(s)", "ru_RU": "", + "sv_SE": "{0} nya hämtningsbara innehåll lades till", "th_TH": "{0} ใหม่ที่เพิ่มเข้ามา", "tr_TR": "", "uk_UA": "{0} нового завантажувального вмісту додано", @@ -19214,6 +20014,7 @@ "pl_PL": "", "pt_BR": "{0} conteúdo(s) para download ausente(s) removido(s)", "ru_RU": "", + "sv_SE": "{0} saknade hämtningsbara innehåll togs bort", "th_TH": "", "tr_TR": "", "uk_UA": "{0} відсутнього завантажувального вмісту видалено", @@ -19238,6 +20039,7 @@ "pl_PL": "", "pt_BR": "{0} nova(s) atualização(ões) adicionada(s)", "ru_RU": "", + "sv_SE": "{0} nya uppdatering(ar) lades till", "th_TH": "{0} อัพเดตใหม่ที่เพิ่มเข้ามา", "tr_TR": "", "uk_UA": "{0} нових оновлень додано", @@ -19262,6 +20064,7 @@ "pl_PL": "", "pt_BR": "{0} atualização(ões) ausente(s) removida(s)", "ru_RU": "", + "sv_SE": "{0} saknade uppdatering(ar) togs bort", "th_TH": "", "tr_TR": "", "uk_UA": "{0} відсутніх оновлень видалено", @@ -19286,6 +20089,7 @@ "pl_PL": "{0} Mod(y/ów)", "pt_BR": "", "ru_RU": "Моды для {0} ", + "sv_SE": "{0} modd(ar)", "th_TH": "{0} ม็อด", "tr_TR": "{0} Mod(lar)", "uk_UA": "{0} мод(ів)", @@ -19310,6 +20114,7 @@ "pl_PL": "Edytuj Zaznaczone", "pt_BR": "Editar selecionado", "ru_RU": "Изменить выбранные", + "sv_SE": "Redigera markerade", "th_TH": "แก้ไขที่เลือกแล้ว", "tr_TR": "Seçiliyi Düzenle", "uk_UA": "Редагувати вибране", @@ -19334,6 +20139,7 @@ "pl_PL": "", "pt_BR": "", "ru_RU": "", + "sv_SE": "Fortsätt", "th_TH": "", "tr_TR": "", "uk_UA": "Продовжити", @@ -19358,6 +20164,7 @@ "pl_PL": "Anuluj", "pt_BR": "Cancelar", "ru_RU": "Отмена", + "sv_SE": "Avbryt", "th_TH": "ยกเลิก", "tr_TR": "İptal", "uk_UA": "Скасувати", @@ -19382,6 +20189,7 @@ "pl_PL": "Zapisz", "pt_BR": "Salvar", "ru_RU": "Сохранить", + "sv_SE": "Spara", "th_TH": "บันทึก", "tr_TR": "Kaydet", "uk_UA": "Зберегти", @@ -19406,6 +20214,7 @@ "pl_PL": "Odrzuć", "pt_BR": "Descartar", "ru_RU": "Отменить", + "sv_SE": "Förkasta", "th_TH": "ละทิ้ง", "tr_TR": "Iskarta", "uk_UA": "Скасувати", @@ -19430,6 +20239,7 @@ "pl_PL": "Wstrzymano", "pt_BR": "", "ru_RU": "Приостановлено", + "sv_SE": "Pausad", "th_TH": "หยุดชั่วคราว", "tr_TR": "Durduruldu", "uk_UA": "Призупинено", @@ -19454,6 +20264,7 @@ "pl_PL": "Ustaw Obraz Profilu", "pt_BR": "Definir imagem de perfil", "ru_RU": "Установить аватар", + "sv_SE": "Välj profilbild", "th_TH": "ตั้งค่ารูปโปรไฟล์", "tr_TR": "Profil Resmi Ayarla", "uk_UA": "Встановити зображення профілю", @@ -19478,6 +20289,7 @@ "pl_PL": "Nazwa jest wymagana", "pt_BR": "É necessário um nome", "ru_RU": "Необходимо ввести никнейм", + "sv_SE": "Namn krävs", "th_TH": "จำเป็นต้องระบุชื่อ", "tr_TR": "İsim gerekli", "uk_UA": "Імʼя обовʼязкове", @@ -19502,6 +20314,7 @@ "pl_PL": "Należy ustawić obraz profilowy", "pt_BR": "A imagem de perfil deve ser definida", "ru_RU": "Необходимо установить аватар", + "sv_SE": "Profilbild måste anges", "th_TH": "จำเป็นต้องตั้งค่ารูปโปรไฟล์", "tr_TR": "Profil resmi ayarlanmalıdır", "uk_UA": "Зображення профілю обовʼязкове", @@ -19526,6 +20339,7 @@ "pl_PL": "{0} Aktualizacje dostępne dla {1} ({2})", "pt_BR": "{0} atualizações disponíveis para {1} ({2})", "ru_RU": "Доступные обновления для {0} ({1})", + "sv_SE": "Hantera uppdateringar för {0} ({1})", "th_TH": "จัดการอัพเดตสำหรับ {0} ({1})", "tr_TR": "{0} için güncellemeler mevcut [{1}]", "uk_UA": "{0} Доступні оновлення для {1} ({2})", @@ -19550,6 +20364,7 @@ "pl_PL": "Zwiększ Rozdzielczość:", "pt_BR": "Aumentar a resolução:", "ru_RU": "Увеличить разрешение:", + "sv_SE": "Öka upplösning:", "th_TH": "เพิ่มความละเอียด:", "tr_TR": "Çözünürlüğü artır:", "uk_UA": "Збільшити роздільність:", @@ -19574,6 +20389,7 @@ "pl_PL": "Zmniejsz Rozdzielczość:", "pt_BR": "Diminuir a resolução:", "ru_RU": "Уменьшить разрешение:", + "sv_SE": "Sänk upplösning:", "th_TH": "ลดความละเอียด:", "tr_TR": "Çözünürlüğü azalt:", "uk_UA": "Зменшити роздільність:", @@ -19598,6 +20414,7 @@ "pl_PL": "Nazwa:", "pt_BR": "Nome:", "ru_RU": "Никнейм:", + "sv_SE": "Namn:", "th_TH": "ชื่อ:", "tr_TR": "İsim:", "uk_UA": "Імʼя", @@ -19622,6 +20439,7 @@ "pl_PL": "ID Użytkownika:", "pt_BR": "ID de usuário:", "ru_RU": "ID пользователя:", + "sv_SE": "Användar-id:", "th_TH": "รหัสผู้ใช้:", "tr_TR": "Kullanıcı Adı:", "uk_UA": "ID користувача:", @@ -19646,6 +20464,7 @@ "pl_PL": "Backend Graficzny", "pt_BR": "Backend gráfico", "ru_RU": "Графический бэкенд", + "sv_SE": "Grafikbakände", "th_TH": "กราฟิกเบื้องหลัง", "tr_TR": "Grafik Arka Ucu", "uk_UA": "Графічний сервер", @@ -19670,6 +20489,7 @@ "pl_PL": "", "pt_BR": "", "ru_RU": "Выберает бэкенд, который будет использован в эмуляторе.\n\nVulkan является лучшим выбором для всех современных графических карт с актуальными драйверами. В Vulkan также включена более быстрая компиляция шейдеров (меньше статтеров) для всех видеоадаптеров.\n\nПри использовании OpenGL можно достичь лучших результатов на старых видеоадаптерах Nvidia и AMD в Linux или на видеоадаптерах с небольшим количеством видеопамяти, хотя статтеров при компиляции шейдеров будет больше.\n\nРекомендуется использовать Vulkan. Используйте OpenGL, если ваш видеоадаптер не поддерживает Vulkan даже с актуальными драйверами.", + "sv_SE": "Väljer den grafikbakände som ska användas i emulatorn.\n\nVulkan är oftast bättre för alla moderna grafikkort, så länge som deras drivrutiner är uppdaterade. Vulkan har också funktioner för snabbare shader compilation (mindre stuttering) för alla GPU-tillverkare.\n\nOpenGL kan nå bättre resultat på gamla Nvidia GPU:er, på äldre AMD GPU:er på Linux, eller på GPU:er med lägre VRAM, även om shader compilation stuttering kommer att vara större.\n\nStäll in till Vulkan om du är osäker. Ställ in till OpenGL om du GPU inte har stöd för Vulkan även med de senaste grafikdrivrutinerna.", "th_TH": "เลือกกราฟิกเบื้องหลังที่จะใช้ในโปรแกรมจำลอง\n\nโดยรวมแล้ว Vulkan นั้นดีกว่าสำหรับการ์ดจอรุ่นใหม่ทั้งหมด ตราบใดที่ไดรเวอร์ยังอัพเดทอยู่เสมอ Vulkan ยังมีคุณสมบัติการคอมไพล์เชเดอร์ที่เร็วขึ้น(และลดอาการกระตุก) สำหรับ GPU อื่นๆทุกอัน\n\nOpenGL อาจได้รับผลลัพธ์ที่ดีกว่าบน Nvidia GPU รุ่นเก่า, AMD GPU รุ่นเก่าบน Linux หรือบน GPU ที่มี VRAM น้อย แม้ว่าการคอมไพล์เชเดอร์ จะทำให้อาการกระตุกมากขึ้นก็ตาม\n\nตั้งค่าเป็น Vulkan หากไม่แน่ใจ ตั้งค่าเป็น OpenGL หาก GPU ของคุณไม่รองรับ Vulkan แม้จะมีไดรเวอร์กราฟิกล่าสุดก็ตาม", "tr_TR": "", "uk_UA": "Виберіть backend графіки, що буде використовуватись в емуляторі.\n\n\"Vulkan\" краще для всіх сучасних відеокарт, якщо драйвери вчасно оновлюються. У Vulkan також швидше компілюються шейдери (менше \"заїкання\" зображення) на відеокартах всіх компаній.\n\n\"OpenGL\" може дати кращі результати на старих відеокартах Nvidia, старих відеокартах AMD на Linux, або на відеокартах з маленькою кількістю VRAM, але \"заїкання\" через компіляцію шейдерів будуть частіші.\n\nЯкщо не впевнені, встановіть на \"Vulkan\". Встановіть на \"OpenGL\", якщо Ваша відеокарта не підтримує Vulkan навіть на останніх драйверах.", @@ -19694,6 +20514,7 @@ "pl_PL": "", "pt_BR": "", "ru_RU": "", + "sv_SE": "Automatiskt", "th_TH": "", "tr_TR": "", "uk_UA": "", @@ -19718,6 +20539,7 @@ "pl_PL": "", "pt_BR": "", "ru_RU": "", + "sv_SE": "Använder Vulkan.\nPå en ARM Mac och vid spel som körs bra på den så används Metal-bakänden.", "th_TH": "", "tr_TR": "", "uk_UA": "", @@ -19742,6 +20564,7 @@ "pl_PL": "Włącz Rekompresję Tekstur", "pt_BR": "Habilitar recompressão de texturas", "ru_RU": "Пережимать текстуры", + "sv_SE": "Aktivera Texture Recompression", "th_TH": "เปิดใช้งาน การบีบอัดพื้นผิวอีกครั้ง", "tr_TR": "Yeniden Doku Sıkıştırılmasını Aktif Et", "uk_UA": "Увімкнути рекомпресію текстури", @@ -19766,6 +20589,7 @@ "pl_PL": "", "pt_BR": "", "ru_RU": "Сжатие ASTC текстур для уменьшения использования VRAM. \n\nИгры, использующие этот формат текстур: Astral Chain, Bayonetta 3, Fire Emblem Engage, Metroid Prime Remastered, Super Mario Bros. Wonder и The Legend of Zelda: Tears of the Kingdom. \nНа видеоадаптерах с 4GiB видеопамяти или менее возможны вылеты при запуске этих игр. \n\nВключите, только если у вас заканчивается видеопамять в вышеупомянутых играх. \n\nРекомендуется оставить выключенным.", + "sv_SE": "Komprimerar ASTC-texturer för att minska VRAM-användning.\n\nSpel som använder detta texturformat inkluderar Astral Chain, Bayonetta 3, Fire Emblem Engage, Metroid Prime Remastered, Super Mario Bros. Wonder och The Legend of Zelda: Tears of the Kingdom.\n\nGrafikkort med 4GiB VRAM eller mindre kommer sannolikt krascha någon gång när du kör dessa spel.\n\nAktivera endast om du har slut på VRAM på ovan nämnda spel. Lämna AV om du är osäker.", "th_TH": "บีบอัดพื้นผิว ASTC เพื่อลดการใช้งาน VRAM\n\nเกมที่ใช้รูปแบบพื้นผิวนี้ ได้แก่ Astral Chain, Bayonetta 3, Fire Emblem Engage, Metroid Prime Remastered, Super Mario Bros. Wonder และ The Legend of Zelda: Tears of the Kingdom\n\nการ์ดจอที่มี 4GiB VRAM หรือน้อยกว่ามีแนวโน้มที่จะพังในบางจุดขณะเล่นเกมเหล่านี้\n\nเปิดใช้งานเฉพาะในกรณีที่ VRAM ของคุณใกล้หมดในเกมที่กล่าวมาข้างต้น ปล่อยให้ปิดหากไม่แน่ใจ", "tr_TR": "", "uk_UA": "Стискає текстури ASTC, щоб зменшити використання VRAM.\n\nЦим форматом текстур користуються такі ігри, як Astral Chain, Bayonetta 3, Fire Emblem Engage, Metroid Prime Remastered, Super Mario Bros. Wonder і The Legend of Zelda: Tears of the Kingdom.\n\nЦі ігри, скоріше всього крашнуться на відеокартах з розміром VRAM в 4 Гб і менше.\n\nВмикайте тільки якщо у Вас закінчується VRAM на цих іграх. Залиште на \"Вимкнути\", якщо не впевнені.", @@ -19790,6 +20614,7 @@ "pl_PL": "Preferowane GPU", "pt_BR": "GPU preferencial", "ru_RU": "Предпочтительный видеоадаптер", + "sv_SE": "Föredragen GPU", "th_TH": "GPU ที่ต้องการ", "tr_TR": "Kullanılan GPU", "uk_UA": "Бажаний GPU", @@ -19814,6 +20639,7 @@ "pl_PL": "Wybierz kartę graficzną, która będzie używana z backendem graficznym Vulkan.\n\nNie wpływa na GPU używane przez OpenGL.\n\nW razie wątpliwości ustaw flagę GPU jako \"dGPU\". Jeśli żadnej nie ma, pozostaw nietknięte.", "pt_BR": "Selecione a placa de vídeo que será usada com o backend gráfico Vulkan.\n\nNão afeta a GPU que OpenGL usará.\n\nSelecione \"dGPU\" em caso de dúvida. Se não houver nenhuma, não mexa.", "ru_RU": "Выберает видеоадаптер, который будет использоваться графическим бэкендом Vulkan.\n\nЭта настройка не влияет на видеоадаптер, который будет использоваться с OpenGL.\n\nЕсли вы не уверены что нужно выбрать, используйте графический процессор, помеченный как \"dGPU\". Если его нет, оставьте выбор по умолчанию.", + "sv_SE": "Välj grafikkortet som ska användas med Vulkan-grafikbakänden.\n\nPåverkar inte GPU:n som OpenGL använder.\n\nStäll in till den GPU som flaggats som \"dGPU\" om osäker. Om det inte finns någon, lämna orörd.", "th_TH": "เลือกการ์ดจอที่จะใช้กับแบ็กเอนด์กราฟิก Vulkan\n\nไม่ส่งผลต่อ GPU ที่ OpenGL จะใช้\n\nตั้งค่าเป็น GPU ที่ถูกตั้งค่าสถานะเป็น \"dGPU\" ถ้าหากคุณไม่แน่ใจ ,หากไม่มีก็ปล่อยทิ้งไว้โดยไม่ต้องแตะต้องมัน", "tr_TR": "Vulkan Grafik Arka Ucu ile kullanılacak Ekran Kartını Seçin.\n\nOpenGL'nin kullanacağı GPU'yu etkilemez.\n\n Emin değilseniz \"dGPU\" olarak işaretlenmiş GPU'ya ayarlayın. Eğer yoksa, dokunmadan bırakın.\n", "uk_UA": "Виберіть відеокарту, яка використовуватиметься з графічним сервером Vulkan.\n\nНе впливає на графічний процесор, який використовуватиме OpenGL.\n\nВстановіть графічний процесор, позначений як «dGPU», якщо не впевнені. Якщо такого немає, не чіпайте.", @@ -19838,6 +20664,7 @@ "pl_PL": "Wymagane Zrestartowanie Ryujinx", "pt_BR": "Reinicialização do Ryujinx necessária", "ru_RU": "Требуется перезапуск Ryujinx", + "sv_SE": "Omstart av Ryujinx krävs", "th_TH": "จำเป็นต้องรีสตาร์ท Ryujinx", "tr_TR": "Ryujinx'i Yeniden Başlatma Gerekli", "uk_UA": "Необхідно перезапустити Ryujinx", @@ -19862,6 +20689,7 @@ "pl_PL": "Zmieniono ustawienia Backendu Graficznego lub GPU. Będzie to wymagało ponownego uruchomienia", "pt_BR": "Configurações do backend gráfico ou da GPU foram alteradas. Uma reinicialização é necessária para que as mudanças tenham efeito.", "ru_RU": "Графический бэкенд или настройки графического процессора были изменены. Требуется перезапуск для вступления в силу изменений.", + "sv_SE": "Grafikbakänden eller GPU-inställningar har ändrats. Detta kräver en omstart", "th_TH": "การตั้งค่ากราฟิกเบื้องหลังหรือ GPU ได้รับการแก้ไขแล้ว สิ่งนี้จะต้องมีการรีสตาร์ทจึงจะสามารถใช้งานได้", "tr_TR": "Grafik Motoru ya da GPU ayarları değiştirildi. Bu işlemin uygulanması için yeniden başlatma gerekli.", "uk_UA": "Налаштування графічного сервера або GPU було змінено. Для цього знадобиться перезапуск", @@ -19886,6 +20714,7 @@ "pl_PL": "Czy chcesz zrestartować teraz?", "pt_BR": "Deseja reiniciar agora?", "ru_RU": "Перезапустить сейчас?", + "sv_SE": "Vill du starta om nu?", "th_TH": "คุณต้องการรีสตาร์ทตอนนี้หรือไม่?", "tr_TR": "Şimdi yeniden başlatmak istiyor musunuz?", "uk_UA": "Бажаєте перезапустити зараз?", @@ -19910,6 +20739,7 @@ "pl_PL": "Czy chcesz zaktualizować Ryujinx do najnowszej wersji?", "pt_BR": "Você quer atualizar o Ryujinx para a última versão?", "ru_RU": "Обновить Ryujinx до последней версии?", + "sv_SE": "Vill du uppdatera Ryujinx till senaste versionen?", "th_TH": "คุณต้องการอัพเดต Ryujinx เป็นเวอร์ชั่นล่าสุดหรือไม่?", "tr_TR": "Ryujinx'i en son sürüme güncellemek ister misiniz?", "uk_UA": "Бажаєте оновити Ryujinx до останньої версії?", @@ -19934,6 +20764,7 @@ "pl_PL": "Zwiększ Głośność:", "pt_BR": "Aumentar volume:", "ru_RU": "Увеличить громкость:", + "sv_SE": "Öka volym:", "th_TH": "เพิ่มระดับเสียง:", "tr_TR": "Sesi Arttır:", "uk_UA": "Збільшити гучність:", @@ -19958,6 +20789,7 @@ "pl_PL": "Zmniejsz Głośność:", "pt_BR": "Diminuir volume:", "ru_RU": "Уменьшить громкость:", + "sv_SE": "Sänk volym:", "th_TH": "ลดระดับเสียง:", "tr_TR": "Sesi Azalt:", "uk_UA": "Зменшити гучність:", @@ -19982,6 +20814,7 @@ "pl_PL": "Włącz Macro HLE", "pt_BR": "Habilitar emulação de alto nível para Macros", "ru_RU": "Использовать макрос высокоуровневой эмуляции видеоадаптера", + "sv_SE": "Aktivera Macro HLE", "th_TH": "เปิดใช้งาน มาโคร HLE", "tr_TR": "Macro HLE'yi Aktifleştir", "uk_UA": "Увімкнути макрос HLE", @@ -20006,6 +20839,7 @@ "pl_PL": "Wysokopoziomowa emulacja kodu GPU Macro.\n\nPoprawia wydajność, ale może powodować błędy graficzne w niektórych grach.\n\nW razie wątpliwości pozostaw WŁĄCZONE.", "pt_BR": "Habilita emulação de alto nível de códigos Macro da GPU.\n\nMelhora a performance, mas pode causar problemas gráficos em alguns jogos.\n\nEm caso de dúvida, deixe ATIVADO.", "ru_RU": "Высокоуровневая эмуляции макрокода видеоадаптера.\n\nПовышает производительность, но может вызывать графические артефакты в некоторых играх.\n\nРекомендуется оставить включенным.", + "sv_SE": "Högnivåemulering av GPU Macro-kod.\n\nFörbättrar prestandan men kan orsaka grafiska glitches i vissa spel.\n\nLämna PÅ om du är osäker.", "th_TH": "การจำลองระดับสูงของโค้ดมาโคร GPU\n\nปรับปรุงประสิทธิภาพ แต่อาจทำให้เกิดข้อผิดพลาดด้านกราฟิกในบางเกม\n\nเปิดทิ้งไว้หากคุณไม่แน่ใจ", "tr_TR": "GPU Macro kodunun yüksek seviye emülasyonu.\n\nPerformansı arttırır, ama bazı oyunlarda grafik hatalarına yol açabilir.\n\nEmin değilseniz AÇIK bırakın.", "uk_UA": "Високорівнева емуляція коду макросу GPU.\n\nПокращує продуктивність, але може викликати графічні збої в деяких іграх.\n\nЗалиште увімкненим, якщо не впевнені.", @@ -20030,6 +20864,7 @@ "pl_PL": "Przekazywanie przestrzeni kolorów", "pt_BR": "Passagem de Espaço Cor", "ru_RU": "Пропускать цветовое пространство", + "sv_SE": "Genomströmning av färgrymd", "th_TH": "ทะลุผ่านพื้นที่สี", "tr_TR": "Renk Alanı Geçişi", "uk_UA": "Наскрізний колірний простір", @@ -20054,6 +20889,7 @@ "pl_PL": "Nakazuje API Vulkan przekazywać informacje o kolorze bez określania przestrzeni kolorów. Dla użytkowników z wyświetlaczami o szerokim zakresie kolorów może to skutkować bardziej żywymi kolorami, kosztem ich poprawności.", "pt_BR": "Direciona o backend Vulkan para passar informações de cores sem especificar um espaço de cores. Para usuários com telas de ampla gama, isso pode resultar em cores mais vibrantes, ao custo da correção de cores.", "ru_RU": "Направляет бэкенд Vulkan на передачу информации о цвете без указания цветового пространства. Для пользователей с экранами с расширенной гаммой данная настройка приводит к получению более ярких цветов за счет снижения корректности цветопередачи.", + "sv_SE": "Dirigerar Vulkan-bakänden att skicka genom färginformation utan att ange en färgrymd. För användare med breda gamut-skärmar kan detta resultera i mer levande färger på bekostnad av färgkorrekthet.", "th_TH": "สั่งให้แบ็กเอนด์ Vulkan ส่งผ่านข้อมูลสีโดยไม่ต้องระบุค่าของสี สำหรับผู้ใช้ที่มีการแสดงกระจายตัวของสี อาจส่งผลให้สีสดใสมากขึ้น โดยต้องแลกกับความถูกต้องของสี", "tr_TR": "Vulkan Backend'ini renk alanı belirtmeden renk bilgisinden geçmeye yönlendirir. Geniş gam ekranlı kullanıcılar için bu, renk doğruluğu pahasına daha canlı renklerle sonuçlanabilir.", "uk_UA": "Дозволяє серверу Vulkan передавати інформацію про колір без вказівки колірного простору. Для користувачів з екранами з широкою гамою це може призвести до більш яскравих кольорів, але шляхом втрати коректності передачі кольору.", @@ -20078,6 +20914,7 @@ "pl_PL": "Głoś", "pt_BR": "", "ru_RU": "Громкость", + "sv_SE": "Vol", "th_TH": "ระดับเสียง", "tr_TR": "Ses", "uk_UA": "Гуч.", @@ -20102,6 +20939,7 @@ "pl_PL": "Zarządzaj Zapisami", "pt_BR": "Gerenciar jogos salvos", "ru_RU": "Управление сохранениями", + "sv_SE": "Hantera sparade spel", "th_TH": "จัดการบันทึก", "tr_TR": "Kayıtları Yönet", "uk_UA": "Керувати збереженнями", @@ -20126,6 +20964,7 @@ "pl_PL": "Czy chcesz usunąć zapis użytkownika dla tej gry?", "pt_BR": "Deseja apagar o jogo salvo do usuário para este jogo?", "ru_RU": "Удалить сохранения для этой игры?", + "sv_SE": "Vill du ta bort användarsparade spel för detta spel?", "th_TH": "คุณต้องการลบบันทึกผู้ใช้สำหรับเกมนี้หรือไม่?", "tr_TR": "Bu oyun için kullanıcı kaydını silmek istiyor musunuz?", "uk_UA": "Ви хочете видалити збереження користувача для цієї гри?", @@ -20150,6 +20989,7 @@ "pl_PL": "Ta czynność nie jest odwracalna.", "pt_BR": "Esta ação não é reversível.", "ru_RU": "Данное действие является необратимым.", + "sv_SE": "Denna åtgärd går inte att ångra.", "th_TH": "การดำเนินการนี้ไม่สามารถย้อนกลับได้", "tr_TR": "Bu eylem geri alınamaz.", "uk_UA": "Цю дію не можна скасувати.", @@ -20174,6 +21014,7 @@ "pl_PL": "Zarządzaj Zapisami dla {0}", "pt_BR": "Gerenciar jogos salvos para {0}", "ru_RU": "Редактирование сохранений для {0} ({1})", + "sv_SE": "Hantera sparade spel för {0} ({1})", "th_TH": "จัดการบันทึกสำหรับ {0} ({1})", "tr_TR": "{0} için Kayıt Dosyalarını Yönet", "uk_UA": "Керувати збереженнями для {0}", @@ -20198,6 +21039,7 @@ "pl_PL": "Menedżer Zapisów", "pt_BR": "Gerenciador de jogos salvos", "ru_RU": "Менеджер сохранений", + "sv_SE": "Sparhanterare", "th_TH": "จัดการบันทึก", "tr_TR": "Kayıt Yöneticisi", "uk_UA": "Менеджер збереження", @@ -20222,6 +21064,7 @@ "pl_PL": "Nazwa", "pt_BR": "Nome", "ru_RU": "Название", + "sv_SE": "Namn", "th_TH": "ชื่อ", "tr_TR": "İsim", "uk_UA": "Назва", @@ -20246,6 +21089,7 @@ "pl_PL": "Rozmiar", "pt_BR": "Tamanho", "ru_RU": "Размер", + "sv_SE": "Storlek", "th_TH": "ขนาด", "tr_TR": "Boyut", "uk_UA": "Розмір", @@ -20270,6 +21114,7 @@ "pl_PL": "Wyszukaj", "pt_BR": "Buscar", "ru_RU": "Поиск", + "sv_SE": "Sök", "th_TH": "ค้นหา", "tr_TR": "Ara", "uk_UA": "Пошук", @@ -20294,6 +21139,7 @@ "pl_PL": "Odzyskaj Utracone Konta", "pt_BR": "Recuperar contas perdidas", "ru_RU": "Восстановить учетные записи", + "sv_SE": "Återskapa förlorade konton", "th_TH": "กู้คืนบัญชีที่สูญหาย", "tr_TR": "Kayıp Hesapları Kurtar", "uk_UA": "Відновлення профілів", @@ -20318,6 +21164,7 @@ "pl_PL": "Odzyskaj", "pt_BR": "Recuperar", "ru_RU": "Восстановление", + "sv_SE": "Återskapa", "th_TH": "กู้คืน", "tr_TR": "Kurtar", "uk_UA": "Відновити", @@ -20342,6 +21189,7 @@ "pl_PL": "Znaleziono zapisy dla następujących kont", "pt_BR": "Jogos salvos foram encontrados para as seguintes contas", "ru_RU": "Были найдены сохранения для следующих аккаунтов", + "sv_SE": "Sparade spel hittades för följande konton", "th_TH": "พบบันทึกสำหรับบัญชีดังต่อไปนี้", "tr_TR": "Aşağıdaki hesaplar için kayıtlar bulundu", "uk_UA": "Знайдено збереження для наступних облікових записів", @@ -20366,6 +21214,7 @@ "pl_PL": "Brak profili do odzyskania", "pt_BR": "Nenhum perfil para recuperar", "ru_RU": "Нет учетных записей для восстановления", + "sv_SE": "Inga profiler att återskapa", "th_TH": "ไม่มีโปรไฟล์ที่สามารถกู้คืนได้", "tr_TR": "Kurtarılacak profil bulunamadı", "uk_UA": "Немає профілів для відновлення", @@ -20390,6 +21239,7 @@ "pl_PL": "", "pt_BR": "Aplica anti-aliasing à renderização do jogo.\n\nFXAA borrará a maior parte da imagem, enquanto SMAA tentará identificar e suavizar bordas serrilhadas.\n\nNão é recomendado usar em conjunto com o filtro de escala FSR.\n\nEssa opção pode ser alterada enquanto o jogo está em execução clicando em \"Aplicar\" abaixo; basta mover a janela de configurações para o lado e experimentar até encontrar o visual preferido para o jogo.\n\nDeixe em NENHUM se estiver em dúvida.", "ru_RU": "Применимое сглаживание для рендера.\n\nFXAA размывает большую часть изображения, SMAA попытается найти \"зазубренные\" края и сгладить их.\n\nНе рекомендуется использовать вместе с масштабирующим фильтром FSR.\n\nЭта опция может быть изменена во время игры по нажатию \"Применить\" ниже; \nВы можете просто переместить окно настроек в сторону и поэкспериментировать, пока не найдёте подходящую настройку игры.\n\nРекомендуется использовать \"Нет\".", + "sv_SE": "Tillämpar anti-aliasing på spelrenderaren.\n\nFXAA kommer att sudda det mesta av bilden, medan SMAA kommer att försöka hitta taggiga kanter och släta ut dem.\n\nRekommenderas inte att använda tillsammans med skalfiltret FSR.\n\nDet här alternativet kan ändras medan ett spel körs genom att klicka på \"Tillämpa\" nedan. Du kan helt enkelt flytta inställningsfönstret åt sidan och experimentera tills du hittar ditt föredragna utseende för ett spel.\n\nLämna som INGEN om du är osäker.", "th_TH": "ใช้การลดรอยหยักกับการเรนเดอร์เกม\n\nFXAA จะเบลอภาพส่วนใหญ่ ในขณะที่ SMAA จะพยายามค้นหารอยหยักและปรับให้เรียบ\n\nไม่แนะนำให้ใช้ร่วมกับตัวกรองสเกล FSR\n\nตัวเลือกนี้สามารถเปลี่ยนแปลงได้ในขณะที่เกมกำลังทำงานอยู่โดยคลิก \"นำไปใช้\" ด้านล่าง คุณสามารถย้ายหน้าต่างการตั้งค่าไปด้านข้างและทดลองจนกว่าคุณจะพบรูปลักษณ์ที่คุณต้องการสำหรับเกม\n\nปล่อยไว้ที่ NONE หากไม่แน่ใจ", "tr_TR": "", "uk_UA": "Застосовує згладження до рендера гри.\n\nFXAA розмиє більшість зображення, а SMAA спробує знайти нерівні краї та згладити їх.\n\nНе рекомендується використовувати разом з фільтром масштабування FSR.\n\nЦю опцію можна міняти коли гра запущена кліком на \"Застосувати; ви можете відсунути вікно налаштувань і поекспериментувати з видом гри.\n\nЗалиште на \"Немає\", якщо не впевнені.", @@ -20414,6 +21264,7 @@ "pl_PL": "Antyaliasing:", "pt_BR": "Anti-serrilhado:", "ru_RU": "Сглаживание:", + "sv_SE": "Antialiasing:", "th_TH": "ลดการฉีกขาดของภาพ:", "tr_TR": "Kenar Yumuşatma:", "uk_UA": "Згладжування:", @@ -20438,6 +21289,7 @@ "pl_PL": "Filtr skalowania:", "pt_BR": "Filtro de escala:", "ru_RU": "Интерполяция:", + "sv_SE": "Skalningsfilter:", "th_TH": "ปรับขนาดตัวกรอง:", "tr_TR": "Ölçekleme Filtresi:", "uk_UA": "Фільтр масштабування:", @@ -20462,6 +21314,7 @@ "pl_PL": "Choose the scaling filter that will be applied when using resolution scale.\n\nBilinear works well for 3D games and is a safe default option.\n\nNearest is recommended for pixel art games.\n\nFSR 1.0 is merely a sharpening filter, not recommended for use with FXAA or SMAA.\n\nThis option can be changed while a game is running by clicking \"Apply\" below; you can simply move the settings window aside and experiment until you find your preferred look for a game.\n\nLeave on BILINEAR if unsure.", "pt_BR": "Escolha o filtro de escala que será aplicado ao usar a escala de resolução.\n\nBilinear funciona bem para jogos 3D e é uma opção padrão segura.\n\nNearest é recomendado para jogos em pixel art.\n\nFSR 1.0 é apenas um filtro de nitidez, não recomendado para uso com FXAA ou SMAA.\n\nEssa opção pode ser alterada enquanto o jogo está em execução, clicando em \"Aplicar\" abaixo; basta mover a janela de configurações para o lado e experimentar até encontrar o visual preferido para o jogo.\n\nMantenha em BILINEAR se estiver em dúvida.", "ru_RU": "Фильтрация текстур, которая будет применяться при масштабировании.\n\nБилинейная хорошо работает для 3D-игр и является настройкой по умолчанию.\n\nСтупенчатая рекомендуется для пиксельных игр.\n\nFSR это фильтр резкости, который не рекомендуется использовать с FXAA или SMAA.\n\nЭта опция может быть изменена во время игры по нажатию кнопки \"Применить\" ниже; \nВы можете просто переместить окно настроек в сторону и поэкспериментировать, пока не подберете подходящие настройки для конкретной игры.\n\nРекомендуется использовать \"Билинейная\".", + "sv_SE": "Välj det skalfilter som ska tillämpas vid användning av upplösningsskala.\n\nBilinjär fungerar bra för 3D-spel och är ett säkert standardalternativ.\n\nNärmast rekommenderas för pixel art-spel.\n\nFSR 1.0 är bara ett skarpningsfilter, rekommenderas inte för FXAA eller SMAA.\n\nOmrådesskalning rekommenderas vid nedskalning av upplösning som är större än utdatafönstret. Det kan användas för att uppnå en supersamplad anti-alias-effekt vid nedskalning med mer än 2x.\n\nDetta alternativ kan ändras medan ett spel körs genom att klicka på \"Tillämpa\" nedan. du kan helt enkelt flytta inställningsfönstret åt sidan och experimentera tills du hittar ditt föredragna utseende för ett spel.\n\nLämna som BILINJÄR om du är osäker.", "th_TH": "เลือกตัวกรองสเกลที่จะใช้เมื่อใช้สเกลความละเอียด\n\nBilinear ทำงานได้ดีกับเกม 3D และเป็นตัวเลือกเริ่มต้นที่ปลอดภัย\n\nแนะนำให้ใช้เกมภาพพิกเซลที่ใกล้เคียงที่สุด\n\nFSR 1.0 เป็นเพียงตัวกรองความคมชัด ไม่แนะนำให้ใช้กับ FXAA หรือ SMAA\n\nตัวเลือกนี้สามารถเปลี่ยนแปลงได้ในขณะที่เกมกำลังทำงานอยู่โดยคลิก \"นำไปใช้\" ด้านล่าง คุณสามารถย้ายหน้าต่างการตั้งค่าไปด้านข้างและทดลองจนกว่าคุณจะพบรูปลักษณ์ที่คุณต้องการสำหรับเกม", "tr_TR": "Choose the scaling filter that will be applied when using resolution scale.\n\nBilinear works well for 3D games and is a safe default option.\n\nNearest is recommended for pixel art games.\n\nFSR 1.0 is merely a sharpening filter, not recommended for use with FXAA or SMAA.\n\nThis option can be changed while a game is running by clicking \"Apply\" below; you can simply move the settings window aside and experiment until you find your preferred look for a game.\n\nLeave on BILINEAR if unsure.", "uk_UA": "Виберіть фільтр масштабування, що використається при збільшенні роздільної здатності.\n\n\"Білінійний\" добре виглядає в 3D іграх, і хороше налаштування за умовчуванням.\n\n\"Найближчий\" рекомендується для ігор з піксель-артом.\n\n\"FSR 1.0\" - це просто фільтр різкості, не рекомендується використовувати разом з FXAA або SMAA.\n\nЦю опцію можна міняти коли гра запущена кліком на \"Застосувати; ви можете відсунути вікно налаштувань і поекспериментувати з видом гри.\n\nЗалиште на \"Білінійний\", якщо не впевнені.", @@ -20486,6 +21339,7 @@ "pl_PL": "Dwuliniowe", "pt_BR": "", "ru_RU": "Билинейная", + "sv_SE": "Bilinjär", "th_TH": "", "tr_TR": "", "uk_UA": "Білінійний", @@ -20510,6 +21364,7 @@ "pl_PL": "Najbliższe", "pt_BR": "", "ru_RU": "Ступенчатая", + "sv_SE": "Närmaste", "th_TH": "ใกล้สุด", "tr_TR": "", "uk_UA": "Найближчий", @@ -20534,6 +21389,7 @@ "pl_PL": "", "pt_BR": "", "ru_RU": "", + "sv_SE": "FSR", "th_TH": "", "tr_TR": "", "uk_UA": "", @@ -20558,6 +21414,7 @@ "pl_PL": "", "pt_BR": "", "ru_RU": "", + "sv_SE": "Yta", "th_TH": "", "tr_TR": "", "uk_UA": "", @@ -20582,6 +21439,7 @@ "pl_PL": "Poziom", "pt_BR": "Nível", "ru_RU": "Уровень", + "sv_SE": "Nivå", "th_TH": "ระดับ", "tr_TR": "Seviye", "uk_UA": "Рівень", @@ -20606,6 +21464,7 @@ "pl_PL": "Ustaw poziom ostrzeżenia FSR 1.0. Wyższy jest ostrzejszy.", "pt_BR": "Defina o nível de nitidez do FSR 1.0. Quanto maior, mais nítido.", "ru_RU": "Выбор режима работы FSR 1.0. Выше - четче.", + "sv_SE": "Ställ in nivå för FSR 1.0 sharpening. Högre är skarpare.", "th_TH": "ตั้งค่าระดับความคมชัด FSR 1.0 ยิ่งสูงกว่าจะยิ่งคมชัดกว่า", "tr_TR": "", "uk_UA": "Встановити рівень різкості в FSR 1.0. Чим вище - тим різкіше.", @@ -20630,6 +21489,7 @@ "pl_PL": "SMAA Niskie", "pt_BR": "SMAA Baixo", "ru_RU": "SMAA Низкое", + "sv_SE": "SMAA låg", "th_TH": "SMAA ต่ำ", "tr_TR": "Düşük SMAA", "uk_UA": "SMAA Низький", @@ -20654,6 +21514,7 @@ "pl_PL": "SMAA Średnie", "pt_BR": "SMAA Médio", "ru_RU": "SMAA Среднее", + "sv_SE": "SMAA medium", "th_TH": "SMAA ปานกลาง", "tr_TR": "Orta SMAA", "uk_UA": "SMAA Середній", @@ -20678,6 +21539,7 @@ "pl_PL": "SMAA Wysokie", "pt_BR": "SMAA Alto", "ru_RU": "SMAA Высокое", + "sv_SE": "SMAA hög", "th_TH": "SMAA สูง", "tr_TR": "Yüksek SMAA", "uk_UA": "SMAA Високий", @@ -20702,6 +21564,7 @@ "pl_PL": "", "pt_BR": "", "ru_RU": "SMAA Ультра", + "sv_SE": "SMAA ultra", "th_TH": "SMAA สูงมาก", "tr_TR": "En Yüksek SMAA", "uk_UA": "SMAA Ультра", @@ -20726,6 +21589,7 @@ "pl_PL": "Edytuj użytkownika", "pt_BR": "Editar usuário", "ru_RU": "Редактирование пользователя", + "sv_SE": "Redigera användare", "th_TH": "แก้ไขผู้ใช้", "tr_TR": "Kullanıcıyı Düzenle", "uk_UA": "Редагувати користувача", @@ -20750,6 +21614,7 @@ "pl_PL": "Utwórz użytkownika", "pt_BR": "Criar usuário", "ru_RU": "Создание пользователя", + "sv_SE": "Skapa användare", "th_TH": "สร้างผู้ใช้", "tr_TR": "Kullanıcı Oluştur", "uk_UA": "Створити користувача", @@ -20774,6 +21639,7 @@ "pl_PL": "Interfejs sieci:", "pt_BR": "Interface de rede:", "ru_RU": "Сетевой интерфейс:", + "sv_SE": "Nätverksgränssnitt:", "th_TH": "เชื่อมต่อเครือข่าย:", "tr_TR": "Ağ Bağlantısı:", "uk_UA": "Мережевий інтерфейс:", @@ -20798,6 +21664,7 @@ "pl_PL": "Interfejs sieciowy używany dla funkcji LAN/LDN.\n\nw połączeniu z VPN lub XLink Kai i grą z obsługą sieci LAN, może być użyty do spoofowania połączenia z tą samą siecią przez Internet.\n\nZostaw DOMYŚLNE, jeśli nie ma pewności.", "pt_BR": "A interface de rede usada para recursos de LAN/LDN.\n\nEm conjunto com uma VPN ou XLink Kai e um jogo com suporte a LAN, pode ser usada para simular uma conexão na mesma rede pela Internet.\n\nMantenha em PADRÃO se estiver em dúvida.", "ru_RU": "Сетевой интерфейс, используемый для функций LAN/LDN.\n\nМожет использоваться для игры через интернет в сочетании с VPN или XLink Kai и игрой с поддержкой LAN.\n\nРекомендуется использовать \"По умолчанию\".", + "sv_SE": "Nätverksgränssnittet som används för LAN/LDN-funktioner.\n\nTillsammans med en VPN eller XLink Kai och ett spel med LAN-stöd så kan detta användas för att spoofa en same-network-anslutning över internet.\n\nLämna som STANDARD om du är osäker.", "th_TH": "อินเทอร์เฟซเครือข่ายที่ใช้สำหรับคุณสมบัติ LAN/LDN\n\nเมื่อใช้ร่วมกับ VPN หรือ XLink Kai และเกมที่รองรับ LAN สามารถใช้เพื่อปลอมการเชื่อมต่อเครือข่ายเดียวกันผ่านทางอินเทอร์เน็ต\n\nปล่อยให้เป็น ค่าเริ่มต้น หากคุณไม่แน่ใจ", "tr_TR": "", "uk_UA": "Мережевий інтерфейс, що використовується для LAN/LDN.\n\nРазом з VPN або XLink Kai, і грою що підтримує LAN, може імітувати з'єднання в однаковій мережі через Інтернет.", @@ -20822,6 +21689,7 @@ "pl_PL": "Domyślny", "pt_BR": "Padrão", "ru_RU": "По умолчанию", + "sv_SE": "Standard", "th_TH": "ค่าเริ่มต้น", "tr_TR": "Varsayılan", "uk_UA": "Стандартний", @@ -20846,6 +21714,7 @@ "pl_PL": "Pakuje Shadery ", "pt_BR": "Empacotamento de Shaders", "ru_RU": "Упаковка шейдеров", + "sv_SE": "Paketering av Shaders", "th_TH": "รวม Shaders เข้าด้วยกัน", "tr_TR": "Gölgeler Paketleniyor", "uk_UA": "Пакування шейдерів", @@ -20870,6 +21739,7 @@ "pl_PL": "Zobacz listę zmian na GitHubie", "pt_BR": "Ver mudanças no GitHub", "ru_RU": "Список изменений на GitHub", + "sv_SE": "Visa ändringslogg på GitHub", "th_TH": "ดูประวัติการเปลี่ยนแปลงบน GitHub", "tr_TR": "GitHub'da Değişiklikleri Görüntüle", "uk_UA": "Переглянути журнал змін на GitHub", @@ -20894,6 +21764,7 @@ "pl_PL": "Kliknij, aby otworzyć listę zmian dla tej wersji w domyślnej przeglądarce.", "pt_BR": "Clique para abrir o relatório de alterações para esta versão no seu navegador padrão.", "ru_RU": "Нажмите, чтобы открыть список изменений для этой версии", + "sv_SE": "Klicka för att öppna ändringsloggen för denna version i din standardwebbläsare.", "th_TH": "คลิกเพื่อเปิดประวัติการเปลี่ยนแปลงสำหรับเวอร์ชั่นนี้ บนเบราว์เซอร์เริ่มต้นของคุณ", "tr_TR": "Kullandığınız versiyon için olan değişiklikleri varsayılan tarayıcınızda görmek için tıklayın", "uk_UA": "Клацніть, щоб відкрити журнал змін для цієї версії у стандартному браузері.", @@ -20918,6 +21789,7 @@ "pl_PL": "Gra Wieloosobowa", "pt_BR": "", "ru_RU": "Мультиплеер", + "sv_SE": "Flerspelare", "th_TH": "ผู้เล่นหลายคน", "tr_TR": "Çok Oyunculu", "uk_UA": "Мережева гра", @@ -20942,6 +21814,7 @@ "pl_PL": "Tryb:", "pt_BR": "Modo:", "ru_RU": "Режим:", + "sv_SE": "Läge:", "th_TH": "โหมด:", "tr_TR": "Mod:", "uk_UA": "Режим:", @@ -20966,6 +21839,7 @@ "pl_PL": "", "pt_BR": "Alterar o modo multiplayer LDN.\n\nLdnMitm modificará a funcionalidade de jogo sem fio/local nos jogos para funcionar como se fosse LAN, permitindo conexões locais, na mesma rede, com outras instâncias do Ryujinx e consoles Nintendo Switch hackeados que possuem o módulo ldn_mitm instalado.\n\nO multiplayer exige que todos os jogadores estejam na mesma versão do jogo (ex.: Super Smash Bros. Ultimate v13.0.1 não consegue se conectar à v13.0.0).\n\nDeixe DESATIVADO se estiver em dúvida.", "ru_RU": "Меняет многопользовательский режим LDN.\n\nLdnMitm модифицирует функциональность локальной беспроводной/игры на одном устройстве в играх, позволяя играть с другими пользователями Ryujinx или взломанными консолями Nintendo Switch с установленным модулем ldn_mitm, находящимися в одной локальной сети друг с другом.\n\nМногопользовательская игра требует наличия у всех игроков одной и той же версии игры (т.е. Super Smash Bros. Ultimate v13.0.1 не может подключиться к v13.0.0).\n\nРекомендуется оставить отключенным.", + "sv_SE": "Ändra LDN-flerspelarläge\n\nLdnMitm kommer att ändra lokal funktionalitet för trådlös/lokalt spel att fungera som om det vore ett LAN, vilket ger stöd för anslutningar med local och same-network med andra Ryujinx-instanser och hackade Nintendo Switch-konsoller som har modulen ldn_mitm installerad.\n\nFlerspelare kräver att alla spelare har samma spelversion (t.ex. Super Smash Bros. Ultimate v13.0.1 kan inte ansluta till v13.0.0).\n\nLämna INAKTIVERAD om du är osäker.", "th_TH": "เปลี่ยนโหมดผู้เล่นหลายคนของ LDN\n\nLdnMitm จะปรับเปลี่ยนฟังก์ชันการเล่นแบบไร้สาย/ภายใน จะให้เกมทำงานเหมือนกับว่าเป็น LAN ช่วยให้สามารถเชื่อมต่อภายในเครือข่ายเดียวกันกับอินสแตนซ์ Ryujinx อื่น ๆ และคอนโซล Nintendo Switch ที่ถูกแฮ็กซึ่งมีโมดูล ldn_mitm ติดตั้งอยู่\n\nผู้เล่นหลายคนต้องการให้ผู้เล่นทุกคนอยู่ในเกมเวอร์ชันเดียวกัน (เช่น Super Smash Bros. Ultimate v13.0.1 ไม่สามารถเชื่อมต่อกับ v13.0.0)\n\nปล่อยให้ปิดการใช้งานหากไม่แน่ใจ", "tr_TR": "", "uk_UA": "Змінити LDN мультиплеєру.\n\nLdnMitm змінить функціонал бездротової/локальної гри в іграх, щоб вони працювали так, ніби це LAN, що дозволяє локальні підключення в тій самій мережі з іншими екземплярами Ryujinx та хакнутими консолями Nintendo Switch, які мають встановлений модуль ldn_mitm.\n\nМультиплеєр вимагає, щоб усі гравці були на одній і тій же версії гри (наприклад Super Smash Bros. Ultimate v13.0.1 не зможе під'єднатися до v13.0.0).\n\nЗалиште на \"Вимкнено\", якщо не впевнені, ", @@ -20990,6 +21864,7 @@ "pl_PL": "Wyłączone", "pt_BR": "Desativado", "ru_RU": "Отключено", + "sv_SE": "Inaktiverad", "th_TH": "ปิดใช้งาน", "tr_TR": "Devre Dışı", "uk_UA": "Вимкнено", @@ -21014,6 +21889,7 @@ "pl_PL": "", "pt_BR": "", "ru_RU": "", + "sv_SE": "ldn_mitm", "th_TH": "", "tr_TR": "", "uk_UA": "", @@ -21038,6 +21914,7 @@ "pl_PL": "", "pt_BR": "", "ru_RU": "", + "sv_SE": "RyuLDN", "th_TH": "", "tr_TR": "", "uk_UA": "", @@ -21062,6 +21939,7 @@ "pl_PL": "", "pt_BR": "", "ru_RU": "", + "sv_SE": "Inaktivera P2P-nätverkshosting (kan öka latens)", "th_TH": "", "tr_TR": "", "uk_UA": "Вимкнути хостинг P2P мережі (може збільшити затримку)", @@ -21086,6 +21964,7 @@ "pl_PL": "", "pt_BR": "", "ru_RU": "", + "sv_SE": "Inaktivera P2P-nätverkshosting, motparter kommer skickas genom masterservern isället för att ansluta direkt till dig.", "th_TH": "", "tr_TR": "", "uk_UA": "Вимкнути хостинг P2P мережі, піри будуть підключатися через майстер-сервер замість прямого з'єднання з вами.", @@ -21110,6 +21989,7 @@ "pl_PL": "", "pt_BR": "", "ru_RU": "", + "sv_SE": "Lösenfras för nätverk:", "th_TH": "", "tr_TR": "", "uk_UA": "Мережевий пароль:", @@ -21134,6 +22014,7 @@ "pl_PL": "", "pt_BR": "", "ru_RU": "", + "sv_SE": "Du kommer endast kunna se hostade spel med samma lösenfras som du.", "th_TH": "", "tr_TR": "", "uk_UA": "Ви зможете бачити лише ті ігри, які мають такий самий пароль, як і у вас.", @@ -21158,6 +22039,7 @@ "pl_PL": "", "pt_BR": "", "ru_RU": "", + "sv_SE": "Ange en lösenfras i formatet Ryujinx-<8 hextecken>. Du kommer endast kunna se hostade spel med samma lösenfras som du.", "th_TH": "", "tr_TR": "", "uk_UA": "Введіть пароль у форматі Ryujinx-<8 символів>. Ви зможете бачити лише ті ігри, які мають такий самий пароль, як і у вас.", @@ -21182,6 +22064,7 @@ "pl_PL": "", "pt_BR": "", "ru_RU": "", + "sv_SE": "(publik)", "th_TH": "", "tr_TR": "", "uk_UA": "(публічний)", @@ -21206,6 +22089,7 @@ "pl_PL": "", "pt_BR": "", "ru_RU": "", + "sv_SE": "Generera slumpmässigt", "th_TH": "", "tr_TR": "", "uk_UA": "Згенерувати випадкову", @@ -21230,6 +22114,7 @@ "pl_PL": "", "pt_BR": "", "ru_RU": "", + "sv_SE": "Genererar en ny lösenfras som kan delas med andra spelare.", "th_TH": "", "tr_TR": "", "uk_UA": "Генерує новий пароль, яким можна поділитися з іншими гравцями.", @@ -21254,6 +22139,7 @@ "pl_PL": "", "pt_BR": "", "ru_RU": "", + "sv_SE": "Töm", "th_TH": "", "tr_TR": "", "uk_UA": "Очистити", @@ -21278,6 +22164,7 @@ "pl_PL": "", "pt_BR": "", "ru_RU": "", + "sv_SE": "Tömmer aktuell lösenfras och återgår till det publika nätverket.", "th_TH": "", "tr_TR": "", "uk_UA": "Очищає поточну пароль, повертаючись до публічної мережі.", @@ -21302,6 +22189,7 @@ "pl_PL": "", "pt_BR": "", "ru_RU": "", + "sv_SE": "Ogiltig lösenfras! Måste vara i formatet \"Ryujinx-<8 hextecken>\"", "th_TH": "", "tr_TR": "", "uk_UA": "Невірний пароль! Має бути в форматі \"Ryujinx-<8 символів>\"", @@ -21326,6 +22214,7 @@ "pl_PL": "", "pt_BR": "", "ru_RU": "", + "sv_SE": "VSync:", "th_TH": "", "tr_TR": "", "uk_UA": "Вертикальна синхронізація (VSync):", @@ -21350,6 +22239,7 @@ "pl_PL": "", "pt_BR": "", "ru_RU": "", + "sv_SE": "Aktivera anpassad uppdateringsfrekvens (experimentell)", "th_TH": "", "tr_TR": "", "uk_UA": "Увімкнути користувацьку частоту оновлення (Експериментально)", @@ -21374,6 +22264,7 @@ "pl_PL": "", "pt_BR": "", "ru_RU": "", + "sv_SE": "Switch", "th_TH": "", "tr_TR": "", "uk_UA": "", @@ -21398,6 +22289,7 @@ "pl_PL": "", "pt_BR": "", "ru_RU": "", + "sv_SE": "Obunden", "th_TH": "", "tr_TR": "", "uk_UA": "Безмежна", @@ -21422,6 +22314,7 @@ "pl_PL": "", "pt_BR": "", "ru_RU": "", + "sv_SE": "Anpassad uppdateringsfrekvens", "th_TH": "", "tr_TR": "", "uk_UA": "Користувацька", @@ -21446,6 +22339,7 @@ "pl_PL": "", "pt_BR": "", "ru_RU": "", + "sv_SE": "Emulerad vertikal synk. 'Switch' emulerar Switchens uppdateringsfrekvens på 60Hz. 'Obunden' är en obegränsad uppdateringsfrekvens.", "th_TH": "", "tr_TR": "", "uk_UA": "Емульована вертикальна синхронізація. 'Switch' емулює частоту оновлення Switch 60 Гц. 'Безмежна' — частота оновлення не матиме обмежень.", @@ -21470,6 +22364,7 @@ "pl_PL": "", "pt_BR": "", "ru_RU": "", + "sv_SE": "Emulerad vertikal synk. 'Switch' emulerar Switchens uppdateringsfrekvens på 60Hz. 'Obunden' är en obegränsad uppdateringsfrekvens. 'Anpassad uppdateringsfrekvens' emulerar den angivna anpassade uppdateringsfrekvensen.", "th_TH": "", "tr_TR": "", "uk_UA": "Емульована вертикальна синхронізація. 'Switch' емулює частоту оновлення Switch 60 Гц. 'Безмежна' — частота оновлення не матиме обмежень. 'Користувацька' емулює вказану користувацьку частоту оновлення.", @@ -21494,6 +22389,7 @@ "pl_PL": "", "pt_BR": "", "ru_RU": "", + "sv_SE": "Låter användaren ange en emulerad uppdateringsfrekvens. För vissa spel så kan detta snabba upp eller ner frekvensen för spellogiken. I andra spel så kan detta tillåta att bildfrekvensen kapas för delar av uppdateringsfrekvensen eller leda till oväntat beteende. Detta är en experimentell funktion utan några garantier för hur spelet påverkas. \n\nLämna AV om du är osäker.", "th_TH": "", "tr_TR": "", "uk_UA": "Дозволяє користувачу вказати емульовану частоту оновлення. У деяких іграх це може прискорити або сповільнити логіку гри. У інших іграх це може дозволити обмежити FPS на певні кратні частоти оновлення або призвести до непередбачуваної поведінки. Це експериментальна функція, без гарантій того, як це вплине на ігровий процес. \n\nЗалиште ВИМКНЕНИМ, якщо не впевнені.", @@ -21518,6 +22414,7 @@ "pl_PL": "", "pt_BR": "", "ru_RU": "", + "sv_SE": "Målvärde för anpassad uppdateringsfrekvens.", "th_TH": "", "tr_TR": "", "uk_UA": "Цільове значення користувацької частоти оновлення.", @@ -21542,6 +22439,7 @@ "pl_PL": "", "pt_BR": "", "ru_RU": "", + "sv_SE": "Anpassad uppdateringsfrekvens, som en procentdel av den normala uppdateringsfrekvensen för Switch.", "th_TH": "", "tr_TR": "", "uk_UA": "Користувацька частота оновлення, як відсоток від стандартної частоти оновлення Switch.", @@ -21566,6 +22464,7 @@ "pl_PL": "", "pt_BR": "", "ru_RU": "", + "sv_SE": "Anpassad uppdateringsfrekvens %:", "th_TH": "", "tr_TR": "", "uk_UA": "Користувацька частота оновлення %:", @@ -21590,6 +22489,7 @@ "pl_PL": "", "pt_BR": "", "ru_RU": "", + "sv_SE": "Värde för anpassad uppdateringsfrekvens:", "th_TH": "", "tr_TR": "", "uk_UA": "Значення користувацька частота оновлення:", @@ -21614,6 +22514,7 @@ "pl_PL": "", "pt_BR": "", "ru_RU": "", + "sv_SE": "Intervall", "th_TH": "", "tr_TR": "", "uk_UA": "", @@ -21638,6 +22539,7 @@ "pl_PL": "", "pt_BR": "", "ru_RU": "", + "sv_SE": "Växla VSync-läge:", "th_TH": "", "tr_TR": "", "uk_UA": "Перемкнути VSync режим:", @@ -21662,6 +22564,7 @@ "pl_PL": "", "pt_BR": "", "ru_RU": "", + "sv_SE": "Höj anpassad uppdateringsfrekvens", "th_TH": "", "tr_TR": "", "uk_UA": "Підвищити користувацьку частоту оновлення", @@ -21686,6 +22589,7 @@ "pl_PL": "", "pt_BR": "", "ru_RU": "", + "sv_SE": "Sänk anpassad uppdateringsfrekvens", "th_TH": "", "tr_TR": "", "uk_UA": "Понизити користувацьку частоту оновлення", From 153d1ef06b6f16aa0b21d1733471e941c63538d9 Mon Sep 17 00:00:00 2001 From: Elijah Fronzak Date: Sat, 28 Dec 2024 03:45:42 +0300 Subject: [PATCH 34/60] ru_RU locale update (#450) Co-authored-by: Evan Husted --- src/Ryujinx/Assets/locales.json | 554 ++++++++++++++++---------------- 1 file changed, 277 insertions(+), 277 deletions(-) diff --git a/src/Ryujinx/Assets/locales.json b/src/Ryujinx/Assets/locales.json index 6cebc1364..fc77cf458 100644 --- a/src/Ryujinx/Assets/locales.json +++ b/src/Ryujinx/Assets/locales.json @@ -88,7 +88,7 @@ "no_NO": "Mii-redigeringsapplet", "pl_PL": "", "pt_BR": "", - "ru_RU": "", + "ru_RU": "Апплет Mii Editor", "sv_SE": "Redigera Mii-applet", "th_TH": "", "tr_TR": "", @@ -338,7 +338,7 @@ "no_NO": "Ingen apper ble funnet i valgt fil.", "pl_PL": "", "pt_BR": "Nenhum aplicativo encontrado no arquivo selecionado.", - "ru_RU": "", + "ru_RU": "Приложения в выбранном файле не найдены", "sv_SE": "Inga applikationer hittades i vald fil.", "th_TH": "ไม่พบแอปพลิเคชั่นจากไฟล์ที่เลือก", "tr_TR": "", @@ -388,7 +388,7 @@ "no_NO": "Last inn DLC fra mappe", "pl_PL": "", "pt_BR": "Carregar DLC da Pasta", - "ru_RU": "", + "ru_RU": "Загрузить DLC из папки", "sv_SE": "Läs in DLC från mapp", "th_TH": "โหลด DLC จากโฟลเดอร์", "tr_TR": "", @@ -413,7 +413,7 @@ "no_NO": "Last inn titteloppdateringer fra mappe", "pl_PL": "", "pt_BR": "Carregar Atualizações de Jogo da Pasta", - "ru_RU": "", + "ru_RU": "Загрузить обновления из папки", "sv_SE": "Läs in titeluppdateringar från mapp", "th_TH": "โหลดไฟล์อัพเดตจากโฟลเดอร์", "tr_TR": "", @@ -738,7 +738,7 @@ "no_NO": "Skann en Amiibo (fra bin fil)", "pl_PL": "", "pt_BR": "", - "ru_RU": "", + "ru_RU": "Сканировать Amiibo (из папки Bin)", "sv_SE": "Skanna en Amiibo (från bin-fil)", "th_TH": "", "tr_TR": "", @@ -863,7 +863,7 @@ "no_NO": "Installere nøkler", "pl_PL": "", "pt_BR": "", - "ru_RU": "", + "ru_RU": "Установить ключи", "sv_SE": "Installera nycklar", "th_TH": "", "tr_TR": "", @@ -888,7 +888,7 @@ "no_NO": "Installer nøkler fra KEYS eller ZIP", "pl_PL": "", "pt_BR": "", - "ru_RU": "", + "ru_RU": "Установить ключи из файла KEYS или ZIP", "sv_SE": "Installera nycklar från KEYS eller ZIP", "th_TH": "", "tr_TR": "", @@ -913,7 +913,7 @@ "no_NO": "Installer nøkler fra en mappe", "pl_PL": "", "pt_BR": "", - "ru_RU": "", + "ru_RU": "Установить ключи из папки", "sv_SE": "Installera nycklar från en katalog", "th_TH": "", "tr_TR": "", @@ -1013,7 +1013,7 @@ "no_NO": "Trim XCI-filer", "pl_PL": "", "pt_BR": "", - "ru_RU": "", + "ru_RU": "Уменьшить размер XCI файлов", "sv_SE": "Optimera XCI-filer", "th_TH": "", "tr_TR": "", @@ -1085,11 +1085,11 @@ "it_IT": "", "ja_JP": "", "ko_KR": "", - "no_NO": "720p", + "no_NO": "", "pl_PL": "", "pt_BR": "", "ru_RU": "", - "sv_SE": "720p", + "sv_SE": "", "th_TH": "", "tr_TR": "", "uk_UA": "", @@ -1110,11 +1110,11 @@ "it_IT": "", "ja_JP": "", "ko_KR": "", - "no_NO": "1080p", + "no_NO": "", "pl_PL": "", "pt_BR": "", "ru_RU": "", - "sv_SE": "1080p", + "sv_SE": "", "th_TH": "", "tr_TR": "", "uk_UA": "", @@ -1139,7 +1139,7 @@ "pl_PL": "", "pt_BR": "", "ru_RU": "", - "sv_SE": "1440p", + "sv_SE": "", "th_TH": "", "tr_TR": "", "uk_UA": "", @@ -1164,7 +1164,7 @@ "pl_PL": "", "pt_BR": "", "ru_RU": "", - "sv_SE": "2160p", + "sv_SE": "", "th_TH": "", "tr_TR": "", "uk_UA": "", @@ -1238,7 +1238,7 @@ "no_NO": "", "pl_PL": "", "pt_BR": "", - "ru_RU": "", + "ru_RU": "FAQ и Руководства", "sv_SE": "Frågor, svar och guider", "th_TH": "", "tr_TR": "", @@ -1263,7 +1263,7 @@ "no_NO": "FAQ- og feilsøkingsside", "pl_PL": "", "pt_BR": "", - "ru_RU": "", + "ru_RU": "FAQ & Устранение неполадок", "sv_SE": "Frågor, svar och felsökningssida", "th_TH": "", "tr_TR": "", @@ -1288,7 +1288,7 @@ "no_NO": "Åpner FAQ- og feilsøkingssiden på den offisielle Ryujinx-wikien", "pl_PL": "", "pt_BR": "", - "ru_RU": "", + "ru_RU": "Открывает страницы с FAQ и Устранением неполадок на официальной странице вики Ryujinx", "sv_SE": "Öppnar Frågor, svar och felsökningssidan på den officiella Ryujinx-wikin", "th_TH": "", "tr_TR": "", @@ -1313,7 +1313,7 @@ "no_NO": "Oppsett- og konfigurasjonsveiledning", "pl_PL": "", "pt_BR": "", - "ru_RU": "", + "ru_RU": "Руководство по установке и настройке", "sv_SE": "Konfigurationsguide", "th_TH": "", "tr_TR": "", @@ -1338,7 +1338,7 @@ "no_NO": "Åpner oppsett- og konfigurasjonsveiledningen på den offisielle Ryujinx-wikien", "pl_PL": "", "pt_BR": "", - "ru_RU": "", + "ru_RU": "Открывает страницу Руководство по установке и настройке на официальной странице вики Ryujinx", "sv_SE": "Öppnar konfigurationsguiden på den officiella Ryujinx-wikin", "th_TH": "", "tr_TR": "", @@ -1363,7 +1363,7 @@ "no_NO": "Flerspillerveiledning (LDN/LAN)", "pl_PL": "", "pt_BR": "", - "ru_RU": "", + "ru_RU": "Гайд по мультиплееру (LDN/LAN)", "sv_SE": "Flerspelarguide (LDN/LAN)", "th_TH": "", "tr_TR": "", @@ -1388,7 +1388,7 @@ "no_NO": "Åpner flerspillerveiledningen på den offisielle Ryujinx-wikien", "pl_PL": "", "pt_BR": "", - "ru_RU": "", + "ru_RU": "Открывает гайд по мультиплееру на официальной странице вики Ryujinx", "sv_SE": "Öppnar flerspelarguiden på den officiella Ryujinx-wikin", "th_TH": "", "tr_TR": "", @@ -2210,10 +2210,10 @@ "it_IT": "", "ja_JP": "", "ko_KR": "", - "no_NO": "ExeFS", + "no_NO": "", "pl_PL": "", "pt_BR": "", - "ru_RU": "", + "ru_RU": "ExeFS", "sv_SE": "ExeFS", "th_TH": "", "tr_TR": "", @@ -2260,10 +2260,10 @@ "it_IT": "", "ja_JP": "", "ko_KR": "", - "no_NO": "RomFS", + "no_NO": "", "pl_PL": "", "pt_BR": "", - "ru_RU": "", + "ru_RU": "RomFS", "sv_SE": "RomFS", "th_TH": "", "tr_TR": "", @@ -2313,7 +2313,7 @@ "no_NO": "Logo", "pl_PL": "", "pt_BR": "", - "ru_RU": "Логотип", + "ru_RU": "Лого", "sv_SE": "Logotyp", "th_TH": "โลโก้", "tr_TR": "Simge", @@ -2538,7 +2538,7 @@ "no_NO": "Kontroller og trim XCI-filen", "pl_PL": "", "pt_BR": "", - "ru_RU": "", + "ru_RU": "Проверить и обрезать XCI файл", "sv_SE": "Kontrollera och optimera XCI-fil", "th_TH": "", "tr_TR": "", @@ -2563,7 +2563,7 @@ "no_NO": "Kontroller og trimm XCI-filen for å spare diskplass", "pl_PL": "", "pt_BR": "", - "ru_RU": "", + "ru_RU": "Проверить и обрезать XCI файл для уменьшения его размера", "sv_SE": "Kontrollera och optimera XCI-fil för att spara diskutrymme", "th_TH": "", "tr_TR": "", @@ -2638,7 +2638,7 @@ "no_NO": "Trimming av XCI-filen '{0}'", "pl_PL": "", "pt_BR": "", - "ru_RU": "", + "ru_RU": "Обрезается XCI файл '{0}'", "sv_SE": "Optimerar XCI-filen '{0}'", "th_TH": "", "tr_TR": "", @@ -3013,7 +3013,7 @@ "no_NO": "Vis tittellinje (krever omstart)", "pl_PL": "", "pt_BR": "", - "ru_RU": "", + "ru_RU": "Показать строку заголовка (требуется перезапуск)", "sv_SE": "Visa titelrad (kräver omstart)", "th_TH": "", "tr_TR": "", @@ -3163,7 +3163,7 @@ "no_NO": "Autoload DLC/Updates-mapper", "pl_PL": "", "pt_BR": "Carregar Automaticamente Diretórios de DLC/Atualizações", - "ru_RU": "", + "ru_RU": "Автозагрузка папки с DLC/Обновлениями", "sv_SE": "Läs automatisk in DLC/speluppdateringar", "th_TH": "โหลดไดเรกทอรี DLC/ไฟล์อัปเดต อัตโนมัติ", "tr_TR": "", @@ -3188,7 +3188,7 @@ "no_NO": "DLC og oppdateringer som henviser til manglende filer, vil bli lastet ned automatisk", "pl_PL": "", "pt_BR": "DLCs e Atualizações que se referem a arquivos ausentes serão descarregadas automaticamente", - "ru_RU": "", + "ru_RU": "DLC и обновления, которые ссылаются на отсутствующие файлы, будут выгружаться автоматически", "sv_SE": "DLC och speluppdateringar som refererar till saknade filer kommer inte att läsas in automatiskt", "th_TH": "", "tr_TR": "", @@ -3513,7 +3513,7 @@ "no_NO": "Systemspråk", "pl_PL": "Język systemu:", "pt_BR": "Idioma do sistema:", - "ru_RU": "Язык прошивки:", + "ru_RU": "Язык системы:", "sv_SE": "Systemspråk:", "th_TH": "ภาษาของระบบ:", "tr_TR": "Sistem Dili:", @@ -3613,7 +3613,7 @@ "no_NO": "Tysk", "pl_PL": "Niemiecki", "pt_BR": "Alemão", - "ru_RU": "Германский", + "ru_RU": "Немецкий", "sv_SE": "Tyska", "th_TH": "เยอรมัน", "tr_TR": "Almanca", @@ -3813,7 +3813,7 @@ "no_NO": "Taiwansk", "pl_PL": "Tajwański", "pt_BR": "Taiwanês", - "ru_RU": "Тайванский", + "ru_RU": "Тайваньский", "sv_SE": "Taiwanesiska", "th_TH": "จีนตัวเต็ม (ไต้หวัน)", "tr_TR": "Tayvanca", @@ -3838,7 +3838,7 @@ "no_NO": "Britisk engelsk", "pl_PL": "Angielski (Wielka Brytania)", "pt_BR": "Inglês britânico", - "ru_RU": "Английский (Британия)", + "ru_RU": "Английский (Великобритания)", "sv_SE": "Brittisk engelska", "th_TH": "อังกฤษ (บริติช)", "tr_TR": "İngiliz İngilizcesi", @@ -3963,7 +3963,7 @@ "no_NO": "System Tidssone:", "pl_PL": "Strefa czasowa systemu:", "pt_BR": "Fuso horário do sistema:", - "ru_RU": "Часовой пояс прошивки:", + "ru_RU": "Часовой пояс системы:", "sv_SE": "Systemets tidszon:", "th_TH": "เขตเวลาของระบบ:", "tr_TR": "Sistem Saat Dilimi:", @@ -3988,7 +3988,7 @@ "no_NO": "System tid:", "pl_PL": "Czas systemu:", "pt_BR": "Hora do sistema:", - "ru_RU": "Системное время в прошивке:", + "ru_RU": "Системное время:", "sv_SE": "Systemtid:", "th_TH": "เวลาของระบบ:", "tr_TR": "Sistem Saati:", @@ -4013,7 +4013,7 @@ "no_NO": "", "pl_PL": "", "pt_BR": "", - "ru_RU": "", + "ru_RU": "Повторная синхронизация с датой и временем на компьютере", "sv_SE": "Återsynka till datorns datum och tid", "th_TH": "", "tr_TR": "", @@ -4063,7 +4063,7 @@ "no_NO": "PPTC med lavt strømforbruk", "pl_PL": "Low-power PPTC", "pt_BR": "Low-power PPTC", - "ru_RU": "Low-power PPTC", + "ru_RU": "PPTC с низким электропотреблением", "sv_SE": "PPTC med låg strömförbrukning", "th_TH": "PPTC แบบพลังงานตํ่า", "tr_TR": "Low-power PPTC", @@ -4160,10 +4160,10 @@ "it_IT": "", "ja_JP": "", "ko_KR": "", - "no_NO": "OpenAL", + "no_NO": "", "pl_PL": "", "pt_BR": "", - "ru_RU": "", + "ru_RU": "OpenAL", "sv_SE": "OpenAL", "th_TH": "", "tr_TR": "", @@ -4188,7 +4188,7 @@ "no_NO": "Lyd Inn/Ut", "pl_PL": "", "pt_BR": "", - "ru_RU": "", + "ru_RU": "SoundIO", "sv_SE": "SoundIO", "th_TH": "", "tr_TR": "", @@ -4210,10 +4210,10 @@ "it_IT": "", "ja_JP": "", "ko_KR": "", - "no_NO": "SDL2", + "no_NO": "", "pl_PL": "", "pt_BR": "", - "ru_RU": "", + "ru_RU": "SDL2", "sv_SE": "SDL2", "th_TH": "", "tr_TR": "", @@ -4313,7 +4313,7 @@ "no_NO": "4GB", "pl_PL": "", "pt_BR": "", - "ru_RU": "", + "ru_RU": "4ГиБ", "sv_SE": "4GiB", "th_TH": "", "tr_TR": "", @@ -4338,7 +4338,7 @@ "no_NO": "6GB", "pl_PL": "", "pt_BR": "", - "ru_RU": "", + "ru_RU": "6ГиБ", "sv_SE": "6GiB", "th_TH": "", "tr_TR": "", @@ -4363,7 +4363,7 @@ "no_NO": "8GB", "pl_PL": "", "pt_BR": "", - "ru_RU": "", + "ru_RU": "8ГиБ", "sv_SE": "8GiB", "th_TH": "", "tr_TR": "", @@ -4388,7 +4388,7 @@ "no_NO": "12GB", "pl_PL": "", "pt_BR": "", - "ru_RU": "", + "ru_RU": "12ГиБ", "sv_SE": "12GiB", "th_TH": "", "tr_TR": "", @@ -4588,7 +4588,7 @@ "no_NO": "2x", "pl_PL": "", "pt_BR": "", - "ru_RU": "", + "ru_RU": "2x", "sv_SE": "2x", "th_TH": "", "tr_TR": "", @@ -4613,7 +4613,7 @@ "no_NO": "4x", "pl_PL": "", "pt_BR": "", - "ru_RU": "", + "ru_RU": "4x", "sv_SE": "4x", "th_TH": "", "tr_TR": "", @@ -4638,7 +4638,7 @@ "no_NO": "8x", "pl_PL": "", "pt_BR": "", - "ru_RU": "", + "ru_RU": "8x", "sv_SE": "8x", "th_TH": "", "tr_TR": "", @@ -4663,7 +4663,7 @@ "no_NO": "16x", "pl_PL": "", "pt_BR": "", - "ru_RU": "", + "ru_RU": "16x", "sv_SE": "16x", "th_TH": "", "tr_TR": "", @@ -4763,7 +4763,7 @@ "no_NO": "2x (1440p/2160p)", "pl_PL": "", "pt_BR": "", - "ru_RU": "", + "ru_RU": "2x (1440p/2160p)", "sv_SE": "2x (1440p/2160p)", "th_TH": "", "tr_TR": "", @@ -4788,7 +4788,7 @@ "no_NO": "3x (2160p/3240p)", "pl_PL": "", "pt_BR": "", - "ru_RU": "", + "ru_RU": "3x (2160p/3240p)", "sv_SE": "3x (2160p/3240p)", "th_TH": "", "tr_TR": "", @@ -4860,10 +4860,10 @@ "it_IT": "", "ja_JP": "", "ko_KR": "", - "no_NO": "4:3", + "no_NO": "", "pl_PL": "", "pt_BR": "", - "ru_RU": "", + "ru_RU": "4:3", "sv_SE": "4:3", "th_TH": "", "tr_TR": "", @@ -4885,10 +4885,10 @@ "it_IT": "", "ja_JP": "", "ko_KR": "", - "no_NO": "16:9", + "no_NO": "", "pl_PL": "", "pt_BR": "", - "ru_RU": "", + "ru_RU": "16:9", "sv_SE": "16:9", "th_TH": "", "tr_TR": "", @@ -4910,10 +4910,10 @@ "it_IT": "", "ja_JP": "", "ko_KR": "", - "no_NO": "16:10", + "no_NO": "", "pl_PL": "", "pt_BR": "", - "ru_RU": "", + "ru_RU": "16:10", "sv_SE": "16:10", "th_TH": "", "tr_TR": "", @@ -4935,10 +4935,10 @@ "it_IT": "", "ja_JP": "", "ko_KR": "", - "no_NO": "21:9", + "no_NO": "", "pl_PL": "", "pt_BR": "", - "ru_RU": "", + "ru_RU": "21:9", "sv_SE": "21:9", "th_TH": "", "tr_TR": "", @@ -4963,7 +4963,7 @@ "no_NO": "32:9", "pl_PL": "", "pt_BR": "", - "ru_RU": "", + "ru_RU": "32:9", "sv_SE": "32:9", "th_TH": "", "tr_TR": "", @@ -5652,7 +5652,7 @@ "Translations": { "ar_SA": "موافق", "de_DE": "", - "el_GR": "ΟΚ", + "el_GR": "", "en_US": "OK", "es_ES": "Aceptar", "fr_FR": "", @@ -5660,11 +5660,11 @@ "it_IT": "", "ja_JP": "", "ko_KR": "확인", - "no_NO": "OK", + "no_NO": "", "pl_PL": "", "pt_BR": "", - "ru_RU": "Ок", - "sv_SE": "Ok", + "ru_RU": "", + "sv_SE": "", "th_TH": "ตกลง", "tr_TR": "Tamam", "uk_UA": "Гаразд", @@ -6113,7 +6113,7 @@ "no_NO": "", "pl_PL": "Pro Kontroler", "pt_BR": "", - "ru_RU": "", + "ru_RU": "Pro Controller", "sv_SE": "Pro Controller", "th_TH": "โปรคอนโทรลเลอร์", "tr_TR": "Profesyonel Kumanda", @@ -6360,11 +6360,11 @@ "it_IT": "", "ja_JP": "", "ko_KR": "", - "no_NO": "A", + "no_NO": "", "pl_PL": "", "pt_BR": "", "ru_RU": "", - "sv_SE": "A", + "sv_SE": "", "th_TH": "", "tr_TR": "", "uk_UA": "", @@ -6385,11 +6385,11 @@ "it_IT": "", "ja_JP": "", "ko_KR": "", - "no_NO": "B", + "no_NO": "", "pl_PL": "", "pt_BR": "", "ru_RU": "", - "sv_SE": "B", + "sv_SE": "", "th_TH": "", "tr_TR": "", "uk_UA": "", @@ -6410,11 +6410,11 @@ "it_IT": "", "ja_JP": "", "ko_KR": "", - "no_NO": "X", + "no_NO": "", "pl_PL": "", "pt_BR": "", "ru_RU": "", - "sv_SE": "X", + "sv_SE": "", "th_TH": "", "tr_TR": "", "uk_UA": "", @@ -6435,11 +6435,11 @@ "it_IT": "", "ja_JP": "", "ko_KR": "", - "no_NO": "Y", + "no_NO": "", "pl_PL": "", "pt_BR": "", "ru_RU": "", - "sv_SE": "Y", + "sv_SE": "", "th_TH": "", "tr_TR": "", "uk_UA": "", @@ -6464,7 +6464,7 @@ "pl_PL": "", "pt_BR": "", "ru_RU": "", - "sv_SE": "+", + "sv_SE": "", "th_TH": "", "tr_TR": "", "uk_UA": "", @@ -6489,7 +6489,7 @@ "pl_PL": "", "pt_BR": "", "ru_RU": "", - "sv_SE": "-", + "sv_SE": "", "th_TH": "", "tr_TR": "", "uk_UA": "", @@ -6513,7 +6513,7 @@ "no_NO": "Retningsfelt", "pl_PL": "Krzyżak (D-Pad)", "pt_BR": "Direcional", - "ru_RU": "Кнопки направления", + "ru_RU": "Кнопки направления (D-pad)", "sv_SE": "Riktningsknappar", "th_TH": "ปุ่มลูกศร", "tr_TR": "Yön Tuşları", @@ -7039,7 +7039,7 @@ "pl_PL": "", "pt_BR": "", "ru_RU": "", - "sv_SE": "L", + "sv_SE": "", "th_TH": "", "tr_TR": "", "uk_UA": "", @@ -7064,7 +7064,7 @@ "pl_PL": "", "pt_BR": "", "ru_RU": "", - "sv_SE": "R", + "sv_SE": "", "th_TH": "", "tr_TR": "", "uk_UA": "", @@ -7089,7 +7089,7 @@ "pl_PL": "", "pt_BR": "", "ru_RU": "", - "sv_SE": "ZL", + "sv_SE": "", "th_TH": "", "tr_TR": "", "uk_UA": "", @@ -7114,7 +7114,7 @@ "pl_PL": "", "pt_BR": "", "ru_RU": "", - "sv_SE": "ZR", + "sv_SE": "", "th_TH": "", "tr_TR": "", "uk_UA": "", @@ -7139,7 +7139,7 @@ "pl_PL": "", "pt_BR": "", "ru_RU": "", - "sv_SE": "SL", + "sv_SE": "", "th_TH": "", "tr_TR": "", "uk_UA": "", @@ -7164,7 +7164,7 @@ "pl_PL": "", "pt_BR": "", "ru_RU": "", - "sv_SE": "SR", + "sv_SE": "", "th_TH": "", "tr_TR": "", "uk_UA": "", @@ -7189,7 +7189,7 @@ "pl_PL": "", "pt_BR": "", "ru_RU": "", - "sv_SE": "SL", + "sv_SE": "", "th_TH": "", "tr_TR": "", "uk_UA": "", @@ -7214,7 +7214,7 @@ "pl_PL": "", "pt_BR": "", "ru_RU": "", - "sv_SE": "SR", + "sv_SE": "", "th_TH": "", "tr_TR": "", "uk_UA": "", @@ -8088,7 +8088,7 @@ "no_NO": "", "pl_PL": "", "pt_BR": "", - "ru_RU": "", + "ru_RU": "Enter", "sv_SE": "Enter", "th_TH": "", "tr_TR": "", @@ -8113,7 +8113,7 @@ "no_NO": "Esc-tast", "pl_PL": "", "pt_BR": "", - "ru_RU": "", + "ru_RU": "Esc", "sv_SE": "Escape", "th_TH": "", "tr_TR": "Esc", @@ -8163,7 +8163,7 @@ "no_NO": "", "pl_PL": "", "pt_BR": "", - "ru_RU": "", + "ru_RU": "Tab", "sv_SE": "Tab", "th_TH": "", "tr_TR": "", @@ -8188,7 +8188,7 @@ "no_NO": "Tilbaketast", "pl_PL": "", "pt_BR": "", - "ru_RU": "", + "ru_RU": "Backspace", "sv_SE": "Backspace", "th_TH": "", "tr_TR": "Geri tuşu", @@ -8213,7 +8213,7 @@ "no_NO": "Sett inn", "pl_PL": "", "pt_BR": "", - "ru_RU": "", + "ru_RU": "Insert", "sv_SE": "Insert", "th_TH": "", "tr_TR": "", @@ -8238,7 +8238,7 @@ "no_NO": "Slett", "pl_PL": "", "pt_BR": "", - "ru_RU": "", + "ru_RU": "Delete", "sv_SE": "Delete", "th_TH": "", "tr_TR": "", @@ -8263,7 +8263,7 @@ "no_NO": "Side opp", "pl_PL": "", "pt_BR": "", - "ru_RU": "", + "ru_RU": "Page Up", "sv_SE": "Page Up", "th_TH": "", "tr_TR": "", @@ -8288,7 +8288,7 @@ "no_NO": "Side ned", "pl_PL": "", "pt_BR": "", - "ru_RU": "", + "ru_RU": "Page Down", "sv_SE": "Page Down", "th_TH": "", "tr_TR": "", @@ -8313,7 +8313,7 @@ "no_NO": "Hjem", "pl_PL": "", "pt_BR": "", - "ru_RU": "", + "ru_RU": "Home", "sv_SE": "Home", "th_TH": "", "tr_TR": "", @@ -8338,7 +8338,7 @@ "no_NO": "Avslutt", "pl_PL": "", "pt_BR": "", - "ru_RU": "", + "ru_RU": "End", "sv_SE": "End", "th_TH": "", "tr_TR": "", @@ -8363,7 +8363,7 @@ "no_NO": "Skiftelås", "pl_PL": "", "pt_BR": "", - "ru_RU": "", + "ru_RU": "Caps Lock", "sv_SE": "Caps Lock", "th_TH": "", "tr_TR": "", @@ -8388,7 +8388,7 @@ "no_NO": "Rullelås", "pl_PL": "", "pt_BR": "", - "ru_RU": "", + "ru_RU": "Scroll Lock", "sv_SE": "Scroll Lock", "th_TH": "", "tr_TR": "", @@ -8413,7 +8413,7 @@ "no_NO": "Skjermbilde", "pl_PL": "", "pt_BR": "", - "ru_RU": "", + "ru_RU": "Print Screen", "sv_SE": "Print Screen", "th_TH": "", "tr_TR": "", @@ -8438,7 +8438,7 @@ "no_NO": "Stans midlertidig", "pl_PL": "", "pt_BR": "", - "ru_RU": "", + "ru_RU": "Pause", "sv_SE": "Pause", "th_TH": "", "tr_TR": "", @@ -8463,7 +8463,7 @@ "no_NO": "Numerisk Lås", "pl_PL": "", "pt_BR": "", - "ru_RU": "", + "ru_RU": "Num Lock", "sv_SE": "Num Lock", "th_TH": "", "tr_TR": "", @@ -8488,7 +8488,7 @@ "no_NO": "Tøm", "pl_PL": "", "pt_BR": "", - "ru_RU": "Очистить", + "ru_RU": "", "sv_SE": "Töm", "th_TH": "", "tr_TR": "", @@ -8913,7 +8913,7 @@ "no_NO": "", "pl_PL": "", "pt_BR": "", - "ru_RU": "", + "ru_RU": "0", "sv_SE": "", "th_TH": "", "tr_TR": "", @@ -8938,7 +8938,7 @@ "no_NO": "", "pl_PL": "", "pt_BR": "", - "ru_RU": "", + "ru_RU": "1", "sv_SE": "", "th_TH": "", "tr_TR": "", @@ -8963,7 +8963,7 @@ "no_NO": "", "pl_PL": "", "pt_BR": "", - "ru_RU": "", + "ru_RU": "2", "sv_SE": "", "th_TH": "", "tr_TR": "", @@ -8988,7 +8988,7 @@ "no_NO": "", "pl_PL": "", "pt_BR": "", - "ru_RU": "", + "ru_RU": "3", "sv_SE": "", "th_TH": "", "tr_TR": "", @@ -9013,7 +9013,7 @@ "no_NO": "", "pl_PL": "", "pt_BR": "", - "ru_RU": "", + "ru_RU": "4", "sv_SE": "", "th_TH": "", "tr_TR": "", @@ -9038,7 +9038,7 @@ "no_NO": "", "pl_PL": "", "pt_BR": "", - "ru_RU": "", + "ru_RU": "5", "sv_SE": "", "th_TH": "", "tr_TR": "", @@ -9063,7 +9063,7 @@ "no_NO": "", "pl_PL": "", "pt_BR": "", - "ru_RU": "", + "ru_RU": "6", "sv_SE": "", "th_TH": "", "tr_TR": "", @@ -9088,7 +9088,7 @@ "no_NO": "", "pl_PL": "", "pt_BR": "", - "ru_RU": "", + "ru_RU": "7", "sv_SE": "", "th_TH": "", "tr_TR": "", @@ -9113,7 +9113,7 @@ "no_NO": "", "pl_PL": "", "pt_BR": "", - "ru_RU": "", + "ru_RU": "8", "sv_SE": "", "th_TH": "", "tr_TR": "", @@ -9138,7 +9138,7 @@ "no_NO": "", "pl_PL": "", "pt_BR": "", - "ru_RU": "", + "ru_RU": "9", "sv_SE": "", "th_TH": "", "tr_TR": "", @@ -9163,7 +9163,7 @@ "no_NO": "", "pl_PL": "", "pt_BR": "", - "ru_RU": "", + "ru_RU": "~", "sv_SE": "", "th_TH": "", "tr_TR": "", @@ -9188,7 +9188,7 @@ "no_NO": "", "pl_PL": "", "pt_BR": "", - "ru_RU": "", + "ru_RU": "`", "sv_SE": "", "th_TH": "", "tr_TR": "", @@ -9213,7 +9213,7 @@ "no_NO": "", "pl_PL": "", "pt_BR": "", - "ru_RU": "", + "ru_RU": "-", "sv_SE": "", "th_TH": "", "tr_TR": "", @@ -9238,7 +9238,7 @@ "no_NO": "", "pl_PL": "", "pt_BR": "", - "ru_RU": "", + "ru_RU": "+", "sv_SE": "", "th_TH": "", "tr_TR": "", @@ -9263,7 +9263,7 @@ "no_NO": "", "pl_PL": "", "pt_BR": "", - "ru_RU": "", + "ru_RU": "[", "sv_SE": "", "th_TH": "", "tr_TR": "", @@ -9288,7 +9288,7 @@ "no_NO": "", "pl_PL": "", "pt_BR": "", - "ru_RU": "", + "ru_RU": "]", "sv_SE": "", "th_TH": "", "tr_TR": "", @@ -9313,7 +9313,7 @@ "no_NO": "", "pl_PL": "", "pt_BR": "", - "ru_RU": "", + "ru_RU": ";", "sv_SE": "", "th_TH": "", "tr_TR": "", @@ -9363,7 +9363,7 @@ "no_NO": "", "pl_PL": "", "pt_BR": "", - "ru_RU": "", + "ru_RU": ",", "sv_SE": "", "th_TH": "", "tr_TR": "", @@ -9388,7 +9388,7 @@ "no_NO": "", "pl_PL": "", "pt_BR": "", - "ru_RU": "", + "ru_RU": ".", "sv_SE": "", "th_TH": "", "tr_TR": "", @@ -9413,7 +9413,7 @@ "no_NO": "", "pl_PL": "", "pt_BR": "", - "ru_RU": "", + "ru_RU": "/", "sv_SE": "", "th_TH": "", "tr_TR": "", @@ -9738,7 +9738,7 @@ "no_NO": "", "pl_PL": "", "pt_BR": "", - "ru_RU": "", + "ru_RU": "-", "sv_SE": "", "th_TH": "", "tr_TR": "", @@ -9763,7 +9763,7 @@ "no_NO": "", "pl_PL": "", "pt_BR": "", - "ru_RU": "", + "ru_RU": "+", "sv_SE": "", "th_TH": "", "tr_TR": "4", @@ -9788,7 +9788,7 @@ "no_NO": "Veiledning", "pl_PL": "", "pt_BR": "", - "ru_RU": "Кнопка Xbox", + "ru_RU": "Кнопка меню", "sv_SE": "Guide", "th_TH": "", "tr_TR": "Rehber", @@ -10288,7 +10288,7 @@ "no_NO": "Velg ett kallenavn", "pl_PL": "Wybierz pseudonim", "pt_BR": "Escolha um apelido", - "ru_RU": "Укажите никнейм", + "ru_RU": "Введите никнейм", "sv_SE": "Välj ett smeknamn", "th_TH": "เลือก ชื่อเล่น", "tr_TR": "Kullanıcı Adı Seç", @@ -10513,7 +10513,7 @@ "no_NO": "Kansellerer", "pl_PL": "", "pt_BR": "", - "ru_RU": "", + "ru_RU": "Отмена", "sv_SE": "Avbryter", "th_TH": "", "tr_TR": "", @@ -10538,7 +10538,7 @@ "no_NO": "Lukk", "pl_PL": "", "pt_BR": "", - "ru_RU": "", + "ru_RU": "Закрыть", "sv_SE": "Stäng", "th_TH": "", "tr_TR": "", @@ -10738,7 +10738,7 @@ "no_NO": "Se Profil", "pl_PL": "", "pt_BR": "", - "ru_RU": "", + "ru_RU": "Показать профиль", "sv_SE": "Visa profil", "th_TH": "", "tr_TR": "", @@ -10988,7 +10988,7 @@ "no_NO": "Automatisk", "pl_PL": "", "pt_BR": "Automático", - "ru_RU": "", + "ru_RU": "Авто", "sv_SE": "Automatiskt", "th_TH": "อัตโนมัติ", "tr_TR": "", @@ -11838,7 +11838,7 @@ "no_NO": "Vis endringslogg", "pl_PL": "", "pt_BR": "", - "ru_RU": "", + "ru_RU": "Показать список изменений", "sv_SE": "Visa ändringslogg", "th_TH": "", "tr_TR": "", @@ -12013,7 +12013,7 @@ "no_NO": "Omstart Kreves", "pl_PL": "Wymagane Ponowne Uruchomienie", "pt_BR": "Reinicialização necessária", - "ru_RU": "Требуется перезагрузка", + "ru_RU": "Требуется перезапуск", "sv_SE": "Omstart krävs", "th_TH": "จำเป็นต้องรีสตาร์ทเพื่อให้การอัพเดตสามารถให้งานได้", "tr_TR": "Yeniden Başlatma Gerekli", @@ -12038,7 +12038,7 @@ "no_NO": "Temaet har blitt lagret. En omstart kreves for å bruke temaet.", "pl_PL": "Motyw został zapisany. Aby zastosować motyw, konieczne jest ponowne uruchomienie.", "pt_BR": "O tema foi salvo. Uma reinicialização é necessária para aplicar o tema.", - "ru_RU": "Тема сохранена. Для применения темы требуется перезапуск.", + "ru_RU": "Тема сохранена. Для применения темы требуется выполнить перезапуск.", "sv_SE": "Temat har sparats. En omstart krävs för att verkställa ändringen.", "th_TH": "บันทึกธีมแล้ว จำเป็นต้องรีสตาร์ทเพื่อใช้ธีม", "tr_TR": "Tema kaydedildi. Temayı uygulamak için yeniden başlatma gerekiyor.", @@ -12063,7 +12063,7 @@ "no_NO": "Vil du starte på nytt", "pl_PL": "Czy chcesz uruchomić ponownie?", "pt_BR": "Deseja reiniciar?", - "ru_RU": "Хотите перезапустить", + "ru_RU": "Выполнить перезапуск?", "sv_SE": "Vill du starta om", "th_TH": "คุณต้องการรีสตาร์ทหรือไม่?", "tr_TR": "Yeniden başlatmak ister misiniz", @@ -12313,7 +12313,7 @@ "no_NO": "XCI Trimmervindu", "pl_PL": "", "pt_BR": "", - "ru_RU": "", + "ru_RU": "Окно триммера XCI", "sv_SE": "XCI-optimerare", "th_TH": "", "tr_TR": "", @@ -12438,7 +12438,7 @@ "no_NO": "", "pl_PL": "", "pt_BR": "", - "ru_RU": "", + "ru_RU": "{0}: {1}", "sv_SE": "", "th_TH": "", "tr_TR": "", @@ -12513,7 +12513,7 @@ "no_NO": "", "pl_PL": "API Amiibo", "pt_BR": "API Amiibo", - "ru_RU": "", + "ru_RU": "API Amiibo", "sv_SE": "Amiibo-API", "th_TH": "", "tr_TR": "", @@ -13038,7 +13038,7 @@ "no_NO": "En ugyldig Keys-fil ble funnet i {0}.", "pl_PL": "", "pt_BR": "", - "ru_RU": "", + "ru_RU": "В {0} были найдены некорректные ключи", "sv_SE": "En ogiltig nyckelfil hittades i {0}", "th_TH": "", "tr_TR": "", @@ -13063,7 +13063,7 @@ "no_NO": "Installere nøkler", "pl_PL": "", "pt_BR": "", - "ru_RU": "", + "ru_RU": "Установить ключи", "sv_SE": "Installera nycklar", "th_TH": "", "tr_TR": "", @@ -13088,7 +13088,7 @@ "no_NO": "Ny Keys-fil vil bli installert.", "pl_PL": "", "pt_BR": "", - "ru_RU": "", + "ru_RU": "Будут установлены новые ключи.", "sv_SE": "Ny nyckelfil kommer att installeras.", "th_TH": "", "tr_TR": "", @@ -13113,7 +13113,7 @@ "no_NO": "\n\nDette kan erstatte noen av de nåværende installerte nøklene.", "pl_PL": "", "pt_BR": "", - "ru_RU": "", + "ru_RU": "\n\nЭто действие может перезаписать установленные ключи.", "sv_SE": "\n\nDetta kan ersätta några av de redan installerade nycklarna.", "th_TH": "", "tr_TR": "", @@ -13138,7 +13138,7 @@ "no_NO": "\n\nVil du fortsette?", "pl_PL": "", "pt_BR": "", - "ru_RU": "", + "ru_RU": "\n\nХотите продолжить?", "sv_SE": "\n\nVill du fortsätta?", "th_TH": "", "tr_TR": "", @@ -13163,7 +13163,7 @@ "no_NO": "Installere nøkler...", "pl_PL": "", "pt_BR": "", - "ru_RU": "", + "ru_RU": "Установка ключей...", "sv_SE": "Installerar nycklar...", "th_TH": "", "tr_TR": "", @@ -13188,7 +13188,7 @@ "no_NO": "Ny Keys -fil installert.", "pl_PL": "", "pt_BR": "", - "ru_RU": "", + "ru_RU": "Новые ключи были успешно установлены.", "sv_SE": "Ny nyckelfil installerades.", "th_TH": "", "tr_TR": "", @@ -13538,7 +13538,7 @@ "no_NO": "For optimal ytelse er det anbefalt å deaktivere spor-logging. Ønsker du å deaktivere spor-logging nå?", "pl_PL": "Aby uzyskać optymalną wydajność, zaleca się wyłączenie rejestrowania śledzenia. Czy chcesz teraz wyłączyć rejestrowanie śledzenia?", "pt_BR": "Para melhor performance, é recomendável desabilitar os logs de depuração. Gostaria de desabilitar os logs de depuração agora?", - "ru_RU": "Для оптимальной производительности рекомендуется отключить ведение журнала отладки. Хотите отключить ведение журнала отладки?", + "ru_RU": "Для оптимальной производительности рекомендуется отключить ведение журнала отладки. Хотите отключить?", "sv_SE": "Det rekommenderas att inaktivera spårloggning för optimal prestanda. Vill du inaktivera spårloggning nu?", "th_TH": "เพื่อประสิทธิภาพสูงสุด ขอแนะนำให้ปิดใช้งานการบันทึกการติดตาม คุณต้องการปิดใช้การบันทึกการติดตามตอนนี้หรือไม่?", "tr_TR": "En iyi performans için trace loglama'nın devre dışı bırakılması tavsiye edilir. Trace loglama seçeneğini şimdi devre dışı bırakmak ister misiniz?", @@ -13713,7 +13713,7 @@ "no_NO": "Ryujinx må startes på nytt etter at dette alternativet er endret slik at det tas i bruk helt. Avhengig av plattformen din, må du kanskje manuelt skru av driveren's egen flertråder når du bruker Ryujinx's.", "pl_PL": "Ryujinx musi zostać ponownie uruchomiony po zmianie tej opcji, aby działał w pełni. W zależności od platformy może być konieczne ręczne wyłączenie sterownika wielowątkowości podczas korzystania z Ryujinx.", "pt_BR": "Ryujinx precisa ser reiniciado após mudar essa opção para que ela tenha efeito. Dependendo da sua plataforma, pode ser preciso desabilitar o multithreading do driver de vídeo quando usar o Ryujinx.", - "ru_RU": "Для применения этой настройки необходимо перезапустить Ryujinx. В зависимости от используемой вами операционной системы вам может потребоваться вручную отключить многопоточность драйвера при использовании Ryujinx.", + "ru_RU": "Для применения этой настройки необходимо перезапустить Ryujinx. В зависимости от используемой вами операционной системы, вам может потребоваться вручную отключить многопоточность драйвера при использовании Ryujinx.", "sv_SE": "Ryujinx måste startas om efter att denna inställning ändras för att verkställa den. Beroende på din plattform så kanske du måste manuellt inaktivera drivrutinens egna multithreading när Ryujinx används.", "th_TH": "Ryujinx ต้องรีสตาร์ทหลังจากเปลี่ยนตัวเลือกนี้จึงจะใช้งานได้อย่างสมบูรณ์ คุณอาจต้องปิดการใช้งาน มัลติเธรด ของไดรเวอร์ของคุณด้วยตนเองเมื่อใช้ Ryujinx ทั้งนี้ขึ้นอยู่กับแพลตฟอร์มของคุณ", "tr_TR": "Bu seçeneğin tamamen uygulanması için Ryujinx'in kapatıp açılması gerekir. Kullandığınız işletim sistemine bağlı olarak, Ryujinx'in multithreading'ini kullanırken driver'ınızın multithreading seçeneğini kapatmanız gerekebilir.", @@ -13788,7 +13788,7 @@ "no_NO": "Funksjoner", "pl_PL": "Funkcje", "pt_BR": "Recursos", - "ru_RU": "Функции & Улучшения", + "ru_RU": "Функции", "sv_SE": "Funktioner", "th_TH": "คุณสมบัติ", "tr_TR": "Özellikler", @@ -14038,7 +14038,7 @@ "no_NO": "Klikk for å åpne Ryujinx nettsiden i din standardnettleser.", "pl_PL": "Kliknij, aby otworzyć stronę Ryujinx w domyślnej przeglądarce.", "pt_BR": "Clique para abrir o site do Ryujinx no seu navegador padrão.", - "ru_RU": "Нажмите, чтобы открыть веб-сайт Ryujinx", + "ru_RU": "Нажмите, чтобы открыть веб-сайт Ryujinx в браузере", "sv_SE": "Klicka för att öppna Ryujinx webbsida i din webbläsare.", "th_TH": "คลิกเพื่อเปิดเว็บไซต์ Ryujinx บนเบราว์เซอร์เริ่มต้นของคุณ", "tr_TR": "Ryujinx'in websitesini varsayılan tarayıcınızda açmak için tıklayın.", @@ -14188,7 +14188,7 @@ "no_NO": "Ryujinx er en emulator for Nintendo SwitchTM.\nVennligst støtt oss på Patreon.\nFå alle de siste nyhetene på vår Twitter eller Discord.\nUtviklere som er interessert i å bidra kan finne ut mer på GitHub eller Discord.", "pl_PL": "", "pt_BR": "", - "ru_RU": "", + "ru_RU": "Ryujinx - это эмулятор для Nintendo Switch™.\nПолучайте все последние новости разработки в нашем Discord.\nРазработчики, заинтересованные в участии, могут узнать больше на нашем GitHub или Discord.", "sv_SE": "Ryujinx är en emulator för Nintendo Switch™.\nFå de senaste nyheterna via vår Discord.\nUtvecklare som är intresserade att bidra kan hitta mer info på vår GitHub eller Discord.", "th_TH": "", "tr_TR": "", @@ -14238,7 +14238,7 @@ "no_NO": "Tidligere vedlikeholdt av:", "pl_PL": "", "pt_BR": "", - "ru_RU": "", + "ru_RU": "Поддержка:", "sv_SE": "Underhölls tidigare av:", "th_TH": "", "tr_TR": "", @@ -14788,7 +14788,7 @@ "no_NO": "Funksjoner & forbedringer", "pl_PL": "Funkcje i Ulepszenia", "pt_BR": "Recursos & Melhorias", - "ru_RU": "Функции", + "ru_RU": "Функции и улучшения", "sv_SE": "Funktioner och förbättringar", "th_TH": "คุณสมบัติ และ การเพิ่มประสิทธิภาพ", "tr_TR": "Özellikler & İyileştirmeler", @@ -14938,7 +14938,7 @@ "no_NO": "Angi en autoload-mappe som skal legges til i listen", "pl_PL": "", "pt_BR": "Insira um diretório de carregamento automático para adicionar à lista", - "ru_RU": "", + "ru_RU": "Введите папку автозагрузки для добавления в список", "sv_SE": "Ange en katalog att automatiskt läsa in till listan", "th_TH": "ป้อนไดเร็กทอรีสำหรับโหลดอัตโนมัติเพื่อเพิ่มลงในรายการ", "tr_TR": "", @@ -14963,7 +14963,7 @@ "no_NO": "Legg til en autoload-mappe i listen", "pl_PL": "", "pt_BR": "Adicionar um diretório de carregamento automático à lista", - "ru_RU": "", + "ru_RU": "Добавить папку автозагрузки в список", "sv_SE": "Lägg till en katalog att automatiskt läsa in till listan", "th_TH": "ป้อนไดเร็กทอรีสำหรับโหลดอัตโนมัติเพื่อเพิ่มลงในรายการ", "tr_TR": "", @@ -14988,7 +14988,7 @@ "no_NO": "Fjern valgt autoload-mappe", "pl_PL": "", "pt_BR": "Remover o diretório de carregamento automático selecionado", - "ru_RU": "", + "ru_RU": "Убрать папку автозагрузки из списка", "sv_SE": "Ta bort markerad katalog för automatisk inläsning", "th_TH": "ลบไดเรกทอรีสำหรับโหลดอัตโนมัติที่เลือก", "tr_TR": "", @@ -15038,7 +15038,7 @@ "no_NO": "Bane til egendefinert GUI-tema", "pl_PL": "Ścieżka do niestandardowego motywu GUI", "pt_BR": "Diretório do tema customizado", - "ru_RU": "Путь к пользовательской теме для интерфейса", + "ru_RU": "Путь к пользовательской теме интерфейса", "sv_SE": "Sökväg till anpassat gränssnittstema", "th_TH": "ไปยังที่เก็บไฟล์ธีม GUI แบบกำหนดเอง", "tr_TR": "Özel arayüz temasının yolu", @@ -15088,7 +15088,7 @@ "no_NO": "Forankret modus gjør at systemet oppføre seg som en forankret Nintendo Switch. Dette forbedrer grafikkkvaliteten i de fleste spill. Motsatt vil deaktivering av dette gjøre at systemet oppføre seg som en håndholdt Nintendo Switch, noe som reduserer grafikkkvaliteten.\n\nKonfigurer spiller 1 kontroller hvis du planlegger å bruke forankret modus; konfigurer håndholdte kontroller hvis du planlegger å bruke håndholdte modus.\n\nLa PÅ hvis du er usikker.", "pl_PL": "Tryb Zadokowany sprawia, że emulowany system zachowuje się jak zadokowany Nintendo Switch. Poprawia to jakość grafiki w większości gier. I odwrotnie, wyłączenie tej opcji sprawi, że emulowany system będzie zachowywał się jak przenośny Nintendo Switch, zmniejszając jakość grafiki.\n\nSkonfiguruj sterowanie gracza 1, jeśli planujesz używać trybu Zadokowanego; Skonfiguruj sterowanie przenośne, jeśli planujesz używać trybu przenośnego.\n\nPozostaw WŁĄCZONY, jeśli nie masz pewności.", "pt_BR": "O modo TV faz o sistema emulado se comportar como um Nintendo Switch na TV, o que melhora a fidelidade gráfica na maioria dos jogos. Por outro lado, desativar essa opção fará o sistema emulado se comportar como um Nintendo Switch portátil, reduzindo a qualidade gráfica.\n\nConfigure os controles do jogador 1 se planeja usar o modo TV; configure os controles de portátil se planeja usar o modo Portátil.\n\nMantenha ativado se estiver em dúvida.", - "ru_RU": "\"Стационарный\" режим запускает эмулятор, как если бы Nintendo Switch находилась в доке, что улучшает графику и разрешение в большинстве игр. И наоборот, при отключении этого режима эмулятор будет запускать игры в \"Портативном\" режиме, снижая качество графики.\n\nНастройте управление для Игрока 1 если планируете использовать в \"Стационарном\" режиме; настройте портативное управление если планируете использовать эмулятор в \"Портативном\" режиме.\n\nРекомендуется оставить включенным.", + "ru_RU": "\"Стационарный\" режим запускает эмулятор, как если бы Nintendo Switch находилась в доке, что улучшает графику и разрешение в большинстве игр. И наоборот, при отключении этого режима эмулятор будет запускать игры в \"Портативном\" режиме, снижая качество графики.\n\nНастройте управление для Игрока 1 если планируете использовать эмулятор в \"Стационарном\" режиме; настройте портативное управление если планируете использовать эмулятор в \"Портативном\" режиме.\n\nРекомендуется оставить включенным.", "sv_SE": "Dockat läge gör att det emulerade systemet beter sig som en dockad Nintendo Switch. Detta förbättrar grafiken i de flesta spel. Inaktiveras detta så kommer det emulerade systemet att bete sig som en handhållen Nintendo Switch, vilket reducerar grafikkvaliteten.\n\nKonfigurera kontrollen för Spelare 1 om du planerar att använda dockat läge; konfigurera handhållna kontroller om du planerar att använda handhållet läge.\n\nLämna PÅ om du är osäker.", "th_TH": "ด็อกโหมด ทำให้ระบบจำลองการทำงานเสมือน Nintendo ที่กำลังเชื่อมต่ออยู่ด็อก สิ่งนี้จะปรับปรุงความเสถียรภาพของกราฟิกในเกมส่วนใหญ่ ในทางกลับกัน การปิดใช้จะทำให้ระบบจำลองทำงานเหมือนกับ Nintendo Switch แบบพกพา ส่งผลให้คุณภาพกราฟิกลดลง\n\nแนะนำกำหนดค่าควบคุมของผู้เล่น 1 หากวางแผนที่จะใช้ด็อกโหมด กำหนดค่าการควบคุมแบบ แฮนด์เฮลด์ หากวางแผนที่จะใช้โหมดแฮนด์เฮลด์\n\nเปิดทิ้งไว้หากคุณไม่แน่ใจ", "tr_TR": "Docked modu emüle edilen sistemin yerleşik Nintendo Switch gibi davranmasını sağlar. Bu çoğu oyunda grafik kalitesini arttırır. Diğer yandan, bu seçeneği devre dışı bırakmak emüle edilen sistemin portatif Ninendo Switch gibi davranmasını sağlayıp grafik kalitesini düşürür.\n\nDocked modu kullanmayı düşünüyorsanız 1. Oyuncu kontrollerini; Handheld modunu kullanmak istiyorsanız portatif kontrollerini konfigüre edin.\n\nEmin değilseniz aktif halde bırakın.", @@ -15163,7 +15163,7 @@ "no_NO": "Endre systemregion", "pl_PL": "Zmień Region Systemu", "pt_BR": "Mudar a região do sistema", - "ru_RU": "Сменяет регион прошивки", + "ru_RU": "Сменяет регион системы", "sv_SE": "Ändra systemets region", "th_TH": "เปลี่ยนภูมิภาคของระบบ", "tr_TR": "Sistem Bölgesini Değiştir", @@ -15188,7 +15188,7 @@ "no_NO": "Endre systemspråk", "pl_PL": "Zmień język systemu", "pt_BR": "Mudar o idioma do sistema", - "ru_RU": "Меняет язык прошивки", + "ru_RU": "Меняет язык системы", "sv_SE": "Ändra systemets språk", "th_TH": "เปลี่ยนภาษาของระบบ", "tr_TR": "Sistem Dilini Değiştir", @@ -15213,7 +15213,7 @@ "no_NO": "Endre systemtidssone", "pl_PL": "Zmień Strefę Czasową Systemu", "pt_BR": "Mudar o fuso-horário do sistema", - "ru_RU": "Меняет часовой пояс прошивки", + "ru_RU": "Меняет часовой пояс системы", "sv_SE": "Ändra systemets tidszon", "th_TH": "เปลี่ยนโซนเวลาของระบบ", "tr_TR": "Sistem Saat Dilimini Değiştir", @@ -15238,7 +15238,7 @@ "no_NO": "Endre systemtid", "pl_PL": "Zmień czas systemowy", "pt_BR": "Mudar a hora do sistema", - "ru_RU": "Меняет системное время прошивки", + "ru_RU": "Меняет системное время системы", "sv_SE": "Ändra systemtid", "th_TH": "เปลี่ยนเวลาของระบบ", "tr_TR": "Sistem Saatini Değiştir", @@ -15263,7 +15263,7 @@ "no_NO": "", "pl_PL": "", "pt_BR": "", - "ru_RU": "", + "ru_RU": "Повторно синхронизирует системное время, чтобы оно соответствовало текущей дате и времени вашего компьютера.\n\nЭто не активная настройка, она все еще может рассинхронизироваться; в этом случае просто нажмите эту кнопку еще раз.", "sv_SE": "Återsynkronisera systemtiden för att matcha din dators aktuella datum och tid.\n\nDetta är inte en aktiv inställning och den kan tappa synken och om det händer så kan du klicka på denna knapp igen.", "th_TH": "", "tr_TR": "", @@ -15338,7 +15338,7 @@ "no_NO": "Last inn PPTC med en tredjedel av antall kjerner.", "pl_PL": "", "pt_BR": "Carregar o PPTC usando um terço da quantidade de núcleos.", - "ru_RU": "", + "ru_RU": "Загрузить PPTC, используя треть от количества ядер.", "sv_SE": "Läs in PPTC med en tredjedel av mängden kärnor.", "th_TH": "โหลด PPTC โดยใช้หนึ่งในสามของจำนวนคอร์", "tr_TR": "", @@ -16163,7 +16163,7 @@ "no_NO": "Åpne en filutforsker for å velge en eller flere mapper å laste inn DLC fra", "pl_PL": "", "pt_BR": "", - "ru_RU": "", + "ru_RU": "Открывает проводник, для выбора одной или нескольких папок для массовой загрузки DLC", "sv_SE": "Öppna en filutforskare för att välja en eller flera mappar att läsa in alla DLC från", "th_TH": "เปิดตัวสำรวจไฟล์เพื่อเลือกหนึ่งโฟลเดอร์ขึ้นไปเพื่อโหลด DLC จำนวนมาก", "tr_TR": "", @@ -16188,7 +16188,7 @@ "no_NO": "Åpne en filutforsker for å velge en eller flere mapper som du vil laste inn titteloppdateringer fra", "pl_PL": "", "pt_BR": "Abra o explorador de arquivos para selecionar uma ou mais pastas e carregar atualizações de jogo em massa.", - "ru_RU": "", + "ru_RU": "Открывает проводник, чтобы выбрать одну или несколько папок для массовой загрузки обновлений приложений", "sv_SE": "Öppna en filutforskare för att välja en eller flera mappar att läsa in alla titeluppdateringar från", "th_TH": "เปิดตัวสำรวจไฟล์เพื่อเลือกหนึ่งโฟลเดอร์ขึ้นไปเพื่อโหลดไฟล์อัปเดตจำนวนมาก", "tr_TR": "", @@ -16213,7 +16213,7 @@ "no_NO": "Åpne Ryujinx filsystem-mappen", "pl_PL": "Otwórz folder systemu plików Ryujinx", "pt_BR": "Abre o diretório do sistema de arquivos do Ryujinx", - "ru_RU": "Открывает папку с файлами Ryujinx. ", + "ru_RU": "Открывает папку с файлами Ryujinx", "sv_SE": "Öppna Ryujinx-filsystemsmappen", "th_TH": "เปิดโฟลเดอร์ระบบไฟล์ Ryujinx", "tr_TR": "Ryujinx dosya sistem klasörünü açar", @@ -16338,7 +16338,7 @@ "no_NO": "Stopp emuleringen av dette spillet og gå tilbake til spill valg", "pl_PL": "Zatrzymaj emulację bieżącej gry i wróć do wyboru gier", "pt_BR": "Parar emulação do jogo atual e voltar a seleção de jogos", - "ru_RU": "Остановка эмуляции текущей игры и возврат к списку игр", + "ru_RU": "Остановка эмуляции текущей игры с последующим возвратом к списку игр", "sv_SE": "Stoppa emulering av aktuellt spel och återgå till spelväljaren", "th_TH": "หยุดการจำลองของเกมที่เปิดอยู่ในปัจจุบันและกลับไปยังการเลือกเกม", "tr_TR": "Oynanmakta olan oyunun emülasyonunu durdurup oyun seçimine geri döndürür", @@ -16363,7 +16363,7 @@ "no_NO": "Se etter oppdateringer til Ryujinx", "pl_PL": "Sprawdź aktualizacje Ryujinx", "pt_BR": "Verificar por atualizações para o Ryujinx", - "ru_RU": "Проверяет наличие обновлений для Ryujinx", + "ru_RU": "Проверяет наличие обновлений Ryujinx", "sv_SE": "Leta efter uppdateringar för Ryujinx", "th_TH": "ตรวจสอบอัปเดตของ Ryujinx", "tr_TR": "Ryujinx güncellemelerini denetlemeyi sağlar", @@ -16913,7 +16913,7 @@ "no_NO": "Prosessor modus", "pl_PL": "Pamięć CPU", "pt_BR": "Memória da CPU", - "ru_RU": "Режим процессора", + "ru_RU": "Режим работы процессора", "sv_SE": "CPU-läge", "th_TH": "โหมดซีพียู", "tr_TR": "CPU Hafızası", @@ -17438,7 +17438,7 @@ "no_NO": "Versjon {0} - {1}", "pl_PL": "Wersja {0} - {1}", "pt_BR": "Versão {0} - {1}", - "ru_RU": "Version {0} - {1}", + "ru_RU": "Версия {0} - {1}", "sv_SE": "Version {0} - {1}", "th_TH": "เวอร์ชั่น {0} - {1}", "tr_TR": "Sürüm {0} - {1}", @@ -17463,7 +17463,7 @@ "no_NO": "Pakket: Versjon {0}", "pl_PL": "", "pt_BR": "Empacotado: Versão {0}", - "ru_RU": "", + "ru_RU": "Баднл: Версия {0}", "sv_SE": "Bundlad: Version {0}", "th_TH": "Bundled: เวอร์ชั่น {0}", "tr_TR": "", @@ -17488,7 +17488,7 @@ "no_NO": "Pakket:", "pl_PL": "", "pt_BR": "Empacotado:", - "ru_RU": "", + "ru_RU": "Бандл:", "sv_SE": "Bundlad:", "th_TH": "", "tr_TR": "", @@ -17513,7 +17513,7 @@ "no_NO": "Delvis", "pl_PL": "", "pt_BR": "", - "ru_RU": "", + "ru_RU": "Частично", "sv_SE": "Delvis", "th_TH": "", "tr_TR": "", @@ -17538,7 +17538,7 @@ "no_NO": "Ikke trimmet", "pl_PL": "", "pt_BR": "", - "ru_RU": "", + "ru_RU": "Не обрезан", "sv_SE": "Inte optimerad", "th_TH": "", "tr_TR": "", @@ -17563,7 +17563,7 @@ "no_NO": "Trimmet", "pl_PL": "", "pt_BR": "", - "ru_RU": "", + "ru_RU": "Обрезан", "sv_SE": "Optimerad", "th_TH": "", "tr_TR": "", @@ -17588,7 +17588,7 @@ "no_NO": "(Mislyktes)", "pl_PL": "", "pt_BR": "", - "ru_RU": "", + "ru_RU": "(Ошибка)", "sv_SE": "(misslyckades)", "th_TH": "", "tr_TR": "", @@ -17613,7 +17613,7 @@ "no_NO": "Spare {0:n0} Mb", "pl_PL": "", "pt_BR": "", - "ru_RU": "", + "ru_RU": "Сохранить {0:n0} Мб", "sv_SE": "Spara {0:n0} Mb", "th_TH": "", "tr_TR": "", @@ -17638,7 +17638,7 @@ "no_NO": "Spart {0:n0} Mb", "pl_PL": "", "pt_BR": "", - "ru_RU": "", + "ru_RU": "Сохранено {0:n0} Мб", "sv_SE": "Sparade {0:n0} Mb", "th_TH": "", "tr_TR": "", @@ -17813,7 +17813,7 @@ "no_NO": "Dialogboks for kabinett", "pl_PL": "", "pt_BR": "", - "ru_RU": "", + "ru_RU": "Сообщение кабинета", "sv_SE": "Cabinet-dialog", "th_TH": "", "tr_TR": "", @@ -17838,7 +17838,7 @@ "no_NO": "Skriv inn Amiiboens nye navn", "pl_PL": "", "pt_BR": "", - "ru_RU": "", + "ru_RU": "Введите новое имя вашего Amiibo", "sv_SE": "Ange nya namnet för din Amiibo", "th_TH": "", "tr_TR": "", @@ -17863,7 +17863,7 @@ "no_NO": "Vennligst skann Amiiboene dine nå.", "pl_PL": "", "pt_BR": "", - "ru_RU": "", + "ru_RU": "Пожалуйста, отсканируйте свой Amiibo.", "sv_SE": "Skanna din Amiibo nu.", "th_TH": "", "tr_TR": "", @@ -18351,25 +18351,25 @@ "ID": "CompilingPPTC", "Translations": { "ar_SA": "تجميع الـ‫(PPTC)", - "de_DE": "PTC wird kompiliert", - "el_GR": "Μεταγλώττιση του PTC", - "en_US": "Compiling PTC", - "es_ES": "Compilando PTC", - "fr_FR": "Compilation PTC", - "he_IL": "קימפול PTC", + "de_DE": "PPTC wird kompiliert", + "el_GR": "Μεταγλώττιση του PPTC", + "en_US": "Compiling PPTC", + "es_ES": "Compilando PPTC", + "fr_FR": "Compilation PPTC", + "he_IL": "קימפול PPTC", "it_IT": "Compilazione PPTC", - "ja_JP": "PTC をコンパイル中", - "ko_KR": "PTC 컴파일", - "no_NO": "Sammensetter PTC", - "pl_PL": "Kompilowanie PTC", - "pt_BR": "Compilando PTC", - "ru_RU": "Компиляция PTC", - "sv_SE": "Kompilerar PTC", - "th_TH": "กำลังคอมไพล์ PTC", - "tr_TR": "PTC Derleniyor", - "uk_UA": "Компіляція PTC", + "ja_JP": "PPTC をコンパイル中", + "ko_KR": "PPTC 컴파일", + "no_NO": "Sammensetter PPTC", + "pl_PL": "Kompilowanie PPTC", + "pt_BR": "Compilando PPTC", + "ru_RU": "Компиляция PPTC", + "sv_SE": "Kompilerar PPTC", + "th_TH": "กำลังคอมไพล์ PPTC", + "tr_TR": "PPTC Derleniyor", + "uk_UA": "Компіляція PPTC", "zh_CN": "编译 PPTC 缓存中", - "zh_TW": "正在編譯 PTC" + "zh_TW": "正在編譯 PPTC" } }, { @@ -18588,7 +18588,7 @@ "no_NO": "Skjermbilde", "pl_PL": "Zrzut Ekranu:", "pt_BR": "Captura de tela:", - "ru_RU": "Сделать скриншот:", + "ru_RU": "Скриншот:", "sv_SE": "Skärmbild:", "th_TH": "ภาพหน้าจอ:", "tr_TR": "Ekran Görüntüsü Al:", @@ -18813,7 +18813,7 @@ "no_NO": "", "pl_PL": "", "pt_BR": "", - "ru_RU": "", + "ru_RU": "Amiibo", "sv_SE": "Amiibo", "th_TH": "", "tr_TR": "", @@ -18988,7 +18988,7 @@ "no_NO": "Kontroller og trim XCI-filen", "pl_PL": "", "pt_BR": "", - "ru_RU": "", + "ru_RU": "Проверить и обрезать XCI файл", "sv_SE": "Kontrollera och optimera XCI-filer", "th_TH": "", "tr_TR": "", @@ -19013,7 +19013,7 @@ "no_NO": "Denne funksjonen kontrollerer først hvor mye plass som er ledig, og trimmer deretter XCI-filen for å spare diskplass.", "pl_PL": "", "pt_BR": "", - "ru_RU": "", + "ru_RU": "Эта функция сначала проверит наличие пустого пространства, а затем обрежет файл XCI, чтобы сэкономить место на диске.", "sv_SE": "Denna funktion kommer först att kontrollera ledigt utrymme och sedan optimera XCI-filen för att spara diskutrymme.", "th_TH": "", "tr_TR": "", @@ -19038,7 +19038,7 @@ "no_NO": "Nåværende filstørrelse: 0:n MB\nSpilldatastørrelse: {1:n} MB\nDiskplassbesparelse: {2:n} MB", "pl_PL": "", "pt_BR": "", - "ru_RU": "", + "ru_RU": "Размер текущего файла: {0:n} Мб\nРазмер игровых данных: {1:n} MB\nЭкономия дискового пространства: {2:n} Мб", "sv_SE": "Aktuell filstorlek: {0:n} MB\nStorlek för speldata: {1:n} MB\nSparat diskutrymme: {2:n} MB", "th_TH": "", "tr_TR": "", @@ -19063,7 +19063,7 @@ "no_NO": "XCI-filen trenger ikke å trimmes. Sjekk loggene for mer informasjon", "pl_PL": "", "pt_BR": "", - "ru_RU": "", + "ru_RU": "Файл XCI не нуждается в обрезке. Проверьте логи для получения более подробной информации", "sv_SE": "XCI-filen behöver inte optimeras. Kontrollera loggen för mer information", "th_TH": "", "tr_TR": "", @@ -19088,7 +19088,7 @@ "no_NO": "XCI-filen kan ikke trimmes. Sjekk loggene for mer informasjon", "pl_PL": "", "pt_BR": "", - "ru_RU": "", + "ru_RU": "XCI файл не может быть обрезан. Проверьте логи для получения более подробной информации", "sv_SE": "XCI-filen kan inte avoptimeras. Kontrollera loggen för mer information", "th_TH": "", "tr_TR": "", @@ -19113,7 +19113,7 @@ "no_NO": "XCI-filen er skrivebeskyttet og kunne ikke gjøres skrivbar. Sjekk loggene for mer informasjon", "pl_PL": "", "pt_BR": "", - "ru_RU": "", + "ru_RU": "Файл XCI доступен только для чтения и его невозможно сделать доступным для записи. Проверьте логи для получения более подробной информации", "sv_SE": "XCI-filen är skrivskyddad och kunde inte göras skrivbar. Kontrollera loggen för mer information", "th_TH": "", "tr_TR": "", @@ -19138,7 +19138,7 @@ "no_NO": "XCI File har endret størrelse siden den ble skannet. Kontroller at det ikke skrives til filen, og prøv på nytt.", "pl_PL": "", "pt_BR": "", - "ru_RU": "", + "ru_RU": "Файл XCI изменился в размере после сканирования. Проверьте, не производится ли запись в этот файл, и повторите попытку.", "sv_SE": "XCI-filen har ändrats i storlek sedan den lästes av. Kontrollera att filen inte skrivs till och försök igen.", "th_TH": "", "tr_TR": "", @@ -19163,7 +19163,7 @@ "no_NO": "XCI-filen har data i ledig plass, og det er ikke trygt å trimme den", "pl_PL": "", "pt_BR": "", - "ru_RU": "", + "ru_RU": "XCI файл содержит данные в пустой зоне, обрезать его небезопасно", "sv_SE": "XCI-filen har data i det lediga utrymmet. Den är inte säker att optimera", "th_TH": "", "tr_TR": "", @@ -19188,7 +19188,7 @@ "no_NO": "XCI-filen inneholder ugyldige data. Sjekk loggene for ytterligere detaljer", "pl_PL": "", "pt_BR": "", - "ru_RU": "", + "ru_RU": "Файл XCI содержит недопустимые данные. Проверьте логи для получения дополнительной информации", "sv_SE": "XCI-filen innehåller ogiltig data. Kontrollera loggen för mer information", "th_TH": "", "tr_TR": "", @@ -19213,7 +19213,7 @@ "no_NO": "XCI-filen kunne ikke åpnes for skriving. Sjekk loggene for ytterligere detaljer", "pl_PL": "", "pt_BR": "", - "ru_RU": "", + "ru_RU": "XCI файл не удалось открыть для записи. Проверьте логи для получения дополнительной информации", "sv_SE": "XCI-filen kunde inte öppnas för skrivning. Kontrollera loggen för mer information", "th_TH": "", "tr_TR": "", @@ -19238,7 +19238,7 @@ "no_NO": "Trimming av XCI-filen mislyktes", "pl_PL": "", "pt_BR": "", - "ru_RU": "", + "ru_RU": "Обрезка файла XCI не удалась", "sv_SE": "Optimering av XCI-filen misslyckades", "th_TH": "", "tr_TR": "", @@ -19263,7 +19263,7 @@ "no_NO": "Operasjonen ble avlyst", "pl_PL": "", "pt_BR": "", - "ru_RU": "", + "ru_RU": "Операция была отменена", "sv_SE": "Åtgärden avbröts", "th_TH": "", "tr_TR": "", @@ -19288,7 +19288,7 @@ "no_NO": "Ingen operasjon ble utført", "pl_PL": "", "pt_BR": "", - "ru_RU": "", + "ru_RU": "Операция не была проведена", "sv_SE": "Ingen åtgärd genomfördes", "th_TH": "", "tr_TR": "", @@ -19438,7 +19438,7 @@ "no_NO": "XCI File Trimmer", "pl_PL": "", "pt_BR": "", - "ru_RU": "", + "ru_RU": "Уменьшение размера XCI файлов", "sv_SE": "Optimera XCI-filer", "th_TH": "", "tr_TR": "", @@ -19463,7 +19463,7 @@ "no_NO": "{0} av {1} Valgte tittel(er)", "pl_PL": "", "pt_BR": "", - "ru_RU": "", + "ru_RU": "{0} из {1} файла(ов) выбрано", "sv_SE": "{0} av {1} spel markerade", "th_TH": "", "tr_TR": "", @@ -19488,7 +19488,7 @@ "no_NO": "{0} av {1} Tittel(er) valgt ({2} vises)", "pl_PL": "", "pt_BR": "", - "ru_RU": "", + "ru_RU": "{0} из {1} файла(ов) выбрано ({2} показано)", "sv_SE": "{0} av {1} spel markerade ({2} visade)", "th_TH": "", "tr_TR": "", @@ -19513,7 +19513,7 @@ "no_NO": "Trimming av {0} tittel(er)...", "pl_PL": "", "pt_BR": "", - "ru_RU": "", + "ru_RU": "Обрезка {0} файла(ов)...", "sv_SE": "Optimerar {0} spel...", "th_TH": "", "tr_TR": "", @@ -19538,7 +19538,7 @@ "no_NO": "Untrimming {0} Tittel(er)...", "pl_PL": "", "pt_BR": "", - "ru_RU": "", + "ru_RU": "Отмена обрезки {0} файла(ов)...", "sv_SE": "Avoptimerar {0} spel...", "th_TH": "", "tr_TR": "", @@ -19563,7 +19563,7 @@ "no_NO": "Mislyktes", "pl_PL": "", "pt_BR": "", - "ru_RU": "", + "ru_RU": "Ошибка", "sv_SE": "Misslyckades", "th_TH": "", "tr_TR": "", @@ -19588,7 +19588,7 @@ "no_NO": "Potensielle besparelser", "pl_PL": "", "pt_BR": "", - "ru_RU": "", + "ru_RU": "Потенциально освобождено места", "sv_SE": "Möjlig besparning", "th_TH": "", "tr_TR": "", @@ -19613,7 +19613,7 @@ "no_NO": "Faktiske besparelser", "pl_PL": "", "pt_BR": "", - "ru_RU": "", + "ru_RU": "Реально освобождено места", "sv_SE": "Faktisk besparning", "th_TH": "", "tr_TR": "", @@ -19638,7 +19638,7 @@ "no_NO": "", "pl_PL": "", "pt_BR": "", - "ru_RU": "", + "ru_RU": "{0:n0} Мб", "sv_SE": "{0:n0} Mb", "th_TH": "", "tr_TR": "", @@ -19663,7 +19663,7 @@ "no_NO": "Velg vist", "pl_PL": "", "pt_BR": "", - "ru_RU": "", + "ru_RU": "Выбрать то что показано", "sv_SE": "Markera visade", "th_TH": "", "tr_TR": "", @@ -19688,7 +19688,7 @@ "no_NO": "Opphev valg av Vist", "pl_PL": "", "pt_BR": "", - "ru_RU": "", + "ru_RU": "Отменить выбор показанного", "sv_SE": "Avmarkera visade", "th_TH": "", "tr_TR": "", @@ -19713,7 +19713,7 @@ "no_NO": "Tittel", "pl_PL": "", "pt_BR": "", - "ru_RU": "", + "ru_RU": "Приложение", "sv_SE": "Titel", "th_TH": "", "tr_TR": "", @@ -19738,7 +19738,7 @@ "no_NO": "Plassbesparelser", "pl_PL": "", "pt_BR": "", - "ru_RU": "", + "ru_RU": "Сохранение места на диске", "sv_SE": "Utrymmesbesparning", "th_TH": "", "tr_TR": "", @@ -19763,7 +19763,7 @@ "no_NO": "", "pl_PL": "", "pt_BR": "", - "ru_RU": "", + "ru_RU": "Обрезать", "sv_SE": "Optimera", "th_TH": "", "tr_TR": "", @@ -19788,7 +19788,7 @@ "no_NO": "Utrim", "pl_PL": "", "pt_BR": "", - "ru_RU": "", + "ru_RU": "Отмена обрезки", "sv_SE": "Avoptimera", "th_TH": "", "tr_TR": "", @@ -19813,7 +19813,7 @@ "no_NO": "{0} ny(e) oppdatering(er) lagt til", "pl_PL": "", "pt_BR": "{0} nova(s) atualização(ões) adicionada(s)", - "ru_RU": "", + "ru_RU": "Добавлено {0} новых обновлений", "sv_SE": "{0} nya uppdatering(ar) lades till", "th_TH": "{0} อัพเดตที่เพิ่มมาใหม่", "tr_TR": "", @@ -19838,7 +19838,7 @@ "no_NO": "Medfølgende oppdateringer kan ikke fjernes, bare deaktiveres.", "pl_PL": "", "pt_BR": "Atualizações incorporadas não podem ser removidas, apenas desativadas.", - "ru_RU": "", + "ru_RU": "Обновления бандлов не могут быть удалены, только отключены.", "sv_SE": "Bundlade uppdateringar kan inte tas bort, endast inaktiveras.", "th_TH": "แพ็คที่อัพเดตมาไม่สามารถลบทิ้งได้ สามารถปิดใช้งานได้เท่านั้น", "tr_TR": "", @@ -19913,7 +19913,7 @@ "no_NO": "Medfølgende DLC kan ikke fjernes, bare deaktiveres.", "pl_PL": "", "pt_BR": "DLCs incorporadas não podem ser removidas, apenas desativadas.", - "ru_RU": "", + "ru_RU": "DLC бандлов не могут быть удалены, только отключены.", "sv_SE": "Bundlade DLC kan inte tas bort, endast inaktiveras.", "th_TH": "แพ็ค DLC ไม่สามารถลบทิ้งได้ สามารถปิดใช้งานได้เท่านั้น", "tr_TR": "", @@ -19938,7 +19938,7 @@ "no_NO": "{0} Nedlastbare innhold(er)", "pl_PL": "", "pt_BR": "", - "ru_RU": "", + "ru_RU": "{0} доступных DLC", "sv_SE": "{0} DLC(er) tillgängliga", "th_TH": "", "tr_TR": "", @@ -19963,7 +19963,7 @@ "no_NO": "{0} nytt nedlastbart innhold lagt til", "pl_PL": "", "pt_BR": "{0} novo(s) conteúdo(s) para download adicionado(s)", - "ru_RU": "", + "ru_RU": "Добавлено {0} новых DLC", "sv_SE": "{0} nya hämtningsbara innehåll lades till", "th_TH": "{0} DLC ใหม่ที่เพิ่มเข้ามา", "tr_TR": "", @@ -19988,7 +19988,7 @@ "no_NO": "{0} nytt nedlastbart innhold lagt til", "pl_PL": "", "pt_BR": "{0} novo(s) conteúdo(s) para download adicionado(s)", - "ru_RU": "", + "ru_RU": "Добавлено {0} новых DLC", "sv_SE": "{0} nya hämtningsbara innehåll lades till", "th_TH": "{0} ใหม่ที่เพิ่มเข้ามา", "tr_TR": "", @@ -20013,7 +20013,7 @@ "no_NO": "{0} manglende nedlastbart innhold fjernet", "pl_PL": "", "pt_BR": "{0} conteúdo(s) para download ausente(s) removido(s)", - "ru_RU": "", + "ru_RU": "{0} отсутствующих DLC удалено", "sv_SE": "{0} saknade hämtningsbara innehåll togs bort", "th_TH": "", "tr_TR": "", @@ -20038,7 +20038,7 @@ "no_NO": "{0} ny(e) oppdatering(er) lagt til", "pl_PL": "", "pt_BR": "{0} nova(s) atualização(ões) adicionada(s)", - "ru_RU": "", + "ru_RU": "{0} новых обновлений добавлено", "sv_SE": "{0} nya uppdatering(ar) lades till", "th_TH": "{0} อัพเดตใหม่ที่เพิ่มเข้ามา", "tr_TR": "", @@ -20063,7 +20063,7 @@ "no_NO": "{0} manglende oppdatering(er) fjernet", "pl_PL": "", "pt_BR": "{0} atualização(ões) ausente(s) removida(s)", - "ru_RU": "", + "ru_RU": "{0} отсутствующих обновлений удалено", "sv_SE": "{0} saknade uppdatering(ar) togs bort", "th_TH": "", "tr_TR": "", @@ -20138,7 +20138,7 @@ "no_NO": "Fortsett", "pl_PL": "", "pt_BR": "", - "ru_RU": "", + "ru_RU": "Продолжить", "sv_SE": "Fortsätt", "th_TH": "", "tr_TR": "", @@ -20488,7 +20488,7 @@ "no_NO": "Velg grafikkbackend som skal brukes i emulatoren.\n\nVulkan er generelt bedre for alle moderne grafikkort, så lenge driverne er oppdatert. Vulkan har også en raskere sammenstilling av Shader (mindre hakkete) på alle GPU-leverandører.\n\nOpenGL kan oppnå bedre resultater for eldre Nvidia GPU-er, på eldre AMD GPU-er på Linux, eller på GPU-er med lavere VRAM, selv om skyggekompileringsutløser vil være større.\n\nSett til Vulkan hvis du er usikker. Sett til OpenGL hvis ikke GPU-en støtter Vulkan selv med de nyeste grafikkdriverne.", "pl_PL": "", "pt_BR": "", - "ru_RU": "Выберает бэкенд, который будет использован в эмуляторе.\n\nVulkan является лучшим выбором для всех современных графических карт с актуальными драйверами. В Vulkan также включена более быстрая компиляция шейдеров (меньше статтеров) для всех видеоадаптеров.\n\nПри использовании OpenGL можно достичь лучших результатов на старых видеоадаптерах Nvidia и AMD в Linux или на видеоадаптерах с небольшим количеством видеопамяти, хотя статтеров при компиляции шейдеров будет больше.\n\nРекомендуется использовать Vulkan. Используйте OpenGL, если ваш видеоадаптер не поддерживает Vulkan даже с актуальными драйверами.", + "ru_RU": "Выбирает бэкенд, который будет использован в эмуляторе.\n\nVulkan является лучшим выбором для всех современных графических карт с актуальными драйверами. В Vulkan также включена более быстрая компиляция шейдеров (меньше статтеров) для всех видеоадаптеров.\n\nПри использовании OpenGL можно достичь лучших результатов на старых видеоадаптерах Nvidia и AMD в Linux или на видеоадаптерах с небольшим количеством видеопамяти, хотя статтеров при компиляции шейдеров будет больше.\n\nРекомендуется использовать Vulkan. Используйте OpenGL, если ваш видеоадаптер не поддерживает Vulkan даже с актуальными драйверами.", "sv_SE": "Väljer den grafikbakände som ska användas i emulatorn.\n\nVulkan är oftast bättre för alla moderna grafikkort, så länge som deras drivrutiner är uppdaterade. Vulkan har också funktioner för snabbare shader compilation (mindre stuttering) för alla GPU-tillverkare.\n\nOpenGL kan nå bättre resultat på gamla Nvidia GPU:er, på äldre AMD GPU:er på Linux, eller på GPU:er med lägre VRAM, även om shader compilation stuttering kommer att vara större.\n\nStäll in till Vulkan om du är osäker. Ställ in till OpenGL om du GPU inte har stöd för Vulkan även med de senaste grafikdrivrutinerna.", "th_TH": "เลือกกราฟิกเบื้องหลังที่จะใช้ในโปรแกรมจำลอง\n\nโดยรวมแล้ว Vulkan นั้นดีกว่าสำหรับการ์ดจอรุ่นใหม่ทั้งหมด ตราบใดที่ไดรเวอร์ยังอัพเดทอยู่เสมอ Vulkan ยังมีคุณสมบัติการคอมไพล์เชเดอร์ที่เร็วขึ้น(และลดอาการกระตุก) สำหรับ GPU อื่นๆทุกอัน\n\nOpenGL อาจได้รับผลลัพธ์ที่ดีกว่าบน Nvidia GPU รุ่นเก่า, AMD GPU รุ่นเก่าบน Linux หรือบน GPU ที่มี VRAM น้อย แม้ว่าการคอมไพล์เชเดอร์ จะทำให้อาการกระตุกมากขึ้นก็ตาม\n\nตั้งค่าเป็น Vulkan หากไม่แน่ใจ ตั้งค่าเป็น OpenGL หาก GPU ของคุณไม่รองรับ Vulkan แม้จะมีไดรเวอร์กราฟิกล่าสุดก็ตาม", "tr_TR": "", @@ -20513,7 +20513,7 @@ "no_NO": "", "pl_PL": "", "pt_BR": "", - "ru_RU": "", + "ru_RU": "Авто", "sv_SE": "Automatiskt", "th_TH": "", "tr_TR": "", @@ -20538,7 +20538,7 @@ "no_NO": "", "pl_PL": "", "pt_BR": "", - "ru_RU": "", + "ru_RU": "Использует Vulkan.\nНа Mac с ARM процессорами используется Metal, если игра с ним совместима и хорошо работает.", "sv_SE": "Använder Vulkan.\nPå en ARM Mac och vid spel som körs bra på den så används Metal-bakänden.", "th_TH": "", "tr_TR": "", @@ -20838,7 +20838,7 @@ "no_NO": "High-level emulering av GPU makrokode.\n\nForbedrer ytelse, men kan forårsake grafiske glitches i noen spill.\n\nForlat PÅ hvis usikker.", "pl_PL": "Wysokopoziomowa emulacja kodu GPU Macro.\n\nPoprawia wydajność, ale może powodować błędy graficzne w niektórych grach.\n\nW razie wątpliwości pozostaw WŁĄCZONE.", "pt_BR": "Habilita emulação de alto nível de códigos Macro da GPU.\n\nMelhora a performance, mas pode causar problemas gráficos em alguns jogos.\n\nEm caso de dúvida, deixe ATIVADO.", - "ru_RU": "Высокоуровневая эмуляции макрокода видеоадаптера.\n\nПовышает производительность, но может вызывать графические артефакты в некоторых играх.\n\nРекомендуется оставить включенным.", + "ru_RU": "Высокоуровневая эмуляция макрокода видеоадаптера.\n\nПовышает производительность, но может вызывать графические артефакты в некоторых играх.\n\nРекомендуется оставить включенным.", "sv_SE": "Högnivåemulering av GPU Macro-kod.\n\nFörbättrar prestandan men kan orsaka grafiska glitches i vissa spel.\n\nLämna PÅ om du är osäker.", "th_TH": "การจำลองระดับสูงของโค้ดมาโคร GPU\n\nปรับปรุงประสิทธิภาพ แต่อาจทำให้เกิดข้อผิดพลาดด้านกราฟิกในบางเกม\n\nเปิดทิ้งไว้หากคุณไม่แน่ใจ", "tr_TR": "GPU Macro kodunun yüksek seviye emülasyonu.\n\nPerformansı arttırır, ama bazı oyunlarda grafik hatalarına yol açabilir.\n\nEmin değilseniz AÇIK bırakın.", @@ -21388,7 +21388,7 @@ "no_NO": "", "pl_PL": "", "pt_BR": "", - "ru_RU": "", + "ru_RU": "FSR", "sv_SE": "FSR", "th_TH": "", "tr_TR": "", @@ -21413,7 +21413,7 @@ "no_NO": "Område", "pl_PL": "", "pt_BR": "", - "ru_RU": "", + "ru_RU": "Зональная", "sv_SE": "Yta", "th_TH": "", "tr_TR": "", @@ -21738,7 +21738,7 @@ "no_NO": "Vis endringslogg på GitHub", "pl_PL": "Zobacz listę zmian na GitHubie", "pt_BR": "Ver mudanças no GitHub", - "ru_RU": "Список изменений на GitHub", + "ru_RU": "Показать список изменений на GitHub", "sv_SE": "Visa ändringslogg på GitHub", "th_TH": "ดูประวัติการเปลี่ยนแปลงบน GitHub", "tr_TR": "GitHub'da Değişiklikleri Görüntüle", @@ -21888,7 +21888,7 @@ "no_NO": "", "pl_PL": "", "pt_BR": "", - "ru_RU": "", + "ru_RU": "ldn_mitm", "sv_SE": "ldn_mitm", "th_TH": "", "tr_TR": "", @@ -21913,7 +21913,7 @@ "no_NO": "", "pl_PL": "", "pt_BR": "", - "ru_RU": "", + "ru_RU": "RyuLDN", "sv_SE": "RyuLDN", "th_TH": "", "tr_TR": "", @@ -21938,7 +21938,7 @@ "no_NO": "Deaktiver P2P-nettverkshosting (kan øke ventetiden)", "pl_PL": "", "pt_BR": "", - "ru_RU": "", + "ru_RU": "Отключить хостинг P2P-сетей (может увеличить задержку)", "sv_SE": "Inaktivera P2P-nätverkshosting (kan öka latens)", "th_TH": "", "tr_TR": "", @@ -21963,7 +21963,7 @@ "no_NO": "Deaktiver P2P-nettverkshosting, så vil andre brukere gå via hovedserveren i stedet for å koble seg direkte til deg.", "pl_PL": "", "pt_BR": "", - "ru_RU": "", + "ru_RU": "Отключая хостинг P2P-сетей, пользователи будут проксироваться через главный сервер, а не подключаться к вам напрямую.", "sv_SE": "Inaktivera P2P-nätverkshosting, motparter kommer skickas genom masterservern isället för att ansluta direkt till dig.", "th_TH": "", "tr_TR": "", @@ -21988,7 +21988,7 @@ "no_NO": "Nettverkspassord:", "pl_PL": "", "pt_BR": "", - "ru_RU": "", + "ru_RU": "Cетевой пароль:", "sv_SE": "Lösenfras för nätverk:", "th_TH": "", "tr_TR": "", @@ -22013,7 +22013,7 @@ "no_NO": "Du vil bare kunne se spill som er arrangert med samme passordfrase som deg.", "pl_PL": "", "pt_BR": "", - "ru_RU": "", + "ru_RU": "Вы сможете видеть только те игры, в которых используется тот же пароль, что и у вас.", "sv_SE": "Du kommer endast kunna se hostade spel med samma lösenfras som du.", "th_TH": "", "tr_TR": "", @@ -22038,7 +22038,7 @@ "no_NO": "Skriv inn en passordfrase i formatet Ryujinx-<8 heks tegn>. Du vil bare kunne se spill som er arrangert med samme passordfrase som deg.", "pl_PL": "", "pt_BR": "", - "ru_RU": "", + "ru_RU": "Введите пароль в формате Ryujinx-<8 шестнадцатеричных символов>. Вы сможете видеть только те игры, в которых используется тот же пароль, что и у вас.", "sv_SE": "Ange en lösenfras i formatet Ryujinx-<8 hextecken>. Du kommer endast kunna se hostade spel med samma lösenfras som du.", "th_TH": "", "tr_TR": "", @@ -22063,7 +22063,7 @@ "no_NO": "(offentlig)", "pl_PL": "", "pt_BR": "", - "ru_RU": "", + "ru_RU": "(публичный)", "sv_SE": "(publik)", "th_TH": "", "tr_TR": "", @@ -22088,7 +22088,7 @@ "no_NO": "Generer tilfeldig", "pl_PL": "", "pt_BR": "", - "ru_RU": "", + "ru_RU": "Сгенерировать рандомно", "sv_SE": "Generera slumpmässigt", "th_TH": "", "tr_TR": "", @@ -22113,7 +22113,7 @@ "no_NO": "Genererer en ny passordfrase, som kan deles med andre spillere.", "pl_PL": "", "pt_BR": "", - "ru_RU": "", + "ru_RU": "Генерирует новый пароль, который можно передать другим игрокам.", "sv_SE": "Genererar en ny lösenfras som kan delas med andra spelare.", "th_TH": "", "tr_TR": "", @@ -22138,7 +22138,7 @@ "no_NO": "Slett", "pl_PL": "", "pt_BR": "", - "ru_RU": "", + "ru_RU": "Очистить", "sv_SE": "Töm", "th_TH": "", "tr_TR": "", @@ -22163,7 +22163,7 @@ "no_NO": "Sletter den gjeldende passordfrasen og går tilbake til det offentlige nettverket.", "pl_PL": "", "pt_BR": "", - "ru_RU": "", + "ru_RU": "Очищает текущий пароль, возвращаясь в публичную сеть.", "sv_SE": "Tömmer aktuell lösenfras och återgår till det publika nätverket.", "th_TH": "", "tr_TR": "", @@ -22188,7 +22188,7 @@ "no_NO": "Ugyldig passordfrase! Må være i formatet \"Ryujinx-<8 hex tegn>\"", "pl_PL": "", "pt_BR": "", - "ru_RU": "", + "ru_RU": "Неверный пароль! Пароль должен быть в формате \"Ryujinx-<8 шестнадцатеричных символов>\"", "sv_SE": "Ogiltig lösenfras! Måste vara i formatet \"Ryujinx-<8 hextecken>\"", "th_TH": "", "tr_TR": "", @@ -22213,7 +22213,7 @@ "no_NO": "", "pl_PL": "", "pt_BR": "", - "ru_RU": "", + "ru_RU": "Вертикальная синхронизация:", "sv_SE": "VSync:", "th_TH": "", "tr_TR": "", @@ -22238,7 +22238,7 @@ "no_NO": "Aktiver egendefinert oppdateringsfrekvens (eksperimentell)", "pl_PL": "", "pt_BR": "", - "ru_RU": "", + "ru_RU": "Включить пользовательскую частоту кадров (Экспериментально)", "sv_SE": "Aktivera anpassad uppdateringsfrekvens (experimentell)", "th_TH": "", "tr_TR": "", @@ -22263,7 +22263,7 @@ "no_NO": "", "pl_PL": "", "pt_BR": "", - "ru_RU": "", + "ru_RU": "Консоль", "sv_SE": "Switch", "th_TH": "", "tr_TR": "", @@ -22288,7 +22288,7 @@ "no_NO": "Ubegrenset", "pl_PL": "", "pt_BR": "", - "ru_RU": "", + "ru_RU": "Без ограничений", "sv_SE": "Obunden", "th_TH": "", "tr_TR": "", @@ -22313,7 +22313,7 @@ "no_NO": "Egendefinert oppdateringsfrekvens", "pl_PL": "", "pt_BR": "", - "ru_RU": "", + "ru_RU": "Пользовательская частота кадров", "sv_SE": "Anpassad uppdateringsfrekvens", "th_TH": "", "tr_TR": "", @@ -22338,7 +22338,7 @@ "no_NO": "Emulert vertikal synkronisering. «Switch» emulerer Switchs oppdateringsfrekvens på 60 Hz. «Ubegrenset» er en ubegrenset oppdateringsfrekvens.", "pl_PL": "", "pt_BR": "", - "ru_RU": "", + "ru_RU": "Эмулированная вертикальная синхронизация. 'Консоль' эмулирует частоту обновления консоли, равную 60 Гц. 'Без ограничений' - неограниченная частота кадров.", "sv_SE": "Emulerad vertikal synk. 'Switch' emulerar Switchens uppdateringsfrekvens på 60Hz. 'Obunden' är en obegränsad uppdateringsfrekvens.", "th_TH": "", "tr_TR": "", @@ -22363,7 +22363,7 @@ "no_NO": "Emulert vertikal synkronisering. «Switch» emulerer Switchs oppdateringsfrekvens på 60 Hz. «Ubegrenset» er en ubegrenset oppdateringsfrekvens. «Egendefinert» emulerer den angitte egendefinerte oppdateringsfrekvensen.", "pl_PL": "", "pt_BR": "", - "ru_RU": "", + "ru_RU": "Эмулированная вертикальная синхронизация. 'Консоль' эмулирует частоту обновления консоли, равную 60 Гц. 'Без ограничений' - неограниченная частота кадров. 'Пользовательска частота кадров' эмулирует выбранную пользователем частоту кадров.", "sv_SE": "Emulerad vertikal synk. 'Switch' emulerar Switchens uppdateringsfrekvens på 60Hz. 'Obunden' är en obegränsad uppdateringsfrekvens. 'Anpassad uppdateringsfrekvens' emulerar den angivna anpassade uppdateringsfrekvensen.", "th_TH": "", "tr_TR": "", @@ -22388,7 +22388,7 @@ "no_NO": "Gjør det mulig for brukeren å angi en emulert oppdateringsfrekvens. I noen titler kan dette øke eller senke hastigheten på spillogikken. I andre titler kan det gjøre det mulig å begrense FPS til et multiplum av oppdateringsfrekvensen, eller føre til uforutsigbar oppførsel. Dette er en eksperimentell funksjon, og det gis ingen garantier for hvordan spillingen påvirkes. \n\nLa AV stå hvis du er usikker.", "pl_PL": "", "pt_BR": "", - "ru_RU": "", + "ru_RU": "Позволяет пользователю указать эмулируемую частоту кадров. В некоторых играх это может ускорить или замедлить скорость логики игрового процесса. В других играх это может позволить ограничить FPS на уровне, кратном частоте обновления, или привести к непредсказуемому поведению. Это экспериментальная функция, и нет никаких гарантий того, как она повлияет на игровой процесс. \n\nОставьте выключенным, если не уверены.", "sv_SE": "Låter användaren ange en emulerad uppdateringsfrekvens. För vissa spel så kan detta snabba upp eller ner frekvensen för spellogiken. I andra spel så kan detta tillåta att bildfrekvensen kapas för delar av uppdateringsfrekvensen eller leda till oväntat beteende. Detta är en experimentell funktion utan några garantier för hur spelet påverkas. \n\nLämna AV om du är osäker.", "th_TH": "", "tr_TR": "", @@ -22413,7 +22413,7 @@ "no_NO": "Den egendefinerte målverdien for oppdateringsfrekvens.", "pl_PL": "", "pt_BR": "", - "ru_RU": "", + "ru_RU": "Заданное значение частоты кадров", "sv_SE": "Målvärde för anpassad uppdateringsfrekvens.", "th_TH": "", "tr_TR": "", @@ -22438,7 +22438,7 @@ "no_NO": "Den egendefinerte oppdateringsfrekvensen, i prosent av den normale oppdateringsfrekvensen for Switch-konsollen.", "pl_PL": "", "pt_BR": "", - "ru_RU": "", + "ru_RU": "Пользовательская частота кадров в процентах от обычной частоты обновления на консоли.", "sv_SE": "Anpassad uppdateringsfrekvens, som en procentdel av den normala uppdateringsfrekvensen för Switch.", "th_TH": "", "tr_TR": "", @@ -22463,7 +22463,7 @@ "no_NO": "Egendefinert oppdateringsfrekvens %:", "pl_PL": "", "pt_BR": "", - "ru_RU": "", + "ru_RU": "Пользовательская частота кадров %:", "sv_SE": "Anpassad uppdateringsfrekvens %:", "th_TH": "", "tr_TR": "", @@ -22488,7 +22488,7 @@ "no_NO": "Egendefinert verdi for oppdateringsfrekvens:", "pl_PL": "", "pt_BR": "", - "ru_RU": "", + "ru_RU": "Значение пользовательской частоты кадров:", "sv_SE": "Värde för anpassad uppdateringsfrekvens:", "th_TH": "", "tr_TR": "", @@ -22513,7 +22513,7 @@ "no_NO": "Intervall", "pl_PL": "", "pt_BR": "", - "ru_RU": "", + "ru_RU": "Интервал", "sv_SE": "Intervall", "th_TH": "", "tr_TR": "", @@ -22538,7 +22538,7 @@ "no_NO": "Veksle mellom VSync-modus:", "pl_PL": "", "pt_BR": "", - "ru_RU": "", + "ru_RU": "Выбрать режим вертикальной синхронизации:", "sv_SE": "Växla VSync-läge:", "th_TH": "", "tr_TR": "", @@ -22563,7 +22563,7 @@ "no_NO": "Øk den egendefinerte oppdateringsfrekvensen", "pl_PL": "", "pt_BR": "", - "ru_RU": "", + "ru_RU": "Повышение пользовательской частоты кадров", "sv_SE": "Höj anpassad uppdateringsfrekvens", "th_TH": "", "tr_TR": "", @@ -22588,7 +22588,7 @@ "no_NO": "Lavere tilpasset oppdateringsfrekvens", "pl_PL": "", "pt_BR": "", - "ru_RU": "", + "ru_RU": "Понижение пользовательской частоты кадров", "sv_SE": "Sänk anpassad uppdateringsfrekvens", "th_TH": "", "tr_TR": "", @@ -22598,4 +22598,4 @@ } } ] -} +} \ No newline at end of file From 664c63c6a8bf682f42f045f75536c30b250a72af Mon Sep 17 00:00:00 2001 From: Evan Husted Date: Fri, 27 Dec 2024 20:47:02 -0600 Subject: [PATCH 35/60] metal: Bump SharpMetal to preview 21 --- Directory.Packages.props | 2 +- .../CAMetalLayerExtensions.cs | 18 ++++-------- .../NSHelper.cs | 28 +++++++++++++++++++ ...Graphics.Metal.SharpMetalExtensions.csproj | 1 + src/Ryujinx.Graphics.Metal/Window.cs | 8 +++--- 5 files changed, 39 insertions(+), 18 deletions(-) create mode 100644 src/Ryujinx.Graphics.Metal.SharpMetalExtensions/NSHelper.cs diff --git a/Directory.Packages.props b/Directory.Packages.props index 07fc8cc28..59abe363c 100644 --- a/Directory.Packages.props +++ b/Directory.Packages.props @@ -44,7 +44,7 @@ - + diff --git a/src/Ryujinx.Graphics.Metal.SharpMetalExtensions/CAMetalLayerExtensions.cs b/src/Ryujinx.Graphics.Metal.SharpMetalExtensions/CAMetalLayerExtensions.cs index 0d29a502b..f8fe7d2e7 100644 --- a/src/Ryujinx.Graphics.Metal.SharpMetalExtensions/CAMetalLayerExtensions.cs +++ b/src/Ryujinx.Graphics.Metal.SharpMetalExtensions/CAMetalLayerExtensions.cs @@ -1,4 +1,5 @@ using SharpMetal; +using SharpMetal.Foundation; using SharpMetal.ObjectiveCCore; using SharpMetal.QuartzCore; using System.Runtime.Versioning; @@ -9,22 +10,13 @@ namespace Ryujinx.Graphics.Metal.SharpMetalExtensions [SupportedOSPlatform("macOS")] public static class CAMetalLayerExtensions { - private static readonly Selector sel_displaySyncEnabled = "displaySyncEnabled"; - private static readonly Selector sel_setDisplaySyncEnabled = "setDisplaySyncEnabled:"; - private static readonly Selector sel_developerHUDProperties = "developerHUDProperties"; private static readonly Selector sel_setDeveloperHUDProperties = "setDeveloperHUDProperties:"; - - public static bool IsDisplaySyncEnabled(this CAMetalLayer metalLayer) - => ObjectiveCRuntime.bool_objc_msgSend(metalLayer.NativePtr, sel_displaySyncEnabled); - public static void SetDisplaySyncEnabled(this CAMetalLayer metalLayer, bool enabled) - => ObjectiveCRuntime.objc_msgSend(metalLayer.NativePtr, sel_setDisplaySyncEnabled, enabled); + public static NSDictionary GetDeveloperHudProperties(this CAMetalLayer metalLayer) + => new(ObjectiveCRuntime.IntPtr_objc_msgSend(metalLayer.NativePtr, sel_developerHUDProperties)); - public static nint GetDeveloperHudProperties(this CAMetalLayer metalLayer) - => ObjectiveCRuntime.IntPtr_objc_msgSend(metalLayer.NativePtr, sel_developerHUDProperties); - - public static void SetDeveloperHudProperties(this CAMetalLayer metalLayer, nint dictionaryPointer) - => ObjectiveCRuntime.objc_msgSend(metalLayer.NativePtr, sel_setDeveloperHUDProperties, dictionaryPointer); + public static void SetDeveloperHudProperties(this CAMetalLayer metalLayer, NSDictionary dictionary) + => ObjectiveCRuntime.objc_msgSend(metalLayer.NativePtr, sel_setDeveloperHUDProperties, dictionary); } } diff --git a/src/Ryujinx.Graphics.Metal.SharpMetalExtensions/NSHelper.cs b/src/Ryujinx.Graphics.Metal.SharpMetalExtensions/NSHelper.cs new file mode 100644 index 000000000..52c192a90 --- /dev/null +++ b/src/Ryujinx.Graphics.Metal.SharpMetalExtensions/NSHelper.cs @@ -0,0 +1,28 @@ +using SharpMetal.Foundation; +using SharpMetal.ObjectiveCCore; +using System.Runtime.Versioning; + +namespace Ryujinx.Graphics.Metal.SharpMetalExtensions +{ + [SupportedOSPlatform("macOS")] + public static class NSHelper + { + public static unsafe string ToDotNetString(this NSString source) + { + char[] sourceBuffer = new char[source.Length]; + fixed (char* pSourceBuffer = sourceBuffer) + { + ObjectiveC.bool_objc_msgSend(source, + "getCString:maxLength:encoding:", + pSourceBuffer, + source.MaximumLengthOfBytes(NSStringEncoding.UTF16) + 1, + (ulong)NSStringEncoding.UTF16); + } + + return new string(sourceBuffer); + } + + public static NSString ToNSString(this string source) + => new(ObjectiveC.IntPtr_objc_msgSend(new ObjectiveCClass("NSString"), "stringWithUTF8String:", source)); + } +} diff --git a/src/Ryujinx.Graphics.Metal.SharpMetalExtensions/Ryujinx.Graphics.Metal.SharpMetalExtensions.csproj b/src/Ryujinx.Graphics.Metal.SharpMetalExtensions/Ryujinx.Graphics.Metal.SharpMetalExtensions.csproj index 9836063a3..1e75b4d26 100644 --- a/src/Ryujinx.Graphics.Metal.SharpMetalExtensions/Ryujinx.Graphics.Metal.SharpMetalExtensions.csproj +++ b/src/Ryujinx.Graphics.Metal.SharpMetalExtensions/Ryujinx.Graphics.Metal.SharpMetalExtensions.csproj @@ -2,6 +2,7 @@ enable enable + true diff --git a/src/Ryujinx.Graphics.Metal/Window.cs b/src/Ryujinx.Graphics.Metal/Window.cs index 203a29ebc..61137f97d 100644 --- a/src/Ryujinx.Graphics.Metal/Window.cs +++ b/src/Ryujinx.Graphics.Metal/Window.cs @@ -18,7 +18,7 @@ namespace Ryujinx.Graphics.Metal public bool ScreenCaptureRequested { get; set; } private readonly MetalRenderer _renderer; - private readonly CAMetalLayer _metalLayer; + private CAMetalLayer _metalLayer; private int _width; private int _height; @@ -146,11 +146,11 @@ namespace Ryujinx.Graphics.Metal { switch (vSyncMode) { - case VSyncMode.Unbounded: - _metalLayer.SetDisplaySyncEnabled(false); + case VSyncMode.Unbounded: + _metalLayer.DisplaySyncEnabled = false; break; case VSyncMode.Switch: - _metalLayer.SetDisplaySyncEnabled(true); + _metalLayer.DisplaySyncEnabled = true; break; } } From 7d5442404823cdf5a2dafce66be6b6b90d3e0a44 Mon Sep 17 00:00:00 2001 From: Evan Husted Date: Fri, 27 Dec 2024 21:31:46 -0600 Subject: [PATCH 36/60] misc: Use selector fields --- .../NSHelper.cs | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/Ryujinx.Graphics.Metal.SharpMetalExtensions/NSHelper.cs b/src/Ryujinx.Graphics.Metal.SharpMetalExtensions/NSHelper.cs index 52c192a90..dc2495d07 100644 --- a/src/Ryujinx.Graphics.Metal.SharpMetalExtensions/NSHelper.cs +++ b/src/Ryujinx.Graphics.Metal.SharpMetalExtensions/NSHelper.cs @@ -1,19 +1,23 @@ using SharpMetal.Foundation; using SharpMetal.ObjectiveCCore; using System.Runtime.Versioning; +// ReSharper disable InconsistentNaming namespace Ryujinx.Graphics.Metal.SharpMetalExtensions { [SupportedOSPlatform("macOS")] public static class NSHelper { + private static readonly Selector sel_getCStringMaxLengthEncoding = "getCString:maxLength:encoding:"; + private static readonly Selector sel_stringWithUTF8String = "stringWithUTF8String:"; + public static unsafe string ToDotNetString(this NSString source) { char[] sourceBuffer = new char[source.Length]; fixed (char* pSourceBuffer = sourceBuffer) { ObjectiveC.bool_objc_msgSend(source, - "getCString:maxLength:encoding:", + sel_getCStringMaxLengthEncoding, pSourceBuffer, source.MaximumLengthOfBytes(NSStringEncoding.UTF16) + 1, (ulong)NSStringEncoding.UTF16); @@ -23,6 +27,6 @@ namespace Ryujinx.Graphics.Metal.SharpMetalExtensions } public static NSString ToNSString(this string source) - => new(ObjectiveC.IntPtr_objc_msgSend(new ObjectiveCClass("NSString"), "stringWithUTF8String:", source)); + => new(ObjectiveC.IntPtr_objc_msgSend(new ObjectiveCClass(nameof(NSString)), sel_stringWithUTF8String, source)); } } From 709eeda94ace9fb10e02d65607d4b18249199acc Mon Sep 17 00:00:00 2001 From: Evan Husted Date: Sat, 28 Dec 2024 02:00:46 -0600 Subject: [PATCH 37/60] (try) fix PR build comments --- .github/workflows/nightly_pr_comment.yml | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/.github/workflows/nightly_pr_comment.yml b/.github/workflows/nightly_pr_comment.yml index 85a6e2de4..9f9fcdcad 100644 --- a/.github/workflows/nightly_pr_comment.yml +++ b/.github/workflows/nightly_pr_comment.yml @@ -41,12 +41,13 @@ jobs: let hidden_headless_artifacts = `\n\n
GUI-less\n`; let hidden_debug_artifacts = `\n\n
Only for Developers\n`; for (const art of artifacts) { + var url = `https://github.com/Ryubing/Ryujinx/actions/runs/${run_id}/artifacts/${art_id}`; if(art.name.includes('Debug')) { - hidden_debug_artifacts += `\n* [${art.name}](https://nightly.link/${owner}/${repo}/actions/artifacts/${art.id}.zip)`; + hidden_debug_artifacts += `\n* [${art.name}](${url})`; } else if(art.name.includes('nogui-ryujinx')) { - hidden_headless_artifacts += `\n* [${art.name}](https://nightly.link/${owner}/${repo}/actions/artifacts/${art.id}.zip)`; + hidden_headless_artifacts += `\n* [${art.name}](${url})`; } else { - body += `\n* [${art.name}](https://nightly.link/${owner}/${repo}/actions/artifacts/${art.id}.zip)`; + body += `\n* [${art.name}](${url})`; } } hidden_headless_artifacts += `\n
`; From 77a9246825ff6358a584478ef095295374496cd7 Mon Sep 17 00:00:00 2001 From: heihei123456780 <103516986+heihei123456780@users.noreply.github.com> Date: Sat, 28 Dec 2024 16:42:25 +0800 Subject: [PATCH 38/60] Updated zh-CN translation (#440) --- src/Ryujinx/Assets/locales.json | 176 ++++++++++++++++---------------- 1 file changed, 88 insertions(+), 88 deletions(-) diff --git a/src/Ryujinx/Assets/locales.json b/src/Ryujinx/Assets/locales.json index fc77cf458..907a7d7bd 100644 --- a/src/Ryujinx/Assets/locales.json +++ b/src/Ryujinx/Assets/locales.json @@ -93,7 +93,7 @@ "th_TH": "", "tr_TR": "", "uk_UA": "Аплет для редагування Mii", - "zh_CN": "", + "zh_CN": "Mii 小程序", "zh_TW": "" } }, @@ -743,7 +743,7 @@ "th_TH": "", "tr_TR": "", "uk_UA": "", - "zh_CN": "", + "zh_CN": "从bin文件扫描 Amiibo", "zh_TW": "" } }, @@ -868,7 +868,7 @@ "th_TH": "", "tr_TR": "", "uk_UA": "", - "zh_CN": "", + "zh_CN": "安装密匙", "zh_TW": "" } }, @@ -893,7 +893,7 @@ "th_TH": "", "tr_TR": "", "uk_UA": "", - "zh_CN": "", + "zh_CN": "从.KEYS文件或ZIP压缩包安装密匙", "zh_TW": "" } }, @@ -918,7 +918,7 @@ "th_TH": "", "tr_TR": "", "uk_UA": "", - "zh_CN": "", + "zh_CN": "从一个文件夹安装密匙", "zh_TW": "" } }, @@ -1018,7 +1018,7 @@ "th_TH": "", "tr_TR": "", "uk_UA": "Обрізати XCI файли", - "zh_CN": "", + "zh_CN": "XCI文件瘦身", "zh_TW": "" } }, @@ -1268,7 +1268,7 @@ "th_TH": "", "tr_TR": "", "uk_UA": "", - "zh_CN": "", + "zh_CN": "常见问题和问题排除页面", "zh_TW": "" } }, @@ -1293,7 +1293,7 @@ "th_TH": "", "tr_TR": "", "uk_UA": "", - "zh_CN": "", + "zh_CN": "打开Ryujinx官方wiki的常见问题和问题排除页面", "zh_TW": "" } }, @@ -1318,7 +1318,7 @@ "th_TH": "", "tr_TR": "", "uk_UA": "", - "zh_CN": "", + "zh_CN": "安装与配置指南", "zh_TW": "" } }, @@ -1343,7 +1343,7 @@ "th_TH": "", "tr_TR": "", "uk_UA": "", - "zh_CN": "", + "zh_CN": "打开Ryujinx官方wiki的安装与配置指南", "zh_TW": "" } }, @@ -1368,7 +1368,7 @@ "th_TH": "", "tr_TR": "", "uk_UA": "", - "zh_CN": "", + "zh_CN": "多人游戏(LDN/LAN)指南", "zh_TW": "" } }, @@ -1393,7 +1393,7 @@ "th_TH": "", "tr_TR": "", "uk_UA": "", - "zh_CN": "", + "zh_CN": "打开Ryujinx官方wiki的多人游戏指南", "zh_TW": "" } }, @@ -2543,7 +2543,7 @@ "th_TH": "", "tr_TR": "", "uk_UA": "Перевірка та Нарізка XCI Файлів", - "zh_CN": "", + "zh_CN": "检查并瘦身XCI文件", "zh_TW": "" } }, @@ -2568,7 +2568,7 @@ "th_TH": "", "tr_TR": "", "uk_UA": "Перевірка та Нарізка XCI Файлів для збереження місця на диску", - "zh_CN": "", + "zh_CN": "检查并瘦身XCI文件以节约磁盘空间", "zh_TW": "" } }, @@ -2643,7 +2643,7 @@ "th_TH": "", "tr_TR": "", "uk_UA": "Обрізано XCI Файлів '{0}'", - "zh_CN": "", + "zh_CN": "XCI文件瘦身中'{0}'", "zh_TW": "" } }, @@ -10518,7 +10518,7 @@ "th_TH": "", "tr_TR": "", "uk_UA": "Скасування", - "zh_CN": "", + "zh_CN": "正在取消", "zh_TW": "" } }, @@ -10543,7 +10543,7 @@ "th_TH": "", "tr_TR": "", "uk_UA": "Закрити", - "zh_CN": "", + "zh_CN": "关闭", "zh_TW": "" } }, @@ -11843,7 +11843,7 @@ "th_TH": "", "tr_TR": "", "uk_UA": "Показати список змін", - "zh_CN": "", + "zh_CN": "显示更新日志", "zh_TW": "" } }, @@ -12318,7 +12318,7 @@ "th_TH": "", "tr_TR": "", "uk_UA": "", - "zh_CN": "", + "zh_CN": "XCI文件瘦身窗口", "zh_TW": "" } }, @@ -13043,7 +13043,7 @@ "th_TH": "", "tr_TR": "", "uk_UA": "", - "zh_CN": "", + "zh_CN": "在{0}发现了一个无效的密匙文件", "zh_TW": "" } }, @@ -13068,7 +13068,7 @@ "th_TH": "", "tr_TR": "", "uk_UA": "Встановлення Ключів", - "zh_CN": "", + "zh_CN": "安装密匙", "zh_TW": "" } }, @@ -13093,7 +13093,7 @@ "th_TH": "", "tr_TR": "", "uk_UA": "Новий файл Ключів буде встановлено", - "zh_CN": "", + "zh_CN": "将会安装新密匙文件", "zh_TW": "" } }, @@ -13118,7 +13118,7 @@ "th_TH": "", "tr_TR": "", "uk_UA": "\n\nЦе замінить собою поточні файли Ключів.", - "zh_CN": "", + "zh_CN": "\n\n这也许会替换掉一些当前已安装的密匙", "zh_TW": "" } }, @@ -13143,7 +13143,7 @@ "th_TH": "", "tr_TR": "", "uk_UA": "\n\nВи хочете продовжити?", - "zh_CN": "", + "zh_CN": "\n\n你想要继续吗?", "zh_TW": "" } }, @@ -13168,7 +13168,7 @@ "th_TH": "", "tr_TR": "", "uk_UA": "Встановлення Ключів...", - "zh_CN": "", + "zh_CN": "安装密匙中。。。", "zh_TW": "" } }, @@ -13193,7 +13193,7 @@ "th_TH": "", "tr_TR": "", "uk_UA": "Нові ключі встановлено.", - "zh_CN": "", + "zh_CN": "已成功安装新密匙文件", "zh_TW": "" } }, @@ -14243,7 +14243,7 @@ "th_TH": "", "tr_TR": "", "uk_UA": "Минулі розробники:", - "zh_CN": "", + "zh_CN": "曾经的维护者:", "zh_TW": "" } }, @@ -15268,7 +15268,7 @@ "th_TH": "", "tr_TR": "", "uk_UA": "", - "zh_CN": "", + "zh_CN": "重新同步系统时间以匹配您电脑的当前日期和时间。\n\n这个操作不会实时同步系统时间与电脑时间,时间仍然可能不同步;在这种情况下,只需再次单击此按钮即可。", "zh_TW": "" } }, @@ -17518,7 +17518,7 @@ "th_TH": "", "tr_TR": "", "uk_UA": "Часткові", - "zh_CN": "", + "zh_CN": "分区", "zh_TW": "" } }, @@ -17543,7 +17543,7 @@ "th_TH": "", "tr_TR": "", "uk_UA": "Необрізані", - "zh_CN": "", + "zh_CN": "没有瘦身的", "zh_TW": "" } }, @@ -17568,7 +17568,7 @@ "th_TH": "", "tr_TR": "", "uk_UA": "Обрізані", - "zh_CN": "", + "zh_CN": "经过瘦身的", "zh_TW": "" } }, @@ -17593,7 +17593,7 @@ "th_TH": "", "tr_TR": "", "uk_UA": "(Невдача)", - "zh_CN": "", + "zh_CN": "(失败)", "zh_TW": "" } }, @@ -17618,7 +17618,7 @@ "th_TH": "", "tr_TR": "", "uk_UA": "Зберегти {0:n0} Мб", - "zh_CN": "", + "zh_CN": "能节约 {0:n0} Mb", "zh_TW": "" } }, @@ -17643,7 +17643,7 @@ "th_TH": "", "tr_TR": "", "uk_UA": "Збережено {0:n0} Мб", - "zh_CN": "", + "zh_CN": "节约了 {0:n0} Mb", "zh_TW": "" } }, @@ -17843,7 +17843,7 @@ "th_TH": "", "tr_TR": "", "uk_UA": "Вкажіть Ваше нове ім'я Amiibo", - "zh_CN": "", + "zh_CN": "输入你的 Amiibo 的新名字", "zh_TW": "" } }, @@ -17868,7 +17868,7 @@ "th_TH": "", "tr_TR": "", "uk_UA": "Будь ласка, проскануйте Ваш Amiibo.", - "zh_CN": "", + "zh_CN": "请现在扫描你的 Amiibo", "zh_TW": "" } }, @@ -18993,7 +18993,7 @@ "th_TH": "", "tr_TR": "", "uk_UA": "Перевірити та Обрізати XCI файл", - "zh_CN": "", + "zh_CN": "检查并瘦身XCI文件", "zh_TW": "" } }, @@ -19018,7 +19018,7 @@ "th_TH": "", "tr_TR": "", "uk_UA": "Ця функція спочатку перевірить вільний простір, а потім обрізатиме файл XCI для економії місця на диску.", - "zh_CN": "", + "zh_CN": "这个功能将会先检查XCI文件,再对其执行瘦身操作以节约磁盘空间。", "zh_TW": "" } }, @@ -19043,7 +19043,7 @@ "th_TH": "", "tr_TR": "", "uk_UA": "Поточний розмір файла: {0:n} MB\nРозмір файлів гри: {1:n} MB\nЕкономія місця: {2:n} MB", - "zh_CN": "", + "zh_CN": "当前文件大小: {0:n} MB\n游戏数据大小: {1:n} MB\n节约的磁盘空间: {2:n} MB", "zh_TW": "" } }, @@ -19068,7 +19068,7 @@ "th_TH": "", "tr_TR": "", "uk_UA": "XCI файл не потребує обрізання. Перевірте журнали для додаткової інформації", - "zh_CN": "", + "zh_CN": "XCI文件不需要被瘦身。查看日志以获得更多细节。", "zh_TW": "" } }, @@ -19093,7 +19093,7 @@ "th_TH": "", "tr_TR": "", "uk_UA": "XCI файл не може бути обрізаний. Перевірте журнали для додаткової інформації", - "zh_CN": "", + "zh_CN": "XCI文件不能被瘦身。查看日志以获得更多细节。", "zh_TW": "" } }, @@ -19118,7 +19118,7 @@ "th_TH": "", "tr_TR": "", "uk_UA": "XCI файл Тільки для Читання і не може бути прочитаним. Перевірте журнали додаткової інформації", - "zh_CN": "", + "zh_CN": "XCI文件是只读的,且不可以被标记为可读取的。查看日志以获得更多细节。", "zh_TW": "" } }, @@ -19143,7 +19143,7 @@ "th_TH": "", "tr_TR": "", "uk_UA": "Розмір файлу XCI змінився з моменту сканування. Перевірте, чи не записується файл, та спробуйте знову", - "zh_CN": "", + "zh_CN": "XCI文件在扫描后大小发生了变化。请检查文件是否未被写入,然后重试。", "zh_TW": "" } }, @@ -19168,7 +19168,7 @@ "th_TH": "", "tr_TR": "", "uk_UA": "Файл XCI містить дані в зоні вільного простору, тому обрізка небезпечна", - "zh_CN": "", + "zh_CN": "XCI文件的空闲区域内有数据,不能安全瘦身。", "zh_TW": "" } }, @@ -19193,7 +19193,7 @@ "th_TH": "", "tr_TR": "", "uk_UA": "XCI Файл містить недійсні дані. Перевірте журнали для додаткової інформації", - "zh_CN": "", + "zh_CN": "XCI文件含有无效数据。查看日志以获得更多细节。", "zh_TW": "" } }, @@ -19218,7 +19218,7 @@ "th_TH": "", "tr_TR": "", "uk_UA": "XCI Файл файл не вдалося відкрити для запису. Перевірте журнали для додаткової інформації", - "zh_CN": "", + "zh_CN": "XCI文件不能被读写。查看日志以获得更多细节。", "zh_TW": "" } }, @@ -19243,7 +19243,7 @@ "th_TH": "", "tr_TR": "", "uk_UA": "Не вдалося обрізати файл XCI", - "zh_CN": "", + "zh_CN": "XCI文件瘦身失败", "zh_TW": "" } }, @@ -19268,7 +19268,7 @@ "th_TH": "", "tr_TR": "", "uk_UA": "Операція перервана", - "zh_CN": "", + "zh_CN": "操作已取消", "zh_TW": "" } }, @@ -19293,7 +19293,7 @@ "th_TH": "", "tr_TR": "", "uk_UA": "Операція не проводилася", - "zh_CN": "", + "zh_CN": "未执行操作", "zh_TW": "" } }, @@ -19443,7 +19443,7 @@ "th_TH": "", "tr_TR": "", "uk_UA": "Обрізка XCI Файлів", - "zh_CN": "", + "zh_CN": "XCI文件瘦身器", "zh_TW": "" } }, @@ -19468,7 +19468,7 @@ "th_TH": "", "tr_TR": "", "uk_UA": "{0} з {1} тайтл(ів) обрано", - "zh_CN": "", + "zh_CN": "在 {1} 中选中了 {0} 个游戏 ", "zh_TW": "" } }, @@ -19493,7 +19493,7 @@ "th_TH": "", "tr_TR": "", "uk_UA": "{0} з {1} тайтл(ів) обрано ({2} відображається)", - "zh_CN": "", + "zh_CN": "在 {1} 中选中了 {0} 个游戏 (显示了 {2} 个)", "zh_TW": "" } }, @@ -19518,7 +19518,7 @@ "th_TH": "", "tr_TR": "", "uk_UA": "Обрізка {0} тайтл(ів)...", - "zh_CN": "", + "zh_CN": "{0} 个游戏瘦身中。。。", "zh_TW": "" } }, @@ -19568,7 +19568,7 @@ "th_TH": "", "tr_TR": "", "uk_UA": "Невдача", - "zh_CN": "", + "zh_CN": "失败", "zh_TW": "" } }, @@ -19593,7 +19593,7 @@ "th_TH": "", "tr_TR": "", "uk_UA": "Потенційна економія", - "zh_CN": "", + "zh_CN": "潜在的储存空间节省", "zh_TW": "" } }, @@ -19618,7 +19618,7 @@ "th_TH": "", "tr_TR": "", "uk_UA": "Зекономлено", - "zh_CN": "", + "zh_CN": "实际的储存空间节省", "zh_TW": "" } }, @@ -19668,7 +19668,7 @@ "th_TH": "", "tr_TR": "", "uk_UA": "Вибрати показане", - "zh_CN": "", + "zh_CN": "选定显示的", "zh_TW": "" } }, @@ -19693,7 +19693,7 @@ "th_TH": "", "tr_TR": "", "uk_UA": "Скасувати вибір показаного", - "zh_CN": "", + "zh_CN": "反选显示的", "zh_TW": "" } }, @@ -19768,7 +19768,7 @@ "th_TH": "", "tr_TR": "", "uk_UA": "Обрізка", - "zh_CN": "", + "zh_CN": "瘦身", "zh_TW": "" } }, @@ -20143,7 +20143,7 @@ "th_TH": "", "tr_TR": "", "uk_UA": "Продовжити", - "zh_CN": "", + "zh_CN": "继续", "zh_TW": "" } }, @@ -20518,7 +20518,7 @@ "th_TH": "", "tr_TR": "", "uk_UA": "", - "zh_CN": "", + "zh_CN": "自动", "zh_TW": "" } }, @@ -20543,7 +20543,7 @@ "th_TH": "", "tr_TR": "", "uk_UA": "", - "zh_CN": "", + "zh_CN": "使用Vulkan。\n在ARM Mac上,当玩在其下运行良好的游戏时,使用Metal后端。", "zh_TW": "" } }, @@ -21943,7 +21943,7 @@ "th_TH": "", "tr_TR": "", "uk_UA": "Вимкнути хостинг P2P мережі (може збільшити затримку)", - "zh_CN": "", + "zh_CN": "禁用P2P网络连接 (也许会增加延迟)", "zh_TW": "" } }, @@ -21968,7 +21968,7 @@ "th_TH": "", "tr_TR": "", "uk_UA": "Вимкнути хостинг P2P мережі, піри будуть підключатися через майстер-сервер замість прямого з'єднання з вами.", - "zh_CN": "", + "zh_CN": "禁用P2P网络连接,对方将通过主服务器进行连接,而不是直接连接到您。", "zh_TW": "" } }, @@ -21993,7 +21993,7 @@ "th_TH": "", "tr_TR": "", "uk_UA": "Мережевий пароль:", - "zh_CN": "", + "zh_CN": "网络密码:", "zh_TW": "" } }, @@ -22018,7 +22018,7 @@ "th_TH": "", "tr_TR": "", "uk_UA": "Ви зможете бачити лише ті ігри, які мають такий самий пароль, як і у вас.", - "zh_CN": "", + "zh_CN": "您只能看到与您使用相同密码的游戏房间。", "zh_TW": "" } }, @@ -22043,7 +22043,7 @@ "th_TH": "", "tr_TR": "", "uk_UA": "Введіть пароль у форматі Ryujinx-<8 символів>. Ви зможете бачити лише ті ігри, які мають такий самий пароль, як і у вас.", - "zh_CN": "", + "zh_CN": "以Ryujinx-<8个十六进制字符>的格式输入密码。您只能看到与您使用相同密码的游戏房间。", "zh_TW": "" } }, @@ -22068,7 +22068,7 @@ "th_TH": "", "tr_TR": "", "uk_UA": "(публічний)", - "zh_CN": "", + "zh_CN": "(公开的)", "zh_TW": "" } }, @@ -22093,7 +22093,7 @@ "th_TH": "", "tr_TR": "", "uk_UA": "Згенерувати випадкову", - "zh_CN": "", + "zh_CN": "随机生成", "zh_TW": "" } }, @@ -22118,7 +22118,7 @@ "th_TH": "", "tr_TR": "", "uk_UA": "Генерує новий пароль, яким можна поділитися з іншими гравцями.", - "zh_CN": "", + "zh_CN": "生成一个新的密码,可以与其他玩家共享。", "zh_TW": "" } }, @@ -22143,7 +22143,7 @@ "th_TH": "", "tr_TR": "", "uk_UA": "Очистити", - "zh_CN": "", + "zh_CN": "清除", "zh_TW": "" } }, @@ -22168,7 +22168,7 @@ "th_TH": "", "tr_TR": "", "uk_UA": "Очищає поточну пароль, повертаючись до публічної мережі.", - "zh_CN": "", + "zh_CN": "清除当前密码,返回公共网络。", "zh_TW": "" } }, @@ -22193,7 +22193,7 @@ "th_TH": "", "tr_TR": "", "uk_UA": "Невірний пароль! Має бути в форматі \"Ryujinx-<8 символів>\"", - "zh_CN": "", + "zh_CN": "无效密码!密码的格式必须是\"Ryujinx-<8个十六进制字符>\"", "zh_TW": "" } }, @@ -22218,7 +22218,7 @@ "th_TH": "", "tr_TR": "", "uk_UA": "Вертикальна синхронізація (VSync):", - "zh_CN": "", + "zh_CN": "垂直同步(VSync)", "zh_TW": "" } }, @@ -22243,7 +22243,7 @@ "th_TH": "", "tr_TR": "", "uk_UA": "Увімкнути користувацьку частоту оновлення (Експериментально)", - "zh_CN": "", + "zh_CN": "启动自定义刷新率(实验性功能)", "zh_TW": "" } }, @@ -22293,7 +22293,7 @@ "th_TH": "", "tr_TR": "", "uk_UA": "Безмежна", - "zh_CN": "", + "zh_CN": "无限制", "zh_TW": "" } }, @@ -22318,7 +22318,7 @@ "th_TH": "", "tr_TR": "", "uk_UA": "Користувацька", - "zh_CN": "", + "zh_CN": "自定义刷新率", "zh_TW": "" } }, @@ -22343,7 +22343,7 @@ "th_TH": "", "tr_TR": "", "uk_UA": "Емульована вертикальна синхронізація. 'Switch' емулює частоту оновлення Switch 60 Гц. 'Безмежна' — частота оновлення не матиме обмежень.", - "zh_CN": "", + "zh_CN": "模拟垂直同步。“Switch”模拟了Switch的60Hz刷新率。“无限制”没有刷新率限制。", "zh_TW": "" } }, @@ -22368,7 +22368,7 @@ "th_TH": "", "tr_TR": "", "uk_UA": "Емульована вертикальна синхронізація. 'Switch' емулює частоту оновлення Switch 60 Гц. 'Безмежна' — частота оновлення не матиме обмежень. 'Користувацька' емулює вказану користувацьку частоту оновлення.", - "zh_CN": "", + "zh_CN": "模拟垂直同步。“Switch”模拟了Switch的60Hz刷新率。“无限制”没有刷新率限制。“自定义刷新率”模拟指定的自定义刷新率。", "zh_TW": "" } }, @@ -22393,7 +22393,7 @@ "th_TH": "", "tr_TR": "", "uk_UA": "Дозволяє користувачу вказати емульовану частоту оновлення. У деяких іграх це може прискорити або сповільнити логіку гри. У інших іграх це може дозволити обмежити FPS на певні кратні частоти оновлення або призвести до непередбачуваної поведінки. Це експериментальна функція, без гарантій того, як це вплине на ігровий процес. \n\nЗалиште ВИМКНЕНИМ, якщо не впевнені.", - "zh_CN": "", + "zh_CN": "允许用户指定模拟刷新率。在某些游戏中,这可能会加快或减慢游戏逻辑的速度。在其他游戏中,它可能允许将FPS限制在刷新率的某个倍数,或者导致不可预测的行为。这是一个实验性功能,无法保证游戏会受到怎样的影响。\n\n如果不确定,请关闭。", "zh_TW": "" } }, @@ -22418,7 +22418,7 @@ "th_TH": "", "tr_TR": "", "uk_UA": "Цільове значення користувацької частоти оновлення.", - "zh_CN": "", + "zh_CN": "目标自定义刷新率值。", "zh_TW": "" } }, @@ -22443,7 +22443,7 @@ "th_TH": "", "tr_TR": "", "uk_UA": "Користувацька частота оновлення, як відсоток від стандартної частоти оновлення Switch.", - "zh_CN": "", + "zh_CN": "自定义刷新率,占正常SWitch刷新率的百分比值。", "zh_TW": "" } }, @@ -22468,7 +22468,7 @@ "th_TH": "", "tr_TR": "", "uk_UA": "Користувацька частота оновлення %:", - "zh_CN": "", + "zh_CN": "自定义刷新率值 %:", "zh_TW": "" } }, @@ -22493,7 +22493,7 @@ "th_TH": "", "tr_TR": "", "uk_UA": "Значення користувацька частота оновлення:", - "zh_CN": "", + "zh_CN": "自定义刷新率值:", "zh_TW": "" } }, @@ -22518,7 +22518,7 @@ "th_TH": "", "tr_TR": "", "uk_UA": "", - "zh_CN": "", + "zh_CN": "间隔", "zh_TW": "" } }, @@ -22543,7 +22543,7 @@ "th_TH": "", "tr_TR": "", "uk_UA": "Перемкнути VSync режим:", - "zh_CN": "", + "zh_CN": "设置 VSync 模式:", "zh_TW": "" } }, @@ -22568,7 +22568,7 @@ "th_TH": "", "tr_TR": "", "uk_UA": "Підвищити користувацьку частоту оновлення", - "zh_CN": "", + "zh_CN": "提高自定义刷新率:", "zh_TW": "" } }, @@ -22593,7 +22593,7 @@ "th_TH": "", "tr_TR": "", "uk_UA": "Понизити користувацьку частоту оновлення", - "zh_CN": "", + "zh_CN": "降低自定义刷新率:", "zh_TW": "" } } From 18625cf77541c66e4c166759e749b4ae80c55a7c Mon Sep 17 00:00:00 2001 From: Evan Husted Date: Sat, 28 Dec 2024 02:45:33 -0600 Subject: [PATCH 39/60] Update nightly_pr_comment.yml --- .github/workflows/nightly_pr_comment.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/nightly_pr_comment.yml b/.github/workflows/nightly_pr_comment.yml index 9f9fcdcad..6023440f5 100644 --- a/.github/workflows/nightly_pr_comment.yml +++ b/.github/workflows/nightly_pr_comment.yml @@ -41,7 +41,7 @@ jobs: let hidden_headless_artifacts = `\n\n
GUI-less\n`; let hidden_debug_artifacts = `\n\n
Only for Developers\n`; for (const art of artifacts) { - var url = `https://github.com/Ryubing/Ryujinx/actions/runs/${run_id}/artifacts/${art_id}`; + var url = `https://github.com/Ryubing/Ryujinx/actions/runs/${run.id}/artifacts/${art.id}`; if(art.name.includes('Debug')) { hidden_debug_artifacts += `\n* [${art.name}](${url})`; } else if(art.name.includes('nogui-ryujinx')) { From 0c21b07f198b5ffaaf67fac0c00725b8761a88fc Mon Sep 17 00:00:00 2001 From: Evan Husted Date: Sat, 28 Dec 2024 03:01:59 -0600 Subject: [PATCH 40/60] Update nightly_pr_comment.yml --- .github/workflows/nightly_pr_comment.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/nightly_pr_comment.yml b/.github/workflows/nightly_pr_comment.yml index 6023440f5..b9128f13d 100644 --- a/.github/workflows/nightly_pr_comment.yml +++ b/.github/workflows/nightly_pr_comment.yml @@ -41,7 +41,7 @@ jobs: let hidden_headless_artifacts = `\n\n
GUI-less\n`; let hidden_debug_artifacts = `\n\n
Only for Developers\n`; for (const art of artifacts) { - var url = `https://github.com/Ryubing/Ryujinx/actions/runs/${run.id}/artifacts/${art.id}`; + const url = `https://github.com/Ryubing/Ryujinx/actions/runs/${run_id}/artifacts/${art.id}`; if(art.name.includes('Debug')) { hidden_debug_artifacts += `\n* [${art.name}](${url})`; } else if(art.name.includes('nogui-ryujinx')) { From 12b264af44a7491c33154c0c77f798a48fca7804 Mon Sep 17 00:00:00 2001 From: Evan Husted Date: Sat, 28 Dec 2024 03:49:06 -0600 Subject: [PATCH 41/60] Headless in Avalonia v2 (#448) Launch the Ryujinx.exe, first argument --no-gui or nogui, and the rest of the arguments should be your normal headless script. You can include the new option --use-main-config which will provide any arguments that you don't, filled in from your main config made by the UI. Input config is not inherited at this time. --- .github/workflows/build.yml | 23 - .github/workflows/canary.yml | 20 +- .github/workflows/nightly_pr_comment.yml | 5 - .github/workflows/release.yml | 17 +- Ryujinx.sln | 6 - src/Ryujinx.Common/Logging/Logger.cs | 20 +- .../Logging/Targets/AsyncLogTargetWrapper.cs | 6 +- .../Account/Acc/AccountSaveDataManager.cs | 16 +- .../Ryujinx.Headless.SDL2.csproj | 73 ---- src/Ryujinx.Headless.SDL2/Ryujinx.bmp | Bin 9354 -> 0 bytes .../Configuration/System/Language.cs | 1 + .../Helper/FileAssociationHelper.cs | 2 +- .../HeadlessDynamicTextInputHandler.cs | 2 +- .../Headless}/HeadlessHostUiTheme.cs | 2 +- src/Ryujinx/Headless/HeadlessRyujinx.Init.cs | 367 ++++++++++++++++ .../Headless/HeadlessRyujinx.cs} | 397 +++--------------- .../Headless}/Metal/MetalWindow.cs | 2 +- .../Headless}/OpenGL/OpenGLWindow.cs | 2 +- .../Headless}/Options.cs | 159 ++++++- src/Ryujinx/Headless/Ryujinx.bmp | Bin 0 -> 3978 bytes .../Headless}/StatusUpdatedEventArgs.cs | 2 +- .../Headless}/Vulkan/VulkanWindow.cs | 2 +- .../Headless}/WindowBase.cs | 7 +- src/Ryujinx/Program.cs | 17 +- src/Ryujinx/Ryujinx.csproj | 4 +- 25 files changed, 647 insertions(+), 505 deletions(-) delete mode 100644 src/Ryujinx.Headless.SDL2/Ryujinx.Headless.SDL2.csproj delete mode 100644 src/Ryujinx.Headless.SDL2/Ryujinx.bmp rename src/{Ryujinx.Headless.SDL2 => Ryujinx/Headless}/HeadlessDynamicTextInputHandler.cs (97%) rename src/{Ryujinx.Headless.SDL2 => Ryujinx/Headless}/HeadlessHostUiTheme.cs (93%) create mode 100644 src/Ryujinx/Headless/HeadlessRyujinx.Init.cs rename src/{Ryujinx.Headless.SDL2/Program.cs => Ryujinx/Headless/HeadlessRyujinx.cs} (53%) rename src/{Ryujinx.Headless.SDL2 => Ryujinx/Headless}/Metal/MetalWindow.cs (97%) rename src/{Ryujinx.Headless.SDL2 => Ryujinx/Headless}/OpenGL/OpenGLWindow.cs (99%) rename src/{Ryujinx.Headless.SDL2 => Ryujinx/Headless}/Options.cs (63%) create mode 100644 src/Ryujinx/Headless/Ryujinx.bmp rename src/{Ryujinx.Headless.SDL2 => Ryujinx/Headless}/StatusUpdatedEventArgs.cs (94%) rename src/{Ryujinx.Headless.SDL2 => Ryujinx/Headless}/Vulkan/VulkanWindow.cs (98%) rename src/{Ryujinx.Headless.SDL2 => Ryujinx/Headless}/WindowBase.cs (98%) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 21dc3eb0b..aeb12a575 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -64,14 +64,9 @@ jobs: run: dotnet publish -c "${{ matrix.configuration }}" -r "${{ matrix.platform.name }}" -o ./publish -p:Version="${{ env.RYUJINX_BASE_VERSION }}" -p:DebugType=embedded -p:SourceRevisionId="${{ steps.git_short_hash.outputs.result }}" -p:ExtraDefineConstants=DISABLE_UPDATER src/Ryujinx --self-contained if: github.event_name == 'pull_request' && matrix.platform.os != 'macos-13' - - name: Publish Ryujinx.Headless.SDL2 - run: dotnet publish -c "${{ matrix.configuration }}" -r "${{ matrix.platform.name }}" -o ./publish_sdl2_headless -p:Version="${{ env.RYUJINX_BASE_VERSION }}" -p:DebugType=embedded -p:SourceRevisionId="${{ steps.git_short_hash.outputs.result }}" -p:ExtraDefineConstants=DISABLE_UPDATER src/Ryujinx.Headless.SDL2 --self-contained - if: github.event_name == 'pull_request' && matrix.platform.os != 'macos-13' - - name: Set executable bit run: | chmod +x ./publish/Ryujinx ./publish/Ryujinx.sh - chmod +x ./publish_sdl2_headless/Ryujinx.Headless.SDL2 ./publish_sdl2_headless/Ryujinx.sh if: github.event_name == 'pull_request' && matrix.platform.os == 'ubuntu-latest' - name: Build AppImage @@ -119,13 +114,6 @@ jobs: name: ryujinx-${{ matrix.configuration }}-${{ env.RYUJINX_BASE_VERSION }}+${{ steps.git_short_hash.outputs.result }}-${{ matrix.platform.zip_os_name }}-AppImage path: publish_appimage - - name: Upload Ryujinx.Headless.SDL2 artifact - uses: actions/upload-artifact@v4 - with: - name: nogui-ryujinx-${{ matrix.configuration }}-${{ env.RYUJINX_BASE_VERSION }}+${{ steps.git_short_hash.outputs.result }}-${{ matrix.platform.zip_os_name }} - path: publish_sdl2_headless - if: github.event_name == 'pull_request' && matrix.platform.os != 'macos-13' - build_macos: name: macOS Universal (${{ matrix.configuration }}) runs-on: ubuntu-latest @@ -171,20 +159,9 @@ jobs: run: | ./distribution/macos/create_macos_build_ava.sh . publish_tmp publish ./distribution/macos/entitlements.xml "${{ env.RYUJINX_BASE_VERSION }}" "${{ steps.git_short_hash.outputs.result }}" "${{ matrix.configuration }}" "-p:ExtraDefineConstants=DISABLE_UPDATER" - - name: Publish macOS Ryujinx.Headless.SDL2 - run: | - ./distribution/macos/create_macos_build_headless.sh . publish_tmp_headless publish_headless ./distribution/macos/entitlements.xml "${{ env.RYUJINX_BASE_VERSION }}" "${{ steps.git_short_hash.outputs.result }}" "${{ matrix.configuration }}" "-p:ExtraDefineConstants=DISABLE_UPDATER" - - name: Upload Ryujinx artifact uses: actions/upload-artifact@v4 with: name: ryujinx-${{ matrix.configuration }}-${{ env.RYUJINX_BASE_VERSION }}+${{ steps.git_short_hash.outputs.result }}-macos_universal path: "publish/*.tar.gz" if: github.event_name == 'pull_request' - - - name: Upload Ryujinx.Headless.SDL2 artifact - uses: actions/upload-artifact@v4 - with: - name: nogui-ryujinx-${{ matrix.configuration }}-${{ env.RYUJINX_BASE_VERSION }}+${{ steps.git_short_hash.outputs.result }}-macos_universal - path: "publish_headless/*.tar.gz" - if: github.event_name == 'pull_request' diff --git a/.github/workflows/canary.yml b/.github/workflows/canary.yml index c17b06046..a0653f540 100644 --- a/.github/workflows/canary.yml +++ b/.github/workflows/canary.yml @@ -116,7 +116,6 @@ jobs: - name: Publish run: | dotnet publish -c Release -r "${{ matrix.platform.name }}" -o ./publish_ava/publish -p:Version="${{ steps.version_info.outputs.build_version }}" -p:SourceRevisionId="${{ steps.version_info.outputs.git_short_hash }}" -p:DebugType=embedded src/Ryujinx --self-contained - dotnet publish -c Release -r "${{ matrix.platform.name }}" -o ./publish_sdl2_headless/publish -p:Version="${{ steps.version_info.outputs.build_version }}" -p:SourceRevisionId="${{ steps.version_info.outputs.git_short_hash }}" -p:DebugType=embedded src/Ryujinx.Headless.SDL2 --self-contained - name: Packing Windows builds if: matrix.platform.os == 'windows-latest' @@ -125,11 +124,6 @@ jobs: rm publish/libarmeilleure-jitsupport.dylib 7z a ../release_output/ryujinx-canary-${{ steps.version_info.outputs.build_version }}-${{ matrix.platform.zip_os_name }}.zip publish popd - - pushd publish_sdl2_headless - rm publish/libarmeilleure-jitsupport.dylib - 7z a ../release_output/nogui-ryujinx-canary-${{ steps.version_info.outputs.build_version }}-${{ matrix.platform.zip_os_name }}.zip publish - popd shell: bash - name: Packing Linux builds @@ -140,12 +134,6 @@ jobs: chmod +x publish/Ryujinx.sh publish/Ryujinx tar -czvf ../release_output/ryujinx-canary-${{ steps.version_info.outputs.build_version }}-${{ matrix.platform.zip_os_name }}.tar.gz publish popd - - pushd publish_sdl2_headless - rm publish/libarmeilleure-jitsupport.dylib - chmod +x publish/Ryujinx.sh publish/Ryujinx.Headless.SDL2 - tar -czvf ../release_output/nogui-ryujinx-canary-${{ steps.version_info.outputs.build_version }}-${{ matrix.platform.zip_os_name }}.tar.gz publish - popd shell: bash #- name: Build AppImage (Linux) @@ -191,7 +179,7 @@ jobs: with: name: ${{ steps.version_info.outputs.build_version }} artifacts: "release_output/*.tar.gz,release_output/*.zip" - #artifacts: "release_output/*.tar.gz,release_output/*.zip/*AppImage*" + #artifacts: "release_output/*.tar.gz,release_output/*.zip,release_output/*AppImage*" tag: ${{ steps.version_info.outputs.build_version }} body: | # Canary builds: @@ -262,15 +250,11 @@ jobs: run: | ./distribution/macos/create_macos_build_ava.sh . publish_tmp_ava publish_ava ./distribution/macos/entitlements.xml "${{ steps.version_info.outputs.build_version }}" "${{ steps.version_info.outputs.git_short_hash }}" Release 1 - - name: Publish macOS Ryujinx.Headless.SDL2 - run: | - ./distribution/macos/create_macos_build_headless.sh . publish_tmp_headless publish_headless ./distribution/macos/entitlements.xml "${{ steps.version_info.outputs.build_version }}" "${{ steps.version_info.outputs.git_short_hash }}" Release 1 - - name: Pushing new release uses: ncipollo/release-action@v1 with: name: "Canary ${{ steps.version_info.outputs.build_version }}" - artifacts: "publish_ava/*.tar.gz, publish_headless/*.tar.gz" + artifacts: "publish_ava/*.tar.gz" tag: ${{ steps.version_info.outputs.build_version }} body: "" omitBodyDuringUpdate: true diff --git a/.github/workflows/nightly_pr_comment.yml b/.github/workflows/nightly_pr_comment.yml index b9128f13d..6ca4710dc 100644 --- a/.github/workflows/nightly_pr_comment.yml +++ b/.github/workflows/nightly_pr_comment.yml @@ -38,21 +38,16 @@ jobs: return core.error(`No artifacts found`); } let body = `Download the artifacts for this pull request:\n`; - let hidden_headless_artifacts = `\n\n
GUI-less\n`; let hidden_debug_artifacts = `\n\n
Only for Developers\n`; for (const art of artifacts) { const url = `https://github.com/Ryubing/Ryujinx/actions/runs/${run_id}/artifacts/${art.id}`; if(art.name.includes('Debug')) { hidden_debug_artifacts += `\n* [${art.name}](${url})`; - } else if(art.name.includes('nogui-ryujinx')) { - hidden_headless_artifacts += `\n* [${art.name}](${url})`; } else { body += `\n* [${art.name}](${url})`; } } - hidden_headless_artifacts += `\n
`; hidden_debug_artifacts += `\n
`; - body += hidden_headless_artifacts; body += hidden_debug_artifacts; const {data: comments} = await github.rest.issues.listComments({repo, owner, issue_number}); diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index a24b58a5d..584507d75 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -112,7 +112,6 @@ jobs: - name: Publish run: | dotnet publish -c Release -r "${{ matrix.platform.name }}" -o ./publish -p:Version="${{ steps.version_info.outputs.build_version }}" -p:SourceRevisionId="${{ steps.version_info.outputs.git_short_hash }}" -p:DebugType=embedded src/Ryujinx --self-contained - dotnet publish -c Release -r "${{ matrix.platform.name }}" -o ./publish_sdl2_headless -p:Version="${{ steps.version_info.outputs.build_version }}" -p:SourceRevisionId="${{ steps.version_info.outputs.git_short_hash }}" -p:DebugType=embedded src/Ryujinx.Headless.SDL2 --self-contained - name: Packing Windows builds if: matrix.platform.os == 'windows-latest' @@ -121,11 +120,6 @@ jobs: rm libarmeilleure-jitsupport.dylib 7z a ../release_output/ryujinx-${{ steps.version_info.outputs.build_version }}-${{ matrix.platform.zip_os_name }}.zip ../publish popd - - pushd publish_sdl2_headless - rm libarmeilleure-jitsupport.dylib - 7z a ../release_output/nogui-ryujinx-${{ steps.version_info.outputs.build_version }}-${{ matrix.platform.zip_os_name }}.zip ../publish - popd shell: bash - name: Build AppImage (Linux) @@ -172,11 +166,6 @@ jobs: chmod +x Ryujinx.sh Ryujinx tar -czvf ../release_output/ryujinx-${{ steps.version_info.outputs.build_version }}-${{ matrix.platform.zip_os_name }}.tar.gz ../publish popd - - pushd publish_sdl2_headless - chmod +x Ryujinx.sh Ryujinx.Headless.SDL2 - tar -czvf ../release_output/nogui-ryujinx-${{ steps.version_info.outputs.build_version }}-${{ matrix.platform.zip_os_name }}.tar.gz ../publish - popd shell: bash - name: Pushing new release @@ -251,15 +240,11 @@ jobs: run: | ./distribution/macos/create_macos_build_ava.sh . publish_tmp_ava publish ./distribution/macos/entitlements.xml "${{ steps.version_info.outputs.build_version }}" "${{ steps.version_info.outputs.git_short_hash }}" Release 0 - - name: Publish macOS Ryujinx.Headless.SDL2 - run: | - ./distribution/macos/create_macos_build_headless.sh . publish_tmp_headless publish_headless ./distribution/macos/entitlements.xml "${{ steps.version_info.outputs.build_version }}" "${{ steps.version_info.outputs.git_short_hash }}" Release 0 - - name: Pushing new release uses: ncipollo/release-action@v1 with: name: ${{ steps.version_info.outputs.build_version }} - artifacts: "publish/*.tar.gz, publish_headless/*.tar.gz" + artifacts: "publish/*.tar.gz" tag: ${{ steps.version_info.outputs.build_version }} body: "" omitBodyDuringUpdate: true diff --git a/Ryujinx.sln b/Ryujinx.sln index e9f57df39..87c1021c1 100644 --- a/Ryujinx.sln +++ b/Ryujinx.sln @@ -57,8 +57,6 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Ryujinx.SDL2.Common", "src\ EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Ryujinx.Audio.Backends.SDL2", "src\Ryujinx.Audio.Backends.SDL2\Ryujinx.Audio.Backends.SDL2.csproj", "{D99A395A-8569-4DB0-B336-900647890052}" EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Ryujinx.Headless.SDL2", "src\Ryujinx.Headless.SDL2\Ryujinx.Headless.SDL2.csproj", "{390DC343-5CB4-4C79-A5DD-E3ED235E4C49}" -EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Ryujinx.Graphics.Nvdec.FFmpeg", "src\Ryujinx.Graphics.Nvdec.FFmpeg\Ryujinx.Graphics.Nvdec.FFmpeg.csproj", "{BEE1C184-C9A4-410B-8DFC-FB74D5C93AEB}" EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Ryujinx", "src\Ryujinx\Ryujinx.csproj", "{7C1B2721-13DA-4B62-B046-C626605ECCE6}" @@ -213,10 +211,6 @@ Global {D99A395A-8569-4DB0-B336-900647890052}.Debug|Any CPU.Build.0 = Debug|Any CPU {D99A395A-8569-4DB0-B336-900647890052}.Release|Any CPU.ActiveCfg = Release|Any CPU {D99A395A-8569-4DB0-B336-900647890052}.Release|Any CPU.Build.0 = Release|Any CPU - {390DC343-5CB4-4C79-A5DD-E3ED235E4C49}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {390DC343-5CB4-4C79-A5DD-E3ED235E4C49}.Debug|Any CPU.Build.0 = Debug|Any CPU - {390DC343-5CB4-4C79-A5DD-E3ED235E4C49}.Release|Any CPU.ActiveCfg = Release|Any CPU - {390DC343-5CB4-4C79-A5DD-E3ED235E4C49}.Release|Any CPU.Build.0 = Release|Any CPU {BEE1C184-C9A4-410B-8DFC-FB74D5C93AEB}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {BEE1C184-C9A4-410B-8DFC-FB74D5C93AEB}.Debug|Any CPU.Build.0 = Debug|Any CPU {BEE1C184-C9A4-410B-8DFC-FB74D5C93AEB}.Release|Any CPU.ActiveCfg = Release|Any CPU diff --git a/src/Ryujinx.Common/Logging/Logger.cs b/src/Ryujinx.Common/Logging/Logger.cs index 26d343969..6ea6b7ac3 100644 --- a/src/Ryujinx.Common/Logging/Logger.cs +++ b/src/Ryujinx.Common/Logging/Logger.cs @@ -4,6 +4,7 @@ using System; using System.Collections.Generic; using System.Diagnostics; using System.IO; +using System.Linq; using System.Runtime.CompilerServices; using System.Threading; @@ -157,21 +158,16 @@ namespace Ryujinx.Common.Logging _time.Restart(); } - private static ILogTarget GetTarget(string targetName) - { - foreach (var target in _logTargets) - { - if (target.Name.Equals(targetName)) - { - return target; - } - } - - return null; - } + private static ILogTarget GetTarget(string targetName) + => _logTargets.FirstOrDefault(target => target.Name.Equals(targetName)); public static void AddTarget(ILogTarget target) { + if (_logTargets.Any(t => t.Name == target.Name)) + { + return; + } + _logTargets.Add(target); Updated += target.Log; diff --git a/src/Ryujinx.Common/Logging/Targets/AsyncLogTargetWrapper.cs b/src/Ryujinx.Common/Logging/Targets/AsyncLogTargetWrapper.cs index a9dbe646a..1fcfea4da 100644 --- a/src/Ryujinx.Common/Logging/Targets/AsyncLogTargetWrapper.cs +++ b/src/Ryujinx.Common/Logging/Targets/AsyncLogTargetWrapper.cs @@ -27,11 +27,7 @@ namespace Ryujinx.Common.Logging.Targets private readonly int _overflowTimeout; - string ILogTarget.Name { get => _target.Name; } - - public AsyncLogTargetWrapper(ILogTarget target) - : this(target, -1) - { } + string ILogTarget.Name => _target.Name; public AsyncLogTargetWrapper(ILogTarget target, int queueLimit = -1, AsyncLogTargetOverflowAction overflowAction = AsyncLogTargetOverflowAction.Block) { diff --git a/src/Ryujinx.HLE/HOS/Services/Account/Acc/AccountSaveDataManager.cs b/src/Ryujinx.HLE/HOS/Services/Account/Acc/AccountSaveDataManager.cs index b1ef0761c..aa57a0310 100644 --- a/src/Ryujinx.HLE/HOS/Services/Account/Acc/AccountSaveDataManager.cs +++ b/src/Ryujinx.HLE/HOS/Services/Account/Acc/AccountSaveDataManager.cs @@ -1,3 +1,4 @@ +using Gommon; using Ryujinx.Common.Configuration; using Ryujinx.Common.Logging; using Ryujinx.Common.Utilities; @@ -6,12 +7,13 @@ using System; using System.Collections.Concurrent; using System.Collections.Generic; using System.IO; +using System.Linq; namespace Ryujinx.HLE.HOS.Services.Account.Acc { - class AccountSaveDataManager + public class AccountSaveDataManager { - private readonly string _profilesJsonPath = Path.Join(AppDataManager.BaseDirPath, "system", "Profiles.json"); + private static readonly string _profilesJsonPath = Path.Join(AppDataManager.BaseDirPath, "system", "Profiles.json"); private static readonly ProfilesJsonSerializerContext _serializerContext = new(JsonHelper.GetDefaultSerializerOptions()); @@ -49,6 +51,16 @@ namespace Ryujinx.HLE.HOS.Services.Account.Acc } } + public static Optional GetLastUsedUser() + { + ProfilesJson profilesJson = JsonHelper.DeserializeFromFile(_profilesJsonPath, _serializerContext.ProfilesJson); + + return profilesJson.Profiles + .FindFirst(profile => profile.AccountState == AccountState.Open) + .Convert(profileJson => new UserProfile(new UserId(profileJson.UserId), profileJson.Name, + profileJson.Image, profileJson.LastModifiedTimestamp)); + } + public void Save(ConcurrentDictionary profiles) { ProfilesJson profilesJson = new() diff --git a/src/Ryujinx.Headless.SDL2/Ryujinx.Headless.SDL2.csproj b/src/Ryujinx.Headless.SDL2/Ryujinx.Headless.SDL2.csproj deleted file mode 100644 index d39f2b481..000000000 --- a/src/Ryujinx.Headless.SDL2/Ryujinx.Headless.SDL2.csproj +++ /dev/null @@ -1,73 +0,0 @@ - - - - win-x64;osx-x64;linux-x64 - Exe - true - 1.0.0-dirty - $(DefineConstants);$(ExtraDefineConstants) - - - true - $(DefaultItemExcludes);._* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Always - THIRDPARTY.md - - - Always - LICENSE.txt - - - - - - Always - - - - - - - - - - false - ..\Ryujinx\Ryujinx.ico - - - - true - true - partial - - diff --git a/src/Ryujinx.Headless.SDL2/Ryujinx.bmp b/src/Ryujinx.Headless.SDL2/Ryujinx.bmp deleted file mode 100644 index 1daa7ce9406ae1ad56b4e697582c3e746a52da7e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9354 zcmdU!eN2^A9LLY)lBHX$!m=%_+j6d?ISFlR(`2l-^|BHWB)J5LjMbtf%yhNUAC}W) z%RgHFk+YY%_3E0gmswW8r9W_sxm9MO754&8)Us7->C@-?-21@e1>pj&=ef`PaGt~E znV)l>-#O=Z&Mkak{S0GY>-qUC%t;V1ArsUmeBPQBN7eXc8594fs#SP*(NoPWf8JR2 z>9tpe)*cBIZ_b@S%Q^QZg}oKf-eEs2NiBGX;*_5|0L&Z>UTmFR3}kG zeJM$v4ui$-j>BB=!e4D!=J?AY!6eFO z-~`BVB)s;om4CE7;J63yZG@Afcsp(Kg@4ar-xuQDpQ5`T;>YfPeAWMx;iECQ`^|qI z?#I&D|6$xU&p5H2O6iOE$64`HJ4W{*@pHJ}cgO#P{iE#}%w<6nP0RZe?wofl!Sx`763$NS`_W%**aSQKJ4{AnQ->UHf?wcXpZZ^cZyl_F z2G|a4bTV+!7u$U|IeTYh<&^KH`)@JFpY*?zv*B!yuI;0Z8G>V2{P4mm&Rjtra!EW};8+`Ro?TqS?Sy2kG|^12MQA%W-Xm%IOUkF()i zKx4WIa#h!PF~0Xe9VjpLuRnX4n7yB2PZJ56?ntI7z{|}t&YnTh /// Headless text processing class, right now there is no way to forward the input to it. diff --git a/src/Ryujinx.Headless.SDL2/HeadlessHostUiTheme.cs b/src/Ryujinx/Headless/HeadlessHostUiTheme.cs similarity index 93% rename from src/Ryujinx.Headless.SDL2/HeadlessHostUiTheme.cs rename to src/Ryujinx/Headless/HeadlessHostUiTheme.cs index 78cd43ae5..b5e1ce526 100644 --- a/src/Ryujinx.Headless.SDL2/HeadlessHostUiTheme.cs +++ b/src/Ryujinx/Headless/HeadlessHostUiTheme.cs @@ -1,6 +1,6 @@ using Ryujinx.HLE.UI; -namespace Ryujinx.Headless.SDL2 +namespace Ryujinx.Headless { internal class HeadlessHostUiTheme : IHostUITheme { diff --git a/src/Ryujinx/Headless/HeadlessRyujinx.Init.cs b/src/Ryujinx/Headless/HeadlessRyujinx.Init.cs new file mode 100644 index 000000000..ba84e53a5 --- /dev/null +++ b/src/Ryujinx/Headless/HeadlessRyujinx.Init.cs @@ -0,0 +1,367 @@ +using DiscordRPC; +using LibHac.Tools.FsSystem; +using Ryujinx.Audio.Backends.SDL2; +using Ryujinx.Ava; +using Ryujinx.Common.Configuration; +using Ryujinx.Common.Configuration.Hid; +using Ryujinx.Common.Configuration.Hid.Controller; +using Ryujinx.Common.Configuration.Hid.Controller.Motion; +using Ryujinx.Common.Configuration.Hid.Keyboard; +using Ryujinx.Common.Logging; +using Ryujinx.Common.Utilities; +using Ryujinx.Graphics.GAL; +using Ryujinx.Graphics.GAL.Multithreading; +using Ryujinx.Graphics.Metal; +using Ryujinx.Graphics.OpenGL; +using Ryujinx.Graphics.Vulkan; +using Ryujinx.HLE; +using Ryujinx.Input; +using Ryujinx.UI.Common; +using Ryujinx.UI.Common.Configuration; +using Silk.NET.Vulkan; +using System; +using System.IO; +using System.Text.Json; +using System.Threading.Tasks; +using ConfigGamepadInputId = Ryujinx.Common.Configuration.Hid.Controller.GamepadInputId; +using ConfigStickInputId = Ryujinx.Common.Configuration.Hid.Controller.StickInputId; +using Key = Ryujinx.Common.Configuration.Hid.Key; + +namespace Ryujinx.Headless +{ + public partial class HeadlessRyujinx + { + public static void Initialize() + { + // Ensure Discord presence timestamp begins at the absolute start of when Ryujinx is launched + DiscordIntegrationModule.StartedAt = Timestamps.Now; + + // Delete backup files after updating. + Task.Run(Updater.CleanupUpdate); + + // Hook unhandled exception and process exit events. + AppDomain.CurrentDomain.UnhandledException += (sender, e) + => Program.ProcessUnhandledException(sender, e.ExceptionObject as Exception, e.IsTerminating); + AppDomain.CurrentDomain.ProcessExit += (_, _) => Program.Exit(); + + // Initialize the configuration. + ConfigurationState.Initialize(); + + // Initialize Discord integration. + DiscordIntegrationModule.Initialize(); + + // Logging system information. + Program.PrintSystemInfo(); + } + + private static InputConfig HandlePlayerConfiguration(string inputProfileName, string inputId, PlayerIndex index) + { + if (inputId == null) + { + if (index == PlayerIndex.Player1) + { + Logger.Info?.Print(LogClass.Application, $"{index} not configured, defaulting to default keyboard."); + + // Default to keyboard + inputId = "0"; + } + else + { + Logger.Info?.Print(LogClass.Application, $"{index} not configured"); + + return null; + } + } + + IGamepad gamepad = _inputManager.KeyboardDriver.GetGamepad(inputId); + + bool isKeyboard = true; + + if (gamepad == null) + { + gamepad = _inputManager.GamepadDriver.GetGamepad(inputId); + isKeyboard = false; + + if (gamepad == null) + { + Logger.Error?.Print(LogClass.Application, $"{index} gamepad not found (\"{inputId}\")"); + + return null; + } + } + + string gamepadName = gamepad.Name; + + gamepad.Dispose(); + + InputConfig config; + + if (inputProfileName == null || inputProfileName.Equals("default")) + { + if (isKeyboard) + { + config = new StandardKeyboardInputConfig + { + Version = InputConfig.CurrentVersion, + Backend = InputBackendType.WindowKeyboard, + Id = null, + ControllerType = ControllerType.JoyconPair, + LeftJoycon = new LeftJoyconCommonConfig + { + DpadUp = Key.Up, + DpadDown = Key.Down, + DpadLeft = Key.Left, + DpadRight = Key.Right, + ButtonMinus = Key.Minus, + ButtonL = Key.E, + ButtonZl = Key.Q, + ButtonSl = Key.Unbound, + ButtonSr = Key.Unbound, + }, + + LeftJoyconStick = new JoyconConfigKeyboardStick + { + StickUp = Key.W, + StickDown = Key.S, + StickLeft = Key.A, + StickRight = Key.D, + StickButton = Key.F, + }, + + RightJoycon = new RightJoyconCommonConfig + { + ButtonA = Key.Z, + ButtonB = Key.X, + ButtonX = Key.C, + ButtonY = Key.V, + ButtonPlus = Key.Plus, + ButtonR = Key.U, + ButtonZr = Key.O, + ButtonSl = Key.Unbound, + ButtonSr = Key.Unbound, + }, + + RightJoyconStick = new JoyconConfigKeyboardStick + { + StickUp = Key.I, + StickDown = Key.K, + StickLeft = Key.J, + StickRight = Key.L, + StickButton = Key.H, + }, + }; + } + else + { + bool isNintendoStyle = gamepadName.Contains("Nintendo"); + + config = new StandardControllerInputConfig + { + Version = InputConfig.CurrentVersion, + Backend = InputBackendType.GamepadSDL2, + Id = null, + ControllerType = ControllerType.JoyconPair, + DeadzoneLeft = 0.1f, + DeadzoneRight = 0.1f, + RangeLeft = 1.0f, + RangeRight = 1.0f, + TriggerThreshold = 0.5f, + LeftJoycon = new LeftJoyconCommonConfig + { + DpadUp = ConfigGamepadInputId.DpadUp, + DpadDown = ConfigGamepadInputId.DpadDown, + DpadLeft = ConfigGamepadInputId.DpadLeft, + DpadRight = ConfigGamepadInputId.DpadRight, + ButtonMinus = ConfigGamepadInputId.Minus, + ButtonL = ConfigGamepadInputId.LeftShoulder, + ButtonZl = ConfigGamepadInputId.LeftTrigger, + ButtonSl = ConfigGamepadInputId.Unbound, + ButtonSr = ConfigGamepadInputId.Unbound, + }, + + LeftJoyconStick = new JoyconConfigControllerStick + { + Joystick = ConfigStickInputId.Left, + StickButton = ConfigGamepadInputId.LeftStick, + InvertStickX = false, + InvertStickY = false, + Rotate90CW = false, + }, + + RightJoycon = new RightJoyconCommonConfig + { + ButtonA = isNintendoStyle ? ConfigGamepadInputId.A : ConfigGamepadInputId.B, + ButtonB = isNintendoStyle ? ConfigGamepadInputId.B : ConfigGamepadInputId.A, + ButtonX = isNintendoStyle ? ConfigGamepadInputId.X : ConfigGamepadInputId.Y, + ButtonY = isNintendoStyle ? ConfigGamepadInputId.Y : ConfigGamepadInputId.X, + ButtonPlus = ConfigGamepadInputId.Plus, + ButtonR = ConfigGamepadInputId.RightShoulder, + ButtonZr = ConfigGamepadInputId.RightTrigger, + ButtonSl = ConfigGamepadInputId.Unbound, + ButtonSr = ConfigGamepadInputId.Unbound, + }, + + RightJoyconStick = new JoyconConfigControllerStick + { + Joystick = ConfigStickInputId.Right, + StickButton = ConfigGamepadInputId.RightStick, + InvertStickX = false, + InvertStickY = false, + Rotate90CW = false, + }, + + Motion = new StandardMotionConfigController + { + MotionBackend = MotionInputBackendType.GamepadDriver, + EnableMotion = true, + Sensitivity = 100, + GyroDeadzone = 1, + }, + Rumble = new RumbleConfigController + { + StrongRumble = 1f, + WeakRumble = 1f, + EnableRumble = false, + }, + }; + } + } + else + { + string profileBasePath; + + if (isKeyboard) + { + profileBasePath = Path.Combine(AppDataManager.ProfilesDirPath, "keyboard"); + } + else + { + profileBasePath = Path.Combine(AppDataManager.ProfilesDirPath, "controller"); + } + + string path = Path.Combine(profileBasePath, inputProfileName + ".json"); + + if (!File.Exists(path)) + { + Logger.Error?.Print(LogClass.Application, $"Input profile \"{inputProfileName}\" not found for \"{inputId}\""); + + return null; + } + + try + { + config = JsonHelper.DeserializeFromFile(path, _serializerContext.InputConfig); + } + catch (JsonException) + { + Logger.Error?.Print(LogClass.Application, $"Input profile \"{inputProfileName}\" parsing failed for \"{inputId}\""); + + return null; + } + } + + config.Id = inputId; + config.PlayerIndex = index; + + string inputTypeName = isKeyboard ? "Keyboard" : "Gamepad"; + + Logger.Info?.Print(LogClass.Application, $"{config.PlayerIndex} configured with {inputTypeName} \"{config.Id}\""); + + // If both stick ranges are 0 (usually indicative of an outdated profile load) then both sticks will be set to 1.0. + if (config is StandardControllerInputConfig controllerConfig) + { + if (controllerConfig.RangeLeft <= 0.0f && controllerConfig.RangeRight <= 0.0f) + { + controllerConfig.RangeLeft = 1.0f; + controllerConfig.RangeRight = 1.0f; + + Logger.Info?.Print(LogClass.Application, $"{config.PlayerIndex} stick range reset. Save the profile now to update your configuration"); + } + } + + return config; + } + + private static IRenderer CreateRenderer(Options options, WindowBase window) + { + if (options.GraphicsBackend == GraphicsBackend.Vulkan && window is VulkanWindow vulkanWindow) + { + string preferredGpuId = string.Empty; + Vk api = Vk.GetApi(); + + if (!string.IsNullOrEmpty(options.PreferredGPUVendor)) + { + string preferredGpuVendor = options.PreferredGPUVendor.ToLowerInvariant(); + var devices = VulkanRenderer.GetPhysicalDevices(api); + + foreach (var device in devices) + { + if (device.Vendor.ToLowerInvariant() == preferredGpuVendor) + { + preferredGpuId = device.Id; + break; + } + } + } + + return new VulkanRenderer( + api, + (instance, vk) => new SurfaceKHR((ulong)(vulkanWindow.CreateWindowSurface(instance.Handle))), + vulkanWindow.GetRequiredInstanceExtensions, + preferredGpuId); + } + + if (options.GraphicsBackend == GraphicsBackend.Metal && window is MetalWindow metalWindow && OperatingSystem.IsMacOS()) + { + return new MetalRenderer(metalWindow.GetLayer); + } + + return new OpenGLRenderer(); + } + + private static Switch InitializeEmulationContext(WindowBase window, IRenderer renderer, Options options) + { + BackendThreading threadingMode = options.BackendThreading; + + bool threadedGAL = threadingMode == BackendThreading.On || (threadingMode == BackendThreading.Auto && renderer.PreferThreading); + + if (threadedGAL) + { + renderer = new ThreadedRenderer(renderer); + } + + HLEConfiguration configuration = new(_virtualFileSystem, + _libHacHorizonManager, + _contentManager, + _accountManager, + _userChannelPersistence, + renderer, + new SDL2HardwareDeviceDriver(), + options.DramSize, + window, + options.SystemLanguage, + options.SystemRegion, + options.VSyncMode, + !options.DisableDockedMode, + !options.DisablePTC, + options.EnableInternetAccess, + !options.DisableFsIntegrityChecks ? IntegrityCheckLevel.ErrorOnInvalid : IntegrityCheckLevel.None, + options.FsGlobalAccessLogMode, + options.SystemTimeOffset, + options.SystemTimeZone, + options.MemoryManagerMode, + options.IgnoreMissingServices, + options.AspectRatio, + options.AudioVolume, + options.UseHypervisor ?? true, + options.MultiplayerLanInterfaceId, + Common.Configuration.Multiplayer.MultiplayerMode.Disabled, + false, + string.Empty, + string.Empty, + options.CustomVSyncInterval); + + return new Switch(configuration); + } + } +} diff --git a/src/Ryujinx.Headless.SDL2/Program.cs b/src/Ryujinx/Headless/HeadlessRyujinx.cs similarity index 53% rename from src/Ryujinx.Headless.SDL2/Program.cs rename to src/Ryujinx/Headless/HeadlessRyujinx.cs index ea789095e..eabe72cbe 100644 --- a/src/Ryujinx.Headless.SDL2/Program.cs +++ b/src/Ryujinx/Headless/HeadlessRyujinx.cs @@ -1,13 +1,9 @@ using CommandLine; using Gommon; -using LibHac.Tools.FsSystem; -using Ryujinx.Audio.Backends.SDL2; +using Ryujinx.Ava; using Ryujinx.Common; using Ryujinx.Common.Configuration; using Ryujinx.Common.Configuration.Hid; -using Ryujinx.Common.Configuration.Hid.Controller; -using Ryujinx.Common.Configuration.Hid.Controller.Motion; -using Ryujinx.Common.Configuration.Hid.Keyboard; using Ryujinx.Common.GraphicsDriver; using Ryujinx.Common.Logging; using Ryujinx.Common.Logging.Targets; @@ -15,16 +11,12 @@ using Ryujinx.Common.SystemInterop; using Ryujinx.Common.Utilities; using Ryujinx.Cpu; using Ryujinx.Graphics.GAL; -using Ryujinx.Graphics.GAL.Multithreading; using Ryujinx.Graphics.Gpu; using Ryujinx.Graphics.Gpu.Shader; using Ryujinx.Graphics.Metal; using Ryujinx.Graphics.OpenGL; using Ryujinx.Graphics.Vulkan; using Ryujinx.Graphics.Vulkan.MoltenVK; -using Ryujinx.Headless.SDL2.Metal; -using Ryujinx.Headless.SDL2.OpenGL; -using Ryujinx.Headless.SDL2.Vulkan; using Ryujinx.HLE; using Ryujinx.HLE.FileSystem; using Ryujinx.HLE.HOS; @@ -33,22 +25,16 @@ using Ryujinx.Input; using Ryujinx.Input.HLE; using Ryujinx.Input.SDL2; using Ryujinx.SDL2.Common; -using Silk.NET.Vulkan; +using Ryujinx.UI.Common.Configuration; using System; using System.Collections.Generic; using System.IO; -using System.Text.Json; using System.Threading; -using ConfigGamepadInputId = Ryujinx.Common.Configuration.Hid.Controller.GamepadInputId; -using ConfigStickInputId = Ryujinx.Common.Configuration.Hid.Controller.StickInputId; -using Key = Ryujinx.Common.Configuration.Hid.Key; -namespace Ryujinx.Headless.SDL2 +namespace Ryujinx.Headless { - class Program + public partial class HeadlessRyujinx { - public static string Version { get; private set; } - private static VirtualFileSystem _virtualFileSystem; private static ContentManager _contentManager; private static AccountManager _accountManager; @@ -58,20 +44,18 @@ namespace Ryujinx.Headless.SDL2 private static Switch _emulationContext; private static WindowBase _window; private static WindowsMultimediaTimerResolution _windowsMultimediaTimerResolution; - private static List _inputConfiguration; + private static List _inputConfiguration = []; private static bool _enableKeyboard; private static bool _enableMouse; private static readonly InputConfigJsonSerializerContext _serializerContext = new(JsonHelper.GetDefaultSerializerOptions()); - static void Main(string[] args) + public static void Entrypoint(string[] args) { - Version = ReleaseInformation.Version; - // Make process DPI aware for proper window sizing on high-res screens. ForceDpiAware.Windows(); - Console.Title = $"Ryujinx Console {Version} (Headless SDL2)"; + Console.Title = $"Ryujinx Console {Program.Version} (Headless)"; if (OperatingSystem.IsMacOS() || OperatingSystem.IsLinux()) { @@ -99,7 +83,7 @@ namespace Ryujinx.Headless.SDL2 } Parser.Default.ParseArguments(args) - .WithParsed(Load) + .WithParsed(options => Load(args, options)) .WithNotParsed(errors => { Logger.Error?.PrintMsg(LogClass.Application, "Error parsing command-line arguments:"); @@ -107,239 +91,81 @@ namespace Ryujinx.Headless.SDL2 errors.ForEach(err => Logger.Error?.PrintMsg(LogClass.Application, $" - {err.Tag}")); }); } - - private static InputConfig HandlePlayerConfiguration(string inputProfileName, string inputId, PlayerIndex index) + + public static void ReloadConfig(string customConfigPath = null) { - if (inputId == null) + string localConfigurationPath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, ReleaseInformation.ConfigName); + string appDataConfigurationPath = Path.Combine(AppDataManager.BaseDirPath, ReleaseInformation.ConfigName); + + string configurationPath = null; + + // Now load the configuration as the other subsystems are now registered + if (customConfigPath != null && File.Exists(customConfigPath)) { - if (index == PlayerIndex.Player1) - { - Logger.Info?.Print(LogClass.Application, $"{index} not configured, defaulting to default keyboard."); - - // Default to keyboard - inputId = "0"; - } - else - { - Logger.Info?.Print(LogClass.Application, $"{index} not configured"); - - return null; - } + configurationPath = customConfigPath; + } + else if (File.Exists(localConfigurationPath)) + { + configurationPath = localConfigurationPath; + } + else if (File.Exists(appDataConfigurationPath)) + { + configurationPath = appDataConfigurationPath; } - IGamepad gamepad = _inputManager.KeyboardDriver.GetGamepad(inputId); - - bool isKeyboard = true; - - if (gamepad == null) + if (configurationPath == null) { - gamepad = _inputManager.GamepadDriver.GetGamepad(inputId); - isKeyboard = false; + // No configuration, we load the default values and save it to disk + configurationPath = appDataConfigurationPath; + Logger.Notice.Print(LogClass.Application, $"No configuration file found. Saving default configuration to: {configurationPath}"); - if (gamepad == null) - { - Logger.Error?.Print(LogClass.Application, $"{index} gamepad not found (\"{inputId}\")"); - - return null; - } - } - - string gamepadName = gamepad.Name; - - gamepad.Dispose(); - - InputConfig config; - - if (inputProfileName == null || inputProfileName.Equals("default")) - { - if (isKeyboard) - { - config = new StandardKeyboardInputConfig - { - Version = InputConfig.CurrentVersion, - Backend = InputBackendType.WindowKeyboard, - Id = null, - ControllerType = ControllerType.JoyconPair, - LeftJoycon = new LeftJoyconCommonConfig - { - DpadUp = Key.Up, - DpadDown = Key.Down, - DpadLeft = Key.Left, - DpadRight = Key.Right, - ButtonMinus = Key.Minus, - ButtonL = Key.E, - ButtonZl = Key.Q, - ButtonSl = Key.Unbound, - ButtonSr = Key.Unbound, - }, - - LeftJoyconStick = new JoyconConfigKeyboardStick - { - StickUp = Key.W, - StickDown = Key.S, - StickLeft = Key.A, - StickRight = Key.D, - StickButton = Key.F, - }, - - RightJoycon = new RightJoyconCommonConfig - { - ButtonA = Key.Z, - ButtonB = Key.X, - ButtonX = Key.C, - ButtonY = Key.V, - ButtonPlus = Key.Plus, - ButtonR = Key.U, - ButtonZr = Key.O, - ButtonSl = Key.Unbound, - ButtonSr = Key.Unbound, - }, - - RightJoyconStick = new JoyconConfigKeyboardStick - { - StickUp = Key.I, - StickDown = Key.K, - StickLeft = Key.J, - StickRight = Key.L, - StickButton = Key.H, - }, - }; - } - else - { - bool isNintendoStyle = gamepadName.Contains("Nintendo"); - - config = new StandardControllerInputConfig - { - Version = InputConfig.CurrentVersion, - Backend = InputBackendType.GamepadSDL2, - Id = null, - ControllerType = ControllerType.JoyconPair, - DeadzoneLeft = 0.1f, - DeadzoneRight = 0.1f, - RangeLeft = 1.0f, - RangeRight = 1.0f, - TriggerThreshold = 0.5f, - LeftJoycon = new LeftJoyconCommonConfig - { - DpadUp = ConfigGamepadInputId.DpadUp, - DpadDown = ConfigGamepadInputId.DpadDown, - DpadLeft = ConfigGamepadInputId.DpadLeft, - DpadRight = ConfigGamepadInputId.DpadRight, - ButtonMinus = ConfigGamepadInputId.Minus, - ButtonL = ConfigGamepadInputId.LeftShoulder, - ButtonZl = ConfigGamepadInputId.LeftTrigger, - ButtonSl = ConfigGamepadInputId.Unbound, - ButtonSr = ConfigGamepadInputId.Unbound, - }, - - LeftJoyconStick = new JoyconConfigControllerStick - { - Joystick = ConfigStickInputId.Left, - StickButton = ConfigGamepadInputId.LeftStick, - InvertStickX = false, - InvertStickY = false, - Rotate90CW = false, - }, - - RightJoycon = new RightJoyconCommonConfig - { - ButtonA = isNintendoStyle ? ConfigGamepadInputId.A : ConfigGamepadInputId.B, - ButtonB = isNintendoStyle ? ConfigGamepadInputId.B : ConfigGamepadInputId.A, - ButtonX = isNintendoStyle ? ConfigGamepadInputId.X : ConfigGamepadInputId.Y, - ButtonY = isNintendoStyle ? ConfigGamepadInputId.Y : ConfigGamepadInputId.X, - ButtonPlus = ConfigGamepadInputId.Plus, - ButtonR = ConfigGamepadInputId.RightShoulder, - ButtonZr = ConfigGamepadInputId.RightTrigger, - ButtonSl = ConfigGamepadInputId.Unbound, - ButtonSr = ConfigGamepadInputId.Unbound, - }, - - RightJoyconStick = new JoyconConfigControllerStick - { - Joystick = ConfigStickInputId.Right, - StickButton = ConfigGamepadInputId.RightStick, - InvertStickX = false, - InvertStickY = false, - Rotate90CW = false, - }, - - Motion = new StandardMotionConfigController - { - MotionBackend = MotionInputBackendType.GamepadDriver, - EnableMotion = true, - Sensitivity = 100, - GyroDeadzone = 1, - }, - Rumble = new RumbleConfigController - { - StrongRumble = 1f, - WeakRumble = 1f, - EnableRumble = false, - }, - }; - } + ConfigurationState.Instance.LoadDefault(); + ConfigurationState.Instance.ToFileFormat().SaveConfig(configurationPath); } else { - string profileBasePath; + Logger.Notice.Print(LogClass.Application, $"Loading configuration from: {configurationPath}"); - if (isKeyboard) + if (ConfigurationFileFormat.TryLoad(configurationPath, out ConfigurationFileFormat configurationFileFormat)) { - profileBasePath = Path.Combine(AppDataManager.ProfilesDirPath, "keyboard"); + ConfigurationState.Instance.Load(configurationFileFormat, configurationPath); } else { - profileBasePath = Path.Combine(AppDataManager.ProfilesDirPath, "controller"); - } + Logger.Warning?.PrintMsg(LogClass.Application, $"Failed to load config! Loading the default config instead.\nFailed config location: {configurationPath}"); - string path = Path.Combine(profileBasePath, inputProfileName + ".json"); - - if (!File.Exists(path)) - { - Logger.Error?.Print(LogClass.Application, $"Input profile \"{inputProfileName}\" not found for \"{inputId}\""); - - return null; - } - - try - { - config = JsonHelper.DeserializeFromFile(path, _serializerContext.InputConfig); - } - catch (JsonException) - { - Logger.Error?.Print(LogClass.Application, $"Input profile \"{inputProfileName}\" parsing failed for \"{inputId}\""); - - return null; + ConfigurationState.Instance.LoadDefault(); } } - - config.Id = inputId; - config.PlayerIndex = index; - - string inputTypeName = isKeyboard ? "Keyboard" : "Gamepad"; - - Logger.Info?.Print(LogClass.Application, $"{config.PlayerIndex} configured with {inputTypeName} \"{config.Id}\""); - - // If both stick ranges are 0 (usually indicative of an outdated profile load) then both sticks will be set to 1.0. - if (config is StandardControllerInputConfig controllerConfig) - { - if (controllerConfig.RangeLeft <= 0.0f && controllerConfig.RangeRight <= 0.0f) - { - controllerConfig.RangeLeft = 1.0f; - controllerConfig.RangeRight = 1.0f; - - Logger.Info?.Print(LogClass.Application, $"{config.PlayerIndex} stick range reset. Save the profile now to update your configuration"); - } - } - - return config; } - static void Load(Options option) + static void Load(string[] originalArgs, Options option) { - AppDataManager.Initialize(option.BaseDataDir); + Initialize(); + bool useLastUsedProfile = false; + + if (option.InheritConfig) + { + option.InheritMainConfig(originalArgs, ConfigurationState.Instance, out useLastUsedProfile); + } + + AppDataManager.Initialize(option.BaseDataDir); + + if (useLastUsedProfile && AccountSaveDataManager.GetLastUsedUser().TryGet(out var profile)) + option.UserProfile = profile.Name; + + // Check if keys exists. + if (!File.Exists(Path.Combine(AppDataManager.KeysDirPath, "prod.keys"))) + { + if (!(AppDataManager.Mode == AppDataManager.LaunchMode.UserProfile && File.Exists(Path.Combine(AppDataManager.KeysDirPathUser, "prod.keys")))) + { + Logger.Error?.Print(LogClass.Application, "Keys not found"); + } + } + + ReloadConfig(); + _virtualFileSystem = VirtualFileSystem.CreateInstance(); _libHacHorizonManager = new LibHacHorizonManager(); @@ -354,7 +180,7 @@ namespace Ryujinx.Headless.SDL2 _inputManager = new InputManager(new SDL2KeyboardDriver(), new SDL2GamepadDriver()); - GraphicsConfig.EnableShaderCache = true; + GraphicsConfig.EnableShaderCache = !option.DisableShaderCache; if (OperatingSystem.IsMacOS()) { @@ -365,15 +191,13 @@ namespace Ryujinx.Headless.SDL2 } } - IGamepad gamepad; - if (option.ListInputIds) { Logger.Info?.Print(LogClass.Application, "Input Ids:"); foreach (string id in _inputManager.KeyboardDriver.GamepadsIds) { - gamepad = _inputManager.KeyboardDriver.GetGamepad(id); + IGamepad gamepad = _inputManager.KeyboardDriver.GetGamepad(id); Logger.Info?.Print(LogClass.Application, $"- {id} (\"{gamepad.Name}\")"); @@ -382,7 +206,7 @@ namespace Ryujinx.Headless.SDL2 foreach (string id in _inputManager.GamepadDriver.GamepadsIds) { - gamepad = _inputManager.GamepadDriver.GetGamepad(id); + IGamepad gamepad = _inputManager.GamepadDriver.GetGamepad(id); Logger.Info?.Print(LogClass.Application, $"- {id} (\"{gamepad.Name}\")"); @@ -399,7 +223,7 @@ namespace Ryujinx.Headless.SDL2 return; } - _inputConfiguration = new List(); + _inputConfiguration ??= []; _enableKeyboard = option.EnableKeyboard; _enableMouse = option.EnableMouse; @@ -412,9 +236,9 @@ namespace Ryujinx.Headless.SDL2 _inputConfiguration.Add(inputConfig); } } - + LoadPlayerConfiguration(option.InputProfile1Name, option.InputId1, PlayerIndex.Player1); - LoadPlayerConfiguration(option.InputProfile2Name, option.InputId2, PlayerIndex.Player2); + LoadPlayerConfiguration(option.InputProfile2Name, option.InputId2, PlayerIndex.Player2); LoadPlayerConfiguration(option.InputProfile3Name, option.InputId3, PlayerIndex.Player3); LoadPlayerConfiguration(option.InputProfile4Name, option.InputId4, PlayerIndex.Player4); LoadPlayerConfiguration(option.InputProfile5Name, option.InputId5, PlayerIndex.Player5); @@ -422,6 +246,7 @@ namespace Ryujinx.Headless.SDL2 LoadPlayerConfiguration(option.InputProfile7Name, option.InputId7, PlayerIndex.Player7); LoadPlayerConfiguration(option.InputProfile8Name, option.InputId8, PlayerIndex.Player8); LoadPlayerConfiguration(option.InputProfileHandheldName, option.InputIdHandheld, PlayerIndex.Handheld); + if (_inputConfiguration.Count == 0) { @@ -433,7 +258,7 @@ namespace Ryujinx.Headless.SDL2 Logger.SetEnable(LogLevel.Stub, !option.LoggingDisableStub); Logger.SetEnable(LogLevel.Info, !option.LoggingDisableInfo); Logger.SetEnable(LogLevel.Warning, !option.LoggingDisableWarning); - Logger.SetEnable(LogLevel.Error, option.LoggingEnableError); + Logger.SetEnable(LogLevel.Error, !option.LoggingDisableError); Logger.SetEnable(LogLevel.Trace, option.LoggingEnableTrace); Logger.SetEnable(LogLevel.Guest, !option.LoggingDisableGuest); Logger.SetEnable(LogLevel.AccessLog, option.LoggingEnableFsAccessLog); @@ -522,88 +347,6 @@ namespace Ryujinx.Headless.SDL2 }; } - private static IRenderer CreateRenderer(Options options, WindowBase window) - { - if (options.GraphicsBackend == GraphicsBackend.Vulkan && window is VulkanWindow vulkanWindow) - { - string preferredGpuId = string.Empty; - Vk api = Vk.GetApi(); - - if (!string.IsNullOrEmpty(options.PreferredGPUVendor)) - { - string preferredGpuVendor = options.PreferredGPUVendor.ToLowerInvariant(); - var devices = VulkanRenderer.GetPhysicalDevices(api); - - foreach (var device in devices) - { - if (device.Vendor.ToLowerInvariant() == preferredGpuVendor) - { - preferredGpuId = device.Id; - break; - } - } - } - - return new VulkanRenderer( - api, - (instance, vk) => new SurfaceKHR((ulong)(vulkanWindow.CreateWindowSurface(instance.Handle))), - vulkanWindow.GetRequiredInstanceExtensions, - preferredGpuId); - } - - if (options.GraphicsBackend == GraphicsBackend.Metal && window is MetalWindow metalWindow && OperatingSystem.IsMacOS()) - { - return new MetalRenderer(metalWindow.GetLayer); - } - - return new OpenGLRenderer(); - } - - private static Switch InitializeEmulationContext(WindowBase window, IRenderer renderer, Options options) - { - BackendThreading threadingMode = options.BackendThreading; - - bool threadedGAL = threadingMode == BackendThreading.On || (threadingMode == BackendThreading.Auto && renderer.PreferThreading); - - if (threadedGAL) - { - renderer = new ThreadedRenderer(renderer); - } - - HLEConfiguration configuration = new(_virtualFileSystem, - _libHacHorizonManager, - _contentManager, - _accountManager, - _userChannelPersistence, - renderer, - new SDL2HardwareDeviceDriver(), - options.DramSize, - window, - options.SystemLanguage, - options.SystemRegion, - options.VSyncMode, - !options.DisableDockedMode, - !options.DisablePTC, - options.EnableInternetAccess, - !options.DisableFsIntegrityChecks ? IntegrityCheckLevel.ErrorOnInvalid : IntegrityCheckLevel.None, - options.FsGlobalAccessLogMode, - options.SystemTimeOffset, - options.SystemTimeZone, - options.MemoryManagerMode, - options.IgnoreMissingServices, - options.AspectRatio, - options.AudioVolume, - options.UseHypervisor ?? true, - options.MultiplayerLanInterfaceId, - Common.Configuration.Multiplayer.MultiplayerMode.Disabled, - false, - string.Empty, - string.Empty, - options.CustomVSyncInterval); - - return new Switch(configuration); - } - private static void ExecutionEntrypoint() { if (OperatingSystem.IsWindows()) diff --git a/src/Ryujinx.Headless.SDL2/Metal/MetalWindow.cs b/src/Ryujinx/Headless/Metal/MetalWindow.cs similarity index 97% rename from src/Ryujinx.Headless.SDL2/Metal/MetalWindow.cs rename to src/Ryujinx/Headless/Metal/MetalWindow.cs index 5140d639b..a2693c69d 100644 --- a/src/Ryujinx.Headless.SDL2/Metal/MetalWindow.cs +++ b/src/Ryujinx/Headless/Metal/MetalWindow.cs @@ -5,7 +5,7 @@ using SharpMetal.QuartzCore; using System.Runtime.Versioning; using static SDL2.SDL; -namespace Ryujinx.Headless.SDL2.Metal +namespace Ryujinx.Headless { [SupportedOSPlatform("macos")] class MetalWindow : WindowBase diff --git a/src/Ryujinx.Headless.SDL2/OpenGL/OpenGLWindow.cs b/src/Ryujinx/Headless/OpenGL/OpenGLWindow.cs similarity index 99% rename from src/Ryujinx.Headless.SDL2/OpenGL/OpenGLWindow.cs rename to src/Ryujinx/Headless/OpenGL/OpenGLWindow.cs index 8c4854a11..c00a0648f 100644 --- a/src/Ryujinx.Headless.SDL2/OpenGL/OpenGLWindow.cs +++ b/src/Ryujinx/Headless/OpenGL/OpenGLWindow.cs @@ -7,7 +7,7 @@ using Ryujinx.Input.HLE; using System; using static SDL2.SDL; -namespace Ryujinx.Headless.SDL2.OpenGL +namespace Ryujinx.Headless { class OpenGLWindow : WindowBase { diff --git a/src/Ryujinx.Headless.SDL2/Options.cs b/src/Ryujinx/Headless/Options.cs similarity index 63% rename from src/Ryujinx.Headless.SDL2/Options.cs rename to src/Ryujinx/Headless/Options.cs index 4e2ad5b58..0dd4216f0 100644 --- a/src/Ryujinx.Headless.SDL2/Options.cs +++ b/src/Ryujinx/Headless/Options.cs @@ -1,13 +1,168 @@ using CommandLine; +using Gommon; using Ryujinx.Common.Configuration; +using Ryujinx.Common.Configuration.Hid; using Ryujinx.HLE; +using Ryujinx.HLE.HOS.Services.Account.Acc; using Ryujinx.HLE.HOS.SystemState; +using Ryujinx.UI.Common.Configuration; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Reflection; -namespace Ryujinx.Headless.SDL2 +namespace Ryujinx.Headless { public class Options { + public void InheritMainConfig(string[] originalArgs, ConfigurationState configurationState, out bool needsProfileSet) + { + needsProfileSet = NeedsOverride(nameof(UserProfile)); + + if (NeedsOverride(nameof(IsFullscreen))) + IsFullscreen = configurationState.UI.StartFullscreen; + + if (NeedsOverride(nameof(EnableKeyboard))) + EnableKeyboard = configurationState.Hid.EnableKeyboard; + + if (NeedsOverride(nameof(EnableMouse))) + EnableMouse = configurationState.Hid.EnableMouse; + + if (NeedsOverride(nameof(HideCursorMode))) + HideCursorMode = configurationState.HideCursor; + + if (NeedsOverride(nameof(DisablePTC))) + DisablePTC = !configurationState.System.EnablePtc; + + if (NeedsOverride(nameof(EnableInternetAccess))) + EnableInternetAccess = configurationState.System.EnableInternetAccess; + + if (NeedsOverride(nameof(DisableFsIntegrityChecks))) + DisableFsIntegrityChecks = configurationState.System.EnableFsIntegrityChecks; + + if (NeedsOverride(nameof(FsGlobalAccessLogMode))) + FsGlobalAccessLogMode = configurationState.System.FsGlobalAccessLogMode; + + if (NeedsOverride(nameof(VSyncMode))) + VSyncMode = configurationState.Graphics.VSyncMode; + + if (NeedsOverride(nameof(CustomVSyncInterval))) + CustomVSyncInterval = configurationState.Graphics.CustomVSyncInterval; + + if (NeedsOverride(nameof(DisableShaderCache))) + DisableShaderCache = !configurationState.Graphics.EnableShaderCache; + + if (NeedsOverride(nameof(EnableTextureRecompression))) + EnableTextureRecompression = configurationState.Graphics.EnableTextureRecompression; + + if (NeedsOverride(nameof(DisableDockedMode))) + DisableDockedMode = !configurationState.System.EnableDockedMode; + + if (NeedsOverride(nameof(SystemLanguage))) + SystemLanguage = (SystemLanguage)(int)configurationState.System.Language.Value; + + if (NeedsOverride(nameof(SystemRegion))) + SystemRegion = (RegionCode)(int)configurationState.System.Region.Value; + + if (NeedsOverride(nameof(SystemTimeZone))) + SystemTimeZone = configurationState.System.TimeZone; + + if (NeedsOverride(nameof(SystemTimeOffset))) + SystemTimeOffset = configurationState.System.SystemTimeOffset; + + if (NeedsOverride(nameof(MemoryManagerMode))) + MemoryManagerMode = configurationState.System.MemoryManagerMode; + + if (NeedsOverride(nameof(AudioVolume))) + AudioVolume = configurationState.System.AudioVolume; + + if (NeedsOverride(nameof(UseHypervisor)) && OperatingSystem.IsMacOS()) + UseHypervisor = configurationState.System.UseHypervisor; + + if (NeedsOverride(nameof(MultiplayerLanInterfaceId))) + MultiplayerLanInterfaceId = configurationState.Multiplayer.LanInterfaceId; + + if (NeedsOverride(nameof(DisableFileLog))) + DisableFileLog = !configurationState.Logger.EnableFileLog; + + if (NeedsOverride(nameof(LoggingEnableDebug))) + LoggingEnableDebug = configurationState.Logger.EnableDebug; + + if (NeedsOverride(nameof(LoggingDisableStub))) + LoggingDisableStub = !configurationState.Logger.EnableStub; + + if (NeedsOverride(nameof(LoggingDisableInfo))) + LoggingDisableInfo = !configurationState.Logger.EnableInfo; + + if (NeedsOverride(nameof(LoggingDisableWarning))) + LoggingDisableWarning = !configurationState.Logger.EnableWarn; + + if (NeedsOverride(nameof(LoggingDisableError))) + LoggingDisableError = !configurationState.Logger.EnableError; + + if (NeedsOverride(nameof(LoggingEnableTrace))) + LoggingEnableTrace = configurationState.Logger.EnableTrace; + + if (NeedsOverride(nameof(LoggingDisableGuest))) + LoggingDisableGuest = !configurationState.Logger.EnableGuest; + + if (NeedsOverride(nameof(LoggingEnableFsAccessLog))) + LoggingEnableFsAccessLog = configurationState.Logger.EnableFsAccessLog; + + if (NeedsOverride(nameof(LoggingGraphicsDebugLevel))) + LoggingGraphicsDebugLevel = configurationState.Logger.GraphicsDebugLevel; + + if (NeedsOverride(nameof(ResScale))) + ResScale = configurationState.Graphics.ResScale; + + if (NeedsOverride(nameof(MaxAnisotropy))) + MaxAnisotropy = configurationState.Graphics.MaxAnisotropy; + + if (NeedsOverride(nameof(AspectRatio))) + AspectRatio = configurationState.Graphics.AspectRatio; + + if (NeedsOverride(nameof(BackendThreading))) + BackendThreading = configurationState.Graphics.BackendThreading; + + if (NeedsOverride(nameof(DisableMacroHLE))) + DisableMacroHLE = !configurationState.Graphics.EnableMacroHLE; + + if (NeedsOverride(nameof(GraphicsShadersDumpPath))) + GraphicsShadersDumpPath = configurationState.Graphics.ShadersDumpPath; + + if (NeedsOverride(nameof(GraphicsBackend))) + GraphicsBackend = configurationState.Graphics.GraphicsBackend; + + if (NeedsOverride(nameof(AntiAliasing))) + AntiAliasing = configurationState.Graphics.AntiAliasing; + + if (NeedsOverride(nameof(ScalingFilter))) + ScalingFilter = configurationState.Graphics.ScalingFilter; + + if (NeedsOverride(nameof(ScalingFilterLevel))) + ScalingFilterLevel = configurationState.Graphics.ScalingFilterLevel; + + if (NeedsOverride(nameof(DramSize))) + DramSize = configurationState.System.DramSize; + + if (NeedsOverride(nameof(IgnoreMissingServices))) + IgnoreMissingServices = configurationState.System.IgnoreMissingServices; + + if (NeedsOverride(nameof(IgnoreControllerApplet))) + IgnoreControllerApplet = configurationState.IgnoreApplet; + + return; + + bool NeedsOverride(string argKey) => originalArgs.None(arg => arg.TrimStart('-').EqualsIgnoreCase(OptionName(argKey))); + + string OptionName(string propertyName) => + typeof(Options)!.GetProperty(propertyName)!.GetCustomAttribute()!.LongName; + } + // General + + [Option("use-main-config", Required = false, Default = false, HelpText = "Use the settings from what was configured via the UI.")] + public bool InheritConfig { get; set; } [Option("root-data-dir", Required = false, HelpText = "Set the custom folder path for Ryujinx data.")] public string BaseDataDir { get; set; } @@ -172,7 +327,7 @@ namespace Ryujinx.Headless.SDL2 public bool LoggingDisableWarning { get; set; } [Option("disable-error-logs", Required = false, HelpText = "Disables printing error log messages.")] - public bool LoggingEnableError { get; set; } + public bool LoggingDisableError { get; set; } [Option("enable-trace-logs", Required = false, Default = false, HelpText = "Enables printing trace log messages.")] public bool LoggingEnableTrace { get; set; } diff --git a/src/Ryujinx/Headless/Ryujinx.bmp b/src/Ryujinx/Headless/Ryujinx.bmp new file mode 100644 index 0000000000000000000000000000000000000000..36bf2f8ac129d43565ea345df7bb33b3b86e251b GIT binary patch literal 3978 zcmb`}dr(x@836E)i8v*#uV|(=srEUUO#X6Nz+k7flXlualy=f2{i8{cec#6}%kHv@ zCb*+1J`pCdF)>d5$%B}X1vMce0Txtr#z!QXaS{^{d?1<&q8Jr*&-wbDyL(|5xauFd zeE3^!&)jHelc0Wcjb^G@1S$}-+>jxfxp*nl){{u`({pClTM-V|BLGa#0 zi#*IVX^3GmxO|mqN*{Y)X=iz%BX_{l%ziXE;c`%K@@#pSjk#AC$`|4&9g3se%(|3T z_RsJ!Djq$3M}GkYu|068>PcvNJqNmK7Q?v@7sFYK^ROv>I9L1E%rkZQ`90CR(CNCI%AWe1s@^(l)rn93ytbyb z@X?Q2UxfEM{&Ro%USpb>soPOD(6=Wa&erA6?XAoE-|0H*V0SbdyP_8CrZ}-HAGgMq z4F!*cvsWAq!J1h4JzeiDo~`uL`li&@$Wx4-8iqxs9DAaR9_p>ntx0&o%+}4$`h2Wv zDMH`jkXCXuY$-V&hDa=8?)FeGf6Kx59l3|dO|Ivt*-YjKWCjom?TEegc`L}gZMY)O z&iX~V>Fo$&@!_BrxF5Hb_E9_8ZM2VC$W5-LK8`aB9f-7+Cxw{^s;zF?P?)}sK$^Sy z;07q9rd~qvkMF;S=X!ggdSnDdPeo$n9^l~J&(mFDirOag6sCyosP(p}?P;-|6DHSdYnWm*)^jp5;RdMAK}$(zIVjgyCdFK7 zFrGp0q^ZhHHrI~v3sCe?)cOpR98$)9z;4eV6h0u0K!@O>X**tw(SFDb05aEy@k5?;ZN? z8+;W-PUs@d5Aiihj6WgAILK{eQuq#Vi&Vq3qQJ!3iavG*E@7am3D?D3$=r+_#pp-h zv302Qb)h_r8ohHZ$}pRyUgN)2eqdqs67wscv0srHp>WGB{C70Yv&}(}Hgc=Yj|0L; zT~9H0mXKM!55sRnNBcIlwjxiJOlb(oWx`#c{=oCSH+iW#z$(=vY@gc3!xUS|YgF5L z8TD~t@r^r~b{FO@bK>9xQ{2A`zFlMH@#bhc?JWFb1Gsvo-Jag%tG?V6A zq*}h9@Hw1Dwas*R(p^#8;5c*4o!lICN0`O)I-f#@jl9*AXOv+I#ROfDH@m`FB(uO~yzMW3?U&vhRJ;kTn{rGR23;#>r zY`2VA_GG?yGlQFUpzrwRwDmMRNu1f|1KKV5jwUhx!Lodr0JGL}2|kRD6C^E?%G>;>KMlF(ysvpnf;eyzL2B zyn`JT9Gn|iro+$6D7W7fIWUXzT|@DxTHXVJ4V~7~*Y*vBw?#*-G4lYH~A%NPw) zoMm*jT&6veM|j44o;_&_P1RRm&*l|CzO?y(Y{BRH*cQansOrpddDv%`;_OM zL~T>gY{MR8S{p!L*J&+Md|Bi482O7rzK`+l>}{||ti B6odc( literal 0 HcmV?d00001 diff --git a/src/Ryujinx.Headless.SDL2/StatusUpdatedEventArgs.cs b/src/Ryujinx/Headless/StatusUpdatedEventArgs.cs similarity index 94% rename from src/Ryujinx.Headless.SDL2/StatusUpdatedEventArgs.cs rename to src/Ryujinx/Headless/StatusUpdatedEventArgs.cs index c1dd3805f..6c76a43a1 100644 --- a/src/Ryujinx.Headless.SDL2/StatusUpdatedEventArgs.cs +++ b/src/Ryujinx/Headless/StatusUpdatedEventArgs.cs @@ -1,6 +1,6 @@ using System; -namespace Ryujinx.Headless.SDL2 +namespace Ryujinx.Headless { class StatusUpdatedEventArgs( string vSyncMode, diff --git a/src/Ryujinx.Headless.SDL2/Vulkan/VulkanWindow.cs b/src/Ryujinx/Headless/Vulkan/VulkanWindow.cs similarity index 98% rename from src/Ryujinx.Headless.SDL2/Vulkan/VulkanWindow.cs rename to src/Ryujinx/Headless/Vulkan/VulkanWindow.cs index b88e0fe83..92caad34e 100644 --- a/src/Ryujinx.Headless.SDL2/Vulkan/VulkanWindow.cs +++ b/src/Ryujinx/Headless/Vulkan/VulkanWindow.cs @@ -6,7 +6,7 @@ using System; using System.Runtime.InteropServices; using static SDL2.SDL; -namespace Ryujinx.Headless.SDL2.Vulkan +namespace Ryujinx.Headless { class VulkanWindow : WindowBase { diff --git a/src/Ryujinx.Headless.SDL2/WindowBase.cs b/src/Ryujinx/Headless/WindowBase.cs similarity index 98% rename from src/Ryujinx.Headless.SDL2/WindowBase.cs rename to src/Ryujinx/Headless/WindowBase.cs index fbe7cb49c..21bee368a 100644 --- a/src/Ryujinx.Headless.SDL2/WindowBase.cs +++ b/src/Ryujinx/Headless/WindowBase.cs @@ -1,5 +1,6 @@ using Humanizer; using LibHac.Tools.Fs; +using Ryujinx.Ava; using Ryujinx.Common.Configuration; using Ryujinx.Common.Configuration.Hid; using Ryujinx.Common.Logging; @@ -26,7 +27,7 @@ using AntiAliasing = Ryujinx.Common.Configuration.AntiAliasing; using ScalingFilter = Ryujinx.Common.Configuration.ScalingFilter; using Switch = Ryujinx.HLE.Switch; -namespace Ryujinx.Headless.SDL2 +namespace Ryujinx.Headless { abstract partial class WindowBase : IHostUIHandler, IDisposable { @@ -136,7 +137,7 @@ namespace Ryujinx.Headless.SDL2 private void SetWindowIcon() { - Stream iconStream = typeof(WindowBase).Assembly.GetManifestResourceStream("Ryujinx.Headless.SDL2.Ryujinx.bmp"); + Stream iconStream = typeof(Program).Assembly.GetManifestResourceStream("HeadlessLogo"); byte[] iconBytes = new byte[iconStream!.Length]; if (iconStream.Read(iconBytes, 0, iconBytes.Length) != iconBytes.Length) @@ -318,7 +319,7 @@ namespace Ryujinx.Headless.SDL2 Device.VSyncMode.ToString(), dockedMode, Device.Configuration.AspectRatio.ToText(), - $"Game: {Device.Statistics.GetGameFrameRate():00.00} FPS ({Device.Statistics.GetGameFrameTime():00.00} ms)", + $"{Device.Statistics.GetGameFrameRate():00.00} FPS ({Device.Statistics.GetGameFrameTime():00.00} ms)", $"FIFO: {Device.Statistics.GetFifoPercent():0.00} %", $"GPU: {_gpuDriverName}")); diff --git a/src/Ryujinx/Program.cs b/src/Ryujinx/Program.cs index 2ec60ac70..bde08a372 100644 --- a/src/Ryujinx/Program.cs +++ b/src/Ryujinx/Program.cs @@ -14,6 +14,7 @@ using Ryujinx.Common.GraphicsDriver; using Ryujinx.Common.Logging; using Ryujinx.Common.SystemInterop; using Ryujinx.Graphics.Vulkan.MoltenVK; +using Ryujinx.Headless; using Ryujinx.SDL2.Common; using Ryujinx.UI.App.Common; using Ryujinx.UI.Common; @@ -52,9 +53,15 @@ namespace Ryujinx.Ava } PreviewerDetached = true; + + if (args.Length > 0 && args[0] is "--no-gui" or "nogui") + { + HeadlessRyujinx.Entrypoint(args[1..]); + return 0; + } Initialize(args); - + LoggerAdapter.Register(); IconProvider.Current @@ -106,7 +113,7 @@ namespace Ryujinx.Ava AppDomain.CurrentDomain.UnhandledException += (sender, e) => ProcessUnhandledException(sender, e.ExceptionObject as Exception, e.IsTerminating); AppDomain.CurrentDomain.ProcessExit += (_, _) => Exit(); - + // Setup base data directory. AppDataManager.Initialize(CommandLineState.BaseDirPathArg); @@ -223,7 +230,7 @@ namespace Ryujinx.Ava UseHardwareAcceleration = CommandLineState.OverrideHardwareAcceleration.Value; } - private static void PrintSystemInfo() + internal static void PrintSystemInfo() { Logger.Notice.Print(LogClass.Application, $"{RyujinxApp.FullAppName} Version: {Version}"); SystemInfo.Gather().Print(); @@ -240,7 +247,7 @@ namespace Ryujinx.Ava : $"Launch Mode: {AppDataManager.Mode}"); } - private static void ProcessUnhandledException(object sender, Exception ex, bool isTerminating) + internal static void ProcessUnhandledException(object sender, Exception ex, bool isTerminating) { Logger.Log log = Logger.Error ?? Logger.Notice; string message = $"Unhandled exception caught: {ex}"; @@ -255,7 +262,7 @@ namespace Ryujinx.Ava Exit(); } - public static void Exit() + internal static void Exit() { DiscordIntegrationModule.Exit(); diff --git a/src/Ryujinx/Ryujinx.csproj b/src/Ryujinx/Ryujinx.csproj index d5bad2ee6..d98e499c2 100644 --- a/src/Ryujinx/Ryujinx.csproj +++ b/src/Ryujinx/Ryujinx.csproj @@ -47,6 +47,7 @@ + @@ -66,6 +67,7 @@ + @@ -74,7 +76,6 @@ - @@ -133,6 +134,7 @@ + From 09107b67ff4d2d124dde1211816bc5300b1182fe Mon Sep 17 00:00:00 2001 From: Evan Husted Date: Sat, 28 Dec 2024 05:08:21 -0600 Subject: [PATCH 42/60] misc: Remove GAL/Configuration duplicate enums --- .../Configuration/AspectRatioExtensions.cs | 2 ++ .../Configuration/ScalingFilter.cs | 1 + src/Ryujinx.Graphics.GAL/AntiAliasing.cs | 12 ----------- src/Ryujinx.Graphics.GAL/UpscaleType.cs | 10 ---------- src/Ryujinx.Graphics.Metal/Window.cs | 3 --- src/Ryujinx.Graphics.OpenGL/Window.cs | 2 -- src/Ryujinx.Graphics.Vulkan/Window.cs | 2 -- src/Ryujinx.Graphics.Vulkan/WindowBase.cs | 2 -- .../Extensions/FileSystemExtensions.cs | 2 +- .../DiscordIntegrationModule.cs | 1 - src/Ryujinx/AppHost.cs | 20 +++++++++---------- src/Ryujinx/Headless/Options.cs | 6 +++--- src/Ryujinx/Headless/WindowBase.cs | 4 ++-- 13 files changed, 19 insertions(+), 48 deletions(-) delete mode 100644 src/Ryujinx.Graphics.GAL/AntiAliasing.cs delete mode 100644 src/Ryujinx.Graphics.GAL/UpscaleType.cs diff --git a/src/Ryujinx.Common/Configuration/AspectRatioExtensions.cs b/src/Ryujinx.Common/Configuration/AspectRatioExtensions.cs index bae6e35de..05dbe67d9 100644 --- a/src/Ryujinx.Common/Configuration/AspectRatioExtensions.cs +++ b/src/Ryujinx.Common/Configuration/AspectRatioExtensions.cs @@ -35,6 +35,8 @@ namespace Ryujinx.Common.Configuration #pragma warning restore IDE0055 }; } + + public static float ToFloatY(this AspectRatio aspectRatio) { diff --git a/src/Ryujinx.Common/Configuration/ScalingFilter.cs b/src/Ryujinx.Common/Configuration/ScalingFilter.cs index 1c6a74b3a..474685d49 100644 --- a/src/Ryujinx.Common/Configuration/ScalingFilter.cs +++ b/src/Ryujinx.Common/Configuration/ScalingFilter.cs @@ -9,5 +9,6 @@ namespace Ryujinx.Common.Configuration Bilinear, Nearest, Fsr, + Area, } } diff --git a/src/Ryujinx.Graphics.GAL/AntiAliasing.cs b/src/Ryujinx.Graphics.GAL/AntiAliasing.cs deleted file mode 100644 index 04b529764..000000000 --- a/src/Ryujinx.Graphics.GAL/AntiAliasing.cs +++ /dev/null @@ -1,12 +0,0 @@ -namespace Ryujinx.Graphics.GAL -{ - public enum AntiAliasing - { - None, - Fxaa, - SmaaLow, - SmaaMedium, - SmaaHigh, - SmaaUltra, - } -} diff --git a/src/Ryujinx.Graphics.GAL/UpscaleType.cs b/src/Ryujinx.Graphics.GAL/UpscaleType.cs deleted file mode 100644 index e2482faef..000000000 --- a/src/Ryujinx.Graphics.GAL/UpscaleType.cs +++ /dev/null @@ -1,10 +0,0 @@ -namespace Ryujinx.Graphics.GAL -{ - public enum ScalingFilter - { - Bilinear, - Nearest, - Fsr, - Area, - } -} diff --git a/src/Ryujinx.Graphics.Metal/Window.cs b/src/Ryujinx.Graphics.Metal/Window.cs index 61137f97d..7d9a51a9e 100644 --- a/src/Ryujinx.Graphics.Metal/Window.cs +++ b/src/Ryujinx.Graphics.Metal/Window.cs @@ -2,13 +2,10 @@ using Ryujinx.Common.Configuration; using Ryujinx.Common.Logging; using Ryujinx.Graphics.GAL; using Ryujinx.Graphics.Metal.Effects; -using Ryujinx.Graphics.Metal.SharpMetalExtensions; using SharpMetal.ObjectiveCCore; using SharpMetal.QuartzCore; using System; using System.Runtime.Versioning; -using AntiAliasing = Ryujinx.Graphics.GAL.AntiAliasing; -using ScalingFilter = Ryujinx.Graphics.GAL.ScalingFilter; namespace Ryujinx.Graphics.Metal { diff --git a/src/Ryujinx.Graphics.OpenGL/Window.cs b/src/Ryujinx.Graphics.OpenGL/Window.cs index 8c35663ab..f161be506 100644 --- a/src/Ryujinx.Graphics.OpenGL/Window.cs +++ b/src/Ryujinx.Graphics.OpenGL/Window.cs @@ -5,8 +5,6 @@ using Ryujinx.Graphics.OpenGL.Effects; using Ryujinx.Graphics.OpenGL.Effects.Smaa; using Ryujinx.Graphics.OpenGL.Image; using System; -using AntiAliasing = Ryujinx.Graphics.GAL.AntiAliasing; -using ScalingFilter = Ryujinx.Graphics.GAL.ScalingFilter; namespace Ryujinx.Graphics.OpenGL { diff --git a/src/Ryujinx.Graphics.Vulkan/Window.cs b/src/Ryujinx.Graphics.Vulkan/Window.cs index d135d0076..8e53e7f7e 100644 --- a/src/Ryujinx.Graphics.Vulkan/Window.cs +++ b/src/Ryujinx.Graphics.Vulkan/Window.cs @@ -5,8 +5,6 @@ using Silk.NET.Vulkan; using Silk.NET.Vulkan.Extensions.KHR; using System; using System.Linq; -using AntiAliasing = Ryujinx.Graphics.GAL.AntiAliasing; -using ScalingFilter = Ryujinx.Graphics.GAL.ScalingFilter; using VkFormat = Silk.NET.Vulkan.Format; namespace Ryujinx.Graphics.Vulkan diff --git a/src/Ryujinx.Graphics.Vulkan/WindowBase.cs b/src/Ryujinx.Graphics.Vulkan/WindowBase.cs index 807bb65e5..34ac63a83 100644 --- a/src/Ryujinx.Graphics.Vulkan/WindowBase.cs +++ b/src/Ryujinx.Graphics.Vulkan/WindowBase.cs @@ -1,8 +1,6 @@ using Ryujinx.Common.Configuration; using Ryujinx.Graphics.GAL; using System; -using AntiAliasing = Ryujinx.Graphics.GAL.AntiAliasing; -using ScalingFilter = Ryujinx.Graphics.GAL.ScalingFilter; namespace Ryujinx.Graphics.Vulkan { diff --git a/src/Ryujinx.HLE/Loaders/Processes/Extensions/FileSystemExtensions.cs b/src/Ryujinx.HLE/Loaders/Processes/Extensions/FileSystemExtensions.cs index cd215781f..97284f3bb 100644 --- a/src/Ryujinx.HLE/Loaders/Processes/Extensions/FileSystemExtensions.cs +++ b/src/Ryujinx.HLE/Loaders/Processes/Extensions/FileSystemExtensions.cs @@ -102,7 +102,7 @@ namespace Ryujinx.HLE.Loaders.Processes.Extensions } // Initialize GPU. - Graphics.Gpu.GraphicsConfig.TitleId = $"{programId:x16}"; + Graphics.Gpu.GraphicsConfig.TitleId = programId.ToString("X16"); device.Gpu.HostInitalized.Set(); if (!MemoryBlock.SupportsFlags(MemoryAllocationFlags.ViewCompatible)) diff --git a/src/Ryujinx.UI.Common/DiscordIntegrationModule.cs b/src/Ryujinx.UI.Common/DiscordIntegrationModule.cs index 0cb9779ff..574aaff87 100644 --- a/src/Ryujinx.UI.Common/DiscordIntegrationModule.cs +++ b/src/Ryujinx.UI.Common/DiscordIntegrationModule.cs @@ -5,7 +5,6 @@ using Ryujinx.Common; using Ryujinx.HLE.Loaders.Processes; using Ryujinx.UI.App.Common; using Ryujinx.UI.Common.Configuration; -using System.Linq; using System.Text; namespace Ryujinx.UI.Common diff --git a/src/Ryujinx/AppHost.cs b/src/Ryujinx/AppHost.cs index 9a9c1d226..909eb05d5 100644 --- a/src/Ryujinx/AppHost.cs +++ b/src/Ryujinx/AppHost.cs @@ -289,19 +289,19 @@ namespace Ryujinx.Ava private void UpdateScalingFilterLevel(object sender, ReactiveEventArgs e) { - _renderer.Window?.SetScalingFilter((Graphics.GAL.ScalingFilter)ConfigurationState.Instance.Graphics.ScalingFilter.Value); - _renderer.Window?.SetScalingFilterLevel(ConfigurationState.Instance.Graphics.ScalingFilterLevel.Value); + _renderer.Window?.SetScalingFilter(ConfigurationState.Instance.Graphics.ScalingFilter); + _renderer.Window?.SetScalingFilterLevel(ConfigurationState.Instance.Graphics.ScalingFilterLevel); } private void UpdateScalingFilter(object sender, ReactiveEventArgs e) { - _renderer.Window?.SetScalingFilter((Graphics.GAL.ScalingFilter)ConfigurationState.Instance.Graphics.ScalingFilter.Value); - _renderer.Window?.SetScalingFilterLevel(ConfigurationState.Instance.Graphics.ScalingFilterLevel.Value); + _renderer.Window?.SetScalingFilter(ConfigurationState.Instance.Graphics.ScalingFilter); + _renderer.Window?.SetScalingFilterLevel(ConfigurationState.Instance.Graphics.ScalingFilterLevel); } private void UpdateColorSpacePassthrough(object sender, ReactiveEventArgs e) { - _renderer.Window?.SetColorSpacePassthrough((bool)ConfigurationState.Instance.Graphics.EnableColorSpacePassthrough.Value); + _renderer.Window?.SetColorSpacePassthrough(ConfigurationState.Instance.Graphics.EnableColorSpacePassthrough); } public void UpdateVSyncMode(object sender, ReactiveEventArgs e) @@ -526,7 +526,7 @@ namespace Ryujinx.Ava private void UpdateAntiAliasing(object sender, ReactiveEventArgs e) { - _renderer?.Window?.SetAntiAliasing((Graphics.GAL.AntiAliasing)e.NewValue); + _renderer?.Window?.SetAntiAliasing(e.NewValue); } private void UpdateDockedModeState(object sender, ReactiveEventArgs e) @@ -1057,10 +1057,10 @@ namespace Ryujinx.Ava Device.Gpu.Renderer.Initialize(_glLogLevel); - _renderer?.Window?.SetAntiAliasing((Graphics.GAL.AntiAliasing)ConfigurationState.Instance.Graphics.AntiAliasing.Value); - _renderer?.Window?.SetScalingFilter((Graphics.GAL.ScalingFilter)ConfigurationState.Instance.Graphics.ScalingFilter.Value); - _renderer?.Window?.SetScalingFilterLevel(ConfigurationState.Instance.Graphics.ScalingFilterLevel.Value); - _renderer?.Window?.SetColorSpacePassthrough(ConfigurationState.Instance.Graphics.EnableColorSpacePassthrough.Value); + _renderer?.Window?.SetAntiAliasing(ConfigurationState.Instance.Graphics.AntiAliasing); + _renderer?.Window?.SetScalingFilter(ConfigurationState.Instance.Graphics.ScalingFilter); + _renderer?.Window?.SetScalingFilterLevel(ConfigurationState.Instance.Graphics.ScalingFilterLevel); + _renderer?.Window?.SetColorSpacePassthrough(ConfigurationState.Instance.Graphics.EnableColorSpacePassthrough); Width = (int)RendererHost.Bounds.Width; Height = (int)RendererHost.Bounds.Height; diff --git a/src/Ryujinx/Headless/Options.cs b/src/Ryujinx/Headless/Options.cs index 0dd4216f0..b0a349a2b 100644 --- a/src/Ryujinx/Headless/Options.cs +++ b/src/Ryujinx/Headless/Options.cs @@ -250,10 +250,10 @@ namespace Ryujinx.Headless [Option("hide-cursor", Required = false, Default = HideCursorMode.OnIdle, HelpText = "Change when the cursor gets hidden.")] public HideCursorMode HideCursorMode { get; set; } - [Option("list-input-profiles", Required = false, HelpText = "List inputs profiles.")] + [Option("list-input-profiles", Required = false, HelpText = "List input profiles.")] public bool ListInputProfiles { get; set; } - [Option("list-inputs-ids", Required = false, HelpText = "List inputs ids.")] + [Option("list-input-ids", Required = false, HelpText = "List input IDs.")] public bool ListInputIds { get; set; } // System @@ -370,7 +370,7 @@ namespace Ryujinx.Headless [Option("anti-aliasing", Required = false, Default = AntiAliasing.None, HelpText = "Set the type of anti aliasing being used. [None|Fxaa|SmaaLow|SmaaMedium|SmaaHigh|SmaaUltra]")] public AntiAliasing AntiAliasing { get; set; } - [Option("scaling-filter", Required = false, Default = ScalingFilter.Bilinear, HelpText = "Set the scaling filter. [Bilinear|Nearest|Fsr]")] + [Option("scaling-filter", Required = false, Default = ScalingFilter.Bilinear, HelpText = "Set the scaling filter. [Bilinear|Nearest|Fsr|Area]")] public ScalingFilter ScalingFilter { get; set; } [Option("scaling-filter-level", Required = false, Default = 0, HelpText = "Set the scaling filter intensity (currently only applies to FSR). [0-100]")] diff --git a/src/Ryujinx/Headless/WindowBase.cs b/src/Ryujinx/Headless/WindowBase.cs index 21bee368a..d89638cc1 100644 --- a/src/Ryujinx/Headless/WindowBase.cs +++ b/src/Ryujinx/Headless/WindowBase.cs @@ -255,12 +255,12 @@ namespace Ryujinx.Headless private void SetAntiAliasing() { - Renderer?.Window.SetAntiAliasing((Graphics.GAL.AntiAliasing)AntiAliasing); + Renderer?.Window.SetAntiAliasing(AntiAliasing); } private void SetScalingFilter() { - Renderer?.Window.SetScalingFilter((Graphics.GAL.ScalingFilter)ScalingFilter); + Renderer?.Window.SetScalingFilter(ScalingFilter); Renderer?.Window.SetScalingFilterLevel(ScalingFilterLevel); } From 8b3a945b5f8c8700b809348c2d25aa22bc7af7c7 Mon Sep 17 00:00:00 2001 From: Evan Husted Date: Sat, 28 Dec 2024 22:04:21 -0600 Subject: [PATCH 43/60] misc: Dirty Hacks Enable this settings screen via a boolean in Config.json First one is the xb2 menu softlock fix --- .../Configuration/DirtyHacks.cs | 11 ++++ src/Ryujinx.Common/TitleIDs.cs | 2 + src/Ryujinx.Graphics.Gpu/GraphicsConfig.cs | 6 --- .../Shader/ShaderCache.cs | 5 +- src/Ryujinx.HLE/HLEConfiguration.cs | 9 +++- .../Services/Fs/FileSystemProxy/IStorage.cs | 12 +++++ .../Extensions/FileSystemExtensions.cs | 3 +- .../Loaders/Processes/ProcessLoader.cs | 3 +- src/Ryujinx.HLE/Switch.cs | 3 ++ .../Configuration/ConfigurationFileFormat.cs | 14 +++++- .../ConfigurationState.Migration.cs | 3 ++ .../Configuration/ConfigurationState.Model.cs | 50 +++++++++++++++++++ .../Configuration/ConfigurationState.cs | 2 + src/Ryujinx/AppHost.cs | 6 ++- src/Ryujinx/Ryujinx.csproj | 6 +++ src/Ryujinx/UI/ViewModels/BaseModel.cs | 3 +- .../UI/ViewModels/SettingsViewModel.cs | 31 +++++++++--- .../UI/Views/Settings/SettingsHacksView.axaml | 48 ++++++++++++++++++ .../Views/Settings/SettingsHacksView.axaml.cs | 17 +++++++ src/Ryujinx/UI/Windows/SettingsWindow.axaml | 6 +++ .../UI/Windows/SettingsWindow.axaml.cs | 4 ++ 21 files changed, 222 insertions(+), 22 deletions(-) create mode 100644 src/Ryujinx.Common/Configuration/DirtyHacks.cs create mode 100644 src/Ryujinx/UI/Views/Settings/SettingsHacksView.axaml create mode 100644 src/Ryujinx/UI/Views/Settings/SettingsHacksView.axaml.cs diff --git a/src/Ryujinx.Common/Configuration/DirtyHacks.cs b/src/Ryujinx.Common/Configuration/DirtyHacks.cs new file mode 100644 index 000000000..6a6d4949c --- /dev/null +++ b/src/Ryujinx.Common/Configuration/DirtyHacks.cs @@ -0,0 +1,11 @@ +using System; + +namespace Ryujinx.Common.Configuration +{ + [Flags] + public enum DirtyHacks + { + None = 0, + Xc2MenuSoftlockFix = 1 << 10 + } +} diff --git a/src/Ryujinx.Common/TitleIDs.cs b/src/Ryujinx.Common/TitleIDs.cs index b75ee1299..2d4068e4e 100644 --- a/src/Ryujinx.Common/TitleIDs.cs +++ b/src/Ryujinx.Common/TitleIDs.cs @@ -8,6 +8,8 @@ namespace Ryujinx.Common { public static class TitleIDs { + public static Optional CurrentApplication; + public static GraphicsBackend SelectGraphicsBackend(string titleId, GraphicsBackend currentBackend) { switch (currentBackend) diff --git a/src/Ryujinx.Graphics.Gpu/GraphicsConfig.cs b/src/Ryujinx.Graphics.Gpu/GraphicsConfig.cs index fbb7399ca..6b2a57ad9 100644 --- a/src/Ryujinx.Graphics.Gpu/GraphicsConfig.cs +++ b/src/Ryujinx.Graphics.Gpu/GraphicsConfig.cs @@ -47,12 +47,6 @@ namespace Ryujinx.Graphics.Gpu /// public static bool EnableMacroHLE = true; - /// - /// Title id of the current running game. - /// Used by the shader cache. - /// - public static string TitleId; - /// /// Enables or disables the shader cache. /// diff --git a/src/Ryujinx.Graphics.Gpu/Shader/ShaderCache.cs b/src/Ryujinx.Graphics.Gpu/Shader/ShaderCache.cs index 0924c60f8..2f4d98b9b 100644 --- a/src/Ryujinx.Graphics.Gpu/Shader/ShaderCache.cs +++ b/src/Ryujinx.Graphics.Gpu/Shader/ShaderCache.cs @@ -1,3 +1,4 @@ +using Ryujinx.Common; using Ryujinx.Common.Configuration; using Ryujinx.Common.Logging; using Ryujinx.Graphics.GAL; @@ -116,8 +117,8 @@ namespace Ryujinx.Graphics.Gpu.Shader /// private static string GetDiskCachePath() { - return GraphicsConfig.EnableShaderCache && GraphicsConfig.TitleId != null - ? Path.Combine(AppDataManager.GamesDirPath, GraphicsConfig.TitleId, "cache", "shader") + return GraphicsConfig.EnableShaderCache && TitleIDs.CurrentApplication.HasValue + ? Path.Combine(AppDataManager.GamesDirPath, TitleIDs.CurrentApplication, "cache", "shader") : null; } diff --git a/src/Ryujinx.HLE/HLEConfiguration.cs b/src/Ryujinx.HLE/HLEConfiguration.cs index 52c2b3da4..3bfab0be4 100644 --- a/src/Ryujinx.HLE/HLEConfiguration.cs +++ b/src/Ryujinx.HLE/HLEConfiguration.cs @@ -188,6 +188,11 @@ namespace Ryujinx.HLE /// An action called when HLE force a refresh of output after docked mode changed. /// public Action RefreshInputConfig { internal get; set; } + + /** + * The desired hacky workarounds. + */ + public DirtyHacks Hacks { internal get; set; } public HLEConfiguration(VirtualFileSystem virtualFileSystem, LibHacHorizonManager libHacHorizonManager, @@ -218,7 +223,8 @@ namespace Ryujinx.HLE bool multiplayerDisableP2p, string multiplayerLdnPassphrase, string multiplayerLdnServer, - int customVSyncInterval) + int customVSyncInterval, + DirtyHacks dirtyHacks = DirtyHacks.None) { VirtualFileSystem = virtualFileSystem; LibHacHorizonManager = libHacHorizonManager; @@ -250,6 +256,7 @@ namespace Ryujinx.HLE MultiplayerDisableP2p = multiplayerDisableP2p; MultiplayerLdnPassphrase = multiplayerLdnPassphrase; MultiplayerLdnServer = multiplayerLdnServer; + Hacks = dirtyHacks; } } } diff --git a/src/Ryujinx.HLE/HOS/Services/Fs/FileSystemProxy/IStorage.cs b/src/Ryujinx.HLE/HOS/Services/Fs/FileSystemProxy/IStorage.cs index 4299a6c74..6b542c16a 100644 --- a/src/Ryujinx.HLE/HOS/Services/Fs/FileSystemProxy/IStorage.cs +++ b/src/Ryujinx.HLE/HOS/Services/Fs/FileSystemProxy/IStorage.cs @@ -1,6 +1,9 @@ using LibHac; using LibHac.Common; using LibHac.Sf; +using Ryujinx.Common; +using Ryujinx.Common.Configuration; +using System.Threading; namespace Ryujinx.HLE.HOS.Services.Fs.FileSystemProxy { @@ -13,6 +16,8 @@ namespace Ryujinx.HLE.HOS.Services.Fs.FileSystemProxy _baseStorage = SharedRef.CreateMove(ref baseStorage); } + private const string Xc2TitleId = "0100e95004038000"; + [CommandCmif(0)] // Read(u64 offset, u64 length) -> buffer buffer public ResultCode Read(ServiceCtx context) @@ -33,6 +38,13 @@ namespace Ryujinx.HLE.HOS.Services.Fs.FileSystemProxy using var region = context.Memory.GetWritableRegion(bufferAddress, (int)bufferLen, true); Result result = _baseStorage.Get.Read((long)offset, new OutBuffer(region.Memory.Span), (long)size); + + if (context.Device.DirtyHacks.HasFlag(DirtyHacks.Xc2MenuSoftlockFix) && TitleIDs.CurrentApplication == Xc2TitleId) + { + // Add a load-bearing sleep to avoid XC2 softlock + // https://web.archive.org/web/20240728045136/https://github.com/Ryujinx/Ryujinx/issues/2357 + Thread.Sleep(2); + } return (ResultCode)result.Value; } diff --git a/src/Ryujinx.HLE/Loaders/Processes/Extensions/FileSystemExtensions.cs b/src/Ryujinx.HLE/Loaders/Processes/Extensions/FileSystemExtensions.cs index 97284f3bb..e4a5a547d 100644 --- a/src/Ryujinx.HLE/Loaders/Processes/Extensions/FileSystemExtensions.cs +++ b/src/Ryujinx.HLE/Loaders/Processes/Extensions/FileSystemExtensions.cs @@ -4,6 +4,7 @@ using LibHac.Fs.Fsa; using LibHac.Loader; using LibHac.Ns; using LibHac.Tools.FsSystem; +using Ryujinx.Common; using Ryujinx.Common.Configuration; using Ryujinx.Common.Logging; using Ryujinx.HLE.Loaders.Executables; @@ -102,7 +103,7 @@ namespace Ryujinx.HLE.Loaders.Processes.Extensions } // Initialize GPU. - Graphics.Gpu.GraphicsConfig.TitleId = programId.ToString("X16"); + TitleIDs.CurrentApplication = programId.ToString("X16"); device.Gpu.HostInitalized.Set(); if (!MemoryBlock.SupportsFlags(MemoryAllocationFlags.ViewCompatible)) diff --git a/src/Ryujinx.HLE/Loaders/Processes/ProcessLoader.cs b/src/Ryujinx.HLE/Loaders/Processes/ProcessLoader.cs index fe8360f04..3e1929204 100644 --- a/src/Ryujinx.HLE/Loaders/Processes/ProcessLoader.cs +++ b/src/Ryujinx.HLE/Loaders/Processes/ProcessLoader.cs @@ -6,6 +6,7 @@ using LibHac.Ns; using LibHac.Tools.Fs; using LibHac.Tools.FsSystem; using LibHac.Tools.FsSystem.NcaUtils; +using Ryujinx.Common; using Ryujinx.Common.Logging; using Ryujinx.HLE.Loaders.Executables; using Ryujinx.HLE.Loaders.Processes.Extensions; @@ -204,7 +205,7 @@ namespace Ryujinx.HLE.Loaders.Processes } // Explicitly null TitleId to disable the shader cache. - Graphics.Gpu.GraphicsConfig.TitleId = null; + TitleIDs.CurrentApplication = default; _device.Gpu.HostInitalized.Set(); ProcessResult processResult = ProcessLoaderHelper.LoadNsos(_device, diff --git a/src/Ryujinx.HLE/Switch.cs b/src/Ryujinx.HLE/Switch.cs index d0afdf173..e0f94274c 100644 --- a/src/Ryujinx.HLE/Switch.cs +++ b/src/Ryujinx.HLE/Switch.cs @@ -37,6 +37,8 @@ namespace Ryujinx.HLE public bool IsFrameAvailable => Gpu.Window.IsFrameAvailable; + public DirtyHacks DirtyHacks { get; } + public Switch(HLEConfiguration configuration) { ArgumentNullException.ThrowIfNull(configuration.GpuRenderer); @@ -72,6 +74,7 @@ namespace Ryujinx.HLE System.EnablePtc = Configuration.EnablePtc; System.FsIntegrityCheckLevel = Configuration.FsIntegrityCheckLevel; System.GlobalAccessLogMode = Configuration.FsGlobalAccessLogMode; + DirtyHacks = Configuration.Hacks; UpdateVSyncInterval(); #pragma warning restore IDE0055 } diff --git a/src/Ryujinx.UI.Common/Configuration/ConfigurationFileFormat.cs b/src/Ryujinx.UI.Common/Configuration/ConfigurationFileFormat.cs index 027e1052b..f5ce265ee 100644 --- a/src/Ryujinx.UI.Common/Configuration/ConfigurationFileFormat.cs +++ b/src/Ryujinx.UI.Common/Configuration/ConfigurationFileFormat.cs @@ -17,7 +17,7 @@ namespace Ryujinx.UI.Common.Configuration /// /// The current version of the file format /// - public const int CurrentVersion = 57; + public const int CurrentVersion = 58; /// /// Version of the configuration file format @@ -429,7 +429,17 @@ namespace Ryujinx.UI.Common.Configuration /// Uses Hypervisor over JIT if available /// public bool UseHypervisor { get; set; } - + + /** + * Show toggles for dirty hacks in the UI. + */ + public bool ShowDirtyHacks { get; set; } + + /** + * The packed value of the enabled dirty hacks. + */ + public int EnabledDirtyHacks { get; set; } + /// /// Loads a configuration file from disk /// diff --git a/src/Ryujinx.UI.Common/Configuration/ConfigurationState.Migration.cs b/src/Ryujinx.UI.Common/Configuration/ConfigurationState.Migration.cs index a41ea2cd7..8652b4331 100644 --- a/src/Ryujinx.UI.Common/Configuration/ConfigurationState.Migration.cs +++ b/src/Ryujinx.UI.Common/Configuration/ConfigurationState.Migration.cs @@ -735,6 +735,9 @@ namespace Ryujinx.UI.Common.Configuration Multiplayer.DisableP2p.Value = configurationFileFormat.MultiplayerDisableP2p; Multiplayer.LdnPassphrase.Value = configurationFileFormat.MultiplayerLdnPassphrase; Multiplayer.LdnServer.Value = configurationFileFormat.LdnServer; + + Hacks.ShowDirtyHacks.Value = configurationFileFormat.ShowDirtyHacks; + Hacks.Xc2MenuSoftlockFix.Value = ((DirtyHacks)configurationFileFormat.EnabledDirtyHacks).HasFlag(DirtyHacks.Xc2MenuSoftlockFix); if (configurationFileUpdated) { diff --git a/src/Ryujinx.UI.Common/Configuration/ConfigurationState.Model.cs b/src/Ryujinx.UI.Common/Configuration/ConfigurationState.Model.cs index f28ce0348..c07ff3d71 100644 --- a/src/Ryujinx.UI.Common/Configuration/ConfigurationState.Model.cs +++ b/src/Ryujinx.UI.Common/Configuration/ConfigurationState.Model.cs @@ -1,4 +1,5 @@ using ARMeilleure; +using Gommon; using Ryujinx.Common; using Ryujinx.Common.Configuration; using Ryujinx.Common.Configuration.Hid; @@ -617,6 +618,49 @@ namespace Ryujinx.UI.Common.Configuration } } + public class HacksSection + { + /// + /// Show toggles for dirty hacks in the UI. + /// + public ReactiveObject ShowDirtyHacks { get; private set; } + + public ReactiveObject Xc2MenuSoftlockFix { get; private set; } + + public HacksSection() + { + ShowDirtyHacks = new ReactiveObject(); + Xc2MenuSoftlockFix = new ReactiveObject(); + Xc2MenuSoftlockFix.Event += HackChanged; + } + + private void HackChanged(object sender, ReactiveEventArgs rxe) + { + Ryujinx.Common.Logging.Logger.Info?.Print(LogClass.Configuration, $"EnabledDirtyHacks set to: {EnabledHacks}", "LogValueChange"); + } + + public DirtyHacks EnabledHacks + { + get + { + DirtyHacks dirtyHacks = DirtyHacks.None; + + if (Xc2MenuSoftlockFix) + Apply(DirtyHacks.Xc2MenuSoftlockFix); + + return dirtyHacks; + + void Apply(DirtyHacks hack) + { + if (dirtyHacks is not DirtyHacks.None) + dirtyHacks |= hack; + else + dirtyHacks = hack; + } + } + } + } + /// /// The default configuration instance /// @@ -651,6 +695,11 @@ namespace Ryujinx.UI.Common.Configuration /// The Multiplayer section /// public MultiplayerSection Multiplayer { get; private set; } + + /** + * The Dirty Hacks section + */ + public HacksSection Hacks { get; private set; } /// /// Enables or disables Discord Rich Presence @@ -700,6 +749,7 @@ namespace Ryujinx.UI.Common.Configuration Graphics = new GraphicsSection(); Hid = new HidSection(); Multiplayer = new MultiplayerSection(); + Hacks = new HacksSection(); EnableDiscordIntegration = new ReactiveObject(); CheckUpdatesOnStart = new ReactiveObject(); ShowConfirmExit = new ReactiveObject(); diff --git a/src/Ryujinx.UI.Common/Configuration/ConfigurationState.cs b/src/Ryujinx.UI.Common/Configuration/ConfigurationState.cs index 90bdc3409..8ae76ecc5 100644 --- a/src/Ryujinx.UI.Common/Configuration/ConfigurationState.cs +++ b/src/Ryujinx.UI.Common/Configuration/ConfigurationState.cs @@ -138,6 +138,8 @@ namespace Ryujinx.UI.Common.Configuration MultiplayerDisableP2p = Multiplayer.DisableP2p, MultiplayerLdnPassphrase = Multiplayer.LdnPassphrase, LdnServer = Multiplayer.LdnServer, + ShowDirtyHacks = Hacks.ShowDirtyHacks, + EnabledDirtyHacks = (int)Hacks.EnabledHacks, }; return configurationFile; diff --git a/src/Ryujinx/AppHost.cs b/src/Ryujinx/AppHost.cs index 909eb05d5..0f8b8030c 100644 --- a/src/Ryujinx/AppHost.cs +++ b/src/Ryujinx/AppHost.cs @@ -311,6 +311,7 @@ namespace Ryujinx.Ava Device.VSyncMode = e.NewValue; Device.UpdateVSyncInterval(); } + _renderer.Window?.ChangeVSyncMode(e.NewValue); _viewModel.ShowCustomVSyncIntervalPicker = (e.NewValue == VSyncMode.Custom); @@ -923,7 +924,7 @@ namespace Ryujinx.Ava // Initialize Configuration. var memoryConfiguration = ConfigurationState.Instance.System.DramSize.Value; - Device = new HLE.Switch(new HLEConfiguration( + Device = new Switch(new HLEConfiguration( VirtualFileSystem, _viewModel.LibHacHorizonManager, ContentManager, @@ -953,7 +954,8 @@ namespace Ryujinx.Ava ConfigurationState.Instance.Multiplayer.DisableP2p, ConfigurationState.Instance.Multiplayer.LdnPassphrase, ConfigurationState.Instance.Multiplayer.LdnServer, - ConfigurationState.Instance.Graphics.CustomVSyncInterval.Value)); + ConfigurationState.Instance.Graphics.CustomVSyncInterval.Value, + ConfigurationState.Instance.Hacks.ShowDirtyHacks ? ConfigurationState.Instance.Hacks.EnabledHacks : DirtyHacks.None)); } private static IHardwareDeviceDriver InitializeAudio() diff --git a/src/Ryujinx/Ryujinx.csproj b/src/Ryujinx/Ryujinx.csproj index d98e499c2..5e5adf2a0 100644 --- a/src/Ryujinx/Ryujinx.csproj +++ b/src/Ryujinx/Ryujinx.csproj @@ -139,4 +139,10 @@ + + + SettingsHacksView.axaml + Code + + \ No newline at end of file diff --git a/src/Ryujinx/UI/ViewModels/BaseModel.cs b/src/Ryujinx/UI/ViewModels/BaseModel.cs index d8f2e9096..e27c52867 100644 --- a/src/Ryujinx/UI/ViewModels/BaseModel.cs +++ b/src/Ryujinx/UI/ViewModels/BaseModel.cs @@ -13,8 +13,9 @@ namespace Ryujinx.Ava.UI.ViewModels PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); } - protected void OnPropertiesChanged(params ReadOnlySpan propertyNames) + protected void OnPropertiesChanged(string firstPropertyName, params ReadOnlySpan propertyNames) { + OnPropertyChanged(firstPropertyName); foreach (var propertyName in propertyNames) { OnPropertyChanged(propertyName); diff --git a/src/Ryujinx/UI/ViewModels/SettingsViewModel.cs b/src/Ryujinx/UI/ViewModels/SettingsViewModel.cs index 9feaaba9b..aa4b994ef 100644 --- a/src/Ryujinx/UI/ViewModels/SettingsViewModel.cs +++ b/src/Ryujinx/UI/ViewModels/SettingsViewModel.cs @@ -62,7 +62,9 @@ namespace Ryujinx.Ava.UI.ViewModels private int _networkInterfaceIndex; private int _multiplayerModeIndex; private string _ldnPassphrase; - private string _LdnServer; + private string _ldnServer; + + private bool _xc2MenuSoftlockFix = ConfigurationState.Instance.Hacks.Xc2MenuSoftlockFix; public int ResolutionScale { @@ -162,9 +164,7 @@ namespace Ryujinx.Ava.UI.ViewModels get => _vSyncMode; set { - if (value == VSyncMode.Custom || - value == VSyncMode.Switch || - value == VSyncMode.Unbounded) + if (value is VSyncMode.Custom or VSyncMode.Switch or VSyncMode.Unbounded) { _vSyncMode = value; OnPropertyChanged(); @@ -258,6 +258,8 @@ namespace Ryujinx.Ava.UI.ViewModels public bool UseHypervisor { get; set; } public bool DisableP2P { get; set; } + public bool ShowDirtyHacks => ConfigurationState.Instance.Hacks.ShowDirtyHacks; + public string TimeZone { get; set; } public string ShaderDumpPath { get; set; } @@ -274,6 +276,17 @@ namespace Ryujinx.Ava.UI.ViewModels } } + public bool Xc2MenuSoftlockFixEnabled + { + get => _xc2MenuSoftlockFix; + set + { + _xc2MenuSoftlockFix = value; + + OnPropertyChanged(); + } + } + public int Language { get; set; } public int Region { get; set; } public int FsGlobalAccessLogMode { get; set; } @@ -374,10 +387,10 @@ namespace Ryujinx.Ava.UI.ViewModels public string LdnServer { - get => _LdnServer; + get => _ldnServer; set { - _LdnServer = value; + _ldnServer = value; OnPropertyChanged(); } } @@ -746,6 +759,9 @@ namespace Ryujinx.Ava.UI.ViewModels config.Multiplayer.DisableP2p.Value = DisableP2P; config.Multiplayer.LdnPassphrase.Value = LdnPassphrase; config.Multiplayer.LdnServer.Value = LdnServer; + + // Dirty Hacks + config.Hacks.Xc2MenuSoftlockFix.Value = Xc2MenuSoftlockFixEnabled; config.ToFileFormat().SaveConfig(Program.ConfigurationPath); @@ -779,5 +795,8 @@ namespace Ryujinx.Ava.UI.ViewModels RevertIfNotSaved(); CloseWindow?.Invoke(); } + + public static string Xc2MenuFixTooltip => + "From the issue on GitHub:\n\nWhen clicking very fast from game main menu to 2nd submenu, there is a low chance that the game will softlock, the submenu won't show up, while background music is still there."; } } diff --git a/src/Ryujinx/UI/Views/Settings/SettingsHacksView.axaml b/src/Ryujinx/UI/Views/Settings/SettingsHacksView.axaml new file mode 100644 index 000000000..b7817f064 --- /dev/null +++ b/src/Ryujinx/UI/Views/Settings/SettingsHacksView.axaml @@ -0,0 +1,48 @@ + + + + + + + + + + + + + + + + + diff --git a/src/Ryujinx/UI/Views/Settings/SettingsHacksView.axaml.cs b/src/Ryujinx/UI/Views/Settings/SettingsHacksView.axaml.cs new file mode 100644 index 000000000..f9e0958ca --- /dev/null +++ b/src/Ryujinx/UI/Views/Settings/SettingsHacksView.axaml.cs @@ -0,0 +1,17 @@ +using Avalonia.Controls; +using Avalonia.Interactivity; +using Ryujinx.Ava.UI.ViewModels; +using Ryujinx.UI.Common.Configuration; + +namespace Ryujinx.Ava.UI.Views.Settings +{ + public partial class SettingsHacksView : UserControl + { + public SettingsViewModel ViewModel; + + public SettingsHacksView() + { + InitializeComponent(); + } + } +} diff --git a/src/Ryujinx/UI/Windows/SettingsWindow.axaml b/src/Ryujinx/UI/Windows/SettingsWindow.axaml index 2bf5b55e7..59302b6fc 100644 --- a/src/Ryujinx/UI/Windows/SettingsWindow.axaml +++ b/src/Ryujinx/UI/Windows/SettingsWindow.axaml @@ -37,6 +37,7 @@ + + \ No newline at end of file diff --git a/src/Ryujinx.UI.Common/Resources/Controller_JoyConPair.svg b/src/Ryujinx.UI.Common/Resources/Controller_JoyConPair.svg deleted file mode 100644 index c073c9c0c..000000000 --- a/src/Ryujinx.UI.Common/Resources/Controller_JoyConPair.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/src/Ryujinx.UI.Common/Resources/Controller_JoyConRight.svg b/src/Ryujinx.UI.Common/Resources/Controller_JoyConRight.svg deleted file mode 100644 index f4f125148..000000000 --- a/src/Ryujinx.UI.Common/Resources/Controller_JoyConRight.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/src/Ryujinx.UI.Common/Resources/Controller_ProCon.svg b/src/Ryujinx.UI.Common/Resources/Controller_ProCon.svg deleted file mode 100644 index f5380f3ad..000000000 --- a/src/Ryujinx.UI.Common/Resources/Controller_ProCon.svg +++ /dev/null @@ -1,132 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - A - - - - X - - - - Y - - - - B - - - - - - - - - - ZL - - - - - ZR - - - - R - - - - - L - - - diff --git a/src/Ryujinx.UI.Common/Ryujinx.UI.Common.csproj b/src/Ryujinx.UI.Common/Ryujinx.UI.Common.csproj index 1ee9a4aa0..9a487b55a 100644 --- a/src/Ryujinx.UI.Common/Ryujinx.UI.Common.csproj +++ b/src/Ryujinx.UI.Common/Ryujinx.UI.Common.csproj @@ -21,25 +21,6 @@ - - - - - - - - - - - - - - - - - - - @@ -61,4 +42,8 @@ + + + + diff --git a/src/Ryujinx.UI.Common/Resources/Icon_Blank.png b/src/Ryujinx/Assets/UIImages/Icon_Blank.png similarity index 100% rename from src/Ryujinx.UI.Common/Resources/Icon_Blank.png rename to src/Ryujinx/Assets/UIImages/Icon_Blank.png diff --git a/src/Ryujinx.UI.Common/Resources/Icon_NCA.png b/src/Ryujinx/Assets/UIImages/Icon_NCA.png similarity index 100% rename from src/Ryujinx.UI.Common/Resources/Icon_NCA.png rename to src/Ryujinx/Assets/UIImages/Icon_NCA.png diff --git a/src/Ryujinx.UI.Common/Resources/Icon_NRO.png b/src/Ryujinx/Assets/UIImages/Icon_NRO.png similarity index 100% rename from src/Ryujinx.UI.Common/Resources/Icon_NRO.png rename to src/Ryujinx/Assets/UIImages/Icon_NRO.png diff --git a/src/Ryujinx.UI.Common/Resources/Icon_NSO.png b/src/Ryujinx/Assets/UIImages/Icon_NSO.png similarity index 100% rename from src/Ryujinx.UI.Common/Resources/Icon_NSO.png rename to src/Ryujinx/Assets/UIImages/Icon_NSO.png diff --git a/src/Ryujinx.UI.Common/Resources/Icon_NSP.png b/src/Ryujinx/Assets/UIImages/Icon_NSP.png similarity index 100% rename from src/Ryujinx.UI.Common/Resources/Icon_NSP.png rename to src/Ryujinx/Assets/UIImages/Icon_NSP.png diff --git a/src/Ryujinx.UI.Common/Resources/Icon_XCI.png b/src/Ryujinx/Assets/UIImages/Icon_XCI.png similarity index 100% rename from src/Ryujinx.UI.Common/Resources/Icon_XCI.png rename to src/Ryujinx/Assets/UIImages/Icon_XCI.png diff --git a/src/Ryujinx.UI.Common/Resources/Logo_Amiibo.png b/src/Ryujinx/Assets/UIImages/Logo_Amiibo.png similarity index 100% rename from src/Ryujinx.UI.Common/Resources/Logo_Amiibo.png rename to src/Ryujinx/Assets/UIImages/Logo_Amiibo.png diff --git a/src/Ryujinx.UI.Common/Resources/Logo_Discord_Dark.png b/src/Ryujinx/Assets/UIImages/Logo_Discord_Dark.png similarity index 100% rename from src/Ryujinx.UI.Common/Resources/Logo_Discord_Dark.png rename to src/Ryujinx/Assets/UIImages/Logo_Discord_Dark.png diff --git a/src/Ryujinx.UI.Common/Resources/Logo_Discord_Light.png b/src/Ryujinx/Assets/UIImages/Logo_Discord_Light.png similarity index 100% rename from src/Ryujinx.UI.Common/Resources/Logo_Discord_Light.png rename to src/Ryujinx/Assets/UIImages/Logo_Discord_Light.png diff --git a/src/Ryujinx.UI.Common/Resources/Logo_GitHub_Dark.png b/src/Ryujinx/Assets/UIImages/Logo_GitHub_Dark.png similarity index 100% rename from src/Ryujinx.UI.Common/Resources/Logo_GitHub_Dark.png rename to src/Ryujinx/Assets/UIImages/Logo_GitHub_Dark.png diff --git a/src/Ryujinx.UI.Common/Resources/Logo_GitHub_Light.png b/src/Ryujinx/Assets/UIImages/Logo_GitHub_Light.png similarity index 100% rename from src/Ryujinx.UI.Common/Resources/Logo_GitHub_Light.png rename to src/Ryujinx/Assets/UIImages/Logo_GitHub_Light.png diff --git a/src/Ryujinx.UI.Common/Resources/Logo_Ryujinx.png b/src/Ryujinx/Assets/UIImages/Logo_Ryujinx.png similarity index 100% rename from src/Ryujinx.UI.Common/Resources/Logo_Ryujinx.png rename to src/Ryujinx/Assets/UIImages/Logo_Ryujinx.png diff --git a/src/Ryujinx.UI.Common/Resources/Logo_Ryujinx_AntiAlias.png b/src/Ryujinx/Assets/UIImages/Logo_Ryujinx_AntiAlias.png similarity index 100% rename from src/Ryujinx.UI.Common/Resources/Logo_Ryujinx_AntiAlias.png rename to src/Ryujinx/Assets/UIImages/Logo_Ryujinx_AntiAlias.png diff --git a/src/Ryujinx.UI.Common/DiscordIntegrationModule.cs b/src/Ryujinx/DiscordIntegrationModule.cs similarity index 99% rename from src/Ryujinx.UI.Common/DiscordIntegrationModule.cs rename to src/Ryujinx/DiscordIntegrationModule.cs index efeeb2586..92c8e2aa6 100644 --- a/src/Ryujinx.UI.Common/DiscordIntegrationModule.cs +++ b/src/Ryujinx/DiscordIntegrationModule.cs @@ -8,7 +8,7 @@ using Ryujinx.UI.App.Common; using Ryujinx.UI.Common.Configuration; using System.Text; -namespace Ryujinx.UI.Common +namespace Ryujinx.Ava { public static class DiscordIntegrationModule { diff --git a/src/Ryujinx/Ryujinx.csproj b/src/Ryujinx/Ryujinx.csproj index 5e5adf2a0..998257dff 100644 --- a/src/Ryujinx/Ryujinx.csproj +++ b/src/Ryujinx/Ryujinx.csproj @@ -134,15 +134,21 @@ + + + + + + + + + + + + - - - SettingsHacksView.axaml - Code - - \ No newline at end of file diff --git a/src/Ryujinx/UI/Applet/ErrorAppletWindow.axaml b/src/Ryujinx/UI/Applet/ErrorAppletWindow.axaml index c7aa56fb8..22c2851e1 100644 --- a/src/Ryujinx/UI/Applet/ErrorAppletWindow.axaml +++ b/src/Ryujinx/UI/Applet/ErrorAppletWindow.axaml @@ -25,7 +25,7 @@ Height="80" MinWidth="50" Margin="5,10,20,10" - Source="resm:Ryujinx.UI.Common.Resources.Logo_Ryujinx.png?assembly=Ryujinx.UI.Common" /> + Source="resm:Ryujinx.Assets.UIImages.Logo_Ryujinx.png?assembly=Ryujinx" /> + Source="resm:Ryujinx.Assets.UIImages.Logo_Ryujinx.png?assembly=Ryujinx" /> + Source="resm:Ryujinx.Assets.UIImages.Logo_Ryujinx.png?assembly=Ryujinx" /> new(Avalonia.Platform.AssetLoader.Open(new Uri(uri))); diff --git a/src/Ryujinx/UI/ViewModels/AmiiboWindowViewModel.cs b/src/Ryujinx/UI/ViewModels/AmiiboWindowViewModel.cs index ab08ce385..468a7c269 100644 --- a/src/Ryujinx/UI/ViewModels/AmiiboWindowViewModel.cs +++ b/src/Ryujinx/UI/ViewModels/AmiiboWindowViewModel.cs @@ -68,7 +68,7 @@ namespace Ryujinx.Ava.UI.ViewModels _amiiboSeries = new ObservableCollection(); _amiibos = new AvaloniaList(); - _amiiboLogoBytes = EmbeddedResources.Read("Ryujinx.UI.Common/Resources/Logo_Amiibo.png"); + _amiiboLogoBytes = EmbeddedResources.Read("Ryujinx/Assets/UIImages/Logo_Amiibo.png"); _ = LoadContentAsync(); } diff --git a/src/Ryujinx/UI/ViewModels/Input/InputViewModel.cs b/src/Ryujinx/UI/ViewModels/Input/InputViewModel.cs index 493e6659d..79daab701 100644 --- a/src/Ryujinx/UI/ViewModels/Input/InputViewModel.cs +++ b/src/Ryujinx/UI/ViewModels/Input/InputViewModel.cs @@ -35,10 +35,10 @@ namespace Ryujinx.Ava.UI.ViewModels.Input public class InputViewModel : BaseModel, IDisposable { private const string Disabled = "disabled"; - private const string ProControllerResource = "Ryujinx.UI.Common/Resources/Controller_ProCon.svg"; - private const string JoyConPairResource = "Ryujinx.UI.Common/Resources/Controller_JoyConPair.svg"; - private const string JoyConLeftResource = "Ryujinx.UI.Common/Resources/Controller_JoyConLeft.svg"; - private const string JoyConRightResource = "Ryujinx.UI.Common/Resources/Controller_JoyConRight.svg"; + private const string ProControllerResource = "Ryujinx/Assets/Icons/Controller_ProCon.svg"; + private const string JoyConPairResource = "Ryujinx/Assets/Icons/Controller_JoyConPair.svg"; + private const string JoyConLeftResource = "Ryujinx/Assets/Icons/Controller_JoyConLeft.svg"; + private const string JoyConRightResource = "Ryujinx/Assets/Icons/Controller_JoyConRight.svg"; private const string KeyboardString = "keyboard"; private const string ControllerString = "controller"; private readonly MainWindow _mainWindow; diff --git a/src/Ryujinx/UI/ViewModels/MainWindowViewModel.cs b/src/Ryujinx/UI/ViewModels/MainWindowViewModel.cs index 6e014fedc..c5f9f57ec 100644 --- a/src/Ryujinx/UI/ViewModels/MainWindowViewModel.cs +++ b/src/Ryujinx/UI/ViewModels/MainWindowViewModel.cs @@ -134,7 +134,7 @@ namespace Ryujinx.Ava.UI.ViewModels // For an example of this, download canary 1.2.95, then open the settings menu, and look at the icon in the top-left. // The border gets reduced to colored pixels in the 4 corners. public static readonly Bitmap IconBitmap = - new(Assembly.GetAssembly(typeof(ConfigurationState))!.GetManifestResourceStream("Ryujinx.UI.Common.Resources.Logo_Ryujinx_AntiAlias.png")!); + new(Assembly.GetAssembly(typeof(MainWindowViewModel))!.GetManifestResourceStream("Ryujinx.Assets.UIImages.Logo_Ryujinx_AntiAlias.png")!); public MainWindow Window { get; init; } diff --git a/src/Ryujinx/UI/Windows/AboutWindow.axaml b/src/Ryujinx/UI/Windows/AboutWindow.axaml index c5abb0241..1b00ad23c 100644 --- a/src/Ryujinx/UI/Windows/AboutWindow.axaml +++ b/src/Ryujinx/UI/Windows/AboutWindow.axaml @@ -38,7 +38,7 @@ Date: Sun, 29 Dec 2024 19:09:28 -0600 Subject: [PATCH 56/60] misc: move Models & Helpers into Common & Avalonia projects --- .../Helpers}/CommandLineState.cs | 0 .../Helpers}/ConsoleHelper.cs | 0 .../Helpers}/FileAssociationHelper.cs | 0 .../Helpers}/LinuxHelper.cs | 0 .../Helpers}/ObjectiveC.cs | 0 .../Helpers}/OpenHelper.cs | 0 .../Helpers}/ValueFormatUtils.cs | 0 .../Helper/AppletMetadata.cs | 64 ------------------- .../Ryujinx.UI.Common.csproj | 4 -- src/Ryujinx/AppHost.cs | 3 +- .../Common}/Models/Amiibo/AmiiboApi.cs | 2 +- .../Models/Amiibo/AmiiboApiGamesSwitch.cs | 2 +- .../Common}/Models/Amiibo/AmiiboApiUsage.cs | 2 +- .../Common}/Models/Amiibo/AmiiboJson.cs | 2 +- .../Amiibo/AmiiboJsonSerializerContext.cs | 6 +- .../Models/DownloadableContentModel.cs | 2 +- .../Github/GithubReleaseAssetJsonResponse.cs | 2 +- .../Github/GithubReleasesJsonResponse.cs | 2 +- .../GithubReleasesJsonSerializerContext.cs | 6 +- .../Common}/Models/TitleUpdateModel.cs | 2 +- .../Common}/Models/XCITrimmerFileModel.cs | 4 +- src/Ryujinx/DiscordIntegrationModule.cs | 2 +- src/Ryujinx/Program.cs | 2 +- .../Controls/ApplicationContextMenu.axaml.cs | 3 +- .../UI/Controls/ApplicationGridView.axaml.cs | 2 +- .../UI/Controls/ApplicationListView.axaml.cs | 2 +- .../UI/Helpers/ApplicationOpenedEventArgs.cs | 2 +- .../UI/Helpers/MultiplayerInfoConverter.cs | 2 +- .../XCITrimmerFileSpaceSavingsConverter.cs | 2 +- .../Helpers/XCITrimmerFileStatusConverter.cs | 2 +- .../XCITrimmerFileStatusDetailConverter.cs | 2 +- .../Models/Generic/LastPlayedSortComparer.cs | 2 +- .../Models/Generic/TimePlayedSortComparer.cs | 2 +- src/Ryujinx/UI/Models/SaveModel.cs | 2 +- .../UI/ViewModels/AmiiboWindowViewModel.cs | 2 +- .../ViewModels/AppListFavoriteComparable.cs | 2 +- .../DownloadableContentManagerViewModel.cs | 4 +- .../UI/ViewModels/MainWindowViewModel.cs | 2 +- .../UI/ViewModels/TitleUpdateViewModel.cs | 4 +- .../UI/ViewModels/XCITrimmerViewModel.cs | 14 +++- .../UI/Views/Main/MainMenuBarView.axaml.cs | 1 + src/Ryujinx/UI/Windows/AmiiboWindow.axaml.cs | 2 +- src/Ryujinx/UI/Windows/CheatWindow.axaml.cs | 2 +- .../DownloadableContentManagerWindow.axaml | 2 +- .../DownloadableContentManagerWindow.axaml.cs | 4 +- src/Ryujinx/UI/Windows/MainWindow.axaml.cs | 2 +- .../UI/Windows/TitleUpdateWindow.axaml | 2 +- .../UI/Windows/TitleUpdateWindow.axaml.cs | 4 +- src/Ryujinx/UI/Windows/XCITrimmerWindow.axaml | 5 +- .../UI/Windows/XCITrimmerWindow.axaml.cs | 2 +- src/Ryujinx/Updater.cs | 2 +- .../ApplicationCountUpdatedEventArgs.cs | 2 +- .../Utilities/AppLibrary}/ApplicationData.cs | 2 +- .../ApplicationJsonSerializerContext.cs | 2 +- .../AppLibrary}/ApplicationLibrary.cs | 6 +- .../AppLibrary}/ApplicationMetadata.cs | 2 +- .../Utilities/AppLibrary}/LdnGameData.cs | 2 +- .../LdnGameDataReceivedEventArgs.cs | 2 +- .../LdnGameDataSerializerContext.cs | 7 +- src/Ryujinx/Utilities/AppletMetadata.cs | 60 +++++++++++++++++ .../Utilities}/DownloadableContentsHelper.cs | 4 +- .../Utilities}/SetupValidator.cs | 2 +- .../Utilities}/ShortcutHelper.cs | 3 +- .../Utilities}/TitleHelper.cs | 3 +- .../Utilities}/TitleUpdatesHelper.cs | 4 +- 65 files changed, 141 insertions(+), 146 deletions(-) rename src/{Ryujinx.UI.Common/Helper => Ryujinx.Common/Helpers}/CommandLineState.cs (100%) rename src/{Ryujinx.UI.Common/Helper => Ryujinx.Common/Helpers}/ConsoleHelper.cs (100%) rename src/{Ryujinx.UI.Common/Helper => Ryujinx.Common/Helpers}/FileAssociationHelper.cs (100%) rename src/{Ryujinx.UI.Common/Helper => Ryujinx.Common/Helpers}/LinuxHelper.cs (100%) rename src/{Ryujinx.UI.Common/Helper => Ryujinx.Common/Helpers}/ObjectiveC.cs (100%) rename src/{Ryujinx.UI.Common/Helper => Ryujinx.Common/Helpers}/OpenHelper.cs (100%) rename src/{Ryujinx.UI.Common/Helper => Ryujinx.Common/Helpers}/ValueFormatUtils.cs (100%) delete mode 100644 src/Ryujinx.UI.Common/Helper/AppletMetadata.cs rename src/{Ryujinx.UI.Common => Ryujinx/Common}/Models/Amiibo/AmiiboApi.cs (97%) rename src/{Ryujinx.UI.Common => Ryujinx/Common}/Models/Amiibo/AmiiboApiGamesSwitch.cs (90%) rename src/{Ryujinx.UI.Common => Ryujinx/Common}/Models/Amiibo/AmiiboApiUsage.cs (84%) rename src/{Ryujinx.UI.Common => Ryujinx/Common}/Models/Amiibo/AmiiboJson.cs (87%) rename src/{Ryujinx.UI.Common => Ryujinx/Common}/Models/Amiibo/AmiiboJsonSerializerContext.cs (69%) rename src/{Ryujinx.UI.Common => Ryujinx/Common}/Models/DownloadableContentModel.cs (93%) rename src/{Ryujinx.UI.Common => Ryujinx/Common}/Models/Github/GithubReleaseAssetJsonResponse.cs (82%) rename src/{Ryujinx.UI.Common => Ryujinx/Common}/Models/Github/GithubReleasesJsonResponse.cs (85%) rename src/{Ryujinx.UI.Common => Ryujinx/Common}/Models/Github/GithubReleasesJsonSerializerContext.cs (74%) rename src/{Ryujinx.UI.Common => Ryujinx/Common}/Models/TitleUpdateModel.cs (91%) rename src/{Ryujinx.UI.Common => Ryujinx/Common}/Models/XCITrimmerFileModel.cs (95%) rename src/{Ryujinx.UI.Common/App => Ryujinx/Utilities/AppLibrary}/ApplicationCountUpdatedEventArgs.cs (81%) rename src/{Ryujinx.UI.Common/App => Ryujinx/Utilities/AppLibrary}/ApplicationData.cs (99%) rename src/{Ryujinx.UI.Common/App => Ryujinx/Utilities/AppLibrary}/ApplicationJsonSerializerContext.cs (85%) rename src/{Ryujinx.UI.Common/App => Ryujinx/Utilities/AppLibrary}/ApplicationLibrary.cs (99%) rename src/{Ryujinx.UI.Common/App => Ryujinx/Utilities/AppLibrary}/ApplicationMetadata.cs (97%) rename src/{Ryujinx.UI.Common/App => Ryujinx/Utilities/AppLibrary}/LdnGameData.cs (96%) rename src/{Ryujinx.UI.Common/App => Ryujinx/Utilities/AppLibrary}/LdnGameDataReceivedEventArgs.cs (81%) rename src/{Ryujinx.UI.Common/App => Ryujinx/Utilities/AppLibrary}/LdnGameDataSerializerContext.cs (76%) create mode 100644 src/Ryujinx/Utilities/AppletMetadata.cs rename src/{Ryujinx.UI.Common/Helper => Ryujinx/Utilities}/DownloadableContentsHelper.cs (98%) rename src/{Ryujinx.UI.Common/Helper => Ryujinx/Utilities}/SetupValidator.cs (99%) rename src/{Ryujinx.UI.Common/Helper => Ryujinx/Utilities}/ShortcutHelper.cs (99%) rename src/{Ryujinx.UI.Common/Helper => Ryujinx/Utilities}/TitleHelper.cs (95%) rename src/{Ryujinx.UI.Common/Helper => Ryujinx/Utilities}/TitleUpdatesHelper.cs (98%) diff --git a/src/Ryujinx.UI.Common/Helper/CommandLineState.cs b/src/Ryujinx.Common/Helpers/CommandLineState.cs similarity index 100% rename from src/Ryujinx.UI.Common/Helper/CommandLineState.cs rename to src/Ryujinx.Common/Helpers/CommandLineState.cs diff --git a/src/Ryujinx.UI.Common/Helper/ConsoleHelper.cs b/src/Ryujinx.Common/Helpers/ConsoleHelper.cs similarity index 100% rename from src/Ryujinx.UI.Common/Helper/ConsoleHelper.cs rename to src/Ryujinx.Common/Helpers/ConsoleHelper.cs diff --git a/src/Ryujinx.UI.Common/Helper/FileAssociationHelper.cs b/src/Ryujinx.Common/Helpers/FileAssociationHelper.cs similarity index 100% rename from src/Ryujinx.UI.Common/Helper/FileAssociationHelper.cs rename to src/Ryujinx.Common/Helpers/FileAssociationHelper.cs diff --git a/src/Ryujinx.UI.Common/Helper/LinuxHelper.cs b/src/Ryujinx.Common/Helpers/LinuxHelper.cs similarity index 100% rename from src/Ryujinx.UI.Common/Helper/LinuxHelper.cs rename to src/Ryujinx.Common/Helpers/LinuxHelper.cs diff --git a/src/Ryujinx.UI.Common/Helper/ObjectiveC.cs b/src/Ryujinx.Common/Helpers/ObjectiveC.cs similarity index 100% rename from src/Ryujinx.UI.Common/Helper/ObjectiveC.cs rename to src/Ryujinx.Common/Helpers/ObjectiveC.cs diff --git a/src/Ryujinx.UI.Common/Helper/OpenHelper.cs b/src/Ryujinx.Common/Helpers/OpenHelper.cs similarity index 100% rename from src/Ryujinx.UI.Common/Helper/OpenHelper.cs rename to src/Ryujinx.Common/Helpers/OpenHelper.cs diff --git a/src/Ryujinx.UI.Common/Helper/ValueFormatUtils.cs b/src/Ryujinx.Common/Helpers/ValueFormatUtils.cs similarity index 100% rename from src/Ryujinx.UI.Common/Helper/ValueFormatUtils.cs rename to src/Ryujinx.Common/Helpers/ValueFormatUtils.cs diff --git a/src/Ryujinx.UI.Common/Helper/AppletMetadata.cs b/src/Ryujinx.UI.Common/Helper/AppletMetadata.cs deleted file mode 100644 index 644b7fe74..000000000 --- a/src/Ryujinx.UI.Common/Helper/AppletMetadata.cs +++ /dev/null @@ -1,64 +0,0 @@ -using LibHac.Common; -using LibHac.Ncm; -using LibHac.Ns; -using LibHac.Tools.FsSystem.NcaUtils; -using Ryujinx.HLE; -using Ryujinx.HLE.FileSystem; -using Ryujinx.UI.App.Common; - -namespace Ryujinx.UI.Common.Helper -{ - public readonly struct AppletMetadata - { - private readonly ContentManager _contentManager; - - public string Name { get; } - public ulong ProgramId { get; } - - public string Version { get; } - - public AppletMetadata(ContentManager contentManager, string name, ulong programId, string version = "1.0.0") - : this(name, programId, version) - { - _contentManager = contentManager; - } - - public AppletMetadata(string name, ulong programId, string version = "1.0.0") - { - Name = name; - ProgramId = programId; - Version = version; - } - - public string GetContentPath(ContentManager contentManager) - => (contentManager ?? _contentManager) - .GetInstalledContentPath(ProgramId, StorageId.BuiltInSystem, NcaContentType.Program); - - public bool CanStart(ContentManager contentManager, out ApplicationData appData, out BlitStruct appControl) - { - contentManager ??= _contentManager; - if (contentManager == null) - { - appData = null; - appControl = new BlitStruct(0); - return false; - } - - appData = new() - { - Name = Name, - Id = ProgramId, - Path = GetContentPath(contentManager) - }; - - if (string.IsNullOrEmpty(appData.Path)) - { - appControl = new BlitStruct(0); - return false; - } - - appControl = StructHelpers.CreateCustomNacpData(Name, Version); - return true; - } - } -} diff --git a/src/Ryujinx.UI.Common/Ryujinx.UI.Common.csproj b/src/Ryujinx.UI.Common/Ryujinx.UI.Common.csproj index 9a487b55a..0a28fddf3 100644 --- a/src/Ryujinx.UI.Common/Ryujinx.UI.Common.csproj +++ b/src/Ryujinx.UI.Common/Ryujinx.UI.Common.csproj @@ -42,8 +42,4 @@ - - - - diff --git a/src/Ryujinx/AppHost.cs b/src/Ryujinx/AppHost.cs index 03860da43..f3fcbf5aa 100644 --- a/src/Ryujinx/AppHost.cs +++ b/src/Ryujinx/AppHost.cs @@ -20,6 +20,8 @@ using Ryujinx.Ava.UI.Models; using Ryujinx.Ava.UI.Renderer; using Ryujinx.Ava.UI.ViewModels; using Ryujinx.Ava.UI.Windows; +using Ryujinx.Ava.Utilities; +using Ryujinx.Ava.Utilities.AppLibrary; using Ryujinx.Common; using Ryujinx.Common.Configuration; using Ryujinx.Common.Configuration.Multiplayer; @@ -40,7 +42,6 @@ using Ryujinx.HLE.HOS.Services.Account.Acc; using Ryujinx.HLE.HOS.SystemState; using Ryujinx.Input; using Ryujinx.Input.HLE; -using Ryujinx.UI.App.Common; using Ryujinx.UI.Common; using Ryujinx.UI.Common.Configuration; using Ryujinx.UI.Common.Helper; diff --git a/src/Ryujinx.UI.Common/Models/Amiibo/AmiiboApi.cs b/src/Ryujinx/Common/Models/Amiibo/AmiiboApi.cs similarity index 97% rename from src/Ryujinx.UI.Common/Models/Amiibo/AmiiboApi.cs rename to src/Ryujinx/Common/Models/Amiibo/AmiiboApi.cs index 7989f0f1a..826e98d4f 100644 --- a/src/Ryujinx.UI.Common/Models/Amiibo/AmiiboApi.cs +++ b/src/Ryujinx/Common/Models/Amiibo/AmiiboApi.cs @@ -2,7 +2,7 @@ using System; using System.Collections.Generic; using System.Text.Json.Serialization; -namespace Ryujinx.UI.Common.Models.Amiibo +namespace Ryujinx.Ava.Common.Models.Amiibo { public struct AmiiboApi : IEquatable { diff --git a/src/Ryujinx.UI.Common/Models/Amiibo/AmiiboApiGamesSwitch.cs b/src/Ryujinx/Common/Models/Amiibo/AmiiboApiGamesSwitch.cs similarity index 90% rename from src/Ryujinx.UI.Common/Models/Amiibo/AmiiboApiGamesSwitch.cs rename to src/Ryujinx/Common/Models/Amiibo/AmiiboApiGamesSwitch.cs index 40e635bf0..7d43506e4 100644 --- a/src/Ryujinx.UI.Common/Models/Amiibo/AmiiboApiGamesSwitch.cs +++ b/src/Ryujinx/Common/Models/Amiibo/AmiiboApiGamesSwitch.cs @@ -1,7 +1,7 @@ using System.Collections.Generic; using System.Text.Json.Serialization; -namespace Ryujinx.UI.Common.Models.Amiibo +namespace Ryujinx.Ava.Common.Models.Amiibo { public class AmiiboApiGamesSwitch { diff --git a/src/Ryujinx.UI.Common/Models/Amiibo/AmiiboApiUsage.cs b/src/Ryujinx/Common/Models/Amiibo/AmiiboApiUsage.cs similarity index 84% rename from src/Ryujinx.UI.Common/Models/Amiibo/AmiiboApiUsage.cs rename to src/Ryujinx/Common/Models/Amiibo/AmiiboApiUsage.cs index 4f8d292b1..911323182 100644 --- a/src/Ryujinx.UI.Common/Models/Amiibo/AmiiboApiUsage.cs +++ b/src/Ryujinx/Common/Models/Amiibo/AmiiboApiUsage.cs @@ -1,6 +1,6 @@ using System.Text.Json.Serialization; -namespace Ryujinx.UI.Common.Models.Amiibo +namespace Ryujinx.Ava.Common.Models.Amiibo { public class AmiiboApiUsage { diff --git a/src/Ryujinx.UI.Common/Models/Amiibo/AmiiboJson.cs b/src/Ryujinx/Common/Models/Amiibo/AmiiboJson.cs similarity index 87% rename from src/Ryujinx.UI.Common/Models/Amiibo/AmiiboJson.cs rename to src/Ryujinx/Common/Models/Amiibo/AmiiboJson.cs index 15083f505..39ca94bb6 100644 --- a/src/Ryujinx.UI.Common/Models/Amiibo/AmiiboJson.cs +++ b/src/Ryujinx/Common/Models/Amiibo/AmiiboJson.cs @@ -2,7 +2,7 @@ using System; using System.Collections.Generic; using System.Text.Json.Serialization; -namespace Ryujinx.UI.Common.Models.Amiibo +namespace Ryujinx.Ava.Common.Models.Amiibo { public struct AmiiboJson { diff --git a/src/Ryujinx.UI.Common/Models/Amiibo/AmiiboJsonSerializerContext.cs b/src/Ryujinx/Common/Models/Amiibo/AmiiboJsonSerializerContext.cs similarity index 69% rename from src/Ryujinx.UI.Common/Models/Amiibo/AmiiboJsonSerializerContext.cs rename to src/Ryujinx/Common/Models/Amiibo/AmiiboJsonSerializerContext.cs index bc3f1303c..e0fe11bc5 100644 --- a/src/Ryujinx.UI.Common/Models/Amiibo/AmiiboJsonSerializerContext.cs +++ b/src/Ryujinx/Common/Models/Amiibo/AmiiboJsonSerializerContext.cs @@ -1,9 +1,7 @@ using System.Text.Json.Serialization; -namespace Ryujinx.UI.Common.Models.Amiibo +namespace Ryujinx.Ava.Common.Models.Amiibo { [JsonSerializable(typeof(AmiiboJson))] - public partial class AmiiboJsonSerializerContext : JsonSerializerContext - { - } + public partial class AmiiboJsonSerializerContext : JsonSerializerContext; } diff --git a/src/Ryujinx.UI.Common/Models/DownloadableContentModel.cs b/src/Ryujinx/Common/Models/DownloadableContentModel.cs similarity index 93% rename from src/Ryujinx.UI.Common/Models/DownloadableContentModel.cs rename to src/Ryujinx/Common/Models/DownloadableContentModel.cs index 95c64f078..ad9934bd2 100644 --- a/src/Ryujinx.UI.Common/Models/DownloadableContentModel.cs +++ b/src/Ryujinx/Common/Models/DownloadableContentModel.cs @@ -1,4 +1,4 @@ -namespace Ryujinx.UI.Common.Models +namespace Ryujinx.Ava.Common.Models { // NOTE: most consuming code relies on this model being value-comparable public record DownloadableContentModel(ulong TitleId, string ContainerPath, string FullPath) diff --git a/src/Ryujinx.UI.Common/Models/Github/GithubReleaseAssetJsonResponse.cs b/src/Ryujinx/Common/Models/Github/GithubReleaseAssetJsonResponse.cs similarity index 82% rename from src/Ryujinx.UI.Common/Models/Github/GithubReleaseAssetJsonResponse.cs rename to src/Ryujinx/Common/Models/Github/GithubReleaseAssetJsonResponse.cs index 8f528dc0b..633e16596 100644 --- a/src/Ryujinx.UI.Common/Models/Github/GithubReleaseAssetJsonResponse.cs +++ b/src/Ryujinx/Common/Models/Github/GithubReleaseAssetJsonResponse.cs @@ -1,4 +1,4 @@ -namespace Ryujinx.UI.Common.Models.Github +namespace Ryujinx.Ava.Common.Models.Github { public class GithubReleaseAssetJsonResponse { diff --git a/src/Ryujinx.UI.Common/Models/Github/GithubReleasesJsonResponse.cs b/src/Ryujinx/Common/Models/Github/GithubReleasesJsonResponse.cs similarity index 85% rename from src/Ryujinx.UI.Common/Models/Github/GithubReleasesJsonResponse.cs rename to src/Ryujinx/Common/Models/Github/GithubReleasesJsonResponse.cs index 7bec1bcdc..dee912e1c 100644 --- a/src/Ryujinx.UI.Common/Models/Github/GithubReleasesJsonResponse.cs +++ b/src/Ryujinx/Common/Models/Github/GithubReleasesJsonResponse.cs @@ -1,6 +1,6 @@ using System.Collections.Generic; -namespace Ryujinx.UI.Common.Models.Github +namespace Ryujinx.Ava.Common.Models.Github { public class GithubReleasesJsonResponse { diff --git a/src/Ryujinx.UI.Common/Models/Github/GithubReleasesJsonSerializerContext.cs b/src/Ryujinx/Common/Models/Github/GithubReleasesJsonSerializerContext.cs similarity index 74% rename from src/Ryujinx.UI.Common/Models/Github/GithubReleasesJsonSerializerContext.cs rename to src/Ryujinx/Common/Models/Github/GithubReleasesJsonSerializerContext.cs index 71864257c..a450ab22d 100644 --- a/src/Ryujinx.UI.Common/Models/Github/GithubReleasesJsonSerializerContext.cs +++ b/src/Ryujinx/Common/Models/Github/GithubReleasesJsonSerializerContext.cs @@ -1,9 +1,7 @@ using System.Text.Json.Serialization; -namespace Ryujinx.UI.Common.Models.Github +namespace Ryujinx.Ava.Common.Models.Github { [JsonSerializable(typeof(GithubReleasesJsonResponse), GenerationMode = JsonSourceGenerationMode.Metadata)] - public partial class GithubReleasesJsonSerializerContext : JsonSerializerContext - { - } + public partial class GithubReleasesJsonSerializerContext : JsonSerializerContext; } diff --git a/src/Ryujinx.UI.Common/Models/TitleUpdateModel.cs b/src/Ryujinx/Common/Models/TitleUpdateModel.cs similarity index 91% rename from src/Ryujinx.UI.Common/Models/TitleUpdateModel.cs rename to src/Ryujinx/Common/Models/TitleUpdateModel.cs index 5422e1303..fedecddbe 100644 --- a/src/Ryujinx.UI.Common/Models/TitleUpdateModel.cs +++ b/src/Ryujinx/Common/Models/TitleUpdateModel.cs @@ -1,4 +1,4 @@ -namespace Ryujinx.UI.Common.Models +namespace Ryujinx.Ava.Common.Models { // NOTE: most consuming code relies on this model being value-comparable public record TitleUpdateModel(ulong TitleId, ulong Version, string DisplayVersion, string Path) diff --git a/src/Ryujinx.UI.Common/Models/XCITrimmerFileModel.cs b/src/Ryujinx/Common/Models/XCITrimmerFileModel.cs similarity index 95% rename from src/Ryujinx.UI.Common/Models/XCITrimmerFileModel.cs rename to src/Ryujinx/Common/Models/XCITrimmerFileModel.cs index 95fb3985b..526bf230c 100644 --- a/src/Ryujinx.UI.Common/Models/XCITrimmerFileModel.cs +++ b/src/Ryujinx/Common/Models/XCITrimmerFileModel.cs @@ -1,8 +1,8 @@ +using Ryujinx.Ava.Utilities.AppLibrary; using Ryujinx.Common.Logging; using Ryujinx.Common.Utilities; -using Ryujinx.UI.App.Common; -namespace Ryujinx.UI.Common.Models +namespace Ryujinx.Ava.Common.Models { public record XCITrimmerFileModel( string Name, diff --git a/src/Ryujinx/DiscordIntegrationModule.cs b/src/Ryujinx/DiscordIntegrationModule.cs index 92c8e2aa6..f13b34ec8 100644 --- a/src/Ryujinx/DiscordIntegrationModule.cs +++ b/src/Ryujinx/DiscordIntegrationModule.cs @@ -1,10 +1,10 @@ using DiscordRPC; using Humanizer; using Humanizer.Localisation; +using Ryujinx.Ava.Utilities.AppLibrary; using Ryujinx.Common; using Ryujinx.HLE; using Ryujinx.HLE.Loaders.Processes; -using Ryujinx.UI.App.Common; using Ryujinx.UI.Common.Configuration; using System.Text; diff --git a/src/Ryujinx/Program.cs b/src/Ryujinx/Program.cs index 98bbfa2bb..76ed0b076 100644 --- a/src/Ryujinx/Program.cs +++ b/src/Ryujinx/Program.cs @@ -8,6 +8,7 @@ using Projektanker.Icons.Avalonia.MaterialDesign; using Ryujinx.Ava.Common.Locale; using Ryujinx.Ava.UI.Helpers; using Ryujinx.Ava.UI.Windows; +using Ryujinx.Ava.Utilities.AppLibrary; using Ryujinx.Ava.Utilities.SystemInfo; using Ryujinx.Common; using Ryujinx.Common.Configuration; @@ -17,7 +18,6 @@ using Ryujinx.Common.SystemInterop; using Ryujinx.Graphics.Vulkan.MoltenVK; using Ryujinx.Headless; using Ryujinx.SDL2.Common; -using Ryujinx.UI.App.Common; using Ryujinx.UI.Common; using Ryujinx.UI.Common.Configuration; using Ryujinx.UI.Common.Helper; diff --git a/src/Ryujinx/UI/Controls/ApplicationContextMenu.axaml.cs b/src/Ryujinx/UI/Controls/ApplicationContextMenu.axaml.cs index 74fb41efa..4f998b040 100644 --- a/src/Ryujinx/UI/Controls/ApplicationContextMenu.axaml.cs +++ b/src/Ryujinx/UI/Controls/ApplicationContextMenu.axaml.cs @@ -10,9 +10,10 @@ using Ryujinx.Ava.Common.Locale; using Ryujinx.Ava.UI.Helpers; using Ryujinx.Ava.UI.ViewModels; using Ryujinx.Ava.UI.Windows; +using Ryujinx.Ava.Utilities; +using Ryujinx.Ava.Utilities.AppLibrary; using Ryujinx.Common.Configuration; using Ryujinx.HLE.HOS; -using Ryujinx.UI.App.Common; using Ryujinx.UI.Common.Helper; using SkiaSharp; using System; diff --git a/src/Ryujinx/UI/Controls/ApplicationGridView.axaml.cs b/src/Ryujinx/UI/Controls/ApplicationGridView.axaml.cs index 25a34b423..ee0a324eb 100644 --- a/src/Ryujinx/UI/Controls/ApplicationGridView.axaml.cs +++ b/src/Ryujinx/UI/Controls/ApplicationGridView.axaml.cs @@ -3,7 +3,7 @@ using Avalonia.Input; using Avalonia.Interactivity; using Ryujinx.Ava.UI.Helpers; using Ryujinx.Ava.UI.ViewModels; -using Ryujinx.UI.App.Common; +using Ryujinx.Ava.Utilities.AppLibrary; using System; namespace Ryujinx.Ava.UI.Controls diff --git a/src/Ryujinx/UI/Controls/ApplicationListView.axaml.cs b/src/Ryujinx/UI/Controls/ApplicationListView.axaml.cs index 5b0730d5a..a7654785f 100644 --- a/src/Ryujinx/UI/Controls/ApplicationListView.axaml.cs +++ b/src/Ryujinx/UI/Controls/ApplicationListView.axaml.cs @@ -5,7 +5,7 @@ using Avalonia.Interactivity; using FluentAvalonia.UI.Controls; using Ryujinx.Ava.UI.Helpers; using Ryujinx.Ava.UI.ViewModels; -using Ryujinx.UI.App.Common; +using Ryujinx.Ava.Utilities.AppLibrary; using System; using System.Linq; diff --git a/src/Ryujinx/UI/Helpers/ApplicationOpenedEventArgs.cs b/src/Ryujinx/UI/Helpers/ApplicationOpenedEventArgs.cs index bc5622b54..0ceaa6c4c 100644 --- a/src/Ryujinx/UI/Helpers/ApplicationOpenedEventArgs.cs +++ b/src/Ryujinx/UI/Helpers/ApplicationOpenedEventArgs.cs @@ -1,5 +1,5 @@ using Avalonia.Interactivity; -using Ryujinx.UI.App.Common; +using Ryujinx.Ava.Utilities.AppLibrary; namespace Ryujinx.Ava.UI.Helpers { diff --git a/src/Ryujinx/UI/Helpers/MultiplayerInfoConverter.cs b/src/Ryujinx/UI/Helpers/MultiplayerInfoConverter.cs index 8bd8b5f0d..4135fd4c7 100644 --- a/src/Ryujinx/UI/Helpers/MultiplayerInfoConverter.cs +++ b/src/Ryujinx/UI/Helpers/MultiplayerInfoConverter.cs @@ -1,7 +1,7 @@ using Avalonia.Data.Converters; using Avalonia.Markup.Xaml; using Ryujinx.Ava.Common.Locale; -using Ryujinx.UI.App.Common; +using Ryujinx.Ava.Utilities.AppLibrary; using Ryujinx.UI.Common.Helper; using System; using System.Globalization; diff --git a/src/Ryujinx/UI/Helpers/XCITrimmerFileSpaceSavingsConverter.cs b/src/Ryujinx/UI/Helpers/XCITrimmerFileSpaceSavingsConverter.cs index 14e8e178a..ab6199c3f 100644 --- a/src/Ryujinx/UI/Helpers/XCITrimmerFileSpaceSavingsConverter.cs +++ b/src/Ryujinx/UI/Helpers/XCITrimmerFileSpaceSavingsConverter.cs @@ -3,7 +3,7 @@ using Avalonia.Data; using Avalonia.Data.Converters; using Gommon; using Ryujinx.Ava.Common.Locale; -using Ryujinx.UI.Common.Models; +using Ryujinx.Ava.Common.Models; using System; using System.Globalization; diff --git a/src/Ryujinx/UI/Helpers/XCITrimmerFileStatusConverter.cs b/src/Ryujinx/UI/Helpers/XCITrimmerFileStatusConverter.cs index 56a102415..c3fb1fe95 100644 --- a/src/Ryujinx/UI/Helpers/XCITrimmerFileStatusConverter.cs +++ b/src/Ryujinx/UI/Helpers/XCITrimmerFileStatusConverter.cs @@ -2,7 +2,7 @@ using Avalonia; using Avalonia.Data; using Avalonia.Data.Converters; using Ryujinx.Ava.Common.Locale; -using Ryujinx.UI.Common.Models; +using Ryujinx.Ava.Common.Models; using System; using System.Globalization; using static Ryujinx.Common.Utilities.XCIFileTrimmer; diff --git a/src/Ryujinx/UI/Helpers/XCITrimmerFileStatusDetailConverter.cs b/src/Ryujinx/UI/Helpers/XCITrimmerFileStatusDetailConverter.cs index cd4e27f01..e12d4efd9 100644 --- a/src/Ryujinx/UI/Helpers/XCITrimmerFileStatusDetailConverter.cs +++ b/src/Ryujinx/UI/Helpers/XCITrimmerFileStatusDetailConverter.cs @@ -1,7 +1,7 @@ using Avalonia; using Avalonia.Data; using Avalonia.Data.Converters; -using Ryujinx.UI.Common.Models; +using Ryujinx.Ava.Common.Models; using System; using System.Globalization; using static Ryujinx.Common.Utilities.XCIFileTrimmer; diff --git a/src/Ryujinx/UI/Models/Generic/LastPlayedSortComparer.cs b/src/Ryujinx/UI/Models/Generic/LastPlayedSortComparer.cs index 224f78f45..f2d27f2df 100644 --- a/src/Ryujinx/UI/Models/Generic/LastPlayedSortComparer.cs +++ b/src/Ryujinx/UI/Models/Generic/LastPlayedSortComparer.cs @@ -1,4 +1,4 @@ -using Ryujinx.UI.App.Common; +using Ryujinx.Ava.Utilities.AppLibrary; using System; using System.Collections.Generic; diff --git a/src/Ryujinx/UI/Models/Generic/TimePlayedSortComparer.cs b/src/Ryujinx/UI/Models/Generic/TimePlayedSortComparer.cs index f0fb035d1..d7ae51e96 100644 --- a/src/Ryujinx/UI/Models/Generic/TimePlayedSortComparer.cs +++ b/src/Ryujinx/UI/Models/Generic/TimePlayedSortComparer.cs @@ -1,4 +1,4 @@ -using Ryujinx.UI.App.Common; +using Ryujinx.Ava.Utilities.AppLibrary; using System; using System.Collections.Generic; diff --git a/src/Ryujinx/UI/Models/SaveModel.cs b/src/Ryujinx/UI/Models/SaveModel.cs index 578538d21..8364e1966 100644 --- a/src/Ryujinx/UI/Models/SaveModel.cs +++ b/src/Ryujinx/UI/Models/SaveModel.cs @@ -3,8 +3,8 @@ using LibHac.Fs; using LibHac.Ncm; using Ryujinx.Ava.UI.ViewModels; using Ryujinx.Ava.UI.Windows; +using Ryujinx.Ava.Utilities.AppLibrary; using Ryujinx.HLE.FileSystem; -using Ryujinx.UI.App.Common; using Ryujinx.UI.Common.Helper; using System; using System.IO; diff --git a/src/Ryujinx/UI/ViewModels/AmiiboWindowViewModel.cs b/src/Ryujinx/UI/ViewModels/AmiiboWindowViewModel.cs index 468a7c269..01a5dadd3 100644 --- a/src/Ryujinx/UI/ViewModels/AmiiboWindowViewModel.cs +++ b/src/Ryujinx/UI/ViewModels/AmiiboWindowViewModel.cs @@ -3,13 +3,13 @@ using Avalonia.Collections; using Avalonia.Media.Imaging; using Avalonia.Threading; using Ryujinx.Ava.Common.Locale; +using Ryujinx.Ava.Common.Models.Amiibo; using Ryujinx.Ava.UI.Helpers; using Ryujinx.Ava.UI.Windows; using Ryujinx.Common; using Ryujinx.Common.Configuration; using Ryujinx.Common.Logging; using Ryujinx.Common.Utilities; -using Ryujinx.UI.Common.Models.Amiibo; using System; using System.Collections.Generic; using System.Collections.ObjectModel; diff --git a/src/Ryujinx/UI/ViewModels/AppListFavoriteComparable.cs b/src/Ryujinx/UI/ViewModels/AppListFavoriteComparable.cs index e80984508..9c37368de 100644 --- a/src/Ryujinx/UI/ViewModels/AppListFavoriteComparable.cs +++ b/src/Ryujinx/UI/ViewModels/AppListFavoriteComparable.cs @@ -1,4 +1,4 @@ -using Ryujinx.UI.App.Common; +using Ryujinx.Ava.Utilities.AppLibrary; using System; namespace Ryujinx.Ava.UI.ViewModels diff --git a/src/Ryujinx/UI/ViewModels/DownloadableContentManagerViewModel.cs b/src/Ryujinx/UI/ViewModels/DownloadableContentManagerViewModel.cs index 3abaae3ae..4e9660a65 100644 --- a/src/Ryujinx/UI/ViewModels/DownloadableContentManagerViewModel.cs +++ b/src/Ryujinx/UI/ViewModels/DownloadableContentManagerViewModel.cs @@ -5,10 +5,10 @@ using Avalonia.Threading; using DynamicData; using FluentAvalonia.UI.Controls; using Ryujinx.Ava.Common.Locale; +using Ryujinx.Ava.Common.Models; using Ryujinx.Ava.UI.Helpers; +using Ryujinx.Ava.Utilities.AppLibrary; using Ryujinx.HLE.FileSystem; -using Ryujinx.UI.App.Common; -using Ryujinx.UI.Common.Models; using System.Collections.Generic; using System.IO; using System.Linq; diff --git a/src/Ryujinx/UI/ViewModels/MainWindowViewModel.cs b/src/Ryujinx/UI/ViewModels/MainWindowViewModel.cs index c5f9f57ec..3bc100ba3 100644 --- a/src/Ryujinx/UI/ViewModels/MainWindowViewModel.cs +++ b/src/Ryujinx/UI/ViewModels/MainWindowViewModel.cs @@ -21,6 +21,7 @@ using Ryujinx.Ava.UI.Models; using Ryujinx.Ava.UI.Models.Generic; using Ryujinx.Ava.UI.Renderer; using Ryujinx.Ava.UI.Windows; +using Ryujinx.Ava.Utilities.AppLibrary; using Ryujinx.Common; using Ryujinx.Common.Configuration; using Ryujinx.Common.Logging; @@ -34,7 +35,6 @@ using Ryujinx.HLE.HOS.Services.Account.Acc; using Ryujinx.HLE.HOS.Services.Nfc.AmiiboDecryption; using Ryujinx.HLE.UI; using Ryujinx.Input.HLE; -using Ryujinx.UI.App.Common; using Ryujinx.UI.Common; using Ryujinx.UI.Common.Configuration; using Ryujinx.UI.Common.Helper; diff --git a/src/Ryujinx/UI/ViewModels/TitleUpdateViewModel.cs b/src/Ryujinx/UI/ViewModels/TitleUpdateViewModel.cs index dacdc3056..a179218af 100644 --- a/src/Ryujinx/UI/ViewModels/TitleUpdateViewModel.cs +++ b/src/Ryujinx/UI/ViewModels/TitleUpdateViewModel.cs @@ -4,10 +4,10 @@ using Avalonia.Platform.Storage; using Avalonia.Threading; using FluentAvalonia.UI.Controls; using Ryujinx.Ava.Common.Locale; +using Ryujinx.Ava.Common.Models; using Ryujinx.Ava.UI.Helpers; +using Ryujinx.Ava.Utilities.AppLibrary; using Ryujinx.HLE.FileSystem; -using Ryujinx.UI.App.Common; -using Ryujinx.UI.Common.Models; using System.Collections.Generic; using System.IO; using System.Linq; diff --git a/src/Ryujinx/UI/ViewModels/XCITrimmerViewModel.cs b/src/Ryujinx/UI/ViewModels/XCITrimmerViewModel.cs index 402b182af..64965cd96 100644 --- a/src/Ryujinx/UI/ViewModels/XCITrimmerViewModel.cs +++ b/src/Ryujinx/UI/ViewModels/XCITrimmerViewModel.cs @@ -4,10 +4,10 @@ using Gommon; using Avalonia.Threading; using Ryujinx.Ava.Common; using Ryujinx.Ava.Common.Locale; +using Ryujinx.Ava.Common.Models; using Ryujinx.Ava.UI.Helpers; +using Ryujinx.Ava.Utilities.AppLibrary; using Ryujinx.Common.Utilities; -using Ryujinx.UI.App.Common; -using Ryujinx.UI.Common.Models; using System.Collections.Generic; using System.Linq; using System.Threading; @@ -371,6 +371,16 @@ namespace Ryujinx.Ava.UI.ViewModels } } + public XCITrimmerFileModel NullableProcessingApplication + { + get => _processingApplication.OrDefault(); + set + { + _processingApplication = value; + OnPropertyChanged(); + } + } + public bool Processing { get => _cancellationTokenSource != null; diff --git a/src/Ryujinx/UI/Views/Main/MainMenuBarView.axaml.cs b/src/Ryujinx/UI/Views/Main/MainMenuBarView.axaml.cs index 181773b2e..1f8617ad7 100644 --- a/src/Ryujinx/UI/Views/Main/MainMenuBarView.axaml.cs +++ b/src/Ryujinx/UI/Views/Main/MainMenuBarView.axaml.cs @@ -7,6 +7,7 @@ using Ryujinx.Ava.Common.Locale; using Ryujinx.Ava.UI.Helpers; using Ryujinx.Ava.UI.ViewModels; using Ryujinx.Ava.UI.Windows; +using Ryujinx.Ava.Utilities; using Ryujinx.Common; using Ryujinx.Common.Utilities; using Ryujinx.HLE.HOS.Services.Nfc.AmiiboDecryption; diff --git a/src/Ryujinx/UI/Windows/AmiiboWindow.axaml.cs b/src/Ryujinx/UI/Windows/AmiiboWindow.axaml.cs index 9a940c938..8c76b8e2f 100644 --- a/src/Ryujinx/UI/Windows/AmiiboWindow.axaml.cs +++ b/src/Ryujinx/UI/Windows/AmiiboWindow.axaml.cs @@ -1,7 +1,7 @@ using Avalonia.Interactivity; using Ryujinx.Ava.Common.Locale; +using Ryujinx.Ava.Common.Models.Amiibo; using Ryujinx.Ava.UI.ViewModels; -using Ryujinx.UI.Common.Models.Amiibo; namespace Ryujinx.Ava.UI.Windows { diff --git a/src/Ryujinx/UI/Windows/CheatWindow.axaml.cs b/src/Ryujinx/UI/Windows/CheatWindow.axaml.cs index 2fc9617fb..f5795d42c 100644 --- a/src/Ryujinx/UI/Windows/CheatWindow.axaml.cs +++ b/src/Ryujinx/UI/Windows/CheatWindow.axaml.cs @@ -2,9 +2,9 @@ using Avalonia.Collections; using LibHac.Tools.FsSystem; using Ryujinx.Ava.Common.Locale; using Ryujinx.Ava.UI.Models; +using Ryujinx.Ava.Utilities.AppLibrary; using Ryujinx.HLE.FileSystem; using Ryujinx.HLE.HOS; -using Ryujinx.UI.App.Common; using Ryujinx.UI.Common.Configuration; using System.Globalization; using System.IO; diff --git a/src/Ryujinx/UI/Windows/DownloadableContentManagerWindow.axaml b/src/Ryujinx/UI/Windows/DownloadableContentManagerWindow.axaml index df70f02eb..8efcfcadc 100644 --- a/src/Ryujinx/UI/Windows/DownloadableContentManagerWindow.axaml +++ b/src/Ryujinx/UI/Windows/DownloadableContentManagerWindow.axaml @@ -6,9 +6,9 @@ xmlns:ext="clr-namespace:Ryujinx.Ava.Common.Markup" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:viewModels="clr-namespace:Ryujinx.Ava.UI.ViewModels" - xmlns:models="clr-namespace:Ryujinx.UI.Common.Models;assembly=Ryujinx.UI.Common" xmlns:ui="clr-namespace:FluentAvalonia.UI.Controls;assembly=FluentAvalonia" xmlns:helpers="clr-namespace:Ryujinx.Ava.UI.Helpers" + xmlns:models="clr-namespace:Ryujinx.Ava.Common.Models" Width="500" Height="380" mc:Ignorable="d" diff --git a/src/Ryujinx/UI/Windows/DownloadableContentManagerWindow.axaml.cs b/src/Ryujinx/UI/Windows/DownloadableContentManagerWindow.axaml.cs index 2afa8b529..02f420752 100644 --- a/src/Ryujinx/UI/Windows/DownloadableContentManagerWindow.axaml.cs +++ b/src/Ryujinx/UI/Windows/DownloadableContentManagerWindow.axaml.cs @@ -3,10 +3,10 @@ using Avalonia.Interactivity; using Avalonia.Styling; using FluentAvalonia.UI.Controls; using Ryujinx.Ava.Common.Locale; +using Ryujinx.Ava.Common.Models; using Ryujinx.Ava.UI.ViewModels; -using Ryujinx.UI.App.Common; +using Ryujinx.Ava.Utilities.AppLibrary; using Ryujinx.UI.Common.Helper; -using Ryujinx.UI.Common.Models; using System.Threading.Tasks; namespace Ryujinx.Ava.UI.Windows diff --git a/src/Ryujinx/UI/Windows/MainWindow.axaml.cs b/src/Ryujinx/UI/Windows/MainWindow.axaml.cs index 0e1e88b9c..f0aaf4cac 100644 --- a/src/Ryujinx/UI/Windows/MainWindow.axaml.cs +++ b/src/Ryujinx/UI/Windows/MainWindow.axaml.cs @@ -15,6 +15,7 @@ using Ryujinx.Ava.Input; using Ryujinx.Ava.UI.Applet; using Ryujinx.Ava.UI.Helpers; using Ryujinx.Ava.UI.ViewModels; +using Ryujinx.Ava.Utilities.AppLibrary; using Ryujinx.Common; using Ryujinx.Common.Logging; using Ryujinx.Common.UI; @@ -24,7 +25,6 @@ using Ryujinx.HLE.HOS; using Ryujinx.HLE.HOS.Services.Account.Acc; using Ryujinx.Input.HLE; using Ryujinx.Input.SDL2; -using Ryujinx.UI.App.Common; using Ryujinx.UI.Common; using Ryujinx.UI.Common.Configuration; using Ryujinx.UI.Common.Helper; diff --git a/src/Ryujinx/UI/Windows/TitleUpdateWindow.axaml b/src/Ryujinx/UI/Windows/TitleUpdateWindow.axaml index 6e22cfed7..0ba9bc7d8 100644 --- a/src/Ryujinx/UI/Windows/TitleUpdateWindow.axaml +++ b/src/Ryujinx/UI/Windows/TitleUpdateWindow.axaml @@ -6,9 +6,9 @@ xmlns:ext="clr-namespace:Ryujinx.Ava.Common.Markup" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:viewModels="clr-namespace:Ryujinx.Ava.UI.ViewModels" - xmlns:models="clr-namespace:Ryujinx.UI.Common.Models;assembly=Ryujinx.UI.Common" xmlns:ui="clr-namespace:FluentAvalonia.UI.Controls;assembly=FluentAvalonia" xmlns:helpers="clr-namespace:Ryujinx.Ava.UI.Helpers" + xmlns:models="clr-namespace:Ryujinx.Ava.Common.Models" Width="500" Height="300" mc:Ignorable="d" diff --git a/src/Ryujinx/UI/Windows/TitleUpdateWindow.axaml.cs b/src/Ryujinx/UI/Windows/TitleUpdateWindow.axaml.cs index a13ad4012..421990bcd 100644 --- a/src/Ryujinx/UI/Windows/TitleUpdateWindow.axaml.cs +++ b/src/Ryujinx/UI/Windows/TitleUpdateWindow.axaml.cs @@ -3,10 +3,10 @@ using Avalonia.Interactivity; using Avalonia.Styling; using FluentAvalonia.UI.Controls; using Ryujinx.Ava.Common.Locale; +using Ryujinx.Ava.Common.Models; using Ryujinx.Ava.UI.ViewModels; -using Ryujinx.UI.App.Common; +using Ryujinx.Ava.Utilities.AppLibrary; using Ryujinx.UI.Common.Helper; -using Ryujinx.UI.Common.Models; using System.Threading.Tasks; namespace Ryujinx.Ava.UI.Windows diff --git a/src/Ryujinx/UI/Windows/XCITrimmerWindow.axaml b/src/Ryujinx/UI/Windows/XCITrimmerWindow.axaml index d726f8099..2d56931b5 100644 --- a/src/Ryujinx/UI/Windows/XCITrimmerWindow.axaml +++ b/src/Ryujinx/UI/Windows/XCITrimmerWindow.axaml @@ -6,9 +6,8 @@ xmlns:ext="clr-namespace:Ryujinx.Ava.Common.Markup" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:viewModels="clr-namespace:Ryujinx.Ava.UI.ViewModels" - xmlns:models="clr-namespace:Ryujinx.UI.Common.Models;assembly=Ryujinx.UI.Common" - xmlns:ui="clr-namespace:FluentAvalonia.UI.Controls;assembly=FluentAvalonia" xmlns:helpers="clr-namespace:Ryujinx.Ava.UI.Helpers" + xmlns:models="clr-namespace:Ryujinx.Ava.Common.Models" Width="700" Height="600" x:DataType="viewModels:XCITrimmerViewModel" @@ -140,7 +139,7 @@ Padding="2.5"> ))] - internal partial class LdnGameDataSerializerContext : JsonSerializerContext - { - - } + internal partial class LdnGameDataSerializerContext : JsonSerializerContext; } diff --git a/src/Ryujinx/Utilities/AppletMetadata.cs b/src/Ryujinx/Utilities/AppletMetadata.cs new file mode 100644 index 000000000..82baed7d3 --- /dev/null +++ b/src/Ryujinx/Utilities/AppletMetadata.cs @@ -0,0 +1,60 @@ +using LibHac.Common; +using LibHac.Ncm; +using LibHac.Ns; +using LibHac.Tools.FsSystem.NcaUtils; +using Ryujinx.Ava.Utilities.AppLibrary; +using Ryujinx.HLE; +using Ryujinx.HLE.FileSystem; + +namespace Ryujinx.Ava.Utilities +{ + public readonly struct AppletMetadata + { + private readonly ContentManager _contentManager; + + public string Name { get; } + public ulong ProgramId { get; } + + public string Version { get; } + + public AppletMetadata(ContentManager contentManager, string name, ulong programId, string version = "1.0.0") + : this(name, programId, version) + { + _contentManager = contentManager; + } + + public AppletMetadata(string name, ulong programId, string version = "1.0.0") + { + Name = name; + ProgramId = programId; + Version = version; + } + + public string GetContentPath(ContentManager contentManager) + => (contentManager ?? _contentManager) + .GetInstalledContentPath(ProgramId, StorageId.BuiltInSystem, NcaContentType.Program); + + public bool CanStart(ContentManager contentManager, out ApplicationData appData, + out BlitStruct appControl) + { + contentManager ??= _contentManager; + if (contentManager == null) + { + appData = null; + appControl = new BlitStruct(0); + return false; + } + + appData = new() { Name = Name, Id = ProgramId, Path = GetContentPath(contentManager) }; + + if (string.IsNullOrEmpty(appData.Path)) + { + appControl = new BlitStruct(0); + return false; + } + + appControl = StructHelpers.CreateCustomNacpData(Name, Version); + return true; + } + } +} diff --git a/src/Ryujinx.UI.Common/Helper/DownloadableContentsHelper.cs b/src/Ryujinx/Utilities/DownloadableContentsHelper.cs similarity index 98% rename from src/Ryujinx.UI.Common/Helper/DownloadableContentsHelper.cs rename to src/Ryujinx/Utilities/DownloadableContentsHelper.cs index 020529b55..b6d2420a3 100644 --- a/src/Ryujinx.UI.Common/Helper/DownloadableContentsHelper.cs +++ b/src/Ryujinx/Utilities/DownloadableContentsHelper.cs @@ -3,18 +3,18 @@ using LibHac.Fs; using LibHac.Fs.Fsa; using LibHac.Tools.FsSystem; using LibHac.Tools.FsSystem.NcaUtils; +using Ryujinx.Ava.Common.Models; using Ryujinx.Common.Configuration; using Ryujinx.Common.Logging; using Ryujinx.Common.Utilities; using Ryujinx.HLE.FileSystem; using Ryujinx.HLE.Utilities; -using Ryujinx.UI.Common.Models; using System; using System.Collections.Generic; using System.IO; using Path = System.IO.Path; -namespace Ryujinx.UI.Common.Helper +namespace Ryujinx.Ava.Utilities { public static class DownloadableContentsHelper { diff --git a/src/Ryujinx.UI.Common/Helper/SetupValidator.cs b/src/Ryujinx/Utilities/SetupValidator.cs similarity index 99% rename from src/Ryujinx.UI.Common/Helper/SetupValidator.cs rename to src/Ryujinx/Utilities/SetupValidator.cs index ddd9c9e30..0bd3a348d 100644 --- a/src/Ryujinx.UI.Common/Helper/SetupValidator.cs +++ b/src/Ryujinx/Utilities/SetupValidator.cs @@ -4,7 +4,7 @@ using Ryujinx.HLE.FileSystem; using System; using System.IO; -namespace Ryujinx.UI.Common.Helper +namespace Ryujinx.Ava.Utilities { /// /// Ensure installation validity diff --git a/src/Ryujinx.UI.Common/Helper/ShortcutHelper.cs b/src/Ryujinx/Utilities/ShortcutHelper.cs similarity index 99% rename from src/Ryujinx.UI.Common/Helper/ShortcutHelper.cs rename to src/Ryujinx/Utilities/ShortcutHelper.cs index 8c006a227..a0fb5599a 100644 --- a/src/Ryujinx.UI.Common/Helper/ShortcutHelper.cs +++ b/src/Ryujinx/Utilities/ShortcutHelper.cs @@ -1,5 +1,6 @@ using Ryujinx.Common; using Ryujinx.Common.Configuration; +using Ryujinx.UI.Common.Helper; using ShellLink; using SkiaSharp; using System; @@ -7,7 +8,7 @@ using System.Collections.Generic; using System.IO; using System.Runtime.Versioning; -namespace Ryujinx.UI.Common.Helper +namespace Ryujinx.Ava.Utilities { public static class ShortcutHelper { diff --git a/src/Ryujinx.UI.Common/Helper/TitleHelper.cs b/src/Ryujinx/Utilities/TitleHelper.cs similarity index 95% rename from src/Ryujinx.UI.Common/Helper/TitleHelper.cs rename to src/Ryujinx/Utilities/TitleHelper.cs index 9d73aea75..be7a87f82 100644 --- a/src/Ryujinx.UI.Common/Helper/TitleHelper.cs +++ b/src/Ryujinx/Utilities/TitleHelper.cs @@ -1,7 +1,6 @@ using Ryujinx.HLE.Loaders.Processes; -using System; -namespace Ryujinx.UI.Common.Helper +namespace Ryujinx.Ava.Utilities { public static class TitleHelper { diff --git a/src/Ryujinx.UI.Common/Helper/TitleUpdatesHelper.cs b/src/Ryujinx/Utilities/TitleUpdatesHelper.cs similarity index 98% rename from src/Ryujinx.UI.Common/Helper/TitleUpdatesHelper.cs rename to src/Ryujinx/Utilities/TitleUpdatesHelper.cs index 36de8b31a..8cffb9b25 100644 --- a/src/Ryujinx.UI.Common/Helper/TitleUpdatesHelper.cs +++ b/src/Ryujinx/Utilities/TitleUpdatesHelper.cs @@ -6,6 +6,7 @@ using LibHac.Ncm; using LibHac.Ns; using LibHac.Tools.FsSystem; using LibHac.Tools.FsSystem.NcaUtils; +using Ryujinx.Ava.Common.Models; using Ryujinx.Common.Configuration; using Ryujinx.Common.Logging; using Ryujinx.Common.Utilities; @@ -13,7 +14,6 @@ using Ryujinx.HLE.FileSystem; using Ryujinx.HLE.Loaders.Processes.Extensions; using Ryujinx.HLE.Utilities; using Ryujinx.UI.Common.Configuration; -using Ryujinx.UI.Common.Models; using System; using System.Collections.Generic; using System.IO; @@ -22,7 +22,7 @@ using Path = System.IO.Path; using SpanHelpers = LibHac.Common.SpanHelpers; using TitleUpdateMetadata = Ryujinx.Common.Configuration.TitleUpdateMetadata; -namespace Ryujinx.UI.Common.Helper +namespace Ryujinx.Ava.Utilities { public static class TitleUpdatesHelper { From 4f699afe7a481828cf0ff54217117020cf262a11 Mon Sep 17 00:00:00 2001 From: Evan Husted Date: Sun, 29 Dec 2024 19:13:06 -0600 Subject: [PATCH 57/60] misc: Move shortcut files into Avalonia project --- src/Ryujinx.UI.Common/Ryujinx.UI.Common.csproj | 9 --------- src/Ryujinx/Ryujinx.csproj | 9 +++++++++ src/Ryujinx/Utilities/ShortcutHelper.cs | 6 +++--- 3 files changed, 12 insertions(+), 12 deletions(-) diff --git a/src/Ryujinx.UI.Common/Ryujinx.UI.Common.csproj b/src/Ryujinx.UI.Common/Ryujinx.UI.Common.csproj index 0a28fddf3..01efe04ba 100644 --- a/src/Ryujinx.UI.Common/Ryujinx.UI.Common.csproj +++ b/src/Ryujinx.UI.Common/Ryujinx.UI.Common.csproj @@ -21,15 +21,6 @@ - - - - - - - - - diff --git a/src/Ryujinx/Ryujinx.csproj b/src/Ryujinx/Ryujinx.csproj index 998257dff..3ddd807e6 100644 --- a/src/Ryujinx/Ryujinx.csproj +++ b/src/Ryujinx/Ryujinx.csproj @@ -128,6 +128,15 @@ + + Assets\ShortcutFiles\shortcut-template.desktop + + + Assets\ShortcutFiles\shortcut-launch-script.sh + + + Assets\ShortcutFiles\shortcut-template.plist + diff --git a/src/Ryujinx/Utilities/ShortcutHelper.cs b/src/Ryujinx/Utilities/ShortcutHelper.cs index a0fb5599a..4923d2598 100644 --- a/src/Ryujinx/Utilities/ShortcutHelper.cs +++ b/src/Ryujinx/Utilities/ShortcutHelper.cs @@ -32,7 +32,7 @@ namespace Ryujinx.Ava.Utilities private static void CreateShortcutLinux(string applicationFilePath, string applicationId, byte[] iconData, string iconPath, string desktopPath, string cleanedAppName) { string basePath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "Ryujinx.sh"); - var desktopFile = EmbeddedResources.ReadAllText("Ryujinx.UI.Common/shortcut-template.desktop"); + var desktopFile = EmbeddedResources.ReadAllText("Ryujinx/Assets/ShortcutFiles/shortcut-template.desktop"); iconPath += ".png"; var image = SKBitmap.Decode(iconData); @@ -48,8 +48,8 @@ namespace Ryujinx.Ava.Utilities private static void CreateShortcutMacos(string appFilePath, string applicationId, byte[] iconData, string desktopPath, string cleanedAppName) { string basePath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "Ryujinx"); - var plistFile = EmbeddedResources.ReadAllText("Ryujinx.UI.Common/shortcut-template.plist"); - var shortcutScript = EmbeddedResources.ReadAllText("Ryujinx.UI.Common/shortcut-launch-script.sh"); + var plistFile = EmbeddedResources.ReadAllText("Ryujinx/Assets/ShortcutFiles/shortcut-template.plist"); + var shortcutScript = EmbeddedResources.ReadAllText("Ryujinx/Assets/ShortcutFiles/shortcut-launch-script.sh"); // Macos .App folder string contentFolderPath = Path.Combine("/Applications", cleanedAppName + ".app", "Contents"); string scriptFolderPath = Path.Combine(contentFolderPath, "MacOS"); From f5ce539de9e1f7a6f0a93767ecd4f7bd7ee0a6b5 Mon Sep 17 00:00:00 2001 From: Evan Husted Date: Sun, 29 Dec 2024 19:28:27 -0600 Subject: [PATCH 58/60] misc: Move the rest of Ryujinx.UI.Common into other parts of the project. --- Ryujinx.sln | 6 ------ src/Ryujinx.Common/Helpers/ConsoleHelper.cs | 2 +- .../Helpers/FileAssociationHelper.cs | 2 +- src/Ryujinx.Common/Helpers/LinuxHelper.cs | 2 +- src/Ryujinx.Common/Helpers/ObjectiveC.cs | 2 +- src/Ryujinx.Common/Helpers/OpenHelper.cs | 2 +- .../Configuration/FileTypes.cs | 12 ------------ src/Ryujinx/AppHost.cs | 4 +--- src/Ryujinx/Common/ApplicationHelper.cs | 4 ++-- src/Ryujinx/Common/LocaleManager.cs | 2 +- src/Ryujinx/DiscordIntegrationModule.cs | 2 +- src/Ryujinx/Headless/HeadlessRyujinx.Init.cs | 3 +-- src/Ryujinx/Headless/HeadlessRyujinx.cs | 2 +- src/Ryujinx/Headless/Options.cs | 2 +- src/Ryujinx/Program.cs | 8 ++------ src/Ryujinx/Ryujinx.csproj | 3 ++- src/Ryujinx/RyujinxApp.axaml.cs | 4 ++-- src/Ryujinx/UI/Applet/AvaHostUIHandler.cs | 2 +- .../UI/Controls/ApplicationContextMenu.axaml.cs | 2 +- .../UI/Helpers/MultiplayerInfoConverter.cs | 1 - src/Ryujinx/UI/Helpers/UserErrorDialog.cs | 1 - src/Ryujinx/UI/Models/SaveModel.cs | 2 +- src/Ryujinx/UI/Renderer/EmbeddedWindow.cs | 4 ++-- src/Ryujinx/UI/Renderer/EmbeddedWindowOpenGL.cs | 2 +- src/Ryujinx/UI/Renderer/RendererHost.axaml.cs | 2 +- .../UI/ViewModels/AboutWindowViewModel.cs | 2 +- .../UI/ViewModels/Input/InputViewModel.cs | 2 +- .../UI/ViewModels/MainWindowViewModel.cs | 5 ++--- src/Ryujinx/UI/ViewModels/SettingsViewModel.cs | 4 ++-- .../UI/Views/Main/MainMenuBarView.axaml.cs | 5 ++--- .../UI/Views/Main/MainStatusBarView.axaml.cs | 2 +- .../Views/Settings/SettingsHacksView.axaml.cs | 1 - src/Ryujinx/UI/Windows/AboutWindow.axaml.cs | 2 +- src/Ryujinx/UI/Windows/CheatWindow.axaml.cs | 2 +- .../DownloadableContentManagerWindow.axaml.cs | 2 +- src/Ryujinx/UI/Windows/MainWindow.axaml.cs | 6 +++--- .../UI/Windows/ModManagerWindow.axaml.cs | 2 +- .../UI/Windows/TitleUpdateWindow.axaml.cs | 2 +- src/Ryujinx/Updater.cs | 3 ++- .../Utilities/AppLibrary/ApplicationData.cs | 5 +---- .../Utilities/AppLibrary/ApplicationLibrary.cs | 4 ++-- .../Utilities}/CommandLineState.cs | 2 +- .../Utilities}/Configuration/AudioBackend.cs | 2 +- .../Configuration/ConfigurationFileFormat.cs | 6 +++--- .../ConfigurationFileFormatSettings.cs | 2 +- .../ConfigurationJsonSerializerContext.cs | 6 ++---- .../ConfigurationState.Migration.cs | 6 +++--- .../Configuration/ConfigurationState.Model.cs | 6 +++--- .../Configuration/ConfigurationState.cs | 6 +++--- .../Utilities/Configuration/FileTypes.cs} | 17 ++++++++++++++--- .../Utilities}/Configuration/LoggerModule.cs | 2 +- .../Utilities}/Configuration/System/Language.cs | 3 +-- .../Utilities}/Configuration/System/Region.cs | 2 +- .../Utilities}/Configuration/UI/ColumnSort.cs | 2 +- .../Utilities}/Configuration/UI/GuiColumns.cs | 2 +- .../Configuration/UI/ShownFileTypes.cs | 2 +- .../Configuration/UI/WindowStartup.cs | 2 +- src/Ryujinx/Utilities/ShortcutHelper.cs | 1 - src/Ryujinx/Utilities/SystemInfo/SystemInfo.cs | 1 - src/Ryujinx/Utilities/TitleUpdatesHelper.cs | 2 +- .../Utilities}/ValueFormatUtils.cs | 5 +++-- 61 files changed, 90 insertions(+), 114 deletions(-) delete mode 100644 src/Ryujinx.UI.Common/Configuration/FileTypes.cs rename src/{Ryujinx.Common/Helpers => Ryujinx/Utilities}/CommandLineState.cs (99%) rename src/{Ryujinx.UI.Common => Ryujinx/Utilities}/Configuration/AudioBackend.cs (84%) rename src/{Ryujinx.UI.Common => Ryujinx/Utilities}/Configuration/ConfigurationFileFormat.cs (99%) rename src/{Ryujinx.UI.Common => Ryujinx/Utilities}/Configuration/ConfigurationFileFormatSettings.cs (83%) rename src/{Ryujinx.UI.Common => Ryujinx/Utilities}/Configuration/ConfigurationJsonSerializerContext.cs (74%) rename src/{Ryujinx.UI.Common => Ryujinx/Utilities}/Configuration/ConfigurationState.Migration.cs (99%) rename src/{Ryujinx.UI.Common => Ryujinx/Utilities}/Configuration/ConfigurationState.Model.cs (99%) rename src/{Ryujinx.UI.Common => Ryujinx/Utilities}/Configuration/ConfigurationState.cs (99%) rename src/{Ryujinx.UI.Common/Extensions/FileTypeExtensions.cs => Ryujinx/Utilities/Configuration/FileTypes.cs} (73%) rename src/{Ryujinx.UI.Common => Ryujinx/Utilities}/Configuration/LoggerModule.cs (98%) rename src/{Ryujinx.UI.Common => Ryujinx/Utilities}/Configuration/System/Language.cs (86%) rename src/{Ryujinx.UI.Common => Ryujinx/Utilities}/Configuration/System/Region.cs (84%) rename src/{Ryujinx.UI.Common => Ryujinx/Utilities}/Configuration/UI/ColumnSort.cs (73%) rename src/{Ryujinx.UI.Common => Ryujinx/Utilities}/Configuration/UI/GuiColumns.cs (91%) rename src/{Ryujinx.UI.Common => Ryujinx/Utilities}/Configuration/UI/ShownFileTypes.cs (85%) rename src/{Ryujinx.UI.Common => Ryujinx/Utilities}/Configuration/UI/WindowStartup.cs (85%) rename src/{Ryujinx.Common/Helpers => Ryujinx/Utilities}/ValueFormatUtils.cs (97%) diff --git a/Ryujinx.sln b/Ryujinx.sln index 87c1021c1..373572178 100644 --- a/Ryujinx.sln +++ b/Ryujinx.sln @@ -61,8 +61,6 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Ryujinx.Graphics.Nvdec.FFmp EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Ryujinx", "src\Ryujinx\Ryujinx.csproj", "{7C1B2721-13DA-4B62-B046-C626605ECCE6}" EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Ryujinx.UI.Common", "src\Ryujinx.UI.Common\Ryujinx.UI.Common.csproj", "{BA161CA0-CD65-4E6E-B644-51C8D1E542DC}" -EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Ryujinx.Horizon.Generators", "src\Ryujinx.Horizon.Generators\Ryujinx.Horizon.Generators.csproj", "{6AE2A5E8-4C5A-48B9-997B-E1455C0355C6}" EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Ryujinx.Graphics.Vulkan", "src\Ryujinx.Graphics.Vulkan\Ryujinx.Graphics.Vulkan.csproj", "{D4D09B08-D580-4D69-B886-C35D2853F6C8}" @@ -219,10 +217,6 @@ Global {7C1B2721-13DA-4B62-B046-C626605ECCE6}.Debug|Any CPU.Build.0 = Debug|Any CPU {7C1B2721-13DA-4B62-B046-C626605ECCE6}.Release|Any CPU.ActiveCfg = Release|Any CPU {7C1B2721-13DA-4B62-B046-C626605ECCE6}.Release|Any CPU.Build.0 = Release|Any CPU - {BA161CA0-CD65-4E6E-B644-51C8D1E542DC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {BA161CA0-CD65-4E6E-B644-51C8D1E542DC}.Debug|Any CPU.Build.0 = Debug|Any CPU - {BA161CA0-CD65-4E6E-B644-51C8D1E542DC}.Release|Any CPU.ActiveCfg = Release|Any CPU - {BA161CA0-CD65-4E6E-B644-51C8D1E542DC}.Release|Any CPU.Build.0 = Release|Any CPU {6AE2A5E8-4C5A-48B9-997B-E1455C0355C6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {6AE2A5E8-4C5A-48B9-997B-E1455C0355C6}.Debug|Any CPU.Build.0 = Debug|Any CPU {6AE2A5E8-4C5A-48B9-997B-E1455C0355C6}.Release|Any CPU.ActiveCfg = Release|Any CPU diff --git a/src/Ryujinx.Common/Helpers/ConsoleHelper.cs b/src/Ryujinx.Common/Helpers/ConsoleHelper.cs index 99b209c6e..105c9881e 100644 --- a/src/Ryujinx.Common/Helpers/ConsoleHelper.cs +++ b/src/Ryujinx.Common/Helpers/ConsoleHelper.cs @@ -3,7 +3,7 @@ using System; using System.Runtime.InteropServices; using System.Runtime.Versioning; -namespace Ryujinx.UI.Common.Helper +namespace Ryujinx.Common.Helper { public static partial class ConsoleHelper { diff --git a/src/Ryujinx.Common/Helpers/FileAssociationHelper.cs b/src/Ryujinx.Common/Helpers/FileAssociationHelper.cs index b1463989d..476aee228 100644 --- a/src/Ryujinx.Common/Helpers/FileAssociationHelper.cs +++ b/src/Ryujinx.Common/Helpers/FileAssociationHelper.cs @@ -8,7 +8,7 @@ using System.Linq; using System.Runtime.InteropServices; using System.Runtime.Versioning; -namespace Ryujinx.UI.Common.Helper +namespace Ryujinx.Common.Helper { public static partial class FileAssociationHelper { diff --git a/src/Ryujinx.Common/Helpers/LinuxHelper.cs b/src/Ryujinx.Common/Helpers/LinuxHelper.cs index b57793791..2adfd20f8 100644 --- a/src/Ryujinx.Common/Helpers/LinuxHelper.cs +++ b/src/Ryujinx.Common/Helpers/LinuxHelper.cs @@ -3,7 +3,7 @@ using System.Diagnostics; using System.IO; using System.Runtime.Versioning; -namespace Ryujinx.UI.Common.Helper +namespace Ryujinx.Common.Helper { [SupportedOSPlatform("linux")] public static class LinuxHelper diff --git a/src/Ryujinx.Common/Helpers/ObjectiveC.cs b/src/Ryujinx.Common/Helpers/ObjectiveC.cs index f8f972098..d8e02f54d 100644 --- a/src/Ryujinx.Common/Helpers/ObjectiveC.cs +++ b/src/Ryujinx.Common/Helpers/ObjectiveC.cs @@ -2,7 +2,7 @@ using System; using System.Runtime.InteropServices; using System.Runtime.Versioning; -namespace Ryujinx.UI.Common.Helper +namespace Ryujinx.Common.Helper { [SupportedOSPlatform("macos")] public static partial class ObjectiveC diff --git a/src/Ryujinx.Common/Helpers/OpenHelper.cs b/src/Ryujinx.Common/Helpers/OpenHelper.cs index bf398a355..6a54b69f3 100644 --- a/src/Ryujinx.Common/Helpers/OpenHelper.cs +++ b/src/Ryujinx.Common/Helpers/OpenHelper.cs @@ -5,7 +5,7 @@ using System.Diagnostics; using System.IO; using System.Runtime.InteropServices; -namespace Ryujinx.UI.Common.Helper +namespace Ryujinx.Common.Helper { public static partial class OpenHelper { diff --git a/src/Ryujinx.UI.Common/Configuration/FileTypes.cs b/src/Ryujinx.UI.Common/Configuration/FileTypes.cs deleted file mode 100644 index 1974207b6..000000000 --- a/src/Ryujinx.UI.Common/Configuration/FileTypes.cs +++ /dev/null @@ -1,12 +0,0 @@ -namespace Ryujinx.UI.Common -{ - public enum FileTypes - { - NSP, - PFS0, - XCI, - NCA, - NRO, - NSO - } -} diff --git a/src/Ryujinx/AppHost.cs b/src/Ryujinx/AppHost.cs index f3fcbf5aa..cff6a44a5 100644 --- a/src/Ryujinx/AppHost.cs +++ b/src/Ryujinx/AppHost.cs @@ -22,6 +22,7 @@ using Ryujinx.Ava.UI.ViewModels; using Ryujinx.Ava.UI.Windows; using Ryujinx.Ava.Utilities; using Ryujinx.Ava.Utilities.AppLibrary; +using Ryujinx.Ava.Utilities.Configuration; using Ryujinx.Common; using Ryujinx.Common.Configuration; using Ryujinx.Common.Configuration.Multiplayer; @@ -42,9 +43,6 @@ using Ryujinx.HLE.HOS.Services.Account.Acc; using Ryujinx.HLE.HOS.SystemState; using Ryujinx.Input; using Ryujinx.Input.HLE; -using Ryujinx.UI.Common; -using Ryujinx.UI.Common.Configuration; -using Ryujinx.UI.Common.Helper; using Silk.NET.Vulkan; using SkiaSharp; using SPB.Graphics.Vulkan; diff --git a/src/Ryujinx/Common/ApplicationHelper.cs b/src/Ryujinx/Common/ApplicationHelper.cs index 1c6b53dee..7db933ed6 100644 --- a/src/Ryujinx/Common/ApplicationHelper.cs +++ b/src/Ryujinx/Common/ApplicationHelper.cs @@ -15,12 +15,12 @@ using LibHac.Tools.FsSystem.NcaUtils; using Ryujinx.Ava.Common.Locale; using Ryujinx.Ava.UI.Controls; using Ryujinx.Ava.UI.Helpers; +using Ryujinx.Ava.Utilities.Configuration; +using Ryujinx.Common.Helper; using Ryujinx.Common.Logging; using Ryujinx.HLE.FileSystem; using Ryujinx.HLE.HOS.Services.Account.Acc; using Ryujinx.HLE.Loaders.Processes.Extensions; -using Ryujinx.UI.Common.Configuration; -using Ryujinx.UI.Common.Helper; using System; using System.Buffers; using System.IO; diff --git a/src/Ryujinx/Common/LocaleManager.cs b/src/Ryujinx/Common/LocaleManager.cs index 70b04ec95..9422cf7fb 100644 --- a/src/Ryujinx/Common/LocaleManager.cs +++ b/src/Ryujinx/Common/LocaleManager.cs @@ -1,8 +1,8 @@ using Gommon; using Ryujinx.Ava.UI.ViewModels; +using Ryujinx.Ava.Utilities.Configuration; using Ryujinx.Common; using Ryujinx.Common.Utilities; -using Ryujinx.UI.Common.Configuration; using System; using System.Collections.Concurrent; using System.Collections.Generic; diff --git a/src/Ryujinx/DiscordIntegrationModule.cs b/src/Ryujinx/DiscordIntegrationModule.cs index f13b34ec8..ee00f2c0d 100644 --- a/src/Ryujinx/DiscordIntegrationModule.cs +++ b/src/Ryujinx/DiscordIntegrationModule.cs @@ -2,10 +2,10 @@ using DiscordRPC; using Humanizer; using Humanizer.Localisation; using Ryujinx.Ava.Utilities.AppLibrary; +using Ryujinx.Ava.Utilities.Configuration; using Ryujinx.Common; using Ryujinx.HLE; using Ryujinx.HLE.Loaders.Processes; -using Ryujinx.UI.Common.Configuration; using System.Text; namespace Ryujinx.Ava diff --git a/src/Ryujinx/Headless/HeadlessRyujinx.Init.cs b/src/Ryujinx/Headless/HeadlessRyujinx.Init.cs index ba84e53a5..19d2fb94e 100644 --- a/src/Ryujinx/Headless/HeadlessRyujinx.Init.cs +++ b/src/Ryujinx/Headless/HeadlessRyujinx.Init.cs @@ -2,6 +2,7 @@ using LibHac.Tools.FsSystem; using Ryujinx.Audio.Backends.SDL2; using Ryujinx.Ava; +using Ryujinx.Ava.Utilities.Configuration; using Ryujinx.Common.Configuration; using Ryujinx.Common.Configuration.Hid; using Ryujinx.Common.Configuration.Hid.Controller; @@ -16,8 +17,6 @@ using Ryujinx.Graphics.OpenGL; using Ryujinx.Graphics.Vulkan; using Ryujinx.HLE; using Ryujinx.Input; -using Ryujinx.UI.Common; -using Ryujinx.UI.Common.Configuration; using Silk.NET.Vulkan; using System; using System.IO; diff --git a/src/Ryujinx/Headless/HeadlessRyujinx.cs b/src/Ryujinx/Headless/HeadlessRyujinx.cs index eabe72cbe..3d99fb902 100644 --- a/src/Ryujinx/Headless/HeadlessRyujinx.cs +++ b/src/Ryujinx/Headless/HeadlessRyujinx.cs @@ -1,6 +1,7 @@ using CommandLine; using Gommon; using Ryujinx.Ava; +using Ryujinx.Ava.Utilities.Configuration; using Ryujinx.Common; using Ryujinx.Common.Configuration; using Ryujinx.Common.Configuration.Hid; @@ -25,7 +26,6 @@ using Ryujinx.Input; using Ryujinx.Input.HLE; using Ryujinx.Input.SDL2; using Ryujinx.SDL2.Common; -using Ryujinx.UI.Common.Configuration; using System; using System.Collections.Generic; using System.IO; diff --git a/src/Ryujinx/Headless/Options.cs b/src/Ryujinx/Headless/Options.cs index b0a349a2b..c0def95c1 100644 --- a/src/Ryujinx/Headless/Options.cs +++ b/src/Ryujinx/Headless/Options.cs @@ -1,11 +1,11 @@ using CommandLine; using Gommon; +using Ryujinx.Ava.Utilities.Configuration; using Ryujinx.Common.Configuration; using Ryujinx.Common.Configuration.Hid; using Ryujinx.HLE; using Ryujinx.HLE.HOS.Services.Account.Acc; using Ryujinx.HLE.HOS.SystemState; -using Ryujinx.UI.Common.Configuration; using System; using System.Collections.Generic; using System.Linq; diff --git a/src/Ryujinx/Program.cs b/src/Ryujinx/Program.cs index 76ed0b076..6f0f3e12e 100644 --- a/src/Ryujinx/Program.cs +++ b/src/Ryujinx/Program.cs @@ -8,7 +8,9 @@ using Projektanker.Icons.Avalonia.MaterialDesign; using Ryujinx.Ava.Common.Locale; using Ryujinx.Ava.UI.Helpers; using Ryujinx.Ava.UI.Windows; +using Ryujinx.Ava.Utilities; using Ryujinx.Ava.Utilities.AppLibrary; +using Ryujinx.Ava.Utilities.Configuration; using Ryujinx.Ava.Utilities.SystemInfo; using Ryujinx.Common; using Ryujinx.Common.Configuration; @@ -18,9 +20,6 @@ using Ryujinx.Common.SystemInterop; using Ryujinx.Graphics.Vulkan.MoltenVK; using Ryujinx.Headless; using Ryujinx.SDL2.Common; -using Ryujinx.UI.Common; -using Ryujinx.UI.Common.Configuration; -using Ryujinx.UI.Common.Helper; using System; using System.IO; using System.Linq; @@ -117,9 +116,6 @@ namespace Ryujinx.Ava // Setup base data directory. AppDataManager.Initialize(CommandLineState.BaseDirPathArg); - // Set the delegate for localizing the word "never" in the UI - ApplicationData.LocalizedNever = () => LocaleManager.Instance[LocaleKeys.Never]; - // Initialize the configuration. ConfigurationState.Initialize(); diff --git a/src/Ryujinx/Ryujinx.csproj b/src/Ryujinx/Ryujinx.csproj index 3ddd807e6..9d23b0909 100644 --- a/src/Ryujinx/Ryujinx.csproj +++ b/src/Ryujinx/Ryujinx.csproj @@ -48,6 +48,7 @@ + @@ -57,6 +58,7 @@ + @@ -77,7 +79,6 @@ - diff --git a/src/Ryujinx/RyujinxApp.axaml.cs b/src/Ryujinx/RyujinxApp.axaml.cs index bbef20aa0..d950af3a9 100644 --- a/src/Ryujinx/RyujinxApp.axaml.cs +++ b/src/Ryujinx/RyujinxApp.axaml.cs @@ -11,10 +11,10 @@ using Ryujinx.Ava.Common; using Ryujinx.Ava.Common.Locale; using Ryujinx.Ava.UI.Helpers; using Ryujinx.Ava.UI.Windows; +using Ryujinx.Ava.Utilities; +using Ryujinx.Ava.Utilities.Configuration; using Ryujinx.Common; using Ryujinx.Common.Logging; -using Ryujinx.UI.Common.Configuration; -using Ryujinx.UI.Common.Helper; using System; using System.Diagnostics; diff --git a/src/Ryujinx/UI/Applet/AvaHostUIHandler.cs b/src/Ryujinx/UI/Applet/AvaHostUIHandler.cs index 893ea95ac..65f4c7795 100644 --- a/src/Ryujinx/UI/Applet/AvaHostUIHandler.cs +++ b/src/Ryujinx/UI/Applet/AvaHostUIHandler.cs @@ -5,12 +5,12 @@ using Ryujinx.Ava.Common.Locale; using Ryujinx.Ava.UI.Controls; using Ryujinx.Ava.UI.Helpers; using Ryujinx.Ava.UI.Windows; +using Ryujinx.Ava.Utilities.Configuration; using Ryujinx.HLE; using Ryujinx.HLE.HOS.Applets; using Ryujinx.HLE.HOS.Applets.SoftwareKeyboard; using Ryujinx.HLE.HOS.Services.Am.AppletOE.ApplicationProxyService.ApplicationProxy.Types; using Ryujinx.HLE.UI; -using Ryujinx.UI.Common.Configuration; using System; using System.Threading; diff --git a/src/Ryujinx/UI/Controls/ApplicationContextMenu.axaml.cs b/src/Ryujinx/UI/Controls/ApplicationContextMenu.axaml.cs index 4f998b040..354e1c7e6 100644 --- a/src/Ryujinx/UI/Controls/ApplicationContextMenu.axaml.cs +++ b/src/Ryujinx/UI/Controls/ApplicationContextMenu.axaml.cs @@ -13,8 +13,8 @@ using Ryujinx.Ava.UI.Windows; using Ryujinx.Ava.Utilities; using Ryujinx.Ava.Utilities.AppLibrary; using Ryujinx.Common.Configuration; +using Ryujinx.Common.Helper; using Ryujinx.HLE.HOS; -using Ryujinx.UI.Common.Helper; using SkiaSharp; using System; using System.Collections.Generic; diff --git a/src/Ryujinx/UI/Helpers/MultiplayerInfoConverter.cs b/src/Ryujinx/UI/Helpers/MultiplayerInfoConverter.cs index 4135fd4c7..09a2ad367 100644 --- a/src/Ryujinx/UI/Helpers/MultiplayerInfoConverter.cs +++ b/src/Ryujinx/UI/Helpers/MultiplayerInfoConverter.cs @@ -2,7 +2,6 @@ using Avalonia.Data.Converters; using Avalonia.Markup.Xaml; using Ryujinx.Ava.Common.Locale; using Ryujinx.Ava.Utilities.AppLibrary; -using Ryujinx.UI.Common.Helper; using System; using System.Globalization; diff --git a/src/Ryujinx/UI/Helpers/UserErrorDialog.cs b/src/Ryujinx/UI/Helpers/UserErrorDialog.cs index 3864be0fa..c30fb4348 100644 --- a/src/Ryujinx/UI/Helpers/UserErrorDialog.cs +++ b/src/Ryujinx/UI/Helpers/UserErrorDialog.cs @@ -1,6 +1,5 @@ using Ryujinx.Ava.Common.Locale; using Ryujinx.Common.UI; -using Ryujinx.UI.Common; using System.Threading.Tasks; namespace Ryujinx.Ava.UI.Helpers diff --git a/src/Ryujinx/UI/Models/SaveModel.cs b/src/Ryujinx/UI/Models/SaveModel.cs index 8364e1966..3dc009b2a 100644 --- a/src/Ryujinx/UI/Models/SaveModel.cs +++ b/src/Ryujinx/UI/Models/SaveModel.cs @@ -3,9 +3,9 @@ using LibHac.Fs; using LibHac.Ncm; using Ryujinx.Ava.UI.ViewModels; using Ryujinx.Ava.UI.Windows; +using Ryujinx.Ava.Utilities; using Ryujinx.Ava.Utilities.AppLibrary; using Ryujinx.HLE.FileSystem; -using Ryujinx.UI.Common.Helper; using System; using System.IO; using System.Linq; diff --git a/src/Ryujinx/UI/Renderer/EmbeddedWindow.cs b/src/Ryujinx/UI/Renderer/EmbeddedWindow.cs index ea5a8dbdd..eea9be283 100644 --- a/src/Ryujinx/UI/Renderer/EmbeddedWindow.cs +++ b/src/Ryujinx/UI/Renderer/EmbeddedWindow.cs @@ -2,9 +2,9 @@ using Avalonia; using Avalonia.Controls; using Avalonia.Input; using Avalonia.Platform; +using Ryujinx.Ava.Utilities.Configuration; using Ryujinx.Common.Configuration; -using Ryujinx.UI.Common.Configuration; -using Ryujinx.UI.Common.Helper; +using Ryujinx.Common.Helper; using SPB.Graphics; using SPB.Platform; using SPB.Platform.GLX; diff --git a/src/Ryujinx/UI/Renderer/EmbeddedWindowOpenGL.cs b/src/Ryujinx/UI/Renderer/EmbeddedWindowOpenGL.cs index 3842301de..4f59e2400 100644 --- a/src/Ryujinx/UI/Renderer/EmbeddedWindowOpenGL.cs +++ b/src/Ryujinx/UI/Renderer/EmbeddedWindowOpenGL.cs @@ -1,9 +1,9 @@ using OpenTK.Graphics.OpenGL; +using Ryujinx.Ava.Utilities.Configuration; using Ryujinx.Common.Configuration; using Ryujinx.Common.Logging; using Ryujinx.Graphics.GAL; using Ryujinx.Graphics.OpenGL; -using Ryujinx.UI.Common.Configuration; using SPB.Graphics; using SPB.Graphics.Exceptions; using SPB.Graphics.OpenGL; diff --git a/src/Ryujinx/UI/Renderer/RendererHost.axaml.cs b/src/Ryujinx/UI/Renderer/RendererHost.axaml.cs index 71c0e1432..fa9aec0c5 100644 --- a/src/Ryujinx/UI/Renderer/RendererHost.axaml.cs +++ b/src/Ryujinx/UI/Renderer/RendererHost.axaml.cs @@ -1,10 +1,10 @@ using Avalonia; using Avalonia.Controls; using Gommon; +using Ryujinx.Ava.Utilities.Configuration; using Ryujinx.Common; using Ryujinx.Common.Configuration; using Ryujinx.Common.Logging; -using Ryujinx.UI.Common.Configuration; using System; using System.Runtime.InteropServices; diff --git a/src/Ryujinx/UI/ViewModels/AboutWindowViewModel.cs b/src/Ryujinx/UI/ViewModels/AboutWindowViewModel.cs index 0f8a5a7d7..6bc1e1f03 100644 --- a/src/Ryujinx/UI/ViewModels/AboutWindowViewModel.cs +++ b/src/Ryujinx/UI/ViewModels/AboutWindowViewModel.cs @@ -3,7 +3,7 @@ using Avalonia.Styling; using Avalonia.Threading; using Ryujinx.Ava.Common; using Ryujinx.Ava.Common.Locale; -using Ryujinx.UI.Common.Configuration; +using Ryujinx.Ava.Utilities.Configuration; using System; namespace Ryujinx.Ava.UI.ViewModels diff --git a/src/Ryujinx/UI/ViewModels/Input/InputViewModel.cs b/src/Ryujinx/UI/ViewModels/Input/InputViewModel.cs index 79daab701..74b8681d5 100644 --- a/src/Ryujinx/UI/ViewModels/Input/InputViewModel.cs +++ b/src/Ryujinx/UI/ViewModels/Input/InputViewModel.cs @@ -10,6 +10,7 @@ using Ryujinx.Ava.UI.Helpers; using Ryujinx.Ava.UI.Models; using Ryujinx.Ava.UI.Models.Input; using Ryujinx.Ava.UI.Windows; +using Ryujinx.Ava.Utilities.Configuration; using Ryujinx.Common; using Ryujinx.Common.Configuration; using Ryujinx.Common.Configuration.Hid; @@ -19,7 +20,6 @@ using Ryujinx.Common.Configuration.Hid.Keyboard; using Ryujinx.Common.Logging; using Ryujinx.Common.Utilities; using Ryujinx.Input; -using Ryujinx.UI.Common.Configuration; using System; using System.Collections.Generic; using System.Collections.ObjectModel; diff --git a/src/Ryujinx/UI/ViewModels/MainWindowViewModel.cs b/src/Ryujinx/UI/ViewModels/MainWindowViewModel.cs index 3bc100ba3..332009149 100644 --- a/src/Ryujinx/UI/ViewModels/MainWindowViewModel.cs +++ b/src/Ryujinx/UI/ViewModels/MainWindowViewModel.cs @@ -22,8 +22,10 @@ using Ryujinx.Ava.UI.Models.Generic; using Ryujinx.Ava.UI.Renderer; using Ryujinx.Ava.UI.Windows; using Ryujinx.Ava.Utilities.AppLibrary; +using Ryujinx.Ava.Utilities.Configuration; using Ryujinx.Common; using Ryujinx.Common.Configuration; +using Ryujinx.Common.Helper; using Ryujinx.Common.Logging; using Ryujinx.Common.UI; using Ryujinx.Common.Utilities; @@ -35,9 +37,6 @@ using Ryujinx.HLE.HOS.Services.Account.Acc; using Ryujinx.HLE.HOS.Services.Nfc.AmiiboDecryption; using Ryujinx.HLE.UI; using Ryujinx.Input.HLE; -using Ryujinx.UI.Common; -using Ryujinx.UI.Common.Configuration; -using Ryujinx.UI.Common.Helper; using Silk.NET.Vulkan; using SkiaSharp; using System; diff --git a/src/Ryujinx/UI/ViewModels/SettingsViewModel.cs b/src/Ryujinx/UI/ViewModels/SettingsViewModel.cs index ecd2d40dd..1f239d3ce 100644 --- a/src/Ryujinx/UI/ViewModels/SettingsViewModel.cs +++ b/src/Ryujinx/UI/ViewModels/SettingsViewModel.cs @@ -10,6 +10,8 @@ using Ryujinx.Ava.Common.Locale; using Ryujinx.Ava.UI.Helpers; using Ryujinx.Ava.UI.Models.Input; using Ryujinx.Ava.UI.Windows; +using Ryujinx.Ava.Utilities.Configuration; +using Ryujinx.Ava.Utilities.Configuration.System; using Ryujinx.Common.Configuration; using Ryujinx.Common.Configuration.Multiplayer; using Ryujinx.Common.GraphicsDriver; @@ -18,8 +20,6 @@ using Ryujinx.Graphics.Vulkan; using Ryujinx.HLE; using Ryujinx.HLE.FileSystem; using Ryujinx.HLE.HOS.Services.Time.TimeZone; -using Ryujinx.UI.Common.Configuration; -using Ryujinx.UI.Common.Configuration.System; using System; using System.Collections.Generic; using System.Collections.ObjectModel; diff --git a/src/Ryujinx/UI/Views/Main/MainMenuBarView.axaml.cs b/src/Ryujinx/UI/Views/Main/MainMenuBarView.axaml.cs index 1f8617ad7..be444faa4 100644 --- a/src/Ryujinx/UI/Views/Main/MainMenuBarView.axaml.cs +++ b/src/Ryujinx/UI/Views/Main/MainMenuBarView.axaml.cs @@ -8,12 +8,11 @@ using Ryujinx.Ava.UI.Helpers; using Ryujinx.Ava.UI.ViewModels; using Ryujinx.Ava.UI.Windows; using Ryujinx.Ava.Utilities; +using Ryujinx.Ava.Utilities.Configuration; using Ryujinx.Common; +using Ryujinx.Common.Helper; using Ryujinx.Common.Utilities; using Ryujinx.HLE.HOS.Services.Nfc.AmiiboDecryption; -using Ryujinx.UI.Common; -using Ryujinx.UI.Common.Configuration; -using Ryujinx.UI.Common.Helper; using System; using System.Collections.Generic; using System.Linq; diff --git a/src/Ryujinx/UI/Views/Main/MainStatusBarView.axaml.cs b/src/Ryujinx/UI/Views/Main/MainStatusBarView.axaml.cs index 297e86c67..b234f7859 100644 --- a/src/Ryujinx/UI/Views/Main/MainStatusBarView.axaml.cs +++ b/src/Ryujinx/UI/Views/Main/MainStatusBarView.axaml.cs @@ -5,10 +5,10 @@ using Avalonia.Interactivity; using Avalonia.Threading; using Ryujinx.Ava.Common.Locale; using Ryujinx.Ava.UI.Windows; +using Ryujinx.Ava.Utilities.Configuration; using Ryujinx.Common; using Ryujinx.Common.Configuration; using Ryujinx.Common.Logging; -using Ryujinx.UI.Common.Configuration; using System; namespace Ryujinx.Ava.UI.Views.Main diff --git a/src/Ryujinx/UI/Views/Settings/SettingsHacksView.axaml.cs b/src/Ryujinx/UI/Views/Settings/SettingsHacksView.axaml.cs index f9e0958ca..915acedeb 100644 --- a/src/Ryujinx/UI/Views/Settings/SettingsHacksView.axaml.cs +++ b/src/Ryujinx/UI/Views/Settings/SettingsHacksView.axaml.cs @@ -1,7 +1,6 @@ using Avalonia.Controls; using Avalonia.Interactivity; using Ryujinx.Ava.UI.ViewModels; -using Ryujinx.UI.Common.Configuration; namespace Ryujinx.Ava.UI.Views.Settings { diff --git a/src/Ryujinx/UI/Windows/AboutWindow.axaml.cs b/src/Ryujinx/UI/Windows/AboutWindow.axaml.cs index a901295cf..b9736b81d 100644 --- a/src/Ryujinx/UI/Windows/AboutWindow.axaml.cs +++ b/src/Ryujinx/UI/Windows/AboutWindow.axaml.cs @@ -8,7 +8,7 @@ using Ryujinx.Ava.Common.Locale; using Ryujinx.Ava.UI.Helpers; using Ryujinx.Ava.UI.ViewModels; using Ryujinx.Common; -using Ryujinx.UI.Common.Helper; +using Ryujinx.Common.Helper; using System.Threading.Tasks; using Button = Avalonia.Controls.Button; diff --git a/src/Ryujinx/UI/Windows/CheatWindow.axaml.cs b/src/Ryujinx/UI/Windows/CheatWindow.axaml.cs index f5795d42c..c770a6f45 100644 --- a/src/Ryujinx/UI/Windows/CheatWindow.axaml.cs +++ b/src/Ryujinx/UI/Windows/CheatWindow.axaml.cs @@ -3,9 +3,9 @@ using LibHac.Tools.FsSystem; using Ryujinx.Ava.Common.Locale; using Ryujinx.Ava.UI.Models; using Ryujinx.Ava.Utilities.AppLibrary; +using Ryujinx.Ava.Utilities.Configuration; using Ryujinx.HLE.FileSystem; using Ryujinx.HLE.HOS; -using Ryujinx.UI.Common.Configuration; using System.Globalization; using System.IO; using System.Linq; diff --git a/src/Ryujinx/UI/Windows/DownloadableContentManagerWindow.axaml.cs b/src/Ryujinx/UI/Windows/DownloadableContentManagerWindow.axaml.cs index 02f420752..335676aef 100644 --- a/src/Ryujinx/UI/Windows/DownloadableContentManagerWindow.axaml.cs +++ b/src/Ryujinx/UI/Windows/DownloadableContentManagerWindow.axaml.cs @@ -6,7 +6,7 @@ using Ryujinx.Ava.Common.Locale; using Ryujinx.Ava.Common.Models; using Ryujinx.Ava.UI.ViewModels; using Ryujinx.Ava.Utilities.AppLibrary; -using Ryujinx.UI.Common.Helper; +using Ryujinx.Common.Helper; using System.Threading.Tasks; namespace Ryujinx.Ava.UI.Windows diff --git a/src/Ryujinx/UI/Windows/MainWindow.axaml.cs b/src/Ryujinx/UI/Windows/MainWindow.axaml.cs index f0aaf4cac..0b1c356d4 100644 --- a/src/Ryujinx/UI/Windows/MainWindow.axaml.cs +++ b/src/Ryujinx/UI/Windows/MainWindow.axaml.cs @@ -15,8 +15,11 @@ using Ryujinx.Ava.Input; using Ryujinx.Ava.UI.Applet; using Ryujinx.Ava.UI.Helpers; using Ryujinx.Ava.UI.ViewModels; +using Ryujinx.Ava.Utilities; using Ryujinx.Ava.Utilities.AppLibrary; +using Ryujinx.Ava.Utilities.Configuration; using Ryujinx.Common; +using Ryujinx.Common.Helper; using Ryujinx.Common.Logging; using Ryujinx.Common.UI; using Ryujinx.Graphics.Gpu; @@ -25,9 +28,6 @@ using Ryujinx.HLE.HOS; using Ryujinx.HLE.HOS.Services.Account.Acc; using Ryujinx.Input.HLE; using Ryujinx.Input.SDL2; -using Ryujinx.UI.Common; -using Ryujinx.UI.Common.Configuration; -using Ryujinx.UI.Common.Helper; using System; using System.Collections.Generic; using System.Linq; diff --git a/src/Ryujinx/UI/Windows/ModManagerWindow.axaml.cs b/src/Ryujinx/UI/Windows/ModManagerWindow.axaml.cs index 774446cf1..449aab554 100644 --- a/src/Ryujinx/UI/Windows/ModManagerWindow.axaml.cs +++ b/src/Ryujinx/UI/Windows/ModManagerWindow.axaml.cs @@ -6,7 +6,7 @@ using Ryujinx.Ava.Common.Locale; using Ryujinx.Ava.UI.Helpers; using Ryujinx.Ava.UI.Models; using Ryujinx.Ava.UI.ViewModels; -using Ryujinx.UI.Common.Helper; +using Ryujinx.Common.Helper; using System.Threading.Tasks; using Button = Avalonia.Controls.Button; diff --git a/src/Ryujinx/UI/Windows/TitleUpdateWindow.axaml.cs b/src/Ryujinx/UI/Windows/TitleUpdateWindow.axaml.cs index 421990bcd..b7c421c96 100644 --- a/src/Ryujinx/UI/Windows/TitleUpdateWindow.axaml.cs +++ b/src/Ryujinx/UI/Windows/TitleUpdateWindow.axaml.cs @@ -6,7 +6,7 @@ using Ryujinx.Ava.Common.Locale; using Ryujinx.Ava.Common.Models; using Ryujinx.Ava.UI.ViewModels; using Ryujinx.Ava.Utilities.AppLibrary; -using Ryujinx.UI.Common.Helper; +using Ryujinx.Common.Helper; using System.Threading.Tasks; namespace Ryujinx.Ava.UI.Windows diff --git a/src/Ryujinx/Updater.cs b/src/Ryujinx/Updater.cs index 377acbbdf..3e3989c66 100644 --- a/src/Ryujinx/Updater.cs +++ b/src/Ryujinx/Updater.cs @@ -7,10 +7,11 @@ using ICSharpCode.SharpZipLib.Zip; using Ryujinx.Ava.Common.Locale; using Ryujinx.Ava.Common.Models.Github; using Ryujinx.Ava.UI.Helpers; +using Ryujinx.Ava.Utilities; using Ryujinx.Common; +using Ryujinx.Common.Helper; using Ryujinx.Common.Logging; using Ryujinx.Common.Utilities; -using Ryujinx.UI.Common.Helper; using System; using System.Collections.Generic; using System.Diagnostics; diff --git a/src/Ryujinx/Utilities/AppLibrary/ApplicationData.cs b/src/Ryujinx/Utilities/AppLibrary/ApplicationData.cs index de91c98a5..c87486232 100644 --- a/src/Ryujinx/Utilities/AppLibrary/ApplicationData.cs +++ b/src/Ryujinx/Utilities/AppLibrary/ApplicationData.cs @@ -10,7 +10,6 @@ using LibHac.Tools.FsSystem.NcaUtils; using Ryujinx.Common.Logging; using Ryujinx.HLE.FileSystem; using Ryujinx.HLE.Loaders.Processes.Extensions; -using Ryujinx.UI.Common.Helper; using System; using System.IO; using System.Text.Json.Serialization; @@ -19,8 +18,6 @@ namespace Ryujinx.Ava.Utilities.AppLibrary { public class ApplicationData { - public static Func LocalizedNever { get; set; } = () => "Never"; - public bool Favorite { get; set; } public byte[] Icon { get; set; } public string Name { get; set; } = "Unknown"; @@ -40,7 +37,7 @@ namespace Ryujinx.Ava.Utilities.AppLibrary public string TimePlayedString => ValueFormatUtils.FormatTimeSpan(TimePlayed); - public string LastPlayedString => ValueFormatUtils.FormatDateTime(LastPlayed)?.Replace(" ", "\n") ?? LocalizedNever(); + public string LastPlayedString => ValueFormatUtils.FormatDateTime(LastPlayed)?.Replace(" ", "\n"); public string FileSizeString => ValueFormatUtils.FormatFileSize(FileSize); diff --git a/src/Ryujinx/Utilities/AppLibrary/ApplicationLibrary.cs b/src/Ryujinx/Utilities/AppLibrary/ApplicationLibrary.cs index 94f2e7fc7..ef2e835ae 100644 --- a/src/Ryujinx/Utilities/AppLibrary/ApplicationLibrary.cs +++ b/src/Ryujinx/Utilities/AppLibrary/ApplicationLibrary.cs @@ -11,6 +11,8 @@ using LibHac.Tools.Fs; using LibHac.Tools.FsSystem; using LibHac.Tools.FsSystem.NcaUtils; using Ryujinx.Ava.Common.Models; +using Ryujinx.Ava.Utilities.Configuration; +using Ryujinx.Ava.Utilities.Configuration.System; using Ryujinx.Common; using Ryujinx.Common.Configuration; using Ryujinx.Common.Configuration.Multiplayer; @@ -21,8 +23,6 @@ using Ryujinx.HLE.HOS.SystemState; using Ryujinx.HLE.Loaders.Npdm; using Ryujinx.HLE.Loaders.Processes.Extensions; using Ryujinx.HLE.Utilities; -using Ryujinx.UI.Common.Configuration; -using Ryujinx.UI.Common.Configuration.System; using System; using System.Collections.Generic; using System.IO; diff --git a/src/Ryujinx.Common/Helpers/CommandLineState.cs b/src/Ryujinx/Utilities/CommandLineState.cs similarity index 99% rename from src/Ryujinx.Common/Helpers/CommandLineState.cs rename to src/Ryujinx/Utilities/CommandLineState.cs index 3a96a55c8..6fb8e92d6 100644 --- a/src/Ryujinx.Common/Helpers/CommandLineState.cs +++ b/src/Ryujinx/Utilities/CommandLineState.cs @@ -1,7 +1,7 @@ using Ryujinx.Common.Logging; using System.Collections.Generic; -namespace Ryujinx.UI.Common.Helper +namespace Ryujinx.Ava.Utilities { public static class CommandLineState { diff --git a/src/Ryujinx.UI.Common/Configuration/AudioBackend.cs b/src/Ryujinx/Utilities/Configuration/AudioBackend.cs similarity index 84% rename from src/Ryujinx.UI.Common/Configuration/AudioBackend.cs rename to src/Ryujinx/Utilities/Configuration/AudioBackend.cs index a952e7ac0..8394bb282 100644 --- a/src/Ryujinx.UI.Common/Configuration/AudioBackend.cs +++ b/src/Ryujinx/Utilities/Configuration/AudioBackend.cs @@ -1,7 +1,7 @@ using Ryujinx.Common.Utilities; using System.Text.Json.Serialization; -namespace Ryujinx.UI.Common.Configuration +namespace Ryujinx.Ava.Utilities.Configuration { [JsonConverter(typeof(TypedStringEnumConverter))] public enum AudioBackend diff --git a/src/Ryujinx.UI.Common/Configuration/ConfigurationFileFormat.cs b/src/Ryujinx/Utilities/Configuration/ConfigurationFileFormat.cs similarity index 99% rename from src/Ryujinx.UI.Common/Configuration/ConfigurationFileFormat.cs rename to src/Ryujinx/Utilities/Configuration/ConfigurationFileFormat.cs index 8b123be01..c964ed76d 100644 --- a/src/Ryujinx.UI.Common/Configuration/ConfigurationFileFormat.cs +++ b/src/Ryujinx/Utilities/Configuration/ConfigurationFileFormat.cs @@ -1,3 +1,5 @@ +using Ryujinx.Ava.Utilities.Configuration.System; +using Ryujinx.Ava.Utilities.Configuration.UI; using Ryujinx.Common; using Ryujinx.Common.Configuration; using Ryujinx.Common.Configuration.Hid; @@ -5,12 +7,10 @@ using Ryujinx.Common.Configuration.Multiplayer; using Ryujinx.Common.Logging; using Ryujinx.Common.Utilities; using Ryujinx.HLE; -using Ryujinx.UI.Common.Configuration.System; -using Ryujinx.UI.Common.Configuration.UI; using System.Collections.Generic; using System.Text.Json.Nodes; -namespace Ryujinx.UI.Common.Configuration +namespace Ryujinx.Ava.Utilities.Configuration { public class ConfigurationFileFormat { diff --git a/src/Ryujinx.UI.Common/Configuration/ConfigurationFileFormatSettings.cs b/src/Ryujinx/Utilities/Configuration/ConfigurationFileFormatSettings.cs similarity index 83% rename from src/Ryujinx.UI.Common/Configuration/ConfigurationFileFormatSettings.cs rename to src/Ryujinx/Utilities/Configuration/ConfigurationFileFormatSettings.cs index 9861ebf1f..175d4dee8 100644 --- a/src/Ryujinx.UI.Common/Configuration/ConfigurationFileFormatSettings.cs +++ b/src/Ryujinx/Utilities/Configuration/ConfigurationFileFormatSettings.cs @@ -1,6 +1,6 @@ using Ryujinx.Common.Utilities; -namespace Ryujinx.UI.Common.Configuration +namespace Ryujinx.Ava.Utilities.Configuration { internal static class ConfigurationFileFormatSettings { diff --git a/src/Ryujinx.UI.Common/Configuration/ConfigurationJsonSerializerContext.cs b/src/Ryujinx/Utilities/Configuration/ConfigurationJsonSerializerContext.cs similarity index 74% rename from src/Ryujinx.UI.Common/Configuration/ConfigurationJsonSerializerContext.cs rename to src/Ryujinx/Utilities/Configuration/ConfigurationJsonSerializerContext.cs index 3c3e3f20d..a81e00f4a 100644 --- a/src/Ryujinx.UI.Common/Configuration/ConfigurationJsonSerializerContext.cs +++ b/src/Ryujinx/Utilities/Configuration/ConfigurationJsonSerializerContext.cs @@ -1,10 +1,8 @@ using System.Text.Json.Serialization; -namespace Ryujinx.UI.Common.Configuration +namespace Ryujinx.Ava.Utilities.Configuration { [JsonSourceGenerationOptions(WriteIndented = true)] [JsonSerializable(typeof(ConfigurationFileFormat))] - internal partial class ConfigurationJsonSerializerContext : JsonSerializerContext - { - } + internal partial class ConfigurationJsonSerializerContext : JsonSerializerContext; } diff --git a/src/Ryujinx.UI.Common/Configuration/ConfigurationState.Migration.cs b/src/Ryujinx/Utilities/Configuration/ConfigurationState.Migration.cs similarity index 99% rename from src/Ryujinx.UI.Common/Configuration/ConfigurationState.Migration.cs rename to src/Ryujinx/Utilities/Configuration/ConfigurationState.Migration.cs index 8652b4331..8cfb9d53a 100644 --- a/src/Ryujinx.UI.Common/Configuration/ConfigurationState.Migration.cs +++ b/src/Ryujinx/Utilities/Configuration/ConfigurationState.Migration.cs @@ -1,3 +1,5 @@ +using Ryujinx.Ava.Utilities.Configuration.System; +using Ryujinx.Ava.Utilities.Configuration.UI; using Ryujinx.Common.Configuration; using Ryujinx.Common.Configuration.Hid; using Ryujinx.Common.Configuration.Hid.Controller; @@ -5,12 +7,10 @@ using Ryujinx.Common.Configuration.Hid.Keyboard; using Ryujinx.Common.Configuration.Multiplayer; using Ryujinx.Common.Logging; using Ryujinx.HLE; -using Ryujinx.UI.Common.Configuration.System; -using Ryujinx.UI.Common.Configuration.UI; using System; using System.Collections.Generic; -namespace Ryujinx.UI.Common.Configuration +namespace Ryujinx.Ava.Utilities.Configuration { public partial class ConfigurationState { diff --git a/src/Ryujinx.UI.Common/Configuration/ConfigurationState.Model.cs b/src/Ryujinx/Utilities/Configuration/ConfigurationState.Model.cs similarity index 99% rename from src/Ryujinx.UI.Common/Configuration/ConfigurationState.Model.cs rename to src/Ryujinx/Utilities/Configuration/ConfigurationState.Model.cs index 2ae56d50a..c27b3f0e3 100644 --- a/src/Ryujinx.UI.Common/Configuration/ConfigurationState.Model.cs +++ b/src/Ryujinx/Utilities/Configuration/ConfigurationState.Model.cs @@ -1,16 +1,16 @@ using ARMeilleure; using Gommon; +using Ryujinx.Ava.Utilities.Configuration.System; using Ryujinx.Common; using Ryujinx.Common.Configuration; using Ryujinx.Common.Configuration.Hid; using Ryujinx.Common.Configuration.Multiplayer; +using Ryujinx.Common.Helper; using Ryujinx.Common.Logging; using Ryujinx.HLE; -using Ryujinx.UI.Common.Configuration.System; -using Ryujinx.UI.Common.Helper; using System.Collections.Generic; -namespace Ryujinx.UI.Common.Configuration +namespace Ryujinx.Ava.Utilities.Configuration { public partial class ConfigurationState { diff --git a/src/Ryujinx.UI.Common/Configuration/ConfigurationState.cs b/src/Ryujinx/Utilities/Configuration/ConfigurationState.cs similarity index 99% rename from src/Ryujinx.UI.Common/Configuration/ConfigurationState.cs rename to src/Ryujinx/Utilities/Configuration/ConfigurationState.cs index 8ae76ecc5..01534bec8 100644 --- a/src/Ryujinx.UI.Common/Configuration/ConfigurationState.cs +++ b/src/Ryujinx/Utilities/Configuration/ConfigurationState.cs @@ -1,14 +1,14 @@ +using Ryujinx.Ava.Utilities.Configuration.System; +using Ryujinx.Ava.Utilities.Configuration.UI; using Ryujinx.Common.Configuration; using Ryujinx.Common.Configuration.Hid; using Ryujinx.Common.Configuration.Hid.Keyboard; using Ryujinx.Common.Configuration.Multiplayer; using Ryujinx.Graphics.Vulkan; using Ryujinx.HLE; -using Ryujinx.UI.Common.Configuration.System; -using Ryujinx.UI.Common.Configuration.UI; using System; -namespace Ryujinx.UI.Common.Configuration +namespace Ryujinx.Ava.Utilities.Configuration { public partial class ConfigurationState { diff --git a/src/Ryujinx.UI.Common/Extensions/FileTypeExtensions.cs b/src/Ryujinx/Utilities/Configuration/FileTypes.cs similarity index 73% rename from src/Ryujinx.UI.Common/Extensions/FileTypeExtensions.cs rename to src/Ryujinx/Utilities/Configuration/FileTypes.cs index 7e71ba7a4..c4550b5a6 100644 --- a/src/Ryujinx.UI.Common/Extensions/FileTypeExtensions.cs +++ b/src/Ryujinx/Utilities/Configuration/FileTypes.cs @@ -1,8 +1,19 @@ using System; -using static Ryujinx.UI.Common.Configuration.ConfigurationState.UISection; -namespace Ryujinx.UI.Common +using static Ryujinx.Ava.Utilities.Configuration.ConfigurationState.UISection; + +namespace Ryujinx.Ava.Utilities.Configuration { + public enum FileTypes + { + NSP, + PFS0, + XCI, + NCA, + NRO, + NSO + } + public static class FileTypesExtensions { /// @@ -10,7 +21,7 @@ namespace Ryujinx.UI.Common /// /// The name of the parameter to get the value of. /// The config instance to get the value from. - /// The current value of the setting. Value is if the file type is the be shown on the games list, otherwise. + /// The current value of the setting. Value is if the file type is to be shown on the games list, otherwise. public static bool GetConfigValue(this FileTypes type, ShownFileTypeSettings config) => type switch { FileTypes.NSP => config.NSP.Value, diff --git a/src/Ryujinx.UI.Common/Configuration/LoggerModule.cs b/src/Ryujinx/Utilities/Configuration/LoggerModule.cs similarity index 98% rename from src/Ryujinx.UI.Common/Configuration/LoggerModule.cs rename to src/Ryujinx/Utilities/Configuration/LoggerModule.cs index a7913f142..663ad607f 100644 --- a/src/Ryujinx.UI.Common/Configuration/LoggerModule.cs +++ b/src/Ryujinx/Utilities/Configuration/LoggerModule.cs @@ -4,7 +4,7 @@ using Ryujinx.Common.Logging.Targets; using System; using System.IO; -namespace Ryujinx.UI.Common.Configuration +namespace Ryujinx.Ava.Utilities.Configuration { public static class LoggerModule { diff --git a/src/Ryujinx.UI.Common/Configuration/System/Language.cs b/src/Ryujinx/Utilities/Configuration/System/Language.cs similarity index 86% rename from src/Ryujinx.UI.Common/Configuration/System/Language.cs rename to src/Ryujinx/Utilities/Configuration/System/Language.cs index 8ca4e542b..81a9bd192 100644 --- a/src/Ryujinx.UI.Common/Configuration/System/Language.cs +++ b/src/Ryujinx/Utilities/Configuration/System/Language.cs @@ -1,8 +1,7 @@ using Ryujinx.Common.Utilities; -using Ryujinx.HLE.HOS.SystemState; using System.Text.Json.Serialization; -namespace Ryujinx.UI.Common.Configuration.System +namespace Ryujinx.Ava.Utilities.Configuration.System { [JsonConverter(typeof(TypedStringEnumConverter))] public enum Language diff --git a/src/Ryujinx.UI.Common/Configuration/System/Region.cs b/src/Ryujinx/Utilities/Configuration/System/Region.cs similarity index 84% rename from src/Ryujinx.UI.Common/Configuration/System/Region.cs rename to src/Ryujinx/Utilities/Configuration/System/Region.cs index 6087c70e5..ff3352e6a 100644 --- a/src/Ryujinx.UI.Common/Configuration/System/Region.cs +++ b/src/Ryujinx/Utilities/Configuration/System/Region.cs @@ -1,7 +1,7 @@ using Ryujinx.Common.Utilities; using System.Text.Json.Serialization; -namespace Ryujinx.UI.Common.Configuration.System +namespace Ryujinx.Ava.Utilities.Configuration.System { [JsonConverter(typeof(TypedStringEnumConverter))] public enum Region diff --git a/src/Ryujinx.UI.Common/Configuration/UI/ColumnSort.cs b/src/Ryujinx/Utilities/Configuration/UI/ColumnSort.cs similarity index 73% rename from src/Ryujinx.UI.Common/Configuration/UI/ColumnSort.cs rename to src/Ryujinx/Utilities/Configuration/UI/ColumnSort.cs index 44e98c407..e74ca0ec5 100644 --- a/src/Ryujinx.UI.Common/Configuration/UI/ColumnSort.cs +++ b/src/Ryujinx/Utilities/Configuration/UI/ColumnSort.cs @@ -1,4 +1,4 @@ -namespace Ryujinx.UI.Common.Configuration.UI +namespace Ryujinx.Ava.Utilities.Configuration.UI { public struct ColumnSort { diff --git a/src/Ryujinx.UI.Common/Configuration/UI/GuiColumns.cs b/src/Ryujinx/Utilities/Configuration/UI/GuiColumns.cs similarity index 91% rename from src/Ryujinx.UI.Common/Configuration/UI/GuiColumns.cs rename to src/Ryujinx/Utilities/Configuration/UI/GuiColumns.cs index c486492e0..0ab9885fe 100644 --- a/src/Ryujinx.UI.Common/Configuration/UI/GuiColumns.cs +++ b/src/Ryujinx/Utilities/Configuration/UI/GuiColumns.cs @@ -1,4 +1,4 @@ -namespace Ryujinx.UI.Common.Configuration.UI +namespace Ryujinx.Ava.Utilities.Configuration.UI { public struct GuiColumns { diff --git a/src/Ryujinx.UI.Common/Configuration/UI/ShownFileTypes.cs b/src/Ryujinx/Utilities/Configuration/UI/ShownFileTypes.cs similarity index 85% rename from src/Ryujinx.UI.Common/Configuration/UI/ShownFileTypes.cs rename to src/Ryujinx/Utilities/Configuration/UI/ShownFileTypes.cs index 6c72a6930..9541b4885 100644 --- a/src/Ryujinx.UI.Common/Configuration/UI/ShownFileTypes.cs +++ b/src/Ryujinx/Utilities/Configuration/UI/ShownFileTypes.cs @@ -1,4 +1,4 @@ -namespace Ryujinx.UI.Common.Configuration.UI +namespace Ryujinx.Ava.Utilities.Configuration.UI { public struct ShownFileTypes { diff --git a/src/Ryujinx.UI.Common/Configuration/UI/WindowStartup.cs b/src/Ryujinx/Utilities/Configuration/UI/WindowStartup.cs similarity index 85% rename from src/Ryujinx.UI.Common/Configuration/UI/WindowStartup.cs rename to src/Ryujinx/Utilities/Configuration/UI/WindowStartup.cs index 0df459134..6c5e36879 100644 --- a/src/Ryujinx.UI.Common/Configuration/UI/WindowStartup.cs +++ b/src/Ryujinx/Utilities/Configuration/UI/WindowStartup.cs @@ -1,4 +1,4 @@ -namespace Ryujinx.UI.Common.Configuration.UI +namespace Ryujinx.Ava.Utilities.Configuration.UI { public struct WindowStartup { diff --git a/src/Ryujinx/Utilities/ShortcutHelper.cs b/src/Ryujinx/Utilities/ShortcutHelper.cs index 4923d2598..fed6a5c46 100644 --- a/src/Ryujinx/Utilities/ShortcutHelper.cs +++ b/src/Ryujinx/Utilities/ShortcutHelper.cs @@ -1,6 +1,5 @@ using Ryujinx.Common; using Ryujinx.Common.Configuration; -using Ryujinx.UI.Common.Helper; using ShellLink; using SkiaSharp; using System; diff --git a/src/Ryujinx/Utilities/SystemInfo/SystemInfo.cs b/src/Ryujinx/Utilities/SystemInfo/SystemInfo.cs index b7e33d3b4..0d45c52f2 100644 --- a/src/Ryujinx/Utilities/SystemInfo/SystemInfo.cs +++ b/src/Ryujinx/Utilities/SystemInfo/SystemInfo.cs @@ -1,5 +1,4 @@ using Ryujinx.Common.Logging; -using Ryujinx.UI.Common.Helper; using System; using System.Runtime.InteropServices; using System.Runtime.Intrinsics.X86; diff --git a/src/Ryujinx/Utilities/TitleUpdatesHelper.cs b/src/Ryujinx/Utilities/TitleUpdatesHelper.cs index 8cffb9b25..9fc9bbf6b 100644 --- a/src/Ryujinx/Utilities/TitleUpdatesHelper.cs +++ b/src/Ryujinx/Utilities/TitleUpdatesHelper.cs @@ -7,13 +7,13 @@ using LibHac.Ns; using LibHac.Tools.FsSystem; using LibHac.Tools.FsSystem.NcaUtils; using Ryujinx.Ava.Common.Models; +using Ryujinx.Ava.Utilities.Configuration; using Ryujinx.Common.Configuration; using Ryujinx.Common.Logging; using Ryujinx.Common.Utilities; using Ryujinx.HLE.FileSystem; using Ryujinx.HLE.Loaders.Processes.Extensions; using Ryujinx.HLE.Utilities; -using Ryujinx.UI.Common.Configuration; using System; using System.Collections.Generic; using System.IO; diff --git a/src/Ryujinx.Common/Helpers/ValueFormatUtils.cs b/src/Ryujinx/Utilities/ValueFormatUtils.cs similarity index 97% rename from src/Ryujinx.Common/Helpers/ValueFormatUtils.cs rename to src/Ryujinx/Utilities/ValueFormatUtils.cs index c203834f5..944cfbf8a 100644 --- a/src/Ryujinx.Common/Helpers/ValueFormatUtils.cs +++ b/src/Ryujinx/Utilities/ValueFormatUtils.cs @@ -1,8 +1,9 @@ +using Ryujinx.Ava.Common.Locale; using System; using System.Globalization; using System.Linq; -namespace Ryujinx.UI.Common.Helper +namespace Ryujinx.Ava.Utilities { public static class ValueFormatUtils { @@ -75,7 +76,7 @@ namespace Ryujinx.UI.Common.Helper { culture ??= CultureInfo.CurrentCulture; - return utcDateTime?.ToLocalTime().ToString(culture); + return utcDateTime?.ToLocalTime().ToString(culture) ?? LocaleManager.Instance[LocaleKeys.Never]; } /// From f362bef43d3460fdd8eaf2fbd023588bee969cd6 Mon Sep 17 00:00:00 2001 From: Evan Husted Date: Sun, 29 Dec 2024 21:17:01 -0600 Subject: [PATCH 59/60] misc: Overhaul DirtyHacks saving to support storing a value alongside an off/off flag. --- src/Ryujinx.Common/BitTricks.cs | 35 ++++++++++++++ .../Configuration/DirtyHacks.cs | 47 +++++++++++++++++-- src/Ryujinx.HLE/HLEConfiguration.cs | 6 +-- .../Services/Fs/FileSystemProxy/IStorage.cs | 2 +- src/Ryujinx.HLE/Switch.cs | 4 +- src/Ryujinx/AppHost.cs | 2 +- src/Ryujinx/Headless/HeadlessRyujinx.cs | 3 -- .../UI/ViewModels/SettingsViewModel.cs | 32 +++++++++++++ .../UI/Views/Settings/SettingsHacksView.axaml | 27 +++++++++++ .../Configuration/ConfigurationFileFormat.cs | 6 +-- .../ConfigurationState.Migration.cs | 24 +++++++++- .../Configuration/ConfigurationState.Model.cs | 26 ++++++---- .../Configuration/ConfigurationState.cs | 3 +- 13 files changed, 190 insertions(+), 27 deletions(-) create mode 100644 src/Ryujinx.Common/BitTricks.cs diff --git a/src/Ryujinx.Common/BitTricks.cs b/src/Ryujinx.Common/BitTricks.cs new file mode 100644 index 000000000..d0c689291 --- /dev/null +++ b/src/Ryujinx.Common/BitTricks.cs @@ -0,0 +1,35 @@ +namespace Ryujinx.Common +{ + public class BitTricks + { + // Never actually written bit packing logic before, so I looked it up. + // This code is from https://gist.github.com/Alan-FGR/04938e93e2bffdf5802ceb218a37c195 + + public static ulong PackBitFields(uint[] values, byte[] bitFields) + { + ulong retVal = values[0]; //we set the first value right away + for (int f = 1; f < values.Length; f++) + { + retVal <<= bitFields[f]; // we shift the previous value + retVal += values[f];// and add our current value + } + return retVal; + } + + public static uint[] UnpackBitFields(ulong packed, byte[] bitFields) + { + int fields = bitFields.Length - 1; // number of fields to unpack + uint[] retArr = new uint[fields + 1]; // init return array + int curPos = 0; // current field bit position (start) + int lastEnd; // position where last field ended + for (int f = fields; f >= 0; f--) // loop from last + { + lastEnd = curPos; // we store where the last value ended + curPos += bitFields[f]; // we get where the current value starts + int leftShift = 64 - curPos; // we figure how much left shift we gotta apply for the other numbers to overflow into oblivion + retArr[f] = (uint)((packed << leftShift) >> leftShift + lastEnd); // we do magic + } + return retArr; + } + } +} diff --git a/src/Ryujinx.Common/Configuration/DirtyHacks.cs b/src/Ryujinx.Common/Configuration/DirtyHacks.cs index 6a6d4949c..12f6b019b 100644 --- a/src/Ryujinx.Common/Configuration/DirtyHacks.cs +++ b/src/Ryujinx.Common/Configuration/DirtyHacks.cs @@ -1,11 +1,52 @@ using System; +using System.Collections.Generic; +using System.Linq; namespace Ryujinx.Common.Configuration { [Flags] - public enum DirtyHacks + public enum DirtyHacks : byte { - None = 0, - Xc2MenuSoftlockFix = 1 << 10 + Xc2MenuSoftlockFix = 1, + ShaderCompilationThreadSleep = 2 + } + + public record EnabledDirtyHack(DirtyHacks Hack, int Value) + { + private static readonly byte[] _packedFormat = [8, 32]; + + public ulong Pack() => BitTricks.PackBitFields([(uint)Hack, (uint)Value], _packedFormat); + + public static EnabledDirtyHack FromPacked(ulong packedHack) + { + var unpackedFields = BitTricks.UnpackBitFields(packedHack, _packedFormat); + if (unpackedFields is not [var hack, var value]) + throw new ArgumentException(nameof(packedHack)); + + return new EnabledDirtyHack((DirtyHacks)hack, (int)value); + } + } + + public class DirtyHackCollection : Dictionary + { + public DirtyHackCollection(EnabledDirtyHack[] hacks) + { + foreach ((DirtyHacks dirtyHacks, int value) in hacks) + { + Add(dirtyHacks, value); + } + } + + public DirtyHackCollection(ulong[] packedHacks) + { + foreach ((DirtyHacks dirtyHacks, int value) in packedHacks.Select(EnabledDirtyHack.FromPacked)) + { + Add(dirtyHacks, value); + } + } + + public new int this[DirtyHacks hack] => TryGetValue(hack, out var value) ? value : -1; + + public bool IsEnabled(DirtyHacks hack) => ContainsKey(hack); } } diff --git a/src/Ryujinx.HLE/HLEConfiguration.cs b/src/Ryujinx.HLE/HLEConfiguration.cs index b44a09b22..8ac76508f 100644 --- a/src/Ryujinx.HLE/HLEConfiguration.cs +++ b/src/Ryujinx.HLE/HLEConfiguration.cs @@ -192,7 +192,7 @@ namespace Ryujinx.HLE /// /// The desired hacky workarounds. /// - public DirtyHacks Hacks { internal get; set; } + public EnabledDirtyHack[] Hacks { internal get; set; } public HLEConfiguration(VirtualFileSystem virtualFileSystem, LibHacHorizonManager libHacHorizonManager, @@ -224,7 +224,7 @@ namespace Ryujinx.HLE string multiplayerLdnPassphrase, string multiplayerLdnServer, int customVSyncInterval, - DirtyHacks dirtyHacks = DirtyHacks.None) + EnabledDirtyHack[] dirtyHacks = null) { VirtualFileSystem = virtualFileSystem; LibHacHorizonManager = libHacHorizonManager; @@ -256,7 +256,7 @@ namespace Ryujinx.HLE MultiplayerDisableP2p = multiplayerDisableP2p; MultiplayerLdnPassphrase = multiplayerLdnPassphrase; MultiplayerLdnServer = multiplayerLdnServer; - Hacks = dirtyHacks; + Hacks = dirtyHacks ?? []; } } } diff --git a/src/Ryujinx.HLE/HOS/Services/Fs/FileSystemProxy/IStorage.cs b/src/Ryujinx.HLE/HOS/Services/Fs/FileSystemProxy/IStorage.cs index 07ab8b386..ac5dc04e9 100644 --- a/src/Ryujinx.HLE/HOS/Services/Fs/FileSystemProxy/IStorage.cs +++ b/src/Ryujinx.HLE/HOS/Services/Fs/FileSystemProxy/IStorage.cs @@ -39,7 +39,7 @@ namespace Ryujinx.HLE.HOS.Services.Fs.FileSystemProxy using var region = context.Memory.GetWritableRegion(bufferAddress, (int)bufferLen, true); Result result = _baseStorage.Get.Read((long)offset, new OutBuffer(region.Memory.Span), (long)size); - if (context.Device.DirtyHacks.HasFlag(DirtyHacks.Xc2MenuSoftlockFix) && TitleIDs.CurrentApplication.Value == Xc2TitleId) + if (context.Device.DirtyHacks.IsEnabled(DirtyHacks.Xc2MenuSoftlockFix) && TitleIDs.CurrentApplication.Value == Xc2TitleId) { // Add a load-bearing sleep to avoid XC2 softlock // https://web.archive.org/web/20240728045136/https://github.com/Ryujinx/Ryujinx/issues/2357 diff --git a/src/Ryujinx.HLE/Switch.cs b/src/Ryujinx.HLE/Switch.cs index c630c71c7..ed1cc02d3 100644 --- a/src/Ryujinx.HLE/Switch.cs +++ b/src/Ryujinx.HLE/Switch.cs @@ -40,7 +40,7 @@ namespace Ryujinx.HLE public bool IsFrameAvailable => Gpu.Window.IsFrameAvailable; - public DirtyHacks DirtyHacks { get; } + public DirtyHackCollection DirtyHacks { get; } public Switch(HLEConfiguration configuration) { @@ -77,7 +77,7 @@ namespace Ryujinx.HLE System.EnablePtc = Configuration.EnablePtc; System.FsIntegrityCheckLevel = Configuration.FsIntegrityCheckLevel; System.GlobalAccessLogMode = Configuration.FsGlobalAccessLogMode; - DirtyHacks = Configuration.Hacks; + DirtyHacks = new DirtyHackCollection(Configuration.Hacks); UpdateVSyncInterval(); #pragma warning restore IDE0055 diff --git a/src/Ryujinx/AppHost.cs b/src/Ryujinx/AppHost.cs index cff6a44a5..b90f8b801 100644 --- a/src/Ryujinx/AppHost.cs +++ b/src/Ryujinx/AppHost.cs @@ -952,7 +952,7 @@ namespace Ryujinx.Ava ConfigurationState.Instance.Multiplayer.LdnPassphrase, ConfigurationState.Instance.Multiplayer.LdnServer, ConfigurationState.Instance.Graphics.CustomVSyncInterval.Value, - ConfigurationState.Instance.Hacks.ShowDirtyHacks ? ConfigurationState.Instance.Hacks.EnabledHacks : DirtyHacks.None)); + ConfigurationState.Instance.Hacks.ShowDirtyHacks ? ConfigurationState.Instance.Hacks.EnabledHacks : null)); } private static IHardwareDeviceDriver InitializeAudio() diff --git a/src/Ryujinx/Headless/HeadlessRyujinx.cs b/src/Ryujinx/Headless/HeadlessRyujinx.cs index 3d99fb902..3cb0afca3 100644 --- a/src/Ryujinx/Headless/HeadlessRyujinx.cs +++ b/src/Ryujinx/Headless/HeadlessRyujinx.cs @@ -14,9 +14,6 @@ using Ryujinx.Cpu; using Ryujinx.Graphics.GAL; using Ryujinx.Graphics.Gpu; using Ryujinx.Graphics.Gpu.Shader; -using Ryujinx.Graphics.Metal; -using Ryujinx.Graphics.OpenGL; -using Ryujinx.Graphics.Vulkan; using Ryujinx.Graphics.Vulkan.MoltenVK; using Ryujinx.HLE; using Ryujinx.HLE.FileSystem; diff --git a/src/Ryujinx/UI/ViewModels/SettingsViewModel.cs b/src/Ryujinx/UI/ViewModels/SettingsViewModel.cs index 1f239d3ce..0afa01fc2 100644 --- a/src/Ryujinx/UI/ViewModels/SettingsViewModel.cs +++ b/src/Ryujinx/UI/ViewModels/SettingsViewModel.cs @@ -66,6 +66,8 @@ namespace Ryujinx.Ava.UI.ViewModels private string _ldnServer; private bool _xc2MenuSoftlockFix = ConfigurationState.Instance.Hacks.Xc2MenuSoftlockFix; + private bool _shaderTranslationThreadSleep = ConfigurationState.Instance.Hacks.EnableShaderCompilationThreadSleep; + private int _shaderTranslationSleepDelay = ConfigurationState.Instance.Hacks.ShaderCompilationThreadSleepDelay; public int ResolutionScale { @@ -287,6 +289,28 @@ namespace Ryujinx.Ava.UI.ViewModels OnPropertyChanged(); } } + + public bool ShaderTranslationDelayEnabled + { + get => _shaderTranslationThreadSleep; + set + { + _shaderTranslationThreadSleep = value; + + OnPropertyChanged(); + } + } + + public int ShaderTranslationDelay + { + get => _shaderTranslationSleepDelay; + set + { + _shaderTranslationSleepDelay = value; + + OnPropertyChanged(); + } + } public int Language { get; set; } public int Region { get; set; } @@ -763,6 +787,8 @@ namespace Ryujinx.Ava.UI.ViewModels // Dirty Hacks config.Hacks.Xc2MenuSoftlockFix.Value = Xc2MenuSoftlockFixEnabled; + config.Hacks.EnableShaderCompilationThreadSleep.Value = ShaderTranslationDelayEnabled; + config.Hacks.ShaderCompilationThreadSleepDelay.Value = ShaderTranslationDelay; config.ToFileFormat().SaveConfig(Program.ConfigurationPath); @@ -809,5 +835,11 @@ namespace Ryujinx.Ava.UI.ViewModels "there is a low chance that the game will softlock, " + "the submenu won't show up, while background music is still there."); }); + + public static string ShaderTranslationDelayTooltip { get; } = Lambda.String(sb => + { + sb.Append( + "This hack applies the delay you specify every time shaders are attempted to be translated."); + }); } } diff --git a/src/Ryujinx/UI/Views/Settings/SettingsHacksView.axaml b/src/Ryujinx/UI/Views/Settings/SettingsHacksView.axaml index b7817f064..b4e3437ff 100644 --- a/src/Ryujinx/UI/Views/Settings/SettingsHacksView.axaml +++ b/src/Ryujinx/UI/Views/Settings/SettingsHacksView.axaml @@ -42,6 +42,33 @@ VerticalAlignment="Center" Text="Xenoblade Chronicles 2 Menu Softlock Fix" /> + + + + + + + diff --git a/src/Ryujinx/Utilities/Configuration/ConfigurationFileFormat.cs b/src/Ryujinx/Utilities/Configuration/ConfigurationFileFormat.cs index c964ed76d..540024cbd 100644 --- a/src/Ryujinx/Utilities/Configuration/ConfigurationFileFormat.cs +++ b/src/Ryujinx/Utilities/Configuration/ConfigurationFileFormat.cs @@ -17,7 +17,7 @@ namespace Ryujinx.Ava.Utilities.Configuration /// /// The current version of the file format /// - public const int CurrentVersion = 58; + public const int CurrentVersion = 59; /// /// Version of the configuration file format @@ -436,9 +436,9 @@ namespace Ryujinx.Ava.Utilities.Configuration public bool ShowDirtyHacks { get; set; } /// - /// The packed value of the enabled dirty hacks. + /// The packed values of the enabled dirty hacks. /// - public int EnabledDirtyHacks { get; set; } + public ulong[] DirtyHacks { get; set; } /// /// Loads a configuration file from disk diff --git a/src/Ryujinx/Utilities/Configuration/ConfigurationState.Migration.cs b/src/Ryujinx/Utilities/Configuration/ConfigurationState.Migration.cs index 8cfb9d53a..b0664e1b6 100644 --- a/src/Ryujinx/Utilities/Configuration/ConfigurationState.Migration.cs +++ b/src/Ryujinx/Utilities/Configuration/ConfigurationState.Migration.cs @@ -9,6 +9,7 @@ using Ryujinx.Common.Logging; using Ryujinx.HLE; using System; using System.Collections.Generic; +using System.Linq; namespace Ryujinx.Ava.Utilities.Configuration { @@ -637,6 +638,18 @@ namespace Ryujinx.Ava.Utilities.Configuration configurationFileUpdated = true; } + + // 58 migration accidentally got skipped but it worked with no issues somehow lol + + if (configurationFileFormat.Version < 59) + { + Ryujinx.Common.Logging.Logger.Warning?.Print(LogClass.Application, $"Outdated configuration version {configurationFileFormat.Version}, migrating to version 59."); + + configurationFileFormat.ShowDirtyHacks = false; + configurationFileFormat.DirtyHacks = []; + + configurationFileUpdated = true; + } Logger.EnableFileLog.Value = configurationFileFormat.EnableFileLog; Graphics.ResScale.Value = configurationFileFormat.ResScale; @@ -737,7 +750,16 @@ namespace Ryujinx.Ava.Utilities.Configuration Multiplayer.LdnServer.Value = configurationFileFormat.LdnServer; Hacks.ShowDirtyHacks.Value = configurationFileFormat.ShowDirtyHacks; - Hacks.Xc2MenuSoftlockFix.Value = ((DirtyHacks)configurationFileFormat.EnabledDirtyHacks).HasFlag(DirtyHacks.Xc2MenuSoftlockFix); + + { + EnabledDirtyHack[] hacks = configurationFileFormat.DirtyHacks.Select(EnabledDirtyHack.FromPacked).ToArray(); + + Hacks.Xc2MenuSoftlockFix.Value = hacks.Any(it => it.Hack == DirtyHacks.Xc2MenuSoftlockFix); + + var shaderCompilationThreadSleep = hacks.FirstOrDefault(it => it.Hack == DirtyHacks.ShaderCompilationThreadSleep); + Hacks.EnableShaderCompilationThreadSleep.Value = shaderCompilationThreadSleep != null; + Hacks.ShaderCompilationThreadSleepDelay.Value = shaderCompilationThreadSleep?.Value ?? 0; + } if (configurationFileUpdated) { diff --git a/src/Ryujinx/Utilities/Configuration/ConfigurationState.Model.cs b/src/Ryujinx/Utilities/Configuration/ConfigurationState.Model.cs index c27b3f0e3..53192618e 100644 --- a/src/Ryujinx/Utilities/Configuration/ConfigurationState.Model.cs +++ b/src/Ryujinx/Utilities/Configuration/ConfigurationState.Model.cs @@ -9,6 +9,7 @@ using Ryujinx.Common.Helper; using Ryujinx.Common.Logging; using Ryujinx.HLE; using System.Collections.Generic; +using System.Linq; namespace Ryujinx.Ava.Utilities.Configuration { @@ -626,36 +627,43 @@ namespace Ryujinx.Ava.Utilities.Configuration public ReactiveObject ShowDirtyHacks { get; private set; } public ReactiveObject Xc2MenuSoftlockFix { get; private set; } + + public ReactiveObject EnableShaderCompilationThreadSleep { get; private set; } + + public ReactiveObject ShaderCompilationThreadSleepDelay { get; private set; } public HacksSection() { ShowDirtyHacks = new ReactiveObject(); Xc2MenuSoftlockFix = new ReactiveObject(); Xc2MenuSoftlockFix.Event += HackChanged; + EnableShaderCompilationThreadSleep = new ReactiveObject(); + EnableShaderCompilationThreadSleep.Event += HackChanged; + ShaderCompilationThreadSleepDelay = new ReactiveObject(); } private void HackChanged(object sender, ReactiveEventArgs rxe) { - Ryujinx.Common.Logging.Logger.Info?.Print(LogClass.Configuration, $"EnabledDirtyHacks set to: {EnabledHacks}", "LogValueChange"); + Ryujinx.Common.Logging.Logger.Info?.Print(LogClass.Configuration, $"EnabledDirtyHacks set to: [{EnabledHacks.Select(x => x.Hack).JoinToString(", ")}]", "LogValueChange"); } - public DirtyHacks EnabledHacks + public EnabledDirtyHack[] EnabledHacks { get { - DirtyHacks dirtyHacks = DirtyHacks.None; + List enabledHacks = []; if (Xc2MenuSoftlockFix) Apply(DirtyHacks.Xc2MenuSoftlockFix); - return dirtyHacks; + if (EnableShaderCompilationThreadSleep) + Apply(DirtyHacks.ShaderCompilationThreadSleep, ShaderCompilationThreadSleepDelay); + + return enabledHacks.ToArray(); - void Apply(DirtyHacks hack) + void Apply(DirtyHacks hack, int value = 0) { - if (dirtyHacks is not DirtyHacks.None) - dirtyHacks |= hack; - else - dirtyHacks = hack; + enabledHacks.Add(new EnabledDirtyHack(hack, value)); } } } diff --git a/src/Ryujinx/Utilities/Configuration/ConfigurationState.cs b/src/Ryujinx/Utilities/Configuration/ConfigurationState.cs index 01534bec8..95ec62e83 100644 --- a/src/Ryujinx/Utilities/Configuration/ConfigurationState.cs +++ b/src/Ryujinx/Utilities/Configuration/ConfigurationState.cs @@ -7,6 +7,7 @@ using Ryujinx.Common.Configuration.Multiplayer; using Ryujinx.Graphics.Vulkan; using Ryujinx.HLE; using System; +using System.Linq; namespace Ryujinx.Ava.Utilities.Configuration { @@ -139,7 +140,7 @@ namespace Ryujinx.Ava.Utilities.Configuration MultiplayerLdnPassphrase = Multiplayer.LdnPassphrase, LdnServer = Multiplayer.LdnServer, ShowDirtyHacks = Hacks.ShowDirtyHacks, - EnabledDirtyHacks = (int)Hacks.EnabledHacks, + DirtyHacks = Hacks.EnabledHacks.Select(it => it.Pack()).ToArray(), }; return configurationFile; From 42a739d34cefdd220e95d0046efc514fd4911c5b Mon Sep 17 00:00:00 2001 From: Evan Husted Date: Sun, 29 Dec 2024 22:21:09 -0600 Subject: [PATCH 60/60] misc: Expose DirtyHacks on GpuContext --- src/Ryujinx.Graphics.Gpu/GpuContext.cs | 8 +++++++- src/Ryujinx.HLE/Switch.cs | 5 +++-- 2 files changed, 10 insertions(+), 3 deletions(-) diff --git a/src/Ryujinx.Graphics.Gpu/GpuContext.cs b/src/Ryujinx.Graphics.Gpu/GpuContext.cs index fb529e914..84bc0b9a9 100644 --- a/src/Ryujinx.Graphics.Gpu/GpuContext.cs +++ b/src/Ryujinx.Graphics.Gpu/GpuContext.cs @@ -1,4 +1,5 @@ using Ryujinx.Common; +using Ryujinx.Common.Configuration; using Ryujinx.Graphics.Device; using Ryujinx.Graphics.GAL; using Ryujinx.Graphics.Gpu.Engine.GPFifo; @@ -90,6 +91,9 @@ namespace Ryujinx.Graphics.Gpu /// Support buffer updater. /// internal SupportBufferUpdater SupportBufferUpdater { get; } + + internal DirtyHackCollection DirtyHacks { get; } + /// /// Host hardware capabilities. @@ -113,7 +117,7 @@ namespace Ryujinx.Graphics.Gpu /// Creates a new instance of the GPU emulation context. /// /// Host renderer - public GpuContext(IRenderer renderer) + public GpuContext(IRenderer renderer, DirtyHackCollection hackCollection) { Renderer = renderer; @@ -136,6 +140,8 @@ namespace Ryujinx.Graphics.Gpu SupportBufferUpdater = new SupportBufferUpdater(renderer); + DirtyHacks = hackCollection; + _firstTimestamp = ConvertNanosecondsToTicks((ulong)PerformanceCounter.ElapsedNanoseconds); } diff --git a/src/Ryujinx.HLE/Switch.cs b/src/Ryujinx.HLE/Switch.cs index ed1cc02d3..127e532e2 100644 --- a/src/Ryujinx.HLE/Switch.cs +++ b/src/Ryujinx.HLE/Switch.cs @@ -57,9 +57,10 @@ namespace Ryujinx.HLE : MemoryAllocationFlags.Reserve | MemoryAllocationFlags.Mirrorable; #pragma warning disable IDE0055 // Disable formatting + DirtyHacks = new DirtyHackCollection(Configuration.Hacks); AudioDeviceDriver = new CompatLayerHardwareDeviceDriver(Configuration.AudioDeviceDriver); Memory = new MemoryBlock(Configuration.MemoryConfiguration.ToDramSize(), memoryAllocationFlags); - Gpu = new GpuContext(Configuration.GpuRenderer); + Gpu = new GpuContext(Configuration.GpuRenderer, DirtyHacks); System = new HOS.Horizon(this); Statistics = new PerformanceStatistics(); Hid = new Hid(this, System.HidStorage); @@ -77,7 +78,7 @@ namespace Ryujinx.HLE System.EnablePtc = Configuration.EnablePtc; System.FsIntegrityCheckLevel = Configuration.FsIntegrityCheckLevel; System.GlobalAccessLogMode = Configuration.FsGlobalAccessLogMode; - DirtyHacks = new DirtyHackCollection(Configuration.Hacks); + UpdateVSyncInterval(); #pragma warning restore IDE0055