mirror of
https://git.ryujinx.app/ryubing/ryujinx.git
synced 2025-09-12 13:05:26 +00:00
Compare commits
8 Commits
Canary-1.2
...
Canary-1.2
Author | SHA1 | Date | |
---|---|---|---|
|
15c20920b3 | ||
|
285ee276b6 | ||
|
617b81e209 | ||
|
eb6ce7bcb3 | ||
|
69f75f2df1 | ||
|
10c8d73b60 | ||
|
e01a30016e | ||
|
e26625dfd5 |
@@ -1,11 +1,13 @@
|
||||
using Ryujinx.Common.Logging;
|
||||
using System;
|
||||
using System.Globalization;
|
||||
using System.Threading;
|
||||
|
||||
namespace Ryujinx.Common
|
||||
{
|
||||
public class ReactiveObject<T>
|
||||
{
|
||||
private readonly ReaderWriterLockSlim _readerWriterLock = new();
|
||||
private readonly ReaderWriterLockSlim _rwLock = new();
|
||||
private bool _isInitialized;
|
||||
private T _value;
|
||||
|
||||
@@ -15,15 +17,15 @@ namespace Ryujinx.Common
|
||||
{
|
||||
get
|
||||
{
|
||||
_readerWriterLock.EnterReadLock();
|
||||
_rwLock.EnterReadLock();
|
||||
T value = _value;
|
||||
_readerWriterLock.ExitReadLock();
|
||||
_rwLock.ExitReadLock();
|
||||
|
||||
return value;
|
||||
}
|
||||
set
|
||||
{
|
||||
_readerWriterLock.EnterWriteLock();
|
||||
_rwLock.EnterWriteLock();
|
||||
|
||||
T oldValue = _value;
|
||||
|
||||
@@ -32,7 +34,7 @@ namespace Ryujinx.Common
|
||||
_isInitialized = true;
|
||||
_value = value;
|
||||
|
||||
_readerWriterLock.ExitWriteLock();
|
||||
_rwLock.ExitWriteLock();
|
||||
|
||||
if (!oldIsInitialized || oldValue == null || !oldValue.Equals(_value))
|
||||
{
|
||||
@@ -40,12 +42,22 @@ namespace Ryujinx.Common
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public void LogChangesToValue(string valueName, LogClass logClass = LogClass.Configuration)
|
||||
=> Event += (_, e) => ReactiveObjectHelper.LogValueChange(logClass, e, valueName);
|
||||
|
||||
public static implicit operator T(ReactiveObject<T> obj) => obj.Value;
|
||||
}
|
||||
|
||||
public static class ReactiveObjectHelper
|
||||
{
|
||||
public static void LogValueChange<T>(LogClass logClass, ReactiveEventArgs<T> eventArgs, string valueName)
|
||||
{
|
||||
string message = string.Create(CultureInfo.InvariantCulture, $"{valueName} set to: {eventArgs.NewValue}");
|
||||
|
||||
Logger.Info?.Print(logClass, message);
|
||||
}
|
||||
|
||||
public static void Toggle(this ReactiveObject<bool> rBoolean) => rBoolean.Value = !rBoolean.Value;
|
||||
}
|
||||
|
||||
|
@@ -2463,7 +2463,7 @@ namespace Ryujinx.HLE.HOS.Diagnostics.Demangler
|
||||
return ParseIntegerLiteral("unsigned short");
|
||||
case 'i':
|
||||
_position++;
|
||||
return ParseIntegerLiteral("");
|
||||
return ParseIntegerLiteral(string.Empty);
|
||||
case 'j':
|
||||
_position++;
|
||||
return ParseIntegerLiteral("u");
|
||||
|
@@ -116,18 +116,13 @@ namespace Ryujinx.HLE.HOS
|
||||
private readonly Dictionary<ulong, ModCache> _appMods; // key is ApplicationId
|
||||
private PatchCache _patches;
|
||||
|
||||
private static readonly EnumerationOptions _dirEnumOptions;
|
||||
|
||||
static ModLoader()
|
||||
private static readonly EnumerationOptions _dirEnumOptions = new()
|
||||
{
|
||||
_dirEnumOptions = new EnumerationOptions
|
||||
{
|
||||
MatchCasing = MatchCasing.CaseInsensitive,
|
||||
MatchType = MatchType.Simple,
|
||||
RecurseSubdirectories = false,
|
||||
ReturnSpecialDirectories = false,
|
||||
};
|
||||
}
|
||||
MatchCasing = MatchCasing.CaseInsensitive,
|
||||
MatchType = MatchType.Simple,
|
||||
RecurseSubdirectories = false,
|
||||
ReturnSpecialDirectories = false,
|
||||
};
|
||||
|
||||
public ModLoader()
|
||||
{
|
||||
@@ -169,7 +164,7 @@ namespace Ryujinx.HLE.HOS
|
||||
foreach (var modDir in dir.EnumerateDirectories())
|
||||
{
|
||||
types.Clear();
|
||||
Mod<DirectoryInfo> mod = new("", null, true);
|
||||
Mod<DirectoryInfo> mod = new(string.Empty, null, true);
|
||||
|
||||
if (StrEquals(RomfsDir, modDir.Name))
|
||||
{
|
||||
|
@@ -13,8 +13,6 @@ using Ryujinx.UI.Common.Configuration.UI;
|
||||
using Ryujinx.UI.Common.Helper;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Globalization;
|
||||
using System.Text.Json.Nodes;
|
||||
|
||||
namespace Ryujinx.UI.Common.Configuration
|
||||
{
|
||||
@@ -201,7 +199,7 @@ namespace Ryujinx.UI.Common.Configuration
|
||||
IsAscendingOrder = new ReactiveObject<bool>();
|
||||
LanguageCode = new ReactiveObject<string>();
|
||||
ShowConsole = new ReactiveObject<bool>();
|
||||
ShowConsole.Event += static (s, e) => { ConsoleHelper.SetConsoleWindowState(e.NewValue); };
|
||||
ShowConsole.Event += static (_, e) => ConsoleHelper.SetConsoleWindowState(e.NewValue);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -268,6 +266,7 @@ namespace Ryujinx.UI.Common.Configuration
|
||||
public LoggerSection()
|
||||
{
|
||||
EnableDebug = new ReactiveObject<bool>();
|
||||
EnableDebug.LogChangesToValue(nameof(EnableDebug));
|
||||
EnableStub = new ReactiveObject<bool>();
|
||||
EnableInfo = new ReactiveObject<bool>();
|
||||
EnableWarn = new ReactiveObject<bool>();
|
||||
@@ -277,7 +276,7 @@ namespace Ryujinx.UI.Common.Configuration
|
||||
EnableFsAccessLog = new ReactiveObject<bool>();
|
||||
FilteredClasses = new ReactiveObject<LogClass[]>();
|
||||
EnableFileLog = new ReactiveObject<bool>();
|
||||
EnableFileLog.Event += static (sender, e) => LogValueChange(e, nameof(EnableFileLog));
|
||||
EnableFileLog.LogChangesToValue(nameof(EnableFileLog));
|
||||
GraphicsDebugLevel = new ReactiveObject<GraphicsDebugLevel>();
|
||||
}
|
||||
}
|
||||
@@ -370,33 +369,37 @@ namespace Ryujinx.UI.Common.Configuration
|
||||
public SystemSection()
|
||||
{
|
||||
Language = new ReactiveObject<Language>();
|
||||
Language.LogChangesToValue(nameof(Language));
|
||||
Region = new ReactiveObject<Region>();
|
||||
Region.LogChangesToValue(nameof(Region));
|
||||
TimeZone = new ReactiveObject<string>();
|
||||
TimeZone.LogChangesToValue(nameof(TimeZone));
|
||||
SystemTimeOffset = new ReactiveObject<long>();
|
||||
SystemTimeOffset.LogChangesToValue(nameof(SystemTimeOffset));
|
||||
EnableDockedMode = new ReactiveObject<bool>();
|
||||
EnableDockedMode.Event += static (sender, e) => LogValueChange(e, nameof(EnableDockedMode));
|
||||
EnableDockedMode.LogChangesToValue(nameof(EnableDockedMode));
|
||||
EnablePtc = new ReactiveObject<bool>();
|
||||
EnablePtc.Event += static (sender, e) => LogValueChange(e, nameof(EnablePtc));
|
||||
EnablePtc.LogChangesToValue(nameof(EnablePtc));
|
||||
EnableLowPowerPtc = new ReactiveObject<bool>();
|
||||
EnableLowPowerPtc.Event += static (sender, e) => LogValueChange(e, nameof(EnableLowPowerPtc));
|
||||
EnableLowPowerPtc.LogChangesToValue(nameof(EnableLowPowerPtc));
|
||||
EnableInternetAccess = new ReactiveObject<bool>();
|
||||
EnableInternetAccess.Event += static (sender, e) => LogValueChange(e, nameof(EnableInternetAccess));
|
||||
EnableInternetAccess.LogChangesToValue(nameof(EnableInternetAccess));
|
||||
EnableFsIntegrityChecks = new ReactiveObject<bool>();
|
||||
EnableFsIntegrityChecks.Event += static (sender, e) => LogValueChange(e, nameof(EnableFsIntegrityChecks));
|
||||
EnableFsIntegrityChecks.LogChangesToValue(nameof(EnableFsIntegrityChecks));
|
||||
FsGlobalAccessLogMode = new ReactiveObject<int>();
|
||||
FsGlobalAccessLogMode.Event += static (sender, e) => LogValueChange(e, nameof(FsGlobalAccessLogMode));
|
||||
FsGlobalAccessLogMode.LogChangesToValue(nameof(FsGlobalAccessLogMode));
|
||||
AudioBackend = new ReactiveObject<AudioBackend>();
|
||||
AudioBackend.Event += static (sender, e) => LogValueChange(e, nameof(AudioBackend));
|
||||
AudioBackend.LogChangesToValue(nameof(AudioBackend));
|
||||
MemoryManagerMode = new ReactiveObject<MemoryManagerMode>();
|
||||
MemoryManagerMode.Event += static (sender, e) => LogValueChange(e, nameof(MemoryManagerMode));
|
||||
MemoryManagerMode.LogChangesToValue(nameof(MemoryManagerMode));
|
||||
DramSize = new ReactiveObject<MemoryConfiguration>();
|
||||
DramSize.Event += static (sender, e) => LogValueChange(e, nameof(DramSize));
|
||||
DramSize.LogChangesToValue(nameof(DramSize));
|
||||
IgnoreMissingServices = new ReactiveObject<bool>();
|
||||
IgnoreMissingServices.Event += static (sender, e) => LogValueChange(e, nameof(IgnoreMissingServices));
|
||||
IgnoreMissingServices.LogChangesToValue(nameof(IgnoreMissingServices));
|
||||
AudioVolume = new ReactiveObject<float>();
|
||||
AudioVolume.Event += static (sender, e) => LogValueChange(e, nameof(AudioVolume));
|
||||
AudioVolume.LogChangesToValue(nameof(AudioVolume));
|
||||
UseHypervisor = new ReactiveObject<bool>();
|
||||
UseHypervisor.Event += static (sender, e) => LogValueChange(e, nameof(UseHypervisor));
|
||||
UseHypervisor.LogChangesToValue(nameof(UseHypervisor));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -524,36 +527,36 @@ namespace Ryujinx.UI.Common.Configuration
|
||||
public GraphicsSection()
|
||||
{
|
||||
BackendThreading = new ReactiveObject<BackendThreading>();
|
||||
BackendThreading.Event += static (_, e) => LogValueChange(e, nameof(BackendThreading));
|
||||
BackendThreading.LogChangesToValue(nameof(BackendThreading));
|
||||
ResScale = new ReactiveObject<int>();
|
||||
ResScale.Event += static (_, e) => LogValueChange(e, nameof(ResScale));
|
||||
ResScale.LogChangesToValue(nameof(ResScale));
|
||||
ResScaleCustom = new ReactiveObject<float>();
|
||||
ResScaleCustom.Event += static (_, e) => LogValueChange(e, nameof(ResScaleCustom));
|
||||
ResScaleCustom.LogChangesToValue(nameof(ResScaleCustom));
|
||||
MaxAnisotropy = new ReactiveObject<float>();
|
||||
MaxAnisotropy.Event += static (_, e) => LogValueChange(e, nameof(MaxAnisotropy));
|
||||
MaxAnisotropy.LogChangesToValue(nameof(MaxAnisotropy));
|
||||
AspectRatio = new ReactiveObject<AspectRatio>();
|
||||
AspectRatio.Event += static (_, e) => LogValueChange(e, nameof(AspectRatio));
|
||||
AspectRatio.LogChangesToValue(nameof(AspectRatio));
|
||||
ShadersDumpPath = new ReactiveObject<string>();
|
||||
EnableVsync = new ReactiveObject<bool>();
|
||||
EnableVsync.Event += static (_, e) => LogValueChange(e, nameof(EnableVsync));
|
||||
EnableVsync.LogChangesToValue(nameof(EnableVsync));
|
||||
EnableShaderCache = new ReactiveObject<bool>();
|
||||
EnableShaderCache.Event += static (_, e) => LogValueChange(e, nameof(EnableShaderCache));
|
||||
EnableShaderCache.LogChangesToValue(nameof(EnableShaderCache));
|
||||
EnableTextureRecompression = new ReactiveObject<bool>();
|
||||
EnableTextureRecompression.Event += static (_, e) => LogValueChange(e, nameof(EnableTextureRecompression));
|
||||
EnableTextureRecompression.LogChangesToValue(nameof(EnableTextureRecompression));
|
||||
GraphicsBackend = new ReactiveObject<GraphicsBackend>();
|
||||
GraphicsBackend.Event += static (_, e) => LogValueChange(e, nameof(GraphicsBackend));
|
||||
GraphicsBackend.LogChangesToValue(nameof(GraphicsBackend));
|
||||
PreferredGpu = new ReactiveObject<string>();
|
||||
PreferredGpu.Event += static (_, e) => LogValueChange(e, nameof(PreferredGpu));
|
||||
PreferredGpu.LogChangesToValue(nameof(PreferredGpu));
|
||||
EnableMacroHLE = new ReactiveObject<bool>();
|
||||
EnableMacroHLE.Event += static (_, e) => LogValueChange(e, nameof(EnableMacroHLE));
|
||||
EnableMacroHLE.LogChangesToValue(nameof(EnableMacroHLE));
|
||||
EnableColorSpacePassthrough = new ReactiveObject<bool>();
|
||||
EnableColorSpacePassthrough.Event += static (_, e) => LogValueChange(e, nameof(EnableColorSpacePassthrough));
|
||||
EnableColorSpacePassthrough.LogChangesToValue(nameof(EnableColorSpacePassthrough));
|
||||
AntiAliasing = new ReactiveObject<AntiAliasing>();
|
||||
AntiAliasing.Event += static (_, e) => LogValueChange(e, nameof(AntiAliasing));
|
||||
AntiAliasing.LogChangesToValue(nameof(AntiAliasing));
|
||||
ScalingFilter = new ReactiveObject<ScalingFilter>();
|
||||
ScalingFilter.Event += static (_, e) => LogValueChange(e, nameof(ScalingFilter));
|
||||
ScalingFilter.LogChangesToValue(nameof(ScalingFilter));
|
||||
ScalingFilterLevel = new ReactiveObject<int>();
|
||||
ScalingFilterLevel.Event += static (_, e) => LogValueChange(e, nameof(ScalingFilterLevel));
|
||||
ScalingFilterLevel.LogChangesToValue(nameof(ScalingFilterLevel));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -576,7 +579,7 @@ namespace Ryujinx.UI.Common.Configuration
|
||||
{
|
||||
LanInterfaceId = new ReactiveObject<string>();
|
||||
Mode = new ReactiveObject<MultiplayerMode>();
|
||||
Mode.Event += static (_, e) => LogValueChange(e, nameof(MultiplayerMode));
|
||||
Mode.LogChangesToValue(nameof(MultiplayerMode));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -667,6 +670,7 @@ namespace Ryujinx.UI.Common.Configuration
|
||||
CheckUpdatesOnStart = new ReactiveObject<bool>();
|
||||
ShowConfirmExit = new ReactiveObject<bool>();
|
||||
IgnoreApplet = new ReactiveObject<bool>();
|
||||
IgnoreApplet.LogChangesToValue(nameof(IgnoreApplet));
|
||||
RememberWindowState = new ReactiveObject<bool>();
|
||||
ShowTitleBar = new ReactiveObject<bool>();
|
||||
EnableHardwareAcceleration = new ReactiveObject<bool>();
|
||||
@@ -1654,13 +1658,6 @@ namespace Ryujinx.UI.Common.Configuration
|
||||
return GraphicsBackend.OpenGl;
|
||||
}
|
||||
|
||||
private static void LogValueChange<T>(ReactiveEventArgs<T> eventArgs, string valueName)
|
||||
{
|
||||
string message = string.Create(CultureInfo.InvariantCulture, $"{valueName} set to: {eventArgs.NewValue}");
|
||||
|
||||
Ryujinx.Common.Logging.Logger.Info?.Print(LogClass.Configuration, message);
|
||||
}
|
||||
|
||||
public static void Initialize()
|
||||
{
|
||||
if (Instance != null)
|
||||
|
@@ -163,6 +163,7 @@ namespace Ryujinx.UI.Common
|
||||
"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
|
||||
|
@@ -4,6 +4,7 @@ using Ryujinx.Common.Logging;
|
||||
using System;
|
||||
using System.Diagnostics;
|
||||
using System.IO;
|
||||
using System.Linq;
|
||||
using System.Runtime.InteropServices;
|
||||
using System.Runtime.Versioning;
|
||||
|
||||
@@ -23,6 +24,26 @@ namespace Ryujinx.UI.Common.Helper
|
||||
public static partial void SHChangeNotify(uint wEventId, uint uFlags, nint dwItem1, nint dwItem2);
|
||||
|
||||
public static bool IsTypeAssociationSupported => (OperatingSystem.IsLinux() || OperatingSystem.IsWindows()) && !ReleaseInformation.IsFlatHubBuild;
|
||||
|
||||
public static bool AreMimeTypesRegistered
|
||||
{
|
||||
get
|
||||
{
|
||||
if (OperatingSystem.IsLinux())
|
||||
{
|
||||
return AreMimeTypesRegisteredLinux();
|
||||
}
|
||||
|
||||
if (OperatingSystem.IsWindows())
|
||||
{
|
||||
return AreMimeTypesRegisteredWindows();
|
||||
}
|
||||
|
||||
// TODO: Add macOS support.
|
||||
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
[SupportedOSPlatform("linux")]
|
||||
private static bool AreMimeTypesRegisteredLinux() => File.Exists(Path.Combine(_mimeDbPath, "packages", "Ryujinx.xml"));
|
||||
@@ -72,6 +93,10 @@ namespace Ryujinx.UI.Common.Helper
|
||||
[SupportedOSPlatform("windows")]
|
||||
private static bool AreMimeTypesRegisteredWindows()
|
||||
{
|
||||
return _fileExtensions.Aggregate(false,
|
||||
(current, ext) => current | CheckRegistering(ext)
|
||||
);
|
||||
|
||||
static bool CheckRegistering(string ext)
|
||||
{
|
||||
RegistryKey key = Registry.CurrentUser.OpenSubKey(@$"Software\Classes\{ext}");
|
||||
@@ -87,20 +112,20 @@ namespace Ryujinx.UI.Common.Helper
|
||||
|
||||
return keyValue is not null && (keyValue.Contains("Ryujinx") || keyValue.Contains(AppDomain.CurrentDomain.FriendlyName));
|
||||
}
|
||||
|
||||
bool registered = false;
|
||||
|
||||
foreach (string ext in _fileExtensions)
|
||||
{
|
||||
registered |= CheckRegistering(ext);
|
||||
}
|
||||
|
||||
return registered;
|
||||
}
|
||||
|
||||
[SupportedOSPlatform("windows")]
|
||||
private static bool InstallWindowsMimeTypes(bool uninstall = false)
|
||||
{
|
||||
bool registered = _fileExtensions.Aggregate(false,
|
||||
(current, ext) => current | RegisterExtension(ext, uninstall)
|
||||
);
|
||||
|
||||
// Notify Explorer the file association has been changed.
|
||||
SHChangeNotify(SHCNE_ASSOCCHANGED, SHCNF_FLUSH, nint.Zero, nint.Zero);
|
||||
|
||||
return registered;
|
||||
|
||||
static bool RegisterExtension(string ext, bool uninstall = false)
|
||||
{
|
||||
string keyString = @$"Software\Classes\{ext}";
|
||||
@@ -127,42 +152,13 @@ namespace Ryujinx.UI.Common.Helper
|
||||
|
||||
Logger.Debug?.Print(LogClass.Application, $"Adding type association {ext}");
|
||||
using var openCmd = key.CreateSubKey(@"shell\open\command");
|
||||
openCmd.SetValue("", $"\"{Environment.ProcessPath}\" \"%1\"");
|
||||
openCmd.SetValue(string.Empty, $"\"{Environment.ProcessPath}\" \"%1\"");
|
||||
Logger.Debug?.Print(LogClass.Application, $"Added type association {ext}");
|
||||
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
bool registered = false;
|
||||
|
||||
foreach (string ext in _fileExtensions)
|
||||
{
|
||||
registered |= RegisterExtension(ext, uninstall);
|
||||
}
|
||||
|
||||
// Notify Explorer the file association has been changed.
|
||||
SHChangeNotify(SHCNE_ASSOCCHANGED, SHCNF_FLUSH, nint.Zero, nint.Zero);
|
||||
|
||||
return registered;
|
||||
}
|
||||
|
||||
public static bool AreMimeTypesRegistered()
|
||||
{
|
||||
if (OperatingSystem.IsLinux())
|
||||
{
|
||||
return AreMimeTypesRegisteredLinux();
|
||||
}
|
||||
|
||||
if (OperatingSystem.IsWindows())
|
||||
{
|
||||
return AreMimeTypesRegisteredWindows();
|
||||
}
|
||||
|
||||
// TODO: Add macOS support.
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
public static bool Install()
|
||||
|
@@ -43,8 +43,8 @@ namespace Ryujinx.UI.Common.Models
|
||||
{
|
||||
if (obj == null)
|
||||
return false;
|
||||
else
|
||||
return this.Path == obj.Path;
|
||||
|
||||
return this.Path == obj.Path;
|
||||
}
|
||||
|
||||
public override int GetHashCode()
|
||||
|
@@ -407,6 +407,7 @@
|
||||
"AvatarSetBackgroundColor": "تعيين لون الخلفية",
|
||||
"AvatarClose": "إغلاق",
|
||||
"ControllerSettingsLoadProfileToolTip": "تحميل الملف الشخصي",
|
||||
"ControllerSettingsViewProfileToolTip": "View Profile",
|
||||
"ControllerSettingsAddProfileToolTip": "إضافة ملف شخصي",
|
||||
"ControllerSettingsRemoveProfileToolTip": "إزالة الملف الشخصي",
|
||||
"ControllerSettingsSaveProfileToolTip": "حفظ الملف الشخصي",
|
||||
@@ -437,7 +438,7 @@
|
||||
"DialogMessageFindSaveErrorMessage": "حدث خطأ أثناء البحث عن بيانات الحفظ المحددة: {0}",
|
||||
"FolderDialogExtractTitle": "اختر المجلد الذي تريد الاستخراج إليه",
|
||||
"DialogNcaExtractionMessage": "استخراج قسم {0} من {1}...",
|
||||
"DialogNcaExtractionTitle": "ريوجينكس - مستخرج قسم NCA",
|
||||
"DialogNcaExtractionTitle": "مستخرج قسم NCA",
|
||||
"DialogNcaExtractionMainNcaNotFoundErrorMessage": "فشل الاستخراج. لم يكن NCA الرئيسي موجودا في الملف المحدد.",
|
||||
"DialogNcaExtractionCheckLogErrorMessage": "فشل الاستخراج. اقرأ ملف التسجيل لمزيد من المعلومات.",
|
||||
"DialogNcaExtractionSuccessMessage": "تم الاستخراج بنجاح.",
|
||||
|
@@ -407,6 +407,7 @@
|
||||
"AvatarSetBackgroundColor": "Hintergrundfarbe auswählen",
|
||||
"AvatarClose": "Schließen",
|
||||
"ControllerSettingsLoadProfileToolTip": "Lädt ein Profil",
|
||||
"ControllerSettingsViewProfileToolTip": "View Profile",
|
||||
"ControllerSettingsAddProfileToolTip": "Fügt ein Profil hinzu",
|
||||
"ControllerSettingsRemoveProfileToolTip": "Entfernt ein Profil",
|
||||
"ControllerSettingsSaveProfileToolTip": "Speichert ein Profil",
|
||||
@@ -437,7 +438,7 @@
|
||||
"DialogMessageFindSaveErrorMessage": "Es ist ein Fehler beim Suchen der angegebenen Speicherdaten aufgetreten: {0}",
|
||||
"FolderDialogExtractTitle": "Wähle den Ordner, in welchen die Dateien entpackt werden sollen",
|
||||
"DialogNcaExtractionMessage": "Extrahiert {0} abschnitt von {1}...",
|
||||
"DialogNcaExtractionTitle": "Ryujinx - NCA-Abschnitt-Extraktor",
|
||||
"DialogNcaExtractionTitle": "NCA-Abschnitt-Extraktor",
|
||||
"DialogNcaExtractionMainNcaNotFoundErrorMessage": "Extraktion fehlgeschlagen. Der Hauptheader der NCA war in der ausgewählten Datei nicht vorhanden.",
|
||||
"DialogNcaExtractionCheckLogErrorMessage": "Extraktion fehlgeschlagen. Überprüfe die Logs für weitere Informationen.",
|
||||
"DialogNcaExtractionSuccessMessage": "Extraktion erfolgreich abgeschlossen.",
|
||||
|
@@ -407,6 +407,7 @@
|
||||
"AvatarSetBackgroundColor": "Ορισμός Χρώματος Φόντου",
|
||||
"AvatarClose": "Κλείσιμο",
|
||||
"ControllerSettingsLoadProfileToolTip": "Φόρτωση Προφίλ",
|
||||
"ControllerSettingsViewProfileToolTip": "View Profile",
|
||||
"ControllerSettingsAddProfileToolTip": "Προσθήκη Προφίλ",
|
||||
"ControllerSettingsRemoveProfileToolTip": "Κατάργηση Προφίλ",
|
||||
"ControllerSettingsSaveProfileToolTip": "Αποθήκευση Προφίλ",
|
||||
@@ -437,7 +438,7 @@
|
||||
"DialogMessageFindSaveErrorMessage": "Σφάλμα κατά την εύρεση των αποθηκευμένων δεδομένων: {0}",
|
||||
"FolderDialogExtractTitle": "Επιλέξτε τον φάκελο στον οποίο θέλετε να εξαγάγετε",
|
||||
"DialogNcaExtractionMessage": "Εξαγωγή ενότητας {0} από {1}...",
|
||||
"DialogNcaExtractionTitle": "Ryujinx - NCA Εξαγωγέας Τμημάτων",
|
||||
"DialogNcaExtractionTitle": "NCA Εξαγωγέας Τμημάτων",
|
||||
"DialogNcaExtractionMainNcaNotFoundErrorMessage": "Αποτυχία εξαγωγής. Η κύρια NCA δεν υπήρχε στο επιλεγμένο αρχείο.",
|
||||
"DialogNcaExtractionCheckLogErrorMessage": "Αποτυχία εξαγωγής. Διαβάστε το αρχείο καταγραφής για περισσότερες πληροφορίες.",
|
||||
"DialogNcaExtractionSuccessMessage": "Η εξαγωγή ολοκληρώθηκε με επιτυχία.",
|
||||
|
@@ -444,7 +444,7 @@
|
||||
"DialogMessageFindSaveErrorMessage": "There was an error finding the specified savedata: {0}",
|
||||
"FolderDialogExtractTitle": "Choose the folder to extract into",
|
||||
"DialogNcaExtractionMessage": "Extracting {0} section from {1}...",
|
||||
"DialogNcaExtractionTitle": "Ryujinx - NCA Section Extractor",
|
||||
"DialogNcaExtractionTitle": "NCA Section Extractor",
|
||||
"DialogNcaExtractionMainNcaNotFoundErrorMessage": "Extraction failure. The main NCA was not present in the selected file.",
|
||||
"DialogNcaExtractionCheckLogErrorMessage": "Extraction failed. Please check the log file for more details.",
|
||||
"DialogNcaExtractionSuccessMessage": "Extraction completed successfully.",
|
||||
@@ -461,7 +461,7 @@
|
||||
"DialogUpdaterRestartMessage": "Do you want to restart Ryujinx now?",
|
||||
"DialogUpdaterNoInternetMessage": "You are not connected to the Internet!",
|
||||
"DialogUpdaterNoInternetSubMessage": "Please verify that you have a working Internet connection!",
|
||||
"DialogUpdaterDirtyBuildMessage": "You Cannot update a Dirty build of Ryujinx!",
|
||||
"DialogUpdaterDirtyBuildMessage": "You cannot update a Dirty build of Ryujinx!",
|
||||
"DialogUpdaterDirtyBuildSubMessage": "Please download Ryujinx at https://github.com/GreemDev/Ryujinx/releases/ if you are looking for a supported version.",
|
||||
"DialogRestartRequiredMessage": "Restart Required",
|
||||
"DialogThemeRestartMessage": "Theme has been saved. A restart is needed to apply the theme.",
|
||||
|
@@ -407,6 +407,7 @@
|
||||
"AvatarSetBackgroundColor": "Establecer color de fondo",
|
||||
"AvatarClose": "Cerrar",
|
||||
"ControllerSettingsLoadProfileToolTip": "Cargar perfil",
|
||||
"ControllerSettingsViewProfileToolTip": "View Profile",
|
||||
"ControllerSettingsAddProfileToolTip": "Agregar perfil",
|
||||
"ControllerSettingsRemoveProfileToolTip": "Eliminar perfil",
|
||||
"ControllerSettingsSaveProfileToolTip": "Guardar perfil",
|
||||
@@ -437,7 +438,7 @@
|
||||
"DialogMessageFindSaveErrorMessage": "Hubo un error encontrando los datos de guardado especificados: {0}",
|
||||
"FolderDialogExtractTitle": "Elige la carpeta en la que deseas extraer",
|
||||
"DialogNcaExtractionMessage": "Extrayendo {0} sección de {1}...",
|
||||
"DialogNcaExtractionTitle": "Ryujinx - Extractor de sección NCA",
|
||||
"DialogNcaExtractionTitle": "Extractor de sección NCA",
|
||||
"DialogNcaExtractionMainNcaNotFoundErrorMessage": "Fallo de extracción. El NCA principal no estaba presente en el archivo seleccionado.",
|
||||
"DialogNcaExtractionCheckLogErrorMessage": "Fallo de extracción. Lee el registro para más información.",
|
||||
"DialogNcaExtractionSuccessMessage": "Se completó la extracción con éxito.",
|
||||
|
@@ -408,6 +408,7 @@
|
||||
"AvatarClose": "Fermer",
|
||||
"ControllerSettingsLoadProfileToolTip": "Charger un profil",
|
||||
"ControllerSettingsAddProfileToolTip": "Ajouter un profil",
|
||||
"ControllerSettingsViewProfileToolTip": "View Profile",
|
||||
"ControllerSettingsRemoveProfileToolTip": "Supprimer un profil",
|
||||
"ControllerSettingsSaveProfileToolTip": "Enregistrer un profil",
|
||||
"MenuBarFileToolsTakeScreenshot": "Prendre une capture d'écran",
|
||||
@@ -437,7 +438,7 @@
|
||||
"DialogMessageFindSaveErrorMessage": "Une erreur s'est produite lors de la recherche de la sauvegarde spécifiée : {0}",
|
||||
"FolderDialogExtractTitle": "Choisissez le dossier dans lequel extraire",
|
||||
"DialogNcaExtractionMessage": "Extraction de la section {0} depuis {1}...",
|
||||
"DialogNcaExtractionTitle": "Ryujinx - Extracteur de la section NCA",
|
||||
"DialogNcaExtractionTitle": "Extracteur de la section NCA",
|
||||
"DialogNcaExtractionMainNcaNotFoundErrorMessage": "Échec de l'extraction. Le NCA principal n'était pas présent dans le fichier sélectionné.",
|
||||
"DialogNcaExtractionCheckLogErrorMessage": "Échec de l'extraction. Lisez le fichier journal pour plus d'informations.",
|
||||
"DialogNcaExtractionSuccessMessage": "Extraction terminée avec succès.",
|
||||
|
@@ -407,6 +407,7 @@
|
||||
"AvatarSetBackgroundColor": "הגדר צבע רקע",
|
||||
"AvatarClose": "סגור",
|
||||
"ControllerSettingsLoadProfileToolTip": "טען פרופיל",
|
||||
"ControllerSettingsViewProfileToolTip": "View Profile",
|
||||
"ControllerSettingsAddProfileToolTip": "הוסף פרופיל",
|
||||
"ControllerSettingsRemoveProfileToolTip": "הסר פרופיל",
|
||||
"ControllerSettingsSaveProfileToolTip": "שמור פרופיל",
|
||||
@@ -437,7 +438,7 @@
|
||||
"DialogMessageFindSaveErrorMessage": "אירעה שגיאה במציאת שמור המשחק שצויין: {0}",
|
||||
"FolderDialogExtractTitle": "בחרו את התיקייה לחילוץ",
|
||||
"DialogNcaExtractionMessage": "מלחץ {0} ממקטע {1}...",
|
||||
"DialogNcaExtractionTitle": "ריוג'ינקס - מחלץ מקטע NCA",
|
||||
"DialogNcaExtractionTitle": "מחלץ מקטע NCA",
|
||||
"DialogNcaExtractionMainNcaNotFoundErrorMessage": "כשל בחילוץ. ה-NCA הראשי לא היה קיים בקובץ שנבחר.",
|
||||
"DialogNcaExtractionCheckLogErrorMessage": "כשל בחילוץ. קרא את קובץ הרישום למידע נוסף.",
|
||||
"DialogNcaExtractionSuccessMessage": "החילוץ הושלם בהצלחה.",
|
||||
|
@@ -407,6 +407,7 @@
|
||||
"AvatarSetBackgroundColor": "Imposta colore di sfondo",
|
||||
"AvatarClose": "Chiudi",
|
||||
"ControllerSettingsLoadProfileToolTip": "Carica profilo",
|
||||
"ControllerSettingsViewProfileToolTip": "View Profile",
|
||||
"ControllerSettingsAddProfileToolTip": "Aggiungi profilo",
|
||||
"ControllerSettingsRemoveProfileToolTip": "Rimuovi profilo",
|
||||
"ControllerSettingsSaveProfileToolTip": "Salva profilo",
|
||||
@@ -437,7 +438,7 @@
|
||||
"DialogMessageFindSaveErrorMessage": "C'è stato un errore durante la ricerca dei dati di salvataggio: {0}",
|
||||
"FolderDialogExtractTitle": "Scegli una cartella in cui estrarre",
|
||||
"DialogNcaExtractionMessage": "Estrazione della sezione {0} da {1}...",
|
||||
"DialogNcaExtractionTitle": "Ryujinx - Estrazione sezione NCA",
|
||||
"DialogNcaExtractionTitle": "Estrazione sezione NCA",
|
||||
"DialogNcaExtractionMainNcaNotFoundErrorMessage": "L'estrazione è fallita. L'NCA principale non era presente nel file selezionato.",
|
||||
"DialogNcaExtractionCheckLogErrorMessage": "L'estrazione è fallita. Consulta il file di log per maggiori informazioni.",
|
||||
"DialogNcaExtractionSuccessMessage": "Estrazione completata con successo.",
|
||||
|
@@ -407,6 +407,7 @@
|
||||
"AvatarSetBackgroundColor": "背景色を指定",
|
||||
"AvatarClose": "閉じる",
|
||||
"ControllerSettingsLoadProfileToolTip": "プロファイルをロード",
|
||||
"ControllerSettingsViewProfileToolTip": "View Profile",
|
||||
"ControllerSettingsAddProfileToolTip": "プロファイルを追加",
|
||||
"ControllerSettingsRemoveProfileToolTip": "プロファイルを削除",
|
||||
"ControllerSettingsSaveProfileToolTip": "プロファイルをセーブ",
|
||||
@@ -437,7 +438,7 @@
|
||||
"DialogMessageFindSaveErrorMessage": "セーブデータ: {0} の検索中にエラーが発生しました",
|
||||
"FolderDialogExtractTitle": "展開フォルダを選択",
|
||||
"DialogNcaExtractionMessage": "{1} から {0} セクションを展開中...",
|
||||
"DialogNcaExtractionTitle": "Ryujinx - NCA セクション展開",
|
||||
"DialogNcaExtractionTitle": "NCA セクション展開",
|
||||
"DialogNcaExtractionMainNcaNotFoundErrorMessage": "展開に失敗しました. 選択されたファイルにはメイン NCA が存在しません.",
|
||||
"DialogNcaExtractionCheckLogErrorMessage": "展開に失敗しました. 詳細はログを確認してください.",
|
||||
"DialogNcaExtractionSuccessMessage": "展開が正常終了しました",
|
||||
|
@@ -407,6 +407,7 @@
|
||||
"AvatarSetBackgroundColor": "배경색 설정",
|
||||
"AvatarClose": "닫기",
|
||||
"ControllerSettingsLoadProfileToolTip": "프로필 불러오기",
|
||||
"ControllerSettingsViewProfileToolTip": "View Profile",
|
||||
"ControllerSettingsAddProfileToolTip": "프로필 추가",
|
||||
"ControllerSettingsRemoveProfileToolTip": "프로필 제거",
|
||||
"ControllerSettingsSaveProfileToolTip": "프로필 저장",
|
||||
@@ -437,7 +438,7 @@
|
||||
"DialogMessageFindSaveErrorMessage": "지정된 저장 데이터를 찾는 중에 오류 발생: {0}",
|
||||
"FolderDialogExtractTitle": "추출할 폴더 선택",
|
||||
"DialogNcaExtractionMessage": "{1}에서 {0} 섹션을 추출하는 중...",
|
||||
"DialogNcaExtractionTitle": "Ryujinx - NCA 섹션 추출기",
|
||||
"DialogNcaExtractionTitle": "NCA 섹션 추출기",
|
||||
"DialogNcaExtractionMainNcaNotFoundErrorMessage": "추출 실패하였습니다. 선택한 파일에 기본 NCA가 없습니다.",
|
||||
"DialogNcaExtractionCheckLogErrorMessage": "추출 실패하였습니다. 자세한 내용은 로그 파일을 읽으세요.",
|
||||
"DialogNcaExtractionSuccessMessage": "추출이 성공적으로 완료되었습니다.",
|
||||
|
@@ -407,6 +407,7 @@
|
||||
"AvatarSetBackgroundColor": "Ustaw kolor tła",
|
||||
"AvatarClose": "Zamknij",
|
||||
"ControllerSettingsLoadProfileToolTip": "Wczytaj profil",
|
||||
"ControllerSettingsViewProfileToolTip": "View Profile",
|
||||
"ControllerSettingsAddProfileToolTip": "Dodaj profil",
|
||||
"ControllerSettingsRemoveProfileToolTip": "Usuń profil",
|
||||
"ControllerSettingsSaveProfileToolTip": "Zapisz profil",
|
||||
@@ -437,7 +438,7 @@
|
||||
"DialogMessageFindSaveErrorMessage": "Wystąpił błąd podczas próby znalezienia określonych zapisanych danych: {0}",
|
||||
"FolderDialogExtractTitle": "Wybierz folder, do którego chcesz rozpakować",
|
||||
"DialogNcaExtractionMessage": "Wypakowywanie sekcji {0} z {1}...",
|
||||
"DialogNcaExtractionTitle": "Ryujinx - Asystent wypakowania sekcji NCA",
|
||||
"DialogNcaExtractionTitle": "Asystent wypakowania sekcji NCA",
|
||||
"DialogNcaExtractionMainNcaNotFoundErrorMessage": "Niepowodzenie podczas wypakowywania. W wybranym pliku nie było głównego NCA.",
|
||||
"DialogNcaExtractionCheckLogErrorMessage": "Niepowodzenie podczas wypakowywania. Przeczytaj plik dziennika, aby uzyskać więcej informacji.",
|
||||
"DialogNcaExtractionSuccessMessage": "Wypakowywanie zakończone pomyślnie.",
|
||||
|
@@ -407,6 +407,7 @@
|
||||
"AvatarSetBackgroundColor": "Definir cor de fundo",
|
||||
"AvatarClose": "Fechar",
|
||||
"ControllerSettingsLoadProfileToolTip": "Carregar perfil",
|
||||
"ControllerSettingsViewProfileToolTip": "View Profile",
|
||||
"ControllerSettingsAddProfileToolTip": "Adicionar perfil",
|
||||
"ControllerSettingsRemoveProfileToolTip": "Remover perfil",
|
||||
"ControllerSettingsSaveProfileToolTip": "Salvar perfil",
|
||||
@@ -437,7 +438,7 @@
|
||||
"DialogMessageFindSaveErrorMessage": "Ocorreu um erro ao tentar encontrar o diretório de salvamento: {0}",
|
||||
"FolderDialogExtractTitle": "Escolha o diretório onde os arquivos serão extraídos",
|
||||
"DialogNcaExtractionMessage": "Extraindo seção {0} de {1}...",
|
||||
"DialogNcaExtractionTitle": "Ryujinx - Extrator de seções NCA",
|
||||
"DialogNcaExtractionTitle": "Extrator de seções NCA",
|
||||
"DialogNcaExtractionMainNcaNotFoundErrorMessage": "Falha na extração. O NCA principal não foi encontrado no arquivo selecionado.",
|
||||
"DialogNcaExtractionCheckLogErrorMessage": "Falha na extração. Leia o arquivo de log para mais informações.",
|
||||
"DialogNcaExtractionSuccessMessage": "Extração concluída com êxito.",
|
||||
|
@@ -407,6 +407,7 @@
|
||||
"AvatarSetBackgroundColor": "Установить цвет фона",
|
||||
"AvatarClose": "Закрыть",
|
||||
"ControllerSettingsLoadProfileToolTip": "Загрузить профиль",
|
||||
"ControllerSettingsViewProfileToolTip": "View Profile",
|
||||
"ControllerSettingsAddProfileToolTip": "Добавить профиль",
|
||||
"ControllerSettingsRemoveProfileToolTip": "Удалить профиль",
|
||||
"ControllerSettingsSaveProfileToolTip": "Сохранить профиль",
|
||||
@@ -437,7 +438,7 @@
|
||||
"DialogMessageFindSaveErrorMessage": "Произошла ошибка при поиске указанных данных сохранения: {0}",
|
||||
"FolderDialogExtractTitle": "Выберите папку для извлечения",
|
||||
"DialogNcaExtractionMessage": "Извлечение {0} раздела из {1}...",
|
||||
"DialogNcaExtractionTitle": "Ryujinx - Извлечение разделов NCA",
|
||||
"DialogNcaExtractionTitle": "Извлечение разделов NCA",
|
||||
"DialogNcaExtractionMainNcaNotFoundErrorMessage": "Ошибка извлечения. Основной NCA не присутствовал в выбранном файле.",
|
||||
"DialogNcaExtractionCheckLogErrorMessage": "Ошибка извлечения. Прочтите файл журнала для получения дополнительной информации.",
|
||||
"DialogNcaExtractionSuccessMessage": "Извлечение завершено успешно.",
|
||||
|
@@ -407,6 +407,7 @@
|
||||
"AvatarSetBackgroundColor": "ตั้งค่าสีพื้นหลัง",
|
||||
"AvatarClose": "ปิด",
|
||||
"ControllerSettingsLoadProfileToolTip": "โหลด โปรไฟล์",
|
||||
"ControllerSettingsViewProfileToolTip": "View Profile",
|
||||
"ControllerSettingsAddProfileToolTip": "เพิ่ม โปรไฟล์",
|
||||
"ControllerSettingsRemoveProfileToolTip": "ลบ โปรไฟล์",
|
||||
"ControllerSettingsSaveProfileToolTip": "บันทึก โปรไฟล์",
|
||||
@@ -437,7 +438,7 @@
|
||||
"DialogMessageFindSaveErrorMessage": "มีข้อผิดพลาดในการค้นหาข้อมูลบันทึกที่ระบุไว้: {0}",
|
||||
"FolderDialogExtractTitle": "เลือกโฟลเดอร์ที่จะแตกไฟล์เข้าไป",
|
||||
"DialogNcaExtractionMessage": "กำลังแตกไฟล์ {0} จากส่วน {1}...",
|
||||
"DialogNcaExtractionTitle": "Ryujinx - เครื่องมือแตกไฟล์ของ NCA",
|
||||
"DialogNcaExtractionTitle": "เครื่องมือแตกไฟล์ของ NCA",
|
||||
"DialogNcaExtractionMainNcaNotFoundErrorMessage": "เกิดความล้มเหลวในการแตกไฟล์เนื่องจากไม่พบ NCA หลักในไฟล์ที่เลือก",
|
||||
"DialogNcaExtractionCheckLogErrorMessage": "เกิดความล้มเหลวในการแตกไฟล์ โปรดอ่านไฟล์บันทึกประวัติเพื่อดูข้อมูลเพิ่มเติม",
|
||||
"DialogNcaExtractionSuccessMessage": "การแตกไฟล์เสร็จสมบูรณ์แล้ว",
|
||||
|
@@ -407,6 +407,7 @@
|
||||
"AvatarSetBackgroundColor": "Arka Plan Rengi Ayarla",
|
||||
"AvatarClose": "Kapat",
|
||||
"ControllerSettingsLoadProfileToolTip": "Profil Yükle",
|
||||
"ControllerSettingsViewProfileToolTip": "View Profile",
|
||||
"ControllerSettingsAddProfileToolTip": "Profil Ekle",
|
||||
"ControllerSettingsRemoveProfileToolTip": "Profili Kaldır",
|
||||
"ControllerSettingsSaveProfileToolTip": "Profili Kaydet",
|
||||
@@ -437,7 +438,7 @@
|
||||
"DialogMessageFindSaveErrorMessage": "Belirtilen kayıt verisi bulunmaya çalışırken hata: {0}",
|
||||
"FolderDialogExtractTitle": "İçine ayıklanacak klasörü seç",
|
||||
"DialogNcaExtractionMessage": "{1} den {0} kısmı ayıklanıyor...",
|
||||
"DialogNcaExtractionTitle": "Ryujinx - NCA Kısmı Ayıklayıcısı",
|
||||
"DialogNcaExtractionTitle": "NCA Kısmı Ayıklayıcısı",
|
||||
"DialogNcaExtractionMainNcaNotFoundErrorMessage": "Ayıklama hatası. Ana NCA seçilen dosyada bulunamadı.",
|
||||
"DialogNcaExtractionCheckLogErrorMessage": "Ayıklama hatası. Ek bilgi için kayıt dosyasını okuyun.",
|
||||
"DialogNcaExtractionSuccessMessage": "Ayıklama başarıyla tamamlandı.",
|
||||
|
@@ -407,6 +407,7 @@
|
||||
"AvatarSetBackgroundColor": "Встановити колір фону",
|
||||
"AvatarClose": "Закрити",
|
||||
"ControllerSettingsLoadProfileToolTip": "Завантажити профіль",
|
||||
"ControllerSettingsViewProfileToolTip": "View Profile",
|
||||
"ControllerSettingsAddProfileToolTip": "Додати профіль",
|
||||
"ControllerSettingsRemoveProfileToolTip": "Видалити профіль",
|
||||
"ControllerSettingsSaveProfileToolTip": "Зберегти профіль",
|
||||
@@ -437,7 +438,7 @@
|
||||
"DialogMessageFindSaveErrorMessage": "Під час пошуку вказаних даних збереження сталася помилка: {0}",
|
||||
"FolderDialogExtractTitle": "Виберіть папку для видобування",
|
||||
"DialogNcaExtractionMessage": "Видобування розділу {0} з {1}...",
|
||||
"DialogNcaExtractionTitle": "Ryujinx - Екстрактор розділів NCA",
|
||||
"DialogNcaExtractionTitle": "Екстрактор розділів NCA",
|
||||
"DialogNcaExtractionMainNcaNotFoundErrorMessage": "Помилка видобування. Основний NCA не був присутній у вибраному файлі.",
|
||||
"DialogNcaExtractionCheckLogErrorMessage": "Помилка видобування. Прочитайте файл журналу для отримання додаткової інформації.",
|
||||
"DialogNcaExtractionSuccessMessage": "Видобування успішно завершено.",
|
||||
|
@@ -407,6 +407,7 @@
|
||||
"AvatarSetBackgroundColor": "设置背景色",
|
||||
"AvatarClose": "关闭",
|
||||
"ControllerSettingsLoadProfileToolTip": "加载配置文件",
|
||||
"ControllerSettingsViewProfileToolTip": "View Profile",
|
||||
"ControllerSettingsAddProfileToolTip": "新增配置文件",
|
||||
"ControllerSettingsRemoveProfileToolTip": "删除配置文件",
|
||||
"ControllerSettingsSaveProfileToolTip": "保存配置文件",
|
||||
@@ -437,7 +438,7 @@
|
||||
"DialogMessageFindSaveErrorMessage": "查找指定存档时出错:{0}",
|
||||
"FolderDialogExtractTitle": "选择要提取到的文件夹",
|
||||
"DialogNcaExtractionMessage": "提取 {1} 的 {0} 分区...",
|
||||
"DialogNcaExtractionTitle": "Ryujinx - NCA 分区提取",
|
||||
"DialogNcaExtractionTitle": "NCA 分区提取",
|
||||
"DialogNcaExtractionMainNcaNotFoundErrorMessage": "提取失败,所选文件中没有 NCA 文件",
|
||||
"DialogNcaExtractionCheckLogErrorMessage": "提取失败,请查看日志文件获取详情",
|
||||
"DialogNcaExtractionSuccessMessage": "提取成功!",
|
||||
|
@@ -407,6 +407,7 @@
|
||||
"AvatarSetBackgroundColor": "設定背景顏色",
|
||||
"AvatarClose": "關閉",
|
||||
"ControllerSettingsLoadProfileToolTip": "載入設定檔",
|
||||
"ControllerSettingsViewProfileToolTip": "View Profile",
|
||||
"ControllerSettingsAddProfileToolTip": "新增設定檔",
|
||||
"ControllerSettingsRemoveProfileToolTip": "刪除設定檔",
|
||||
"ControllerSettingsSaveProfileToolTip": "儲存設定檔",
|
||||
@@ -437,7 +438,7 @@
|
||||
"DialogMessageFindSaveErrorMessage": "尋找指定的存檔時出現錯誤: {0}",
|
||||
"FolderDialogExtractTitle": "選擇要解壓到的資料夾",
|
||||
"DialogNcaExtractionMessage": "從 {1} 提取 {0} 分區...",
|
||||
"DialogNcaExtractionTitle": "Ryujinx - NCA 分區提取器",
|
||||
"DialogNcaExtractionTitle": "NCA 分區提取器",
|
||||
"DialogNcaExtractionMainNcaNotFoundErrorMessage": "提取失敗。所選檔案中不存在主 NCA 檔案。",
|
||||
"DialogNcaExtractionCheckLogErrorMessage": "提取失敗。請閱讀日誌檔案了解更多資訊。",
|
||||
"DialogNcaExtractionSuccessMessage": "提取成功。",
|
||||
|
@@ -146,7 +146,7 @@ namespace Ryujinx.Ava.Common
|
||||
var cancellationToken = new CancellationTokenSource();
|
||||
|
||||
UpdateWaitWindow waitingDialog = new(
|
||||
LocaleManager.Instance[LocaleKeys.DialogNcaExtractionTitle],
|
||||
App.FormatTitle(LocaleKeys.DialogNcaExtractionTitle),
|
||||
LocaleManager.Instance.UpdateAndGetDynamicValue(LocaleKeys.DialogNcaExtractionMessage, ncaSectionType, Path.GetFileName(titleFilePath)),
|
||||
cancellationToken);
|
||||
|
||||
@@ -269,7 +269,7 @@ namespace Ryujinx.Ava.Common
|
||||
Dispatcher.UIThread.Post(waitingDialog.Close);
|
||||
|
||||
NotificationHelper.Show(
|
||||
LocaleManager.Instance[LocaleKeys.DialogNcaExtractionTitle],
|
||||
App.FormatTitle(LocaleKeys.DialogNcaExtractionTitle),
|
||||
$"{titleName}\n\n{LocaleManager.Instance[LocaleKeys.DialogNcaExtractionSuccessMessage]}",
|
||||
NotificationType.Information);
|
||||
}
|
||||
|
@@ -30,7 +30,6 @@ namespace Ryujinx.Ava
|
||||
{
|
||||
internal partial class Program
|
||||
{
|
||||
//
|
||||
public static double WindowScaleFactor { get; set; }
|
||||
public static double DesktopScaleFactor { get; set; } = 1.0;
|
||||
public static string Version { get; private set; }
|
||||
@@ -101,7 +100,7 @@ namespace Ryujinx.Ava
|
||||
// Delete backup files after updating.
|
||||
Task.Run(Updater.CleanupUpdate);
|
||||
|
||||
Console.Title = $"Ryujinx Console {Version}";
|
||||
Console.Title = $"{App.FullAppName} Console {Version}";
|
||||
|
||||
// Hook unhandled exception and process exit events.
|
||||
AppDomain.CurrentDomain.UnhandledException += (sender, e)
|
||||
|
@@ -226,11 +226,11 @@ namespace Ryujinx.Ava.UI.Helpers
|
||||
(int)Symbol.Help,
|
||||
primaryButtonResult);
|
||||
|
||||
internal static async Task<UserResult> CreateConfirmationDialogExtended(
|
||||
internal static async Task<UserResult> CreateDeniableConfirmationDialog(
|
||||
string primaryText,
|
||||
string secondaryText,
|
||||
string acceptButtonText,
|
||||
string noacceptButtonText,
|
||||
string noAcceptButtonText,
|
||||
string cancelButtonText,
|
||||
string title,
|
||||
UserResult primaryButtonResult = UserResult.Yes)
|
||||
@@ -239,7 +239,7 @@ namespace Ryujinx.Ava.UI.Helpers
|
||||
primaryText,
|
||||
secondaryText,
|
||||
acceptButtonText,
|
||||
noacceptButtonText,
|
||||
noAcceptButtonText,
|
||||
cancelButtonText,
|
||||
(int)Symbol.Help,
|
||||
primaryButtonResult);
|
||||
|
@@ -802,6 +802,11 @@ namespace Ryujinx.Ava.UI.ViewModels
|
||||
{
|
||||
get => FileAssociationHelper.IsTypeAssociationSupported;
|
||||
}
|
||||
|
||||
public bool AreMimeTypesRegistered
|
||||
{
|
||||
get => FileAssociationHelper.AreMimeTypesRegistered;
|
||||
}
|
||||
|
||||
public ObservableCollectionExtended<ApplicationData> Applications
|
||||
{
|
||||
|
@@ -26,19 +26,17 @@ namespace Ryujinx.Ava.UI.Views.Input
|
||||
|
||||
foreach (ILogical visual in SettingButtons.GetLogicalDescendants())
|
||||
{
|
||||
if (visual is ToggleButton button and not CheckBox)
|
||||
switch (visual)
|
||||
{
|
||||
button.IsCheckedChanged += Button_IsCheckedChanged;
|
||||
}
|
||||
|
||||
if (visual is CheckBox check)
|
||||
{
|
||||
check.IsCheckedChanged += CheckBox_IsCheckedChanged;
|
||||
}
|
||||
|
||||
if (visual is Slider slider)
|
||||
{
|
||||
slider.PropertyChanged += Slider_IsCheckedChanged;
|
||||
case ToggleButton button and not CheckBox:
|
||||
button.IsCheckedChanged += Button_IsCheckedChanged;
|
||||
break;
|
||||
case CheckBox check:
|
||||
check.IsCheckedChanged += CheckBox_IsCheckedChanged;
|
||||
break;
|
||||
case Slider slider:
|
||||
slider.PropertyChanged += Slider_ValueChanged;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -47,33 +45,28 @@ namespace Ryujinx.Ava.UI.Views.Input
|
||||
{
|
||||
base.OnPointerReleased(e);
|
||||
|
||||
if (_currentAssigner != null && _currentAssigner.ToggledButton != null && !_currentAssigner.ToggledButton.IsPointerOver)
|
||||
if (_currentAssigner is { ToggledButton.IsPointerOver: false })
|
||||
{
|
||||
_currentAssigner.Cancel();
|
||||
}
|
||||
}
|
||||
|
||||
private float _changeSlider = -1.0f;
|
||||
private float _changeSlider = float.NaN;
|
||||
|
||||
private void Slider_IsCheckedChanged(object sender, AvaloniaPropertyChangedEventArgs e)
|
||||
private void Slider_ValueChanged(object sender, AvaloniaPropertyChangedEventArgs e)
|
||||
{
|
||||
if (sender is Slider check)
|
||||
{
|
||||
if ((bool)check.IsPointerOver && _changeSlider == -1.0f)
|
||||
_changeSlider = check.IsPointerOver switch
|
||||
{
|
||||
_changeSlider = (float)check.Value;
|
||||
|
||||
}
|
||||
else if (!(bool)check.IsPointerOver)
|
||||
{
|
||||
_changeSlider = -1.0f;
|
||||
}
|
||||
true when float.IsNaN(_changeSlider) => (float)check.Value,
|
||||
false => float.NaN,
|
||||
_ => _changeSlider
|
||||
};
|
||||
|
||||
if (_changeSlider != -1.0f && _changeSlider != (float)check.Value)
|
||||
if (!float.IsNaN(_changeSlider) && _changeSlider != (float)check.Value)
|
||||
{
|
||||
|
||||
var viewModel = (DataContext as ControllerInputViewModel);
|
||||
viewModel.ParentModel.IsModified = true;
|
||||
(DataContext as ControllerInputViewModel)!.ParentModel.IsModified = true;
|
||||
_changeSlider = (float)check.Value;
|
||||
}
|
||||
}
|
||||
@@ -81,25 +74,20 @@ namespace Ryujinx.Ava.UI.Views.Input
|
||||
|
||||
private void CheckBox_IsCheckedChanged(object sender, RoutedEventArgs e)
|
||||
{
|
||||
if (sender is CheckBox check)
|
||||
if (sender is CheckBox { IsPointerOver: true })
|
||||
{
|
||||
if ((bool)check.IsPointerOver)
|
||||
{
|
||||
|
||||
var viewModel = (DataContext as ControllerInputViewModel);
|
||||
viewModel.ParentModel.IsModified = true;
|
||||
_currentAssigner?.Cancel();
|
||||
_currentAssigner = null;
|
||||
}
|
||||
(DataContext as ControllerInputViewModel)!.ParentModel.IsModified = true;
|
||||
_currentAssigner?.Cancel();
|
||||
_currentAssigner = null;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
private void Button_IsCheckedChanged(object sender, RoutedEventArgs e)
|
||||
{
|
||||
if (sender is ToggleButton button )
|
||||
if (sender is ToggleButton button)
|
||||
{
|
||||
if ((bool)button.IsChecked)
|
||||
if (button.IsChecked is true)
|
||||
{
|
||||
if (_currentAssigner != null && button == _currentAssigner.ToggledButton)
|
||||
{
|
||||
@@ -204,7 +192,7 @@ namespace Ryujinx.Ava.UI.Views.Input
|
||||
}
|
||||
else
|
||||
{
|
||||
if (_currentAssigner != null )
|
||||
if (_currentAssigner != null)
|
||||
{
|
||||
_currentAssigner.Cancel();
|
||||
_currentAssigner = null;
|
||||
|
@@ -37,7 +37,7 @@ namespace Ryujinx.Ava.UI.Views.Input
|
||||
{
|
||||
_dialogOpen = true;
|
||||
|
||||
var result = await ContentDialogHelper.CreateConfirmationDialogExtended(
|
||||
var result = await ContentDialogHelper.CreateDeniableConfirmationDialog(
|
||||
LocaleManager.Instance[LocaleKeys.DialogControllerSettingsModifiedConfirmMessage],
|
||||
LocaleManager.Instance[LocaleKeys.DialogControllerSettingsModifiedConfirmSubMessage],
|
||||
LocaleManager.Instance[LocaleKeys.InputDialogYes],
|
||||
@@ -53,28 +53,19 @@ namespace Ryujinx.Ava.UI.Views.Input
|
||||
|
||||
_dialogOpen = false;
|
||||
|
||||
if (result == UserResult.Cancel)
|
||||
{
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
ViewModel.IsModified = false;
|
||||
|
||||
if (result != UserResult.Cancel)
|
||||
{
|
||||
ViewModel.PlayerId = ViewModel.PlayerIdChoose;
|
||||
}
|
||||
|
||||
if (result == UserResult.Cancel)
|
||||
{
|
||||
if (e.AddedItems.Count > 0)
|
||||
{
|
||||
ViewModel.IsModified = true;
|
||||
var player = (PlayerModel)e.AddedItems[0];
|
||||
ViewModel.PlayerId = player.Id;
|
||||
ViewModel.PlayerId = ((PlayerModel)e.AddedItems[0])!.Id;
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
ViewModel.PlayerId = ViewModel.PlayerIdChoose;
|
||||
|
||||
ViewModel.IsModified = false;
|
||||
}
|
||||
|
||||
}
|
||||
|
@@ -4,8 +4,10 @@
|
||||
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
|
||||
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
|
||||
xmlns:ext="clr-namespace:Ryujinx.Ava.Common.Markup"
|
||||
xmlns:uih="clr-namespace:Ryujinx.UI.Common.Helper"
|
||||
mc:Ignorable="d"
|
||||
xmlns:viewModels="clr-namespace:Ryujinx.Ava.UI.ViewModels"
|
||||
xmlns:helper="clr-namespace:Ryujinx.UI.Common.Helper;assembly=Ryujinx.UI.Common"
|
||||
x:DataType="viewModels:MainWindowViewModel"
|
||||
x:Class="Ryujinx.Ava.UI.Views.Main.MainMenuBarView">
|
||||
<Design.DataContext>
|
||||
@@ -265,11 +267,11 @@
|
||||
<MenuItem Command="{Binding InstallFirmwareFromFolder}" Header="{ext:Locale MenuBarFileToolsInstallFirmwareFromDirectory}" Icon="{ext:Icon mdi-folder-cog}" />
|
||||
</MenuItem>
|
||||
<MenuItem Header="{ext:Locale MenuBarToolsManageFileTypes}" IsVisible="{Binding ManageFileTypesVisible}">
|
||||
<MenuItem Header="{ext:Locale MenuBarToolsInstallFileTypes}" Click="InstallFileTypes_Click"/>
|
||||
<MenuItem Header="{ext:Locale MenuBarToolsUninstallFileTypes}" Click="UninstallFileTypes_Click"/>
|
||||
<MenuItem Header="{ext:Locale MenuBarToolsInstallFileTypes}" Click="InstallFileTypes_Click" IsEnabled="{Binding AreMimeTypesRegistered, Converter={x:Static BoolConverters.Not}}" />
|
||||
<MenuItem Header="{ext:Locale MenuBarToolsUninstallFileTypes}" Click="UninstallFileTypes_Click" IsEnabled="{Binding AreMimeTypesRegistered}" />
|
||||
</MenuItem>
|
||||
<Separator />
|
||||
<MenuItem Header="{ext:Locale MenuBarToolsXCITrimmer}" Click="OpenXCITrimmerWindow" Icon="{ext:Icon fa-solid fa-scissors}" />
|
||||
<MenuItem Header="{ext:Locale MenuBarToolsXCITrimmer}" IsEnabled="{Binding EnableNonGameRunningControls}" Click="OpenXCITrimmerWindow" Icon="{ext:Icon fa-solid fa-scissors}" />
|
||||
</MenuItem>
|
||||
<MenuItem VerticalAlignment="Center" Header="{ext:Locale MenuBarView}">
|
||||
<MenuItem VerticalAlignment="Center" Header="{ext:Locale MenuBarViewWindow}">
|
||||
|
@@ -75,7 +75,7 @@ namespace Ryujinx.Ava.UI.Windows
|
||||
string parentPath = currentCheatFile.Replace(titleModsPath, string.Empty);
|
||||
|
||||
buildId = Path.GetFileNameWithoutExtension(currentCheatFile).ToUpper();
|
||||
currentGroup = new CheatNode("", buildId, parentPath, true);
|
||||
currentGroup = new CheatNode(string.Empty, buildId, parentPath, true);
|
||||
|
||||
LoadedCheats.Add(currentGroup);
|
||||
}
|
||||
|
@@ -32,9 +32,9 @@ namespace Ryujinx.Ava.UI.Windows
|
||||
{
|
||||
ContentDialog contentDialog = new()
|
||||
{
|
||||
PrimaryButtonText = "",
|
||||
SecondaryButtonText = "",
|
||||
CloseButtonText = "",
|
||||
PrimaryButtonText = string.Empty,
|
||||
SecondaryButtonText = string.Empty,
|
||||
CloseButtonText = string.Empty,
|
||||
Content = new XCITrimmerWindow(mainWindowViewModel),
|
||||
Title = string.Format(LocaleManager.Instance[LocaleKeys.XCITrimmerWindowTitle]),
|
||||
};
|
||||
|
@@ -32,7 +32,8 @@ namespace Ryujinx.Ava
|
||||
internal static class Updater
|
||||
{
|
||||
private const string GitHubApiUrl = "https://api.github.com";
|
||||
private const string LatestReleaseUrl = $"{GitHubApiUrl}/repos/{ReleaseInformation.ReleaseChannelOwner}/{ReleaseInformation.ReleaseChannelRepo}/releases/latest";
|
||||
private const string LatestReleaseUrl =
|
||||
$"{GitHubApiUrl}/repos/{ReleaseInformation.ReleaseChannelOwner}/{ReleaseInformation.ReleaseChannelRepo}/releases/latest";
|
||||
|
||||
private static readonly GithubReleasesJsonSerializerContext _serializerContext = new(JsonHelper.GetDefaultSerializerOptions());
|
||||
|
||||
@@ -83,7 +84,7 @@ namespace Ryujinx.Ava
|
||||
}
|
||||
catch
|
||||
{
|
||||
Logger.Error?.Print(LogClass.Application, "Failed to convert the current Ryujinx version!");
|
||||
Logger.Error?.Print(LogClass.Application, $"Failed to convert the current {App.FullAppName} version!");
|
||||
|
||||
await ContentDialogHelper.CreateWarningDialog(
|
||||
LocaleManager.Instance[LocaleKeys.DialogUpdaterConvertFailedMessage],
|
||||
|
Reference in New Issue
Block a user