Author SHA1 Message Date
blackfa765andKeatonTheBot 03623b73ef Custom settings functionality
- Add custom audio settings

- Add Turbo Mode to CPU settings

- Fix custom settings invalidating global settings

- Migrate custom settings for SDL2 to SDL3

- Fix custom settings for Avalonia 12

- Disable title updates and DLC logging

Co-authored-by: KeatonTheBot <keaton@ryujinx.app>
2026-09-13 21:34:29 -05:00
GreemDev a0ad6f2246 misc: chore: add direct error code tuple to DisplayErrorAppletDialog
for use when i find the list of error codes -> causes
2026-09-13 21:24:52 -05:00
KeatonTheBot a412999eeb Fix Skip User Profiles
This and `Add the player select applet` fixes commit c9c78841b9.
2026-09-13 20:49:31 -05:00
JacobandGreemDev 87605ebce2 Add the player select applet
This introduces the somewhat completed version of the Player Select
Applet, allowing users to select either a user or a guest from the UI.
Note: Selecting the guest more then once currently does not work.

closes https://github.com/Ryubing/Ryujinx/issues/532

- misc: chore: optimize UserSelectorDialog closed handler

- misc: chore: Rename UserSelectorDialog to ProfileSelectorDialog

Co-authored-by: GreemDev <greemdev@ryujinx.app>
2026-09-13 20:48:20 -05:00
GreemDev b67e8df788 RenderDoc API support 2026-09-13 15:08:11 -05:00
78 changed files with 3560 additions and 356 deletions
+1
View File
@@ -21,6 +21,7 @@
<Project Path="src/Ryujinx.Graphics.Nvdec.Vp9/Ryujinx.Graphics.Nvdec.Vp9.csproj" /> <Project Path="src/Ryujinx.Graphics.Nvdec.Vp9/Ryujinx.Graphics.Nvdec.Vp9.csproj" />
<Project Path="src/Ryujinx.Graphics.Nvdec/Ryujinx.Graphics.Nvdec.csproj" /> <Project Path="src/Ryujinx.Graphics.Nvdec/Ryujinx.Graphics.Nvdec.csproj" />
<Project Path="src/Ryujinx.Graphics.OpenGL/Ryujinx.Graphics.OpenGL.csproj" /> <Project Path="src/Ryujinx.Graphics.OpenGL/Ryujinx.Graphics.OpenGL.csproj" />
<Project Path="src/Ryujinx.Graphics.RenderDocApi/Ryujinx.Graphics.RenderDocApi.csproj" />
<Project Path="src/Ryujinx.Graphics.Shader/Ryujinx.Graphics.Shader.csproj" /> <Project Path="src/Ryujinx.Graphics.Shader/Ryujinx.Graphics.Shader.csproj" />
<Project Path="src/Ryujinx.Graphics.Texture/Ryujinx.Graphics.Texture.csproj" /> <Project Path="src/Ryujinx.Graphics.Texture/Ryujinx.Graphics.Texture.csproj" />
<Project Path="src/Ryujinx.Graphics.Vic/Ryujinx.Graphics.Vic.csproj" /> <Project Path="src/Ryujinx.Graphics.Vic/Ryujinx.Graphics.Vic.csproj" />
@@ -0,0 +1,12 @@
using System;
namespace Ryujinx.Graphics.RenderDocApi
{
public readonly record struct Capture(int Index, string FileName, DateTime Timestamp)
{
public void SetComments(string comments)
{
RenderDoc.SetCaptureFileComments(FileName, comments);
}
}
}
@@ -0,0 +1,100 @@
// ReSharper disable UnusedMember.Global
namespace Ryujinx.Graphics.RenderDocApi
{
public enum CaptureOption
{
/// <summary>
/// specifies whether the application is allowed to enable vsync. Default is on.
/// </summary>
AllowVsync = 0,
/// <summary>
/// specifies whether the application is allowed to enter exclusive fullscreen. Default is on.
/// </summary>
AllowFullscreen = 1,
/// <summary>
/// specifies whether (where possible) API-specific debugging is enabled. Default is off.
/// </summary>
ApiValidation = 2,
/// <summary>
/// specifies whether each API call should save a callstack. Default is off.
/// </summary>
CaptureCallstacks = 3,
/// <summary>
/// specifies whether, if <see cref="CaptureCallstacks"/> is enabled, callstacks are only saved on actions. Default is off.
/// </summary>
CaptureCallstacksOnlyDraws = 4,
/// <summary>
/// specifies a delay in seconds after launching a process to pause, to allow debuggers to attach. <br/>
/// This will only apply to child processes since the delay happens at process startup. Default is 0.
/// </summary>
DelayForDebugger = 5,
/// <summary>
/// specifies whether any mapped memory updates should be bounds-checked for overruns,
/// and uninitialised buffers are initialized to <code>0xDDDDDDDD</code> to catch use of uninitialised data.
/// Only supported on D3D11 and OpenGL. Default is off.
/// </summary>
/// <remarks>
/// This option is only valid for OpenGL and D3D11. Explicit APIs such as D3D12 and Vulkan do
/// not do the same kind of interception &amp; checking, and undefined contents are really undefined.
/// </remarks>
VerifyBufferAccess = 6,
/// <summary>
/// Hooks any system API calls that create child processes, and injects
/// RenderDoc into them recursively with the same options.
/// </summary>
HookIntoChildren = 7,
/// <summary>
/// specifies whether all live resources at the time of capture should be included in the capture,
/// even if they are not referenced by the frame. Default is off.
/// </summary>
RefAllSources = 8,
/// <summary>
/// By default, RenderDoc skips saving initial states for resources where the
/// previous contents don't appear to be used, assuming that writes before
/// reads indicate previous contents aren't used.
/// </summary>
/// <remarks>
/// **NOTE**: As of RenderDoc v1.1 this option has been deprecated. Setting or
/// getting it will be ignored, to allow compatibility with older versions.
/// In v1.1 the option acts as if it's always enabled.
/// </remarks>
SaveAllInitials = 9,
/// <summary>
/// In APIs that allow for the recording of command lists to be replayed later,
/// RenderDoc may choose to not capture command lists before a frame capture is
/// triggered, to reduce overheads. This means any command lists recorded once
/// and replayed many times will not be available and may cause a failure to
/// capture.
/// </summary>
/// <remarks>
/// NOTE: This is only true for APIs where multithreading is difficult or
/// discouraged. Newer APIs like Vulkan and D3D12 will ignore this option
/// and always capture all command lists since the API is heavily oriented
/// around it and the overheads have been reduced by API design.
/// </remarks>
CaptureAllCmdLists = 10,
/// <summary>
/// Mute API debugging output when the <see cref="ApiValidation"/> option is enabled.
/// </summary>
DebugOutputMute = 11,
/// <summary>
/// Allow vendor extensions to be used even when they may be
/// incompatible with RenderDoc and cause corrupted replays or crashes.
/// </summary>
AllowUnsupportedVendorExtensions = 12,
/// <summary>
/// Define a soft memory limit which some APIs may aim to keep overhead under where
/// possible. Anything above this limit will where possible be saved directly to disk during
/// capture.<br/>
/// This will cause increased disk space use (which may cause a capture to fail if disk space is
/// exhausted) as well as slower capture times.
/// <br/><br/>
/// Not all memory allocations may be deferred like this so it is not a guarantee of a memory
/// limit.
/// <br/><br/>
/// Units are in MBs, suggested values would range from 200MB to 1000MB.
/// </summary>
SoftMemoryLimit = 13,
}
}
@@ -0,0 +1,83 @@
// ReSharper disable UnusedMember.Global
namespace Ryujinx.Graphics.RenderDocApi
{
public enum InputButton
{
// '0' - '9' matches ASCII values
Key0 = 0x30,
Key1 = 0x31,
Key2 = 0x32,
Key3 = 0x33,
Key4 = 0x34,
Key5 = 0x35,
Key6 = 0x36,
Key7 = 0x37,
Key8 = 0x38,
Key9 = 0x39,
// 'A' - 'Z' matches ASCII values
A = 0x41,
B = 0x42,
C = 0x43,
D = 0x44,
E = 0x45,
F = 0x46,
G = 0x47,
H = 0x48,
I = 0x49,
J = 0x4A,
K = 0x4B,
L = 0x4C,
M = 0x4D,
N = 0x4E,
O = 0x4F,
P = 0x50,
Q = 0x51,
R = 0x52,
S = 0x53,
T = 0x54,
U = 0x55,
V = 0x56,
W = 0x57,
X = 0x58,
Y = 0x59,
Z = 0x5A,
// leave the rest of the ASCII range free
// in case we want to use it later
NonPrintable = 0x100,
Divide,
Multiply,
Subtract,
Plus,
F1,
F2,
F3,
F4,
F5,
F6,
F7,
F8,
F9,
F10,
F11,
F12,
Home,
End,
Insert,
Delete,
PageUp,
PageDn,
Backspace,
Tab,
PrtScrn,
Pause,
Max,
}
}
@@ -0,0 +1,39 @@
// ReSharper disable UnusedMember.Global
using System;
namespace Ryujinx.Graphics.RenderDocApi
{
[Flags]
public enum OverlayBits
{
/// <summary>
/// This single bit controls whether the overlay is enabled or disabled globally
/// </summary>
Enabled = 1 << 0,
/// <summary>
/// Show the average framerate over several seconds as well as min/max
/// </summary>
FrameRate = 1 << 1,
/// <summary>
/// Show the current frame number
/// </summary>
FrameNumber = 1 << 2,
/// <summary>
/// Show a list of recent captures, and how many captures have been made
/// </summary>
CaptureList = 1 << 3,
/// <summary>
/// Default values for the overlay mask
/// </summary>
Default = Enabled | FrameRate | FrameNumber | CaptureList,
/// <summary>
/// Enable all bits
/// </summary>
All = ~0,
/// <summary>
/// Disable all bits
/// </summary>
None = 0
}
}
@@ -0,0 +1,5 @@
# Ryujinx.Graphics.RenderDocApi
This is a C# binding for RenderDoc's application API.
This is a source-inclusion of https://github.com/utkumaden/RenderdocSharp.
I didn't use the NuGet package as I had a few minor changes I wanted to make, and I want to learn from it as well via hands-on experience.
@@ -0,0 +1,639 @@
using System;
using System.Collections.Immutable;
using System.Diagnostics;
using System.Diagnostics.CodeAnalysis;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
using System.Text;
using System.Text.RegularExpressions;
namespace Ryujinx.Graphics.RenderDocApi
{
public static unsafe partial class RenderDoc
{
/// <summary>
/// True if the API is available.
/// </summary>
public static bool IsAvailable => Api != null;
/// <summary>
/// Set the minimum version of the API you require.
/// </summary>
/// <remarks>Set this before you do anything else with the RenderDoc API, including <see cref="IsAvailable"/>.</remarks>
public static RenderDocVersion MinimumRequired { get; set; } = RenderDocVersion.Version_1_0_0;
/// <summary>
/// Set to true to assert versions.
/// </summary>
public static bool AssertVersionEnabled { get; set; } = true;
/// <summary>
/// Version of the API available.
/// </summary>
[MemberNotNullWhen(true, nameof(IsAvailable))]
public static Version? Version
{
get
{
if (!IsAvailable)
return null;
int major, minor, build;
Api->GetApiVersion(&major, &minor, &build);
return new Version(major, minor, build);
}
}
/// <summary>
/// The current mask which determines what sections of the overlay render on each window.
/// </summary>
[RenderDocApiVersion(1, 0)]
public static OverlayBits OverlayBits
{
get => Api->GetOverlayBits();
set
{
Api->MaskOverlayBits(~value, value);
}
}
/// <summary>
/// The template for new captures.<br/>
/// The template can either be a relative or absolute path, which determines where captures will be saved and how they will be named.
/// If the path template is 'my_captures/example', then captures saved will be e.g.
/// 'my_captures/example_frame123.rdc' and 'my_captures/example_frame456.rdc'.<br/>
/// Relative paths will be saved relative to the process’s current working directory.<br/>
/// </summary>
/// <remarks>The default template is in a folder controlled by the UI - initially the system temporary folder, and the filename is the executable’s filename.</remarks>
[RenderDocApiVersion(1, 0)]
public static string CaptureFilePathTemplate
{
get
{
byte* ptr = Api->GetCaptureFilePathTemplate();
return Marshal.PtrToStringUTF8((nint)ptr)!;
}
set
{
fixed (byte* ptr = value.ToNullTerminatedByteArray())
{
Api->SetCaptureFilePathTemplate(ptr);
}
}
}
/// <summary>
/// The amount of frame captures that have been made.
/// </summary>
[RenderDocApiVersion(1, 0)]
public static int CaptureCount => Api->GetNumCaptures();
/// <summary>
/// Checks if the RenderDoc UI is currently connected to this process.
/// </summary>
[RenderDocApiVersion(1, 0)]
public static bool IsTargetControlConnected => Api is not null && Api->IsTargetControlConnected() != 0;
/// <summary>
/// Checks if the current frame is capturing.
/// </summary>
[RenderDocApiVersion(1, 0)]
public static bool IsFrameCapturing => Api is not null && Api->IsFrameCapturing() != 0;
/// <summary>
/// Set one of the options for tweaking some behaviors of capturing.
/// </summary>
/// <param name="option">specifies which capture option should be set.</param>
/// <param name="integer">the unsigned integer value to set for the option.</param>
/// <remarks>Note that each option only takes effect from after it is set - so it is advised to set these options as early as possible, ideally before any graphics API has been initialized.</remarks>
/// <returns>
/// true, if the <paramref name="option"/> is valid, and the value set on the option is within valid ranges.<br/>
/// false, if the option is not a <see cref="CaptureOption"/>, or the value is not valid for the option.
/// </returns>
[RenderDocApiVersion(1, 0)]
public static bool SetCaptureOption(CaptureOption option, uint integer)
{
return Api is not null && Api->SetCaptureOptionU32(option, integer) != 0;
}
/// <summary>
/// Set one of the options for tweaking some behaviors of capturing.
/// </summary>
/// <param name="option">specifies which capture option should be set.</param>
/// <param name="boolean">the value to set for the option, converted to a 0 or 1 before setting.</param>
/// <remarks>Note that each option only takes effect from after it is set - so it is advised to set these options as early as possible, ideally before any graphics API has been initialized.</remarks>
/// <returns>
/// true, if the <paramref name="option"/> is valid, and the value set on the option is within valid ranges.<br/>
/// false, if the option is not a <see cref="CaptureOption"/>, or the value is not valid for the option.
/// </returns>
[RenderDocApiVersion(1, 0)]
public static bool SetCaptureOption(CaptureOption option, bool boolean)
=> SetCaptureOption(option, boolean ? 1 : 0);
/// <summary>
/// Set one of the options for tweaking some behaviors of capturing.
/// </summary>
/// <param name="option">specifies which capture option should be set.</param>
/// <param name="single">the floating point value to set for the option.</param>
/// <remarks>Note that each option only takes effect from after it is set - so it is advised to set these options as early as possible, ideally before any graphics API has been initialized.</remarks>
/// <returns>
/// true, if the <paramref name="option"/> is valid, and the value set on the option is within valid ranges.<br/>
/// false, if the option is not a <see cref="CaptureOption"/>, or the value is not valid for the option.
/// </returns>
[RenderDocApiVersion(1, 0)]
public static bool SetCaptureOption(CaptureOption option, float single)
{
return Api is not null && Api->SetCaptureOptionF32(option, single) != 0;
}
/// <summary>
/// Gets the current value of one of the different options in <see cref="CaptureOption"/>, writing it to an out parameter.
/// </summary>
/// <param name="option">specifies which capture option should be retrieved.</param>
/// <param name="integer">the value of the capture option, if the option is a valid <see cref="CaptureOption"/> enum. Otherwise, <see cref="int.MaxValue"/>.</param>
[RenderDocApiVersion(1, 0)]
public static void GetCaptureOption(CaptureOption option, out uint integer)
{
integer = Api->GetCaptureOptionU32(option);
}
/// <summary>
/// Gets the current value of one of the different options in <see cref="CaptureOption"/>, writing it to an out parameter.
/// </summary>
/// <param name="option">specifies which capture option should be retrieved.</param>
/// <param name="single">the value of the capture option, if the option is a valid <see cref="CaptureOption"/> enum. Otherwise, -<see cref="float.MaxValue"/>.</param>
[RenderDocApiVersion(1, 0)]
public static void GetCaptureOption(CaptureOption option, out float single)
{
single = Api->GetCaptureOptionF32(option);
}
/// <summary>
/// Gets the current value of one of the different options in <see cref="CaptureOption"/>,
/// converted to a boolean.
/// </summary>
/// <param name="option">specifies which capture option should be retrieved.</param>
/// <returns>
/// the value of the capture option, converted to bool, if the option is a valid <see cref="CaptureOption"/> enum.
/// Otherwise, returns null.
/// </returns>
[RenderDocApiVersion(1, 0)]
public static bool? GetCaptureOptionBool(CaptureOption option)
{
if (Api is null) return false;
uint returnVal = GetCaptureOptionU32(option);
if (returnVal == uint.MaxValue)
return null;
return returnVal is not 0;
}
/// <summary>
/// Gets the current value of one of the different options in <see cref="CaptureOption"/>.
/// </summary>
/// <param name="option">specifies which capture option should be retrieved.</param>
/// <returns>
/// the value of the capture option, if the option is a valid <see cref="CaptureOption"/> enum.
/// Otherwise, returns <see cref="int.MaxValue"/>.
/// </returns>
[RenderDocApiVersion(1, 0)]
public static uint GetCaptureOptionU32(CaptureOption option) => Api->GetCaptureOptionU32(option);
/// <summary>
/// Gets the current value of one of the different options in <see cref="CaptureOption"/>.
/// </summary>
/// <param name="option">specifies which capture option should be retrieved.</param>
/// <returns>
/// the value of the capture option, if the option is a valid <see cref="CaptureOption"/> enum.
/// Otherwise, returns -<see cref="float.MaxValue"/>.
/// </returns>
[RenderDocApiVersion(1, 0)]
public static float GetCaptureOptionF32(CaptureOption option) => Api->GetCaptureOptionF32(option);
/// <summary>
/// Changes the key bindings in-application for changing the focussed window.
/// </summary>
/// <param name="buttons">lists the keys to bind.</param>
[RenderDocApiVersion(1, 0)]
public static void SetFocusToggleKeys(ReadOnlySpan<InputButton> buttons)
{
if (Api is null) return;
fixed (InputButton* ptr = buttons)
{
Api->SetFocusToggleKeys(ptr, buttons.Length);
}
}
/// <summary>
/// Changes the key bindings in-application for triggering a capture on the current window.
/// </summary>
/// <param name="buttons">lists the keys to bind.</param>
[RenderDocApiVersion(1, 0)]
public static void SetCaptureKeys(ReadOnlySpan<InputButton> buttons)
{
if (Api is null) return;
fixed (InputButton* ptr = buttons)
{
Api->SetCaptureKeys(ptr, buttons.Length);
}
}
/// <summary>
/// Attempts to remove RenderDoc and its hooks from the target process.<br/>
/// It must be called as early as possible in the process, and will have undefined results
/// if any graphics API functions have been called.
/// </summary>
[RenderDocApiVersion(1, 0)]
public static void RemoveHooks()
{
if (Api is null) return;
Api->RemoveHooks();
}
/// <summary>
/// Remove RenderDoc’s crash handler from the target process.<br/>
/// If you have your own crash handler that you want to handle any exceptions,
/// RenderDoc’s handler could interfere; so it can be disabled.
/// </summary>
[RenderDocApiVersion(1, 0)]
public static void UnloadCrashHandler()
{
if (Api is null) return;
Api->UnloadCrashHandler();
}
/// <summary>
/// Trigger a capture as if the user had pressed one of the capture hotkeys.<br/>
/// The capture will be taken from the next frame presented to whichever window is considered current.
/// </summary>
[RenderDocApiVersion(1, 0)]
public static void TriggerCapture()
{
if (Api is null) return;
Api->TriggerCapture();
}
/// <summary>
/// Gets the details of all frame capture in the current session.
/// This simply calls <see cref="GetCapture"/> for each index available as specified by <see cref="CaptureCount"/>.
/// </summary>
/// <returns>An immutable array of structs representing RenderDoc Captures.</returns>
public static ImmutableArray<Capture> GetCaptures()
{
if (Api is null) return [];
int captureCount = CaptureCount;
if (captureCount is 0) return [];
ImmutableArray<Capture>.Builder captures = ImmutableArray.CreateBuilder<Capture>(captureCount);
for (int captureIndex = 0; captureIndex < captureCount; captureIndex++)
{
if (GetCapture(captureIndex) is { } capture)
captures.Add(capture);
}
return captures.DrainToImmutable();
}
/// <summary>
/// Gets the details of a particular frame capture, as specified by an index from 0 to <see cref="CaptureCount"/> - 1.
/// </summary>
/// <param name="index">specifies which capture to return the details of. Must be less than the value returned by <see cref="CaptureCount"/>.</param>
/// <returns>A struct representing a RenderDoc Capture.</returns>
[RenderDocApiVersion(1, 0)]
public static Capture? GetCapture(int index)
{
if (Api is null) return null;
int length = 0;
if (Api->GetCapture(index, null, &length, null) == 0)
{
return null;
}
Span<byte> bytes = stackalloc byte[length + 1];
long timestamp;
fixed (byte* ptr = bytes)
Api->GetCapture(index, ptr, &length, &timestamp);
string fileName = Encoding.UTF8.GetString(bytes[length..]);
return new Capture(index, fileName, DateTimeOffset.FromUnixTimeSeconds(timestamp).DateTime);
}
/// <summary>
/// Determine the closest matching replay UI executable for the current RenderDoc module, and launch it.
/// </summary>
/// <param name="connectTargetControl">if the UI should immediately connect to the application.</param>
/// <param name="commandLine">string to be appended to the command line, e.g. a capture filename. If this parameter is null, the command line will be unmodified.</param>
/// <returns>true if the UI was successfully launched; false otherwise.</returns>
[RenderDocApiVersion(1, 0)]
public static bool LaunchReplayUI(bool connectTargetControl, string? commandLine = null)
{
if (Api is null) return false;
if (commandLine == null)
{
return Api->LaunchReplayUI(connectTargetControl ? 1u : 0u, null) != 0;
}
fixed (byte* ptr = commandLine.ToNullTerminatedByteArray())
{
return Api->LaunchReplayUI(connectTargetControl ? 1u : 0u, ptr) != 0;
}
}
/// <summary>
/// Explicitly sets which window is considered active.<br/>
/// The active window is the one that will be captured when the keybind to trigger a capture is pressed.
/// </summary>
/// <param name="hDevice">a handle to the API ‘device’ object that will be set active. Must be valid.</param>
/// <param name="hWindow">a handle to the platform window handle that will be set active. Must be valid.</param>
[RenderDocApiVersion(1, 0)]
public static void SetActiveWindow(nint hDevice, nint hWindow)
{
if (Api is null) return;
Api->SetActiveWindow((void*)hDevice, (void*)hWindow);
}
/// <summary>
/// Immediately begin a capture for the specified device/window combination.
/// </summary>
/// <param name="hDevice">a handle to the API ‘device’ object that will be set active. May be <see cref="nint.Zero"/> to wildcard match.</param>
/// <param name="hWindow">a handle to the platform window handle that will be set active. May be <see cref="nint.Zero"/> to wildcard match.</param>
[RenderDocApiVersion(1, 0)]
public static void StartFrameCapture(nint hDevice, nint hWindow)
{
if (Api is null) return;
Api->StartFrameCapture((void*)hDevice, (void*)hWindow);
}
/// <summary>
/// Immediately end an active capture for the specified device/window combination.
/// </summary>
/// <param name="hDevice">a handle to the API ‘device’ object that will be set active. May be <see cref="nint.Zero"/> to wildcard match.</param>
/// <param name="hWindow">a handle to the platform window handle that will be set active. May be <see cref="nint.Zero"/> to wildcard match.</param>
/// <returns>true if the capture succeeded; false otherwise.</returns>
[RenderDocApiVersion(1, 0)]
public static bool EndFrameCapture(nint hDevice, nint hWindow)
{
if (Api is null) return false;
return Api->EndFrameCapture((void*)hDevice, (void*)hWindow) != 0;
}
/// <summary>
/// Trigger multiple sequential frame captures as if the user had pressed one of the capture hotkeys before each frame.<br/>
/// The captures will be taken from the next frames presented to whichever window is considered current.<br/>
/// Each capture will be taken independently and saved to a separate file, with no reference to the other frames.
/// </summary>
/// <param name="numFrames">the number of frames to capture.</param>
/// <remarks>Requires RenderDoc API version 1.1</remarks>
[RenderDocApiVersion(1, 1)]
public static void TriggerMultiFrameCapture(uint numFrames)
{
if (Api is null) return;
AssertAtLeast(1, 1);
Api->TriggerMultiFrameCapture(numFrames);
}
/// <summary>
/// Adds an arbitrary comments field to the most recent capture,
/// which will then be displayed in the UI to anyone opening the capture.
/// <br/><br/>
/// This is equivalent to calling <see cref="SetCaptureFileComments"/> with a null first (fileName) parameter.
/// </summary>
/// <param name="comments">the comments to set in the capture file.</param>
/// <remarks>Requires RenderDoc API version 1.2</remarks>
public static void SetMostRecentCaptureFileComments(string comments)
{
if (Api is null) return;
AssertAtLeast(1, 2);
byte[] commentBytes = comments.ToNullTerminatedByteArray();
fixed (byte* pcomment = commentBytes)
{
Api->SetCaptureFileComments((byte*)nint.Zero, pcomment);
}
}
/// <summary>
/// Adds an arbitrary comments field to an existing capture on disk,
/// which will then be displayed in the UI to anyone opening the capture.
/// </summary>
/// <param name="fileName">the path to the capture file to set comments in. If this path is null or an empty string, the most recent capture file that has been created will be used.</param>
/// <param name="comments">the comments to set in the capture file.</param>
/// <remarks>Requires RenderDoc API version 1.2</remarks>
[RenderDocApiVersion(1, 2)]
public static void SetCaptureFileComments(string? fileName, string comments)
{
if (Api is null) return;
AssertAtLeast(1, 2);
byte[] commentBytes = comments.ToNullTerminatedByteArray();
fixed (byte* pcomment = commentBytes)
{
if (fileName is null)
{
Api->SetCaptureFileComments((byte*)nint.Zero, pcomment);
}
else
{
byte[] fileBytes = fileName.ToNullTerminatedByteArray();
fixed (byte* pfile = fileBytes)
{
Api->SetCaptureFileComments(pfile, pcomment);
}
}
}
}
/// <summary>
/// Similar to <see cref="EndFrameCapture"/>, but the capture contents will be discarded immediately, and not processed and written to disk.<br/>
/// This will be more efficient than <see cref="EndFrameCapture"/> if the frame capture is not needed.
/// </summary>
/// <param name="hDevice">a handle to the API ‘device’ object that will be set active. May be <see cref="nint.Zero"/> to wildcard match.</param>
/// <param name="hWindow">a handle to the platform window handle that will be set active. May be <see cref="nint.Zero"/> to wildcard match.</param>
/// <returns>true if the capture was discarded; false if there was an error or no capture was in progress.</returns>
/// <remarks>Requires RenderDoc API version 1.4</remarks>
[RenderDocApiVersion(1, 4)]
public static bool DiscardFrameCapture(nint hDevice, nint hWindow)
{
if (Api is null) return false;
AssertAtLeast(1, 4);
return Api->DiscardFrameCapture((void*)hDevice, (void*)hWindow) != 0;
}
/// <summary>
/// Requests that the currently connected replay UI raise its window to the top.<br/>
/// This is only possible if an instance of the replay UI is currently connected, otherwise this method does nothing.<br/>
/// This can be used in conjunction with <see cref="IsTargetControlConnected"/> and <see cref="LaunchReplayUI"/>,<br/> to intelligently handle showing the UI after making a capture.<br/><br/>
/// Given OS differences, it is not guaranteed that the UI will be successfully raised even if the request is passed on.<br/>
/// On some systems it may only be highlighted or otherwise indicated to the user.
/// </summary>
/// <returns>true if the request was passed onto the UI successfully; false if there is no UI connected or some other error occurred.</returns>
/// <remarks>Requires RenderDoc API version 1.5</remarks>
[RenderDocApiVersion(1, 5)]
public static bool ShowReplayUI()
{
if (Api is null) return false;
AssertAtLeast(1, 5);
return Api->ShowReplayUI() != 0;
}
/// <summary>
/// Sets a given title for the currently in-progress capture, which will be displayed in the UI.<br/>
/// This can be used either with a user-defined capture using a manual start and end,
/// or an automatic capture triggered by <see cref="TriggerCapture"/> or a keypress.<br/>
/// If multiple captures are ongoing at once, the title will be applied to the first capture to end only.<br/>
/// Any subsequent captures will not get any title unless the function is called again.
/// This function can only be called while a capture is in-progress,
/// after <see cref="StartFrameCapture"/> and before <see cref="EndFrameCapture"/>.<br/>
/// If it is called elsewhere it will have no effect.
/// If it is called multiple times within a capture, only the last title will have any effect.
/// </summary>
/// <param name="title">The title to set for the in-progress capture.</param>
/// <remarks>Requires RenderDoc API version 1.6</remarks>
[RenderDocApiVersion(1, 6)]
public static void SetCaptureTitle(string title)
{
if (Api is null) return;
AssertAtLeast(1, 6);
fixed (byte* ptr = title.ToNullTerminatedByteArray())
Api->SetCaptureTitle(ptr);
}
#region Dynamic Library loading
/// <summary>
/// Reload the internal RenderDoc API structure. Useful for manually refreshing <see cref="Api"/> while using process injection.
/// </summary>
/// <param name="ignoreAlreadyLoaded">Ignores the existing API function structure and overwrites it with a re-request.</param>
/// <param name="requiredVersion">The version of the RenderDoc API required by your application.</param>
public static void ReloadApi(bool ignoreAlreadyLoaded = false, RenderDocVersion? requiredVersion = null)
{
if (_loaded && !ignoreAlreadyLoaded)
return;
lock (typeof(RenderDoc))
{
// Prevent double loads.
if (_loaded && !ignoreAlreadyLoaded)
return;
if (requiredVersion.HasValue)
MinimumRequired = requiredVersion.Value;
_loaded = true;
_api = GetApi(MinimumRequired);
if (_api != null)
AssertAtLeast(MinimumRequired);
}
}
private static RenderDocApi* _api = null;
private static bool _loaded;
private static RenderDocApi* Api
{
get
{
ReloadApi();
return _api;
}
}
private static readonly Regex _dynamicLibraryPattern = RenderDocApiDynamicLibraryRegex();
private static RenderDocApi* GetApi(RenderDocVersion minimumRequired = RenderDocVersion.Version_1_0_0)
{
foreach (ProcessModule module in Process.GetCurrentProcess().Modules)
{
string moduleName = module.FileName ?? string.Empty;
if (!_dynamicLibraryPattern.IsMatch(moduleName))
continue;
if (!NativeLibrary.TryLoad(moduleName, out nint moduleHandle))
return null;
if (!NativeLibrary.TryGetExport(moduleHandle, "RENDERDOC_GetAPI", out nint procAddress))
return null;
var RENDERDOC_GetApi = (delegate* unmanaged[Cdecl]<RenderDocVersion, RenderDocApi**, int>)procAddress;
RenderDocApi* api;
return RENDERDOC_GetApi(minimumRequired, &api) != 0 ? api : null;
}
return null;
}
private static void AssertAtLeast(RenderDocVersion rdv, [CallerMemberName] string callee = "")
{
Version ver = rdv.SystemVersion;
AssertAtLeast(ver.Major, ver.Minor, ver.Build, callee);
}
private static void AssertAtLeast(int major, int minor, int patch = 0, [CallerMemberName] string callee = "")
{
if (!AssertVersionEnabled)
return;
if (Version!.Major < major)
goto fail;
if (Version.Major > major)
goto success;
if (Version.Minor < minor)
goto fail;
if (Version.Minor > minor)
goto success;
if (Version.Build < patch)
goto fail;
success:
return;
fail:
Version minVersion =
typeof(RenderDoc).GetMethod(callee)!.GetCustomAttribute<RenderDocApiVersionAttribute>()!.MinVersion;
throw new NotSupportedException(
$"This API was introduced in RenderDoc API {minVersion}. Current API version is {Version}.");
}
private static byte[] ToNullTerminatedByteArray(this string str, Encoding? encoding = null)
{
encoding ??= Encoding.UTF8;
return encoding.GetBytes(str + '\0');
}
[GeneratedRegex(@"(lib)?renderdoc(\.dll|\.so|\.dylib)(\.\d+)?",
RegexOptions.IgnoreCase | RegexOptions.CultureInvariant)]
private static partial Regex RenderDocApiDynamicLibraryRegex();
#endregion
}
}
@@ -0,0 +1,51 @@
namespace Ryujinx.Graphics.RenderDocApi
{
#pragma warning disable CS0649
internal unsafe struct RenderDocApi
{
public delegate* unmanaged[Cdecl]<int*, int*, int*, void> GetApiVersion;
public delegate* unmanaged[Cdecl]<CaptureOption, uint, int> SetCaptureOptionU32;
public delegate* unmanaged[Cdecl]<CaptureOption, float, int> SetCaptureOptionF32;
public delegate* unmanaged[Cdecl]<CaptureOption, uint> GetCaptureOptionU32;
public delegate* unmanaged[Cdecl]<CaptureOption, float> GetCaptureOptionF32;
public delegate* unmanaged[Cdecl]<InputButton*, int, void> SetFocusToggleKeys;
public delegate* unmanaged[Cdecl]<InputButton*, int, void> SetCaptureKeys;
public delegate* unmanaged[Cdecl]<OverlayBits> GetOverlayBits;
public delegate* unmanaged[Cdecl]<OverlayBits, OverlayBits, void> MaskOverlayBits;
public delegate* unmanaged[Cdecl]<void> RemoveHooks;
public delegate* unmanaged[Cdecl]<void> UnloadCrashHandler;
public delegate* unmanaged[Cdecl]<byte*, void> SetCaptureFilePathTemplate;
public delegate* unmanaged[Cdecl]<byte*> GetCaptureFilePathTemplate;
public delegate* unmanaged[Cdecl]<int> GetNumCaptures;
public delegate* unmanaged[Cdecl]<int, byte*, int*, long*, uint> GetCapture;
public delegate* unmanaged[Cdecl]<void> TriggerCapture;
public delegate* unmanaged[Cdecl]<uint> IsTargetControlConnected;
public delegate* unmanaged[Cdecl]<uint, byte*, uint> LaunchReplayUI;
public delegate* unmanaged[Cdecl]<void*, void*, void> SetActiveWindow;
public delegate* unmanaged[Cdecl]<void*, void*, void> StartFrameCapture;
public delegate* unmanaged[Cdecl]<uint> IsFrameCapturing;
public delegate* unmanaged[Cdecl]<void*, void*, uint> EndFrameCapture;
// 1.1
public delegate* unmanaged[Cdecl]<uint, void> TriggerMultiFrameCapture;
// 1.2
public delegate* unmanaged[Cdecl]<byte*, byte*, void> SetCaptureFileComments;
// 1.3
public delegate* unmanaged[Cdecl]<void*, void*, uint> DiscardFrameCapture;
// 1.5
public delegate* unmanaged[Cdecl]<uint> ShowReplayUI;
// 1.6
public delegate* unmanaged[Cdecl]<byte*, void> SetCaptureTitle;
}
#pragma warning restore CS0649
}
@@ -0,0 +1,16 @@
using System;
namespace Ryujinx.Graphics.RenderDocApi
{
[AttributeUsage(AttributeTargets.Method | AttributeTargets.Property)]
public sealed class RenderDocApiVersionAttribute : Attribute
{
public Version MinVersion { get; }
public RenderDocApiVersionAttribute(int major, int minor, int patch = 0)
{
MinVersion = new Version(major, minor, patch);
}
}
}
@@ -0,0 +1,47 @@
using System;
namespace Ryujinx.Graphics.RenderDocApi
{
public enum RenderDocVersion
{
Version_1_0_0 = 10000,
Version_1_0_1 = 10001,
Version_1_0_2 = 10002,
Version_1_1_0 = 10100,
Version_1_1_1 = 10101,
Version_1_1_2 = 10102,
Version_1_2_0 = 10200,
Version_1_3_0 = 10300,
Version_1_4_0 = 10400,
Version_1_4_1 = 10401,
Version_1_4_2 = 10402,
Version_1_5_0 = 10500,
Version_1_6_0 = 10600,
}
public static partial class Helpers
{
extension(RenderDocVersion rdv)
{
public Version SystemVersion
{
get
{
int i = (int)rdv;
return new (i / 10000, (i % 10000) / 100, i % 100);
}
}
}
extension(Version sv)
{
public RenderDocVersion RenderDocVersion
{
get
{
return (RenderDocVersion)(sv.Major * 10000 + sv.Minor * 100 + sv.Build);
}
}
}
}
}
@@ -0,0 +1,9 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>net10.0</TargetFramework>
<ImplicitUsings>disable</ImplicitUsings>
<Nullable>enable</Nullable>
<AllowUnsafeBlocks>true</AllowUnsafeBlocks>
</PropertyGroup>
</Project>
+32
View File
@@ -0,0 +1,32 @@
using Silk.NET.Vulkan;
using System.Runtime.CompilerServices;
namespace Ryujinx.Graphics.Vulkan
{
public static class Helpers
{
extension(Vk api)
{
/// <summary>
/// C# implementation of the RENDERDOC_DEVICEPOINTER_FROM_VKINSTANCE macro from the RenderDoc API header, since we cannot use macros from C#.
/// </summary>
/// <returns>The dispatch table pointer, which sits as the first pointer-sized object in the memory pointed to by the <see cref="Vk"/>'s <see cref="Instance"/> pointer.</returns>
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public unsafe void* GetRenderDocDevicePointer() =>
api.CurrentInstance is not null
? api.CurrentInstance.Value.GetRenderDocDevicePointer()
: null;
}
extension(Instance instance)
{
/// <summary>
/// C# implementation of the RENDERDOC_DEVICEPOINTER_FROM_VKINSTANCE macro from the RenderDoc API header, since we cannot use macros from C#.
/// </summary>
/// <returns>The dispatch table pointer, which sits as the first pointer-sized object in the memory pointed to by the <see cref="Instance"/>'s pointer.</returns>
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public unsafe void* GetRenderDocDevicePointer()
=> (*((void**)(instance.Handle)));
}
}
}
@@ -166,13 +166,15 @@ namespace Ryujinx.HLE.HOS.Applets.Error
string[] buttons = GetButtonsText(module, description, "DlgBtn"); string[] buttons = GetButtonsText(module, description, "DlgBtn");
bool showDetails = _horizon.Device.UIHandler.DisplayErrorAppletDialog($"Error Code: {module}-{description:0000}", "\n" + message, buttons); (uint Module, uint Description) errorCodeTuple = (module, uint.Parse(description.ToString("0000")));
bool showDetails = _horizon.Device.UIHandler.DisplayErrorAppletDialog($"Error Code: {module}-{description:0000}", "\n" + message, buttons, errorCodeTuple);
if (showDetails) if (showDetails)
{ {
message = GetMessageText(module, description, "FlvMsg"); message = GetMessageText(module, description, "FlvMsg");
buttons = GetButtonsText(module, description, "FlvBtn"); buttons = GetButtonsText(module, description, "FlvBtn");
_horizon.Device.UIHandler.DisplayErrorAppletDialog($"Details: {module}-{description:0000}", "\n" + message, buttons); _horizon.Device.UIHandler.DisplayErrorAppletDialog($"Details: {module}-{description:0000}", "\n" + message, buttons, errorCodeTuple);
} }
} }
@@ -27,9 +27,19 @@ namespace Ryujinx.HLE.HOS.Applets
_normalSession = normalSession; _normalSession = normalSession;
_interactiveSession = interactiveSession; _interactiveSession = interactiveSession;
// TODO(jduncanator): Parse PlayerSelectConfig from input data UserProfile selected = _system.Device.UIHandler.ShowPlayerSelectDialog();
if (selected == null)
{
_normalSession.Push(BuildResponse()); _normalSession.Push(BuildResponse());
}
else if (selected.UserId == new UserId("00000000000000000000000000000080"))
{
_normalSession.Push(BuildGuestResponse());
}
else
{
_normalSession.Push(BuildResponse(selected));
}
AppletStateChanged?.Invoke(this, null); AppletStateChanged?.Invoke(this, null);
_system.ReturnFocus(); _system.ReturnFocus();
@@ -37,16 +47,34 @@ namespace Ryujinx.HLE.HOS.Applets
return ResultCode.Success; return ResultCode.Success;
} }
private byte[] BuildResponse() private byte[] BuildResponse(UserProfile selectedUser)
{ {
UserProfile currentUser = _system.AccountManager.LastOpenedUser;
using MemoryStream stream = MemoryStreamManager.Shared.GetStream(); using MemoryStream stream = MemoryStreamManager.Shared.GetStream();
using BinaryWriter writer = new(stream); using BinaryWriter writer = new(stream);
writer.Write((ulong)PlayerSelectResult.Success); writer.Write((ulong)PlayerSelectResult.Success);
currentUser.UserId.Write(writer); selectedUser.UserId.Write(writer);
return stream.ToArray();
}
private byte[] BuildGuestResponse()
{
using MemoryStream stream = MemoryStreamManager.Shared.GetStream();
using BinaryWriter writer = new(stream);
writer.Write(new byte());
return stream.ToArray();
}
private byte[] BuildResponse()
{
using MemoryStream stream = MemoryStreamManager.Shared.GetStream();
using BinaryWriter writer = new(stream);
writer.Write((ulong)PlayerSelectResult.Failure);
return stream.ToArray(); return stream.ToArray();
} }
Binary file not shown.

After

Width:  |  Height:  |  Size: 7.8 KiB

+1
View File
@@ -59,6 +59,7 @@
<EmbeddedResource Include="HOS\Applets\SoftwareKeyboard\Resources\Icon_BtnB.png" /> <EmbeddedResource Include="HOS\Applets\SoftwareKeyboard\Resources\Icon_BtnB.png" />
<EmbeddedResource Include="HOS\Applets\SoftwareKeyboard\Resources\Icon_KeyF6.png" /> <EmbeddedResource Include="HOS\Applets\SoftwareKeyboard\Resources\Icon_KeyF6.png" />
<EmbeddedResource Include="HOS\Services\Account\Acc\DefaultUserImage.jpg" /> <EmbeddedResource Include="HOS\Services\Account\Acc\DefaultUserImage.jpg" />
<EmbeddedResource Include="HOS\Services\Account\Acc\GuestUserImage.jpg" />
</ItemGroup> </ItemGroup>
</Project> </Project>
+8 -1
View File
@@ -1,4 +1,5 @@
using Ryujinx.HLE.HOS.Applets; using Ryujinx.HLE.HOS.Applets;
using Ryujinx.HLE.HOS.Services.Account.Acc;
using Ryujinx.HLE.HOS.Services.Am.AppletOE.ApplicationProxyService.ApplicationProxy.Types; using Ryujinx.HLE.HOS.Services.Am.AppletOE.ApplicationProxyService.ApplicationProxy.Types;
namespace Ryujinx.HLE.UI namespace Ryujinx.HLE.UI
@@ -48,7 +49,8 @@ namespace Ryujinx.HLE.UI
/// Displays a Message Dialog box specific to Error Applet and blocks until it is closed. /// Displays a Message Dialog box specific to Error Applet and blocks until it is closed.
/// </summary> /// </summary>
/// <returns>False when OK is pressed, True when another button (Details) is pressed.</returns> /// <returns>False when OK is pressed, True when another button (Details) is pressed.</returns>
bool DisplayErrorAppletDialog(string title, string message, string[] buttonsText); // ReSharper disable once UnusedParameter.Global
bool DisplayErrorAppletDialog(string title, string message, string[] buttonsText, (uint Module, uint Description)? errorCode = null);
/// <summary> /// <summary>
/// Creates a handler to process keyboard inputs into text strings. /// Creates a handler to process keyboard inputs into text strings.
@@ -65,5 +67,10 @@ namespace Ryujinx.HLE.UI
/// Takes a screenshot from the current renderer and saves it in the screenshots folder. /// Takes a screenshot from the current renderer and saves it in the screenshots folder.
/// </summary> /// </summary>
void TakeScreenshot(); void TakeScreenshot();
/// <summary>
/// Displays the player select dialog and returns the selected profile.
/// </summary>
UserProfile ShowPlayerSelectDialog();
} }
} }
@@ -34,14 +34,9 @@ namespace Ryujinx.UI.Common.Configuration
public BackendThreading BackendThreading { get; set; } public BackendThreading BackendThreading { get; set; }
/// <summary> /// <summary>
/// Resolution Scale. An integer scale applied to applicable render targets. Values 1-4, or -1 to use a custom floating point scale instead. /// Resolution Scale. A float value containing the resolution scale.
/// </summary> /// </summary>
public int ResScale { get; set; } public float ResScale { get; set; }
/// <summary>
/// Custom Resolution Scale. A custom floating point scale applied to applicable render targets. Only active when Resolution Scale is -1.
/// </summary>
public float ResScaleCustom { get; set; }
/// <summary> /// <summary>
/// Max Anisotropy. Values range from 0 - 16. Set to -1 to let the game decide. /// Max Anisotropy. Values range from 0 - 16. Set to -1 to let the game decide.
@@ -340,7 +340,7 @@ namespace Ryujinx.UI.Common.Configuration
/// <summary> /// <summary>
/// Enables or disables profiled translation cache persistency /// Enables or disables profiled translation cache persistency
/// </summary> /// </summary>
public ReactiveObject<bool> EnablePtc { get; private set; } public ReactiveObject<bool> EnablePptc { get; private set; }
/// <summary> /// <summary>
/// Clock tick scalar, in percent points (100 = 1.0). /// Clock tick scalar, in percent points (100 = 1.0).
@@ -350,7 +350,7 @@ namespace Ryujinx.UI.Common.Configuration
/// <summary> /// <summary>
/// Enables or disables low-power profiled translation cache persistency loading /// Enables or disables low-power profiled translation cache persistency loading
/// </summary> /// </summary>
public ReactiveObject<bool> EnableLowPowerPtc { get; private set; } public ReactiveObject<bool> EnableLowPowerPptc { get; private set; }
/// <summary> /// <summary>
/// Enables or disables guest Internet access /// Enables or disables guest Internet access
@@ -418,10 +418,10 @@ namespace Ryujinx.UI.Common.Configuration
MatchSystemTime.Event += static (_, e) => LogValueChange(e, nameof(MatchSystemTime)); MatchSystemTime.Event += static (_, e) => LogValueChange(e, nameof(MatchSystemTime));
EnableDockedMode = new ReactiveObject<bool>(); EnableDockedMode = new ReactiveObject<bool>();
EnableDockedMode.Event += static (_, e) => LogValueChange(e, nameof(EnableDockedMode)); EnableDockedMode.Event += static (_, e) => LogValueChange(e, nameof(EnableDockedMode));
EnablePtc = new ReactiveObject<bool>(); EnablePptc = new ReactiveObject<bool>();
EnablePtc.Event += static (_, e) => LogValueChange(e, nameof(EnablePtc)); EnablePptc.Event += static (_, e) => LogValueChange(e, nameof(EnablePptc));
EnableLowPowerPtc = new ReactiveObject<bool>(); EnableLowPowerPptc = new ReactiveObject<bool>();
EnableLowPowerPtc.Event += static (_, e) => LogValueChange(e, nameof(EnableLowPowerPtc)); EnableLowPowerPptc.Event += static (_, e) => LogValueChange(e, nameof(EnableLowPowerPptc));
TickScalar = new ReactiveObject<long>(); TickScalar = new ReactiveObject<long>();
TickScalar.Event += static (_, e) => LogValueChange(e, nameof(TickScalar)); TickScalar.Event += static (_, e) => LogValueChange(e, nameof(TickScalar));
TickScalar.Event += static (_, e) => TickScalar.Event += static (_, e) =>
@@ -513,14 +513,9 @@ namespace Ryujinx.UI.Common.Configuration
public ReactiveObject<AspectRatio> AspectRatio { get; private set; } public ReactiveObject<AspectRatio> AspectRatio { get; private set; }
/// <summary> /// <summary>
/// Resolution Scale. An integer scale applied to applicable render targets. Values 1-4, or -1 to use a custom floating point scale instead. /// Resolution Scale. A float value containing the resolution scale.
/// </summary> /// </summary>
public ReactiveObject<int> ResScale { get; private set; } public ReactiveObject<float> ResScale { get; private set; }
/// <summary>
/// Custom Resolution Scale. A custom floating point scale applied to applicable render targets. Only active when Resolution Scale is -1.
/// </summary>
public ReactiveObject<float> ResScaleCustom { get; private set; }
/// <summary> /// <summary>
/// Directory to save the game shaders. /// Directory to save the game shaders.
@@ -611,10 +606,8 @@ namespace Ryujinx.UI.Common.Configuration
{ {
BackendThreading = new ReactiveObject<BackendThreading>(); BackendThreading = new ReactiveObject<BackendThreading>();
BackendThreading.Event += static (_, e) => LogValueChange(e, nameof(BackendThreading)); BackendThreading.Event += static (_, e) => LogValueChange(e, nameof(BackendThreading));
ResScale = new ReactiveObject<int>(); ResScale = new ReactiveObject<float>();
ResScale.Event += static (_, e) => LogValueChange(e, nameof(ResScale)); ResScale.Event += static (_, e) => LogValueChange(e, nameof(ResScale));
ResScaleCustom = new ReactiveObject<float>();
ResScaleCustom.Event += static (_, e) => LogValueChange(e, nameof(ResScaleCustom));
MaxAnisotropy = new ReactiveObject<float>(); MaxAnisotropy = new ReactiveObject<float>();
MaxAnisotropy.Event += static (_, e) => LogValueChange(e, nameof(MaxAnisotropy)); MaxAnisotropy.Event += static (_, e) => LogValueChange(e, nameof(MaxAnisotropy));
AspectRatio = new ReactiveObject<AspectRatio>(); AspectRatio = new ReactiveObject<AspectRatio>();
@@ -824,7 +817,6 @@ namespace Ryujinx.UI.Common.Configuration
BackendThreading = Graphics.BackendThreading, BackendThreading = Graphics.BackendThreading,
EnableFileLog = Logger.EnableFileLog, EnableFileLog = Logger.EnableFileLog,
ResScale = Graphics.ResScale, ResScale = Graphics.ResScale,
ResScaleCustom = Graphics.ResScaleCustom,
MaxAnisotropy = Graphics.MaxAnisotropy, MaxAnisotropy = Graphics.MaxAnisotropy,
AspectRatio = Graphics.AspectRatio, AspectRatio = Graphics.AspectRatio,
AntiAliasing = Graphics.AntiAliasing, AntiAliasing = Graphics.AntiAliasing,
@@ -864,8 +856,8 @@ namespace Ryujinx.UI.Common.Configuration
EnableTextureRecompression = Graphics.EnableTextureRecompression, EnableTextureRecompression = Graphics.EnableTextureRecompression,
EnableMacroHLE = Graphics.EnableMacroHLE, EnableMacroHLE = Graphics.EnableMacroHLE,
EnableColorSpacePassthrough = Graphics.EnableColorSpacePassthrough, EnableColorSpacePassthrough = Graphics.EnableColorSpacePassthrough,
EnablePtc = System.EnablePtc, EnablePtc = System.EnablePptc,
EnableLowPowerPtc = System.EnableLowPowerPtc, EnableLowPowerPtc = System.EnableLowPowerPptc,
TickScalar = System.TickScalar, TickScalar = System.TickScalar,
EnableInternetAccess = System.EnableInternetAccess, EnableInternetAccess = System.EnableInternetAccess,
EnableFsIntegrityChecks = System.EnableFsIntegrityChecks, EnableFsIntegrityChecks = System.EnableFsIntegrityChecks,
@@ -953,8 +945,7 @@ namespace Ryujinx.UI.Common.Configuration
{ {
Logger.EnableFileLog.Value = true; Logger.EnableFileLog.Value = true;
Graphics.BackendThreading.Value = BackendThreading.Auto; Graphics.BackendThreading.Value = BackendThreading.Auto;
Graphics.ResScale.Value = 1; Graphics.ResScale.Value = 1.0f;
Graphics.ResScaleCustom.Value = 1.0f;
Graphics.MaxAnisotropy.Value = -1.0f; Graphics.MaxAnisotropy.Value = -1.0f;
Graphics.AspectRatio.Value = AspectRatio.Fixed16x9; Graphics.AspectRatio.Value = AspectRatio.Fixed16x9;
Graphics.GraphicsBackend.Value = DefaultGraphicsBackend(); Graphics.GraphicsBackend.Value = DefaultGraphicsBackend();
@@ -995,7 +986,7 @@ namespace Ryujinx.UI.Common.Configuration
Graphics.AntiAliasing.Value = AntiAliasing.None; Graphics.AntiAliasing.Value = AntiAliasing.None;
Graphics.ScalingFilter.Value = ScalingFilter.Bilinear; Graphics.ScalingFilter.Value = ScalingFilter.Bilinear;
Graphics.ScalingFilterLevel.Value = 80; Graphics.ScalingFilterLevel.Value = 80;
System.EnablePtc.Value = true; System.EnablePptc.Value = true;
System.EnableInternetAccess.Value = false; System.EnableInternetAccess.Value = false;
System.EnableFsIntegrityChecks.Value = true; System.EnableFsIntegrityChecks.Value = true;
System.FsGlobalAccessLogMode.Value = 0; System.FsGlobalAccessLogMode.Value = 0;
@@ -1208,8 +1199,7 @@ namespace Ryujinx.UI.Common.Configuration
{ {
Ryujinx.Common.Logging.Logger.Warning?.Print(LogClass.Application, $"Outdated configuration version {configurationFileFormat.Version}, migrating to version 11."); Ryujinx.Common.Logging.Logger.Warning?.Print(LogClass.Application, $"Outdated configuration version {configurationFileFormat.Version}, migrating to version 11.");
configurationFileFormat.ResScale = 1; configurationFileFormat.ResScale = 1.0f;
configurationFileFormat.ResScaleCustom = 1.0f;
configurationFileUpdated = true; configurationFileUpdated = true;
} }
@@ -1808,7 +1798,6 @@ namespace Ryujinx.UI.Common.Configuration
Logger.EnableFileLog.Value = configurationFileFormat.EnableFileLog; Logger.EnableFileLog.Value = configurationFileFormat.EnableFileLog;
Graphics.ResScale.Value = configurationFileFormat.ResScale; Graphics.ResScale.Value = configurationFileFormat.ResScale;
Graphics.ResScaleCustom.Value = configurationFileFormat.ResScaleCustom;
Graphics.MaxAnisotropy.Value = configurationFileFormat.MaxAnisotropy; Graphics.MaxAnisotropy.Value = configurationFileFormat.MaxAnisotropy;
Graphics.AspectRatio.Value = configurationFileFormat.AspectRatio; Graphics.AspectRatio.Value = configurationFileFormat.AspectRatio;
Graphics.ShadersDumpPath.Value = configurationFileFormat.GraphicsShadersDumpPath; Graphics.ShadersDumpPath.Value = configurationFileFormat.GraphicsShadersDumpPath;
@@ -1851,8 +1840,8 @@ namespace Ryujinx.UI.Common.Configuration
Graphics.EnableTextureRecompression.Value = configurationFileFormat.EnableTextureRecompression; Graphics.EnableTextureRecompression.Value = configurationFileFormat.EnableTextureRecompression;
Graphics.EnableMacroHLE.Value = configurationFileFormat.EnableMacroHLE; Graphics.EnableMacroHLE.Value = configurationFileFormat.EnableMacroHLE;
Graphics.EnableColorSpacePassthrough.Value = configurationFileFormat.EnableColorSpacePassthrough; Graphics.EnableColorSpacePassthrough.Value = configurationFileFormat.EnableColorSpacePassthrough;
System.EnablePtc.Value = configurationFileFormat.EnablePtc; System.EnablePptc.Value = configurationFileFormat.EnablePtc;
System.EnableLowPowerPtc.Value = configurationFileFormat.EnableLowPowerPtc; System.EnableLowPowerPptc.Value = configurationFileFormat.EnableLowPowerPtc;
System.TickScalar.Value = configurationFileFormat.TickScalar; System.TickScalar.Value = configurationFileFormat.TickScalar;
System.EnableInternetAccess.Value = configurationFileFormat.EnableInternetAccess; System.EnableInternetAccess.Value = configurationFileFormat.EnableInternetAccess;
System.EnableFsIntegrityChecks.Value = configurationFileFormat.EnableFsIntegrityChecks; System.EnableFsIntegrityChecks.Value = configurationFileFormat.EnableFsIntegrityChecks;
@@ -0,0 +1,11 @@
using Ryujinx.UI.Common.Models;
using System.Text.Json.Serialization;
namespace Ryujinx.Common.Configuration
{
[JsonSourceGenerationOptions(WriteIndented = true)]
[JsonSerializable(typeof(CustomSettingsModel))]
public partial class CustomSettingsMetadataJsonSerializerContext : JsonSerializerContext
{
}
}
@@ -15,6 +15,9 @@ namespace Ryujinx.UI.Common.Helper
public static string OverrideBackendThreading { get; private set; } public static string OverrideBackendThreading { get; private set; }
public static string OverrideHideCursor { get; private set; } public static string OverrideHideCursor { get; private set; }
public static string BaseDirPathArg { get; private set; } public static string BaseDirPathArg { get; private set; }
public static string RenderDocCaptureTitleFormat { get; private set; } =
"{EmuVersion}\n{GuestName} {GuestVersion} {GuestTitleId} {GuestArch}";
public static FilePath FirmwareToInstallPathArg { get; set; } public static FilePath FirmwareToInstallPathArg { get; set; }
public static string Profile { get; private set; } public static string Profile { get; private set; }
public static string LaunchPathArg { get; private set; } public static string LaunchPathArg { get; private set; }
@@ -45,6 +48,20 @@ namespace Ryujinx.UI.Common.Helper
BaseDirPathArg = args[++i]; BaseDirPathArg = args[++i];
arguments.Add(arg);
arguments.Add(args[i]);
break;
case "-rdct":
case "--rd-capture-title-format":
if (i + 1 >= args.Length)
{
Logger.Error?.Print(LogClass.Application, $"Invalid option '{arg}'");
continue;
}
RenderDocCaptureTitleFormat = args[++i];
arguments.Add(arg); arguments.Add(arg);
arguments.Add(args[i]); arguments.Add(args[i]);
break; break;
@@ -0,0 +1,100 @@
using Ryujinx.Common.Configuration;
using Ryujinx.Common.Logging;
using Ryujinx.Common.Utilities;
using Ryujinx.HLE;
using Ryujinx.UI.Common.Configuration;
using Ryujinx.UI.Common.Configuration.System;
using System.IO;
using CustomSettingsModel = Ryujinx.UI.Common.Models.CustomSettingsModel;
using Path = System.IO.Path;
namespace Ryujinx.UI.Common.Helper
{
public static class CustomSettingsHelper
{
private static readonly CustomSettingsMetadataJsonSerializerContext _serializerContext = new(JsonHelper.GetDefaultSerializerOptions());
public static CustomSettingsModel LoadCustomSettingsJson(string customSettingsJsonPath)
{
var customSettingsModel = new CustomSettingsModel();
if (!File.Exists(customSettingsJsonPath))
{
return customSettingsModel;
}
try
{
Logger.Info?.Print(LogClass.Configuration, $"Found custom settings data for application at {customSettingsJsonPath}");
customSettingsModel = JsonHelper.DeserializeFromFile(customSettingsJsonPath, _serializerContext.CustomSettingsModel);
return customSettingsModel;
}
catch
{
Logger.Error?.Print(LogClass.Configuration, $"Failed to deserialize custom settings data for application at {customSettingsJsonPath}");
return customSettingsModel;
}
}
public static void SaveCustomSettingsJson(string customSettingsJsonPath, CustomSettingsModel customSettingsModel)
{
if (!File.Exists(customSettingsJsonPath))
{
string directoryPath = Path.GetDirectoryName(customSettingsJsonPath);
if (!string.IsNullOrEmpty(directoryPath))
{
Directory.CreateDirectory(directoryPath);
}
}
JsonHelper.SerializeToFile(customSettingsJsonPath, customSettingsModel, _serializerContext.CustomSettingsModel);
}
public static bool HasCustomSettings(string customSettingsJsonPath)
{
return File.Exists(customSettingsJsonPath);
}
public static void DeleteCustomSettings(string customSettingsJsonPath)
{
FileInfo file = new(customSettingsJsonPath);
if (file.Exists)
{
file.Delete();
}
}
public static void OverrideSettings(CustomSettingsModel customSettingsModel)
{
ConfigurationState.Instance.System.EnableDockedMode.Value = customSettingsModel.EnableDockedMode;
ConfigurationState.Instance.System.Language.Value = (Language)customSettingsModel.SystemLanguage;
ConfigurationState.Instance.System.Region.Value = (Region)customSettingsModel.SystemRegion;
ConfigurationState.Instance.Graphics.VSyncMode.Value = (VSyncMode)customSettingsModel.VSyncMode;
ConfigurationState.Instance.System.DramSize.Value = (MemoryConfiguration)customSettingsModel.DramSize;
ConfigurationState.Instance.System.EnableFsIntegrityChecks.Value = customSettingsModel.EnableFsIntegrityChecks;
ConfigurationState.Instance.System.IgnoreMissingServices.Value = customSettingsModel.IgnoreMissingServices;
ConfigurationState.Instance.System.EnableLowPowerPptc.Value = customSettingsModel.EnableLowPowerPptc;
ConfigurationState.Instance.System.MemoryManagerMode.Value = (MemoryManagerMode)customSettingsModel.MemoryManagerMode;
ConfigurationState.Instance.System.UseHypervisor.Value = customSettingsModel.UseHypervisor;
ConfigurationState.Instance.System.TickScalar.Value = customSettingsModel.TickScalar;
ConfigurationState.Instance.System.AudioBackend.Value = customSettingsModel.AudioBackend;
ConfigurationState.Instance.System.AudioVolume.Value = customSettingsModel.AudioVolume;
ConfigurationState.Instance.Graphics.GraphicsBackend.Value = (GraphicsBackend)customSettingsModel.GraphicsBackend;
ConfigurationState.Instance.Graphics.PreferredGpu.Value = customSettingsModel.PreferredGpu;
ConfigurationState.Instance.Graphics.EnableShaderCache.Value = customSettingsModel.EnableShaderCache;
ConfigurationState.Instance.Graphics.EnableTextureRecompression.Value = customSettingsModel.EnableTextureRecompression;
ConfigurationState.Instance.Graphics.EnableMacroHLE.Value = customSettingsModel.EnableMacroHLE;
ConfigurationState.Instance.Graphics.EnableColorSpacePassthrough.Value = customSettingsModel.EnableColorSpacePassthrough;
ConfigurationState.Instance.Graphics.ResScale.Value = customSettingsModel.ResScale;
ConfigurationState.Instance.Graphics.MaxAnisotropy.Value = customSettingsModel.MaxAnisotropy;
ConfigurationState.Instance.Graphics.BackendThreading.Value = (BackendThreading)customSettingsModel.BackendThreading;
}
public static string PathToGameSettingsJson(ulong applicationIdBase)
{
return Path.Combine(AppDataManager.GamesDirPath, applicationIdBase.ToString("x16"), "settings.json");
}
}
}
@@ -31,13 +31,13 @@ namespace Ryujinx.UI.Common.Helper
try try
{ {
List<DownloadableContentContainer> downloadableContentContainerList = JsonHelper.DeserializeFromFile(downloadableContentJsonPath, // Logger.Info?.Print(LogClass.Configuration, $"Found downloadable content data for {applicationIdBase:x16} at {downloadableContentJsonPath}");
_serializerContext.ListDownloadableContentContainer); List<DownloadableContentContainer> downloadableContentContainerList = JsonHelper.DeserializeFromFile(downloadableContentJsonPath,_serializerContext.ListDownloadableContentContainer);
return LoadDownloadableContents(vfs, downloadableContentContainerList); return LoadDownloadableContents(vfs, downloadableContentContainerList);
} }
catch catch
{ {
Logger.Error?.Print(LogClass.Configuration, "Downloadable Content JSON failed to deserialize."); Logger.Error?.Print(LogClass.Configuration, $"Failed to deserialize downloadable content data for {applicationIdBase:x16} at {downloadableContentJsonPath}");
return []; return [];
} }
} }
@@ -1,3 +1,4 @@
using Gommon;
using Ryujinx.HLE.Loaders.Processes; using Ryujinx.HLE.Loaders.Processes;
using System; using System;
@@ -26,5 +27,23 @@ namespace Ryujinx.UI.Common.Helper
return appTitle; return appTitle;
} }
public static string FormatRenderDocCaptureTitle(ProcessResult activeProcess, string applicationVersion)
{
if (activeProcess == null)
return string.Empty;
string titleNameSection = string.IsNullOrWhiteSpace(activeProcess.Name) ? string.Empty : activeProcess.Name;
string titleVersionSection = string.IsNullOrWhiteSpace(activeProcess.DisplayVersion) ? string.Empty : $"v{activeProcess.DisplayVersion}";
string titleIdSection = $"({activeProcess.ProgramIdText.ToUpper()})";
string titleArchSection = activeProcess.Is64Bit ? "(64-bit)" : "(32-bit)";
return CommandLineState.RenderDocCaptureTitleFormat
.ReplaceIgnoreCase("{EmuVersion}", applicationVersion)
.ReplaceIgnoreCase("{GuestName}", titleNameSection)
.ReplaceIgnoreCase("{GuestVersion}", titleVersionSection)
.ReplaceIgnoreCase("{GuestTitleId}", titleIdSection)
.ReplaceIgnoreCase("{GuestArch}", titleArchSection);
}
} }
} }
@@ -39,12 +39,13 @@ namespace Ryujinx.UI.Common.Helper
try try
{ {
// Logger.Info?.Print(LogClass.Application, $"Found title updates data for {applicationIdBase:x16} at {titleUpdatesJsonPath}");
TitleUpdateMetadata titleUpdateWindowData = JsonHelper.DeserializeFromFile(titleUpdatesJsonPath, _serializerContext.TitleUpdateMetadata); TitleUpdateMetadata titleUpdateWindowData = JsonHelper.DeserializeFromFile(titleUpdatesJsonPath, _serializerContext.TitleUpdateMetadata);
return LoadTitleUpdates(vfs, titleUpdateWindowData, applicationIdBase); return LoadTitleUpdates(vfs, titleUpdateWindowData, applicationIdBase);
} }
catch catch
{ {
Logger.Warning?.Print(LogClass.Application, $"Failed to deserialize title update data for {applicationIdBase:x16} at {titleUpdatesJsonPath}"); Logger.Error?.Print(LogClass.Application, $"Failed to deserialize title updates data for {applicationIdBase:x16} at {titleUpdatesJsonPath}");
return []; return [];
} }
} }
@@ -0,0 +1,35 @@
using Ryujinx.Common.Configuration;
using Ryujinx.HLE;
using Ryujinx.UI.Common.Configuration;
namespace Ryujinx.UI.Common.Models
{
// NOTE: most consuming code relies on this model being value-comparable
public record CustomSettingsModel()
{
public bool HasCustomSettings { get; set; }
public bool EnableDockedMode { get; set; }
public int SystemLanguage { get; set; }
public int SystemRegion { get; set; }
public int VSyncMode { get; set; }
public int DramSize { get; set; }
public bool EnableFsIntegrityChecks { get; set; }
public bool IgnoreMissingServices { get; set; }
public bool EnablePptc { get; set; }
public bool EnableLowPowerPptc { get; set; }
public int MemoryManagerMode { get; set; }
public bool UseHypervisor { get; set; }
public long TickScalar { get; set; }
public int GraphicsBackend { get; set; }
public string PreferredGpu { get; set; }
public bool EnableShaderCache { get; set; }
public bool EnableTextureRecompression { get; set; }
public bool EnableMacroHLE { get; set; }
public bool EnableColorSpacePassthrough { get; set; }
public float ResScale { get; set; }
public float MaxAnisotropy { get; set; }
public int BackendThreading { get; set; }
public AudioBackend AudioBackend { get; set; }
public float AudioVolume { get; set; }
}
}
+1
View File
@@ -14,6 +14,7 @@ using Ryujinx.Ava.UI.Helpers;
using Ryujinx.Ava.UI.Windows; using Ryujinx.Ava.UI.Windows;
using Ryujinx.Common; using Ryujinx.Common;
using Ryujinx.Common.Logging; using Ryujinx.Common.Logging;
using Ryujinx.Graphics.RenderDocApi;
using Ryujinx.UI.Common.Configuration; using Ryujinx.UI.Common.Configuration;
using Ryujinx.UI.Common.Helper; using Ryujinx.UI.Common.Helper;
using System; using System;
+20 -8
View File
@@ -43,6 +43,7 @@ using Ryujinx.UI.App.Common;
using Ryujinx.UI.Common; using Ryujinx.UI.Common;
using Ryujinx.UI.Common.Configuration; using Ryujinx.UI.Common.Configuration;
using Ryujinx.UI.Common.Helper; using Ryujinx.UI.Common.Helper;
using Ryujinx.UI.Common.Models;
using Silk.NET.Vulkan; using Silk.NET.Vulkan;
using SkiaSharp; using SkiaSharp;
using SPB.Graphics.Exceptions; using SPB.Graphics.Exceptions;
@@ -84,6 +85,7 @@ namespace Ryujinx.Ava
private readonly AccountManager _accountManager; private readonly AccountManager _accountManager;
private readonly UserChannelPersistence _userChannelPersistence; private readonly UserChannelPersistence _userChannelPersistence;
private readonly CustomSettingsModel _customSettingsModel;
private readonly InputManager _inputManager; private readonly InputManager _inputManager;
private readonly MainWindowViewModel _viewModel; private readonly MainWindowViewModel _viewModel;
@@ -181,6 +183,12 @@ namespace Ryujinx.Ava
_chrono = new Stopwatch(); _chrono = new Stopwatch();
_ticksPerFrame = Stopwatch.Frequency / TargetFps; _ticksPerFrame = Stopwatch.Frequency / TargetFps;
if (CustomSettingsHelper.HasCustomSettings(CustomSettingsHelper.PathToGameSettingsJson(applicationId)))
{
CustomSettingsModel customSettings = CustomSettingsHelper.LoadCustomSettingsJson(CustomSettingsHelper.PathToGameSettingsJson(applicationId));
CustomSettingsHelper.OverrideSettings(customSettings);
}
if (ApplicationPath.StartsWith("@SystemContent")) if (ApplicationPath.StartsWith("@SystemContent"))
{ {
ApplicationPath = VirtualFileSystem.SwitchPathToSystemPath(ApplicationPath); ApplicationPath = VirtualFileSystem.SwitchPathToSystemPath(ApplicationPath);
@@ -476,7 +484,7 @@ namespace Ryujinx.Ava
public void Start() public void Start()
{ {
ARMeilleure.Optimizations.EcoFriendly = ConfigurationState.Instance.System.EnableLowPowerPtc; ARMeilleure.Optimizations.EcoFriendly = ConfigurationState.Instance.System.EnableLowPowerPptc;
if (OperatingSystem.IsWindows()) if (OperatingSystem.IsWindows())
{ {
@@ -616,6 +624,12 @@ namespace Ryujinx.Ava
_gpuCancellationTokenSource.Dispose(); _gpuCancellationTokenSource.Dispose();
DisposeGpu(); DisposeGpu();
if (CustomSettingsHelper.HasCustomSettings(CustomSettingsHelper.PathToGameSettingsJson(ApplicationId)))
{
Program.ReloadConfig();
}
AppExit?.Invoke(this, EventArgs.Empty); AppExit?.Invoke(this, EventArgs.Empty);
} }
@@ -959,23 +973,23 @@ namespace Ryujinx.Ava
Logger.Info?.PrintMsg(LogClass.Gpu, $"Backend Threading ({threadingMode}): {isGALThreaded}"); Logger.Info?.PrintMsg(LogClass.Gpu, $"Backend Threading ({threadingMode}): {isGALThreaded}");
// Initialize Configuration. CustomSettingsModel customSettingsModel = CustomSettingsHelper.LoadCustomSettingsJson(CustomSettingsHelper.PathToGameSettingsJson(ApplicationId));
MemoryConfiguration memoryConfiguration = ConfigurationState.Instance.System.DramSize.Value;
HLEConfiguration configuration = new(VirtualFileSystem, HLEConfiguration configuration = new(
VirtualFileSystem,
_viewModel.LibHacHorizonManager, _viewModel.LibHacHorizonManager,
ContentManager, ContentManager,
_accountManager, _accountManager,
_userChannelPersistence, _userChannelPersistence,
renderer, renderer,
InitializeAudio(), InitializeAudio(),
memoryConfiguration, customSettingsModel.HasCustomSettings ? (MemoryConfiguration)customSettingsModel.DramSize : ConfigurationState.Instance.System.DramSize.Value,
_viewModel.UiHandler, _viewModel.UiHandler,
(SystemLanguage)ConfigurationState.Instance.System.Language.Value, (SystemLanguage)ConfigurationState.Instance.System.Language.Value,
(RegionCode)ConfigurationState.Instance.System.Region.Value, (RegionCode)ConfigurationState.Instance.System.Region.Value,
ConfigurationState.Instance.Graphics.VSyncMode, ConfigurationState.Instance.Graphics.VSyncMode,
ConfigurationState.Instance.System.EnableDockedMode, ConfigurationState.Instance.System.EnableDockedMode,
ConfigurationState.Instance.System.EnablePtc, ConfigurationState.Instance.System.EnablePptc,
ConfigurationState.Instance.System.TickScalar, ConfigurationState.Instance.System.TickScalar,
ConfigurationState.Instance.System.EnableInternetAccess, ConfigurationState.Instance.System.EnableInternetAccess,
ConfigurationState.Instance.System.EnableFsIntegrityChecks ? IntegrityCheckLevel.ErrorOnInvalid : IntegrityCheckLevel.None, ConfigurationState.Instance.System.EnableFsIntegrityChecks ? IntegrityCheckLevel.ErrorOnInvalid : IntegrityCheckLevel.None,
@@ -1064,8 +1078,6 @@ namespace Ryujinx.Ava
} }
} }
MainWindowViewModel.SaveConfig();
return deviceDriver; return deviceDriver;
} }
+14 -8
View File
@@ -66,6 +66,10 @@
"GameListContextMenuManageTitleUpdatesToolTip": "يفتح نافذة إدارة تحديث اللُعبة", "GameListContextMenuManageTitleUpdatesToolTip": "يفتح نافذة إدارة تحديث اللُعبة",
"GameListContextMenuManageDlc": "إدارة المحتوي الإضافي", "GameListContextMenuManageDlc": "إدارة المحتوي الإضافي",
"GameListContextMenuManageDlcToolTip": "يفتح نافذة إدارة المحتوي الإضافي", "GameListContextMenuManageDlcToolTip": "يفتح نافذة إدارة المحتوي الإضافي",
"GameListContextMenuManageCustomSettings": "إدارة ملف الإعدادات المخصصة",
"GameListContextMenuManageCustomSettingsToolTip": "إدارة الإعدادات المخصصة للتطبيق المحدد",
"GameListContextMenuCustomSettingsOpen": "فتح دليل الإعدادات المخصصة",
"GameListContextMenuCustomSettingsOpenToolTip": "فتح الدليل الذي يحتوي على الإعدادات المخصصة للتطبيق",
"GameListContextMenuCacheManagement": "إدارة ذاكرة التخزين المؤقت", "GameListContextMenuCacheManagement": "إدارة ذاكرة التخزين المؤقت",
"GameListContextMenuCacheManagementPurgePptc": "قائمة انتظار إعادة بناء الـ‫PPTC", "GameListContextMenuCacheManagementPurgePptc": "قائمة انتظار إعادة بناء الـ‫PPTC",
"GameListContextMenuCacheManagementPurgePptcToolTip": "تنشيط ‫PPTC لإعادة البناء في وقت الإقلاع عند بدء تشغيل اللعبة التالي", "GameListContextMenuCacheManagementPurgePptcToolTip": "تنشيط ‫PPTC لإعادة البناء في وقت الإقلاع عند بدء تشغيل اللعبة التالي",
@@ -172,11 +176,12 @@
"SettingsTabGraphicsAnisotropicFiltering8x": "8x", "SettingsTabGraphicsAnisotropicFiltering8x": "8x",
"SettingsTabGraphicsAnisotropicFiltering16x": "16x", "SettingsTabGraphicsAnisotropicFiltering16x": "16x",
"SettingsTabGraphicsResolutionScale": "مقياس الدقة", "SettingsTabGraphicsResolutionScale": "مقياس الدقة",
"SettingsTabGraphicsResolutionScaleCustom": "مخصص (لا ينصح به)", "SettingsTabGraphicsResolutionScale05x": "0.5x (360p/540p)",
"SettingsTabGraphicsResolutionScaleNative": "الأصل ‫(720p/1080p)", "SettingsTabGraphicsResolutionScale075x": "0.75x (540p/810p)",
"SettingsTabGraphicsResolutionScale2x": "2x (1440p/2160p)", "SettingsTabGraphicsResolutionScale10x": "1.0x (720p/1080p)",
"SettingsTabGraphicsResolutionScale3x": "3x (2160p/3240p)", "SettingsTabGraphicsResolutionScale20x": "2.0x (1440p/2160p)",
"SettingsTabGraphicsResolutionScale4x": "4x (2880p/4320p) (لا ينصح به)", "SettingsTabGraphicsResolutionScale30x": "3.0x (2160p/3240p)",
"SettingsTabGraphicsResolutionScale40x": "4.0x (2880p/4320p)",
"SettingsTabGraphicsAspectRatio": "نسبة الارتفاع إلى العرض:", "SettingsTabGraphicsAspectRatio": "نسبة الارتفاع إلى العرض:",
"SettingsTabGraphicsAspectRatio4x3": "4:3", "SettingsTabGraphicsAspectRatio4x3": "4:3",
"SettingsTabGraphicsAspectRatio16x9": "16:9", "SettingsTabGraphicsAspectRatio16x9": "16:9",
@@ -207,8 +212,9 @@
"SettingsTabLoggingGraphicsBackendLogLevelAll": "الكل", "SettingsTabLoggingGraphicsBackendLogLevelAll": "الكل",
"SettingsTabLoggingEnableDebugLogs": "تمكين سجلات التصحيح", "SettingsTabLoggingEnableDebugLogs": "تمكين سجلات التصحيح",
"SettingsTabInput": "الإدخال", "SettingsTabInput": "الإدخال",
"SettingsTabInputEnableDockedMode": "تركيب بالمنصة", "SettingsTabSystemEnableDockedMode": "تركيب بالمنصة",
"SettingsTabInputDirectKeyboardAccess": "الوصول المباشر للوحة المفاتيح", "SettingsTabInputDirectKeyboardAccess": "الوصول المباشر للوحة المفاتيح",
"SettingsButtonDelete": "حذف",
"SettingsButtonSave": "حفظ", "SettingsButtonSave": "حفظ",
"SettingsButtonClose": "إغلاق", "SettingsButtonClose": "إغلاق",
"SettingsButtonOk": "موافق", "SettingsButtonOk": "موافق",
@@ -487,9 +493,10 @@
"DialogProfileDeleteProfileTitle": "حذف الملف الشخصي", "DialogProfileDeleteProfileTitle": "حذف الملف الشخصي",
"DialogProfileDeleteProfileMessage": "هذا الإجراء لا رجعة فيه، هل أنت متأكد من أنك تريد المتابعة؟", "DialogProfileDeleteProfileMessage": "هذا الإجراء لا رجعة فيه، هل أنت متأكد من أنك تريد المتابعة؟",
"DialogWarning": "تحذير", "DialogWarning": "تحذير",
"DialogCustomSettingsDeleteMessage": "أنت على وشك حذف الإعدادات المخصصة لـ:\n\n{0}\n\nهل أنت متأكد من أنك تريد المتابعة؟",
"DialogPPTCDeletionMessage": "أنت على وشك الإنتظار لإعادة بناء ذاكرة التخزين المؤقت للترجمة المستمرة (PPTC) عند الإقلاع التالي لـ:\n\n{0}\n\nأمتأكد من رغبتك في المتابعة؟", "DialogPPTCDeletionMessage": "أنت على وشك الإنتظار لإعادة بناء ذاكرة التخزين المؤقت للترجمة المستمرة (PPTC) عند الإقلاع التالي لـ:\n\n{0}\n\nأمتأكد من رغبتك في المتابعة؟",
"DialogPPTCDeletionErrorMessage": "خطأ خلال تنظيف ذاكرة التخزين المؤقت للترجمة المستمرة (PPTC) في {0}: {1}", "DialogPPTCDeletionErrorMessage": "خطأ خلال تنظيف ذاكرة التخزين المؤقت للترجمة المستمرة (PPTC) في {0}: {1}",
"DialogPPTCNukeMessage": "You are about to purge all PPTC data from:\n\n{0}\n\nAre you sure you want to proceed?", "DialogPPTCNukeMessage": "أنت على وشك حذف جميع بيانات PPTC من:\n\n{0}\n\nهل أنت متأكد من أنك تريد المتابعة؟",
"DialogShaderDeletionMessage": "أنت على وشك حذف ذاكرة المظللات المؤقتة ل:\n\n{0}\n\nهل انت متأكد انك تريد المتابعة؟", "DialogShaderDeletionMessage": "أنت على وشك حذف ذاكرة المظللات المؤقتة ل:\n\n{0}\n\nهل انت متأكد انك تريد المتابعة؟",
"DialogShaderDeletionErrorMessage": "حدث خطأ أثناء تنظيف ذاكرة المظللات المؤقتة في {0}: {1}", "DialogShaderDeletionErrorMessage": "حدث خطأ أثناء تنظيف ذاكرة المظللات المؤقتة في {0}: {1}",
"DialogRyujinxErrorMessage": "واجه ريوجينكس خطأ", "DialogRyujinxErrorMessage": "واجه ريوجينكس خطأ",
@@ -528,7 +535,6 @@
"DialogLoadAppGameAlreadyLoadedSubMessage": "الرجاء إيقاف المحاكاة أو إغلاق المحاكي قبل بدء لعبة أخرى.", "DialogLoadAppGameAlreadyLoadedSubMessage": "الرجاء إيقاف المحاكاة أو إغلاق المحاكي قبل بدء لعبة أخرى.",
"DialogUpdateAddUpdateErrorMessage": "الملف المحدد لا يحتوي على تحديث للعنوان المحدد!", "DialogUpdateAddUpdateErrorMessage": "الملف المحدد لا يحتوي على تحديث للعنوان المحدد!",
"DialogSettingsBackendThreadingWarningTitle": "تحذير - خلفية متعددة المسارات", "DialogSettingsBackendThreadingWarningTitle": "تحذير - خلفية متعددة المسارات",
"DialogSettingsBackendThreadingWarningMessage": "يجب إعادة تشغيل ريوجينكس بعد تغيير هذا الخيار حتى يتم تطبيقه بالكامل. اعتمادا على النظام الأساسي الخاص بك، قد تحتاج إلى تعطيل تعدد المسارات الخاص ببرنامج الرسومات التشغيل الخاص بك يدويًا عند استخدام الخاص بريوجينكس.",
"DialogModManagerDeletionWarningMessage": "أنت على وشك حذف التعديل: {0}\n\nهل انت متأكد انك تريد المتابعة؟", "DialogModManagerDeletionWarningMessage": "أنت على وشك حذف التعديل: {0}\n\nهل انت متأكد انك تريد المتابعة؟",
"DialogModManagerDeletionAllWarningMessage": "أنت على وشك حذف كافة التعديلات لهذا العنوان.\n\nهل انت متأكد انك تريد المتابعة؟", "DialogModManagerDeletionAllWarningMessage": "أنت على وشك حذف كافة التعديلات لهذا العنوان.\n\nهل انت متأكد انك تريد المتابعة؟",
"SettingsTabGraphicsFeaturesOptions": "المميزات", "SettingsTabGraphicsFeaturesOptions": "المميزات",
+14 -8
View File
@@ -67,6 +67,10 @@
"GameListContextMenuManageTitleUpdatesToolTip": "Öffnet den Spiel-Update-Manager", "GameListContextMenuManageTitleUpdatesToolTip": "Öffnet den Spiel-Update-Manager",
"GameListContextMenuManageDlc": "Verwalten von DLC", "GameListContextMenuManageDlc": "Verwalten von DLC",
"GameListContextMenuManageDlcToolTip": "Öffnet den DLC-Manager", "GameListContextMenuManageDlcToolTip": "Öffnet den DLC-Manager",
"GameListContextMenuManageCustomSettings": "Benutzerdefinierte Einstellungsdatei verwalten",
"GameListContextMenuManageCustomSettingsToolTip": "Verwalten Sie die benutzerdefinierten Einstellungen für die ausgewählte Anwendung",
"GameListContextMenuCustomSettingsOpen": "Verzeichnis der benutzerdefinierten Einstellungen öffnen",
"GameListContextMenuCustomSettingsOpenToolTip": "Öffnen Sie das Verzeichnis, das die benutzerdefinierten Einstellungen der Anwendung enthält",
"GameListContextMenuCacheManagement": "Cache-Verwaltung", "GameListContextMenuCacheManagement": "Cache-Verwaltung",
"GameListContextMenuCacheManagementPurgePptc": "PPTC als ungültig markieren", "GameListContextMenuCacheManagementPurgePptc": "PPTC als ungültig markieren",
"GameListContextMenuCacheManagementPurgePptcToolTip": "Markiert den PPTC als ungültig, sodass dieser beim nächsten Spielstart neu erstellt wird", "GameListContextMenuCacheManagementPurgePptcToolTip": "Markiert den PPTC als ungültig, sodass dieser beim nächsten Spielstart neu erstellt wird",
@@ -173,11 +177,12 @@
"SettingsTabGraphicsAnisotropicFiltering8x": "8x", "SettingsTabGraphicsAnisotropicFiltering8x": "8x",
"SettingsTabGraphicsAnisotropicFiltering16x": "16x", "SettingsTabGraphicsAnisotropicFiltering16x": "16x",
"SettingsTabGraphicsResolutionScale": "Auflösungsskalierung:", "SettingsTabGraphicsResolutionScale": "Auflösungsskalierung:",
"SettingsTabGraphicsResolutionScaleCustom": "Benutzerdefiniert (nicht empfohlen)", "SettingsTabGraphicsResolutionScale05x": "0.5x (360p/540p)",
"SettingsTabGraphicsResolutionScaleNative": "Nativ (720p/1080p)", "SettingsTabGraphicsResolutionScale075x": "0.75x (540p/810p)",
"SettingsTabGraphicsResolutionScale2x": "2x (1440p/2160p)", "SettingsTabGraphicsResolutionScale10x": "1.0x (720p/1080p)",
"SettingsTabGraphicsResolutionScale3x": "3x (2160p/3240p)", "SettingsTabGraphicsResolutionScale20x": "2.0x (1440p/2160p)",
"SettingsTabGraphicsResolutionScale4x": "4x (2880p/4320p) (Nicht empfohlen)", "SettingsTabGraphicsResolutionScale30x": "3.0x (2160p/3240p)",
"SettingsTabGraphicsResolutionScale40x": "4.0x (2880p/4320p)",
"SettingsTabGraphicsAspectRatio": "Bildseitenverhältnis:", "SettingsTabGraphicsAspectRatio": "Bildseitenverhältnis:",
"SettingsTabGraphicsAspectRatio4x3": "4:3", "SettingsTabGraphicsAspectRatio4x3": "4:3",
"SettingsTabGraphicsAspectRatio16x9": "16:9", "SettingsTabGraphicsAspectRatio16x9": "16:9",
@@ -208,8 +213,9 @@
"SettingsTabLoggingGraphicsBackendLogLevelAll": "Alle", "SettingsTabLoggingGraphicsBackendLogLevelAll": "Alle",
"SettingsTabLoggingEnableDebugLogs": "Aktiviere Debug-Log", "SettingsTabLoggingEnableDebugLogs": "Aktiviere Debug-Log",
"SettingsTabInput": "Eingabe", "SettingsTabInput": "Eingabe",
"SettingsTabInputEnableDockedMode": "Angedockter Modus", "SettingsTabSystemEnableDockedMode": "Angedockter Modus",
"SettingsTabInputDirectKeyboardAccess": "Direkter Tastaturzugriff", "SettingsTabInputDirectKeyboardAccess": "Direkter Tastaturzugriff",
"SettingsButtonDelete": "Löschen",
"SettingsButtonSave": "Speichern", "SettingsButtonSave": "Speichern",
"SettingsButtonClose": "Schließen", "SettingsButtonClose": "Schließen",
"SettingsButtonOk": "OK", "SettingsButtonOk": "OK",
@@ -488,9 +494,10 @@
"DialogProfileDeleteProfileTitle": "Profil löschen", "DialogProfileDeleteProfileTitle": "Profil löschen",
"DialogProfileDeleteProfileMessage": "Diese Aktion kann nicht rückgängig gemacht werden. Wirklich fortfahren?", "DialogProfileDeleteProfileMessage": "Diese Aktion kann nicht rückgängig gemacht werden. Wirklich fortfahren?",
"DialogWarning": "Warnung", "DialogWarning": "Warnung",
"DialogCustomSettingsDeleteMessage": "Sie sind dabei, benutzerdefinierte Einstellungen zu löschen für:\n\n{0}\n\nSind Sie sicher, dass Sie fortfahren möchten?",
"DialogPPTCDeletionMessage": "Du bist dabei den PPTC für das folgende Spiel als ungültig zu markieren:\n\n{0}\n\nWirklich fortfahren?", "DialogPPTCDeletionMessage": "Du bist dabei den PPTC für das folgende Spiel als ungültig zu markieren:\n\n{0}\n\nWirklich fortfahren?",
"DialogPPTCDeletionErrorMessage": "Fehler bei der Löschung des PPTC Caches bei {0}: {1}", "DialogPPTCDeletionErrorMessage": "Fehler bei der Löschung des PPTC Caches bei {0}: {1}",
"DialogPPTCNukeMessage": "You are about to purge all PPTC data from:\n\n{0}\n\nAre you sure you want to proceed?", "DialogPPTCNukeMessage": "Sie sind dabei, alle PPTC-Daten zu löschen von:\n\n{0}\n\nSind Sie sicher, dass Sie fortfahren möchten?",
"DialogShaderDeletionMessage": "Du bist dabei, den Shader Cache zu löschen für :\n\n{0}\n\nWirklich fortfahren?", "DialogShaderDeletionMessage": "Du bist dabei, den Shader Cache zu löschen für :\n\n{0}\n\nWirklich fortfahren?",
"DialogShaderDeletionErrorMessage": "Es ist ein Fehler bei der Löschung des Shader Caches bei {0}: {1} aufgetreten", "DialogShaderDeletionErrorMessage": "Es ist ein Fehler bei der Löschung des Shader Caches bei {0}: {1} aufgetreten",
"DialogRyujinxErrorMessage": "Ein Fehler ist aufgetreten", "DialogRyujinxErrorMessage": "Ein Fehler ist aufgetreten",
@@ -529,7 +536,6 @@
"DialogLoadAppGameAlreadyLoadedSubMessage": "Bitte beende die Emulation oder schließe den Emulator, vor dem Starten eines neuen Spiels", "DialogLoadAppGameAlreadyLoadedSubMessage": "Bitte beende die Emulation oder schließe den Emulator, vor dem Starten eines neuen Spiels",
"DialogUpdateAddUpdateErrorMessage": "Die angegebene Datei enthält keine Updates für den ausgewählten Titel!", "DialogUpdateAddUpdateErrorMessage": "Die angegebene Datei enthält keine Updates für den ausgewählten Titel!",
"DialogSettingsBackendThreadingWarningTitle": "Warnung - Render Threading", "DialogSettingsBackendThreadingWarningTitle": "Warnung - Render Threading",
"DialogSettingsBackendThreadingWarningMessage": "Ryujinx muss muss neu gestartet werden, damit die Änderungen wirksam werden. Abhängig von dem Betriebssystem muss möglicherweise das Multithreading des Treibers manuell deaktiviert werden, wenn Ryujinx verwendet wird.",
"DialogModManagerDeletionWarningMessage": "Du bist dabei, diesen Mod zu lösche. {0}\n\nMöchtest du wirklich fortfahren?", "DialogModManagerDeletionWarningMessage": "Du bist dabei, diesen Mod zu lösche. {0}\n\nMöchtest du wirklich fortfahren?",
"DialogModManagerDeletionAllWarningMessage": "Du bist dabei, alle Mods für diesen Titel zu löschen.\n\nMöchtest du wirklich fortfahren?", "DialogModManagerDeletionAllWarningMessage": "Du bist dabei, alle Mods für diesen Titel zu löschen.\n\nMöchtest du wirklich fortfahren?",
"SettingsTabGraphicsFeaturesOptions": "Erweiterungen", "SettingsTabGraphicsFeaturesOptions": "Erweiterungen",
+14 -8
View File
@@ -66,6 +66,10 @@
"GameListContextMenuManageTitleUpdatesToolTip": "Ανοίγει το παράθυρο διαχείρισης Ενημερώσεων Παιχνιδιού", "GameListContextMenuManageTitleUpdatesToolTip": "Ανοίγει το παράθυρο διαχείρισης Ενημερώσεων Παιχνιδιού",
"GameListContextMenuManageDlc": "Διαχείριση DLC", "GameListContextMenuManageDlc": "Διαχείριση DLC",
"GameListContextMenuManageDlcToolTip": "Ανοίγει το παράθυρο διαχείρισης DLC", "GameListContextMenuManageDlcToolTip": "Ανοίγει το παράθυρο διαχείρισης DLC",
"GameListContextMenuManageCustomSettings": "Διαχείριση Αρχείου Προσαρμοσμένων Ρυθμίσεων",
"GameListContextMenuManageCustomSettingsToolTip": "Διαχειριστείτε τις προσαρμοσμένες ρυθμίσεις για την επιλεγμένη Εφαρμογή",
"GameListContextMenuCustomSettingsOpen": "Άνοιγμα Καταλόγου Προσαρμοσμένων Ρυθμίσεων",
"GameListContextMenuCustomSettingsOpenToolTip": "Ανοίξτε τον κατάλογο που περιέχει τις προσαρμοσμένες ρυθμίσεις της Εφαρμογής",
"GameListContextMenuCacheManagement": "Διαχείριση Προσωρινής Μνήμης", "GameListContextMenuCacheManagement": "Διαχείριση Προσωρινής Μνήμης",
"GameListContextMenuCacheManagementPurgePptc": "Εκκαθάριση Προσωρινής Μνήμης PPTC", "GameListContextMenuCacheManagementPurgePptc": "Εκκαθάριση Προσωρινής Μνήμης PPTC",
"GameListContextMenuCacheManagementPurgePptcToolTip": "Διαγράφει την προσωρινή μνήμη PPTC της εφαρμογής", "GameListContextMenuCacheManagementPurgePptcToolTip": "Διαγράφει την προσωρινή μνήμη PPTC της εφαρμογής",
@@ -172,11 +176,12 @@
"SettingsTabGraphicsAnisotropicFiltering8x": "8x", "SettingsTabGraphicsAnisotropicFiltering8x": "8x",
"SettingsTabGraphicsAnisotropicFiltering16x": "16x", "SettingsTabGraphicsAnisotropicFiltering16x": "16x",
"SettingsTabGraphicsResolutionScale": "Κλίμακα Ανάλυσης:", "SettingsTabGraphicsResolutionScale": "Κλίμακα Ανάλυσης:",
"SettingsTabGraphicsResolutionScaleCustom": "Προσαρμοσμένο (Δεν συνιστάται)", "SettingsTabGraphicsResolutionScale05x": "0.5x (360p/540p)",
"SettingsTabGraphicsResolutionScaleNative": "Εγγενής (720p/1080p)", "SettingsTabGraphicsResolutionScale075x": "0.75x (540p/810p)",
"SettingsTabGraphicsResolutionScale2x": "2x (1440p/2160p)", "SettingsTabGraphicsResolutionScale10x": "1.0x (720p/1080p)",
"SettingsTabGraphicsResolutionScale3x": "3x (2160p/3240p)", "SettingsTabGraphicsResolutionScale20x": "2.0x (1440p/2160p)",
"SettingsTabGraphicsResolutionScale4x": "4x (2880p/4320p) (Not recommended)", "SettingsTabGraphicsResolutionScale30x": "3.0x (2160p/3240p)",
"SettingsTabGraphicsResolutionScale40x": "4.0x (2880p/4320p)",
"SettingsTabGraphicsAspectRatio": "Αναλογία Απεικόνισης:", "SettingsTabGraphicsAspectRatio": "Αναλογία Απεικόνισης:",
"SettingsTabGraphicsAspectRatio4x3": "4:3", "SettingsTabGraphicsAspectRatio4x3": "4:3",
"SettingsTabGraphicsAspectRatio16x9": "16:9", "SettingsTabGraphicsAspectRatio16x9": "16:9",
@@ -207,8 +212,9 @@
"SettingsTabLoggingGraphicsBackendLogLevelAll": "Όλα", "SettingsTabLoggingGraphicsBackendLogLevelAll": "Όλα",
"SettingsTabLoggingEnableDebugLogs": "Ενεργοποίηση Αρχείων Καταγραφής Εντοπισμού Σφαλμάτων", "SettingsTabLoggingEnableDebugLogs": "Ενεργοποίηση Αρχείων Καταγραφής Εντοπισμού Σφαλμάτων",
"SettingsTabInput": "Χειρισμός", "SettingsTabInput": "Χειρισμός",
"SettingsTabInputEnableDockedMode": "Ενεργοποίηση Docked Mode", "SettingsTabSystemEnableDockedMode": "Ενεργοποίηση Docked Mode",
"SettingsTabInputDirectKeyboardAccess": "Άμεση Πρόσβαση στο Πληκτρολόγιο", "SettingsTabInputDirectKeyboardAccess": "Άμεση Πρόσβαση στο Πληκτρολόγιο",
"SettingsButtonDelete": "Διαγραφή",
"SettingsButtonSave": "Αποθήκευση", "SettingsButtonSave": "Αποθήκευση",
"SettingsButtonClose": "Κλείσιμο", "SettingsButtonClose": "Κλείσιμο",
"SettingsButtonOk": "ΟΚ", "SettingsButtonOk": "ΟΚ",
@@ -487,9 +493,10 @@
"DialogProfileDeleteProfileTitle": "Διαγραφή Προφίλ", "DialogProfileDeleteProfileTitle": "Διαγραφή Προφίλ",
"DialogProfileDeleteProfileMessage": "Αυτή η ενέργεια είναι μη αναστρέψιμη, είστε βέβαιοι ότι θέλετε να συνεχίσετε;", "DialogProfileDeleteProfileMessage": "Αυτή η ενέργεια είναι μη αναστρέψιμη, είστε βέβαιοι ότι θέλετε να συνεχίσετε;",
"DialogWarning": "Προειδοποίηση", "DialogWarning": "Προειδοποίηση",
"DialogCustomSettingsDeleteMessage": "Πρόκειται να διαγράψετε τις προσαρμοσμένες ρυθμίσεις για:\n\n{0}\n\nΕίστε βέβαιοι ότι θέλετε να συνεχίσετε;",
"DialogPPTCDeletionMessage": "Πρόκειται να διαγράψετε την προσωρινή μνήμη PPTC για :\n\n{0}\n\nΕίστε βέβαιοι ότι θέλετε να συνεχίσετε;", "DialogPPTCDeletionMessage": "Πρόκειται να διαγράψετε την προσωρινή μνήμη PPTC για :\n\n{0}\n\nΕίστε βέβαιοι ότι θέλετε να συνεχίσετε;",
"DialogPPTCDeletionErrorMessage": "Σφάλμα κατά την εκκαθάριση προσωρινής μνήμης PPTC στο {0}: {1}", "DialogPPTCDeletionErrorMessage": "Σφάλμα κατά την εκκαθάριση προσωρινής μνήμης PPTC στο {0}: {1}",
"DialogPPTCNukeMessage": "You are about to purge all PPTC data from:\n\n{0}\n\nAre you sure you want to proceed?", "DialogPPTCNukeMessage": "Πρόκειται να διαγράψετε όλα τα δεδομένα PPTC από:\n\n{0}\n\nΕίστε βέβαιοι ότι θέλετε να συνεχίσετε;",
"DialogShaderDeletionMessage": "Πρόκειται να διαγράψετε την προσωρινή μνήμη Shader για :\n\n{0}\n\nΕίστε βέβαιοι ότι θέλετε να συνεχίσετε;", "DialogShaderDeletionMessage": "Πρόκειται να διαγράψετε την προσωρινή μνήμη Shader για :\n\n{0}\n\nΕίστε βέβαιοι ότι θέλετε να συνεχίσετε;",
"DialogShaderDeletionErrorMessage": "Σφάλμα κατά την εκκαθάριση προσωρινής μνήμης Shader στο {0}: {1}", "DialogShaderDeletionErrorMessage": "Σφάλμα κατά την εκκαθάριση προσωρινής μνήμης Shader στο {0}: {1}",
"DialogRyujinxErrorMessage": "Το Ryujinx αντιμετώπισε σφάλμα", "DialogRyujinxErrorMessage": "Το Ryujinx αντιμετώπισε σφάλμα",
@@ -528,7 +535,6 @@
"DialogLoadAppGameAlreadyLoadedSubMessage": "Σταματήστε την εξομοίωση ή κλείστε τον εξομοιωτή πριν ξεκινήσετε ένα άλλο παιχνίδι.", "DialogLoadAppGameAlreadyLoadedSubMessage": "Σταματήστε την εξομοίωση ή κλείστε τον εξομοιωτή πριν ξεκινήσετε ένα άλλο παιχνίδι.",
"DialogUpdateAddUpdateErrorMessage": "Το αρχείο δεν περιέχει ενημέρωση για τον επιλεγμένο τίτλο!", "DialogUpdateAddUpdateErrorMessage": "Το αρχείο δεν περιέχει ενημέρωση για τον επιλεγμένο τίτλο!",
"DialogSettingsBackendThreadingWarningTitle": "Προειδοποίηση - Backend Threading", "DialogSettingsBackendThreadingWarningTitle": "Προειδοποίηση - Backend Threading",
"DialogSettingsBackendThreadingWarningMessage": "Το Ryujinx πρέπει να επανεκκινηθεί αφού αλλάξει αυτή η επιλογή για να εφαρμοστεί πλήρως. Ανάλογα με την πλατφόρμα σας, μπορεί να χρειαστεί να απενεργοποιήσετε με μη αυτόματο τρόπο το multithreading του ίδιου του προγράμματος οδήγησης όταν χρησιμοποιείτε το Ryujinx.",
"DialogModManagerDeletionWarningMessage": "You are about to delete the mod: {0}\n\nAre you sure you want to proceed?", "DialogModManagerDeletionWarningMessage": "You are about to delete the mod: {0}\n\nAre you sure you want to proceed?",
"DialogModManagerDeletionAllWarningMessage": "You are about to delete all mods for this title.\n\nAre you sure you want to proceed?", "DialogModManagerDeletionAllWarningMessage": "You are about to delete all mods for this title.\n\nAre you sure you want to proceed?",
"SettingsTabGraphicsFeaturesOptions": "Χαρακτηριστικά", "SettingsTabGraphicsFeaturesOptions": "Χαρακτηριστικά",
+18 -8
View File
@@ -71,6 +71,10 @@
"GameListContextMenuManageTitleUpdatesToolTip": "Opens the Title Update management window", "GameListContextMenuManageTitleUpdatesToolTip": "Opens the Title Update management window",
"GameListContextMenuManageDlc": "Manage DLC", "GameListContextMenuManageDlc": "Manage DLC",
"GameListContextMenuManageDlcToolTip": "Opens the DLC management window", "GameListContextMenuManageDlcToolTip": "Opens the DLC management window",
"GameListContextMenuManageCustomSettings": "Manage Custom Settings",
"GameListContextMenuManageCustomSettingsToolTip": "Opens the Custom Settings management windows",
"GameListContextMenuCustomSettingsOpen": "Open Custom Settings Directory",
"GameListContextMenuCustomSettingsOpenToolTip": "Open the directory which contains Application's custom settings",
"GameListContextMenuCacheManagement": "Cache Management", "GameListContextMenuCacheManagement": "Cache Management",
"GameListContextMenuCacheManagementPurgePptc": "Queue PPTC Rebuild", "GameListContextMenuCacheManagementPurgePptc": "Queue PPTC Rebuild",
"GameListContextMenuCacheManagementPurgePptcToolTip": "Trigger PPTC to rebuild at boot time on the next game launch", "GameListContextMenuCacheManagementPurgePptcToolTip": "Trigger PPTC to rebuild at boot time on the next game launch",
@@ -197,11 +201,12 @@
"SettingsTabGraphicsAnisotropicFiltering8x": "8x", "SettingsTabGraphicsAnisotropicFiltering8x": "8x",
"SettingsTabGraphicsAnisotropicFiltering16x": "16x", "SettingsTabGraphicsAnisotropicFiltering16x": "16x",
"SettingsTabGraphicsResolutionScale": "Resolution Scale:", "SettingsTabGraphicsResolutionScale": "Resolution Scale:",
"SettingsTabGraphicsResolutionScaleCustom": "Custom (Not recommended)", "SettingsTabGraphicsResolutionScale05x": "0.5x (360p/540p)",
"SettingsTabGraphicsResolutionScaleNative": "Native (720p/1080p)", "SettingsTabGraphicsResolutionScale075x": "0.75x (540p/810p)",
"SettingsTabGraphicsResolutionScale2x": "2x (1440p/2160p)", "SettingsTabGraphicsResolutionScale10x": "1.0x (720p/1080p)",
"SettingsTabGraphicsResolutionScale3x": "3x (2160p/3240p)", "SettingsTabGraphicsResolutionScale20x": "2.0x (1440p/2160p)",
"SettingsTabGraphicsResolutionScale4x": "4x (2880p/4320p) (Not recommended)", "SettingsTabGraphicsResolutionScale30x": "3.0x (2160p/3240p)",
"SettingsTabGraphicsResolutionScale40x": "4.0x (2880p/4320p)",
"SettingsTabGraphicsAspectRatio": "Aspect Ratio:", "SettingsTabGraphicsAspectRatio": "Aspect Ratio:",
"SettingsTabGraphicsAspectRatio4x3": "4:3", "SettingsTabGraphicsAspectRatio4x3": "4:3",
"SettingsTabGraphicsAspectRatio16x9": "16:9", "SettingsTabGraphicsAspectRatio16x9": "16:9",
@@ -238,8 +243,9 @@
"SettingsTabLoggingGraphicsBackendLogLevelAll": "All", "SettingsTabLoggingGraphicsBackendLogLevelAll": "All",
"SettingsTabLoggingEnableDebugLogs": "Enable Debug Logs", "SettingsTabLoggingEnableDebugLogs": "Enable Debug Logs",
"SettingsTabInput": "Input", "SettingsTabInput": "Input",
"SettingsTabInputEnableDockedMode": "Docked Mode", "SettingsTabSystemEnableDockedMode": "Docked Mode",
"SettingsTabInputDirectKeyboardAccess": "Direct Keyboard Access", "SettingsTabInputDirectKeyboardAccess": "Direct Keyboard Access",
"SettingsButtonDelete": "Delete",
"SettingsButtonSave": "Save", "SettingsButtonSave": "Save",
"SettingsButtonClose": "Close", "SettingsButtonClose": "Close",
"SettingsButtonOk": "OK", "SettingsButtonOk": "OK",
@@ -525,6 +531,7 @@
"DialogProfileDeleteProfileTitle": "Deleting Profile", "DialogProfileDeleteProfileTitle": "Deleting Profile",
"DialogProfileDeleteProfileMessage": "This action is irreversible, are you sure you want to continue?", "DialogProfileDeleteProfileMessage": "This action is irreversible, are you sure you want to continue?",
"DialogWarning": "Warning", "DialogWarning": "Warning",
"DialogCustomSettingsDeleteMessage": "You are about to delete custom settings for:\n\n{0}\n\nAre you sure you want to proceed?",
"DialogPPTCDeletionMessage": "You are about to queue a PPTC rebuild on the next boot of:\n\n{0}\n\nAre you sure you want to proceed?", "DialogPPTCDeletionMessage": "You are about to queue a PPTC rebuild on the next boot of:\n\n{0}\n\nAre you sure you want to proceed?",
"DialogPPTCDeletionErrorMessage": "Error purging PPTC cache at {0}: {1}", "DialogPPTCDeletionErrorMessage": "Error purging PPTC cache at {0}: {1}",
"DialogPPTCNukeMessage": "You are about to purge all PPTC data from:\n\n{0}\n\nAre you sure you want to proceed?", "DialogPPTCNukeMessage": "You are about to purge all PPTC data from:\n\n{0}\n\nAre you sure you want to proceed?",
@@ -566,7 +573,6 @@
"DialogLoadAppGameAlreadyLoadedSubMessage": "Please stop emulation or close the emulator before launching another game.", "DialogLoadAppGameAlreadyLoadedSubMessage": "Please stop emulation or close the emulator before launching another game.",
"DialogUpdateAddUpdateErrorMessage": "The specified file does not contain an update for the selected title!", "DialogUpdateAddUpdateErrorMessage": "The specified file does not contain an update for the selected title!",
"DialogSettingsBackendThreadingWarningTitle": "Warning - Backend Threading", "DialogSettingsBackendThreadingWarningTitle": "Warning - Backend Threading",
"DialogSettingsBackendThreadingWarningMessage": "Ryujinx must be restarted after changing this option for it to apply fully. Depending on your platform, you may need to manually disable your driver's own multithreading when using Ryujinx's.",
"DialogModManagerDeletionWarningMessage": "You are about to delete the mod: {0}\n\nAre you sure you want to proceed?", "DialogModManagerDeletionWarningMessage": "You are about to delete the mod: {0}\n\nAre you sure you want to proceed?",
"DialogModManagerDeletionAllWarningMessage": "You are about to delete all mods for this title.\n\nAre you sure you want to proceed?", "DialogModManagerDeletionAllWarningMessage": "You are about to delete all mods for this title.\n\nAre you sure you want to proceed?",
"SettingsTabGraphicsFeaturesOptions": "Features", "SettingsTabGraphicsFeaturesOptions": "Features",
@@ -934,5 +940,9 @@
"GameListContextMenuExtractDataAocRomFSToolTip": "Extract the RomFS from a selected DLC file", "GameListContextMenuExtractDataAocRomFSToolTip": "Extract the RomFS from a selected DLC file",
"ExtractAocListHeader": "Select a DLC to Extract", "ExtractAocListHeader": "Select a DLC to Extract",
"SettingsTabSystemSkipUserProfilesManager": "Skip Dialog 'Manage User Profiles'", "SettingsTabSystemSkipUserProfilesManager": "Skip Dialog 'Manage User Profiles'",
"SkipUserProfilesTooltip": "This option skips the 'Manage User Profiles' dialog during gameplay, using a pre-selected profile.\n\nProfile switching is found in 'Settings' - 'Manager User Profiles'. Select the desired profile before loading the game." "SkipUserProfilesTooltip": "This option skips the 'Manage User Profiles' dialog during gameplay, using a pre-selected profile.\n\nProfile switching is found in 'Settings' - 'Manager User Profiles'. Select the desired profile before loading the game.",
"MenuBarActions_StartCapture": "Start RenderDoc Frame Capture",
"MenuBarActions_EndCapture": "End RenderDoc Frame Capture",
"MenuBarActions_DiscardCapture": "Discard RenderDoc Frame Capture",
"MenuBarActions_DiscardCapture_ToolTip": "Ends the currently active RenderDoc Frame Capture, immediately discarding its result."
} }
+19 -9
View File
@@ -66,6 +66,10 @@
"GameListContextMenuManageTitleUpdatesToolTip": "Abrir la ventana de gestión de actualizaciones de esta aplicación", "GameListContextMenuManageTitleUpdatesToolTip": "Abrir la ventana de gestión de actualizaciones de esta aplicación",
"GameListContextMenuManageDlc": "Gestionar DLC", "GameListContextMenuManageDlc": "Gestionar DLC",
"GameListContextMenuManageDlcToolTip": "Abrir la ventana de gestión del DLC", "GameListContextMenuManageDlcToolTip": "Abrir la ventana de gestión del DLC",
"GameListContextMenuManageCustomSettings": "Gestionar Archivo de Configuración Personalizada",
"GameListContextMenuManageCustomSettingsToolTip": "Gestionar la configuración personalizada para la Aplicación seleccionada",
"GameListContextMenuCustomSettingsOpen": "Abrir Directorio de Configuración Personalizada",
"GameListContextMenuCustomSettingsOpenToolTip": "Abrir el directorio que contiene la configuración personalizada de la Aplicación",
"GameListContextMenuCacheManagement": "Gestión de caché ", "GameListContextMenuCacheManagement": "Gestión de caché ",
"GameListContextMenuCacheManagementPurgePptc": "Reconstruir PPTC en cola", "GameListContextMenuCacheManagementPurgePptc": "Reconstruir PPTC en cola",
"GameListContextMenuCacheManagementPurgePptcToolTip": "Elimina la caché de PPTC de esta aplicación", "GameListContextMenuCacheManagementPurgePptcToolTip": "Elimina la caché de PPTC de esta aplicación",
@@ -172,11 +176,12 @@
"SettingsTabGraphicsAnisotropicFiltering8x": "x8", "SettingsTabGraphicsAnisotropicFiltering8x": "x8",
"SettingsTabGraphicsAnisotropicFiltering16x": "x16", "SettingsTabGraphicsAnisotropicFiltering16x": "x16",
"SettingsTabGraphicsResolutionScale": "Escala de resolución:", "SettingsTabGraphicsResolutionScale": "Escala de resolución:",
"SettingsTabGraphicsResolutionScaleCustom": "Personalizada (no recomendado)", "SettingsTabGraphicsResolutionScale05x": "0.5x (360p/540p)",
"SettingsTabGraphicsResolutionScaleNative": "Nativa (720p/1080p)", "SettingsTabGraphicsResolutionScale075x": "0.75x (540p/810p)",
"SettingsTabGraphicsResolutionScale2x": "x2 (1440p/2160p)", "SettingsTabGraphicsResolutionScale10x": "1.0x (720p/1080p)",
"SettingsTabGraphicsResolutionScale3x": "x3 (2160p/3240p)", "SettingsTabGraphicsResolutionScale20x": "2.0x (1440p/2160p)",
"SettingsTabGraphicsResolutionScale4x": "4x (2880p/4320p) (no recomendado)", "SettingsTabGraphicsResolutionScale30x": "3.0x (2160p/3240p)",
"SettingsTabGraphicsResolutionScale40x": "4.0x (2880p/4320p)",
"SettingsTabGraphicsAspectRatio": "Relación de aspecto:", "SettingsTabGraphicsAspectRatio": "Relación de aspecto:",
"SettingsTabGraphicsAspectRatio4x3": "4:3", "SettingsTabGraphicsAspectRatio4x3": "4:3",
"SettingsTabGraphicsAspectRatio16x9": "16:9", "SettingsTabGraphicsAspectRatio16x9": "16:9",
@@ -207,8 +212,9 @@
"SettingsTabLoggingGraphicsBackendLogLevelAll": "Todo", "SettingsTabLoggingGraphicsBackendLogLevelAll": "Todo",
"SettingsTabLoggingEnableDebugLogs": "Habilitar registros de debug", "SettingsTabLoggingEnableDebugLogs": "Habilitar registros de debug",
"SettingsTabInput": "Entrada", "SettingsTabInput": "Entrada",
"SettingsTabInputEnableDockedMode": "Modo dock/TV", "SettingsTabSystemEnableDockedMode": "Modo dock/TV",
"SettingsTabInputDirectKeyboardAccess": "Acceso directo al teclado", "SettingsTabInputDirectKeyboardAccess": "Acceso directo al teclado",
"SettingsButtonDelete": "Eliminar",
"SettingsButtonSave": "Guardar", "SettingsButtonSave": "Guardar",
"SettingsButtonClose": "Cerrar", "SettingsButtonClose": "Cerrar",
"SettingsButtonOk": "Aceptar", "SettingsButtonOk": "Aceptar",
@@ -487,9 +493,10 @@
"DialogProfileDeleteProfileTitle": "Eliminando perfil", "DialogProfileDeleteProfileTitle": "Eliminando perfil",
"DialogProfileDeleteProfileMessage": "Esta acción es irreversible, ¿estás seguro de querer continuar?", "DialogProfileDeleteProfileMessage": "Esta acción es irreversible, ¿estás seguro de querer continuar?",
"DialogWarning": "Advertencia", "DialogWarning": "Advertencia",
"DialogCustomSettingsDeleteMessage": "Está a punto de eliminar la configuración personalizada para:\n\n{0}\n\n¿Está seguro de que desea continuar?",
"DialogPPTCDeletionMessage": "Vas a borrar la caché de PPTC para:\n\n{0}\n\n¿Estás seguro de querer continuar?", "DialogPPTCDeletionMessage": "Vas a borrar la caché de PPTC para:\n\n{0}\n\n¿Estás seguro de querer continuar?",
"DialogPPTCDeletionErrorMessage": "Error purgando la caché de PPTC en {0}: {1}", "DialogPPTCDeletionErrorMessage": "Error purgando la caché de PPTC en {0}: {1}",
"DialogPPTCNukeMessage": "You are about to purge all PPTC data from:\n\n{0}\n\nAre you sure you want to proceed?", "DialogPPTCNukeMessage": "Está a punto de eliminar todos los datos PPTC de:\n\n{0}\n\n¿Está seguro de que desea continuar?",
"DialogShaderDeletionMessage": "Vas a borrar la caché de sombreadores para:\n\n{0}\n\n¿Estás seguro de querer continuar?", "DialogShaderDeletionMessage": "Vas a borrar la caché de sombreadores para:\n\n{0}\n\n¿Estás seguro de querer continuar?",
"DialogShaderDeletionErrorMessage": "Error purgando la caché de sombreadores en {0}: {1}", "DialogShaderDeletionErrorMessage": "Error purgando la caché de sombreadores en {0}: {1}",
"DialogRyujinxErrorMessage": "Ryujinx ha encontrado un error", "DialogRyujinxErrorMessage": "Ryujinx ha encontrado un error",
@@ -528,7 +535,6 @@
"DialogLoadAppGameAlreadyLoadedSubMessage": "Por favor, detén la emulación o cierra el emulador antes de iniciar otro juego.", "DialogLoadAppGameAlreadyLoadedSubMessage": "Por favor, detén la emulación o cierra el emulador antes de iniciar otro juego.",
"DialogUpdateAddUpdateErrorMessage": "¡Ese archivo no contiene una actualización para el título seleccionado!", "DialogUpdateAddUpdateErrorMessage": "¡Ese archivo no contiene una actualización para el título seleccionado!",
"DialogSettingsBackendThreadingWarningTitle": "Advertencia - multihilado de gráficos", "DialogSettingsBackendThreadingWarningTitle": "Advertencia - multihilado de gráficos",
"DialogSettingsBackendThreadingWarningMessage": "Ryujinx debe reiniciarse para aplicar este cambio. Dependiendo de tu plataforma, puede que tengas que desactivar manualmente la optimización enlazada de tus controladores gráficos para usar el multihilo de Ryujinx.",
"DialogModManagerDeletionWarningMessage": "Estás a punto de eliminar el mod: {0}\n\n¿Estás seguro de que quieres continuar?", "DialogModManagerDeletionWarningMessage": "Estás a punto de eliminar el mod: {0}\n\n¿Estás seguro de que quieres continuar?",
"DialogModManagerDeletionAllWarningMessage": "Estás a punto de eliminar todos los Mods para este título.\n\n¿Estás seguro de que quieres continuar?", "DialogModManagerDeletionAllWarningMessage": "Estás a punto de eliminar todos los Mods para este título.\n\n¿Estás seguro de que quieres continuar?",
"SettingsTabGraphicsFeaturesOptions": "Funcionalidades", "SettingsTabGraphicsFeaturesOptions": "Funcionalidades",
@@ -807,5 +813,9 @@
"MultiplayerModeDisabled": "Deshabilitar", "MultiplayerModeDisabled": "Deshabilitar",
"MultiplayerModeLdnMitm": "ldn_mitm", "MultiplayerModeLdnMitm": "ldn_mitm",
"SettingsTabSystemSkipUserProfilesManager": "Omitir el Diálogo 'Gestionar Perfiles de Usuario'", "SettingsTabSystemSkipUserProfilesManager": "Omitir el Diálogo 'Gestionar Perfiles de Usuario'",
"SkipUserProfilesTooltip": "Esta opción omite el diálogo de 'Gestionar perfiles de usuario' durante el juego, utilizando un perfil preseleccionado.\n\nEl cambio de perfil se encuentra en 'Configuración' - 'Gestionar perfiles de usuario'. Seleccione el perfil deseado antes de cargar el juego." "SkipUserProfilesTooltip": "Esta opción omite el diálogo de 'Gestionar perfiles de usuario' durante el juego, utilizando un perfil preseleccionado.\n\nEl cambio de perfil se encuentra en 'Configuración' - 'Gestionar perfiles de usuario'. Seleccione el perfil deseado antes de cargar el juego.",
"MenuBarActions_StartCapture": "Iniciar una captura de fotograma de RenderDoc",
"MenuBarActions_EndCapture": "Detener la captura de fotograma de RenderDoc",
"MenuBarActions_DiscardCapture": "Descartar la captura de fotograma de RenderDoc",
"MenuBarActions_DiscardCapture_ToolTip": "Finaliza la captura de fotograma de RenderDoc actualmente activa y descarta inmediatamente su resultado."
} }
+19 -9
View File
@@ -66,6 +66,10 @@
"GameListContextMenuManageTitleUpdatesToolTip": "Ouvre la fenêtre de gestion des mises à jour du jeu", "GameListContextMenuManageTitleUpdatesToolTip": "Ouvre la fenêtre de gestion des mises à jour du jeu",
"GameListContextMenuManageDlc": "Gérer les DLC", "GameListContextMenuManageDlc": "Gérer les DLC",
"GameListContextMenuManageDlcToolTip": "Ouvre la fenêtre de gestion des DLC", "GameListContextMenuManageDlcToolTip": "Ouvre la fenêtre de gestion des DLC",
"GameListContextMenuManageCustomSettings": "Gérer les paramètres personnalisés",
"GameListContextMenuManageCustomSettingsToolTip": "Gérer les paramètres personnalisés pour l'Application sélectionnée",
"GameListContextMenuCustomSettingsOpen": "Ouvrir le Répertoire des Paramètres Personnalisés",
"GameListContextMenuCustomSettingsOpenToolTip": "Ouvrir le répertoire contenant les paramètres personnalisés de l'Application",
"GameListContextMenuCacheManagement": "Gestion des caches", "GameListContextMenuCacheManagement": "Gestion des caches",
"GameListContextMenuCacheManagementPurgePptc": "Reconstruction du PPTC", "GameListContextMenuCacheManagementPurgePptc": "Reconstruction du PPTC",
"GameListContextMenuCacheManagementPurgePptcToolTip": "Effectuer une reconstruction du PPTC au prochain démarrage du jeu", "GameListContextMenuCacheManagementPurgePptcToolTip": "Effectuer une reconstruction du PPTC au prochain démarrage du jeu",
@@ -174,11 +178,12 @@
"SettingsTabGraphicsAnisotropicFiltering8x": "x8", "SettingsTabGraphicsAnisotropicFiltering8x": "x8",
"SettingsTabGraphicsAnisotropicFiltering16x": "x16", "SettingsTabGraphicsAnisotropicFiltering16x": "x16",
"SettingsTabGraphicsResolutionScale": "Échelle de résolution:", "SettingsTabGraphicsResolutionScale": "Échelle de résolution:",
"SettingsTabGraphicsResolutionScaleCustom": "Personnalisée (Non recommandée)", "SettingsTabGraphicsResolutionScale05x": "0.5x (360p/540p)",
"SettingsTabGraphicsResolutionScaleNative": "Natif (720p/1080p)", "SettingsTabGraphicsResolutionScale075x": "0.75x (540p/810p)",
"SettingsTabGraphicsResolutionScale2x": "x2 (1440p/2160p)", "SettingsTabGraphicsResolutionScale10x": "1.0x (720p/1080p)",
"SettingsTabGraphicsResolutionScale3x": "x3 (2160p/3240p)", "SettingsTabGraphicsResolutionScale20x": "2.0x (1440p/2160p)",
"SettingsTabGraphicsResolutionScale4x": "4x (2880p/4320p) (Non recommandé)", "SettingsTabGraphicsResolutionScale30x": "3.0x (2160p/3240p)",
"SettingsTabGraphicsResolutionScale40x": "4.0x (2880p/4320p)",
"SettingsTabGraphicsAspectRatio": "Format d'affichage :", "SettingsTabGraphicsAspectRatio": "Format d'affichage :",
"SettingsTabGraphicsAspectRatio4x3": "4:3", "SettingsTabGraphicsAspectRatio4x3": "4:3",
"SettingsTabGraphicsAspectRatio16x9": "16:9", "SettingsTabGraphicsAspectRatio16x9": "16:9",
@@ -209,8 +214,9 @@
"SettingsTabLoggingGraphicsBackendLogLevelAll": "Tout", "SettingsTabLoggingGraphicsBackendLogLevelAll": "Tout",
"SettingsTabLoggingEnableDebugLogs": "Activer les journaux de debug", "SettingsTabLoggingEnableDebugLogs": "Activer les journaux de debug",
"SettingsTabInput": "Contrôles", "SettingsTabInput": "Contrôles",
"SettingsTabInputEnableDockedMode": "Active le mode station d'accueil", "SettingsTabSystemEnableDockedMode": "Active le mode station d'accueil",
"SettingsTabInputDirectKeyboardAccess": "Accès direct au clavier", "SettingsTabInputDirectKeyboardAccess": "Accès direct au clavier",
"SettingsButtonDelete": "Supprimer",
"SettingsButtonSave": "Enregistrer", "SettingsButtonSave": "Enregistrer",
"SettingsButtonClose": "Fermer", "SettingsButtonClose": "Fermer",
"SettingsButtonOk": "OK", "SettingsButtonOk": "OK",
@@ -489,9 +495,10 @@
"DialogProfileDeleteProfileTitle": "Supprimer le profil", "DialogProfileDeleteProfileTitle": "Supprimer le profil",
"DialogProfileDeleteProfileMessage": "Cette action est irréversible, êtes-vous sûr de vouloir continuer ?", "DialogProfileDeleteProfileMessage": "Cette action est irréversible, êtes-vous sûr de vouloir continuer ?",
"DialogWarning": "Avertissement", "DialogWarning": "Avertissement",
"DialogCustomSettingsDeleteMessage": "Vous êtes sur le point de supprimer les paramètres personnalisés pour :\n\n{0}\n\nÊtes-vous sûr de vouloir continuer ?",
"DialogPPTCDeletionMessage": "Vous êtes sur le point de mettre en file d'attente une reconstruction PPTC au prochain démarrage de :\n\n{0}\n\nÊtes-vous sûr de vouloir continuer ?", "DialogPPTCDeletionMessage": "Vous êtes sur le point de mettre en file d'attente une reconstruction PPTC au prochain démarrage de :\n\n{0}\n\nÊtes-vous sûr de vouloir continuer ?",
"DialogPPTCDeletionErrorMessage": "Erreur lors de la purge du cache PPTC à {0}: {1}", "DialogPPTCDeletionErrorMessage": "Erreur lors de la purge du cache PPTC à {0}: {1}",
"DialogPPTCNukeMessage": "You are about to purge all PPTC data from:\n\n{0}\n\nAre you sure you want to proceed?", "DialogPPTCNukeMessage": "Vous êtes sur le point de supprimer toutes les données PPTC de :\n\n{0}\n\nÊtes-vous sûr de vouloir continuer ?",
"DialogShaderDeletionMessage": "Vous êtes sur le point de supprimer le cache du Shader pour :\n\n{0}\n\nÊtes-vous sûr de vouloir continuer ?", "DialogShaderDeletionMessage": "Vous êtes sur le point de supprimer le cache du Shader pour :\n\n{0}\n\nÊtes-vous sûr de vouloir continuer ?",
"DialogShaderDeletionErrorMessage": "Erreur lors de la purge du cache du Shader à {0}: {1}", "DialogShaderDeletionErrorMessage": "Erreur lors de la purge du cache du Shader à {0}: {1}",
"DialogRyujinxErrorMessage": "Ryujinx a rencontré une erreur", "DialogRyujinxErrorMessage": "Ryujinx a rencontré une erreur",
@@ -530,7 +537,6 @@
"DialogLoadAppGameAlreadyLoadedSubMessage": "Veuillez arrêter l'émulation ou fermer l'émulateur avant de lancer un autre jeu.", "DialogLoadAppGameAlreadyLoadedSubMessage": "Veuillez arrêter l'émulation ou fermer l'émulateur avant de lancer un autre jeu.",
"DialogUpdateAddUpdateErrorMessage": "Le fichier spécifié ne contient pas de mise à jour pour le titre sélectionné !", "DialogUpdateAddUpdateErrorMessage": "Le fichier spécifié ne contient pas de mise à jour pour le titre sélectionné !",
"DialogSettingsBackendThreadingWarningTitle": "Avertissement - Backend Threading ", "DialogSettingsBackendThreadingWarningTitle": "Avertissement - Backend Threading ",
"DialogSettingsBackendThreadingWarningMessage": "Ryujinx doit être redémarré après avoir changé cette option pour qu'elle s'applique complètement. Selon votre plate-forme, vous devrez peut-être désactiver manuellement le multithreading de votre pilote lorsque vous utilisez Ryujinx.",
"DialogModManagerDeletionWarningMessage": "Vous êtes sur le point de supprimer le mod : {0}\n\nÊtes-vous sûr de vouloir continuer ?", "DialogModManagerDeletionWarningMessage": "Vous êtes sur le point de supprimer le mod : {0}\n\nÊtes-vous sûr de vouloir continuer ?",
"DialogModManagerDeletionAllWarningMessage": "Vous êtes sur le point de supprimer tous les mods pour ce titre.\n\nÊtes-vous sûr de vouloir continuer ?", "DialogModManagerDeletionAllWarningMessage": "Vous êtes sur le point de supprimer tous les mods pour ce titre.\n\nÊtes-vous sûr de vouloir continuer ?",
"SettingsTabGraphicsFeaturesOptions": "Fonctionnalités", "SettingsTabGraphicsFeaturesOptions": "Fonctionnalités",
@@ -828,5 +834,9 @@
"GameListContextMenuExtractDataAocRomFSToolTip": "Extraire les RomFS d'un fichier DLC choisi", "GameListContextMenuExtractDataAocRomFSToolTip": "Extraire les RomFS d'un fichier DLC choisi",
"ExtractAocListHeader": "Choisissez un DLC à extraire", "ExtractAocListHeader": "Choisissez un DLC à extraire",
"SettingsTabSystemSkipUserProfilesManager": "Ignorer la Boîte de Dialogue « Gérer les Profils d'Utilisateurs »", "SettingsTabSystemSkipUserProfilesManager": "Ignorer la Boîte de Dialogue « Gérer les Profils d'Utilisateurs »",
"SkipUserProfilesTooltip": "Cette option permet d'éviter le dialogue du 'Gérer les profils d'utilisateurs' pendant le jeu, en utilisant un profil pré-sélectionné.\n\nLa sélection du profil se trouve dans 'Paramètres' - 'Gérer les profils d'utilisateurs'. Sélectionnez le profil souhaité avant de charger la partie." "SkipUserProfilesTooltip": "Cette option permet d'éviter le dialogue du 'Gérer les profils d'utilisateurs' pendant le jeu, en utilisant un profil pré-sélectionné.\n\nLa sélection du profil se trouve dans 'Paramètres' - 'Gérer les profils d'utilisateurs'. Sélectionnez le profil souhaité avant de charger la partie.",
"MenuBarActions_StartCapture": "Démarrer une capture de trame RenderDoc",
"MenuBarActions_EndCapture": "Arrêter la capture de trame RenderDoc",
"MenuBarActions_DiscardCapture": "Supprimer la capture de trame RenderDoc",
"MenuBarActions_DiscardCapture_ToolTip": "Met fin à la capture de trame RenderDoc en cours, en supprimant immédiatement son résultat."
} }
+14 -8
View File
@@ -66,6 +66,10 @@
"GameListContextMenuManageTitleUpdatesToolTip": "פותח את חלון מנהל עדכוני המשחקים", "GameListContextMenuManageTitleUpdatesToolTip": "פותח את חלון מנהל עדכוני המשחקים",
"GameListContextMenuManageDlc": "מנהל הרחבות", "GameListContextMenuManageDlc": "מנהל הרחבות",
"GameListContextMenuManageDlcToolTip": "פותח את חלון מנהל הרחבות המשחקים", "GameListContextMenuManageDlcToolTip": "פותח את חלון מנהל הרחבות המשחקים",
"GameListContextMenuManageCustomSettings": "נהל קובץ הגדרות מותאמות אישית",
"GameListContextMenuManageCustomSettingsToolTip": "נהל הגדרות מותאמות אישית עבור האפליקציה שנבחרה",
"GameListContextMenuCustomSettingsOpen": "פתח תיקיית הגדרות מותאמות אישית",
"GameListContextMenuCustomSettingsOpenToolTip": "פתח את התיקייה המכילה את הגדרות מותאמות אישית של האפליקציה",
"GameListContextMenuCacheManagement": "ניהול מטמון", "GameListContextMenuCacheManagement": "ניהול מטמון",
"GameListContextMenuCacheManagementPurgePptc": "הוסף PPTC לתור בנייה מחדש", "GameListContextMenuCacheManagementPurgePptc": "הוסף PPTC לתור בנייה מחדש",
"GameListContextMenuCacheManagementPurgePptcToolTip": "גרום ל-PPTC להבנות מחדש בפתיחה הבאה של המשחק", "GameListContextMenuCacheManagementPurgePptcToolTip": "גרום ל-PPTC להבנות מחדש בפתיחה הבאה של המשחק",
@@ -172,11 +176,12 @@
"SettingsTabGraphicsAnisotropicFiltering8x": "8x", "SettingsTabGraphicsAnisotropicFiltering8x": "8x",
"SettingsTabGraphicsAnisotropicFiltering16x": "16x", "SettingsTabGraphicsAnisotropicFiltering16x": "16x",
"SettingsTabGraphicsResolutionScale": "קנה מידה של רזולוציה:", "SettingsTabGraphicsResolutionScale": "קנה מידה של רזולוציה:",
"SettingsTabGraphicsResolutionScaleCustom": "מותאם אישית (לא מומלץ)", "SettingsTabGraphicsResolutionScale05x": "0.5x (360p/540p)",
"SettingsTabGraphicsResolutionScaleNative": "מקורי (720p/1080p)", "SettingsTabGraphicsResolutionScale075x": "0.75x (540p/810p)",
"SettingsTabGraphicsResolutionScale2x": "2x (1440p/2160p)", "SettingsTabGraphicsResolutionScale10x": "1.0x (720p/1080p)",
"SettingsTabGraphicsResolutionScale3x": "3x (2160p/3240p)", "SettingsTabGraphicsResolutionScale20x": "2.0x (1440p/2160p)",
"SettingsTabGraphicsResolutionScale4x": "4x (2880p/4320p) (לא מומלץ)", "SettingsTabGraphicsResolutionScale30x": "3.0x (2160p/3240p)",
"SettingsTabGraphicsResolutionScale40x": "4.0x (2880p/4320p)",
"SettingsTabGraphicsAspectRatio": "יחס גובה-רוחב:", "SettingsTabGraphicsAspectRatio": "יחס גובה-רוחב:",
"SettingsTabGraphicsAspectRatio4x3": "4:3", "SettingsTabGraphicsAspectRatio4x3": "4:3",
"SettingsTabGraphicsAspectRatio16x9": "16:9", "SettingsTabGraphicsAspectRatio16x9": "16:9",
@@ -207,8 +212,9 @@
"SettingsTabLoggingGraphicsBackendLogLevelAll": "הכל", "SettingsTabLoggingGraphicsBackendLogLevelAll": "הכל",
"SettingsTabLoggingEnableDebugLogs": "אפשר רישום ניפוי באגים", "SettingsTabLoggingEnableDebugLogs": "אפשר רישום ניפוי באגים",
"SettingsTabInput": "קלט", "SettingsTabInput": "קלט",
"SettingsTabInputEnableDockedMode": "מצב עגינה", "SettingsTabSystemEnableDockedMode": "מצב עגינה",
"SettingsTabInputDirectKeyboardAccess": "גישה ישירה למקלדת", "SettingsTabInputDirectKeyboardAccess": "גישה ישירה למקלדת",
"SettingsButtonDelete": "מחק",
"SettingsButtonSave": "שמירה", "SettingsButtonSave": "שמירה",
"SettingsButtonClose": "סגירה", "SettingsButtonClose": "סגירה",
"SettingsButtonOk": "אישור", "SettingsButtonOk": "אישור",
@@ -487,9 +493,10 @@
"DialogProfileDeleteProfileTitle": "מוחק פרופיל", "DialogProfileDeleteProfileTitle": "מוחק פרופיל",
"DialogProfileDeleteProfileMessage": "פעולה זו היא בלתי הפיכה, האם אתם בטוחים שברצונכם להמשיך?", "DialogProfileDeleteProfileMessage": "פעולה זו היא בלתי הפיכה, האם אתם בטוחים שברצונכם להמשיך?",
"DialogWarning": "אזהרה", "DialogWarning": "אזהרה",
"DialogCustomSettingsDeleteMessage": "אתה עומד למחוק הגדרות מותאמות אישית עבור:\n\n{0}\n\nהאם אתה בטוח שברצונך להמשיך?",
"DialogPPTCDeletionMessage": "אם תמשיכו אתם עומדים לגרום לבנייה מחדש של מטמון ה-PPTC עבור:\n\n{0}", "DialogPPTCDeletionMessage": "אם תמשיכו אתם עומדים לגרום לבנייה מחדש של מטמון ה-PPTC עבור:\n\n{0}",
"DialogPPTCDeletionErrorMessage": "שגיאה בטיהור מטמון PPTC ב-{0}: {1}", "DialogPPTCDeletionErrorMessage": "שגיאה בטיהור מטמון PPTC ב-{0}: {1}",
"DialogPPTCNukeMessage": "You are about to purge all PPTC data from:\n\n{0}\n\nAre you sure you want to proceed?", "DialogPPTCNukeMessage": "אתה עומד למחוק את כל נתוני PPTC מ:\n\n{0}\n\nהאם אתה בטוח שברצונך להמשיך?",
"DialogShaderDeletionMessage": "אם תמשיכו אתם עומדים למחוק את מטמון ההצללות עבור:\n\n{0}", "DialogShaderDeletionMessage": "אם תמשיכו אתם עומדים למחוק את מטמון ההצללות עבור:\n\n{0}",
"DialogShaderDeletionErrorMessage": "שגיאה בניקוי מטמון ההצללות ב-{0}: {1}", "DialogShaderDeletionErrorMessage": "שגיאה בניקוי מטמון ההצללות ב-{0}: {1}",
"DialogRyujinxErrorMessage": "ריוג'ינקס נתקלה בשגיאה", "DialogRyujinxErrorMessage": "ריוג'ינקס נתקלה בשגיאה",
@@ -528,7 +535,6 @@
"DialogLoadAppGameAlreadyLoadedSubMessage": "אנא הפסק את האמולציה או סגור את האמולטור לפני הפעלת משחק אחר.", "DialogLoadAppGameAlreadyLoadedSubMessage": "אנא הפסק את האמולציה או סגור את האמולטור לפני הפעלת משחק אחר.",
"DialogUpdateAddUpdateErrorMessage": "הקובץ שצוין אינו מכיל עדכון עבור המשחק שנבחר!", "DialogUpdateAddUpdateErrorMessage": "הקובץ שצוין אינו מכיל עדכון עבור המשחק שנבחר!",
"DialogSettingsBackendThreadingWarningTitle": "אזהרה - ריבוי תהליכי רקע", "DialogSettingsBackendThreadingWarningTitle": "אזהרה - ריבוי תהליכי רקע",
"DialogSettingsBackendThreadingWarningMessage": "יש להפעיל מחדש את ריוג'ינקס לאחר שינוי אפשרות זו כדי שהיא תחול במלואה. בהתאם לפלטפורמה שלך, ייתכן שיהיה עליך להשבית ידנית את ריבוי ההליכים של ההתקן שלך בעת השימוש ב-ריוג'ינקס.",
"DialogModManagerDeletionWarningMessage": "אתה עומד למחוק את המוד: {0}\nהאם אתה בטוח שאתה רוצה להמשיך?", "DialogModManagerDeletionWarningMessage": "אתה עומד למחוק את המוד: {0}\nהאם אתה בטוח שאתה רוצה להמשיך?",
"DialogModManagerDeletionAllWarningMessage": "אתה עומד למחוק את כל המודים בשביל משחק זה.\n\nהאם אתה בטוח שאתה רוצה להמשיך?", "DialogModManagerDeletionAllWarningMessage": "אתה עומד למחוק את כל המודים בשביל משחק זה.\n\nהאם אתה בטוח שאתה רוצה להמשיך?",
"SettingsTabGraphicsFeaturesOptions": "אפשרויות", "SettingsTabGraphicsFeaturesOptions": "אפשרויות",
+16 -10
View File
@@ -70,6 +70,10 @@
"GameListContextMenuManageTitleUpdatesToolTip": "Apre la finestra di gestione aggiornamenti del gioco", "GameListContextMenuManageTitleUpdatesToolTip": "Apre la finestra di gestione aggiornamenti del gioco",
"GameListContextMenuManageDlc": "Gestisci DLC", "GameListContextMenuManageDlc": "Gestisci DLC",
"GameListContextMenuManageDlcToolTip": "Apre la finestra di gestione dei DLC", "GameListContextMenuManageDlcToolTip": "Apre la finestra di gestione dei DLC",
"GameListContextMenuManageCustomSettings": "Gestisci le impostazioni personalizzate",
"GameListContextMenuManageCustomSettingsToolTip": "Gestisci le impostazioni personalizzate per l'Applicazione selezionata",
"GameListContextMenuCustomSettingsOpen": "Apri Directory Impostazioni Personalizzate",
"GameListContextMenuCustomSettingsOpenToolTip": "Apri la directory che contiene le impostazioni personalizzate dell'Applicazione",
"GameListContextMenuCacheManagement": "Gestione della cache", "GameListContextMenuCacheManagement": "Gestione della cache",
"GameListContextMenuCacheManagementPurgePptc": "Accoda rigenerazione della cache PPTC", "GameListContextMenuCacheManagementPurgePptc": "Accoda rigenerazione della cache PPTC",
"GameListContextMenuCacheManagementPurgePptcToolTip": "Esegue la rigenerazione della cache PPTC al prossimo avvio del gioco", "GameListContextMenuCacheManagementPurgePptcToolTip": "Esegue la rigenerazione della cache PPTC al prossimo avvio del gioco",
@@ -195,11 +199,12 @@
"SettingsTabGraphicsAnisotropicFiltering8x": "8x", "SettingsTabGraphicsAnisotropicFiltering8x": "8x",
"SettingsTabGraphicsAnisotropicFiltering16x": "16x", "SettingsTabGraphicsAnisotropicFiltering16x": "16x",
"SettingsTabGraphicsResolutionScale": "Scala della risoluzione:", "SettingsTabGraphicsResolutionScale": "Scala della risoluzione:",
"SettingsTabGraphicsResolutionScaleCustom": "Personalizzata (Non raccomandata)", "SettingsTabGraphicsResolutionScale05x": "0.5x (360p/540p)",
"SettingsTabGraphicsResolutionScaleNative": "Nativa (720p/1080p)", "SettingsTabGraphicsResolutionScale075x": "0.75x (540p/810p)",
"SettingsTabGraphicsResolutionScale2x": "2x (1440p/2160p)", "SettingsTabGraphicsResolutionScale10x": "1.0x (720p/1080p)",
"SettingsTabGraphicsResolutionScale3x": "3x (2160p/3240p)", "SettingsTabGraphicsResolutionScale20x": "2.0x (1440p/2160p)",
"SettingsTabGraphicsResolutionScale4x": "4x (2880p/4320p) (Non consigliato)", "SettingsTabGraphicsResolutionScale30x": "3.0x (2160p/3240p)",
"SettingsTabGraphicsResolutionScale40x": "4.0x (2880p/4320p)",
"SettingsTabGraphicsAspectRatio": "Rapporto d'aspetto:", "SettingsTabGraphicsAspectRatio": "Rapporto d'aspetto:",
"SettingsTabGraphicsAspectRatio4x3": "4:3", "SettingsTabGraphicsAspectRatio4x3": "4:3",
"SettingsTabGraphicsAspectRatio16x9": "16:9", "SettingsTabGraphicsAspectRatio16x9": "16:9",
@@ -230,8 +235,9 @@
"SettingsTabLoggingGraphicsBackendLogLevelAll": "Tutto", "SettingsTabLoggingGraphicsBackendLogLevelAll": "Tutto",
"SettingsTabLoggingEnableDebugLogs": "Attiva log di debug", "SettingsTabLoggingEnableDebugLogs": "Attiva log di debug",
"SettingsTabInput": "Comandi", "SettingsTabInput": "Comandi",
"SettingsTabInputEnableDockedMode": "Attiva modalità TV", "SettingsTabSystemEnableDockedMode": "Attiva modalità TV",
"SettingsTabInputDirectKeyboardAccess": "Accesso diretto alla tastiera", "SettingsTabInputDirectKeyboardAccess": "Accesso diretto alla tastiera",
"SettingsButtonDelete": "Elimina",
"SettingsButtonSave": "Salva", "SettingsButtonSave": "Salva",
"SettingsButtonClose": "Chiudi", "SettingsButtonClose": "Chiudi",
"SettingsButtonOk": "OK", "SettingsButtonOk": "OK",
@@ -515,10 +521,11 @@
"DialogProfileDeleteProfileTitle": "Eliminazione profilo", "DialogProfileDeleteProfileTitle": "Eliminazione profilo",
"DialogProfileDeleteProfileMessage": "Quest'azione è irreversibile, sei sicuro di voler continuare?", "DialogProfileDeleteProfileMessage": "Quest'azione è irreversibile, sei sicuro di voler continuare?",
"DialogWarning": "Avviso", "DialogWarning": "Avviso",
"DialogPPTCDeletionMessage": "Stai per accodare la rigenerazione della cache PPTC al prossimo avvio per:\n\n{0}\n\nSei sicuro di voler proseguire?", "DialogCustomSettingsDeleteMessage": "Stai per eliminare le impostazioni personalizzate per:\n\n{0}\n\nSei sicuro di voler procedere?",
"DialogPPTCDeletionMessage": "Stai per accodare la rigenerazione della cache PPTC al prossimo avvio per:\n\n{0}\n\nSei sicuro di voler procedere?",
"DialogPPTCDeletionErrorMessage": "Errore nell'eliminazione della cache PPTC a {0}: {1}", "DialogPPTCDeletionErrorMessage": "Errore nell'eliminazione della cache PPTC a {0}: {1}",
"DialogPPTCNukeMessage": "Stai per eliminare i tutti i dati della cache PPTC da:\n\n{0}\n\nSei sicuro di voler proseguire?", "DialogPPTCNukeMessage": "Stai per eliminare tutti i dati PPTC da:\n\n{0}\n\nSei sicuro di voler procedere?",
"DialogShaderDeletionMessage": "Stai per eliminare la cache degli shader per:\n\n{0}\n\nSei sicuro di voler proseguire?", "DialogShaderDeletionMessage": "Stai per eliminare la cache degli shader per:\n\n{0}\n\nSei sicuro di voler procedere?",
"DialogShaderDeletionErrorMessage": "Errore nell'eliminazione della cache degli shader a {0}: {1}", "DialogShaderDeletionErrorMessage": "Errore nell'eliminazione della cache degli shader a {0}: {1}",
"DialogRyujinxErrorMessage": "Ryujinx ha riscontrato un errore", "DialogRyujinxErrorMessage": "Ryujinx ha riscontrato un errore",
"DialogInvalidTitleIdErrorMessage": "Errore UI: Il gioco selezionato non ha un ID titolo valido", "DialogInvalidTitleIdErrorMessage": "Errore UI: Il gioco selezionato non ha un ID titolo valido",
@@ -556,7 +563,6 @@
"DialogLoadAppGameAlreadyLoadedSubMessage": "Ferma l'emulazione o chiudi l'emulatore prima di avviare un altro gioco.", "DialogLoadAppGameAlreadyLoadedSubMessage": "Ferma l'emulazione o chiudi l'emulatore prima di avviare un altro gioco.",
"DialogUpdateAddUpdateErrorMessage": "Il file specificato non contiene un aggiornamento per il titolo selezionato!", "DialogUpdateAddUpdateErrorMessage": "Il file specificato non contiene un aggiornamento per il titolo selezionato!",
"DialogSettingsBackendThreadingWarningTitle": "Avviso - Backend Threading", "DialogSettingsBackendThreadingWarningTitle": "Avviso - Backend Threading",
"DialogSettingsBackendThreadingWarningMessage": "Ryujinx deve essere riavviato dopo aver cambiato questa opzione per applicarla completamente. A seconda della tua piattaforma, potrebbe essere necessario disabilitare manualmente il multithreading del driver quando usi quello di Ryujinx.",
"DialogModManagerDeletionWarningMessage": "Stai per eliminare la mod: {0}\n\nConfermi di voler procedere?", "DialogModManagerDeletionWarningMessage": "Stai per eliminare la mod: {0}\n\nConfermi di voler procedere?",
"DialogModManagerDeletionAllWarningMessage": "Stai per eliminare tutte le mod per questo titolo.\n\nVuoi davvero procedere?", "DialogModManagerDeletionAllWarningMessage": "Stai per eliminare tutte le mod per questo titolo.\n\nVuoi davvero procedere?",
"SettingsTabGraphicsFeaturesOptions": "Funzionalità", "SettingsTabGraphicsFeaturesOptions": "Funzionalità",
+14 -8
View File
@@ -66,6 +66,10 @@
"GameListContextMenuManageTitleUpdatesToolTip": "タイトルのアップデート管理ウインドウを開きます", "GameListContextMenuManageTitleUpdatesToolTip": "タイトルのアップデート管理ウインドウを開きます",
"GameListContextMenuManageDlc": "DLCを管理", "GameListContextMenuManageDlc": "DLCを管理",
"GameListContextMenuManageDlcToolTip": "DLC管理ウインドウを開きます", "GameListContextMenuManageDlcToolTip": "DLC管理ウインドウを開きます",
"GameListContextMenuManageCustomSettings": "カスタム設定ファイルを管理",
"GameListContextMenuManageCustomSettingsToolTip": "選択したアプリケーションのカスタム設定を管理します",
"GameListContextMenuCustomSettingsOpen": "カスタム設定ディレクトリを開く",
"GameListContextMenuCustomSettingsOpenToolTip": "アプリケーションのカスタム設定を含むディレクトリを開きます",
"GameListContextMenuCacheManagement": "キャッシュ管理", "GameListContextMenuCacheManagement": "キャッシュ管理",
"GameListContextMenuCacheManagementPurgePptc": "PPTC を再構築", "GameListContextMenuCacheManagementPurgePptc": "PPTC を再構築",
"GameListContextMenuCacheManagementPurgePptcToolTip": "次回のゲーム起動時に PPTC を再構築します", "GameListContextMenuCacheManagementPurgePptcToolTip": "次回のゲーム起動時に PPTC を再構築します",
@@ -172,11 +176,12 @@
"SettingsTabGraphicsAnisotropicFiltering8x": "8x", "SettingsTabGraphicsAnisotropicFiltering8x": "8x",
"SettingsTabGraphicsAnisotropicFiltering16x": "16x", "SettingsTabGraphicsAnisotropicFiltering16x": "16x",
"SettingsTabGraphicsResolutionScale": "解像度:", "SettingsTabGraphicsResolutionScale": "解像度:",
"SettingsTabGraphicsResolutionScaleCustom": "カスタム (非推奨)", "SettingsTabGraphicsResolutionScale05x": "0.5x (360p/540p)",
"SettingsTabGraphicsResolutionScaleNative": "ネイティブ (720p/1080p)", "SettingsTabGraphicsResolutionScale075x": "0.75x (540p/810p)",
"SettingsTabGraphicsResolutionScale2x": "2x (1440p/2160p)", "SettingsTabGraphicsResolutionScale10x": "1.0x (720p/1080p)",
"SettingsTabGraphicsResolutionScale3x": "3x (2160p/3240p)", "SettingsTabGraphicsResolutionScale20x": "2.0x (1440p/2160p)",
"SettingsTabGraphicsResolutionScale4x": "4x (2880p/4320p) (非推奨)", "SettingsTabGraphicsResolutionScale30x": "3.0x (2160p/3240p)",
"SettingsTabGraphicsResolutionScale40x": "4.0x (2880p/4320p)",
"SettingsTabGraphicsAspectRatio": "アスペクト比:", "SettingsTabGraphicsAspectRatio": "アスペクト比:",
"SettingsTabGraphicsAspectRatio4x3": "4:3", "SettingsTabGraphicsAspectRatio4x3": "4:3",
"SettingsTabGraphicsAspectRatio16x9": "16:9", "SettingsTabGraphicsAspectRatio16x9": "16:9",
@@ -207,8 +212,9 @@
"SettingsTabLoggingGraphicsBackendLogLevelAll": "すべて", "SettingsTabLoggingGraphicsBackendLogLevelAll": "すべて",
"SettingsTabLoggingEnableDebugLogs": "デバッグログを有効にする", "SettingsTabLoggingEnableDebugLogs": "デバッグログを有効にする",
"SettingsTabInput": "入力", "SettingsTabInput": "入力",
"SettingsTabInputEnableDockedMode": "ドッキングモード", "SettingsTabSystemEnableDockedMode": "ドッキングモード",
"SettingsTabInputDirectKeyboardAccess": "キーボード直接アクセス", "SettingsTabInputDirectKeyboardAccess": "キーボード直接アクセス",
"SettingsButtonDelete": "削除",
"SettingsButtonSave": "セーブ", "SettingsButtonSave": "セーブ",
"SettingsButtonClose": "閉じる", "SettingsButtonClose": "閉じる",
"SettingsButtonOk": "OK", "SettingsButtonOk": "OK",
@@ -487,9 +493,10 @@
"DialogProfileDeleteProfileTitle": "プロファイルを削除中", "DialogProfileDeleteProfileTitle": "プロファイルを削除中",
"DialogProfileDeleteProfileMessage": "このアクションは元に戻せません. 本当に続けてよろしいですか?", "DialogProfileDeleteProfileMessage": "このアクションは元に戻せません. 本当に続けてよろしいですか?",
"DialogWarning": "警告", "DialogWarning": "警告",
"DialogCustomSettingsDeleteMessage": "次のカスタム設定を削除しようとしています:\n\n{0}\n\n続行してもよろしいですか?",
"DialogPPTCDeletionMessage": "次回起動時に PPTC を再構築します:\n\n{0}\n\n実行してよろしいですか?", "DialogPPTCDeletionMessage": "次回起動時に PPTC を再構築します:\n\n{0}\n\n実行してよろしいですか?",
"DialogPPTCDeletionErrorMessage": "PPTC キャッシュ破棄エラー {0}: {1}", "DialogPPTCDeletionErrorMessage": "PPTC キャッシュ破棄エラー {0}: {1}",
"DialogPPTCNukeMessage": "You are about to purge all PPTC data from:\n\n{0}\n\nAre you sure you want to proceed?", "DialogPPTCNukeMessage": "次のすべてのPPTCデータを削除しようとしています:\n\n{0}\n\n続行してもよろしいですか?",
"DialogShaderDeletionMessage": "シェーダーキャッシュを破棄しようとしています:\n\n{0}\n\n実行してよろしいですか?", "DialogShaderDeletionMessage": "シェーダーキャッシュを破棄しようとしています:\n\n{0}\n\n実行してよろしいですか?",
"DialogShaderDeletionErrorMessage": "シェーダーキャッシュ破棄エラー {0}: {1}", "DialogShaderDeletionErrorMessage": "シェーダーキャッシュ破棄エラー {0}: {1}",
"DialogRyujinxErrorMessage": "エラーが発生しました", "DialogRyujinxErrorMessage": "エラーが発生しました",
@@ -528,7 +535,6 @@
"DialogLoadAppGameAlreadyLoadedSubMessage": "別のゲームを起動する前に, エミュレーションを中止またはエミュレータを閉じてください.", "DialogLoadAppGameAlreadyLoadedSubMessage": "別のゲームを起動する前に, エミュレーションを中止またはエミュレータを閉じてください.",
"DialogUpdateAddUpdateErrorMessage": "選択されたファイルはこのタイトル用のアップデートではありません!", "DialogUpdateAddUpdateErrorMessage": "選択されたファイルはこのタイトル用のアップデートではありません!",
"DialogSettingsBackendThreadingWarningTitle": "警告 - バックエンドスレッディング", "DialogSettingsBackendThreadingWarningTitle": "警告 - バックエンドスレッディング",
"DialogSettingsBackendThreadingWarningMessage": "このオプションの変更を完全に適用するには Ryujinx の再起動が必要です. プラットフォームによっては, Ryujinx のものを使用する前に手動でドライバ自身のマルチスレッディングを無効にする必要があるかもしれません.",
"DialogModManagerDeletionWarningMessage": "以下のModを削除しようとしています: {0}\n\n続行してもよろしいですか?", "DialogModManagerDeletionWarningMessage": "以下のModを削除しようとしています: {0}\n\n続行してもよろしいですか?",
"DialogModManagerDeletionAllWarningMessage": "このタイトルの Mod をすべて削除しようとしています.\n\n続行してもよろしいですか?", "DialogModManagerDeletionAllWarningMessage": "このタイトルの Mod をすべて削除しようとしています.\n\n続行してもよろしいですか?",
"SettingsTabGraphicsFeaturesOptions": "機能", "SettingsTabGraphicsFeaturesOptions": "機能",
+14 -8
View File
@@ -68,6 +68,10 @@
"GameListContextMenuManageTitleUpdatesToolTip": "타이틀 업데이트 관리 창 열기", "GameListContextMenuManageTitleUpdatesToolTip": "타이틀 업데이트 관리 창 열기",
"GameListContextMenuManageDlc": "DLC 관리", "GameListContextMenuManageDlc": "DLC 관리",
"GameListContextMenuManageDlcToolTip": "DLC 관리 창 열기", "GameListContextMenuManageDlcToolTip": "DLC 관리 창 열기",
"GameListContextMenuManageCustomSettings": "사용자 지정 설정 파일 관리",
"GameListContextMenuManageCustomSettingsToolTip": "선택한 애플리케이션에 대한 사용자 지정 설정을 관리합니다",
"GameListContextMenuCustomSettingsOpen": "사용자 지정 설정 디렉토리 열기",
"GameListContextMenuCustomSettingsOpenToolTip": "애플리케이션의 사용자 지정 설정이 포함된 디렉토리를 엽니다",
"GameListContextMenuCacheManagement": "캐시 관리", "GameListContextMenuCacheManagement": "캐시 관리",
"GameListContextMenuCacheManagementPurgePptc": "대기열 PPTC 재구성", "GameListContextMenuCacheManagementPurgePptc": "대기열 PPTC 재구성",
"GameListContextMenuCacheManagementPurgePptcToolTip": "다음 게임 시작에서 부팅 시 PPTC가 다시 빌드하도록 트리거", "GameListContextMenuCacheManagementPurgePptcToolTip": "다음 게임 시작에서 부팅 시 PPTC가 다시 빌드하도록 트리거",
@@ -175,11 +179,12 @@
"SettingsTabGraphicsAnisotropicFiltering8x": "8배", "SettingsTabGraphicsAnisotropicFiltering8x": "8배",
"SettingsTabGraphicsAnisotropicFiltering16x": "16배", "SettingsTabGraphicsAnisotropicFiltering16x": "16배",
"SettingsTabGraphicsResolutionScale": "해상도 배율 :", "SettingsTabGraphicsResolutionScale": "해상도 배율 :",
"SettingsTabGraphicsResolutionScaleCustom": "사용자 정의(권장하지 않음)", "SettingsTabGraphicsResolutionScale05x": "0.5x (360p/540p)",
"SettingsTabGraphicsResolutionScaleNative": "원본(720p/1080p)", "SettingsTabGraphicsResolutionScale075x": "0.75x (540p/810p)",
"SettingsTabGraphicsResolutionScale2x": "2배(1440p/2160p)", "SettingsTabGraphicsResolutionScale10x": "1.0x (720p/1080p)",
"SettingsTabGraphicsResolutionScale3x": "3배(2160p/3240p)", "SettingsTabGraphicsResolutionScale20x": "2.0x (1440p/2160p)",
"SettingsTabGraphicsResolutionScale4x": "4x (2880p/4320p) (권장하지 않음)", "SettingsTabGraphicsResolutionScale30x": "3.0x (2160p/3240p)",
"SettingsTabGraphicsResolutionScale40x": "4.0x (2880p/4320p)",
"SettingsTabGraphicsAspectRatio": "종횡비 :", "SettingsTabGraphicsAspectRatio": "종횡비 :",
"SettingsTabGraphicsAspectRatio4x3": "4:3", "SettingsTabGraphicsAspectRatio4x3": "4:3",
"SettingsTabGraphicsAspectRatio16x9": "16:9", "SettingsTabGraphicsAspectRatio16x9": "16:9",
@@ -210,8 +215,9 @@
"SettingsTabLoggingGraphicsBackendLogLevelAll": "모두", "SettingsTabLoggingGraphicsBackendLogLevelAll": "모두",
"SettingsTabLoggingEnableDebugLogs": "디버그 로그 활성화", "SettingsTabLoggingEnableDebugLogs": "디버그 로그 활성화",
"SettingsTabInput": "입력", "SettingsTabInput": "입력",
"SettingsTabInputEnableDockedMode": "도킹 모드", "SettingsTabSystemEnableDockedMode": "도킹 모드",
"SettingsTabInputDirectKeyboardAccess": "직접 키보드 접속", "SettingsTabInputDirectKeyboardAccess": "직접 키보드 접속",
"SettingsButtonDelete": "삭제",
"SettingsButtonSave": "저장", "SettingsButtonSave": "저장",
"SettingsButtonClose": "닫기", "SettingsButtonClose": "닫기",
"SettingsButtonOk": "확인", "SettingsButtonOk": "확인",
@@ -490,9 +496,10 @@
"DialogProfileDeleteProfileTitle": "프로필 삭제", "DialogProfileDeleteProfileTitle": "프로필 삭제",
"DialogProfileDeleteProfileMessage": "이 작업은 되돌릴 수 없습니다. 계속하겠습니까?", "DialogProfileDeleteProfileMessage": "이 작업은 되돌릴 수 없습니다. 계속하겠습니까?",
"DialogWarning": "경고", "DialogWarning": "경고",
"DialogCustomSettingsDeleteMessage": "다음에 대한 사용자 지정 설정을 삭제하려고 합니다:\n\n{0}\n\n계속 진행하시겠습니까?",
"DialogPPTCDeletionMessage": "다음 부팅 시, PPTC 재구축을 대기열에 추가 :\n\n{0}\n\n계속하겠습니까?", "DialogPPTCDeletionMessage": "다음 부팅 시, PPTC 재구축을 대기열에 추가 :\n\n{0}\n\n계속하겠습니까?",
"DialogPPTCDeletionErrorMessage": "{0}에서 PPTC 캐시 삭제 오류 : {1}", "DialogPPTCDeletionErrorMessage": "{0}에서 PPTC 캐시 삭제 오류 : {1}",
"DialogPPTCNukeMessage": "You are about to purge all PPTC data from:\n\n{0}\n\nAre you sure you want to proceed?", "DialogPPTCNukeMessage": "다음에서 모든 PPTC 데이터를 삭제하려고 합니다:\n\n{0}\n\n계속 진행하시겠습니까?",
"DialogShaderDeletionMessage": "다음에 대한 셰이더 캐시 삭제 :\n\n{0}\n\n계속하겠습니까?", "DialogShaderDeletionMessage": "다음에 대한 셰이더 캐시 삭제 :\n\n{0}\n\n계속하겠습니까?",
"DialogShaderDeletionErrorMessage": "{0}에서 셰이더 캐시 제거 오류 : {1}", "DialogShaderDeletionErrorMessage": "{0}에서 셰이더 캐시 제거 오류 : {1}",
"DialogRyujinxErrorMessage": "Ryujinx에 오류 발생", "DialogRyujinxErrorMessage": "Ryujinx에 오류 발생",
@@ -531,7 +538,6 @@
"DialogLoadAppGameAlreadyLoadedSubMessage": "다른 게임을 시작하기 전에 에뮬레이션을 중지하거나 에뮬레이터를 닫으세요.", "DialogLoadAppGameAlreadyLoadedSubMessage": "다른 게임을 시작하기 전에 에뮬레이션을 중지하거나 에뮬레이터를 닫으세요.",
"DialogUpdateAddUpdateErrorMessage": "지정된 파일에 선택한 제목에 대한 업데이트가 포함되어 있지 않습니다!", "DialogUpdateAddUpdateErrorMessage": "지정된 파일에 선택한 제목에 대한 업데이트가 포함되어 있지 않습니다!",
"DialogSettingsBackendThreadingWarningTitle": "경고 - 후단부 스레딩", "DialogSettingsBackendThreadingWarningTitle": "경고 - 후단부 스레딩",
"DialogSettingsBackendThreadingWarningMessage": "변경 사항을 완전히 적용하려면 이 옵션을 변경한 후, Ryujinx를 다시 시작해야 합니다. 플랫폼에 따라 Ryujinx를 사용할 때 드라이버 자체의 멀티스레딩을 수동으로 비활성화해야 할 수도 있습니다.",
"DialogModManagerDeletionWarningMessage": "해당 Mod를 삭제하려고 합니다: {0}\n\n정말로 삭제하시겠습니까?", "DialogModManagerDeletionWarningMessage": "해당 Mod를 삭제하려고 합니다: {0}\n\n정말로 삭제하시겠습니까?",
"DialogModManagerDeletionAllWarningMessage": "해당 타이틀에 대한 모든 Mod들을 삭제하려고 합니다.\n\n정말로 삭제하시겠습니까?", "DialogModManagerDeletionAllWarningMessage": "해당 타이틀에 대한 모든 Mod들을 삭제하려고 합니다.\n\n정말로 삭제하시겠습니까?",
"SettingsTabGraphicsFeaturesOptions": "기능", "SettingsTabGraphicsFeaturesOptions": "기능",
+14 -8
View File
@@ -66,6 +66,10 @@
"GameListContextMenuManageTitleUpdatesToolTip": "Otwiera okno zarządzania aktualizacjami danej aplikacji", "GameListContextMenuManageTitleUpdatesToolTip": "Otwiera okno zarządzania aktualizacjami danej aplikacji",
"GameListContextMenuManageDlc": "Zarządzaj dodatkową zawartością (DLC)", "GameListContextMenuManageDlc": "Zarządzaj dodatkową zawartością (DLC)",
"GameListContextMenuManageDlcToolTip": "Otwiera okno zarządzania dodatkową zawartością", "GameListContextMenuManageDlcToolTip": "Otwiera okno zarządzania dodatkową zawartością",
"GameListContextMenuManageCustomSettings": "Zarządzaj Plikiem Ustawień Niestandardowych",
"GameListContextMenuManageCustomSettingsToolTip": "Zarządzaj ustawieniami niestandardowymi dla wybranej Aplikacji",
"GameListContextMenuCustomSettingsOpen": "Otwórz Katalog Ustawień Niestandardowych",
"GameListContextMenuCustomSettingsOpenToolTip": "Otwórz katalog zawierający ustawienia niestandardowe Aplikacji",
"GameListContextMenuCacheManagement": "Zarządzanie Cache", "GameListContextMenuCacheManagement": "Zarządzanie Cache",
"GameListContextMenuCacheManagementPurgePptc": "Zakolejkuj rekompilację PPTC", "GameListContextMenuCacheManagementPurgePptc": "Zakolejkuj rekompilację PPTC",
"GameListContextMenuCacheManagementPurgePptcToolTip": "Zainicjuj Rekompilację PPTC przy następnym uruchomieniu gry", "GameListContextMenuCacheManagementPurgePptcToolTip": "Zainicjuj Rekompilację PPTC przy następnym uruchomieniu gry",
@@ -172,11 +176,12 @@
"SettingsTabGraphicsAnisotropicFiltering8x": "8x", "SettingsTabGraphicsAnisotropicFiltering8x": "8x",
"SettingsTabGraphicsAnisotropicFiltering16x": "16x", "SettingsTabGraphicsAnisotropicFiltering16x": "16x",
"SettingsTabGraphicsResolutionScale": "Skalowanie rozdzielczości:", "SettingsTabGraphicsResolutionScale": "Skalowanie rozdzielczości:",
"SettingsTabGraphicsResolutionScaleCustom": "Niestandardowa (Niezalecane)", "SettingsTabGraphicsResolutionScale05x": "0.5x (360p/540p)",
"SettingsTabGraphicsResolutionScaleNative": "Natywna (720p/1080p)", "SettingsTabGraphicsResolutionScale075x": "0.75x (540p/810p)",
"SettingsTabGraphicsResolutionScale2x": "2x (1440p/2160p)", "SettingsTabGraphicsResolutionScale10x": "1.0x (720p/1080p)",
"SettingsTabGraphicsResolutionScale3x": "3x (2160p/3240p)", "SettingsTabGraphicsResolutionScale20x": "2.0x (1440p/2160p)",
"SettingsTabGraphicsResolutionScale4x": "4x (2880p/4320p) (niezalecane)", "SettingsTabGraphicsResolutionScale30x": "3.0x (2160p/3240p)",
"SettingsTabGraphicsResolutionScale40x": "4.0x (2880p/4320p)",
"SettingsTabGraphicsAspectRatio": "Format obrazu:", "SettingsTabGraphicsAspectRatio": "Format obrazu:",
"SettingsTabGraphicsAspectRatio4x3": "4:3", "SettingsTabGraphicsAspectRatio4x3": "4:3",
"SettingsTabGraphicsAspectRatio16x9": "16:9", "SettingsTabGraphicsAspectRatio16x9": "16:9",
@@ -207,8 +212,9 @@
"SettingsTabLoggingGraphicsBackendLogLevelAll": "Wszystko", "SettingsTabLoggingGraphicsBackendLogLevelAll": "Wszystko",
"SettingsTabLoggingEnableDebugLogs": "Włącz dzienniki zdarzeń do debugowania", "SettingsTabLoggingEnableDebugLogs": "Włącz dzienniki zdarzeń do debugowania",
"SettingsTabInput": "Sterowanie", "SettingsTabInput": "Sterowanie",
"SettingsTabInputEnableDockedMode": "Tryb zadokowany", "SettingsTabSystemEnableDockedMode": "Tryb zadokowany",
"SettingsTabInputDirectKeyboardAccess": "Bezpośredni dostęp do klawiatury", "SettingsTabInputDirectKeyboardAccess": "Bezpośredni dostęp do klawiatury",
"SettingsButtonDelete": "Usuń",
"SettingsButtonSave": "Zapisz", "SettingsButtonSave": "Zapisz",
"SettingsButtonClose": "Zamknij", "SettingsButtonClose": "Zamknij",
"SettingsButtonOk": "OK", "SettingsButtonOk": "OK",
@@ -487,9 +493,10 @@
"DialogProfileDeleteProfileTitle": "Usuwanie Profilu", "DialogProfileDeleteProfileTitle": "Usuwanie Profilu",
"DialogProfileDeleteProfileMessage": "Ta czynność jest nieodwracalna, czy na pewno chcesz kontynuować?", "DialogProfileDeleteProfileMessage": "Ta czynność jest nieodwracalna, czy na pewno chcesz kontynuować?",
"DialogWarning": "Uwaga", "DialogWarning": "Uwaga",
"DialogCustomSettingsDeleteMessage": "Zamierzasz usunąć ustawienia niestandardowe dla:\n\n{0}\n\nCzy na pewno chcesz kontynuować?",
"DialogPPTCDeletionMessage": "Masz zamiar umieścić w kolejce rekompilację PPTC przy następnym uruchomieniu:\n\n{0}\n\nCzy na pewno chcesz kontynuować?", "DialogPPTCDeletionMessage": "Masz zamiar umieścić w kolejce rekompilację PPTC przy następnym uruchomieniu:\n\n{0}\n\nCzy na pewno chcesz kontynuować?",
"DialogPPTCDeletionErrorMessage": "Błąd czyszczenia cache PPTC w {0}: {1}", "DialogPPTCDeletionErrorMessage": "Błąd czyszczenia cache PPTC w {0}: {1}",
"DialogPPTCNukeMessage": "You are about to purge all PPTC data from:\n\n{0}\n\nAre you sure you want to proceed?", "DialogPPTCNukeMessage": "Zamierzasz usunąć wszystkie dane PPTC z:\n\n{0}\n\nCzy na pewno chcesz kontynuować?",
"DialogShaderDeletionMessage": "Zamierzasz usunąć cache Shaderów dla :\n\n{0}\n\nNa pewno chcesz kontynuować?", "DialogShaderDeletionMessage": "Zamierzasz usunąć cache Shaderów dla :\n\n{0}\n\nNa pewno chcesz kontynuować?",
"DialogShaderDeletionErrorMessage": "Błąd czyszczenia cache Shaderów w {0}: {1}", "DialogShaderDeletionErrorMessage": "Błąd czyszczenia cache Shaderów w {0}: {1}",
"DialogRyujinxErrorMessage": "Ryujinx napotkał błąd", "DialogRyujinxErrorMessage": "Ryujinx napotkał błąd",
@@ -528,7 +535,6 @@
"DialogLoadAppGameAlreadyLoadedSubMessage": "Zatrzymaj emulację lub zamknij emulator przed uruchomieniem innej gry.", "DialogLoadAppGameAlreadyLoadedSubMessage": "Zatrzymaj emulację lub zamknij emulator przed uruchomieniem innej gry.",
"DialogUpdateAddUpdateErrorMessage": "Określony plik nie zawiera aktualizacji dla wybranego tytułu!", "DialogUpdateAddUpdateErrorMessage": "Określony plik nie zawiera aktualizacji dla wybranego tytułu!",
"DialogSettingsBackendThreadingWarningTitle": "Ostrzeżenie — Wątki Backend", "DialogSettingsBackendThreadingWarningTitle": "Ostrzeżenie — Wątki Backend",
"DialogSettingsBackendThreadingWarningMessage": "Ryujinx musi zostać ponownie uruchomiony po zmianie tej opcji, aby działał w pełni. W zależności od platformy może być konieczne ręczne wyłączenie sterownika wielowątkowości podczas korzystania z Ryujinx.",
"DialogModManagerDeletionWarningMessage": "Zamierzasz usunąć modyfikacje: {0}\n\nCzy na pewno chcesz kontynuować?", "DialogModManagerDeletionWarningMessage": "Zamierzasz usunąć modyfikacje: {0}\n\nCzy na pewno chcesz kontynuować?",
"DialogModManagerDeletionAllWarningMessage": "Zamierzasz usunąć wszystkie modyfikacje dla wybranego tytułu: {0}\n\nCzy na pewno chcesz kontynuować?", "DialogModManagerDeletionAllWarningMessage": "Zamierzasz usunąć wszystkie modyfikacje dla wybranego tytułu: {0}\n\nCzy na pewno chcesz kontynuować?",
"SettingsTabGraphicsFeaturesOptions": "Funkcje", "SettingsTabGraphicsFeaturesOptions": "Funkcje",
+14 -8
View File
@@ -68,6 +68,10 @@
"GameListContextMenuManageTitleUpdatesToolTip": "Abre a janela de gerenciamento de atualizações", "GameListContextMenuManageTitleUpdatesToolTip": "Abre a janela de gerenciamento de atualizações",
"GameListContextMenuManageDlc": "Gerenciar DLCs", "GameListContextMenuManageDlc": "Gerenciar DLCs",
"GameListContextMenuManageDlcToolTip": "Abre a janela de gerenciamento de DLCs", "GameListContextMenuManageDlcToolTip": "Abre a janela de gerenciamento de DLCs",
"GameListContextMenuManageCustomSettings": "Gerenciar Arquivo de Configurações Personalizadas",
"GameListContextMenuManageCustomSettingsToolTip": "Gerenciar as configurações personalizadas para a Aplicação selecionada",
"GameListContextMenuCustomSettingsOpen": "Abrir Diretório de Configurações Personalizadas",
"GameListContextMenuCustomSettingsOpenToolTip": "Abrir o diretório que contém as configurações personalizadas da Aplicação",
"GameListContextMenuCacheManagement": "Gerenciamento de cache", "GameListContextMenuCacheManagement": "Gerenciamento de cache",
"GameListContextMenuCacheManagementPurgePptc": "Limpar cache PPTC", "GameListContextMenuCacheManagementPurgePptc": "Limpar cache PPTC",
"GameListContextMenuCacheManagementPurgePptcToolTip": "Deleta o cache PPTC armazenado em disco do jogo", "GameListContextMenuCacheManagementPurgePptcToolTip": "Deleta o cache PPTC armazenado em disco do jogo",
@@ -175,11 +179,12 @@
"SettingsTabGraphicsAnisotropicFiltering8x": "8x", "SettingsTabGraphicsAnisotropicFiltering8x": "8x",
"SettingsTabGraphicsAnisotropicFiltering16x": "16x", "SettingsTabGraphicsAnisotropicFiltering16x": "16x",
"SettingsTabGraphicsResolutionScale": "Escala de resolução:", "SettingsTabGraphicsResolutionScale": "Escala de resolução:",
"SettingsTabGraphicsResolutionScaleCustom": "Customizada (não recomendado)", "SettingsTabGraphicsResolutionScale05x": "0.5x (360p/540p)",
"SettingsTabGraphicsResolutionScaleNative": "Nativa (720p/1080p)", "SettingsTabGraphicsResolutionScale075x": "0.75x (540p/810p)",
"SettingsTabGraphicsResolutionScale2x": "2x (1440p/2160p)", "SettingsTabGraphicsResolutionScale10x": "1.0x (720p/1080p)",
"SettingsTabGraphicsResolutionScale3x": "3x (2160p/3240p)", "SettingsTabGraphicsResolutionScale20x": "2.0x (1440p/2160p)",
"SettingsTabGraphicsResolutionScale4x": "4x (2880p/4320p) (não recomendado)", "SettingsTabGraphicsResolutionScale30x": "3.0x (2160p/3240p)",
"SettingsTabGraphicsResolutionScale40x": "4.0x (2880p/4320p)",
"SettingsTabGraphicsAspectRatio": "Proporção:", "SettingsTabGraphicsAspectRatio": "Proporção:",
"SettingsTabGraphicsAspectRatio4x3": "4:3", "SettingsTabGraphicsAspectRatio4x3": "4:3",
"SettingsTabGraphicsAspectRatio16x9": "16:9", "SettingsTabGraphicsAspectRatio16x9": "16:9",
@@ -210,8 +215,9 @@
"SettingsTabLoggingGraphicsBackendLogLevelAll": "Todos", "SettingsTabLoggingGraphicsBackendLogLevelAll": "Todos",
"SettingsTabLoggingEnableDebugLogs": "Habilitar logs de depuração", "SettingsTabLoggingEnableDebugLogs": "Habilitar logs de depuração",
"SettingsTabInput": "Controle", "SettingsTabInput": "Controle",
"SettingsTabInputEnableDockedMode": "Habilitar modo TV", "SettingsTabSystemEnableDockedMode": "Habilitar modo TV",
"SettingsTabInputDirectKeyboardAccess": "Acesso direto ao teclado", "SettingsTabInputDirectKeyboardAccess": "Acesso direto ao teclado",
"SettingsButtonDelete": "Excluir",
"SettingsButtonSave": "Salvar", "SettingsButtonSave": "Salvar",
"SettingsButtonClose": "Fechar", "SettingsButtonClose": "Fechar",
"SettingsButtonOk": "OK", "SettingsButtonOk": "OK",
@@ -490,9 +496,10 @@
"DialogProfileDeleteProfileTitle": "Apagando perfil", "DialogProfileDeleteProfileTitle": "Apagando perfil",
"DialogProfileDeleteProfileMessage": "Essa ação é irreversível, tem certeza que deseja continuar?", "DialogProfileDeleteProfileMessage": "Essa ação é irreversível, tem certeza que deseja continuar?",
"DialogWarning": "Alerta", "DialogWarning": "Alerta",
"DialogCustomSettingsDeleteMessage": "Você está prestes a excluir as configurações personalizadas para:\n\n{0}\n\nTem certeza de que deseja continuar?",
"DialogPPTCDeletionMessage": "Você está prestes a apagar o cache PPTC para :\n\n{0}\n\nTem certeza que deseja continuar?", "DialogPPTCDeletionMessage": "Você está prestes a apagar o cache PPTC para :\n\n{0}\n\nTem certeza que deseja continuar?",
"DialogPPTCDeletionErrorMessage": "Erro apagando cache PPTC em {0}: {1}", "DialogPPTCDeletionErrorMessage": "Erro apagando cache PPTC em {0}: {1}",
"DialogPPTCNukeMessage": "You are about to purge all PPTC data from:\n\n{0}\n\nAre you sure you want to proceed?", "DialogPPTCNukeMessage": "Você está prestes a excluir todos os dados PPTC de:\n\n{0}\n\nTem certeza de que deseja continuar?",
"DialogShaderDeletionMessage": "Você está prestes a apagar o cache de Shader para :\n\n{0}\n\nTem certeza que deseja continuar?", "DialogShaderDeletionMessage": "Você está prestes a apagar o cache de Shader para :\n\n{0}\n\nTem certeza que deseja continuar?",
"DialogShaderDeletionErrorMessage": "Erro apagando o cache de Shader em {0}: {1}", "DialogShaderDeletionErrorMessage": "Erro apagando o cache de Shader em {0}: {1}",
"DialogRyujinxErrorMessage": "Ryujinx encontrou um erro", "DialogRyujinxErrorMessage": "Ryujinx encontrou um erro",
@@ -531,7 +538,6 @@
"DialogLoadAppGameAlreadyLoadedSubMessage": "Por favor, pare a emulação ou feche o emulador antes de abrir outro jogo.", "DialogLoadAppGameAlreadyLoadedSubMessage": "Por favor, pare a emulação ou feche o emulador antes de abrir outro jogo.",
"DialogUpdateAddUpdateErrorMessage": "O arquivo especificado não contém atualizações para o título selecionado!", "DialogUpdateAddUpdateErrorMessage": "O arquivo especificado não contém atualizações para o título selecionado!",
"DialogSettingsBackendThreadingWarningTitle": "Alerta - Threading da API gráfica", "DialogSettingsBackendThreadingWarningTitle": "Alerta - Threading da API gráfica",
"DialogSettingsBackendThreadingWarningMessage": "Ryujinx precisa ser reiniciado após mudar essa opção para que ela tenha efeito. Dependendo da sua plataforma, pode ser preciso desabilitar o multithreading do driver de vídeo quando usar o Ryujinx.",
"DialogModManagerDeletionWarningMessage": "You are about to delete the mod: {0}\n\nAre you sure you want to proceed?", "DialogModManagerDeletionWarningMessage": "You are about to delete the mod: {0}\n\nAre you sure you want to proceed?",
"DialogModManagerDeletionAllWarningMessage": "You are about to delete all mods for this title.\n\nAre you sure you want to proceed?", "DialogModManagerDeletionAllWarningMessage": "You are about to delete all mods for this title.\n\nAre you sure you want to proceed?",
"SettingsTabGraphicsFeaturesOptions": "Recursos", "SettingsTabGraphicsFeaturesOptions": "Recursos",
+14 -8
View File
@@ -70,6 +70,10 @@
"GameListContextMenuManageTitleUpdatesToolTip": "Открывает окно управления обновлениями приложения", "GameListContextMenuManageTitleUpdatesToolTip": "Открывает окно управления обновлениями приложения",
"GameListContextMenuManageDlc": "Управление DLC", "GameListContextMenuManageDlc": "Управление DLC",
"GameListContextMenuManageDlcToolTip": "Открывает окно управления DLC", "GameListContextMenuManageDlcToolTip": "Открывает окно управления DLC",
"GameListContextMenuManageCustomSettings": "Управление файлом пользовательских настроек",
"GameListContextMenuManageCustomSettingsToolTip": "Управление пользовательскими настройками для выбранного приложения",
"GameListContextMenuCustomSettingsOpen": "Открыть каталог пользовательских настроек",
"GameListContextMenuCustomSettingsOpenToolTip": "Открыть каталог, содержащий пользовательские настройки приложения",
"GameListContextMenuCacheManagement": "Управление кэшем", "GameListContextMenuCacheManagement": "Управление кэшем",
"GameListContextMenuCacheManagementPurgePptc": "Перестроить очередь PPTC", "GameListContextMenuCacheManagementPurgePptc": "Перестроить очередь PPTC",
"GameListContextMenuCacheManagementPurgePptcToolTip": "Запускает перестройку PPTC во время следующего запуска игры.", "GameListContextMenuCacheManagementPurgePptcToolTip": "Запускает перестройку PPTC во время следующего запуска игры.",
@@ -194,11 +198,12 @@
"SettingsTabGraphicsAnisotropicFiltering8x": "8x", "SettingsTabGraphicsAnisotropicFiltering8x": "8x",
"SettingsTabGraphicsAnisotropicFiltering16x": "16x", "SettingsTabGraphicsAnisotropicFiltering16x": "16x",
"SettingsTabGraphicsResolutionScale": "Масштабирование:", "SettingsTabGraphicsResolutionScale": "Масштабирование:",
"SettingsTabGraphicsResolutionScaleCustom": "Пользовательское (не рекомендуется)", "SettingsTabGraphicsResolutionScale05x": "0.5x (360p/540p)",
"SettingsTabGraphicsResolutionScaleNative": "Нативное (720p/1080p)", "SettingsTabGraphicsResolutionScale075x": "0.75x (540p/810p)",
"SettingsTabGraphicsResolutionScale2x": "2x (1440p/2160p)", "SettingsTabGraphicsResolutionScale10x": "1.0x (720p/1080p)",
"SettingsTabGraphicsResolutionScale3x": "3x (2160p/3240p)", "SettingsTabGraphicsResolutionScale20x": "2.0x (1440p/2160p)",
"SettingsTabGraphicsResolutionScale4x": "4x (2880p/4320p) (не рекомендуется)", "SettingsTabGraphicsResolutionScale30x": "3.0x (2160p/3240p)",
"SettingsTabGraphicsResolutionScale40x": "4.0x (2880p/4320p)",
"SettingsTabGraphicsAspectRatio": "Соотношение сторон:", "SettingsTabGraphicsAspectRatio": "Соотношение сторон:",
"SettingsTabGraphicsAspectRatio4x3": "4:3", "SettingsTabGraphicsAspectRatio4x3": "4:3",
"SettingsTabGraphicsAspectRatio16x9": "16:9", "SettingsTabGraphicsAspectRatio16x9": "16:9",
@@ -229,8 +234,9 @@
"SettingsTabLoggingGraphicsBackendLogLevelAll": "Всё", "SettingsTabLoggingGraphicsBackendLogLevelAll": "Всё",
"SettingsTabLoggingEnableDebugLogs": "Включить журнал отладки", "SettingsTabLoggingEnableDebugLogs": "Включить журнал отладки",
"SettingsTabInput": "Управление", "SettingsTabInput": "Управление",
"SettingsTabInputEnableDockedMode": "Стационарный режим", "SettingsTabSystemEnableDockedMode": "Стационарный режим",
"SettingsTabInputDirectKeyboardAccess": "Прямой ввод клавиатуры", "SettingsTabInputDirectKeyboardAccess": "Прямой ввод клавиатуры",
"SettingsButtonDelete": "Удалить",
"SettingsButtonSave": "Сохранить", "SettingsButtonSave": "Сохранить",
"SettingsButtonClose": "Закрыть", "SettingsButtonClose": "Закрыть",
"SettingsButtonOk": "Ок", "SettingsButtonOk": "Ок",
@@ -514,9 +520,10 @@
"DialogProfileDeleteProfileTitle": "Удаление профиля", "DialogProfileDeleteProfileTitle": "Удаление профиля",
"DialogProfileDeleteProfileMessage": "Это действие необратимо. Вы уверены, что хотите продолжить?", "DialogProfileDeleteProfileMessage": "Это действие необратимо. Вы уверены, что хотите продолжить?",
"DialogWarning": "Внимание", "DialogWarning": "Внимание",
"DialogCustomSettingsDeleteMessage": "Вы собираетесь удалить пользовательские настройки для:\n\n{0}\n\nВы уверены, что хотите продолжить?",
"DialogPPTCDeletionMessage": "Вы собираетесь перестроить кэш PPTC при следующем запуске для:\n\n{0}\n\nВы уверены, что хотите продолжить?", "DialogPPTCDeletionMessage": "Вы собираетесь перестроить кэш PPTC при следующем запуске для:\n\n{0}\n\nВы уверены, что хотите продолжить?",
"DialogPPTCDeletionErrorMessage": "Ошибка очистки кэша PPTC в {0}: {1}", "DialogPPTCDeletionErrorMessage": "Ошибка очистки кэша PPTC в {0}: {1}",
"DialogPPTCNukeMessage": "You are about to purge all PPTC data from:\n\n{0}\n\nAre you sure you want to proceed?", "DialogPPTCNukeMessage": "Вы собираетесь удалить все данные PPTC из:\n\n{0}\n\nВы уверены, что хотите продолжить?",
"DialogShaderDeletionMessage": "Вы собираетесь удалить кэш шейдеров для:\n\n{0}\n\nВы уверены, что хотите продолжить?", "DialogShaderDeletionMessage": "Вы собираетесь удалить кэш шейдеров для:\n\n{0}\n\nВы уверены, что хотите продолжить?",
"DialogShaderDeletionErrorMessage": "Ошибка очистки кэша шейдеров в {0}: {1}", "DialogShaderDeletionErrorMessage": "Ошибка очистки кэша шейдеров в {0}: {1}",
"DialogRyujinxErrorMessage": "Ryujinx обнаружил ошибку", "DialogRyujinxErrorMessage": "Ryujinx обнаружил ошибку",
@@ -555,7 +562,6 @@
"DialogLoadAppGameAlreadyLoadedSubMessage": "Пожалуйста, остановите эмуляцию или закройте эмулятор перед запуском другой игры.", "DialogLoadAppGameAlreadyLoadedSubMessage": "Пожалуйста, остановите эмуляцию или закройте эмулятор перед запуском другой игры.",
"DialogUpdateAddUpdateErrorMessage": "Указанный файл не содержит обновлений для выбранного приложения", "DialogUpdateAddUpdateErrorMessage": "Указанный файл не содержит обновлений для выбранного приложения",
"DialogSettingsBackendThreadingWarningTitle": "Предупреждение: многопоточность в бэкенде", "DialogSettingsBackendThreadingWarningTitle": "Предупреждение: многопоточность в бэкенде",
"DialogSettingsBackendThreadingWarningMessage": "Для применения этой настройки необходимо перезапустить Ryujinx. В зависимости от используемой вами операционной системы вам может потребоваться вручную отключить многопоточность драйвера при использовании Ryujinx.",
"DialogModManagerDeletionWarningMessage": "Вы сейчас удалите мод: {0}\n\nВы уверены, что хотите продолжить?", "DialogModManagerDeletionWarningMessage": "Вы сейчас удалите мод: {0}\n\nВы уверены, что хотите продолжить?",
"DialogModManagerDeletionAllWarningMessage": "Вы сейчас удалите все выбранные моды для этой игры.\n\nВы уверены, что хотите продолжить?", "DialogModManagerDeletionAllWarningMessage": "Вы сейчас удалите все выбранные моды для этой игры.\n\nВы уверены, что хотите продолжить?",
"SettingsTabGraphicsFeaturesOptions": "Функции & Улучшения", "SettingsTabGraphicsFeaturesOptions": "Функции & Улучшения",
+14 -8
View File
@@ -66,6 +66,10 @@
"GameListContextMenuManageTitleUpdatesToolTip": "เปิดหน้าต่างการจัดการการอัพเดตหัวข้อ", "GameListContextMenuManageTitleUpdatesToolTip": "เปิดหน้าต่างการจัดการการอัพเดตหัวข้อ",
"GameListContextMenuManageDlc": "จัดการ DLC", "GameListContextMenuManageDlc": "จัดการ DLC",
"GameListContextMenuManageDlcToolTip": "เปิดหน้าต่างจัดการ DLC", "GameListContextMenuManageDlcToolTip": "เปิดหน้าต่างจัดการ DLC",
"GameListContextMenuManageCustomSettings": "จัดการไฟล์การตั้งค่าที่กำหนดเอง",
"GameListContextMenuManageCustomSettingsToolTip": "จัดการการตั้งค่าที่กำหนดเองสำหรับแอปพลิเคชันที่เลือก",
"GameListContextMenuCustomSettingsOpen": "เปิดไดเรกทอรีการตั้งค่าที่กำหนดเอง",
"GameListContextMenuCustomSettingsOpenToolTip": "เปิดไดเรกทอรีที่มีการตั้งค่าที่กำหนดเองของแอปพลิเคชัน",
"GameListContextMenuCacheManagement": "จัดการ แคช", "GameListContextMenuCacheManagement": "จัดการ แคช",
"GameListContextMenuCacheManagementPurgePptc": "เพิ่มเข้าคิวงาน PPTC ที่สร้างใหม่", "GameListContextMenuCacheManagementPurgePptc": "เพิ่มเข้าคิวงาน PPTC ที่สร้างใหม่",
"GameListContextMenuCacheManagementPurgePptcToolTip": "ทริกเกอร์ PPTC ให้สร้างใหม่ในเวลาบูตเมื่อเปิดตัวเกมครั้งถัดไป", "GameListContextMenuCacheManagementPurgePptcToolTip": "ทริกเกอร์ PPTC ให้สร้างใหม่ในเวลาบูตเมื่อเปิดตัวเกมครั้งถัดไป",
@@ -172,11 +176,12 @@
"SettingsTabGraphicsAnisotropicFiltering8x": "8x", "SettingsTabGraphicsAnisotropicFiltering8x": "8x",
"SettingsTabGraphicsAnisotropicFiltering16x": "16x", "SettingsTabGraphicsAnisotropicFiltering16x": "16x",
"SettingsTabGraphicsResolutionScale": "อัตราส่วนความละเอียด:", "SettingsTabGraphicsResolutionScale": "อัตราส่วนความละเอียด:",
"SettingsTabGraphicsResolutionScaleCustom": "กำหนดเอง (ไม่แนะนำ)", "SettingsTabGraphicsResolutionScale05x": "0.5x (360p/540p)",
"SettingsTabGraphicsResolutionScaleNative": "พื้นฐานของระบบ (720p/1080p)", "SettingsTabGraphicsResolutionScale075x": "0.75x (540p/810p)",
"SettingsTabGraphicsResolutionScale2x": "2x (1440p/2160p)", "SettingsTabGraphicsResolutionScale10x": "1.0x (720p/1080p)",
"SettingsTabGraphicsResolutionScale3x": "3x (2160p/3240p)", "SettingsTabGraphicsResolutionScale20x": "2.0x (1440p/2160p)",
"SettingsTabGraphicsResolutionScale4x": "4x (2880p/4320p) (ไม่แนะนำ)", "SettingsTabGraphicsResolutionScale30x": "3.0x (2160p/3240p)",
"SettingsTabGraphicsResolutionScale40x": "4.0x (2880p/4320p)",
"SettingsTabGraphicsAspectRatio": "อัตราส่วนภาพ:", "SettingsTabGraphicsAspectRatio": "อัตราส่วนภาพ:",
"SettingsTabGraphicsAspectRatio4x3": "4:3", "SettingsTabGraphicsAspectRatio4x3": "4:3",
"SettingsTabGraphicsAspectRatio16x9": "16:9", "SettingsTabGraphicsAspectRatio16x9": "16:9",
@@ -207,8 +212,9 @@
"SettingsTabLoggingGraphicsBackendLogLevelAll": "ทั้งหมด", "SettingsTabLoggingGraphicsBackendLogLevelAll": "ทั้งหมด",
"SettingsTabLoggingEnableDebugLogs": "เปิดใช้งาน ประวัติแก้ไขข้อบกพร่อง", "SettingsTabLoggingEnableDebugLogs": "เปิดใช้งาน ประวัติแก้ไขข้อบกพร่อง",
"SettingsTabInput": "ป้อนข้อมูล", "SettingsTabInput": "ป้อนข้อมูล",
"SettingsTabInputEnableDockedMode": "ด็อกโหมด", "SettingsTabSystemEnableDockedMode": "ด็อกโหมด",
"SettingsTabInputDirectKeyboardAccess": "เข้าถึงคีย์บอร์ดโดยตรง", "SettingsTabInputDirectKeyboardAccess": "เข้าถึงคีย์บอร์ดโดยตรง",
"SettingsButtonDelete": "ลบ",
"SettingsButtonSave": "บันทึก", "SettingsButtonSave": "บันทึก",
"SettingsButtonClose": "ปิด", "SettingsButtonClose": "ปิด",
"SettingsButtonOk": "ตกลง", "SettingsButtonOk": "ตกลง",
@@ -487,9 +493,10 @@
"DialogProfileDeleteProfileTitle": "กำลังลบโปรไฟล์", "DialogProfileDeleteProfileTitle": "กำลังลบโปรไฟล์",
"DialogProfileDeleteProfileMessage": "การดำเนินการนี้ไม่สามารถย้อนกลับได้ คุณแน่ใจหรือไม่ว่าต้องการดำเนินการต่อหรือไม่?", "DialogProfileDeleteProfileMessage": "การดำเนินการนี้ไม่สามารถย้อนกลับได้ คุณแน่ใจหรือไม่ว่าต้องการดำเนินการต่อหรือไม่?",
"DialogWarning": "คำเตือน", "DialogWarning": "คำเตือน",
"DialogCustomSettingsDeleteMessage": "คุณกำลังจะลบการตั้งค่าที่กำหนดเองสำหรับ:\n\n{0}\n\nคุณแน่ใจหรือไม่ว่าต้องการดำเนินการต่อ?",
"DialogPPTCDeletionMessage": "คุณกำลังจะจัดคิวการสร้าง PPTC ใหม่ในการบูตครั้งถัดไป:\n\n{0}\n\nคุณแน่ใจหรือไม่ว่าต้องการดำเนินการต่อหรือไม่?", "DialogPPTCDeletionMessage": "คุณกำลังจะจัดคิวการสร้าง PPTC ใหม่ในการบูตครั้งถัดไป:\n\n{0}\n\nคุณแน่ใจหรือไม่ว่าต้องการดำเนินการต่อหรือไม่?",
"DialogPPTCDeletionErrorMessage": "มีข้อผิดพลาดในการล้างแคช PPTC {0}: {1}", "DialogPPTCDeletionErrorMessage": "มีข้อผิดพลาดในการล้างแคช PPTC {0}: {1}",
"DialogPPTCNukeMessage": "You are about to purge all PPTC data from:\n\n{0}\n\nAre you sure you want to proceed?", "DialogPPTCNukeMessage": "คุณกำลังจะลบข้อมูล PPTC ทั้งหมดจาก:\n\n{0}\n\nคุณแน่ใจหรือไม่ว่าต้องการดำเนินการต่อ?",
"DialogShaderDeletionMessage": "คุณกำลังจะลบ เชเดอร์แคช:\n\n{0}\n\nคุณแน่ใจหรือไม่ว่าต้องการดำเนินการต่อหรือไม่?", "DialogShaderDeletionMessage": "คุณกำลังจะลบ เชเดอร์แคช:\n\n{0}\n\nคุณแน่ใจหรือไม่ว่าต้องการดำเนินการต่อหรือไม่?",
"DialogShaderDeletionErrorMessage": "เกิดข้อผิดพลาดในการล้าง เชเดอร์แคช {0}: {1}", "DialogShaderDeletionErrorMessage": "เกิดข้อผิดพลาดในการล้าง เชเดอร์แคช {0}: {1}",
"DialogRyujinxErrorMessage": "รียูจินซ์ พบข้อผิดพลาด", "DialogRyujinxErrorMessage": "รียูจินซ์ พบข้อผิดพลาด",
@@ -528,7 +535,6 @@
"DialogLoadAppGameAlreadyLoadedSubMessage": "โปรดหยุดการจำลอง หรือปิดโปรแกรมจำลองก่อนที่จะเปิดเกมอื่น", "DialogLoadAppGameAlreadyLoadedSubMessage": "โปรดหยุดการจำลอง หรือปิดโปรแกรมจำลองก่อนที่จะเปิดเกมอื่น",
"DialogUpdateAddUpdateErrorMessage": "ไฟล์ที่ระบุไม่มีการอัพเดตสำหรับชื่อเรื่องที่เลือก!", "DialogUpdateAddUpdateErrorMessage": "ไฟล์ที่ระบุไม่มีการอัพเดตสำหรับชื่อเรื่องที่เลือก!",
"DialogSettingsBackendThreadingWarningTitle": "คำเตือน - การทำเธรดแบ็กเอนด์", "DialogSettingsBackendThreadingWarningTitle": "คำเตือน - การทำเธรดแบ็กเอนด์",
"DialogSettingsBackendThreadingWarningMessage": "รียูจินซ์ ต้องรีสตาร์ทหลังจากเปลี่ยนตัวเลือกนี้จึงจะใช้งานได้อย่างสมบูรณ์ คุณอาจต้องปิดการใช้งาน มัลติเธรด ของไดรเวอร์ของคุณด้วยตนเองเมื่อใช้ รียูจินซ์ ทั้งนี้ขึ้นอยู่กับแพลตฟอร์มของคุณ",
"DialogModManagerDeletionWarningMessage": "คุณกำลังจะลบ ม็อด: {0}\n\nคุณแน่ใจหรือไม่ว่าต้องการดำเนินการต่อ?", "DialogModManagerDeletionWarningMessage": "คุณกำลังจะลบ ม็อด: {0}\n\nคุณแน่ใจหรือไม่ว่าต้องการดำเนินการต่อ?",
"DialogModManagerDeletionAllWarningMessage": "คุณกำลังจะลบม็อดทั้งหมดสำหรับชื่อนี้\n\nคุณแน่ใจหรือไม่ว่าต้องการดำเนินการต่อ?", "DialogModManagerDeletionAllWarningMessage": "คุณกำลังจะลบม็อดทั้งหมดสำหรับชื่อนี้\n\nคุณแน่ใจหรือไม่ว่าต้องการดำเนินการต่อ?",
"SettingsTabGraphicsFeaturesOptions": "คุณสมบัติ", "SettingsTabGraphicsFeaturesOptions": "คุณสมบัติ",
+14 -8
View File
@@ -66,6 +66,10 @@
"GameListContextMenuManageTitleUpdatesToolTip": "Oyun Güncelleme Yönetim Penceresini Açar", "GameListContextMenuManageTitleUpdatesToolTip": "Oyun Güncelleme Yönetim Penceresini Açar",
"GameListContextMenuManageDlc": "DLC'leri Yönet", "GameListContextMenuManageDlc": "DLC'leri Yönet",
"GameListContextMenuManageDlcToolTip": "DLC yönetim penceresini açar", "GameListContextMenuManageDlcToolTip": "DLC yönetim penceresini açar",
"GameListContextMenuManageCustomSettings": "Özel Ayarlar Dosyasını Yönet",
"GameListContextMenuManageCustomSettingsToolTip": "Seçilen Uygulama için özel ayarları yönetin",
"GameListContextMenuCustomSettingsOpen": "Özel Ayarlar Dizinini Aç",
"GameListContextMenuCustomSettingsOpenToolTip": "Uygulamanın özel ayarlarını içeren dizini açın",
"GameListContextMenuCacheManagement": "Önbellek Yönetimi", "GameListContextMenuCacheManagement": "Önbellek Yönetimi",
"GameListContextMenuCacheManagementPurgePptc": "PPTC Yeniden Yapılandırmasını Başlat", "GameListContextMenuCacheManagementPurgePptc": "PPTC Yeniden Yapılandırmasını Başlat",
"GameListContextMenuCacheManagementPurgePptcToolTip": "Oyunun bir sonraki açılışında PPTC'yi yeniden yapılandır", "GameListContextMenuCacheManagementPurgePptcToolTip": "Oyunun bir sonraki açılışında PPTC'yi yeniden yapılandır",
@@ -172,11 +176,12 @@
"SettingsTabGraphicsAnisotropicFiltering8x": "8x", "SettingsTabGraphicsAnisotropicFiltering8x": "8x",
"SettingsTabGraphicsAnisotropicFiltering16x": "16x", "SettingsTabGraphicsAnisotropicFiltering16x": "16x",
"SettingsTabGraphicsResolutionScale": "Çözünürlük Ölçeği:", "SettingsTabGraphicsResolutionScale": "Çözünürlük Ölçeği:",
"SettingsTabGraphicsResolutionScaleCustom": "Özel (Tavsiye Edilmez)", "SettingsTabGraphicsResolutionScale05x": "0.5x (360p/540p)",
"SettingsTabGraphicsResolutionScaleNative": "Yerel (720p/1080p)", "SettingsTabGraphicsResolutionScale075x": "0.75x (540p/810p)",
"SettingsTabGraphicsResolutionScale2x": "2x (1440p/2160p)", "SettingsTabGraphicsResolutionScale10x": "1.0x (720p/1080p)",
"SettingsTabGraphicsResolutionScale3x": "3x (2160p/3240p)", "SettingsTabGraphicsResolutionScale20x": "2.0x (1440p/2160p)",
"SettingsTabGraphicsResolutionScale4x": "4x (2880p/4320p) (Tavsiye Edilmez)", "SettingsTabGraphicsResolutionScale30x": "3.0x (2160p/3240p)",
"SettingsTabGraphicsResolutionScale40x": "4.0x (2880p/4320p)",
"SettingsTabGraphicsAspectRatio": "En-Boy Oranı:", "SettingsTabGraphicsAspectRatio": "En-Boy Oranı:",
"SettingsTabGraphicsAspectRatio4x3": "4:3", "SettingsTabGraphicsAspectRatio4x3": "4:3",
"SettingsTabGraphicsAspectRatio16x9": "16:9", "SettingsTabGraphicsAspectRatio16x9": "16:9",
@@ -207,8 +212,9 @@
"SettingsTabLoggingGraphicsBackendLogLevelAll": "Hepsi", "SettingsTabLoggingGraphicsBackendLogLevelAll": "Hepsi",
"SettingsTabLoggingEnableDebugLogs": "Hata Ayıklama Loglarını Etkinleştir", "SettingsTabLoggingEnableDebugLogs": "Hata Ayıklama Loglarını Etkinleştir",
"SettingsTabInput": "Giriş Yöntemi", "SettingsTabInput": "Giriş Yöntemi",
"SettingsTabInputEnableDockedMode": "Docked Modu Etkinleştir", "SettingsTabSystemEnableDockedMode": "Docked Modu Etkinleştir",
"SettingsTabInputDirectKeyboardAccess": "Doğrudan Klavye Erişimi", "SettingsTabInputDirectKeyboardAccess": "Doğrudan Klavye Erişimi",
"SettingsButtonDelete": "Sil",
"SettingsButtonSave": "Kaydet", "SettingsButtonSave": "Kaydet",
"SettingsButtonClose": "Kapat", "SettingsButtonClose": "Kapat",
"SettingsButtonOk": "Tamam", "SettingsButtonOk": "Tamam",
@@ -487,9 +493,10 @@
"DialogProfileDeleteProfileTitle": "Profil Siliniyor", "DialogProfileDeleteProfileTitle": "Profil Siliniyor",
"DialogProfileDeleteProfileMessage": "Bu eylem geri döndürülemez, devam etmek istediğinizden emin misiniz?", "DialogProfileDeleteProfileMessage": "Bu eylem geri döndürülemez, devam etmek istediğinizden emin misiniz?",
"DialogWarning": "Uyarı", "DialogWarning": "Uyarı",
"DialogCustomSettingsDeleteMessage": "Şunun için özel ayarları silmek üzeresiniz:\n\n{0}\n\nDevam etmek istediğinizden emin misiniz?",
"DialogPPTCDeletionMessage": "Belirtilen PPTC cache silinecek :\n\n{0}\n\nDevam etmek istediğinizden emin misiniz?", "DialogPPTCDeletionMessage": "Belirtilen PPTC cache silinecek :\n\n{0}\n\nDevam etmek istediğinizden emin misiniz?",
"DialogPPTCDeletionErrorMessage": "Belirtilen PPTC cache temizlenirken hata {0}: {1}", "DialogPPTCDeletionErrorMessage": "Belirtilen PPTC cache temizlenirken hata {0}: {1}",
"DialogPPTCNukeMessage": "You are about to purge all PPTC data from:\n\n{0}\n\nAre you sure you want to proceed?", "DialogPPTCNukeMessage": "Şuradan tüm PPTC verilerini silmek üzeresiniz:\n\n{0}\n\nDevam etmek istediğinizden emin misiniz?",
"DialogShaderDeletionMessage": "Belirtilen Shader cache silinecek :\n\n{0}\n\nDevam etmek istediğinizden emin misiniz?", "DialogShaderDeletionMessage": "Belirtilen Shader cache silinecek :\n\n{0}\n\nDevam etmek istediğinizden emin misiniz?",
"DialogShaderDeletionErrorMessage": "Belirtilen Shader cache temizlenirken hata {0}: {1}", "DialogShaderDeletionErrorMessage": "Belirtilen Shader cache temizlenirken hata {0}: {1}",
"DialogRyujinxErrorMessage": "Ryujinx bir hata ile karşılaştı", "DialogRyujinxErrorMessage": "Ryujinx bir hata ile karşılaştı",
@@ -528,7 +535,6 @@
"DialogLoadAppGameAlreadyLoadedSubMessage": "Lütfen yeni bir oyun açmadan önce emülasyonu durdurun veya emülatörü kapatın.", "DialogLoadAppGameAlreadyLoadedSubMessage": "Lütfen yeni bir oyun açmadan önce emülasyonu durdurun veya emülatörü kapatın.",
"DialogUpdateAddUpdateErrorMessage": "Belirtilen dosya seçilen oyun için güncelleme içermiyor!", "DialogUpdateAddUpdateErrorMessage": "Belirtilen dosya seçilen oyun için güncelleme içermiyor!",
"DialogSettingsBackendThreadingWarningTitle": "Uyarı - Backend Threading", "DialogSettingsBackendThreadingWarningTitle": "Uyarı - Backend Threading",
"DialogSettingsBackendThreadingWarningMessage": "Bu seçeneğin tamamen uygulanması için Ryujinx'in kapatıp açılması gerekir. Kullandığınız işletim sistemine bağlı olarak, Ryujinx'in multithreading'ini kullanırken driver'ınızın multithreading seçeneğini kapatmanız gerekebilir.",
"DialogModManagerDeletionWarningMessage": "You are about to delete the mod: {0}\n\nAre you sure you want to proceed?", "DialogModManagerDeletionWarningMessage": "You are about to delete the mod: {0}\n\nAre you sure you want to proceed?",
"DialogModManagerDeletionAllWarningMessage": "You are about to delete all mods for this title.\n\nAre you sure you want to proceed?", "DialogModManagerDeletionAllWarningMessage": "You are about to delete all mods for this title.\n\nAre you sure you want to proceed?",
"SettingsTabGraphicsFeaturesOptions": "Özellikler", "SettingsTabGraphicsFeaturesOptions": "Özellikler",
+14 -8
View File
@@ -68,6 +68,10 @@
"GameListContextMenuManageTitleUpdatesToolTip": "Відкриває вікно керування оновленням заголовка", "GameListContextMenuManageTitleUpdatesToolTip": "Відкриває вікно керування оновленням заголовка",
"GameListContextMenuManageDlc": "Керування DLC", "GameListContextMenuManageDlc": "Керування DLC",
"GameListContextMenuManageDlcToolTip": "Відкриває вікно керування DLC", "GameListContextMenuManageDlcToolTip": "Відкриває вікно керування DLC",
"GameListContextMenuManageCustomSettings": "Керувати файлом користувацьких налаштувань",
"GameListContextMenuManageCustomSettingsToolTip": "Керувати користувацькими налаштуваннями для вибраного застосунку",
"GameListContextMenuCustomSettingsOpen": "Відкрити каталог користувацьких налаштувань",
"GameListContextMenuCustomSettingsOpenToolTip": "Відкрити каталог, що містить користувацькі налаштування застосунку",
"GameListContextMenuCacheManagement": "Керування кешем", "GameListContextMenuCacheManagement": "Керування кешем",
"GameListContextMenuCacheManagementPurgePptc": "Очистити кеш PPTC", "GameListContextMenuCacheManagementPurgePptc": "Очистити кеш PPTC",
"GameListContextMenuCacheManagementPurgePptcToolTip": "Видаляє кеш PPTC програми", "GameListContextMenuCacheManagementPurgePptcToolTip": "Видаляє кеш PPTC програми",
@@ -175,11 +179,12 @@
"SettingsTabGraphicsAnisotropicFiltering8x": "8x", "SettingsTabGraphicsAnisotropicFiltering8x": "8x",
"SettingsTabGraphicsAnisotropicFiltering16x": "16x", "SettingsTabGraphicsAnisotropicFiltering16x": "16x",
"SettingsTabGraphicsResolutionScale": "Роздільна здатність:", "SettingsTabGraphicsResolutionScale": "Роздільна здатність:",
"SettingsTabGraphicsResolutionScaleCustom": "Користувацька (не рекомендовано)", "SettingsTabGraphicsResolutionScale05x": "0.5x (360p/540p)",
"SettingsTabGraphicsResolutionScaleNative": "Стандартний (720p/1080p)", "SettingsTabGraphicsResolutionScale075x": "0.75x (540p/810p)",
"SettingsTabGraphicsResolutionScale2x": "2x (1440p/2160p)", "SettingsTabGraphicsResolutionScale10x": "1.0x (720p/1080p)",
"SettingsTabGraphicsResolutionScale3x": "3x (2160p/3240p)", "SettingsTabGraphicsResolutionScale20x": "2.0x (1440p/2160p)",
"SettingsTabGraphicsResolutionScale4x": "4x (2880p/4320p) (Не рекомендується)", "SettingsTabGraphicsResolutionScale30x": "3.0x (2160p/3240p)",
"SettingsTabGraphicsResolutionScale40x": "4.0x (2880p/4320p)",
"SettingsTabGraphicsAspectRatio": "Співвідношення сторін:", "SettingsTabGraphicsAspectRatio": "Співвідношення сторін:",
"SettingsTabGraphicsAspectRatio4x3": "4:3", "SettingsTabGraphicsAspectRatio4x3": "4:3",
"SettingsTabGraphicsAspectRatio16x9": "16:9", "SettingsTabGraphicsAspectRatio16x9": "16:9",
@@ -210,8 +215,9 @@
"SettingsTabLoggingGraphicsBackendLogLevelAll": "Все", "SettingsTabLoggingGraphicsBackendLogLevelAll": "Все",
"SettingsTabLoggingEnableDebugLogs": "Увімкнути журнали налагодження", "SettingsTabLoggingEnableDebugLogs": "Увімкнути журнали налагодження",
"SettingsTabInput": "Введення", "SettingsTabInput": "Введення",
"SettingsTabInputEnableDockedMode": "Режим док-станції", "SettingsTabSystemEnableDockedMode": "Режим док-станції",
"SettingsTabInputDirectKeyboardAccess": "Прямий доступ з клавіатури", "SettingsTabInputDirectKeyboardAccess": "Прямий доступ з клавіатури",
"SettingsButtonDelete": "Видалити",
"SettingsButtonSave": "Зберегти", "SettingsButtonSave": "Зберегти",
"SettingsButtonClose": "Закрити", "SettingsButtonClose": "Закрити",
"SettingsButtonOk": "Гаразд", "SettingsButtonOk": "Гаразд",
@@ -490,9 +496,10 @@
"DialogProfileDeleteProfileTitle": "Видалення профілю", "DialogProfileDeleteProfileTitle": "Видалення профілю",
"DialogProfileDeleteProfileMessage": "Цю дію неможливо скасувати. Ви впевнені, що бажаєте продовжити?", "DialogProfileDeleteProfileMessage": "Цю дію неможливо скасувати. Ви впевнені, що бажаєте продовжити?",
"DialogWarning": "Увага", "DialogWarning": "Увага",
"DialogCustomSettingsDeleteMessage": "Ви збираєтеся видалити користувацькі налаштування для:\n\n{0}\n\nВи впевнені, що хочете продовжити?",
"DialogPPTCDeletionMessage": "Ви збираєтеся видалити кеш PPTC для:\n\n{0}\n\nВи впевнені, що бажаєте продовжити?", "DialogPPTCDeletionMessage": "Ви збираєтеся видалити кеш PPTC для:\n\n{0}\n\nВи впевнені, що бажаєте продовжити?",
"DialogPPTCDeletionErrorMessage": "Помилка очищення кешу PPTC на {0}: {1}", "DialogPPTCDeletionErrorMessage": "Помилка очищення кешу PPTC на {0}: {1}",
"DialogPPTCNukeMessage": "You are about to purge all PPTC data from:\n\n{0}\n\nAre you sure you want to proceed?", "DialogPPTCNukeMessage": "Ви збираєтеся видалити всі дані PPTC з:\n\n{0}\n\nВи впевнені, що хочете продовжити?",
"DialogShaderDeletionMessage": "Ви збираєтеся видалити кеш шейдерів для:\n\n{0}\n\nВи впевнені, що бажаєте продовжити?", "DialogShaderDeletionMessage": "Ви збираєтеся видалити кеш шейдерів для:\n\n{0}\n\nВи впевнені, що бажаєте продовжити?",
"DialogShaderDeletionErrorMessage": "Помилка очищення кешу шейдерів на {0}: {1}", "DialogShaderDeletionErrorMessage": "Помилка очищення кешу шейдерів на {0}: {1}",
"DialogRyujinxErrorMessage": "У Ryujinx сталася помилка", "DialogRyujinxErrorMessage": "У Ryujinx сталася помилка",
@@ -531,7 +538,6 @@
"DialogLoadAppGameAlreadyLoadedSubMessage": "Зупиніть емуляцію або закрийте емулятор перед запуском іншої гри.", "DialogLoadAppGameAlreadyLoadedSubMessage": "Зупиніть емуляцію або закрийте емулятор перед запуском іншої гри.",
"DialogUpdateAddUpdateErrorMessage": "Зазначений файл не містить оновлення для вибраного заголовка!", "DialogUpdateAddUpdateErrorMessage": "Зазначений файл не містить оновлення для вибраного заголовка!",
"DialogSettingsBackendThreadingWarningTitle": "Попередження - потокове керування сервером", "DialogSettingsBackendThreadingWarningTitle": "Попередження - потокове керування сервером",
"DialogSettingsBackendThreadingWarningMessage": "Ryujinx потрібно перезапустити після зміни цього параметра, щоб він застосовувався повністю. Залежно від вашої платформи вам може знадобитися вручну вимкнути власну багатопотоковість драйвера під час використання Ryujinx.",
"DialogModManagerDeletionWarningMessage": "Ви збираєтесь видалити модифікацію: {0}\n\nВи дійсно бажаєте продовжити?", "DialogModManagerDeletionWarningMessage": "Ви збираєтесь видалити модифікацію: {0}\n\nВи дійсно бажаєте продовжити?",
"DialogModManagerDeletionAllWarningMessage": "Ви збираєтесь видалити всі модифікації для цього Додатка.\n\nВи дійсно бажаєте продовжити?", "DialogModManagerDeletionAllWarningMessage": "Ви збираєтесь видалити всі модифікації для цього Додатка.\n\nВи дійсно бажаєте продовжити?",
"SettingsTabGraphicsFeaturesOptions": "Особливості", "SettingsTabGraphicsFeaturesOptions": "Особливості",
+14 -8
View File
@@ -68,6 +68,10 @@
"GameListContextMenuManageTitleUpdatesToolTip": "打开游戏更新管理窗口", "GameListContextMenuManageTitleUpdatesToolTip": "打开游戏更新管理窗口",
"GameListContextMenuManageDlc": "管理 DLC", "GameListContextMenuManageDlc": "管理 DLC",
"GameListContextMenuManageDlcToolTip": "打开 DLC 管理窗口", "GameListContextMenuManageDlcToolTip": "打开 DLC 管理窗口",
"GameListContextMenuManageCustomSettings": "管理自定义设置文件",
"GameListContextMenuManageCustomSettingsToolTip": "管理所选应用程序的自定义设置",
"GameListContextMenuCustomSettingsOpen": "打开自定义设置目录",
"GameListContextMenuCustomSettingsOpenToolTip": "打开包含应用程序自定义设置的目录",
"GameListContextMenuCacheManagement": "缓存管理", "GameListContextMenuCacheManagement": "缓存管理",
"GameListContextMenuCacheManagementPurgePptc": "清除 PPTC 缓存文件", "GameListContextMenuCacheManagementPurgePptc": "清除 PPTC 缓存文件",
"GameListContextMenuCacheManagementPurgePptcToolTip": "删除游戏的 PPTC 缓存文件,下次启动游戏时重新编译生成 PPTC 缓存文件", "GameListContextMenuCacheManagementPurgePptcToolTip": "删除游戏的 PPTC 缓存文件,下次启动游戏时重新编译生成 PPTC 缓存文件",
@@ -175,11 +179,12 @@
"SettingsTabGraphicsAnisotropicFiltering8x": "8x", "SettingsTabGraphicsAnisotropicFiltering8x": "8x",
"SettingsTabGraphicsAnisotropicFiltering16x": "16x", "SettingsTabGraphicsAnisotropicFiltering16x": "16x",
"SettingsTabGraphicsResolutionScale": "分辨率缩放:", "SettingsTabGraphicsResolutionScale": "分辨率缩放:",
"SettingsTabGraphicsResolutionScaleCustom": "自定义(不推荐)", "SettingsTabGraphicsResolutionScale05x": "0.5x (360p/540p)",
"SettingsTabGraphicsResolutionScaleNative": "原生 (720p/1080p)", "SettingsTabGraphicsResolutionScale075x": "0.75x (540p/810p)",
"SettingsTabGraphicsResolutionScale2x": "2 倍 (1440p/2160p)", "SettingsTabGraphicsResolutionScale10x": "1.0x (720p/1080p)",
"SettingsTabGraphicsResolutionScale3x": "3 倍 (2160p/3240p)", "SettingsTabGraphicsResolutionScale20x": "2.0x (1440p/2160p)",
"SettingsTabGraphicsResolutionScale4x": "4 倍 (2880p/4320p) (不推荐)", "SettingsTabGraphicsResolutionScale30x": "3.0x (2160p/3240p)",
"SettingsTabGraphicsResolutionScale40x": "4.0x (2880p/4320p)",
"SettingsTabGraphicsAspectRatio": "宽高比:", "SettingsTabGraphicsAspectRatio": "宽高比:",
"SettingsTabGraphicsAspectRatio4x3": "4:3", "SettingsTabGraphicsAspectRatio4x3": "4:3",
"SettingsTabGraphicsAspectRatio16x9": "16:9", "SettingsTabGraphicsAspectRatio16x9": "16:9",
@@ -210,8 +215,9 @@
"SettingsTabLoggingGraphicsBackendLogLevelAll": "全部", "SettingsTabLoggingGraphicsBackendLogLevelAll": "全部",
"SettingsTabLoggingEnableDebugLogs": "启用调试日志", "SettingsTabLoggingEnableDebugLogs": "启用调试日志",
"SettingsTabInput": "输入", "SettingsTabInput": "输入",
"SettingsTabInputEnableDockedMode": "主机模式", "SettingsTabSystemEnableDockedMode": "主机模式",
"SettingsTabInputDirectKeyboardAccess": "直通键盘控制", "SettingsTabInputDirectKeyboardAccess": "直通键盘控制",
"SettingsButtonDelete": "删除",
"SettingsButtonSave": "保存", "SettingsButtonSave": "保存",
"SettingsButtonClose": "关闭", "SettingsButtonClose": "关闭",
"SettingsButtonOk": "确定", "SettingsButtonOk": "确定",
@@ -490,9 +496,10 @@
"DialogProfileDeleteProfileTitle": "删除配置文件", "DialogProfileDeleteProfileTitle": "删除配置文件",
"DialogProfileDeleteProfileMessage": "删除后不可恢复,确认删除吗?", "DialogProfileDeleteProfileMessage": "删除后不可恢复,确认删除吗?",
"DialogWarning": "警告", "DialogWarning": "警告",
"DialogCustomSettingsDeleteMessage": "您即将删除以下项目的自定义设置:\n\n{0}\n\n您确定要继续吗?",
"DialogPPTCDeletionMessage": "您即将删除:\n\n{0} 的 PPTC 缓存文件\n\n确定吗?", "DialogPPTCDeletionMessage": "您即将删除:\n\n{0} 的 PPTC 缓存文件\n\n确定吗?",
"DialogPPTCDeletionErrorMessage": "清除 {0} 的 PPTC 缓存文件时出错:{1}", "DialogPPTCDeletionErrorMessage": "清除 {0} 的 PPTC 缓存文件时出错:{1}",
"DialogPPTCNukeMessage": "You are about to purge all PPTC data from:\n\n{0}\n\nAre you sure you want to proceed?", "DialogPPTCNukeMessage": "您即将清除以下项目的所有 PPTC 数据:\n\n{0}\n\n您确定要继续吗?",
"DialogShaderDeletionMessage": "您即将删除:\n\n{0} 的着色器缓存文件\n\n确定吗?", "DialogShaderDeletionMessage": "您即将删除:\n\n{0} 的着色器缓存文件\n\n确定吗?",
"DialogShaderDeletionErrorMessage": "清除 {0} 的着色器缓存文件时出错:{1}", "DialogShaderDeletionErrorMessage": "清除 {0} 的着色器缓存文件时出错:{1}",
"DialogRyujinxErrorMessage": "Ryujinx 模拟器发生错误", "DialogRyujinxErrorMessage": "Ryujinx 模拟器发生错误",
@@ -531,7 +538,6 @@
"DialogLoadAppGameAlreadyLoadedSubMessage": "请停止模拟或关闭模拟器,再启动另一个游戏。", "DialogLoadAppGameAlreadyLoadedSubMessage": "请停止模拟或关闭模拟器,再启动另一个游戏。",
"DialogUpdateAddUpdateErrorMessage": "选择的文件不是当前游戏的更新!", "DialogUpdateAddUpdateErrorMessage": "选择的文件不是当前游戏的更新!",
"DialogSettingsBackendThreadingWarningTitle": "警告 - 图形引擎多线程", "DialogSettingsBackendThreadingWarningTitle": "警告 - 图形引擎多线程",
"DialogSettingsBackendThreadingWarningMessage": "更改此选项后,必须重启 Ryujinx 模拟器才能生效。\n\n当启用图形引擎多线程时,根据显卡不同,您可能需要手动禁用显卡驱动程序自身的多线程(线程优化)。",
"DialogModManagerDeletionWarningMessage": "您即将删除 MOD:{0} \n\n确定吗?", "DialogModManagerDeletionWarningMessage": "您即将删除 MOD:{0} \n\n确定吗?",
"DialogModManagerDeletionAllWarningMessage": "您即将删除该游戏的所有 MOD,\n\n确定吗?", "DialogModManagerDeletionAllWarningMessage": "您即将删除该游戏的所有 MOD,\n\n确定吗?",
"SettingsTabGraphicsFeaturesOptions": "功能", "SettingsTabGraphicsFeaturesOptions": "功能",
+14 -8
View File
@@ -68,6 +68,10 @@
"GameListContextMenuManageTitleUpdatesToolTip": "開啟遊戲更新管理視窗", "GameListContextMenuManageTitleUpdatesToolTip": "開啟遊戲更新管理視窗",
"GameListContextMenuManageDlc": "管理 DLC", "GameListContextMenuManageDlc": "管理 DLC",
"GameListContextMenuManageDlcToolTip": "開啟 DLC 管理視窗", "GameListContextMenuManageDlcToolTip": "開啟 DLC 管理視窗",
"GameListContextMenuManageCustomSettings": "管理自訂設定檔案",
"GameListContextMenuManageCustomSettingsToolTip": "管理所選應用程式的自訂設定",
"GameListContextMenuCustomSettingsOpen": "開啟自訂設定目錄",
"GameListContextMenuCustomSettingsOpenToolTip": "開啟包含應用程式自訂設定的目錄",
"GameListContextMenuCacheManagement": "快取管理", "GameListContextMenuCacheManagement": "快取管理",
"GameListContextMenuCacheManagementPurgePptc": "佇列 PPTC 重建", "GameListContextMenuCacheManagementPurgePptc": "佇列 PPTC 重建",
"GameListContextMenuCacheManagementPurgePptcToolTip": "下一次啟動遊戲時,觸發 PPTC 進行重建", "GameListContextMenuCacheManagementPurgePptcToolTip": "下一次啟動遊戲時,觸發 PPTC 進行重建",
@@ -175,11 +179,12 @@
"SettingsTabGraphicsAnisotropicFiltering8x": "8 倍", "SettingsTabGraphicsAnisotropicFiltering8x": "8 倍",
"SettingsTabGraphicsAnisotropicFiltering16x": "16 倍", "SettingsTabGraphicsAnisotropicFiltering16x": "16 倍",
"SettingsTabGraphicsResolutionScale": "解析度比例:", "SettingsTabGraphicsResolutionScale": "解析度比例:",
"SettingsTabGraphicsResolutionScaleCustom": "自訂 (不建議使用)", "SettingsTabGraphicsResolutionScale05x": "0.5x (360p/540p)",
"SettingsTabGraphicsResolutionScaleNative": "原生 (720p/1080p)", "SettingsTabGraphicsResolutionScale075x": "0.75x (540p/810p)",
"SettingsTabGraphicsResolutionScale2x": "2 倍 (1440p/2160p)", "SettingsTabGraphicsResolutionScale10x": "1.0x (720p/1080p)",
"SettingsTabGraphicsResolutionScale3x": "3 倍 (2160p/3240p)", "SettingsTabGraphicsResolutionScale20x": "2.0x (1440p/2160p)",
"SettingsTabGraphicsResolutionScale4x": "4 倍 (2880p/4320p) (不建議使用)", "SettingsTabGraphicsResolutionScale30x": "3.0x (2160p/3240p)",
"SettingsTabGraphicsResolutionScale40x": "4.0x (2880p/4320p)",
"SettingsTabGraphicsAspectRatio": "顯示長寬比例:", "SettingsTabGraphicsAspectRatio": "顯示長寬比例:",
"SettingsTabGraphicsAspectRatio4x3": "4:3", "SettingsTabGraphicsAspectRatio4x3": "4:3",
"SettingsTabGraphicsAspectRatio16x9": "16:9", "SettingsTabGraphicsAspectRatio16x9": "16:9",
@@ -210,8 +215,9 @@
"SettingsTabLoggingGraphicsBackendLogLevelAll": "全部", "SettingsTabLoggingGraphicsBackendLogLevelAll": "全部",
"SettingsTabLoggingEnableDebugLogs": "啟用偵錯日誌", "SettingsTabLoggingEnableDebugLogs": "啟用偵錯日誌",
"SettingsTabInput": "輸入", "SettingsTabInput": "輸入",
"SettingsTabInputEnableDockedMode": "底座模式", "SettingsTabSystemEnableDockedMode": "底座模式",
"SettingsTabInputDirectKeyboardAccess": "鍵盤直接存取", "SettingsTabInputDirectKeyboardAccess": "鍵盤直接存取",
"SettingsButtonDelete": "刪除",
"SettingsButtonSave": "儲存", "SettingsButtonSave": "儲存",
"SettingsButtonClose": "關閉", "SettingsButtonClose": "關閉",
"SettingsButtonOk": "確定", "SettingsButtonOk": "確定",
@@ -490,9 +496,10 @@
"DialogProfileDeleteProfileTitle": "刪除設定檔", "DialogProfileDeleteProfileTitle": "刪除設定檔",
"DialogProfileDeleteProfileMessage": "此動作不可復原,您確定要繼續嗎?", "DialogProfileDeleteProfileMessage": "此動作不可復原,您確定要繼續嗎?",
"DialogWarning": "警告", "DialogWarning": "警告",
"DialogCustomSettingsDeleteMessage": "您即將刪除以下項目的自訂設定:\n\n{0}\n\n您確定要繼續嗎?",
"DialogPPTCDeletionMessage": "您將在下一次啟動時佇列重建以下遊戲的 PPTC:\n\n{0}\n\n您確定要繼續嗎?", "DialogPPTCDeletionMessage": "您將在下一次啟動時佇列重建以下遊戲的 PPTC:\n\n{0}\n\n您確定要繼續嗎?",
"DialogPPTCDeletionErrorMessage": "在 {0} 清除 PPTC 快取時出錯: {1}", "DialogPPTCDeletionErrorMessage": "在 {0} 清除 PPTC 快取時出錯: {1}",
"DialogPPTCNukeMessage": "You are about to purge all PPTC data from:\n\n{0}\n\nAre you sure you want to proceed?", "DialogPPTCNukeMessage": "您即將清除以下項目的所有 PPTC 資料:\n\n{0}\n\n您確定要繼續嗎?",
"DialogShaderDeletionMessage": "您將刪除以下遊戲的著色器快取:\n\n{0}\n\n您確定要繼續嗎?", "DialogShaderDeletionMessage": "您將刪除以下遊戲的著色器快取:\n\n{0}\n\n您確定要繼續嗎?",
"DialogShaderDeletionErrorMessage": "在 {0} 清除著色器快取時出錯: {1}", "DialogShaderDeletionErrorMessage": "在 {0} 清除著色器快取時出錯: {1}",
"DialogRyujinxErrorMessage": "Ryujinx 遇到錯誤", "DialogRyujinxErrorMessage": "Ryujinx 遇到錯誤",
@@ -531,7 +538,6 @@
"DialogLoadAppGameAlreadyLoadedSubMessage": "請停止模擬或關閉模擬器,然後再啟動另一款遊戲。", "DialogLoadAppGameAlreadyLoadedSubMessage": "請停止模擬或關閉模擬器,然後再啟動另一款遊戲。",
"DialogUpdateAddUpdateErrorMessage": "指定檔案不包含所選遊戲的更新!", "DialogUpdateAddUpdateErrorMessage": "指定檔案不包含所選遊戲的更新!",
"DialogSettingsBackendThreadingWarningTitle": "警告 - 後端執行緒處理中", "DialogSettingsBackendThreadingWarningTitle": "警告 - 後端執行緒處理中",
"DialogSettingsBackendThreadingWarningMessage": "變更此選項後,必須重新啟動 Ryujinx 才能完全生效。使用 Ryujinx 的多執行緒功能時,可能需要手動停用驅動程式本身的多執行緒功能,這取決於您的平台。",
"DialogModManagerDeletionWarningMessage": "您將刪除模組: {0}\n\n您確定要繼續嗎?", "DialogModManagerDeletionWarningMessage": "您將刪除模組: {0}\n\n您確定要繼續嗎?",
"DialogModManagerDeletionAllWarningMessage": "您即將刪除此遊戲的所有模組。\n\n您確定要繼續嗎?", "DialogModManagerDeletionAllWarningMessage": "您即將刪除此遊戲的所有模組。\n\n您確定要繼續嗎?",
"SettingsTabGraphicsFeaturesOptions": "功能", "SettingsTabGraphicsFeaturesOptions": "功能",
+1 -1
View File
@@ -28,7 +28,7 @@ namespace Ryujinx.Headless
HideCursorMode = configurationState.HideCursor; HideCursorMode = configurationState.HideCursor;
if (NeedsOverride(nameof(DisablePTC))) if (NeedsOverride(nameof(DisablePTC)))
DisablePTC = !configurationState.System.EnablePtc; DisablePTC = !configurationState.System.EnablePptc;
if (NeedsOverride(nameof(EnableInternetAccess))) if (NeedsOverride(nameof(EnableInternetAccess)))
EnableInternetAccess = configurationState.System.EnableInternetAccess; EnableInternetAccess = configurationState.System.EnableInternetAccess;
+8 -1
View File
@@ -10,6 +10,7 @@ using Ryujinx.Graphics.GAL.Multithreading;
using Ryujinx.Graphics.Gpu; using Ryujinx.Graphics.Gpu;
using Ryujinx.Graphics.OpenGL; using Ryujinx.Graphics.OpenGL;
using Ryujinx.HLE.HOS.Applets; using Ryujinx.HLE.HOS.Applets;
using Ryujinx.HLE.HOS.Services.Account.Acc;
using Ryujinx.HLE.HOS.Services.Am.AppletOE.ApplicationProxyService.ApplicationProxy.Types; using Ryujinx.HLE.HOS.Services.Am.AppletOE.ApplicationProxyService.ApplicationProxy.Types;
using Ryujinx.HLE.Loaders.Processes; using Ryujinx.HLE.Loaders.Processes;
using Ryujinx.HLE.UI; using Ryujinx.HLE.UI;
@@ -28,6 +29,7 @@ using static SDL.SDL3;
using AntiAliasing = Ryujinx.Common.Configuration.AntiAliasing; using AntiAliasing = Ryujinx.Common.Configuration.AntiAliasing;
using ScalingFilter = Ryujinx.Common.Configuration.ScalingFilter; using ScalingFilter = Ryujinx.Common.Configuration.ScalingFilter;
using Switch = Ryujinx.HLE.Switch; using Switch = Ryujinx.HLE.Switch;
using UserProfile = Ryujinx.HLE.HOS.Services.Account.Acc.UserProfile;
namespace Ryujinx.Headless namespace Ryujinx.Headless
{ {
@@ -531,7 +533,7 @@ namespace Ryujinx.Headless
Exit(); Exit();
} }
public bool DisplayErrorAppletDialog(string title, string message, string[] buttonsText) public bool DisplayErrorAppletDialog(string title, string message, string[] buttonsText, (uint Module, uint Description)? errorCode = null)
{ {
SDL_MessageBoxButtonData[] buttons = new SDL_MessageBoxButtonData[buttonsText.Length]; SDL_MessageBoxButtonData[] buttons = new SDL_MessageBoxButtonData[buttonsText.Length];
@@ -590,5 +592,10 @@ namespace Ryujinx.Headless
{ {
throw new NotImplementedException(); throw new NotImplementedException();
} }
public UserProfile ShowPlayerSelectDialog()
{
return AccountSaveDataManager.GetLastUsedUser();
}
} }
} }
+1
View File
@@ -8,6 +8,7 @@ using Ryujinx.Common.GraphicsDriver;
using Ryujinx.Common.Logging; using Ryujinx.Common.Logging;
using Ryujinx.Common.SystemInterop; using Ryujinx.Common.SystemInterop;
using Ryujinx.Common.Utilities; using Ryujinx.Common.Utilities;
using Ryujinx.Graphics.RenderDocApi;
using Ryujinx.Graphics.Vulkan.MoltenVK; using Ryujinx.Graphics.Vulkan.MoltenVK;
using Ryujinx.Headless; using Ryujinx.Headless;
using Ryujinx.Modules; using Ryujinx.Modules;
+21
View File
@@ -56,6 +56,7 @@
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<ProjectReference Include="..\Ryujinx.Graphics.RenderDocApi\Ryujinx.Graphics.RenderDocApi.csproj" />
<ProjectReference Include="..\Ryujinx.Audio.Backends.SDL3\Ryujinx.Audio.Backends.SDL3.csproj" /> <ProjectReference Include="..\Ryujinx.Audio.Backends.SDL3\Ryujinx.Audio.Backends.SDL3.csproj" />
<ProjectReference Include="..\Ryujinx.Graphics.Vulkan\Ryujinx.Graphics.Vulkan.csproj" /> <ProjectReference Include="..\Ryujinx.Graphics.Vulkan\Ryujinx.Graphics.Vulkan.csproj" />
<ProjectReference Include="..\Ryujinx.Graphics.OpenGL\Ryujinx.Graphics.OpenGL.csproj" /> <ProjectReference Include="..\Ryujinx.Graphics.OpenGL\Ryujinx.Graphics.OpenGL.csproj" />
@@ -168,4 +169,24 @@
<ItemGroup> <ItemGroup>
<TrimmerRootDescriptor Include="TrimmerRootDescriptor.xml" /> <TrimmerRootDescriptor Include="TrimmerRootDescriptor.xml" />
</ItemGroup> </ItemGroup>
<ItemGroup>
<Compile Update="UI\Applet\UserSelectorDialog.axaml.cs">
<DependentUpon>UserSelectorDialog.axaml</DependentUpon>
<SubType>Code</SubType>
</Compile>
</ItemGroup>
<ItemGroup>
<Compile Update="UI\Views\Settings\CustomSettingsSystemView.axaml.cs">
<DependentUpon>CustomSettingsSystemView.axaml</DependentUpon>
</Compile>
<Compile Update="UI\Views\Settings\CustomSettingsGraphicsView.axaml.cs">
<DependentUpon>CustomSettingsGraphicsView.axaml</DependentUpon>
</Compile>
<Compile Update="UI\Windows\CustomSettingsWindow.axaml.cs">
<DependentUpon>CustomSettingsWindow.axaml</DependentUpon>
</Compile>
<Compile Update="UI\Views\Settings\CustomSettingsAudioView.axaml.cs">
<DependentUpon>CustomSettingsAudioView.axaml</DependentUpon>
</Compile>
</ItemGroup>
</Project> </Project>
+59 -3
View File
@@ -1,17 +1,23 @@
using Avalonia.Controls; using Avalonia.Controls;
using Avalonia.Threading; using Avalonia.Threading;
using FluentAvalonia.UI.Controls; using FluentAvalonia.UI.Controls;
using Gommon;
using Ryujinx.Ava.Common.Locale; using Ryujinx.Ava.Common.Locale;
using Ryujinx.Ava.UI.Controls; using Ryujinx.Ava.UI.Controls;
using Ryujinx.Ava.UI.Helpers; using Ryujinx.Ava.UI.Helpers;
using Ryujinx.Ava.UI.ViewModels;
using Ryujinx.Ava.UI.Windows; using Ryujinx.Ava.UI.Windows;
using Ryujinx.Common;
using Ryujinx.HLE; using Ryujinx.HLE;
using Ryujinx.HLE.HOS.Applets; using Ryujinx.HLE.HOS.Applets;
using Ryujinx.HLE.HOS.Applets.SoftwareKeyboard; using Ryujinx.HLE.HOS.Applets.SoftwareKeyboard;
using Ryujinx.HLE.HOS.Services.Account.Acc;
using Ryujinx.HLE.HOS.Services.Am.AppletOE.ApplicationProxyService.ApplicationProxy.Types; using Ryujinx.HLE.HOS.Services.Am.AppletOE.ApplicationProxyService.ApplicationProxy.Types;
using Ryujinx.HLE.UI; using Ryujinx.HLE.UI;
using Ryujinx.UI.Common.Configuration; using Ryujinx.UI.Common.Configuration;
using System; using System;
using System.Collections.ObjectModel;
using System.Linq;
using System.Threading; using System.Threading;
namespace Ryujinx.Ava.UI.Applet namespace Ryujinx.Ava.UI.Applet
@@ -215,7 +221,7 @@ namespace Ryujinx.Ava.UI.Applet
_parent.ViewModel.AppHost?.Stop(); _parent.ViewModel.AppHost?.Stop();
} }
public bool DisplayErrorAppletDialog(string title, string message, string[] buttons) public bool DisplayErrorAppletDialog(string title, string message, string[] buttons, (uint Module, uint Description)? errorCode = null)
{ {
ManualResetEvent dialogCloseEvent = new(false); ManualResetEvent dialogCloseEvent = new(false);
@@ -256,9 +262,59 @@ namespace Ryujinx.Ava.UI.Applet
return showDetails; return showDetails;
} }
public IDynamicTextInputHandler CreateDynamicTextInputHandler() public IDynamicTextInputHandler CreateDynamicTextInputHandler() => new AvaloniaDynamicTextInputHandler(_parent);
public UserProfile ShowPlayerSelectDialog()
{ {
return new AvaloniaDynamicTextInputHandler(_parent); UserId selected = UserId.Null;
byte[] defaultGuestImage = EmbeddedResources.Read("Ryujinx.HLE/HOS/Services/Account/Acc/GuestUserImage.jpg");
UserProfile guest = new UserProfile(new UserId("00000000000000000000000000000080"), "Guest", defaultGuestImage);
ManualResetEvent dialogCloseEvent = new(false);
Dispatcher.UIThread.InvokeAsync(async () =>
{
ObservableCollection<BaseModel> profiles = [];
NavigationDialogHost nav = new();
_parent.AccountManager.GetAllUsers()
.OrderBy(x => x.Name)
.ForEach(profile => profiles.Add(new Models.UserProfile(profile, nav)));
profiles.Add(new Models.UserProfile(guest, nav));
ProfileSelectorDialogViewModel viewModel = new()
{
Profiles = profiles,
SelectedUserId = _parent.AccountManager.LastOpenedUser.UserId
};
(selected, _) = await ProfileSelectorDialog.ShowInputDialog(viewModel);
dialogCloseEvent.Set();
});
dialogCloseEvent.WaitOne();
UserProfile profile = _parent.AccountManager.LastOpenedUser;
if (selected == guest.UserId)
{
profile = guest;
}
else if (selected == UserId.Null)
{
profile = null;
}
else
{
foreach (UserProfile p in _parent.AccountManager.GetAllUsers())
{
if (p.UserId == selected)
{
profile = p;
break;
}
}
}
return profile;
} }
public void TakeScreenshot() public void TakeScreenshot()
@@ -0,0 +1,121 @@
<UserControl
x:Class="Ryujinx.Ava.UI.Applet.ProfileSelectorDialog"
xmlns="https://github.com/avaloniaui"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:helpers="clr-namespace:Ryujinx.Ava.UI.Helpers"
xmlns:models="clr-namespace:Ryujinx.Ava.UI.Models"
xmlns:viewModels="clr-namespace:Ryujinx.Ava.UI.ViewModels"
d:DesignHeight="450"
MinWidth="500"
d:DesignWidth="800"
mc:Ignorable="d"
Focusable="True"
x:DataType="viewModels:ProfileSelectorDialogViewModel">
<UserControl.Resources>
<helpers:BitmapArrayValueConverter x:Key="ByteImage" />
</UserControl.Resources>
<Design.DataContext>
<viewModels:ProfileSelectorDialogViewModel />
</Design.DataContext>
<Grid HorizontalAlignment="Stretch" VerticalAlignment="Stretch">
<Grid.RowDefinitions>
<RowDefinition />
<RowDefinition Height="Auto" />
</Grid.RowDefinitions>
<Border
CornerRadius="5"
BorderBrush="{DynamicResource AppListHoverBackgroundColor}"
BorderThickness="1">
<ListBox
MaxHeight="300"
HorizontalAlignment="Stretch"
VerticalAlignment="Center"
Background="Transparent"
ItemsSource="{Binding Profiles}"
SelectionChanged="ProfilesList_SelectionChanged">
<ListBox.ItemsPanel>
<ItemsPanelTemplate>
<WrapPanel
HorizontalAlignment="Left"
VerticalAlignment="Center"
Orientation="Horizontal" />
</ItemsPanelTemplate>
</ListBox.ItemsPanel>
<ListBox.Styles>
<Style Selector="ListBoxItem">
<Setter Property="Margin" Value="5 5 0 5" />
<Setter Property="CornerRadius" Value="5" />
</Style>
<Style Selector="Rectangle#SelectionIndicator">
<Setter Property="Opacity" Value="0" />
</Style>
</ListBox.Styles>
<ListBox.DataTemplates>
<DataTemplate
DataType="models:UserProfile">
<Grid
PointerEntered="Grid_PointerEntered"
PointerExited="Grid_OnPointerExited">
<Border
HorizontalAlignment="Stretch"
VerticalAlignment="Stretch"
ClipToBounds="True"
CornerRadius="5"
Background="{Binding BackgroundColor}">
<StackPanel
HorizontalAlignment="Stretch"
VerticalAlignment="Stretch">
<Image
Width="96"
Height="96"
HorizontalAlignment="Stretch"
VerticalAlignment="Top"
Source="{Binding Image, Converter={StaticResource ByteImage}}" />
<TextBlock
HorizontalAlignment="Stretch"
MaxWidth="90"
Text="{Binding Name}"
TextAlignment="Center"
TextWrapping="Wrap"
TextTrimming="CharacterEllipsis"
MaxLines="2"
Margin="5" />
</StackPanel>
</Border>
</Grid>
</DataTemplate>
<DataTemplate
DataType="viewModels:BaseModel">
<Panel
Height="118"
Width="96">
<Panel.Styles>
<Style Selector="Panel">
<Setter Property="Background" Value="{DynamicResource ListBoxBackground}" />
</Style>
</Panel.Styles>
</Panel>
</DataTemplate>
</ListBox.DataTemplates>
</ListBox>
</Border>
<StackPanel
Grid.Row="1"
Margin="0 24 0 0"
HorizontalAlignment="Left"
Orientation="Horizontal"
Spacing="10">
</StackPanel>
</Grid>
</UserControl>
@@ -0,0 +1,125 @@
using Avalonia;
using Avalonia.Controls;
using Avalonia.Input;
using FluentAvalonia.UI.Controls;
using Ryujinx.Ava.Common.Locale;
using Ryujinx.Ava.UI.Controls;
using Ryujinx.Ava.UI.Helpers;
using Ryujinx.Ava.UI.ViewModels;
using Ryujinx.Common.Logging;
using Ryujinx.HLE.HOS.Services.Account.Acc;
using Ryujinx.UI.Common.Configuration;
using System.Collections.ObjectModel;
using System.Threading.Tasks;
using UserProfile = Ryujinx.Ava.UI.Models.UserProfile;
using UserProfileSft = Ryujinx.HLE.HOS.Services.Account.Acc.UserProfile;
namespace Ryujinx.Ava.UI.Applet
{
public partial class ProfileSelectorDialog : UserControl
{
public ProfileSelectorDialogViewModel ViewModel { get; set; }
public ProfileSelectorDialog(ProfileSelectorDialogViewModel viewModel)
{
DataContext = ViewModel = viewModel;
InitializeComponent();
}
private void Grid_PointerEntered(object sender, PointerEventArgs e)
{
if (sender is Grid { DataContext: UserProfile profile })
{
profile.IsPointerOver = true;
}
}
private void Grid_OnPointerExited(object sender, PointerEventArgs e)
{
if (sender is Grid { DataContext: UserProfile profile })
{
profile.IsPointerOver = false;
}
}
private void ProfilesList_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
if (sender is ListBox listBox)
{
int selectedIndex = listBox.SelectedIndex;
if (selectedIndex >= 0 && selectedIndex < ViewModel.Profiles.Count)
{
if (ViewModel.Profiles[selectedIndex] is UserProfile userProfile)
{
ViewModel.SelectedUserId = userProfile.UserId;
Logger.Info?.Print(LogClass.UI, $"Selected: {userProfile.UserId}", "ProfileSelector");
ObservableCollection<BaseModel> newProfiles = [];
foreach (BaseModel item in ViewModel.Profiles)
{
if (item is UserProfile originalItem)
{
UserProfileSft profile = new(originalItem.UserId, originalItem.Name, originalItem.Image);
if (profile.UserId == ViewModel.SelectedUserId)
{
profile.AccountState = AccountState.Open;
}
newProfiles.Add(new UserProfile(profile, new NavigationDialogHost()));
}
}
ViewModel.Profiles = newProfiles;
}
}
}
}
public static async Task<(UserId Id, bool Result)> ShowInputDialog(ProfileSelectorDialogViewModel viewModel)
{
if (ConfigurationState.Instance.System.SkipUserProfilesManager)
{
UserId defaultId = viewModel.SelectedUserId;
return (defaultId, true);
}
FAContentDialog contentDialog = new()
{
Title = LocaleManager.Instance[LocaleKeys.UserProfileWindowTitle],
PrimaryButtonText = LocaleManager.Instance[LocaleKeys.Continue],
SecondaryButtonText = string.Empty,
CloseButtonText = LocaleManager.Instance[LocaleKeys.Cancel],
Content = new ProfileSelectorDialog(viewModel),
Padding = new Thickness(0)
};
UserId result = UserId.Null;
bool input = false;
contentDialog.Closed += Handler;
await ContentDialogHelper.ShowAsync(contentDialog);
return (result, input);
void Handler(FAContentDialog sender, FAContentDialogClosedEventArgs eventArgs)
{
if (eventArgs.Result == FAContentDialogResult.Primary)
{
result = viewModel.SelectedUserId;
input = true;
}
else
{
result = UserId.Null;
input = false;
}
}
}
}
}
@@ -42,6 +42,10 @@
Click="OpenDownloadableContentManager_Click" Click="OpenDownloadableContentManager_Click"
Header="{locale:Locale GameListContextMenuManageDlc}" Header="{locale:Locale GameListContextMenuManageDlc}"
ToolTip.Tip="{locale:Locale GameListContextMenuManageDlcToolTip}" /> ToolTip.Tip="{locale:Locale GameListContextMenuManageDlcToolTip}" />
<MenuItem
Click="OpenCustomSettingsManager_Click"
Header="{locale:Locale GameListContextMenuManageCustomSettings}"
ToolTip.Tip="{locale:Locale GameListContextMenuManageCustomSettingsToolTip}" />
<MenuItem <MenuItem
Click="OpenCheatManager_Click" Click="OpenCheatManager_Click"
Header="{locale:Locale GameListContextMenuManageCheat}" Header="{locale:Locale GameListContextMenuManageCheat}"
@@ -51,6 +55,10 @@
Header="{locale:Locale GameListContextMenuManageMod}" Header="{locale:Locale GameListContextMenuManageMod}"
ToolTip.Tip="{locale:Locale GameListContextMenuManageModToolTip}" /> ToolTip.Tip="{locale:Locale GameListContextMenuManageModToolTip}" />
<Separator /> <Separator />
<MenuItem
Click="OpenCustomSettings_Click"
Header="{locale:Locale GameListContextMenuCustomSettingsOpen}"
ToolTip.Tip="{locale:Locale GameListContextMenuCustomSettingsOpenToolTip}" />
<MenuItem <MenuItem
Click="OpenModsDirectory_Click" Click="OpenModsDirectory_Click"
Header="{locale:Locale GameListContextMenuOpenModsDirectory}" Header="{locale:Locale GameListContextMenuOpenModsDirectory}"
@@ -103,6 +103,23 @@ namespace Ryujinx.Ava.UI.Controls
} }
} }
public async void OpenCustomSettingsManager_Click(object sender, RoutedEventArgs args)
{
var viewModel = (sender as MenuItem)?.DataContext as MainWindowViewModel;
if (viewModel?.SelectedApplication != null)
{
await new CustomSettingsWindow(
viewModel.VirtualFileSystem,
viewModel.SelectedApplication.IdString,
viewModel.SelectedApplication.Name,
viewModel.SelectedApplication.Icon,
viewModel.SelectedApplication.Path).ShowDialog(viewModel.TopLevel as Window);
viewModel.RefreshView();
}
}
public async void OpenCheatManager_Click(object sender, RoutedEventArgs args) public async void OpenCheatManager_Click(object sender, RoutedEventArgs args)
{ {
MainWindowViewModel viewModel = (sender as MenuItem)?.DataContext as MainWindowViewModel; MainWindowViewModel viewModel = (sender as MenuItem)?.DataContext as MainWindowViewModel;
@@ -157,6 +174,54 @@ namespace Ryujinx.Ava.UI.Controls
} }
} }
public async void ManageCustomSettings_Click(object sender, RoutedEventArgs args)
{
var viewModel = (sender as MenuItem)?.DataContext as MainWindowViewModel;
if (viewModel?.SelectedApplication != null)
{
await new CustomSettingsWindow(
viewModel.VirtualFileSystem,
viewModel.SelectedApplication.IdString,
viewModel.SelectedApplication.Name,
viewModel.SelectedApplication.Icon,
viewModel.SelectedApplication.Path).ShowDialog(viewModel.TopLevel as Window);
}
}
public async void DeleteCustomSettings_Click(object sender, RoutedEventArgs args)
{
if (sender is not MenuItem { DataContext: MainWindowViewModel { SelectedApplication: not null } viewModel })
return;
UserResult result = await ContentDialogHelper.CreateLocalizedConfirmationDialog(
LocaleManager.Instance[LocaleKeys.DialogWarning],
LocaleManager.Instance.UpdateAndGetDynamicValue(LocaleKeys.DialogCustomSettingsDeleteMessage, viewModel.SelectedApplication.Name)
);
if (result == UserResult.Yes)
{
CustomSettingsHelper.DeleteCustomSettings(CustomSettingsHelper.PathToGameSettingsJson(viewModel.SelectedApplication.Id));
}
}
public void OpenCustomSettings_Click(object sender, RoutedEventArgs args)
{
var viewModel = (sender as MenuItem)?.DataContext as MainWindowViewModel;
if (viewModel?.SelectedApplication != null)
{
string customConfigDir = Path.Combine(AppDataManager.GamesDirPath, viewModel.SelectedApplication.IdString);
if (!Directory.Exists(customConfigDir))
{
Directory.CreateDirectory(customConfigDir);
}
OpenHelper.OpenFolder(customConfigDir);
}
}
public async void PurgePtcCache_Click(object sender, RoutedEventArgs args) public async void PurgePtcCache_Click(object sender, RoutedEventArgs args)
{ {
MainWindowViewModel viewModel = (sender as MenuItem)?.DataContext as MainWindowViewModel; MainWindowViewModel viewModel = (sender as MenuItem)?.DataContext as MainWindowViewModel;
+59 -3
View File
@@ -4,6 +4,9 @@ using Avalonia.Platform;
using Ryujinx.Common.Configuration; using Ryujinx.Common.Configuration;
using Ryujinx.UI.Common.Configuration; using Ryujinx.UI.Common.Configuration;
using Ryujinx.UI.Common.Helper; using Ryujinx.UI.Common.Helper;
using Ryujinx.Common.Logging;
using Ryujinx.Graphics.RenderDocApi;
using Ryujinx.HLE;
using SPB.Graphics; using SPB.Graphics;
using SPB.Platform; using SPB.Platform;
using SPB.Platform.GLX; using SPB.Platform.GLX;
@@ -30,6 +33,7 @@ namespace Ryujinx.Ava.UI.Renderer
protected nint MetalLayer { get; set; } protected nint MetalLayer { get; set; }
public delegate void UpdateBoundsCallbackDelegate(Rect rect); public delegate void UpdateBoundsCallbackDelegate(Rect rect);
private UpdateBoundsCallbackDelegate _updateBoundsCallback; private UpdateBoundsCallbackDelegate _updateBoundsCallback;
public event EventHandler<nint> WindowCreated; public event EventHandler<nint> WindowCreated;
@@ -46,6 +50,55 @@ namespace Ryujinx.Ava.UI.Renderer
protected virtual void OnWindowDestroyed() { } protected virtual void OnWindowDestroyed() { }
public bool ToggleRenderDocCapture(Switch device)
{
if (!RenderDoc.IsAvailable) return false;
if (RenderDoc.IsFrameCapturing)
{
if (EndRenderDocCapture())
{
Logger.Info?.Print(LogClass.Application, "Ended RenderDoc capture.");
return true;
}
}
else if (StartRenderDocCapture(device))
{
Logger.Info?.Print(LogClass.Application, "Starting RenderDoc capture.");
return true;
}
return false;
}
public bool StartRenderDocCapture(Switch device)
{
if (!RenderDoc.IsAvailable) return false;
if (RenderDoc.IsFrameCapturing) return false;
RenderDoc.StartFrameCapture(nint.Zero, WindowHandle);
RenderDoc.SetCaptureTitle(TitleHelper.FormatRenderDocCaptureTitle(device.Processes.ActiveApplication, Program.Version));
return true;
}
public bool EndRenderDocCapture()
{
if (!RenderDoc.IsAvailable) return false;
if (!RenderDoc.IsFrameCapturing) return false;
return RenderDoc.IsFrameCapturing && RenderDoc.EndFrameCapture(nint.Zero, WindowHandle);
}
public bool DiscardRenderDocCapture()
{
if (!RenderDoc.IsAvailable) return false;
if (!RenderDoc.IsFrameCapturing) return false;
return RenderDoc.IsFrameCapturing && RenderDoc.DiscardFrameCapture(nint.Zero, WindowHandle);
}
protected virtual void OnWindowDestroying() protected virtual void OnWindowDestroying()
{ {
WindowHandle = nint.Zero; WindowHandle = nint.Zero;
@@ -124,7 +177,9 @@ namespace Ryujinx.Ava.UI.Renderer
} }
else else
{ {
X11Window = PlatformHelper.CreateOpenGLWindow(new FramebufferFormat(new ColorFormat(8, 8, 8, 0), 16, 0, ColorFormat.Zero, 0, 2, false), 0, 0, 100, 100) as GLXWindow; X11Window = PlatformHelper.CreateOpenGLWindow(
new FramebufferFormat(new ColorFormat(8, 8, 8, 0), 16, 0, ColorFormat.Zero, 0, 2, false), 0, 0, 100,
100) as GLXWindow;
} }
if (X11Window != null) if (X11Window != null)
@@ -141,7 +196,7 @@ namespace Ryujinx.Ava.UI.Renderer
{ {
_className = "NativeWindow-" + Guid.NewGuid(); _className = "NativeWindow-" + Guid.NewGuid();
_wndProcDelegate = delegate (nint hWnd, WindowsMessages msg, nint wParam, nint lParam) _wndProcDelegate = delegate(nint hWnd, WindowsMessages msg, nint wParam, nint lParam)
{ {
switch (msg) switch (msg)
{ {
@@ -164,7 +219,8 @@ namespace Ryujinx.Ava.UI.Renderer
RegisterClassEx(ref wndClassEx); RegisterClassEx(ref wndClassEx);
WindowHandle = CreateWindowEx(0, _className, "NativeWindow", WindowStyles.WsChild, 0, 0, 640, 480, control.Handle, nint.Zero, nint.Zero, nint.Zero); WindowHandle = CreateWindowEx(0, _className, "NativeWindow", WindowStyles.WsChild, 0, 0, 640, 480,
control.Handle, nint.Zero, nint.Zero, nint.Zero);
SetWindowLongPtrW(control.Handle, GWLP_WNDPROC, wndClassEx.lpfnWndProc); SetWindowLongPtrW(control.Handle, GWLP_WNDPROC, wndClassEx.lpfnWndProc);
@@ -0,0 +1,359 @@
using Avalonia.Controls;
using Avalonia.Media.Imaging;
using Avalonia.Threading;
using CommunityToolkit.Mvvm.ComponentModel;
using Ryujinx.Audio.Backends.OpenAL;
using Ryujinx.Audio.Backends.SDL3;
using Ryujinx.Audio.Backends.SoundIo;
using Ryujinx.Ava.Common.Locale;
using Ryujinx.Ava.UI.Helpers;
using Ryujinx.Graphics.Vulkan;
using Ryujinx.UI.Common.Configuration;
using Ryujinx.UI.Common.Helper;
using Ryujinx.UI.Common.Models;
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Globalization;
using System.IO;
using System.Linq;
using System.Runtime.InteropServices;
using System.Threading.Tasks;
namespace Ryujinx.Ava.UI.ViewModels
{
public partial class CustomSettingsViewModel : BaseModel
{
[ObservableProperty]
private bool _isVulkanAvailable = true;
private readonly List<string> _gpuIds = [];
private int ComputePreferredGpuIndex(string PreferredGpu)
{
return _gpuIds.Contains(PreferredGpu) ? _gpuIds.IndexOf(PreferredGpu) : 0;
}
private string ComputePreferredGpu(int PreferredGpuIndex)
{
return _gpuIds.ElementAtOrDefault(PreferredGpuIndex);
}
private int ComputeResScaleIndex(float ResScale)
{
if (ResScale <= 0.5f)
{
return 0;
}
else if (ResScale <= 0.75f)
{
return 1;
}
else
{
return (int)Math.Ceiling(ResScale) + 1;
}
}
private float ComputeResScale(int ResScaleIndex)
{
switch (ResScaleIndex)
{
case 0:
return 0.5f;
case 1:
return 0.75f;
case 2:
return 1.0f;
case 3:
return 2.0f;
case 4:
return 3.0f;
case 5:
return 4.0f;
default:
return 1.0f;
}
}
private int ComputeMaxAnisotropyIndex(float MaxAnisotropy)
{
return MaxAnisotropy == -1.0f ? 0 : (int)(MathF.Log2(MaxAnisotropy));
}
private float ComputeMaxAnisotropy(int MaxAnisotropyIndex)
{
switch (MaxAnisotropyIndex)
{
case 0:
return -1.0f;
case 1:
return 2.0f;
case 2:
return 4.0f;
case 3:
return 8.0f;
case 4:
return 16.0f;
default:
return 2.0f;
}
}
public bool IsMacOS => OperatingSystem.IsMacOS();
public bool IsOpenGLAvailable => !OperatingSystem.IsMacOS();
public bool IsHypervisorAvailable => OperatingSystem.IsMacOS() && RuntimeInformation.ProcessArchitecture == Architecture.Arm64;
public ulong ApplicationIdBase { get; set; }
public string ApplicationName { get; set; }
public Bitmap GameIcon { get; set; }
public ObservableCollection<ComboBoxItem> AvailableGpus { get; set; }
public CustomSettingsModel CustomSettingsModel { get; set; }
public event Action CloseWindow;
// System settings
public bool EnableDockedMode { get; set; }
public int SystemLanguage { get; set; }
public int SystemRegion { get; set; }
public int DramSize { get; set; }
public bool EnableFsIntegrityChecks { get; set; }
public bool IgnoreMissingServices { get; set; }
// CPU settings
public bool EnablePptc { get; set; }
public bool EnableLowPowerPptc { get; set; }
public int MemoryManagerMode { get; set; }
public bool UseHypervisor { get; set; }
public long TurboMultiplier
{
get;
set
{
if (field != value)
{
field = value;
OnPropertyChanged();
OnPropertyChanged((nameof(TurboMultiplierPercentageText)));
}
}
}
public string TurboMultiplierPercentageText => $"{TurboMultiplier}%";
// Graphics settings
public int VSyncMode { get; set; }
public int GraphicsBackend { get; set; }
public int PreferredGpuIndex { get; set; }
public bool EnableShaderCache { get; set; }
public bool EnableTextureRecompression { get; set; }
public bool EnableMacroHLE { get; set; }
public bool EnableColorSpacePassthrough { get; set; }
public bool ColorSpacePassthroughAvailable => IsMacOS;
public int ResScaleIndex { get; set; }
public int MaxAnisotropyIndex { get; set; }
public int BackendThreading { get; set; }
// Audio settings
public bool IsOpenAlEnabled { get; set; }
public bool IsSoundIoEnabled { get; set; }
public bool IsSDL3Enabled { get; set; }
public AudioBackend AudioBackend { get; set; }
public float Volume
{
get;
set
{
field = value;
ConfigurationState.Instance.System.AudioVolume.Value = field / 100;
OnPropertyChanged();
}
}
public CustomSettingsViewModel(string titleId, byte[] icon, string titleName)
{
AvailableGpus = [];
ApplicationIdBase = ulong.Parse(titleId, NumberStyles.HexNumber);
CustomSettingsModel = CustomSettingsHelper.LoadCustomSettingsJson(CustomSettingsHelper.PathToGameSettingsJson(ApplicationIdBase));
Task.Run(CheckSoundBackends);
if (icon is { Length: > 0 })
{
using MemoryStream ms = new(icon);
GameIcon = new Bitmap(ms);
}
if (Program.PreviewerDetached)
{
Task.Run(LoadAvailableGpus);
LoadCurrentConfiguration();
}
}
public async Task CheckSoundBackends()
{
IsOpenAlEnabled = OpenALHardwareDeviceDriver.IsSupported;
IsSoundIoEnabled = SoundIoHardwareDeviceDriver.IsSupported;
IsSDL3Enabled = SDL3HardwareDeviceDriver.IsSupported;
await Dispatcher.UIThread.InvokeAsync(() =>
{
OnPropertyChanged(nameof(IsOpenAlEnabled));
OnPropertyChanged(nameof(IsSoundIoEnabled));
OnPropertyChanged(nameof(IsSDL3Enabled));
});
}
private async Task LoadAvailableGpus()
{
AvailableGpus.Clear();
var devices = VulkanRenderer.GetPhysicalDevices();
if (devices.Length == 0)
{
IsVulkanAvailable = false;
GraphicsBackend = 1;
}
else
{
foreach (var device in devices)
{
await Dispatcher.UIThread.InvokeAsync(() =>
{
_gpuIds.Add(device.Id);
AvailableGpus.Add(new ComboBoxItem { Content = $"{device.Name} {(device.IsDiscrete ? "(dGPU)" : "")}" });
});
}
}
// GPU configuration needs to be loaded during the async method or it will always return 0.
PreferredGpuIndex = ComputePreferredGpuIndex(ConfigurationState.Instance.Graphics.PreferredGpu.Value);
Dispatcher.UIThread.Post(() => OnPropertyChanged(nameof(PreferredGpuIndex)));
}
public void LoadCurrentConfiguration()
{
ConfigurationState config = ConfigurationState.Instance;
if (!CustomSettingsHelper.HasCustomSettings(CustomSettingsHelper.PathToGameSettingsJson(ApplicationIdBase)))
{
// Load all settings from global configuration
EnableDockedMode = config.System.EnableDockedMode.Value;
SystemLanguage = (int)config.System.Language.Value;
SystemRegion = (int)config.System.Region.Value;
VSyncMode = (int)config.Graphics.VSyncMode.Value;
DramSize = (int)config.System.DramSize.Value;
EnableFsIntegrityChecks = config.System.EnableFsIntegrityChecks.Value;
IgnoreMissingServices = config.System.IgnoreMissingServices.Value;
EnablePptc = config.System.EnablePptc.Value;
EnableLowPowerPptc = config.System.EnableLowPowerPptc.Value;
MemoryManagerMode = (int)config.System.MemoryManagerMode.Value;
UseHypervisor = config.System.UseHypervisor.Value;
TurboMultiplier = config.System.TickScalar.Value;
GraphicsBackend = (int)config.Graphics.GraphicsBackend.Value;
PreferredGpuIndex = ComputePreferredGpuIndex(config.Graphics.PreferredGpu.Value);
EnableShaderCache = config.Graphics.EnableShaderCache.Value;
EnableTextureRecompression = config.Graphics.EnableTextureRecompression.Value;
EnableMacroHLE = config.Graphics.EnableMacroHLE.Value;
EnableColorSpacePassthrough = config.Graphics.EnableColorSpacePassthrough.Value;
ResScaleIndex = ComputeResScaleIndex(config.Graphics.ResScale);
MaxAnisotropyIndex = ComputeMaxAnisotropyIndex(config.Graphics.MaxAnisotropy);
BackendThreading = (int)config.Graphics.BackendThreading.Value;
AudioBackend = config.System.AudioBackend.Value;
Volume = config.System.AudioVolume * 100;
}
else
{
// Load all settings from custom configuration
EnableDockedMode = CustomSettingsModel.EnableDockedMode;
SystemLanguage = CustomSettingsModel.SystemLanguage;
SystemRegion = CustomSettingsModel.SystemRegion;
VSyncMode = CustomSettingsModel.VSyncMode;
DramSize = CustomSettingsModel.DramSize;
EnableFsIntegrityChecks = CustomSettingsModel.EnableFsIntegrityChecks;
IgnoreMissingServices = CustomSettingsModel.IgnoreMissingServices;
EnablePptc = CustomSettingsModel.EnablePptc;
EnableLowPowerPptc = CustomSettingsModel.EnableLowPowerPptc;
MemoryManagerMode = CustomSettingsModel.MemoryManagerMode;
UseHypervisor = CustomSettingsModel.UseHypervisor;
TurboMultiplier = CustomSettingsModel.TickScalar;
GraphicsBackend = CustomSettingsModel.GraphicsBackend;
PreferredGpuIndex = ComputePreferredGpuIndex(CustomSettingsModel.PreferredGpu);
EnableShaderCache = CustomSettingsModel.EnableShaderCache;
EnableTextureRecompression = CustomSettingsModel.EnableTextureRecompression;
EnableMacroHLE = CustomSettingsModel.EnableMacroHLE;
EnableColorSpacePassthrough = CustomSettingsModel.EnableColorSpacePassthrough;
ResScaleIndex = ComputeResScaleIndex(CustomSettingsModel.ResScale);
MaxAnisotropyIndex = ComputeMaxAnisotropyIndex(CustomSettingsModel.MaxAnisotropy);
BackendThreading = CustomSettingsModel.BackendThreading;
AudioBackend = CustomSettingsModel.AudioBackend;
Volume = CustomSettingsModel.AudioVolume * 100;
}
}
public void DeleteSettings()
{
if (CustomSettingsHelper.HasCustomSettings(CustomSettingsHelper.PathToGameSettingsJson(ApplicationIdBase)))
{
CustomSettingsHelper.DeleteCustomSettings(CustomSettingsHelper.PathToGameSettingsJson(ApplicationIdBase));
}
}
public void SaveSettings()
{
CustomSettingsModel.HasCustomSettings = true;
CustomSettingsModel.EnableDockedMode = EnableDockedMode;
CustomSettingsModel.SystemLanguage = SystemLanguage;
CustomSettingsModel.SystemRegion = SystemRegion;
CustomSettingsModel.VSyncMode = VSyncMode;
CustomSettingsModel.DramSize = DramSize;
CustomSettingsModel.EnableFsIntegrityChecks = EnableFsIntegrityChecks;
CustomSettingsModel.IgnoreMissingServices = IgnoreMissingServices;
CustomSettingsModel.EnablePptc = EnablePptc;
CustomSettingsModel.EnableLowPowerPptc = EnableLowPowerPptc;
CustomSettingsModel.MemoryManagerMode = MemoryManagerMode;
CustomSettingsModel.UseHypervisor = UseHypervisor;
CustomSettingsModel.TickScalar = TurboMultiplier;
CustomSettingsModel.GraphicsBackend = GraphicsBackend;
CustomSettingsModel.PreferredGpu = ComputePreferredGpu(PreferredGpuIndex);
CustomSettingsModel.EnableShaderCache = EnableShaderCache;
CustomSettingsModel.EnableTextureRecompression = EnableTextureRecompression;
CustomSettingsModel.EnableMacroHLE = EnableMacroHLE;
CustomSettingsModel.ResScale = ComputeResScale(ResScaleIndex);
CustomSettingsModel.MaxAnisotropy = ComputeMaxAnisotropy(MaxAnisotropyIndex);
CustomSettingsModel.BackendThreading = BackendThreading;
CustomSettingsModel.AudioBackend = AudioBackend;
CustomSettingsModel.AudioVolume = Volume / 100;
CustomSettingsHelper.SaveCustomSettingsJson(CustomSettingsHelper.PathToGameSettingsJson(ApplicationIdBase), CustomSettingsModel);
}
public async void DeleteButton()
{
UserResult result = await ContentDialogHelper.CreateLocalizedConfirmationDialog(
LocaleManager.Instance[LocaleKeys.DialogWarning],
LocaleManager.Instance.UpdateAndGetDynamicValue(LocaleKeys.DialogCustomSettingsDeleteMessage, ApplicationName)
);
if (result == UserResult.Yes)
{
DeleteSettings();
CloseWindow?.Invoke();
}
}
public void CancelButton()
{
CloseWindow?.Invoke();
}
public void SaveButton()
{
SaveSettings();
CloseWindow?.Invoke();
}
}
}
@@ -7,6 +7,7 @@ using Avalonia.Platform.Storage;
using Avalonia.Threading; using Avalonia.Threading;
using System.Runtime.Versioning; using System.Runtime.Versioning;
using CommunityToolkit.Mvvm.ComponentModel; using CommunityToolkit.Mvvm.ComponentModel;
using CommunityToolkit.Mvvm.Input;
using DynamicData; using DynamicData;
using DynamicData.Binding; using DynamicData.Binding;
using FluentAvalonia.UI.Controls; using FluentAvalonia.UI.Controls;
@@ -25,6 +26,7 @@ using Ryujinx.Common.Configuration;
using Ryujinx.Common.Logging; using Ryujinx.Common.Logging;
using Ryujinx.Common.Utilities; using Ryujinx.Common.Utilities;
using Ryujinx.Cpu; using Ryujinx.Cpu;
using Ryujinx.Graphics.RenderDocApi;
using Ryujinx.HLE; using Ryujinx.HLE;
using Ryujinx.HLE.FileSystem; using Ryujinx.HLE.FileSystem;
using Ryujinx.HLE.HOS; using Ryujinx.HLE.HOS;
@@ -1833,6 +1835,31 @@ namespace Ryujinx.Ava.UI.ViewModels
} }
public void ReloadRenderDocApi()
{
RenderDoc.ReloadApi(ignoreAlreadyLoaded: true);
OnPropertyChanged(nameof(ShowStartCaptureButton));
OnPropertyChanged(nameof(ShowEndCaptureButton));
OnPropertyChanged(nameof(RenderDocIsAvailable));
if (RenderDoc.IsAvailable)
RenderDocIsCapturing = RenderDoc.IsFrameCapturing;
NotificationHelper.ShowInformation(
"RenderDoc API reloaded",
RenderDoc.IsAvailable ? "RenderDoc is now available." : "RenderDoc is no longer available."
);
}
public void ToggleCapture()
{
if (ShowLoadProgress) return;
AppHost.RendererHost.EmbeddedWindow.ToggleRenderDocCapture(AppHost.Device);
RenderDocIsCapturing = RenderDoc.IsFrameCapturing;
}
public void ToggleFullscreen() public void ToggleFullscreen()
{ {
if (Environment.TickCount64 - LastFullscreenToggle < HotKeyPressDelayMs) if (Environment.TickCount64 - LastFullscreenToggle < HotKeyPressDelayMs)
@@ -2112,5 +2139,25 @@ namespace Ryujinx.Ava.UI.ViewModels
} }
#endregion #endregion
#region Context Menu commands
public bool ShowStartCaptureButton => !RenderDocIsCapturing && RenderDoc.IsAvailable;
public bool ShowEndCaptureButton => RenderDocIsCapturing && RenderDoc.IsAvailable;
public static bool RenderDocIsAvailable => RenderDoc.IsAvailable;
public bool RenderDocIsCapturing
{
get;
set
{
field = value;
OnPropertyChanged();
OnPropertyChanged(nameof(ShowStartCaptureButton));
OnPropertyChanged(nameof(ShowEndCaptureButton));
}
}
#endregion
} }
} }
@@ -0,0 +1,14 @@
using CommunityToolkit.Mvvm.ComponentModel;
using Ryujinx.HLE.HOS.Services.Account.Acc;
using System.Collections.ObjectModel;
namespace Ryujinx.Ava.UI.ViewModels
{
public partial class ProfileSelectorDialogViewModel : BaseModel
{
[ObservableProperty] private UserId _selectedUserId;
[ObservableProperty] private ObservableCollection<BaseModel> _profiles = [];
}
}
+80 -58
View File
@@ -20,6 +20,7 @@ using Ryujinx.Graphics.Vulkan;
using Ryujinx.HLE; using Ryujinx.HLE;
using Ryujinx.HLE.FileSystem; using Ryujinx.HLE.FileSystem;
using Ryujinx.HLE.HOS.Services.Time.TimeZone; using Ryujinx.HLE.HOS.Services.Time.TimeZone;
using Ryujinx.HLE.HOS.SystemState;
using Ryujinx.UI.Common.Configuration; using Ryujinx.UI.Common.Configuration;
using Ryujinx.UI.Common.Configuration.System; using Ryujinx.UI.Common.Configuration.System;
using System; using System;
@@ -47,8 +48,6 @@ namespace Ryujinx.Ava.UI.ViewModels
private readonly Dictionary<string, string> _networkInterfaces; private readonly Dictionary<string, string> _networkInterfaces;
private int _resolutionScale;
[ObservableProperty] [ObservableProperty]
private bool _isVulkanAvailable = true; private bool _isVulkanAvailable = true;
@@ -69,51 +68,79 @@ namespace Ryujinx.Ava.UI.ViewModels
private bool _enableGDBStub; private bool _enableGDBStub;
public int ResolutionScale private int ComputePreferredGpuIndex(string PreferredGpu)
{ {
get => _resolutionScale; return _gpuIds.Contains(PreferredGpu) ? _gpuIds.IndexOf(PreferredGpu) : 0;
set }
{
_resolutionScale = value;
OnPropertyChanged(nameof(CustomResolutionScale)); private string ComputePreferredGpu(int PreferredGpuIndex)
OnPropertyChanged(nameof(IsCustomResolutionScaleActive)); {
return _gpuIds.ElementAtOrDefault((int)PreferredGpuIndex);
}
private int ComputeResScaleIndex(float ResScale)
{
if (ResScale <= 0.5f)
{
return 0;
}
else if (ResScale <= 0.75f)
{
return 1;
}
else
{
return (int)Math.Ceiling(ResScale) + 1;
} }
} }
public int GraphicsBackendMultithreadingIndex private float ComputeResScale(int ResScaleIndex)
{ {
get; switch (ResScaleIndex)
set
{ {
field = value; case 0:
return 0.5f;
if (field != (int)ConfigurationState.Instance.Graphics.BackendThreading.Value) case 1:
{ return 0.75f;
Dispatcher.UIThread.InvokeAsync(() => case 2:
ContentDialogHelper.CreateInfoDialog(LocaleManager.Instance[LocaleKeys.DialogSettingsBackendThreadingWarningMessage], return 1.0f;
"", case 3:
"", return 2.0f;
LocaleManager.Instance[LocaleKeys.InputDialogOk], case 4:
LocaleManager.Instance[LocaleKeys.DialogSettingsBackendThreadingWarningTitle]) return 3.0f;
); case 5:
} return 4.0f;
default:
OnPropertyChanged(); return 1.0f;
} }
} }
public float CustomResolutionScale private int ComputeMaxAnisotropyIndex(float MaxAnisotropy)
{ {
get; return MaxAnisotropy == -1.0f ? 0 : (int)(MathF.Log2(MaxAnisotropy));
set }
{
field = value;
OnPropertyChanged(); private float ComputeMaxAnisotropy(int MaxAnisotropyIndex)
{
switch (MaxAnisotropyIndex)
{
case 0:
return -1.0f;
case 1:
return 2.0f;
case 2:
return 4.0f;
case 3:
return 8.0f;
case 4:
return 16.0f;
default:
return 2.0f;
} }
} }
public bool IsMacOS => OperatingSystem.IsMacOS();
public bool IsOpenGLAvailable => !OperatingSystem.IsMacOS(); public bool IsOpenGLAvailable => !OperatingSystem.IsMacOS();
public bool IsHypervisorAvailable => OperatingSystem.IsMacOS() && RuntimeInformation.ProcessArchitecture == Architecture.Arm64; public bool IsHypervisorAvailable => OperatingSystem.IsMacOS() && RuntimeInformation.ProcessArchitecture == Architecture.Arm64;
@@ -140,8 +167,6 @@ namespace Ryujinx.Ava.UI.ViewModels
} }
} }
public bool IsMacOS => OperatingSystem.IsMacOS();
public bool EnableDiscordIntegration { get; set; } public bool EnableDiscordIntegration { get; set; }
public bool CheckUpdatesOnStart { get; set; } public bool CheckUpdatesOnStart { get; set; }
public bool ShowConfirmExit { get; set; } public bool ShowConfirmExit { get; set; }
@@ -260,10 +285,9 @@ namespace Ryujinx.Ava.UI.ViewModels
public bool IsSoundIoEnabled { get; set; } public bool IsSoundIoEnabled { get; set; }
public bool IsSDL3Enabled { get; set; } public bool IsSDL3Enabled { get; set; }
public bool IsAudioToolboxEnabled { get; set; } public bool IsAudioToolboxEnabled { get; set; }
public bool IsCustomResolutionScaleActive => _resolutionScale == 4;
public bool IsScalingFilterActive => _scalingFilter == (int)Ryujinx.Common.Configuration.ScalingFilter.Fsr; public bool IsScalingFilterActive => _scalingFilter == (int)Ryujinx.Common.Configuration.ScalingFilter.Fsr;
public bool IsVulkanSelected => GraphicsBackendIndex == 0; public bool IsVulkanSelected => GraphicsBackend == 0;
public bool UseHypervisor { get; set; } public bool UseHypervisor { get; set; }
public bool DisableP2P { get; set; } public bool DisableP2P { get; set; }
@@ -292,8 +316,10 @@ namespace Ryujinx.Ava.UI.ViewModels
public int Region { get; set; } public int Region { get; set; }
public int FsGlobalAccessLogMode { get; set; } public int FsGlobalAccessLogMode { get; set; }
public int AudioBackend { get; set; } public int AudioBackend { get; set; }
public int MaxAnisotropy { get; set; } public int ResScaleIndex { get; set; }
public int MaxAnisotropyIndex { get; set; }
public int AspectRatio { get; set; } public int AspectRatio { get; set; }
public int BackendThreading { get; set; }
public int AntiAliasingEffect { get; set; } public int AntiAliasingEffect { get; set; }
public string ScalingFilterLevelText => ScalingFilterLevel.ToString("0"); public string ScalingFilterLevelText => ScalingFilterLevel.ToString("0");
@@ -312,7 +338,7 @@ namespace Ryujinx.Ava.UI.ViewModels
public int MemoryMode { get; set; } public int MemoryMode { get; set; }
public int BaseStyleIndex { get; set; } public int BaseStyleIndex { get; set; }
public int GraphicsBackendIndex public int GraphicsBackend
{ {
get; get;
set set
@@ -484,7 +510,7 @@ namespace Ryujinx.Ava.UI.ViewModels
if (devices.Length == 0) if (devices.Length == 0)
{ {
IsVulkanAvailable = false; IsVulkanAvailable = false;
GraphicsBackendIndex = 1; GraphicsBackend = 1;
} }
else else
{ {
@@ -500,8 +526,7 @@ namespace Ryujinx.Ava.UI.ViewModels
} }
// GPU configuration needs to be loaded during the async method or it will always return 0. // GPU configuration needs to be loaded during the async method or it will always return 0.
PreferredGpuIndex = _gpuIds.Contains(ConfigurationState.Instance.Graphics.PreferredGpu) ? PreferredGpuIndex = ComputePreferredGpuIndex(ConfigurationState.Instance.Graphics.PreferredGpu.Value);
_gpuIds.IndexOf(ConfigurationState.Instance.Graphics.PreferredGpu) : 0;
Dispatcher.UIThread.Post(() => OnPropertyChanged(nameof(PreferredGpuIndex))); Dispatcher.UIThread.Post(() => OnPropertyChanged(nameof(PreferredGpuIndex)));
} }
@@ -618,24 +643,23 @@ namespace Ryujinx.Ava.UI.ViewModels
SkipUserProfiles = config.System.SkipUserProfilesManager; SkipUserProfiles = config.System.SkipUserProfilesManager;
// CPU // CPU
EnablePptc = config.System.EnablePtc; EnablePptc = config.System.EnablePptc;
EnableLowPowerPptc = config.System.EnableLowPowerPtc; EnableLowPowerPptc = config.System.EnableLowPowerPptc;
MemoryMode = (int)config.System.MemoryManagerMode.Value; MemoryMode = (int)config.System.MemoryManagerMode.Value;
UseHypervisor = config.System.UseHypervisor; UseHypervisor = config.System.UseHypervisor;
TurboMultiplier = config.System.TickScalar; TurboMultiplier = config.System.TickScalar;
// Graphics // Graphics
GraphicsBackendIndex = (int)config.Graphics.GraphicsBackend.Value; GraphicsBackend = (int)config.Graphics.GraphicsBackend.Value;
// Physical devices are queried asynchronously hence the preferred index config value is loaded in LoadAvailableGpus(). // Physical devices are queried asynchronously hence the preferred index config value is loaded in LoadAvailableGpus().
EnableShaderCache = config.Graphics.EnableShaderCache; EnableShaderCache = config.Graphics.EnableShaderCache;
EnableTextureRecompression = config.Graphics.EnableTextureRecompression; EnableTextureRecompression = config.Graphics.EnableTextureRecompression;
EnableMacroHLE = config.Graphics.EnableMacroHLE; EnableMacroHLE = config.Graphics.EnableMacroHLE;
EnableColorSpacePassthrough = config.Graphics.EnableColorSpacePassthrough; EnableColorSpacePassthrough = config.Graphics.EnableColorSpacePassthrough;
ResolutionScale = config.Graphics.ResScale == -1 ? 4 : config.Graphics.ResScale - 1; ResScaleIndex = ComputeResScaleIndex(config.Graphics.ResScale);
CustomResolutionScale = config.Graphics.ResScaleCustom; MaxAnisotropyIndex = ComputeMaxAnisotropyIndex(config.Graphics.MaxAnisotropy);
MaxAnisotropy = config.Graphics.MaxAnisotropy == -1 ? 0 : (int)(MathF.Log2(config.Graphics.MaxAnisotropy));
AspectRatio = (int)config.Graphics.AspectRatio.Value; AspectRatio = (int)config.Graphics.AspectRatio.Value;
GraphicsBackendMultithreadingIndex = (int)config.Graphics.BackendThreading.Value; BackendThreading = (int)config.Graphics.BackendThreading.Value;
ShaderDumpPath = config.Graphics.ShadersDumpPath; ShaderDumpPath = config.Graphics.ShadersDumpPath;
TextureDumpPath = config.Graphics.TexturesDumpPath.Value; TextureDumpPath = config.Graphics.TexturesDumpPath.Value;
TextureDumpFormatIndex = (int)config.Graphics.TexturesDumpFileFormat.Value; TextureDumpFormatIndex = (int)config.Graphics.TexturesDumpFileFormat.Value;
@@ -738,33 +762,31 @@ namespace Ryujinx.Ava.UI.ViewModels
config.System.SkipUserProfilesManager.Value = SkipUserProfiles; config.System.SkipUserProfilesManager.Value = SkipUserProfiles;
// CPU // CPU
config.System.EnablePtc.Value = EnablePptc; config.System.EnablePptc.Value = EnablePptc;
config.System.EnableLowPowerPtc.Value = EnableLowPowerPptc; config.System.EnableLowPowerPptc.Value = EnableLowPowerPptc;
config.System.MemoryManagerMode.Value = (MemoryManagerMode)MemoryMode; config.System.MemoryManagerMode.Value = (MemoryManagerMode)MemoryMode;
config.System.UseHypervisor.Value = UseHypervisor; config.System.UseHypervisor.Value = UseHypervisor;
config.System.TickScalar.Value = TurboMultiplier;
// Graphics // Graphics
config.Graphics.GraphicsBackend.Value = (GraphicsBackend)GraphicsBackendIndex; config.Graphics.GraphicsBackend.Value = (GraphicsBackend)GraphicsBackend;
config.Graphics.PreferredGpu.Value = _gpuIds.ElementAtOrDefault(PreferredGpuIndex); config.Graphics.PreferredGpu.Value = _gpuIds.ElementAtOrDefault(PreferredGpuIndex);
config.Graphics.EnableShaderCache.Value = EnableShaderCache; config.Graphics.EnableShaderCache.Value = EnableShaderCache;
config.Graphics.EnableTextureRecompression.Value = EnableTextureRecompression; config.Graphics.EnableTextureRecompression.Value = EnableTextureRecompression;
config.Graphics.EnableMacroHLE.Value = EnableMacroHLE; config.Graphics.EnableMacroHLE.Value = EnableMacroHLE;
config.Graphics.EnableColorSpacePassthrough.Value = EnableColorSpacePassthrough; config.Graphics.EnableColorSpacePassthrough.Value = EnableColorSpacePassthrough;
config.Graphics.ResScale.Value = ResolutionScale == 4 ? -1 : ResolutionScale + 1; config.Graphics.ResScale.Value = ComputeResScale(ResScaleIndex);
config.Graphics.ResScaleCustom.Value = CustomResolutionScale; config.Graphics.MaxAnisotropy.Value = ComputeMaxAnisotropy(MaxAnisotropyIndex);
config.Graphics.MaxAnisotropy.Value = MaxAnisotropy == 0 ? -1 : MathF.Pow(2, MaxAnisotropy);
config.Graphics.AspectRatio.Value = (AspectRatio)AspectRatio; config.Graphics.AspectRatio.Value = (AspectRatio)AspectRatio;
config.Graphics.AntiAliasing.Value = (AntiAliasing)AntiAliasingEffect; config.Graphics.AntiAliasing.Value = (AntiAliasing)AntiAliasingEffect;
config.Graphics.ScalingFilter.Value = (ScalingFilter)ScalingFilter; config.Graphics.ScalingFilter.Value = (ScalingFilter)ScalingFilter;
config.Graphics.ScalingFilterLevel.Value = ScalingFilterLevel; config.Graphics.ScalingFilterLevel.Value = ScalingFilterLevel;
if (ConfigurationState.Instance.Graphics.BackendThreading != (BackendThreading)GraphicsBackendMultithreadingIndex) if (ConfigurationState.Instance.Graphics.BackendThreading != (BackendThreading)BackendThreading)
{ {
DriverUtilities.ToggleOGLThreading(GraphicsBackendMultithreadingIndex == (int)BackendThreading.Off); DriverUtilities.ToggleOGLThreading(BackendThreading == (int)Ryujinx.Common.Configuration.BackendThreading.Off);
} }
config.Graphics.BackendThreading.Value = (BackendThreading)GraphicsBackendMultithreadingIndex; config.Graphics.BackendThreading.Value = (BackendThreading)BackendThreading;
config.Graphics.ShadersDumpPath.Value = ShaderDumpPath; config.Graphics.ShadersDumpPath.Value = ShaderDumpPath;
config.Graphics.TexturesDumpPath.Value = TextureDumpPath; config.Graphics.TexturesDumpPath.Value = TextureDumpPath;
config.Graphics.TexturesDumpFileFormat.Value = (TextureFileFormat)TextureDumpFormatIndex; config.Graphics.TexturesDumpFileFormat.Value = (TextureFileFormat)TextureDumpFormatIndex;
@@ -227,6 +227,26 @@
Click="OpenCheatManagerForCurrentApp" Click="OpenCheatManagerForCurrentApp"
Header="{locale:Locale GameListContextMenuManageCheat}" Header="{locale:Locale GameListContextMenuManageCheat}"
IsEnabled="{Binding IsGameRunning}" /> IsEnabled="{Binding IsGameRunning}" />
<Separator IsVisible="{Binding RenderDocIsAvailable}" />
<MenuItem
Click="StartRenderDocCapture_Click"
IsVisible="{Binding ShowStartCaptureButton}"
CommandParameter="{Binding}"
Header="{locale:Locale MenuBarActions_StartCapture}"
IsEnabled="{Binding IsGameRunning}" />
<MenuItem
Click="EndRenderDocCapture_Click"
IsVisible="{Binding ShowEndCaptureButton}"
CommandParameter="{Binding}"
Header="{locale:Locale MenuBarActions_EndCapture}"
IsEnabled="{Binding IsGameRunning}" />
<MenuItem
Click="DiscardRenderDocCapture_Click"
IsVisible="{Binding ShowEndCaptureButton}"
CommandParameter="{Binding}"
Header="{locale:Locale MenuBarActions_DiscardCapture}"
ToolTip.Tip="{locale:Locale MenuBarActions_DiscardCapture_ToolTip}"
IsEnabled="{Binding IsGameRunning}" />
</MenuItem> </MenuItem>
<MenuItem VerticalAlignment="Center" Header="{locale:Locale MenuBarTools}"> <MenuItem VerticalAlignment="Center" Header="{locale:Locale MenuBarTools}">
<MenuItem Header="{locale:Locale MenuBarToolsInstallKeys}" IsEnabled="{Binding EnableNonGameRunningControls}"> <MenuItem Header="{locale:Locale MenuBarToolsInstallKeys}" IsEnabled="{Binding EnableNonGameRunningControls}">
@@ -9,7 +9,9 @@ using Ryujinx.Ava.UI.Helpers;
using Ryujinx.Ava.UI.ViewModels; using Ryujinx.Ava.UI.ViewModels;
using Ryujinx.Ava.UI.Windows; using Ryujinx.Ava.UI.Windows;
using Ryujinx.Common; using Ryujinx.Common;
using Ryujinx.Common.Logging;
using Ryujinx.Common.Utilities; using Ryujinx.Common.Utilities;
using Ryujinx.Graphics.RenderDocApi;
using Ryujinx.HLE.HOS.Services.Nfc.AmiiboDecryption; using Ryujinx.HLE.HOS.Services.Nfc.AmiiboDecryption;
using Ryujinx.Modules; using Ryujinx.Modules;
using Ryujinx.UI.App.Common; using Ryujinx.UI.App.Common;
@@ -266,6 +268,52 @@ namespace Ryujinx.Ava.UI.Views.Main
} }
} }
public void StartRenderDocCapture_Click(object sender, RoutedEventArgs args)
{
MainWindowViewModel viewModel = (sender as MenuItem)?.DataContext as MainWindowViewModel;
if (!RenderDoc.IsFrameCapturing && RenderDoc.IsAvailable && viewModel is not { ShowLoadProgress: true })
{
if (viewModel != null && viewModel.AppHost.RendererHost
.EmbeddedWindow.StartRenderDocCapture(viewModel.AppHost.Device))
{
Logger.Info?.Print(LogClass.Application, "Starting RenderDoc capture.");
}
}
viewModel?.RenderDocIsCapturing = RenderDoc.IsFrameCapturing;
}
public void EndRenderDocCapture_Click(object sender, RoutedEventArgs args)
{
MainWindowViewModel viewModel = (sender as MenuItem)?.DataContext as MainWindowViewModel;
if (RenderDoc.IsFrameCapturing && RenderDoc.IsAvailable && viewModel is not { ShowLoadProgress: true })
{
if (viewModel != null && viewModel.AppHost.RendererHost.EmbeddedWindow.EndRenderDocCapture())
{
Logger.Info?.Print(LogClass.Application, "Ended RenderDoc capture.");
}
}
viewModel?.RenderDocIsCapturing = RenderDoc.IsFrameCapturing;
}
public void DiscardRenderDocCapture_Click(object sender, RoutedEventArgs args)
{
MainWindowViewModel viewModel = (sender as MenuItem)?.DataContext as MainWindowViewModel;
if (RenderDoc.IsFrameCapturing && RenderDoc.IsAvailable && viewModel is not { ShowLoadProgress: true })
{
if (viewModel != null && viewModel.AppHost.RendererHost.EmbeddedWindow.DiscardRenderDocCapture())
{
Logger.Info?.Print(LogClass.Application, "Discarded RenderDoc capture.");
}
}
viewModel?.RenderDocIsCapturing = RenderDoc.IsFrameCapturing;
}
public async void CheckForUpdates(object sender, RoutedEventArgs e) public async void CheckForUpdates(object sender, RoutedEventArgs e)
{ {
if (Updater.CanUpdate(true)) if (Updater.CanUpdate(true))
@@ -0,0 +1,80 @@
<UserControl
x:Class="Ryujinx.Ava.UI.Views.Settings.CustomSettingsAudioView"
xmlns="https://github.com/avaloniaui"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:controls="clr-namespace:Ryujinx.Ava.UI.Controls"
xmlns:ui="clr-namespace:FluentAvalonia.UI.Controls;assembly=FluentAvalonia"
xmlns:locale="clr-namespace:Ryujinx.Ava.Common.Locale"
xmlns:viewModels="clr-namespace:Ryujinx.Ava.UI.ViewModels"
mc:Ignorable="d"
x:DataType="viewModels:CustomSettingsViewModel">
<Design.DataContext>
<viewModels:SettingsViewModel />
</Design.DataContext>
<ScrollViewer
Name="AudioPage"
HorizontalAlignment="Stretch"
VerticalAlignment="Stretch"
HorizontalScrollBarVisibility="Disabled"
VerticalScrollBarVisibility="Auto">
<Border Classes="settings">
<StackPanel
Margin="10"
HorizontalAlignment="Stretch"
Orientation="Vertical"
Spacing="10">
<TextBlock Classes="h1" Text="{locale:Locale SettingsTabAudio}" />
<StackPanel Margin="10,0,0,0" Orientation="Horizontal">
<TextBlock VerticalAlignment="Center"
Text="{locale:Locale SettingsTabSystemAudioBackend}"
ToolTip.Tip="{locale:Locale AudioBackendTooltip}"
Width="250" />
<ComboBox SelectedIndex="{Binding AudioBackend}"
Width="350"
HorizontalContentAlignment="Left">
<ComboBoxItem
Content="{locale:Locale SettingsTabSystemAudioBackendDummy}" />
<ComboBoxItem
IsEnabled="{Binding IsOpenAlEnabled}"
Content="{locale:Locale SettingsTabSystemAudioBackendOpenAL}" />
<ComboBoxItem
IsEnabled="{Binding IsSoundIoEnabled}"
Content="{locale:Locale SettingsTabSystemAudioBackendSoundIO}" />
<ComboBoxItem
IsEnabled="{Binding IsSDL3Enabled}"
Content="{locale:Locale SettingsTabSystemAudioBackendSDL3}" />
</ComboBox>
</StackPanel>
<StackPanel Margin="10,0,0,0" Orientation="Horizontal">
<TextBlock VerticalAlignment="Center"
Text="{locale:Locale SettingsTabSystemAudioVolume}"
ToolTip.Tip="{locale:Locale AudioVolumeTooltip}"
Width="250" />
<ui:FANumberBox Value="{Binding Volume}"
ToolTip.Tip="{locale:Locale AudioVolumeTooltip}"
Width="350"
SmallChange="1"
LargeChange="10"
SimpleNumberFormat="F0"
SpinButtonPlacementMode="Inline"
Minimum="0"
Maximum="100" />
</StackPanel>
<StackPanel Margin="10,0,0,0" Orientation="Horizontal">
<controls:SliderScroll Value="{Binding Volume}"
Margin="250,0,0,0"
ToolTip.Tip="{locale:Locale AudioVolumeTooltip}"
Minimum="0"
Maximum="100"
SmallChange="1"
TickFrequency="1"
IsSnapToTickEnabled="True"
LargeChange="10"
Width="350" />
</StackPanel>
</StackPanel>
</Border>
</ScrollViewer>
</UserControl>
@@ -0,0 +1,12 @@
using Avalonia.Controls;
namespace Ryujinx.Ava.UI.Views.Settings
{
public partial class CustomSettingsAudioView : UserControl
{
public CustomSettingsAudioView()
{
InitializeComponent();
}
}
}
@@ -0,0 +1,128 @@
<UserControl
x:Class="Ryujinx.Ava.UI.Views.Settings.CustomSettingsCPUView"
xmlns="https://github.com/avaloniaui"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:locale="clr-namespace:Ryujinx.Ava.Common.Locale"
xmlns:viewModels="clr-namespace:Ryujinx.Ava.UI.ViewModels"
xmlns:ui="clr-namespace:FluentAvalonia.UI.Controls;assembly=FluentAvalonia"
mc:Ignorable="d"
x:DataType="viewModels:CustomSettingsViewModel">
<Design.DataContext>
<viewModels:SettingsViewModel />
</Design.DataContext>
<ScrollViewer
Name="CpuPage"
HorizontalAlignment="Stretch"
VerticalAlignment="Stretch"
HorizontalScrollBarVisibility="Disabled"
VerticalScrollBarVisibility="Auto">
<Border Classes="settings">
<StackPanel
Margin="10"
HorizontalAlignment="Stretch"
Orientation="Vertical"
Spacing="10">
<TextBlock Classes="h1" Text="{locale:Locale SettingsTabCpuCache}" />
<StackPanel
Margin="10,0,0,0"
HorizontalAlignment="Stretch"
Orientation="Vertical">
<CheckBox IsChecked="{Binding EnablePptc}">
<TextBlock Text="{locale:Locale SettingsTabSystemEnablePptc}"
ToolTip.Tip="{locale:Locale PptcToggleTooltip}" />
</CheckBox>
<CheckBox IsChecked="{Binding EnableLowPowerPptc}">
<TextBlock Text="{locale:Locale SettingsTabSystemEnableLowPowerPptc}"
ToolTip.Tip="{locale:Locale LowPowerPptcToggleTooltip}" />
</CheckBox>
</StackPanel>
<Separator Height="1" />
<TextBlock Classes="h1" Text="{locale:Locale SettingsTabCpuMemory}" />
<StackPanel
Margin="10,0,0,0"
HorizontalAlignment="Stretch"
Orientation="Vertical">
<StackPanel Orientation="Horizontal">
<TextBlock VerticalAlignment="Center"
Text="{locale:Locale SettingsTabSystemMemoryManagerMode}"
ToolTip.Tip="{locale:Locale MemoryManagerTooltip}"
Width="250" />
<ComboBox SelectedIndex="{Binding MemoryManagerMode}"
ToolTip.Tip="{locale:Locale MemoryManagerTooltip}"
HorizontalContentAlignment="Left"
Width="350">
<ComboBoxItem
ToolTip.Tip="{locale:Locale MemoryManagerSoftwareTooltip}"
Content="{locale:Locale SettingsTabSystemMemoryManagerModeSoftware}" />
<ComboBoxItem
ToolTip.Tip="{locale:Locale MemoryManagerHostTooltip}"
Content="{locale:Locale SettingsTabSystemMemoryManagerModeHost}" />
<ComboBoxItem
ToolTip.Tip="{locale:Locale MemoryManagerUnsafeTooltip}"
Content="{locale:Locale SettingsTabSystemMemoryManagerModeHostUnchecked}" />
</ComboBox>
</StackPanel>
<CheckBox IsChecked="{Binding UseHypervisor}"
IsVisible="{Binding IsHypervisorAvailable}"
ToolTip.Tip="{locale:Locale UseHypervisorTooltip}">
<TextBlock Text="{locale:Locale SettingsTabSystemUseHypervisor}"
ToolTip.Tip="{locale:Locale UseHypervisorTooltip}" />
</CheckBox>
</StackPanel>
<Separator Height="1" />
<StackPanel
Orientation="Vertical"
Spacing="5">
<TextBlock
Classes="h1"
Text="{locale:Locale SettingsTabSystemHacks}" />
<TextBlock
Foreground="{DynamicResource SecondaryTextColor}"
TextDecorations="Underline"
Text="{locale:Locale SettingsTabSystemHacksNote}" />
</StackPanel>
<StackPanel
Margin="10,0,0,0"
HorizontalAlignment="Stretch"
Orientation="Vertical">
<StackPanel Margin="0,0,0,10"
Orientation="Horizontal">
<TextBlock
VerticalAlignment="Center"
Background="Transparent"
Text="{locale:Locale SettingsTabSystemTurboMultiplier}"
ToolTip.Tip="{locale:Locale SettingsTabSystemTurboMultiplierToolTip}"
Width="250" />
<ui:FANumberBox ToolTip.Tip="{locale:Locale SettingsTabSystemTurboMultiplierValueToolTip}"
Value="{Binding TurboMultiplier}"
Width="165"
SmallChange="1.0"
LargeChange="10"
SimpleNumberFormat="F0"
SpinButtonPlacementMode="Hidden"
Minimum="50"
Maximum="1000" />
<Slider Value="{Binding TurboMultiplier}"
ToolTip.Tip="{locale:Locale SettingsTabSystemTurboMultiplierValueToolTip}"
MinWidth="175"
Margin="10,-3,0,0"
Height="32"
Padding="0,-5"
TickFrequency="1"
IsSnapToTickEnabled="True"
LargeChange="10"
SmallChange="1"
VerticalAlignment="Center"
Minimum="50"
Maximum="1000" />
<TextBlock Margin="5,0"
Width="40"
Text="{Binding TurboMultiplierPercentageText}"/>
</StackPanel>
</StackPanel>
</StackPanel>
</Border>
</ScrollViewer>
</UserControl>
@@ -0,0 +1,12 @@
using Avalonia.Controls;
namespace Ryujinx.Ava.UI.Views.Settings
{
public partial class CustomSettingsCPUView : UserControl
{
public CustomSettingsCPUView()
{
InitializeComponent();
}
}
}
@@ -0,0 +1,153 @@
<UserControl
x:Class="Ryujinx.Ava.UI.Views.Settings.CustomSettingsGraphicsView"
xmlns="https://github.com/avaloniaui"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:controls="clr-namespace:Ryujinx.Ava.UI.Controls"
xmlns:ui="clr-namespace:FluentAvalonia.UI.Controls;assembly=FluentAvalonia"
xmlns:locale="clr-namespace:Ryujinx.Ava.Common.Locale"
xmlns:viewModels="clr-namespace:Ryujinx.Ava.UI.ViewModels"
Design.Width="1000"
mc:Ignorable="d"
x:DataType="viewModels:CustomSettingsViewModel">
<Design.DataContext>
<viewModels:SettingsViewModel />
</Design.DataContext>
<ScrollViewer
Name="GraphicsPage"
HorizontalAlignment="Stretch"
VerticalAlignment="Stretch"
HorizontalScrollBarVisibility="Disabled"
VerticalScrollBarVisibility="Auto">
<Border Classes="settings">
<StackPanel
Margin="10"
HorizontalAlignment="Stretch"
Orientation="Vertical"
Spacing="10">
<TextBlock Classes="h1" Text="{locale:Locale SettingsTabGraphicsAPI}" />
<StackPanel Margin="10,0,0,0" Orientation="Vertical" Spacing="10">
<StackPanel Orientation="Horizontal">
<TextBlock VerticalAlignment="Center"
ToolTip.Tip="{locale:Locale SettingsTabGraphicsBackendTooltip}"
Text="{locale:Locale SettingsTabGraphicsBackend}"
Width="250" />
<ComboBox Width="350"
HorizontalContentAlignment="Left"
ToolTip.Tip="{locale:Locale SettingsTabGraphicsBackendTooltip}"
SelectedIndex="{Binding GraphicsBackend}">
<ComboBoxItem
IsVisible="{Binding IsVulkanAvailable}"
Content="Vulkan" />
<ComboBoxItem
IsEnabled="{Binding IsOpenGLAvailable}"
Content="OpenGL" />
</ComboBox>
</StackPanel>
<StackPanel Orientation="Horizontal">
<TextBlock VerticalAlignment="Center"
ToolTip.Tip="{locale:Locale SettingsTabGraphicsPreferredGpuTooltip}"
Text="{locale:Locale SettingsTabGraphicsPreferredGpu}"
Width="250" />
<ComboBox Width="350"
HorizontalContentAlignment="Left"
ToolTip.Tip="{locale:Locale SettingsTabGraphicsPreferredGpuTooltip}"
SelectedIndex="{Binding PreferredGpuIndex}"
ItemsSource="{Binding AvailableGpus}"/>
</StackPanel>
</StackPanel>
<Separator Height="1" />
<TextBlock Classes="h1" Text="{locale:Locale SettingsTabGraphicsFeatures}" />
<StackPanel Margin="10,0,0,0" Orientation="Vertical" Spacing="10">
<StackPanel Orientation="Vertical">
<CheckBox IsChecked="{Binding EnableShaderCache}"
ToolTip.Tip="{locale:Locale ShaderCacheToggleTooltip}">
<TextBlock Text="{locale:Locale SettingsTabGraphicsEnableShaderCache}" />
</CheckBox>
<CheckBox IsChecked="{Binding EnableTextureRecompression}"
ToolTip.Tip="{locale:Locale SettingsEnableTextureRecompressionTooltip}">
<TextBlock Text="{locale:Locale SettingsEnableTextureRecompression}" />
</CheckBox>
<CheckBox IsChecked="{Binding EnableMacroHLE}"
ToolTip.Tip="{locale:Locale SettingsEnableMacroHLETooltip}">
<TextBlock Text="{locale:Locale SettingsEnableMacroHLE}" />
</CheckBox>
<CheckBox IsChecked="{Binding EnableColorSpacePassthrough}"
IsVisible="{Binding ColorSpacePassthroughAvailable}"
ToolTip.Tip="{locale:Locale SettingsEnableColorSpacePassthroughTooltip}">
<TextBlock Text="{locale:Locale SettingsEnableColorSpacePassthrough}" />
</CheckBox>
</StackPanel>
<StackPanel Orientation="Horizontal">
<TextBlock VerticalAlignment="Center"
ToolTip.Tip="{locale:Locale ResolutionScaleTooltip}"
Text="{locale:Locale SettingsTabGraphicsResolutionScale}"
Width="250" />
<ComboBox SelectedIndex="{Binding ResScaleIndex}"
Width="350"
HorizontalContentAlignment="Left"
ToolTip.Tip="{locale:Locale ResolutionScaleTooltip}">
<ComboBoxItem
Content="{locale:Locale SettingsTabGraphicsResolutionScale05x}" />
<ComboBoxItem
Content="{locale:Locale SettingsTabGraphicsResolutionScale075x}" />
<ComboBoxItem
Content="{locale:Locale SettingsTabGraphicsResolutionScale10x}" />
<ComboBoxItem
Content="{locale:Locale SettingsTabGraphicsResolutionScale20x}" />
<ComboBoxItem
Content="{locale:Locale SettingsTabGraphicsResolutionScale30x}" />
<ComboBoxItem
Content="{locale:Locale SettingsTabGraphicsResolutionScale40x}" />
</ComboBox>
</StackPanel>
<StackPanel Orientation="Horizontal">
<TextBlock VerticalAlignment="Center"
ToolTip.Tip="{locale:Locale AnisotropyTooltip}"
Text="{locale:Locale SettingsTabGraphicsAnisotropicFiltering}"
Width="250" />
<ComboBox SelectedIndex="{Binding MaxAnisotropyIndex}"
Width="350"
HorizontalContentAlignment="Left"
ToolTip.Tip="{locale:Locale AnisotropyTooltip}">
<ComboBoxItem
Content="{locale:Locale SettingsTabGraphicsAnisotropicFilteringAuto}" />
<ComboBoxItem
Content="{locale:Locale SettingsTabGraphicsAnisotropicFiltering2x}" />
<ComboBoxItem
Content="{locale:Locale SettingsTabGraphicsAnisotropicFiltering4x}" />
<ComboBoxItem
Content="{locale:Locale SettingsTabGraphicsAnisotropicFiltering8x}" />
<ComboBoxItem
Content="{locale:Locale SettingsTabGraphicsAnisotropicFiltering16x}" />
</ComboBox>
</StackPanel>
</StackPanel>
<StackPanel
Margin="10,0,0,0"
HorizontalAlignment="Stretch"
Orientation="Vertical"
Spacing="10">
<StackPanel Orientation="Horizontal">
<TextBlock VerticalAlignment="Center"
ToolTip.Tip="{locale:Locale GraphicsBackendThreadingTooltip}"
Text="{locale:Locale SettingsTabGraphicsBackendMultithreading}"
Width="250" />
<ComboBox Width="350"
HorizontalContentAlignment="Left"
ToolTip.Tip="{locale:Locale GalThreadingTooltip}"
SelectedIndex="{Binding BackendThreading}">
<ComboBoxItem
Content="{locale:Locale CommonAuto}" />
<ComboBoxItem
Content="{locale:Locale CommonOff}" />
<ComboBoxItem
Content="{locale:Locale CommonOn}" />
</ComboBox>
</StackPanel>
</StackPanel>
</StackPanel>
</Border>
</ScrollViewer>
</UserControl>
@@ -0,0 +1,12 @@
using Avalonia.Controls;
namespace Ryujinx.Ava.UI.Views.Settings
{
public partial class CustomSettingsGraphicsView : UserControl
{
public CustomSettingsGraphicsView()
{
InitializeComponent();
}
}
}
@@ -0,0 +1,192 @@
<UserControl
x:Class="Ryujinx.Ava.UI.Views.Settings.CustomSettingsSystemView"
xmlns="https://github.com/avaloniaui"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:locale="clr-namespace:Ryujinx.Ava.Common.Locale"
xmlns:viewModels="clr-namespace:Ryujinx.Ava.UI.ViewModels"
xmlns:helpers="clr-namespace:Ryujinx.Ava.UI.Helpers"
mc:Ignorable="d"
x:DataType="viewModels:CustomSettingsViewModel">
<UserControl.Resources>
<helpers:TimeZoneConverter x:Key="TimeZone" />
</UserControl.Resources>
<Design.DataContext>
<viewModels:SettingsViewModel />
</Design.DataContext>
<ScrollViewer
Name="SystemPage"
HorizontalAlignment="Stretch"
VerticalAlignment="Stretch"
HorizontalScrollBarVisibility="Disabled"
VerticalScrollBarVisibility="Auto">
<Border Classes="settings">
<StackPanel
Margin="10"
HorizontalAlignment="Stretch"
Orientation="Vertical"
Spacing="10">
<TextBlock
Classes="h1"
Text="{locale:Locale SettingsTabSystemCore}" />
<StackPanel
Margin="10,0,0,0"
Orientation="Vertical">
<StackPanel
Margin="0,0,0,10"
Orientation="Horizontal">
<TextBlock
VerticalAlignment="Center"
Text="{locale:Locale SettingsTabSystemSystemRegion}"
Width="250" />
<ComboBox
SelectedIndex="{Binding SystemRegion}"
ToolTip.Tip="{locale:Locale RegionTooltip}"
HorizontalContentAlignment="Left"
Width="350">
<ComboBoxItem
Content="{locale:Locale SettingsTabSystemSystemRegionJapan}" />
<ComboBoxItem
Content="{locale:Locale SettingsTabSystemSystemRegionUSA}" />
<ComboBoxItem
Content="{locale:Locale SettingsTabSystemSystemRegionEurope}" />
<ComboBoxItem
Content="{locale:Locale SettingsTabSystemSystemRegionAustralia}" />
<ComboBoxItem
Content="{locale:Locale SettingsTabSystemSystemRegionChina}" />
<ComboBoxItem
Content="{locale:Locale SettingsTabSystemSystemRegionKorea}" />
<ComboBoxItem
Content="{locale:Locale SettingsTabSystemSystemRegionTaiwan}" />
</ComboBox>
</StackPanel>
<StackPanel
Margin="0,0,0,10"
Orientation="Horizontal">
<TextBlock
VerticalAlignment="Center"
Text="{locale:Locale SettingsTabSystemSystemLanguage}"
ToolTip.Tip="{locale:Locale LanguageTooltip}"
Width="250" />
<ComboBox
SelectedIndex="{Binding SystemLanguage}"
ToolTip.Tip="{locale:Locale LanguageTooltip}"
HorizontalContentAlignment="Left"
Width="350">
<ComboBoxItem
Content="{locale:Locale SettingsTabSystemSystemLanguageJapanese}" />
<ComboBoxItem
Content="{locale:Locale SettingsTabSystemSystemLanguageAmericanEnglish}" />
<ComboBoxItem
Content="{locale:Locale SettingsTabSystemSystemLanguageFrench}" />
<ComboBoxItem
Content="{locale:Locale SettingsTabSystemSystemLanguageGerman}" />
<ComboBoxItem
Content="{locale:Locale SettingsTabSystemSystemLanguageItalian}" />
<ComboBoxItem
Content="{locale:Locale SettingsTabSystemSystemLanguageSpanish}" />
<ComboBoxItem
Content="{locale:Locale SettingsTabSystemSystemLanguageChinese}" />
<ComboBoxItem
Content="{locale:Locale SettingsTabSystemSystemLanguageKorean}" />
<ComboBoxItem
Content="{locale:Locale SettingsTabSystemSystemLanguageDutch}" />
<ComboBoxItem
Content="{locale:Locale SettingsTabSystemSystemLanguagePortuguese}" />
<ComboBoxItem
Content="{locale:Locale SettingsTabSystemSystemLanguageRussian}" />
<ComboBoxItem
Content="{locale:Locale SettingsTabSystemSystemLanguageTaiwanese}" />
<ComboBoxItem
Content="{locale:Locale SettingsTabSystemSystemLanguageBritishEnglish}" />
<ComboBoxItem
Content="{locale:Locale SettingsTabSystemSystemLanguageCanadianFrench}" />
<ComboBoxItem
Content="{locale:Locale SettingsTabSystemSystemLanguageLatinAmericanSpanish}" />
<ComboBoxItem
Content="{locale:Locale SettingsTabSystemSystemLanguageSimplifiedChinese}" />
<ComboBoxItem
Content="{locale:Locale SettingsTabSystemSystemLanguageTraditionalChinese}" />
<ComboBoxItem
Content="{locale:Locale SettingsTabSystemSystemLanguageBrazilianPortuguese}" />
</ComboBox>
</StackPanel>
<CheckBox IsChecked="{Binding EnableFsIntegrityChecks}">
<TextBlock
Text="{locale:Locale SettingsTabSystemEnableFsIntegrityChecks}"
ToolTip.Tip="{locale:Locale FsIntegrityToggleTooltip}" />
</CheckBox>
<CheckBox IsChecked="{Binding EnableDockedMode}">
<TextBlock
Text="{locale:Locale SettingsTabSystemEnableDockedMode}"
ToolTip.Tip="{locale:Locale DockModeToggleTooltip}" />
</CheckBox>
<StackPanel Margin="0,10,0,10"
Orientation="Horizontal">
<TextBlock
VerticalAlignment="Center"
Text="{locale:Locale SettingsTabSystemVSyncMode}"
ToolTip.Tip="{locale:Locale SettingsTabSystemVSyncModeTooltip}"
Width="250" />
<ComboBox
SelectedIndex="{Binding VSyncMode}"
ToolTip.Tip="{locale:Locale SettingsTabSystemVSyncModeTooltip}"
HorizontalContentAlignment="Left"
Width="350">
<ComboBoxItem
Content="{locale:Locale SettingsTabSystemVSyncModeSwitch}" />
<ComboBoxItem
Content="{locale:Locale SettingsTabSystemVSyncModeUnbounded}" />
</ComboBox>
</StackPanel>
</StackPanel>
<Separator Height="1" />
<StackPanel
Orientation="Vertical"
Spacing="5">
<TextBlock
Classes="h1"
Text="{locale:Locale SettingsTabSystemHacks}" />
<TextBlock
Foreground="{DynamicResource SecondaryTextColor}"
Text="{locale:Locale SettingsTabSystemHacksNote}" />
</StackPanel>
<StackPanel
Margin="10,0,0,0"
Orientation="Horizontal">
<TextBlock
VerticalAlignment="Center"
Text="{locale:Locale SettingsTabSystemDramSize}"
Width="250" />
<ComboBox
SelectedIndex="{Binding DramSize}"
ToolTip.Tip="{locale:Locale DRamTooltip}"
HorizontalContentAlignment="Left"
Width="350">
<ComboBoxItem
Content="{locale:Locale SettingsTabSystemDramSize4GiB}" />
<ComboBoxItem
Content="{locale:Locale SettingsTabSystemDramSize6GiB}" />
<ComboBoxItem
Content="{locale:Locale SettingsTabSystemDramSize8GiB}" />
<ComboBoxItem
Content="{locale:Locale SettingsTabSystemDramSize10GiB}" />
<ComboBoxItem
Content="{locale:Locale SettingsTabSystemDramSize12GiB}" />
</ComboBox>
</StackPanel>
<StackPanel
Margin="10,0,0,0"
HorizontalAlignment="Stretch"
Orientation="Vertical">
<CheckBox
IsChecked="{Binding IgnoreMissingServices}"
ToolTip.Tip="{locale:Locale IgnoreMissingServicesTooltip}">
<TextBlock Text="{locale:Locale SettingsTabSystemIgnoreMissingServices}" />
</CheckBox>
</StackPanel>
</StackPanel>
</Border>
</ScrollViewer>
</UserControl>
@@ -0,0 +1,12 @@
using Avalonia.Controls;
namespace Ryujinx.Ava.UI.Views.Settings
{
public partial class CustomSettingsSystemView : UserControl
{
public CustomSettingsSystemView()
{
InitializeComponent();
}
}
}
@@ -36,7 +36,7 @@
<ComboBox Width="350" <ComboBox Width="350"
HorizontalContentAlignment="Left" HorizontalContentAlignment="Left"
ToolTip.Tip="{locale:Locale SettingsTabGraphicsBackendTooltip}" ToolTip.Tip="{locale:Locale SettingsTabGraphicsBackendTooltip}"
SelectedIndex="{Binding GraphicsBackendIndex}"> SelectedIndex="{Binding GraphicsBackend}">
<ComboBoxItem <ComboBoxItem
IsVisible="{Binding IsVulkanAvailable}" IsVisible="{Binding IsVulkanAvailable}"
Content="Vulkan" /> Content="Vulkan" />
@@ -45,7 +45,7 @@
Content="OpenGL" /> Content="OpenGL" />
</ComboBox> </ComboBox>
</StackPanel> </StackPanel>
<StackPanel Orientation="Horizontal" IsVisible="{Binding IsVulkanSelected}"> <StackPanel Orientation="Horizontal">
<TextBlock VerticalAlignment="Center" <TextBlock VerticalAlignment="Center"
ToolTip.Tip="{locale:Locale SettingsTabGraphicsPreferredGpuTooltip}" ToolTip.Tip="{locale:Locale SettingsTabGraphicsPreferredGpuTooltip}"
Text="{locale:Locale SettingsTabGraphicsPreferredGpu}" Text="{locale:Locale SettingsTabGraphicsPreferredGpu}"
@@ -83,33 +83,23 @@
ToolTip.Tip="{locale:Locale ResolutionScaleTooltip}" ToolTip.Tip="{locale:Locale ResolutionScaleTooltip}"
Text="{locale:Locale SettingsTabGraphicsResolutionScale}" Text="{locale:Locale SettingsTabGraphicsResolutionScale}"
Width="250" /> Width="250" />
<ComboBox SelectedIndex="{Binding ResolutionScale}" <ComboBox SelectedIndex="{Binding ResScaleIndex}"
Width="350" Width="350"
HorizontalContentAlignment="Left" HorizontalContentAlignment="Left"
ToolTip.Tip="{locale:Locale ResolutionScaleTooltip}"> ToolTip.Tip="{locale:Locale ResolutionScaleTooltip}">
<ComboBoxItem <ComboBoxItem
Content="{locale:Locale SettingsTabGraphicsResolutionScaleNative}" /> Content="{locale:Locale SettingsTabGraphicsResolutionScale05x}" />
<ComboBoxItem <ComboBoxItem
Content="{locale:Locale SettingsTabGraphicsResolutionScale2x}" /> Content="{locale:Locale SettingsTabGraphicsResolutionScale075x}" />
<ComboBoxItem <ComboBoxItem
Content="{locale:Locale SettingsTabGraphicsResolutionScale3x}" /> Content="{locale:Locale SettingsTabGraphicsResolutionScale10x}" />
<ComboBoxItem <ComboBoxItem
Content="{locale:Locale SettingsTabGraphicsResolutionScale4x}" /> Content="{locale:Locale SettingsTabGraphicsResolutionScale20x}" />
<ComboBoxItem <ComboBoxItem
Content="{locale:Locale SettingsTabGraphicsResolutionScaleCustom}" /> Content="{locale:Locale SettingsTabGraphicsResolutionScale30x}" />
<ComboBoxItem
Content="{locale:Locale SettingsTabGraphicsResolutionScale40x}" />
</ComboBox> </ComboBox>
<ui:FANumberBox
Margin="10,0,0,0"
ToolTip.Tip="{locale:Locale ResolutionScaleEntryTooltip}"
MinWidth="150"
SmallChange="0.1"
LargeChange="1"
SimpleNumberFormat="F2"
SpinButtonPlacementMode="Inline"
IsVisible="{Binding IsCustomResolutionScaleActive}"
Maximum="10"
Minimum="0.1"
Value="{Binding CustomResolutionScale}" />
</StackPanel> </StackPanel>
<StackPanel <StackPanel
HorizontalAlignment="Stretch" HorizontalAlignment="Stretch"
@@ -186,7 +176,7 @@
ToolTip.Tip="{locale:Locale AnisotropyTooltip}" ToolTip.Tip="{locale:Locale AnisotropyTooltip}"
Text="{locale:Locale SettingsTabGraphicsAnisotropicFiltering}" Text="{locale:Locale SettingsTabGraphicsAnisotropicFiltering}"
Width="250" /> Width="250" />
<ComboBox SelectedIndex="{Binding MaxAnisotropy}" <ComboBox SelectedIndex="{Binding MaxAnisotropyIndex}"
Width="350" Width="350"
HorizontalContentAlignment="Left" HorizontalContentAlignment="Left"
ToolTip.Tip="{locale:Locale AnisotropyTooltip}"> ToolTip.Tip="{locale:Locale AnisotropyTooltip}">
@@ -241,7 +231,7 @@
<ComboBox Width="350" <ComboBox Width="350"
HorizontalContentAlignment="Left" HorizontalContentAlignment="Left"
ToolTip.Tip="{locale:Locale GalThreadingTooltip}" ToolTip.Tip="{locale:Locale GalThreadingTooltip}"
SelectedIndex="{Binding GraphicsBackendMultithreadingIndex}"> SelectedIndex="{Binding BackendThreading}">
<ComboBoxItem <ComboBoxItem
Content="{locale:Locale CommonAuto}" /> Content="{locale:Locale CommonAuto}" />
<ComboBoxItem <ComboBoxItem
@@ -34,13 +34,6 @@
<StackPanel <StackPanel
Orientation="Horizontal" Orientation="Horizontal"
Spacing="10"> Spacing="10">
<CheckBox
ToolTip.Tip="{locale:Locale DockModeToggleTooltip}"
MinWidth="0"
IsChecked="{Binding EnableDockedMode}">
<TextBlock
Text="{locale:Locale SettingsTabInputEnableDockedMode}" />
</CheckBox>
<CheckBox <CheckBox
ToolTip.Tip="{locale:Locale DirectKeyboardTooltip}" ToolTip.Tip="{locale:Locale DirectKeyboardTooltip}"
IsChecked="{Binding EnableKeyboard}"> IsChecked="{Binding EnableKeyboard}">
@@ -158,18 +158,21 @@
Width="350" Width="350"
ToolTip.Tip="{locale:Locale TimeTooltip}" /> ToolTip.Tip="{locale:Locale TimeTooltip}" />
</StackPanel> </StackPanel>
<StackPanel Orientation="Horizontal"> <CheckBox IsChecked="{Binding MatchSystemTime}">
<TextBlock <TextBlock
VerticalAlignment="Center"
Text="{locale:Locale SettingsTabSystemSystemTimeMatch}" Text="{locale:Locale SettingsTabSystemSystemTimeMatch}"
ToolTip.Tip="{locale:Locale MatchTimeTooltip}" ToolTip.Tip="{locale:Locale MatchTimeTooltip}" />
Width="250"/> </CheckBox>
<CheckBox <CheckBox IsChecked="{Binding EnableFsIntegrityChecks}">
VerticalAlignment="Center" <TextBlock
IsChecked="{Binding MatchSystemTime}" Text="{locale:Locale SettingsTabSystemEnableFsIntegrityChecks}"
ToolTip.Tip="{locale:Locale MatchTimeTooltip}"/> ToolTip.Tip="{locale:Locale FsIntegrityToggleTooltip}" />
</StackPanel> </CheckBox>
<Separator /> <CheckBox IsChecked="{Binding EnableDockedMode}">
<TextBlock
Text="{locale:Locale SettingsTabSystemEnableDockedMode}"
ToolTip.Tip="{locale:Locale DockModeToggleTooltip}" />
</CheckBox>
<StackPanel Margin="0,10,0,10" <StackPanel Margin="0,10,0,10"
Orientation="Horizontal"> Orientation="Horizontal">
<TextBlock <TextBlock
@@ -227,11 +230,6 @@
Width="40" Width="40"
Text="{Binding CustomVSyncIntervalPercentageText}"/> Text="{Binding CustomVSyncIntervalPercentageText}"/>
</StackPanel> </StackPanel>
<CheckBox IsChecked="{Binding EnableFsIntegrityChecks}">
<TextBlock
Text="{locale:Locale SettingsTabSystemEnableFsIntegrityChecks}"
ToolTip.Tip="{locale:Locale FsIntegrityToggleTooltip}" />
</CheckBox>
</StackPanel> </StackPanel>
<Separator Height="1" /> <Separator Height="1" />
<StackPanel <StackPanel
+51 -1
View File
@@ -6,15 +6,19 @@ using Ryujinx.HLE.FileSystem;
using Ryujinx.HLE.HOS; using Ryujinx.HLE.HOS;
using Ryujinx.UI.App.Common; using Ryujinx.UI.App.Common;
using Ryujinx.UI.Common.Configuration; using Ryujinx.UI.Common.Configuration;
using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Globalization; using System.Globalization;
using System.IO; using System.IO;
using System.Linq; using System.Runtime.InteropServices;
namespace Ryujinx.Ava.UI.Windows namespace Ryujinx.Ava.UI.Windows
{ {
public partial class CheatWindow : StyleableWindow public partial class CheatWindow : StyleableWindow
{ {
[DllImport("dwmapi.dll")]
private static extern int DwmSetWindowAttribute(IntPtr hwnd, int attr, ref int value, int size);
private readonly string _enabledCheatsPath; private readonly string _enabledCheatsPath;
public bool NoCheatsFound { get; } public bool NoCheatsFound { get; }
@@ -28,6 +32,7 @@ namespace Ryujinx.Ava.UI.Windows
DataContext = this; DataContext = this;
InitializeComponent(); InitializeComponent();
ApplyDarkTitleBar();
Title = $"Ryujinx {Program.Version} - " + LocaleManager.Instance[LocaleKeys.CheatWindowTitle]; Title = $"Ryujinx {Program.Version} - " + LocaleManager.Instance[LocaleKeys.CheatWindowTitle];
} }
@@ -46,6 +51,7 @@ namespace Ryujinx.Ava.UI.Windows
BuildId = ApplicationData.GetBuildId(virtualFileSystem, checkLevel, titlePath); BuildId = ApplicationData.GetBuildId(virtualFileSystem, checkLevel, titlePath);
InitializeComponent(); InitializeComponent();
ApplyDarkTitleBar();
string modsBasePath = ModLoader.GetModsBasePath(); string modsBasePath = ModLoader.GetModsBasePath();
string titleModsPath = ModLoader.GetApplicationDir(modsBasePath, titleId); string titleModsPath = ModLoader.GetApplicationDir(modsBasePath, titleId);
@@ -100,6 +106,50 @@ namespace Ryujinx.Ava.UI.Windows
Title = $"Ryujinx {Program.Version} - " + LocaleManager.Instance[LocaleKeys.CheatWindowTitle]; Title = $"Ryujinx {Program.Version} - " + LocaleManager.Instance[LocaleKeys.CheatWindowTitle];
} }
private void ApplyDarkTitleBar()
{
if (!OperatingSystem.IsWindows())
return;
// Apply immediately if possible
if (PlatformImpl != null)
{
ForceDarkTitleBar();
}
else
{
// Wait until PlatformImpl is available
this.PropertyChanged += (_, e) =>
{
if (e.Property.Name == nameof(PlatformImpl) && PlatformImpl != null)
{
ForceDarkTitleBar();
}
};
}
// Backup: Try it even when the window is active
this.Activated += (_, _) => ForceDarkTitleBar();
}
private void ForceDarkTitleBar()
{
try
{
var handleField = PlatformImpl?.GetType().GetProperty("Handle")?.GetValue(PlatformImpl);
if (handleField?.GetType().GetProperty("Handle")?.GetValue(handleField) is IntPtr hwnd && hwnd != IntPtr.Zero)
{
int dark = 1;
DwmSetWindowAttribute(hwnd, 20, ref dark, sizeof(int)); // Modern Windows
DwmSetWindowAttribute(hwnd, 19, ref dark, sizeof(int)); // Older Windows 10
}
}
catch
{
// Silent fail
}
}
public void Save() public void Save()
{ {
if (NoCheatsFound) if (NoCheatsFound)
@@ -0,0 +1,119 @@
<window:StyleableWindow
x:Class="Ryujinx.Ava.UI.Windows.CustomSettingsWindow"
xmlns="https://github.com/avaloniaui"
xmlns:ui="clr-namespace:FluentAvalonia.UI.Controls;assembly=FluentAvalonia"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:locale="clr-namespace:Ryujinx.Ava.Common.Locale"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:window="clr-namespace:Ryujinx.Ava.UI.Windows"
xmlns:viewModels="clr-namespace:Ryujinx.Ava.UI.ViewModels"
xmlns:settings="clr-namespace:Ryujinx.Ava.UI.Views.Settings"
xmlns:helpers="clr-namespace:Ryujinx.Ava.UI.Helpers"
Width="1100"
Height="927"
MinWidth="800"
MinHeight="480"
WindowStartupLocation="CenterOwner"
x:DataType="viewModels:CustomSettingsViewModel"
mc:Ignorable="d"
Focusable="True">
<Design.DataContext>
<viewModels:CustomSettingsViewModel />
</Design.DataContext>
<Grid HorizontalAlignment="Stretch" VerticalAlignment="Stretch" MinWidth="600"
RowDefinitions="Auto,*,Auto">
<ContentPresenter
x:Name="ContentPresenter"
Grid.Row="1"
IsVisible="False"
KeyboardNavigation.IsTabStop="False"/>
<Grid Name="Pages" IsVisible="False" Grid.Row="2">
<settings:CustomSettingsSystemView Name="SystemPage" />
<settings:CustomSettingsCPUView Name="CpuPage" />
<settings:CustomSettingsGraphicsView Name="GraphicsPage" />
<settings:CustomSettingsAudioView Name="AudioPage" />
</Grid>
<ui:FANavigationView
Grid.Row="1"
IsSettingsVisible="False"
Name="NavPanel"
IsBackEnabled="False"
PaneDisplayMode="Left"
Margin="2,10,10,0"
VerticalAlignment="Stretch"
HorizontalAlignment="Stretch"
OpenPaneLength="200">
<ui:FANavigationView.PaneHeader>
<Border
Margin="10"
HorizontalAlignment="Stretch"
VerticalAlignment="Stretch"
ClipToBounds="True"
CornerRadius="4">
<Grid RowDefinitions="Auto,Auto">
<Grid Grid.Column="0">
<Image
Grid.Row="0"
HorizontalAlignment="Stretch"
VerticalAlignment="Top"
Source="{Binding GameIcon}"
Width="140"
Height="140">
</Image>
</Grid>
</Grid>
</Border>
</ui:FANavigationView.PaneHeader>
<ui:FANavigationView.MenuItems>
<ui:FANavigationViewItem
Content="{locale:Locale SettingsTabSystem}"
Tag="SystemPage"
IconSource="Settings" />
<ui:FANavigationViewItem
Content="{locale:Locale SettingsTabCpu}"
Tag="CpuPage">
<ui:FANavigationViewItem.IconSource>
<ui:FAFontIconSource
FontFamily="avares://Ryujinx/Assets/Fonts#Segoe Fluent Icons"
Glyph="{helpers:GlyphValueConverter Chip}" />
</ui:FANavigationViewItem.IconSource>
</ui:FANavigationViewItem>
<ui:FANavigationViewItem
Content="{locale:Locale SettingsTabGraphics}"
Tag="GraphicsPage"
IconSource="Image" />
<ui:FANavigationViewItem
Content="{locale:Locale SettingsTabAudio}"
IconSource="Audio"
Tag="AudioPage" />
</ui:FANavigationView.MenuItems>
<ui:FANavigationView.Styles>
<Style Selector="Grid#PlaceholderGrid">
<Setter Property="Height" Value="160" />
</Style>
<Style Selector="ui|FANavigationViewItem ui|FASymbolIcon">
<Setter Property="FlowDirection" Value="LeftToRight" />
</Style>
</ui:FANavigationView.Styles>
</ui:FANavigationView>
<ReversibleStackPanel
Grid.Row="2"
Margin="10"
Spacing="10"
Orientation="Horizontal"
HorizontalAlignment="Right"
ReverseOrder="{Binding IsMacOS}">
<Button
Content="{locale:Locale SettingsButtonDelete}"
Command="{Binding DeleteButton}" />
<Button
Content="{locale:Locale SettingsButtonSave}"
Command="{Binding SaveButton}" />
<Button
HotKey="Escape"
Content="{locale:Locale SettingsButtonCancel}"
Command="{Binding CancelButton}" />
</ReversibleStackPanel>
</Grid>
</window:StyleableWindow>
@@ -0,0 +1,109 @@
using Avalonia.Controls;
using FluentAvalonia.UI.Controls;
using Ryujinx.Ava.Common.Locale;
using Ryujinx.Ava.UI.ViewModels;
using Ryujinx.HLE.FileSystem;
using System;
using System.Linq;
using System.Runtime.InteropServices;
namespace Ryujinx.Ava.UI.Windows
{
public partial class CustomSettingsWindow : StyleableWindow
{
[DllImport("dwmapi.dll")]
private static extern int DwmSetWindowAttribute(IntPtr hwnd, int attr, ref int value, int size);
internal readonly CustomSettingsViewModel ViewModel;
public CustomSettingsWindow(VirtualFileSystem virtualFileSystem, string titleId, string titleName, byte[] icon, string titlePath)
{
Title = $"Ryujinx {Program.Version} - {LocaleManager.Instance[LocaleKeys.Settings]} - {titleName} ";
DataContext = ViewModel = new CustomSettingsViewModel(titleId,icon,titleName);
ViewModel.CloseWindow += Close;
InitializeComponent();
ApplyDarkTitleBar();
Load();
}
private void ApplyDarkTitleBar()
{
if (!OperatingSystem.IsWindows())
return;
// Apply immediately if possible
if (PlatformImpl != null)
{
ForceDarkTitleBar();
}
else
{
// Wait until PlatformImpl is available
this.PropertyChanged += (_, e) =>
{
if (e.Property.Name == nameof(PlatformImpl) && PlatformImpl != null)
{
ForceDarkTitleBar();
}
};
}
// Backup: Try it even when the window is active
this.Activated += (_, _) => ForceDarkTitleBar();
}
private void ForceDarkTitleBar()
{
try
{
var handleField = PlatformImpl?.GetType().GetProperty("Handle")?.GetValue(PlatformImpl);
if (handleField?.GetType().GetProperty("Handle")?.GetValue(handleField) is IntPtr hwnd && hwnd != IntPtr.Zero)
{
int dark = 1;
DwmSetWindowAttribute(hwnd, 20, ref dark, sizeof(int)); // Modern Windows
DwmSetWindowAttribute(hwnd, 19, ref dark, sizeof(int)); // Older Windows 10
}
}
catch
{
// Silent fail
}
}
private void Load()
{
Pages.Children.Clear();
NavPanel.SelectionChanged += NavPanelOnSelectionChanged;
NavPanel.SelectedItem = NavPanel.MenuItems.ElementAt(0);
}
private void NavPanelOnSelectionChanged(object sender, FANavigationViewSelectionChangedEventArgs e)
{
if (e.SelectedItem is FANavigationViewItem navItem && navItem.Tag is not null)
{
switch (navItem.Tag.ToString())
{
case "SystemPage":
NavPanel.Content = SystemPage;
break;
case "CpuPage":
NavPanel.Content = CpuPage;
break;
case "GraphicsPage":
NavPanel.Content = GraphicsPage;
break;
case "AudioPage":
NavPanel.Content = AudioPage;
break;
default:
throw new NotImplementedException();
}
}
}
protected override void OnClosing(WindowClosingEventArgs e)
{
base.OnClosing(e);
}
}
}
+2
View File
@@ -43,6 +43,8 @@
<KeyBinding Gesture="Ctrl+B" Command="{Binding OpenBinFile}" /> <KeyBinding Gesture="Ctrl+B" Command="{Binding OpenBinFile}" />
<KeyBinding Gesture="Ctrl+," Command="{Binding OpenSettings}" /> <KeyBinding Gesture="Ctrl+," Command="{Binding OpenSettings}" />
<KeyBinding Gesture="Ctrl+R" Command="{Binding RestartEmulation}" /> <KeyBinding Gesture="Ctrl+R" Command="{Binding RestartEmulation}" />
<KeyBinding Gesture="Ctrl+Shift+R" Command="{Binding ReloadRenderDocApi}" />
<KeyBinding Gesture="Ctrl+Shift+C" Command="{Binding ToggleCapture}" />
</Window.KeyBindings> </Window.KeyBindings>
<Grid HorizontalAlignment="Stretch" VerticalAlignment="Stretch"> <Grid HorizontalAlignment="Stretch" VerticalAlignment="Stretch">
<Grid.RowDefinitions> <Grid.RowDefinitions>
+1 -1
View File
@@ -570,7 +570,7 @@ namespace Ryujinx.Ava.UI.Windows
public static void UpdateGraphicsConfig() public static void UpdateGraphicsConfig()
{ {
#pragma warning disable IDE0055 // Disable formatting #pragma warning disable IDE0055 // Disable formatting
GraphicsConfig.ResScale = ConfigurationState.Instance.Graphics.ResScale == -1 ? ConfigurationState.Instance.Graphics.ResScaleCustom : ConfigurationState.Instance.Graphics.ResScale; GraphicsConfig.ResScale = ConfigurationState.Instance.Graphics.ResScale;
GraphicsConfig.MaxAnisotropy = ConfigurationState.Instance.Graphics.MaxAnisotropy; GraphicsConfig.MaxAnisotropy = ConfigurationState.Instance.Graphics.MaxAnisotropy;
GraphicsConfig.ShadersDumpPath = ConfigurationState.Instance.Graphics.ShadersDumpPath; GraphicsConfig.ShadersDumpPath = ConfigurationState.Instance.Graphics.ShadersDumpPath;
GraphicsConfig.EnableShaderCache = ConfigurationState.Instance.Graphics.EnableShaderCache; GraphicsConfig.EnableShaderCache = ConfigurationState.Instance.Graphics.EnableShaderCache;