Ryujinx is an open-source Nintendo Switch emulator, originally created by gdkchan, written in C#.
This emulator aims at providing excellent accuracy and performance, a user-friendly interface and consistent builds.
It was written from scratch and development on the project began in September 2017.
- Ryujinx is available on Github under the MIT license.
+ Ryujinx is available on GitHub under the MIT license.
@@ -63,7 +54,7 @@ failing to meet this requirement may result in a poor gameplay experience or une
## Latest build
-Stable builds are made every so often onto a separate "release" branch that then gets put into the releases you know and love.
+Stable builds are made every so often onto a separate "release" branch that then gets put into the releases you know and love.
These stable builds exist so that the end user can get a more **enjoyable and stable experience**.
You can find the latest stable release [here](https://github.com/GreemDev/Ryujinx/releases/latest).
@@ -91,7 +82,7 @@ If you are planning to contribute or just want to learn more about this project
It translates the ARM code to a custom IR, performs a few optimizations, and turns that into x86 code.
There are three memory manager options available depending on the user's preference, leveraging both software-based (slower) and host-mapped modes (much faster).
The fastest option (host, unchecked) is set by default.
- Ryujinx also features an optional Profiled Persistent Translation Cache, which essentially caches translated functions so that they do not need to be translated every time the game loads.
+ Ryujinx also features an optional Profiled Persistent Translation Cache, which essentially caches translated functions so that they do not need to be translated every time the game loads.
The net result is a significant reduction in load times (the amount of time between launching a game and arriving at the title screen) for nearly every game.
NOTE: This feature is enabled by default in the Options menu > System tab.
You must launch the game at least twice to the title screen or beyond before performance improvements are unlocked on the third launch!
diff --git a/distribution/macos/Ryujinx.icns b/distribution/macos/Ryujinx.icns
index 1bb88a5d7..fd5cd7f7e 100644
Binary files a/distribution/macos/Ryujinx.icns and b/distribution/macos/Ryujinx.icns differ
diff --git a/distribution/misc/Logo.svg b/distribution/misc/Logo.svg
index d3327f2ef..00bba42f0 100644
--- a/distribution/misc/Logo.svg
+++ b/distribution/misc/Logo.svg
@@ -1 +1,4 @@
-
\ No newline at end of file
+
+
diff --git a/distribution/misc/macOS.svg b/distribution/misc/macOS.svg
new file mode 100644
index 000000000..4bdd453a8
--- /dev/null
+++ b/distribution/misc/macOS.svg
@@ -0,0 +1,61 @@
+
diff --git a/global.json b/global.json
index 391ba3c2a..cdbb589ed 100644
--- a/global.json
+++ b/global.json
@@ -1,6 +1,6 @@
{
"sdk": {
- "version": "8.0.100",
+ "version": "9.0.100",
"rollForward": "latestFeature"
}
}
diff --git a/src/ARMeilleure/ARMeilleure.csproj b/src/ARMeilleure/ARMeilleure.csproj
index 4b67fdb3b..5b6c5a6da 100644
--- a/src/ARMeilleure/ARMeilleure.csproj
+++ b/src/ARMeilleure/ARMeilleure.csproj
@@ -1,7 +1,6 @@
- net8.0true$(DefaultItemExcludes);._*
diff --git a/src/ARMeilleure/Decoders/DecoderHelper.cs b/src/ARMeilleure/Decoders/DecoderHelper.cs
index 35e573955..c39a8a88b 100644
--- a/src/ARMeilleure/Decoders/DecoderHelper.cs
+++ b/src/ARMeilleure/Decoders/DecoderHelper.cs
@@ -1,4 +1,5 @@
using ARMeilleure.Common;
+using System;
namespace ARMeilleure.Decoders
{
@@ -149,7 +150,7 @@ namespace ARMeilleure.Decoders
return (((long)opCode << 45) >> 48) & ~3;
}
- public static bool VectorArgumentsInvalid(bool q, params int[] args)
+ public static bool VectorArgumentsInvalid(bool q, params ReadOnlySpan args)
{
if (q)
{
diff --git a/src/ARMeilleure/Instructions/SoftFallback.cs b/src/ARMeilleure/Instructions/SoftFallback.cs
index c4fe677bf..899326c4b 100644
--- a/src/ARMeilleure/Instructions/SoftFallback.cs
+++ b/src/ARMeilleure/Instructions/SoftFallback.cs
@@ -264,7 +264,7 @@ namespace ARMeilleure.Instructions
return TblOrTbx(dest, vector, bytes, tb0, tb1, tb2, tb3);
}
- private static V128 TblOrTbx(V128 dest, V128 vector, int bytes, params V128[] tb)
+ private static V128 TblOrTbx(V128 dest, V128 vector, int bytes, params ReadOnlySpan tb)
{
byte[] res = new byte[16];
diff --git a/src/ARMeilleure/IntermediateRepresentation/Operation.cs b/src/ARMeilleure/IntermediateRepresentation/Operation.cs
index b0dc173af..4bc3a2e09 100644
--- a/src/ARMeilleure/IntermediateRepresentation/Operation.cs
+++ b/src/ARMeilleure/IntermediateRepresentation/Operation.cs
@@ -337,7 +337,7 @@ namespace ARMeilleure.IntermediateRepresentation
return result;
}
- public static Operation Operation(Intrinsic intrin, Operand dest, params Operand[] srcs)
+ public static Operation Operation(Intrinsic intrin, Operand dest, params ReadOnlySpan srcs)
{
Operation result = Make(Instruction.Extended, 0, srcs.Length);
diff --git a/src/ARMeilleure/Translation/Cache/JitCache.cs b/src/ARMeilleure/Translation/Cache/JitCache.cs
index cf13cd6cb..3bbec482c 100644
--- a/src/ARMeilleure/Translation/Cache/JitCache.cs
+++ b/src/ARMeilleure/Translation/Cache/JitCache.cs
@@ -8,6 +8,7 @@ using System.Collections.Generic;
using System.Diagnostics;
using System.Runtime.InteropServices;
using System.Runtime.Versioning;
+using System.Threading;
namespace ARMeilleure.Translation.Cache
{
@@ -26,7 +27,7 @@ namespace ARMeilleure.Translation.Cache
private static readonly List _cacheEntries = new();
- private static readonly object _lock = new();
+ private static readonly Lock _lock = new();
private static bool _initialized;
[SupportedOSPlatform("windows")]
diff --git a/src/ARMeilleure/Translation/EmitterContext.cs b/src/ARMeilleure/Translation/EmitterContext.cs
index e2d860f82..22b6b9842 100644
--- a/src/ARMeilleure/Translation/EmitterContext.cs
+++ b/src/ARMeilleure/Translation/EmitterContext.cs
@@ -559,27 +559,27 @@ namespace ARMeilleure.Translation
return dest;
}
- public Operand AddIntrinsic(Intrinsic intrin, params Operand[] args)
+ public Operand AddIntrinsic(Intrinsic intrin, params ReadOnlySpan args)
{
return Add(intrin, Local(OperandType.V128), args);
}
- public Operand AddIntrinsicInt(Intrinsic intrin, params Operand[] args)
+ public Operand AddIntrinsicInt(Intrinsic intrin, params ReadOnlySpan args)
{
return Add(intrin, Local(OperandType.I32), args);
}
- public Operand AddIntrinsicLong(Intrinsic intrin, params Operand[] args)
+ public Operand AddIntrinsicLong(Intrinsic intrin, params ReadOnlySpan args)
{
return Add(intrin, Local(OperandType.I64), args);
}
- public void AddIntrinsicNoRet(Intrinsic intrin, params Operand[] args)
+ public void AddIntrinsicNoRet(Intrinsic intrin, params ReadOnlySpan args)
{
Add(intrin, default, args);
}
- private Operand Add(Intrinsic intrin, Operand dest, params Operand[] sources)
+ private Operand Add(Intrinsic intrin, Operand dest, params ReadOnlySpan sources)
{
NewNextBlockIfNeeded();
diff --git a/src/ARMeilleure/Translation/PTC/Ptc.cs b/src/ARMeilleure/Translation/PTC/Ptc.cs
index 841e5fefa..4675abc49 100644
--- a/src/ARMeilleure/Translation/PTC/Ptc.cs
+++ b/src/ARMeilleure/Translation/PTC/Ptc.cs
@@ -59,7 +59,7 @@ namespace ARMeilleure.Translation.PTC
private readonly ManualResetEvent _waitEvent;
- private readonly object _lock;
+ private readonly Lock _lock = new();
private bool _disposed;
@@ -89,8 +89,6 @@ namespace ARMeilleure.Translation.PTC
_waitEvent = new ManualResetEvent(true);
- _lock = new object();
-
_disposed = false;
TitleIdText = TitleIdTextDefault;
diff --git a/src/ARMeilleure/Translation/PTC/PtcProfiler.cs b/src/ARMeilleure/Translation/PTC/PtcProfiler.cs
index 8e95c5e4b..7e630ae10 100644
--- a/src/ARMeilleure/Translation/PTC/PtcProfiler.cs
+++ b/src/ARMeilleure/Translation/PTC/PtcProfiler.cs
@@ -41,7 +41,7 @@ namespace ARMeilleure.Translation.PTC
private readonly ManualResetEvent _waitEvent;
- private readonly object _lock;
+ private readonly Lock _lock = new();
private bool _disposed;
@@ -65,8 +65,6 @@ namespace ARMeilleure.Translation.PTC
_waitEvent = new ManualResetEvent(true);
- _lock = new object();
-
_disposed = false;
ProfiledFuncs = new Dictionary();
diff --git a/src/Ryujinx.Audio.Backends.OpenAL/OpenALHardwareDeviceSession.cs b/src/Ryujinx.Audio.Backends.OpenAL/OpenALHardwareDeviceSession.cs
index 3b9129130..7292450a6 100644
--- a/src/Ryujinx.Audio.Backends.OpenAL/OpenALHardwareDeviceSession.cs
+++ b/src/Ryujinx.Audio.Backends.OpenAL/OpenALHardwareDeviceSession.cs
@@ -5,6 +5,7 @@ using Ryujinx.Memory;
using System;
using System.Collections.Generic;
using System.Diagnostics;
+using System.Threading;
namespace Ryujinx.Audio.Backends.OpenAL
{
@@ -18,7 +19,7 @@ namespace Ryujinx.Audio.Backends.OpenAL
private ulong _playedSampleCount;
private float _volume;
- private readonly object _lock = new();
+ private readonly Lock _lock = new();
public OpenALHardwareDeviceSession(OpenALHardwareDeviceDriver driver, IVirtualMemoryManager memoryManager, SampleFormat requestedSampleFormat, uint requestedSampleRate, uint requestedChannelCount) : base(memoryManager, requestedSampleFormat, requestedSampleRate, requestedChannelCount)
{
diff --git a/src/Ryujinx.Audio.Backends.OpenAL/Ryujinx.Audio.Backends.OpenAL.csproj b/src/Ryujinx.Audio.Backends.OpenAL/Ryujinx.Audio.Backends.OpenAL.csproj
index bdf46d688..4ef3aebec 100644
--- a/src/Ryujinx.Audio.Backends.OpenAL/Ryujinx.Audio.Backends.OpenAL.csproj
+++ b/src/Ryujinx.Audio.Backends.OpenAL/Ryujinx.Audio.Backends.OpenAL.csproj
@@ -1,7 +1,6 @@
- net8.0$(DefaultItemExcludes);._*
diff --git a/src/Ryujinx.Audio.Backends.SDL2/Ryujinx.Audio.Backends.SDL2.csproj b/src/Ryujinx.Audio.Backends.SDL2/Ryujinx.Audio.Backends.SDL2.csproj
index 940e47308..d0d45122e 100644
--- a/src/Ryujinx.Audio.Backends.SDL2/Ryujinx.Audio.Backends.SDL2.csproj
+++ b/src/Ryujinx.Audio.Backends.SDL2/Ryujinx.Audio.Backends.SDL2.csproj
@@ -1,7 +1,6 @@
- net8.0true$(DefaultItemExcludes);._*
diff --git a/src/Ryujinx.Audio.Backends.SoundIo/Ryujinx.Audio.Backends.SoundIo.csproj b/src/Ryujinx.Audio.Backends.SoundIo/Ryujinx.Audio.Backends.SoundIo.csproj
index 671a6ad5e..d06f66181 100644
--- a/src/Ryujinx.Audio.Backends.SoundIo/Ryujinx.Audio.Backends.SoundIo.csproj
+++ b/src/Ryujinx.Audio.Backends.SoundIo/Ryujinx.Audio.Backends.SoundIo.csproj
@@ -1,7 +1,6 @@
- net8.0truewin-x64;osx-x64;linux-x64$(DefaultItemExcludes);._*
diff --git a/src/Ryujinx.Audio/AudioManager.cs b/src/Ryujinx.Audio/AudioManager.cs
index 370d3d098..8c2c0ef6b 100644
--- a/src/Ryujinx.Audio/AudioManager.cs
+++ b/src/Ryujinx.Audio/AudioManager.cs
@@ -11,7 +11,7 @@ namespace Ryujinx.Audio
///
/// Lock used to control the waiters registration.
///
- private readonly object _lock = new();
+ private readonly Lock _lock = new();
///
/// Events signaled when the driver played audio buffers.
diff --git a/src/Ryujinx.Audio/Backends/Common/DynamicRingBuffer.cs b/src/Ryujinx.Audio/Backends/Common/DynamicRingBuffer.cs
index 7aefe8865..6f31755a3 100644
--- a/src/Ryujinx.Audio/Backends/Common/DynamicRingBuffer.cs
+++ b/src/Ryujinx.Audio/Backends/Common/DynamicRingBuffer.cs
@@ -2,6 +2,7 @@ using Ryujinx.Common;
using Ryujinx.Common.Memory;
using System;
using System.Buffers;
+using System.Threading;
namespace Ryujinx.Audio.Backends.Common
{
@@ -12,7 +13,7 @@ namespace Ryujinx.Audio.Backends.Common
{
private const int RingBufferAlignment = 2048;
- private readonly object _lock = new();
+ private readonly Lock _lock = new();
private MemoryOwner _bufferOwner;
private Memory _buffer;
diff --git a/src/Ryujinx.Audio/Input/AudioInputManager.cs b/src/Ryujinx.Audio/Input/AudioInputManager.cs
index d56997e9c..ffc3e6da2 100644
--- a/src/Ryujinx.Audio/Input/AudioInputManager.cs
+++ b/src/Ryujinx.Audio/Input/AudioInputManager.cs
@@ -14,12 +14,12 @@ namespace Ryujinx.Audio.Input
///
public class AudioInputManager : IDisposable
{
- private readonly object _lock = new();
+ private readonly Lock _lock = new();
///
/// Lock used for session allocation.
///
- private readonly object _sessionLock = new();
+ private readonly Lock _sessionLock = new();
///
/// The session ids allocation table.
diff --git a/src/Ryujinx.Audio/Input/AudioInputSystem.cs b/src/Ryujinx.Audio/Input/AudioInputSystem.cs
index 34623b34f..65b99745d 100644
--- a/src/Ryujinx.Audio/Input/AudioInputSystem.cs
+++ b/src/Ryujinx.Audio/Input/AudioInputSystem.cs
@@ -48,7 +48,7 @@ namespace Ryujinx.Audio.Input
///
/// The lock of the parent.
///
- private readonly object _parentLock;
+ private readonly Lock _parentLock;
///
/// The dispose state.
@@ -62,7 +62,7 @@ namespace Ryujinx.Audio.Input
/// The lock of the manager
/// The hardware device session
/// The buffer release event of the audio input
- public AudioInputSystem(AudioInputManager manager, object parentLock, IHardwareDeviceSession deviceSession, IWritableEvent bufferEvent)
+ public AudioInputSystem(AudioInputManager manager, Lock parentLock, IHardwareDeviceSession deviceSession, IWritableEvent bufferEvent)
{
_manager = manager;
_parentLock = parentLock;
diff --git a/src/Ryujinx.Audio/Output/AudioOutputManager.cs b/src/Ryujinx.Audio/Output/AudioOutputManager.cs
index 308cd1564..13e169a24 100644
--- a/src/Ryujinx.Audio/Output/AudioOutputManager.cs
+++ b/src/Ryujinx.Audio/Output/AudioOutputManager.cs
@@ -14,12 +14,12 @@ namespace Ryujinx.Audio.Output
///
public class AudioOutputManager : IDisposable
{
- private readonly object _lock = new();
+ private readonly Lock _lock = new();
///
/// Lock used for session allocation.
///
- private readonly object _sessionLock = new();
+ private readonly Lock _sessionLock = new();
///
/// The session ids allocation table.
diff --git a/src/Ryujinx.Audio/Output/AudioOutputSystem.cs b/src/Ryujinx.Audio/Output/AudioOutputSystem.cs
index f9b9bdcf1..dc7d52ced 100644
--- a/src/Ryujinx.Audio/Output/AudioOutputSystem.cs
+++ b/src/Ryujinx.Audio/Output/AudioOutputSystem.cs
@@ -48,7 +48,7 @@ namespace Ryujinx.Audio.Output
///
/// THe lock of the parent.
///
- private readonly object _parentLock;
+ private readonly Lock _parentLock;
///
/// The dispose state.
@@ -62,7 +62,7 @@ namespace Ryujinx.Audio.Output
/// The lock of the manager
/// The hardware device session
/// The buffer release event of the audio output
- public AudioOutputSystem(AudioOutputManager manager, object parentLock, IHardwareDeviceSession deviceSession, IWritableEvent bufferEvent)
+ public AudioOutputSystem(AudioOutputManager manager, Lock parentLock, IHardwareDeviceSession deviceSession, IWritableEvent bufferEvent)
{
_manager = manager;
_parentLock = parentLock;
diff --git a/src/Ryujinx.Audio/Renderer/Server/AudioRenderSystem.cs b/src/Ryujinx.Audio/Renderer/Server/AudioRenderSystem.cs
index 246889c48..65a134af1 100644
--- a/src/Ryujinx.Audio/Renderer/Server/AudioRenderSystem.cs
+++ b/src/Ryujinx.Audio/Renderer/Server/AudioRenderSystem.cs
@@ -26,7 +26,7 @@ namespace Ryujinx.Audio.Renderer.Server
{
public class AudioRenderSystem : IDisposable
{
- private readonly object _lock = new();
+ private readonly Lock _lock = new();
private AudioRendererRenderingDevice _renderingDevice;
private AudioRendererExecutionMode _executionMode;
diff --git a/src/Ryujinx.Audio/Renderer/Server/AudioRendererManager.cs b/src/Ryujinx.Audio/Renderer/Server/AudioRendererManager.cs
index e334a89f6..6d7db059f 100644
--- a/src/Ryujinx.Audio/Renderer/Server/AudioRendererManager.cs
+++ b/src/Ryujinx.Audio/Renderer/Server/AudioRendererManager.cs
@@ -19,12 +19,12 @@ namespace Ryujinx.Audio.Renderer.Server
///
/// Lock used for session allocation.
///
- private readonly object _sessionLock = new();
+ private readonly Lock _sessionLock = new();
///
/// Lock used to control the running state.
///
- private readonly object _audioProcessorLock = new();
+ private readonly Lock _audioProcessorLock = new();
///
/// The session ids allocation table.
diff --git a/src/Ryujinx.Audio/Renderer/Server/Upsampler/UpsamplerManager.cs b/src/Ryujinx.Audio/Renderer/Server/Upsampler/UpsamplerManager.cs
index dbc2c9b3f..8b3f39439 100644
--- a/src/Ryujinx.Audio/Renderer/Server/Upsampler/UpsamplerManager.cs
+++ b/src/Ryujinx.Audio/Renderer/Server/Upsampler/UpsamplerManager.cs
@@ -1,5 +1,6 @@
using System;
using System.Diagnostics;
+using System.Threading;
namespace Ryujinx.Audio.Renderer.Server.Upsampler
{
@@ -16,7 +17,7 @@ namespace Ryujinx.Audio.Renderer.Server.Upsampler
///
/// Global lock of the object.
///
- private readonly object _lock = new();
+ private readonly Lock _lock = new();
///
/// The upsamplers instances.
diff --git a/src/Ryujinx.Audio/Ryujinx.Audio.csproj b/src/Ryujinx.Audio/Ryujinx.Audio.csproj
index 8901bbf59..92e0fe93f 100644
--- a/src/Ryujinx.Audio/Ryujinx.Audio.csproj
+++ b/src/Ryujinx.Audio/Ryujinx.Audio.csproj
@@ -1,7 +1,6 @@
- net8.0true$(DefaultItemExcludes);._*
diff --git a/src/Ryujinx.Common/PreciseSleep/NanosleepPool.cs b/src/Ryujinx.Common/PreciseSleep/NanosleepPool.cs
index c0973dcb3..45b8e95fa 100644
--- a/src/Ryujinx.Common/PreciseSleep/NanosleepPool.cs
+++ b/src/Ryujinx.Common/PreciseSleep/NanosleepPool.cs
@@ -124,7 +124,7 @@ namespace Ryujinx.Common.PreciseSleep
}
}
- private readonly object _lock = new();
+ private readonly Lock _lock = new();
private readonly List _threads = new();
private readonly List _active = new();
private readonly Stack _free = new();
diff --git a/src/Ryujinx.Common/PreciseSleep/WindowsGranularTimer.cs b/src/Ryujinx.Common/PreciseSleep/WindowsGranularTimer.cs
index 3bf092704..cef4dc927 100644
--- a/src/Ryujinx.Common/PreciseSleep/WindowsGranularTimer.cs
+++ b/src/Ryujinx.Common/PreciseSleep/WindowsGranularTimer.cs
@@ -50,7 +50,7 @@ namespace Ryujinx.Common.SystemInterop
private long _lastTicks = PerformanceCounter.ElapsedTicks;
private long _lastId;
- private readonly object _lock = new();
+ private readonly Lock _lock = new();
private readonly List _waitingObjects = new();
private WindowsGranularTimer()
diff --git a/src/Ryujinx.Common/Ryujinx.Common.csproj b/src/Ryujinx.Common/Ryujinx.Common.csproj
index 85d4b58bd..de163aae7 100644
--- a/src/Ryujinx.Common/Ryujinx.Common.csproj
+++ b/src/Ryujinx.Common/Ryujinx.Common.csproj
@@ -1,7 +1,6 @@
- net8.0true$(DefineConstants);$(ExtraDefineConstants)$(DefaultItemExcludes);._*
diff --git a/src/Ryujinx.Cpu/AppleHv/HvVm.cs b/src/Ryujinx.Cpu/AppleHv/HvVm.cs
index a12bbea9b..b4d45f36d 100644
--- a/src/Ryujinx.Cpu/AppleHv/HvVm.cs
+++ b/src/Ryujinx.Cpu/AppleHv/HvVm.cs
@@ -1,6 +1,7 @@
using Ryujinx.Memory;
using System;
using System.Runtime.Versioning;
+using System.Threading;
namespace Ryujinx.Cpu.AppleHv
{
@@ -12,7 +13,7 @@ namespace Ryujinx.Cpu.AppleHv
private static int _addressSpaces;
private static HvIpaAllocator _ipaAllocator;
- private static readonly object _lock = new();
+ private static readonly Lock _lock = new();
public static (ulong, HvIpaAllocator) CreateAddressSpace(MemoryBlock block)
{
diff --git a/src/Ryujinx.Cpu/LightningJit/Arm32/Target/Arm64/InstEmitSystem.cs b/src/Ryujinx.Cpu/LightningJit/Arm32/Target/Arm64/InstEmitSystem.cs
index 4d97a2264..21e40b6aa 100644
--- a/src/Ryujinx.Cpu/LightningJit/Arm32/Target/Arm64/InstEmitSystem.cs
+++ b/src/Ryujinx.Cpu/LightningJit/Arm32/Target/Arm64/InstEmitSystem.cs
@@ -478,7 +478,7 @@ namespace Ryujinx.Cpu.LightningJit.Arm32.Target.Arm64
bool skipContext,
int spillBaseOffset,
int? resultRegister,
- params ulong[] callArgs)
+ params ReadOnlySpan callArgs)
{
uint resultMask = 0u;
diff --git a/src/Ryujinx.Cpu/LightningJit/Arm64/Target/Arm64/InstEmitSystem.cs b/src/Ryujinx.Cpu/LightningJit/Arm64/Target/Arm64/InstEmitSystem.cs
index f534e8b6e..bf9338400 100644
--- a/src/Ryujinx.Cpu/LightningJit/Arm64/Target/Arm64/InstEmitSystem.cs
+++ b/src/Ryujinx.Cpu/LightningJit/Arm64/Target/Arm64/InstEmitSystem.cs
@@ -307,7 +307,7 @@ namespace Ryujinx.Cpu.LightningJit.Arm64.Target.Arm64
int tempRegister;
int tempGuestAddress = -1;
- bool inlineLookup = guestAddress.Kind != OperandKind.Constant &&
+ bool inlineLookup = guestAddress.Kind != OperandKind.Constant &&
funcTable is { Sparse: true };
if (guestAddress.Kind == OperandKind.Constant)
@@ -417,7 +417,7 @@ namespace Ryujinx.Cpu.LightningJit.Arm64.Target.Arm64
nint funcPtr,
int spillBaseOffset,
int? resultRegister,
- params ulong[] callArgs)
+ params ReadOnlySpan callArgs)
{
uint resultMask = 0u;
diff --git a/src/Ryujinx.Cpu/LightningJit/Cache/JitCache.cs b/src/Ryujinx.Cpu/LightningJit/Cache/JitCache.cs
index ac1274bf6..10ae050b6 100644
--- a/src/Ryujinx.Cpu/LightningJit/Cache/JitCache.cs
+++ b/src/Ryujinx.Cpu/LightningJit/Cache/JitCache.cs
@@ -5,6 +5,7 @@ using System.Collections.Generic;
using System.Diagnostics;
using System.Runtime.InteropServices;
using System.Runtime.Versioning;
+using System.Threading;
namespace Ryujinx.Cpu.LightningJit.Cache
{
@@ -23,7 +24,7 @@ namespace Ryujinx.Cpu.LightningJit.Cache
private static readonly List _cacheEntries = new();
- private static readonly object _lock = new();
+ private static readonly Lock _lock = new();
private static bool _initialized;
[SupportedOSPlatform("windows")]
diff --git a/src/Ryujinx.Cpu/LightningJit/Cache/NoWxCache.cs b/src/Ryujinx.Cpu/LightningJit/Cache/NoWxCache.cs
index 3cf279ae3..e9a342aba 100644
--- a/src/Ryujinx.Cpu/LightningJit/Cache/NoWxCache.cs
+++ b/src/Ryujinx.Cpu/LightningJit/Cache/NoWxCache.cs
@@ -4,6 +4,7 @@ using Ryujinx.Memory;
using System;
using System.Collections.Generic;
using System.Diagnostics;
+using System.Threading;
namespace Ryujinx.Cpu.LightningJit.Cache
{
@@ -104,7 +105,7 @@ namespace Ryujinx.Cpu.LightningJit.Cache
private readonly MemoryCache _sharedCache;
private readonly MemoryCache _localCache;
private readonly PageAlignedRangeList _pendingMap;
- private readonly object _lock;
+ private readonly Lock _lock = new();
class ThreadLocalCacheEntry
{
@@ -137,7 +138,6 @@ namespace Ryujinx.Cpu.LightningJit.Cache
_sharedCache = new(allocator, SharedCacheSize);
_localCache = new(allocator, LocalCacheSize);
_pendingMap = new(_sharedCache.ReprotectAsRx, RegisterFunction);
- _lock = new();
}
public unsafe nint Map(nint framePointer, ReadOnlySpan code, ulong guestAddress, ulong guestSize)
diff --git a/src/Ryujinx.Cpu/Ryujinx.Cpu.csproj b/src/Ryujinx.Cpu/Ryujinx.Cpu.csproj
index 0a55a7dea..e58a2ce97 100644
--- a/src/Ryujinx.Cpu/Ryujinx.Cpu.csproj
+++ b/src/Ryujinx.Cpu/Ryujinx.Cpu.csproj
@@ -1,7 +1,6 @@
- net8.0true$(DefaultItemExcludes);._*
diff --git a/src/Ryujinx.Cpu/Signal/NativeSignalHandler.cs b/src/Ryujinx.Cpu/Signal/NativeSignalHandler.cs
index 2985f1c21..75a6d3bf8 100644
--- a/src/Ryujinx.Cpu/Signal/NativeSignalHandler.cs
+++ b/src/Ryujinx.Cpu/Signal/NativeSignalHandler.cs
@@ -5,6 +5,7 @@ using System;
using System.Diagnostics;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
+using System.Threading;
namespace Ryujinx.Cpu.Signal
{
@@ -59,7 +60,7 @@ namespace Ryujinx.Cpu.Signal
private static MemoryBlock _codeBlock;
- private static readonly object _lock = new();
+ private static readonly Lock _lock = new();
private static bool _initialized;
static NativeSignalHandler()
diff --git a/src/Ryujinx.Graphics.Device/Ryujinx.Graphics.Device.csproj b/src/Ryujinx.Graphics.Device/Ryujinx.Graphics.Device.csproj
index 58f54de7d..cbe276355 100644
--- a/src/Ryujinx.Graphics.Device/Ryujinx.Graphics.Device.csproj
+++ b/src/Ryujinx.Graphics.Device/Ryujinx.Graphics.Device.csproj
@@ -1,7 +1,6 @@
- net8.0$(DefaultItemExcludes);._*
diff --git a/src/Ryujinx.Graphics.GAL/Multithreading/ThreadedRenderer.cs b/src/Ryujinx.Graphics.GAL/Multithreading/ThreadedRenderer.cs
index 0bd3dc592..6375d290c 100644
--- a/src/Ryujinx.Graphics.GAL/Multithreading/ThreadedRenderer.cs
+++ b/src/Ryujinx.Graphics.GAL/Multithreading/ThreadedRenderer.cs
@@ -58,7 +58,7 @@ namespace Ryujinx.Graphics.GAL.Multithreading
public uint ProgramCount { get; set; } = 0;
private Action _interruptAction;
- private readonly object _interruptLock = new();
+ private readonly Lock _interruptLock = new();
public event EventHandler ScreenCaptured;
diff --git a/src/Ryujinx.Graphics.GAL/Ryujinx.Graphics.GAL.csproj b/src/Ryujinx.Graphics.GAL/Ryujinx.Graphics.GAL.csproj
index a230296c1..b94a4ec90 100644
--- a/src/Ryujinx.Graphics.GAL/Ryujinx.Graphics.GAL.csproj
+++ b/src/Ryujinx.Graphics.GAL/Ryujinx.Graphics.GAL.csproj
@@ -1,7 +1,6 @@
- net8.0$(DefaultItemExcludes);._*
diff --git a/src/Ryujinx.Graphics.Gpu/Image/TextureCache.cs b/src/Ryujinx.Graphics.Gpu/Image/TextureCache.cs
index 2cfd9af5b..ff7f11142 100644
--- a/src/Ryujinx.Graphics.Gpu/Image/TextureCache.cs
+++ b/src/Ryujinx.Graphics.Gpu/Image/TextureCache.cs
@@ -8,6 +8,7 @@ using Ryujinx.Graphics.Texture;
using Ryujinx.Memory.Range;
using System;
using System.Collections.Generic;
+using System.Linq;
using System.Threading;
namespace Ryujinx.Graphics.Gpu.Image
@@ -998,7 +999,7 @@ namespace Ryujinx.Graphics.Gpu.Image
{
bool dataOverlaps = texture.DataOverlaps(overlap, compatibility);
- if (!overlap.IsView && dataOverlaps && !incompatibleOverlaps.Exists(incompatible => incompatible.Group == overlap.Group))
+ if (!overlap.IsView && dataOverlaps && !incompatibleOverlaps.Any(incompatible => incompatible.Group == overlap.Group))
{
incompatibleOverlaps.Add(new TextureIncompatibleOverlap(overlap.Group, compatibility));
}
diff --git a/src/Ryujinx.Graphics.Gpu/Image/TextureGroup.cs b/src/Ryujinx.Graphics.Gpu/Image/TextureGroup.cs
index 526fc0c24..2db5c6290 100644
--- a/src/Ryujinx.Graphics.Gpu/Image/TextureGroup.cs
+++ b/src/Ryujinx.Graphics.Gpu/Image/TextureGroup.cs
@@ -7,6 +7,7 @@ using Ryujinx.Memory.Range;
using Ryujinx.Memory.Tracking;
using System;
using System.Collections.Generic;
+using System.Linq;
using System.Runtime.CompilerServices;
namespace Ryujinx.Graphics.Gpu.Image
@@ -1555,7 +1556,7 @@ namespace Ryujinx.Graphics.Gpu.Image
/// True if the overlap should register copy dependencies
public void RegisterIncompatibleOverlap(TextureIncompatibleOverlap other, bool copy)
{
- if (!_incompatibleOverlaps.Exists(overlap => overlap.Group == other.Group))
+ if (!_incompatibleOverlaps.Any(overlap => overlap.Group == other.Group))
{
if (copy && other.Compatibility == TextureViewCompatibility.LayoutIncompatible)
{
@@ -1701,3 +1702,4 @@ namespace Ryujinx.Graphics.Gpu.Image
}
}
}
+
diff --git a/src/Ryujinx.Graphics.Gpu/Image/TexturePool.cs b/src/Ryujinx.Graphics.Gpu/Image/TexturePool.cs
index be7cb0b89..3bf122412 100644
--- a/src/Ryujinx.Graphics.Gpu/Image/TexturePool.cs
+++ b/src/Ryujinx.Graphics.Gpu/Image/TexturePool.cs
@@ -721,7 +721,7 @@ namespace Ryujinx.Graphics.Gpu.Image
/// The format of the texture
/// The texture swizzle components
/// The depth-stencil mode
- private static DepthStencilMode GetDepthStencilMode(Format format, params SwizzleComponent[] components)
+ private static DepthStencilMode GetDepthStencilMode(Format format, params ReadOnlySpan components)
{
// R = Depth, G = Stencil.
// On 24-bits depth formats, this is inverted (Stencil is R etc).
diff --git a/src/Ryujinx.Graphics.Gpu/Memory/BufferModifiedRangeList.cs b/src/Ryujinx.Graphics.Gpu/Memory/BufferModifiedRangeList.cs
index d330de638..c5a12c1fc 100644
--- a/src/Ryujinx.Graphics.Gpu/Memory/BufferModifiedRangeList.cs
+++ b/src/Ryujinx.Graphics.Gpu/Memory/BufferModifiedRangeList.cs
@@ -2,6 +2,7 @@ using Ryujinx.Common.Pools;
using Ryujinx.Memory.Range;
using System;
using System.Linq;
+using System.Threading;
namespace Ryujinx.Graphics.Gpu.Memory
{
@@ -76,7 +77,7 @@ namespace Ryujinx.Graphics.Gpu.Memory
private BufferMigration _source;
private BufferModifiedRangeList _migrationTarget;
- private readonly object _lock = new();
+ private readonly Lock _lock = new();
///
/// Whether the modified range list has any entries or not.
@@ -435,7 +436,7 @@ namespace Ryujinx.Graphics.Gpu.Memory
if (_source == null)
{
- // Create a new migration.
+ // Create a new migration.
_source = new BufferMigration(new BufferMigrationSpan[] { span }, this, _context.SyncNumber);
_context.RegisterBufferMigration(_source);
diff --git a/src/Ryujinx.Graphics.Gpu/Ryujinx.Graphics.Gpu.csproj b/src/Ryujinx.Graphics.Gpu/Ryujinx.Graphics.Gpu.csproj
index 8c740fadc..4cd9c1d5c 100644
--- a/src/Ryujinx.Graphics.Gpu/Ryujinx.Graphics.Gpu.csproj
+++ b/src/Ryujinx.Graphics.Gpu/Ryujinx.Graphics.Gpu.csproj
@@ -1,7 +1,6 @@
- net8.0true$(DefaultItemExcludes);._*
diff --git a/src/Ryujinx.Graphics.Host1x/Ryujinx.Graphics.Host1x.csproj b/src/Ryujinx.Graphics.Host1x/Ryujinx.Graphics.Host1x.csproj
index 92077e26a..3000d41de 100644
--- a/src/Ryujinx.Graphics.Host1x/Ryujinx.Graphics.Host1x.csproj
+++ b/src/Ryujinx.Graphics.Host1x/Ryujinx.Graphics.Host1x.csproj
@@ -1,7 +1,6 @@
- net8.0$(DefaultItemExcludes);._*
diff --git a/src/Ryujinx.Graphics.Nvdec.FFmpeg/Ryujinx.Graphics.Nvdec.FFmpeg.csproj b/src/Ryujinx.Graphics.Nvdec.FFmpeg/Ryujinx.Graphics.Nvdec.FFmpeg.csproj
index 7659c4b25..9e250d171 100644
--- a/src/Ryujinx.Graphics.Nvdec.FFmpeg/Ryujinx.Graphics.Nvdec.FFmpeg.csproj
+++ b/src/Ryujinx.Graphics.Nvdec.FFmpeg/Ryujinx.Graphics.Nvdec.FFmpeg.csproj
@@ -1,7 +1,6 @@
- net8.0true$(DefaultItemExcludes);._*
diff --git a/src/Ryujinx.Graphics.Nvdec.Vp9/Ryujinx.Graphics.Nvdec.Vp9.csproj b/src/Ryujinx.Graphics.Nvdec.Vp9/Ryujinx.Graphics.Nvdec.Vp9.csproj
index 7659c4b25..9e250d171 100644
--- a/src/Ryujinx.Graphics.Nvdec.Vp9/Ryujinx.Graphics.Nvdec.Vp9.csproj
+++ b/src/Ryujinx.Graphics.Nvdec.Vp9/Ryujinx.Graphics.Nvdec.Vp9.csproj
@@ -1,7 +1,6 @@
- net8.0true$(DefaultItemExcludes);._*
diff --git a/src/Ryujinx.Graphics.Nvdec/Ryujinx.Graphics.Nvdec.csproj b/src/Ryujinx.Graphics.Nvdec/Ryujinx.Graphics.Nvdec.csproj
index 7a13b5d1b..d020ae50e 100644
--- a/src/Ryujinx.Graphics.Nvdec/Ryujinx.Graphics.Nvdec.csproj
+++ b/src/Ryujinx.Graphics.Nvdec/Ryujinx.Graphics.Nvdec.csproj
@@ -1,7 +1,6 @@
- net8.0true$(DefaultItemExcludes);._*
diff --git a/src/Ryujinx.Graphics.OpenGL/Queries/CounterQueue.cs b/src/Ryujinx.Graphics.OpenGL/Queries/CounterQueue.cs
index 345a99ffa..7e0311407 100644
--- a/src/Ryujinx.Graphics.OpenGL/Queries/CounterQueue.cs
+++ b/src/Ryujinx.Graphics.OpenGL/Queries/CounterQueue.cs
@@ -19,7 +19,7 @@ namespace Ryujinx.Graphics.OpenGL.Queries
private ulong _accumulatedCounter;
private int _waiterCount;
- private readonly object _lock = new();
+ private readonly Lock _lock = new();
private readonly Queue _queryPool;
private readonly AutoResetEvent _queuedEvent = new(false);
diff --git a/src/Ryujinx.Graphics.OpenGL/Queries/CounterQueueEvent.cs b/src/Ryujinx.Graphics.OpenGL/Queries/CounterQueueEvent.cs
index 32b75c615..889517480 100644
--- a/src/Ryujinx.Graphics.OpenGL/Queries/CounterQueueEvent.cs
+++ b/src/Ryujinx.Graphics.OpenGL/Queries/CounterQueueEvent.cs
@@ -24,7 +24,7 @@ namespace Ryujinx.Graphics.OpenGL.Queries
private bool _hostAccessReserved = false;
private int _refCount = 1; // Starts with a reference from the counter queue.
- private readonly object _lock = new();
+ private readonly Lock _lock = new();
private ulong _result = ulong.MaxValue;
private double _divisor = 1f;
diff --git a/src/Ryujinx.Graphics.OpenGL/ResourcePool.cs b/src/Ryujinx.Graphics.OpenGL/ResourcePool.cs
index 6385f57b5..c8ff30a07 100644
--- a/src/Ryujinx.Graphics.OpenGL/ResourcePool.cs
+++ b/src/Ryujinx.Graphics.OpenGL/ResourcePool.cs
@@ -2,6 +2,7 @@ using Ryujinx.Graphics.GAL;
using Ryujinx.Graphics.OpenGL.Image;
using System;
using System.Collections.Generic;
+using System.Threading;
namespace Ryujinx.Graphics.OpenGL
{
@@ -19,7 +20,7 @@ namespace Ryujinx.Graphics.OpenGL
{
private const int DisposedLiveFrames = 2;
- private readonly object _lock = new();
+ private readonly Lock _lock = new();
private readonly Dictionary> _textures = new();
///
diff --git a/src/Ryujinx.Graphics.OpenGL/Ryujinx.Graphics.OpenGL.csproj b/src/Ryujinx.Graphics.OpenGL/Ryujinx.Graphics.OpenGL.csproj
index 931e70c03..47cec29e2 100644
--- a/src/Ryujinx.Graphics.OpenGL/Ryujinx.Graphics.OpenGL.csproj
+++ b/src/Ryujinx.Graphics.OpenGL/Ryujinx.Graphics.OpenGL.csproj
@@ -1,7 +1,6 @@
- net8.0true$(DefaultItemExcludes);._*
diff --git a/src/Ryujinx.Graphics.Shader/CodeGen/Spirv/SpirvGenerator.cs b/src/Ryujinx.Graphics.Shader/CodeGen/Spirv/SpirvGenerator.cs
index b259dde28..105812ebf 100644
--- a/src/Ryujinx.Graphics.Shader/CodeGen/Spirv/SpirvGenerator.cs
+++ b/src/Ryujinx.Graphics.Shader/CodeGen/Spirv/SpirvGenerator.cs
@@ -4,6 +4,7 @@ using Ryujinx.Graphics.Shader.StructuredIr;
using Ryujinx.Graphics.Shader.Translation;
using System;
using System.Collections.Generic;
+using System.Threading;
using static Spv.Specification;
namespace Ryujinx.Graphics.Shader.CodeGen.Spirv
@@ -19,13 +20,12 @@ namespace Ryujinx.Graphics.Shader.CodeGen.Spirv
private const int GeneratorPoolCount = 1;
private static readonly ObjectPool _instructionPool;
private static readonly ObjectPool _integerPool;
- private static readonly object _poolLock;
+ private static readonly Lock _poolLock = new();
static SpirvGenerator()
{
_instructionPool = new(() => new SpvInstructionPool(), GeneratorPoolCount);
_integerPool = new(() => new SpvLiteralIntegerPool(), GeneratorPoolCount);
- _poolLock = new object();
}
private const HelperFunctionsMask NeedsInvocationIdMask = HelperFunctionsMask.SwizzleAdd;
diff --git a/src/Ryujinx.Graphics.Shader/Ryujinx.Graphics.Shader.csproj b/src/Ryujinx.Graphics.Shader/Ryujinx.Graphics.Shader.csproj
index be32641eb..cfb188daf 100644
--- a/src/Ryujinx.Graphics.Shader/Ryujinx.Graphics.Shader.csproj
+++ b/src/Ryujinx.Graphics.Shader/Ryujinx.Graphics.Shader.csproj
@@ -1,7 +1,6 @@
- net8.0$(DefaultItemExcludes);._*
diff --git a/src/Ryujinx.Graphics.Texture/Ryujinx.Graphics.Texture.csproj b/src/Ryujinx.Graphics.Texture/Ryujinx.Graphics.Texture.csproj
index 48d10f1d5..2b4445aeb 100644
--- a/src/Ryujinx.Graphics.Texture/Ryujinx.Graphics.Texture.csproj
+++ b/src/Ryujinx.Graphics.Texture/Ryujinx.Graphics.Texture.csproj
@@ -1,6 +1,5 @@
- net8.0true$(DefaultItemExcludes);._*
diff --git a/src/Ryujinx.Graphics.Vic/Ryujinx.Graphics.Vic.csproj b/src/Ryujinx.Graphics.Vic/Ryujinx.Graphics.Vic.csproj
index 820e807e6..5505a3aa1 100644
--- a/src/Ryujinx.Graphics.Vic/Ryujinx.Graphics.Vic.csproj
+++ b/src/Ryujinx.Graphics.Vic/Ryujinx.Graphics.Vic.csproj
@@ -1,7 +1,6 @@
- net8.0true$(DefaultItemExcludes);._*
diff --git a/src/Ryujinx.Graphics.Video/Ryujinx.Graphics.Video.csproj b/src/Ryujinx.Graphics.Video/Ryujinx.Graphics.Video.csproj
index d85effe32..d64990f82 100644
--- a/src/Ryujinx.Graphics.Video/Ryujinx.Graphics.Video.csproj
+++ b/src/Ryujinx.Graphics.Video/Ryujinx.Graphics.Video.csproj
@@ -1,7 +1,6 @@
- net8.0$(DefaultItemExcludes);._*
diff --git a/src/Ryujinx.Graphics.Vulkan/BackgroundResources.cs b/src/Ryujinx.Graphics.Vulkan/BackgroundResources.cs
index 0290987fd..e4b68fa40 100644
--- a/src/Ryujinx.Graphics.Vulkan/BackgroundResources.cs
+++ b/src/Ryujinx.Graphics.Vulkan/BackgroundResources.cs
@@ -25,7 +25,7 @@ namespace Ryujinx.Graphics.Vulkan
{
bool useBackground = _gd.BackgroundQueue.Handle != 0 && _gd.Vendor != Vendor.Amd;
Queue queue = useBackground ? _gd.BackgroundQueue : _gd.Queue;
- object queueLock = useBackground ? _gd.BackgroundQueueLock : _gd.QueueLock;
+ Lock queueLock = useBackground ? _gd.BackgroundQueueLock : _gd.QueueLock;
lock (queueLock)
{
diff --git a/src/Ryujinx.Graphics.Vulkan/CommandBufferPool.cs b/src/Ryujinx.Graphics.Vulkan/CommandBufferPool.cs
index e1fd3fb9d..ed76c6566 100644
--- a/src/Ryujinx.Graphics.Vulkan/CommandBufferPool.cs
+++ b/src/Ryujinx.Graphics.Vulkan/CommandBufferPool.cs
@@ -17,7 +17,7 @@ namespace Ryujinx.Graphics.Vulkan
private readonly Vk _api;
private readonly Device _device;
private readonly Queue _queue;
- private readonly object _queueLock;
+ private readonly Lock _queueLock;
private readonly bool _concurrentFenceWaitUnsupported;
private readonly CommandPool _pool;
private readonly Thread _owner;
@@ -63,7 +63,7 @@ namespace Ryujinx.Graphics.Vulkan
Vk api,
Device device,
Queue queue,
- object queueLock,
+ Lock queueLock,
uint queueFamilyIndex,
bool concurrentFenceWaitUnsupported,
bool isLight = false)
diff --git a/src/Ryujinx.Graphics.Vulkan/FormatCapabilities.cs b/src/Ryujinx.Graphics.Vulkan/FormatCapabilities.cs
index 9ea8cec4b..5a3bd61bd 100644
--- a/src/Ryujinx.Graphics.Vulkan/FormatCapabilities.cs
+++ b/src/Ryujinx.Graphics.Vulkan/FormatCapabilities.cs
@@ -68,7 +68,7 @@ namespace Ryujinx.Graphics.Vulkan
_optimalTable = new FormatFeatureFlags[totalFormats];
}
- public bool BufferFormatsSupport(FormatFeatureFlags flags, params Format[] formats)
+ public bool BufferFormatsSupport(FormatFeatureFlags flags, params ReadOnlySpan formats)
{
foreach (Format format in formats)
{
@@ -81,7 +81,7 @@ namespace Ryujinx.Graphics.Vulkan
return true;
}
- public bool OptimalFormatsSupport(FormatFeatureFlags flags, params Format[] formats)
+ public bool OptimalFormatsSupport(FormatFeatureFlags flags, params ReadOnlySpan formats)
{
foreach (Format format in formats)
{
diff --git a/src/Ryujinx.Graphics.Vulkan/HostMemoryAllocator.cs b/src/Ryujinx.Graphics.Vulkan/HostMemoryAllocator.cs
index 77c5f95c9..5c8b2a761 100644
--- a/src/Ryujinx.Graphics.Vulkan/HostMemoryAllocator.cs
+++ b/src/Ryujinx.Graphics.Vulkan/HostMemoryAllocator.cs
@@ -5,6 +5,7 @@ using Silk.NET.Vulkan;
using Silk.NET.Vulkan.Extensions.EXT;
using System;
using System.Collections.Generic;
+using System.Threading;
namespace Ryujinx.Graphics.Vulkan
{
@@ -31,7 +32,7 @@ namespace Ryujinx.Graphics.Vulkan
private readonly Vk _api;
private readonly ExtExternalMemoryHost _hostMemoryApi;
private readonly Device _device;
- private readonly object _lock = new();
+ private readonly Lock _lock = new();
private readonly List _allocations;
private readonly IntervalTree _allocationTree;
diff --git a/src/Ryujinx.Graphics.Vulkan/Queries/CounterQueue.cs b/src/Ryujinx.Graphics.Vulkan/Queries/CounterQueue.cs
index 0d133e50e..fa10f13b9 100644
--- a/src/Ryujinx.Graphics.Vulkan/Queries/CounterQueue.cs
+++ b/src/Ryujinx.Graphics.Vulkan/Queries/CounterQueue.cs
@@ -24,7 +24,7 @@ namespace Ryujinx.Graphics.Vulkan.Queries
private ulong _accumulatedCounter;
private int _waiterCount;
- private readonly object _lock = new();
+ private readonly Lock _lock = new();
private readonly Queue _queryPool;
private readonly AutoResetEvent _queuedEvent = new(false);
diff --git a/src/Ryujinx.Graphics.Vulkan/Queries/CounterQueueEvent.cs b/src/Ryujinx.Graphics.Vulkan/Queries/CounterQueueEvent.cs
index 14d3050bf..0bac3be12 100644
--- a/src/Ryujinx.Graphics.Vulkan/Queries/CounterQueueEvent.cs
+++ b/src/Ryujinx.Graphics.Vulkan/Queries/CounterQueueEvent.cs
@@ -22,7 +22,7 @@ namespace Ryujinx.Graphics.Vulkan.Queries
private bool _hostAccessReserved;
private int _refCount = 1; // Starts with a reference from the counter queue.
- private readonly object _lock = new();
+ private readonly Lock _lock = new();
private ulong _result = ulong.MaxValue;
private double _divisor = 1f;
diff --git a/src/Ryujinx.Graphics.Vulkan/Ryujinx.Graphics.Vulkan.csproj b/src/Ryujinx.Graphics.Vulkan/Ryujinx.Graphics.Vulkan.csproj
index b138e309a..5481e57f2 100644
--- a/src/Ryujinx.Graphics.Vulkan/Ryujinx.Graphics.Vulkan.csproj
+++ b/src/Ryujinx.Graphics.Vulkan/Ryujinx.Graphics.Vulkan.csproj
@@ -1,7 +1,6 @@
- net8.0$(DefaultItemExcludes);._*
diff --git a/src/Ryujinx.Graphics.Vulkan/Shader.cs b/src/Ryujinx.Graphics.Vulkan/Shader.cs
index f23b78f51..79e2f712a 100644
--- a/src/Ryujinx.Graphics.Vulkan/Shader.cs
+++ b/src/Ryujinx.Graphics.Vulkan/Shader.cs
@@ -5,6 +5,7 @@ using shaderc;
using Silk.NET.Vulkan;
using System;
using System.Runtime.InteropServices;
+using System.Threading;
using System.Threading.Tasks;
namespace Ryujinx.Graphics.Vulkan
@@ -13,7 +14,7 @@ namespace Ryujinx.Graphics.Vulkan
{
// The shaderc.net dependency's Options constructor and dispose are not thread safe.
// Take this lock when using them.
- private static readonly object _shaderOptionsLock = new();
+ private static readonly Lock _shaderOptionsLock = new();
private static readonly nint _ptrMainEntryPointName = Marshal.StringToHGlobalAnsi("main");
diff --git a/src/Ryujinx.Graphics.Vulkan/VulkanRenderer.cs b/src/Ryujinx.Graphics.Vulkan/VulkanRenderer.cs
index cc2bc36c2..ad4b18e50 100644
--- a/src/Ryujinx.Graphics.Vulkan/VulkanRenderer.cs
+++ b/src/Ryujinx.Graphics.Vulkan/VulkanRenderer.cs
@@ -11,6 +11,7 @@ using Silk.NET.Vulkan.Extensions.KHR;
using System;
using System.Collections.Generic;
using System.Runtime.InteropServices;
+using System.Threading;
using Format = Ryujinx.Graphics.GAL.Format;
using PrimitiveTopology = Ryujinx.Graphics.GAL.PrimitiveTopology;
using SamplerCreateInfo = Ryujinx.Graphics.GAL.SamplerCreateInfo;
@@ -45,8 +46,8 @@ namespace Ryujinx.Graphics.Vulkan
internal uint QueueFamilyIndex { get; private set; }
internal Queue Queue { get; private set; }
internal Queue BackgroundQueue { get; private set; }
- internal object BackgroundQueueLock { get; private set; }
- internal object QueueLock { get; private set; }
+ internal Lock BackgroundQueueLock { get; private set; }
+ internal Lock QueueLock { get; private set; }
internal MemoryAllocator MemoryAllocator { get; private set; }
internal HostMemoryAllocator HostMemoryAllocator { get; private set; }
@@ -120,7 +121,7 @@ namespace Ryujinx.Graphics.Vulkan
}
public static VulkanRenderer Create(
- string preferredGpuId,
+ string preferredGpuId,
Func getSurface,
Func getRequiredExtensions
) => new(Vk.GetApi(), getSurface, getRequiredExtensions, preferredGpuId);
@@ -163,7 +164,7 @@ namespace Ryujinx.Graphics.Vulkan
{
Api.GetDeviceQueue(_device, queueFamilyIndex, 1, out var backgroundQueue);
BackgroundQueue = backgroundQueue;
- BackgroundQueueLock = new object();
+ BackgroundQueueLock = new();
}
PhysicalDeviceProperties2 properties2 = new()
@@ -496,7 +497,7 @@ namespace Ryujinx.Graphics.Vulkan
Api.GetDeviceQueue(_device, queueFamilyIndex, 0, out var queue);
Queue = queue;
- QueueLock = new object();
+ QueueLock = new();
LoadFeatures(maxQueueCount, queueFamilyIndex);
diff --git a/src/Ryujinx.HLE/FileSystem/ContentManager.cs b/src/Ryujinx.HLE/FileSystem/ContentManager.cs
index 51f6058fc..9bda759a5 100644
--- a/src/Ryujinx.HLE/FileSystem/ContentManager.cs
+++ b/src/Ryujinx.HLE/FileSystem/ContentManager.cs
@@ -22,6 +22,7 @@ using System.IO.Compression;
using System.Linq;
using System.Text;
using System.Text.RegularExpressions;
+using System.Threading;
using Path = System.IO.Path;
namespace Ryujinx.HLE.FileSystem
@@ -55,7 +56,7 @@ namespace Ryujinx.HLE.FileSystem
private readonly VirtualFileSystem _virtualFileSystem;
- private readonly object _lock = new();
+ private readonly Lock _lock = new();
public ContentManager(VirtualFileSystem virtualFileSystem)
{
@@ -396,7 +397,7 @@ namespace Ryujinx.HLE.FileSystem
if (locationList != null)
{
LocationEntry entry =
- locationList.ToList().Find(x => x.TitleId == titleId && x.ContentType == contentType);
+ locationList.ToList().FirstOrDefault(x => x.TitleId == titleId && x.ContentType == contentType);
if (entry.ContentPath != null)
{
@@ -424,7 +425,7 @@ namespace Ryujinx.HLE.FileSystem
{
LinkedList locationList = _locationEntries[storageId];
- return locationList.ToList().Find(x => x.TitleId == titleId && x.ContentType == contentType);
+ return locationList.ToList().FirstOrDefault(x => x.TitleId == titleId && x.ContentType == contentType);
}
public void InstallFirmware(string firmwareSource)
@@ -719,7 +720,7 @@ namespace Ryujinx.HLE.FileSystem
if (updateNcas.TryGetValue(SystemUpdateTitleId, out var ncaEntry))
{
- string metaPath = ncaEntry.Find(x => x.type == NcaContentType.Meta).path;
+ string metaPath = ncaEntry.FirstOrDefault(x => x.type == NcaContentType.Meta).path;
CnmtContentMetaEntry[] metaEntries = null;
@@ -755,7 +756,7 @@ namespace Ryujinx.HLE.FileSystem
if (updateNcas.TryGetValue(SystemVersionTitleId, out var updateNcasItem))
{
- string versionEntry = updateNcasItem.Find(x => x.type != NcaContentType.Meta).path;
+ string versionEntry = updateNcasItem.FirstOrDefault(x => x.type != NcaContentType.Meta).path;
using Stream ncaStream = GetZipStream(archive.GetEntry(versionEntry));
Nca nca = new(_virtualFileSystem.KeySet, ncaStream.AsStorage());
@@ -774,9 +775,9 @@ namespace Ryujinx.HLE.FileSystem
{
if (updateNcas.TryGetValue(metaEntry.TitleId, out ncaEntry))
{
- metaPath = ncaEntry.Find(x => x.type == NcaContentType.Meta).path;
+ metaPath = ncaEntry.FirstOrDefault(x => x.type == NcaContentType.Meta).path;
- string contentPath = ncaEntry.Find(x => x.type != NcaContentType.Meta).path;
+ string contentPath = ncaEntry.FirstOrDefault(x => x.type != NcaContentType.Meta).path;
// Nintendo in 9.0.0, removed PPC and only kept the meta nca of it.
// This is a perfect valid case, so we should just ignore the missing content nca and continue.
@@ -915,8 +916,8 @@ namespace Ryujinx.HLE.FileSystem
{
if (updateNcas.TryGetValue(metaEntry.TitleId, out var ncaEntry))
{
- string metaNcaPath = ncaEntry.Find(x => x.type == NcaContentType.Meta).path;
- string contentPath = ncaEntry.Find(x => x.type != NcaContentType.Meta).path;
+ string metaNcaPath = ncaEntry.FirstOrDefault(x => x.type == NcaContentType.Meta).path;
+ string contentPath = ncaEntry.FirstOrDefault(x => x.type != NcaContentType.Meta).path;
// Nintendo in 9.0.0, removed PPC and only kept the meta nca of it.
// This is a perfect valid case, so we should just ignore the missing content nca and continue.
@@ -1076,7 +1077,7 @@ namespace Ryujinx.HLE.FileSystem
{
if (File.Exists(Path.Combine(pathToCheck, file)))
{
- return true;
+ return true;
}
}
return false;
diff --git a/src/Ryujinx.HLE/FileSystem/ContentMetaData.cs b/src/Ryujinx.HLE/FileSystem/ContentMetaData.cs
index aebcf7988..8cdb889be 100644
--- a/src/Ryujinx.HLE/FileSystem/ContentMetaData.cs
+++ b/src/Ryujinx.HLE/FileSystem/ContentMetaData.cs
@@ -46,7 +46,7 @@ namespace Ryujinx.HLE.FileSystem
continue;
}
- string ncaId = BitConverter.ToString(entry.NcaId).Replace("-", null).ToLower();
+ string ncaId = Convert.ToHexStringLower(entry.NcaId).Replace("-", null);
Nca nca = _pfs.GetNca(keySet, $"/{ncaId}.nca");
if (nca.GetProgramIndex() == programIndex)
diff --git a/src/Ryujinx.HLE/HOS/Applets/SoftwareKeyboard/SoftwareKeyboardApplet.cs b/src/Ryujinx.HLE/HOS/Applets/SoftwareKeyboard/SoftwareKeyboardApplet.cs
index 9ec202357..8fda00a7d 100644
--- a/src/Ryujinx.HLE/HOS/Applets/SoftwareKeyboard/SoftwareKeyboardApplet.cs
+++ b/src/Ryujinx.HLE/HOS/Applets/SoftwareKeyboard/SoftwareKeyboardApplet.cs
@@ -14,6 +14,7 @@ using System.IO;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
using System.Text;
+using System.Threading;
namespace Ryujinx.HLE.HOS.Applets
{
@@ -62,7 +63,7 @@ namespace Ryujinx.HLE.HOS.Applets
private bool _canAcceptController = false;
private KeyboardInputMode _inputMode = KeyboardInputMode.ControllerAndKeyboard;
- private readonly object _lock = new();
+ private readonly Lock _lock = new();
public event EventHandler AppletStateChanged;
diff --git a/src/Ryujinx.HLE/HOS/Applets/SoftwareKeyboard/SoftwareKeyboardRendererBase.cs b/src/Ryujinx.HLE/HOS/Applets/SoftwareKeyboard/SoftwareKeyboardRendererBase.cs
index 67b5f2b1f..e17b36911 100644
--- a/src/Ryujinx.HLE/HOS/Applets/SoftwareKeyboard/SoftwareKeyboardRendererBase.cs
+++ b/src/Ryujinx.HLE/HOS/Applets/SoftwareKeyboard/SoftwareKeyboardRendererBase.cs
@@ -6,6 +6,7 @@ using System.Diagnostics;
using System.IO;
using System.Reflection;
using System.Runtime.InteropServices;
+using System.Threading;
namespace Ryujinx.HLE.HOS.Applets.SoftwareKeyboard
{
@@ -21,7 +22,7 @@ namespace Ryujinx.HLE.HOS.Applets.SoftwareKeyboard
const string CancelText = "Cancel";
const string ControllerToggleText = "Toggle input";
- private readonly object _bufferLock = new();
+ private readonly Lock _bufferLock = new();
private RenderingSurfaceInfo _surfaceInfo = null;
private SKImageInfo _imageInfo;
diff --git a/src/Ryujinx.HLE/HOS/Applets/SoftwareKeyboard/TimedAction.cs b/src/Ryujinx.HLE/HOS/Applets/SoftwareKeyboard/TimedAction.cs
index 3eaf64596..a8b137df2 100644
--- a/src/Ryujinx.HLE/HOS/Applets/SoftwareKeyboard/TimedAction.cs
+++ b/src/Ryujinx.HLE/HOS/Applets/SoftwareKeyboard/TimedAction.cs
@@ -27,7 +27,7 @@ namespace Ryujinx.HLE.HOS.Applets.SoftwareKeyboard
private TRef _cancelled = null;
private Thread _thread = null;
- private readonly object _lock = new();
+ private readonly Lock _lock = new();
public bool IsRunning
{
diff --git a/src/Ryujinx.HLE/HOS/Kernel/Common/KResourceLimit.cs b/src/Ryujinx.HLE/HOS/Kernel/Common/KResourceLimit.cs
index 3f16f8c24..90231b460 100644
--- a/src/Ryujinx.HLE/HOS/Kernel/Common/KResourceLimit.cs
+++ b/src/Ryujinx.HLE/HOS/Kernel/Common/KResourceLimit.cs
@@ -2,6 +2,7 @@ using Ryujinx.Common;
using Ryujinx.HLE.HOS.Kernel.Threading;
using Ryujinx.Horizon.Common;
using System.Collections.Generic;
+using System.Threading;
namespace Ryujinx.HLE.HOS.Kernel.Common
{
@@ -14,7 +15,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Common
private readonly long[] _current2;
private readonly long[] _peak;
- private readonly object _lock;
+ private readonly object _lock = new();
private readonly LinkedList _waitingThreads;
@@ -27,8 +28,6 @@ namespace Ryujinx.HLE.HOS.Kernel.Common
_current2 = new long[(int)LimitableResource.Count];
_peak = new long[(int)LimitableResource.Count];
- _lock = new object();
-
_waitingThreads = new LinkedList();
}
diff --git a/src/Ryujinx.HLE/HOS/Kernel/Memory/KCodeMemory.cs b/src/Ryujinx.HLE/HOS/Kernel/Memory/KCodeMemory.cs
index c725501b0..e6d96d803 100644
--- a/src/Ryujinx.HLE/HOS/Kernel/Memory/KCodeMemory.cs
+++ b/src/Ryujinx.HLE/HOS/Kernel/Memory/KCodeMemory.cs
@@ -4,6 +4,7 @@ using Ryujinx.HLE.HOS.Kernel.Process;
using Ryujinx.Horizon.Common;
using System;
using System.Diagnostics;
+using System.Threading;
namespace Ryujinx.HLE.HOS.Kernel.Memory
{
@@ -11,7 +12,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Memory
{
public KProcess Owner { get; private set; }
private readonly KPageList _pageList;
- private readonly object _lock;
+ private readonly Lock _lock = new();
private ulong _address;
private bool _isOwnerMapped;
private bool _isMapped;
@@ -19,7 +20,6 @@ namespace Ryujinx.HLE.HOS.Kernel.Memory
public KCodeMemory(KernelContext context) : base(context)
{
_pageList = new KPageList();
- _lock = new object();
}
public Result Initialize(ulong address, ulong size)
diff --git a/src/Ryujinx.HLE/HOS/Kernel/Process/KProcess.cs b/src/Ryujinx.HLE/HOS/Kernel/Process/KProcess.cs
index 422f03c64..b4aa5ca5c 100644
--- a/src/Ryujinx.HLE/HOS/Kernel/Process/KProcess.cs
+++ b/src/Ryujinx.HLE/HOS/Kernel/Process/KProcess.cs
@@ -40,8 +40,8 @@ namespace Ryujinx.HLE.HOS.Kernel.Process
public ProcessState State { get; private set; }
- private readonly object _processLock = new();
- private readonly object _threadingLock = new();
+ private readonly Lock _processLock = new();
+ private readonly Lock _threadingLock = new();
public KAddressArbiter AddressArbiter { get; private set; }
diff --git a/src/Ryujinx.HLE/HOS/Kernel/Threading/KAddressArbiter.cs b/src/Ryujinx.HLE/HOS/Kernel/Threading/KAddressArbiter.cs
index f6b9a112c..0c63c7e0e 100644
--- a/src/Ryujinx.HLE/HOS/Kernel/Threading/KAddressArbiter.cs
+++ b/src/Ryujinx.HLE/HOS/Kernel/Threading/KAddressArbiter.cs
@@ -200,7 +200,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Threading
WakeThreads(_condVarThreads, count, TryAcquireMutex, x => x.CondVarAddress == address);
- if (!_condVarThreads.Exists(x => x.CondVarAddress == address))
+ if (!_condVarThreads.Any(x => x.CondVarAddress == address))
{
KernelTransfer.KernelToUser(address, 0);
}
diff --git a/src/Ryujinx.HLE/HOS/Kernel/Threading/KCriticalSection.cs b/src/Ryujinx.HLE/HOS/Kernel/Threading/KCriticalSection.cs
index 3d6744882..bfa6b68f6 100644
--- a/src/Ryujinx.HLE/HOS/Kernel/Threading/KCriticalSection.cs
+++ b/src/Ryujinx.HLE/HOS/Kernel/Threading/KCriticalSection.cs
@@ -5,7 +5,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Threading
class KCriticalSection
{
private readonly KernelContext _context;
- private readonly object _lock;
+ private readonly object _lock = new();
private int _recursionCount;
public object Lock => _lock;
@@ -13,7 +13,6 @@ namespace Ryujinx.HLE.HOS.Kernel.Threading
public KCriticalSection(KernelContext context)
{
_context = context;
- _lock = new object();
}
public void Enter()
diff --git a/src/Ryujinx.HLE/HOS/Kernel/Threading/KThread.cs b/src/Ryujinx.HLE/HOS/Kernel/Threading/KThread.cs
index 835bf5d40..4abc0ddf3 100644
--- a/src/Ryujinx.HLE/HOS/Kernel/Threading/KThread.cs
+++ b/src/Ryujinx.HLE/HOS/Kernel/Threading/KThread.cs
@@ -112,7 +112,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Threading
public bool WaitingInArbitration { get; set; }
- private readonly object _activityOperationLock = new();
+ private readonly Lock _activityOperationLock = new();
public KThread(KernelContext context) : base(context)
{
diff --git a/src/Ryujinx.HLE/HOS/ModLoader.cs b/src/Ryujinx.HLE/HOS/ModLoader.cs
index 7cbe1afca..d8c62fc66 100644
--- a/src/Ryujinx.HLE/HOS/ModLoader.cs
+++ b/src/Ryujinx.HLE/HOS/ModLoader.cs
@@ -168,7 +168,7 @@ namespace Ryujinx.HLE.HOS
if (StrEquals(RomfsDir, modDir.Name))
{
- var modData = modMetadata.Mods.Find(x => modDir.FullName.Contains(x.Path));
+ var modData = modMetadata.Mods.FirstOrDefault(x => modDir.FullName.Contains(x.Path));
var enabled = modData?.Enabled ?? true;
mods.RomfsDirs.Add(mod = new Mod(dir.Name, modDir, enabled));
@@ -176,7 +176,7 @@ namespace Ryujinx.HLE.HOS
}
else if (StrEquals(ExefsDir, modDir.Name))
{
- var modData = modMetadata.Mods.Find(x => modDir.FullName.Contains(x.Path));
+ var modData = modMetadata.Mods.FirstOrDefault(x => modDir.FullName.Contains(x.Path));
var enabled = modData?.Enabled ?? true;
mods.ExefsDirs.Add(mod = new Mod(dir.Name, modDir, enabled));
@@ -275,7 +275,7 @@ namespace Ryujinx.HLE.HOS
var fsFile = new FileInfo(Path.Combine(applicationDir.FullName, RomfsContainer));
if (fsFile.Exists)
{
- var modData = modMetadata.Mods.Find(x => fsFile.FullName.Contains(x.Path));
+ var modData = modMetadata.Mods.FirstOrDefault(x => fsFile.FullName.Contains(x.Path));
var enabled = modData == null || modData.Enabled;
mods.RomfsContainers.Add(new Mod($"<{applicationDir.Name} RomFs>", fsFile, enabled));
@@ -284,7 +284,7 @@ namespace Ryujinx.HLE.HOS
fsFile = new FileInfo(Path.Combine(applicationDir.FullName, ExefsContainer));
if (fsFile.Exists)
{
- var modData = modMetadata.Mods.Find(x => fsFile.FullName.Contains(x.Path));
+ var modData = modMetadata.Mods.FirstOrDefault(x => fsFile.FullName.Contains(x.Path));
var enabled = modData == null || modData.Enabled;
mods.ExefsContainers.Add(new Mod($"<{applicationDir.Name} ExeFs>", fsFile, enabled));
@@ -403,7 +403,7 @@ namespace Ryujinx.HLE.HOS
}
// Assumes searchDirPaths don't overlap
- private static void CollectMods(Dictionary modCaches, PatchCache patches, params string[] searchDirPaths)
+ private static void CollectMods(Dictionary modCaches, PatchCache patches, params ReadOnlySpan searchDirPaths)
{
static bool IsPatchesDir(string name) => StrEquals(AmsNsoPatchDir, name) ||
StrEquals(AmsNroPatchDir, name) ||
@@ -453,7 +453,7 @@ namespace Ryujinx.HLE.HOS
patches.Initialized = true;
}
- public void CollectMods(IEnumerable applications, params string[] searchDirPaths)
+ public void CollectMods(IEnumerable applications, params ReadOnlySpan searchDirPaths)
{
Clear();
@@ -680,7 +680,7 @@ namespace Ryujinx.HLE.HOS
ApplyProgramPatches(nroPatches, 0, nro);
}
- internal bool ApplyNsoPatches(ulong applicationId, params IExecutable[] programs)
+ internal bool ApplyNsoPatches(ulong applicationId, params ReadOnlySpan programs)
{
IEnumerable> nsoMods = _patches.NsoPatches;
@@ -744,7 +744,7 @@ namespace Ryujinx.HLE.HOS
}
}
- private static bool ApplyProgramPatches(IEnumerable> mods, int protectedOffset, params IExecutable[] programs)
+ private static bool ApplyProgramPatches(IEnumerable> mods, int protectedOffset, params ReadOnlySpan programs)
{
int count = 0;
@@ -755,12 +755,18 @@ namespace Ryujinx.HLE.HOS
patches[i] = new MemPatch();
}
- var buildIds = programs.Select(p => p switch
+ var buildIds = new List(programs.Length);
+
+ foreach (IExecutable p in programs)
{
- NsoExecutable nso => Convert.ToHexString(nso.BuildId.ItemsRo.ToArray()).TrimEnd('0'),
- NroExecutable nro => Convert.ToHexString(nro.Header.BuildId).TrimEnd('0'),
- _ => string.Empty,
- }).ToList();
+ var buildId = p switch
+ {
+ NsoExecutable nso => Convert.ToHexString(nso.BuildId.ItemsRo.ToArray()).TrimEnd('0'),
+ NroExecutable nro => Convert.ToHexString(nro.Header.BuildId).TrimEnd('0'),
+ _ => string.Empty,
+ };
+ buildIds.Add(buildId);
+ }
int GetIndex(string buildId) => buildIds.FindIndex(id => id == buildId); // O(n) but list is small
diff --git a/src/Ryujinx.HLE/HOS/Services/Am/AppletAE/AllSystemAppletProxiesService/SystemAppletProxy/ISelfController.cs b/src/Ryujinx.HLE/HOS/Services/Am/AppletAE/AllSystemAppletProxiesService/SystemAppletProxy/ISelfController.cs
index 85898f138..8e0f515ba 100644
--- a/src/Ryujinx.HLE/HOS/Services/Am/AppletAE/AllSystemAppletProxiesService/SystemAppletProxy/ISelfController.cs
+++ b/src/Ryujinx.HLE/HOS/Services/Am/AppletAE/AllSystemAppletProxiesService/SystemAppletProxy/ISelfController.cs
@@ -4,6 +4,7 @@ using Ryujinx.HLE.HOS.Kernel.Threading;
using Ryujinx.HLE.HOS.Services.Am.AppletAE.AllSystemAppletProxiesService.SystemAppletProxy.Types;
using Ryujinx.Horizon.Common;
using System;
+using System.Threading;
namespace Ryujinx.HLE.HOS.Services.Am.AppletAE.AllSystemAppletProxiesService.SystemAppletProxy
{
@@ -17,7 +18,7 @@ namespace Ryujinx.HLE.HOS.Services.Am.AppletAE.AllSystemAppletProxiesService.Sys
private KEvent _accumulatedSuspendedTickChangedEvent;
private int _accumulatedSuspendedTickChangedEventHandle;
- private readonly object _fatalSectionLock = new();
+ private readonly Lock _fatalSectionLock = new();
private int _fatalSectionCount;
// TODO: Set this when the game goes in suspension (go back to home menu ect), we currently don't support that so we can keep it set to 0.
diff --git a/src/Ryujinx.HLE/HOS/Services/Hid/HidDevices/NpadDevices.cs b/src/Ryujinx.HLE/HOS/Services/Hid/HidDevices/NpadDevices.cs
index 86c6a825f..834bee6f0 100644
--- a/src/Ryujinx.HLE/HOS/Services/Hid/HidDevices/NpadDevices.cs
+++ b/src/Ryujinx.HLE/HOS/Services/Hid/HidDevices/NpadDevices.cs
@@ -123,7 +123,7 @@ namespace Ryujinx.HLE.HOS.Services.Hid
return true;
}
- public void Configure(params ControllerConfig[] configs)
+ public void Configure(params ReadOnlySpan configs)
{
_configuredTypes = new ControllerType[MaxControllers];
diff --git a/src/Ryujinx.HLE/HOS/Services/Hid/HidDevices/TouchDevice.cs b/src/Ryujinx.HLE/HOS/Services/Hid/HidDevices/TouchDevice.cs
index 35ac1a16f..e8a56933b 100644
--- a/src/Ryujinx.HLE/HOS/Services/Hid/HidDevices/TouchDevice.cs
+++ b/src/Ryujinx.HLE/HOS/Services/Hid/HidDevices/TouchDevice.cs
@@ -8,7 +8,7 @@ namespace Ryujinx.HLE.HOS.Services.Hid
{
public TouchDevice(Switch device, bool active) : base(device, active) { }
- public void Update(params TouchPoint[] points)
+ public void Update(params ReadOnlySpan points)
{
ref RingLifo lifo = ref _device.Hid.SharedMemory.TouchScreen;
diff --git a/src/Ryujinx.HLE/HOS/Services/Ldn/Types/NodeLatestUpdate.cs b/src/Ryujinx.HLE/HOS/Services/Ldn/Types/NodeLatestUpdate.cs
index 0461e783e..826a50458 100644
--- a/src/Ryujinx.HLE/HOS/Services/Ldn/Types/NodeLatestUpdate.cs
+++ b/src/Ryujinx.HLE/HOS/Services/Ldn/Types/NodeLatestUpdate.cs
@@ -1,5 +1,6 @@
using Ryujinx.Common.Memory;
using System.Runtime.InteropServices;
+using System.Threading;
namespace Ryujinx.HLE.HOS.Services.Ldn.Types
{
@@ -12,7 +13,7 @@ namespace Ryujinx.HLE.HOS.Services.Ldn.Types
static class NodeLatestUpdateHelper
{
- private static readonly object _lock = new();
+ private static readonly Lock _lock = new();
public static void CalculateLatestUpdate(this Array8 array, Array8 beforeNodes, Array8 afterNodes)
{
diff --git a/src/Ryujinx.HLE/HOS/Services/Ldn/UserServiceCreator/LdnMitm/LanDiscovery.cs b/src/Ryujinx.HLE/HOS/Services/Ldn/UserServiceCreator/LdnMitm/LanDiscovery.cs
index b5f643d23..8b7af42a0 100644
--- a/src/Ryujinx.HLE/HOS/Services/Ldn/UserServiceCreator/LdnMitm/LanDiscovery.cs
+++ b/src/Ryujinx.HLE/HOS/Services/Ldn/UserServiceCreator/LdnMitm/LanDiscovery.cs
@@ -29,7 +29,7 @@ namespace Ryujinx.HLE.HOS.Services.Ldn.UserServiceCreator.LdnMitm
private ILdnTcpSocket _tcp;
private LdnProxyUdpServer _udp, _udp2;
private readonly List _stations = new();
- private readonly object _lock = new();
+ private readonly Lock _lock = new();
private readonly AutoResetEvent _apConnected = new(false);
diff --git a/src/Ryujinx.HLE/HOS/Services/Ldn/UserServiceCreator/LdnMitm/Proxy/LdnProxyUdpServer.cs b/src/Ryujinx.HLE/HOS/Services/Ldn/UserServiceCreator/LdnMitm/Proxy/LdnProxyUdpServer.cs
index 0f5875a1d..536ae476d 100644
--- a/src/Ryujinx.HLE/HOS/Services/Ldn/UserServiceCreator/LdnMitm/Proxy/LdnProxyUdpServer.cs
+++ b/src/Ryujinx.HLE/HOS/Services/Ldn/UserServiceCreator/LdnMitm/Proxy/LdnProxyUdpServer.cs
@@ -18,7 +18,7 @@ namespace Ryujinx.HLE.HOS.Services.Ldn.UserServiceCreator.LdnMitm.Proxy
private byte[] _buffer;
private int _bufferEnd;
- private readonly object _scanLock = new();
+ private readonly Lock _scanLock = new();
private Dictionary _scanResultsLast = new();
private Dictionary _scanResults = new();
diff --git a/src/Ryujinx.HLE/HOS/Services/Ldn/UserServiceCreator/LdnRyu/NetworkTimeout.cs b/src/Ryujinx.HLE/HOS/Services/Ldn/UserServiceCreator/LdnRyu/NetworkTimeout.cs
index 5012d5d81..f7a9d77a4 100644
--- a/src/Ryujinx.HLE/HOS/Services/Ldn/UserServiceCreator/LdnRyu/NetworkTimeout.cs
+++ b/src/Ryujinx.HLE/HOS/Services/Ldn/UserServiceCreator/LdnRyu/NetworkTimeout.cs
@@ -10,7 +10,7 @@ namespace Ryujinx.HLE.HOS.Services.Ldn.UserServiceCreator.LdnRyu
private readonly Action _timeoutCallback;
private CancellationTokenSource _cancel;
- private readonly object _lock = new object();
+ private readonly Lock _lock = new();
public NetworkTimeout(int idleTimeout, Action timeoutCallback)
{
diff --git a/src/Ryujinx.HLE/HOS/Services/Ldn/UserServiceCreator/LdnRyu/Proxy/EphemeralPortPool.cs b/src/Ryujinx.HLE/HOS/Services/Ldn/UserServiceCreator/LdnRyu/Proxy/EphemeralPortPool.cs
index bc3a5edf2..9ea56d050 100644
--- a/src/Ryujinx.HLE/HOS/Services/Ldn/UserServiceCreator/LdnRyu/Proxy/EphemeralPortPool.cs
+++ b/src/Ryujinx.HLE/HOS/Services/Ldn/UserServiceCreator/LdnRyu/Proxy/EphemeralPortPool.cs
@@ -1,4 +1,5 @@
using System.Collections.Generic;
+using System.Threading;
namespace Ryujinx.HLE.HOS.Services.Ldn.UserServiceCreator.LdnRyu.Proxy
{
@@ -8,7 +9,7 @@ namespace Ryujinx.HLE.HOS.Services.Ldn.UserServiceCreator.LdnRyu.Proxy
private readonly List _ephemeralPorts = new List();
- private readonly object _lock = new object();
+ private readonly Lock _lock = new();
public ushort Get()
{
diff --git a/src/Ryujinx.HLE/HOS/Services/Nfc/Nfp/VirtualAmiibo.cs b/src/Ryujinx.HLE/HOS/Services/Nfc/Nfp/VirtualAmiibo.cs
index fa39cb030..ee43fc307 100644
--- a/src/Ryujinx.HLE/HOS/Services/Nfc/Nfp/VirtualAmiibo.cs
+++ b/src/Ryujinx.HLE/HOS/Services/Nfc/Nfp/VirtualAmiibo.cs
@@ -9,6 +9,7 @@ using Ryujinx.HLE.HOS.Services.Nfc.Nfp.NfpManager;
using System;
using System.Collections.Generic;
using System.IO;
+using System.Linq;
namespace Ryujinx.HLE.HOS.Services.Nfc.Nfp
{
@@ -121,7 +122,7 @@ namespace Ryujinx.HLE.HOS.Services.Nfc.Nfp
return true;
}
- if (virtualAmiiboFile.ApplicationAreas.Exists(item => item.ApplicationAreaId == applicationAreaId))
+ if (virtualAmiiboFile.ApplicationAreas.Any(item => item.ApplicationAreaId == applicationAreaId))
{
OpenedApplicationAreaId = applicationAreaId;
@@ -156,7 +157,7 @@ namespace Ryujinx.HLE.HOS.Services.Nfc.Nfp
{
VirtualAmiiboFile virtualAmiiboFile = LoadAmiiboFile(amiiboId);
- if (virtualAmiiboFile.ApplicationAreas.Exists(item => item.ApplicationAreaId == applicationAreaId))
+ if (virtualAmiiboFile.ApplicationAreas.Any(item => item.ApplicationAreaId == applicationAreaId))
{
return false;
}
@@ -181,7 +182,7 @@ namespace Ryujinx.HLE.HOS.Services.Nfc.Nfp
}
VirtualAmiiboFile virtualAmiiboFile = LoadAmiiboFile(amiiboId);
- if (virtualAmiiboFile.ApplicationAreas.Exists(item => item.ApplicationAreaId == OpenedApplicationAreaId))
+ if (virtualAmiiboFile.ApplicationAreas.Any(item => item.ApplicationAreaId == OpenedApplicationAreaId))
{
for (int i = 0; i < virtualAmiiboFile.ApplicationAreas.Count; i++)
{
diff --git a/src/Ryujinx.HLE/HOS/Services/Nv/NvDrvServices/NvHostCtrl/Types/NvHostEvent.cs b/src/Ryujinx.HLE/HOS/Services/Nv/NvDrvServices/NvHostCtrl/Types/NvHostEvent.cs
index 8f851f37a..48622a224 100644
--- a/src/Ryujinx.HLE/HOS/Services/Nv/NvDrvServices/NvHostCtrl/Types/NvHostEvent.cs
+++ b/src/Ryujinx.HLE/HOS/Services/Nv/NvDrvServices/NvHostCtrl/Types/NvHostEvent.cs
@@ -26,7 +26,7 @@ namespace Ryujinx.HLE.HOS.Services.Nv.NvDrvServices.NvHostCtrl
private NvFence _previousFailingFence;
private uint _failingCount;
- public readonly object Lock = new();
+ public readonly Lock Lock = new();
///
/// Max failing count until waiting on CPU.
diff --git a/src/Ryujinx.HLE/HOS/Services/Nv/NvDrvServices/NvHostCtrl/Types/NvHostSyncPt.cs b/src/Ryujinx.HLE/HOS/Services/Nv/NvDrvServices/NvHostCtrl/Types/NvHostSyncPt.cs
index b83c642e5..49637f757 100644
--- a/src/Ryujinx.HLE/HOS/Services/Nv/NvDrvServices/NvHostCtrl/Types/NvHostSyncPt.cs
+++ b/src/Ryujinx.HLE/HOS/Services/Nv/NvDrvServices/NvHostCtrl/Types/NvHostSyncPt.cs
@@ -17,7 +17,7 @@ namespace Ryujinx.HLE.HOS.Services.Nv.NvDrvServices.NvHostCtrl
private readonly Switch _device;
- private readonly object _syncpointAllocatorLock = new();
+ private readonly Lock _syncpointAllocatorLock = new();
public NvHostSyncpt(Switch device)
{
diff --git a/src/Ryujinx.HLE/HOS/Services/Sockets/Bsd/BsdContext.cs b/src/Ryujinx.HLE/HOS/Services/Sockets/Bsd/BsdContext.cs
index 7ecd6835d..9d5bb8d01 100644
--- a/src/Ryujinx.HLE/HOS/Services/Sockets/Bsd/BsdContext.cs
+++ b/src/Ryujinx.HLE/HOS/Services/Sockets/Bsd/BsdContext.cs
@@ -3,6 +3,7 @@ using System;
using System.Collections.Concurrent;
using System.Collections.Generic;
using System.Numerics;
+using System.Threading;
namespace Ryujinx.HLE.HOS.Services.Sockets.Bsd
{
@@ -10,7 +11,7 @@ namespace Ryujinx.HLE.HOS.Services.Sockets.Bsd
{
private static readonly ConcurrentDictionary _registry = new();
- private readonly object _lock = new();
+ private readonly Lock _lock = new();
private readonly List _fds;
diff --git a/src/Ryujinx.HLE/HOS/Services/Ssl/BuiltInCertificateManager.cs b/src/Ryujinx.HLE/HOS/Services/Ssl/BuiltInCertificateManager.cs
index 49becac55..622b62c16 100644
--- a/src/Ryujinx.HLE/HOS/Services/Ssl/BuiltInCertificateManager.cs
+++ b/src/Ryujinx.HLE/HOS/Services/Ssl/BuiltInCertificateManager.cs
@@ -16,6 +16,7 @@ using System.Collections.Generic;
using System.IO;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
+using System.Threading;
namespace Ryujinx.HLE.HOS.Services.Ssl
{
@@ -43,7 +44,7 @@ namespace Ryujinx.HLE.HOS.Services.Ssl
private bool _initialized;
private Dictionary _certificates;
- private readonly object _lock = new();
+ private readonly Lock _lock = new();
private struct CertStoreFileHeader
{
diff --git a/src/Ryujinx.HLE/HOS/Services/SurfaceFlinger/ConsumerBase.cs b/src/Ryujinx.HLE/HOS/Services/SurfaceFlinger/ConsumerBase.cs
index f8ee84842..017365c6f 100644
--- a/src/Ryujinx.HLE/HOS/Services/SurfaceFlinger/ConsumerBase.cs
+++ b/src/Ryujinx.HLE/HOS/Services/SurfaceFlinger/ConsumerBase.cs
@@ -1,5 +1,6 @@
using Ryujinx.HLE.HOS.Services.SurfaceFlinger.Types;
using System;
+using System.Threading;
namespace Ryujinx.HLE.HOS.Services.SurfaceFlinger
{
@@ -23,7 +24,7 @@ namespace Ryujinx.HLE.HOS.Services.SurfaceFlinger
protected BufferQueueConsumer Consumer;
- protected readonly object Lock = new();
+ protected readonly Lock Lock = new();
private readonly IConsumerListener _listener;
diff --git a/src/Ryujinx.HLE/HOS/Services/SurfaceFlinger/HOSBinderDriverServer.cs b/src/Ryujinx.HLE/HOS/Services/SurfaceFlinger/HOSBinderDriverServer.cs
index bc7bffcb6..5151930a5 100644
--- a/src/Ryujinx.HLE/HOS/Services/SurfaceFlinger/HOSBinderDriverServer.cs
+++ b/src/Ryujinx.HLE/HOS/Services/SurfaceFlinger/HOSBinderDriverServer.cs
@@ -2,6 +2,7 @@ using Ryujinx.Common.Logging;
using Ryujinx.HLE.HOS.Kernel.Threading;
using System;
using System.Collections.Generic;
+using System.Threading;
namespace Ryujinx.HLE.HOS.Services.SurfaceFlinger
{
@@ -11,7 +12,7 @@ namespace Ryujinx.HLE.HOS.Services.SurfaceFlinger
private static int _lastBinderId = 0;
- private static readonly object _lock = new();
+ private static readonly Lock _lock = new();
public static int RegisterBinderObject(IBinder binder)
{
diff --git a/src/Ryujinx.HLE/HOS/Services/SurfaceFlinger/SurfaceFlinger.cs b/src/Ryujinx.HLE/HOS/Services/SurfaceFlinger/SurfaceFlinger.cs
index 601e85867..23bf8bcfc 100644
--- a/src/Ryujinx.HLE/HOS/Services/SurfaceFlinger/SurfaceFlinger.cs
+++ b/src/Ryujinx.HLE/HOS/Services/SurfaceFlinger/SurfaceFlinger.cs
@@ -37,7 +37,7 @@ namespace Ryujinx.HLE.HOS.Services.SurfaceFlinger
private int _swapInterval;
private int _swapIntervalDelay;
- private readonly object _lock = new();
+ private readonly Lock _lock = new();
public long RenderLayerId { get; private set; }
diff --git a/src/Ryujinx.HLE/HOS/Services/Time/TimeZone/TimeZoneManager.cs b/src/Ryujinx.HLE/HOS/Services/Time/TimeZone/TimeZoneManager.cs
index 3b57b1805..155733d2e 100644
--- a/src/Ryujinx.HLE/HOS/Services/Time/TimeZone/TimeZoneManager.cs
+++ b/src/Ryujinx.HLE/HOS/Services/Time/TimeZone/TimeZoneManager.cs
@@ -2,6 +2,7 @@ using Ryujinx.Common.Memory;
using Ryujinx.HLE.HOS.Services.Time.Clock;
using System;
using System.IO;
+using System.Threading;
namespace Ryujinx.HLE.HOS.Services.Time.TimeZone
{
@@ -13,7 +14,7 @@ namespace Ryujinx.HLE.HOS.Services.Time.TimeZone
private UInt128 _timeZoneRuleVersion;
private uint _totalLocationNameCount;
private SteadyClockTimePoint _timeZoneUpdateTimePoint;
- private readonly object _lock = new();
+ private readonly Lock _lock = new();
public TimeZoneManager()
{
diff --git a/src/Ryujinx.HLE/Loaders/Processes/ProcessLoaderHelper.cs b/src/Ryujinx.HLE/Loaders/Processes/ProcessLoaderHelper.cs
index 33aee1c4c..e4286ae90 100644
--- a/src/Ryujinx.HLE/Loaders/Processes/ProcessLoaderHelper.cs
+++ b/src/Ryujinx.HLE/Loaders/Processes/ProcessLoaderHelper.cs
@@ -231,7 +231,7 @@ namespace Ryujinx.HLE.Loaders.Processes
ulong programId,
byte programIndex,
byte[] arguments = null,
- params IExecutable[] executables)
+ params ReadOnlySpan executables)
{
context.Device.System.ServiceTable.WaitServicesReady();
@@ -251,12 +251,17 @@ namespace Ryujinx.HLE.Loaders.Processes
ulong codeStart = ((meta.Flags & 1) != 0 ? 0x8000000UL : 0x200000UL) + CodeStartOffset;
uint codeSize = 0;
- var buildIds = executables.Select(e => (e switch
+ var buildIds = new string[executables.Length];
+
+ for (int i = 0; i < executables.Length; i++)
{
- NsoExecutable nso => Convert.ToHexString(nso.BuildId.ItemsRo.ToArray()),
- NroExecutable nro => Convert.ToHexString(nro.Header.BuildId),
- _ => string.Empty
- }).ToUpper());
+ buildIds[i] = (executables[i] switch
+ {
+ NsoExecutable nso => Convert.ToHexString(nso.BuildId.ItemsRo.ToArray()),
+ NroExecutable nro => Convert.ToHexString(nro.Header.BuildId),
+ _ => string.Empty
+ }).ToUpper();
+ }
ulong[] nsoBase = new ulong[executables.Length];
diff --git a/src/Ryujinx.HLE/PerformanceStatistics.cs b/src/Ryujinx.HLE/PerformanceStatistics.cs
index 3767a7fb4..890bce8bc 100644
--- a/src/Ryujinx.HLE/PerformanceStatistics.cs
+++ b/src/Ryujinx.HLE/PerformanceStatistics.cs
@@ -1,4 +1,5 @@
using Ryujinx.Common;
+using System.Threading;
using System.Timers;
namespace Ryujinx.HLE
@@ -20,12 +21,12 @@ namespace Ryujinx.HLE
private readonly long[] _framesRendered;
private readonly double[] _percentTime;
- private readonly object[] _frameLock;
- private readonly object[] _percentLock;
+ private readonly Lock[] _frameLock = [new()];
+ private readonly Lock[] _percentLock = [new()];
private readonly double _ticksToSeconds;
- private readonly Timer _resetTimer;
+ private readonly System.Timers.Timer _resetTimer;
public PerformanceStatistics()
{
@@ -41,10 +42,7 @@ namespace Ryujinx.HLE
_framesRendered = new long[1];
_percentTime = new double[1];
- _frameLock = new[] { new object() };
- _percentLock = new[] { new object() };
-
- _resetTimer = new Timer(750);
+ _resetTimer = new(750);
_resetTimer.Elapsed += ResetTimerElapsed;
_resetTimer.AutoReset = true;
diff --git a/src/Ryujinx.HLE/Ryujinx.HLE.csproj b/src/Ryujinx.HLE/Ryujinx.HLE.csproj
index 83e7b8810..d42ecf8b8 100644
--- a/src/Ryujinx.HLE/Ryujinx.HLE.csproj
+++ b/src/Ryujinx.HLE/Ryujinx.HLE.csproj
@@ -1,7 +1,6 @@
- net8.0true$(DefaultItemExcludes);._*
diff --git a/src/Ryujinx.Headless.SDL2/Ryujinx.Headless.SDL2.csproj b/src/Ryujinx.Headless.SDL2/Ryujinx.Headless.SDL2.csproj
index 8fbf9be1e..fe535e6d5 100644
--- a/src/Ryujinx.Headless.SDL2/Ryujinx.Headless.SDL2.csproj
+++ b/src/Ryujinx.Headless.SDL2/Ryujinx.Headless.SDL2.csproj
@@ -1,7 +1,6 @@
- net8.0win-x64;osx-x64;linux-x64Exetrue
diff --git a/src/Ryujinx.Horizon.Common/Ryujinx.Horizon.Common.csproj b/src/Ryujinx.Horizon.Common/Ryujinx.Horizon.Common.csproj
index 00e0b1af9..b1caf6780 100644
--- a/src/Ryujinx.Horizon.Common/Ryujinx.Horizon.Common.csproj
+++ b/src/Ryujinx.Horizon.Common/Ryujinx.Horizon.Common.csproj
@@ -1,7 +1,6 @@
- net8.0$(DefaultItemExcludes);._*
diff --git a/src/Ryujinx.Horizon/Ryujinx.Horizon.csproj b/src/Ryujinx.Horizon/Ryujinx.Horizon.csproj
index 18c639d67..727513484 100644
--- a/src/Ryujinx.Horizon/Ryujinx.Horizon.csproj
+++ b/src/Ryujinx.Horizon/Ryujinx.Horizon.csproj
@@ -1,7 +1,6 @@
- net8.0$(DefaultItemExcludes);._*
diff --git a/src/Ryujinx.Horizon/Sdk/Friends/Detail/Ipc/NotificationService.cs b/src/Ryujinx.Horizon/Sdk/Friends/Detail/Ipc/NotificationService.cs
index 534bf63ed..585b40df3 100644
--- a/src/Ryujinx.Horizon/Sdk/Friends/Detail/Ipc/NotificationService.cs
+++ b/src/Ryujinx.Horizon/Sdk/Friends/Detail/Ipc/NotificationService.cs
@@ -4,6 +4,7 @@ using Ryujinx.Horizon.Sdk.OsTypes;
using Ryujinx.Horizon.Sdk.Sf;
using System;
using System.Collections.Generic;
+using System.Threading;
namespace Ryujinx.Horizon.Sdk.Friends.Detail.Ipc
{
@@ -13,7 +14,7 @@ namespace Ryujinx.Horizon.Sdk.Friends.Detail.Ipc
private readonly Uid _userId;
private readonly FriendsServicePermissionLevel _permissionLevel;
- private readonly object _lock = new();
+ private readonly Lock _lock = new();
private SystemEventType _notificationEvent;
diff --git a/src/Ryujinx.Horizon/Sdk/Ngc/Detail/ContentsReader.cs b/src/Ryujinx.Horizon/Sdk/Ngc/Detail/ContentsReader.cs
index 6a0fc4f9e..d3ed37e78 100644
--- a/src/Ryujinx.Horizon/Sdk/Ngc/Detail/ContentsReader.cs
+++ b/src/Ryujinx.Horizon/Sdk/Ngc/Detail/ContentsReader.cs
@@ -3,6 +3,7 @@ using Ryujinx.Horizon.Sdk.Fs;
using System;
using System.IO;
using System.IO.Compression;
+using System.Threading;
namespace Ryujinx.Horizon.Sdk.Ngc.Detail
{
@@ -22,13 +23,12 @@ namespace Ryujinx.Horizon.Sdk.Ngc.Detail
}
private readonly IFsClient _fsClient;
- private readonly object _lock;
+ private readonly Lock _lock = new();
private bool _intialized;
private ulong _cacheSize;
public ContentsReader(IFsClient fsClient)
{
- _lock = new();
_fsClient = fsClient;
}
diff --git a/src/Ryujinx.Horizon/Sdk/OsTypes/Impl/MultiWaitImpl.cs b/src/Ryujinx.Horizon/Sdk/OsTypes/Impl/MultiWaitImpl.cs
index 406352003..879a3a58f 100644
--- a/src/Ryujinx.Horizon/Sdk/OsTypes/Impl/MultiWaitImpl.cs
+++ b/src/Ryujinx.Horizon/Sdk/OsTypes/Impl/MultiWaitImpl.cs
@@ -2,6 +2,7 @@ using Ryujinx.Common;
using Ryujinx.Horizon.Common;
using System;
using System.Collections.Generic;
+using System.Threading;
namespace Ryujinx.Horizon.Sdk.OsTypes.Impl
{
@@ -13,7 +14,7 @@ namespace Ryujinx.Horizon.Sdk.OsTypes.Impl
private readonly List _multiWaits;
- private readonly object _lock = new();
+ private readonly Lock _lock = new();
private int _waitingThreadHandle;
diff --git a/src/Ryujinx.Horizon/Sdk/Sf/Cmif/ServerDomainManager.cs b/src/Ryujinx.Horizon/Sdk/Sf/Cmif/ServerDomainManager.cs
index 7762345af..13f9fb7a9 100644
--- a/src/Ryujinx.Horizon/Sdk/Sf/Cmif/ServerDomainManager.cs
+++ b/src/Ryujinx.Horizon/Sdk/Sf/Cmif/ServerDomainManager.cs
@@ -1,6 +1,7 @@
using Ryujinx.Horizon.Common;
using System;
using System.Collections.Generic;
+using System.Threading;
namespace Ryujinx.Horizon.Sdk.Sf.Cmif
{
@@ -209,14 +210,13 @@ namespace Ryujinx.Horizon.Sdk.Sf.Cmif
}
private readonly EntryManager _entryManager;
- private readonly object _entryOwnerLock;
+ private readonly Lock _entryOwnerLock = new();
private readonly HashSet _domains;
private readonly int _maxDomains;
public ServerDomainManager(int entryCount, int maxDomains)
{
_entryManager = new EntryManager(entryCount);
- _entryOwnerLock = new object();
_domains = new HashSet();
_maxDomains = maxDomains;
}
diff --git a/src/Ryujinx.Horizon/Sdk/Sf/Hipc/ServerManager.cs b/src/Ryujinx.Horizon/Sdk/Sf/Hipc/ServerManager.cs
index e8957b758..6aa32faee 100644
--- a/src/Ryujinx.Horizon/Sdk/Sf/Hipc/ServerManager.cs
+++ b/src/Ryujinx.Horizon/Sdk/Sf/Hipc/ServerManager.cs
@@ -4,6 +4,7 @@ using Ryujinx.Horizon.Sdk.Sm;
using System;
using System.Collections.Generic;
using System.Numerics;
+using System.Threading;
namespace Ryujinx.Horizon.Sdk.Sf.Hipc
{
@@ -17,7 +18,7 @@ namespace Ryujinx.Horizon.Sdk.Sf.Hipc
private readonly ulong _pointerBuffersBaseAddress;
private readonly ulong _savedMessagesBaseAddress;
- private readonly object _resourceLock;
+ private readonly Lock _resourceLock = new();
private readonly ulong[] _sessionAllocationBitmap;
private readonly HashSet _sessions;
private readonly HashSet _servers;
@@ -42,7 +43,6 @@ namespace Ryujinx.Horizon.Sdk.Sf.Hipc
}
}
- _resourceLock = new object();
_sessionAllocationBitmap = new ulong[(maxSessions + 63) / 64];
_sessions = new HashSet();
_servers = new HashSet();
diff --git a/src/Ryujinx.Horizon/Sdk/Sf/Hipc/ServerManagerBase.cs b/src/Ryujinx.Horizon/Sdk/Sf/Hipc/ServerManagerBase.cs
index 570e3c802..31ca264e3 100644
--- a/src/Ryujinx.Horizon/Sdk/Sf/Hipc/ServerManagerBase.cs
+++ b/src/Ryujinx.Horizon/Sdk/Sf/Hipc/ServerManagerBase.cs
@@ -4,6 +4,7 @@ using Ryujinx.Horizon.Sdk.Sf.Cmif;
using Ryujinx.Horizon.Sdk.Sm;
using System;
using System.Linq;
+using System.Threading;
namespace Ryujinx.Horizon.Sdk.Sf.Hipc
{
@@ -16,8 +17,8 @@ namespace Ryujinx.Horizon.Sdk.Sf.Hipc
private readonly MultiWait _multiWait;
private readonly MultiWait _waitList;
- private readonly object _multiWaitSelectionLock;
- private readonly object _waitListLock;
+ private readonly Lock _multiWaitSelectionLock = new();
+ private readonly Lock _waitListLock = new();
private readonly Event _requestStopEvent;
private readonly Event _notifyEvent;
@@ -39,9 +40,6 @@ namespace Ryujinx.Horizon.Sdk.Sf.Hipc
_multiWait = new MultiWait();
_waitList = new MultiWait();
- _multiWaitSelectionLock = new object();
- _waitListLock = new object();
-
_requestStopEvent = new Event(EventClearMode.ManualClear);
_notifyEvent = new Event(EventClearMode.ManualClear);
diff --git a/src/Ryujinx.Input.SDL2/Ryujinx.Input.SDL2.csproj b/src/Ryujinx.Input.SDL2/Ryujinx.Input.SDL2.csproj
index 3d880d5fa..89f5adda1 100644
--- a/src/Ryujinx.Input.SDL2/Ryujinx.Input.SDL2.csproj
+++ b/src/Ryujinx.Input.SDL2/Ryujinx.Input.SDL2.csproj
@@ -1,7 +1,6 @@
- net8.0true$(DefaultItemExcludes);._*
diff --git a/src/Ryujinx.Input.SDL2/SDL2Gamepad.cs b/src/Ryujinx.Input.SDL2/SDL2Gamepad.cs
index af6f4c625..12bfab4bb 100644
--- a/src/Ryujinx.Input.SDL2/SDL2Gamepad.cs
+++ b/src/Ryujinx.Input.SDL2/SDL2Gamepad.cs
@@ -4,6 +4,7 @@ using Ryujinx.Common.Logging;
using System;
using System.Collections.Generic;
using System.Numerics;
+using System.Threading;
using static SDL2.SDL;
namespace Ryujinx.Input.SDL2
@@ -58,7 +59,7 @@ namespace Ryujinx.Input.SDL2
SDL_GameControllerButton.SDL_CONTROLLER_BUTTON_INVALID,
};
- private readonly object _userMappingLock = new();
+ private readonly Lock _userMappingLock = new();
private readonly List _buttonsUserMapping;
diff --git a/src/Ryujinx.Input.SDL2/SDL2GamepadDriver.cs b/src/Ryujinx.Input.SDL2/SDL2GamepadDriver.cs
index fd34fe219..c580e4e7d 100644
--- a/src/Ryujinx.Input.SDL2/SDL2GamepadDriver.cs
+++ b/src/Ryujinx.Input.SDL2/SDL2GamepadDriver.cs
@@ -1,6 +1,7 @@
using Ryujinx.SDL2.Common;
using System;
using System.Collections.Generic;
+using System.Threading;
using static SDL2.SDL;
namespace Ryujinx.Input.SDL2
@@ -9,7 +10,7 @@ namespace Ryujinx.Input.SDL2
{
private readonly Dictionary _gamepadsInstanceIdsMapping;
private readonly List _gamepadsIds;
- private readonly object _lock = new();
+ private readonly Lock _lock = new();
public ReadOnlySpan GamepadsIds
{
diff --git a/src/Ryujinx.Input.SDL2/SDL2Keyboard.cs b/src/Ryujinx.Input.SDL2/SDL2Keyboard.cs
index a0dd8ab95..8d6a30d11 100644
--- a/src/Ryujinx.Input.SDL2/SDL2Keyboard.cs
+++ b/src/Ryujinx.Input.SDL2/SDL2Keyboard.cs
@@ -4,6 +4,7 @@ using System;
using System.Collections.Generic;
using System.Numerics;
using System.Runtime.CompilerServices;
+using System.Threading;
using static SDL2.SDL;
using ConfigKey = Ryujinx.Common.Configuration.Hid.Key;
@@ -17,7 +18,7 @@ namespace Ryujinx.Input.SDL2
public bool IsValid => To is not GamepadButtonInputId.Unbound && From is not Key.Unbound;
}
- private readonly object _userMappingLock = new();
+ private readonly Lock _userMappingLock = new();
#pragma warning disable IDE0052 // Remove unread private member
private readonly SDL2KeyboardDriver _driver;
diff --git a/src/Ryujinx.Input/HLE/NpadManager.cs b/src/Ryujinx.Input/HLE/NpadManager.cs
index 1dc87358d..08f222a91 100644
--- a/src/Ryujinx.Input/HLE/NpadManager.cs
+++ b/src/Ryujinx.Input/HLE/NpadManager.cs
@@ -7,6 +7,7 @@ using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Runtime.CompilerServices;
+using System.Threading;
using CemuHookClient = Ryujinx.Input.Motion.CemuHook.Client;
using ControllerType = Ryujinx.Common.Configuration.Hid.ControllerType;
using PlayerIndex = Ryujinx.HLE.HOS.Services.Hid.PlayerIndex;
@@ -18,7 +19,7 @@ namespace Ryujinx.Input.HLE
{
private readonly CemuHookClient _cemuHookClient;
- private readonly object _lock = new();
+ private readonly Lock _lock = new();
private bool _blockInputUpdates;
@@ -320,7 +321,7 @@ namespace Ryujinx.Input.HLE
{
lock (_lock)
{
- return _inputConfig.Find(x => x.PlayerIndex == (Common.Configuration.Hid.PlayerIndex)index);
+ return _inputConfig.FirstOrDefault(x => x.PlayerIndex == (Common.Configuration.Hid.PlayerIndex)index);
}
}
diff --git a/src/Ryujinx.Input/Ryujinx.Input.csproj b/src/Ryujinx.Input/Ryujinx.Input.csproj
index 0974b707a..6741a2b3e 100644
--- a/src/Ryujinx.Input/Ryujinx.Input.csproj
+++ b/src/Ryujinx.Input/Ryujinx.Input.csproj
@@ -1,7 +1,6 @@
- net8.0true$(DefaultItemExcludes);._*
diff --git a/src/Ryujinx.Memory/Ryujinx.Memory.csproj b/src/Ryujinx.Memory/Ryujinx.Memory.csproj
index 17745dd61..eda3ed17f 100644
--- a/src/Ryujinx.Memory/Ryujinx.Memory.csproj
+++ b/src/Ryujinx.Memory/Ryujinx.Memory.csproj
@@ -1,7 +1,6 @@
- net8.0true$(DefaultItemExcludes);._*
diff --git a/src/Ryujinx.Memory/SparseMemoryBlock.cs b/src/Ryujinx.Memory/SparseMemoryBlock.cs
index 523685de1..5717d7b64 100644
--- a/src/Ryujinx.Memory/SparseMemoryBlock.cs
+++ b/src/Ryujinx.Memory/SparseMemoryBlock.cs
@@ -14,7 +14,7 @@ namespace Ryujinx.Memory
private readonly PageInitDelegate _pageInit;
- private readonly object _lock = new object();
+ private readonly Lock _lock = new();
private readonly ulong _pageSize;
private readonly MemoryBlock _reservedBlock;
private readonly List _mappedBlocks;
diff --git a/src/Ryujinx.Memory/Tracking/RegionHandle.cs b/src/Ryujinx.Memory/Tracking/RegionHandle.cs
index a94ffa43c..4e81a9723 100644
--- a/src/Ryujinx.Memory/Tracking/RegionHandle.cs
+++ b/src/Ryujinx.Memory/Tracking/RegionHandle.cs
@@ -51,7 +51,7 @@ namespace Ryujinx.Memory.Tracking
private event Action OnDirty;
- private readonly object _preActionLock = new();
+ private readonly Lock _preActionLock = new();
private RegionSignal _preAction; // Action to perform before a read or write. This will block the memory access.
private PreciseRegionSignal _preciseAction; // Action to perform on a precise read or write.
private readonly List _regions;
diff --git a/src/Ryujinx.SDL2.Common/Ryujinx.SDL2.Common.csproj b/src/Ryujinx.SDL2.Common/Ryujinx.SDL2.Common.csproj
index 0811ad850..895d1a9ce 100644
--- a/src/Ryujinx.SDL2.Common/Ryujinx.SDL2.Common.csproj
+++ b/src/Ryujinx.SDL2.Common/Ryujinx.SDL2.Common.csproj
@@ -1,7 +1,6 @@
- net8.0$(DefaultItemExcludes);._*
diff --git a/src/Ryujinx.SDL2.Common/SDL2Driver.cs b/src/Ryujinx.SDL2.Common/SDL2Driver.cs
index 4d8961335..851c07867 100644
--- a/src/Ryujinx.SDL2.Common/SDL2Driver.cs
+++ b/src/Ryujinx.SDL2.Common/SDL2Driver.cs
@@ -36,7 +36,7 @@ namespace Ryujinx.SDL2.Common
private ConcurrentDictionary> _registeredWindowHandlers;
- private readonly object _lock = new();
+ private readonly Lock _lock = new();
private SDL2Driver() { }
diff --git a/src/Ryujinx.ShaderTools/Ryujinx.ShaderTools.csproj b/src/Ryujinx.ShaderTools/Ryujinx.ShaderTools.csproj
index 639ceeac2..08d587f9c 100644
--- a/src/Ryujinx.ShaderTools/Ryujinx.ShaderTools.csproj
+++ b/src/Ryujinx.ShaderTools/Ryujinx.ShaderTools.csproj
@@ -1,7 +1,6 @@
- net8.0ExeDebug;Release$(DefaultItemExcludes);._*
diff --git a/src/Ryujinx.Tests.Memory/Ryujinx.Tests.Memory.csproj b/src/Ryujinx.Tests.Memory/Ryujinx.Tests.Memory.csproj
index 3bb4bf74d..e5ebca789 100644
--- a/src/Ryujinx.Tests.Memory/Ryujinx.Tests.Memory.csproj
+++ b/src/Ryujinx.Tests.Memory/Ryujinx.Tests.Memory.csproj
@@ -1,7 +1,6 @@
- net8.0false$(DefaultItemExcludes);._*
diff --git a/src/Ryujinx.Tests.Unicorn/Ryujinx.Tests.Unicorn.csproj b/src/Ryujinx.Tests.Unicorn/Ryujinx.Tests.Unicorn.csproj
index 2f7695356..f9f42416f 100644
--- a/src/Ryujinx.Tests.Unicorn/Ryujinx.Tests.Unicorn.csproj
+++ b/src/Ryujinx.Tests.Unicorn/Ryujinx.Tests.Unicorn.csproj
@@ -1,7 +1,6 @@
- net8.0trueDebug;Release$(DefaultItemExcludes);._*
diff --git a/src/Ryujinx.Tests/Ryujinx.Tests.csproj b/src/Ryujinx.Tests/Ryujinx.Tests.csproj
index 0480c206e..daa2b4287 100644
--- a/src/Ryujinx.Tests/Ryujinx.Tests.csproj
+++ b/src/Ryujinx.Tests/Ryujinx.Tests.csproj
@@ -1,7 +1,6 @@
- net8.0Exefalse
diff --git a/src/Ryujinx.UI.Common/App/ApplicationData.cs b/src/Ryujinx.UI.Common/App/ApplicationData.cs
index 7aa0dccaa..151220f39 100644
--- a/src/Ryujinx.UI.Common/App/ApplicationData.cs
+++ b/src/Ryujinx.UI.Common/App/ApplicationData.cs
@@ -164,7 +164,7 @@ namespace Ryujinx.UI.App.Common
NsoReader reader = new();
reader.Initialize(nsoFile.Release().AsStorage().AsFile(OpenMode.Read)).ThrowIfFailure();
- return BitConverter.ToString(reader.Header.ModuleId.ItemsRo.ToArray()).Replace("-", string.Empty).ToUpper()[..16];
+ return Convert.ToHexString(reader.Header.ModuleId.ItemsRo.ToArray()).Replace("-", string.Empty).ToUpper()[..16];
}
}
}
diff --git a/src/Ryujinx.UI.Common/Resources/Logo_Ryujinx.png b/src/Ryujinx.UI.Common/Resources/Logo_Ryujinx.png
index 28067e908..e61358a95 100644
Binary files a/src/Ryujinx.UI.Common/Resources/Logo_Ryujinx.png and b/src/Ryujinx.UI.Common/Resources/Logo_Ryujinx.png differ
diff --git a/src/Ryujinx.UI.Common/Resources/Logo_Thiccjinx.png b/src/Ryujinx.UI.Common/Resources/Logo_Thiccjinx.png
new file mode 100644
index 000000000..be807a40a
Binary files /dev/null and b/src/Ryujinx.UI.Common/Resources/Logo_Thiccjinx.png differ
diff --git a/src/Ryujinx.UI.Common/Ryujinx.UI.Common.csproj b/src/Ryujinx.UI.Common/Ryujinx.UI.Common.csproj
index 7f57c7bf5..c43f95e4a 100644
--- a/src/Ryujinx.UI.Common/Ryujinx.UI.Common.csproj
+++ b/src/Ryujinx.UI.Common/Ryujinx.UI.Common.csproj
@@ -1,7 +1,6 @@
- net8.0true$(DefaultItemExcludes);._*
@@ -34,6 +33,7 @@
+
diff --git a/src/Ryujinx.UI.LocaleGenerator/Ryujinx.UI.LocaleGenerator.csproj b/src/Ryujinx.UI.LocaleGenerator/Ryujinx.UI.LocaleGenerator.csproj
index e4e627072..49cb39713 100644
--- a/src/Ryujinx.UI.LocaleGenerator/Ryujinx.UI.LocaleGenerator.csproj
+++ b/src/Ryujinx.UI.LocaleGenerator/Ryujinx.UI.LocaleGenerator.csproj
@@ -3,7 +3,6 @@
netstandard2.0enable
- latesttrue$(DefaultItemExcludes);._*
diff --git a/src/Ryujinx/AppHost.cs b/src/Ryujinx/AppHost.cs
index 65c798ac2..5872b278f 100644
--- a/src/Ryujinx/AppHost.cs
+++ b/src/Ryujinx/AppHost.cs
@@ -124,7 +124,7 @@ namespace Ryujinx.Ava
private bool _dialogShown;
private readonly bool _isFirmwareTitle;
- private readonly object _lockObject = new();
+ private readonly Lock _lockObject = new();
public event EventHandler AppExit;
public event EventHandler StatusUpdatedEvent;
@@ -682,13 +682,13 @@ namespace Ryujinx.Ava
if (Application.Current?.ApplicationLifetime is IClassicDesktopStyleApplicationLifetime)
{
if (!SetupValidator.CanStartApplication(ContentManager, ApplicationPath, out UserError userError))
- {
+ {
if (SetupValidator.CanFixStartApplication(ContentManager, ApplicationPath, userError, out firmwareVersion))
{
if (userError is UserError.NoFirmware)
{
UserResult result = await ContentDialogHelper.CreateConfirmationDialog(
- LocaleManager.Instance[LocaleKeys.DialogFirmwareNoFirmwareInstalledMessage],
+ LocaleManager.Instance[LocaleKeys.DialogFirmwareNoFirmwareInstalledMessage],
LocaleManager.Instance.UpdateAndGetDynamicValue(LocaleKeys.DialogFirmwareInstallEmbeddedMessage, firmwareVersion.VersionString),
LocaleManager.Instance[LocaleKeys.InputDialogYes],
LocaleManager.Instance[LocaleKeys.InputDialogNo],
diff --git a/src/Ryujinx/Assets/Locales/ar_SA.json b/src/Ryujinx/Assets/Locales/ar_SA.json
index 1b8354ae6..3ff57c0d1 100644
--- a/src/Ryujinx/Assets/Locales/ar_SA.json
+++ b/src/Ryujinx/Assets/Locales/ar_SA.json
@@ -45,6 +45,12 @@
"MenuBarViewWindow1080": "1080p",
"MenuBarHelp": "_مساعدة",
"MenuBarHelpCheckForUpdates": "تحقق من التحديثات",
+ "MenuBarHelpFaq": "FAQ & Troubleshooting Page",
+ "MenuBarHelpFaqTooltip": "Opens the FAQ and Troubleshooting page on the official Ryujinx wiki",
+ "MenuBarHelpSetup": "Setup & Configuration Guide",
+ "MenuBarHelpSetupTooltip": "Opens the Setup & Configuration guide on the official Ryujinx wiki",
+ "MenuBarHelpMultiplayer": "Multiplayer (LDN/LAN) Guide",
+ "MenuBarHelpMultiplayerTooltip": "Opens the Multiplayer guide on the official Ryujinx wiki",
"MenuBarHelpAbout": "حول",
"MenuSearch": "بحث...",
"GameListHeaderFavorite": "مفضلة",
diff --git a/src/Ryujinx/Assets/Locales/de_DE.json b/src/Ryujinx/Assets/Locales/de_DE.json
index cecad44ed..80562406c 100644
--- a/src/Ryujinx/Assets/Locales/de_DE.json
+++ b/src/Ryujinx/Assets/Locales/de_DE.json
@@ -45,6 +45,12 @@
"MenuBarViewWindow1080": "1080p",
"MenuBarHelp": "_Hilfe",
"MenuBarHelpCheckForUpdates": "Nach Updates suchen",
+ "MenuBarHelpFaq": "FAQ & Troubleshooting Page",
+ "MenuBarHelpFaqTooltip": "Opens the FAQ and Troubleshooting page on the official Ryujinx wiki",
+ "MenuBarHelpSetup": "Setup & Configuration Guide",
+ "MenuBarHelpSetupTooltip": "Opens the Setup & Configuration guide on the official Ryujinx wiki",
+ "MenuBarHelpMultiplayer": "Multiplayer (LDN/LAN) Guide",
+ "MenuBarHelpMultiplayerTooltip": "Opens the Multiplayer guide on the official Ryujinx wiki",
"MenuBarHelpAbout": "Über Ryujinx",
"MenuSearch": "Suchen...",
"GameListHeaderFavorite": "Favorit",
diff --git a/src/Ryujinx/Assets/Locales/el_GR.json b/src/Ryujinx/Assets/Locales/el_GR.json
index 01d78d50a..32c0d55e6 100644
--- a/src/Ryujinx/Assets/Locales/el_GR.json
+++ b/src/Ryujinx/Assets/Locales/el_GR.json
@@ -45,6 +45,12 @@
"MenuBarViewWindow1080": "1080p",
"MenuBarHelp": "_Βοήθεια",
"MenuBarHelpCheckForUpdates": "Έλεγχος για Ενημερώσεις",
+ "MenuBarHelpFaq": "FAQ & Troubleshooting Page",
+ "MenuBarHelpFaqTooltip": "Opens the FAQ and Troubleshooting page on the official Ryujinx wiki",
+ "MenuBarHelpSetup": "Setup & Configuration Guide",
+ "MenuBarHelpSetupTooltip": "Opens the Setup & Configuration guide on the official Ryujinx wiki",
+ "MenuBarHelpMultiplayer": "Multiplayer (LDN/LAN) Guide",
+ "MenuBarHelpMultiplayerTooltip": "Opens the Multiplayer guide on the official Ryujinx wiki",
"MenuBarHelpAbout": "Σχετικά με",
"MenuSearch": "Αναζήτηση...",
"GameListHeaderFavorite": "Αγαπημένο",
diff --git a/src/Ryujinx/Assets/Locales/en_US.json b/src/Ryujinx/Assets/Locales/en_US.json
index 76ad5ef35..dd3c9b628 100644
--- a/src/Ryujinx/Assets/Locales/en_US.json
+++ b/src/Ryujinx/Assets/Locales/en_US.json
@@ -45,6 +45,12 @@
"MenuBarViewWindow1080": "1080p",
"MenuBarHelp": "_Help",
"MenuBarHelpCheckForUpdates": "Check for Updates",
+ "MenuBarHelpFaq": "FAQ & Troubleshooting Page",
+ "MenuBarHelpFaqTooltip": "Opens the FAQ and Troubleshooting page on the official Ryujinx wiki",
+ "MenuBarHelpSetup": "Setup & Configuration Guide",
+ "MenuBarHelpSetupTooltip": "Opens the Setup & Configuration guide on the official Ryujinx wiki",
+ "MenuBarHelpMultiplayer": "Multiplayer (LDN/LAN) Guide",
+ "MenuBarHelpMultiplayerTooltip": "Opens the Multiplayer guide on the official Ryujinx wiki",
"MenuBarHelpAbout": "About",
"MenuSearch": "Search...",
"GameListHeaderFavorite": "Fav",
diff --git a/src/Ryujinx/Assets/Locales/es_ES.json b/src/Ryujinx/Assets/Locales/es_ES.json
index 4085e19bf..f57f2d8fc 100644
--- a/src/Ryujinx/Assets/Locales/es_ES.json
+++ b/src/Ryujinx/Assets/Locales/es_ES.json
@@ -45,6 +45,12 @@
"MenuBarViewWindow1080": "1080p",
"MenuBarHelp": "_Ayuda",
"MenuBarHelpCheckForUpdates": "Buscar actualizaciones",
+ "MenuBarHelpFaq": "FAQ & Troubleshooting Page",
+ "MenuBarHelpFaqTooltip": "Opens the FAQ and Troubleshooting page on the official Ryujinx wiki",
+ "MenuBarHelpSetup": "Setup & Configuration Guide",
+ "MenuBarHelpSetupTooltip": "Opens the Setup & Configuration guide on the official Ryujinx wiki",
+ "MenuBarHelpMultiplayer": "Multiplayer (LDN/LAN) Guide",
+ "MenuBarHelpMultiplayerTooltip": "Opens the Multiplayer guide on the official Ryujinx wiki",
"MenuBarHelpAbout": "Acerca de",
"MenuSearch": "Buscar...",
"GameListHeaderFavorite": "Favoritos",
diff --git a/src/Ryujinx/Assets/Locales/fr_FR.json b/src/Ryujinx/Assets/Locales/fr_FR.json
index 35b2d6e6c..59e0d449d 100644
--- a/src/Ryujinx/Assets/Locales/fr_FR.json
+++ b/src/Ryujinx/Assets/Locales/fr_FR.json
@@ -45,6 +45,12 @@
"MenuBarViewWindow1080": "1080p",
"MenuBarHelp": "_Aide",
"MenuBarHelpCheckForUpdates": "Vérifier les mises à jour",
+ "MenuBarHelpFaq": "Page de FAQ et de dépannage",
+ "MenuBarHelpFaqTooltip": "Ouvre la page de FAQ et de dépannage sur le wiki officiel de Ryujinx",
+ "MenuBarHelpSetup": "Guide d'Installation et de Configuration",
+ "MenuBarHelpSetupTooltip": "Ouvre le guide d'installation et de configuration sur le wiki officiel de Ryujinx",
+ "MenuBarHelpMultiplayer": "Guide Multijoueur (LDN/LAN)",
+ "MenuBarHelpMultiplayerTooltip": "Ouvre le guide de Multijoueur sur le wiki officiel de Ryujinx",
"MenuBarHelpAbout": "À propos",
"MenuSearch": "Rechercher...",
"GameListHeaderFavorite": "Favoris",
diff --git a/src/Ryujinx/Assets/Locales/he_IL.json b/src/Ryujinx/Assets/Locales/he_IL.json
index acf21758f..f7e7f6ddf 100644
--- a/src/Ryujinx/Assets/Locales/he_IL.json
+++ b/src/Ryujinx/Assets/Locales/he_IL.json
@@ -45,6 +45,12 @@
"MenuBarViewWindow1080": "1080p",
"MenuBarHelp": "_עזרה",
"MenuBarHelpCheckForUpdates": "חפש עדכונים",
+ "MenuBarHelpFaq": "FAQ & Troubleshooting Page",
+ "MenuBarHelpFaqTooltip": "Opens the FAQ and Troubleshooting page on the official Ryujinx wiki",
+ "MenuBarHelpSetup": "Setup & Configuration Guide",
+ "MenuBarHelpSetupTooltip": "Opens the Setup & Configuration guide on the official Ryujinx wiki",
+ "MenuBarHelpMultiplayer": "Multiplayer (LDN/LAN) Guide",
+ "MenuBarHelpMultiplayerTooltip": "Opens the Multiplayer guide on the official Ryujinx wiki",
"MenuBarHelpAbout": "אודות",
"MenuSearch": "חפש...",
"GameListHeaderFavorite": "אהוב",
diff --git a/src/Ryujinx/Assets/Locales/it_IT.json b/src/Ryujinx/Assets/Locales/it_IT.json
index f572f2c2f..206ff377c 100644
--- a/src/Ryujinx/Assets/Locales/it_IT.json
+++ b/src/Ryujinx/Assets/Locales/it_IT.json
@@ -45,6 +45,12 @@
"MenuBarViewWindow1080": "1080p",
"MenuBarHelp": "_Aiuto",
"MenuBarHelpCheckForUpdates": "Controlla aggiornamenti",
+ "MenuBarHelpFaq": "FAQ & Troubleshooting Page",
+ "MenuBarHelpFaqTooltip": "Opens the FAQ and Troubleshooting page on the official Ryujinx wiki",
+ "MenuBarHelpSetup": "Setup & Configuration Guide",
+ "MenuBarHelpSetupTooltip": "Opens the Setup & Configuration guide on the official Ryujinx wiki",
+ "MenuBarHelpMultiplayer": "Multiplayer (LDN/LAN) Guide",
+ "MenuBarHelpMultiplayerTooltip": "Opens the Multiplayer guide on the official Ryujinx wiki",
"MenuBarHelpAbout": "Informazioni",
"MenuSearch": "Cerca...",
"GameListHeaderFavorite": "Preferito",
diff --git a/src/Ryujinx/Assets/Locales/ja_JP.json b/src/Ryujinx/Assets/Locales/ja_JP.json
index f5f7c3bd3..91931021b 100644
--- a/src/Ryujinx/Assets/Locales/ja_JP.json
+++ b/src/Ryujinx/Assets/Locales/ja_JP.json
@@ -45,6 +45,12 @@
"MenuBarViewWindow1080": "1080p",
"MenuBarHelp": "ヘルプ(_H)",
"MenuBarHelpCheckForUpdates": "アップデートを確認",
+ "MenuBarHelpFaq": "FAQ & Troubleshooting Page",
+ "MenuBarHelpFaqTooltip": "Opens the FAQ and Troubleshooting page on the official Ryujinx wiki",
+ "MenuBarHelpSetup": "Setup & Configuration Guide",
+ "MenuBarHelpSetupTooltip": "Opens the Setup & Configuration guide on the official Ryujinx wiki",
+ "MenuBarHelpMultiplayer": "Multiplayer (LDN/LAN) Guide",
+ "MenuBarHelpMultiplayerTooltip": "Opens the Multiplayer guide on the official Ryujinx wiki",
"MenuBarHelpAbout": "Ryujinx について",
"MenuSearch": "検索...",
"GameListHeaderFavorite": "お気に入り",
diff --git a/src/Ryujinx/Assets/Locales/ko_KR.json b/src/Ryujinx/Assets/Locales/ko_KR.json
index 880125f71..2b73fb41f 100644
--- a/src/Ryujinx/Assets/Locales/ko_KR.json
+++ b/src/Ryujinx/Assets/Locales/ko_KR.json
@@ -45,6 +45,12 @@
"MenuBarViewWindow1080": "1080p",
"MenuBarHelp": "도움말(_H)",
"MenuBarHelpCheckForUpdates": "업데이트 확인",
+ "MenuBarHelpFaq": "FAQ & Troubleshooting Page",
+ "MenuBarHelpFaqTooltip": "Opens the FAQ and Troubleshooting page on the official Ryujinx wiki",
+ "MenuBarHelpSetup": "Setup & Configuration Guide",
+ "MenuBarHelpSetupTooltip": "Opens the Setup & Configuration guide on the official Ryujinx wiki",
+ "MenuBarHelpMultiplayer": "Multiplayer (LDN/LAN) Guide",
+ "MenuBarHelpMultiplayerTooltip": "Opens the Multiplayer guide on the official Ryujinx wiki",
"MenuBarHelpAbout": "정보",
"MenuSearch": "찾기...",
"GameListHeaderFavorite": "즐겨찾기",
@@ -556,9 +562,9 @@
"AboutGithubUrlTooltipMessage": "클릭하면 기본 브라우저에서 Ryujinx GitHub 페이지가 열립니다.",
"AboutDiscordUrlTooltipMessage": "클릭하면 기본 브라우저에서 Ryujinx 디스코드 서버 초대장이 열립니다.",
"AboutRyujinxAboutTitle": "정보 :",
- "AboutRyujinxAboutContent": "Ryujinx is an emulator for the Nintendo Switch™.\nGet all the latest news in our Discord.\nDevelopers interested in contributing can find out more on our GitHub or Discord.",
+ "AboutRyujinxAboutContent": "Ryujinx는 Nintendo Switch™용 에뮬레이터입니다.\n모든 최신 소식을 Discord에서 확인하세요.\n기여에 관심이 있는 개발자는 GitHub 또는 Discord에서 자세한 내용을 확인할 수 있습니다.",
"AboutRyujinxMaintainersTitle": "유지 관리 :",
- "AboutRyujinxFormerMaintainersTitle": "Formerly Maintained By:",
+ "AboutRyujinxFormerMaintainersTitle": "이전 관리자 :",
"AboutRyujinxMaintainersContentTooltipMessage": "클릭하면 기본 브라우저에서 기여자 페이지가 열립니다.",
"AmiiboSeriesLabel": "Amiibo 시리즈",
"AmiiboCharacterLabel": "캐릭터",
diff --git a/src/Ryujinx/Assets/Locales/no_NO.json b/src/Ryujinx/Assets/Locales/no_NO.json
new file mode 100644
index 000000000..b06a01130
--- /dev/null
+++ b/src/Ryujinx/Assets/Locales/no_NO.json
@@ -0,0 +1,791 @@
+{
+ "Language": "Norsk",
+ "MenuBarFileOpenApplet": "Åpne Program",
+ "MenuBarFileOpenAppletOpenMiiAppletToolTip": "Åpne Mii Redigerings program i eget vindu",
+ "SettingsTabInputDirectMouseAccess": "Direkte tilgang med Mus",
+ "SettingsTabSystemMemoryManagerMode": "Memory Manager-modus",
+ "SettingsTabSystemMemoryManagerModeSoftware": "Programvare",
+ "SettingsTabSystemMemoryManagerModeHost": "Vert (rask)",
+ "SettingsTabSystemMemoryManagerModeHostUnchecked": "Vert Ukontrollert (raskets, utrygt)",
+ "SettingsTabSystemUseHypervisor": "Bruk Hypervisor",
+ "MenuBarFile": "_Fil",
+ "MenuBarFileOpenFromFile": "_Last inn program fra fil",
+ "MenuBarFileOpenFromFileError": "Ingen apper ble funnet i valgt fil.",
+ "MenuBarFileOpenUnpacked": "Last inn _Upakket spill",
+ "MenuBarFileOpenEmuFolder": "Åpne Ryujinx mappe",
+ "MenuBarFileOpenLogsFolder": "Åpne Logg mappen",
+ "MenuBarFileExit": "_Avslutt",
+ "MenuBarOptions": "_Alternativer",
+ "MenuBarOptionsToggleFullscreen": "Fullskjermsvisning av/på",
+ "MenuBarOptionsStartGamesInFullscreen": "Start spill i Fullskjermmodus",
+ "MenuBarOptionsStopEmulation": "Stopp Emulering",
+ "MenuBarOptionsSettings": "_Innstillinger",
+ "MenuBarOptionsManageUserProfiles": "_Administrere Brukerprofiler",
+ "MenuBarActions": "_Handlinger",
+ "MenuBarOptionsSimulateWakeUpMessage": "Simuler oppvåknings-melding",
+ "MenuBarActionsScanAmiibo": "Skann en Amiibo",
+ "MenuBarTools": "_Verktøy",
+ "MenuBarToolsInstallFirmware": "Installer fastvare",
+ "MenuBarFileToolsInstallFirmwareFromFile": "Installer en fastvare fra XCI eller ZIP",
+ "MenuBarFileToolsInstallFirmwareFromDirectory": "Installer en fastvare fra en mappe",
+ "MenuBarToolsManageFileTypes": "Behandle filtyper",
+ "MenuBarToolsInstallFileTypes": "Installer filtyper",
+ "MenuBarToolsUninstallFileTypes": "Avinstaller filtyper",
+ "MenuBarView": "_Vis",
+ "MenuBarViewWindow": "Vindu størrelse",
+ "MenuBarViewWindow720": "720p",
+ "MenuBarViewWindow1080": "1080p",
+ "MenuBarHelp": "_Hjelp",
+ "MenuBarHelpCheckForUpdates": "Se etter oppdateringer",
+ "MenuBarHelpFaq": "FAQ & Troubleshooting Page",
+ "MenuBarHelpFaqTooltip": "Opens the FAQ and Troubleshooting page on the official Ryujinx wiki",
+ "MenuBarHelpSetup": "Setup & Configuration Guide",
+ "MenuBarHelpSetupTooltip": "Opens the Setup & Configuration guide on the official Ryujinx wiki",
+ "MenuBarHelpMultiplayer": "Multiplayer (LDN/LAN) Guide",
+ "MenuBarHelpMultiplayerTooltip": "Opens the Multiplayer guide on the official Ryujinx wiki",
+ "MenuBarHelpAbout": "Om",
+ "MenuSearch": "Søk ...",
+ "GameListHeaderFavorite": "Fav",
+ "GameListHeaderIcon": "Ikon",
+ "GameListHeaderApplication": "Navn",
+ "GameListHeaderDeveloper": "Utvikler",
+ "GameListHeaderVersion": "Versjon",
+ "GameListHeaderTimePlayed": "Spilletid",
+ "GameListHeaderLastPlayed": "Sist Spilt",
+ "GameListHeaderFileExtension": "Fil Eks.",
+ "GameListHeaderFileSize": "Fil Størrelse",
+ "GameListHeaderPath": "Bane",
+ "GameListContextMenuOpenUserSaveDirectory": "Åpne bruker lagrings mappe",
+ "GameListContextMenuOpenUserSaveDirectoryToolTip": "Åpner mappen som inneholder programmets bruker lagring",
+ "GameListContextMenuOpenDeviceSaveDirectory": "Åpne lagringsmappe for enheten",
+ "GameListContextMenuOpenDeviceSaveDirectoryToolTip": "Åpner mappen som inneholder programmets lagringsenhet",
+ "GameListContextMenuOpenBcatSaveDirectory": "Åpne BCAT lagringsmappe",
+ "GameListContextMenuOpenBcatSaveDirectoryToolTip": "Åpner mappen som inneholder programmets BCAT-lagring",
+ "GameListContextMenuManageTitleUpdates": "Administrer titteloppdateringer",
+ "GameListContextMenuManageTitleUpdatesToolTip": "Åpner vinduet Tittel - Oppdateringskontroll",
+ "GameListContextMenuManageDlc": "Administrer DLC",
+ "GameListContextMenuManageDlcToolTip": "Åpner DLC håndteringsvinduet",
+ "GameListContextMenuCacheManagement": "Cache administrasjon",
+ "GameListContextMenuCacheManagementPurgePptc": "Start PPTC gjenoppbygging",
+ "GameListContextMenuCacheManagementPurgePptcToolTip": "Utløs PPTC for å gjenoppbygge ved oppstart av neste spill-start",
+ "GameListContextMenuCacheManagementPurgeShaderCache": "Tøm shader cache",
+ "GameListContextMenuCacheManagementPurgeShaderCacheToolTip": "Sletter applikasjonens shader cache",
+ "GameListContextMenuCacheManagementOpenPptcDirectory": "Åpne PPTC mappe",
+ "GameListContextMenuCacheManagementOpenPptcDirectoryToolTip": "Åpner mappen som inneholder programmets PPTC cache",
+ "GameListContextMenuCacheManagementOpenShaderCacheDirectory": "Åpne Shader Cache-mappen",
+ "GameListContextMenuCacheManagementOpenShaderCacheDirectoryToolTip": "Åpner mappen som inneholder Programmets shader cache",
+ "GameListContextMenuExtractData": "Hent ut data",
+ "GameListContextMenuExtractDataExeFS": "ExeFS",
+ "GameListContextMenuExtractDataExeFSToolTip": "Pakk ut ExeFS seksjonen fra Programmets gjeldende konfigurasjon (inkludert oppdateringer)",
+ "GameListContextMenuExtractDataRomFS": "RomFS",
+ "GameListContextMenuExtractDataRomFSToolTip": "Pakk ut RomFS seksjonen fra applikasjonens gjeldende konfigurasjon (inkludert oppdateringer)",
+ "GameListContextMenuExtractDataLogo": "Logo",
+ "GameListContextMenuExtractDataLogoToolTip": "Pakk ut Logo-seksjonen fra applikasjonens gjeldende konfigurasjon (inkludert oppdateringer)",
+ "GameListContextMenuCreateShortcut": "Lag programsnarvei",
+ "GameListContextMenuCreateShortcutToolTip": "Lag en snarvei på skrivebordet som starter den valgte Applikasjonen",
+ "GameListContextMenuCreateShortcutToolTipMacOS": "Lag snarvei i macOSs Program-mappen som starter det valgte programmet",
+ "GameListContextMenuOpenModsDirectory": "Åpne Modifikasjonsmappen",
+ "GameListContextMenuOpenModsDirectoryToolTip": "Åpner mappen som inneholder programmets modifikasjoner",
+ "GameListContextMenuOpenSdModsDirectory": "Åpne Atmosfære modifikasjons mappen",
+ "GameListContextMenuOpenSdModsDirectoryToolTip": "Åpner den alternative SD-kortets Atmosfære-mappe som inneholder programmoduser. Nyttig for modifikasjoner som er pakket for ekte maskinvare.",
+ "StatusBarGamesLoaded": "{0}/{1} Spill Lastet",
+ "StatusBarSystemVersion": "System versjon: {0}",
+ "LinuxVmMaxMapCountDialogTitle": "Lav grense for minnetildelinger oppdaget",
+ "LinuxVmMaxMapCountDialogTextPrimary": "Ønsker du å øke verdien av vm.max_map_count til {0}",
+ "LinuxVmMaxMapCountDialogTextSecondary": "Noen spill kan prøve å lage flere minnekartlegging enn det som er tillatt. Ryujinx vil krasjes så snart denne grensen overskrides.",
+ "LinuxVmMaxMapCountDialogButtonUntilRestart": "Ja, frem til neste omstart",
+ "LinuxVmMaxMapCountDialogButtonPersistent": "Ja, permanent",
+ "LinuxVmMaxMapCountWarningTextPrimary": "Den maksimale mengden Minnetilordninger er lavere enn anbefalt.",
+ "LinuxVmMaxMapCountWarningTextSecondary": "Gjeldende verdi av vm.max_map_count ({0}) er lavere enn {1}. Noen spill kan prøve å lage flere minnedelinger enn det som er tillatt. Ryujinx vil kræsje så snart denne grensen overskrides.\n\nDet kan hende du ønsker å enten øke grensen eller installere pkexec manuelt, slik at Ryujinx kan hjelpe til med det.",
+ "Settings": "Innstillinger",
+ "SettingsTabGeneral": "Brukergrensesnitt",
+ "SettingsTabGeneralGeneral": "Generelt",
+ "SettingsTabGeneralEnableDiscordRichPresence": "Aktiver Discord Rik Tilstedeværelse",
+ "SettingsTabGeneralCheckUpdatesOnLaunch": "Se etter oppdateringer ved oppstart",
+ "SettingsTabGeneralShowConfirmExitDialog": "Vis \"Bekreft Avslutt\" vinduet",
+ "SettingsTabGeneralRememberWindowState": "Husk vinduets størrelse/posisjon",
+ "SettingsTabGeneralHideCursor": "Skjul musepeker:",
+ "SettingsTabGeneralHideCursorNever": "Aldri",
+ "SettingsTabGeneralHideCursorOnIdle": "Når inaktiv",
+ "SettingsTabGeneralHideCursorAlways": "Alltid",
+ "SettingsTabGeneralGameDirectories": "Spillmapper",
+ "SettingsTabGeneralAdd": "Legg til",
+ "SettingsTabGeneralRemove": "Fjern",
+ "SettingsTabSystem": "System",
+ "SettingsTabSystemCore": "Kjerne",
+ "SettingsTabSystemSystemRegion": "System region:",
+ "SettingsTabSystemSystemRegionJapan": "Japan",
+ "SettingsTabSystemSystemRegionUSA": "USA",
+ "SettingsTabSystemSystemRegionEurope": "Europa",
+ "SettingsTabSystemSystemRegionAustralia": "Australia",
+ "SettingsTabSystemSystemRegionChina": "Kina",
+ "SettingsTabSystemSystemRegionKorea": "Korea",
+ "SettingsTabSystemSystemRegionTaiwan": "Taiwan",
+ "SettingsTabSystemSystemLanguage": "Systemspråk",
+ "SettingsTabSystemSystemLanguageJapanese": "Japansk",
+ "SettingsTabSystemSystemLanguageAmericanEnglish": "Amerikansk engelsk",
+ "SettingsTabSystemSystemLanguageFrench": "Fransk",
+ "SettingsTabSystemSystemLanguageGerman": "Tysk",
+ "SettingsTabSystemSystemLanguageItalian": "Italiensk",
+ "SettingsTabSystemSystemLanguageSpanish": "Spansk",
+ "SettingsTabSystemSystemLanguageChinese": "Kinesisk",
+ "SettingsTabSystemSystemLanguageKorean": "Koreansk",
+ "SettingsTabSystemSystemLanguageDutch": "Nederlandsk",
+ "SettingsTabSystemSystemLanguagePortuguese": "Portugisisk",
+ "SettingsTabSystemSystemLanguageRussian": "Russisk",
+ "SettingsTabSystemSystemLanguageTaiwanese": "Taiwansk",
+ "SettingsTabSystemSystemLanguageBritishEnglish": "Britisk engelsk",
+ "SettingsTabSystemSystemLanguageCanadianFrench": "Canadisk Fransk",
+ "SettingsTabSystemSystemLanguageLatinAmericanSpanish": "Latinamerikansk spansk",
+ "SettingsTabSystemSystemLanguageSimplifiedChinese": "Forenklet kinesisk",
+ "SettingsTabSystemSystemLanguageTraditionalChinese": "Tradisjonell Kinesisk",
+ "SettingsTabSystemSystemTimeZone": "System Tidssone:",
+ "SettingsTabSystemSystemTime": "System tid:",
+ "SettingsTabSystemEnableVsync": "VSynk",
+ "SettingsTabSystemEnablePptc": "PPTC (Profilert Vedvarende Oversettelseshurtigbuffer)",
+ "SettingsTabSystemEnableFsIntegrityChecks": "FS Integritetssjekk",
+ "SettingsTabSystemAudioBackend": "Lyd Backend:",
+ "SettingsTabSystemAudioBackendDummy": "Dummy",
+ "SettingsTabSystemAudioBackendOpenAL": "OpenAL",
+ "SettingsTabSystemAudioBackendSoundIO": "Lyd Inn/Ut",
+ "SettingsTabSystemAudioBackendSDL2": "SDL2",
+ "SettingsTabSystemHacks": "Hacks",
+ "SettingsTabSystemHacksNote": "Kan forårsake ustabilitet",
+ "SettingsTabSystemExpandDramSize": "Utvid DRAM til 8GiB",
+ "SettingsTabSystemIgnoreMissingServices": "Ignorer manglende tjenester",
+ "SettingsTabGraphics": "Grafikk",
+ "SettingsTabGraphicsAPI": "Grafikk API",
+ "SettingsTabGraphicsEnableShaderCache": "Aktiver Shader Cachen",
+ "SettingsTabGraphicsAnisotropicFiltering": "Anisotropisk filtrering:",
+ "SettingsTabGraphicsAnisotropicFilteringAuto": "Automatisk",
+ "SettingsTabGraphicsAnisotropicFiltering2x": "2x",
+ "SettingsTabGraphicsAnisotropicFiltering4x": "4x",
+ "SettingsTabGraphicsAnisotropicFiltering8x": "8x",
+ "SettingsTabGraphicsAnisotropicFiltering16x": "16x",
+ "SettingsTabGraphicsResolutionScale": "Oppløsnings skala:",
+ "SettingsTabGraphicsResolutionScaleCustom": "Egendefinert (anbefales ikke)",
+ "SettingsTabGraphicsResolutionScaleNative": "Naturlig (720p/1080p)",
+ "SettingsTabGraphicsResolutionScale2x": "2 x (1440p/2160p)",
+ "SettingsTabGraphicsResolutionScale3x": "3x (2160p/3240p)",
+ "SettingsTabGraphicsResolutionScale4x": "4x (2880p/4320p) (anbefales ikke)",
+ "SettingsTabGraphicsAspectRatio": "Bildeformat",
+ "SettingsTabGraphicsAspectRatio4x3": "4:3",
+ "SettingsTabGraphicsAspectRatio16x9": "16:9",
+ "SettingsTabGraphicsAspectRatio16x10": "16:10",
+ "SettingsTabGraphicsAspectRatio21x9": "21:9",
+ "SettingsTabGraphicsAspectRatio32x9": "32:9",
+ "SettingsTabGraphicsAspectRatioStretch": "Strekk for og Tilpasse vindu",
+ "SettingsTabGraphicsDeveloperOptions": "Utvikleralternativer",
+ "SettingsTabGraphicsShaderDumpPath": "Grafikk Shader Dump bane:",
+ "SettingsTabLogging": "Logging",
+ "SettingsTabLoggingLogging": "Logging",
+ "SettingsTabLoggingEnableLoggingToFile": "Aktiver logging til fil",
+ "SettingsTabLoggingEnableStubLogs": "Aktiver Stub-logger",
+ "SettingsTabLoggingEnableInfoLogs": "Aktiver informasjonslogger",
+ "SettingsTabLoggingEnableWarningLogs": "Aktiver varsellogger",
+ "SettingsTabLoggingEnableErrorLogs": "Aktiver feillogger",
+ "SettingsTabLoggingEnableTraceLogs": "Aktiver spor logger",
+ "SettingsTabLoggingEnableGuestLogs": "Aktiver gjestelogger",
+ "SettingsTabLoggingEnableFsAccessLogs": "Aktiver Fs tilgangslogger",
+ "SettingsTabLoggingFsGlobalAccessLogMode": "Fs Global Access-logg-modus:",
+ "SettingsTabLoggingDeveloperOptions": "Utvikleralternativer",
+ "SettingsTabLoggingDeveloperOptionsNote": "Advarsel: Vil redusere ytelsen",
+ "SettingsTabLoggingGraphicsBackendLogLevel": "Grafikk Backend-loggnivå:",
+ "SettingsTabLoggingGraphicsBackendLogLevelNone": "Ingen",
+ "SettingsTabLoggingGraphicsBackendLogLevelError": "Feil",
+ "SettingsTabLoggingGraphicsBackendLogLevelPerformance": "Tregere",
+ "SettingsTabLoggingGraphicsBackendLogLevelAll": "Alle",
+ "SettingsTabLoggingEnableDebugLogs": "Aktiver feilsøkingslogger",
+ "SettingsTabInput": "Inndata",
+ "SettingsTabInputEnableDockedMode": "Forankret modus",
+ "SettingsTabInputDirectKeyboardAccess": "Direkte tastaturtilgang",
+ "SettingsButtonSave": "Lagre",
+ "SettingsButtonClose": "Lukk",
+ "SettingsButtonOk": "OK",
+ "SettingsButtonCancel": "Avbryt",
+ "SettingsButtonApply": "Bruk",
+ "ControllerSettingsPlayer": "Spiller",
+ "ControllerSettingsPlayer1": "Spiller 1",
+ "ControllerSettingsPlayer2": "Spiller 2",
+ "ControllerSettingsPlayer3": "Spiller 3",
+ "ControllerSettingsPlayer4": "Spiller 4",
+ "ControllerSettingsPlayer5": "Spiller 5",
+ "ControllerSettingsPlayer6": "Spiller 6",
+ "ControllerSettingsPlayer7": "Spiller 7",
+ "ControllerSettingsPlayer8": "Spiller 8",
+ "ControllerSettingsHandheld": "Håndholdt",
+ "ControllerSettingsInputDevice": "Inndataenhet",
+ "ControllerSettingsRefresh": "Oppdater",
+ "ControllerSettingsDeviceDisabled": "Deaktivert",
+ "ControllerSettingsControllerType": "Kontrollertype",
+ "ControllerSettingsControllerTypeHandheld": "Håndholdt",
+ "ControllerSettingsControllerTypeProController": "Pro Controller",
+ "ControllerSettingsControllerTypeJoyConPair": "JoyCon Par",
+ "ControllerSettingsControllerTypeJoyConLeft": "JoyCon venstre",
+ "ControllerSettingsControllerTypeJoyConRight": "JoyCon høyre",
+ "ControllerSettingsProfile": "Profil",
+ "ControllerSettingsProfileDefault": "Standard",
+ "ControllerSettingsLoad": "Last",
+ "ControllerSettingsAdd": "Legg til",
+ "ControllerSettingsRemove": "Fjern",
+ "ControllerSettingsButtons": "Knapper",
+ "ControllerSettingsButtonA": "A",
+ "ControllerSettingsButtonB": "B",
+ "ControllerSettingsButtonX": "X",
+ "ControllerSettingsButtonY": "Y",
+ "ControllerSettingsButtonPlus": "+",
+ "ControllerSettingsButtonMinus": "-",
+ "ControllerSettingsDPad": "Retningsfelt",
+ "ControllerSettingsDPadUp": "Opp",
+ "ControllerSettingsDPadDown": "Ned",
+ "ControllerSettingsDPadLeft": "Venstre",
+ "ControllerSettingsDPadRight": "Høyre",
+ "ControllerSettingsStickButton": "Knapp",
+ "ControllerSettingsStickUp": "Opp",
+ "ControllerSettingsStickDown": "Ned",
+ "ControllerSettingsStickLeft": "Venstre",
+ "ControllerSettingsStickRight": "Høyre",
+ "ControllerSettingsStickStick": "Styrespak",
+ "ControllerSettingsStickInvertXAxis": "Inverter Styrespak X",
+ "ControllerSettingsStickInvertYAxis": "Inverter Styrespak Y",
+ "ControllerSettingsStickDeadzone": "Død sone:",
+ "ControllerSettingsLStick": "Venstre styrespak",
+ "ControllerSettingsRStick": "Høyre styrespak",
+ "ControllerSettingsTriggersLeft": "Utløsere venstre",
+ "ControllerSettingsTriggersRight": "Utløsere høyre",
+ "ControllerSettingsTriggersButtonsLeft": "Utløserknapper Venstre",
+ "ControllerSettingsTriggersButtonsRight": "Utløserknapper høyre",
+ "ControllerSettingsTriggers": "Utløsere",
+ "ControllerSettingsTriggerL": "L",
+ "ControllerSettingsTriggerR": "R",
+ "ControllerSettingsTriggerZL": "ZL",
+ "ControllerSettingsTriggerZR": "ZR",
+ "ControllerSettingsLeftSL": "SL",
+ "ControllerSettingsLeftSR": "SR",
+ "ControllerSettingsRightSL": "SL",
+ "ControllerSettingsRightSR": "SR",
+ "ControllerSettingsExtraButtonsLeft": "Knapper til venstre",
+ "ControllerSettingsExtraButtonsRight": "Knapper til høyre",
+ "ControllerSettingsMisc": "Diverse",
+ "ControllerSettingsTriggerThreshold": "Utløser terskel:",
+ "ControllerSettingsMotion": "Bevegelse",
+ "ControllerSettingsMotionUseCemuhookCompatibleMotion": "Bruk CemuHook kompatibel bevegelse",
+ "ControllerSettingsMotionControllerSlot": "Kontrollertype:",
+ "ControllerSettingsMotionMirrorInput": "Speilvend",
+ "ControllerSettingsMotionRightJoyConSlot": "Høyre JoyCon set:",
+ "ControllerSettingsMotionServerHost": "Server Vert:",
+ "ControllerSettingsMotionGyroSensitivity": "Gyro følsomhet:",
+ "ControllerSettingsMotionGyroDeadzone": "Gyro Dødsone:",
+ "ControllerSettingsSave": "Lagre",
+ "ControllerSettingsClose": "Lukk",
+ "KeyUnknown": "Ukjent",
+ "KeyShiftLeft": "Skift venstre",
+ "KeyShiftRight": "Skift høyre",
+ "KeyControlLeft": "Ctrl venstre",
+ "KeyMacControlLeft": "⌃ Venstre",
+ "KeyControlRight": "Ctrl høyre",
+ "KeyMacControlRight": "⌃ Høyre",
+ "KeyAltLeft": "Alt Venstre",
+ "KeyMacAltLeft": "⌥ Venstre",
+ "KeyAltRight": "Alt høyre",
+ "KeyMacAltRight": "⌥ Høyre",
+ "KeyWinLeft": "⊞ Venstre",
+ "KeyMacWinLeft": "⌘ Venstre",
+ "KeyWinRight": "⊞ Høyre",
+ "KeyMacWinRight": "⌘ Høyre",
+ "KeyMenu": "Meny",
+ "KeyUp": "Opp",
+ "KeyDown": "Ned",
+ "KeyLeft": "Venstre",
+ "KeyRight": "Høyre",
+ "KeyEnter": "Enter",
+ "KeyEscape": "Esc-tast",
+ "KeySpace": "Mellomrom",
+ "KeyTab": "Tab",
+ "KeyBackSpace": "Tilbaketast",
+ "KeyInsert": "Sett inn",
+ "KeyDelete": "Slett",
+ "KeyPageUp": "Side opp",
+ "KeyPageDown": "Side ned",
+ "KeyHome": "Hjem",
+ "KeyEnd": "Avslutt",
+ "KeyCapsLock": "Skiftelås",
+ "KeyScrollLock": "Rullelås",
+ "KeyPrintScreen": "Skjermbilde",
+ "KeyPause": "Stans midlertidig",
+ "KeyNumLock": "Numerisk Lås",
+ "KeyClear": "Tøm",
+ "KeyKeypad0": "Numerisk 0",
+ "KeyKeypad1": "Numerisk 1",
+ "KeyKeypad2": "Numerisk 2",
+ "KeyKeypad3": "Numerisk 3",
+ "KeyKeypad4": "Numerisk 4",
+ "KeyKeypad5": "Numerisk 5",
+ "KeyKeypad6": "Numerisk 6",
+ "KeyKeypad7": "Numerisk 7",
+ "KeyKeypad8": "Numerisk 8",
+ "KeyKeypad9": "Numerisk 9",
+ "KeyKeypadDivide": "Numerisk Dele",
+ "KeyKeypadMultiply": "Numerisk Multiplisere",
+ "KeyKeypadSubtract": "Numerisk Subtrakt",
+ "KeyKeypadAdd": "Numerisk Legg til",
+ "KeyKeypadDecimal": "Numerisk Desimal",
+ "KeyKeypadEnter": "Numerisk Enter",
+ "KeyNumber0": "0",
+ "KeyNumber1": "1",
+ "KeyNumber2": "2",
+ "KeyNumber3": "3",
+ "KeyNumber4": "4",
+ "KeyNumber5": "5",
+ "KeyNumber6": "6",
+ "KeyNumber7": "7",
+ "KeyNumber8": "8",
+ "KeyNumber9": "9",
+ "KeyTilde": "~",
+ "KeyGrave": "`",
+ "KeyMinus": "-",
+ "KeyPlus": "+",
+ "KeyBracketLeft": "[",
+ "KeyBracketRight": "]",
+ "KeySemicolon": ";",
+ "KeyQuote": "\"",
+ "KeyComma": ",",
+ "KeyPeriod": ".",
+ "KeySlash": "/",
+ "KeyBackSlash": "\\",
+ "KeyUnbound": "Ikke bundet",
+ "GamepadLeftStick": "Venstre Styrespak Trykk",
+ "GamepadRightStick": "R Styrespak Trykk",
+ "GamepadLeftShoulder": "Venstre Skulder",
+ "GamepadRightShoulder": "Høyre Skulder",
+ "GamepadLeftTrigger": "Venstre utløser",
+ "GamepadRightTrigger": "Høyre utløser",
+ "GamepadDpadUp": "Opp",
+ "GamepadDpadDown": "Ned",
+ "GamepadDpadLeft": "Venstre",
+ "GamepadDpadRight": "Høyre",
+ "GamepadMinus": "-",
+ "GamepadPlus": "+",
+ "GamepadGuide": "Veiledning",
+ "GamepadMisc1": "Diverse",
+ "GamepadPaddle1": "Paddle 1",
+ "GamepadPaddle2": "Paddle 2",
+ "GamepadPaddle3": "Paddle 3",
+ "GamepadPaddle4": "Paddle 4",
+ "GamepadTouchpad": "Berøringsplate",
+ "GamepadSingleLeftTrigger0": "Venstre utløser 0",
+ "GamepadSingleRightTrigger0": "Høyre utløser 0",
+ "GamepadSingleLeftTrigger1": "Venstre utløser 1",
+ "GamepadSingleRightTrigger1": "Høyre utløser 1",
+ "StickLeft": "Venstre styrespak",
+ "StickRight": "Høyre styrespak",
+ "UserProfilesSelectedUserProfile": "Valgt brukerprofil:",
+ "UserProfilesSaveProfileName": "Lagre profilnavnet",
+ "UserProfilesChangeProfileImage": "Endre profilbilde",
+ "UserProfilesAvailableUserProfiles": "Tilgjengelige brukerprofiler:",
+ "UserProfilesAddNewProfile": "Opprett Profil",
+ "UserProfilesDelete": "Slett",
+ "UserProfilesClose": "Lukk",
+ "ProfileNameSelectionWatermark": "Velg ett kallenavn",
+ "ProfileImageSelectionTitle": "Valg av profilbilde",
+ "ProfileImageSelectionHeader": "Velg et profilbilde",
+ "ProfileImageSelectionNote": "Du kan importere et tilpasset profilbilde, eller velge en avatar fra system fastvare",
+ "ProfileImageSelectionImportImage": "Importer bildefil",
+ "ProfileImageSelectionSelectAvatar": "Velg fastvare profilbilde",
+ "InputDialogTitle": "Input Dialog",
+ "InputDialogOk": "OK",
+ "InputDialogCancel": "Avbryt",
+ "InputDialogAddNewProfileTitle": "Velg profilnavnet",
+ "InputDialogAddNewProfileHeader": "Vennligst skriv inn et profilnavn",
+ "InputDialogAddNewProfileSubtext": "(Maks lengde: {0})",
+ "AvatarChoose": "Velg profilbilde",
+ "AvatarSetBackgroundColor": "Angi bakgrunnsfarge",
+ "AvatarClose": "Lukk",
+ "ControllerSettingsLoadProfileToolTip": "Last inn profil",
+ "ControllerSettingsAddProfileToolTip": "Legg til profil",
+ "ControllerSettingsRemoveProfileToolTip": "Fjern profil",
+ "ControllerSettingsSaveProfileToolTip": "Lagre Profil",
+ "MenuBarFileToolsTakeScreenshot": "Ta skjermbilde",
+ "MenuBarFileToolsHideUi": "Skjul brukergrensesnitt",
+ "GameListContextMenuRunApplication": "Kjør programmet",
+ "GameListContextMenuToggleFavorite": "Vis/Skjul favoritter",
+ "GameListContextMenuToggleFavoriteToolTip": "Vis/Skjul favorittstatus for spillet",
+ "SettingsTabGeneralTheme": "Tema:",
+ "SettingsTabGeneralThemeAuto": "Automatisk",
+ "SettingsTabGeneralThemeDark": "Mørk",
+ "SettingsTabGeneralThemeLight": "Lys",
+ "ControllerSettingsConfigureGeneral": "Konfigurer",
+ "ControllerSettingsRumble": "Vibrasjon",
+ "ControllerSettingsRumbleStrongMultiplier": "Sterk Vibrasjon multiplikator",
+ "ControllerSettingsRumbleWeakMultiplier": "Svak Vibrasjon multiplikator",
+ "DialogMessageSaveNotAvailableMessage": "Det er ingen lagrede data for {0} [{1:x16}]",
+ "DialogMessageSaveNotAvailableCreateSaveMessage": "Vil du lage lagrede data for dette spillet",
+ "DialogConfirmationTitle": "Ryujinx - Bekreftelse",
+ "DialogUpdaterTitle": "Ryujinx – Oppdaterer",
+ "DialogErrorTitle": "Ryujinx - Feil",
+ "DialogWarningTitle": "Ryujinx - Advarsel",
+ "DialogExitTitle": "Ryujinx - Avslutt",
+ "DialogErrorMessage": "Ryujinx har støtt på ett problem",
+ "DialogExitMessage": "Er du sikker på at du ønsker å lukke Ryujinx?",
+ "DialogExitSubMessage": "Alle ulagrede data vil gå tapt!",
+ "DialogMessageCreateSaveErrorMessage": "Det oppstod en feil under oppretting av den angitte lagredata: {0}",
+ "DialogMessageFindSaveErrorMessage": "Det oppstod en feil under oppretting av den angitte lagredata: {0}",
+ "FolderDialogExtractTitle": "Velg mappen å pakke ut i",
+ "DialogNcaExtractionMessage": "Trekker ut {0} seksjonen fra {1}...",
+ "DialogNcaExtractionTitle": "Ryujinx - NCA Seksjon Ekstraktor",
+ "DialogNcaExtractionMainNcaNotFoundErrorMessage": "Uttrekksfeil. Hoveddelen av NCA var ikke tilstede i valgt fil.",
+ "DialogNcaExtractionCheckLogErrorMessage": "Uttrekkingsfeil. Les loggfilen for mer informasjon.",
+ "DialogNcaExtractionSuccessMessage": "Utvinningen er fullført.",
+ "DialogUpdaterConvertFailedMessage": "Kunne ikke konvertere gjeldende Ryujinx-versjon.",
+ "DialogUpdaterCancelUpdateMessage": "Avbryter oppdatering!",
+ "DialogUpdaterAlreadyOnLatestVersionMessage": "Du bruker allerede den nyeste versjonen av Ryujinx!",
+ "DialogUpdaterFailedToGetVersionMessage": "En feil oppstod ved forsøk på å få utgivelsesinformasjon fra GitHub Utgivelse. Dette kan forårsakes hvis en ny utgave blir samlet av GitHub Handlinger. Prøv igjen om noen minutter.",
+ "DialogUpdaterConvertFailedGithubMessage": "Kan ikke konvertere mottatt Ryujinx-versjon fra Github Utgivelse.",
+ "DialogUpdaterDownloadingMessage": "Laster ned oppdatering...",
+ "DialogUpdaterExtractionMessage": "Pakker ut oppdatering...",
+ "DialogUpdaterRenamingMessage": "Endrer navn på oppdatering...",
+ "DialogUpdaterAddingFilesMessage": "Legger til ny oppdatering...",
+ "DialogUpdaterCompleteMessage": "Oppdateringen er fullført!",
+ "DialogUpdaterRestartMessage": "Vil du starte Ryujinx på nytt nå?",
+ "DialogUpdaterNoInternetMessage": "Du er ikke tilkoblet internett",
+ "DialogUpdaterNoInternetSubMessage": "Kontroller at du har en fungerende Internett-tilkobling!",
+ "DialogUpdaterDirtyBuildMessage": "Du kan ikke oppdatere en skitten versjon av Ryujinx!",
+ "DialogUpdaterDirtyBuildSubMessage": "Vennligst last ned Ryujinx på https://ryujinx.org/ hvis du ser etter en støttet versjon.",
+ "DialogRestartRequiredMessage": "Omstart Kreves",
+ "DialogThemeRestartMessage": "Temaet har blitt lagret. En omstart kreves for å bruke temaet.",
+ "DialogThemeRestartSubMessage": "Vil du starte på nytt",
+ "DialogFirmwareInstallEmbeddedMessage": "Ønsker du å installere fastvaren innebygd i dette spillet? (Firmware {0})",
+ "DialogFirmwareInstallEmbeddedSuccessMessage": "Det ble ikke funnet noen installert fastvare, men Ryujinx kunne installere fastvare {0} fra det oppgitte spillet.\nemulatoren vil nå starte.",
+ "DialogFirmwareNoFirmwareInstalledMessage": "Ingen fastvare installert",
+ "DialogFirmwareInstalledMessage": "fastvare {0} ble installert",
+ "DialogInstallFileTypesSuccessMessage": "Filtyper ble installert!",
+ "DialogInstallFileTypesErrorMessage": "Kunne ikke installere filtyper.",
+ "DialogUninstallFileTypesSuccessMessage": "Filtyper ble avinstallert!",
+ "DialogUninstallFileTypesErrorMessage": "Kunne ikke avinstallere filtyper.",
+ "DialogOpenSettingsWindowLabel": "Åpne innstillinger-vinduet",
+ "DialogControllerAppletTitle": "Kontroller Applet",
+ "DialogMessageDialogErrorExceptionMessage": "Feil ved visning av meldings-dialog: {0}",
+ "DialogSoftwareKeyboardErrorExceptionMessage": "Feil ved visning av programvaretastatur: {0}",
+ "DialogErrorAppletErrorExceptionMessage": "Feil ved visning av Feilmeldingsdialog: {0}",
+ "DialogUserErrorDialogMessage": "{0}: {1}",
+ "DialogUserErrorDialogInfoMessage": "\nFor mer informasjon om hvordan du fikser denne feilen, følg vår oppsettsveiledning.",
+ "DialogUserErrorDialogTitle": "Ryujinx Feilmelding ({0})",
+ "DialogAmiiboApiTitle": "Amiibo API",
+ "DialogAmiiboApiFailFetchMessage": "En feil oppstod under henting av informasjon fra API.",
+ "DialogAmiiboApiConnectErrorMessage": "Kan ikke koble til Amiibo API server. Tjenesten kan være nede, eller du må kanskje verifisere at din internettforbindelse er tilkoblet.",
+ "DialogProfileInvalidProfileErrorMessage": "Profil {0} er ikke kompatibel med den gjeldende inndata konfigurasjonen",
+ "DialogProfileDefaultProfileOverwriteErrorMessage": "Standard profil kan ikke overskrives",
+ "DialogProfileDeleteProfileTitle": "Sletter profil",
+ "DialogProfileDeleteProfileMessage": "Denne handlingen er irreversibel, er du sikker på at du vil fortsette?",
+ "DialogWarning": "Advarsel",
+ "DialogPPTCDeletionMessage": "Du er i ferd med å bygge en PPTC i køen ved neste oppstart av:\n\n{0}\n\nEr du sikker på at du vil fortsette?",
+ "DialogPPTCDeletionErrorMessage": "Feil under rensing av PPTC cache ved {0}: {1}",
+ "DialogShaderDeletionMessage": "Du er i ferd med å slette Shader cachen for :\n\n{0}\n\nEr du sikker på at du vil fortsette?",
+ "DialogShaderDeletionErrorMessage": "Feil under tømming av Shader cache ved {0}: {1}",
+ "DialogRyujinxErrorMessage": "Ryujinx har støtt på ett problem",
+ "DialogInvalidTitleIdErrorMessage": "UI-feil: Det valgte spillet har ikke en gyldig tittel-ID",
+ "DialogFirmwareInstallerFirmwareNotFoundErrorMessage": "En gyldig systemfastvare ble ikke funnet i {0}.",
+ "DialogFirmwareInstallerFirmwareInstallTitle": "Installer fastvare {0}",
+ "DialogFirmwareInstallerFirmwareInstallMessage": "Systemversjon {0} vil bli installert.",
+ "DialogFirmwareInstallerFirmwareInstallSubMessage": "\n\nDette erstatter den gjeldende systemversjonen {0}.",
+ "DialogFirmwareInstallerFirmwareInstallConfirmMessage": "Vil du fortsette?",
+ "DialogFirmwareInstallerFirmwareInstallWaitMessage": "Installerer fastvare...",
+ "DialogFirmwareInstallerFirmwareInstallSuccessMessage": "Systemversjon {0} ble installert.",
+ "DialogUserProfileDeletionWarningMessage": "Det vil ikke være noen profiler å åpnes hvis valgt profil blir slettet",
+ "DialogUserProfileDeletionConfirmMessage": "Vil du slette den valgte profilen",
+ "DialogUserProfileUnsavedChangesTitle": "Advarsel - Ulagrede endringer",
+ "DialogUserProfileUnsavedChangesMessage": "Du har gjort endringer i denne brukerprofilen som ikke er lagret.",
+ "DialogUserProfileUnsavedChangesSubMessage": "Vil du forkaste endringene dine?",
+ "DialogControllerSettingsModifiedConfirmMessage": "Innstillinger for gjeldende kontroller har blitt oppdatert.",
+ "DialogControllerSettingsModifiedConfirmSubMessage": "Vil du lagre?",
+ "DialogLoadFileErrorMessage": "{0}. Feilet fil: {1}",
+ "DialogModAlreadyExistsMessage": "Modifikasjon eksisterer allerede",
+ "DialogModInvalidMessage": "Den angitte mappen inneholder ikke en modifikasjon!",
+ "DialogModDeleteNoParentMessage": "Kunne ikke slette: Fant ikke overordnet mappe for mod \"{0}\"!",
+ "DialogDlcNoDlcErrorMessage": "Den angitte filen inneholder ikke en DLC for den valgte tittelen!",
+ "DialogPerformanceCheckLoggingEnabledMessage": "Du har sporing aktivert, noe som er designet til å bli brukt av utviklere.",
+ "DialogPerformanceCheckLoggingEnabledConfirmMessage": "For optimal ytelse er det anbefalt å deaktivere spor-logging. Ønsker du å deaktivere spor-logging nå?",
+ "DialogPerformanceCheckShaderDumpEnabledMessage": "Du har aktiv dumping av shader, som bare er laget for å brukes av utviklere.",
+ "DialogPerformanceCheckShaderDumpEnabledConfirmMessage": "For optimal ytelse er det anbefalt å deaktivere dumping. Ønsker du å deaktivere shader dumping nå?",
+ "DialogLoadAppGameAlreadyLoadedMessage": "Et spill er allerede lastet inn",
+ "DialogLoadAppGameAlreadyLoadedSubMessage": "Slutt å emulere eller lukk emulatoren før du starter et annet spill.",
+ "DialogUpdateAddUpdateErrorMessage": "Den angitte filen inneholder ikke en oppdatering for den valgte tittelen!",
+ "DialogSettingsBackendThreadingWarningTitle": "Advarsel - Backend Tråd",
+ "DialogSettingsBackendThreadingWarningMessage": "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.",
+ "DialogModManagerDeletionWarningMessage": "Du er i ferd med å slette modifikasjonen: {0}\n\ner du sikker på at du vil fortsette?",
+ "DialogModManagerDeletionAllWarningMessage": "Du er i ferd med å slette alle modifikasjonene for denne tittelen: {0}\n\ner du sikker på at du vil fortsette?",
+ "SettingsTabGraphicsFeaturesOptions": "Funksjoner",
+ "SettingsTabGraphicsBackendMultithreading": "Grafikk Backend Fleroppgavekjøring",
+ "CommonAuto": "Automatisk",
+ "CommonOff": "Av",
+ "CommonOn": "På",
+ "InputDialogYes": "Ja",
+ "InputDialogNo": "Nei",
+ "DialogProfileInvalidProfileNameErrorMessage": "Filnavnet inneholder ugyldige tegn. Prøv på nytt.",
+ "MenuBarOptionsPauseEmulation": "Stans midlertidig",
+ "MenuBarOptionsResumeEmulation": "Gjenoppta",
+ "AboutUrlTooltipMessage": "Klikk for å åpne Ryujinx nettsiden i din standardnettleser.",
+ "AboutDisclaimerMessage": "Ryujinx er ikke knyttet til NintendoTM,\neller noen av samarbeidspartnerne sine, på noen som helst måte.",
+ "AboutAmiiboDisclaimerMessage": "AmiiboAPI (www.amiiboapi.com) brukes sammen med\ni vår Amiibo-emulsjon.",
+ "AboutPatreonUrlTooltipMessage": "Klikk for å åpne Ryujinx Patreon-siden i din standardnettleser.",
+ "AboutGithubUrlTooltipMessage": "Klikk for å åpne Ryujinx GitHub siden i din standardnettleser.",
+ "AboutDiscordUrlTooltipMessage": "Klikk for å åpne en invitasjon til Ryujinx Discord-serveren i nettleseren din.",
+ "AboutTwitterUrlTooltipMessage": "Klikk for å åpne Ryujinx Twitter-siden i din standardnettleser.",
+ "AboutRyujinxAboutTitle": "Om:",
+ "AboutRyujinxAboutContent": "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.",
+ "AboutRyujinxMaintainersTitle": "Vedlikeholdt av:",
+ "AboutRyujinxMaintainersContentTooltipMessage": "Klikk for å åpne Bidragsyter-siden i standardleseren din.",
+ "AboutRyujinxSupprtersTitle": "Støttet på Patreon av:",
+ "AmiiboSeriesLabel": "Amibo Serie",
+ "AmiiboCharacterLabel": "Karakter",
+ "AmiiboScanButtonLabel": "Skanne det",
+ "AmiiboOptionsShowAllLabel": "Vis alle Amiibo",
+ "AmiiboOptionsUsRandomTagLabel": "Hack: Bruk tilfeldig tag-Uuid",
+ "DlcManagerTableHeadingEnabledLabel": "Aktivert",
+ "DlcManagerTableHeadingTitleIdLabel": "Tittel ID",
+ "DlcManagerTableHeadingContainerPathLabel": "Beholder bane",
+ "DlcManagerTableHeadingFullPathLabel": "Fullstendig bane",
+ "DlcManagerRemoveAllButton": "Fjern alle",
+ "DlcManagerEnableAllButton": "Aktiver alle",
+ "DlcManagerDisableAllButton": "Deaktiver alle",
+ "ModManagerDeleteAllButton": "Slett alt",
+ "MenuBarOptionsChangeLanguage": "Endre språk",
+ "MenuBarShowFileTypes": "Vis Filtyper",
+ "CommonSort": "Sorter",
+ "CommonShowNames": "Vis navn",
+ "CommonFavorite": "Favoritt",
+ "OrderAscending": "Stigende",
+ "OrderDescending": "Synkende",
+ "SettingsTabGraphicsFeatures": "Funksjoner & forbedringer",
+ "ErrorWindowTitle": "Feilvindu",
+ "ToggleDiscordTooltip": "Velg om Ryujinx skal vises på din \"spillende\" Discord aktivitet eller ikke",
+ "AddGameDirBoxTooltip": "Angi en spillmappe for å legge til i listen",
+ "AddGameDirTooltip": "Legg til en spillmappe i listen",
+ "RemoveGameDirTooltip": "Fjern valgt spillmappe",
+ "CustomThemeCheckTooltip": "Bruk et egendefinert Avalonia tema for GUI for å endre utseende til emulatormenyene",
+ "CustomThemePathTooltip": "Bane til egendefinert GUI-tema",
+ "CustomThemeBrowseTooltip": "Søk etter et egendefinert GUI-tema",
+ "DockModeToggleTooltip": "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.",
+ "DirectKeyboardTooltip": "Direkte tastaturtilgang (HID) støtte. Gir deg spill-tilgang til tastaturet som en tekstinnlegg-enhet.\n\nfungerer kun med spill som lokalt støtter tastaturbruk på Ninteno SwitchTM maskinvare.\n\nLa være AV hvis du er usikker.",
+ "DirectMouseTooltip": "Direkte musepeker (HID) støtte. Gir deg spill-tilgang til musepeker.\n\nfungerer kun med spill som lokalt støtter musepekere på Ninteno SwitchTM maskinvare.\n\nNår aktivert, kan det hende touch funksjoner ikke fungerer\n\nLa være AV hvis du er usikker.",
+ "RegionTooltip": "Endre systemregion",
+ "LanguageTooltip": "Endre systemspråk",
+ "TimezoneTooltip": "Endre systemtidssone",
+ "TimeTooltip": "Endre systemtid",
+ "VSyncToggleTooltip": "Emuler konsollens loddrett synkronisering. på ett vis en bildefrekvens begrensning for de fleste spill; deaktivering kan få spill til å kjøre med høyere hastighet, eller til å laste skjermene tar lengre tid eller sitter fast.\n\nkan byttes inn i spillet med en hurtigtast for preferansen (F1 som standard). Vi anbefaler å gjøre dette hvis du planlegger å deaktivere dette.\n\nLa være PÅ hvis du er usikker.",
+ "PptcToggleTooltip": "Lagrer oversatte JIT funksjoner så de ikke trenger og bli oversatt hver gang spillet laster.\n\nKan redusere hakkete spilling og gjør at spillet starter opp raskere ved første oppstart.\n\nLa være PÅ om usikker.",
+ "FsIntegrityToggleTooltip": "Sjekker for korrupte filer ved oppstart av et spill, og dersom korrupte filer oppdages, viser en hashfeil i loggen.\n\nhar ingen innvirkning på ytelsen og er ment å hjelpe med feilsøking.\n\nLa være PÅ hvis usikker.",
+ "AudioBackendTooltip": "Endrer backend brukt til å gjengi lyd.\n\nSDL2 er foretrukket, mens OpenAL og SoundIO brukes som reserveløsning. Dummy kommer ikke til å ha lyd.\n\nSett til SDL2 hvis usikker.",
+ "MemoryManagerTooltip": "Endre hvordan gjesteminne tilordnes og åpnes. Påvirker emulator CPU-ytelsen veldig mye.\n\nSett til HOST UNCHECKED hvis usikker.",
+ "MemoryManagerSoftwareTooltip": "Bruk en programvareside tabell for adresseoversettelse. Høyeste nøyaktighet, men tregeste ytelse.",
+ "MemoryManagerHostTooltip": "Direkte kartminne i vertens adresseområde. Mye raskere JIT kompilering og utførelse.",
+ "MemoryManagerUnsafeTooltip": "Direkte kartminne, men ikke masker adressen i gjesteadressen før du har tilgang. raskere, men på bekostning av sikkerhet. gjeste-programmet kan få tilgang til minne fra hvor som helst i Ryujinx, så bare kjøre programmer du stoler på med denne modusen.",
+ "UseHypervisorTooltip": "Bruk Hypervisor i stedet for JIT. Det øker ytelsen mye hvis det er tilgjengelig, men det kan være ustabilt i den nåværende tilstanden.",
+ "DRamTooltip": "Bruker en alternativ minnemodus med 8GiB i DRAM for og etterligne Switch utvikler modeller.\n\nDette er bare nyttig for teksturpakker eller 4k oppløsningsmoduler. Forbedrer IKKE ytelsen.\n\nLa AV hvis usikker.",
+ "IgnoreMissingServicesTooltip": "Ignorerer ikke implementerte Horisont OS-tjenester. Dette kan hjelpe med å omgå krasj ved oppstart av enkelte spill.\n\nLa AV hvis du er usikker.",
+ "GraphicsBackendThreadingTooltip": "Utfører grafikkbackend kommandoer på en annen tråd.\n\nØker hastigheten for shaderkomprimering, reduserer hakking og forbedrer ytelsen til GPU-drivere uten å spre støtten fra sine egne. Litt bedre ytelse på drivere med flertråd.\n\nSett for å AUTO hvis usikker.",
+ "GalThreadingTooltip": "Utfører grafikkbackend kommandoer på en annen tråd.\n\nØker hastigheten for shaderkomprimering, reduserer hakking og forbedrer ytelsen til GPU-drivere uten flertråd støtte. Litt bedre ytelse på drivere med flertråd.\n\nSett for å AUTO hvis usikker.",
+ "ShaderCacheToggleTooltip": "Lagrer en disk shader cache som reduserer hakking jo flere ganger du spiller.\n\nLa være PÅ om usikker.",
+ "ResolutionScaleTooltip": "Dobler spillets gjengivelse.\n\nNoen få spill fungerer kanskje ikke med dette aktivert og kan se veldig pikselert ut selv når gjengivelsen er økt; for de spillene, så kan det hende du må bruke modifikasjoner som fjerner anti-aliasing eller som øker den interne gjengivelsen. For og bruke sistnenvte, så vil du helst bruke \"Native\".\n\nHa til tanke at 4x er unødig for virituelt alle maskiner.",
+ "ResolutionScaleEntryTooltip": "Det er mer sannsynlig at flytende punktoppløsning skalaer som 1.5. Ikke-integrerte skalaer forårsaker problemer eller krasj.",
+ "AnisotropyTooltip": "Nivå av Anisotropisk filtrering. Sett til Auto for å bruke verdien som kreves av spillet.",
+ "AspectRatioTooltip": "Sideforhold angitt til gjengitt vindu.\n\nBare bytt dette om du bruker en modifikasjon som forandrer Sideforholdet på spillet ditt, ellers vil grafikken bli strukket.\n\nLa være på 16:9 om usikker.",
+ "ShaderDumpPathTooltip": "Grafikk Shader Dump bane",
+ "FileLogTooltip": "Lagrer konsoll-logging til en loggfil på harddisken. Påvirker ikke ytelsen.",
+ "StubLogTooltip": "Skriver ut log meldinger i konsollen. Påvirker ikke ytelsen.",
+ "InfoLogTooltip": "Skriver ut info loggmeldinger i konsollen. Påvirker ikke ytelse.",
+ "WarnLogTooltip": "Skriver ut varselloggmeldinger i konsollen. påvirker ikke ytelsen.",
+ "ErrorLogTooltip": "Skriver ut feilloggmeldinger i konsollen. Påvirker ikke ytelse.",
+ "TraceLogTooltip": "Skriver ut sporbare loggmeldinger i konsollen. påvirker ikke ytelsen.",
+ "GuestLogTooltip": "Skriver ut gjesteloggmeldinger i konsollen. påvirker ikke ytelsen.",
+ "FileAccessLogTooltip": "Skriver ut filtilgang til loggmeldinger i konsollen.",
+ "FSAccessLogModeTooltip": "Aktiverer FS tilgang loggutgang til konsollen. Mulige moduser er 0-3",
+ "DeveloperOptionTooltip": "Bruk med forsiktighet",
+ "OpenGlLogLevel": "Krever riktige loggnivåer aktivert",
+ "DebugLogTooltip": "Skriver ut loggmeldinger i konsollen.\n\nBruk bare dette hvis et medlem har gitt spesifikke instruksjoner, siden det vil gjøre loggene vanskelig å lese og forverre emulatorytelse.",
+ "LoadApplicationFileTooltip": "Åpne filutforsker for å velge en Switch kompatibel fil å laste",
+ "LoadApplicationFolderTooltip": "Åpne en filutforsker for å velge en Switch kompatibel, upakket applikasjon for å laste",
+ "OpenRyujinxFolderTooltip": "Åpne Ryujinx filsystem-mappen",
+ "OpenRyujinxLogsTooltip": "Åpner mappen hvor logger er lagret",
+ "ExitTooltip": "Avslutt Ryujinx",
+ "OpenSettingsTooltip": "Åpne innstillinger-vinduet",
+ "OpenProfileManagerTooltip": "Åpne vindu for brukerprofiler",
+ "StopEmulationTooltip": "Stopp emuleringen av dette spillet og gå tilbake til spill valg",
+ "CheckUpdatesTooltip": "Se etter oppdateringer til Ryujinx",
+ "OpenAboutTooltip": "Åpne Om Vindu",
+ "GridSize": "Rutenett størrelse",
+ "GridSizeTooltip": "Endre størrelsen på rutenettet elementer",
+ "SettingsTabSystemSystemLanguageBrazilianPortuguese": "Brasiliansk portugisisk",
+ "AboutRyujinxContributorsButtonHeader": "Se alle bidragsytere",
+ "SettingsTabSystemAudioVolume": "Lydnivå: ",
+ "AudioVolumeTooltip": "Endre lydenivå",
+ "SettingsTabSystemEnableInternetAccess": "Internett-tilgang for gjeste/LAN-modus",
+ "EnableInternetAccessTooltip": "Tillater emulert applikasjon å koble til Internett.\n\nSpill med en LAN-modus kan koble til hverandre når dette er aktivert og systemene er koblet til det samme tilgangspunktet. Dette inkluderer ekte konsoller også.\n\ntillater IKKE tilkobling til Nintendo servere. Kan forårsake krasjing i enkelte spill som prøver å koble til Internett.\n\nLa stå AV hvis du er usikker.",
+ "GameListContextMenuManageCheatToolTip": "Administrer juksemoduser",
+ "GameListContextMenuManageCheat": "Administrer juksemoduser",
+ "GameListContextMenuManageModToolTip": "Administrer modifikasjoner",
+ "GameListContextMenuManageMod": "Administrer modifikasjoner",
+ "ControllerSettingsStickRange": "Omfang:",
+ "DialogStopEmulationTitle": "Ryujinx - Stopp emulasjon",
+ "DialogStopEmulationMessage": "Er du sikker på at du vil stoppe emulasjonen?",
+ "SettingsTabCpu": "Prosessor",
+ "SettingsTabAudio": "Lyd",
+ "SettingsTabNetwork": "Nettverk",
+ "SettingsTabNetworkConnection": "Nettverk tilkobling",
+ "SettingsTabCpuCache": "CPU-buffer",
+ "SettingsTabCpuMemory": "Prosessor modus",
+ "DialogUpdaterFlatpakNotSupportedMessage": "Vennligst oppdater Ryujinx via FlatHub.",
+ "UpdaterDisabledWarningTitle": "Oppdatering Deaktivert!",
+ "ControllerSettingsRotate90": "Roter 90° med klokken",
+ "IconSize": "Ikon størrelse",
+ "IconSizeTooltip": "Endre størrelsen på spillikonene",
+ "MenuBarOptionsShowConsole": "Vis konsoll",
+ "ShaderCachePurgeError": "Feil under tømming av shader cache ved {0}: {1}",
+ "UserErrorNoKeys": "Finner ikke nøkler",
+ "UserErrorNoFirmware": "Fastvare ikke funnet",
+ "UserErrorFirmwareParsingFailed": "Fastvare analysefeil",
+ "UserErrorApplicationNotFound": "Applikasjon ikke funnet",
+ "UserErrorUnknown": "Ukjent feil",
+ "UserErrorUndefined": "Udefinert feil",
+ "UserErrorNoKeysDescription": "Ryujinx kunne ikke finne 'prod.keys' filen din",
+ "UserErrorNoFirmwareDescription": "Ryujinx kunne ikke finne noen fastvare installert",
+ "UserErrorFirmwareParsingFailedDescription": "Ryujinx klarte ikke å analysere levert fastvare. Dette er vanligvis forårsaket av utdaterte nøkler.",
+ "UserErrorApplicationNotFoundDescription": "Ryujinx kunne ikke finne en gyldig applikasjon på den gitte banen.",
+ "UserErrorUnknownDescription": "En ukjent feil oppstod!",
+ "UserErrorUndefinedDescription": "En udefinert feil oppstod! Dette burde ikke skje, vennligst kontakt en utvikler!",
+ "OpenSetupGuideMessage": "Åpne oppsettsveiledningen",
+ "NoUpdate": "Ingen oppdatering",
+ "TitleUpdateVersionLabel": "Versjon {0}",
+ "TitleBundledUpdateVersionLabel": "Pakket: Versjon {0}",
+ "TitleBundledDlcLabel": "Pakket:",
+ "RyujinxInfo": "Ryujinx - Informasjon",
+ "RyujinxConfirm": "Ryujinx - Bekreftelse",
+ "FileDialogAllTypes": "Alle typer",
+ "Never": "Aldri",
+ "SwkbdMinCharacters": "Må være minimum {0} tegn lang",
+ "SwkbdMinRangeCharacters": "Må være {0}-{1} tegn",
+ "SoftwareKeyboard": "Programvare Tastatur",
+ "SoftwareKeyboardModeNumeric": "Må kun være 0-9 eller '.'",
+ "SoftwareKeyboardModeAlphabet": "Må kun være uten CJK-tegn",
+ "SoftwareKeyboardModeASCII": "Må være kun ASCII-tekst",
+ "ControllerAppletControllers": "Støttede kontrollere:",
+ "ControllerAppletPlayers": "Spillere:",
+ "ControllerAppletDescription": "Din nåværende konfigurasjon er ugyldig. Åpne innstillinger og konfigurer inndata.",
+ "ControllerAppletDocked": "Docked modus. Håndholdt kontroll skal være deaktivert.",
+ "UpdaterRenaming": "Omdøper gamle filer...",
+ "UpdaterRenameFailed": "Oppdateringen kunne ikke gi filen nytt navn: {0}",
+ "UpdaterAddingFiles": "Legger til nye filer...",
+ "UpdaterExtracting": "Pakker ut oppdatering...",
+ "UpdaterDownloading": "Laster ned oppdatering...",
+ "Game": "Spill",
+ "Docked": "Forankret",
+ "Handheld": "Håndholdt",
+ "ConnectionError": "Tilkoblingsfeil",
+ "AboutPageDeveloperListMore": "{0} og mer...",
+ "ApiError": "API feil.",
+ "LoadingHeading": "Laster {0}",
+ "CompilingPPTC": "Sammensetter PTC",
+ "CompilingShaders": "Samler Shaders",
+ "AllKeyboards": "Alle tastaturer",
+ "OpenFileDialogTitle": "Velg en støttet fil for å åpne",
+ "OpenFolderDialogTitle": "Velg en mappe med et pakket ut spill",
+ "AllSupportedFormats": "Alle støttede formater",
+ "RyujinxUpdater": "Ryujinx Oppgradering",
+ "SettingsTabHotkeys": "Hurtigtaster for tastatur",
+ "SettingsTabHotkeysHotkeys": "Hurtigtaster for tastatur",
+ "SettingsTabHotkeysToggleVsyncHotkey": "Aktiver/deaktiver VSync:",
+ "SettingsTabHotkeysScreenshotHotkey": "Skjermbilde",
+ "SettingsTabHotkeysShowUiHotkey": "Vis UI:",
+ "SettingsTabHotkeysPauseHotkey": "Stans midlertidig:",
+ "SettingsTabHotkeysToggleMuteHotkey": "Demp:",
+ "ControllerMotionTitle": "Innstillinger for bevegelses kontroll",
+ "ControllerRumbleTitle": "Innstillinger for Vibrasjon",
+ "SettingsSelectThemeFileDialogTitle": "Velg tema fil",
+ "SettingsXamlThemeFile": "Xaml tema-fil",
+ "AvatarWindowTitle": "Administrer kontoer - Profilbilde",
+ "Amiibo": "Amiibo",
+ "Unknown": "Ukjent",
+ "Usage": "Forbruk",
+ "Writable": "Skrivbart",
+ "SelectDlcDialogTitle": "Velg DLC-filer",
+ "SelectUpdateDialogTitle": "Velg oppdateringsfiler",
+ "SelectModDialogTitle": "Velg modifikasjons mappe",
+ "UserProfileWindowTitle": "Bruker Profiler Behandler",
+ "CheatWindowTitle": "Juksing behandler",
+ "DlcWindowTitle": "Behandle nedlastbart innhold for {0} ({1})",
+ "ModWindowTitle": "Administrere Modifikasjoner for {0} ({1})",
+ "UpdateWindowTitle": "Tittel oppdatering behandler",
+ "CheatWindowHeading": "Juks tilgjengelig for {0} [{1}]",
+ "BuildId": "VersjonsId:",
+ "DlcWindowHeading": "{0} Nedlastbare innhold(er)",
+ "ModWindowHeading": "{0} Modifikasjoner(s)",
+ "UserProfilesEditProfile": "Rediger Valgte",
+ "Cancel": "Avbryt",
+ "Save": "Lagre",
+ "Discard": "Forkast",
+ "Paused": "Satt på pause",
+ "UserProfilesSetProfileImage": "Angi profilbilde",
+ "UserProfileEmptyNameError": "Navn er påkrevd",
+ "UserProfileNoImageError": "Profilbilde må være angitt",
+ "GameUpdateWindowHeading": "Administrer oppdateringer for {0} ({1})",
+ "SettingsTabHotkeysResScaleUpHotkey": "Øke oppløsning:",
+ "SettingsTabHotkeysResScaleDownHotkey": "Reduser oppløsning:",
+ "UserProfilesName": "Navn:",
+ "UserProfilesUserId": "Bruker ID:",
+ "SettingsTabGraphicsBackend": "Grafikk Backend",
+ "SettingsTabGraphicsBackendTooltip": "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.",
+ "SettingsEnableTextureRecompression": "Aktiver teksturkomprimering",
+ "SettingsEnableTextureRecompressionTooltip": "Kompresser ASTC-teksturer for å redusere VRAM-bruk.\n\nSpill som bruker dette teksturformatet, inkluderer Astral Chain, Bayonetta 3, Fire Emblem Engage, Metroid Prime Remastered, Super Mario Bros. Wonder and The Legend of Zelda: Tears of the Kingdom.\n\nGrafikkkort med 4GiB VRAM eller mindre, vil sannsynligvis krasje på et tidspunkt når spillene kjører.\n\nAktiver bare hvis du går tom for VRAM på nevnte spill. La AV om du er usikker.",
+ "SettingsTabGraphicsPreferredGpu": "Foretrukket GPU",
+ "SettingsTabGraphicsPreferredGpuTooltip": "Velg grafikkkortet som skal brukes sammen med Vulkan grafikkbackenden\n\nPåvirker ikke GPU-er som OpenGL skal bruke.\n\nSett til GPU-merket som \"dGPU\" hvis usikker. Hvis det ikke det er en, la være uberørt.",
+ "SettingsAppRequiredRestartMessage": "Ryujinx Omstart nødvendig",
+ "SettingsGpuBackendRestartMessage": "Grafikk Backend eller GPU-innstillinger er endret. Dette krever en omstart for å aktiveres",
+ "SettingsGpuBackendRestartSubMessage": "Vil du starte på nytt nå?",
+ "RyujinxUpdaterMessage": "Ønsker du å oppdatere Ryujinx til den nyeste versjonen?",
+ "SettingsTabHotkeysVolumeUpHotkey": "Øk Volum:",
+ "SettingsTabHotkeysVolumeDownHotkey": "Reduser Volum:",
+ "SettingsEnableMacroHLE": "Aktiver Makro HLE",
+ "SettingsEnableMacroHLETooltip": "High-level emulering av GPU makrokode.\n\nForbedrer ytelse, men kan forårsake grafiske glitches i noen spill.\n\nForlat PÅ hvis usikker.",
+ "SettingsEnableColorSpacePassthrough": "Fargeromsgjennomgang",
+ "SettingsEnableColorSpacePassthroughTooltip": "Dirigerer Vulkan backenden til å gå gjennom farge informasjonen uten og spesifisere en fargeromsgjennomgang. For brukere med en bred spillvisning kan dette resultere i mer vibrerende farger og få riktig farge.",
+ "VolumeShort": "Vol",
+ "UserProfilesManageSaves": "Administrer lagring",
+ "DeleteUserSave": "Vil du slette bruker data for dette spillet?",
+ "IrreversibleActionNote": "Denne handlingen er ikke reverserbar.",
+ "SaveManagerHeading": "Administrer lagring for {0} ({1})",
+ "SaveManagerTitle": "Lagre behandler",
+ "Name": "Navn",
+ "Size": "Størrelse",
+ "Search": "Søk",
+ "UserProfilesRecoverLostAccounts": "Gjenopprett tapte kontoer",
+ "Recover": "Gjenopprett",
+ "UserProfilesRecoverHeading": "Lagring ble funnet for følgende kontoer",
+ "UserProfilesRecoverEmptyList": "Ingen profiler å gjenopprette",
+ "GraphicsAATooltip": "Aktiverer anti-aliasing til spill render.\n\nFXAA vil gjøre det meste av bildet, mens SMAA vil forsøke å finne berørte kanter og glatte dem ut.\n\nAnbefales ikke til bruk i forbindelse med FSR-skaleringsfilteret.\n\nDette valget kan endres mens et spill kjører ved å klikke \"Apply\" nedenfor; du kan bare flytte innstillingsvinduet til du finner det foretrukne utseendet til et spill.\n\nForlat på NONE hvis usikker.",
+ "GraphicsAALabel": "Kantutjevning:",
+ "GraphicsScalingFilterLabel": "Skaleringsfilter:",
+ "GraphicsScalingFilterTooltip": "Velg det skaleringsfilteret som skal brukes når du bruker oppløsningsskalaen.\n\nBilinear fungerer godt for 3D-spill og er et trygt standardalternativ.\n\nNærmeste anbefales for pixel kunst-spill.\n\nFSR 1.0 er bare et skarpere filter, ikke anbefalt for bruk med FXAA eller SMAA.\n\nOmrådeskalering anbefales når nedskalering er større enn utgangsvinduet. Den kan brukes til å oppnå en superprøvetaket anti-aliasingseffekt når en nedskalerer med mer enn 2x.\n\nDette valget kan endres mens et spill kjører ved å klikke \"Apply\" nedenfor; du kan bare flytte innstillingsvinduet til du finner det foretrukne utseendet til et spill.\n\nLa være på BILINEAR hvis usikker.",
+ "GraphicsScalingFilterBilinear": "Bilinear",
+ "GraphicsScalingFilterNearest": "Nærmeste",
+ "GraphicsScalingFilterFsr": "FSR",
+ "GraphicsScalingFilterArea": "Område",
+ "GraphicsScalingFilterLevelLabel": "Nivå",
+ "GraphicsScalingFilterLevelTooltip": "Definer FSR 1,0 skarpere nivå. Høyere er skarpere.",
+ "SmaaLow": "SMAA lav",
+ "SmaaMedium": "SMAA Middels",
+ "SmaaHigh": "SMAA høy",
+ "SmaaUltra": "SMAA Ultra",
+ "UserEditorTitle": "Rediger bruker",
+ "UserEditorTitleCreate": "Opprett bruker",
+ "SettingsTabNetworkInterface": "Nettverksgrensesnitt",
+ "NetworkInterfaceTooltip": "Nettverksgrensesnittets grensesnitt brukt for LAN/LDN funksjoner.\n\ni konjuksjon med en VPN eller XLink Kai og ett spill med LAN støtte, kan bli brukt til og spoofe ett \"samme-nettverk\" tilkobling over nettet.\n\nLa være på DEFAULT om usikker.",
+ "NetworkInterfaceDefault": "Standard",
+ "PackagingShaders": "Pakker Shaders",
+ "AboutChangelogButton": "Vis endringslogg på GitHub",
+ "AboutChangelogButtonTooltipMessage": "Klikk for å åpne endringsloggen for denne versjonen i din nettleser.",
+ "SettingsTabNetworkMultiplayer": "Flerspiller",
+ "MultiplayerMode": "Modus:",
+ "MultiplayerModeTooltip": "Endre LDN flerspillermodus.\n\nLdnMitm vil endre lokal trådløst/lokal spillfunksjonalitet i spill som skal fungere som om den var LAN, noe som tillater lokal, samme nettverk forbindelser med andre Ryujinx instanser og hacket Nintendo Switch konsoller som har installert ldn_mitm-modulen.\n\nFlerspiller krever at alle spillerne er på samme versjon (dvs. Super Smash Bros. Ultimat v13.0.1 kan ikke koble til v13.0.0).\n\nForlat DEAKTIVERT hvis usikker.",
+ "MultiplayerModeDisabled": "Deaktivert",
+ "MultiplayerModeLdnMitm": "ldn_mitm"
+}
diff --git a/src/Ryujinx/Assets/Locales/pl_PL.json b/src/Ryujinx/Assets/Locales/pl_PL.json
index 48e6c74cd..8e5f3194f 100644
--- a/src/Ryujinx/Assets/Locales/pl_PL.json
+++ b/src/Ryujinx/Assets/Locales/pl_PL.json
@@ -45,6 +45,12 @@
"MenuBarViewWindow1080": "1080p",
"MenuBarHelp": "_Pomoc",
"MenuBarHelpCheckForUpdates": "Sprawdź aktualizacje",
+ "MenuBarHelpFaq": "FAQ & Troubleshooting Page",
+ "MenuBarHelpFaqTooltip": "Opens the FAQ and Troubleshooting page on the official Ryujinx wiki",
+ "MenuBarHelpSetup": "Setup & Configuration Guide",
+ "MenuBarHelpSetupTooltip": "Opens the Setup & Configuration guide on the official Ryujinx wiki",
+ "MenuBarHelpMultiplayer": "Multiplayer (LDN/LAN) Guide",
+ "MenuBarHelpMultiplayerTooltip": "Opens the Multiplayer guide on the official Ryujinx wiki",
"MenuBarHelpAbout": "O programie",
"MenuSearch": "Wyszukaj...",
"GameListHeaderFavorite": "Ulubione",
diff --git a/src/Ryujinx/Assets/Locales/pt_BR.json b/src/Ryujinx/Assets/Locales/pt_BR.json
index c8b89de42..8ce208e6f 100644
--- a/src/Ryujinx/Assets/Locales/pt_BR.json
+++ b/src/Ryujinx/Assets/Locales/pt_BR.json
@@ -45,6 +45,12 @@
"MenuBarViewWindow1080": "1080p",
"MenuBarHelp": "_Ajuda",
"MenuBarHelpCheckForUpdates": "_Verificar se há atualizações",
+ "MenuBarHelpFaq": "FAQ & Troubleshooting Page",
+ "MenuBarHelpFaqTooltip": "Opens the FAQ and Troubleshooting page on the official Ryujinx wiki",
+ "MenuBarHelpSetup": "Setup & Configuration Guide",
+ "MenuBarHelpSetupTooltip": "Opens the Setup & Configuration guide on the official Ryujinx wiki",
+ "MenuBarHelpMultiplayer": "Multiplayer (LDN/LAN) Guide",
+ "MenuBarHelpMultiplayerTooltip": "Opens the Multiplayer guide on the official Ryujinx wiki",
"MenuBarHelpAbout": "_Sobre",
"MenuSearch": "Buscar...",
"GameListHeaderFavorite": "Favorito",
diff --git a/src/Ryujinx/Assets/Locales/ru_RU.json b/src/Ryujinx/Assets/Locales/ru_RU.json
index c5a3ddb3a..f4ce7c891 100644
--- a/src/Ryujinx/Assets/Locales/ru_RU.json
+++ b/src/Ryujinx/Assets/Locales/ru_RU.json
@@ -45,6 +45,12 @@
"MenuBarViewWindow1080": "1080p",
"MenuBarHelp": "_Помощь",
"MenuBarHelpCheckForUpdates": "Проверить наличие обновлений",
+ "MenuBarHelpFaq": "FAQ & Troubleshooting Page",
+ "MenuBarHelpFaqTooltip": "Opens the FAQ and Troubleshooting page on the official Ryujinx wiki",
+ "MenuBarHelpSetup": "Setup & Configuration Guide",
+ "MenuBarHelpSetupTooltip": "Opens the Setup & Configuration guide on the official Ryujinx wiki",
+ "MenuBarHelpMultiplayer": "Multiplayer (LDN/LAN) Guide",
+ "MenuBarHelpMultiplayerTooltip": "Opens the Multiplayer guide on the official Ryujinx wiki",
"MenuBarHelpAbout": "О программе",
"MenuSearch": "Поиск...",
"GameListHeaderFavorite": "Избранное",
diff --git a/src/Ryujinx/Assets/Locales/th_TH.json b/src/Ryujinx/Assets/Locales/th_TH.json
index 5aaee7623..d8f62ea01 100644
--- a/src/Ryujinx/Assets/Locales/th_TH.json
+++ b/src/Ryujinx/Assets/Locales/th_TH.json
@@ -45,6 +45,12 @@
"MenuBarViewWindow1080": "1080p",
"MenuBarHelp": "_ช่วยเหลือ",
"MenuBarHelpCheckForUpdates": "ตรวจสอบอัปเดต",
+ "MenuBarHelpFaq": "FAQ & Troubleshooting Page",
+ "MenuBarHelpFaqTooltip": "Opens the FAQ and Troubleshooting page on the official Ryujinx wiki",
+ "MenuBarHelpSetup": "Setup & Configuration Guide",
+ "MenuBarHelpSetupTooltip": "Opens the Setup & Configuration guide on the official Ryujinx wiki",
+ "MenuBarHelpMultiplayer": "Multiplayer (LDN/LAN) Guide",
+ "MenuBarHelpMultiplayerTooltip": "Opens the Multiplayer guide on the official Ryujinx wiki",
"MenuBarHelpAbout": "เกี่ยวกับ",
"MenuSearch": "กำลังค้นหา...",
"GameListHeaderFavorite": "ชื่นชอบ",
diff --git a/src/Ryujinx/Assets/Locales/tr_TR.json b/src/Ryujinx/Assets/Locales/tr_TR.json
index 08b291d71..c0a8447e2 100644
--- a/src/Ryujinx/Assets/Locales/tr_TR.json
+++ b/src/Ryujinx/Assets/Locales/tr_TR.json
@@ -45,6 +45,12 @@
"MenuBarViewWindow1080": "1080p",
"MenuBarHelp": "_Yardım",
"MenuBarHelpCheckForUpdates": "Güncellemeleri Denetle",
+ "MenuBarHelpFaq": "FAQ & Troubleshooting Page",
+ "MenuBarHelpFaqTooltip": "Opens the FAQ and Troubleshooting page on the official Ryujinx wiki",
+ "MenuBarHelpSetup": "Setup & Configuration Guide",
+ "MenuBarHelpSetupTooltip": "Opens the Setup & Configuration guide on the official Ryujinx wiki",
+ "MenuBarHelpMultiplayer": "Multiplayer (LDN/LAN) Guide",
+ "MenuBarHelpMultiplayerTooltip": "Opens the Multiplayer guide on the official Ryujinx wiki",
"MenuBarHelpAbout": "Hakkında",
"MenuSearch": "Ara...",
"GameListHeaderFavorite": "Favori",
diff --git a/src/Ryujinx/Assets/Locales/uk_UA.json b/src/Ryujinx/Assets/Locales/uk_UA.json
index 14b954a35..eb70d7877 100644
--- a/src/Ryujinx/Assets/Locales/uk_UA.json
+++ b/src/Ryujinx/Assets/Locales/uk_UA.json
@@ -1,7 +1,7 @@
{
"Language": "Українська",
"MenuBarFileOpenApplet": "Відкрити аплет",
- "MenuBarFileOpenAppletOpenMiiApplet": "Mii Edit Applet",
+ "MenuBarFileOpenAppletOpenMiiApplet": "Аплет для редагування Mii",
"MenuBarFileOpenAppletOpenMiiAppletToolTip": "Відкрити аплет Mii Editor в автономному режимі",
"SettingsTabInputDirectMouseAccess": "Прямий доступ мишею",
"SettingsTabSystemMemoryManagerMode": "Режим диспетчера пам’яті:",
@@ -11,10 +11,10 @@
"SettingsTabSystemUseHypervisor": "Використовувати гіпервізор",
"MenuBarFile": "_Файл",
"MenuBarFileOpenFromFile": "_Завантажити програму з файлу",
- "MenuBarFileOpenFromFileError": "No applications found in selected file.",
+ "MenuBarFileOpenFromFileError": "У вибраному файлі не знайдено жодних додатків.",
"MenuBarFileOpenUnpacked": "Завантажити _розпаковану гру",
- "MenuBarFileLoadDlcFromFolder": "Load DLC From Folder",
- "MenuBarFileLoadTitleUpdatesFromFolder": "Load Title Updates From Folder",
+ "MenuBarFileLoadDlcFromFolder": "Завантажити DLC з теки",
+ "MenuBarFileLoadTitleUpdatesFromFolder": "Завантажити оновлення заголовків з теки",
"MenuBarFileOpenEmuFolder": "Відкрити теку Ryujinx",
"MenuBarFileOpenLogsFolder": "Відкрити теку журналів змін",
"MenuBarFileExit": "_Вихід",
@@ -38,13 +38,19 @@
"MenuBarToolsManageFileTypes": "Керувати типами файлів",
"MenuBarToolsInstallFileTypes": "Установити типи файлів",
"MenuBarToolsUninstallFileTypes": "Видалити типи файлів",
- "MenuBarToolsXCITrimmer": "Trim XCI Files",
- "MenuBarView": "_View",
- "MenuBarViewWindow": "Window Size",
+ "MenuBarToolsXCITrimmer": "Обрізати XCI файли",
+ "MenuBarView": "_Вид",
+ "MenuBarViewWindow": "Розмір вікна",
"MenuBarViewWindow720": "720p",
"MenuBarViewWindow1080": "1080p",
"MenuBarHelp": "_Допомога",
"MenuBarHelpCheckForUpdates": "Перевірити оновлення",
+ "MenuBarHelpFaq": "FAQ & Troubleshooting Page",
+ "MenuBarHelpFaqTooltip": "Opens the FAQ and Troubleshooting page on the official Ryujinx wiki",
+ "MenuBarHelpSetup": "Setup & Configuration Guide",
+ "MenuBarHelpSetupTooltip": "Opens the Setup & Configuration guide on the official Ryujinx wiki",
+ "MenuBarHelpMultiplayer": "Multiplayer (LDN/LAN) Guide",
+ "MenuBarHelpMultiplayerTooltip": "Opens the Multiplayer guide on the official Ryujinx wiki",
"MenuBarHelpAbout": "Про застосунок",
"MenuSearch": "Пошук...",
"GameListHeaderFavorite": "Обране",
@@ -90,11 +96,11 @@
"GameListContextMenuOpenModsDirectoryToolTip": "Відкриває каталог, який містить модифікації Додатків",
"GameListContextMenuOpenSdModsDirectory": "Відкрити каталог модифікацій Atmosphere",
"GameListContextMenuOpenSdModsDirectoryToolTip": "Відкриває альтернативний каталог SD-карти Atmosphere, що містить модифікації Додатків. Корисно для модифікацій, зроблених для реального обладнання.",
- "GameListContextMenuTrimXCI": "Check and Trim XCI File",
- "GameListContextMenuTrimXCIToolTip": "Check and Trim XCI File to Save Disk Space",
+ "GameListContextMenuTrimXCI": "Перевірка та Нарізка XCI Файлів",
+ "GameListContextMenuTrimXCIToolTip": "Перевірка та Нарізка XCI Файлів для збереження місця на диску",
"StatusBarGamesLoaded": "{0}/{1} ігор завантажено",
"StatusBarSystemVersion": "Версія системи: {0}",
- "StatusBarXCIFileTrimming": "Trimming XCI File '{0}'",
+ "StatusBarXCIFileTrimming": "Обрізано XCI Файлів '{0}'",
"LinuxVmMaxMapCountDialogTitle": "Виявлено низьку межу для відображення памʼяті",
"LinuxVmMaxMapCountDialogTextPrimary": "Бажаєте збільшити значення vm.max_map_count на {0}",
"LinuxVmMaxMapCountDialogTextSecondary": "Деякі ігри можуть спробувати створити більше відображень памʼяті, ніж дозволено наразі. Ryujinx завершить роботу, щойно цей ліміт буде перевищено.",
@@ -108,15 +114,15 @@
"SettingsTabGeneralEnableDiscordRichPresence": "Увімкнути розширену присутність Discord",
"SettingsTabGeneralCheckUpdatesOnLaunch": "Перевіряти наявність оновлень під час запуску",
"SettingsTabGeneralShowConfirmExitDialog": "Показати діалогове вікно «Підтвердити вихід».",
- "SettingsTabGeneralRememberWindowState": "Remember Window Size/Position",
- "SettingsTabGeneralShowTitleBar": "Show Title Bar (Requires restart)",
+ "SettingsTabGeneralRememberWindowState": "Запам'ятати Розмір/Позицію вікна",
+ "SettingsTabGeneralShowTitleBar": "Показувати рядок заголовка (Потрібен перезапуск)",
"SettingsTabGeneralHideCursor": "Сховати вказівник:",
"SettingsTabGeneralHideCursorNever": "Ніколи",
"SettingsTabGeneralHideCursorOnIdle": "Сховати у режимі очікування",
"SettingsTabGeneralHideCursorAlways": "Завжди",
"SettingsTabGeneralGameDirectories": "Тека ігор",
- "SettingsTabGeneralAutoloadDirectories": "Autoload DLC/Updates Directories",
- "SettingsTabGeneralAutoloadNote": "DLC and Updates which refer to missing files will be unloaded automatically",
+ "SettingsTabGeneralAutoloadDirectories": "Автозавантаження каталогів DLC/Оновлень",
+ "SettingsTabGeneralAutoloadNote": "DLC та Оновлення, які посилаються на відсутні файли, будуть автоматично вимкнуті.",
"SettingsTabGeneralAdd": "Додати",
"SettingsTabGeneralRemove": "Видалити",
"SettingsTabSystem": "Система",
@@ -149,7 +155,18 @@
"SettingsTabSystemSystemLanguageTraditionalChinese": "Традиційна китайська",
"SettingsTabSystemSystemTimeZone": "Часовий пояс системи:",
"SettingsTabSystemSystemTime": "Час системи:",
- "SettingsTabSystemEnableVsync": "Вертикальна синхронізація",
+ "SettingsTabSystemVSyncMode": "Вертикальна синхронізація (VSync):",
+ "SettingsTabSystemEnableCustomVSyncInterval": "Увімкнути користувацьку частоту оновлення (Експериментально)",
+ "SettingsTabSystemVSyncModeSwitch": "Switch",
+ "SettingsTabSystemVSyncModeUnbounded": "Безмежна",
+ "SettingsTabSystemVSyncModeCustom": "Користувацька",
+ "SettingsTabSystemVSyncModeTooltip": "Емульована вертикальна синхронізація. 'Switch' емулює частоту оновлення Switch 60 Гц. 'Безмежна' — частота оновлення не матиме обмежень.",
+ "SettingsTabSystemVSyncModeTooltipCustom": "Емульована вертикальна синхронізація. 'Switch' емулює частоту оновлення Switch 60 Гц. 'Безмежна' — частота оновлення не матиме обмежень. 'Користувацька' емулює вказану користувацьку частоту оновлення.",
+ "SettingsTabSystemEnableCustomVSyncIntervalTooltip": "Дозволяє користувачу вказати емульовану частоту оновлення. У деяких іграх це може прискорити або сповільнити логіку гри. У інших іграх це може дозволити обмежити FPS на певні кратні частоти оновлення або призвести до непередбачуваної поведінки. Це експериментальна функція, без гарантій того, як це вплине на ігровий процес. \n\nЗалиште ВИМКНЕНИМ, якщо не впевнені.",
+ "SettingsTabSystemCustomVSyncIntervalValueTooltip": "Цільове значення користувацької частоти оновлення.",
+ "SettingsTabSystemCustomVSyncIntervalSliderTooltip": "Користувацька частота оновлення, як відсоток від стандартної частоти оновлення Switch.",
+ "SettingsTabSystemCustomVSyncIntervalPercentage": "Користувацька частота оновлення %:",
+ "SettingsTabSystemCustomVSyncIntervalValue": "Значення користувацька частота оновлення:",
"SettingsTabSystemEnablePptc": "PPTC (профільований постійний кеш перекладу)",
"SettingsTabSystemEnableLowPowerPptc": "Low-power PPTC",
"SettingsTabSystemEnableFsIntegrityChecks": "Перевірка цілісності FS",
@@ -160,11 +177,11 @@
"SettingsTabSystemAudioBackendSDL2": "SDL2",
"SettingsTabSystemHacks": "Хитрощі",
"SettingsTabSystemHacksNote": " (може викликати нестабільність)",
- "SettingsTabSystemDramSize": "Використовувати альтернативне розташування пам'яті (розробники)",
- "SettingsTabSystemDramSize4GiB": "4GiB",
- "SettingsTabSystemDramSize6GiB": "6GiB",
- "SettingsTabSystemDramSize8GiB": "8GiB",
- "SettingsTabSystemDramSize12GiB": "12GiB",
+ "SettingsTabSystemDramSize": "Використовувати альтернативне розташування пам'яті (для розробників)",
+ "SettingsTabSystemDramSize4GiB": "4Гб",
+ "SettingsTabSystemDramSize6GiB": "6Гб",
+ "SettingsTabSystemDramSize8GiB": "8Гб",
+ "SettingsTabSystemDramSize12GiB": "12Гб",
"SettingsTabSystemIgnoreMissingServices": "Ігнорувати відсутні служби",
"SettingsTabSystemIgnoreApplet": "Ігнорувати Аплет",
"SettingsTabGraphics": "Графіка",
@@ -202,8 +219,8 @@
"SettingsTabLoggingEnableGuestLogs": "Увімкнути журнали гостей",
"SettingsTabLoggingEnableFsAccessLogs": "Увімкнути журнали доступу Fs",
"SettingsTabLoggingFsGlobalAccessLogMode": "Режим журналу глобального доступу Fs:",
- "SettingsTabLoggingDeveloperOptions": "Параметри розробника (УВАГА: знизиться продуктивність)",
- "SettingsTabLoggingDeveloperOptionsNote": "УВАГА: Знижує продуктивність",
+ "SettingsTabLoggingDeveloperOptions": "Параметри розробника (УВАГА: шкодить продуктивності!)",
+ "SettingsTabLoggingDeveloperOptionsNote": "УВАГА: Зміна параметрів нижче негативно впливає на продуктивність",
"SettingsTabLoggingGraphicsBackendLogLevel": "Рівень журналу графічного сервера:",
"SettingsTabLoggingGraphicsBackendLogLevelNone": "Немає",
"SettingsTabLoggingGraphicsBackendLogLevelError": "Помилка",
@@ -292,29 +309,29 @@
"ControllerSettingsMotionGyroDeadzone": "Мертва зона гіроскопа:",
"ControllerSettingsSave": "Зберегти",
"ControllerSettingsClose": "Закрити",
- "KeyUnknown": "Unknown",
- "KeyShiftLeft": "Shift Left",
- "KeyShiftRight": "Shift Right",
- "KeyControlLeft": "Ctrl Left",
- "KeyMacControlLeft": "⌃ Left",
- "KeyControlRight": "Ctrl Right",
- "KeyMacControlRight": "⌃ Right",
- "KeyAltLeft": "Alt Left",
- "KeyMacAltLeft": "⌥ Left",
- "KeyAltRight": "Alt Right",
- "KeyMacAltRight": "⌥ Right",
- "KeyWinLeft": "⊞ Left",
- "KeyMacWinLeft": "⌘ Left",
- "KeyWinRight": "⊞ Right",
- "KeyMacWinRight": "⌘ Right",
+ "KeyUnknown": "Невідома",
+ "KeyShiftLeft": "Shift Лівий",
+ "KeyShiftRight": "Shift Правий",
+ "KeyControlLeft": "Ctrl Лівий",
+ "KeyMacControlLeft": "⌃ Лівий",
+ "KeyControlRight": "Ctrl Правий",
+ "KeyMacControlRight": "⌃ Правий",
+ "KeyAltLeft": "Alt Лівий",
+ "KeyMacAltLeft": "⌥ Лівий",
+ "KeyAltRight": "Alt Правий",
+ "KeyMacAltRight": "⌥ Правий",
+ "KeyWinLeft": "⊞ Лівий",
+ "KeyMacWinLeft": "⌘ Лівий",
+ "KeyWinRight": "⊞ Правий",
+ "KeyMacWinRight": "⌘ Правий",
"KeyMenu": "Menu",
"KeyUp": "Up",
"KeyDown": "Down",
- "KeyLeft": "Left",
- "KeyRight": "Right",
+ "KeyLeft": "Вліво",
+ "KeyRight": "Вправо",
"KeyEnter": "Enter",
"KeyEscape": "Escape",
- "KeySpace": "Space",
+ "KeySpace": "Пробіл",
"KeyTab": "Tab",
"KeyBackSpace": "Backspace",
"KeyInsert": "Insert",
@@ -328,7 +345,7 @@
"KeyPrintScreen": "Print Screen",
"KeyPause": "Pause",
"KeyNumLock": "Num Lock",
- "KeyClear": "Clear",
+ "KeyClear": "Очистити",
"KeyKeypad0": "Keypad 0",
"KeyKeypad1": "Keypad 1",
"KeyKeypad2": "Keypad 2",
@@ -367,17 +384,17 @@
"KeyPeriod": ".",
"KeySlash": "/",
"KeyBackSlash": "\\",
- "KeyUnbound": "Unbound",
- "GamepadLeftStick": "L Stick Button",
- "GamepadRightStick": "R Stick Button",
- "GamepadLeftShoulder": "Left Shoulder",
- "GamepadRightShoulder": "Right Shoulder",
- "GamepadLeftTrigger": "Left Trigger",
- "GamepadRightTrigger": "Right Trigger",
- "GamepadDpadUp": "Up",
- "GamepadDpadDown": "Down",
- "GamepadDpadLeft": "Left",
- "GamepadDpadRight": "Right",
+ "KeyUnbound": "Відв'язати",
+ "GamepadLeftStick": "L Кнопка Стіку",
+ "GamepadRightStick": "R Кнопка Стіку",
+ "GamepadLeftShoulder": "Лівий Бампер",
+ "GamepadRightShoulder": "Правий Бампер",
+ "GamepadLeftTrigger": "Лівий Тригер",
+ "GamepadRightTrigger": "Правий Тригер",
+ "GamepadDpadUp": "Вверх",
+ "GamepadDpadDown": "Вниз",
+ "GamepadDpadLeft": "Вліво",
+ "GamepadDpadRight": "Вправо",
"GamepadMinus": "-",
"GamepadPlus": "+",
"GamepadGuide": "Guide",
@@ -387,12 +404,12 @@
"GamepadPaddle3": "Paddle 3",
"GamepadPaddle4": "Paddle 4",
"GamepadTouchpad": "Touchpad",
- "GamepadSingleLeftTrigger0": "Left Trigger 0",
- "GamepadSingleRightTrigger0": "Right Trigger 0",
- "GamepadSingleLeftTrigger1": "Left Trigger 1",
- "GamepadSingleRightTrigger1": "Right Trigger 1",
- "StickLeft": "Left Stick",
- "StickRight": "Right Stick",
+ "GamepadSingleLeftTrigger0": "Лівий Тригер 0",
+ "GamepadSingleRightTrigger0": "Правий Тригер 0",
+ "GamepadSingleLeftTrigger1": "Лівий Тригер 1",
+ "GamepadSingleRightTrigger1": "Правий Тригер 1",
+ "StickLeft": "Лівий Стік",
+ "StickRight": "Правий Стік",
"UserProfilesSelectedUserProfile": "Вибраний профіль користувача:",
"UserProfilesSaveProfileName": "Зберегти ім'я профілю",
"UserProfilesChangeProfileImage": "Змінити зображення профілю",
@@ -409,8 +426,8 @@
"InputDialogTitle": "Діалог введення",
"InputDialogOk": "Гаразд",
"InputDialogCancel": "Скасувати",
- "InputDialogCancelling": "Cancelling",
- "InputDialogClose": "Close",
+ "InputDialogCancelling": "Скасування",
+ "InputDialogClose": "Закрити",
"InputDialogAddNewProfileTitle": "Виберіть ім'я профілю",
"InputDialogAddNewProfileHeader": "Будь ласка, введіть ім'я профілю",
"InputDialogAddNewProfileSubtext": "(Макс. довжина: {0})",
@@ -418,7 +435,7 @@
"AvatarSetBackgroundColor": "Встановити колір фону",
"AvatarClose": "Закрити",
"ControllerSettingsLoadProfileToolTip": "Завантажити профіль",
- "ControllerSettingsViewProfileToolTip": "View Profile",
+ "ControllerSettingsViewProfileToolTip": "Показати профіль",
"ControllerSettingsAddProfileToolTip": "Додати профіль",
"ControllerSettingsRemoveProfileToolTip": "Видалити профіль",
"ControllerSettingsSaveProfileToolTip": "Зберегти профіль",
@@ -428,7 +445,7 @@
"GameListContextMenuToggleFavorite": "Перемкнути вибране",
"GameListContextMenuToggleFavoriteToolTip": "Перемкнути улюблений статус гри",
"SettingsTabGeneralTheme": "Тема:",
- "SettingsTabGeneralThemeAuto": "Auto",
+ "SettingsTabGeneralThemeAuto": "Авто.",
"SettingsTabGeneralThemeDark": "Темна",
"SettingsTabGeneralThemeLight": "Світла",
"ControllerSettingsConfigureGeneral": "Налаштування",
@@ -447,7 +464,7 @@
"DialogExitSubMessage": "Усі незбережені дані буде втрачено!",
"DialogMessageCreateSaveErrorMessage": "Під час створення вказаних даних збереження сталася помилка: {0}",
"DialogMessageFindSaveErrorMessage": "Під час пошуку вказаних даних збереження сталася помилка: {0}",
- "FolderDialogExtractTitle": "Виберіть папку для видобування",
+ "FolderDialogExtractTitle": "Виберіть теку для видобування",
"DialogNcaExtractionMessage": "Видобування розділу {0} з {1}...",
"DialogNcaExtractionTitle": "Екстрактор розділів NCA",
"DialogNcaExtractionMainNcaNotFoundErrorMessage": "Помилка видобування. Основний NCA не був присутній у вибраному файлі.",
@@ -462,7 +479,7 @@
"DialogUpdaterExtractionMessage": "Видобування оновлення...",
"DialogUpdaterRenamingMessage": "Перейменування оновлення...",
"DialogUpdaterAddingFilesMessage": "Додавання нового оновлення...",
- "DialogUpdaterShowChangelogMessage": "Show Changelog",
+ "DialogUpdaterShowChangelogMessage": "Показати список змін",
"DialogUpdaterCompleteMessage": "Оновлення завершено!",
"DialogUpdaterRestartMessage": "Перезапустити Ryujinx зараз?",
"DialogUpdaterNoInternetMessage": "Ви не підключені до Інтернету!",
@@ -511,12 +528,12 @@
"DialogFirmwareInstallerFirmwareInstallWaitMessage": "Встановлення прошивки...",
"DialogFirmwareInstallerFirmwareInstallSuccessMessage": "Версію системи {0} успішно встановлено.",
"DialogKeysInstallerKeysNotFoundErrorMessage": "An invalid Keys file was found in {0}",
- "DialogKeysInstallerKeysInstallTitle": "Install Keys",
- "DialogKeysInstallerKeysInstallMessage": "New Keys file will be installed.",
- "DialogKeysInstallerKeysInstallSubMessage": "\n\nThis may replace some of the current installed Keys.",
- "DialogKeysInstallerKeysInstallConfirmMessage": "\n\nDo you want to continue?",
- "DialogKeysInstallerKeysInstallWaitMessage": "Installing Keys...",
- "DialogKeysInstallerKeysInstallSuccessMessage": "New Keys file successfully installed.",
+ "DialogKeysInstallerKeysInstallTitle": "Встановлення Ключів",
+ "DialogKeysInstallerKeysInstallMessage": "Новий файл Ключів буде встановлено",
+ "DialogKeysInstallerKeysInstallSubMessage": "\n\nЦе замінить собою поточні файли Ключів.",
+ "DialogKeysInstallerKeysInstallConfirmMessage": "\n\nВи хочете продовжити?",
+ "DialogKeysInstallerKeysInstallWaitMessage": "Встановлення Ключів...",
+ "DialogKeysInstallerKeysInstallSuccessMessage": "Нові ключі встановлено.",
"DialogUserProfileDeletionWarningMessage": "Якщо вибраний профіль буде видалено, інші профілі не відкриватимуться",
"DialogUserProfileDeletionConfirmMessage": "Ви хочете видалити вибраний профіль",
"DialogUserProfileUnsavedChangesTitle": "Увага — Незбережені зміни",
@@ -551,14 +568,14 @@
"MenuBarOptionsPauseEmulation": "Пауза",
"MenuBarOptionsResumeEmulation": "Продовжити",
"AboutUrlTooltipMessage": "Натисніть, щоб відкрити сайт Ryujinx у браузері за замовчування.",
- "AboutDisclaimerMessage": "Ryujinx жодним чином не пов’язано з Nintendo™,\nчи будь-яким із їхніх партнерів.",
+ "AboutDisclaimerMessage": "Ryujinx жодним чином не пов’язаний з Nintendo™,\nчи будь-яким із їхніх партнерів.",
"AboutAmiiboDisclaimerMessage": "AmiiboAPI (www.amiiboapi.com) використовується в нашій емуляції Amiibo.",
"AboutGithubUrlTooltipMessage": "Натисніть, щоб відкрити сторінку GitHub Ryujinx у браузері за замовчуванням.",
"AboutDiscordUrlTooltipMessage": "Натисніть, щоб відкрити запрошення на сервер Discord Ryujinx у браузері за замовчуванням.",
"AboutRyujinxAboutTitle": "Про програму:",
- "AboutRyujinxAboutContent": "Ryujinx is an emulator for the Nintendo Switch™.\nGet all the latest news in our Discord.\nDevelopers interested in contributing can find out more on our GitHub or Discord.",
+ "AboutRyujinxAboutContent": "Ryujinx — це емулятор для Nintendo Switch™.\nОтримуйте всі останні новини в нашому Discord.\nРозробники, які хочуть зробити внесок, можуть дізнатися більше на нашому GitHub або в Discord.",
"AboutRyujinxMaintainersTitle": "Підтримується:",
- "AboutRyujinxFormerMaintainersTitle": "Formerly Maintained By:",
+ "AboutRyujinxFormerMaintainersTitle": "Минулі розробники:",
"AboutRyujinxMaintainersContentTooltipMessage": "Натисніть, щоб відкрити сторінку співавторів у вашому браузері за замовчування.",
"AmiiboSeriesLabel": "Серія Amiibo",
"AmiiboCharacterLabel": "Персонаж",
@@ -586,9 +603,9 @@
"AddGameDirBoxTooltip": "Введіть каталог ігор, щоб додати до списку",
"AddGameDirTooltip": "Додати каталог гри до списку",
"RemoveGameDirTooltip": "Видалити вибраний каталог гри",
- "AddAutoloadDirBoxTooltip": "Enter an autoload directory to add to the list",
- "AddAutoloadDirTooltip": "Add an autoload directory to the list",
- "RemoveAutoloadDirTooltip": "Remove selected autoload directory",
+ "AddAutoloadDirBoxTooltip": "Введіть шлях автозавантаження для додавання до списку",
+ "AddAutoloadDirTooltip": "Додайте шлях автозавантаження для додавання до списку",
+ "RemoveAutoloadDirTooltip": "Видалити вибраний каталог автозавантаження",
"CustomThemeCheckTooltip": "Використовуйте користувацьку тему Avalonia для графічного інтерфейсу, щоб змінити вигляд меню емулятора",
"CustomThemePathTooltip": "Шлях до користувацької теми графічного інтерфейсу",
"CustomThemeBrowseTooltip": "Огляд користувацької теми графічного інтерфейсу",
@@ -601,7 +618,7 @@
"TimeTooltip": "Змінити час системи",
"VSyncToggleTooltip": "Емульована вертикальна синхронізація консолі. По суті, обмежувач кадрів для більшості ігор; його вимкнення може призвести до того, що ігри працюватимуть на вищій швидкості, екрани завантаження триватимуть довше чи зупинятимуться.\n\nМожна перемикати в грі гарячою клавішею (За умовчанням F1). Якщо ви плануєте вимкнути функцію, рекомендуємо зробити це через гарячу клавішу.\n\nЗалиште увімкненим, якщо не впевнені.",
"PptcToggleTooltip": "Зберігає перекладені функції JIT, щоб їх не потрібно було перекладати кожного разу, коли гра завантажується.\n\nЗменшує заїкання та значно прискорює час завантаження після першого завантаження гри.\n\nЗалиште увімкненим, якщо не впевнені.",
- "LowPowerPptcToggleTooltip": "Load the PPTC using a third of the amount of cores.",
+ "LowPowerPptcToggleTooltip": "Завантажувати PPTC використовуючи третину від кількості ядер.",
"FsIntegrityToggleTooltip": "Перевіряє наявність пошкоджених файлів під час завантаження гри, і якщо виявлено пошкоджені файли, показує помилку хешу в журналі.\n\nНе впливає на продуктивність і призначений для усунення несправностей.\n\nЗалиште увімкненим, якщо не впевнені.",
"AudioBackendTooltip": "Змінює серверну частину, яка використовується для відтворення аудіо.\n\nSDL2 є кращим, тоді як OpenAL і SoundIO використовуються як резервні варіанти. Dummy не матиме звуку.\n\nВстановіть SDL2, якщо не впевнені.",
"MemoryManagerTooltip": "Змінює спосіб відображення та доступу до гостьової пам’яті. Значно впливає на продуктивність емульованого ЦП.\n\nВстановіть «Неперевірений хост», якщо не впевнені.",
@@ -634,10 +651,10 @@
"DebugLogTooltip": "Друкує повідомлення журналу налагодження на консолі.\n\nВикористовуйте це лише за спеціальною вказівкою співробітника, оскільки це ускладнить читання журналів і погіршить роботу емулятора.",
"LoadApplicationFileTooltip": "Відкриває файловий провідник, щоб вибрати для завантаження сумісний файл Switch",
"LoadApplicationFolderTooltip": "Відкриває файловий провідник, щоб вибрати сумісну з комутатором розпаковану програму для завантаження",
- "LoadDlcFromFolderTooltip": "Open a file explorer to choose one or more folders to bulk load DLC from",
- "LoadTitleUpdatesFromFolderTooltip": "Open a file explorer to choose one or more folders to bulk load title updates from",
- "OpenRyujinxFolderTooltip": "Відкриває папку файлової системи Ryujinx",
- "OpenRyujinxLogsTooltip": "Відкриває папку, куди записуються журнали",
+ "LoadDlcFromFolderTooltip": "Відкрийте провідник файлів, щоб вибрати одну або кілька папок для масового завантаження DLC",
+ "LoadTitleUpdatesFromFolderTooltip": "Відкрийте провідник файлів, щоб вибрати одну або кілька папок для масового завантаження оновлень заголовків",
+ "OpenRyujinxFolderTooltip": "Відкриває теку файлової системи Ryujinx",
+ "OpenRyujinxLogsTooltip": "Відкриває теку, куди записуються журнали",
"ExitTooltip": "Виходить з Ryujinx",
"OpenSettingsTooltip": "Відкриває вікно налаштувань",
"OpenProfileManagerTooltip": "Відкриває вікно диспетчера профілів користувачів",
@@ -665,7 +682,6 @@
"SettingsTabNetworkConnection": "Підключення до мережі",
"SettingsTabCpuCache": "Кеш ЦП",
"SettingsTabCpuMemory": "Пам'ять ЦП",
- "DialogUpdaterFlatpakNotSupportedMessage": "Будь ласка, оновіть Ryujinx через FlatHub.",
"UpdaterDisabledWarningTitle": "Програму оновлення вимкнено!",
"ControllerSettingsRotate90": "Повернути на 90° за годинниковою стрілкою",
"IconSize": "Розмір значка",
@@ -687,14 +703,14 @@
"OpenSetupGuideMessage": "Відкрити посібник із налаштування",
"NoUpdate": "Немає оновлень",
"TitleUpdateVersionLabel": "Версія {0} - {1}",
- "TitleBundledUpdateVersionLabel": "Bundled: Version {0}",
- "TitleBundledDlcLabel": "Bundled:",
- "TitleXCIStatusPartialLabel": "Partial",
- "TitleXCIStatusTrimmableLabel": "Untrimmed",
- "TitleXCIStatusUntrimmableLabel": "Trimmed",
- "TitleXCIStatusFailedLabel": "(Failed)",
- "TitleXCICanSaveLabel": "Save {0:n0} Mb",
- "TitleXCISavingLabel": "Saved {0:n0} Mb",
+ "TitleBundledUpdateVersionLabel": "Комплектні: Версія {0}",
+ "TitleBundledDlcLabel": "Комплектні:",
+ "TitleXCIStatusPartialLabel": "Часткові",
+ "TitleXCIStatusTrimmableLabel": "Необрізані",
+ "TitleXCIStatusUntrimmableLabel": "Обрізані",
+ "TitleXCIStatusFailedLabel": "(Невдача)",
+ "TitleXCICanSaveLabel": "Зберегти {0:n0} Мб",
+ "TitleXCISavingLabel": "Збережено {0:n0} Мб",
"RyujinxInfo": "Ryujin x - Інформація",
"RyujinxConfirm": "Ryujinx - Підтвердження",
"FileDialogAllTypes": "Всі типи",
@@ -702,8 +718,8 @@
"SwkbdMinCharacters": "Мінімальна кількість символів: {0}",
"SwkbdMinRangeCharacters": "Має бути {0}-{1} символів",
"CabinetTitle": "Cabinet Dialog",
- "CabinetDialog": "Enter your Amiibo's new name",
- "CabinetScanDialog": "Please scan your Amiibo now.",
+ "CabinetDialog": "Вкажіть Ваше нове ім'я Amiibo",
+ "CabinetScanDialog": "Будь ласка, проскануйте Ваш Amiibo.",
"SoftwareKeyboard": "Програмна клавіатура",
"SoftwareKeyboardModeNumeric": "Повинно бути лише 0-9 або “.”",
"SoftwareKeyboardModeAlphabet": "Повинно бути лише не CJK-символи",
@@ -731,12 +747,15 @@
"AllSupportedFormats": "Усі підтримувані формати",
"RyujinxUpdater": "Програма оновлення Ryujinx",
"SettingsTabHotkeys": "Гарячі клавіші клавіатури",
+ "SettingsTabHotkeysToggleVSyncModeHotkey": "Перемкнути VSync режим:",
"SettingsTabHotkeysHotkeys": "Гарячі клавіші клавіатури",
"SettingsTabHotkeysToggleVsyncHotkey": "Увімк/вимк вертикальну синхронізацію:",
"SettingsTabHotkeysScreenshotHotkey": "Знімок екрана:",
"SettingsTabHotkeysShowUiHotkey": "Показати інтерфейс:",
"SettingsTabHotkeysPauseHotkey": "Пауза:",
"SettingsTabHotkeysToggleMuteHotkey": "Вимкнути звук:",
+ "SettingsTabHotkeysIncrementCustomVSyncIntervalHotkey": "Підвищити користувацьку частоту оновлення",
+ "SettingsTabHotkeysDecrementCustomVSyncIntervalHotkey": "Понизити користувацьку частоту оновлення",
"ControllerMotionTitle": "Налаштування керування рухом",
"ControllerRumbleTitle": "Налаштування вібрації",
"SettingsSelectThemeFileDialogTitle": "Виберіть файл теми",
@@ -749,53 +768,53 @@
"SelectDlcDialogTitle": "Виберіть файли DLC",
"SelectUpdateDialogTitle": "Виберіть файли оновлення",
"SelectModDialogTitle": "Виберіть теку з модами",
- "TrimXCIFileDialogTitle": "Check and Trim XCI File",
- "TrimXCIFileDialogPrimaryText": "This function will first check the empty space and then trim the XCI File to save disk space.",
- "TrimXCIFileDialogSecondaryText": "Current File Size: {0:n} MB\nGame Data Size: {1:n} MB\nDisk Space Savings: {2:n} MB",
- "TrimXCIFileNoTrimNecessary": "XCI File does not need to be trimmed. Check logs for further details",
- "TrimXCIFileNoUntrimPossible": "XCI File cannot be untrimmed. Check logs for further details",
- "TrimXCIFileReadOnlyFileCannotFix": "XCI File is Read Only and could not be made writable. Check logs for further details",
- "TrimXCIFileFileSizeChanged": "XCI File has changed in size since it was scanned. Please check the file is not being written to and try again.",
- "TrimXCIFileFreeSpaceCheckFailed": "XCI File has data in the free space area, it is not safe to trim",
- "TrimXCIFileInvalidXCIFile": "XCI File contains invalid data. Check logs for further details",
- "TrimXCIFileFileIOWriteError": "XCI File could not be opened for writing. Check logs for further details",
- "TrimXCIFileFailedPrimaryText": "Trimming of the XCI file failed",
- "TrimXCIFileCancelled": "The operation was cancelled",
- "TrimXCIFileFileUndertermined": "No operation was performed",
+ "TrimXCIFileDialogTitle": "Перевірити та Обрізати XCI файл",
+ "TrimXCIFileDialogPrimaryText": "Ця функція спочатку перевірить вільний простір, а потім обрізатиме файл XCI для економії місця на диску.",
+ "TrimXCIFileDialogSecondaryText": "Поточний розмір файла: {0:n} MB\nРозмір файлів гри: {1:n} MB\nЕкономія місця: {2:n} MB",
+ "TrimXCIFileNoTrimNecessary": "XCI файл не потребує обрізання. Перевірте журнали для додаткової інформації",
+ "TrimXCIFileNoUntrimPossible": "XCI файл не може бути обрізаний. Перевірте журнали для додаткової інформації",
+ "TrimXCIFileReadOnlyFileCannotFix": "XCI файл Тільки для Читання і не може бути прочитаним. Перевірте журнали додаткової інформації",
+ "TrimXCIFileFileSizeChanged": "Розмір файлу XCI змінився з моменту сканування. Перевірте, чи не записується файл, та спробуйте знову",
+ "TrimXCIFileFreeSpaceCheckFailed": "Файл XCI містить дані в зоні вільного простору, тому обрізка небезпечна",
+ "TrimXCIFileInvalidXCIFile": "XCI Файл містить недійсні дані. Перевірте журнали для додаткової інформації",
+ "TrimXCIFileFileIOWriteError": "XCI Файл файл не вдалося відкрити для запису. Перевірте журнали для додаткової інформації",
+ "TrimXCIFileFailedPrimaryText": "Не вдалося обрізати файл XCI",
+ "TrimXCIFileCancelled": "Операція перервана",
+ "TrimXCIFileFileUndertermined": "Операція не проводилася",
"UserProfileWindowTitle": "Менеджер профілів користувачів",
"CheatWindowTitle": "Менеджер читів",
"DlcWindowTitle": "Менеджер вмісту для завантаження",
"ModWindowTitle": "Керувати модами для {0} ({1})",
"UpdateWindowTitle": "Менеджер оновлення назв",
- "XCITrimmerWindowTitle": "XCI File Trimmer",
- "XCITrimmerTitleStatusCount": "{0} of {1} Title(s) Selected",
- "XCITrimmerTitleStatusCountWithFilter": "{0} of {1} Title(s) Selected ({2} displayed)",
- "XCITrimmerTitleStatusTrimming": "Trimming {0} Title(s)...",
- "XCITrimmerTitleStatusUntrimming": "Untrimming {0} Title(s)...",
- "XCITrimmerTitleStatusFailed": "Failed",
- "XCITrimmerPotentialSavings": "Potential Savings",
- "XCITrimmerActualSavings": "Actual Savings",
- "XCITrimmerSavingsMb": "{0:n0} Mb",
- "XCITrimmerSelectDisplayed": "Select Shown",
- "XCITrimmerDeselectDisplayed": "Deselect Shown",
- "XCITrimmerSortName": "Title",
- "XCITrimmerSortSaved": "Space Savings",
- "XCITrimmerTrim": "Trim",
- "XCITrimmerUntrim": "Untrim",
- "UpdateWindowUpdateAddedMessage": "{0} new update(s) added",
- "UpdateWindowBundledContentNotice": "Bundled updates cannot be removed, only disabled.",
+ "XCITrimmerWindowTitle": "Обрізка XCI Файлів",
+ "XCITrimmerTitleStatusCount": "{0} з {1} тайтл(ів) обрано",
+ "XCITrimmerTitleStatusCountWithFilter": "{0} з {1} тайтл(ів) обрано ({2} відображається)",
+ "XCITrimmerTitleStatusTrimming": "Обрізка {0} тайтл(ів)...",
+ "XCITrimmerTitleStatusUntrimming": "Необрізаних {0} тайтл(ів)...",
+ "XCITrimmerTitleStatusFailed": "Невдача",
+ "XCITrimmerPotentialSavings": "Потенційна економія",
+ "XCITrimmerActualSavings": "Зекономлено",
+ "XCITrimmerSavingsMb": "{0:n0} Мб",
+ "XCITrimmerSelectDisplayed": "Вибрати показане",
+ "XCITrimmerDeselectDisplayed": "Скасувати вибір показаного",
+ "XCITrimmerSortName": "Заголовок",
+ "XCITrimmerSortSaved": "Економія місця",
+ "XCITrimmerTrim": "Обрізка",
+ "XCITrimmerUntrim": "Зшивання",
+ "UpdateWindowUpdateAddedMessage": "{0} нове оновлення додано",
+ "UpdateWindowBundledContentNotice": "Вбудовані оновлення не можуть бути видалені, лише вимкнені.",
"CheatWindowHeading": "Коди доступні для {0} [{1}]",
"BuildId": "ID збірки:",
- "DlcWindowBundledContentNotice": "Bundled DLC cannot be removed, only disabled.",
- "DlcWindowHeading": "{0} DLC(s) available",
- "DlcWindowDlcAddedMessage": "{0} new downloadable content(s) added",
- "AutoloadDlcAddedMessage": "{0} new downloadable content(s) added",
- "AutoloadDlcRemovedMessage": "{0} missing downloadable content(s) removed",
- "AutoloadUpdateAddedMessage": "{0} new update(s) added",
- "AutoloadUpdateRemovedMessage": "{0} missing update(s) removed",
+ "DlcWindowBundledContentNotice": "Вбудований DLC не може бути видаленим, лише вимкненим.",
+ "DlcWindowHeading": "{0} DLC доступно",
+ "DlcWindowDlcAddedMessage": "{0} нового завантажувального вмісту додано",
+ "AutoloadDlcAddedMessage": "{0} нового завантажувального вмісту додано",
+ "AutoloadDlcRemovedMessage": "{0} відсутнього завантажувального вмісту видалено",
+ "AutoloadUpdateAddedMessage": "{0} нових оновлень додано",
+ "AutoloadUpdateRemovedMessage": "{0} відсутніх оновлень видалено",
"ModWindowHeading": "{0} мод(ів)",
"UserProfilesEditProfile": "Редагувати вибране",
- "Continue": "Continue",
+ "Continue": "Продовжити",
"Cancel": "Скасувати",
"Save": "Зберегти",
"Discard": "Скасувати",
@@ -833,7 +852,7 @@
"Name": "Назва",
"Size": "Розмір",
"Search": "Пошук",
- "UserProfilesRecoverLostAccounts": "Відновлення втрачених облікових записів",
+ "UserProfilesRecoverLostAccounts": "Відновлення профілів",
"Recover": "Відновити",
"UserProfilesRecoverHeading": "Знайдено збереження для наступних облікових записів",
"UserProfilesRecoverEmptyList": "Немає профілів для відновлення",
@@ -865,15 +884,15 @@
"MultiplayerModeDisabled": "Вимкнено",
"MultiplayerModeLdnMitm": "ldn_mitm",
"MultiplayerModeLdnRyu": "RyuLDN",
- "MultiplayerDisableP2P": "Disable P2P Network Hosting (may increase latency)",
- "MultiplayerDisableP2PTooltip": "Disable P2P network hosting, peers will proxy through the master server instead of connecting to you directly.",
- "LdnPassphrase": "Network Passphrase:",
- "LdnPassphraseTooltip": "You will only be able to see hosted games with the same passphrase as you.",
- "LdnPassphraseInputTooltip": "Enter a passphrase in the format Ryujinx-<8 hex chars>. You will only be able to see hosted games with the same passphrase as you.",
- "LdnPassphraseInputPublic": "(public)",
- "GenLdnPass": "Generate Random",
- "GenLdnPassTooltip": "Generates a new passphrase, which can be shared with other players.",
- "ClearLdnPass": "Clear",
- "ClearLdnPassTooltip": "Clears the current passphrase, returning to the public network.",
- "InvalidLdnPassphrase": "Invalid Passphrase! Must be in the format \"Ryujinx-<8 hex chars>\""
-}
+ "MultiplayerDisableP2P": "Вимкнути хостинг P2P мережі (може збільшити затримку)",
+ "MultiplayerDisableP2PTooltip": "Вимкнути хостинг P2P мережі, піри будуть підключатися через майстер-сервер замість прямого з'єднання з вами.",
+ "LdnPassphrase": "Мережевий пароль:",
+ "LdnPassphraseTooltip": "Ви зможете бачити лише ті ігри, які мають такий самий пароль, як і у вас.",
+ "LdnPassphraseInputTooltip": "Введіть пароль у форматі Ryujinx-<8 символів>. Ви зможете бачити лише ті ігри, які мають такий самий пароль, як і у вас.",
+ "LdnPassphraseInputPublic": "(публічний)",
+ "GenLdnPass": "Згенерувати випадкову",
+ "GenLdnPassTooltip": "Генерує новий пароль, яким можна поділитися з іншими гравцями.",
+ "ClearLdnPass": "Очистити",
+ "ClearLdnPassTooltip": "Очищає поточну пароль, повертаючись до публічної мережі.",
+ "InvalidLdnPassphrase": "Невірний пароль! Має бути в форматі \"Ryujinx-<8 символів>\""
+}
\ No newline at end of file
diff --git a/src/Ryujinx/Assets/Locales/zh_CN.json b/src/Ryujinx/Assets/Locales/zh_CN.json
index 2527dccff..c5ab78f4d 100644
--- a/src/Ryujinx/Assets/Locales/zh_CN.json
+++ b/src/Ryujinx/Assets/Locales/zh_CN.json
@@ -45,6 +45,12 @@
"MenuBarViewWindow1080": "1080p",
"MenuBarHelp": "帮助(_H)",
"MenuBarHelpCheckForUpdates": "检查更新",
+ "MenuBarHelpFaq": "FAQ & Troubleshooting Page",
+ "MenuBarHelpFaqTooltip": "Opens the FAQ and Troubleshooting page on the official Ryujinx wiki",
+ "MenuBarHelpSetup": "Setup & Configuration Guide",
+ "MenuBarHelpSetupTooltip": "Opens the Setup & Configuration guide on the official Ryujinx wiki",
+ "MenuBarHelpMultiplayer": "Multiplayer (LDN/LAN) Guide",
+ "MenuBarHelpMultiplayerTooltip": "Opens the Multiplayer guide on the official Ryujinx wiki",
"MenuBarHelpAbout": "关于",
"MenuSearch": "搜索…",
"GameListHeaderFavorite": "收藏",
diff --git a/src/Ryujinx/Assets/Locales/zh_TW.json b/src/Ryujinx/Assets/Locales/zh_TW.json
index 57fa75546..a57705f12 100644
--- a/src/Ryujinx/Assets/Locales/zh_TW.json
+++ b/src/Ryujinx/Assets/Locales/zh_TW.json
@@ -45,6 +45,12 @@
"MenuBarViewWindow1080": "1080p",
"MenuBarHelp": "說明(_H)",
"MenuBarHelpCheckForUpdates": "檢查更新",
+ "MenuBarHelpFaq": "FAQ & Troubleshooting Page",
+ "MenuBarHelpFaqTooltip": "Opens the FAQ and Troubleshooting page on the official Ryujinx wiki",
+ "MenuBarHelpSetup": "Setup & Configuration Guide",
+ "MenuBarHelpSetupTooltip": "Opens the Setup & Configuration guide on the official Ryujinx wiki",
+ "MenuBarHelpMultiplayer": "Multiplayer (LDN/LAN) Guide",
+ "MenuBarHelpMultiplayerTooltip": "Opens the Multiplayer guide on the official Ryujinx wiki",
"MenuBarHelpAbout": "關於",
"MenuSearch": "搜尋...",
"GameListHeaderFavorite": "我的最愛",
diff --git a/src/Ryujinx/Input/AvaloniaKeyboard.cs b/src/Ryujinx/Input/AvaloniaKeyboard.cs
index 95d2936f6..0b63af2d9 100644
--- a/src/Ryujinx/Input/AvaloniaKeyboard.cs
+++ b/src/Ryujinx/Input/AvaloniaKeyboard.cs
@@ -4,6 +4,7 @@ using Ryujinx.Input;
using System;
using System.Collections.Generic;
using System.Numerics;
+using System.Threading;
using ConfigKey = Ryujinx.Common.Configuration.Hid.Key;
using Key = Ryujinx.Input.Key;
@@ -15,7 +16,7 @@ namespace Ryujinx.Ava.Input
private readonly AvaloniaKeyboardDriver _driver;
private StandardKeyboardInputConfig _configuration;
- private readonly object _userMappingLock = new();
+ private readonly Lock _userMappingLock = new();
public string Id { get; }
public string Name { get; }
diff --git a/src/Ryujinx/Ryujinx.csproj b/src/Ryujinx/Ryujinx.csproj
index 989a3a5bd..e5f6636c3 100644
--- a/src/Ryujinx/Ryujinx.csproj
+++ b/src/Ryujinx/Ryujinx.csproj
@@ -1,6 +1,5 @@
- net8.0win-x64;osx-x64;linux-x64Exetrue
diff --git a/src/Ryujinx/Ryujinx.ico b/src/Ryujinx/Ryujinx.ico
index 0da5a311f..e1ac423e7 100644
Binary files a/src/Ryujinx/Ryujinx.ico and b/src/Ryujinx/Ryujinx.ico differ
diff --git a/src/Ryujinx/UI/ViewModels/AmiiboWindowViewModel.cs b/src/Ryujinx/UI/ViewModels/AmiiboWindowViewModel.cs
index a852d474c..ab08ce385 100644
--- a/src/Ryujinx/UI/ViewModels/AmiiboWindowViewModel.cs
+++ b/src/Ryujinx/UI/ViewModels/AmiiboWindowViewModel.cs
@@ -332,7 +332,7 @@ namespace Ryujinx.Ava.UI.ViewModels
private void SelectLastScannedAmiibo()
{
- AmiiboApi scanned = _amiiboList.Find(amiibo => amiibo.GetId() == LastScannedAmiiboId);
+ AmiiboApi scanned = _amiiboList.FirstOrDefault(amiibo => amiibo.GetId() == LastScannedAmiiboId);
SeriesSelectedIndex = AmiiboSeries.IndexOf(scanned.AmiiboSeries);
AmiiboSelectedIndex = AmiiboList.IndexOf(scanned);
@@ -393,7 +393,7 @@ namespace Ryujinx.Ava.UI.ViewModels
AmiiboApi selected = _amiibos[_amiiboSelectedIndex];
- string imageUrl = _amiiboList.Find(amiibo => amiibo.Equals(selected)).Image;
+ string imageUrl = _amiiboList.FirstOrDefault(amiibo => amiibo.Equals(selected)).Image;
StringBuilder usageStringBuilder = new();
diff --git a/src/Ryujinx/UI/ViewModels/Input/InputViewModel.cs b/src/Ryujinx/UI/ViewModels/Input/InputViewModel.cs
index 54f278cec..f11d6e404 100644
--- a/src/Ryujinx/UI/ViewModels/Input/InputViewModel.cs
+++ b/src/Ryujinx/UI/ViewModels/Input/InputViewModel.cs
@@ -287,7 +287,7 @@ namespace Ryujinx.Ava.UI.ViewModels.Input
private void LoadConfiguration(InputConfig inputConfig = null)
{
- Config = inputConfig ?? ConfigurationState.Instance.Hid.InputConfig.Value.Find(inputConfig => inputConfig.PlayerIndex == _playerId);
+ Config = inputConfig ?? ConfigurationState.Instance.Hid.InputConfig.Value.FirstOrDefault(inputConfig => inputConfig.PlayerIndex == _playerId);
if (Config is StandardKeyboardInputConfig keyboardInputConfig)
{
@@ -597,7 +597,7 @@ namespace Ryujinx.Ava.UI.ViewModels.Input
}
else if (activeDevice.Type == DeviceType.Controller)
{
- bool isNintendoStyle = Devices.ToList().Find(x => x.Id == activeDevice.Id).Name.Contains("Nintendo");
+ bool isNintendoStyle = Devices.ToList().FirstOrDefault(x => x.Id == activeDevice.Id).Name.Contains("Nintendo");
string id = activeDevice.Id.Split(" ")[0];
@@ -823,11 +823,11 @@ namespace Ryujinx.Ava.UI.ViewModels.Input
newConfig.AddRange(ConfigurationState.Instance.Hid.InputConfig.Value);
- newConfig.Remove(newConfig.Find(x => x == null));
+ newConfig.Remove(newConfig.FirstOrDefault(x => x == null));
if (Device == 0)
{
- newConfig.Remove(newConfig.Find(x => x.PlayerIndex == this.PlayerId));
+ newConfig.Remove(newConfig.FirstOrDefault(x => x.PlayerIndex == this.PlayerId));
}
else
{
diff --git a/src/Ryujinx/UI/ViewModels/MainWindowViewModel.cs b/src/Ryujinx/UI/ViewModels/MainWindowViewModel.cs
index 0496b161e..283f9b9da 100644
--- a/src/Ryujinx/UI/ViewModels/MainWindowViewModel.cs
+++ b/src/Ryujinx/UI/ViewModels/MainWindowViewModel.cs
@@ -128,7 +128,7 @@ namespace Ryujinx.Ava.UI.ViewModels
public IEnumerable LastLdnGameData;
public static readonly Bitmap IconBitmap =
- new(Assembly.GetAssembly(typeof(ConfigurationState))!.GetManifestResourceStream("Ryujinx.UI.Common.Resources.Logo_Ryujinx.png")!);
+ new(Assembly.GetAssembly(typeof(ConfigurationState))!.GetManifestResourceStream("Ryujinx.UI.Common.Resources.Logo_Thiccjinx.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 c3d16529d..d9690e8ce 100644
--- a/src/Ryujinx/UI/Views/Main/MainMenuBarView.axaml
+++ b/src/Ryujinx/UI/Views/Main/MainMenuBarView.axaml
@@ -14,14 +14,14 @@
+ Source="resm:Ryujinx.UI.Common.Resources.Logo_Thiccjinx.png?assembly=Ryujinx.UI.Common" />