Merge branch 'master' into add-emulation-stop
|
@ -8,8 +8,8 @@
|
|||
<PackageVersion Include="Avalonia.Desktop" Version="11.0.10" />
|
||||
<PackageVersion Include="Avalonia.Diagnostics" Version="11.0.10" />
|
||||
<PackageVersion Include="Avalonia.Markup.Xaml.Loader" Version="11.0.10" />
|
||||
<PackageVersion Include="Avalonia.Svg" Version="11.0.0.14" />
|
||||
<PackageVersion Include="Avalonia.Svg.Skia" Version="11.0.0.14" />
|
||||
<PackageVersion Include="Avalonia.Svg" Version="11.0.0.16" />
|
||||
<PackageVersion Include="Avalonia.Svg.Skia" Version="11.0.0.16" />
|
||||
<PackageVersion Include="CommandLineParser" Version="2.9.1" />
|
||||
<PackageVersion Include="Concentus" Version="1.1.7" />
|
||||
<PackageVersion Include="DiscordRichPresence" Version="1.2.1.24" />
|
||||
|
@ -19,8 +19,8 @@
|
|||
<PackageVersion Include="GtkSharp.Dependencies.osx" Version="0.0.5" />
|
||||
<PackageVersion Include="LibHac" Version="0.19.0" />
|
||||
<PackageVersion Include="Microsoft.CodeAnalysis.Analyzers" Version="3.3.4" />
|
||||
<PackageVersion Include="Microsoft.CodeAnalysis.CSharp" Version="4.8.0" />
|
||||
<PackageVersion Include="Microsoft.IdentityModel.JsonWebTokens" Version="7.3.0" />
|
||||
<PackageVersion Include="Microsoft.CodeAnalysis.CSharp" Version="4.9.2" />
|
||||
<PackageVersion Include="Microsoft.IdentityModel.JsonWebTokens" Version="7.4.0" />
|
||||
<PackageVersion Include="Microsoft.NET.Test.Sdk" Version="17.9.0" />
|
||||
<PackageVersion Include="Microsoft.IO.RecyclableMemoryStream" Version="3.0.0" />
|
||||
<PackageVersion Include="MsgPack.Cli" Version="1.0.1" />
|
||||
|
|
|
@ -157,7 +157,7 @@ namespace ARMeilleure.Instructions
|
|||
|
||||
context.Copy(temp, value);
|
||||
|
||||
if (!context.Memory.Type.IsHostMapped())
|
||||
if (!context.Memory.Type.IsHostMappedOrTracked())
|
||||
{
|
||||
context.Branch(lblEnd);
|
||||
|
||||
|
@ -198,7 +198,7 @@ namespace ARMeilleure.Instructions
|
|||
|
||||
SetInt(context, rt, value);
|
||||
|
||||
if (!context.Memory.Type.IsHostMapped())
|
||||
if (!context.Memory.Type.IsHostMappedOrTracked())
|
||||
{
|
||||
context.Branch(lblEnd);
|
||||
|
||||
|
@ -265,7 +265,7 @@ namespace ARMeilleure.Instructions
|
|||
|
||||
context.Copy(GetVec(rt), value);
|
||||
|
||||
if (!context.Memory.Type.IsHostMapped())
|
||||
if (!context.Memory.Type.IsHostMappedOrTracked())
|
||||
{
|
||||
context.Branch(lblEnd);
|
||||
|
||||
|
@ -312,7 +312,7 @@ namespace ARMeilleure.Instructions
|
|||
break;
|
||||
}
|
||||
|
||||
if (!context.Memory.Type.IsHostMapped())
|
||||
if (!context.Memory.Type.IsHostMappedOrTracked())
|
||||
{
|
||||
context.Branch(lblEnd);
|
||||
|
||||
|
@ -385,7 +385,7 @@ namespace ARMeilleure.Instructions
|
|||
break;
|
||||
}
|
||||
|
||||
if (!context.Memory.Type.IsHostMapped())
|
||||
if (!context.Memory.Type.IsHostMappedOrTracked())
|
||||
{
|
||||
context.Branch(lblEnd);
|
||||
|
||||
|
@ -403,6 +403,27 @@ namespace ARMeilleure.Instructions
|
|||
{
|
||||
return EmitHostMappedPointer(context, address);
|
||||
}
|
||||
else if (context.Memory.Type.IsHostTracked())
|
||||
{
|
||||
if (address.Type == OperandType.I32)
|
||||
{
|
||||
address = context.ZeroExtend32(OperandType.I64, address);
|
||||
}
|
||||
|
||||
if (context.Memory.Type == MemoryManagerType.HostTracked)
|
||||
{
|
||||
Operand mask = Const(ulong.MaxValue >> (64 - context.Memory.AddressSpaceBits));
|
||||
address = context.BitwiseAnd(address, mask);
|
||||
}
|
||||
|
||||
Operand ptBase = !context.HasPtc
|
||||
? Const(context.Memory.PageTablePointer.ToInt64())
|
||||
: Const(context.Memory.PageTablePointer.ToInt64(), Ptc.PageTableSymbol);
|
||||
|
||||
Operand ptOffset = context.ShiftRightUI(address, Const(PageBits));
|
||||
|
||||
return context.Add(address, context.Load(OperandType.I64, context.Add(ptBase, context.ShiftLeft(ptOffset, Const(3)))));
|
||||
}
|
||||
|
||||
int ptLevelBits = context.Memory.AddressSpaceBits - PageBits;
|
||||
int ptLevelSize = 1 << ptLevelBits;
|
||||
|
|
|
@ -91,54 +91,54 @@ namespace ARMeilleure.Instructions
|
|||
#region "Read"
|
||||
public static byte ReadByte(ulong address)
|
||||
{
|
||||
return GetMemoryManager().ReadTracked<byte>(address);
|
||||
return GetMemoryManager().ReadGuest<byte>(address);
|
||||
}
|
||||
|
||||
public static ushort ReadUInt16(ulong address)
|
||||
{
|
||||
return GetMemoryManager().ReadTracked<ushort>(address);
|
||||
return GetMemoryManager().ReadGuest<ushort>(address);
|
||||
}
|
||||
|
||||
public static uint ReadUInt32(ulong address)
|
||||
{
|
||||
return GetMemoryManager().ReadTracked<uint>(address);
|
||||
return GetMemoryManager().ReadGuest<uint>(address);
|
||||
}
|
||||
|
||||
public static ulong ReadUInt64(ulong address)
|
||||
{
|
||||
return GetMemoryManager().ReadTracked<ulong>(address);
|
||||
return GetMemoryManager().ReadGuest<ulong>(address);
|
||||
}
|
||||
|
||||
public static V128 ReadVector128(ulong address)
|
||||
{
|
||||
return GetMemoryManager().ReadTracked<V128>(address);
|
||||
return GetMemoryManager().ReadGuest<V128>(address);
|
||||
}
|
||||
#endregion
|
||||
|
||||
#region "Write"
|
||||
public static void WriteByte(ulong address, byte value)
|
||||
{
|
||||
GetMemoryManager().Write(address, value);
|
||||
GetMemoryManager().WriteGuest(address, value);
|
||||
}
|
||||
|
||||
public static void WriteUInt16(ulong address, ushort value)
|
||||
{
|
||||
GetMemoryManager().Write(address, value);
|
||||
GetMemoryManager().WriteGuest(address, value);
|
||||
}
|
||||
|
||||
public static void WriteUInt32(ulong address, uint value)
|
||||
{
|
||||
GetMemoryManager().Write(address, value);
|
||||
GetMemoryManager().WriteGuest(address, value);
|
||||
}
|
||||
|
||||
public static void WriteUInt64(ulong address, ulong value)
|
||||
{
|
||||
GetMemoryManager().Write(address, value);
|
||||
GetMemoryManager().WriteGuest(address, value);
|
||||
}
|
||||
|
||||
public static void WriteVector128(ulong address, V128 value)
|
||||
{
|
||||
GetMemoryManager().Write(address, value);
|
||||
GetMemoryManager().WriteGuest(address, value);
|
||||
}
|
||||
#endregion
|
||||
|
||||
|
|
|
@ -28,6 +28,17 @@ namespace ARMeilleure.Memory
|
|||
/// <returns>The data</returns>
|
||||
T ReadTracked<T>(ulong va) where T : unmanaged;
|
||||
|
||||
/// <summary>
|
||||
/// Reads data from CPU mapped memory, from guest code. (with read tracking)
|
||||
/// </summary>
|
||||
/// <typeparam name="T">Type of the data being read</typeparam>
|
||||
/// <param name="va">Virtual address of the data in memory</param>
|
||||
/// <returns>The data</returns>
|
||||
T ReadGuest<T>(ulong va) where T : unmanaged
|
||||
{
|
||||
return ReadTracked<T>(va);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Writes data to CPU mapped memory.
|
||||
/// </summary>
|
||||
|
@ -36,6 +47,17 @@ namespace ARMeilleure.Memory
|
|||
/// <param name="value">Data to be written</param>
|
||||
void Write<T>(ulong va, T value) where T : unmanaged;
|
||||
|
||||
/// <summary>
|
||||
/// Writes data to CPU mapped memory, from guest code.
|
||||
/// </summary>
|
||||
/// <typeparam name="T">Type of the data being written</typeparam>
|
||||
/// <param name="va">Virtual address to write the data into</param>
|
||||
/// <param name="value">Data to be written</param>
|
||||
void WriteGuest<T>(ulong va, T value) where T : unmanaged
|
||||
{
|
||||
Write(va, value);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Gets a read-only span of data from CPU mapped memory.
|
||||
/// </summary>
|
||||
|
|
|
@ -29,6 +29,18 @@ namespace ARMeilleure.Memory
|
|||
/// Allows invalid access from JIT code to the rest of the program, but is faster.
|
||||
/// </summary>
|
||||
HostMappedUnsafe,
|
||||
|
||||
/// <summary>
|
||||
/// High level implementation using a software flat page table for address translation
|
||||
/// with no support for handling invalid or non-contiguous memory access.
|
||||
/// </summary>
|
||||
HostTracked,
|
||||
|
||||
/// <summary>
|
||||
/// High level implementation using a software flat page table for address translation
|
||||
/// without masking the address and no support for handling invalid or non-contiguous memory access.
|
||||
/// </summary>
|
||||
HostTrackedUnsafe,
|
||||
}
|
||||
|
||||
public static class MemoryManagerTypeExtensions
|
||||
|
@ -37,5 +49,15 @@ namespace ARMeilleure.Memory
|
|||
{
|
||||
return type == MemoryManagerType.HostMapped || type == MemoryManagerType.HostMappedUnsafe;
|
||||
}
|
||||
|
||||
public static bool IsHostTracked(this MemoryManagerType type)
|
||||
{
|
||||
return type == MemoryManagerType.HostTracked || type == MemoryManagerType.HostTrackedUnsafe;
|
||||
}
|
||||
|
||||
public static bool IsHostMappedOrTracked(this MemoryManagerType type)
|
||||
{
|
||||
return type.IsHostMapped() || type.IsHostTracked();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -21,10 +21,8 @@ namespace ARMeilleure.Signal
|
|||
|
||||
private const uint EXCEPTION_ACCESS_VIOLATION = 0xc0000005;
|
||||
|
||||
private static Operand EmitGenericRegionCheck(EmitterContext context, IntPtr signalStructPtr, Operand faultAddress, Operand isWrite, int rangeStructSize, ulong pageSize)
|
||||
private static Operand EmitGenericRegionCheck(EmitterContext context, IntPtr signalStructPtr, Operand faultAddress, Operand isWrite, int rangeStructSize)
|
||||
{
|
||||
ulong pageMask = pageSize - 1;
|
||||
|
||||
Operand inRegionLocal = context.AllocateLocal(OperandType.I32);
|
||||
context.Copy(inRegionLocal, Const(0));
|
||||
|
||||
|
@ -51,7 +49,7 @@ namespace ARMeilleure.Signal
|
|||
// Only call tracking if in range.
|
||||
context.BranchIfFalse(nextLabel, inRange, BasicBlockFrequency.Cold);
|
||||
|
||||
Operand offset = context.BitwiseAnd(context.Subtract(faultAddress, rangeAddress), Const(~pageMask));
|
||||
Operand offset = context.Subtract(faultAddress, rangeAddress);
|
||||
|
||||
// Call the tracking action, with the pointer's relative offset to the base address.
|
||||
Operand trackingActionPtr = context.Load(OperandType.I64, Const((ulong)signalStructPtr + rangeBaseOffset + 20));
|
||||
|
@ -62,8 +60,10 @@ namespace ARMeilleure.Signal
|
|||
|
||||
// Tracking action should be non-null to call it, otherwise assume false return.
|
||||
context.BranchIfFalse(skipActionLabel, trackingActionPtr);
|
||||
Operand result = context.Call(trackingActionPtr, OperandType.I32, offset, Const(pageSize), isWrite);
|
||||
context.Copy(inRegionLocal, result);
|
||||
Operand result = context.Call(trackingActionPtr, OperandType.I64, offset, Const(1UL), isWrite);
|
||||
context.Copy(inRegionLocal, context.ICompareNotEqual(result, Const(0UL)));
|
||||
|
||||
GenerateFaultAddressPatchCode(context, faultAddress, result);
|
||||
|
||||
context.MarkLabel(skipActionLabel);
|
||||
|
||||
|
@ -155,7 +155,7 @@ namespace ARMeilleure.Signal
|
|||
throw new PlatformNotSupportedException();
|
||||
}
|
||||
|
||||
public static byte[] GenerateUnixSignalHandler(IntPtr signalStructPtr, int rangeStructSize, ulong pageSize)
|
||||
public static byte[] GenerateUnixSignalHandler(IntPtr signalStructPtr, int rangeStructSize)
|
||||
{
|
||||
EmitterContext context = new();
|
||||
|
||||
|
@ -168,7 +168,7 @@ namespace ARMeilleure.Signal
|
|||
|
||||
Operand isWrite = context.ICompareNotEqual(writeFlag, Const(0L)); // Normalize to 0/1.
|
||||
|
||||
Operand isInRegion = EmitGenericRegionCheck(context, signalStructPtr, faultAddress, isWrite, rangeStructSize, pageSize);
|
||||
Operand isInRegion = EmitGenericRegionCheck(context, signalStructPtr, faultAddress, isWrite, rangeStructSize);
|
||||
|
||||
Operand endLabel = Label();
|
||||
|
||||
|
@ -203,7 +203,7 @@ namespace ARMeilleure.Signal
|
|||
return Compiler.Compile(cfg, argTypes, OperandType.None, CompilerOptions.HighCq, RuntimeInformation.ProcessArchitecture).Code;
|
||||
}
|
||||
|
||||
public static byte[] GenerateWindowsSignalHandler(IntPtr signalStructPtr, int rangeStructSize, ulong pageSize)
|
||||
public static byte[] GenerateWindowsSignalHandler(IntPtr signalStructPtr, int rangeStructSize)
|
||||
{
|
||||
EmitterContext context = new();
|
||||
|
||||
|
@ -232,7 +232,7 @@ namespace ARMeilleure.Signal
|
|||
|
||||
Operand isWrite = context.ICompareNotEqual(writeFlag, Const(0L)); // Normalize to 0/1.
|
||||
|
||||
Operand isInRegion = EmitGenericRegionCheck(context, signalStructPtr, faultAddress, isWrite, rangeStructSize, pageSize);
|
||||
Operand isInRegion = EmitGenericRegionCheck(context, signalStructPtr, faultAddress, isWrite, rangeStructSize);
|
||||
|
||||
Operand endLabel = Label();
|
||||
|
||||
|
@ -256,5 +256,86 @@ namespace ARMeilleure.Signal
|
|||
|
||||
return Compiler.Compile(cfg, argTypes, OperandType.I32, CompilerOptions.HighCq, RuntimeInformation.ProcessArchitecture).Code;
|
||||
}
|
||||
|
||||
private static void GenerateFaultAddressPatchCode(EmitterContext context, Operand faultAddress, Operand newAddress)
|
||||
{
|
||||
if (RuntimeInformation.ProcessArchitecture == Architecture.Arm64)
|
||||
{
|
||||
if (SupportsFaultAddressPatchingForHostOs())
|
||||
{
|
||||
Operand lblSkip = Label();
|
||||
|
||||
context.BranchIf(lblSkip, faultAddress, newAddress, Comparison.Equal);
|
||||
|
||||
Operand ucontextPtr = context.LoadArgument(OperandType.I64, 2);
|
||||
Operand pcCtxAddress = default;
|
||||
ulong baseRegsOffset = 0;
|
||||
|
||||
if (OperatingSystem.IsLinux())
|
||||
{
|
||||
pcCtxAddress = context.Add(ucontextPtr, Const(440UL));
|
||||
baseRegsOffset = 184UL;
|
||||
}
|
||||
else if (OperatingSystem.IsMacOS() || OperatingSystem.IsIOS())
|
||||
{
|
||||
ucontextPtr = context.Load(OperandType.I64, context.Add(ucontextPtr, Const(48UL)));
|
||||
|
||||
pcCtxAddress = context.Add(ucontextPtr, Const(272UL));
|
||||
baseRegsOffset = 16UL;
|
||||
}
|
||||
|
||||
Operand pc = context.Load(OperandType.I64, pcCtxAddress);
|
||||
|
||||
Operand reg = GetAddressRegisterFromArm64Instruction(context, pc);
|
||||
Operand reg64 = context.ZeroExtend32(OperandType.I64, reg);
|
||||
Operand regCtxAddress = context.Add(ucontextPtr, context.Add(context.ShiftLeft(reg64, Const(3)), Const(baseRegsOffset)));
|
||||
Operand regAddress = context.Load(OperandType.I64, regCtxAddress);
|
||||
|
||||
Operand addressDelta = context.Subtract(regAddress, faultAddress);
|
||||
|
||||
context.Store(regCtxAddress, context.Add(newAddress, addressDelta));
|
||||
|
||||
context.MarkLabel(lblSkip);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private static Operand GetAddressRegisterFromArm64Instruction(EmitterContext context, Operand pc)
|
||||
{
|
||||
Operand inst = context.Load(OperandType.I32, pc);
|
||||
Operand reg = context.AllocateLocal(OperandType.I32);
|
||||
|
||||
Operand isSysInst = context.ICompareEqual(context.BitwiseAnd(inst, Const(0xFFF80000)), Const(0xD5080000));
|
||||
|
||||
Operand lblSys = Label();
|
||||
Operand lblEnd = Label();
|
||||
|
||||
context.BranchIfTrue(lblSys, isSysInst, BasicBlockFrequency.Cold);
|
||||
|
||||
context.Copy(reg, context.BitwiseAnd(context.ShiftRightUI(inst, Const(5)), Const(0x1F)));
|
||||
context.Branch(lblEnd);
|
||||
|
||||
context.MarkLabel(lblSys);
|
||||
context.Copy(reg, context.BitwiseAnd(inst, Const(0x1F)));
|
||||
|
||||
context.MarkLabel(lblEnd);
|
||||
|
||||
return reg;
|
||||
}
|
||||
|
||||
public static bool SupportsFaultAddressPatchingForHost()
|
||||
{
|
||||
return SupportsFaultAddressPatchingForHostArch() && SupportsFaultAddressPatchingForHostOs();
|
||||
}
|
||||
|
||||
private static bool SupportsFaultAddressPatchingForHostArch()
|
||||
{
|
||||
return RuntimeInformation.ProcessArchitecture == Architecture.Arm64;
|
||||
}
|
||||
|
||||
private static bool SupportsFaultAddressPatchingForHostOs()
|
||||
{
|
||||
return OperatingSystem.IsLinux() || OperatingSystem.IsMacOS() || OperatingSystem.IsIOS();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -5,10 +5,10 @@ namespace Ryujinx.Common.Collections
|
|||
/// </summary>
|
||||
public class IntrusiveRedBlackTreeNode<T> where T : IntrusiveRedBlackTreeNode<T>
|
||||
{
|
||||
internal bool Color = true;
|
||||
internal T Left;
|
||||
internal T Right;
|
||||
internal T Parent;
|
||||
public bool Color = true;
|
||||
public T Left;
|
||||
public T Right;
|
||||
public T Parent;
|
||||
|
||||
public T Predecessor => IntrusiveRedBlackTreeImpl<T>.PredecessorOf((T)this);
|
||||
public T Successor => IntrusiveRedBlackTreeImpl<T>.SuccessorOf((T)this);
|
||||
|
|
|
@ -4,7 +4,7 @@ using System.Threading;
|
|||
|
||||
namespace Ryujinx.Common.Memory
|
||||
{
|
||||
public sealed partial class ByteMemoryPool
|
||||
public partial class ByteMemoryPool
|
||||
{
|
||||
/// <summary>
|
||||
/// Represents a <see cref="IMemoryOwner{Byte}"/> that wraps an array rented from
|
||||
|
|
|
@ -6,24 +6,8 @@ namespace Ryujinx.Common.Memory
|
|||
/// <summary>
|
||||
/// Provides a pool of re-usable byte array instances.
|
||||
/// </summary>
|
||||
public sealed partial class ByteMemoryPool
|
||||
public static partial class ByteMemoryPool
|
||||
{
|
||||
private static readonly ByteMemoryPool _shared = new();
|
||||
|
||||
/// <summary>
|
||||
/// Constructs a <see cref="ByteMemoryPool"/> instance. Private to force access through
|
||||
/// the <see cref="ByteMemoryPool.Shared"/> instance.
|
||||
/// </summary>
|
||||
private ByteMemoryPool()
|
||||
{
|
||||
// No implementation
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Retrieves a shared <see cref="ByteMemoryPool"/> instance.
|
||||
/// </summary>
|
||||
public static ByteMemoryPool Shared => _shared;
|
||||
|
||||
/// <summary>
|
||||
/// Returns the maximum buffer size supported by this pool.
|
||||
/// </summary>
|
||||
|
@ -95,6 +79,20 @@ namespace Ryujinx.Common.Memory
|
|||
return buffer;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Copies <paramref name="buffer"/> into a newly rented byte memory buffer.
|
||||
/// </summary>
|
||||
/// <param name="buffer">The byte buffer to copy</param>
|
||||
/// <returns>A <see cref="IMemoryOwner{Byte}"/> wrapping the rented memory with <paramref name="buffer"/> copied to it</returns>
|
||||
public static IMemoryOwner<byte> RentCopy(ReadOnlySpan<byte> buffer)
|
||||
{
|
||||
var copy = RentImpl(buffer.Length);
|
||||
|
||||
buffer.CopyTo(copy.Memory.Span);
|
||||
|
||||
return copy;
|
||||
}
|
||||
|
||||
private static ByteMemoryPoolBuffer RentImpl(int length)
|
||||
{
|
||||
if ((uint)length > Array.MaxLength)
|
||||
|
|
|
@ -38,7 +38,7 @@ namespace Ryujinx.Cpu.AppleHv
|
|||
|
||||
private readonly HvIpaAllocator _ipaAllocator;
|
||||
|
||||
public HvMemoryBlockAllocator(HvIpaAllocator ipaAllocator, int blockAlignment) : base(blockAlignment, MemoryAllocationFlags.None)
|
||||
public HvMemoryBlockAllocator(HvIpaAllocator ipaAllocator, ulong blockAlignment) : base(blockAlignment, MemoryAllocationFlags.None)
|
||||
{
|
||||
_ipaAllocator = ipaAllocator;
|
||||
}
|
||||
|
|
|
@ -3,12 +3,11 @@ using Ryujinx.Memory;
|
|||
using Ryujinx.Memory.Range;
|
||||
using Ryujinx.Memory.Tracking;
|
||||
using System;
|
||||
using System.Buffers;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Runtime.CompilerServices;
|
||||
using System.Runtime.InteropServices;
|
||||
using System.Runtime.Versioning;
|
||||
using System.Threading;
|
||||
|
||||
namespace Ryujinx.Cpu.AppleHv
|
||||
{
|
||||
|
@ -16,23 +15,8 @@ namespace Ryujinx.Cpu.AppleHv
|
|||
/// Represents a CPU memory manager which maps guest virtual memory directly onto the Hypervisor page table.
|
||||
/// </summary>
|
||||
[SupportedOSPlatform("macos")]
|
||||
public class HvMemoryManager : VirtualMemoryManagerRefCountedBase<ulong, ulong>, IMemoryManager, IVirtualMemoryManagerTracked, IWritableBlock
|
||||
public sealed class HvMemoryManager : VirtualMemoryManagerRefCountedBase, IMemoryManager, IVirtualMemoryManagerTracked
|
||||
{
|
||||
public const int PageToPteShift = 5; // 32 pages (2 bits each) in one ulong page table entry.
|
||||
public const ulong BlockMappedMask = 0x5555555555555555; // First bit of each table entry set.
|
||||
|
||||
private enum HostMappedPtBits : ulong
|
||||
{
|
||||
Unmapped = 0,
|
||||
Mapped,
|
||||
WriteTracked,
|
||||
ReadWriteTracked,
|
||||
|
||||
MappedReplicated = 0x5555555555555555,
|
||||
WriteTrackedReplicated = 0xaaaaaaaaaaaaaaaa,
|
||||
ReadWriteTrackedReplicated = ulong.MaxValue,
|
||||
}
|
||||
|
||||
private readonly InvalidAccessHandler _invalidAccessHandler;
|
||||
|
||||
private readonly HvAddressSpace _addressSpace;
|
||||
|
@ -42,7 +26,7 @@ namespace Ryujinx.Cpu.AppleHv
|
|||
private readonly MemoryBlock _backingMemory;
|
||||
private readonly PageTable<ulong> _pageTable;
|
||||
|
||||
private readonly ulong[] _pageBitmap;
|
||||
private readonly ManagedPageFlags _pages;
|
||||
|
||||
public bool Supports4KBPages => true;
|
||||
|
||||
|
@ -84,7 +68,7 @@ namespace Ryujinx.Cpu.AppleHv
|
|||
|
||||
AddressSpaceBits = asBits;
|
||||
|
||||
_pageBitmap = new ulong[1 << (AddressSpaceBits - (PageBits + PageToPteShift))];
|
||||
_pages = new ManagedPageFlags(AddressSpaceBits);
|
||||
Tracking = new MemoryTracking(this, PageSize, invalidAccessHandler);
|
||||
}
|
||||
|
||||
|
@ -95,7 +79,7 @@ namespace Ryujinx.Cpu.AppleHv
|
|||
|
||||
PtMap(va, pa, size);
|
||||
_addressSpace.MapUser(va, pa, size, MemoryPermission.ReadWriteExecute);
|
||||
AddMapping(va, size);
|
||||
_pages.AddMapping(va, size);
|
||||
|
||||
Tracking.Map(va, size);
|
||||
}
|
||||
|
@ -112,12 +96,6 @@ namespace Ryujinx.Cpu.AppleHv
|
|||
}
|
||||
}
|
||||
|
||||
/// <inheritdoc/>
|
||||
public void MapForeign(ulong va, nuint hostPointer, ulong size)
|
||||
{
|
||||
throw new NotSupportedException();
|
||||
}
|
||||
|
||||
/// <inheritdoc/>
|
||||
public void Unmap(ulong va, ulong size)
|
||||
{
|
||||
|
@ -126,7 +104,7 @@ namespace Ryujinx.Cpu.AppleHv
|
|||
UnmapEvent?.Invoke(va, size);
|
||||
Tracking.Unmap(va, size);
|
||||
|
||||
RemoveMapping(va, size);
|
||||
_pages.RemoveMapping(va, size);
|
||||
_addressSpace.UnmapUser(va, size);
|
||||
PtUnmap(va, size);
|
||||
}
|
||||
|
@ -142,20 +120,11 @@ namespace Ryujinx.Cpu.AppleHv
|
|||
}
|
||||
}
|
||||
|
||||
/// <inheritdoc/>
|
||||
public T Read<T>(ulong va) where T : unmanaged
|
||||
{
|
||||
return MemoryMarshal.Cast<byte, T>(GetSpan(va, Unsafe.SizeOf<T>()))[0];
|
||||
}
|
||||
|
||||
/// <inheritdoc/>
|
||||
public T ReadTracked<T>(ulong va) where T : unmanaged
|
||||
public override T ReadTracked<T>(ulong va)
|
||||
{
|
||||
try
|
||||
{
|
||||
SignalMemoryTracking(va, (ulong)Unsafe.SizeOf<T>(), false);
|
||||
|
||||
return Read<T>(va);
|
||||
return base.ReadTracked<T>(va);
|
||||
}
|
||||
catch (InvalidMemoryRegionException)
|
||||
{
|
||||
|
@ -168,7 +137,6 @@ namespace Ryujinx.Cpu.AppleHv
|
|||
}
|
||||
}
|
||||
|
||||
/// <inheritdoc/>
|
||||
public override void Read(ulong va, Span<byte> data)
|
||||
{
|
||||
try
|
||||
|
@ -184,101 +152,11 @@ namespace Ryujinx.Cpu.AppleHv
|
|||
}
|
||||
}
|
||||
|
||||
/// <inheritdoc/>
|
||||
public void Write<T>(ulong va, T value) where T : unmanaged
|
||||
{
|
||||
Write(va, MemoryMarshal.Cast<T, byte>(MemoryMarshal.CreateSpan(ref value, 1)));
|
||||
}
|
||||
|
||||
/// <inheritdoc/>
|
||||
public void Write(ulong va, ReadOnlySpan<byte> data)
|
||||
{
|
||||
if (data.Length == 0)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
SignalMemoryTracking(va, (ulong)data.Length, true);
|
||||
|
||||
WriteImpl(va, data);
|
||||
}
|
||||
|
||||
/// <inheritdoc/>
|
||||
public void WriteUntracked(ulong va, ReadOnlySpan<byte> data)
|
||||
{
|
||||
if (data.Length == 0)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
WriteImpl(va, data);
|
||||
}
|
||||
|
||||
/// <inheritdoc/>
|
||||
public bool WriteWithRedundancyCheck(ulong va, ReadOnlySpan<byte> data)
|
||||
{
|
||||
if (data.Length == 0)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
SignalMemoryTracking(va, (ulong)data.Length, false);
|
||||
|
||||
if (IsContiguousAndMapped(va, data.Length))
|
||||
{
|
||||
var target = _backingMemory.GetSpan(GetPhysicalAddressInternal(va), data.Length);
|
||||
|
||||
bool changed = !data.SequenceEqual(target);
|
||||
|
||||
if (changed)
|
||||
{
|
||||
data.CopyTo(target);
|
||||
}
|
||||
|
||||
return changed;
|
||||
}
|
||||
else
|
||||
{
|
||||
WriteImpl(va, data);
|
||||
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
private void WriteImpl(ulong va, ReadOnlySpan<byte> data)
|
||||
public override void Write(ulong va, ReadOnlySpan<byte> data)
|
||||
{
|
||||
try
|
||||
{
|
||||
AssertValidAddressAndSize(va, (ulong)data.Length);
|
||||
|
||||
if (IsContiguousAndMapped(va, data.Length))
|
||||
{
|
||||
data.CopyTo(_backingMemory.GetSpan(GetPhysicalAddressInternal(va), data.Length));
|
||||
}
|
||||
else
|
||||
{
|
||||
int offset = 0, size;
|
||||
|
||||
if ((va & PageMask) != 0)
|
||||
{
|
||||
ulong pa = GetPhysicalAddressChecked(va);
|
||||
|
||||
size = Math.Min(data.Length, PageSize - (int)(va & PageMask));
|
||||
|
||||
data[..size].CopyTo(_backingMemory.GetSpan(pa, size));
|
||||
|
||||
offset += size;
|
||||
}
|
||||
|
||||
for (; offset < data.Length; offset += size)
|
||||
{
|
||||
ulong pa = GetPhysicalAddressChecked(va + (ulong)offset);
|
||||
|
||||
size = Math.Min(data.Length - offset, PageSize);
|
||||
|
||||
data.Slice(offset, size).CopyTo(_backingMemory.GetSpan(pa, size));
|
||||
}
|
||||
}
|
||||
base.Write(va, data);
|
||||
}
|
||||
catch (InvalidMemoryRegionException)
|
||||
{
|
||||
|
@ -289,61 +167,38 @@ namespace Ryujinx.Cpu.AppleHv
|
|||
}
|
||||
}
|
||||
|
||||
/// <inheritdoc/>
|
||||
public ReadOnlySpan<byte> GetSpan(ulong va, int size, bool tracked = false)
|
||||
public override void WriteUntracked(ulong va, ReadOnlySpan<byte> data)
|
||||
{
|
||||
if (size == 0)
|
||||
try
|
||||
{
|
||||
return ReadOnlySpan<byte>.Empty;
|
||||
base.WriteUntracked(va, data);
|
||||
}
|
||||
|
||||
if (tracked)
|
||||
catch (InvalidMemoryRegionException)
|
||||
{
|
||||
SignalMemoryTracking(va, (ulong)size, false);
|
||||
}
|
||||
|
||||
if (IsContiguousAndMapped(va, size))
|
||||
{
|
||||
return _backingMemory.GetSpan(GetPhysicalAddressInternal(va), size);
|
||||
}
|
||||
else
|
||||
{
|
||||
Span<byte> data = new byte[size];
|
||||
|
||||
base.Read(va, data);
|
||||
|
||||
return data;
|
||||
if (_invalidAccessHandler == null || !_invalidAccessHandler(va))
|
||||
{
|
||||
throw;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// <inheritdoc/>
|
||||
public WritableRegion GetWritableRegion(ulong va, int size, bool tracked = false)
|
||||
public override ReadOnlySequence<byte> GetReadOnlySequence(ulong va, int size, bool tracked = false)
|
||||
{
|
||||
if (size == 0)
|
||||
try
|
||||
{
|
||||
return new WritableRegion(null, va, Memory<byte>.Empty);
|
||||
return base.GetReadOnlySequence(va, size, tracked);
|
||||
}
|
||||
|
||||
if (tracked)
|
||||
catch (InvalidMemoryRegionException)
|
||||
{
|
||||
SignalMemoryTracking(va, (ulong)size, true);
|
||||
}
|
||||
if (_invalidAccessHandler == null || !_invalidAccessHandler(va))
|
||||
{
|
||||
throw;
|
||||
}
|
||||
|
||||
if (IsContiguousAndMapped(va, size))
|
||||
{
|
||||
return new WritableRegion(null, va, _backingMemory.GetMemory(GetPhysicalAddressInternal(va), size));
|
||||
}
|
||||
else
|
||||
{
|
||||
Memory<byte> memory = new byte[size];
|
||||
|
||||
base.Read(va, memory.Span);
|
||||
|
||||
return new WritableRegion(this, va, memory);
|
||||
return ReadOnlySequence<byte>.Empty;
|
||||
}
|
||||
}
|
||||
|
||||
/// <inheritdoc/>
|
||||
public ref T GetRef<T>(ulong va) where T : unmanaged
|
||||
{
|
||||
if (!IsContiguous(va, Unsafe.SizeOf<T>()))
|
||||
|
@ -356,26 +211,10 @@ namespace Ryujinx.Cpu.AppleHv
|
|||
return ref _backingMemory.GetRef<T>(GetPhysicalAddressChecked(va));
|
||||
}
|
||||
|
||||
/// <inheritdoc/>
|
||||
[MethodImpl(MethodImplOptions.AggressiveInlining)]
|
||||
public bool IsMapped(ulong va)
|
||||
public override bool IsMapped(ulong va)
|
||||
{
|
||||
return ValidateAddress(va) && IsMappedImpl(va);
|
||||
}
|
||||
|
||||
[MethodImpl(MethodImplOptions.AggressiveInlining)]
|
||||
private bool IsMappedImpl(ulong va)
|
||||
{
|
||||
ulong page = va >> PageBits;
|
||||
|
||||
int bit = (int)((page & 31) << 1);
|
||||
|
||||
int pageIndex = (int)(page >> PageToPteShift);
|
||||
ref ulong pageRef = ref _pageBitmap[pageIndex];
|
||||
|
||||
ulong pte = Volatile.Read(ref pageRef);
|
||||
|
||||
return ((pte >> bit) & 3) != 0;
|
||||
return ValidateAddress(va) && _pages.IsMapped(va);
|
||||
}
|
||||
|
||||
/// <inheritdoc/>
|
||||
|
@ -383,91 +222,7 @@ namespace Ryujinx.Cpu.AppleHv
|
|||
{
|
||||
AssertValidAddressAndSize(va, size);
|
||||
|
||||
return IsRangeMappedImpl(va, size);
|
||||
}
|
||||
|
||||
[MethodImpl(MethodImplOptions.AggressiveInlining)]
|
||||
private static void GetPageBlockRange(ulong pageStart, ulong pageEnd, out ulong startMask, out ulong endMask, out int pageIndex, out int pageEndIndex)
|
||||
{
|
||||
startMask = ulong.MaxValue << ((int)(pageStart & 31) << 1);
|
||||
endMask = ulong.MaxValue >> (64 - ((int)(pageEnd & 31) << 1));
|
||||
|
||||
pageIndex = (int)(pageStart >> PageToPteShift);
|
||||
pageEndIndex = (int)((pageEnd - 1) >> PageToPteShift);
|
||||
}
|
||||
|
||||
private bool IsRangeMappedImpl(ulong va, ulong size)
|
||||
{
|
||||
int pages = GetPagesCount(va, size, out _);
|
||||
|
||||
if (pages == 1)
|
||||
{
|
||||
return IsMappedImpl(va);
|
||||
}
|
||||
|
||||
ulong pageStart = va >> PageBits;
|
||||
ulong pageEnd = pageStart + (ulong)pages;
|
||||
|
||||
GetPageBlockRange(pageStart, pageEnd, out ulong startMask, out ulong endMask, out int pageIndex, out int pageEndIndex);
|
||||
|
||||
// Check if either bit in each 2 bit page entry is set.
|
||||
// OR the block with itself shifted down by 1, and check the first bit of each entry.
|
||||
|
||||
ulong mask = BlockMappedMask & startMask;
|
||||
|
||||
while (pageIndex <= pageEndIndex)
|
||||
{
|
||||
if (pageIndex == pageEndIndex)
|
||||
{
|
||||
mask &= endMask;
|
||||
}
|
||||
|
||||
ref ulong pageRef = ref _pageBitmap[pageIndex++];
|
||||
ulong pte = Volatile.Read(ref pageRef);
|
||||
|
||||
pte |= pte >> 1;
|
||||
if ((pte & mask) != mask)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
mask = BlockMappedMask;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
private static void ThrowMemoryNotContiguous() => throw new MemoryNotContiguousException();
|
||||
|
||||
[MethodImpl(MethodImplOptions.AggressiveInlining)]
|
||||
private bool IsContiguousAndMapped(ulong va, int size) => IsContiguous(va, size) && IsMapped(va);
|
||||
|
||||
[MethodImpl(MethodImplOptions.AggressiveInlining)]
|
||||
private bool IsContiguous(ulong va, int size)
|
||||
{
|
||||
if (!ValidateAddress(va) || !ValidateAddressAndSize(va, (ulong)size))
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
int pages = GetPagesCount(va, (uint)size, out va);
|
||||
|
||||
for (int page = 0; page < pages - 1; page++)
|
||||
{
|
||||
if (!ValidateAddress(va + PageSize))
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
if (GetPhysicalAddressInternal(va) + PageSize != GetPhysicalAddressInternal(va + PageSize))
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
va += PageSize;
|
||||
}
|
||||
|
||||
return true;
|
||||
return _pages.IsRangeMapped(va, size);
|
||||
}
|
||||
|
||||
/// <inheritdoc/>
|
||||
|
@ -546,11 +301,10 @@ namespace Ryujinx.Cpu.AppleHv
|
|||
return regions;
|
||||
}
|
||||
|
||||
/// <inheritdoc/>
|
||||
/// <remarks>
|
||||
/// This function also validates that the given range is both valid and mapped, and will throw if it is not.
|
||||
/// </remarks>
|
||||
public void SignalMemoryTracking(ulong va, ulong size, bool write, bool precise = false, int? exemptId = null)
|
||||
public override void SignalMemoryTracking(ulong va, ulong size, bool write, bool precise = false, int? exemptId = null)
|
||||
{
|
||||
AssertValidAddressAndSize(va, size);
|
||||
|
||||
|
@ -560,199 +314,37 @@ namespace Ryujinx.Cpu.AppleHv
|
|||
return;
|
||||
}
|
||||
|
||||
// Software table, used for managed memory tracking.
|
||||
|
||||
int pages = GetPagesCount(va, size, out _);
|
||||
ulong pageStart = va >> PageBits;
|
||||
|
||||
if (pages == 1)
|
||||
{
|
||||
ulong tag = (ulong)(write ? HostMappedPtBits.WriteTracked : HostMappedPtBits.ReadWriteTracked);
|
||||
|
||||
int bit = (int)((pageStart & 31) << 1);
|
||||
|
||||
int pageIndex = (int)(pageStart >> PageToPteShift);
|
||||
ref ulong pageRef = ref _pageBitmap[pageIndex];
|
||||
|
||||
ulong pte = Volatile.Read(ref pageRef);
|
||||
ulong state = ((pte >> bit) & 3);
|
||||
|
||||
if (state >= tag)
|
||||
{
|
||||
Tracking.VirtualMemoryEvent(va, size, write, precise: false, exemptId);
|
||||
return;
|
||||
}
|
||||
else if (state == 0)
|
||||
{
|
||||
ThrowInvalidMemoryRegionException($"Not mapped: va=0x{va:X16}, size=0x{size:X16}");
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
ulong pageEnd = pageStart + (ulong)pages;
|
||||
|
||||
GetPageBlockRange(pageStart, pageEnd, out ulong startMask, out ulong endMask, out int pageIndex, out int pageEndIndex);
|
||||
|
||||
ulong mask = startMask;
|
||||
|
||||
ulong anyTrackingTag = (ulong)HostMappedPtBits.WriteTrackedReplicated;
|
||||
|
||||
while (pageIndex <= pageEndIndex)
|
||||
{
|
||||
if (pageIndex == pageEndIndex)
|
||||
{
|
||||
mask &= endMask;
|
||||
}
|
||||
|
||||
ref ulong pageRef = ref _pageBitmap[pageIndex++];
|
||||
|
||||
ulong pte = Volatile.Read(ref pageRef);
|
||||
ulong mappedMask = mask & BlockMappedMask;
|
||||
|
||||
ulong mappedPte = pte | (pte >> 1);
|
||||
if ((mappedPte & mappedMask) != mappedMask)
|
||||
{
|
||||
ThrowInvalidMemoryRegionException($"Not mapped: va=0x{va:X16}, size=0x{size:X16}");
|
||||
}
|
||||
|
||||
pte &= mask;
|
||||
if ((pte & anyTrackingTag) != 0) // Search for any tracking.
|
||||
{
|
||||
// Writes trigger any tracking.
|
||||
// Only trigger tracking from reads if both bits are set on any page.
|
||||
if (write || (pte & (pte >> 1) & BlockMappedMask) != 0)
|
||||
{
|
||||
Tracking.VirtualMemoryEvent(va, size, write, precise: false, exemptId);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
mask = ulong.MaxValue;
|
||||
}
|
||||
}
|
||||
_pages.SignalMemoryTracking(Tracking, va, size, write, exemptId);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Computes the number of pages in a virtual address range.
|
||||
/// </summary>
|
||||
/// <param name="va">Virtual address of the range</param>
|
||||
/// <param name="size">Size of the range</param>
|
||||
/// <param name="startVa">The virtual address of the beginning of the first page</param>
|
||||
/// <remarks>This function does not differentiate between allocated and unallocated pages.</remarks>
|
||||
[MethodImpl(MethodImplOptions.AggressiveInlining)]
|
||||
private static int GetPagesCount(ulong va, ulong size, out ulong startVa)
|
||||
{
|
||||
// WARNING: Always check if ulong does not overflow during the operations.
|
||||
startVa = va & ~(ulong)PageMask;
|
||||
ulong vaSpan = (va - startVa + size + PageMask) & ~(ulong)PageMask;
|
||||
|
||||
return (int)(vaSpan / PageSize);
|
||||
}
|
||||
|
||||
/// <inheritdoc/>
|
||||
public void Reprotect(ulong va, ulong size, MemoryPermission protection)
|
||||
{
|
||||
// TODO
|
||||
}
|
||||
|
||||
/// <inheritdoc/>
|
||||
public void TrackingReprotect(ulong va, ulong size, MemoryPermission protection)
|
||||
public void TrackingReprotect(ulong va, ulong size, MemoryPermission protection, bool guest)
|
||||
{
|
||||
// Protection is inverted on software pages, since the default value is 0.
|
||||
protection = (~protection) & MemoryPermission.ReadAndWrite;
|
||||
|
||||
int pages = GetPagesCount(va, size, out va);
|
||||
ulong pageStart = va >> PageBits;
|
||||
|
||||
if (pages == 1)
|
||||
if (guest)
|
||||
{
|
||||
ulong protTag = protection switch
|
||||
{
|
||||
MemoryPermission.None => (ulong)HostMappedPtBits.Mapped,
|
||||
MemoryPermission.Write => (ulong)HostMappedPtBits.WriteTracked,
|
||||
_ => (ulong)HostMappedPtBits.ReadWriteTracked,
|
||||
};
|
||||
|
||||
int bit = (int)((pageStart & 31) << 1);
|
||||
|
||||
ulong tagMask = 3UL << bit;
|
||||
ulong invTagMask = ~tagMask;
|
||||
|
||||
ulong tag = protTag << bit;
|
||||
|
||||
int pageIndex = (int)(pageStart >> PageToPteShift);
|
||||
ref ulong pageRef = ref _pageBitmap[pageIndex];
|
||||
|
||||
ulong pte;
|
||||
|
||||
do
|
||||
{
|
||||
pte = Volatile.Read(ref pageRef);
|
||||
}
|
||||
while ((pte & tagMask) != 0 && Interlocked.CompareExchange(ref pageRef, (pte & invTagMask) | tag, pte) != pte);
|
||||
_addressSpace.ReprotectUser(va, size, protection);
|
||||
}
|
||||
else
|
||||
{
|
||||
ulong pageEnd = pageStart + (ulong)pages;
|
||||
|
||||
GetPageBlockRange(pageStart, pageEnd, out ulong startMask, out ulong endMask, out int pageIndex, out int pageEndIndex);
|
||||
|
||||
ulong mask = startMask;
|
||||
|
||||
ulong protTag = protection switch
|
||||
{
|
||||
MemoryPermission.None => (ulong)HostMappedPtBits.MappedReplicated,
|
||||
MemoryPermission.Write => (ulong)HostMappedPtBits.WriteTrackedReplicated,
|
||||
_ => (ulong)HostMappedPtBits.ReadWriteTrackedReplicated,
|
||||
};
|
||||
|
||||
while (pageIndex <= pageEndIndex)
|
||||
{
|
||||
if (pageIndex == pageEndIndex)
|
||||
{
|
||||
mask &= endMask;
|
||||
}
|
||||
|
||||
ref ulong pageRef = ref _pageBitmap[pageIndex++];
|
||||
|
||||
ulong pte;
|
||||
ulong mappedMask;
|
||||
|
||||
// Change the protection of all 2 bit entries that are mapped.
|
||||
do
|
||||
{
|
||||
pte = Volatile.Read(ref pageRef);
|
||||
|
||||
mappedMask = pte | (pte >> 1);
|
||||
mappedMask |= (mappedMask & BlockMappedMask) << 1;
|
||||
mappedMask &= mask; // Only update mapped pages within the given range.
|
||||
}
|
||||
while (Interlocked.CompareExchange(ref pageRef, (pte & (~mappedMask)) | (protTag & mappedMask), pte) != pte);
|
||||
|
||||
mask = ulong.MaxValue;
|
||||
}
|
||||
_pages.TrackingReprotect(va, size, protection);
|
||||
}
|
||||
|
||||
protection = protection switch
|
||||
{
|
||||
MemoryPermission.None => MemoryPermission.ReadAndWrite,
|
||||
MemoryPermission.Write => MemoryPermission.Read,
|
||||
_ => MemoryPermission.None,
|
||||
};
|
||||
|
||||
_addressSpace.ReprotectUser(va, size, protection);
|
||||
}
|
||||
|
||||
/// <inheritdoc/>
|
||||
public RegionHandle BeginTracking(ulong address, ulong size, int id)
|
||||
public RegionHandle BeginTracking(ulong address, ulong size, int id, RegionFlags flags = RegionFlags.None)
|
||||
{
|
||||
return Tracking.BeginTracking(address, size, id);
|
||||
return Tracking.BeginTracking(address, size, id, flags);
|
||||
}
|
||||
|
||||
/// <inheritdoc/>
|
||||
public MultiRegionHandle BeginGranularTracking(ulong address, ulong size, IEnumerable<IRegionHandle> handles, ulong granularity, int id)
|
||||
public MultiRegionHandle BeginGranularTracking(ulong address, ulong size, IEnumerable<IRegionHandle> handles, ulong granularity, int id, RegionFlags flags = RegionFlags.None)
|
||||
{
|
||||
return Tracking.BeginGranularTracking(address, size, handles, granularity, id);
|
||||
return Tracking.BeginGranularTracking(address, size, handles, granularity, id, flags);
|
||||
}
|
||||
|
||||
/// <inheritdoc/>
|
||||
|
@ -761,87 +353,7 @@ namespace Ryujinx.Cpu.AppleHv
|
|||
return Tracking.BeginSmartGranularTracking(address, size, granularity, id);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Adds the given address mapping to the page table.
|
||||
/// </summary>
|
||||
/// <param name="va">Virtual memory address</param>
|
||||
/// <param name="size">Size to be mapped</param>
|
||||
private void AddMapping(ulong va, ulong size)
|
||||
{
|
||||
int pages = GetPagesCount(va, size, out _);
|
||||
ulong pageStart = va >> PageBits;
|
||||
ulong pageEnd = pageStart + (ulong)pages;
|
||||
|
||||
GetPageBlockRange(pageStart, pageEnd, out ulong startMask, out ulong endMask, out int pageIndex, out int pageEndIndex);
|
||||
|
||||
ulong mask = startMask;
|
||||
|
||||
while (pageIndex <= pageEndIndex)
|
||||
{
|
||||
if (pageIndex == pageEndIndex)
|
||||
{
|
||||
mask &= endMask;
|
||||
}
|
||||
|
||||
ref ulong pageRef = ref _pageBitmap[pageIndex++];
|
||||
|
||||
ulong pte;
|
||||
ulong mappedMask;
|
||||
|
||||
// Map all 2-bit entries that are unmapped.
|
||||
do
|
||||
{
|
||||
pte = Volatile.Read(ref pageRef);
|
||||
|
||||
mappedMask = pte | (pte >> 1);
|
||||
mappedMask |= (mappedMask & BlockMappedMask) << 1;
|
||||
mappedMask |= ~mask; // Treat everything outside the range as mapped, thus unchanged.
|
||||
}
|
||||
while (Interlocked.CompareExchange(ref pageRef, (pte & mappedMask) | (BlockMappedMask & (~mappedMask)), pte) != pte);
|
||||
|
||||
mask = ulong.MaxValue;
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Removes the given address mapping from the page table.
|
||||
/// </summary>
|
||||
/// <param name="va">Virtual memory address</param>
|
||||
/// <param name="size">Size to be unmapped</param>
|
||||
private void RemoveMapping(ulong va, ulong size)
|
||||
{
|
||||
int pages = GetPagesCount(va, size, out _);
|
||||
ulong pageStart = va >> PageBits;
|
||||
ulong pageEnd = pageStart + (ulong)pages;
|
||||
|
||||
GetPageBlockRange(pageStart, pageEnd, out ulong startMask, out ulong endMask, out int pageIndex, out int pageEndIndex);
|
||||
|
||||
startMask = ~startMask;
|
||||
endMask = ~endMask;
|
||||
|
||||
ulong mask = startMask;
|
||||
|
||||
while (pageIndex <= pageEndIndex)
|
||||
{
|
||||
if (pageIndex == pageEndIndex)
|
||||
{
|
||||
mask |= endMask;
|
||||
}
|
||||
|
||||
ref ulong pageRef = ref _pageBitmap[pageIndex++];
|
||||
ulong pte;
|
||||
|
||||
do
|
||||
{
|
||||
pte = Volatile.Read(ref pageRef);
|
||||
}
|
||||
while (Interlocked.CompareExchange(ref pageRef, pte & mask, pte) != pte);
|
||||
|
||||
mask = 0;
|
||||
}
|
||||
}
|
||||
|
||||
private ulong GetPhysicalAddressChecked(ulong va)
|
||||
private nuint GetPhysicalAddressChecked(ulong va)
|
||||
{
|
||||
if (!IsMapped(va))
|
||||
{
|
||||
|
@ -851,9 +363,9 @@ namespace Ryujinx.Cpu.AppleHv
|
|||
return GetPhysicalAddressInternal(va);
|
||||
}
|
||||
|
||||
private ulong GetPhysicalAddressInternal(ulong va)
|
||||
private nuint GetPhysicalAddressInternal(ulong va)
|
||||
{
|
||||
return _pageTable.Read(va) + (va & PageMask);
|
||||
return (nuint)(_pageTable.Read(va) + (va & PageMask));
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
|
@ -864,10 +376,17 @@ namespace Ryujinx.Cpu.AppleHv
|
|||
_addressSpace.Dispose();
|
||||
}
|
||||
|
||||
protected override Span<byte> GetPhysicalAddressSpan(ulong pa, int size)
|
||||
protected override Memory<byte> GetPhysicalAddressMemory(nuint pa, int size)
|
||||
=> _backingMemory.GetMemory(pa, size);
|
||||
|
||||
protected override Span<byte> GetPhysicalAddressSpan(nuint pa, int size)
|
||||
=> _backingMemory.GetSpan(pa, size);
|
||||
|
||||
protected override ulong TranslateVirtualAddressForRead(ulong va)
|
||||
protected override nuint TranslateVirtualAddressChecked(ulong va)
|
||||
=> GetPhysicalAddressChecked(va);
|
||||
|
||||
protected override nuint TranslateVirtualAddressUnchecked(ulong va)
|
||||
=> GetPhysicalAddressInternal(va);
|
||||
|
||||
}
|
||||
}
|
||||
|
|
|
@ -28,8 +28,9 @@ namespace Ryujinx.Cpu
|
|||
/// <param name="address">CPU virtual address of the region</param>
|
||||
/// <param name="size">Size of the region</param>
|
||||
/// <param name="id">Handle ID</param>
|
||||
/// <param name="flags">Region flags</param>
|
||||
/// <returns>The memory tracking handle</returns>
|
||||
RegionHandle BeginTracking(ulong address, ulong size, int id);
|
||||
RegionHandle BeginTracking(ulong address, ulong size, int id, RegionFlags flags = RegionFlags.None);
|
||||
|
||||
/// <summary>
|
||||
/// Obtains a memory tracking handle for the given virtual region, with a specified granularity. This should be disposed when finished with.
|
||||
|
@ -39,8 +40,9 @@ namespace Ryujinx.Cpu
|
|||
/// <param name="handles">Handles to inherit state from or reuse. When none are present, provide null</param>
|
||||
/// <param name="granularity">Desired granularity of write tracking</param>
|
||||
/// <param name="id">Handle ID</param>
|
||||
/// <param name="flags">Region flags</param>
|
||||
/// <returns>The memory tracking handle</returns>
|
||||
MultiRegionHandle BeginGranularTracking(ulong address, ulong size, IEnumerable<IRegionHandle> handles, ulong granularity, int id);
|
||||
MultiRegionHandle BeginGranularTracking(ulong address, ulong size, IEnumerable<IRegionHandle> handles, ulong granularity, int id, RegionFlags flags = RegionFlags.None);
|
||||
|
||||
/// <summary>
|
||||
/// Obtains a smart memory tracking handle for the given virtual region, with a specified granularity. This should be disposed when finished with.
|
||||
|
|
|
@ -0,0 +1,35 @@
|
|||
using Ryujinx.Common.Collections;
|
||||
using System;
|
||||
|
||||
namespace Ryujinx.Cpu.Jit.HostTracked
|
||||
{
|
||||
internal class AddressIntrusiveRedBlackTree<T> : IntrusiveRedBlackTree<T> where T : IntrusiveRedBlackTreeNode<T>, IComparable<T>, IComparable<ulong>
|
||||
{
|
||||
/// <summary>
|
||||
/// Retrieve the node that is considered equal to the specified address by the comparator.
|
||||
/// </summary>
|
||||
/// <param name="address">Address to compare with</param>
|
||||
/// <returns>Node that is equal to <paramref name="address"/></returns>
|
||||
public T GetNode(ulong address)
|
||||
{
|
||||
T node = Root;
|
||||
while (node != null)
|
||||
{
|
||||
int cmp = node.CompareTo(address);
|
||||
if (cmp < 0)
|
||||
{
|
||||
node = node.Left;
|
||||
}
|
||||
else if (cmp > 0)
|
||||
{
|
||||
node = node.Right;
|
||||
}
|
||||
else
|
||||
{
|
||||
return node;
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
}
|
||||
}
|
708
src/Ryujinx.Cpu/Jit/HostTracked/AddressSpacePartition.cs
Normal file
|
@ -0,0 +1,708 @@
|
|||
using Ryujinx.Common;
|
||||
using Ryujinx.Common.Collections;
|
||||
using Ryujinx.Memory;
|
||||
using System;
|
||||
using System.Diagnostics;
|
||||
using System.Threading;
|
||||
|
||||
namespace Ryujinx.Cpu.Jit.HostTracked
|
||||
{
|
||||
readonly struct PrivateRange
|
||||
{
|
||||
public readonly MemoryBlock Memory;
|
||||
public readonly ulong Offset;
|
||||
public readonly ulong Size;
|
||||
|
||||
public static PrivateRange Empty => new(null, 0, 0);
|
||||
|
||||
public PrivateRange(MemoryBlock memory, ulong offset, ulong size)
|
||||
{
|
||||
Memory = memory;
|
||||
Offset = offset;
|
||||
Size = size;
|
||||
}
|
||||
}
|
||||
|
||||
class AddressSpacePartition : IDisposable
|
||||
{
|
||||
public const ulong GuestPageSize = 0x1000;
|
||||
|
||||
private const int DefaultBlockAlignment = 1 << 20;
|
||||
|
||||
private enum MappingType : byte
|
||||
{
|
||||
None,
|
||||
Private,
|
||||
}
|
||||
|
||||
private class Mapping : IntrusiveRedBlackTreeNode<Mapping>, IComparable<Mapping>, IComparable<ulong>
|
||||
{
|
||||
public ulong Address { get; private set; }
|
||||
public ulong Size { get; private set; }
|
||||
public ulong EndAddress => Address + Size;
|
||||
public MappingType Type { get; private set; }
|
||||
|
||||
public Mapping(ulong address, ulong size, MappingType type)
|
||||
{
|
||||
Address = address;
|
||||
Size = size;
|
||||
Type = type;
|
||||
}
|
||||
|
||||
public Mapping Split(ulong splitAddress)
|
||||
{
|
||||
ulong leftSize = splitAddress - Address;
|
||||
ulong rightSize = EndAddress - splitAddress;
|
||||
|
||||
Mapping left = new(Address, leftSize, Type);
|
||||
|
||||
Address = splitAddress;
|
||||
Size = rightSize;
|
||||
|
||||
return left;
|
||||
}
|
||||
|
||||
public void UpdateState(MappingType newType)
|
||||
{
|
||||
Type = newType;
|
||||
}
|
||||
|
||||
public void Extend(ulong sizeDelta)
|
||||
{
|
||||
Size += sizeDelta;
|
||||
}
|
||||
|
||||
public int CompareTo(Mapping other)
|
||||
{
|
||||
if (Address < other.Address)
|
||||
{
|
||||
return -1;
|
||||
}
|
||||
else if (Address <= other.EndAddress - 1UL)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
else
|
||||
{
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
|
||||
public int CompareTo(ulong address)
|
||||
{
|
||||
if (address < Address)
|
||||
{
|
||||
return -1;
|
||||
}
|
||||
else if (address <= EndAddress - 1UL)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
else
|
||||
{
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private class PrivateMapping : IntrusiveRedBlackTreeNode<PrivateMapping>, IComparable<PrivateMapping>, IComparable<ulong>
|
||||
{
|
||||
public ulong Address { get; private set; }
|
||||
public ulong Size { get; private set; }
|
||||
public ulong EndAddress => Address + Size;
|
||||
public PrivateMemoryAllocation PrivateAllocation { get; private set; }
|
||||
|
||||
public PrivateMapping(ulong address, ulong size, PrivateMemoryAllocation privateAllocation)
|
||||
{
|
||||
Address = address;
|
||||
Size = size;
|
||||
PrivateAllocation = privateAllocation;
|
||||
}
|
||||
|
||||
public PrivateMapping Split(ulong splitAddress)
|
||||
{
|
||||
ulong leftSize = splitAddress - Address;
|
||||
ulong rightSize = EndAddress - splitAddress;
|
||||
|
||||
Debug.Assert(leftSize > 0);
|
||||
Debug.Assert(rightSize > 0);
|
||||
|
||||
(var leftAllocation, PrivateAllocation) = PrivateAllocation.Split(leftSize);
|
||||
|
||||
PrivateMapping left = new(Address, leftSize, leftAllocation);
|
||||
|
||||
Address = splitAddress;
|
||||
Size = rightSize;
|
||||
|
||||
return left;
|
||||
}
|
||||
|
||||
public void Map(AddressSpacePartitionMultiAllocation baseBlock, ulong baseAddress, PrivateMemoryAllocation newAllocation)
|
||||
{
|
||||
baseBlock.MapView(newAllocation.Memory, newAllocation.Offset, Address - baseAddress, Size);
|
||||
PrivateAllocation = newAllocation;
|
||||
}
|
||||
|
||||
public void Unmap(AddressSpacePartitionMultiAllocation baseBlock, ulong baseAddress)
|
||||
{
|
||||
if (PrivateAllocation.IsValid)
|
||||
{
|
||||
baseBlock.UnmapView(PrivateAllocation.Memory, Address - baseAddress, Size);
|
||||
PrivateAllocation.Dispose();
|
||||
}
|
||||
|
||||
PrivateAllocation = default;
|
||||
}
|
||||
|
||||
public void Extend(ulong sizeDelta)
|
||||
{
|
||||
Size += sizeDelta;
|
||||
}
|
||||
|
||||
public int CompareTo(PrivateMapping other)
|
||||
{
|
||||
if (Address < other.Address)
|
||||
{
|
||||
return -1;
|
||||
}
|
||||
else if (Address <= other.EndAddress - 1UL)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
else
|
||||
{
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
|
||||
public int CompareTo(ulong address)
|
||||
{
|
||||
if (address < Address)
|
||||
{
|
||||
return -1;
|
||||
}
|
||||
else if (address <= EndAddress - 1UL)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
else
|
||||
{
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private readonly MemoryBlock _backingMemory;
|
||||
private readonly AddressSpacePartitionMultiAllocation _baseMemory;
|
||||
private readonly PrivateMemoryAllocator _privateMemoryAllocator;
|
||||
|
||||
private readonly AddressIntrusiveRedBlackTree<Mapping> _mappingTree;
|
||||
private readonly AddressIntrusiveRedBlackTree<PrivateMapping> _privateTree;
|
||||
|
||||
private readonly ReaderWriterLockSlim _treeLock;
|
||||
|
||||
private readonly ulong _hostPageSize;
|
||||
|
||||
private ulong? _firstPagePa;
|
||||
private ulong? _lastPagePa;
|
||||
private ulong _cachedFirstPagePa;
|
||||
private ulong _cachedLastPagePa;
|
||||
private MemoryBlock _firstPageMemoryForUnmap;
|
||||
private ulong _firstPageOffsetForLateMap;
|
||||
private MemoryPermission _firstPageMemoryProtection;
|
||||
|
||||
public ulong Address { get; }
|
||||
public ulong Size { get; }
|
||||
public ulong EndAddress => Address + Size;
|
||||
|
||||
public AddressSpacePartition(AddressSpacePartitionAllocation baseMemory, MemoryBlock backingMemory, ulong address, ulong size)
|
||||
{
|
||||
_privateMemoryAllocator = new PrivateMemoryAllocator(DefaultBlockAlignment, MemoryAllocationFlags.Mirrorable);
|
||||
_mappingTree = new AddressIntrusiveRedBlackTree<Mapping>();
|
||||
_privateTree = new AddressIntrusiveRedBlackTree<PrivateMapping>();
|
||||
_treeLock = new ReaderWriterLockSlim();
|
||||
|
||||
_mappingTree.Add(new Mapping(address, size, MappingType.None));
|
||||
_privateTree.Add(new PrivateMapping(address, size, default));
|
||||
|
||||
_hostPageSize = MemoryBlock.GetPageSize();
|
||||
|
||||
_backingMemory = backingMemory;
|
||||
_baseMemory = new(baseMemory);
|
||||
|
||||
_cachedFirstPagePa = ulong.MaxValue;
|
||||
_cachedLastPagePa = ulong.MaxValue;
|
||||
|
||||
Address = address;
|
||||
Size = size;
|
||||
}
|
||||
|
||||
public bool IsEmpty()
|
||||
{
|
||||
_treeLock.EnterReadLock();
|
||||
|
||||
try
|
||||
{
|
||||
Mapping map = _mappingTree.GetNode(Address);
|
||||
|
||||
return map != null && map.Address == Address && map.Size == Size && map.Type == MappingType.None;
|
||||
}
|
||||
finally
|
||||
{
|
||||
_treeLock.ExitReadLock();
|
||||
}
|
||||
}
|
||||
|
||||
public void Map(ulong va, ulong pa, ulong size)
|
||||
{
|
||||
Debug.Assert(va >= Address);
|
||||
Debug.Assert(va + size <= EndAddress);
|
||||
|
||||
if (va == Address)
|
||||
{
|
||||
_firstPagePa = pa;
|
||||
}
|
||||
|
||||
if (va <= EndAddress - GuestPageSize && va + size > EndAddress - GuestPageSize)
|
||||
{
|
||||
_lastPagePa = pa + ((EndAddress - GuestPageSize) - va);
|
||||
}
|
||||
|
||||
Update(va, pa, size, MappingType.Private);
|
||||
}
|
||||
|
||||
public void Unmap(ulong va, ulong size)
|
||||
{
|
||||
Debug.Assert(va >= Address);
|
||||
Debug.Assert(va + size <= EndAddress);
|
||||
|
||||
if (va == Address)
|
||||
{
|
||||
_firstPagePa = null;
|
||||
}
|
||||
|
||||
if (va <= EndAddress - GuestPageSize && va + size > EndAddress - GuestPageSize)
|
||||
{
|
||||
_lastPagePa = null;
|
||||
}
|
||||
|
||||
Update(va, 0UL, size, MappingType.None);
|
||||
}
|
||||
|
||||
public void ReprotectAligned(ulong va, ulong size, MemoryPermission protection)
|
||||
{
|
||||
Debug.Assert(va >= Address);
|
||||
Debug.Assert(va + size <= EndAddress);
|
||||
|
||||
_baseMemory.Reprotect(va - Address, size, protection, false);
|
||||
|
||||
if (va == Address)
|
||||
{
|
||||
_firstPageMemoryProtection = protection;
|
||||
}
|
||||
}
|
||||
|
||||
public void Reprotect(
|
||||
ulong va,
|
||||
ulong size,
|
||||
MemoryPermission protection,
|
||||
AddressSpacePartitioned addressSpace,
|
||||
Action<ulong, IntPtr, ulong> updatePtCallback)
|
||||
{
|
||||
if (_baseMemory.LazyInitMirrorForProtection(addressSpace, Address, Size, protection))
|
||||
{
|
||||
LateMap();
|
||||
}
|
||||
|
||||
updatePtCallback(va, _baseMemory.GetPointerForProtection(va - Address, size, protection), size);
|
||||
}
|
||||
|
||||
public IntPtr GetPointer(ulong va, ulong size)
|
||||
{
|
||||
Debug.Assert(va >= Address);
|
||||
Debug.Assert(va + size <= EndAddress);
|
||||
|
||||
return _baseMemory.GetPointer(va - Address, size);
|
||||
}
|
||||
|
||||
public void InsertBridgeAtEnd(AddressSpacePartition partitionAfter, bool useProtectionMirrors)
|
||||
{
|
||||
ulong firstPagePa = partitionAfter?._firstPagePa ?? ulong.MaxValue;
|
||||
ulong lastPagePa = _lastPagePa ?? ulong.MaxValue;
|
||||
|
||||
if (firstPagePa != _cachedFirstPagePa || lastPagePa != _cachedLastPagePa)
|
||||
{
|
||||
if (partitionAfter != null && partitionAfter._firstPagePa.HasValue)
|
||||
{
|
||||
(MemoryBlock firstPageMemory, ulong firstPageOffset) = partitionAfter.GetFirstPageMemoryAndOffset();
|
||||
|
||||
_baseMemory.MapView(firstPageMemory, firstPageOffset, Size, _hostPageSize);
|
||||
|
||||
if (!useProtectionMirrors)
|
||||
{
|
||||
_baseMemory.Reprotect(Size, _hostPageSize, partitionAfter._firstPageMemoryProtection, throwOnFail: false);
|
||||
}
|
||||
|
||||
_firstPageMemoryForUnmap = firstPageMemory;
|
||||
_firstPageOffsetForLateMap = firstPageOffset;
|
||||
}
|
||||
else
|
||||
{
|
||||
MemoryBlock firstPageMemoryForUnmap = _firstPageMemoryForUnmap;
|
||||
|
||||
if (firstPageMemoryForUnmap != null)
|
||||
{
|
||||
_baseMemory.UnmapView(firstPageMemoryForUnmap, Size, _hostPageSize);
|
||||
_firstPageMemoryForUnmap = null;
|
||||
}
|
||||
}
|
||||
|
||||
_cachedFirstPagePa = firstPagePa;
|
||||
_cachedLastPagePa = lastPagePa;
|
||||
}
|
||||
}
|
||||
|
||||
public void ReprotectBridge(MemoryPermission protection)
|
||||
{
|
||||
if (_firstPageMemoryForUnmap != null)
|
||||
{
|
||||
_baseMemory.Reprotect(Size, _hostPageSize, protection, throwOnFail: false);
|
||||
}
|
||||
}
|
||||
|
||||
private (MemoryBlock, ulong) GetFirstPageMemoryAndOffset()
|
||||
{
|
||||
_treeLock.EnterReadLock();
|
||||
|
||||
try
|
||||
{
|
||||
PrivateMapping map = _privateTree.GetNode(Address);
|
||||
|
||||
if (map != null && map.PrivateAllocation.IsValid)
|
||||
{
|
||||
return (map.PrivateAllocation.Memory, map.PrivateAllocation.Offset + (Address - map.Address));
|
||||
}
|
||||
}
|
||||
finally
|
||||
{
|
||||
_treeLock.ExitReadLock();
|
||||
}
|
||||
|
||||
return (_backingMemory, _firstPagePa.Value);
|
||||
}
|
||||
|
||||
public PrivateRange GetPrivateAllocation(ulong va)
|
||||
{
|
||||
_treeLock.EnterReadLock();
|
||||
|
||||
try
|
||||
{
|
||||
PrivateMapping map = _privateTree.GetNode(va);
|
||||
|
||||
if (map != null && map.PrivateAllocation.IsValid)
|
||||
{
|
||||
return new(map.PrivateAllocation.Memory, map.PrivateAllocation.Offset + (va - map.Address), map.Size - (va - map.Address));
|
||||
}
|
||||
}
|
||||
finally
|
||||
{
|
||||
_treeLock.ExitReadLock();
|
||||
}
|
||||
|
||||
return PrivateRange.Empty;
|
||||
}
|
||||
|
||||
private void Update(ulong va, ulong pa, ulong size, MappingType type)
|
||||
{
|
||||
_treeLock.EnterWriteLock();
|
||||
|
||||
try
|
||||
{
|
||||
Mapping map = _mappingTree.GetNode(va);
|
||||
|
||||
Update(map, va, pa, size, type);
|
||||
}
|
||||
finally
|
||||
{
|
||||
_treeLock.ExitWriteLock();
|
||||
}
|
||||
}
|
||||
|
||||
private Mapping Update(Mapping map, ulong va, ulong pa, ulong size, MappingType type)
|
||||
{
|
||||
ulong endAddress = va + size;
|
||||
|
||||
for (; map != null; map = map.Successor)
|
||||
{
|
||||
if (map.Address < va)
|
||||
{
|
||||
_mappingTree.Add(map.Split(va));
|
||||
}
|
||||
|
||||
if (map.EndAddress > endAddress)
|
||||
{
|
||||
Mapping newMap = map.Split(endAddress);
|
||||
_mappingTree.Add(newMap);
|
||||
map = newMap;
|
||||
}
|
||||
|
||||
switch (type)
|
||||
{
|
||||
case MappingType.None:
|
||||
ulong alignment = _hostPageSize;
|
||||
|
||||
bool unmappedBefore = map.Predecessor == null ||
|
||||
(map.Predecessor.Type == MappingType.None && map.Predecessor.Address <= BitUtils.AlignDown(va, alignment));
|
||||
|
||||
bool unmappedAfter = map.Successor == null ||
|
||||
(map.Successor.Type == MappingType.None && map.Successor.EndAddress >= BitUtils.AlignUp(endAddress, alignment));
|
||||
|
||||
UnmapPrivate(va, size, unmappedBefore, unmappedAfter);
|
||||
break;
|
||||
case MappingType.Private:
|
||||
MapPrivate(va, size);
|
||||
break;
|
||||
}
|
||||
|
||||
map.UpdateState(type);
|
||||
map = TryCoalesce(map);
|
||||
|
||||
if (map.EndAddress >= endAddress)
|
||||
{
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
return map;
|
||||
}
|
||||
|
||||
private Mapping TryCoalesce(Mapping map)
|
||||
{
|
||||
Mapping previousMap = map.Predecessor;
|
||||
Mapping nextMap = map.Successor;
|
||||
|
||||
if (previousMap != null && CanCoalesce(previousMap, map))
|
||||
{
|
||||
previousMap.Extend(map.Size);
|
||||
_mappingTree.Remove(map);
|
||||
map = previousMap;
|
||||
}
|
||||
|
||||
if (nextMap != null && CanCoalesce(map, nextMap))
|
||||
{
|
||||
map.Extend(nextMap.Size);
|
||||
_mappingTree.Remove(nextMap);
|
||||
}
|
||||
|
||||
return map;
|
||||
}
|
||||
|
||||
private static bool CanCoalesce(Mapping left, Mapping right)
|
||||
{
|
||||
return left.Type == right.Type;
|
||||
}
|
||||
|
||||
private void MapPrivate(ulong va, ulong size)
|
||||
{
|
||||
ulong endAddress = va + size;
|
||||
|
||||
ulong alignment = _hostPageSize;
|
||||
|
||||
// Expand the range outwards based on page size to ensure that at least the requested region is mapped.
|
||||
ulong vaAligned = BitUtils.AlignDown(va, alignment);
|
||||
ulong endAddressAligned = BitUtils.AlignUp(endAddress, alignment);
|
||||
|
||||
PrivateMapping map = _privateTree.GetNode(va);
|
||||
|
||||
for (; map != null; map = map.Successor)
|
||||
{
|
||||
if (!map.PrivateAllocation.IsValid)
|
||||
{
|
||||
if (map.Address < vaAligned)
|
||||
{
|
||||
_privateTree.Add(map.Split(vaAligned));
|
||||
}
|
||||
|
||||
if (map.EndAddress > endAddressAligned)
|
||||
{
|
||||
PrivateMapping newMap = map.Split(endAddressAligned);
|
||||
_privateTree.Add(newMap);
|
||||
map = newMap;
|
||||
}
|
||||
|
||||
map.Map(_baseMemory, Address, _privateMemoryAllocator.Allocate(map.Size, _hostPageSize));
|
||||
}
|
||||
|
||||
if (map.EndAddress >= endAddressAligned)
|
||||
{
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private void UnmapPrivate(ulong va, ulong size, bool unmappedBefore, bool unmappedAfter)
|
||||
{
|
||||
ulong endAddress = va + size;
|
||||
|
||||
ulong alignment = _hostPageSize;
|
||||
|
||||
// If the adjacent mappings are unmapped, expand the range outwards,
|
||||
// otherwise shrink it inwards. We must ensure we won't unmap pages that might still be in use.
|
||||
ulong vaAligned = unmappedBefore ? BitUtils.AlignDown(va, alignment) : BitUtils.AlignUp(va, alignment);
|
||||
ulong endAddressAligned = unmappedAfter ? BitUtils.AlignUp(endAddress, alignment) : BitUtils.AlignDown(endAddress, alignment);
|
||||
|
||||
if (endAddressAligned <= vaAligned)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
PrivateMapping map = _privateTree.GetNode(vaAligned);
|
||||
|
||||
for (; map != null; map = map.Successor)
|
||||
{
|
||||
if (map.PrivateAllocation.IsValid)
|
||||
{
|
||||
if (map.Address < vaAligned)
|
||||
{
|
||||
_privateTree.Add(map.Split(vaAligned));
|
||||
}
|
||||
|
||||
if (map.EndAddress > endAddressAligned)
|
||||
{
|
||||
PrivateMapping newMap = map.Split(endAddressAligned);
|
||||
_privateTree.Add(newMap);
|
||||
map = newMap;
|
||||
}
|
||||
|
||||
map.Unmap(_baseMemory, Address);
|
||||
map = TryCoalesce(map);
|
||||
}
|
||||
|
||||
if (map.EndAddress >= endAddressAligned)
|
||||
{
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private PrivateMapping TryCoalesce(PrivateMapping map)
|
||||
{
|
||||
PrivateMapping previousMap = map.Predecessor;
|
||||
PrivateMapping nextMap = map.Successor;
|
||||
|
||||
if (previousMap != null && CanCoalesce(previousMap, map))
|
||||
{
|
||||
previousMap.Extend(map.Size);
|
||||
_privateTree.Remove(map);
|
||||
map = previousMap;
|
||||
}
|
||||
|
||||
if (nextMap != null && CanCoalesce(map, nextMap))
|
||||
{
|
||||
map.Extend(nextMap.Size);
|
||||
_privateTree.Remove(nextMap);
|
||||
}
|
||||
|
||||
return map;
|
||||
}
|
||||
|
||||
private static bool CanCoalesce(PrivateMapping left, PrivateMapping right)
|
||||
{
|
||||
return !left.PrivateAllocation.IsValid && !right.PrivateAllocation.IsValid;
|
||||
}
|
||||
|
||||
private void LateMap()
|
||||
{
|
||||
// Map all existing private allocations.
|
||||
// This is necessary to ensure mirrors that are lazily created have the same mappings as the main one.
|
||||
|
||||
PrivateMapping map = _privateTree.GetNode(Address);
|
||||
|
||||
for (; map != null; map = map.Successor)
|
||||
{
|
||||
if (map.PrivateAllocation.IsValid)
|
||||
{
|
||||
_baseMemory.LateMapView(map.PrivateAllocation.Memory, map.PrivateAllocation.Offset, map.Address - Address, map.Size);
|
||||
}
|
||||
}
|
||||
|
||||
MemoryBlock firstPageMemory = _firstPageMemoryForUnmap;
|
||||
ulong firstPageOffset = _firstPageOffsetForLateMap;
|
||||
|
||||
if (firstPageMemory != null)
|
||||
{
|
||||
_baseMemory.LateMapView(firstPageMemory, firstPageOffset, Size, _hostPageSize);
|
||||
}
|
||||
}
|
||||
|
||||
public PrivateRange GetFirstPrivateAllocation(ulong va, ulong size, out ulong nextVa)
|
||||
{
|
||||
_treeLock.EnterReadLock();
|
||||
|
||||
try
|
||||
{
|
||||
PrivateMapping map = _privateTree.GetNode(va);
|
||||
|
||||
nextVa = map.EndAddress;
|
||||
|
||||
if (map != null && map.PrivateAllocation.IsValid)
|
||||
{
|
||||
ulong startOffset = va - map.Address;
|
||||
|
||||
return new(
|
||||
map.PrivateAllocation.Memory,
|
||||
map.PrivateAllocation.Offset + startOffset,
|
||||
Math.Min(map.PrivateAllocation.Size - startOffset, size));
|
||||
}
|
||||
}
|
||||
finally
|
||||
{
|
||||
_treeLock.ExitReadLock();
|
||||
}
|
||||
|
||||
return PrivateRange.Empty;
|
||||
}
|
||||
|
||||
public bool HasPrivateAllocation(ulong va, ulong size, ulong startVa, ulong startSize, ref PrivateRange range)
|
||||
{
|
||||
ulong endVa = va + size;
|
||||
|
||||
_treeLock.EnterReadLock();
|
||||
|
||||
try
|
||||
{
|
||||
for (PrivateMapping map = _privateTree.GetNode(va); map != null && map.Address < endVa; map = map.Successor)
|
||||
{
|
||||
if (map.PrivateAllocation.IsValid)
|
||||
{
|
||||
if (map.Address <= startVa && map.EndAddress >= startVa + startSize)
|
||||
{
|
||||
ulong startOffset = startVa - map.Address;
|
||||
|
||||
range = new(
|
||||
map.PrivateAllocation.Memory,
|
||||
map.PrivateAllocation.Offset + startOffset,
|
||||
Math.Min(map.PrivateAllocation.Size - startOffset, startSize));
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
finally
|
||||
{
|
||||
_treeLock.ExitReadLock();
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
public void Dispose()
|
||||
{
|
||||
GC.SuppressFinalize(this);
|
||||
|
||||
_privateMemoryAllocator.Dispose();
|
||||
_baseMemory.Dispose();
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,202 @@
|
|||
using Ryujinx.Common;
|
||||
using Ryujinx.Common.Collections;
|
||||
using Ryujinx.Memory;
|
||||
using Ryujinx.Memory.Tracking;
|
||||
using System;
|
||||
|
||||
namespace Ryujinx.Cpu.Jit.HostTracked
|
||||
{
|
||||
readonly struct AddressSpacePartitionAllocation : IDisposable
|
||||
{
|
||||
private readonly AddressSpacePartitionAllocator _owner;
|
||||
private readonly PrivateMemoryAllocatorImpl<AddressSpacePartitionAllocator.Block>.Allocation _allocation;
|
||||
|
||||
public IntPtr Pointer => (IntPtr)((ulong)_allocation.Block.Memory.Pointer + _allocation.Offset);
|
||||
|
||||
public bool IsValid => _owner != null;
|
||||
|
||||
public AddressSpacePartitionAllocation(
|
||||
AddressSpacePartitionAllocator owner,
|
||||
PrivateMemoryAllocatorImpl<AddressSpacePartitionAllocator.Block>.Allocation allocation)
|
||||
{
|
||||
_owner = owner;
|
||||
_allocation = allocation;
|
||||
}
|
||||
|
||||
public void RegisterMapping(ulong va, ulong endVa)
|
||||
{
|
||||
_allocation.Block.AddMapping(_allocation.Offset, _allocation.Size, va, endVa);
|
||||
}
|
||||
|
||||
public void MapView(MemoryBlock srcBlock, ulong srcOffset, ulong dstOffset, ulong size)
|
||||
{
|
||||
_allocation.Block.Memory.MapView(srcBlock, srcOffset, _allocation.Offset + dstOffset, size);
|
||||
}
|
||||
|
||||
public void UnmapView(MemoryBlock srcBlock, ulong offset, ulong size)
|
||||
{
|
||||
_allocation.Block.Memory.UnmapView(srcBlock, _allocation.Offset + offset, size);
|
||||
}
|
||||
|
||||
public void Reprotect(ulong offset, ulong size, MemoryPermission permission, bool throwOnFail)
|
||||
{
|
||||
_allocation.Block.Memory.Reprotect(_allocation.Offset + offset, size, permission, throwOnFail);
|
||||
}
|
||||
|
||||
public IntPtr GetPointer(ulong offset, ulong size)
|
||||
{
|
||||
return _allocation.Block.Memory.GetPointer(_allocation.Offset + offset, size);
|
||||
}
|
||||
|
||||
public void Dispose()
|
||||
{
|
||||
_allocation.Block.RemoveMapping(_allocation.Offset, _allocation.Size);
|
||||
_owner.Free(_allocation.Block, _allocation.Offset, _allocation.Size);
|
||||
}
|
||||
}
|
||||
|
||||
class AddressSpacePartitionAllocator : PrivateMemoryAllocatorImpl<AddressSpacePartitionAllocator.Block>
|
||||
{
|
||||
private const ulong DefaultBlockAlignment = 1UL << 32; // 4GB
|
||||
|
||||
public class Block : PrivateMemoryAllocator.Block
|
||||
{
|
||||
private readonly MemoryTracking _tracking;
|
||||
private readonly Func<ulong, ulong> _readPtCallback;
|
||||
private readonly MemoryEhMeilleure _memoryEh;
|
||||
|
||||
private class Mapping : IntrusiveRedBlackTreeNode<Mapping>, IComparable<Mapping>, IComparable<ulong>
|
||||
{
|
||||
public ulong Address { get; }
|
||||
public ulong Size { get; }
|
||||
public ulong EndAddress => Address + Size;
|
||||
public ulong Va { get; }
|
||||
public ulong EndVa { get; }
|
||||
|
||||
public Mapping(ulong address, ulong size, ulong va, ulong endVa)
|
||||
{
|
||||
Address = address;
|
||||
Size = size;
|
||||
Va = va;
|
||||
EndVa = endVa;
|
||||
}
|
||||
|
||||
public int CompareTo(Mapping other)
|
||||
{
|
||||
if (Address < other.Address)
|
||||
{
|
||||
return -1;
|
||||
}
|
||||
else if (Address <= other.EndAddress - 1UL)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
else
|
||||
{
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
|
||||
public int CompareTo(ulong address)
|
||||
{
|
||||
if (address < Address)
|
||||
{
|
||||
return -1;
|
||||
}
|
||||
else if (address <= EndAddress - 1UL)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
else
|
||||
{
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private readonly AddressIntrusiveRedBlackTree<Mapping> _mappingTree;
|
||||
private readonly object _lock;
|
||||
|
||||
public Block(MemoryTracking tracking, Func<ulong, ulong> readPtCallback, MemoryBlock memory, ulong size, object locker) : base(memory, size)
|
||||
{
|
||||
_tracking = tracking;
|
||||
_readPtCallback = readPtCallback;
|
||||
_memoryEh = new(memory, null, tracking, VirtualMemoryEvent);
|
||||
_mappingTree = new();
|
||||
_lock = locker;
|
||||
}
|
||||
|
||||
public void AddMapping(ulong offset, ulong size, ulong va, ulong endVa)
|
||||
{
|
||||
_mappingTree.Add(new(offset, size, va, endVa));
|
||||
}
|
||||
|
||||
public void RemoveMapping(ulong offset, ulong size)
|
||||
{
|
||||
_mappingTree.Remove(_mappingTree.GetNode(offset));
|
||||
}
|
||||
|
||||
private ulong VirtualMemoryEvent(ulong address, ulong size, bool write)
|
||||
{
|
||||
Mapping map;
|
||||
|
||||
lock (_lock)
|
||||
{
|
||||
map = _mappingTree.GetNode(address);
|
||||
}
|
||||
|
||||
if (map == null)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
address -= map.Address;
|
||||
|
||||
ulong addressAligned = BitUtils.AlignDown(address, AddressSpacePartition.GuestPageSize);
|
||||
ulong endAddressAligned = BitUtils.AlignUp(address + size, AddressSpacePartition.GuestPageSize);
|
||||
ulong sizeAligned = endAddressAligned - addressAligned;
|
||||
|
||||
if (!_tracking.VirtualMemoryEvent(map.Va + addressAligned, sizeAligned, write))
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
return _readPtCallback(map.Va + address);
|
||||
}
|
||||
|
||||
public override void Destroy()
|
||||
{
|
||||
_memoryEh.Dispose();
|
||||
|
||||
base.Destroy();
|
||||
}
|
||||
}
|
||||
|
||||
private readonly MemoryTracking _tracking;
|
||||
private readonly Func<ulong, ulong> _readPtCallback;
|
||||
private readonly object _lock;
|
||||
|
||||
public AddressSpacePartitionAllocator(
|
||||
MemoryTracking tracking,
|
||||
Func<ulong, ulong> readPtCallback,
|
||||
object locker) : base(DefaultBlockAlignment, MemoryAllocationFlags.Reserve | MemoryAllocationFlags.ViewCompatible)
|
||||
{
|
||||
_tracking = tracking;
|
||||
_readPtCallback = readPtCallback;
|
||||
_lock = locker;
|
||||
}
|
||||
|
||||
public AddressSpacePartitionAllocation Allocate(ulong va, ulong size)
|
||||
{
|
||||
AddressSpacePartitionAllocation allocation = new(this, Allocate(size, MemoryBlock.GetPageSize(), CreateBlock));
|
||||
allocation.RegisterMapping(va, va + size);
|
||||
|
||||
return allocation;
|
||||
}
|
||||
|
||||
private Block CreateBlock(MemoryBlock memory, ulong size)
|
||||
{
|
||||
return new Block(_tracking, _readPtCallback, memory, size, _lock);
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,101 @@
|
|||
using Ryujinx.Memory;
|
||||
using System;
|
||||
using System.Diagnostics;
|
||||
|
||||
namespace Ryujinx.Cpu.Jit.HostTracked
|
||||
{
|
||||
class AddressSpacePartitionMultiAllocation : IDisposable
|
||||
{
|
||||
private readonly AddressSpacePartitionAllocation _baseMemory;
|
||||
private AddressSpacePartitionAllocation _baseMemoryRo;
|
||||
private AddressSpacePartitionAllocation _baseMemoryNone;
|
||||
|
||||
public AddressSpacePartitionMultiAllocation(AddressSpacePartitionAllocation baseMemory)
|
||||
{
|
||||
_baseMemory = baseMemory;
|
||||
}
|
||||
|
||||
public void MapView(MemoryBlock srcBlock, ulong srcOffset, ulong dstOffset, ulong size)
|
||||
{
|
||||
_baseMemory.MapView(srcBlock, srcOffset, dstOffset, size);
|
||||
|
||||
if (_baseMemoryRo.IsValid)
|
||||
{
|
||||
_baseMemoryRo.MapView(srcBlock, srcOffset, dstOffset, size);
|
||||
_baseMemoryRo.Reprotect(dstOffset, size, MemoryPermission.Read, false);
|
||||
}
|
||||
}
|
||||
|
||||
public void LateMapView(MemoryBlock srcBlock, ulong srcOffset, ulong dstOffset, ulong size)
|
||||
{
|
||||
_baseMemoryRo.MapView(srcBlock, srcOffset, dstOffset, size);
|
||||
_baseMemoryRo.Reprotect(dstOffset, size, MemoryPermission.Read, false);
|
||||
}
|
||||
|
||||
public void UnmapView(MemoryBlock srcBlock, ulong offset, ulong size)
|
||||
{
|
||||
_baseMemory.UnmapView(srcBlock, offset, size);
|
||||
|
||||
if (_baseMemoryRo.IsValid)
|
||||
{
|
||||
_baseMemoryRo.UnmapView(srcBlock, offset, size);
|
||||
}
|
||||
}
|
||||
|
||||
public void Reprotect(ulong offset, ulong size, MemoryPermission permission, bool throwOnFail)
|
||||
{
|
||||
_baseMemory.Reprotect(offset, size, permission, throwOnFail);
|
||||
}
|
||||
|
||||
public IntPtr GetPointer(ulong offset, ulong size)
|
||||
{
|
||||
return _baseMemory.GetPointer(offset, size);
|
||||
}
|
||||
|
||||
public bool LazyInitMirrorForProtection(AddressSpacePartitioned addressSpace, ulong blockAddress, ulong blockSize, MemoryPermission permission)
|
||||
{
|
||||
if (permission == MemoryPermission.None && !_baseMemoryNone.IsValid)
|
||||
{
|
||||
_baseMemoryNone = addressSpace.CreateAsPartitionAllocation(blockAddress, blockSize);
|
||||
}
|
||||
else if (permission == MemoryPermission.Read && !_baseMemoryRo.IsValid)
|
||||
{
|
||||
_baseMemoryRo = addressSpace.CreateAsPartitionAllocation(blockAddress, blockSize);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
public IntPtr GetPointerForProtection(ulong offset, ulong size, MemoryPermission permission)
|
||||
{
|
||||
AddressSpacePartitionAllocation allocation = permission switch
|
||||
{
|
||||
MemoryPermission.ReadAndWrite => _baseMemory,
|
||||
MemoryPermission.Read => _baseMemoryRo,
|
||||
MemoryPermission.None => _baseMemoryNone,
|
||||
_ => throw new ArgumentException($"Invalid protection \"{permission}\"."),
|
||||
};
|
||||
|
||||
Debug.Assert(allocation.IsValid);
|
||||
|
||||
return allocation.GetPointer(offset, size);
|
||||
}
|
||||
|
||||
public void Dispose()
|
||||
{
|
||||
_baseMemory.Dispose();
|
||||
|
||||
if (_baseMemoryRo.IsValid)
|
||||
{
|
||||
_baseMemoryRo.Dispose();
|
||||
}
|
||||
|
||||
if (_baseMemoryNone.IsValid)
|
||||
{
|
||||
_baseMemoryNone.Dispose();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
407
src/Ryujinx.Cpu/Jit/HostTracked/AddressSpacePartitioned.cs
Normal file
|
@ -0,0 +1,407 @@
|
|||
using Ryujinx.Common;
|
||||
using Ryujinx.Memory;
|
||||
using Ryujinx.Memory.Tracking;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Diagnostics;
|
||||
|
||||
namespace Ryujinx.Cpu.Jit.HostTracked
|
||||
{
|
||||
class AddressSpacePartitioned : IDisposable
|
||||
{
|
||||
private const int PartitionBits = 25;
|
||||
private const ulong PartitionSize = 1UL << PartitionBits;
|
||||
|
||||
private readonly MemoryBlock _backingMemory;
|
||||
private readonly List<AddressSpacePartition> _partitions;
|
||||
private readonly AddressSpacePartitionAllocator _asAllocator;
|
||||
private readonly Action<ulong, IntPtr, ulong> _updatePtCallback;
|
||||
private readonly bool _useProtectionMirrors;
|
||||
|
||||
public AddressSpacePartitioned(MemoryTracking tracking, MemoryBlock backingMemory, NativePageTable nativePageTable, bool useProtectionMirrors)
|
||||
{
|
||||
_backingMemory = backingMemory;
|
||||
_partitions = new();
|
||||
_asAllocator = new(tracking, nativePageTable.Read, _partitions);
|
||||
_updatePtCallback = nativePageTable.Update;
|
||||
_useProtectionMirrors = useProtectionMirrors;
|
||||
}
|
||||
|
||||
public void Map(ulong va, ulong pa, ulong size)
|
||||
{
|
||||
ulong endVa = va + size;
|
||||
|
||||
lock (_partitions)
|
||||
{
|
||||
EnsurePartitionsLocked(va, size);
|
||||
|
||||
while (va < endVa)
|
||||
{
|
||||
int partitionIndex = FindPartitionIndexLocked(va);
|
||||
AddressSpacePartition partition = _partitions[partitionIndex];
|
||||
|
||||
(ulong clampedVa, ulong clampedEndVa) = ClampRange(partition, va, endVa);
|
||||
|
||||
partition.Map(clampedVa, pa, clampedEndVa - clampedVa);
|
||||
|
||||
ulong currentSize = clampedEndVa - clampedVa;
|
||||
|
||||
va += currentSize;
|
||||
pa += currentSize;
|
||||
|
||||
InsertOrRemoveBridgeIfNeeded(partitionIndex);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public void Unmap(ulong va, ulong size)
|
||||
{
|
||||
ulong endVa = va + size;
|
||||
|
||||
while (va < endVa)
|
||||
{
|
||||
AddressSpacePartition partition;
|
||||
|
||||
lock (_partitions)
|
||||
{
|
||||
int partitionIndex = FindPartitionIndexLocked(va);
|
||||
if (partitionIndex < 0)
|
||||
{
|
||||
va += PartitionSize - (va & (PartitionSize - 1));
|
||||
|
||||
continue;
|
||||
}
|
||||
|
||||
partition = _partitions[partitionIndex];
|
||||
|
||||
(ulong clampedVa, ulong clampedEndVa) = ClampRange(partition, va, endVa);
|
||||
|
||||
partition.Unmap(clampedVa, clampedEndVa - clampedVa);
|
||||
|
||||
va += clampedEndVa - clampedVa;
|
||||
|
||||
InsertOrRemoveBridgeIfNeeded(partitionIndex);
|
||||
|
||||
if (partition.IsEmpty())
|
||||
{
|
||||
_partitions.Remove(partition);
|
||||
partition.Dispose();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public void Reprotect(ulong va, ulong size, MemoryPermission protection)
|
||||
{
|
||||
ulong endVa = va + size;
|
||||
|
||||
lock (_partitions)
|
||||
{
|
||||
while (va < endVa)
|
||||
{
|
||||
AddressSpacePartition partition = FindPartitionWithIndex(va, out int partitionIndex);
|
||||
|
||||
if (partition == null)
|
||||
{
|
||||
va += PartitionSize - (va & (PartitionSize - 1));
|
||||
|
||||
continue;
|
||||
}
|
||||
|
||||
(ulong clampedVa, ulong clampedEndVa) = ClampRange(partition, va, endVa);
|
||||
|
||||
if (_useProtectionMirrors)
|
||||
{
|
||||
partition.Reprotect(clampedVa, clampedEndVa - clampedVa, protection, this, _updatePtCallback);
|
||||
}
|
||||
else
|
||||
{
|
||||
partition.ReprotectAligned(clampedVa, clampedEndVa - clampedVa, protection);
|
||||
|
||||
if (clampedVa == partition.Address &&
|
||||
partitionIndex > 0 &&
|
||||
_partitions[partitionIndex - 1].EndAddress == partition.Address)
|
||||
{
|
||||
_partitions[partitionIndex - 1].ReprotectBridge(protection);
|
||||
}
|
||||
}
|
||||
|
||||
va += clampedEndVa - clampedVa;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public PrivateRange GetPrivateAllocation(ulong va)
|
||||
{
|
||||
AddressSpacePartition partition = FindPartition(va);
|
||||
|
||||
if (partition == null)
|
||||
{
|
||||
return PrivateRange.Empty;
|
||||
}
|
||||
|
||||
return partition.GetPrivateAllocation(va);
|
||||
}
|
||||
|
||||
public PrivateRange GetFirstPrivateAllocation(ulong va, ulong size, out ulong nextVa)
|
||||
{
|
||||
AddressSpacePartition partition = FindPartition(va);
|
||||
|
||||
if (partition == null)
|
||||
{
|
||||
nextVa = (va & ~(PartitionSize - 1)) + PartitionSize;
|
||||
|
||||
return PrivateRange.Empty;
|
||||
}
|
||||
|
||||
return partition.GetFirstPrivateAllocation(va, size, out nextVa);
|
||||
}
|
||||
|
||||
public bool HasAnyPrivateAllocation(ulong va, ulong size, out PrivateRange range)
|
||||
{
|
||||
range = PrivateRange.Empty;
|
||||
|
||||
ulong startVa = va;
|
||||
ulong endVa = va + size;
|
||||
|
||||
while (va < endVa)
|
||||
{
|
||||
AddressSpacePartition partition = FindPartition(va);
|
||||
|
||||
if (partition == null)
|
||||
{
|
||||
va += PartitionSize - (va & (PartitionSize - 1));
|
||||
|
||||
continue;
|
||||
}
|
||||
|
||||
(ulong clampedVa, ulong clampedEndVa) = ClampRange(partition, va, endVa);
|
||||
|
||||
if (partition.HasPrivateAllocation(clampedVa, clampedEndVa - clampedVa, startVa, size, ref range))
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
va += clampedEndVa - clampedVa;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
private void InsertOrRemoveBridgeIfNeeded(int partitionIndex)
|
||||
{
|
||||
if (partitionIndex > 0)
|
||||
{
|
||||
if (_partitions[partitionIndex - 1].EndAddress == _partitions[partitionIndex].Address)
|
||||
{
|
||||
_partitions[partitionIndex - 1].InsertBridgeAtEnd(_partitions[partitionIndex], _useProtectionMirrors);
|
||||
}
|
||||
else
|
||||
{
|
||||
_partitions[partitionIndex - 1].InsertBridgeAtEnd(null, _useProtectionMirrors);
|
||||
}
|
||||
}
|
||||
|
||||
if (partitionIndex + 1 < _partitions.Count && _partitions[partitionIndex].EndAddress == _partitions[partitionIndex + 1].Address)
|
||||
{
|
||||
_partitions[partitionIndex].InsertBridgeAtEnd(_partitions[partitionIndex + 1], _useProtectionMirrors);
|
||||
}
|
||||
else
|
||||
{
|
||||
_partitions[partitionIndex].InsertBridgeAtEnd(null, _useProtectionMirrors);
|
||||
}
|
||||
}
|
||||
|
||||
public IntPtr GetPointer(ulong va, ulong size)
|
||||
{
|
||||
AddressSpacePartition partition = FindPartition(va);
|
||||
|
||||
return partition.GetPointer(va, size);
|
||||
}
|
||||
|
||||
private static (ulong, ulong) ClampRange(AddressSpacePartition partition, ulong va, ulong endVa)
|
||||
{
|
||||
if (va < partition.Address)
|
||||
{
|
||||
va = partition.Address;
|
||||
}
|
||||
|
||||
if (endVa > partition.EndAddress)
|
||||
{
|
||||
endVa = partition.EndAddress;
|
||||
}
|
||||
|
||||
return (va, endVa);
|
||||
}
|
||||
|
||||
private AddressSpacePartition FindPartition(ulong va)
|
||||
{
|
||||
lock (_partitions)
|
||||
{
|
||||
int index = FindPartitionIndexLocked(va);
|
||||
if (index >= 0)
|
||||
{
|
||||
return _partitions[index];
|
||||
}
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
private AddressSpacePartition FindPartitionWithIndex(ulong va, out int index)
|
||||
{
|
||||
lock (_partitions)
|
||||
{
|
||||
index = FindPartitionIndexLocked(va);
|
||||
if (index >= 0)
|
||||
{
|
||||
return _partitions[index];
|
||||
}
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
private int FindPartitionIndexLocked(ulong va)
|
||||
{
|
||||
int left = 0;
|
||||
int middle;
|
||||
int right = _partitions.Count - 1;
|
||||
|
||||
while (left <= right)
|
||||
{
|
||||
middle = left + ((right - left) >> 1);
|
||||
|
||||
AddressSpacePartition partition = _partitions[middle];
|
||||
|
||||
if (partition.Address <= va && partition.EndAddress > va)
|
||||
{
|
||||
return middle;
|
||||
}
|
||||
|
||||
if (partition.Address >= va)
|
||||
{
|
||||
right = middle - 1;
|
||||
}
|
||||
else
|
||||
{
|
||||
left = middle + 1;
|
||||
}
|
||||
}
|
||||
|
||||
return -1;
|
||||
}
|
||||
|
||||
private void EnsurePartitionsLocked(ulong va, ulong size)
|
||||
{
|
||||
ulong endVa = BitUtils.AlignUp(va + size, PartitionSize);
|
||||
va = BitUtils.AlignDown(va, PartitionSize);
|
||||
|
||||
for (int i = 0; i < _partitions.Count && va < endVa; i++)
|
||||
{
|
||||
AddressSpacePartition partition = _partitions[i];
|
||||
|
||||
if (partition.Address <= va && partition.EndAddress > va)
|
||||
{
|
||||
if (partition.EndAddress >= endVa)
|
||||
{
|
||||
// Fully mapped already.
|
||||
va = endVa;
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
ulong gapSize;
|
||||
|
||||
if (i + 1 < _partitions.Count)
|
||||
{
|
||||
AddressSpacePartition nextPartition = _partitions[i + 1];
|
||||
|
||||
if (partition.EndAddress == nextPartition.Address)
|
||||
{
|
||||
va = partition.EndAddress;
|
||||
|
||||
continue;
|
||||
}
|
||||
|
||||
gapSize = Math.Min(endVa, nextPartition.Address) - partition.EndAddress;
|
||||
}
|
||||
else
|
||||
{
|
||||
gapSize = endVa - partition.EndAddress;
|
||||
}
|
||||
|
||||
_partitions.Insert(i + 1, CreateAsPartition(partition.EndAddress, gapSize));
|
||||
va = partition.EndAddress + gapSize;
|
||||
i++;
|
||||
}
|
||||
else if (partition.EndAddress > va)
|
||||
{
|
||||
Debug.Assert(partition.Address > va);
|
||||
|
||||
ulong gapSize;
|
||||
|
||||
if (partition.Address < endVa)
|
||||
{
|
||||
gapSize = partition.Address - va;
|
||||
}
|
||||
else
|
||||
{
|
||||
gapSize = endVa - va;
|
||||
}
|
||||
|
||||
_partitions.Insert(i, CreateAsPartition(va, gapSize));
|
||||
va = Math.Min(partition.EndAddress, endVa);
|
||||
i++;
|
||||
}
|
||||
}
|
||||
|
||||
if (va < endVa)
|
||||
{
|
||||
_partitions.Add(CreateAsPartition(va, endVa - va));
|
||||
}
|
||||
|
||||
ValidatePartitionList();
|
||||
}
|
||||
|
||||
[Conditional("DEBUG")]
|
||||
private void ValidatePartitionList()
|
||||
{
|
||||
for (int i = 1; i < _partitions.Count; i++)
|
||||
{
|
||||
Debug.Assert(_partitions[i].Address > _partitions[i - 1].Address);
|
||||
Debug.Assert(_partitions[i].EndAddress > _partitions[i - 1].EndAddress);
|
||||
}
|
||||
}
|
||||
|
||||
private AddressSpacePartition CreateAsPartition(ulong va, ulong size)
|
||||
{
|
||||
return new(CreateAsPartitionAllocation(va, size), _backingMemory, va, size);
|
||||
}
|
||||
|
||||
public AddressSpacePartitionAllocation CreateAsPartitionAllocation(ulong va, ulong size)
|
||||
{
|
||||
return _asAllocator.Allocate(va, size + MemoryBlock.GetPageSize());
|
||||
}
|
||||
|
||||
protected virtual void Dispose(bool disposing)
|
||||
{
|
||||
if (disposing)
|
||||
{
|
||||
foreach (AddressSpacePartition partition in _partitions)
|
||||
{
|
||||
partition.Dispose();
|
||||
}
|
||||
|
||||
_partitions.Clear();
|
||||
_asAllocator.Dispose();
|
||||
}
|
||||
}
|
||||
|
||||
public void Dispose()
|
||||
{
|
||||
Dispose(disposing: true);
|
||||
GC.SuppressFinalize(this);
|
||||
}
|
||||
}
|
||||
}
|
223
src/Ryujinx.Cpu/Jit/HostTracked/NativePageTable.cs
Normal file
|
@ -0,0 +1,223 @@
|
|||
using Ryujinx.Cpu.Signal;
|
||||
using Ryujinx.Memory;
|
||||
using System;
|
||||
using System.Diagnostics;
|
||||
using System.Numerics;
|
||||
using System.Runtime.InteropServices;
|
||||
|
||||
namespace Ryujinx.Cpu.Jit.HostTracked
|
||||
{
|
||||
sealed class NativePageTable : IDisposable
|
||||
{
|
||||
private delegate ulong TrackingEventDelegate(ulong address, ulong size, bool write);
|
||||
|
||||
private const int PageBits = 12;
|
||||
private const int PageSize = 1 << PageBits;
|
||||
private const int PageMask = PageSize - 1;
|
||||
|
||||
private const int PteSize = 8;
|
||||
|
||||
private readonly int _bitsPerPtPage;
|
||||
private readonly int _entriesPerPtPage;
|
||||
private readonly int _pageCommitmentBits;
|
||||
|
||||
private readonly PageTable<ulong> _pageTable;
|
||||
private readonly MemoryBlock _nativePageTable;
|
||||
private readonly ulong[] _pageCommitmentBitmap;
|
||||
private readonly ulong _hostPageSize;
|
||||
|
||||
private readonly TrackingEventDelegate _trackingEvent;
|
||||
|
||||
private bool _disposed;
|
||||
|
||||
public IntPtr PageTablePointer => _nativePageTable.Pointer;
|
||||
|
||||
public NativePageTable(ulong asSize)
|
||||
{
|
||||
ulong hostPageSize = MemoryBlock.GetPageSize();
|
||||
|
||||
_entriesPerPtPage = (int)(hostPageSize / sizeof(ulong));
|
||||
_bitsPerPtPage = BitOperations.Log2((uint)_entriesPerPtPage);
|
||||
_pageCommitmentBits = PageBits + _bitsPerPtPage;
|
||||
|
||||
_hostPageSize = hostPageSize;
|
||||
_pageTable = new PageTable<ulong>();
|
||||
_nativePageTable = new MemoryBlock((asSize / PageSize) * PteSize + _hostPageSize, MemoryAllocationFlags.Reserve);
|
||||
_pageCommitmentBitmap = new ulong[(asSize >> _pageCommitmentBits) / (sizeof(ulong) * 8)];
|
||||
|
||||
ulong ptStart = (ulong)_nativePageTable.Pointer;
|
||||
ulong ptEnd = ptStart + _nativePageTable.Size;
|
||||
|
||||
_trackingEvent = VirtualMemoryEvent;
|
||||
|
||||
bool added = NativeSignalHandler.AddTrackedRegion((nuint)ptStart, (nuint)ptEnd, Marshal.GetFunctionPointerForDelegate(_trackingEvent));
|
||||
|
||||
if (!added)
|
||||
{
|
||||
throw new InvalidOperationException("Number of allowed tracked regions exceeded.");
|
||||
}
|
||||
}
|
||||
|
||||
public void Map(ulong va, ulong pa, ulong size, AddressSpacePartitioned addressSpace, MemoryBlock backingMemory, bool privateMap)
|
||||
{
|
||||
while (size != 0)
|
||||
{
|
||||
_pageTable.Map(va, pa);
|
||||
|
||||
EnsureCommitment(va);
|
||||
|
||||
if (privateMap)
|
||||
{
|
||||
_nativePageTable.Write((va / PageSize) * PteSize, GetPte(va, addressSpace.GetPointer(va, PageSize)));
|
||||
}
|
||||
else
|
||||
{
|
||||
_nativePageTable.Write((va / PageSize) * PteSize, GetPte(va, backingMemory.GetPointer(pa, PageSize)));
|
||||
}
|
||||
|
||||
va += PageSize;
|
||||
pa += PageSize;
|
||||
size -= PageSize;
|
||||
}
|
||||
}
|
||||
|
||||
public void Unmap(ulong va, ulong size)
|
||||
{
|
||||
IntPtr guardPagePtr = GetGuardPagePointer();
|
||||
|
||||
while (size != 0)
|
||||
{
|
||||
_pageTable.Unmap(va);
|
||||
_nativePageTable.Write((va / PageSize) * PteSize, GetPte(va, guardPagePtr));
|
||||
|
||||
va += PageSize;
|
||||
size -= PageSize;
|
||||
}
|
||||
}
|
||||
|
||||
public ulong Read(ulong va)
|
||||
{
|
||||
ulong pte = _nativePageTable.Read<ulong>((va / PageSize) * PteSize);
|
||||
|
||||
pte += va & ~(ulong)PageMask;
|
||||
|
||||
return pte + (va & PageMask);
|
||||
}
|
||||
|
||||
public void Update(ulong va, IntPtr ptr, ulong size)
|
||||
{
|
||||
ulong remainingSize = size;
|
||||
|
||||
while (remainingSize != 0)
|
||||
{
|
||||
EnsureCommitment(va);
|
||||
|
||||
_nativePageTable.Write((va / PageSize) * PteSize, GetPte(va, ptr));
|
||||
|
||||
va += PageSize;
|
||||
ptr += PageSize;
|
||||
remainingSize -= PageSize;
|
||||
}
|
||||
}
|
||||
|
||||
private void EnsureCommitment(ulong va)
|
||||
{
|
||||
ulong bit = va >> _pageCommitmentBits;
|
||||
|
||||
int index = (int)(bit / (sizeof(ulong) * 8));
|
||||
int shift = (int)(bit % (sizeof(ulong) * 8));
|
||||
|
||||
ulong mask = 1UL << shift;
|
||||
|
||||
ulong oldMask = _pageCommitmentBitmap[index];
|
||||
|
||||
if ((oldMask & mask) == 0)
|
||||
{
|
||||
lock (_pageCommitmentBitmap)
|
||||
{
|
||||
oldMask = _pageCommitmentBitmap[index];
|
||||
|
||||
if ((oldMask & mask) != 0)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
_nativePageTable.Commit(bit * _hostPageSize, _hostPageSize);
|
||||
|
||||
Span<ulong> pageSpan = MemoryMarshal.Cast<byte, ulong>(_nativePageTable.GetSpan(bit * _hostPageSize, (int)_hostPageSize));
|
||||
|
||||
Debug.Assert(pageSpan.Length == _entriesPerPtPage);
|
||||
|
||||
IntPtr guardPagePtr = GetGuardPagePointer();
|
||||
|
||||
for (int i = 0; i < pageSpan.Length; i++)
|
||||
{
|
||||
pageSpan[i] = GetPte((bit << _pageCommitmentBits) | ((ulong)i * PageSize), guardPagePtr);
|
||||
}
|
||||
|
||||
_pageCommitmentBitmap[index] = oldMask | mask;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private IntPtr GetGuardPagePointer()
|
||||
{
|
||||
return _nativePageTable.GetPointer(_nativePageTable.Size - _hostPageSize, _hostPageSize);
|
||||
}
|
||||
|
||||
private static ulong GetPte(ulong va, IntPtr ptr)
|
||||
{
|
||||
Debug.Assert((va & PageMask) == 0);
|
||||
|
||||
return (ulong)ptr - va;
|
||||
}
|
||||
|
||||
public ulong GetPhysicalAddress(ulong va)
|
||||
{
|
||||
return _pageTable.Read(va) + (va & PageMask);
|
||||
}
|
||||
|
||||
private ulong VirtualMemoryEvent(ulong address, ulong size, bool write)
|
||||
{
|
||||
if (address < _nativePageTable.Size - _hostPageSize)
|
||||
{
|
||||
// Some prefetch instructions do not cause faults with invalid addresses.
|
||||
// Retry if we are hitting a case where the page table is unmapped, the next
|
||||
// run will execute the actual instruction.
|
||||
// The address loaded from the page table will be invalid, and it should hit the else case
|
||||
// if the instruction faults on unmapped or protected memory.
|
||||
|
||||
ulong va = address * (PageSize / sizeof(ulong));
|
||||
|
||||
EnsureCommitment(va);
|
||||
|
||||
return (ulong)_nativePageTable.Pointer + address;
|
||||
}
|
||||
else
|
||||
{
|
||||
throw new InvalidMemoryRegionException();
|
||||
}
|
||||
}
|
||||
|
||||
private void Dispose(bool disposing)
|
||||
{
|
||||
if (!_disposed)
|
||||
{
|
||||
if (disposing)
|
||||
{
|
||||
NativeSignalHandler.RemoveTrackedRegion((nuint)_nativePageTable.Pointer);
|
||||
|
||||
_nativePageTable.Dispose();
|
||||
}
|
||||
|
||||
_disposed = true;
|
||||
}
|
||||
}
|
||||
|
||||
public void Dispose()
|
||||
{
|
||||
Dispose(disposing: true);
|
||||
GC.SuppressFinalize(this);
|
||||
}
|
||||
}
|
||||
}
|
|
@ -15,9 +15,9 @@ namespace Ryujinx.Cpu.Jit
|
|||
_tickSource = tickSource;
|
||||
_translator = new Translator(new JitMemoryAllocator(forJit: true), memory, for64Bit);
|
||||
|
||||
if (memory.Type.IsHostMapped())
|
||||
if (memory.Type.IsHostMappedOrTracked())
|
||||
{
|
||||
NativeSignalHandler.InitializeSignalHandler(MemoryBlock.GetPageSize());
|
||||
NativeSignalHandler.InitializeSignalHandler();
|
||||
}
|
||||
|
||||
memory.UnmapEvent += UnmapHandler;
|
||||
|
|
|
@ -3,6 +3,7 @@ using Ryujinx.Memory;
|
|||
using Ryujinx.Memory.Range;
|
||||
using Ryujinx.Memory.Tracking;
|
||||
using System;
|
||||
using System.Buffers;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Runtime.CompilerServices;
|
||||
|
@ -14,7 +15,7 @@ namespace Ryujinx.Cpu.Jit
|
|||
/// <summary>
|
||||
/// Represents a CPU memory manager.
|
||||
/// </summary>
|
||||
public sealed class MemoryManager : VirtualMemoryManagerRefCountedBase<ulong, ulong>, IMemoryManager, IVirtualMemoryManagerTracked, IWritableBlock
|
||||
public sealed class MemoryManager : VirtualMemoryManagerRefCountedBase, IMemoryManager, IVirtualMemoryManagerTracked
|
||||
{
|
||||
private const int PteSize = 8;
|
||||
|
||||
|
@ -33,6 +34,8 @@ namespace Ryujinx.Cpu.Jit
|
|||
|
||||
private readonly MemoryBlock _pageTable;
|
||||
|
||||
private readonly ManagedPageFlags _pages;
|
||||
|
||||
/// <summary>
|
||||
/// Page table base pointer.
|
||||
/// </summary>
|
||||
|
@ -70,6 +73,8 @@ namespace Ryujinx.Cpu.Jit
|
|||
AddressSpaceSize = asSize;
|
||||
_pageTable = new MemoryBlock((asSize / PageSize) * PteSize);
|
||||
|
||||
_pages = new ManagedPageFlags(AddressSpaceBits);
|
||||
|
||||
Tracking = new MemoryTracking(this, PageSize);
|
||||
}
|
||||
|
||||
|
@ -89,15 +94,10 @@ namespace Ryujinx.Cpu.Jit
|
|||
remainingSize -= PageSize;
|
||||
}
|
||||
|
||||
_pages.AddMapping(oVa, size);
|
||||
Tracking.Map(oVa, size);
|
||||
}
|
||||
|
||||
/// <inheritdoc/>
|
||||
public void MapForeign(ulong va, nuint hostPointer, ulong size)
|
||||
{
|
||||
throw new NotSupportedException();
|
||||
}
|
||||
|
||||
/// <inheritdoc/>
|
||||
public void Unmap(ulong va, ulong size)
|
||||
{
|
||||
|
@ -111,6 +111,7 @@ namespace Ryujinx.Cpu.Jit
|
|||
|
||||
UnmapEvent?.Invoke(va, size);
|
||||
Tracking.Unmap(va, size);
|
||||
_pages.RemoveMapping(va, size);
|
||||
|
||||
ulong remainingSize = size;
|
||||
while (remainingSize != 0)
|
||||
|
@ -122,18 +123,29 @@ namespace Ryujinx.Cpu.Jit
|
|||
}
|
||||
}
|
||||
|
||||
/// <inheritdoc/>
|
||||
public T Read<T>(ulong va) where T : unmanaged
|
||||
{
|
||||
return MemoryMarshal.Cast<byte, T>(GetSpan(va, Unsafe.SizeOf<T>()))[0];
|
||||
}
|
||||
|
||||
/// <inheritdoc/>
|
||||
public T ReadTracked<T>(ulong va) where T : unmanaged
|
||||
public override T ReadTracked<T>(ulong va)
|
||||
{
|
||||
try
|
||||
{
|
||||
SignalMemoryTracking(va, (ulong)Unsafe.SizeOf<T>(), false);
|
||||
return base.ReadTracked<T>(va);
|
||||
}
|
||||
catch (InvalidMemoryRegionException)
|
||||
{
|
||||
if (_invalidAccessHandler == null || !_invalidAccessHandler(va))
|
||||
{
|
||||
throw;
|
||||
}
|
||||
|
||||
return default;
|
||||
}
|
||||
}
|
||||
|
||||
/// <inheritdoc/>
|
||||
public T ReadGuest<T>(ulong va) where T : unmanaged
|
||||
{
|
||||
try
|
||||
{
|
||||
SignalMemoryTrackingImpl(va, (ulong)Unsafe.SizeOf<T>(), false, true);
|
||||
|
||||
return Read<T>(va);
|
||||
}
|
||||
|
@ -164,107 +176,11 @@ namespace Ryujinx.Cpu.Jit
|
|||
}
|
||||
}
|
||||
|
||||
/// <inheritdoc/>
|
||||
public void Write<T>(ulong va, T value) where T : unmanaged
|
||||
{
|
||||
Write(va, MemoryMarshal.Cast<T, byte>(MemoryMarshal.CreateSpan(ref value, 1)));
|
||||
}
|
||||
|
||||
/// <inheritdoc/>
|
||||
public void Write(ulong va, ReadOnlySpan<byte> data)
|
||||
{
|
||||
if (data.Length == 0)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
SignalMemoryTracking(va, (ulong)data.Length, true);
|
||||
|
||||
WriteImpl(va, data);
|
||||
}
|
||||
|
||||
/// <inheritdoc/>
|
||||
public void WriteUntracked(ulong va, ReadOnlySpan<byte> data)
|
||||
{
|
||||
if (data.Length == 0)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
WriteImpl(va, data);
|
||||
}
|
||||
|
||||
/// <inheritdoc/>
|
||||
public bool WriteWithRedundancyCheck(ulong va, ReadOnlySpan<byte> data)
|
||||
{
|
||||
if (data.Length == 0)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
SignalMemoryTracking(va, (ulong)data.Length, false);
|
||||
|
||||
if (IsContiguousAndMapped(va, data.Length))
|
||||
{
|
||||
var target = _backingMemory.GetSpan(GetPhysicalAddressInternal(va), data.Length);
|
||||
|
||||
bool changed = !data.SequenceEqual(target);
|
||||
|
||||
if (changed)
|
||||
{
|
||||
data.CopyTo(target);
|
||||
}
|
||||
|
||||
return changed;
|
||||
}
|
||||
else
|
||||
{
|
||||
WriteImpl(va, data);
|
||||
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Writes data to CPU mapped memory.
|
||||
/// </summary>
|
||||
/// <param name="va">Virtual address to write the data into</param>
|
||||
/// <param name="data">Data to be written</param>
|
||||
[MethodImpl(MethodImplOptions.AggressiveInlining)]
|
||||
private void WriteImpl(ulong va, ReadOnlySpan<byte> data)
|
||||
public override void Write(ulong va, ReadOnlySpan<byte> data)
|
||||
{
|
||||
try
|
||||
{
|
||||
AssertValidAddressAndSize(va, (ulong)data.Length);
|
||||
|
||||
if (IsContiguousAndMapped(va, data.Length))
|
||||
{
|
||||
data.CopyTo(_backingMemory.GetSpan(GetPhysicalAddressInternal(va), data.Length));
|
||||
}
|
||||
else
|
||||
{
|
||||
int offset = 0, size;
|
||||
|
||||
if ((va & PageMask) != 0)
|
||||
{
|
||||
ulong pa = GetPhysicalAddressInternal(va);
|
||||
|
||||
size = Math.Min(data.Length, PageSize - (int)(va & PageMask));
|
||||
|
||||
data[..size].CopyTo(_backingMemory.GetSpan(pa, size));
|
||||
|
||||
offset += size;
|
||||
}
|
||||
|
||||
for (; offset < data.Length; offset += size)
|
||||
{
|
||||
ulong pa = GetPhysicalAddressInternal(va + (ulong)offset);
|
||||
|
||||
size = Math.Min(data.Length - offset, PageSize);
|
||||
|
||||
data.Slice(offset, size).CopyTo(_backingMemory.GetSpan(pa, size));
|
||||
}
|
||||
}
|
||||
base.Write(va, data);
|
||||
}
|
||||
catch (InvalidMemoryRegionException)
|
||||
{
|
||||
|
@ -276,60 +192,47 @@ namespace Ryujinx.Cpu.Jit
|
|||
}
|
||||
|
||||
/// <inheritdoc/>
|
||||
public ReadOnlySpan<byte> GetSpan(ulong va, int size, bool tracked = false)
|
||||
public void WriteGuest<T>(ulong va, T value) where T : unmanaged
|
||||
{
|
||||
if (size == 0)
|
||||
Span<byte> data = MemoryMarshal.Cast<T, byte>(MemoryMarshal.CreateSpan(ref value, 1));
|
||||
|
||||
SignalMemoryTrackingImpl(va, (ulong)data.Length, true, true);
|
||||
|
||||
Write(va, data);
|
||||
}
|
||||
|
||||
public override void WriteUntracked(ulong va, ReadOnlySpan<byte> data)
|
||||
{
|
||||
try
|
||||
{
|
||||
return ReadOnlySpan<byte>.Empty;
|
||||
base.WriteUntracked(va, data);
|
||||
}
|
||||
|
||||
if (tracked)
|
||||
catch (InvalidMemoryRegionException)
|
||||
{
|
||||
SignalMemoryTracking(va, (ulong)size, false);
|
||||
}
|
||||
|
||||
if (IsContiguousAndMapped(va, size))
|
||||
{
|
||||
return _backingMemory.GetSpan(GetPhysicalAddressInternal(va), size);
|
||||
}
|
||||
else
|
||||
{
|
||||
Span<byte> data = new byte[size];
|
||||
|
||||
base.Read(va, data);
|
||||
|
||||
return data;
|
||||
if (_invalidAccessHandler == null || !_invalidAccessHandler(va))
|
||||
{
|
||||
throw;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// <inheritdoc/>
|
||||
public WritableRegion GetWritableRegion(ulong va, int size, bool tracked = false)
|
||||
public override ReadOnlySequence<byte> GetReadOnlySequence(ulong va, int size, bool tracked = false)
|
||||
{
|
||||
if (size == 0)
|
||||
try
|
||||
{
|
||||
return new WritableRegion(null, va, Memory<byte>.Empty);
|
||||
return base.GetReadOnlySequence(va, size, tracked);
|
||||
}
|
||||
|
||||
if (IsContiguousAndMapped(va, size))
|
||||
catch (InvalidMemoryRegionException)
|
||||
{
|
||||
if (tracked)
|
||||
if (_invalidAccessHandler == null || !_invalidAccessHandler(va))
|
||||
{
|
||||
SignalMemoryTracking(va, (ulong)size, true);
|
||||
throw;
|
||||
}
|
||||
|
||||
return new WritableRegion(null, va, _backingMemory.GetMemory(GetPhysicalAddressInternal(va), size));
|
||||
}
|
||||
else
|
||||
{
|
||||
Memory<byte> memory = new byte[size];
|
||||
|
||||
GetSpan(va, size).CopyTo(memory.Span);
|
||||
|
||||
return new WritableRegion(this, va, memory, tracked);
|
||||
return ReadOnlySequence<byte>.Empty;
|
||||
}
|
||||
}
|
||||
|
||||
/// <inheritdoc/>
|
||||
public ref T GetRef<T>(ulong va) where T : unmanaged
|
||||
{
|
||||
if (!IsContiguous(va, Unsafe.SizeOf<T>()))
|
||||
|
@ -342,56 +245,6 @@ namespace Ryujinx.Cpu.Jit
|
|||
return ref _backingMemory.GetRef<T>(GetPhysicalAddressInternal(va));
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Computes the number of pages in a virtual address range.
|
||||
/// </summary>
|
||||
/// <param name="va">Virtual address of the range</param>
|
||||
/// <param name="size">Size of the range</param>
|
||||
/// <param name="startVa">The virtual address of the beginning of the first page</param>
|
||||
/// <remarks>This function does not differentiate between allocated and unallocated pages.</remarks>
|
||||
[MethodImpl(MethodImplOptions.AggressiveInlining)]
|
||||
private static int GetPagesCount(ulong va, uint size, out ulong startVa)
|
||||
{
|
||||
// WARNING: Always check if ulong does not overflow during the operations.
|
||||
startVa = va & ~(ulong)PageMask;
|
||||
ulong vaSpan = (va - startVa + size + PageMask) & ~(ulong)PageMask;
|
||||
|
||||
return (int)(vaSpan / PageSize);
|
||||
}
|
||||
|
||||
private static void ThrowMemoryNotContiguous() => throw new MemoryNotContiguousException();
|
||||
|
||||
[MethodImpl(MethodImplOptions.AggressiveInlining)]
|
||||
private bool IsContiguousAndMapped(ulong va, int size) => IsContiguous(va, size) && IsMapped(va);
|
||||
|
||||
[MethodImpl(MethodImplOptions.AggressiveInlining)]
|
||||
private bool IsContiguous(ulong va, int size)
|
||||
{
|
||||
if (!ValidateAddress(va) || !ValidateAddressAndSize(va, (ulong)size))
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
int pages = GetPagesCount(va, (uint)size, out va);
|
||||
|
||||
for (int page = 0; page < pages - 1; page++)
|
||||
{
|
||||
if (!ValidateAddress(va + PageSize))
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
if (GetPhysicalAddressInternal(va) + PageSize != GetPhysicalAddressInternal(va + PageSize))
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
va += PageSize;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
/// <inheritdoc/>
|
||||
public IEnumerable<HostMemoryRange> GetHostRegions(ulong va, ulong size)
|
||||
{
|
||||
|
@ -496,9 +349,8 @@ namespace Ryujinx.Cpu.Jit
|
|||
return true;
|
||||
}
|
||||
|
||||
/// <inheritdoc/>
|
||||
[MethodImpl(MethodImplOptions.AggressiveInlining)]
|
||||
public bool IsMapped(ulong va)
|
||||
public override bool IsMapped(ulong va)
|
||||
{
|
||||
if (!ValidateAddress(va))
|
||||
{
|
||||
|
@ -508,9 +360,9 @@ namespace Ryujinx.Cpu.Jit
|
|||
return _pageTable.Read<ulong>((va / PageSize) * PteSize) != 0;
|
||||
}
|
||||
|
||||
private ulong GetPhysicalAddressInternal(ulong va)
|
||||
private nuint GetPhysicalAddressInternal(ulong va)
|
||||
{
|
||||
return PteToPa(_pageTable.Read<ulong>((va / PageSize) * PteSize) & ~(0xffffUL << 48)) + (va & PageMask);
|
||||
return (nuint)(PteToPa(_pageTable.Read<ulong>((va / PageSize) * PteSize) & ~(0xffffUL << 48)) + (va & PageMask));
|
||||
}
|
||||
|
||||
/// <inheritdoc/>
|
||||
|
@ -520,50 +372,57 @@ namespace Ryujinx.Cpu.Jit
|
|||
}
|
||||
|
||||
/// <inheritdoc/>
|
||||
public void TrackingReprotect(ulong va, ulong size, MemoryPermission protection)
|
||||
public void TrackingReprotect(ulong va, ulong size, MemoryPermission protection, bool guest)
|
||||
{
|
||||
AssertValidAddressAndSize(va, size);
|
||||
|
||||
// Protection is inverted on software pages, since the default value is 0.
|
||||
protection = (~protection) & MemoryPermission.ReadAndWrite;
|
||||
|
||||
long tag = protection switch
|
||||
if (guest)
|
||||
{
|
||||
MemoryPermission.None => 0L,
|
||||
MemoryPermission.Write => 2L << PointerTagBit,
|
||||
_ => 3L << PointerTagBit,
|
||||
};
|
||||
// Protection is inverted on software pages, since the default value is 0.
|
||||
protection = (~protection) & MemoryPermission.ReadAndWrite;
|
||||
|
||||
int pages = GetPagesCount(va, (uint)size, out va);
|
||||
ulong pageStart = va >> PageBits;
|
||||
long invTagMask = ~(0xffffL << 48);
|
||||
|
||||
for (int page = 0; page < pages; page++)
|
||||
{
|
||||
ref long pageRef = ref _pageTable.GetRef<long>(pageStart * PteSize);
|
||||
|
||||
long pte;
|
||||
|
||||
do
|
||||
long tag = protection switch
|
||||
{
|
||||
pte = Volatile.Read(ref pageRef);
|
||||
}
|
||||
while (pte != 0 && Interlocked.CompareExchange(ref pageRef, (pte & invTagMask) | tag, pte) != pte);
|
||||
MemoryPermission.None => 0L,
|
||||
MemoryPermission.Write => 2L << PointerTagBit,
|
||||
_ => 3L << PointerTagBit,
|
||||
};
|
||||
|
||||
pageStart++;
|
||||
int pages = GetPagesCount(va, (uint)size, out va);
|
||||
ulong pageStart = va >> PageBits;
|
||||
long invTagMask = ~(0xffffL << 48);
|
||||
|
||||
for (int page = 0; page < pages; page++)
|
||||
{
|
||||
ref long pageRef = ref _pageTable.GetRef<long>(pageStart * PteSize);
|
||||
|
||||
long pte;
|
||||
|
||||
do
|
||||
{
|
||||
pte = Volatile.Read(ref pageRef);
|
||||
}
|
||||
while (pte != 0 && Interlocked.CompareExchange(ref pageRef, (pte & invTagMask) | tag, pte) != pte);
|
||||
|
||||
pageStart++;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
_pages.TrackingReprotect(va, size, protection);
|
||||
}
|
||||
}
|
||||
|
||||
/// <inheritdoc/>
|
||||
public RegionHandle BeginTracking(ulong address, ulong size, int id)
|
||||
public RegionHandle BeginTracking(ulong address, ulong size, int id, RegionFlags flags = RegionFlags.None)
|
||||
{
|
||||
return Tracking.BeginTracking(address, size, id);
|
||||
return Tracking.BeginTracking(address, size, id, flags);
|
||||
}
|
||||
|
||||
/// <inheritdoc/>
|
||||
public MultiRegionHandle BeginGranularTracking(ulong address, ulong size, IEnumerable<IRegionHandle> handles, ulong granularity, int id)
|
||||
public MultiRegionHandle BeginGranularTracking(ulong address, ulong size, IEnumerable<IRegionHandle> handles, ulong granularity, int id, RegionFlags flags = RegionFlags.None)
|
||||
{
|
||||
return Tracking.BeginGranularTracking(address, size, handles, granularity, id);
|
||||
return Tracking.BeginGranularTracking(address, size, handles, granularity, id, flags);
|
||||
}
|
||||
|
||||
/// <inheritdoc/>
|
||||
|
@ -572,8 +431,7 @@ namespace Ryujinx.Cpu.Jit
|
|||
return Tracking.BeginSmartGranularTracking(address, size, granularity, id);
|
||||
}
|
||||
|
||||
/// <inheritdoc/>
|
||||
public void SignalMemoryTracking(ulong va, ulong size, bool write, bool precise = false, int? exemptId = null)
|
||||
private void SignalMemoryTrackingImpl(ulong va, ulong size, bool write, bool guest, bool precise = false, int? exemptId = null)
|
||||
{
|
||||
AssertValidAddressAndSize(va, size);
|
||||
|
||||
|
@ -583,31 +441,45 @@ namespace Ryujinx.Cpu.Jit
|
|||
return;
|
||||
}
|
||||
|
||||
// We emulate guard pages for software memory access. This makes for an easy transition to
|
||||
// tracking using host guard pages in future, but also supporting platforms where this is not possible.
|
||||
// If the memory tracking is coming from the guest, use the tag bits in the page table entry.
|
||||
// Otherwise, use the managed page flags.
|
||||
|
||||
// Write tag includes read protection, since we don't have any read actions that aren't performed before write too.
|
||||
long tag = (write ? 3L : 1L) << PointerTagBit;
|
||||
|
||||
int pages = GetPagesCount(va, (uint)size, out _);
|
||||
ulong pageStart = va >> PageBits;
|
||||
|
||||
for (int page = 0; page < pages; page++)
|
||||
if (guest)
|
||||
{
|
||||
ref long pageRef = ref _pageTable.GetRef<long>(pageStart * PteSize);
|
||||
// We emulate guard pages for software memory access. This makes for an easy transition to
|
||||
// tracking using host guard pages in future, but also supporting platforms where this is not possible.
|
||||
|
||||
long pte;
|
||||
// Write tag includes read protection, since we don't have any read actions that aren't performed before write too.
|
||||
long tag = (write ? 3L : 1L) << PointerTagBit;
|
||||
|
||||
pte = Volatile.Read(ref pageRef);
|
||||
int pages = GetPagesCount(va, (uint)size, out _);
|
||||
ulong pageStart = va >> PageBits;
|
||||
|
||||
if ((pte & tag) != 0)
|
||||
for (int page = 0; page < pages; page++)
|
||||
{
|
||||
Tracking.VirtualMemoryEvent(va, size, write, precise: false, exemptId);
|
||||
break;
|
||||
}
|
||||
ref long pageRef = ref _pageTable.GetRef<long>(pageStart * PteSize);
|
||||
|
||||
pageStart++;
|
||||
long pte = Volatile.Read(ref pageRef);
|
||||
|
||||
if ((pte & tag) != 0)
|
||||
{
|
||||
Tracking.VirtualMemoryEvent(va, size, write, precise: false, exemptId, true);
|
||||
break;
|
||||
}
|
||||
|
||||
pageStart++;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
_pages.SignalMemoryTracking(Tracking, va, size, write, exemptId);
|
||||
}
|
||||
}
|
||||
|
||||
/// <inheritdoc/>
|
||||
public override void SignalMemoryTracking(ulong va, ulong size, bool write, bool precise = false, int? exemptId = null)
|
||||
{
|
||||
SignalMemoryTrackingImpl(va, size, write, false, precise, exemptId);
|
||||
}
|
||||
|
||||
private ulong PaToPte(ulong pa)
|
||||
|
@ -625,10 +497,16 @@ namespace Ryujinx.Cpu.Jit
|
|||
/// </summary>
|
||||
protected override void Destroy() => _pageTable.Dispose();
|
||||
|
||||
protected override Span<byte> GetPhysicalAddressSpan(ulong pa, int size)
|
||||
protected override Memory<byte> GetPhysicalAddressMemory(nuint pa, int size)
|
||||
=> _backingMemory.GetMemory(pa, size);
|
||||
|
||||
protected override Span<byte> GetPhysicalAddressSpan(nuint pa, int size)
|
||||
=> _backingMemory.GetSpan(pa, size);
|
||||
|
||||
protected override ulong TranslateVirtualAddressForRead(ulong va)
|
||||
protected override nuint TranslateVirtualAddressChecked(ulong va)
|
||||
=> GetPhysicalAddressInternal(va);
|
||||
|
||||
protected override nuint TranslateVirtualAddressUnchecked(ulong va)
|
||||
=> GetPhysicalAddressInternal(va);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -3,33 +3,18 @@ using Ryujinx.Memory;
|
|||
using Ryujinx.Memory.Range;
|
||||
using Ryujinx.Memory.Tracking;
|
||||
using System;
|
||||
using System.Buffers;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Runtime.CompilerServices;
|
||||
using System.Threading;
|
||||
|
||||
namespace Ryujinx.Cpu.Jit
|
||||
{
|
||||
/// <summary>
|
||||
/// Represents a CPU memory manager which maps guest virtual memory directly onto a host virtual region.
|
||||
/// </summary>
|
||||
public sealed class MemoryManagerHostMapped : VirtualMemoryManagerRefCountedBase<ulong, ulong>, IMemoryManager, IVirtualMemoryManagerTracked, IWritableBlock
|
||||
public sealed class MemoryManagerHostMapped : VirtualMemoryManagerRefCountedBase, IMemoryManager, IVirtualMemoryManagerTracked
|
||||
{
|
||||
public const int PageToPteShift = 5; // 32 pages (2 bits each) in one ulong page table entry.
|
||||
public const ulong BlockMappedMask = 0x5555555555555555; // First bit of each table entry set.
|
||||
|
||||
private enum HostMappedPtBits : ulong
|
||||
{
|
||||
Unmapped = 0,
|
||||
Mapped,
|
||||
WriteTracked,
|
||||
ReadWriteTracked,
|
||||
|
||||
MappedReplicated = 0x5555555555555555,
|
||||
WriteTrackedReplicated = 0xaaaaaaaaaaaaaaaa,
|
||||
ReadWriteTrackedReplicated = ulong.MaxValue,
|
||||
}
|
||||
|
||||
private readonly InvalidAccessHandler _invalidAccessHandler;
|
||||
private readonly bool _unsafeMode;
|
||||
|
||||
|
@ -39,7 +24,7 @@ namespace Ryujinx.Cpu.Jit
|
|||
|
||||
private readonly MemoryEhMeilleure _memoryEh;
|
||||
|
||||
private readonly ulong[] _pageBitmap;
|
||||
private readonly ManagedPageFlags _pages;
|
||||
|
||||
/// <inheritdoc/>
|
||||
public bool Supports4KBPages => MemoryBlock.GetPageSize() == PageSize;
|
||||
|
@ -81,7 +66,7 @@ namespace Ryujinx.Cpu.Jit
|
|||
|
||||
AddressSpaceBits = asBits;
|
||||
|
||||
_pageBitmap = new ulong[1 << (AddressSpaceBits - (PageBits + PageToPteShift))];
|
||||
_pages = new ManagedPageFlags(AddressSpaceBits);
|
||||
|
||||
Tracking = new MemoryTracking(this, (int)MemoryBlock.GetPageSize(), invalidAccessHandler);
|
||||
_memoryEh = new MemoryEhMeilleure(_addressSpace.Base, _addressSpace.Mirror, Tracking);
|
||||
|
@ -94,7 +79,7 @@ namespace Ryujinx.Cpu.Jit
|
|||
/// <param name="size">Size of the range in bytes</param>
|
||||
private void AssertMapped(ulong va, ulong size)
|
||||
{
|
||||
if (!ValidateAddressAndSize(va, size) || !IsRangeMappedImpl(va, size))
|
||||
if (!ValidateAddressAndSize(va, size) || !_pages.IsRangeMapped(va, size))
|
||||
{
|
||||
throw new InvalidMemoryRegionException($"Not mapped: va=0x{va:X16}, size=0x{size:X16}");
|
||||
}
|
||||
|
@ -106,18 +91,12 @@ namespace Ryujinx.Cpu.Jit
|
|||
AssertValidAddressAndSize(va, size);
|
||||
|
||||
_addressSpace.Map(va, pa, size, flags);
|
||||
AddMapping(va, size);
|
||||
_pages.AddMapping(va, size);
|
||||
PtMap(va, pa, size);
|
||||
|
||||
Tracking.Map(va, size);
|
||||
}
|
||||
|
||||
/// <inheritdoc/>
|
||||
public void MapForeign(ulong va, nuint hostPointer, ulong size)
|
||||
{
|
||||
throw new NotSupportedException();
|
||||
}
|
||||
|
||||
/// <inheritdoc/>
|
||||
public void Unmap(ulong va, ulong size)
|
||||
{
|
||||
|
@ -126,7 +105,7 @@ namespace Ryujinx.Cpu.Jit
|
|||
UnmapEvent?.Invoke(va, size);
|
||||
Tracking.Unmap(va, size);
|
||||
|
||||
RemoveMapping(va, size);
|
||||
_pages.RemoveMapping(va, size);
|
||||
PtUnmap(va, size);
|
||||
_addressSpace.Unmap(va, size);
|
||||
}
|
||||
|
@ -154,8 +133,7 @@ namespace Ryujinx.Cpu.Jit
|
|||
}
|
||||
}
|
||||
|
||||
/// <inheritdoc/>
|
||||
public T Read<T>(ulong va) where T : unmanaged
|
||||
public override T Read<T>(ulong va)
|
||||
{
|
||||
try
|
||||
{
|
||||
|
@ -174,14 +152,11 @@ namespace Ryujinx.Cpu.Jit
|
|||
}
|
||||
}
|
||||
|
||||
/// <inheritdoc/>
|
||||
public T ReadTracked<T>(ulong va) where T : unmanaged
|
||||
public override T ReadTracked<T>(ulong va)
|
||||
{
|
||||
try
|
||||
{
|
||||
SignalMemoryTracking(va, (ulong)Unsafe.SizeOf<T>(), false);
|
||||
|
||||
return Read<T>(va);
|
||||
return base.ReadTracked<T>(va);
|
||||
}
|
||||
catch (InvalidMemoryRegionException)
|
||||
{
|
||||
|
@ -194,7 +169,6 @@ namespace Ryujinx.Cpu.Jit
|
|||
}
|
||||
}
|
||||
|
||||
/// <inheritdoc/>
|
||||
public override void Read(ulong va, Span<byte> data)
|
||||
{
|
||||
try
|
||||
|
@ -212,9 +186,7 @@ namespace Ryujinx.Cpu.Jit
|
|||
}
|
||||
}
|
||||
|
||||
|
||||
/// <inheritdoc/>
|
||||
public void Write<T>(ulong va, T value) where T : unmanaged
|
||||
public override void Write<T>(ulong va, T value)
|
||||
{
|
||||
try
|
||||
{
|
||||
|
@ -231,8 +203,7 @@ namespace Ryujinx.Cpu.Jit
|
|||
}
|
||||
}
|
||||
|
||||
/// <inheritdoc/>
|
||||
public void Write(ulong va, ReadOnlySpan<byte> data)
|
||||
public override void Write(ulong va, ReadOnlySpan<byte> data)
|
||||
{
|
||||
try
|
||||
{
|
||||
|
@ -249,8 +220,7 @@ namespace Ryujinx.Cpu.Jit
|
|||
}
|
||||
}
|
||||
|
||||
/// <inheritdoc/>
|
||||
public void WriteUntracked(ulong va, ReadOnlySpan<byte> data)
|
||||
public override void WriteUntracked(ulong va, ReadOnlySpan<byte> data)
|
||||
{
|
||||
try
|
||||
{
|
||||
|
@ -267,8 +237,7 @@ namespace Ryujinx.Cpu.Jit
|
|||
}
|
||||
}
|
||||
|
||||
/// <inheritdoc/>
|
||||
public bool WriteWithRedundancyCheck(ulong va, ReadOnlySpan<byte> data)
|
||||
public override bool WriteWithRedundancyCheck(ulong va, ReadOnlySpan<byte> data)
|
||||
{
|
||||
try
|
||||
{
|
||||
|
@ -295,8 +264,21 @@ namespace Ryujinx.Cpu.Jit
|
|||
}
|
||||
}
|
||||
|
||||
/// <inheritdoc/>
|
||||
public ReadOnlySpan<byte> GetSpan(ulong va, int size, bool tracked = false)
|
||||
public override ReadOnlySequence<byte> GetReadOnlySequence(ulong va, int size, bool tracked = false)
|
||||
{
|
||||
if (tracked)
|
||||
{
|
||||
SignalMemoryTracking(va, (ulong)size, write: false);
|
||||
}
|
||||
else
|
||||
{
|
||||
AssertMapped(va, (ulong)size);
|
||||
}
|
||||
|
||||
return new ReadOnlySequence<byte>(_addressSpace.Mirror.GetMemory(va, size));
|
||||
}
|
||||
|
||||
public override ReadOnlySpan<byte> GetSpan(ulong va, int size, bool tracked = false)
|
||||
{
|
||||
if (tracked)
|
||||
{
|
||||
|
@ -310,8 +292,7 @@ namespace Ryujinx.Cpu.Jit
|
|||
return _addressSpace.Mirror.GetSpan(va, size);
|
||||
}
|
||||
|
||||
/// <inheritdoc/>
|
||||
public WritableRegion GetWritableRegion(ulong va, int size, bool tracked = false)
|
||||
public override WritableRegion GetWritableRegion(ulong va, int size, bool tracked = false)
|
||||
{
|
||||
if (tracked)
|
||||
{
|
||||
|
@ -325,7 +306,6 @@ namespace Ryujinx.Cpu.Jit
|
|||
return _addressSpace.Mirror.GetWritableRegion(va, size);
|
||||
}
|
||||
|
||||
/// <inheritdoc/>
|
||||
public ref T GetRef<T>(ulong va) where T : unmanaged
|
||||
{
|
||||
SignalMemoryTracking(va, (ulong)Unsafe.SizeOf<T>(), true);
|
||||
|
@ -333,26 +313,10 @@ namespace Ryujinx.Cpu.Jit
|
|||
return ref _addressSpace.Mirror.GetRef<T>(va);
|
||||
}
|
||||
|
||||
/// <inheritdoc/>
|
||||
[MethodImpl(MethodImplOptions.AggressiveInlining)]
|
||||
public bool IsMapped(ulong va)
|
||||
public override bool IsMapped(ulong va)
|
||||
{
|
||||
return ValidateAddress(va) && IsMappedImpl(va);
|
||||
}
|
||||
|
||||
[MethodImpl(MethodImplOptions.AggressiveInlining)]
|
||||
private bool IsMappedImpl(ulong va)
|
||||
{
|
||||
ulong page = va >> PageBits;
|
||||
|
||||
int bit = (int)((page & 31) << 1);
|
||||
|
||||
int pageIndex = (int)(page >> PageToPteShift);
|
||||
ref ulong pageRef = ref _pageBitmap[pageIndex];
|
||||
|
||||
ulong pte = Volatile.Read(ref pageRef);
|
||||
|
||||
return ((pte >> bit) & 3) != 0;
|
||||
return ValidateAddress(va) && _pages.IsMapped(va);
|
||||
}
|
||||
|
||||
/// <inheritdoc/>
|
||||
|
@ -360,58 +324,7 @@ namespace Ryujinx.Cpu.Jit
|
|||
{
|
||||
AssertValidAddressAndSize(va, size);
|
||||
|
||||
return IsRangeMappedImpl(va, size);
|
||||
}
|
||||
|
||||
[MethodImpl(MethodImplOptions.AggressiveInlining)]
|
||||
private static void GetPageBlockRange(ulong pageStart, ulong pageEnd, out ulong startMask, out ulong endMask, out int pageIndex, out int pageEndIndex)
|
||||
{
|
||||
startMask = ulong.MaxValue << ((int)(pageStart & 31) << 1);
|
||||
endMask = ulong.MaxValue >> (64 - ((int)(pageEnd & 31) << 1));
|
||||
|
||||
pageIndex = (int)(pageStart >> PageToPteShift);
|
||||
pageEndIndex = (int)((pageEnd - 1) >> PageToPteShift);
|
||||
}
|
||||
|
||||
private bool IsRangeMappedImpl(ulong va, ulong size)
|
||||
{
|
||||
int pages = GetPagesCount(va, size, out _);
|
||||
|
||||
if (pages == 1)
|
||||
{
|
||||
return IsMappedImpl(va);
|
||||
}
|
||||
|
||||
ulong pageStart = va >> PageBits;
|
||||
ulong pageEnd = pageStart + (ulong)pages;
|
||||
|
||||
GetPageBlockRange(pageStart, pageEnd, out ulong startMask, out ulong endMask, out int pageIndex, out int pageEndIndex);
|
||||
|
||||
// Check if either bit in each 2 bit page entry is set.
|
||||
// OR the block with itself shifted down by 1, and check the first bit of each entry.
|
||||
|
||||
ulong mask = BlockMappedMask & startMask;
|
||||
|
||||
while (pageIndex <= pageEndIndex)
|
||||
{
|
||||
if (pageIndex == pageEndIndex)
|
||||
{
|
||||
mask &= endMask;
|
||||
}
|
||||
|
||||
ref ulong pageRef = ref _pageBitmap[pageIndex++];
|
||||
ulong pte = Volatile.Read(ref pageRef);
|
||||
|
||||
pte |= pte >> 1;
|
||||
if ((pte & mask) != mask)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
mask = BlockMappedMask;
|
||||
}
|
||||
|
||||
return true;
|
||||
return _pages.IsRangeMapped(va, size);
|
||||
}
|
||||
|
||||
/// <inheritdoc/>
|
||||
|
@ -472,11 +385,10 @@ namespace Ryujinx.Cpu.Jit
|
|||
return _pageTable.Read(va) + (va & PageMask);
|
||||
}
|
||||
|
||||
/// <inheritdoc/>
|
||||
/// <remarks>
|
||||
/// This function also validates that the given range is both valid and mapped, and will throw if it is not.
|
||||
/// </remarks>
|
||||
public void SignalMemoryTracking(ulong va, ulong size, bool write, bool precise = false, int? exemptId = null)
|
||||
public override void SignalMemoryTracking(ulong va, ulong size, bool write, bool precise = false, int? exemptId = null)
|
||||
{
|
||||
AssertValidAddressAndSize(va, size);
|
||||
|
||||
|
@ -486,93 +398,7 @@ namespace Ryujinx.Cpu.Jit
|
|||
return;
|
||||
}
|
||||
|
||||
// Software table, used for managed memory tracking.
|
||||
|
||||
int pages = GetPagesCount(va, size, out _);
|
||||
ulong pageStart = va >> PageBits;
|
||||
|
||||
if (pages == 1)
|
||||
{
|
||||
ulong tag = (ulong)(write ? HostMappedPtBits.WriteTracked : HostMappedPtBits.ReadWriteTracked);
|
||||
|
||||
int bit = (int)((pageStart & 31) << 1);
|
||||
|
||||
int pageIndex = (int)(pageStart >> PageToPteShift);
|
||||
ref ulong pageRef = ref _pageBitmap[pageIndex];
|
||||
|
||||
ulong pte = Volatile.Read(ref pageRef);
|
||||
ulong state = ((pte >> bit) & 3);
|
||||
|
||||
if (state >= tag)
|
||||
{
|
||||
Tracking.VirtualMemoryEvent(va, size, write, precise: false, exemptId);
|
||||
return;
|
||||
}
|
||||
else if (state == 0)
|
||||
{
|
||||
ThrowInvalidMemoryRegionException($"Not mapped: va=0x{va:X16}, size=0x{size:X16}");
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
ulong pageEnd = pageStart + (ulong)pages;
|
||||
|
||||
GetPageBlockRange(pageStart, pageEnd, out ulong startMask, out ulong endMask, out int pageIndex, out int pageEndIndex);
|
||||
|
||||
ulong mask = startMask;
|
||||
|
||||
ulong anyTrackingTag = (ulong)HostMappedPtBits.WriteTrackedReplicated;
|
||||
|
||||
while (pageIndex <= pageEndIndex)
|
||||
{
|
||||
if (pageIndex == pageEndIndex)
|
||||
{
|
||||
mask &= endMask;
|
||||
}
|
||||
|
||||
ref ulong pageRef = ref _pageBitmap[pageIndex++];
|
||||
|
||||
ulong pte = Volatile.Read(ref pageRef);
|
||||
ulong mappedMask = mask & BlockMappedMask;
|
||||
|
||||
ulong mappedPte = pte | (pte >> 1);
|
||||
if ((mappedPte & mappedMask) != mappedMask)
|
||||
{
|
||||
ThrowInvalidMemoryRegionException($"Not mapped: va=0x{va:X16}, size=0x{size:X16}");
|
||||
}
|
||||
|
||||
pte &= mask;
|
||||
if ((pte & anyTrackingTag) != 0) // Search for any tracking.
|
||||
{
|
||||
// Writes trigger any tracking.
|
||||
// Only trigger tracking from reads if both bits are set on any page.
|
||||
if (write || (pte & (pte >> 1) & BlockMappedMask) != 0)
|
||||
{
|
||||
Tracking.VirtualMemoryEvent(va, size, write, precise: false, exemptId);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
mask = ulong.MaxValue;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Computes the number of pages in a virtual address range.
|
||||
/// </summary>
|
||||
/// <param name="va">Virtual address of the range</param>
|
||||
/// <param name="size">Size of the range</param>
|
||||
/// <param name="startVa">The virtual address of the beginning of the first page</param>
|
||||
/// <remarks>This function does not differentiate between allocated and unallocated pages.</remarks>
|
||||
[MethodImpl(MethodImplOptions.AggressiveInlining)]
|
||||
private static int GetPagesCount(ulong va, ulong size, out ulong startVa)
|
||||
{
|
||||
// WARNING: Always check if ulong does not overflow during the operations.
|
||||
startVa = va & ~(ulong)PageMask;
|
||||
ulong vaSpan = (va - startVa + size + PageMask) & ~(ulong)PageMask;
|
||||
|
||||
return (int)(vaSpan / PageSize);
|
||||
_pages.SignalMemoryTracking(Tracking, va, size, write, exemptId);
|
||||
}
|
||||
|
||||
/// <inheritdoc/>
|
||||
|
@ -582,103 +408,28 @@ namespace Ryujinx.Cpu.Jit
|
|||
}
|
||||
|
||||
/// <inheritdoc/>
|
||||
public void TrackingReprotect(ulong va, ulong size, MemoryPermission protection)
|
||||
public void TrackingReprotect(ulong va, ulong size, MemoryPermission protection, bool guest)
|
||||
{
|
||||
// Protection is inverted on software pages, since the default value is 0.
|
||||
protection = (~protection) & MemoryPermission.ReadAndWrite;
|
||||
|
||||
int pages = GetPagesCount(va, size, out va);
|
||||
ulong pageStart = va >> PageBits;
|
||||
|
||||
if (pages == 1)
|
||||
if (guest)
|
||||
{
|
||||
ulong protTag = protection switch
|
||||
{
|
||||
MemoryPermission.None => (ulong)HostMappedPtBits.Mapped,
|
||||
MemoryPermission.Write => (ulong)HostMappedPtBits.WriteTracked,
|
||||
_ => (ulong)HostMappedPtBits.ReadWriteTracked,
|
||||
};
|
||||
|
||||
int bit = (int)((pageStart & 31) << 1);
|
||||
|
||||
ulong tagMask = 3UL << bit;
|
||||
ulong invTagMask = ~tagMask;
|
||||
|
||||
ulong tag = protTag << bit;
|
||||
|
||||
int pageIndex = (int)(pageStart >> PageToPteShift);
|
||||
ref ulong pageRef = ref _pageBitmap[pageIndex];
|
||||
|
||||
ulong pte;
|
||||
|
||||
do
|
||||
{
|
||||
pte = Volatile.Read(ref pageRef);
|
||||
}
|
||||
while ((pte & tagMask) != 0 && Interlocked.CompareExchange(ref pageRef, (pte & invTagMask) | tag, pte) != pte);
|
||||
_addressSpace.Base.Reprotect(va, size, protection, false);
|
||||
}
|
||||
else
|
||||
{
|
||||
ulong pageEnd = pageStart + (ulong)pages;
|
||||
|
||||
GetPageBlockRange(pageStart, pageEnd, out ulong startMask, out ulong endMask, out int pageIndex, out int pageEndIndex);
|
||||
|
||||
ulong mask = startMask;
|
||||
|
||||
ulong protTag = protection switch
|
||||
{
|
||||
MemoryPermission.None => (ulong)HostMappedPtBits.MappedReplicated,
|
||||
MemoryPermission.Write => (ulong)HostMappedPtBits.WriteTrackedReplicated,
|
||||
_ => (ulong)HostMappedPtBits.ReadWriteTrackedReplicated,
|
||||
};
|
||||
|
||||
while (pageIndex <= pageEndIndex)
|
||||
{
|
||||
if (pageIndex == pageEndIndex)
|
||||
{
|
||||
mask &= endMask;
|
||||
}
|
||||
|
||||
ref ulong pageRef = ref _pageBitmap[pageIndex++];
|
||||
|
||||
ulong pte;
|
||||
ulong mappedMask;
|
||||
|
||||
// Change the protection of all 2 bit entries that are mapped.
|
||||
do
|
||||
{
|
||||
pte = Volatile.Read(ref pageRef);
|
||||
|
||||
mappedMask = pte | (pte >> 1);
|
||||
mappedMask |= (mappedMask & BlockMappedMask) << 1;
|
||||
mappedMask &= mask; // Only update mapped pages within the given range.
|
||||
}
|
||||
while (Interlocked.CompareExchange(ref pageRef, (pte & (~mappedMask)) | (protTag & mappedMask), pte) != pte);
|
||||
|
||||
mask = ulong.MaxValue;
|
||||
}
|
||||
_pages.TrackingReprotect(va, size, protection);
|
||||
}
|
||||
|
||||
protection = protection switch
|
||||
{
|
||||
MemoryPermission.None => MemoryPermission.ReadAndWrite,
|
||||
MemoryPermission.Write => MemoryPermission.Read,
|
||||
_ => MemoryPermission.None,
|
||||
};
|
||||
|
||||
_addressSpace.Base.Reprotect(va, size, protection, false);
|
||||
}
|
||||
|
||||
/// <inheritdoc/>
|
||||
public RegionHandle BeginTracking(ulong address, ulong size, int id)
|
||||
public RegionHandle BeginTracking(ulong address, ulong size, int id, RegionFlags flags = RegionFlags.None)
|
||||
{
|
||||
return Tracking.BeginTracking(address, size, id);
|
||||
return Tracking.BeginTracking(address, size, id, flags);
|
||||
}
|
||||
|
||||
/// <inheritdoc/>
|
||||
public MultiRegionHandle BeginGranularTracking(ulong address, ulong size, IEnumerable<IRegionHandle> handles, ulong granularity, int id)
|
||||
public MultiRegionHandle BeginGranularTracking(ulong address, ulong size, IEnumerable<IRegionHandle> handles, ulong granularity, int id, RegionFlags flags = RegionFlags.None)
|
||||
{
|
||||
return Tracking.BeginGranularTracking(address, size, handles, granularity, id);
|
||||
return Tracking.BeginGranularTracking(address, size, handles, granularity, id, flags);
|
||||
}
|
||||
|
||||
/// <inheritdoc/>
|
||||
|
@ -687,86 +438,6 @@ namespace Ryujinx.Cpu.Jit
|
|||
return Tracking.BeginSmartGranularTracking(address, size, granularity, id);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Adds the given address mapping to the page table.
|
||||
/// </summary>
|
||||
/// <param name="va">Virtual memory address</param>
|
||||
/// <param name="size">Size to be mapped</param>
|
||||
private void AddMapping(ulong va, ulong size)
|
||||
{
|
||||
int pages = GetPagesCount(va, size, out _);
|
||||
ulong pageStart = va >> PageBits;
|
||||
ulong pageEnd = pageStart + (ulong)pages;
|
||||
|
||||
GetPageBlockRange(pageStart, pageEnd, out ulong startMask, out ulong endMask, out int pageIndex, out int pageEndIndex);
|
||||
|
||||
ulong mask = startMask;
|
||||
|
||||
while (pageIndex <= pageEndIndex)
|
||||
{
|
||||
if (pageIndex == pageEndIndex)
|
||||
{
|
||||
mask &= endMask;
|
||||
}
|
||||
|
||||
ref ulong pageRef = ref _pageBitmap[pageIndex++];
|
||||
|
||||
ulong pte;
|
||||
ulong mappedMask;
|
||||
|
||||
// Map all 2-bit entries that are unmapped.
|
||||
do
|
||||
{
|
||||
pte = Volatile.Read(ref pageRef);
|
||||
|
||||
mappedMask = pte | (pte >> 1);
|
||||
mappedMask |= (mappedMask & BlockMappedMask) << 1;
|
||||
mappedMask |= ~mask; // Treat everything outside the range as mapped, thus unchanged.
|
||||
}
|
||||
while (Interlocked.CompareExchange(ref pageRef, (pte & mappedMask) | (BlockMappedMask & (~mappedMask)), pte) != pte);
|
||||
|
||||
mask = ulong.MaxValue;
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Removes the given address mapping from the page table.
|
||||
/// </summary>
|
||||
/// <param name="va">Virtual memory address</param>
|
||||
/// <param name="size">Size to be unmapped</param>
|
||||
private void RemoveMapping(ulong va, ulong size)
|
||||
{
|
||||
int pages = GetPagesCount(va, size, out _);
|
||||
ulong pageStart = va >> PageBits;
|
||||
ulong pageEnd = pageStart + (ulong)pages;
|
||||
|
||||
GetPageBlockRange(pageStart, pageEnd, out ulong startMask, out ulong endMask, out int pageIndex, out int pageEndIndex);
|
||||
|
||||
startMask = ~startMask;
|
||||
endMask = ~endMask;
|
||||
|
||||
ulong mask = startMask;
|
||||
|
||||
while (pageIndex <= pageEndIndex)
|
||||
{
|
||||
if (pageIndex == pageEndIndex)
|
||||
{
|
||||
mask |= endMask;
|
||||
}
|
||||
|
||||
ref ulong pageRef = ref _pageBitmap[pageIndex++];
|
||||
ulong pte;
|
||||
|
||||
do
|
||||
{
|
||||
pte = Volatile.Read(ref pageRef);
|
||||
}
|
||||
while (Interlocked.CompareExchange(ref pageRef, pte & mask, pte) != pte);
|
||||
|
||||
mask = 0;
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Disposes of resources used by the memory manager.
|
||||
/// </summary>
|
||||
|
@ -776,10 +447,16 @@ namespace Ryujinx.Cpu.Jit
|
|||
_memoryEh.Dispose();
|
||||
}
|
||||
|
||||
protected override Span<byte> GetPhysicalAddressSpan(ulong pa, int size)
|
||||
protected override Memory<byte> GetPhysicalAddressMemory(nuint pa, int size)
|
||||
=> _addressSpace.Mirror.GetMemory(pa, size);
|
||||
|
||||
protected override Span<byte> GetPhysicalAddressSpan(nuint pa, int size)
|
||||
=> _addressSpace.Mirror.GetSpan(pa, size);
|
||||
|
||||
protected override ulong TranslateVirtualAddressForRead(ulong va)
|
||||
=> va;
|
||||
protected override nuint TranslateVirtualAddressChecked(ulong va)
|
||||
=> (nuint)GetPhysicalAddressChecked(va);
|
||||
|
||||
protected override nuint TranslateVirtualAddressUnchecked(ulong va)
|
||||
=> (nuint)GetPhysicalAddressInternal(va);
|
||||
}
|
||||
}
|
||||
|
|
568
src/Ryujinx.Cpu/Jit/MemoryManagerHostTracked.cs
Normal file
|
@ -0,0 +1,568 @@
|
|||
using ARMeilleure.Memory;
|
||||
using Ryujinx.Cpu.Jit.HostTracked;
|
||||
using Ryujinx.Cpu.Signal;
|
||||
using Ryujinx.Memory;
|
||||
using Ryujinx.Memory.Range;
|
||||
using Ryujinx.Memory.Tracking;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Runtime.CompilerServices;
|
||||
|
||||
namespace Ryujinx.Cpu.Jit
|
||||
{
|
||||
/// <summary>
|
||||
/// Represents a CPU memory manager which maps guest virtual memory directly onto a host virtual region.
|
||||
/// </summary>
|
||||
public sealed class MemoryManagerHostTracked : VirtualMemoryManagerRefCountedBase, IMemoryManager, IVirtualMemoryManagerTracked
|
||||
{
|
||||
private readonly InvalidAccessHandler _invalidAccessHandler;
|
||||
private readonly bool _unsafeMode;
|
||||
|
||||
private readonly MemoryBlock _backingMemory;
|
||||
|
||||
public int AddressSpaceBits { get; }
|
||||
|
||||
public MemoryTracking Tracking { get; }
|
||||
|
||||
private readonly NativePageTable _nativePageTable;
|
||||
private readonly AddressSpacePartitioned _addressSpace;
|
||||
|
||||
private readonly ManagedPageFlags _pages;
|
||||
|
||||
protected override ulong AddressSpaceSize { get; }
|
||||
|
||||
/// <inheritdoc/>
|
||||
public bool Supports4KBPages => false;
|
||||
|
||||
public IntPtr PageTablePointer => _nativePageTable.PageTablePointer;
|
||||
|
||||
public MemoryManagerType Type => _unsafeMode ? MemoryManagerType.HostTrackedUnsafe : MemoryManagerType.HostTracked;
|
||||
|
||||
public event Action<ulong, ulong> UnmapEvent;
|
||||
|
||||
/// <summary>
|
||||
/// Creates a new instance of the host tracked memory manager.
|
||||
/// </summary>
|
||||
/// <param name="backingMemory">Physical backing memory where virtual memory will be mapped to</param>
|
||||
/// <param name="addressSpaceSize">Size of the address space</param>
|
||||
/// <param name="unsafeMode">True if unmanaged access should not be masked (unsafe), false otherwise.</param>
|
||||
/// <param name="invalidAccessHandler">Optional function to handle invalid memory accesses</param>
|
||||
public MemoryManagerHostTracked(MemoryBlock backingMemory, ulong addressSpaceSize, bool unsafeMode, InvalidAccessHandler invalidAccessHandler)
|
||||
{
|
||||
bool useProtectionMirrors = MemoryBlock.GetPageSize() > PageSize;
|
||||
|
||||
Tracking = new MemoryTracking(this, PageSize, invalidAccessHandler, useProtectionMirrors);
|
||||
|
||||
_backingMemory = backingMemory;
|
||||
_invalidAccessHandler = invalidAccessHandler;
|
||||
_unsafeMode = unsafeMode;
|
||||
AddressSpaceSize = addressSpaceSize;
|
||||
|
||||
ulong asSize = PageSize;
|
||||
int asBits = PageBits;
|
||||
|
||||
while (asSize < AddressSpaceSize)
|
||||
{
|
||||
asSize <<= 1;
|
||||
asBits++;
|
||||
}
|
||||
|
||||
AddressSpaceBits = asBits;
|
||||
|
||||
if (useProtectionMirrors && !NativeSignalHandler.SupportsFaultAddressPatching())
|
||||
{
|
||||
// Currently we require being able to change the fault address to something else
|
||||
// in order to "emulate" 4KB granularity protection on systems with larger page size.
|
||||
|
||||
throw new PlatformNotSupportedException();
|
||||
}
|
||||
|
||||
_pages = new ManagedPageFlags(asBits);
|
||||
_nativePageTable = new(asSize);
|
||||
_addressSpace = new(Tracking, backingMemory, _nativePageTable, useProtectionMirrors);
|
||||
}
|
||||
|
||||
/// <inheritdoc/>
|
||||
public void Map(ulong va, ulong pa, ulong size, MemoryMapFlags flags)
|
||||
{
|
||||
AssertValidAddressAndSize(va, size);
|
||||
|
||||
if (flags.HasFlag(MemoryMapFlags.Private))
|
||||
{
|
||||
_addressSpace.Map(va, pa, size);
|
||||
}
|
||||
|
||||
_pages.AddMapping(va, size);
|
||||
_nativePageTable.Map(va, pa, size, _addressSpace, _backingMemory, flags.HasFlag(MemoryMapFlags.Private));
|
||||
|
||||
Tracking.Map(va, size);
|
||||
}
|
||||
|
||||
/// <inheritdoc/>
|
||||
public void Unmap(ulong va, ulong size)
|
||||
{
|
||||
AssertValidAddressAndSize(va, size);
|
||||
|
||||
_addressSpace.Unmap(va, size);
|
||||
|
||||
UnmapEvent?.Invoke(va, size);
|
||||
Tracking.Unmap(va, size);
|
||||
|
||||
_pages.RemoveMapping(va, size);
|
||||
_nativePageTable.Unmap(va, size);
|
||||
}
|
||||
|
||||
public override T ReadTracked<T>(ulong va)
|
||||
{
|
||||
try
|
||||
{
|
||||
return base.ReadTracked<T>(va);
|
||||
}
|
||||
catch (InvalidMemoryRegionException)
|
||||
{
|
||||
if (_invalidAccessHandler == null || !_invalidAccessHandler(va))
|
||||
{
|
||||
throw;
|
||||
}
|
||||
|
||||
return default;
|
||||
}
|
||||
}
|
||||
|
||||
public override void Read(ulong va, Span<byte> data)
|
||||
{
|
||||
if (data.Length == 0)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
try
|
||||
{
|
||||
AssertValidAddressAndSize(va, (ulong)data.Length);
|
||||
|
||||
ulong endVa = va + (ulong)data.Length;
|
||||
int offset = 0;
|
||||
|
||||
while (va < endVa)
|
||||
{
|
||||
(MemoryBlock memory, ulong rangeOffset, ulong copySize) = GetMemoryOffsetAndSize(va, (ulong)(data.Length - offset));
|
||||
|
||||
memory.GetSpan(rangeOffset, (int)copySize).CopyTo(data.Slice(offset, (int)copySize));
|
||||
|
||||
va += copySize;
|
||||
offset += (int)copySize;
|
||||
}
|
||||
}
|
||||
catch (InvalidMemoryRegionException)
|
||||
{
|
||||
if (_invalidAccessHandler == null || !_invalidAccessHandler(va))
|
||||
{
|
||||
throw;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public override bool WriteWithRedundancyCheck(ulong va, ReadOnlySpan<byte> data)
|
||||
{
|
||||
if (data.Length == 0)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
SignalMemoryTracking(va, (ulong)data.Length, false);
|
||||
|
||||
if (TryGetVirtualContiguous(va, data.Length, out MemoryBlock memoryBlock, out ulong offset))
|
||||
{
|
||||
var target = memoryBlock.GetSpan(offset, data.Length);
|
||||
|
||||
bool changed = !data.SequenceEqual(target);
|
||||
|
||||
if (changed)
|
||||
{
|
||||
data.CopyTo(target);
|
||||
}
|
||||
|
||||
return changed;
|
||||
}
|
||||
else
|
||||
{
|
||||
WriteImpl(va, data);
|
||||
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
public override ReadOnlySpan<byte> GetSpan(ulong va, int size, bool tracked = false)
|
||||
{
|
||||
if (size == 0)
|
||||
{
|
||||
return ReadOnlySpan<byte>.Empty;
|
||||
}
|
||||
|
||||
if (tracked)
|
||||
{
|
||||
SignalMemoryTracking(va, (ulong)size, false);
|
||||
}
|
||||
|
||||
if (TryGetVirtualContiguous(va, size, out MemoryBlock memoryBlock, out ulong offset))
|
||||
{
|
||||
return memoryBlock.GetSpan(offset, size);
|
||||
}
|
||||
else
|
||||
{
|
||||
Span<byte> data = new byte[size];
|
||||
|
||||
Read(va, data);
|
||||
|
||||
return data;
|
||||
}
|
||||
}
|
||||
|
||||
public override WritableRegion GetWritableRegion(ulong va, int size, bool tracked = false)
|
||||
{
|
||||
if (size == 0)
|
||||
{
|
||||
return new WritableRegion(null, va, Memory<byte>.Empty);
|
||||
}
|
||||
|
||||
if (tracked)
|
||||
{
|
||||
SignalMemoryTracking(va, (ulong)size, true);
|
||||
}
|
||||
|
||||
if (TryGetVirtualContiguous(va, size, out MemoryBlock memoryBlock, out ulong offset))
|
||||
{
|
||||
return new WritableRegion(null, va, memoryBlock.GetMemory(offset, size));
|
||||
}
|
||||
else
|
||||
{
|
||||
Memory<byte> memory = new byte[size];
|
||||
|
||||
Read(va, memory.Span);
|
||||
|
||||
return new WritableRegion(this, va, memory);
|
||||
}
|
||||
}
|
||||
|
||||
public ref T GetRef<T>(ulong va) where T : unmanaged
|
||||
{
|
||||
if (!TryGetVirtualContiguous(va, Unsafe.SizeOf<T>(), out MemoryBlock memory, out ulong offset))
|
||||
{
|
||||
ThrowMemoryNotContiguous();
|
||||
}
|
||||
|
||||
SignalMemoryTracking(va, (ulong)Unsafe.SizeOf<T>(), true);
|
||||
|
||||
return ref memory.GetRef<T>(offset);
|
||||
}
|
||||
|
||||
[MethodImpl(MethodImplOptions.AggressiveInlining)]
|
||||
public override bool IsMapped(ulong va)
|
||||
{
|
||||
return ValidateAddress(va) && _pages.IsMapped(va);
|
||||
}
|
||||
|
||||
public bool IsRangeMapped(ulong va, ulong size)
|
||||
{
|
||||
AssertValidAddressAndSize(va, size);
|
||||
|
||||
return _pages.IsRangeMapped(va, size);
|
||||
}
|
||||
|
||||
private bool TryGetVirtualContiguous(ulong va, int size, out MemoryBlock memory, out ulong offset)
|
||||
{
|
||||
if (_addressSpace.HasAnyPrivateAllocation(va, (ulong)size, out PrivateRange range))
|
||||
{
|
||||
// If we have a private allocation overlapping the range,
|
||||
// then the access is only considered contiguous if it covers the entire range.
|
||||
|
||||
if (range.Memory != null)
|
||||
{
|
||||
memory = range.Memory;
|
||||
offset = range.Offset;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
memory = null;
|
||||
offset = 0;
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
memory = _backingMemory;
|
||||
offset = GetPhysicalAddressInternal(va);
|
||||
|
||||
return IsPhysicalContiguous(va, size);
|
||||
}
|
||||
|
||||
[MethodImpl(MethodImplOptions.AggressiveInlining)]
|
||||
private bool IsPhysicalContiguous(ulong va, int size)
|
||||
{
|
||||
if (!ValidateAddress(va) || !ValidateAddressAndSize(va, (ulong)size))
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
int pages = GetPagesCount(va, (uint)size, out va);
|
||||
|
||||
for (int page = 0; page < pages - 1; page++)
|
||||
{
|
||||
if (!ValidateAddress(va + PageSize))
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
if (GetPhysicalAddressInternal(va) + PageSize != GetPhysicalAddressInternal(va + PageSize))
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
va += PageSize;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
[MethodImpl(MethodImplOptions.AggressiveInlining)]
|
||||
private ulong GetContiguousSize(ulong va, ulong size)
|
||||
{
|
||||
ulong contiguousSize = PageSize - (va & PageMask);
|
||||
|
||||
if (!ValidateAddress(va) || !ValidateAddressAndSize(va, size))
|
||||
{
|
||||
return contiguousSize;
|
||||
}
|
||||
|
||||
int pages = GetPagesCount(va, size, out va);
|
||||
|
||||
for (int page = 0; page < pages - 1; page++)
|
||||
{
|
||||
if (!ValidateAddress(va + PageSize))
|
||||
{
|
||||
return contiguousSize;
|
||||
}
|
||||
|
||||
if (GetPhysicalAddressInternal(va) + PageSize != GetPhysicalAddressInternal(va + PageSize))
|
||||
{
|
||||
return contiguousSize;
|
||||
}
|
||||
|
||||
va += PageSize;
|
||||
contiguousSize += PageSize;
|
||||
}
|
||||
|
||||
return Math.Min(contiguousSize, size);
|
||||
}
|
||||
|
||||
private (MemoryBlock, ulong, ulong) GetMemoryOffsetAndSize(ulong va, ulong size)
|
||||
{
|
||||
PrivateRange privateRange = _addressSpace.GetFirstPrivateAllocation(va, size, out ulong nextVa);
|
||||
|
||||
if (privateRange.Memory != null)
|
||||
{
|
||||
return (privateRange.Memory, privateRange.Offset, privateRange.Size);
|
||||
}
|
||||
|
||||
ulong physSize = GetContiguousSize(va, Math.Min(size, nextVa - va));
|
||||
|
||||
return (_backingMemory, GetPhysicalAddressChecked(va), physSize);
|
||||
}
|
||||
|
||||
public IEnumerable<HostMemoryRange> GetHostRegions(ulong va, ulong size)
|
||||
{
|
||||
if (!ValidateAddressAndSize(va, size))
|
||||
{
|
||||
return null;
|
||||
}
|
||||
|
||||
var regions = new List<HostMemoryRange>();
|
||||
ulong endVa = va + size;
|
||||
|
||||
try
|
||||
{
|
||||
while (va < endVa)
|
||||
{
|
||||
(MemoryBlock memory, ulong rangeOffset, ulong rangeSize) = GetMemoryOffsetAndSize(va, endVa - va);
|
||||
|
||||
regions.Add(new((UIntPtr)memory.GetPointer(rangeOffset, rangeSize), rangeSize));
|
||||
|
||||
va += rangeSize;
|
||||
}
|
||||
}
|
||||
catch (InvalidMemoryRegionException)
|
||||
{
|
||||
return null;
|
||||
}
|
||||
|
||||
return regions;
|
||||
}
|
||||
|
||||
public IEnumerable<MemoryRange> GetPhysicalRegions(ulong va, ulong size)
|
||||
{
|
||||
if (size == 0)
|
||||
{
|
||||
return Enumerable.Empty<MemoryRange>();
|
||||
}
|
||||
|
||||
return GetPhysicalRegionsImpl(va, size);
|
||||
}
|
||||
|
||||
private List<MemoryRange> GetPhysicalRegionsImpl(ulong va, ulong size)
|
||||
{
|
||||
if (!ValidateAddress(va) || !ValidateAddressAndSize(va, size))
|
||||
{
|
||||
return null;
|
||||
}
|
||||
|
||||
int pages = GetPagesCount(va, (uint)size, out va);
|
||||
|
||||
var regions = new List<MemoryRange>();
|
||||
|
||||
ulong regionStart = GetPhysicalAddressInternal(va);
|
||||
ulong regionSize = PageSize;
|
||||
|
||||
for (int page = 0; page < pages - 1; page++)
|
||||
{
|
||||
if (!ValidateAddress(va + PageSize))
|
||||
{
|
||||
return null;
|
||||
}
|
||||
|
||||
ulong newPa = GetPhysicalAddressInternal(va + PageSize);
|
||||
|
||||
if (GetPhysicalAddressInternal(va) + PageSize != newPa)
|
||||
{
|
||||
regions.Add(new MemoryRange(regionStart, regionSize));
|
||||
regionStart = newPa;
|
||||
regionSize = 0;
|
||||
}
|
||||
|
||||
va += PageSize;
|
||||
regionSize += PageSize;
|
||||
}
|
||||
|
||||
regions.Add(new MemoryRange(regionStart, regionSize));
|
||||
|
||||
return regions;
|
||||
}
|
||||
|
||||
/// <inheritdoc/>
|
||||
/// <remarks>
|
||||
/// This function also validates that the given range is both valid and mapped, and will throw if it is not.
|
||||
/// </remarks>
|
||||
public override void SignalMemoryTracking(ulong va, ulong size, bool write, bool precise = false, int? exemptId = null)
|
||||
{
|
||||
AssertValidAddressAndSize(va, size);
|
||||
|
||||
if (precise)
|
||||
{
|
||||
Tracking.VirtualMemoryEvent(va, size, write, precise: true, exemptId);
|
||||
return;
|
||||
}
|
||||
|
||||
// Software table, used for managed memory tracking.
|
||||
|
||||
_pages.SignalMemoryTracking(Tracking, va, size, write, exemptId);
|
||||
}
|
||||
|
||||
public RegionHandle BeginTracking(ulong address, ulong size, int id, RegionFlags flags = RegionFlags.None)
|
||||
{
|
||||
return Tracking.BeginTracking(address, size, id, flags);
|
||||
}
|
||||
|
||||
public MultiRegionHandle BeginGranularTracking(ulong address, ulong size, IEnumerable<IRegionHandle> handles, ulong granularity, int id, RegionFlags flags = RegionFlags.None)
|
||||
{
|
||||
return Tracking.BeginGranularTracking(address, size, handles, granularity, id, flags);
|
||||
}
|
||||
|
||||
public SmartMultiRegionHandle BeginSmartGranularTracking(ulong address, ulong size, ulong granularity, int id)
|
||||
{
|
||||
return Tracking.BeginSmartGranularTracking(address, size, granularity, id);
|
||||
}
|
||||
|
||||
private ulong GetPhysicalAddressChecked(ulong va)
|
||||
{
|
||||
if (!IsMapped(va))
|
||||
{
|
||||
ThrowInvalidMemoryRegionException($"Not mapped: va=0x{va:X16}");
|
||||
}
|
||||
|
||||
return GetPhysicalAddressInternal(va);
|
||||
}
|
||||
|
||||
private ulong GetPhysicalAddressInternal(ulong va)
|
||||
{
|
||||
return _nativePageTable.GetPhysicalAddress(va);
|
||||
}
|
||||
|
||||
/// <inheritdoc/>
|
||||
public void Reprotect(ulong va, ulong size, MemoryPermission protection)
|
||||
{
|
||||
// TODO
|
||||
}
|
||||
|
||||
/// <inheritdoc/>
|
||||
public void TrackingReprotect(ulong va, ulong size, MemoryPermission protection, bool guest)
|
||||
{
|
||||
if (guest)
|
||||
{
|
||||
_addressSpace.Reprotect(va, size, protection);
|
||||
}
|
||||
else
|
||||
{
|
||||
_pages.TrackingReprotect(va, size, protection);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Disposes of resources used by the memory manager.
|
||||
/// </summary>
|
||||
protected override void Destroy()
|
||||
{
|
||||
_addressSpace.Dispose();
|
||||
_nativePageTable.Dispose();
|
||||
}
|
||||
|
||||
protected override Memory<byte> GetPhysicalAddressMemory(nuint pa, int size)
|
||||
=> _backingMemory.GetMemory(pa, size);
|
||||
|
||||
protected override Span<byte> GetPhysicalAddressSpan(nuint pa, int size)
|
||||
=> _backingMemory.GetSpan(pa, size);
|
||||
|
||||
protected override void WriteImpl(ulong va, ReadOnlySpan<byte> data)
|
||||
{
|
||||
try
|
||||
{
|
||||
AssertValidAddressAndSize(va, (ulong)data.Length);
|
||||
|
||||
ulong endVa = va + (ulong)data.Length;
|
||||
int offset = 0;
|
||||
|
||||
while (va < endVa)
|
||||
{
|
||||
(MemoryBlock memory, ulong rangeOffset, ulong copySize) = GetMemoryOffsetAndSize(va, (ulong)(data.Length - offset));
|
||||
|
||||
data.Slice(offset, (int)copySize).CopyTo(memory.GetSpan(rangeOffset, (int)copySize));
|
||||
|
||||
va += copySize;
|
||||
offset += (int)copySize;
|
||||
}
|
||||
}
|
||||
catch (InvalidMemoryRegionException)
|
||||
{
|
||||
if (_invalidAccessHandler == null || !_invalidAccessHandler(va))
|
||||
{
|
||||
throw;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
protected override nuint TranslateVirtualAddressChecked(ulong va)
|
||||
=> (nuint)GetPhysicalAddressChecked(va);
|
||||
|
||||
protected override nuint TranslateVirtualAddressUnchecked(ulong va)
|
||||
=> (nuint)GetPhysicalAddressInternal(va);
|
||||
}
|
||||
}
|
|
@ -1126,11 +1126,23 @@ namespace Ryujinx.Cpu.LightningJit.Arm32.Target.Arm64
|
|||
Operand destination64 = new(destination.Kind, OperandType.I64, destination.Value);
|
||||
Operand basePointer = new(regAlloc.FixedPageTableRegister, RegisterType.Integer, OperandType.I64);
|
||||
|
||||
if (mmType == MemoryManagerType.HostMapped || mmType == MemoryManagerType.HostMappedUnsafe)
|
||||
{
|
||||
// We don't need to mask the address for the safe mode, since it is already naturally limited to 32-bit
|
||||
// and can never reach out of the guest address space.
|
||||
// We don't need to mask the address for the safe mode, since it is already naturally limited to 32-bit
|
||||
// and can never reach out of the guest address space.
|
||||
|
||||
if (mmType.IsHostTracked())
|
||||
{
|
||||
int tempRegister = regAlloc.AllocateTempGprRegister();
|
||||
|
||||
Operand pte = new(tempRegister, RegisterType.Integer, OperandType.I64);
|
||||
|
||||
asm.Lsr(pte, guestAddress, new Operand(OperandKind.Constant, OperandType.I32, 12));
|
||||
asm.LdrRr(pte, basePointer, pte, ArmExtensionType.Uxtx, true);
|
||||
asm.Add(destination64, pte, guestAddress);
|
||||
|
||||
regAlloc.FreeTempGprRegister(tempRegister);
|
||||
}
|
||||
else if (mmType.IsHostMapped())
|
||||
{
|
||||
asm.Add(destination64, basePointer, guestAddress);
|
||||
}
|
||||
else
|
||||
|
|
|
@ -1131,5 +1131,37 @@ namespace Ryujinx.Cpu.LightningJit.Arm64
|
|||
|
||||
return false;
|
||||
}
|
||||
|
||||
public static bool IsPartialRegisterUpdateMemory(this InstName name)
|
||||
{
|
||||
switch (name)
|
||||
{
|
||||
case InstName.Ld1AdvsimdSnglAsNoPostIndex:
|
||||
case InstName.Ld1AdvsimdSnglAsPostIndex:
|
||||
case InstName.Ld2AdvsimdSnglAsNoPostIndex:
|
||||
case InstName.Ld2AdvsimdSnglAsPostIndex:
|
||||
case InstName.Ld3AdvsimdSnglAsNoPostIndex:
|
||||
case InstName.Ld3AdvsimdSnglAsPostIndex:
|
||||
case InstName.Ld4AdvsimdSnglAsNoPostIndex:
|
||||
case InstName.Ld4AdvsimdSnglAsPostIndex:
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
public static bool IsPrefetchMemory(this InstName name)
|
||||
{
|
||||
switch (name)
|
||||
{
|
||||
case InstName.PrfmImm:
|
||||
case InstName.PrfmLit:
|
||||
case InstName.PrfmReg:
|
||||
case InstName.Prfum:
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,15 +1,12 @@
|
|||
using ARMeilleure.Memory;
|
||||
using Ryujinx.Cpu.LightningJit.CodeGen.Arm64;
|
||||
using System;
|
||||
using System.Diagnostics;
|
||||
using System.Numerics;
|
||||
|
||||
namespace Ryujinx.Cpu.LightningJit.Arm64
|
||||
{
|
||||
class RegisterAllocator
|
||||
{
|
||||
public const int MaxTemps = 1;
|
||||
public const int MaxTempsInclFixed = MaxTemps + 2;
|
||||
|
||||
private uint _gprMask;
|
||||
private readonly uint _fpSimdMask;
|
||||
private readonly uint _pStateMask;
|
||||
|
@ -25,7 +22,7 @@ namespace Ryujinx.Cpu.LightningJit.Arm64
|
|||
public uint AllFpSimdMask => _fpSimdMask;
|
||||
public uint AllPStateMask => _pStateMask;
|
||||
|
||||
public RegisterAllocator(uint gprMask, uint fpSimdMask, uint pStateMask, bool hasHostCall)
|
||||
public RegisterAllocator(MemoryManagerType mmType, uint gprMask, uint fpSimdMask, uint pStateMask, bool hasHostCall)
|
||||
{
|
||||
_gprMask = gprMask;
|
||||
_fpSimdMask = fpSimdMask;
|
||||
|
@ -56,7 +53,7 @@ namespace Ryujinx.Cpu.LightningJit.Arm64
|
|||
|
||||
BuildRegisterMap(_registerMap);
|
||||
|
||||
Span<int> tempRegisters = stackalloc int[MaxTemps];
|
||||
Span<int> tempRegisters = stackalloc int[CalculateMaxTemps(mmType)];
|
||||
|
||||
for (int index = 0; index < tempRegisters.Length; index++)
|
||||
{
|
||||
|
@ -150,5 +147,15 @@ namespace Ryujinx.Cpu.LightningJit.Arm64
|
|||
{
|
||||
mask &= ~(1u << index);
|
||||
}
|
||||
|
||||
public static int CalculateMaxTemps(MemoryManagerType mmType)
|
||||
{
|
||||
return mmType.IsHostMapped() ? 1 : 2;
|
||||
}
|
||||
|
||||
public static int CalculateMaxTempsInclFixed(MemoryManagerType mmType)
|
||||
{
|
||||
return CalculateMaxTemps(mmType) + 2;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -247,7 +247,7 @@ namespace Ryujinx.Cpu.LightningJit.Arm64
|
|||
}
|
||||
}
|
||||
|
||||
if (!flags.HasFlag(InstFlags.ReadRt))
|
||||
if (!flags.HasFlag(InstFlags.ReadRt) || name.IsPartialRegisterUpdateMemory())
|
||||
{
|
||||
if (flags.HasFlag(InstFlags.Rt))
|
||||
{
|
||||
|
@ -281,7 +281,7 @@ namespace Ryujinx.Cpu.LightningJit.Arm64
|
|||
gprMask |= MaskFromIndex(ExtractRd(flags, encoding));
|
||||
}
|
||||
|
||||
if (!flags.HasFlag(InstFlags.ReadRt))
|
||||
if (!flags.HasFlag(InstFlags.ReadRt) || name.IsPartialRegisterUpdateMemory())
|
||||
{
|
||||
if (flags.HasFlag(InstFlags.Rt))
|
||||
{
|
||||
|
|
|
@ -316,7 +316,7 @@ namespace Ryujinx.Cpu.LightningJit.Arm64.Target.Arm64
|
|||
uint pStateUseMask = multiBlock.GlobalUseMask.PStateMask;
|
||||
|
||||
CodeWriter writer = new();
|
||||
RegisterAllocator regAlloc = new(gprUseMask, fpSimdUseMask, pStateUseMask, multiBlock.HasHostCall);
|
||||
RegisterAllocator regAlloc = new(memoryManager.Type, gprUseMask, fpSimdUseMask, pStateUseMask, multiBlock.HasHostCall);
|
||||
RegisterSaveRestore rsr = new(
|
||||
regAlloc.AllGprMask & AbiConstants.GprCalleeSavedRegsMask,
|
||||
regAlloc.AllFpSimdMask & AbiConstants.FpSimdCalleeSavedRegsMask,
|
||||
|
|
|
@ -274,7 +274,8 @@ namespace Ryujinx.Cpu.LightningJit.Arm64.Target.Arm64
|
|||
|
||||
uint tempGprUseMask = gprUseMask | instGprReadMask | instGprWriteMask;
|
||||
|
||||
if (CalculateAvailableTemps(tempGprUseMask) < CalculateRequiredGprTemps(tempGprUseMask) || totalInsts++ >= MaxInstructionsPerFunction)
|
||||
if (CalculateAvailableTemps(tempGprUseMask) < CalculateRequiredGprTemps(memoryManager.Type, tempGprUseMask) ||
|
||||
totalInsts++ >= MaxInstructionsPerFunction)
|
||||
{
|
||||
isTruncated = true;
|
||||
address -= 4UL;
|
||||
|
@ -378,9 +379,9 @@ namespace Ryujinx.Cpu.LightningJit.Arm64.Target.Arm64
|
|||
return false;
|
||||
}
|
||||
|
||||
private static int CalculateRequiredGprTemps(uint gprUseMask)
|
||||
private static int CalculateRequiredGprTemps(MemoryManagerType mmType, uint gprUseMask)
|
||||
{
|
||||
return BitOperations.PopCount(gprUseMask & RegisterUtils.ReservedRegsMask) + RegisterAllocator.MaxTempsInclFixed;
|
||||
return BitOperations.PopCount(gprUseMask & RegisterUtils.ReservedRegsMask) + RegisterAllocator.CalculateMaxTempsInclFixed(mmType);
|
||||
}
|
||||
|
||||
private static int CalculateAvailableTemps(uint gprUseMask)
|
||||
|
|
|
@ -55,6 +55,16 @@ namespace Ryujinx.Cpu.LightningJit.Arm64.Target.Arm64
|
|||
ulong pc,
|
||||
uint encoding)
|
||||
{
|
||||
if (name.IsPrefetchMemory() && mmType == MemoryManagerType.HostTrackedUnsafe)
|
||||
{
|
||||
// Prefetch to invalid addresses do not cause faults, so for memory manager
|
||||
// types where we need to access the page table before doing the prefetch,
|
||||
// we should make sure we won't try to access an out of bounds page table region.
|
||||
// To do this, we force the masked memory manager variant to be used.
|
||||
|
||||
mmType = MemoryManagerType.HostTracked;
|
||||
}
|
||||
|
||||
switch (addressForm)
|
||||
{
|
||||
case AddressForm.OffsetReg:
|
||||
|
@ -511,18 +521,48 @@ namespace Ryujinx.Cpu.LightningJit.Arm64.Target.Arm64
|
|||
WriteAddressTranslation(asBits, mmType, regAlloc, ref asm, destination, guestAddress);
|
||||
}
|
||||
|
||||
private static void WriteAddressTranslation(int asBits, MemoryManagerType mmType, RegisterAllocator regAlloc, ref Assembler asm, Operand destination, ulong guestAddress)
|
||||
private static void WriteAddressTranslation(
|
||||
int asBits,
|
||||
MemoryManagerType mmType,
|
||||
RegisterAllocator regAlloc,
|
||||
ref Assembler asm,
|
||||
Operand destination,
|
||||
ulong guestAddress)
|
||||
{
|
||||
asm.Mov(destination, guestAddress);
|
||||
|
||||
WriteAddressTranslation(asBits, mmType, regAlloc, ref asm, destination, destination);
|
||||
}
|
||||
|
||||
private static void WriteAddressTranslation(int asBits, MemoryManagerType mmType, RegisterAllocator regAlloc, ref Assembler asm, Operand destination, Operand guestAddress)
|
||||
private static void WriteAddressTranslation(
|
||||
int asBits,
|
||||
MemoryManagerType mmType,
|
||||
RegisterAllocator regAlloc,
|
||||
ref Assembler asm,
|
||||
Operand destination,
|
||||
Operand guestAddress)
|
||||
{
|
||||
Operand basePointer = new(regAlloc.FixedPageTableRegister, RegisterType.Integer, OperandType.I64);
|
||||
|
||||
if (mmType == MemoryManagerType.HostMapped || mmType == MemoryManagerType.HostMappedUnsafe)
|
||||
if (mmType.IsHostTracked())
|
||||
{
|
||||
int tempRegister = regAlloc.AllocateTempGprRegister();
|
||||
|
||||
Operand pte = new(tempRegister, RegisterType.Integer, OperandType.I64);
|
||||
|
||||
asm.Lsr(pte, guestAddress, new Operand(OperandKind.Constant, OperandType.I32, 12));
|
||||
|
||||
if (mmType == MemoryManagerType.HostTracked)
|
||||
{
|
||||
asm.And(pte, pte, new Operand(OperandKind.Constant, OperandType.I64, ulong.MaxValue >> (64 - (asBits - 12))));
|
||||
}
|
||||
|
||||
asm.LdrRr(pte, basePointer, pte, ArmExtensionType.Uxtx, true);
|
||||
asm.Add(destination, pte, guestAddress);
|
||||
|
||||
regAlloc.FreeTempGprRegister(tempRegister);
|
||||
}
|
||||
else if (mmType.IsHostMapped())
|
||||
{
|
||||
if (mmType == MemoryManagerType.HostMapped)
|
||||
{
|
||||
|
|
|
@ -68,9 +68,9 @@ namespace Ryujinx.Cpu.LightningJit
|
|||
|
||||
FunctionTable.Fill = (ulong)Stubs.SlowDispatchStub;
|
||||
|
||||
if (memory.Type.IsHostMapped())
|
||||
if (memory.Type.IsHostMappedOrTracked())
|
||||
{
|
||||
NativeSignalHandler.InitializeSignalHandler(MemoryBlock.GetPageSize());
|
||||
NativeSignalHandler.InitializeSignalHandler();
|
||||
}
|
||||
}
|
||||
|
||||
|
|
389
src/Ryujinx.Cpu/ManagedPageFlags.cs
Normal file
|
@ -0,0 +1,389 @@
|
|||
using Ryujinx.Memory;
|
||||
using Ryujinx.Memory.Tracking;
|
||||
using System;
|
||||
using System.Runtime.CompilerServices;
|
||||
using System.Threading;
|
||||
|
||||
namespace Ryujinx.Cpu
|
||||
{
|
||||
/// <summary>
|
||||
/// A page bitmap that keeps track of mapped state and tracking protection
|
||||
/// for managed memory accesses (not using host page protection).
|
||||
/// </summary>
|
||||
internal readonly struct ManagedPageFlags
|
||||
{
|
||||
public const int PageBits = 12;
|
||||
public const int PageSize = 1 << PageBits;
|
||||
public const int PageMask = PageSize - 1;
|
||||
|
||||
private readonly ulong[] _pageBitmap;
|
||||
|
||||
public const int PageToPteShift = 5; // 32 pages (2 bits each) in one ulong page table entry.
|
||||
public const ulong BlockMappedMask = 0x5555555555555555; // First bit of each table entry set.
|
||||
|
||||
private enum ManagedPtBits : ulong
|
||||
{
|
||||
Unmapped = 0,
|
||||
Mapped,
|
||||
WriteTracked,
|
||||
ReadWriteTracked,
|
||||
|
||||
MappedReplicated = 0x5555555555555555,
|
||||
WriteTrackedReplicated = 0xaaaaaaaaaaaaaaaa,
|
||||
ReadWriteTrackedReplicated = ulong.MaxValue,
|
||||
}
|
||||
|
||||
public ManagedPageFlags(int addressSpaceBits)
|
||||
{
|
||||
int bits = Math.Max(0, addressSpaceBits - (PageBits + PageToPteShift));
|
||||
_pageBitmap = new ulong[1 << bits];
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Computes the number of pages in a virtual address range.
|
||||
/// </summary>
|
||||
/// <param name="va">Virtual address of the range</param>
|
||||
/// <param name="size">Size of the range</param>
|
||||
/// <param name="startVa">The virtual address of the beginning of the first page</param>
|
||||
/// <remarks>This function does not differentiate between allocated and unallocated pages.</remarks>
|
||||
[MethodImpl(MethodImplOptions.AggressiveInlining)]
|
||||
private static int GetPagesCount(ulong va, ulong size, out ulong startVa)
|
||||
{
|
||||
// WARNING: Always check if ulong does not overflow during the operations.
|
||||
startVa = va & ~(ulong)PageMask;
|
||||
ulong vaSpan = (va - startVa + size + PageMask) & ~(ulong)PageMask;
|
||||
|
||||
return (int)(vaSpan / PageSize);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Checks if the page at a given CPU virtual address is mapped.
|
||||
/// </summary>
|
||||
/// <param name="va">Virtual address to check</param>
|
||||
/// <returns>True if the address is mapped, false otherwise</returns>
|
||||
[MethodImpl(MethodImplOptions.AggressiveInlining)]
|
||||
public readonly bool IsMapped(ulong va)
|
||||
{
|
||||
ulong page = va >> PageBits;
|
||||
|
||||
int bit = (int)((page & 31) << 1);
|
||||
|
||||
int pageIndex = (int)(page >> PageToPteShift);
|
||||
ref ulong pageRef = ref _pageBitmap[pageIndex];
|
||||
|
||||
ulong pte = Volatile.Read(ref pageRef);
|
||||
|
||||
return ((pte >> bit) & 3) != 0;
|
||||
}
|
||||
|
||||
[MethodImpl(MethodImplOptions.AggressiveInlining)]
|
||||
private static void GetPageBlockRange(ulong pageStart, ulong pageEnd, out ulong startMask, out ulong endMask, out int pageIndex, out int pageEndIndex)
|
||||
{
|
||||
startMask = ulong.MaxValue << ((int)(pageStart & 31) << 1);
|
||||
endMask = ulong.MaxValue >> (64 - ((int)(pageEnd & 31) << 1));
|
||||
|
||||
pageIndex = (int)(pageStart >> PageToPteShift);
|
||||
pageEndIndex = (int)((pageEnd - 1) >> PageToPteShift);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Checks if a memory range is mapped.
|
||||
/// </summary>
|
||||
/// <param name="va">Virtual address of the range</param>
|
||||
/// <param name="size">Size of the range in bytes</param>
|
||||
/// <returns>True if the entire range is mapped, false otherwise</returns>
|
||||
public readonly bool IsRangeMapped(ulong va, ulong size)
|
||||
{
|
||||
int pages = GetPagesCount(va, size, out _);
|
||||
|
||||
if (pages == 1)
|
||||
{
|
||||
return IsMapped(va);
|
||||
}
|
||||
|
||||
ulong pageStart = va >> PageBits;
|
||||
ulong pageEnd = pageStart + (ulong)pages;
|
||||
|
||||
GetPageBlockRange(pageStart, pageEnd, out ulong startMask, out ulong endMask, out int pageIndex, out int pageEndIndex);
|
||||
|
||||
// Check if either bit in each 2 bit page entry is set.
|
||||
// OR the block with itself shifted down by 1, and check the first bit of each entry.
|
||||
|
||||
ulong mask = BlockMappedMask & startMask;
|
||||
|
||||
while (pageIndex <= pageEndIndex)
|
||||
{
|
||||
if (pageIndex == pageEndIndex)
|
||||
{
|
||||
mask &= endMask;
|
||||
}
|
||||
|
||||
ref ulong pageRef = ref _pageBitmap[pageIndex++];
|
||||
ulong pte = Volatile.Read(ref pageRef);
|
||||
|
||||
pte |= pte >> 1;
|
||||
if ((pte & mask) != mask)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
mask = BlockMappedMask;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Reprotect a region of virtual memory for tracking.
|
||||
/// </summary>
|
||||
/// <param name="va">Virtual address base</param>
|
||||
/// <param name="size">Size of the region to protect</param>
|
||||
/// <param name="protection">Memory protection to set</param>
|
||||
public readonly void TrackingReprotect(ulong va, ulong size, MemoryPermission protection)
|
||||
{
|
||||
// Protection is inverted on software pages, since the default value is 0.
|
||||
protection = (~protection) & MemoryPermission.ReadAndWrite;
|
||||
|
||||
int pages = GetPagesCount(va, size, out va);
|
||||
ulong pageStart = va >> PageBits;
|
||||
|
||||
if (pages == 1)
|
||||
{
|
||||
ulong protTag = protection switch
|
||||
{
|
||||
MemoryPermission.None => (ulong)ManagedPtBits.Mapped,
|
||||
MemoryPermission.Write => (ulong)ManagedPtBits.WriteTracked,
|
||||
_ => (ulong)ManagedPtBits.ReadWriteTracked,
|
||||
};
|
||||
|
||||
int bit = (int)((pageStart & 31) << 1);
|
||||
|
||||
ulong tagMask = 3UL << bit;
|
||||
ulong invTagMask = ~tagMask;
|
||||
|
||||
ulong tag = protTag << bit;
|
||||
|
||||
int pageIndex = (int)(pageStart >> PageToPteShift);
|
||||
ref ulong pageRef = ref _pageBitmap[pageIndex];
|
||||
|
||||
ulong pte;
|
||||
|
||||
do
|
||||
{
|
||||
pte = Volatile.Read(ref pageRef);
|
||||
}
|
||||
while ((pte & tagMask) != 0 && Interlocked.CompareExchange(ref pageRef, (pte & invTagMask) | tag, pte) != pte);
|
||||
}
|
||||
else
|
||||
{
|
||||
ulong pageEnd = pageStart + (ulong)pages;
|
||||
|
||||
GetPageBlockRange(pageStart, pageEnd, out ulong startMask, out ulong endMask, out int pageIndex, out int pageEndIndex);
|
||||
|
||||
ulong mask = startMask;
|
||||
|
||||
ulong protTag = protection switch
|
||||
{
|
||||
MemoryPermission.None => (ulong)ManagedPtBits.MappedReplicated,
|
||||
MemoryPermission.Write => (ulong)ManagedPtBits.WriteTrackedReplicated,
|
||||
_ => (ulong)ManagedPtBits.ReadWriteTrackedReplicated,
|
||||
};
|
||||
|
||||
while (pageIndex <= pageEndIndex)
|
||||
{
|
||||
if (pageIndex == pageEndIndex)
|
||||
{
|
||||
mask &= endMask;
|
||||
}
|
||||
|
||||
ref ulong pageRef = ref _pageBitmap[pageIndex++];
|
||||
|
||||
ulong pte;
|
||||
ulong mappedMask;
|
||||
|
||||
// Change the protection of all 2 bit entries that are mapped.
|
||||
do
|
||||
{
|
||||
pte = Volatile.Read(ref pageRef);
|
||||
|
||||
mappedMask = pte | (pte >> 1);
|
||||
mappedMask |= (mappedMask & BlockMappedMask) << 1;
|
||||
mappedMask &= mask; // Only update mapped pages within the given range.
|
||||
}
|
||||
while (Interlocked.CompareExchange(ref pageRef, (pte & (~mappedMask)) | (protTag & mappedMask), pte) != pte);
|
||||
|
||||
mask = ulong.MaxValue;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Alerts the memory tracking that a given region has been read from or written to.
|
||||
/// This should be called before read/write is performed.
|
||||
/// </summary>
|
||||
/// <param name="tracking">Memory tracking structure to call when pages are protected</param>
|
||||
/// <param name="va">Virtual address of the region</param>
|
||||
/// <param name="size">Size of the region</param>
|
||||
/// <param name="write">True if the region was written, false if read</param>
|
||||
/// <param name="exemptId">Optional ID of the handles that should not be signalled</param>
|
||||
/// <remarks>
|
||||
/// This function also validates that the given range is both valid and mapped, and will throw if it is not.
|
||||
/// </remarks>
|
||||
[MethodImpl(MethodImplOptions.AggressiveInlining)]
|
||||
public readonly void SignalMemoryTracking(MemoryTracking tracking, ulong va, ulong size, bool write, int? exemptId = null)
|
||||
{
|
||||
// Software table, used for managed memory tracking.
|
||||
|
||||
int pages = GetPagesCount(va, size, out _);
|
||||
ulong pageStart = va >> PageBits;
|
||||
|
||||
if (pages == 1)
|
||||
{
|
||||
ulong tag = (ulong)(write ? ManagedPtBits.WriteTracked : ManagedPtBits.ReadWriteTracked);
|
||||
|
||||
int bit = (int)((pageStart & 31) << 1);
|
||||
|
||||
int pageIndex = (int)(pageStart >> PageToPteShift);
|
||||
ref ulong pageRef = ref _pageBitmap[pageIndex];
|
||||
|
||||
ulong pte = Volatile.Read(ref pageRef);
|
||||
ulong state = ((pte >> bit) & 3);
|
||||
|
||||
if (state >= tag)
|
||||
{
|
||||
tracking.VirtualMemoryEvent(va, size, write, precise: false, exemptId);
|
||||
return;
|
||||
}
|
||||
else if (state == 0)
|
||||
{
|
||||
ThrowInvalidMemoryRegionException($"Not mapped: va=0x{va:X16}, size=0x{size:X16}");
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
ulong pageEnd = pageStart + (ulong)pages;
|
||||
|
||||
GetPageBlockRange(pageStart, pageEnd, out ulong startMask, out ulong endMask, out int pageIndex, out int pageEndIndex);
|
||||
|
||||
ulong mask = startMask;
|
||||
|
||||
ulong anyTrackingTag = (ulong)ManagedPtBits.WriteTrackedReplicated;
|
||||
|
||||
while (pageIndex <= pageEndIndex)
|
||||
{
|
||||
if (pageIndex == pageEndIndex)
|
||||
{
|
||||
mask &= endMask;
|
||||
}
|
||||
|
||||
ref ulong pageRef = ref _pageBitmap[pageIndex++];
|
||||
|
||||
ulong pte = Volatile.Read(ref pageRef);
|
||||
ulong mappedMask = mask & BlockMappedMask;
|
||||
|
||||
ulong mappedPte = pte | (pte >> 1);
|
||||
if ((mappedPte & mappedMask) != mappedMask)
|
||||
{
|
||||
ThrowInvalidMemoryRegionException($"Not mapped: va=0x{va:X16}, size=0x{size:X16}");
|
||||
}
|
||||
|
||||
pte &= mask;
|
||||
if ((pte & anyTrackingTag) != 0) // Search for any tracking.
|
||||
{
|
||||
// Writes trigger any tracking.
|
||||
// Only trigger tracking from reads if both bits are set on any page.
|
||||
if (write || (pte & (pte >> 1) & BlockMappedMask) != 0)
|
||||
{
|
||||
tracking.VirtualMemoryEvent(va, size, write, precise: false, exemptId);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
mask = ulong.MaxValue;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Adds the given address mapping to the page table.
|
||||
/// </summary>
|
||||
/// <param name="va">Virtual memory address</param>
|
||||
/// <param name="size">Size to be mapped</param>
|
||||
public readonly void AddMapping(ulong va, ulong size)
|
||||
{
|
||||
int pages = GetPagesCount(va, size, out _);
|
||||
ulong pageStart = va >> PageBits;
|
||||
ulong pageEnd = pageStart + (ulong)pages;
|
||||
|
||||
GetPageBlockRange(pageStart, pageEnd, out ulong startMask, out ulong endMask, out int pageIndex, out int pageEndIndex);
|
||||
|
||||
ulong mask = startMask;
|
||||
|
||||
while (pageIndex <= pageEndIndex)
|
||||
{
|
||||
if (pageIndex == pageEndIndex)
|
||||
{
|
||||
mask &= endMask;
|
||||
}
|
||||
|
||||
ref ulong pageRef = ref _pageBitmap[pageIndex++];
|
||||
|
||||
ulong pte;
|
||||
ulong mappedMask;
|
||||
|
||||
// Map all 2-bit entries that are unmapped.
|
||||
do
|
||||
{
|
||||
pte = Volatile.Read(ref pageRef);
|
||||
|
||||
mappedMask = pte | (pte >> 1);
|
||||
mappedMask |= (mappedMask & BlockMappedMask) << 1;
|
||||
mappedMask |= ~mask; // Treat everything outside the range as mapped, thus unchanged.
|
||||
}
|
||||
while (Interlocked.CompareExchange(ref pageRef, (pte & mappedMask) | (BlockMappedMask & (~mappedMask)), pte) != pte);
|
||||
|
||||
mask = ulong.MaxValue;
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Removes the given address mapping from the page table.
|
||||
/// </summary>
|
||||
/// <param name="va">Virtual memory address</param>
|
||||
/// <param name="size">Size to be unmapped</param>
|
||||
public readonly void RemoveMapping(ulong va, ulong size)
|
||||
{
|
||||
int pages = GetPagesCount(va, size, out _);
|
||||
ulong pageStart = va >> PageBits;
|
||||
ulong pageEnd = pageStart + (ulong)pages;
|
||||
|
||||
GetPageBlockRange(pageStart, pageEnd, out ulong startMask, out ulong endMask, out int pageIndex, out int pageEndIndex);
|
||||
|
||||
startMask = ~startMask;
|
||||
endMask = ~endMask;
|
||||
|
||||
ulong mask = startMask;
|
||||
|
||||
while (pageIndex <= pageEndIndex)
|
||||
{
|
||||
if (pageIndex == pageEndIndex)
|
||||
{
|
||||
mask |= endMask;
|
||||
}
|
||||
|
||||
ref ulong pageRef = ref _pageBitmap[pageIndex++];
|
||||
ulong pte;
|
||||
|
||||
do
|
||||
{
|
||||
pte = Volatile.Read(ref pageRef);
|
||||
}
|
||||
while (Interlocked.CompareExchange(ref pageRef, pte & mask, pte) != pte);
|
||||
|
||||
mask = 0;
|
||||
}
|
||||
}
|
||||
|
||||
private static void ThrowInvalidMemoryRegionException(string message) => throw new InvalidMemoryRegionException(message);
|
||||
}
|
||||
}
|
|
@ -1,3 +1,4 @@
|
|||
using Ryujinx.Common;
|
||||
using Ryujinx.Cpu.Signal;
|
||||
using Ryujinx.Memory;
|
||||
using Ryujinx.Memory.Tracking;
|
||||
|
@ -8,19 +9,27 @@ namespace Ryujinx.Cpu
|
|||
{
|
||||
public class MemoryEhMeilleure : IDisposable
|
||||
{
|
||||
private delegate bool TrackingEventDelegate(ulong address, ulong size, bool write);
|
||||
public delegate ulong TrackingEventDelegate(ulong address, ulong size, bool write);
|
||||
|
||||
private readonly MemoryTracking _tracking;
|
||||
private readonly TrackingEventDelegate _trackingEvent;
|
||||
|
||||
private readonly ulong _pageSize;
|
||||
|
||||
private readonly ulong _baseAddress;
|
||||
private readonly ulong _mirrorAddress;
|
||||
|
||||
public MemoryEhMeilleure(MemoryBlock addressSpace, MemoryBlock addressSpaceMirror, MemoryTracking tracking)
|
||||
public MemoryEhMeilleure(MemoryBlock addressSpace, MemoryBlock addressSpaceMirror, MemoryTracking tracking, TrackingEventDelegate trackingEvent = null)
|
||||
{
|
||||
_baseAddress = (ulong)addressSpace.Pointer;
|
||||
|
||||
ulong endAddress = _baseAddress + addressSpace.Size;
|
||||
|
||||
_trackingEvent = tracking.VirtualMemoryEvent;
|
||||
_tracking = tracking;
|
||||
_trackingEvent = trackingEvent ?? VirtualMemoryEvent;
|
||||
|
||||
_pageSize = MemoryBlock.GetPageSize();
|
||||
|
||||
bool added = NativeSignalHandler.AddTrackedRegion((nuint)_baseAddress, (nuint)endAddress, Marshal.GetFunctionPointerForDelegate(_trackingEvent));
|
||||
|
||||
if (!added)
|
||||
|
@ -28,7 +37,7 @@ namespace Ryujinx.Cpu
|
|||
throw new InvalidOperationException("Number of allowed tracked regions exceeded.");
|
||||
}
|
||||
|
||||
if (OperatingSystem.IsWindows())
|
||||
if (OperatingSystem.IsWindows() && addressSpaceMirror != null)
|
||||
{
|
||||
// Add a tracking event with no signal handler for the mirror on Windows.
|
||||
// The native handler has its own code to check for the partial overlap race when regions are protected by accident,
|
||||
|
@ -46,6 +55,21 @@ namespace Ryujinx.Cpu
|
|||
}
|
||||
}
|
||||
|
||||
private ulong VirtualMemoryEvent(ulong address, ulong size, bool write)
|
||||
{
|
||||
ulong pageSize = _pageSize;
|
||||
ulong addressAligned = BitUtils.AlignDown(address, pageSize);
|
||||
ulong endAddressAligned = BitUtils.AlignUp(address + size, pageSize);
|
||||
ulong sizeAligned = endAddressAligned - addressAligned;
|
||||
|
||||
if (_tracking.VirtualMemoryEvent(addressAligned, sizeAligned, write))
|
||||
{
|
||||
return _baseAddress + address;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
public void Dispose()
|
||||
{
|
||||
GC.SuppressFinalize(this);
|
||||
|
|
|
@ -143,7 +143,7 @@ namespace Ryujinx.Cpu
|
|||
}
|
||||
}
|
||||
|
||||
public PrivateMemoryAllocator(int blockAlignment, MemoryAllocationFlags allocationFlags) : base(blockAlignment, allocationFlags)
|
||||
public PrivateMemoryAllocator(ulong blockAlignment, MemoryAllocationFlags allocationFlags) : base(blockAlignment, allocationFlags)
|
||||
{
|
||||
}
|
||||
|
||||
|
@ -180,10 +180,10 @@ namespace Ryujinx.Cpu
|
|||
|
||||
private readonly List<T> _blocks;
|
||||
|
||||
private readonly int _blockAlignment;
|
||||
private readonly ulong _blockAlignment;
|
||||
private readonly MemoryAllocationFlags _allocationFlags;
|
||||
|
||||
public PrivateMemoryAllocatorImpl(int blockAlignment, MemoryAllocationFlags allocationFlags)
|
||||
public PrivateMemoryAllocatorImpl(ulong blockAlignment, MemoryAllocationFlags allocationFlags)
|
||||
{
|
||||
_blocks = new List<T>();
|
||||
_blockAlignment = blockAlignment;
|
||||
|
@ -212,7 +212,7 @@ namespace Ryujinx.Cpu
|
|||
}
|
||||
}
|
||||
|
||||
ulong blockAlignedSize = BitUtils.AlignUp(size, (ulong)_blockAlignment);
|
||||
ulong blockAlignedSize = BitUtils.AlignUp(size, _blockAlignment);
|
||||
|
||||
var memory = new MemoryBlock(blockAlignedSize, _allocationFlags);
|
||||
var newBlock = createBlock(memory, blockAlignedSize);
|
||||
|
|
|
@ -70,7 +70,7 @@ namespace Ryujinx.Cpu.Signal
|
|||
config = new SignalHandlerConfig();
|
||||
}
|
||||
|
||||
public static void InitializeSignalHandler(ulong pageSize, Func<IntPtr, IntPtr, IntPtr> customSignalHandlerFactory = null)
|
||||
public static void InitializeSignalHandler(Func<IntPtr, IntPtr, IntPtr> customSignalHandlerFactory = null)
|
||||
{
|
||||
if (_initialized)
|
||||
{
|
||||
|
@ -90,7 +90,7 @@ namespace Ryujinx.Cpu.Signal
|
|||
|
||||
if (OperatingSystem.IsLinux() || OperatingSystem.IsMacOS())
|
||||
{
|
||||
_signalHandlerPtr = MapCode(NativeSignalHandlerGenerator.GenerateUnixSignalHandler(_handlerConfig, rangeStructSize, pageSize));
|
||||
_signalHandlerPtr = MapCode(NativeSignalHandlerGenerator.GenerateUnixSignalHandler(_handlerConfig, rangeStructSize));
|
||||
|
||||
if (customSignalHandlerFactory != null)
|
||||
{
|
||||
|
@ -107,7 +107,7 @@ namespace Ryujinx.Cpu.Signal
|
|||
config.StructAddressOffset = 40; // ExceptionInformation1
|
||||
config.StructWriteOffset = 32; // ExceptionInformation0
|
||||
|
||||
_signalHandlerPtr = MapCode(NativeSignalHandlerGenerator.GenerateWindowsSignalHandler(_handlerConfig, rangeStructSize, pageSize));
|
||||
_signalHandlerPtr = MapCode(NativeSignalHandlerGenerator.GenerateWindowsSignalHandler(_handlerConfig, rangeStructSize));
|
||||
|
||||
if (customSignalHandlerFactory != null)
|
||||
{
|
||||
|
@ -175,5 +175,10 @@ namespace Ryujinx.Cpu.Signal
|
|||
|
||||
return false;
|
||||
}
|
||||
|
||||
public static bool SupportsFaultAddressPatching()
|
||||
{
|
||||
return NativeSignalHandlerGenerator.SupportsFaultAddressPatchingForHost();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,13 +1,10 @@
|
|||
using Ryujinx.Memory;
|
||||
using System.Diagnostics;
|
||||
using System.Numerics;
|
||||
using System.Threading;
|
||||
|
||||
namespace Ryujinx.Cpu
|
||||
{
|
||||
public abstract class VirtualMemoryManagerRefCountedBase<TVirtual, TPhysical> : VirtualMemoryManagerBase<TVirtual, TPhysical>, IRefCounted
|
||||
where TVirtual : IBinaryInteger<TVirtual>
|
||||
where TPhysical : IBinaryInteger<TPhysical>
|
||||
public abstract class VirtualMemoryManagerRefCountedBase : VirtualMemoryManagerBase, IRefCounted
|
||||
{
|
||||
private int _referenceCount;
|
||||
|
||||
|
|
|
@ -343,11 +343,22 @@ namespace Ryujinx.Graphics.Gpu.Engine.Threed
|
|||
|
||||
bool unalignedChanged = _currentSpecState.SetHasUnalignedStorageBuffer(_channel.BufferManager.HasUnalignedStorageBuffers);
|
||||
|
||||
if (!_channel.TextureManager.CommitGraphicsBindings(_shaderSpecState) || unalignedChanged)
|
||||
bool scaleMismatch;
|
||||
do
|
||||
{
|
||||
// Shader must be reloaded. _vtgWritesRtLayer should not change.
|
||||
UpdateShaderState();
|
||||
if (!_channel.TextureManager.CommitGraphicsBindings(_shaderSpecState, out scaleMismatch) || unalignedChanged)
|
||||
{
|
||||
// Shader must be reloaded. _vtgWritesRtLayer should not change.
|
||||
UpdateShaderState();
|
||||
}
|
||||
|
||||
if (scaleMismatch)
|
||||
{
|
||||
// Binding textures changed scale of the bound render targets, correct the render target scale and rebind.
|
||||
UpdateRenderTargetState();
|
||||
}
|
||||
}
|
||||
while (scaleMismatch);
|
||||
|
||||
_channel.BufferManager.CommitGraphicsBindings(_drawState.DrawIndexed);
|
||||
}
|
||||
|
|
|
@ -69,7 +69,7 @@ namespace Ryujinx.Graphics.Gpu.Image
|
|||
Address = address;
|
||||
Size = size;
|
||||
|
||||
_memoryTracking = physicalMemory.BeginGranularTracking(address, size, ResourceKind.Pool);
|
||||
_memoryTracking = physicalMemory.BeginGranularTracking(address, size, ResourceKind.Pool, RegionFlags.None);
|
||||
_memoryTracking.RegisterPreciseAction(address, size, PreciseAction);
|
||||
_modifiedDelegate = RegionModified;
|
||||
}
|
||||
|
|
|
@ -573,7 +573,7 @@ namespace Ryujinx.Graphics.Gpu.Image
|
|||
|
||||
/// <summary>
|
||||
/// Discards all data for this texture.
|
||||
/// This clears all dirty flags, modified flags, and pending copies from other textures.
|
||||
/// This clears all dirty flags and pending copies from other textures.
|
||||
/// It should be used if the texture data will be fully overwritten by the next use.
|
||||
/// </summary>
|
||||
public void DiscardData()
|
||||
|
|
|
@ -282,7 +282,7 @@ namespace Ryujinx.Graphics.Gpu.Image
|
|||
|
||||
/// <summary>
|
||||
/// Discards all data for a given texture.
|
||||
/// This clears all dirty flags, modified flags, and pending copies from other textures.
|
||||
/// This clears all dirty flags and pending copies from other textures.
|
||||
/// </summary>
|
||||
/// <param name="texture">The texture being discarded</param>
|
||||
public void DiscardData(Texture texture)
|
||||
|
@ -1622,14 +1622,6 @@ namespace Ryujinx.Graphics.Gpu.Image
|
|||
/// <param name="size">The size of the flushing memory access</param>
|
||||
public void FlushAction(TextureGroupHandle handle, ulong address, ulong size)
|
||||
{
|
||||
// If the page size is larger than 4KB, we will have a lot of false positives for flushing.
|
||||
// Let's avoid flushing textures that are unlikely to be read from CPU to improve performance
|
||||
// on those platforms.
|
||||
if (!_physicalMemory.Supports4KBPages && !Storage.Info.IsLinear && !_context.IsGpuThread())
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
// There is a small gap here where the action is removed but _actionRegistered is still 1.
|
||||
// In this case it will skip registering the action, but here we are already handling it,
|
||||
// so there shouldn't be any issue as it's the same handler for all actions.
|
||||
|
|
|
@ -182,11 +182,10 @@ namespace Ryujinx.Graphics.Gpu.Image
|
|||
|
||||
/// <summary>
|
||||
/// Discards all data for this handle.
|
||||
/// This clears all dirty flags, modified flags, and pending copies from other handles.
|
||||
/// This clears all dirty flags and pending copies from other handles.
|
||||
/// </summary>
|
||||
public void DiscardData()
|
||||
{
|
||||
Modified = false;
|
||||
DeferredCopy = null;
|
||||
|
||||
foreach (RegionHandle handle in Handles)
|
||||
|
|
|
@ -360,15 +360,16 @@ namespace Ryujinx.Graphics.Gpu.Image
|
|||
/// Commits bindings on the graphics pipeline.
|
||||
/// </summary>
|
||||
/// <param name="specState">Specialization state for the bound shader</param>
|
||||
/// <param name="scaleMismatch">True if there is a scale mismatch in the render targets, indicating they must be re-evaluated</param>
|
||||
/// <returns>True if all bound textures match the current shader specialization state, false otherwise</returns>
|
||||
public bool CommitGraphicsBindings(ShaderSpecializationState specState)
|
||||
public bool CommitGraphicsBindings(ShaderSpecializationState specState, out bool scaleMismatch)
|
||||
{
|
||||
_texturePoolCache.Tick();
|
||||
_samplerPoolCache.Tick();
|
||||
|
||||
bool result = _gpBindingsManager.CommitBindings(specState);
|
||||
|
||||
UpdateRenderTargets();
|
||||
scaleMismatch = UpdateRenderTargets();
|
||||
|
||||
return result;
|
||||
}
|
||||
|
@ -426,9 +427,12 @@ namespace Ryujinx.Graphics.Gpu.Image
|
|||
/// <summary>
|
||||
/// Update host framebuffer attachments based on currently bound render target buffers.
|
||||
/// </summary>
|
||||
public void UpdateRenderTargets()
|
||||
/// <returns>True if there is a scale mismatch in the render targets, indicating they must be re-evaluated</returns>
|
||||
public bool UpdateRenderTargets()
|
||||
{
|
||||
bool anyChanged = false;
|
||||
float expectedScale = RenderTargetScale;
|
||||
bool scaleMismatch = false;
|
||||
|
||||
Texture dsTexture = _rtDepthStencil;
|
||||
ITexture hostDsTexture = null;
|
||||
|
@ -448,6 +452,11 @@ namespace Ryujinx.Graphics.Gpu.Image
|
|||
{
|
||||
_rtHostDs = hostDsTexture;
|
||||
anyChanged = true;
|
||||
|
||||
if (dsTexture != null && dsTexture.ScaleFactor != expectedScale)
|
||||
{
|
||||
scaleMismatch = true;
|
||||
}
|
||||
}
|
||||
|
||||
for (int index = 0; index < _rtColors.Length; index++)
|
||||
|
@ -470,6 +479,11 @@ namespace Ryujinx.Graphics.Gpu.Image
|
|||
{
|
||||
_rtHostColors[index] = hostTexture;
|
||||
anyChanged = true;
|
||||
|
||||
if (texture != null && texture.ScaleFactor != expectedScale)
|
||||
{
|
||||
scaleMismatch = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -477,6 +491,8 @@ namespace Ryujinx.Graphics.Gpu.Image
|
|||
{
|
||||
_context.Renderer.Pipeline.SetRenderTargets(_rtHostColors, _rtHostDs);
|
||||
}
|
||||
|
||||
return scaleMismatch;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
|
|
|
@ -128,13 +128,13 @@ namespace Ryujinx.Graphics.Gpu.Memory
|
|||
|
||||
if (_useGranular)
|
||||
{
|
||||
_memoryTrackingGranular = physicalMemory.BeginGranularTracking(address, size, ResourceKind.Buffer, baseHandles);
|
||||
_memoryTrackingGranular = physicalMemory.BeginGranularTracking(address, size, ResourceKind.Buffer, RegionFlags.UnalignedAccess, baseHandles);
|
||||
|
||||
_memoryTrackingGranular.RegisterPreciseAction(address, size, PreciseAction);
|
||||
}
|
||||
else
|
||||
{
|
||||
_memoryTracking = physicalMemory.BeginTracking(address, size, ResourceKind.Buffer);
|
||||
_memoryTracking = physicalMemory.BeginTracking(address, size, ResourceKind.Buffer, RegionFlags.UnalignedAccess);
|
||||
|
||||
if (baseHandles != null)
|
||||
{
|
||||
|
|
|
@ -23,11 +23,6 @@ namespace Ryujinx.Graphics.Gpu.Memory
|
|||
private readonly IVirtualMemoryManagerTracked _cpuMemory;
|
||||
private int _referenceCount;
|
||||
|
||||
/// <summary>
|
||||
/// Indicates whenever the memory manager supports 4KB pages.
|
||||
/// </summary>
|
||||
public bool Supports4KBPages => _cpuMemory.Supports4KBPages;
|
||||
|
||||
/// <summary>
|
||||
/// In-memory shader cache.
|
||||
/// </summary>
|
||||
|
@ -368,10 +363,11 @@ namespace Ryujinx.Graphics.Gpu.Memory
|
|||
/// <param name="address">CPU virtual address of the region</param>
|
||||
/// <param name="size">Size of the region</param>
|
||||
/// <param name="kind">Kind of the resource being tracked</param>
|
||||
/// <param name="flags">Region flags</param>
|
||||
/// <returns>The memory tracking handle</returns>
|
||||
public RegionHandle BeginTracking(ulong address, ulong size, ResourceKind kind)
|
||||
public RegionHandle BeginTracking(ulong address, ulong size, ResourceKind kind, RegionFlags flags = RegionFlags.None)
|
||||
{
|
||||
return _cpuMemory.BeginTracking(address, size, (int)kind);
|
||||
return _cpuMemory.BeginTracking(address, size, (int)kind, flags);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
|
@ -408,12 +404,19 @@ namespace Ryujinx.Graphics.Gpu.Memory
|
|||
/// <param name="address">CPU virtual address of the region</param>
|
||||
/// <param name="size">Size of the region</param>
|
||||
/// <param name="kind">Kind of the resource being tracked</param>
|
||||
/// <param name="flags">Region flags</param>
|
||||
/// <param name="handles">Handles to inherit state from or reuse</param>
|
||||
/// <param name="granularity">Desired granularity of write tracking</param>
|
||||
/// <returns>The memory tracking handle</returns>
|
||||
public MultiRegionHandle BeginGranularTracking(ulong address, ulong size, ResourceKind kind, IEnumerable<IRegionHandle> handles = null, ulong granularity = 4096)
|
||||
public MultiRegionHandle BeginGranularTracking(
|
||||
ulong address,
|
||||
ulong size,
|
||||
ResourceKind kind,
|
||||
RegionFlags flags = RegionFlags.None,
|
||||
IEnumerable<IRegionHandle> handles = null,
|
||||
ulong granularity = 4096)
|
||||
{
|
||||
return _cpuMemory.BeginGranularTracking(address, size, handles, granularity, (int)kind);
|
||||
return _cpuMemory.BeginGranularTracking(address, size, handles, granularity, (int)kind, flags);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
|
|
|
@ -173,7 +173,7 @@ namespace Ryujinx.Graphics.Gpu.Memory
|
|||
|
||||
ShrinkOverlapsBufferIfNeeded();
|
||||
|
||||
// If the the range is not properly aligned for sparse mapping,
|
||||
// If the range is not properly aligned for sparse mapping,
|
||||
// let's just force it to a single range.
|
||||
// This might cause issues in some applications that uses sparse
|
||||
// mappings.
|
||||
|
|
|
@ -322,7 +322,7 @@ namespace Ryujinx.Graphics.Shader.Translation.Optimizations
|
|||
Operand lhs = operation.GetSource(0);
|
||||
Operand rhs = operation.GetSource(1);
|
||||
|
||||
// Check LHS of the the main multiplication operation. We expect an input being multiplied by gl_FragCoord.w.
|
||||
// Check LHS of the main multiplication operation. We expect an input being multiplied by gl_FragCoord.w.
|
||||
if (lhs.AsgOp is not Operation attrMulOp || attrMulOp.Inst != (Instruction.FP32 | Instruction.Multiply))
|
||||
{
|
||||
return;
|
||||
|
|
|
@ -10,8 +10,8 @@ namespace Ryujinx.Graphics.Vulkan.Queries
|
|||
class BufferedQuery : IDisposable
|
||||
{
|
||||
private const int MaxQueryRetries = 5000;
|
||||
private const long DefaultValue = -1;
|
||||
private const long DefaultValueInt = 0xFFFFFFFF;
|
||||
private const long DefaultValue = unchecked((long)0xFFFFFFFEFFFFFFFE);
|
||||
private const long DefaultValueInt = 0xFFFFFFFE;
|
||||
private const ulong HighMask = 0xFFFFFFFF00000000;
|
||||
|
||||
private readonly Vk _api;
|
||||
|
|
|
@ -111,8 +111,8 @@ namespace Ryujinx.Graphics.Vulkan
|
|||
bool usePushDescriptors = !isMinimal &&
|
||||
VulkanConfiguration.UsePushDescriptors &&
|
||||
_gd.Capabilities.SupportsPushDescriptors &&
|
||||
!_gd.IsNvidiaPreTuring &&
|
||||
!IsCompute &&
|
||||
!HasPushDescriptorsBug(gd) &&
|
||||
CanUsePushDescriptors(gd, resourceLayout, IsCompute);
|
||||
|
||||
ReadOnlyCollection<ResourceDescriptorCollection> sets = usePushDescriptors ?
|
||||
|
@ -147,6 +147,12 @@ namespace Ryujinx.Graphics.Vulkan
|
|||
_firstBackgroundUse = !fromCache;
|
||||
}
|
||||
|
||||
private static bool HasPushDescriptorsBug(VulkanRenderer gd)
|
||||
{
|
||||
// Those GPUs/drivers do not work properly with push descriptors, so we must force disable them.
|
||||
return gd.IsNvidiaPreTuring || (gd.IsIntelArc && gd.IsIntelWindows);
|
||||
}
|
||||
|
||||
private static bool CanUsePushDescriptors(VulkanRenderer gd, ResourceLayout layout, bool isCompute)
|
||||
{
|
||||
// If binding 3 is immediately used, use an alternate set of reserved bindings.
|
||||
|
|
|
@ -1,3 +1,4 @@
|
|||
using Silk.NET.Vulkan;
|
||||
using System.Text.RegularExpressions;
|
||||
|
||||
namespace Ryujinx.Graphics.Vulkan
|
||||
|
@ -61,5 +62,36 @@ namespace Ryujinx.Graphics.Vulkan
|
|||
_ => $"0x{id:X}",
|
||||
};
|
||||
}
|
||||
|
||||
public static string GetFriendlyDriverName(DriverId id)
|
||||
{
|
||||
return id switch
|
||||
{
|
||||
DriverId.AmdProprietary => "AMD",
|
||||
DriverId.AmdOpenSource => "AMD (Open)",
|
||||
DriverId.ArmProprietary => "ARM",
|
||||
DriverId.BroadcomProprietary => "Broadcom",
|
||||
DriverId.CoreaviProprietary => "CoreAVI",
|
||||
DriverId.GgpProprietary => "GGP",
|
||||
DriverId.GoogleSwiftshader => "SwiftShader",
|
||||
DriverId.ImaginationProprietary => "Imagination",
|
||||
DriverId.IntelOpenSourceMesa => "Intel (Open)",
|
||||
DriverId.IntelProprietaryWindows => "Intel",
|
||||
DriverId.JuiceProprietary => "Juice",
|
||||
DriverId.MesaDozen => "Dozen",
|
||||
DriverId.MesaLlvmpipe => "LLVMpipe",
|
||||
DriverId.MesaPanvk => "PanVK",
|
||||
DriverId.MesaRadv => "RADV",
|
||||
DriverId.MesaTurnip => "Turnip",
|
||||
DriverId.MesaV3DV => "V3DV",
|
||||
DriverId.MesaVenus => "Venus",
|
||||
DriverId.Moltenvk => "MoltenVK",
|
||||
DriverId.NvidiaProprietary => "NVIDIA",
|
||||
DriverId.QualcommProprietary => "Qualcomm",
|
||||
DriverId.SamsungProprietary => "Samsung",
|
||||
DriverId.VerisiliconProprietary => "Verisilicon",
|
||||
_ => id.ToString(),
|
||||
};
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -136,7 +136,7 @@ namespace Ryujinx.Graphics.Vulkan
|
|||
{
|
||||
instance.EnumeratePhysicalDevices(out var physicalDevices).ThrowOnError();
|
||||
|
||||
// First we try to pick the the user preferred GPU.
|
||||
// First we try to pick the user preferred GPU.
|
||||
for (int i = 0; i < physicalDevices.Length; i++)
|
||||
{
|
||||
if (IsPreferredAndSuitableDevice(api, physicalDevices[i], surface, preferredGpuId))
|
||||
|
|
|
@ -87,6 +87,7 @@ namespace Ryujinx.Graphics.Vulkan
|
|||
internal bool IsIntelWindows { get; private set; }
|
||||
internal bool IsAmdGcn { get; private set; }
|
||||
internal bool IsNvidiaPreTuring { get; private set; }
|
||||
internal bool IsIntelArc { get; private set; }
|
||||
internal bool IsMoltenVk { get; private set; }
|
||||
internal bool IsTBDR { get; private set; }
|
||||
internal bool IsSharedMemory { get; private set; }
|
||||
|
@ -310,6 +311,50 @@ namespace Ryujinx.Graphics.Vulkan
|
|||
|
||||
ref var properties = ref properties2.Properties;
|
||||
|
||||
var hasDriverProperties = _physicalDevice.TryGetPhysicalDeviceDriverPropertiesKHR(Api, out var driverProperties);
|
||||
|
||||
Vendor = VendorUtils.FromId(properties.VendorID);
|
||||
|
||||
IsAmdWindows = Vendor == Vendor.Amd && OperatingSystem.IsWindows();
|
||||
IsIntelWindows = Vendor == Vendor.Intel && OperatingSystem.IsWindows();
|
||||
IsTBDR =
|
||||
Vendor == Vendor.Apple ||
|
||||
Vendor == Vendor.Qualcomm ||
|
||||
Vendor == Vendor.ARM ||
|
||||
Vendor == Vendor.Broadcom ||
|
||||
Vendor == Vendor.ImgTec;
|
||||
|
||||
GpuVendor = VendorUtils.GetNameFromId(properties.VendorID);
|
||||
GpuDriver = hasDriverProperties && !OperatingSystem.IsMacOS() ?
|
||||
VendorUtils.GetFriendlyDriverName(driverProperties.DriverID) : GpuVendor; // Fallback to vendor name if driver is unavailable or on MacOS where vendor is preferred.
|
||||
|
||||
fixed (byte* deviceName = properties.DeviceName)
|
||||
{
|
||||
GpuRenderer = Marshal.PtrToStringAnsi((IntPtr)deviceName);
|
||||
}
|
||||
|
||||
GpuVersion = $"Vulkan v{ParseStandardVulkanVersion(properties.ApiVersion)}, Driver v{ParseDriverVersion(ref properties)}";
|
||||
|
||||
IsAmdGcn = !IsMoltenVk && Vendor == Vendor.Amd && VendorUtils.AmdGcnRegex().IsMatch(GpuRenderer);
|
||||
|
||||
if (Vendor == Vendor.Nvidia)
|
||||
{
|
||||
var match = VendorUtils.NvidiaConsumerClassRegex().Match(GpuRenderer);
|
||||
|
||||
if (match != null && int.TryParse(match.Groups[2].Value, out int gpuNumber))
|
||||
{
|
||||
IsNvidiaPreTuring = gpuNumber < 2000;
|
||||
}
|
||||
else if (GpuDriver.Contains("TITAN") && !GpuDriver.Contains("RTX"))
|
||||
{
|
||||
IsNvidiaPreTuring = true;
|
||||
}
|
||||
}
|
||||
else if (Vendor == Vendor.Intel)
|
||||
{
|
||||
IsIntelArc = GpuRenderer.StartsWith("Intel(R) Arc(TM)");
|
||||
}
|
||||
|
||||
ulong minResourceAlignment = Math.Max(
|
||||
Math.Max(
|
||||
properties.Limits.MinStorageBufferOffsetAlignment,
|
||||
|
@ -732,56 +777,15 @@ namespace Ryujinx.Graphics.Vulkan
|
|||
return ParseStandardVulkanVersion(driverVersionRaw);
|
||||
}
|
||||
|
||||
private unsafe void PrintGpuInformation()
|
||||
{
|
||||
var properties = _physicalDevice.PhysicalDeviceProperties;
|
||||
|
||||
var hasDriverProperties = _physicalDevice.TryGetPhysicalDeviceDriverPropertiesKHR(Api, out var driverProperties);
|
||||
|
||||
string vendorName = VendorUtils.GetNameFromId(properties.VendorID);
|
||||
|
||||
Vendor = VendorUtils.FromId(properties.VendorID);
|
||||
|
||||
IsAmdWindows = Vendor == Vendor.Amd && OperatingSystem.IsWindows();
|
||||
IsIntelWindows = Vendor == Vendor.Intel && OperatingSystem.IsWindows();
|
||||
IsTBDR =
|
||||
Vendor == Vendor.Apple ||
|
||||
Vendor == Vendor.Qualcomm ||
|
||||
Vendor == Vendor.ARM ||
|
||||
Vendor == Vendor.Broadcom ||
|
||||
Vendor == Vendor.ImgTec;
|
||||
|
||||
GpuVendor = vendorName;
|
||||
GpuDriver = hasDriverProperties ? Marshal.PtrToStringAnsi((IntPtr)driverProperties.DriverName) : vendorName; // Fall back to vendor name if driver name isn't available.
|
||||
GpuRenderer = Marshal.PtrToStringAnsi((IntPtr)properties.DeviceName);
|
||||
GpuVersion = $"Vulkan v{ParseStandardVulkanVersion(properties.ApiVersion)}, Driver v{ParseDriverVersion(ref properties)}";
|
||||
|
||||
IsAmdGcn = !IsMoltenVk && Vendor == Vendor.Amd && VendorUtils.AmdGcnRegex().IsMatch(GpuRenderer);
|
||||
|
||||
if (Vendor == Vendor.Nvidia)
|
||||
{
|
||||
var match = VendorUtils.NvidiaConsumerClassRegex().Match(GpuRenderer);
|
||||
|
||||
if (match != null && int.TryParse(match.Groups[2].Value, out int gpuNumber))
|
||||
{
|
||||
IsNvidiaPreTuring = gpuNumber < 2000;
|
||||
}
|
||||
else if (GpuDriver.Contains("TITAN") && !GpuDriver.Contains("RTX"))
|
||||
{
|
||||
IsNvidiaPreTuring = true;
|
||||
}
|
||||
}
|
||||
|
||||
Logger.Notice.Print(LogClass.Gpu, $"{GpuVendor} {GpuRenderer} ({GpuVersion})");
|
||||
}
|
||||
|
||||
internal PrimitiveTopology TopologyRemap(PrimitiveTopology topology)
|
||||
{
|
||||
return topology switch
|
||||
{
|
||||
PrimitiveTopology.Quads => PrimitiveTopology.Triangles,
|
||||
PrimitiveTopology.QuadStrip => PrimitiveTopology.TriangleStrip,
|
||||
PrimitiveTopology.TriangleFan => Capabilities.PortabilitySubset.HasFlag(PortabilitySubsetFlags.NoTriangleFans) ? PrimitiveTopology.Triangles : topology,
|
||||
PrimitiveTopology.TriangleFan or PrimitiveTopology.Polygon => Capabilities.PortabilitySubset.HasFlag(PortabilitySubsetFlags.NoTriangleFans)
|
||||
? PrimitiveTopology.Triangles
|
||||
: topology,
|
||||
_ => topology,
|
||||
};
|
||||
}
|
||||
|
@ -791,11 +795,16 @@ namespace Ryujinx.Graphics.Vulkan
|
|||
return topology switch
|
||||
{
|
||||
PrimitiveTopology.Quads => true,
|
||||
PrimitiveTopology.TriangleFan => Capabilities.PortabilitySubset.HasFlag(PortabilitySubsetFlags.NoTriangleFans),
|
||||
PrimitiveTopology.TriangleFan or PrimitiveTopology.Polygon => Capabilities.PortabilitySubset.HasFlag(PortabilitySubsetFlags.NoTriangleFans),
|
||||
_ => false,
|
||||
};
|
||||
}
|
||||
|
||||
private void PrintGpuInformation()
|
||||
{
|
||||
Logger.Notice.Print(LogClass.Gpu, $"{GpuVendor} {GpuRenderer} ({GpuVersion})");
|
||||
}
|
||||
|
||||
public void Initialize(GraphicsDebugLevel logLevel)
|
||||
{
|
||||
SetupContext(logLevel);
|
||||
|
|
|
@ -466,7 +466,7 @@ namespace Ryujinx.HLE.HOS.Applets.SoftwareKeyboard
|
|||
|
||||
private void DrawPadButton(IImageProcessingContext context, PointF point, Image icon, string label, bool pressed, bool enabled)
|
||||
{
|
||||
// Use relative positions so we can center the the entire drawing later.
|
||||
// Use relative positions so we can center the entire drawing later.
|
||||
|
||||
float iconX = 0;
|
||||
float iconY = 0;
|
||||
|
@ -522,7 +522,7 @@ namespace Ryujinx.HLE.HOS.Applets.SoftwareKeyboard
|
|||
{
|
||||
var labelRectangle = MeasureString(ControllerToggleText, _labelsTextFont);
|
||||
|
||||
// Use relative positions so we can center the the entire drawing later.
|
||||
// Use relative positions so we can center the entire drawing later.
|
||||
|
||||
float keyWidth = _keyModeIcon.Width;
|
||||
float keyHeight = _keyModeIcon.Height;
|
||||
|
|
|
@ -72,7 +72,8 @@ namespace Ryujinx.HLE.HOS
|
|||
|
||||
AddressSpace addressSpace = null;
|
||||
|
||||
if (mode == MemoryManagerMode.HostMapped || mode == MemoryManagerMode.HostMappedUnsafe)
|
||||
// We want to use host tracked mode if the host page size is > 4KB.
|
||||
if ((mode == MemoryManagerMode.HostMapped || mode == MemoryManagerMode.HostMappedUnsafe) && MemoryBlock.GetPageSize() <= 0x1000)
|
||||
{
|
||||
if (!AddressSpace.TryCreate(context.Memory, addressSpaceSize, MemoryBlock.GetPageSize() == MemoryManagerHostMapped.PageSize, out addressSpace))
|
||||
{
|
||||
|
@ -91,13 +92,21 @@ namespace Ryujinx.HLE.HOS
|
|||
|
||||
case MemoryManagerMode.HostMapped:
|
||||
case MemoryManagerMode.HostMappedUnsafe:
|
||||
if (addressSpaceSize != addressSpace.AddressSpaceSize)
|
||||
if (addressSpace == null)
|
||||
{
|
||||
Logger.Warning?.Print(LogClass.Emulation, $"Allocated address space (0x{addressSpace.AddressSpaceSize:X}) is smaller than guest application requirements (0x{addressSpaceSize:X})");
|
||||
var memoryManagerHostTracked = new MemoryManagerHostTracked(context.Memory, addressSpaceSize, mode == MemoryManagerMode.HostMappedUnsafe, invalidAccessHandler);
|
||||
processContext = new ArmProcessContext<MemoryManagerHostTracked>(pid, cpuEngine, _gpu, memoryManagerHostTracked, addressSpaceSize, for64Bit);
|
||||
}
|
||||
else
|
||||
{
|
||||
if (addressSpaceSize != addressSpace.AddressSpaceSize)
|
||||
{
|
||||
Logger.Warning?.Print(LogClass.Emulation, $"Allocated address space (0x{addressSpace.AddressSpaceSize:X}) is smaller than guest application requirements (0x{addressSpaceSize:X})");
|
||||
}
|
||||
|
||||
var memoryManagerHostMapped = new MemoryManagerHostMapped(addressSpace, mode == MemoryManagerMode.HostMappedUnsafe, invalidAccessHandler);
|
||||
processContext = new ArmProcessContext<MemoryManagerHostMapped>(pid, cpuEngine, _gpu, memoryManagerHostMapped, addressSpace.AddressSpaceSize, for64Bit);
|
||||
var memoryManagerHostMapped = new MemoryManagerHostMapped(addressSpace, mode == MemoryManagerMode.HostMappedUnsafe, invalidAccessHandler);
|
||||
processContext = new ArmProcessContext<MemoryManagerHostMapped>(pid, cpuEngine, _gpu, memoryManagerHostMapped, addressSpace.AddressSpaceSize, for64Bit);
|
||||
}
|
||||
break;
|
||||
|
||||
default:
|
||||
|
|
|
@ -165,6 +165,29 @@ namespace Ryujinx.HLE.HOS.Kernel.Memory
|
|||
/// <inheritdoc/>
|
||||
protected override Result MapForeign(IEnumerable<HostMemoryRange> regions, ulong va, ulong size)
|
||||
{
|
||||
ulong backingStart = (ulong)Context.Memory.Pointer;
|
||||
ulong backingEnd = backingStart + Context.Memory.Size;
|
||||
|
||||
KPageList pageList = new();
|
||||
|
||||
foreach (HostMemoryRange region in regions)
|
||||
{
|
||||
// If the range is inside the physical memory, it is shared and we should increment the page count,
|
||||
// otherwise it is private and we don't need to increment the page count.
|
||||
|
||||
if (region.Address >= backingStart && region.Address < backingEnd)
|
||||
{
|
||||
pageList.AddRange(region.Address - backingStart + DramMemoryMap.DramBase, region.Size / PageSize);
|
||||
}
|
||||
}
|
||||
|
||||
using var scopedPageList = new KScopedPageList(Context.MemoryManager, pageList);
|
||||
|
||||
foreach (var pageNode in pageList)
|
||||
{
|
||||
Context.CommitMemory(pageNode.Address - DramMemoryMap.DramBase, pageNode.PagesCount * PageSize);
|
||||
}
|
||||
|
||||
ulong offset = 0;
|
||||
|
||||
foreach (var region in regions)
|
||||
|
@ -174,6 +197,8 @@ namespace Ryujinx.HLE.HOS.Kernel.Memory
|
|||
offset += region.Size;
|
||||
}
|
||||
|
||||
scopedPageList.SignalSuccess();
|
||||
|
||||
return Result.Success;
|
||||
}
|
||||
|
||||
|
|
|
@ -1,39 +0,0 @@
|
|||
using Ryujinx.Common.Logging;
|
||||
using Ryujinx.HLE.HOS.Services.Ptm.Ts.Types;
|
||||
|
||||
namespace Ryujinx.HLE.HOS.Services.Ptm.Ts
|
||||
{
|
||||
[Service("ts")]
|
||||
class IMeasurementServer : IpcService
|
||||
{
|
||||
private const uint DefaultTemperature = 42u;
|
||||
|
||||
public IMeasurementServer(ServiceCtx context) { }
|
||||
|
||||
[CommandCmif(1)]
|
||||
// GetTemperature(Location location) -> u32
|
||||
public ResultCode GetTemperature(ServiceCtx context)
|
||||
{
|
||||
Location location = (Location)context.RequestData.ReadByte();
|
||||
|
||||
Logger.Stub?.PrintStub(LogClass.ServicePtm, new { location });
|
||||
|
||||
context.ResponseData.Write(DefaultTemperature);
|
||||
|
||||
return ResultCode.Success;
|
||||
}
|
||||
|
||||
[CommandCmif(3)]
|
||||
// GetTemperatureMilliC(Location location) -> u32
|
||||
public ResultCode GetTemperatureMilliC(ServiceCtx context)
|
||||
{
|
||||
Location location = (Location)context.RequestData.ReadByte();
|
||||
|
||||
Logger.Stub?.PrintStub(LogClass.ServicePtm, new { location });
|
||||
|
||||
context.ResponseData.Write(DefaultTemperature * 1000);
|
||||
|
||||
return ResultCode.Success;
|
||||
}
|
||||
}
|
||||
}
|
63
src/Ryujinx.Horizon/Ptm/Ipc/MeasurementServer.cs
Normal file
|
@ -0,0 +1,63 @@
|
|||
using Ryujinx.Common.Logging;
|
||||
using Ryujinx.Horizon.Common;
|
||||
using Ryujinx.Horizon.Sdk.Sf;
|
||||
using Ryujinx.Horizon.Sdk.Ts;
|
||||
using Ryujinx.Horizon.Ts.Ipc;
|
||||
|
||||
namespace Ryujinx.Horizon.Ptm.Ipc
|
||||
{
|
||||
partial class MeasurementServer : IMeasurementServer
|
||||
{
|
||||
// NOTE: Values are randomly choosen.
|
||||
public const int DefaultTemperature = 42;
|
||||
public const int MinimumTemperature = 0;
|
||||
public const int MaximumTemperature = 100;
|
||||
|
||||
[CmifCommand(0)] // 1.0.0-16.1.0
|
||||
public Result GetTemperatureRange(out int minimumTemperature, out int maximumTemperature, Location location)
|
||||
{
|
||||
Logger.Stub?.PrintStub(LogClass.ServicePtm, new { location });
|
||||
|
||||
minimumTemperature = MinimumTemperature;
|
||||
maximumTemperature = MaximumTemperature;
|
||||
|
||||
return Result.Success;
|
||||
}
|
||||
|
||||
[CmifCommand(1)] // 1.0.0-16.1.0
|
||||
public Result GetTemperature(out int temperature, Location location)
|
||||
{
|
||||
Logger.Stub?.PrintStub(LogClass.ServicePtm, new { location });
|
||||
|
||||
temperature = DefaultTemperature;
|
||||
|
||||
return Result.Success;
|
||||
}
|
||||
|
||||
[CmifCommand(2)] // 1.0.0-13.2.1
|
||||
public Result SetMeasurementMode(Location location, byte measurementMode)
|
||||
{
|
||||
Logger.Stub?.PrintStub(LogClass.ServicePtm, new { location, measurementMode });
|
||||
|
||||
return Result.Success;
|
||||
}
|
||||
|
||||
[CmifCommand(3)] // 1.0.0-13.2.1
|
||||
public Result GetTemperatureMilliC(out int temperatureMilliC, Location location)
|
||||
{
|
||||
Logger.Stub?.PrintStub(LogClass.ServicePtm, new { location });
|
||||
|
||||
temperatureMilliC = DefaultTemperature * 1000;
|
||||
|
||||
return Result.Success;
|
||||
}
|
||||
|
||||
[CmifCommand(4)] // 8.0.0+
|
||||
public Result OpenSession(out ISession session, DeviceCode deviceCode)
|
||||
{
|
||||
session = new Session(deviceCode);
|
||||
|
||||
return Result.Success;
|
||||
}
|
||||
}
|
||||
}
|
47
src/Ryujinx.Horizon/Ptm/Ipc/Session.cs
Normal file
|
@ -0,0 +1,47 @@
|
|||
using Ryujinx.Common.Logging;
|
||||
using Ryujinx.Horizon.Common;
|
||||
using Ryujinx.Horizon.Ptm.Ipc;
|
||||
using Ryujinx.Horizon.Sdk.Sf;
|
||||
using Ryujinx.Horizon.Sdk.Ts;
|
||||
|
||||
namespace Ryujinx.Horizon.Ts.Ipc
|
||||
{
|
||||
partial class Session : ISession
|
||||
{
|
||||
private readonly DeviceCode _deviceCode;
|
||||
|
||||
public Session(DeviceCode deviceCode)
|
||||
{
|
||||
_deviceCode = deviceCode;
|
||||
}
|
||||
|
||||
[CmifCommand(0)]
|
||||
public Result GetTemperatureRange(out int minimumTemperature, out int maximumTemperature)
|
||||
{
|
||||
Logger.Stub?.PrintStub(LogClass.ServicePtm, new { _deviceCode });
|
||||
|
||||
minimumTemperature = MeasurementServer.MinimumTemperature;
|
||||
maximumTemperature = MeasurementServer.MaximumTemperature;
|
||||
|
||||
return Result.Success;
|
||||
}
|
||||
|
||||
[CmifCommand(2)]
|
||||
public Result SetMeasurementMode(byte measurementMode)
|
||||
{
|
||||
Logger.Stub?.PrintStub(LogClass.ServicePtm, new { _deviceCode, measurementMode });
|
||||
|
||||
return Result.Success;
|
||||
}
|
||||
|
||||
[CmifCommand(4)]
|
||||
public Result GetTemperature(out int temperature)
|
||||
{
|
||||
Logger.Stub?.PrintStub(LogClass.ServicePtm, new { _deviceCode });
|
||||
|
||||
temperature = MeasurementServer.DefaultTemperature;
|
||||
|
||||
return Result.Success;
|
||||
}
|
||||
}
|
||||
}
|
44
src/Ryujinx.Horizon/Ptm/TsIpcServer.cs
Normal file
|
@ -0,0 +1,44 @@
|
|||
using Ryujinx.Horizon.Ptm.Ipc;
|
||||
using Ryujinx.Horizon.Sdk.Sf.Hipc;
|
||||
using Ryujinx.Horizon.Sdk.Sm;
|
||||
|
||||
namespace Ryujinx.Horizon.Ptm
|
||||
{
|
||||
class TsIpcServer
|
||||
{
|
||||
private const int MaxSessionsCount = 4;
|
||||
|
||||
private const int PointerBufferSize = 0;
|
||||
private const int MaxDomains = 0;
|
||||
private const int MaxDomainObjects = 0;
|
||||
private const int MaxPortsCount = 1;
|
||||
|
||||
private static readonly ManagerOptions _managerOptions = new(PointerBufferSize, MaxDomains, MaxDomainObjects, false);
|
||||
|
||||
private SmApi _sm;
|
||||
private ServerManager _serverManager;
|
||||
|
||||
public void Initialize()
|
||||
{
|
||||
HeapAllocator allocator = new();
|
||||
|
||||
_sm = new SmApi();
|
||||
_sm.Initialize().AbortOnFailure();
|
||||
|
||||
_serverManager = new ServerManager(allocator, _sm, MaxPortsCount, _managerOptions, MaxSessionsCount);
|
||||
|
||||
_serverManager.RegisterObjectForServer(new MeasurementServer(), ServiceName.Encode("ts"), MaxSessionsCount);
|
||||
}
|
||||
|
||||
public void ServiceRequests()
|
||||
{
|
||||
_serverManager.ServiceRequests();
|
||||
}
|
||||
|
||||
public void Shutdown()
|
||||
{
|
||||
_serverManager.Dispose();
|
||||
_sm.Dispose();
|
||||
}
|
||||
}
|
||||
}
|
17
src/Ryujinx.Horizon/Ptm/TsMain.cs
Normal file
|
@ -0,0 +1,17 @@
|
|||
namespace Ryujinx.Horizon.Ptm
|
||||
{
|
||||
class TsMain : IService
|
||||
{
|
||||
public static void Main(ServiceTable serviceTable)
|
||||
{
|
||||
TsIpcServer ipcServer = new();
|
||||
|
||||
ipcServer.Initialize();
|
||||
|
||||
serviceTable.SignalServiceReady();
|
||||
|
||||
ipcServer.ServiceRequests();
|
||||
ipcServer.Shutdown();
|
||||
}
|
||||
}
|
||||
}
|
8
src/Ryujinx.Horizon/Sdk/Ts/DeviceCode.cs
Normal file
|
@ -0,0 +1,8 @@
|
|||
namespace Ryujinx.Horizon.Sdk.Ts
|
||||
{
|
||||
enum DeviceCode : uint
|
||||
{
|
||||
Internal = 0x41000001,
|
||||
External = 0x41000002,
|
||||
}
|
||||
}
|
14
src/Ryujinx.Horizon/Sdk/Ts/IMeasurementServer.cs
Normal file
|
@ -0,0 +1,14 @@
|
|||
using Ryujinx.Horizon.Common;
|
||||
using Ryujinx.Horizon.Sdk.Sf;
|
||||
|
||||
namespace Ryujinx.Horizon.Sdk.Ts
|
||||
{
|
||||
interface IMeasurementServer : IServiceObject
|
||||
{
|
||||
Result GetTemperatureRange(out int minimumTemperature, out int maximumTemperature, Location location);
|
||||
Result GetTemperature(out int temperature, Location location);
|
||||
Result SetMeasurementMode(Location location, byte measurementMode);
|
||||
Result GetTemperatureMilliC(out int temperatureMilliC, Location location);
|
||||
Result OpenSession(out ISession session, DeviceCode deviceCode);
|
||||
}
|
||||
}
|
12
src/Ryujinx.Horizon/Sdk/Ts/ISession.cs
Normal file
|
@ -0,0 +1,12 @@
|
|||
using Ryujinx.Horizon.Common;
|
||||
using Ryujinx.Horizon.Sdk.Sf;
|
||||
|
||||
namespace Ryujinx.Horizon.Sdk.Ts
|
||||
{
|
||||
interface ISession : IServiceObject
|
||||
{
|
||||
Result GetTemperatureRange(out int minimumTemperature, out int maximumTemperature);
|
||||
Result GetTemperature(out int temperature);
|
||||
Result SetMeasurementMode(byte measurementMode);
|
||||
}
|
||||
}
|
|
@ -1,4 +1,4 @@
|
|||
namespace Ryujinx.HLE.HOS.Services.Ptm.Ts.Types
|
||||
namespace Ryujinx.Horizon.Sdk.Ts
|
||||
{
|
||||
enum Location : byte
|
||||
{
|
|
@ -11,6 +11,7 @@ using Ryujinx.Horizon.Ngc;
|
|||
using Ryujinx.Horizon.Ovln;
|
||||
using Ryujinx.Horizon.Prepo;
|
||||
using Ryujinx.Horizon.Psc;
|
||||
using Ryujinx.Horizon.Ptm;
|
||||
using Ryujinx.Horizon.Sdk.Arp;
|
||||
using Ryujinx.Horizon.Srepo;
|
||||
using Ryujinx.Horizon.Usb;
|
||||
|
@ -54,6 +55,7 @@ namespace Ryujinx.Horizon
|
|||
RegisterService<PrepoMain>();
|
||||
RegisterService<PscMain>();
|
||||
RegisterService<SrepoMain>();
|
||||
RegisterService<TsMain>();
|
||||
RegisterService<UsbMain>();
|
||||
RegisterService<WlanMain>();
|
||||
|
||||
|
|
|
@ -3,7 +3,6 @@ using System;
|
|||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Runtime.CompilerServices;
|
||||
using System.Runtime.InteropServices;
|
||||
|
||||
namespace Ryujinx.Memory
|
||||
{
|
||||
|
@ -11,7 +10,7 @@ namespace Ryujinx.Memory
|
|||
/// Represents a address space manager.
|
||||
/// Supports virtual memory region mapping, address translation and read/write access to mapped regions.
|
||||
/// </summary>
|
||||
public sealed class AddressSpaceManager : VirtualMemoryManagerBase<ulong, nuint>, IVirtualMemoryManager, IWritableBlock
|
||||
public sealed class AddressSpaceManager : VirtualMemoryManagerBase, IVirtualMemoryManager
|
||||
{
|
||||
/// <inheritdoc/>
|
||||
public bool Supports4KBPages => true;
|
||||
|
@ -63,8 +62,7 @@ namespace Ryujinx.Memory
|
|||
}
|
||||
}
|
||||
|
||||
/// <inheritdoc/>
|
||||
public void MapForeign(ulong va, nuint hostPointer, ulong size)
|
||||
public override void MapForeign(ulong va, nuint hostPointer, ulong size)
|
||||
{
|
||||
AssertValidAddressAndSize(va, size);
|
||||
|
||||
|
@ -92,106 +90,6 @@ namespace Ryujinx.Memory
|
|||
}
|
||||
}
|
||||
|
||||
/// <inheritdoc/>
|
||||
public T Read<T>(ulong va) where T : unmanaged
|
||||
{
|
||||
return MemoryMarshal.Cast<byte, T>(GetSpan(va, Unsafe.SizeOf<T>()))[0];
|
||||
}
|
||||
|
||||
/// <inheritdoc/>
|
||||
public void Write<T>(ulong va, T value) where T : unmanaged
|
||||
{
|
||||
Write(va, MemoryMarshal.Cast<T, byte>(MemoryMarshal.CreateSpan(ref value, 1)));
|
||||
}
|
||||
|
||||
/// <inheritdoc/>
|
||||
public void Write(ulong va, ReadOnlySpan<byte> data)
|
||||
{
|
||||
if (data.Length == 0)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
AssertValidAddressAndSize(va, (ulong)data.Length);
|
||||
|
||||
if (IsContiguousAndMapped(va, data.Length))
|
||||
{
|
||||
data.CopyTo(GetHostSpanContiguous(va, data.Length));
|
||||
}
|
||||
else
|
||||
{
|
||||
int offset = 0, size;
|
||||
|
||||
if ((va & PageMask) != 0)
|
||||
{
|
||||
size = Math.Min(data.Length, PageSize - (int)(va & PageMask));
|
||||
|
||||
data[..size].CopyTo(GetHostSpanContiguous(va, size));
|
||||
|
||||
offset += size;
|
||||
}
|
||||
|
||||
for (; offset < data.Length; offset += size)
|
||||
{
|
||||
size = Math.Min(data.Length - offset, PageSize);
|
||||
|
||||
data.Slice(offset, size).CopyTo(GetHostSpanContiguous(va + (ulong)offset, size));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// <inheritdoc/>
|
||||
public bool WriteWithRedundancyCheck(ulong va, ReadOnlySpan<byte> data)
|
||||
{
|
||||
Write(va, data);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
/// <inheritdoc/>
|
||||
public ReadOnlySpan<byte> GetSpan(ulong va, int size, bool tracked = false)
|
||||
{
|
||||
if (size == 0)
|
||||
{
|
||||
return ReadOnlySpan<byte>.Empty;
|
||||
}
|
||||
|
||||
if (IsContiguousAndMapped(va, size))
|
||||
{
|
||||
return GetHostSpanContiguous(va, size);
|
||||
}
|
||||
else
|
||||
{
|
||||
Span<byte> data = new byte[size];
|
||||
|
||||
Read(va, data);
|
||||
|
||||
return data;
|
||||
}
|
||||
}
|
||||
|
||||
/// <inheritdoc/>
|
||||
public unsafe WritableRegion GetWritableRegion(ulong va, int size, bool tracked = false)
|
||||
{
|
||||
if (size == 0)
|
||||
{
|
||||
return new WritableRegion(null, va, Memory<byte>.Empty);
|
||||
}
|
||||
|
||||
if (IsContiguousAndMapped(va, size))
|
||||
{
|
||||
return new WritableRegion(null, va, new NativeMemoryManager<byte>((byte*)GetHostAddress(va), size).Memory);
|
||||
}
|
||||
else
|
||||
{
|
||||
Memory<byte> memory = new byte[size];
|
||||
|
||||
GetSpan(va, size).CopyTo(memory.Span);
|
||||
|
||||
return new WritableRegion(this, va, memory);
|
||||
}
|
||||
}
|
||||
|
||||
/// <inheritdoc/>
|
||||
public unsafe ref T GetRef<T>(ulong va) where T : unmanaged
|
||||
{
|
||||
|
@ -203,50 +101,6 @@ namespace Ryujinx.Memory
|
|||
return ref *(T*)GetHostAddress(va);
|
||||
}
|
||||
|
||||
/// <inheritdoc/>
|
||||
[MethodImpl(MethodImplOptions.AggressiveInlining)]
|
||||
private static int GetPagesCount(ulong va, uint size, out ulong startVa)
|
||||
{
|
||||
// WARNING: Always check if ulong does not overflow during the operations.
|
||||
startVa = va & ~(ulong)PageMask;
|
||||
ulong vaSpan = (va - startVa + size + PageMask) & ~(ulong)PageMask;
|
||||
|
||||
return (int)(vaSpan / PageSize);
|
||||
}
|
||||
|
||||
private static void ThrowMemoryNotContiguous() => throw new MemoryNotContiguousException();
|
||||
|
||||
[MethodImpl(MethodImplOptions.AggressiveInlining)]
|
||||
private bool IsContiguousAndMapped(ulong va, int size) => IsContiguous(va, size) && IsMapped(va);
|
||||
|
||||
[MethodImpl(MethodImplOptions.AggressiveInlining)]
|
||||
private bool IsContiguous(ulong va, int size)
|
||||
{
|
||||
if (!ValidateAddress(va) || !ValidateAddressAndSize(va, (ulong)size))
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
int pages = GetPagesCount(va, (uint)size, out va);
|
||||
|
||||
for (int page = 0; page < pages - 1; page++)
|
||||
{
|
||||
if (!ValidateAddress(va + PageSize))
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
if (GetHostAddress(va) + PageSize != GetHostAddress(va + PageSize))
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
va += PageSize;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
/// <inheritdoc/>
|
||||
public IEnumerable<HostMemoryRange> GetHostRegions(ulong va, ulong size)
|
||||
{
|
||||
|
@ -283,9 +137,9 @@ namespace Ryujinx.Memory
|
|||
{
|
||||
var hostRegion = hostRegions[i];
|
||||
|
||||
if ((ulong)hostRegion.Address >= backingStart && (ulong)hostRegion.Address < backingEnd)
|
||||
if (hostRegion.Address >= backingStart && hostRegion.Address < backingEnd)
|
||||
{
|
||||
regions[count++] = new MemoryRange((ulong)hostRegion.Address - backingStart, hostRegion.Size);
|
||||
regions[count++] = new MemoryRange(hostRegion.Address - backingStart, hostRegion.Size);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -304,7 +158,7 @@ namespace Ryujinx.Memory
|
|||
return null;
|
||||
}
|
||||
|
||||
int pages = GetPagesCount(va, (uint)size, out va);
|
||||
int pages = GetPagesCount(va, size, out va);
|
||||
|
||||
var regions = new List<HostMemoryRange>();
|
||||
|
||||
|
@ -336,9 +190,8 @@ namespace Ryujinx.Memory
|
|||
return regions;
|
||||
}
|
||||
|
||||
/// <inheritdoc/>
|
||||
[MethodImpl(MethodImplOptions.AggressiveInlining)]
|
||||
public bool IsMapped(ulong va)
|
||||
public override bool IsMapped(ulong va)
|
||||
{
|
||||
if (!ValidateAddress(va))
|
||||
{
|
||||
|
@ -351,7 +204,7 @@ namespace Ryujinx.Memory
|
|||
/// <inheritdoc/>
|
||||
public bool IsRangeMapped(ulong va, ulong size)
|
||||
{
|
||||
if (size == 0UL)
|
||||
if (size == 0)
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
@ -376,11 +229,6 @@ namespace Ryujinx.Memory
|
|||
return true;
|
||||
}
|
||||
|
||||
private unsafe Span<byte> GetHostSpanContiguous(ulong va, int size)
|
||||
{
|
||||
return new Span<byte>((void*)GetHostAddress(va), size);
|
||||
}
|
||||
|
||||
private nuint GetHostAddress(ulong va)
|
||||
{
|
||||
return _pageTable.Read(va) + (nuint)(va & PageMask);
|
||||
|
@ -392,21 +240,21 @@ namespace Ryujinx.Memory
|
|||
}
|
||||
|
||||
/// <inheritdoc/>
|
||||
public void TrackingReprotect(ulong va, ulong size, MemoryPermission protection)
|
||||
public void TrackingReprotect(ulong va, ulong size, MemoryPermission protection, bool guest = false)
|
||||
{
|
||||
throw new NotImplementedException();
|
||||
}
|
||||
|
||||
/// <inheritdoc/>
|
||||
public void SignalMemoryTracking(ulong va, ulong size, bool write, bool precise = false, int? exemptId = null)
|
||||
{
|
||||
// Only the ARM Memory Manager has tracking for now.
|
||||
}
|
||||
protected unsafe override Memory<byte> GetPhysicalAddressMemory(nuint pa, int size)
|
||||
=> new NativeMemoryManager<byte>((byte*)pa, size).Memory;
|
||||
|
||||
protected override unsafe Span<byte> GetPhysicalAddressSpan(nuint pa, int size)
|
||||
=> new((void*)pa, size);
|
||||
=> new Span<byte>((void*)pa, size);
|
||||
|
||||
protected override nuint TranslateVirtualAddressForRead(ulong va)
|
||||
protected override nuint TranslateVirtualAddressChecked(ulong va)
|
||||
=> GetHostAddress(va);
|
||||
|
||||
protected override nuint TranslateVirtualAddressUnchecked(ulong va)
|
||||
=> GetHostAddress(va);
|
||||
}
|
||||
}
|
||||
|
|
60
src/Ryujinx.Memory/BytesReadOnlySequenceSegment.cs
Normal file
|
@ -0,0 +1,60 @@
|
|||
using System;
|
||||
using System.Buffers;
|
||||
using System.Runtime.InteropServices;
|
||||
|
||||
namespace Ryujinx.Memory
|
||||
{
|
||||
/// <summary>
|
||||
/// A concrete implementation of <seealso cref="ReadOnlySequence{Byte}"/>,
|
||||
/// with methods to help build a full sequence.
|
||||
/// </summary>
|
||||
public sealed class BytesReadOnlySequenceSegment : ReadOnlySequenceSegment<byte>
|
||||
{
|
||||
public BytesReadOnlySequenceSegment(Memory<byte> memory) => Memory = memory;
|
||||
|
||||
public BytesReadOnlySequenceSegment Append(Memory<byte> memory)
|
||||
{
|
||||
var nextSegment = new BytesReadOnlySequenceSegment(memory)
|
||||
{
|
||||
RunningIndex = RunningIndex + Memory.Length
|
||||
};
|
||||
|
||||
Next = nextSegment;
|
||||
|
||||
return nextSegment;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Attempts to determine if the current <seealso cref="Memory{Byte}"/> and <paramref name="other"/> are contiguous.
|
||||
/// Only works if both were created by a <seealso cref="NativeMemoryManager{Byte}"/>.
|
||||
/// </summary>
|
||||
/// <param name="other">The segment to check if continuous with the current one</param>
|
||||
/// <param name="contiguousStart">The starting address of the contiguous segment</param>
|
||||
/// <param name="contiguousSize">The size of the contiguous segment</param>
|
||||
/// <returns>True if the segments are contiguous, otherwise false</returns>
|
||||
public unsafe bool IsContiguousWith(Memory<byte> other, out nuint contiguousStart, out int contiguousSize)
|
||||
{
|
||||
if (MemoryMarshal.TryGetMemoryManager<byte, NativeMemoryManager<byte>>(Memory, out var thisMemoryManager) &&
|
||||
MemoryMarshal.TryGetMemoryManager<byte, NativeMemoryManager<byte>>(other, out var otherMemoryManager) &&
|
||||
thisMemoryManager.Pointer + thisMemoryManager.Length == otherMemoryManager.Pointer)
|
||||
{
|
||||
contiguousStart = (nuint)thisMemoryManager.Pointer;
|
||||
contiguousSize = thisMemoryManager.Length + otherMemoryManager.Length;
|
||||
return true;
|
||||
}
|
||||
else
|
||||
{
|
||||
contiguousStart = 0;
|
||||
contiguousSize = 0;
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Replaces the current <seealso cref="Memory{Byte}"/> value with the one provided.
|
||||
/// </summary>
|
||||
/// <param name="memory">The new segment to hold in this <seealso cref="BytesReadOnlySequenceSegment"/></param>
|
||||
public void Replace(Memory<byte> memory)
|
||||
=> Memory = memory;
|
||||
}
|
||||
}
|
|
@ -124,6 +124,16 @@ namespace Ryujinx.Memory
|
|||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Gets a read-only sequence of read-only memory blocks from CPU mapped memory.
|
||||
/// </summary>
|
||||
/// <param name="va">Virtual address of the data</param>
|
||||
/// <param name="size">Size of the data</param>
|
||||
/// <param name="tracked">True if read tracking is triggered on the memory</param>
|
||||
/// <returns>A read-only sequence of read-only memory of the data</returns>
|
||||
/// <exception cref="InvalidMemoryRegionException">Throw for unhandled invalid or unmapped memory accesses</exception>
|
||||
ReadOnlySequence<byte> GetReadOnlySequence(ulong va, int size, bool tracked = false);
|
||||
|
||||
/// <summary>
|
||||
/// Gets a read-only span of data from CPU mapped memory.
|
||||
/// </summary>
|
||||
|
@ -214,6 +224,7 @@ namespace Ryujinx.Memory
|
|||
/// <param name="va">Virtual address base</param>
|
||||
/// <param name="size">Size of the region to protect</param>
|
||||
/// <param name="protection">Memory protection to set</param>
|
||||
void TrackingReprotect(ulong va, ulong size, MemoryPermission protection);
|
||||
/// <param name="guest">True if the protection is for guest access, false otherwise</param>
|
||||
void TrackingReprotect(ulong va, ulong size, MemoryPermission protection, bool guest);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -174,7 +174,7 @@ namespace Ryujinx.Memory
|
|||
/// <param name="offset">Starting offset of the range being read</param>
|
||||
/// <param name="data">Span where the bytes being read will be copied to</param>
|
||||
/// <exception cref="ObjectDisposedException">Throw when the memory block has already been disposed</exception>
|
||||
/// <exception cref="InvalidMemoryRegionException">Throw when the memory region specified for the the data is out of range</exception>
|
||||
/// <exception cref="InvalidMemoryRegionException">Throw when the memory region specified for the data is out of range</exception>
|
||||
[MethodImpl(MethodImplOptions.AggressiveInlining)]
|
||||
public void Read(ulong offset, Span<byte> data)
|
||||
{
|
||||
|
@ -188,7 +188,7 @@ namespace Ryujinx.Memory
|
|||
/// <param name="offset">Offset where the data is located</param>
|
||||
/// <returns>Data at the specified address</returns>
|
||||
/// <exception cref="ObjectDisposedException">Throw when the memory block has already been disposed</exception>
|
||||
/// <exception cref="InvalidMemoryRegionException">Throw when the memory region specified for the the data is out of range</exception>
|
||||
/// <exception cref="InvalidMemoryRegionException">Throw when the memory region specified for the data is out of range</exception>
|
||||
[MethodImpl(MethodImplOptions.AggressiveInlining)]
|
||||
public T Read<T>(ulong offset) where T : unmanaged
|
||||
{
|
||||
|
@ -201,7 +201,7 @@ namespace Ryujinx.Memory
|
|||
/// <param name="offset">Starting offset of the range being written</param>
|
||||
/// <param name="data">Span where the bytes being written will be copied from</param>
|
||||
/// <exception cref="ObjectDisposedException">Throw when the memory block has already been disposed</exception>
|
||||
/// <exception cref="InvalidMemoryRegionException">Throw when the memory region specified for the the data is out of range</exception>
|
||||
/// <exception cref="InvalidMemoryRegionException">Throw when the memory region specified for the data is out of range</exception>
|
||||
[MethodImpl(MethodImplOptions.AggressiveInlining)]
|
||||
public void Write(ulong offset, ReadOnlySpan<byte> data)
|
||||
{
|
||||
|
@ -215,7 +215,7 @@ namespace Ryujinx.Memory
|
|||
/// <param name="offset">Offset to write the data into</param>
|
||||
/// <param name="data">Data to be written</param>
|
||||
/// <exception cref="ObjectDisposedException">Throw when the memory block has already been disposed</exception>
|
||||
/// <exception cref="InvalidMemoryRegionException">Throw when the memory region specified for the the data is out of range</exception>
|
||||
/// <exception cref="InvalidMemoryRegionException">Throw when the memory region specified for the data is out of range</exception>
|
||||
[MethodImpl(MethodImplOptions.AggressiveInlining)]
|
||||
public void Write<T>(ulong offset, T data) where T : unmanaged
|
||||
{
|
||||
|
|
|
@ -14,6 +14,10 @@ namespace Ryujinx.Memory
|
|||
_length = length;
|
||||
}
|
||||
|
||||
public unsafe T* Pointer => _pointer;
|
||||
|
||||
public int Length => _length;
|
||||
|
||||
public override Span<T> GetSpan()
|
||||
{
|
||||
return new Span<T>((void*)_pointer, _length);
|
||||
|
|
|
@ -14,9 +14,14 @@ namespace Ryujinx.Memory.Tracking
|
|||
|
||||
// Only use these from within the lock.
|
||||
private readonly NonOverlappingRangeList<VirtualRegion> _virtualRegions;
|
||||
// Guest virtual regions are a subset of the normal virtual regions, with potentially different protection
|
||||
// and expanded area of effect on platforms that don't support misaligned page protection.
|
||||
private readonly NonOverlappingRangeList<VirtualRegion> _guestVirtualRegions;
|
||||
|
||||
private readonly int _pageSize;
|
||||
|
||||
private readonly bool _singleByteGuestTracking;
|
||||
|
||||
/// <summary>
|
||||
/// This lock must be obtained when traversing or updating the region-handle hierarchy.
|
||||
/// It is not required when reading dirty flags.
|
||||
|
@ -27,16 +32,27 @@ namespace Ryujinx.Memory.Tracking
|
|||
/// Create a new tracking structure for the given "physical" memory block,
|
||||
/// with a given "virtual" memory manager that will provide mappings and virtual memory protection.
|
||||
/// </summary>
|
||||
/// <remarks>
|
||||
/// If <paramref name="singleByteGuestTracking" /> is true, the memory manager must also support protection on partially
|
||||
/// unmapped regions without throwing exceptions or dropping protection on the mapped portion.
|
||||
/// </remarks>
|
||||
/// <param name="memoryManager">Virtual memory manager</param>
|
||||
/// <param name="block">Physical memory block</param>
|
||||
/// <param name="pageSize">Page size of the virtual memory space</param>
|
||||
public MemoryTracking(IVirtualMemoryManager memoryManager, int pageSize, InvalidAccessHandler invalidAccessHandler = null)
|
||||
/// <param name="invalidAccessHandler">Method to call for invalid memory accesses</param>
|
||||
/// <param name="singleByteGuestTracking">True if the guest only signals writes for the first byte</param>
|
||||
public MemoryTracking(
|
||||
IVirtualMemoryManager memoryManager,
|
||||
int pageSize,
|
||||
InvalidAccessHandler invalidAccessHandler = null,
|
||||
bool singleByteGuestTracking = false)
|
||||
{
|
||||
_memoryManager = memoryManager;
|
||||
_pageSize = pageSize;
|
||||
_invalidAccessHandler = invalidAccessHandler;
|
||||
_singleByteGuestTracking = singleByteGuestTracking;
|
||||
|
||||
_virtualRegions = new NonOverlappingRangeList<VirtualRegion>();
|
||||
_guestVirtualRegions = new NonOverlappingRangeList<VirtualRegion>();
|
||||
}
|
||||
|
||||
private (ulong address, ulong size) PageAlign(ulong address, ulong size)
|
||||
|
@ -62,20 +78,25 @@ namespace Ryujinx.Memory.Tracking
|
|||
{
|
||||
ref var overlaps = ref ThreadStaticArray<VirtualRegion>.Get();
|
||||
|
||||
int count = _virtualRegions.FindOverlapsNonOverlapping(va, size, ref overlaps);
|
||||
|
||||
for (int i = 0; i < count; i++)
|
||||
for (int type = 0; type < 2; type++)
|
||||
{
|
||||
VirtualRegion region = overlaps[i];
|
||||
NonOverlappingRangeList<VirtualRegion> regions = type == 0 ? _virtualRegions : _guestVirtualRegions;
|
||||
|
||||
// If the region has been fully remapped, signal that it has been mapped again.
|
||||
bool remapped = _memoryManager.IsRangeMapped(region.Address, region.Size);
|
||||
if (remapped)
|
||||
int count = regions.FindOverlapsNonOverlapping(va, size, ref overlaps);
|
||||
|
||||
for (int i = 0; i < count; i++)
|
||||
{
|
||||
region.SignalMappingChanged(true);
|
||||
}
|
||||
VirtualRegion region = overlaps[i];
|
||||
|
||||
region.UpdateProtection();
|
||||
// If the region has been fully remapped, signal that it has been mapped again.
|
||||
bool remapped = _memoryManager.IsRangeMapped(region.Address, region.Size);
|
||||
if (remapped)
|
||||
{
|
||||
region.SignalMappingChanged(true);
|
||||
}
|
||||
|
||||
region.UpdateProtection();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -95,27 +116,58 @@ namespace Ryujinx.Memory.Tracking
|
|||
{
|
||||
ref var overlaps = ref ThreadStaticArray<VirtualRegion>.Get();
|
||||
|
||||
int count = _virtualRegions.FindOverlapsNonOverlapping(va, size, ref overlaps);
|
||||
|
||||
for (int i = 0; i < count; i++)
|
||||
for (int type = 0; type < 2; type++)
|
||||
{
|
||||
VirtualRegion region = overlaps[i];
|
||||
NonOverlappingRangeList<VirtualRegion> regions = type == 0 ? _virtualRegions : _guestVirtualRegions;
|
||||
|
||||
region.SignalMappingChanged(false);
|
||||
int count = regions.FindOverlapsNonOverlapping(va, size, ref overlaps);
|
||||
|
||||
for (int i = 0; i < count; i++)
|
||||
{
|
||||
VirtualRegion region = overlaps[i];
|
||||
|
||||
region.SignalMappingChanged(false);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Alter a tracked memory region to properly capture unaligned accesses.
|
||||
/// For most memory manager modes, this does nothing.
|
||||
/// </summary>
|
||||
/// <param name="address">Original region address</param>
|
||||
/// <param name="size">Original region size</param>
|
||||
/// <returns>A new address and size for tracking unaligned accesses</returns>
|
||||
internal (ulong newAddress, ulong newSize) GetUnalignedSafeRegion(ulong address, ulong size)
|
||||
{
|
||||
if (_singleByteGuestTracking)
|
||||
{
|
||||
// The guest only signals the first byte of each memory access with the current memory manager.
|
||||
// To catch unaligned access properly, we need to also protect the page before the address.
|
||||
|
||||
// Assume that the address and size are already aligned.
|
||||
|
||||
return (address - (ulong)_pageSize, size + (ulong)_pageSize);
|
||||
}
|
||||
else
|
||||
{
|
||||
return (address, size);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Get a list of virtual regions that a handle covers.
|
||||
/// </summary>
|
||||
/// <param name="va">Starting virtual memory address of the handle</param>
|
||||
/// <param name="size">Size of the handle's memory region</param>
|
||||
/// <param name="guest">True if getting handles for guest protection, false otherwise</param>
|
||||
/// <returns>A list of virtual regions within the given range</returns>
|
||||
internal List<VirtualRegion> GetVirtualRegionsForHandle(ulong va, ulong size)
|
||||
internal List<VirtualRegion> GetVirtualRegionsForHandle(ulong va, ulong size, bool guest)
|
||||
{
|
||||
List<VirtualRegion> result = new();
|
||||
_virtualRegions.GetOrAddRegions(result, va, size, (va, size) => new VirtualRegion(this, va, size));
|
||||
NonOverlappingRangeList<VirtualRegion> regions = guest ? _guestVirtualRegions : _virtualRegions;
|
||||
regions.GetOrAddRegions(result, va, size, (va, size) => new VirtualRegion(this, va, size, guest));
|
||||
|
||||
return result;
|
||||
}
|
||||
|
@ -126,7 +178,14 @@ namespace Ryujinx.Memory.Tracking
|
|||
/// <param name="region">Region to remove</param>
|
||||
internal void RemoveVirtual(VirtualRegion region)
|
||||
{
|
||||
_virtualRegions.Remove(region);
|
||||
if (region.Guest)
|
||||
{
|
||||
_guestVirtualRegions.Remove(region);
|
||||
}
|
||||
else
|
||||
{
|
||||
_virtualRegions.Remove(region);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
|
@ -137,10 +196,11 @@ namespace Ryujinx.Memory.Tracking
|
|||
/// <param name="handles">Handles to inherit state from or reuse. When none are present, provide null</param>
|
||||
/// <param name="granularity">Desired granularity of write tracking</param>
|
||||
/// <param name="id">Handle ID</param>
|
||||
/// <param name="flags">Region flags</param>
|
||||
/// <returns>The memory tracking handle</returns>
|
||||
public MultiRegionHandle BeginGranularTracking(ulong address, ulong size, IEnumerable<IRegionHandle> handles, ulong granularity, int id)
|
||||
public MultiRegionHandle BeginGranularTracking(ulong address, ulong size, IEnumerable<IRegionHandle> handles, ulong granularity, int id, RegionFlags flags = RegionFlags.None)
|
||||
{
|
||||
return new MultiRegionHandle(this, address, size, handles, granularity, id);
|
||||
return new MultiRegionHandle(this, address, size, handles, granularity, id, flags);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
|
@ -164,15 +224,16 @@ namespace Ryujinx.Memory.Tracking
|
|||
/// <param name="address">CPU virtual address of the region</param>
|
||||
/// <param name="size">Size of the region</param>
|
||||
/// <param name="id">Handle ID</param>
|
||||
/// <param name="flags">Region flags</param>
|
||||
/// <returns>The memory tracking handle</returns>
|
||||
public RegionHandle BeginTracking(ulong address, ulong size, int id)
|
||||
public RegionHandle BeginTracking(ulong address, ulong size, int id, RegionFlags flags = RegionFlags.None)
|
||||
{
|
||||
var (paAddress, paSize) = PageAlign(address, size);
|
||||
|
||||
lock (TrackingLock)
|
||||
{
|
||||
bool mapped = _memoryManager.IsRangeMapped(address, size);
|
||||
RegionHandle handle = new(this, paAddress, paSize, address, size, id, mapped);
|
||||
RegionHandle handle = new(this, paAddress, paSize, address, size, id, flags, mapped);
|
||||
|
||||
return handle;
|
||||
}
|
||||
|
@ -186,15 +247,16 @@ namespace Ryujinx.Memory.Tracking
|
|||
/// <param name="bitmap">The bitmap owning the dirty flag for this handle</param>
|
||||
/// <param name="bit">The bit of this handle within the dirty flag</param>
|
||||
/// <param name="id">Handle ID</param>
|
||||
/// <param name="flags">Region flags</param>
|
||||
/// <returns>The memory tracking handle</returns>
|
||||
internal RegionHandle BeginTrackingBitmap(ulong address, ulong size, ConcurrentBitmap bitmap, int bit, int id)
|
||||
internal RegionHandle BeginTrackingBitmap(ulong address, ulong size, ConcurrentBitmap bitmap, int bit, int id, RegionFlags flags = RegionFlags.None)
|
||||
{
|
||||
var (paAddress, paSize) = PageAlign(address, size);
|
||||
|
||||
lock (TrackingLock)
|
||||
{
|
||||
bool mapped = _memoryManager.IsRangeMapped(address, size);
|
||||
RegionHandle handle = new(this, paAddress, paSize, address, size, bitmap, bit, id, mapped);
|
||||
RegionHandle handle = new(this, paAddress, paSize, address, size, bitmap, bit, id, flags, mapped);
|
||||
|
||||
return handle;
|
||||
}
|
||||
|
@ -202,6 +264,7 @@ namespace Ryujinx.Memory.Tracking
|
|||
|
||||
/// <summary>
|
||||
/// Signal that a virtual memory event happened at the given location.
|
||||
/// The memory event is assumed to be triggered by guest code.
|
||||
/// </summary>
|
||||
/// <param name="address">Virtual address accessed</param>
|
||||
/// <param name="size">Size of the region affected in bytes</param>
|
||||
|
@ -209,7 +272,7 @@ namespace Ryujinx.Memory.Tracking
|
|||
/// <returns>True if the event triggered any tracking regions, false otherwise</returns>
|
||||
public bool VirtualMemoryEvent(ulong address, ulong size, bool write)
|
||||
{
|
||||
return VirtualMemoryEvent(address, size, write, precise: false, null);
|
||||
return VirtualMemoryEvent(address, size, write, precise: false, exemptId: null, guest: true);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
|
@ -222,8 +285,9 @@ namespace Ryujinx.Memory.Tracking
|
|||
/// <param name="write">Whether the region was written to or read</param>
|
||||
/// <param name="precise">True if the access is precise, false otherwise</param>
|
||||
/// <param name="exemptId">Optional ID that of the handles that should not be signalled</param>
|
||||
/// <param name="guest">True if the access is from the guest, false otherwise</param>
|
||||
/// <returns>True if the event triggered any tracking regions, false otherwise</returns>
|
||||
public bool VirtualMemoryEvent(ulong address, ulong size, bool write, bool precise, int? exemptId = null)
|
||||
public bool VirtualMemoryEvent(ulong address, ulong size, bool write, bool precise, int? exemptId = null, bool guest = false)
|
||||
{
|
||||
// Look up the virtual region using the region list.
|
||||
// Signal up the chain to relevant handles.
|
||||
|
@ -234,7 +298,9 @@ namespace Ryujinx.Memory.Tracking
|
|||
{
|
||||
ref var overlaps = ref ThreadStaticArray<VirtualRegion>.Get();
|
||||
|
||||
int count = _virtualRegions.FindOverlapsNonOverlapping(address, size, ref overlaps);
|
||||
NonOverlappingRangeList<VirtualRegion> regions = guest ? _guestVirtualRegions : _virtualRegions;
|
||||
|
||||
int count = regions.FindOverlapsNonOverlapping(address, size, ref overlaps);
|
||||
|
||||
if (count == 0 && !precise)
|
||||
{
|
||||
|
@ -242,7 +308,7 @@ namespace Ryujinx.Memory.Tracking
|
|||
{
|
||||
// TODO: There is currently the possibility that a page can be protected after its virtual region is removed.
|
||||
// This code handles that case when it happens, but it would be better to find out how this happens.
|
||||
_memoryManager.TrackingReprotect(address & ~(ulong)(_pageSize - 1), (ulong)_pageSize, MemoryPermission.ReadAndWrite);
|
||||
_memoryManager.TrackingReprotect(address & ~(ulong)(_pageSize - 1), (ulong)_pageSize, MemoryPermission.ReadAndWrite, guest);
|
||||
return true; // This memory _should_ be mapped, so we need to try again.
|
||||
}
|
||||
else
|
||||
|
@ -252,6 +318,12 @@ namespace Ryujinx.Memory.Tracking
|
|||
}
|
||||
else
|
||||
{
|
||||
if (guest && _singleByteGuestTracking)
|
||||
{
|
||||
// Increase the access size to trigger handles with misaligned accesses.
|
||||
size += (ulong)_pageSize;
|
||||
}
|
||||
|
||||
for (int i = 0; i < count; i++)
|
||||
{
|
||||
VirtualRegion region = overlaps[i];
|
||||
|
@ -285,9 +357,10 @@ namespace Ryujinx.Memory.Tracking
|
|||
/// </summary>
|
||||
/// <param name="region">Region to reprotect</param>
|
||||
/// <param name="permission">Memory permission to protect with</param>
|
||||
internal void ProtectVirtualRegion(VirtualRegion region, MemoryPermission permission)
|
||||
/// <param name="guest">True if the protection is for guest access, false otherwise</param>
|
||||
internal void ProtectVirtualRegion(VirtualRegion region, MemoryPermission permission, bool guest)
|
||||
{
|
||||
_memoryManager.TrackingReprotect(region.Address, region.Size, permission);
|
||||
_memoryManager.TrackingReprotect(region.Address, region.Size, permission, guest);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
|
|
|
@ -37,7 +37,8 @@ namespace Ryujinx.Memory.Tracking
|
|||
ulong size,
|
||||
IEnumerable<IRegionHandle> handles,
|
||||
ulong granularity,
|
||||
int id)
|
||||
int id,
|
||||
RegionFlags flags)
|
||||
{
|
||||
_handles = new RegionHandle[(size + granularity - 1) / granularity];
|
||||
Granularity = granularity;
|
||||
|
@ -62,7 +63,7 @@ namespace Ryujinx.Memory.Tracking
|
|||
// Fill any gap left before this handle.
|
||||
while (i < startIndex)
|
||||
{
|
||||
RegionHandle fillHandle = tracking.BeginTrackingBitmap(address + (ulong)i * granularity, granularity, _dirtyBitmap, i, id);
|
||||
RegionHandle fillHandle = tracking.BeginTrackingBitmap(address + (ulong)i * granularity, granularity, _dirtyBitmap, i, id, flags);
|
||||
fillHandle.Parent = this;
|
||||
_handles[i++] = fillHandle;
|
||||
}
|
||||
|
@ -83,7 +84,7 @@ namespace Ryujinx.Memory.Tracking
|
|||
|
||||
while (i < endIndex)
|
||||
{
|
||||
RegionHandle splitHandle = tracking.BeginTrackingBitmap(address + (ulong)i * granularity, granularity, _dirtyBitmap, i, id);
|
||||
RegionHandle splitHandle = tracking.BeginTrackingBitmap(address + (ulong)i * granularity, granularity, _dirtyBitmap, i, id, flags);
|
||||
splitHandle.Parent = this;
|
||||
|
||||
splitHandle.Reprotect(handle.Dirty);
|
||||
|
@ -106,7 +107,7 @@ namespace Ryujinx.Memory.Tracking
|
|||
// Fill any remaining space with new handles.
|
||||
while (i < _handles.Length)
|
||||
{
|
||||
RegionHandle handle = tracking.BeginTrackingBitmap(address + (ulong)i * granularity, granularity, _dirtyBitmap, i, id);
|
||||
RegionHandle handle = tracking.BeginTrackingBitmap(address + (ulong)i * granularity, granularity, _dirtyBitmap, i, id, flags);
|
||||
handle.Parent = this;
|
||||
_handles[i++] = handle;
|
||||
}
|
||||
|
|
21
src/Ryujinx.Memory/Tracking/RegionFlags.cs
Normal file
|
@ -0,0 +1,21 @@
|
|||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace Ryujinx.Memory.Tracking
|
||||
{
|
||||
[Flags]
|
||||
public enum RegionFlags
|
||||
{
|
||||
None = 0,
|
||||
|
||||
/// <summary>
|
||||
/// Access to the resource is expected to occasionally be unaligned.
|
||||
/// With some memory managers, guest protection must extend into the previous page to cover unaligned access.
|
||||
/// If this is not expected, protection is not altered, which can avoid unintended resource dirty/flush.
|
||||
/// </summary>
|
||||
UnalignedAccess = 1,
|
||||
}
|
||||
}
|
|
@ -55,6 +55,8 @@ namespace Ryujinx.Memory.Tracking
|
|||
private RegionSignal _preAction; // Action to perform before a read or write. This will block the memory access.
|
||||
private PreciseRegionSignal _preciseAction; // Action to perform on a precise read or write.
|
||||
private readonly List<VirtualRegion> _regions;
|
||||
private readonly List<VirtualRegion> _guestRegions;
|
||||
private readonly List<VirtualRegion> _allRegions;
|
||||
private readonly MemoryTracking _tracking;
|
||||
private bool _disposed;
|
||||
|
||||
|
@ -99,6 +101,7 @@ namespace Ryujinx.Memory.Tracking
|
|||
/// <param name="bitmap">The bitmap the dirty flag for this handle is stored in</param>
|
||||
/// <param name="bit">The bit index representing the dirty flag for this handle</param>
|
||||
/// <param name="id">Handle ID</param>
|
||||
/// <param name="flags">Region flags</param>
|
||||
/// <param name="mapped">True if the region handle starts mapped</param>
|
||||
internal RegionHandle(
|
||||
MemoryTracking tracking,
|
||||
|
@ -109,6 +112,7 @@ namespace Ryujinx.Memory.Tracking
|
|||
ConcurrentBitmap bitmap,
|
||||
int bit,
|
||||
int id,
|
||||
RegionFlags flags,
|
||||
bool mapped = true)
|
||||
{
|
||||
Bitmap = bitmap;
|
||||
|
@ -128,11 +132,12 @@ namespace Ryujinx.Memory.Tracking
|
|||
RealEndAddress = realAddress + realSize;
|
||||
|
||||
_tracking = tracking;
|
||||
_regions = tracking.GetVirtualRegionsForHandle(address, size);
|
||||
foreach (var region in _regions)
|
||||
{
|
||||
region.Handles.Add(this);
|
||||
}
|
||||
|
||||
_regions = tracking.GetVirtualRegionsForHandle(address, size, false);
|
||||
_guestRegions = GetGuestRegions(tracking, address, size, flags);
|
||||
_allRegions = new List<VirtualRegion>(_regions.Count + _guestRegions.Count);
|
||||
|
||||
InitializeRegions();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
|
@ -145,8 +150,9 @@ namespace Ryujinx.Memory.Tracking
|
|||
/// <param name="realAddress">The real, unaligned address of the handle</param>
|
||||
/// <param name="realSize">The real, unaligned size of the handle</param>
|
||||
/// <param name="id">Handle ID</param>
|
||||
/// <param name="flags">Region flags</param>
|
||||
/// <param name="mapped">True if the region handle starts mapped</param>
|
||||
internal RegionHandle(MemoryTracking tracking, ulong address, ulong size, ulong realAddress, ulong realSize, int id, bool mapped = true)
|
||||
internal RegionHandle(MemoryTracking tracking, ulong address, ulong size, ulong realAddress, ulong realSize, int id, RegionFlags flags, bool mapped = true)
|
||||
{
|
||||
Bitmap = new ConcurrentBitmap(1, mapped);
|
||||
|
||||
|
@ -163,8 +169,37 @@ namespace Ryujinx.Memory.Tracking
|
|||
RealEndAddress = realAddress + realSize;
|
||||
|
||||
_tracking = tracking;
|
||||
_regions = tracking.GetVirtualRegionsForHandle(address, size);
|
||||
foreach (var region in _regions)
|
||||
|
||||
_regions = tracking.GetVirtualRegionsForHandle(address, size, false);
|
||||
_guestRegions = GetGuestRegions(tracking, address, size, flags);
|
||||
_allRegions = new List<VirtualRegion>(_regions.Count + _guestRegions.Count);
|
||||
|
||||
InitializeRegions();
|
||||
}
|
||||
|
||||
private List<VirtualRegion> GetGuestRegions(MemoryTracking tracking, ulong address, ulong size, RegionFlags flags)
|
||||
{
|
||||
ulong guestAddress;
|
||||
ulong guestSize;
|
||||
|
||||
if (flags.HasFlag(RegionFlags.UnalignedAccess))
|
||||
{
|
||||
(guestAddress, guestSize) = tracking.GetUnalignedSafeRegion(address, size);
|
||||
}
|
||||
else
|
||||
{
|
||||
(guestAddress, guestSize) = (address, size);
|
||||
}
|
||||
|
||||
return tracking.GetVirtualRegionsForHandle(guestAddress, guestSize, true);
|
||||
}
|
||||
|
||||
private void InitializeRegions()
|
||||
{
|
||||
_allRegions.AddRange(_regions);
|
||||
_allRegions.AddRange(_guestRegions);
|
||||
|
||||
foreach (var region in _allRegions)
|
||||
{
|
||||
region.Handles.Add(this);
|
||||
}
|
||||
|
@ -321,7 +356,7 @@ namespace Ryujinx.Memory.Tracking
|
|||
|
||||
lock (_tracking.TrackingLock)
|
||||
{
|
||||
foreach (VirtualRegion region in _regions)
|
||||
foreach (VirtualRegion region in _allRegions)
|
||||
{
|
||||
protectionChanged |= region.UpdateProtection();
|
||||
}
|
||||
|
@ -379,7 +414,7 @@ namespace Ryujinx.Memory.Tracking
|
|||
{
|
||||
lock (_tracking.TrackingLock)
|
||||
{
|
||||
foreach (VirtualRegion region in _regions)
|
||||
foreach (VirtualRegion region in _allRegions)
|
||||
{
|
||||
region.UpdateProtection();
|
||||
}
|
||||
|
@ -414,7 +449,16 @@ namespace Ryujinx.Memory.Tracking
|
|||
/// <param name="region">Virtual region to add as a child</param>
|
||||
internal void AddChild(VirtualRegion region)
|
||||
{
|
||||
_regions.Add(region);
|
||||
if (region.Guest)
|
||||
{
|
||||
_guestRegions.Add(region);
|
||||
}
|
||||
else
|
||||
{
|
||||
_regions.Add(region);
|
||||
}
|
||||
|
||||
_allRegions.Add(region);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
|
@ -469,7 +513,7 @@ namespace Ryujinx.Memory.Tracking
|
|||
|
||||
lock (_tracking.TrackingLock)
|
||||
{
|
||||
foreach (VirtualRegion region in _regions)
|
||||
foreach (VirtualRegion region in _allRegions)
|
||||
{
|
||||
region.RemoveHandle(this);
|
||||
}
|
||||
|
|
|
@ -13,10 +13,14 @@ namespace Ryujinx.Memory.Tracking
|
|||
private readonly MemoryTracking _tracking;
|
||||
private MemoryPermission _lastPermission;
|
||||
|
||||
public VirtualRegion(MemoryTracking tracking, ulong address, ulong size, MemoryPermission lastPermission = MemoryPermission.Invalid) : base(address, size)
|
||||
public bool Guest { get; }
|
||||
|
||||
public VirtualRegion(MemoryTracking tracking, ulong address, ulong size, bool guest, MemoryPermission lastPermission = MemoryPermission.Invalid) : base(address, size)
|
||||
{
|
||||
_lastPermission = lastPermission;
|
||||
_tracking = tracking;
|
||||
|
||||
Guest = guest;
|
||||
}
|
||||
|
||||
/// <inheritdoc/>
|
||||
|
@ -66,9 +70,12 @@ namespace Ryujinx.Memory.Tracking
|
|||
{
|
||||
_lastPermission = MemoryPermission.Invalid;
|
||||
|
||||
foreach (RegionHandle handle in Handles)
|
||||
if (!Guest)
|
||||
{
|
||||
handle.SignalMappingChanged(mapped);
|
||||
foreach (RegionHandle handle in Handles)
|
||||
{
|
||||
handle.SignalMappingChanged(mapped);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -103,7 +110,7 @@ namespace Ryujinx.Memory.Tracking
|
|||
|
||||
if (_lastPermission != permission)
|
||||
{
|
||||
_tracking.ProtectVirtualRegion(this, permission);
|
||||
_tracking.ProtectVirtualRegion(this, permission, Guest);
|
||||
_lastPermission = permission;
|
||||
|
||||
return true;
|
||||
|
@ -131,7 +138,7 @@ namespace Ryujinx.Memory.Tracking
|
|||
|
||||
public override INonOverlappingRange Split(ulong splitAddress)
|
||||
{
|
||||
VirtualRegion newRegion = new(_tracking, splitAddress, EndAddress - splitAddress, _lastPermission);
|
||||
VirtualRegion newRegion = new(_tracking, splitAddress, EndAddress - splitAddress, Guest, _lastPermission);
|
||||
Size = splitAddress - Address;
|
||||
|
||||
// The new region inherits all of our parents.
|
||||
|
|
|
@ -1,34 +1,171 @@
|
|||
using Ryujinx.Common.Memory;
|
||||
using System;
|
||||
using System.Numerics;
|
||||
using System.Buffers;
|
||||
using System.Runtime.CompilerServices;
|
||||
using System.Runtime.InteropServices;
|
||||
|
||||
namespace Ryujinx.Memory
|
||||
{
|
||||
public abstract class VirtualMemoryManagerBase<TVirtual, TPhysical>
|
||||
where TVirtual : IBinaryInteger<TVirtual>
|
||||
where TPhysical : IBinaryInteger<TPhysical>
|
||||
public abstract class VirtualMemoryManagerBase : IWritableBlock
|
||||
{
|
||||
public const int PageBits = 12;
|
||||
public const int PageSize = 1 << PageBits;
|
||||
public const int PageMask = PageSize - 1;
|
||||
|
||||
protected abstract TVirtual AddressSpaceSize { get; }
|
||||
protected abstract ulong AddressSpaceSize { get; }
|
||||
|
||||
public virtual void Read(TVirtual va, Span<byte> data)
|
||||
public virtual ReadOnlySequence<byte> GetReadOnlySequence(ulong va, int size, bool tracked = false)
|
||||
{
|
||||
if (size == 0)
|
||||
{
|
||||
return ReadOnlySequence<byte>.Empty;
|
||||
}
|
||||
|
||||
if (tracked)
|
||||
{
|
||||
SignalMemoryTracking(va, (ulong)size, false);
|
||||
}
|
||||
|
||||
if (IsContiguousAndMapped(va, size))
|
||||
{
|
||||
nuint pa = TranslateVirtualAddressUnchecked(va);
|
||||
|
||||
return new ReadOnlySequence<byte>(GetPhysicalAddressMemory(pa, size));
|
||||
}
|
||||
else
|
||||
{
|
||||
AssertValidAddressAndSize(va, size);
|
||||
|
||||
int offset = 0, segmentSize;
|
||||
|
||||
BytesReadOnlySequenceSegment first = null, last = null;
|
||||
|
||||
if ((va & PageMask) != 0)
|
||||
{
|
||||
nuint pa = TranslateVirtualAddressChecked(va);
|
||||
|
||||
segmentSize = Math.Min(size, PageSize - (int)(va & PageMask));
|
||||
|
||||
Memory<byte> memory = GetPhysicalAddressMemory(pa, segmentSize);
|
||||
|
||||
first = last = new BytesReadOnlySequenceSegment(memory);
|
||||
|
||||
offset += segmentSize;
|
||||
}
|
||||
|
||||
for (; offset < size; offset += segmentSize)
|
||||
{
|
||||
nuint pa = TranslateVirtualAddressChecked(va + (ulong)offset);
|
||||
|
||||
segmentSize = Math.Min(size - offset, PageSize);
|
||||
|
||||
Memory<byte> memory = GetPhysicalAddressMemory(pa, segmentSize);
|
||||
|
||||
if (first is null)
|
||||
{
|
||||
first = last = new BytesReadOnlySequenceSegment(memory);
|
||||
}
|
||||
else
|
||||
{
|
||||
if (last.IsContiguousWith(memory, out nuint contiguousStart, out int contiguousSize))
|
||||
{
|
||||
last.Replace(GetPhysicalAddressMemory(contiguousStart, contiguousSize));
|
||||
}
|
||||
else
|
||||
{
|
||||
last = last.Append(memory);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return new ReadOnlySequence<byte>(first, 0, last, (int)(size - last.RunningIndex));
|
||||
}
|
||||
}
|
||||
|
||||
public virtual ReadOnlySpan<byte> GetSpan(ulong va, int size, bool tracked = false)
|
||||
{
|
||||
if (size == 0)
|
||||
{
|
||||
return ReadOnlySpan<byte>.Empty;
|
||||
}
|
||||
|
||||
if (tracked)
|
||||
{
|
||||
SignalMemoryTracking(va, (ulong)size, false);
|
||||
}
|
||||
|
||||
if (IsContiguousAndMapped(va, size))
|
||||
{
|
||||
nuint pa = TranslateVirtualAddressUnchecked(va);
|
||||
|
||||
return GetPhysicalAddressSpan(pa, size);
|
||||
}
|
||||
else
|
||||
{
|
||||
Span<byte> data = new byte[size];
|
||||
|
||||
Read(va, data);
|
||||
|
||||
return data;
|
||||
}
|
||||
}
|
||||
|
||||
public virtual WritableRegion GetWritableRegion(ulong va, int size, bool tracked = false)
|
||||
{
|
||||
if (size == 0)
|
||||
{
|
||||
return new WritableRegion(null, va, Memory<byte>.Empty);
|
||||
}
|
||||
|
||||
if (tracked)
|
||||
{
|
||||
SignalMemoryTracking(va, (ulong)size, true);
|
||||
}
|
||||
|
||||
if (IsContiguousAndMapped(va, size))
|
||||
{
|
||||
nuint pa = TranslateVirtualAddressUnchecked(va);
|
||||
|
||||
return new WritableRegion(null, va, GetPhysicalAddressMemory(pa, size));
|
||||
}
|
||||
else
|
||||
{
|
||||
IMemoryOwner<byte> memoryOwner = ByteMemoryPool.Rent(size);
|
||||
|
||||
Read(va, memoryOwner.Memory.Span);
|
||||
|
||||
return new WritableRegion(this, va, memoryOwner);
|
||||
}
|
||||
}
|
||||
|
||||
public abstract bool IsMapped(ulong va);
|
||||
|
||||
public virtual void MapForeign(ulong va, nuint hostPointer, ulong size)
|
||||
{
|
||||
throw new NotSupportedException();
|
||||
}
|
||||
|
||||
public virtual T Read<T>(ulong va) where T : unmanaged
|
||||
{
|
||||
return MemoryMarshal.Cast<byte, T>(GetSpan(va, Unsafe.SizeOf<T>()))[0];
|
||||
}
|
||||
|
||||
public virtual void Read(ulong va, Span<byte> data)
|
||||
{
|
||||
if (data.Length == 0)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
AssertValidAddressAndSize(va, TVirtual.CreateChecked(data.Length));
|
||||
AssertValidAddressAndSize(va, data.Length);
|
||||
|
||||
int offset = 0, size;
|
||||
|
||||
if ((int.CreateTruncating(va) & PageMask) != 0)
|
||||
if ((va & PageMask) != 0)
|
||||
{
|
||||
TPhysical pa = TranslateVirtualAddressForRead(va);
|
||||
nuint pa = TranslateVirtualAddressChecked(va);
|
||||
|
||||
size = Math.Min(data.Length, PageSize - ((int.CreateTruncating(va) & PageMask)));
|
||||
size = Math.Min(data.Length, PageSize - (int)(va & PageMask));
|
||||
|
||||
GetPhysicalAddressSpan(pa, size).CopyTo(data[..size]);
|
||||
|
||||
|
@ -37,7 +174,7 @@ namespace Ryujinx.Memory
|
|||
|
||||
for (; offset < data.Length; offset += size)
|
||||
{
|
||||
TPhysical pa = TranslateVirtualAddressForRead(va + TVirtual.CreateChecked(offset));
|
||||
nuint pa = TranslateVirtualAddressChecked(va + (ulong)offset);
|
||||
|
||||
size = Math.Min(data.Length - offset, PageSize);
|
||||
|
||||
|
@ -45,13 +182,84 @@ namespace Ryujinx.Memory
|
|||
}
|
||||
}
|
||||
|
||||
public virtual T ReadTracked<T>(ulong va) where T : unmanaged
|
||||
{
|
||||
SignalMemoryTracking(va, (ulong)Unsafe.SizeOf<T>(), false);
|
||||
|
||||
return Read<T>(va);
|
||||
}
|
||||
|
||||
public virtual void SignalMemoryTracking(ulong va, ulong size, bool write, bool precise = false, int? exemptId = null)
|
||||
{
|
||||
// No default implementation
|
||||
}
|
||||
|
||||
public virtual void Write(ulong va, ReadOnlySpan<byte> data)
|
||||
{
|
||||
if (data.Length == 0)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
SignalMemoryTracking(va, (ulong)data.Length, true);
|
||||
|
||||
WriteImpl(va, data);
|
||||
}
|
||||
|
||||
public virtual void Write<T>(ulong va, T value) where T : unmanaged
|
||||
{
|
||||
Write(va, MemoryMarshal.Cast<T, byte>(MemoryMarshal.CreateSpan(ref value, 1)));
|
||||
}
|
||||
|
||||
public virtual void WriteUntracked(ulong va, ReadOnlySpan<byte> data)
|
||||
{
|
||||
if (data.Length == 0)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
WriteImpl(va, data);
|
||||
}
|
||||
|
||||
public virtual bool WriteWithRedundancyCheck(ulong va, ReadOnlySpan<byte> data)
|
||||
{
|
||||
if (data.Length == 0)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
if (IsContiguousAndMapped(va, data.Length))
|
||||
{
|
||||
SignalMemoryTracking(va, (ulong)data.Length, false);
|
||||
|
||||
nuint pa = TranslateVirtualAddressChecked(va);
|
||||
|
||||
var target = GetPhysicalAddressSpan(pa, data.Length);
|
||||
|
||||
bool changed = !data.SequenceEqual(target);
|
||||
|
||||
if (changed)
|
||||
{
|
||||
data.CopyTo(target);
|
||||
}
|
||||
|
||||
return changed;
|
||||
}
|
||||
else
|
||||
{
|
||||
Write(va, data);
|
||||
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Ensures the combination of virtual address and size is part of the addressable space.
|
||||
/// </summary>
|
||||
/// <param name="va">Virtual address of the range</param>
|
||||
/// <param name="size">Size of the range in bytes</param>
|
||||
/// <exception cref="InvalidMemoryRegionException">Throw when the memory region specified outside the addressable space</exception>
|
||||
protected void AssertValidAddressAndSize(TVirtual va, TVirtual size)
|
||||
protected void AssertValidAddressAndSize(ulong va, ulong size)
|
||||
{
|
||||
if (!ValidateAddressAndSize(va, size))
|
||||
{
|
||||
|
@ -59,16 +267,82 @@ namespace Ryujinx.Memory
|
|||
}
|
||||
}
|
||||
|
||||
protected abstract Span<byte> GetPhysicalAddressSpan(TPhysical pa, int size);
|
||||
/// <summary>
|
||||
/// Ensures the combination of virtual address and size is part of the addressable space.
|
||||
/// </summary>
|
||||
/// <param name="va">Virtual address of the range</param>
|
||||
/// <param name="size">Size of the range in bytes</param>
|
||||
/// <exception cref="InvalidMemoryRegionException">Throw when the memory region specified outside the addressable space</exception>
|
||||
[MethodImpl(MethodImplOptions.AggressiveInlining)]
|
||||
protected void AssertValidAddressAndSize(ulong va, int size)
|
||||
=> AssertValidAddressAndSize(va, (ulong)size);
|
||||
|
||||
protected abstract TPhysical TranslateVirtualAddressForRead(TVirtual va);
|
||||
/// <summary>
|
||||
/// Computes the number of pages in a virtual address range.
|
||||
/// </summary>
|
||||
/// <param name="va">Virtual address of the range</param>
|
||||
/// <param name="size">Size of the range</param>
|
||||
/// <param name="startVa">The virtual address of the beginning of the first page</param>
|
||||
/// <remarks>This function does not differentiate between allocated and unallocated pages.</remarks>
|
||||
[MethodImpl(MethodImplOptions.AggressiveInlining)]
|
||||
protected static int GetPagesCount(ulong va, ulong size, out ulong startVa)
|
||||
{
|
||||
// WARNING: Always check if ulong does not overflow during the operations.
|
||||
startVa = va & ~(ulong)PageMask;
|
||||
ulong vaSpan = (va - startVa + size + PageMask) & ~(ulong)PageMask;
|
||||
|
||||
return (int)(vaSpan / PageSize);
|
||||
}
|
||||
|
||||
protected abstract Memory<byte> GetPhysicalAddressMemory(nuint pa, int size);
|
||||
|
||||
protected abstract Span<byte> GetPhysicalAddressSpan(nuint pa, int size);
|
||||
|
||||
[MethodImpl(MethodImplOptions.AggressiveInlining)]
|
||||
protected bool IsContiguous(ulong va, int size) => IsContiguous(va, (ulong)size);
|
||||
|
||||
protected virtual bool IsContiguous(ulong va, ulong size)
|
||||
{
|
||||
if (!ValidateAddress(va) || !ValidateAddressAndSize(va, size))
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
int pages = GetPagesCount(va, size, out va);
|
||||
|
||||
for (int page = 0; page < pages - 1; page++)
|
||||
{
|
||||
if (!ValidateAddress(va + PageSize))
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
if (TranslateVirtualAddressUnchecked(va) + PageSize != TranslateVirtualAddressUnchecked(va + PageSize))
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
va += PageSize;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
[MethodImpl(MethodImplOptions.AggressiveInlining)]
|
||||
protected bool IsContiguousAndMapped(ulong va, int size)
|
||||
=> IsContiguous(va, size) && IsMapped(va);
|
||||
|
||||
protected abstract nuint TranslateVirtualAddressChecked(ulong va);
|
||||
|
||||
protected abstract nuint TranslateVirtualAddressUnchecked(ulong va);
|
||||
|
||||
/// <summary>
|
||||
/// Checks if the virtual address is part of the addressable space.
|
||||
/// </summary>
|
||||
/// <param name="va">Virtual address</param>
|
||||
/// <returns>True if the virtual address is part of the addressable space</returns>
|
||||
protected bool ValidateAddress(TVirtual va)
|
||||
[MethodImpl(MethodImplOptions.AggressiveInlining)]
|
||||
protected bool ValidateAddress(ulong va)
|
||||
{
|
||||
return va < AddressSpaceSize;
|
||||
}
|
||||
|
@ -79,13 +353,53 @@ namespace Ryujinx.Memory
|
|||
/// <param name="va">Virtual address of the range</param>
|
||||
/// <param name="size">Size of the range in bytes</param>
|
||||
/// <returns>True if the combination of virtual address and size is part of the addressable space</returns>
|
||||
protected bool ValidateAddressAndSize(TVirtual va, TVirtual size)
|
||||
protected bool ValidateAddressAndSize(ulong va, ulong size)
|
||||
{
|
||||
TVirtual endVa = va + size;
|
||||
ulong endVa = va + size;
|
||||
return endVa >= va && endVa >= size && endVa <= AddressSpaceSize;
|
||||
}
|
||||
|
||||
protected static void ThrowInvalidMemoryRegionException(string message)
|
||||
=> throw new InvalidMemoryRegionException(message);
|
||||
|
||||
protected static void ThrowMemoryNotContiguous()
|
||||
=> throw new MemoryNotContiguousException();
|
||||
|
||||
protected virtual void WriteImpl(ulong va, ReadOnlySpan<byte> data)
|
||||
{
|
||||
AssertValidAddressAndSize(va, data.Length);
|
||||
|
||||
if (IsContiguousAndMapped(va, data.Length))
|
||||
{
|
||||
nuint pa = TranslateVirtualAddressUnchecked(va);
|
||||
|
||||
data.CopyTo(GetPhysicalAddressSpan(pa, data.Length));
|
||||
}
|
||||
else
|
||||
{
|
||||
int offset = 0, size;
|
||||
|
||||
if ((va & PageMask) != 0)
|
||||
{
|
||||
nuint pa = TranslateVirtualAddressChecked(va);
|
||||
|
||||
size = Math.Min(data.Length, PageSize - (int)(va & PageMask));
|
||||
|
||||
data[..size].CopyTo(GetPhysicalAddressSpan(pa, size));
|
||||
|
||||
offset += size;
|
||||
}
|
||||
|
||||
for (; offset < data.Length; offset += size)
|
||||
{
|
||||
nuint pa = TranslateVirtualAddressChecked(va + (ulong)offset);
|
||||
|
||||
size = Math.Min(data.Length - offset, PageSize);
|
||||
|
||||
data.Slice(offset, size).CopyTo(GetPhysicalAddressSpan(pa, size));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,4 +1,5 @@
|
|||
using System;
|
||||
using System.Buffers;
|
||||
|
||||
namespace Ryujinx.Memory
|
||||
{
|
||||
|
@ -6,6 +7,7 @@ namespace Ryujinx.Memory
|
|||
{
|
||||
private readonly IWritableBlock _block;
|
||||
private readonly ulong _va;
|
||||
private readonly IMemoryOwner<byte> _memoryOwner;
|
||||
private readonly bool _tracked;
|
||||
|
||||
private bool NeedsWriteback => _block != null;
|
||||
|
@ -20,6 +22,12 @@ namespace Ryujinx.Memory
|
|||
Memory = memory;
|
||||
}
|
||||
|
||||
public WritableRegion(IWritableBlock block, ulong va, IMemoryOwner<byte> memoryOwner, bool tracked = false)
|
||||
: this(block, va, memoryOwner.Memory, tracked)
|
||||
{
|
||||
_memoryOwner = memoryOwner;
|
||||
}
|
||||
|
||||
public void Dispose()
|
||||
{
|
||||
if (NeedsWriteback)
|
||||
|
@ -33,6 +41,8 @@ namespace Ryujinx.Memory
|
|||
_block.WriteUntracked(_va, Memory.Span);
|
||||
}
|
||||
}
|
||||
|
||||
_memoryOwner?.Dispose();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,6 +1,7 @@
|
|||
using Ryujinx.Memory;
|
||||
using Ryujinx.Memory.Range;
|
||||
using System;
|
||||
using System.Buffers;
|
||||
using System.Collections.Generic;
|
||||
|
||||
namespace Ryujinx.Tests.Memory
|
||||
|
@ -57,6 +58,11 @@ namespace Ryujinx.Tests.Memory
|
|||
throw new NotImplementedException();
|
||||
}
|
||||
|
||||
public ReadOnlySequence<byte> GetReadOnlySequence(ulong va, int size, bool tracked = false)
|
||||
{
|
||||
throw new NotImplementedException();
|
||||
}
|
||||
|
||||
public ReadOnlySpan<byte> GetSpan(ulong va, int size, bool tracked = false)
|
||||
{
|
||||
throw new NotImplementedException();
|
||||
|
@ -107,7 +113,7 @@ namespace Ryujinx.Tests.Memory
|
|||
throw new NotImplementedException();
|
||||
}
|
||||
|
||||
public void TrackingReprotect(ulong va, ulong size, MemoryPermission protection)
|
||||
public void TrackingReprotect(ulong va, ulong size, MemoryPermission protection, bool guest)
|
||||
{
|
||||
OnProtect?.Invoke(va, size, protection);
|
||||
}
|
||||
|
|
|
@ -7,7 +7,7 @@ namespace Ryujinx.UI.Common
|
|||
public static class DiscordIntegrationModule
|
||||
{
|
||||
private const string Description = "A simple, experimental Nintendo Switch emulator.";
|
||||
private const string CliendId = "568815339807309834";
|
||||
private const string ApplicationId = "1216775165866807456";
|
||||
|
||||
private static DiscordRpcClient _discordClient;
|
||||
private static RichPresence _discordPresenceMain;
|
||||
|
@ -24,14 +24,14 @@ namespace Ryujinx.UI.Common
|
|||
Details = "Main Menu",
|
||||
State = "Idling",
|
||||
Timestamps = Timestamps.Now,
|
||||
Buttons = new[]
|
||||
{
|
||||
Buttons =
|
||||
[
|
||||
new Button
|
||||
{
|
||||
Label = "Website",
|
||||
Url = "https://ryujinx.org/",
|
||||
Url = "https://ryujinx.org/",
|
||||
},
|
||||
},
|
||||
],
|
||||
};
|
||||
|
||||
ConfigurationState.Instance.EnableDiscordIntegration.Event += Update;
|
||||
|
@ -52,7 +52,7 @@ namespace Ryujinx.UI.Common
|
|||
// If we need to activate it and the client isn't active, initialize it
|
||||
if (evnt.NewValue && _discordClient == null)
|
||||
{
|
||||
_discordClient = new DiscordRpcClient(CliendId);
|
||||
_discordClient = new DiscordRpcClient(ApplicationId);
|
||||
|
||||
_discordClient.Initialize();
|
||||
_discordClient.SetPresence(_discordPresenceMain);
|
||||
|
@ -74,14 +74,14 @@ namespace Ryujinx.UI.Common
|
|||
Details = $"Playing {titleName}",
|
||||
State = (titleId == "0000000000000000") ? "Homebrew" : titleId.ToUpper(),
|
||||
Timestamps = Timestamps.Now,
|
||||
Buttons = new[]
|
||||
{
|
||||
Buttons =
|
||||
[
|
||||
new Button
|
||||
{
|
||||
Label = "Website",
|
||||
Url = "https://ryujinx.org/",
|
||||
},
|
||||
},
|
||||
],
|
||||
});
|
||||
}
|
||||
|
||||
|
|
BIN
src/Ryujinx.UI.Common/Resources/Icon_Blank.png
Normal file
After Width: | Height: | Size: 16 KiB |
Before Width: | Height: | Size: 10 KiB After Width: | Height: | Size: 18 KiB |
Before Width: | Height: | Size: 10 KiB After Width: | Height: | Size: 18 KiB |
Before Width: | Height: | Size: 10 KiB After Width: | Height: | Size: 18 KiB |
Before Width: | Height: | Size: 9.7 KiB After Width: | Height: | Size: 18 KiB |
Before Width: | Height: | Size: 9.6 KiB After Width: | Height: | Size: 18 KiB |
|
@ -420,6 +420,12 @@ namespace Ryujinx.Ava
|
|||
Device.Configuration.MultiplayerMode = e.NewValue;
|
||||
}
|
||||
|
||||
public void ToggleVSync()
|
||||
{
|
||||
Device.EnableDeviceVsync = !Device.EnableDeviceVsync;
|
||||
_renderer.Window.ChangeVSyncMode(Device.EnableDeviceVsync);
|
||||
}
|
||||
|
||||
public void Stop()
|
||||
{
|
||||
_isActive = false;
|
||||
|
@ -779,31 +785,31 @@ namespace Ryujinx.Ava
|
|||
var memoryConfiguration = ConfigurationState.Instance.System.ExpandRam.Value ? MemoryConfiguration.MemoryConfiguration6GiB : MemoryConfiguration.MemoryConfiguration4GiB;
|
||||
|
||||
HLEConfiguration configuration = new(VirtualFileSystem,
|
||||
_viewModel.LibHacHorizonManager,
|
||||
ContentManager,
|
||||
_accountManager,
|
||||
_userChannelPersistence,
|
||||
renderer,
|
||||
InitializeAudio(),
|
||||
memoryConfiguration,
|
||||
_viewModel.UiHandler,
|
||||
(SystemLanguage)ConfigurationState.Instance.System.Language.Value,
|
||||
(RegionCode)ConfigurationState.Instance.System.Region.Value,
|
||||
ConfigurationState.Instance.Graphics.EnableVsync,
|
||||
ConfigurationState.Instance.System.EnableDockedMode,
|
||||
ConfigurationState.Instance.System.EnablePtc,
|
||||
ConfigurationState.Instance.System.EnableInternetAccess,
|
||||
ConfigurationState.Instance.System.EnableFsIntegrityChecks ? IntegrityCheckLevel.ErrorOnInvalid : IntegrityCheckLevel.None,
|
||||
ConfigurationState.Instance.System.FsGlobalAccessLogMode,
|
||||
ConfigurationState.Instance.System.SystemTimeOffset,
|
||||
ConfigurationState.Instance.System.TimeZone,
|
||||
ConfigurationState.Instance.System.MemoryManagerMode,
|
||||
ConfigurationState.Instance.System.IgnoreMissingServices,
|
||||
ConfigurationState.Instance.Graphics.AspectRatio,
|
||||
ConfigurationState.Instance.System.AudioVolume,
|
||||
ConfigurationState.Instance.System.UseHypervisor,
|
||||
ConfigurationState.Instance.Multiplayer.LanInterfaceId.Value,
|
||||
ConfigurationState.Instance.Multiplayer.Mode);
|
||||
_viewModel.LibHacHorizonManager,
|
||||
ContentManager,
|
||||
_accountManager,
|
||||
_userChannelPersistence,
|
||||
renderer,
|
||||
InitializeAudio(),
|
||||
memoryConfiguration,
|
||||
_viewModel.UiHandler,
|
||||
(SystemLanguage)ConfigurationState.Instance.System.Language.Value,
|
||||
(RegionCode)ConfigurationState.Instance.System.Region.Value,
|
||||
ConfigurationState.Instance.Graphics.EnableVsync,
|
||||
ConfigurationState.Instance.System.EnableDockedMode,
|
||||
ConfigurationState.Instance.System.EnablePtc,
|
||||
ConfigurationState.Instance.System.EnableInternetAccess,
|
||||
ConfigurationState.Instance.System.EnableFsIntegrityChecks ? IntegrityCheckLevel.ErrorOnInvalid : IntegrityCheckLevel.None,
|
||||
ConfigurationState.Instance.System.FsGlobalAccessLogMode,
|
||||
ConfigurationState.Instance.System.SystemTimeOffset,
|
||||
ConfigurationState.Instance.System.TimeZone,
|
||||
ConfigurationState.Instance.System.MemoryManagerMode,
|
||||
ConfigurationState.Instance.System.IgnoreMissingServices,
|
||||
ConfigurationState.Instance.Graphics.AspectRatio,
|
||||
ConfigurationState.Instance.System.AudioVolume,
|
||||
ConfigurationState.Instance.System.UseHypervisor,
|
||||
ConfigurationState.Instance.Multiplayer.LanInterfaceId.Value,
|
||||
ConfigurationState.Instance.Multiplayer.Mode);
|
||||
|
||||
Device = new Switch(configuration);
|
||||
}
|
||||
|
@ -1084,8 +1090,7 @@ namespace Ryujinx.Ava
|
|||
switch (currentHotkeyState)
|
||||
{
|
||||
case KeyboardHotkeyState.ToggleVSync:
|
||||
Device.EnableDeviceVsync = !Device.EnableDeviceVsync;
|
||||
|
||||
ToggleVSync();
|
||||
break;
|
||||
case KeyboardHotkeyState.Screenshot:
|
||||
ScreenshotRequested = true;
|
||||
|
|
673
src/Ryujinx/Assets/Locales/ar_SA.json
Normal file
|
@ -0,0 +1,673 @@
|
|||
{
|
||||
"Language": "العربية",
|
||||
"MenuBarFileOpenApplet": "فتح التطبيق المُصغَّر",
|
||||
"MenuBarFileOpenAppletOpenMiiAppletToolTip": "افتح تطبيق محرر الـMii المُصغَّر في الوضع المستقل",
|
||||
"SettingsTabInputDirectMouseAccess": "الوصول المباشر للفأرة",
|
||||
"SettingsTabSystemMemoryManagerMode": "وضع إدارة الذاكرة:",
|
||||
"SettingsTabSystemMemoryManagerModeSoftware": "البرنامج",
|
||||
"SettingsTabSystemMemoryManagerModeHost": "المُضيف (سريع)",
|
||||
"SettingsTabSystemMemoryManagerModeHostUnchecked": "المضيف غير محدد (سريع، غير آمن)",
|
||||
"SettingsTabSystemUseHypervisor": "استخدم الهايبرڤايزور",
|
||||
"MenuBarFile": "_ملف",
|
||||
"MenuBarFileOpenFromFile": "_تحميل تطبيق من ملف",
|
||||
"MenuBarFileOpenUnpacked": "تحميل لعبه غير محزومه",
|
||||
"MenuBarFileOpenEmuFolder": "فتح مجلد Ryujinx",
|
||||
"MenuBarFileOpenLogsFolder": "فتح مجلد السجلات",
|
||||
"MenuBarFileExit": "_خروج",
|
||||
"MenuBarOptions": "_خيارات",
|
||||
"MenuBarOptionsToggleFullscreen": "وضع ملء الشاشة",
|
||||
"MenuBarOptionsStartGamesInFullscreen": "ابدأ الألعاب في وضع ملء الشاشة",
|
||||
"MenuBarOptionsStopEmulation": "إيقاف المحاكاة",
|
||||
"MenuBarOptionsSettings": "الإعدادات",
|
||||
"MenuBarOptionsManageUserProfiles": "إدارة الملفات الشخصية للمستخدم",
|
||||
"MenuBarActions": "الإجراءات",
|
||||
"MenuBarOptionsSimulateWakeUpMessage": "محاكاة رسالة الاستيقاظ",
|
||||
"MenuBarActionsScanAmiibo": "فحص Amiibo",
|
||||
"MenuBarTools": "الأدوات",
|
||||
"MenuBarToolsInstallFirmware": "تثبيت البرامج الثابتة",
|
||||
"MenuBarFileToolsInstallFirmwareFromFile": "تثبيت البرنامج الثابت من XCI أو ZIP",
|
||||
"MenuBarFileToolsInstallFirmwareFromDirectory": "تثبيت برنامج ثابت من مجلد",
|
||||
"MenuBarToolsManageFileTypes": "إدارة أنواع الملفات",
|
||||
"MenuBarToolsInstallFileTypes": "تثبيت أنواع الملفات",
|
||||
"MenuBarToolsUninstallFileTypes": "إزالة أنواع الملفات",
|
||||
"MenuBarHelp": "_مساعدة",
|
||||
"MenuBarHelpCheckForUpdates": "تحقق من التحديثات",
|
||||
"MenuBarHelpAbout": "عن البرنامج",
|
||||
"MenuSearch": "بحث...",
|
||||
"GameListHeaderFavorite": "مفضلة",
|
||||
"GameListHeaderIcon": "الأيقونة",
|
||||
"GameListHeaderApplication": "الاسم",
|
||||
"GameListHeaderDeveloper": "المطور",
|
||||
"GameListHeaderVersion": "الإصدار",
|
||||
"GameListHeaderTimePlayed": "وقت اللعب",
|
||||
"GameListHeaderLastPlayed": "اخر تشغيل",
|
||||
"GameListHeaderFileExtension": "امتداد الملف",
|
||||
"GameListHeaderFileSize": "حجم الملف",
|
||||
"GameListHeaderPath": "المسار",
|
||||
"GameListContextMenuOpenUserSaveDirectory": "فتح مجلد حفظ المستخدم",
|
||||
"GameListContextMenuOpenUserSaveDirectoryToolTip": "يفتح المجلد الذي يحتوي على حفظ المستخدم للتطبيق",
|
||||
"GameListContextMenuOpenDeviceSaveDirectory": "فتح مجلد حفظ الجهاز",
|
||||
"GameListContextMenuOpenDeviceSaveDirectoryToolTip": "يفتح المجلد الذي يحتوي على حفظ الجهاز للتطبيق",
|
||||
"GameListContextMenuOpenBcatSaveDirectory": "فتح مجلد حفظ الـBCAT",
|
||||
"GameListContextMenuOpenBcatSaveDirectoryToolTip": "يفتح المجلد الذي يحتوي على حفظ الـBCAT للتطبيق",
|
||||
"GameListContextMenuManageTitleUpdates": "إدارة تحديثات العنوان",
|
||||
"GameListContextMenuManageTitleUpdatesToolTip": "يفتح نافذة إدارة تحديث العنوان",
|
||||
"GameListContextMenuManageDlc": "إدارة المحتوي الإضافي",
|
||||
"GameListContextMenuManageDlcToolTip": "يفتح نافذة إدارة المحتوي الإضافي",
|
||||
"GameListContextMenuCacheManagement": "إدارة ذاكرة التخزين المؤقت",
|
||||
"GameListContextMenuCacheManagementPurgePptc": "إعادة بناء PPTC في قائمة الانتظار",
|
||||
"GameListContextMenuCacheManagementPurgePptcToolTip": "تنشيط PPTC لإعادة البناء في وقت التمهيد عند بدء تشغيل اللعبة التالية",
|
||||
"GameListContextMenuCacheManagementPurgeShaderCache": "إزالة ذاكرة التشغيل المؤقتة للمظللات ",
|
||||
"GameListContextMenuCacheManagementPurgeShaderCacheToolTip": "حذف الذاكرة المؤقتة للمظللات الخاصة بالتطبيق",
|
||||
"GameListContextMenuCacheManagementOpenPptcDirectory": "فتح مجلد PPTC",
|
||||
"GameListContextMenuCacheManagementOpenPptcDirectoryToolTip": "يفتح المجلد الذي يحتوي على الـPPTC للتطبيق",
|
||||
"GameListContextMenuCacheManagementOpenShaderCacheDirectory": "فتح مجلد الذاكرة المؤقتة للمظللات ",
|
||||
"GameListContextMenuCacheManagementOpenShaderCacheDirectoryToolTip": "يفتح المجلد الذي يحتوي على ذاكرة التشغيل المؤقتة للمظللات الخاصة بالتطبيق",
|
||||
"GameListContextMenuExtractData": "إستخراج البيانات",
|
||||
"GameListContextMenuExtractDataExeFS": "ExeFS",
|
||||
"GameListContextMenuExtractDataExeFSToolTip": "إستخراج قسم ExeFS من التكوين الحالي للتطبيقات (بما في ذلك التحديثات)",
|
||||
"GameListContextMenuExtractDataRomFS": "RomFS",
|
||||
"GameListContextMenuExtractDataRomFSToolTip": "استخراج قسم RomFS من التكوين الحالي للتطبيقات (بما في ذلك التحديثات)",
|
||||
"GameListContextMenuExtractDataLogo": "شعار",
|
||||
"GameListContextMenuExtractDataLogoToolTip": "استخراج قسم الشعار من التكوين الحالي للتطبيقات (بما في ذلك التحديثات)",
|
||||
"GameListContextMenuCreateShortcut": "إنشاء اختصار للتطبيق",
|
||||
"GameListContextMenuCreateShortcutToolTip": "قم بإنشاء اختصار لسطح المكتب لتشغيل التطبيق المحدد",
|
||||
"GameListContextMenuCreateShortcutToolTipMacOS": "قم بإنشاء اختصار في مجلد تطبيقات نظام التشغيل MacOS الذي يقوم بتشغيل التطبيق المحدد",
|
||||
"GameListContextMenuOpenModsDirectory": "فتح مجلد التعديلات",
|
||||
"GameListContextMenuOpenModsDirectoryToolTip": "يفتح المجلد الذي يحتوي على تعديلات التطبيق",
|
||||
"GameListContextMenuOpenSdModsDirectory": "فتح مجلد تعديلات Atmosphere",
|
||||
"GameListContextMenuOpenSdModsDirectoryToolTip": "يفتح دليل Atmosphere لبطاقة SD البديلة الذي يحتوي على تعديلات التطبيق. مفيد للتعديلات التي تم تعبئتها للأجهزة الحقيقية.",
|
||||
"StatusBarGamesLoaded": "{0}/{1} الألعاب التي تم تحميلها",
|
||||
"StatusBarSystemVersion": "إصدار النظام: {0}",
|
||||
"LinuxVmMaxMapCountDialogTitle": "الحد الأدنى لتعيينات الذاكرة المكتشفة",
|
||||
"LinuxVmMaxMapCountDialogTextPrimary": "هل ترغب في زيادة قيمة vm.max_map_count إلى {0}",
|
||||
"LinuxVmMaxMapCountDialogTextSecondary": "قد تحاول بعض الألعاب إنشاء المزيد من تعيينات الذاكرة أكثر مما هو مسموح به حاليا. سيتحطم Ryujinx بمجرد تجاوز هذا الحد.",
|
||||
"LinuxVmMaxMapCountDialogButtonUntilRestart": "نعم، حتى إعادة التشغيل التالية",
|
||||
"LinuxVmMaxMapCountDialogButtonPersistent": "نعم، بشكل دائم",
|
||||
"LinuxVmMaxMapCountWarningTextPrimary": "الحد الأقصى لمقدار تعيينات الذاكرة أقل من الموصى به.",
|
||||
"LinuxVmMaxMapCountWarningTextSecondary": "القيمة الحالية لـ vm.max_map_count ({0}) أقل من {1}. قد تحاول بعض الألعاب إنشاء المزيد من تعيينات الذاكرة أكثر مما هو مسموح به حاليا. سيتحطم Ryujinx بمجرد تجاوز هذا الحد.\n\nقد ترغب في زيادة الحد اليدوي أو تثبيت pkexec، مما يسمح لـ Ryujinx بالمساعدة في ذلك.",
|
||||
"Settings": "إعدادات",
|
||||
"SettingsTabGeneral": "واجهة المستخدم",
|
||||
"SettingsTabGeneralGeneral": "العامة",
|
||||
"SettingsTabGeneralEnableDiscordRichPresence": "تمكين وجود ديسكورد الغني",
|
||||
"SettingsTabGeneralCheckUpdatesOnLaunch": "التحقق من وجود تحديثات عند التشغيل",
|
||||
"SettingsTabGeneralShowConfirmExitDialog": "إظهار مربع حوار \"تأكيد الخروج\"",
|
||||
"SettingsTabGeneralHideCursor": "إخفاء المؤشر:",
|
||||
"SettingsTabGeneralHideCursorNever": "مطلقاً",
|
||||
"SettingsTabGeneralHideCursorOnIdle": "عند الخمول",
|
||||
"SettingsTabGeneralHideCursorAlways": "دائماً",
|
||||
"SettingsTabGeneralGameDirectories": "مجلدات الألعاب",
|
||||
"SettingsTabGeneralAdd": "إضافة",
|
||||
"SettingsTabGeneralRemove": "إزالة",
|
||||
"SettingsTabSystem": "النظام",
|
||||
"SettingsTabSystemCore": "النواة",
|
||||
"SettingsTabSystemSystemRegion": "منطقة النظام:",
|
||||
"SettingsTabSystemSystemRegionJapan": "اليابان",
|
||||
"SettingsTabSystemSystemRegionUSA": "الولايات المتحدة الأمريكية",
|
||||
"SettingsTabSystemSystemRegionEurope": "أوروبا",
|
||||
"SettingsTabSystemSystemRegionAustralia": "أستراليا",
|
||||
"SettingsTabSystemSystemRegionChina": "الصين",
|
||||
"SettingsTabSystemSystemRegionKorea": "كوريا",
|
||||
"SettingsTabSystemSystemRegionTaiwan": "تايوان",
|
||||
"SettingsTabSystemSystemLanguage": "لغة النظام:",
|
||||
"SettingsTabSystemSystemLanguageJapanese": "اليابانية",
|
||||
"SettingsTabSystemSystemLanguageAmericanEnglish": "الإنجليزية الأمريكية",
|
||||
"SettingsTabSystemSystemLanguageFrench": "الفرنسية",
|
||||
"SettingsTabSystemSystemLanguageGerman": "الألمانية",
|
||||
"SettingsTabSystemSystemLanguageItalian": "الإيطالية",
|
||||
"SettingsTabSystemSystemLanguageSpanish": "الإسبانية",
|
||||
"SettingsTabSystemSystemLanguageChinese": "الصينية",
|
||||
"SettingsTabSystemSystemLanguageKorean": "الكورية",
|
||||
"SettingsTabSystemSystemLanguageDutch": "الهولندية",
|
||||
"SettingsTabSystemSystemLanguagePortuguese": "البرتغالية",
|
||||
"SettingsTabSystemSystemLanguageRussian": "الروسية",
|
||||
"SettingsTabSystemSystemLanguageTaiwanese": "التايوانية",
|
||||
"SettingsTabSystemSystemLanguageBritishEnglish": "الإنجليزية البريطانية",
|
||||
"SettingsTabSystemSystemLanguageCanadianFrench": "الفرنسية الكندية",
|
||||
"SettingsTabSystemSystemLanguageLatinAmericanSpanish": "إسبانية أمريكا اللاتينية",
|
||||
"SettingsTabSystemSystemLanguageSimplifiedChinese": "الصينية المبسطة",
|
||||
"SettingsTabSystemSystemLanguageTraditionalChinese": "الصينية التقليدية",
|
||||
"SettingsTabSystemSystemTimeZone": "نظام التوقيت للنظام:",
|
||||
"SettingsTabSystemSystemTime": "توقيت النظام:",
|
||||
"SettingsTabSystemEnableVsync": "VSync",
|
||||
"SettingsTabSystemEnablePptc": "PPTC (Profiled Persistent Translation Cache)",
|
||||
"SettingsTabSystemEnableFsIntegrityChecks": "FS Integrity Checks",
|
||||
"SettingsTabSystemAudioBackend": "خلفية الصوت:",
|
||||
"SettingsTabSystemAudioBackendDummy": "زائف",
|
||||
"SettingsTabSystemAudioBackendOpenAL": "OpenAL",
|
||||
"SettingsTabSystemAudioBackendSoundIO": "SoundIO",
|
||||
"SettingsTabSystemAudioBackendSDL2": "SDL2",
|
||||
"SettingsTabSystemHacks": "الاختراقات",
|
||||
"SettingsTabSystemHacksNote": "قد يتسبب في عدم الاستقرار",
|
||||
"SettingsTabSystemExpandDramSize": "استخدام تخطيط الذاكرة البديل (المطورين)",
|
||||
"SettingsTabSystemIgnoreMissingServices": "تجاهل الخدمات المفقودة",
|
||||
"SettingsTabGraphics": "الرسومات",
|
||||
"SettingsTabGraphicsAPI": "الرسومات API",
|
||||
"SettingsTabGraphicsEnableShaderCache": "تفعيل ذاكرة المظللات المؤقتة",
|
||||
"SettingsTabGraphicsAnisotropicFiltering": "تصفية متباين الخواص:",
|
||||
"SettingsTabGraphicsAnisotropicFilteringAuto": "تلقائي",
|
||||
"SettingsTabGraphicsAnisotropicFiltering2x": "2x",
|
||||
"SettingsTabGraphicsAnisotropicFiltering4x": "4×",
|
||||
"SettingsTabGraphicsAnisotropicFiltering8x": "8x",
|
||||
"SettingsTabGraphicsAnisotropicFiltering16x": "16x",
|
||||
"SettingsTabGraphicsResolutionScale": "مقياس الدقة",
|
||||
"SettingsTabGraphicsResolutionScaleCustom": "مخصص (لا ينصح به)",
|
||||
"SettingsTabGraphicsResolutionScaleNative": "الأصل (720p/1080p)",
|
||||
"SettingsTabGraphicsResolutionScale2x": "2x (1440p/2160p)",
|
||||
"SettingsTabGraphicsResolutionScale3x": "3x (2160p/3240p)",
|
||||
"SettingsTabGraphicsResolutionScale4x": "4x (2880p/4320p) (لا ينصح به)",
|
||||
"SettingsTabGraphicsAspectRatio": "نسبة الارتفاع إلى العرض:",
|
||||
"SettingsTabGraphicsAspectRatio4x3": "4:3",
|
||||
"SettingsTabGraphicsAspectRatio16x9": "16:9",
|
||||
"SettingsTabGraphicsAspectRatio16x10": "16:10",
|
||||
"SettingsTabGraphicsAspectRatio21x9": "21:9",
|
||||
"SettingsTabGraphicsAspectRatio32x9": "32:9",
|
||||
"SettingsTabGraphicsAspectRatioStretch": "تمدد لتلائم حجم النافذة",
|
||||
"SettingsTabGraphicsDeveloperOptions": "خيارات المطور",
|
||||
"SettingsTabGraphicsShaderDumpPath": "مسار تفريغ الرسومات:",
|
||||
"SettingsTabLogging": "التسجيل",
|
||||
"SettingsTabLoggingLogging": "التسجيل",
|
||||
"SettingsTabLoggingEnableLoggingToFile": "تفعيل التسجيل إلى ملف",
|
||||
"SettingsTabLoggingEnableStubLogs": "تفعيل سجلات الـStub",
|
||||
"SettingsTabLoggingEnableInfoLogs": "تفعيل سجلات المعلومات",
|
||||
"SettingsTabLoggingEnableWarningLogs": "تفعيل سجلات التحذير",
|
||||
"SettingsTabLoggingEnableErrorLogs": "تفعيل سجلات الأخطاء",
|
||||
"SettingsTabLoggingEnableTraceLogs": "تفعيل سجلات التتبع",
|
||||
"SettingsTabLoggingEnableGuestLogs": "تفعيل سجلات الضيوف",
|
||||
"SettingsTabLoggingEnableFsAccessLogs": "تمكين سجلات الوصول لـ Fs",
|
||||
"SettingsTabLoggingFsGlobalAccessLogMode": "وضع سجل وصول عالمي Fs :",
|
||||
"SettingsTabLoggingDeveloperOptions": "خيارات المطور",
|
||||
"SettingsTabLoggingDeveloperOptionsNote": "تحذير: سوف يقلل من الأداء",
|
||||
"SettingsTabLoggingGraphicsBackendLogLevel": "مستوى سجل خلفية الرسومات:",
|
||||
"SettingsTabLoggingGraphicsBackendLogLevelNone": "لا شيء",
|
||||
"SettingsTabLoggingGraphicsBackendLogLevelError": "خطأ",
|
||||
"SettingsTabLoggingGraphicsBackendLogLevelPerformance": "تباطؤ",
|
||||
"SettingsTabLoggingGraphicsBackendLogLevelAll": "الكل",
|
||||
"SettingsTabLoggingEnableDebugLogs": "تمكين سجلات التصحيح",
|
||||
"SettingsTabInput": "الإدخال",
|
||||
"SettingsTabInputEnableDockedMode": "مركب بالمنصة",
|
||||
"SettingsTabInputDirectKeyboardAccess": "الوصول المباشر إلى لوحة المفاتيح",
|
||||
"SettingsButtonSave": "حفظ",
|
||||
"SettingsButtonClose": "إغلاق",
|
||||
"SettingsButtonOk": "موافق",
|
||||
"SettingsButtonCancel": "إلغاء",
|
||||
"SettingsButtonApply": "تطبيق",
|
||||
"ControllerSettingsPlayer": "اللاعب",
|
||||
"ControllerSettingsPlayer1": "اللاعب ١",
|
||||
"ControllerSettingsPlayer2": "اللاعب 2",
|
||||
"ControllerSettingsPlayer3": "اللاعب 3",
|
||||
"ControllerSettingsPlayer4": "اللاعب 4",
|
||||
"ControllerSettingsPlayer5": "اللاعب 5",
|
||||
"ControllerSettingsPlayer6": "اللاعب 6",
|
||||
"ControllerSettingsPlayer7": "اللاعب 7",
|
||||
"ControllerSettingsPlayer8": "اللاعب 8",
|
||||
"ControllerSettingsHandheld": "محمول",
|
||||
"ControllerSettingsInputDevice": "جهاز الإدخال",
|
||||
"ControllerSettingsRefresh": "تحديث",
|
||||
"ControllerSettingsDeviceDisabled": "معطل",
|
||||
"ControllerSettingsControllerType": "نوع ذراع التحكم",
|
||||
"ControllerSettingsControllerTypeHandheld": "محمول",
|
||||
"ControllerSettingsControllerTypeProController": "Pro Controller",
|
||||
"ControllerSettingsControllerTypeJoyConPair": "اقتران جوي كون",
|
||||
"ControllerSettingsControllerTypeJoyConLeft": "يسار جوي كون",
|
||||
"ControllerSettingsControllerTypeJoyConRight": "يمين جوي كون",
|
||||
"ControllerSettingsProfile": "الملف الشخصي",
|
||||
"ControllerSettingsProfileDefault": "افتراضي",
|
||||
"ControllerSettingsLoad": "تحميل",
|
||||
"ControllerSettingsAdd": "إضافة",
|
||||
"ControllerSettingsRemove": "إزالة",
|
||||
"ControllerSettingsButtons": "الأزرار",
|
||||
"ControllerSettingsButtonA": "A",
|
||||
"ControllerSettingsButtonB": "B",
|
||||
"ControllerSettingsButtonX": "X",
|
||||
"ControllerSettingsButtonY": "Y",
|
||||
"ControllerSettingsButtonPlus": "+",
|
||||
"ControllerSettingsButtonMinus": "-",
|
||||
"ControllerSettingsDPad": "لوحة الاتجاه",
|
||||
"ControllerSettingsDPadUp": "اعلى",
|
||||
"ControllerSettingsDPadDown": "أسفل",
|
||||
"ControllerSettingsDPadLeft": "يسار",
|
||||
"ControllerSettingsDPadRight": "يمين",
|
||||
"ControllerSettingsStickButton": "زر",
|
||||
"ControllerSettingsStickUp": "اعلى",
|
||||
"ControllerSettingsStickDown": "أسفل",
|
||||
"ControllerSettingsStickLeft": "يسار",
|
||||
"ControllerSettingsStickRight": "يمين",
|
||||
"ControllerSettingsStickStick": "عصا",
|
||||
"ControllerSettingsStickInvertXAxis": "عكس عرض العصا",
|
||||
"ControllerSettingsStickInvertYAxis": "عكس أفق العصا",
|
||||
"ControllerSettingsStickDeadzone": "المنطقة الميتة:",
|
||||
"ControllerSettingsLStick": "العصا اليسرى",
|
||||
"ControllerSettingsRStick": "العصا اليمنى",
|
||||
"ControllerSettingsTriggersLeft": "المحفزات اليسرى",
|
||||
"ControllerSettingsTriggersRight": "المحفزات اليمني",
|
||||
"ControllerSettingsTriggersButtonsLeft": "أزرار التحفيز اليسرى",
|
||||
"ControllerSettingsTriggersButtonsRight": "أزرار التحفيز اليمنى",
|
||||
"ControllerSettingsTriggers": "المحفزات",
|
||||
"ControllerSettingsTriggerL": "L",
|
||||
"ControllerSettingsTriggerR": "R",
|
||||
"ControllerSettingsTriggerZL": "ZL",
|
||||
"ControllerSettingsTriggerZR": "ZR",
|
||||
"ControllerSettingsLeftSL": "SL",
|
||||
"ControllerSettingsLeftSR": "SR",
|
||||
"ControllerSettingsRightSL": "SL",
|
||||
"ControllerSettingsRightSR": "SR",
|
||||
"ControllerSettingsExtraButtonsLeft": "الأزرار اليسار",
|
||||
"ControllerSettingsExtraButtonsRight": "الأزرار اليمين",
|
||||
"ControllerSettingsMisc": "إعدادات إضافية",
|
||||
"ControllerSettingsTriggerThreshold": "قوة التحفيز:",
|
||||
"ControllerSettingsMotion": "الحركة",
|
||||
"ControllerSettingsMotionUseCemuhookCompatibleMotion": "استخدام الحركة المتوافقة مع CemuHook",
|
||||
"ControllerSettingsMotionControllerSlot": "خانة ذراع التحكم:",
|
||||
"ControllerSettingsMotionMirrorInput": "إعادة الإدخال",
|
||||
"ControllerSettingsMotionRightJoyConSlot": "خانة اليمين JoyCon :",
|
||||
"ControllerSettingsMotionServerHost": "مضيف الخادم:",
|
||||
"ControllerSettingsMotionGyroSensitivity": "حساسية الغيرو:",
|
||||
"ControllerSettingsMotionGyroDeadzone": "منطقة الغيرو الميتة:",
|
||||
"ControllerSettingsSave": "حفظ",
|
||||
"ControllerSettingsClose": "إغلاق",
|
||||
"UserProfilesSelectedUserProfile": "الملف الشخصي المحدد للمستخدم:",
|
||||
"UserProfilesSaveProfileName": "حفظ اسم الملف الشخصي",
|
||||
"UserProfilesChangeProfileImage": "تغيير صورة الملف الشخصي",
|
||||
"UserProfilesAvailableUserProfiles": "الملفات الشخصية للمستخدم المتاحة:",
|
||||
"UserProfilesAddNewProfile": "أنشئ ملف شخصي",
|
||||
"UserProfilesDelete": "حذف",
|
||||
"UserProfilesClose": "إغلاق",
|
||||
"ProfileNameSelectionWatermark": "اختر اسم مستعار",
|
||||
"ProfileImageSelectionTitle": "تحديد صورة الملف الشخصي",
|
||||
"ProfileImageSelectionHeader": "اختر صورة الملف الشخصي",
|
||||
"ProfileImageSelectionNote": "يمكنك استيراد صورة ملف تعريف مخصصة، أو تحديد صورة رمزية من البرامج الثابتة للنظام",
|
||||
"ProfileImageSelectionImportImage": "استيراد ملف الصورة",
|
||||
"ProfileImageSelectionSelectAvatar": "حدد الصورة الرمزية للبرنامج الثابت",
|
||||
"InputDialogTitle": "حوار الإدخال",
|
||||
"InputDialogOk": "موافق",
|
||||
"InputDialogCancel": "إلغاء",
|
||||
"InputDialogAddNewProfileTitle": "اختر اسم الملف الشخصي",
|
||||
"InputDialogAddNewProfileHeader": "الرجاء إدخال اسم الملف الشخصي",
|
||||
"InputDialogAddNewProfileSubtext": "(الطول الأقصى: {0})",
|
||||
"AvatarChoose": "اختر الصورة الرمزية",
|
||||
"AvatarSetBackgroundColor": "تعيين لون الخلفية",
|
||||
"AvatarClose": "إغلاق",
|
||||
"ControllerSettingsLoadProfileToolTip": "تحميل الملف الشخصي",
|
||||
"ControllerSettingsAddProfileToolTip": "إضافة ملف تعريف",
|
||||
"ControllerSettingsRemoveProfileToolTip": "إزالة ملف التعريف",
|
||||
"ControllerSettingsSaveProfileToolTip": "حفظ ملف التعريف",
|
||||
"MenuBarFileToolsTakeScreenshot": "أخذ لقطة للشاشة",
|
||||
"MenuBarFileToolsHideUi": "إخفاء واجهة المستخدم",
|
||||
"GameListContextMenuRunApplication": "تشغيل التطبيق",
|
||||
"GameListContextMenuToggleFavorite": "تبديل المفضلة",
|
||||
"GameListContextMenuToggleFavoriteToolTip": "تبديل الحالة المفضلة للعبة",
|
||||
"SettingsTabGeneralTheme": "السمة:",
|
||||
"SettingsTabGeneralThemeDark": "داكن",
|
||||
"SettingsTabGeneralThemeLight": "فاتح",
|
||||
"ControllerSettingsConfigureGeneral": "ضبط",
|
||||
"ControllerSettingsRumble": "الاهتزاز",
|
||||
"ControllerSettingsRumbleStrongMultiplier": "مضاعف اهتزاز قوي",
|
||||
"ControllerSettingsRumbleWeakMultiplier": "مضاعف اهتزاز ضعيف",
|
||||
"DialogMessageSaveNotAvailableMessage": "لا يوجد حفظ لـ {0} [{1:x16}]",
|
||||
"DialogMessageSaveNotAvailableCreateSaveMessage": "هل ترغب في إنشاء حفظ لهذه اللعبة؟",
|
||||
"DialogConfirmationTitle": "Ryujinx - تأكيد",
|
||||
"DialogUpdaterTitle": "تحديث Ryujinx",
|
||||
"DialogErrorTitle": "Ryujinx - خطأ",
|
||||
"DialogWarningTitle": "Ryujinx - تحذير",
|
||||
"DialogExitTitle": "Ryujinx - الخروج",
|
||||
"DialogErrorMessage": "واجه Ryujinx خطأ",
|
||||
"DialogExitMessage": "هل أنت متأكد من أنك تريد إغلاق Ryujinx؟",
|
||||
"DialogExitSubMessage": "سيتم فقدان كافة البيانات غير المحفوظة!",
|
||||
"DialogMessageCreateSaveErrorMessage": "حدث خطأ أثناء إنشاء المحفوظة المحددة: {0}",
|
||||
"DialogMessageFindSaveErrorMessage": "حدث خطأ أثناء البحث عن البيانات المحفوظة المحددة: {0}",
|
||||
"FolderDialogExtractTitle": "اختر المجلد الذي تريد الاستخراج إليه",
|
||||
"DialogNcaExtractionMessage": "استخراج قسم {0} من {1}...",
|
||||
"DialogNcaExtractionTitle": "Ryujinx - مستخرج قسم NCA",
|
||||
"DialogNcaExtractionMainNcaNotFoundErrorMessage": "فشل الاستخراج. لم يكن NCA الرئيسي موجودًا في الملف المحدد.",
|
||||
"DialogNcaExtractionCheckLogErrorMessage": "فشل الاستخراج. اقرأ ملف السجل لمزيد من المعلومات.",
|
||||
"DialogNcaExtractionSuccessMessage": "تم الاستخراج بنجاح.",
|
||||
"DialogUpdaterConvertFailedMessage": "فشل تحويل إصدار Ryujinx الحالي.",
|
||||
"DialogUpdaterCancelUpdateMessage": "إلغاء التحديث",
|
||||
"DialogUpdaterAlreadyOnLatestVersionMessage": "أنت تستخدم بالفعل أحدث إصدار من Ryujinx!",
|
||||
"DialogUpdaterFailedToGetVersionMessage": "حدث خطأ أثناء محاولة الحصول على معلومات الإصدار من إصدار GitHub. يمكن أن يحدث هذا إذا تم تجميع إصدار جديد بواسطة GitHub Actions. جرب مجددا بعد دقائق.",
|
||||
"DialogUpdaterConvertFailedGithubMessage": "فشل تحويل إصدار Ryujinx المستلم من إصدار Github.",
|
||||
"DialogUpdaterDownloadingMessage": "تحميل التحديث...",
|
||||
"DialogUpdaterExtractionMessage": "استخراج التحديث...",
|
||||
"DialogUpdaterRenamingMessage": "إعادة تسمية التحديث...",
|
||||
"DialogUpdaterAddingFilesMessage": "إضافة تحديث جديد...",
|
||||
"DialogUpdaterCompleteMessage": "اكتمل التحديث",
|
||||
"DialogUpdaterRestartMessage": "هل تريد إعادة تشغيل Ryujinx الآن؟",
|
||||
"DialogUpdaterNoInternetMessage": "أنت غير متصل بالإنترنت.",
|
||||
"DialogUpdaterNoInternetSubMessage": "يرجى التحقق من أن لديك اتصال إنترنت فعال!",
|
||||
"DialogUpdaterDirtyBuildMessage": "لا يمكنك تحديث البناء القذر من Ryujinx!",
|
||||
"DialogUpdaterDirtyBuildSubMessage": "الرجاء تحميل Ryujinx على https://ryujinx.org/ إذا كنت تبحث عن إصدار مدعوم.",
|
||||
"DialogRestartRequiredMessage": "يتطلب إعادة التشغيل",
|
||||
"DialogThemeRestartMessage": "تم حفظ السمة. إعادة التشغيل مطلوبة لتطبيق السمة.",
|
||||
"DialogThemeRestartSubMessage": "هل تريد إعادة التشغيل",
|
||||
"DialogFirmwareInstallEmbeddedMessage": "هل ترغب في تثبيت البرنامج الثابت المدمج في هذه اللعبة؟ (البرنامج الثابت {0})",
|
||||
"DialogFirmwareInstallEmbeddedSuccessMessage": "لم يتم العثور على أي برنامج ثابت مثبت ولكن Ryujinx كان قادراً على تثبيت البرنامج الثابت {0} من اللعبة المقدمة.\nسيبدأ المحاكي الآن.",
|
||||
"DialogFirmwareNoFirmwareInstalledMessage": "لا يوجد برنامج ثابت مثبت",
|
||||
"DialogFirmwareInstalledMessage": "تم تثبيت البرنامج الثابت {0}",
|
||||
"DialogInstallFileTypesSuccessMessage": "تم تثبيت أنواع الملفات بنجاح!",
|
||||
"DialogInstallFileTypesErrorMessage": "فشل تثبيت أنواع الملفات.",
|
||||
"DialogUninstallFileTypesSuccessMessage": "تم إلغاء تثبيت أنواع الملفات بنجاح!",
|
||||
"DialogUninstallFileTypesErrorMessage": "فشل إلغاء تثبيت أنواع الملفات.",
|
||||
"DialogOpenSettingsWindowLabel": "فتح نافذة الإعدادات",
|
||||
"DialogControllerAppletTitle": "برنامج التحكم",
|
||||
"DialogMessageDialogErrorExceptionMessage": "خطأ في عرض مربع حوار الرسالة: {0}",
|
||||
"DialogSoftwareKeyboardErrorExceptionMessage": "خطأ في عرض لوحة مفاتيح البرامج: {0}",
|
||||
"DialogErrorAppletErrorExceptionMessage": "Error displaying ErrorApplet Dialog: {0}",
|
||||
"DialogUserErrorDialogMessage": "{0}: {1}",
|
||||
"DialogUserErrorDialogInfoMessage": "لمزيد من المعلومات حول كيفية إصلاح هذا الخطأ، اتبع دليل الإعداد الخاص بنا.",
|
||||
"DialogUserErrorDialogTitle": "خطأ ريوجينكس ({0})",
|
||||
"DialogAmiiboApiTitle": "أميبو API",
|
||||
"DialogAmiiboApiFailFetchMessage": "حدث خطأ أثناء جلب المعلومات من واجهة برمجة التطبيقات.",
|
||||
"DialogAmiiboApiConnectErrorMessage": "غير قادر على الاتصال بخادم API Amiibo. قد تكون الخدمة متوقفة أو قد تحتاج إلى التحقق من اتصال الإنترنت الخاص بك على الإنترنت.",
|
||||
"DialogProfileInvalidProfileErrorMessage": "الملف الشخصي {0} غير متوافق مع نظام تكوين الإدخال الحالي.",
|
||||
"DialogProfileDefaultProfileOverwriteErrorMessage": "لا يمكن الكتابة فوق الملف الشخصي الافتراضي",
|
||||
"DialogProfileDeleteProfileTitle": "حذف ملف التعريف",
|
||||
"DialogProfileDeleteProfileMessage": "هذا الإجراء لا رجعة فيه، هل أنت متأكد من أنك تريد المتابعة؟",
|
||||
"DialogWarning": "تحذير",
|
||||
"DialogPPTCDeletionMessage": "أنت على وشك الإنتظار لإعادة بناء PTC على التمهيد التالي :\n\n{0}\n\nهل أنت متأكد من أنك تريد المتابعة؟",
|
||||
"DialogPPTCDeletionErrorMessage": "خطأ في إزالة ذاكرة التخزين المؤقت PPTC في {0}: {1}",
|
||||
"DialogShaderDeletionMessage": "أنت على وشك حذف ذاكرة التخزين المؤقت لـ Shader من أجل:\n\n{0}\n\nهل انت متأكد انك تريد المتابعة؟",
|
||||
"DialogShaderDeletionErrorMessage": "Error purging Shader cache at {0}: {1}",
|
||||
"DialogRyujinxErrorMessage": "واجه Ryujinx خطأ",
|
||||
"DialogInvalidTitleIdErrorMessage": "خطأ في واجهة المستخدم: اللعبة المحددة لم يكن لديها معرف عنوان صالح",
|
||||
"DialogFirmwareInstallerFirmwareNotFoundErrorMessage": "لم يتم العثور على فريموير للنظام صالح في {0}.",
|
||||
"DialogFirmwareInstallerFirmwareInstallTitle": "تثبيت البرنامج الثابت {0}",
|
||||
"DialogFirmwareInstallerFirmwareInstallMessage": "سيتم تثبيت إصدار النظام {0}.",
|
||||
"DialogFirmwareInstallerFirmwareInstallSubMessage": "\n\nهذا سيحل محل إصدار النظام الحالي {0}.",
|
||||
"DialogFirmwareInstallerFirmwareInstallConfirmMessage": "\nهل تريد المتابعة؟",
|
||||
"DialogFirmwareInstallerFirmwareInstallWaitMessage": "تثبيت البرنامج الثابت...",
|
||||
"DialogFirmwareInstallerFirmwareInstallSuccessMessage": "تم تثبيت إصدار النظام {0} بنجاح.",
|
||||
"DialogUserProfileDeletionWarningMessage": "لن تكون هناك ملفات تعريف أخرى لفتحها إذا تم حذف الملف الشخصي المحدد",
|
||||
"DialogUserProfileDeletionConfirmMessage": "هل تريد حذف الملف الشخصي المحدد",
|
||||
"DialogUserProfileUnsavedChangesTitle": "تحذير - التغييرات غير المحفوظة",
|
||||
"DialogUserProfileUnsavedChangesMessage": "لقد قمت بإجراء تغييرات على ملف تعريف المستخدم هذا ولم يتم حفظها.",
|
||||
"DialogUserProfileUnsavedChangesSubMessage": "هل تريد تجاهل التغييرات؟",
|
||||
"DialogControllerSettingsModifiedConfirmMessage": "تم تحديث إعدادات وحدة التحكم الحالية.",
|
||||
"DialogControllerSettingsModifiedConfirmSubMessage": "هل تريد الحفظ ؟",
|
||||
"DialogLoadFileErrorMessage": "{0}. ملف خاطئ: {1}",
|
||||
"DialogModAlreadyExistsMessage": "التعديل موجود بالفعل",
|
||||
"DialogModInvalidMessage": "المجلد المحدد لا يحتوي على تعديل!",
|
||||
"DialogModDeleteNoParentMessage": "فشل الحذف: لم يمكن العثور على المجلد الرئيسي للتعديل\"{0}\"!",
|
||||
"DialogDlcNoDlcErrorMessage": "الملف المحدد لا يحتوي على DLC للعنوان المحدد!",
|
||||
"DialogPerformanceCheckLoggingEnabledMessage": "لقد تم تمكين تسجيل التتبع، والذي تم تصميمه ليتم استخدامه من قبل المطورين فقط.",
|
||||
"DialogPerformanceCheckLoggingEnabledConfirmMessage": "للحصول على الأداء الأمثل، يوصى بتعطيل تسجيل التتبع. هل ترغب في تعطيل تسجيل التتبع الآن؟",
|
||||
"DialogPerformanceCheckShaderDumpEnabledMessage": "لقد قمت بتمكين تفريغ التظليل، والذي تم تصميمه ليستخدمه المطورون فقط.",
|
||||
"DialogPerformanceCheckShaderDumpEnabledConfirmMessage": "For optimal performance, it's recommended to disable shader dumping. Would you like to disable shader dumping now?",
|
||||
"DialogLoadAppGameAlreadyLoadedMessage": "تم تحميل لعبة بالفعل",
|
||||
"DialogLoadAppGameAlreadyLoadedSubMessage": "الرجاء إيقاف المحاكاة أو إغلاق المحاكي قبل بدء لعبة أخرى.",
|
||||
"DialogUpdateAddUpdateErrorMessage": "الملف المحدد لا يحتوي على تحديث للملف المحدد!",
|
||||
"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": "أنت على وشك حذف التعديل: {0}\n\nهل انت متأكد انك تريد المتابعة؟",
|
||||
"DialogModManagerDeletionAllWarningMessage": "أنت على وشك حذف كافة التعديلات لهذا العنوان.\n\nهل انت متأكد انك تريد المتابعة؟",
|
||||
"SettingsTabGraphicsFeaturesOptions": "المميزات",
|
||||
"SettingsTabGraphicsBackendMultithreading": "Graphics Backend Multithreading:",
|
||||
"CommonAuto": "تلقائي",
|
||||
"CommonOff": "إيقاف",
|
||||
"CommonOn": "تشغيل",
|
||||
"InputDialogYes": "نعم",
|
||||
"InputDialogNo": "لا",
|
||||
"DialogProfileInvalidProfileNameErrorMessage": "يحتوي اسم الملف على أحرف غير صالحة. يرجى المحاولة مرة أخرى.",
|
||||
"MenuBarOptionsPauseEmulation": "إيقاف مؤقت",
|
||||
"MenuBarOptionsResumeEmulation": "استئناف",
|
||||
"AboutUrlTooltipMessage": "انقر لفتح موقع Ryujinx في متصفحك الافتراضي.",
|
||||
"AboutDisclaimerMessage": "ريوجينكس لا ينتمي إلى نينتندو™،\nأو أي من شركائها بأي شكل من الأشكال.",
|
||||
"AboutAmiiboDisclaimerMessage": "AmiiboAPI (www.amiiboapi.com) يتم \nاستخدامه في محاكاة أمبيو لدينا.",
|
||||
"AboutPatreonUrlTooltipMessage": "انقر لفتح صفحة ريوجينكس في باتريون في متصفحك الافتراضي.",
|
||||
"AboutGithubUrlTooltipMessage": "انقر لفتح صفحة ريوجينكس في غيت هاب في متصفحك الافتراضي.",
|
||||
"AboutDiscordUrlTooltipMessage": "انقر لفتح دعوة إلى خادم ريوجينكس في ديكسورد في متصفحك الافتراضي.",
|
||||
"AboutTwitterUrlTooltipMessage": "انقر لفتح صفحة ريوجينكس في تويتر في متصفحك الافتراضي.",
|
||||
"AboutRyujinxAboutTitle": "حول:",
|
||||
"AboutRyujinxAboutContent": "ريوجينكس هو محاكي لجهاز نينتندو سويتش™.\nمن فضلك ادعمنا على باتريون.\nاحصل على آخر الأخبار على تويتر أو ديسكورد.\nيمكن للمطورين المهتمين بالمساهمة معرفة المزيد على غيت هاب أو ديسكورد.",
|
||||
"AboutRyujinxMaintainersTitle": "تم إصلاحها بواسطة:",
|
||||
"AboutRyujinxMaintainersContentTooltipMessage": "انقر لفتح صفحة المساهمين في متصفحك الافتراضي.",
|
||||
"AboutRyujinxSupprtersTitle": "مدعوم على باتريون بواسطة:",
|
||||
"AmiiboSeriesLabel": "مجموعة أميبو",
|
||||
"AmiiboCharacterLabel": "شخصية",
|
||||
"AmiiboScanButtonLabel": "فحصه",
|
||||
"AmiiboOptionsShowAllLabel": "إظهار كل أميبو",
|
||||
"AmiiboOptionsUsRandomTagLabel": "Hack: Use Random tag Uuid",
|
||||
"DlcManagerTableHeadingEnabledLabel": "مفعل",
|
||||
"DlcManagerTableHeadingTitleIdLabel": "معرف العنوان",
|
||||
"DlcManagerTableHeadingContainerPathLabel": "مسار الحاوية",
|
||||
"DlcManagerTableHeadingFullPathLabel": "المسار كاملاً",
|
||||
"DlcManagerRemoveAllButton": "حذف الكل",
|
||||
"DlcManagerEnableAllButton": "تشغيل الكل",
|
||||
"DlcManagerDisableAllButton": "تعطيل الكل",
|
||||
"ModManagerDeleteAllButton": "حذف الكل",
|
||||
"MenuBarOptionsChangeLanguage": "تغيير اللغة",
|
||||
"MenuBarShowFileTypes": "إظهار أنواع الملفات",
|
||||
"CommonSort": "فرز",
|
||||
"CommonShowNames": "عرض الأسماء",
|
||||
"CommonFavorite": "المفضلة",
|
||||
"OrderAscending": "ترتيب تصاعدي",
|
||||
"OrderDescending": "ترتيب تنازلي",
|
||||
"SettingsTabGraphicsFeatures": "الميزات والتحسينات",
|
||||
"ErrorWindowTitle": "نافذة الخطأ",
|
||||
"ToggleDiscordTooltip": "اختر ما إذا كنت تريد عرض ريوجينكس في نشاط ديسكورد \"يتم تشغيله حاليًا\" أم لا",
|
||||
"AddGameDirBoxTooltip": "أدخل دليل اللعبة لإضافته إلى القائمة",
|
||||
"AddGameDirTooltip": "إضافة دليل اللعبة إلى القائمة",
|
||||
"RemoveGameDirTooltip": "إزالة دليل اللعبة المحدد",
|
||||
"CustomThemeCheckTooltip": "استخدم سمة أفالونيا المخصصة لواجهة المستخدم الرسومية لتغيير مظهر قوائم المحاكي",
|
||||
"CustomThemePathTooltip": "مسار سمة واجهة المستخدم المخصصة",
|
||||
"CustomThemeBrowseTooltip": "تصفح للحصول على سمة واجهة المستخدم المخصصة",
|
||||
"DockModeToggleTooltip": "يجعل وضع الإرساء النظام الذي تمت محاكاته بمثابة جهاز نينتندو سويتش الذي تم إرساءه. يؤدي هذا إلى تحسين الدقة الرسومية في معظم الألعاب. على العكس من ذلك، سيؤدي تعطيل هذا إلى جعل النظام الذي تمت محاكاته يعمل كجهاز نينتندو سويتش محمول، مما يقلل من جودة الرسومات.\n\nقم بتكوين عناصر تحكم اللاعب 1 إذا كنت تخطط لاستخدام وضع الإرساء؛ قم بتكوين عناصر التحكم المحمولة إذا كنت تخطط لاستخدام الوضع المحمول.\n\nاتركه مشغل إذا لم تكن متأكدًا.",
|
||||
"DirectKeyboardTooltip": "دعم الوصول المباشر إلى لوحة المفاتيح (HID). يوفر وصول الألعاب إلى لوحة المفاتيح الخاصة بك كجهاز لإدخال النص.\n\nيعمل فقط مع الألعاب التي تدعم استخدام لوحة المفاتيح في الأصل على أجهزة سويتش.\n\nاتركه معطلا إذا كنت غير متأكد.",
|
||||
"DirectMouseTooltip": "دعم الوصول المباشر إلى لوحة المفاتيح (HID). يوفر وصول الألعاب إلى لوحة المفاتيح الخاصة بك كجهاز لإدخال النص.\n\nيعمل فقط مع الألعاب التي تدعم استخدام لوحة المفاتيح في الأصل على أجهزة سويتش.\n\nاتركه معطلا إذا كنت غير متأكد.",
|
||||
"RegionTooltip": "تغيير منطقة النظام",
|
||||
"LanguageTooltip": "تغيير لغة النظام",
|
||||
"TimezoneTooltip": "تغيير المنطقة الزمنية للنظام",
|
||||
"TimeTooltip": "تغيير وقت النظام",
|
||||
"VSyncToggleTooltip": "Emulated console's Vertical Sync. Essentially a frame-limiter for the majority of games; disabling it may cause games to run at higher speed or make loading screens take longer or get stuck.\n\nCan be toggled in-game with a hotkey of your preference (F1 by default). We recommend doing this if you plan on disabling it.\n\nLeave ON if unsure.",
|
||||
"PptcToggleTooltip": "Saves translated JIT functions so that they do not need to be translated every time the game loads.\n\nReduces stuttering and significantly speeds up boot times after the first boot of a game.\n\nLeave ON if unsure.",
|
||||
"FsIntegrityToggleTooltip": "يتحقق من وجود ملفات تالفة عند تشغيل لعبة ما، وإذا تم اكتشاف ملفات تالفة، فسيتم عرض خطأ تجزئة في السجل.\n\nليس له أي تأثير على الأداء ويهدف إلى المساعدة في استكشاف الأخطاء وإصلاحها.\n\nاتركه مفعلا إذا كنت غير متأكد.",
|
||||
"AudioBackendTooltip": "Changes the backend used to render audio.\n\nSDL2 is the preferred one, while OpenAL and SoundIO are used as fallbacks. Dummy will have no sound.\n\nSet to SDL2 if unsure.",
|
||||
"MemoryManagerTooltip": "Change how guest memory is mapped and accessed. Greatly affects emulated CPU performance.\n\nSet to HOST UNCHECKED if unsure.",
|
||||
"MemoryManagerSoftwareTooltip": "استخدام جدول الصفحات البرمجي لترجمة العناوين. أعلى دقة ولكن أبطأ أداء.",
|
||||
"MemoryManagerHostTooltip": "Directly map memory in the host address space. Much faster JIT compilation and execution.",
|
||||
"MemoryManagerUnsafeTooltip": "Directly map memory, but do not mask the address within the guest address space before access. Faster, but at the cost of safety. The guest application can access memory from anywhere in Ryujinx, so only run programs you trust with this mode.",
|
||||
"UseHypervisorTooltip": "Use Hypervisor instead of JIT. Greatly improves performance when available, but can be unstable in its current state.",
|
||||
"DRamTooltip": "Utilizes an alternative MemoryMode layout to mimic a Switch development model.\n\nThis is only useful for higher-resolution texture packs or 4k resolution mods. Does NOT improve performance.\n\nLeave OFF if unsure.",
|
||||
"IgnoreMissingServicesTooltip": "يتجاهل خدمات نظام هوريزون غير المنفذة. قد يساعد هذا في تجاوز الأعطال عند تشغيل ألعاب معينة.\n\nاتركه معطلا إذا كنت غير متأكد.",
|
||||
"GraphicsBackendThreadingTooltip": "Executes graphics backend commands on a second thread.\n\nSpeeds up shader compilation, reduces stuttering, and improves performance on GPU drivers without multithreading support of their own. Slightly better performance on drivers with multithreading.\n\nSet to AUTO if unsure.",
|
||||
"GalThreadingTooltip": "Executes graphics backend commands on a second thread.\n\nSpeeds up shader compilation, reduces stuttering, and improves performance on GPU drivers without multithreading support of their own. Slightly better performance on drivers with multithreading.\n\nSet to AUTO if unsure.",
|
||||
"ShaderCacheToggleTooltip": "Saves a disk shader cache which reduces stuttering in subsequent runs.\n\nLeave ON if unsure.",
|
||||
"ResolutionScaleTooltip": "يضاعف دقة عرض اللعبة.\n\nقد لا تعمل بعض الألعاب مع هذا وتبدو منقطة حتى عند زيادة الدقة؛ بالنسبة لهذه الألعاب، قد تحتاج إلى العثور على تعديلات تزيل الصقل أو تزيد من دقة العرض الداخلي. لاستخدام الأخير، من المحتمل أن ترغب في تحديد أصلي.\n\nيمكن تغيير هذا الخيار أثناء تشغيل اللعبة بالنقر فوق \"تطبيق\" أدناه؛ يمكنك ببساطة تحريك نافذة الإعدادات جانبًا والتجربة حتى تجد المظهر المفضل للعبة.\n\nضع في اعتبارك أن 4x مبالغة في أي إعداد تقريبًا.",
|
||||
"ResolutionScaleEntryTooltip": "مقياس دقة النقطة العائمة، مثل 1.5. من المرجح أن تتسبب المقاييس غير المتكاملة في حدوث مشكلات أو تعطل.",
|
||||
"AnisotropyTooltip": "مستوى تصفية متباين الخواص. اضبط على تلقائي لاستخدام القيمة التي تطلبها اللعبة.",
|
||||
"AspectRatioTooltip": "يتم تطبيق نسبة العرض إلى الارتفاع على نافذة العارض.\n\nقم بتغيير هذا فقط إذا كنت تستخدم تعديل نسبة العرض إلى الارتفاع للعبتك، وإلا سيتم تمديد الرسومات.\n\nاتركه على 16:9 إذا لم تكن متأكدًا.",
|
||||
"ShaderDumpPathTooltip": "Graphics Shaders Dump Path",
|
||||
"FileLogTooltip": "حفظ تسجيل وحدة التحكم إلى ملف سجل على القرص. لا يؤثر على الأداء.",
|
||||
"StubLogTooltip": "Prints stub log messages in the console. Does not affect performance.",
|
||||
"InfoLogTooltip": "Prints info log messages in the console. Does not affect performance.",
|
||||
"WarnLogTooltip": "طباعة رسائل سجل التحذير في وحدة التحكم. لا يؤثر على الأداء.",
|
||||
"ErrorLogTooltip": "طباعة رسائل سجل الأخطاء في وحدة التحكم. لا يؤثر على الأداء.",
|
||||
"TraceLogTooltip": "طباعة رسائل سجل التتبع في وحدة التحكم. لا يؤثر على الأداء.",
|
||||
"GuestLogTooltip": "طباعة رسائل سجل الضيف في وحدة التحكم. لا يؤثر على الأداء.",
|
||||
"FileAccessLogTooltip": "طباعة رسائل سجل الوصول إلى الملفات في وحدة التحكم.",
|
||||
"FSAccessLogModeTooltip": "Enables FS access log output to the console. Possible modes are 0-3",
|
||||
"DeveloperOptionTooltip": "استخدمه بعناية",
|
||||
"OpenGlLogLevel": "يتطلب تمكين مستويات السجل المناسبة",
|
||||
"DebugLogTooltip": "طباعة رسائل سجل التصحيح في وحدة التحكم.\n\nاستخدم هذا فقط إذا طلب منك أحد الموظفين تحديدًا ذلك، لأنه سيجعل من الصعب قراءة السجلات وسيؤدي إلى تدهور أداء المحاكي.",
|
||||
"LoadApplicationFileTooltip": "افتح مستكشف الملفات لاختيار ملف متوافق مع Switch لتحميله",
|
||||
"LoadApplicationFolderTooltip": "افتح مستكشف الملفات لاختيار تطبيق متوافق مع Switch للتحميل",
|
||||
"OpenRyujinxFolderTooltip": "فتح مجلد نظام ملفات Ryujinx",
|
||||
"OpenRyujinxLogsTooltip": "يفتح المجلد الذي تتم كتابة السجلات إليه",
|
||||
"ExitTooltip": "الخروج من Ryujinx",
|
||||
"OpenSettingsTooltip": "فتح نافذة الإعدادات",
|
||||
"OpenProfileManagerTooltip": "فتح نافذة إدارة ملفات تعريف المستخدمين",
|
||||
"StopEmulationTooltip": "إيقاف محاكاة اللعبة الحالية والعودة إلى اختيار اللعبة",
|
||||
"CheckUpdatesTooltip": "التحقق من وجود تحديثات لـ Ryujinx",
|
||||
"OpenAboutTooltip": "فتح حول النافذة",
|
||||
"GridSize": "حجم الشبكة",
|
||||
"GridSizeTooltip": "تغيير حجم عناصر الشبكة",
|
||||
"SettingsTabSystemSystemLanguageBrazilianPortuguese": "البرتغالية البرازيلية",
|
||||
"AboutRyujinxContributorsButtonHeader": "رؤية جميع المساهمين",
|
||||
"SettingsTabSystemAudioVolume": "الحجم:",
|
||||
"AudioVolumeTooltip": "تغيير مستوى الصوت",
|
||||
"SettingsTabSystemEnableInternetAccess": "الوصول إلى إنترنت كضيف/وضع LAN",
|
||||
"EnableInternetAccessTooltip": "للسماح للتطبيق المحاكي بالاتصال بالإنترنت.\n\nالألعاب ذات وضع الشبكة المحلية يمكن الاتصال ببعضها البعض عندما يتم تمكين هذا النظام وتكون الأنظمة متصلة بنفس نقطة الوصول. هذا يشمل وحدات التحكم الحقيقية أيضًا.\n\nلا يسمح بالاتصال بخوادم Nintendo. قد يسبب الانهيار في بعض الألعاب التي تحاول الاتصال بالإنترنت.\n\nاتركه متوقفا إن لم يكن مؤكدا.",
|
||||
"GameListContextMenuManageCheatToolTip": "إدارة الغش",
|
||||
"GameListContextMenuManageCheat": "إدارة الغش",
|
||||
"GameListContextMenuManageModToolTip": "إدارة التعديلات",
|
||||
"GameListContextMenuManageMod": "إدارة التعديلات",
|
||||
"ControllerSettingsStickRange": "نطاق:",
|
||||
"DialogStopEmulationTitle": "Ryujinx - إيقاف المحاكاة",
|
||||
"DialogStopEmulationMessage": "هل أنت متأكد أنك تريد إيقاف المحاكاة؟",
|
||||
"SettingsTabCpu": "CPU",
|
||||
"SettingsTabAudio": "الصوت",
|
||||
"SettingsTabNetwork": "الشبكة",
|
||||
"SettingsTabNetworkConnection": "اتصال الشبكة",
|
||||
"SettingsTabCpuCache": "ذاكرة المعالج المؤقت",
|
||||
"SettingsTabCpuMemory": "وضع المعالج",
|
||||
"DialogUpdaterFlatpakNotSupportedMessage": "الرجاء تحديث Ryujinx عبر FlatHub.",
|
||||
"UpdaterDisabledWarningTitle": "التحديث معطل!",
|
||||
"ControllerSettingsRotate90": "تدوير 90 درجة في اتجاه عقارب الساعة",
|
||||
"IconSize": "حجم الأيقونة",
|
||||
"IconSizeTooltip": "تغيير حجم أيقونات اللعبة",
|
||||
"MenuBarOptionsShowConsole": "عرض وحدة التحكم",
|
||||
"ShaderCachePurgeError": "Error purging shader cache at {0}: {1}",
|
||||
"UserErrorNoKeys": "المفاتيح غير موجودة",
|
||||
"UserErrorNoFirmware": "لم يتم العثور على البرنامج الثابت",
|
||||
"UserErrorFirmwareParsingFailed": "خطأ في تحليل البرنامج الثابت",
|
||||
"UserErrorApplicationNotFound": "التطبيق غير موجود",
|
||||
"UserErrorUnknown": "خطأ غير معروف",
|
||||
"UserErrorUndefined": "خطأ غير محدد",
|
||||
"UserErrorNoKeysDescription": "لم يتمكن Ryujinx من العثور على ملف 'prod.keys' الخاص بك",
|
||||
"UserErrorNoFirmwareDescription": "لم يتمكن ريوجينكس من العثور على أية برامج ثابتة مثبتة",
|
||||
"UserErrorFirmwareParsingFailedDescription": "لم يتمكن ريوجينكس من تحليل البرامج الثابتة المتوفرة. يحدث هذا عادة بسبب المفاتيح القديمة.",
|
||||
"UserErrorApplicationNotFoundDescription": "تعذر على ريوجينكس العثور على تطبيق صالح في المسار المحدد.",
|
||||
"UserErrorUnknownDescription": "حدث خطأ غير معروف!",
|
||||
"UserErrorUndefinedDescription": "حدث خطأ غير محدد! لا ينبغي أن يحدث هذا، يرجى الاتصال بمطور!",
|
||||
"OpenSetupGuideMessage": "فتح دليل الإعداد",
|
||||
"NoUpdate": "لا يوجد تحديث",
|
||||
"TitleUpdateVersionLabel": "الإصدار: {0}",
|
||||
"RyujinxInfo": "Ryujinx - معلومات",
|
||||
"RyujinxConfirm": "Ryujinx - تأكيد",
|
||||
"FileDialogAllTypes": "كل الأنواع",
|
||||
"Never": "مطلقاً",
|
||||
"SwkbdMinCharacters": "يجب أن يبلغ طوله {0} حرفًا على الأقل",
|
||||
"SwkbdMinRangeCharacters": "يجب أن يتكون من {0}-{1} حرفًا",
|
||||
"SoftwareKeyboard": "لوحة المفاتيح البرمجية",
|
||||
"SoftwareKeyboardModeNumeric": "يجب أن يكون 0-9 أو '.' فقط",
|
||||
"SoftwareKeyboardModeAlphabet": "يجب أن تكون الأحرف غير CJK فقط",
|
||||
"SoftwareKeyboardModeASCII": "يجب أن يكون نص ASCII فقط",
|
||||
"ControllerAppletControllers": "ذراع التحكم المدعومة:",
|
||||
"ControllerAppletPlayers": "اللاعبين:",
|
||||
"ControllerAppletDescription": "الإعدادات الحالية غير صالحة. افتح الإعدادات وأعد تكوين المدخلات الخاصة بك.",
|
||||
"ControllerAppletDocked": "Docked mode set. Handheld control should be disabled.",
|
||||
"UpdaterRenaming": "إعادة تسمية الملفات القديمة...",
|
||||
"UpdaterRenameFailed": "التحديث غير قادر على إعادة تسمية الملف: {0}",
|
||||
"UpdaterAddingFiles": "إضافة ملفات جديدة...",
|
||||
"UpdaterExtracting": "استخراج التحديث...",
|
||||
"UpdaterDownloading": "تحميل التحديث...",
|
||||
"Game": "لعبة",
|
||||
"Docked": "مركب بالمنصة",
|
||||
"Handheld": "محمول",
|
||||
"ConnectionError": "خطأ في الاتصال",
|
||||
"AboutPageDeveloperListMore": "{0} والمزيد...",
|
||||
"ApiError": "خطأ في API.",
|
||||
"LoadingHeading": "جارٍ تحميل {0}",
|
||||
"CompilingPPTC": "تجميع الـ PTC",
|
||||
"CompilingShaders": "تجميع الظلال",
|
||||
"AllKeyboards": "كل لوحات المفاتيح",
|
||||
"OpenFileDialogTitle": "حدد ملف مدعوم لفتحه",
|
||||
"OpenFolderDialogTitle": "حدد مجلدًا يحتوي على لعبة غير مضغوطة",
|
||||
"AllSupportedFormats": "كل التنسيقات المدعومة",
|
||||
"RyujinxUpdater": "تحديث Ryujinx",
|
||||
"SettingsTabHotkeys": "مفاتيح الاختصار في لوحة المفاتيح",
|
||||
"SettingsTabHotkeysHotkeys": "مفاتيح الاختصار في لوحة المفاتيح",
|
||||
"SettingsTabHotkeysToggleVsyncHotkey": "تبديل VSync:",
|
||||
"SettingsTabHotkeysScreenshotHotkey": "لقطة الشاشة:",
|
||||
"SettingsTabHotkeysShowUiHotkey": "عرض واجهة المستخدم:",
|
||||
"SettingsTabHotkeysPauseHotkey": "إيقاف مؤقت:",
|
||||
"SettingsTabHotkeysToggleMuteHotkey": "كتم الصوت:",
|
||||
"ControllerMotionTitle": "إعدادات التحكم بالحركة",
|
||||
"ControllerRumbleTitle": "إعدادات الهزاز",
|
||||
"SettingsSelectThemeFileDialogTitle": "حدد ملف السمة",
|
||||
"SettingsXamlThemeFile": "Xaml Theme File",
|
||||
"AvatarWindowTitle": "إدارة الحسابات - الصورة الرمزية",
|
||||
"Amiibo": "أميبو",
|
||||
"Unknown": "غير معروف",
|
||||
"Usage": "الاستخدام",
|
||||
"Writable": "قابل للكتابة",
|
||||
"SelectDlcDialogTitle": "حدد ملفات DLC",
|
||||
"SelectUpdateDialogTitle": "حدد ملفات التحديث",
|
||||
"SelectModDialogTitle": "حدد مجلد التعديل",
|
||||
"UserProfileWindowTitle": "مدير ملفات تعريف المستخدمين",
|
||||
"CheatWindowTitle": "مدير الغش",
|
||||
"DlcWindowTitle": "إدارة المحتوى القابل للتنزيل لـ {0} ({1})",
|
||||
"UpdateWindowTitle": "مدير تحديث العنوان",
|
||||
"CheatWindowHeading": "الغش متوفر لـ {0} [{1}]",
|
||||
"BuildId": "معرف البناء:",
|
||||
"DlcWindowHeading": "المحتويات القابلة للتنزيل {0}",
|
||||
"ModWindowHeading": "{0} تعديل",
|
||||
"UserProfilesEditProfile": "تعديل المحددة",
|
||||
"Cancel": "إلغاء",
|
||||
"Save": "حفظ",
|
||||
"Discard": "تجاهل",
|
||||
"Paused": "متوقف مؤقتا",
|
||||
"UserProfilesSetProfileImage": "تعيين صورة ملف التعريف",
|
||||
"UserProfileEmptyNameError": "الاسم مطلوب",
|
||||
"UserProfileNoImageError": "يجب تعيين صورة الملف الشخصي",
|
||||
"GameUpdateWindowHeading": "إدارة التحديثات لـ {0} ({1})",
|
||||
"SettingsTabHotkeysResScaleUpHotkey": "زيادة الدقة:",
|
||||
"SettingsTabHotkeysResScaleDownHotkey": "خفض الدقة:",
|
||||
"UserProfilesName": "الاسم:",
|
||||
"UserProfilesUserId": "معرف المستخدم:",
|
||||
"SettingsTabGraphicsBackend": "خلفية الرسومات",
|
||||
"SettingsTabGraphicsBackendTooltip": "Select the graphics backend that will be used in the emulator.\n\nVulkan is overall better for all modern graphics cards, as long as their drivers are up to date. Vulkan also features faster shader compilation (less stuttering) on all GPU vendors.\n\nOpenGL may achieve better results on old Nvidia GPUs, on old AMD GPUs on Linux, or on GPUs with lower VRAM, though shader compilation stutters will be greater.\n\nSet to Vulkan if unsure. Set to OpenGL if your GPU does not support Vulkan even with the latest graphics drivers.",
|
||||
"SettingsEnableTextureRecompression": "تمكين إعادة ضغط التكستر",
|
||||
"SettingsEnableTextureRecompressionTooltip": "Compresses ASTC textures in order to reduce VRAM usage.\n\nGames using this texture format include Astral Chain, Bayonetta 3, Fire Emblem Engage, Metroid Prime Remastered, Super Mario Bros. Wonder and The Legend of Zelda: Tears of the Kingdom.\n\nGraphics cards with 4GiB VRAM or less will likely crash at some point while running these games.\n\nEnable only if you're running out of VRAM on the aforementioned games. Leave OFF if unsure.",
|
||||
"SettingsTabGraphicsPreferredGpu": "GPU المفضل",
|
||||
"SettingsTabGraphicsPreferredGpuTooltip": "Select the graphics card that will be used with the Vulkan graphics backend.\n\nDoes not affect the GPU that OpenGL will use.\n\nSet to the GPU flagged as \"dGPU\" if unsure. If there isn't one, leave untouched.",
|
||||
"SettingsAppRequiredRestartMessage": "مطلوب إعادة تشغيل Ryujinx",
|
||||
"SettingsGpuBackendRestartMessage": "Graphics Backend or GPU settings have been modified. This will require a restart to be applied",
|
||||
"SettingsGpuBackendRestartSubMessage": "\n\nهل تريد إعادة التشغيل الآن؟",
|
||||
"RyujinxUpdaterMessage": "هل تريد تحديث Ryujinx إلى أحدث إصدار؟",
|
||||
"SettingsTabHotkeysVolumeUpHotkey": "زيادة مستوى الصوت:",
|
||||
"SettingsTabHotkeysVolumeDownHotkey": "خفض مستوى الصوت:",
|
||||
"SettingsEnableMacroHLE": "Enable Macro HLE",
|
||||
"SettingsEnableMacroHLETooltip": "High-level emulation of GPU Macro code.\n\nImproves performance, but may cause graphical glitches in some games.\n\nLeave ON if unsure.",
|
||||
"SettingsEnableColorSpacePassthrough": "Color Space Passthrough",
|
||||
"SettingsEnableColorSpacePassthroughTooltip": "Directs the Vulkan backend to pass through color information without specifying a color space. For users with wide gamut displays, this may result in more vibrant colors, at the cost of color correctness.",
|
||||
"VolumeShort": "الحجم",
|
||||
"UserProfilesManageSaves": "إدارة الحفظ",
|
||||
"DeleteUserSave": "هل تريد حذف حفظ المستخدم لهذه اللعبة؟",
|
||||
"IrreversibleActionNote": "هذا الإجراء لا يمكن التراجع عنه.",
|
||||
"SaveManagerHeading": "إدارة الحفظ لـ {0} ({1})",
|
||||
"SaveManagerTitle": "مدير الحفظ",
|
||||
"Name": "الاسم",
|
||||
"Size": "الحجم",
|
||||
"Search": "بحث",
|
||||
"UserProfilesRecoverLostAccounts": "استعادة الحسابات المفقودة",
|
||||
"Recover": "استعادة",
|
||||
"UserProfilesRecoverHeading": "تم العثور على الحفظ للحسابات التالية",
|
||||
"UserProfilesRecoverEmptyList": "لا توجد ملفات تعريف لاستردادها",
|
||||
"GraphicsAATooltip": "Applies anti-aliasing to the game render.\n\nFXAA will blur most of the image, while SMAA will attempt to find jagged edges and smooth them out.\n\nNot recommended to use in conjunction with the FSR scaling filter.\n\nThis option can be changed while a game is running by clicking \"Apply\" below; you can simply move the settings window aside and experiment until you find your preferred look for a game.\n\nLeave on NONE if unsure.",
|
||||
"GraphicsAALabel": "تنعيم الحواف:",
|
||||
"GraphicsScalingFilterLabel": "فلتر التكبير:",
|
||||
"GraphicsScalingFilterTooltip": "Choose the scaling filter that will be applied when using resolution scale.\n\nBilinear works well for 3D games and is a safe default option.\n\nNearest is recommended for pixel art games.\n\nFSR 1.0 is merely a sharpening filter, not recommended for use with FXAA or SMAA.\n\nThis option can be changed while a game is running by clicking \"Apply\" below; you can simply move the settings window aside and experiment until you find your preferred look for a game.\n\nLeave on BILINEAR if unsure.",
|
||||
"GraphicsScalingFilterBilinear": "Bilinear",
|
||||
"GraphicsScalingFilterNearest": "Nearest",
|
||||
"GraphicsScalingFilterFsr": "FSR",
|
||||
"GraphicsScalingFilterLevelLabel": "المستوى",
|
||||
"GraphicsScalingFilterLevelTooltip": "اضبط مستوى وضوح FSR 1.0. الأعلى هو أكثر وضوحا.",
|
||||
"SmaaLow": "SMAA منخفض",
|
||||
"SmaaMedium": "SMAA متوسط",
|
||||
"SmaaHigh": "SMAA عالي",
|
||||
"SmaaUltra": "SMAA فائق",
|
||||
"UserEditorTitle": "تعديل المستخدم",
|
||||
"UserEditorTitleCreate": "إنشاء مستخدم",
|
||||
"SettingsTabNetworkInterface": "واجهة الشبكة:",
|
||||
"NetworkInterfaceTooltip": "The network interface used for LAN/LDN features.\n\nIn conjunction with a VPN or XLink Kai and a game with LAN support, can be used to spoof a same-network connection over the Internet.\n\nLeave on DEFAULT if unsure.",
|
||||
"NetworkInterfaceDefault": "افتراضي",
|
||||
"PackagingShaders": "Packaging Shaders",
|
||||
"AboutChangelogButton": "عرض سجل التغييرات على GitHub",
|
||||
"AboutChangelogButtonTooltipMessage": "انقر لفتح سجل التغيير لهذا الإصدار في متصفحك الافتراضي.",
|
||||
"SettingsTabNetworkMultiplayer": "لعب جماعي",
|
||||
"MultiplayerMode": "النمط:",
|
||||
"MultiplayerModeTooltip": "Change LDN multiplayer mode.\n\nLdnMitm will modify local wireless/local play functionality in games to function as if it were LAN, allowing for local, same-network connections with other Ryujinx instances and hacked Nintendo Switch consoles that have the ldn_mitm module installed.\n\nMultiplayer requires all players to be on the same game version (i.e. Super Smash Bros. Ultimate v13.0.1 can't connect to v13.0.0).\n\nLeave DISABLED if unsure.",
|
||||
"MultiplayerModeDisabled": "معطل",
|
||||
"MultiplayerModeLdnMitm": "ldn_mitm"
|
||||
}
|
|
@ -9,12 +9,12 @@
|
|||
"SettingsTabSystemMemoryManagerModeHostUnchecked": "Host ungeprüft (am schnellsten, unsicher)",
|
||||
"SettingsTabSystemUseHypervisor": "Hypervisor verwenden",
|
||||
"MenuBarFile": "_Datei",
|
||||
"MenuBarFileOpenFromFile": "_Datei öffnen",
|
||||
"MenuBarFileOpenFromFile": "Datei _öffnen",
|
||||
"MenuBarFileOpenUnpacked": "_Entpacktes Spiel öffnen",
|
||||
"MenuBarFileOpenEmuFolder": "Ryujinx-Ordner öffnen",
|
||||
"MenuBarFileOpenLogsFolder": "Logs-Ordner öffnen",
|
||||
"MenuBarFileExit": "_Beenden",
|
||||
"MenuBarOptions": "Optionen",
|
||||
"MenuBarOptions": "_Optionen",
|
||||
"MenuBarOptionsToggleFullscreen": "Vollbild",
|
||||
"MenuBarOptionsStartGamesInFullscreen": "Spiele im Vollbildmodus starten",
|
||||
"MenuBarOptionsStopEmulation": "Emulation beenden",
|
||||
|
@ -23,14 +23,14 @@
|
|||
"MenuBarActions": "_Aktionen",
|
||||
"MenuBarOptionsSimulateWakeUpMessage": "Aufwachnachricht simulieren",
|
||||
"MenuBarActionsScanAmiibo": "Amiibo scannen",
|
||||
"MenuBarTools": "_Werkzeuge",
|
||||
"MenuBarTools": "_Tools",
|
||||
"MenuBarToolsInstallFirmware": "Firmware installieren",
|
||||
"MenuBarFileToolsInstallFirmwareFromFile": "Firmware von einer XCI- oder einer ZIP-Datei installieren",
|
||||
"MenuBarFileToolsInstallFirmwareFromDirectory": "Firmware aus einem Verzeichnis installieren",
|
||||
"MenuBarToolsManageFileTypes": "Dateitypen verwalten",
|
||||
"MenuBarToolsInstallFileTypes": "Dateitypen installieren",
|
||||
"MenuBarToolsUninstallFileTypes": "Dateitypen deinstallieren",
|
||||
"MenuBarHelp": "Hilfe",
|
||||
"MenuBarHelp": "_Hilfe",
|
||||
"MenuBarHelpCheckForUpdates": "Nach Updates suchen",
|
||||
"MenuBarHelpAbout": "Über Ryujinx",
|
||||
"MenuSearch": "Suchen...",
|
||||
|
@ -54,9 +54,7 @@
|
|||
"GameListContextMenuManageTitleUpdatesToolTip": "Öffnet den Spiel-Update-Manager",
|
||||
"GameListContextMenuManageDlc": "Verwalten von DLC",
|
||||
"GameListContextMenuManageDlcToolTip": "Öffnet den DLC-Manager",
|
||||
"GameListContextMenuOpenModsDirectory": "Mod-Verzeichnis öffnen",
|
||||
"GameListContextMenuOpenModsDirectoryToolTip": "Öffnet das Verzeichnis, welches Mods für die Spiele beinhaltet",
|
||||
"GameListContextMenuCacheManagement": "Cache Verwaltung",
|
||||
"GameListContextMenuCacheManagement": "Cache-Verwaltung",
|
||||
"GameListContextMenuCacheManagementPurgePptc": "PPTC als ungültig markieren",
|
||||
"GameListContextMenuCacheManagementPurgePptcToolTip": "Markiert den PPTC als ungültig, sodass dieser beim nächsten Spielstart neu erstellt wird",
|
||||
"GameListContextMenuCacheManagementPurgeShaderCache": "Shader Cache löschen",
|
||||
|
@ -72,6 +70,13 @@
|
|||
"GameListContextMenuExtractDataRomFSToolTip": "Extrahiert das RomFS aus der aktuellen Anwendungskonfiguration (einschließlich Updates)",
|
||||
"GameListContextMenuExtractDataLogo": "Logo",
|
||||
"GameListContextMenuExtractDataLogoToolTip": "Extrahiert das Logo aus der aktuellen Anwendungskonfiguration (einschließlich Updates)",
|
||||
"GameListContextMenuCreateShortcut": "Erstelle Anwendungsverknüpfung",
|
||||
"GameListContextMenuCreateShortcutToolTip": "Erstelle eine Desktop-Verknüpfung die die gewählte Anwendung startet",
|
||||
"GameListContextMenuCreateShortcutToolTipMacOS": "Erstellen Sie eine Verknüpfung im MacOS-Programme-Ordner, die die ausgewählte Anwendung startet",
|
||||
"GameListContextMenuOpenModsDirectory": "Mod-Verzeichnis öffnen",
|
||||
"GameListContextMenuOpenModsDirectoryToolTip": "Öffnet das Verzeichnis, welches Mods für die Spiele beinhaltet",
|
||||
"GameListContextMenuOpenSdModsDirectory": "Atmosphere-Mod-Verzeichnis öffnen",
|
||||
"GameListContextMenuOpenSdModsDirectoryToolTip": "Öffnet das alternative SD-Karten-Atmosphere-Verzeichnis, das die Mods der Anwendung enthält. Dieser Ordner ist nützlich für Mods, die für echte Hardware erstellt worden sind.",
|
||||
"StatusBarGamesLoaded": "{0}/{1} Spiele geladen",
|
||||
"StatusBarSystemVersion": "Systemversion: {0}",
|
||||
"LinuxVmMaxMapCountDialogTitle": "Niedriges Limit für Speicherzuordnungen erkannt",
|
||||
|
@ -150,7 +155,7 @@
|
|||
"SettingsTabGraphicsResolutionScaleNative": "Nativ (720p/1080p)",
|
||||
"SettingsTabGraphicsResolutionScale2x": "2x (1440p/2160p)",
|
||||
"SettingsTabGraphicsResolutionScale3x": "3x (2160p/3240p)",
|
||||
"SettingsTabGraphicsResolutionScale4x": "4x (2880p/4320p)",
|
||||
"SettingsTabGraphicsResolutionScale4x": "4x (2880p/4320p) (Nicht empfohlen)",
|
||||
"SettingsTabGraphicsAspectRatio": "Bildseitenverhältnis:",
|
||||
"SettingsTabGraphicsAspectRatio4x3": "4:3",
|
||||
"SettingsTabGraphicsAspectRatio16x9": "16:9",
|
||||
|
@ -292,13 +297,9 @@
|
|||
"GameListContextMenuRunApplication": "Anwendung ausführen",
|
||||
"GameListContextMenuToggleFavorite": "Als Favoriten hinzufügen/entfernen",
|
||||
"GameListContextMenuToggleFavoriteToolTip": "Aktiviert den Favoriten-Status des Spiels",
|
||||
"SettingsTabGeneralTheme": "Design",
|
||||
"SettingsTabGeneralThemeCustomTheme": "Pfad für das benutzerdefinierte Design",
|
||||
"SettingsTabGeneralThemeBaseStyle": "Farbschema",
|
||||
"SettingsTabGeneralThemeBaseStyleDark": "Dunkel",
|
||||
"SettingsTabGeneralThemeBaseStyleLight": "Hell",
|
||||
"SettingsTabGeneralThemeEnableCustomTheme": "Design für die Emulator-Benutzeroberfläche",
|
||||
"ButtonBrowse": "Durchsuchen",
|
||||
"SettingsTabGeneralTheme": "Design:",
|
||||
"SettingsTabGeneralThemeDark": "Dunkel",
|
||||
"SettingsTabGeneralThemeLight": "Hell",
|
||||
"ControllerSettingsConfigureGeneral": "Konfigurieren",
|
||||
"ControllerSettingsRumble": "Vibration",
|
||||
"ControllerSettingsRumbleStrongMultiplier": "Starker Vibrations-Multiplikator",
|
||||
|
@ -322,7 +323,7 @@
|
|||
"DialogNcaExtractionCheckLogErrorMessage": "Extraktion fehlgeschlagen. Überprüfe die Logs für weitere Informationen.",
|
||||
"DialogNcaExtractionSuccessMessage": "Extraktion erfolgreich abgeschlossen.",
|
||||
"DialogUpdaterConvertFailedMessage": "Die Konvertierung der aktuellen Ryujinx-Version ist fehlgeschlagen.",
|
||||
"DialogUpdaterCancelUpdateMessage": "Download wird abgebrochen!",
|
||||
"DialogUpdaterCancelUpdateMessage": "Update wird abgebrochen!",
|
||||
"DialogUpdaterAlreadyOnLatestVersionMessage": "Es wird bereits die aktuellste Version von Ryujinx benutzt",
|
||||
"DialogUpdaterFailedToGetVersionMessage": "Beim Versuch, Veröffentlichungs-Info von GitHub Release zu erhalten, ist ein Fehler aufgetreten. Dies kann aufgrund einer neuen Veröffentlichung, die gerade von GitHub Actions kompiliert wird, verursacht werden.",
|
||||
"DialogUpdaterConvertFailedGithubMessage": "Fehler beim Konvertieren der erhaltenen Ryujinx-Version von GitHub Release.",
|
||||
|
@ -332,8 +333,6 @@
|
|||
"DialogUpdaterAddingFilesMessage": "Update wird hinzugefügt...",
|
||||
"DialogUpdaterCompleteMessage": "Update abgeschlossen!",
|
||||
"DialogUpdaterRestartMessage": "Ryujinx jetzt neu starten?",
|
||||
"DialogUpdaterArchNotSupportedMessage": "Eine nicht unterstützte Systemarchitektur wird benutzt!",
|
||||
"DialogUpdaterArchNotSupportedSubMessage": "Nur 64-Bit-Systeme werden unterstützt!",
|
||||
"DialogUpdaterNoInternetMessage": "Es besteht keine Verbindung mit dem Internet!",
|
||||
"DialogUpdaterNoInternetSubMessage": "Bitte vergewissern, dass eine funktionierende Internetverbindung existiert!",
|
||||
"DialogUpdaterDirtyBuildMessage": "Inoffizielle Versionen von Ryujinx können nicht aktualisiert werden",
|
||||
|
@ -385,7 +384,10 @@
|
|||
"DialogUserProfileUnsavedChangesSubMessage": "Möchten Sie Ihre Änderungen wirklich verwerfen?",
|
||||
"DialogControllerSettingsModifiedConfirmMessage": "Die aktuellen Controller-Einstellungen wurden aktualisiert.",
|
||||
"DialogControllerSettingsModifiedConfirmSubMessage": "Controller-Einstellungen speichern?",
|
||||
"DialogLoadNcaErrorMessage": "{0}. Fehlerhafte Datei: {1}",
|
||||
"DialogLoadFileErrorMessage": "{0}. Fehlerhafte Datei: {1}",
|
||||
"DialogModAlreadyExistsMessage": "Mod ist bereits vorhanden",
|
||||
"DialogModInvalidMessage": "Das angegebene Verzeichnis enthält keine Mods!",
|
||||
"DialogModDeleteNoParentMessage": "Löschen fehlgeschlagen: Das übergeordnete Verzeichnis für den Mod \"{0}\" konnte nicht gefunden werden!",
|
||||
"DialogDlcNoDlcErrorMessage": "Die angegebene Datei enthält keinen DLC für den ausgewählten Titel!",
|
||||
"DialogPerformanceCheckLoggingEnabledMessage": "Es wurde die Debug Protokollierung aktiviert",
|
||||
"DialogPerformanceCheckLoggingEnabledConfirmMessage": "Um eine optimale Leistung zu erzielen, wird empfohlen, die Debug Protokollierung zu deaktivieren. Debug Protokollierung jetzt deaktivieren?",
|
||||
|
@ -396,6 +398,8 @@
|
|||
"DialogUpdateAddUpdateErrorMessage": "Die angegebene Datei enthält keine Updates für den ausgewählten Titel!",
|
||||
"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?",
|
||||
"DialogModManagerDeletionAllWarningMessage": "Du bist dabei, alle Mods für diesen Titel zu löschen.\n\nMöchtest du wirklich fortfahren?",
|
||||
"SettingsTabGraphicsFeaturesOptions": "Erweiterungen",
|
||||
"SettingsTabGraphicsBackendMultithreading": "Grafik-Backend Multithreading:",
|
||||
"CommonAuto": "Auto",
|
||||
|
@ -418,7 +422,7 @@
|
|||
"AboutRyujinxMaintainersTitle": "Entwickelt von:",
|
||||
"AboutRyujinxMaintainersContentTooltipMessage": "Klicke hier, um die Liste der Mitwirkenden im Standardbrowser zu öffnen.",
|
||||
"AboutRyujinxSupprtersTitle": "Unterstützt auf Patreon von:",
|
||||
"AmiiboSeriesLabel": "Amiibo Serie",
|
||||
"AmiiboSeriesLabel": "Amiibo-Serie",
|
||||
"AmiiboCharacterLabel": "Charakter",
|
||||
"AmiiboScanButtonLabel": "Einscannen",
|
||||
"AmiiboOptionsShowAllLabel": "Zeige alle Amiibos",
|
||||
|
@ -430,6 +434,7 @@
|
|||
"DlcManagerRemoveAllButton": "Entferne alle",
|
||||
"DlcManagerEnableAllButton": "Alle aktivieren",
|
||||
"DlcManagerDisableAllButton": "Alle deaktivieren",
|
||||
"ModManagerDeleteAllButton": "Alle löschen",
|
||||
"MenuBarOptionsChangeLanguage": "Sprache ändern",
|
||||
"MenuBarShowFileTypes": "Dateitypen anzeigen",
|
||||
"CommonSort": "Sortieren",
|
||||
|
@ -447,13 +452,13 @@
|
|||
"CustomThemePathTooltip": "Gibt den Pfad zum Design für die Emulator-Benutzeroberfläche an",
|
||||
"CustomThemeBrowseTooltip": "Ermöglicht die Suche nach einem benutzerdefinierten Design für die Emulator-Benutzeroberfläche",
|
||||
"DockModeToggleTooltip": "Im gedockten Modus verhält sich das emulierte System wie eine Nintendo Switch im TV Modus. Dies verbessert die grafische Qualität der meisten Spiele. Umgekehrt führt die Deaktivierung dazu, dass sich das emulierte System wie eine Nintendo Switch im Handheld Modus verhält, was die Grafikqualität beeinträchtigt.\n\nKonfiguriere das Eingabegerät für Spieler 1, um im Docked Modus zu spielen; konfiguriere das Controllerprofil via der Handheld Option, wenn geplant wird den Handheld Modus zu nutzen.\n\nIm Zweifelsfall AN lassen.",
|
||||
"DirectKeyboardTooltip": "Aktiviert/Deaktiviert den \"Direkter Tastaturzugriff (HID) Unterstützung\" (Ermöglicht die Benutzung der Tastaur als Eingabegerät in Spielen)",
|
||||
"DirectMouseTooltip": "Aktiviert/Deaktiviert den \"Direkten Mauszugriff (HID) Unterstützung\" (Ermöglicht die Benutzung der Maus als Eingabegerät in Spielen)",
|
||||
"DirectKeyboardTooltip": "Direkter Zugriff auf die Tastatur (HID). Bietet Spielen Zugriff auf Ihre Tastatur als Texteingabegerät.\n\nFunktioniert nur mit Spielen, die die Tastaturnutzung auf Switch-Hardware nativ unterstützen.\n\nAus lassen, wenn unsicher.",
|
||||
"DirectMouseTooltip": "Unterstützt den direkten Mauszugriff (HID). Bietet Spielen Zugriff auf Ihre Maus als Zeigegerät.\n\nFunktioniert nur mit Spielen, die nativ die Steuerung mit der Maus auf Switch-Hardware unterstützen (nur sehr wenige).\n\nTouchscreen-Funktionalität ist möglicherweise eingeschränkt, wenn dies aktiviert ist.\n\n Aus lassen, wenn unsicher.",
|
||||
"RegionTooltip": "Ändert die Systemregion",
|
||||
"LanguageTooltip": "Ändert die Systemsprache",
|
||||
"TimezoneTooltip": "Ändert die Systemzeitzone",
|
||||
"TimeTooltip": "Ändert die Systemzeit",
|
||||
"VSyncToggleTooltip": "Vertikale Synchronisierung der emulierten Konsole. Diese Option ist ein Frame-Limiter für die meisten Spiele; die Deaktivierung kann dazu führen, dass Spiele mit höherer Geschwindigkeit laufen, Ladebildschirme länger benötigen oder hängen bleiben.\n\nKann beim Spielen mit einem frei wählbaren Hotkey ein- und ausgeschaltet werden.\n\nIm Zweifelsfall AN lassen.",
|
||||
"VSyncToggleTooltip": "Vertikale Synchronisierung der emulierten Konsole. Diese Option ist quasi ein Frame-Limiter für die meisten Spiele; die Deaktivierung kann dazu führen, dass Spiele mit höherer Geschwindigkeit laufen oder Ladebildschirme länger benötigen/hängen bleiben.\n\nKann beim Spielen mit einem frei wählbaren Hotkey ein- und ausgeschaltet werden (standardmäßig F1). \n\nIm Zweifelsfall AN lassen.",
|
||||
"PptcToggleTooltip": "Speichert übersetzte JIT-Funktionen, sodass jene nicht jedes Mal übersetzt werden müssen, wenn das Spiel geladen wird.\n\nVerringert Stottern und die Zeit beim zweiten und den darauffolgenden Startvorgängen eines Spiels erheblich.\n\nIm Zweifelsfall AN lassen.",
|
||||
"FsIntegrityToggleTooltip": "Prüft beim Startvorgang auf beschädigte Dateien und zeigt bei beschädigten Dateien einen Hash-Fehler (Hash Error) im Log an.\n\nDiese Einstellung hat keinen Einfluss auf die Leistung und hilft bei der Fehlersuche.\n\nIm Zweifelsfall AN lassen.",
|
||||
"AudioBackendTooltip": "Ändert das Backend, das zum Rendern von Audio verwendet wird.\n\nSDL2 ist das bevorzugte Audio-Backend, OpenAL und SoundIO sind als Alternativen vorhanden. Dummy wird keinen Audio-Output haben.\n\nIm Zweifelsfall SDL2 auswählen.",
|
||||
|
@ -467,10 +472,10 @@
|
|||
"GraphicsBackendThreadingTooltip": "Führt Grafik-Backend Befehle auf einem zweiten Thread aus.\n\nDies beschleunigt die Shader-Kompilierung, reduziert Stottern und verbessert die Leistung auf GPU-Treibern ohne eigene Multithreading-Unterstützung. Geringfügig bessere Leistung bei Treibern mit Multithreading.\n\nIm Zweifelsfall auf AUTO stellen.",
|
||||
"GalThreadingTooltip": "Führt Grafik-Backend Befehle auf einem zweiten Thread aus.\n\nDies Beschleunigt die Shader-Kompilierung, reduziert Stottern und verbessert die Leistung auf GPU-Treibern ohne eigene Multithreading-Unterstützung. Geringfügig bessere Leistung bei Treibern mit Multithreading.\n\nIm Zweifelsfall auf auf AUTO stellen.",
|
||||
"ShaderCacheToggleTooltip": "Speichert einen persistenten Shader Cache, der das Stottern bei nachfolgenden Durchläufen reduziert.\n\nIm Zweifelsfall AN lassen.",
|
||||
"ResolutionScaleTooltip": "Wendet die Auflösungsskalierung auf anwendbare Render Ziele",
|
||||
"ResolutionScaleTooltip": "Multipliziert die Rendering-Auflösung des Spiels.\n\nEinige wenige Spiele funktionieren damit nicht und sehen auch bei höherer Auflösung pixelig aus; für diese Spiele müssen Sie möglicherweise Mods finden, die Anti-Aliasing entfernen oder die interne Rendering-Auflösung erhöhen. Für die Verwendung von Letzterem sollten Sie Native wählen.\n\nSie können diese Option ändern, während ein Spiel läuft, indem Sie unten auf \"Übernehmen\" klicken; Sie können das Einstellungsfenster einfach zur Seite schieben und experimentieren, bis Sie Ihr bevorzugtes Aussehen für ein Spiel gefunden haben.\n\nDenken Sie daran, dass 4x für praktisch jedes Setup Overkill ist.",
|
||||
"ResolutionScaleEntryTooltip": "Fließkomma Auflösungsskalierung, wie 1,5.\n Bei nicht ganzzahligen Werten ist die Wahrscheinlichkeit größer, dass Probleme entstehen, die auch zum Absturz führen können.",
|
||||
"AnisotropyTooltip": "Stufe der Anisotropen Filterung (Auf Auto setzen, um den vom Spiel geforderten Wert zu verwenden)",
|
||||
"AspectRatioTooltip": "Auf das Renderer-Fenster angewandtes Seitenverhältnis.",
|
||||
"AnisotropyTooltip": "Stufe der Anisotropen Filterung. Auf Auto setzen, um den vom Spiel geforderten Wert zu verwenden.",
|
||||
"AspectRatioTooltip": "Seitenverhältnis, das auf das Renderer-Fenster angewendet wird.\n\nÄndern Sie dies nur, wenn Sie einen Seitenverhältnis-Mod für Ihr Spiel verwenden, da sonst die Grafik gestreckt wird.\n\nLassen Sie es auf 16:9, wenn Sie unsicher sind.",
|
||||
"ShaderDumpPathTooltip": "Grafik-Shader-Dump-Pfad",
|
||||
"FileLogTooltip": "Speichert die Konsolenausgabe in einer Log-Datei auf der Festplatte. Hat keinen Einfluss auf die Leistung.",
|
||||
"StubLogTooltip": "Ausgabe von Stub-Logs in der Konsole. Hat keinen Einfluss auf die Leistung.",
|
||||
|
@ -504,6 +509,8 @@
|
|||
"EnableInternetAccessTooltip": "Erlaubt es der emulierten Anwendung sich mit dem Internet zu verbinden.\n\nSpiele die den LAN-Modus unterstützen, ermöglichen es Ryujinx sich sowohl mit anderen Ryujinx-Systemen, als auch mit offiziellen Nintendo Switch Konsolen zu verbinden. Allerdings nur, wenn diese Option aktiviert ist und die Systeme mit demselben lokalen Netzwerk verbunden sind.\n\nDies erlaubt KEINE Verbindung zu Nintendo-Servern. Kann bei bestimmten Spielen die versuchen sich mit dem Internet zu verbinden zum Absturz führen.\n\nIm Zweifelsfall AUS lassen",
|
||||
"GameListContextMenuManageCheatToolTip": "Öffnet den Cheat-Manager",
|
||||
"GameListContextMenuManageCheat": "Cheats verwalten",
|
||||
"GameListContextMenuManageModToolTip": "Mods verwalten",
|
||||
"GameListContextMenuManageMod": "Mods verwalten",
|
||||
"ControllerSettingsStickRange": "Bereich:",
|
||||
"DialogStopEmulationTitle": "Ryujinx - Beende Emulation",
|
||||
"DialogStopEmulationMessage": "Emulation wirklich beenden?",
|
||||
|
@ -513,10 +520,8 @@
|
|||
"SettingsTabNetworkConnection": "Netwerkverbindung",
|
||||
"SettingsTabCpuCache": "CPU-Cache",
|
||||
"SettingsTabCpuMemory": "CPU-Speicher",
|
||||
"DialogUpdaterFlatpakNotSupportedMessage": "Bitte aktualisiere Ryujinx mit FlatHub",
|
||||
"DialogUpdaterFlatpakNotSupportedMessage": "Bitte aktualisiere Ryujinx über FlatHub",
|
||||
"UpdaterDisabledWarningTitle": "Updater deaktiviert!",
|
||||
"GameListContextMenuOpenSdModsDirectory": "Atmosphere-Mod-Verzeichnis öffnen",
|
||||
"GameListContextMenuOpenSdModsDirectoryToolTip": "Öffnet das alternative SD-Karten-Atmosphere-Verzeichnis, das die Mods der Anwendung enthält. Dieser Ordner ist nützlich für Mods, die für einen gemoddete Switch erstellt worden sind.",
|
||||
"ControllerSettingsRotate90": "Um 90° rotieren",
|
||||
"IconSize": "Cover Größe",
|
||||
"IconSizeTooltip": "Ändert die Größe der Spiel-Cover",
|
||||
|
@ -544,12 +549,13 @@
|
|||
"SwkbdMinCharacters": "Muss mindestens {0} Zeichen lang sein",
|
||||
"SwkbdMinRangeCharacters": "Muss {0}-{1} Zeichen lang sein",
|
||||
"SoftwareKeyboard": "Software-Tastatur",
|
||||
"SoftwareKeyboardModeNumbersOnly": "Nur Zahlen",
|
||||
"SoftwareKeyboardModeNumeric": "Darf nur 0-9 oder \".\" sein",
|
||||
"SoftwareKeyboardModeAlphabet": "Keine CJK-Zeichen",
|
||||
"SoftwareKeyboardModeASCII": "Nur ASCII-Text",
|
||||
"DialogControllerAppletMessagePlayerRange": "Die Anwendung benötigt {0} Spieler mit:\n\nTYPEN: {1}\n\nSPIELER: {2}\n\n{3}Bitte öffne die Einstellungen und rekonfiguriere die Controller Einstellungen oder drücke auf schließen.",
|
||||
"DialogControllerAppletMessage": "Die Anwendung benötigt genau {0} Speieler mit:\n\nTYPEN: {1}\n\nSPIELER: {2}\n\n{3}Bitte öffne die Einstellungen und rekonfiguriere die Controller Einstellungen oder drücke auf schließen.",
|
||||
"DialogControllerAppletDockModeSet": "Der 'Docked Modus' ist ausgewählt. Handheld ist ebenfalls ungültig.\n\n",
|
||||
"ControllerAppletControllers": "Unterstützte Controller:",
|
||||
"ControllerAppletPlayers": "Spieler:",
|
||||
"ControllerAppletDescription": "Ihre aktuelle Konfiguration ist ungültig. Öffnen Sie die Einstellungen und konfigurieren Sie Ihre Eingaben neu.",
|
||||
"ControllerAppletDocked": "Andockmodus gesetzt. Handheld-Steuerung sollte deaktiviert worden sein.",
|
||||
"UpdaterRenaming": "Alte Dateien umbenennen...",
|
||||
"UpdaterRenameFailed": "Der Updater konnte die folgende Datei nicht umbenennen: {0}",
|
||||
"UpdaterAddingFiles": "Neue Dateien hinzufügen...",
|
||||
|
@ -569,8 +575,8 @@
|
|||
"OpenFolderDialogTitle": "Wähle einen Ordner mit einem entpackten Spiel",
|
||||
"AllSupportedFormats": "Alle unterstützten Formate",
|
||||
"RyujinxUpdater": "Ryujinx - Updater",
|
||||
"SettingsTabHotkeys": "Tastatur Hotkeys",
|
||||
"SettingsTabHotkeysHotkeys": "Tastatur Hotkeys",
|
||||
"SettingsTabHotkeys": "Tastatur-Hotkeys",
|
||||
"SettingsTabHotkeysHotkeys": "Tastatur-Hotkeys",
|
||||
"SettingsTabHotkeysToggleVsyncHotkey": "VSync:",
|
||||
"SettingsTabHotkeysScreenshotHotkey": "Screenshot:",
|
||||
"SettingsTabHotkeysShowUiHotkey": "Zeige UI:",
|
||||
|
@ -587,6 +593,7 @@
|
|||
"Writable": "Beschreibbar",
|
||||
"SelectDlcDialogTitle": "DLC-Dateien auswählen",
|
||||
"SelectUpdateDialogTitle": "Update-Datei auswählen",
|
||||
"SelectModDialogTitle": "Mod-Ordner auswählen",
|
||||
"UserProfileWindowTitle": "Benutzerprofile verwalten",
|
||||
"CheatWindowTitle": "Spiel-Cheats verwalten",
|
||||
"DlcWindowTitle": "Spiel-DLC verwalten",
|
||||
|
@ -594,10 +601,12 @@
|
|||
"CheatWindowHeading": "Cheats verfügbar für {0} [{1}]",
|
||||
"BuildId": "BuildId:",
|
||||
"DlcWindowHeading": "DLC verfügbar für {0} [{1}]",
|
||||
"ModWindowHeading": "{0} Mod(s)",
|
||||
"UserProfilesEditProfile": "Profil bearbeiten",
|
||||
"Cancel": "Abbrechen",
|
||||
"Save": "Speichern",
|
||||
"Discard": "Verwerfen",
|
||||
"Paused": "Pausiert",
|
||||
"UserProfilesSetProfileImage": "Profilbild einrichten",
|
||||
"UserProfileEmptyNameError": "Name ist erforderlich",
|
||||
"UserProfileNoImageError": "Bitte ein Profilbild auswählen",
|
||||
|
@ -605,11 +614,11 @@
|
|||
"SettingsTabHotkeysResScaleUpHotkey": "Auflösung erhöhen:",
|
||||
"SettingsTabHotkeysResScaleDownHotkey": "Auflösung verringern:",
|
||||
"UserProfilesName": "Name:",
|
||||
"UserProfilesUserId": "Benutzer Id:",
|
||||
"UserProfilesUserId": "Benutzer-ID:",
|
||||
"SettingsTabGraphicsBackend": "Grafik-Backend:",
|
||||
"SettingsTabGraphicsBackendTooltip": "Verwendendetes Grafik-Backend",
|
||||
"SettingsTabGraphicsBackendTooltip": "Wählen Sie das Grafik-Backend, das im Emulator verwendet werden soll.\n\nVulkan ist insgesamt besser für alle modernen Grafikkarten geeignet, sofern deren Treiber auf dem neuesten Stand sind. Vulkan bietet auch eine schnellere Shader-Kompilierung (weniger Stottern) auf allen GPU-Anbietern.\n\nOpenGL kann auf alten Nvidia-GPUs, alten AMD-GPUs unter Linux oder auf GPUs mit geringerem VRAM bessere Ergebnisse erzielen, obwohl die Shader-Kompilierung stärker stottert.\n\nSetzen Sie auf Vulkan, wenn Sie unsicher sind. Stellen Sie OpenGL ein, wenn Ihr Grafikprozessor selbst mit den neuesten Grafiktreibern Vulkan nicht unterstützt.",
|
||||
"SettingsEnableTextureRecompression": "Textur-Rekompression",
|
||||
"SettingsEnableTextureRecompressionTooltip": "Komprimiert bestimmte Texturen, um den VRAM-Verbrauch zu reduzieren.\n\nEmpfohlen für die Verwendung von GPUs, die weniger als 4 GiB VRAM haben.\n\nIm Zweifelsfall AUS lassen",
|
||||
"SettingsEnableTextureRecompressionTooltip": "Komprimiert ASTC-Texturen, um die VRAM-Nutzung zu reduzieren.\n\nZu den Spielen, die dieses Texturformat verwenden, gehören Astral Chain, Bayonetta 3, Fire Emblem Engage, Metroid Prime Remastered, Super Mario Bros. Wonder und The Legend of Zelda: Tears of the Kingdom.\n\nGrafikkarten mit 4GiB VRAM oder weniger werden beim Ausführen dieser Spiele wahrscheinlich irgendwann abstürzen.\n\nAktivieren Sie diese Option nur, wenn Ihnen bei den oben genannten Spielen der VRAM ausgeht. Lassen Sie es aus, wenn Sie unsicher sind.",
|
||||
"SettingsTabGraphicsPreferredGpu": "Bevorzugte GPU:",
|
||||
"SettingsTabGraphicsPreferredGpuTooltip": "Wähle die Grafikkarte aus, die mit dem Vulkan Grafik-Backend verwendet werden soll.\n\nDies hat keinen Einfluss auf die GPU die OpenGL verwendet.\n\nIm Zweifelsfall die als \"dGPU\" gekennzeichnete GPU auswählen. Diese Einstellung unberührt lassen, wenn keine zur Auswahl steht.",
|
||||
"SettingsAppRequiredRestartMessage": "Ein Neustart von Ryujinx ist erforderlich",
|
||||
|
@ -635,12 +644,15 @@
|
|||
"Recover": "Wiederherstellen",
|
||||
"UserProfilesRecoverHeading": "Speicherstände wurden für die folgenden Konten gefunden",
|
||||
"UserProfilesRecoverEmptyList": "Keine Profile zum Wiederherstellen",
|
||||
"GraphicsAATooltip": "Wendet Anti-Aliasing auf das Spiel-Rendering an",
|
||||
"GraphicsAATooltip": "Wendet Anti-Aliasing auf das Rendering des Spiels an.\n\nFXAA verwischt den größten Teil des Bildes, während SMAA versucht, gezackte Kanten zu finden und sie zu glätten.\n\nEs wird nicht empfohlen, diese Option in Verbindung mit dem FSR-Skalierungsfilter zu verwenden.\n\nDiese Option kann geändert werden, während ein Spiel läuft, indem Sie unten auf \"Anwenden\" klicken; Sie können das Einstellungsfenster einfach zur Seite schieben und experimentieren, bis Sie Ihr bevorzugtes Aussehen für ein Spiel gefunden haben.\n\nLassen Sie die Option auf NONE, wenn Sie unsicher sind.",
|
||||
"GraphicsAALabel": "Antialiasing:",
|
||||
"GraphicsScalingFilterLabel": "Skalierungsfilter:",
|
||||
"GraphicsScalingFilterTooltip": "Ermöglicht Framebuffer-Skalierung",
|
||||
"GraphicsScalingFilterTooltip": "Wählen Sie den Skalierungsfilter, der bei der Auflösungsskalierung angewendet werden soll.\n\nBilinear eignet sich gut für 3D-Spiele und ist eine sichere Standardoption.\n\nNearest wird für Pixel-Art-Spiele empfohlen.\n\nFSR 1.0 ist lediglich ein Schärfungsfilter und wird nicht für die Verwendung mit FXAA oder SMAA empfohlen.\n\nDiese Option kann geändert werden, während ein Spiel läuft, indem Sie unten auf \"Anwenden\" klicken; Sie können das Einstellungsfenster einfach zur Seite schieben und experimentieren, bis Sie Ihr bevorzugtes Aussehen für ein Spiel gefunden haben.\n\nBleiben Sie auf BILINEAR, wenn Sie unsicher sind.",
|
||||
"GraphicsScalingFilterBilinear": "Bilinear",
|
||||
"GraphicsScalingFilterNearest": "Nächstes",
|
||||
"GraphicsScalingFilterFsr": "FSR",
|
||||
"GraphicsScalingFilterLevelLabel": "Stufe",
|
||||
"GraphicsScalingFilterLevelTooltip": "Skalierungsfilter-Stufe festlegen",
|
||||
"GraphicsScalingFilterLevelTooltip": "FSR 1.0 Schärfelevel festlegen. Höher ist schärfer.",
|
||||
"SmaaLow": "SMAA Niedrig",
|
||||
"SmaaMedium": "SMAA Mittel",
|
||||
"SmaaHigh": "SMAA Hoch",
|
||||
|
@ -648,9 +660,14 @@
|
|||
"UserEditorTitle": "Nutzer bearbeiten",
|
||||
"UserEditorTitleCreate": "Nutzer erstellen",
|
||||
"SettingsTabNetworkInterface": "Netzwerkschnittstelle:",
|
||||
"NetworkInterfaceTooltip": "Die Netzwerkschnittstelle, die für LAN-Funktionen verwendet wird",
|
||||
"NetworkInterfaceTooltip": "Die für LAN/LDN-Funktionen verwendete Netzwerkschnittstelle.\n\nIn Verbindung mit einem VPN oder XLink Kai und einem Spiel mit LAN-Unterstützung kann eine Verbindung mit demselben Netzwerk über das Internet vorgetäuscht werden.\n\nIm Zweifelsfall auf DEFAULT belassen.",
|
||||
"NetworkInterfaceDefault": "Standard",
|
||||
"PackagingShaders": "Verpackt Shader",
|
||||
"AboutChangelogButton": "Changelog in GitHub öffnen",
|
||||
"AboutChangelogButtonTooltipMessage": "Klicke hier, um das Changelog für diese Version in Ihrem Standardbrowser zu öffnen."
|
||||
}
|
||||
"AboutChangelogButtonTooltipMessage": "Klicke hier, um das Changelog für diese Version in Ihrem Standardbrowser zu öffnen.",
|
||||
"SettingsTabNetworkMultiplayer": "Mehrspieler",
|
||||
"MultiplayerMode": "Modus:",
|
||||
"MultiplayerModeTooltip": "Ändert den LDN-Mehrspielermodus.\n\nLdnMitm ändert die lokale drahtlose/lokale Spielfunktionalität in Spielen so, dass sie wie ein LAN funktioniert und lokale, netzwerkgleiche Verbindungen mit anderen Ryujinx-Instanzen und gehackten Nintendo Switch-Konsolen ermöglicht, auf denen das ldn_mitm-Modul installiert ist.\n\nMultiplayer erfordert, dass alle Spieler die gleiche Spielversion verwenden (d.h. Super Smash Bros. Ultimate v13.0.1 kann sich nicht mit v13.0.0 verbinden).\n\nIm Zweifelsfall auf DISABLED lassen.",
|
||||
"MultiplayerModeDisabled": "Deaktiviert",
|
||||
"MultiplayerModeLdnMitm": "ldn_mitm"
|
||||
}
|
||||
|
|
|
@ -14,7 +14,7 @@
|
|||
"MenuBarFileOpenEmuFolder": "Άνοιγμα Φακέλου Ryujinx",
|
||||
"MenuBarFileOpenLogsFolder": "Άνοιγμα Φακέλου Καταγραφής",
|
||||
"MenuBarFileExit": "_Έξοδος",
|
||||
"MenuBarOptions": "Επιλογές",
|
||||
"MenuBarOptions": "_Επιλογές",
|
||||
"MenuBarOptionsToggleFullscreen": "Λειτουργία Πλήρους Οθόνης",
|
||||
"MenuBarOptionsStartGamesInFullscreen": "Εκκίνηση Παιχνιδιών σε Πλήρη Οθόνη",
|
||||
"MenuBarOptionsStopEmulation": "Διακοπή Εξομοίωσης",
|
||||
|
@ -30,7 +30,7 @@
|
|||
"MenuBarToolsManageFileTypes": "Διαχείριση τύπων αρχείων",
|
||||
"MenuBarToolsInstallFileTypes": "Εγκαταστήσετε τύπους αρχείων.",
|
||||
"MenuBarToolsUninstallFileTypes": "Απεγκαταστήσετε τύπους αρχείων",
|
||||
"MenuBarHelp": "Βοήθεια",
|
||||
"MenuBarHelp": "_Βοήθεια",
|
||||
"MenuBarHelpCheckForUpdates": "Έλεγχος για Ενημερώσεις",
|
||||
"MenuBarHelpAbout": "Σχετικά με",
|
||||
"MenuSearch": "Αναζήτηση...",
|
||||
|
@ -54,8 +54,6 @@
|
|||
"GameListContextMenuManageTitleUpdatesToolTip": "Ανοίγει το παράθυρο διαχείρισης Ενημερώσεων Παιχνιδιού",
|
||||
"GameListContextMenuManageDlc": "Διαχείριση DLC",
|
||||
"GameListContextMenuManageDlcToolTip": "Ανοίγει το παράθυρο διαχείρισης DLC",
|
||||
"GameListContextMenuOpenModsDirectory": "Άνοιγμα Τοποθεσίας Τροποποιήσεων",
|
||||
"GameListContextMenuOpenModsDirectoryToolTip": "Ανοίγει την τοποθεσία που περιέχει τις Τροποποιήσεις της εφαρμογής",
|
||||
"GameListContextMenuCacheManagement": "Διαχείριση Προσωρινής Μνήμης",
|
||||
"GameListContextMenuCacheManagementPurgePptc": "Εκκαθάριση Προσωρινής Μνήμης PPTC",
|
||||
"GameListContextMenuCacheManagementPurgePptcToolTip": "Διαγράφει την προσωρινή μνήμη PPTC της εφαρμογής",
|
||||
|
@ -72,15 +70,22 @@
|
|||
"GameListContextMenuExtractDataRomFSToolTip": "Εξαγωγή της ενότητας RomFS από την τρέχουσα διαμόρφωση της εφαρμογής (συμπεριλαμβανομένου ενημερώσεων)",
|
||||
"GameListContextMenuExtractDataLogo": "Λογότυπο",
|
||||
"GameListContextMenuExtractDataLogoToolTip": "Εξαγωγή της ενότητας Logo από την τρέχουσα διαμόρφωση της εφαρμογής (συμπεριλαμβανομένου ενημερώσεων)",
|
||||
"GameListContextMenuCreateShortcut": "Δημιουργία Συντόμευσης Εφαρμογής",
|
||||
"GameListContextMenuCreateShortcutToolTip": "Δημιουργία συντόμευσης επιφάνειας εργασίας που ανοίγει την επιλεγμένη εφαρμογή",
|
||||
"GameListContextMenuCreateShortcutToolTipMacOS": "Create a shortcut in macOS's Applications folder that launches the selected Application",
|
||||
"GameListContextMenuOpenModsDirectory": "Open Mods Directory",
|
||||
"GameListContextMenuOpenModsDirectoryToolTip": "Opens the directory which contains Application's Mods",
|
||||
"GameListContextMenuOpenSdModsDirectory": "Open Atmosphere Mods Directory",
|
||||
"GameListContextMenuOpenSdModsDirectoryToolTip": "Opens the alternative SD card Atmosphere directory which contains Application's Mods. Useful for mods that are packaged for real hardware.",
|
||||
"StatusBarGamesLoaded": "{0}/{1} Φορτωμένα Παιχνίδια",
|
||||
"StatusBarSystemVersion": "Έκδοση Συστήματος: {0}",
|
||||
"LinuxVmMaxMapCountDialogTitle": "Low limit for memory mappings detected",
|
||||
"LinuxVmMaxMapCountDialogTextPrimary": "Would you like to increase the value of vm.max_map_count to {0}",
|
||||
"LinuxVmMaxMapCountDialogTextSecondary": "Some games might try to create more memory mappings than currently allowed. Ryujinx will crash as soon as this limit gets exceeded.",
|
||||
"LinuxVmMaxMapCountDialogButtonUntilRestart": "Yes, until the next restart",
|
||||
"LinuxVmMaxMapCountDialogButtonPersistent": "Yes, permanently",
|
||||
"LinuxVmMaxMapCountWarningTextPrimary": "Max amount of memory mappings is lower than recommended.",
|
||||
"LinuxVmMaxMapCountWarningTextSecondary": "The current value of vm.max_map_count ({0}) is lower than {1}. Some games might try to create more memory mappings than currently allowed. Ryujinx will crash as soon as this limit gets exceeded.\n\nYou might want to either manually increase the limit or install pkexec, which allows Ryujinx to assist with that.",
|
||||
"LinuxVmMaxMapCountDialogTitle": "Εντοπίστηκε χαμηλό όριο για αντιστοιχίσεις μνήμης",
|
||||
"LinuxVmMaxMapCountDialogTextPrimary": "Θα θέλατε να αυξήσετε την τιμή του vm.max_map_count σε {0}",
|
||||
"LinuxVmMaxMapCountDialogTextSecondary": "Μερικά παιχνίδια μπορεί να προσπαθήσουν να δημιουργήσουν περισσότερες αντιστοιχίσεις μνήμης από αυτές που επιτρέπονται τώρα. Ο Ryujinx θα καταρρεύσει μόλις ξεπεραστεί αυτό το όριο.",
|
||||
"LinuxVmMaxMapCountDialogButtonUntilRestart": "Ναι, μέχρι την επόμενη επανεκκίνηση",
|
||||
"LinuxVmMaxMapCountDialogButtonPersistent": "Ναι, μόνιμα",
|
||||
"LinuxVmMaxMapCountWarningTextPrimary": "Ο μέγιστος αριθμός αντιστοιχίσεων μνήμης είναι μικρότερος από τον συνιστώμενο.",
|
||||
"LinuxVmMaxMapCountWarningTextSecondary": "Η τρέχουσα τιμή του vm.max_map_count ({0}) είναι χαμηλότερη από {1}. Ορισμένα παιχνίδια μπορεί να προσπαθήσουν να δημιουργήσουν περισσότερες αντιστοιχίσεις μνήμης από αυτές που επιτρέπονται τώρα. Ο Ryujinx θα συντριβεί μόλις ξεπεραστεί το όριο.\n\nΜπορεί να θέλετε είτε να αυξήσετε χειροκίνητα το όριο ή να εγκαταστήσετε το pkexec, το οποίο επιτρέπει Ryujinx να βοηθήσει με αυτό.",
|
||||
"Settings": "Ρυθμίσεις",
|
||||
"SettingsTabGeneral": "Εμφάνιση",
|
||||
"SettingsTabGeneralGeneral": "Γενικά",
|
||||
|
@ -150,7 +155,7 @@
|
|||
"SettingsTabGraphicsResolutionScaleNative": "Εγγενής (720p/1080p)",
|
||||
"SettingsTabGraphicsResolutionScale2x": "2x (1440p/2160p)",
|
||||
"SettingsTabGraphicsResolutionScale3x": "3x (2160p/3240p)",
|
||||
"SettingsTabGraphicsResolutionScale4x": "4x (2880p/4320p)",
|
||||
"SettingsTabGraphicsResolutionScale4x": "4x (2880p/4320p) (Not recommended)",
|
||||
"SettingsTabGraphicsAspectRatio": "Αναλογία Απεικόνισης:",
|
||||
"SettingsTabGraphicsAspectRatio4x3": "4:3",
|
||||
"SettingsTabGraphicsAspectRatio16x9": "16:9",
|
||||
|
@ -228,10 +233,10 @@
|
|||
"ControllerSettingsStickDown": "Κάτω",
|
||||
"ControllerSettingsStickLeft": "Αριστερά",
|
||||
"ControllerSettingsStickRight": "Δεξιά",
|
||||
"ControllerSettingsStickStick": "Stick",
|
||||
"ControllerSettingsStickInvertXAxis": "Invert Stick X",
|
||||
"ControllerSettingsStickInvertYAxis": "Invert Stick Y",
|
||||
"ControllerSettingsStickDeadzone": "Deadzone:",
|
||||
"ControllerSettingsStickStick": "Μοχλός",
|
||||
"ControllerSettingsStickInvertXAxis": "Αντιστροφή Μοχλού X",
|
||||
"ControllerSettingsStickInvertYAxis": "Αντιστροφή Μοχλού Y",
|
||||
"ControllerSettingsStickDeadzone": "Νεκρή Ζώνη:",
|
||||
"ControllerSettingsLStick": "Αριστερός Μοχλός",
|
||||
"ControllerSettingsRStick": "Δεξιός Μοχλός",
|
||||
"ControllerSettingsTriggersLeft": "Αριστερή Σκανδάλη",
|
||||
|
@ -289,16 +294,12 @@
|
|||
"ControllerSettingsSaveProfileToolTip": "Αποθήκευση Προφίλ",
|
||||
"MenuBarFileToolsTakeScreenshot": "Λήψη Στιγμιότυπου",
|
||||
"MenuBarFileToolsHideUi": "Απόκρυψη UI",
|
||||
"GameListContextMenuRunApplication": "Run Application",
|
||||
"GameListContextMenuRunApplication": "Εκτέλεση Εφαρμογής",
|
||||
"GameListContextMenuToggleFavorite": "Εναλλαγή Αγαπημένου",
|
||||
"GameListContextMenuToggleFavoriteToolTip": "Εναλλαγή της Κατάστασης Αγαπημένο του Παιχνιδιού",
|
||||
"SettingsTabGeneralTheme": "Θέμα",
|
||||
"SettingsTabGeneralThemeCustomTheme": "Προσαρμοσμένη Τοποθεσία Θέματος",
|
||||
"SettingsTabGeneralThemeBaseStyle": "Βασικό Στυλ",
|
||||
"SettingsTabGeneralThemeBaseStyleDark": "Σκούρο",
|
||||
"SettingsTabGeneralThemeBaseStyleLight": "Ανοιχτό",
|
||||
"SettingsTabGeneralThemeEnableCustomTheme": "Ενεργοποίηση Προσαρμοσμένου Θέματος",
|
||||
"ButtonBrowse": "Αναζήτηση",
|
||||
"SettingsTabGeneralTheme": "Theme:",
|
||||
"SettingsTabGeneralThemeDark": "Dark",
|
||||
"SettingsTabGeneralThemeLight": "Light",
|
||||
"ControllerSettingsConfigureGeneral": "Παραμέτρων",
|
||||
"ControllerSettingsRumble": "Δόνηση",
|
||||
"ControllerSettingsRumbleStrongMultiplier": "Ισχυρός Πολλαπλασιαστής Δόνησης",
|
||||
|
@ -332,8 +333,6 @@
|
|||
"DialogUpdaterAddingFilesMessage": "Προσθήκη Νέας Ενημέρωσης...",
|
||||
"DialogUpdaterCompleteMessage": "Η Ενημέρωση Ολοκληρώθηκε!",
|
||||
"DialogUpdaterRestartMessage": "Θέλετε να επανεκκινήσετε το Ryujinx τώρα;",
|
||||
"DialogUpdaterArchNotSupportedMessage": "Δεν υπάρχει υποστηριζόμενη αρχιτεκτονική συστήματος!",
|
||||
"DialogUpdaterArchNotSupportedSubMessage": "(Υποστηρίζονται μόνο συστήματα x64!)",
|
||||
"DialogUpdaterNoInternetMessage": "Δεν είστε συνδεδεμένοι στο Διαδίκτυο!",
|
||||
"DialogUpdaterNoInternetSubMessage": "Επαληθεύστε ότι έχετε σύνδεση στο Διαδίκτυο που λειτουργεί!",
|
||||
"DialogUpdaterDirtyBuildMessage": "Δεν μπορείτε να ενημερώσετε μία Πρόχειρη Έκδοση του Ryujinx!",
|
||||
|
@ -342,7 +341,7 @@
|
|||
"DialogThemeRestartMessage": "Το θέμα έχει αποθηκευτεί. Απαιτείται επανεκκίνηση για την εφαρμογή του θέματος.",
|
||||
"DialogThemeRestartSubMessage": "Θέλετε να κάνετε επανεκκίνηση",
|
||||
"DialogFirmwareInstallEmbeddedMessage": "Θα θέλατε να εγκαταστήσετε το Firmware που είναι ενσωματωμένο σε αυτό το παιχνίδι; (Firmware {0})",
|
||||
"DialogFirmwareInstallEmbeddedSuccessMessage": "Δεν βρέθηκε εγκατεστημένο Firmware, αλλά το Ryujinx μπόρεσε να εγκαταστήσει το Firmware {0} από το παρεχόμενο παιχνίδι.\nΟ εξομοιωτής θα ξεκινήσει τώρα.",
|
||||
"DialogFirmwareInstallEmbeddedSuccessMessage": "No installed firmware was found but Ryujinx was able to install firmware {0} from the provided game.\nThe emulator will now start.",
|
||||
"DialogFirmwareNoFirmwareInstalledMessage": "Δεν έχει εγκατασταθεί Firmware",
|
||||
"DialogFirmwareInstalledMessage": "Το Firmware {0} εγκαταστάθηκε",
|
||||
"DialogInstallFileTypesSuccessMessage": "Επιτυχής εγκατάσταση τύπων αρχείων!",
|
||||
|
@ -385,7 +384,10 @@
|
|||
"DialogUserProfileUnsavedChangesSubMessage": "Θέλετε να απορρίψετε τις αλλαγές σας;",
|
||||
"DialogControllerSettingsModifiedConfirmMessage": "Οι τρέχουσες ρυθμίσεις χειρισμού έχουν ενημερωθεί.",
|
||||
"DialogControllerSettingsModifiedConfirmSubMessage": "Θέλετε να αποθηκεύσετε;",
|
||||
"DialogLoadNcaErrorMessage": "{0}. Σφάλμα Αρχείου: {1}",
|
||||
"DialogLoadFileErrorMessage": "{0}. Errored File: {1}",
|
||||
"DialogModAlreadyExistsMessage": "Mod already exists",
|
||||
"DialogModInvalidMessage": "The specified directory does not contain a mod!",
|
||||
"DialogModDeleteNoParentMessage": "Failed to Delete: Could not find the parent directory for mod \"{0}\"!",
|
||||
"DialogDlcNoDlcErrorMessage": "Το αρχείο δεν περιέχει DLC για τον επιλεγμένο τίτλο!",
|
||||
"DialogPerformanceCheckLoggingEnabledMessage": "Έχετε ενεργοποιημένη την καταγραφή εντοπισμού σφαλμάτων, η οποία έχει σχεδιαστεί για χρήση μόνο από προγραμματιστές.",
|
||||
"DialogPerformanceCheckLoggingEnabledConfirmMessage": "Για βέλτιστη απόδοση, συνιστάται η απενεργοποίηση καταγραφής εντοπισμού σφαλμάτων. Θέλετε να απενεργοποιήσετε την καταγραφή τώρα;",
|
||||
|
@ -396,6 +398,8 @@
|
|||
"DialogUpdateAddUpdateErrorMessage": "Το αρχείο δεν περιέχει ενημέρωση για τον επιλεγμένο τίτλο!",
|
||||
"DialogSettingsBackendThreadingWarningTitle": "Προειδοποίηση - Backend Threading",
|
||||
"DialogSettingsBackendThreadingWarningMessage": "Το Ryujinx πρέπει να επανεκκινηθεί αφού αλλάξει αυτή η επιλογή για να εφαρμοστεί πλήρως. Ανάλογα με την πλατφόρμα σας, μπορεί να χρειαστεί να απενεργοποιήσετε με μη αυτόματο τρόπο το multithreading του ίδιου του προγράμματος οδήγησης όταν χρησιμοποιείτε το Ryujinx.",
|
||||
"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?",
|
||||
"SettingsTabGraphicsFeaturesOptions": "Χαρακτηριστικά",
|
||||
"SettingsTabGraphicsBackendMultithreading": "Πολυνηματική Επεξεργασία Γραφικών:",
|
||||
"CommonAuto": "Αυτόματο",
|
||||
|
@ -430,6 +434,7 @@
|
|||
"DlcManagerRemoveAllButton": "Αφαίρεση όλων",
|
||||
"DlcManagerEnableAllButton": "Ενεργοποίηση Όλων",
|
||||
"DlcManagerDisableAllButton": "Απενεργοποίηση Όλων",
|
||||
"ModManagerDeleteAllButton": "Delete All",
|
||||
"MenuBarOptionsChangeLanguage": "Αλλαξε γλώσσα",
|
||||
"MenuBarShowFileTypes": "Εμφάνιση Τύπων Αρχείων",
|
||||
"CommonSort": "Κατάταξη",
|
||||
|
@ -447,13 +452,13 @@
|
|||
"CustomThemePathTooltip": "Διαδρομή προς το προσαρμοσμένο θέμα GUI",
|
||||
"CustomThemeBrowseTooltip": "Αναζητήστε ένα προσαρμοσμένο θέμα GUI",
|
||||
"DockModeToggleTooltip": "Ενεργοποιήστε ή απενεργοποιήστε τη λειτουργία σύνδεσης",
|
||||
"DirectKeyboardTooltip": "Ενεργοποίηση ή απενεργοποίηση της \"υποστήριξης άμεσης πρόσβασης πληκτρολογίου (HID)\" (Παρέχει πρόσβαση στα παιχνίδια στο πληκτρολόγιό σας ως συσκευή εισαγωγής κειμένου)",
|
||||
"DirectMouseTooltip": "Ενεργοποίηση ή απενεργοποίηση της \"υποστήριξης άμεσης πρόσβασης ποντικιού (HID)\" (Παρέχει πρόσβαση στα παιχνίδια στο ποντίκι σας ως συσκευή κατάδειξης)",
|
||||
"DirectKeyboardTooltip": "Direct keyboard access (HID) support. Provides games access to your keyboard as a text entry device.\n\nOnly works with games that natively support keyboard usage on Switch hardware.\n\nLeave OFF if unsure.",
|
||||
"DirectMouseTooltip": "Direct mouse access (HID) support. Provides games access to your mouse as a pointing device.\n\nOnly works with games that natively support mouse controls on Switch hardware, which are few and far between.\n\nWhen enabled, touch screen functionality may not work.\n\nLeave OFF if unsure.",
|
||||
"RegionTooltip": "Αλλαγή Περιοχής Συστήματος",
|
||||
"LanguageTooltip": "Αλλαγή Γλώσσας Συστήματος",
|
||||
"TimezoneTooltip": "Αλλαγή Ζώνης Ώρας Συστήματος",
|
||||
"TimeTooltip": "Αλλαγή Ώρας Συστήματος",
|
||||
"VSyncToggleTooltip": "Ενεργοποιεί ή απενεργοποιεί τον κατακόρυφο συγχρονισμό",
|
||||
"VSyncToggleTooltip": "Emulated console's Vertical Sync. Essentially a frame-limiter for the majority of games; disabling it may cause games to run at higher speed or make loading screens take longer or get stuck.\n\nCan be toggled in-game with a hotkey of your preference (F1 by default). We recommend doing this if you plan on disabling it.\n\nLeave ON if unsure.",
|
||||
"PptcToggleTooltip": "Ενεργοποιεί ή απενεργοποιεί το PPTC",
|
||||
"FsIntegrityToggleTooltip": "Ενεργοποιεί τους ελέγχους ακεραιότητας σε αρχεία περιεχομένου παιχνιδιού",
|
||||
"AudioBackendTooltip": "Αλλαγή ήχου υποστήριξης",
|
||||
|
@ -467,10 +472,10 @@
|
|||
"GraphicsBackendThreadingTooltip": "Ενεργοποίηση Πολυνηματικής Επεξεργασίας Γραφικών",
|
||||
"GalThreadingTooltip": "Εκτελεί εντολές γραφικών σε ένα δεύτερο νήμα. Επιτρέπει την πολυνηματική μεταγλώττιση Shader σε χρόνο εκτέλεσης, μειώνει το τρεμόπαιγμα και βελτιώνει την απόδοση των προγραμμάτων οδήγησης χωρίς τη δική τους υποστήριξη πολλαπλών νημάτων. Ποικίλες κορυφαίες επιδόσεις σε προγράμματα οδήγησης με multithreading. Μπορεί να χρειαστεί επανεκκίνηση του Ryujinx για να απενεργοποιήσετε σωστά την ενσωματωμένη λειτουργία πολλαπλών νημάτων του προγράμματος οδήγησης ή ίσως χρειαστεί να το κάνετε χειροκίνητα για να έχετε την καλύτερη απόδοση.",
|
||||
"ShaderCacheToggleTooltip": "Ενεργοποιεί ή απενεργοποιεί την Προσωρινή Μνήμη Shader",
|
||||
"ResolutionScaleTooltip": "Κλίμακα ανάλυσης που εφαρμόστηκε σε ισχύοντες στόχους απόδοσης",
|
||||
"ResolutionScaleTooltip": "Multiplies the game's rendering resolution.\n\nA few games may not work with this and look pixelated even when the resolution is increased; for those games, you may need to find mods that remove anti-aliasing or that increase their internal rendering resolution. For using the latter, you'll likely want to select Native.\n\nThis option can be changed while a game is running by clicking \"Apply\" below; you can simply move the settings window aside and experiment until you find your preferred look for a game.\n\nKeep in mind 4x is overkill for virtually any setup.",
|
||||
"ResolutionScaleEntryTooltip": "Κλίμακα ανάλυσης κινητής υποδιαστολής, όπως 1,5. Οι μη αναπόσπαστες τιμές είναι πιθανό να προκαλέσουν προβλήματα ή σφάλματα.",
|
||||
"AnisotropyTooltip": "Επίπεδο Ανισότροπου Φιλτραρίσματος (ρυθμίστε το στο Αυτόματο για να χρησιμοποιηθεί η τιμή που ζητήθηκε από το παιχνίδι)",
|
||||
"AspectRatioTooltip": "Λόγος διαστάσεων που εφαρμόστηκε στο παράθυρο απόδοσης.",
|
||||
"AnisotropyTooltip": "Level of Anisotropic Filtering. Set to Auto to use the value requested by the game.",
|
||||
"AspectRatioTooltip": "Aspect Ratio applied to the renderer window.\n\nOnly change this if you're using an aspect ratio mod for your game, otherwise the graphics will be stretched.\n\nLeave on 16:9 if unsure.",
|
||||
"ShaderDumpPathTooltip": "Τοποθεσία Εναπόθεσης Προσωρινής Μνήμης Shaders",
|
||||
"FileLogTooltip": "Ενεργοποιεί ή απενεργοποιεί την καταγραφή σε ένα αρχείο στο δίσκο",
|
||||
"StubLogTooltip": "Ενεργοποιεί την εκτύπωση μηνυμάτων καταγραφής ατελειών",
|
||||
|
@ -504,6 +509,8 @@
|
|||
"EnableInternetAccessTooltip": "Επιτρέπει την πρόσβαση επισκέπτη στο Διαδίκτυο. Εάν ενεργοποιηθεί, η εξομοιωμένη κονσόλα Switch θα συμπεριφέρεται σαν να είναι συνδεδεμένη στο Διαδίκτυο. Λάβετε υπόψη ότι σε ορισμένες περιπτώσεις, οι εφαρμογές ενδέχεται να εξακολουθούν να έχουν πρόσβαση στο Διαδίκτυο, ακόμη και όταν αυτή η επιλογή είναι απενεργοποιημένη",
|
||||
"GameListContextMenuManageCheatToolTip": "Διαχείριση Κόλπων",
|
||||
"GameListContextMenuManageCheat": "Διαχείριση Κόλπων",
|
||||
"GameListContextMenuManageModToolTip": "Manage Mods",
|
||||
"GameListContextMenuManageMod": "Manage Mods",
|
||||
"ControllerSettingsStickRange": "Εύρος:",
|
||||
"DialogStopEmulationTitle": "Ryujinx - Διακοπή εξομοίωσης",
|
||||
"DialogStopEmulationMessage": "Είστε βέβαιοι ότι θέλετε να σταματήσετε την εξομοίωση;",
|
||||
|
@ -515,8 +522,6 @@
|
|||
"SettingsTabCpuMemory": "Μνήμη CPU",
|
||||
"DialogUpdaterFlatpakNotSupportedMessage": "Παρακαλούμε ενημερώστε το Ryujinx μέσω FlatHub.",
|
||||
"UpdaterDisabledWarningTitle": "Ο Διαχειριστής Ενημερώσεων Είναι Απενεργοποιημένος!",
|
||||
"GameListContextMenuOpenSdModsDirectory": "Άνοιγμα Της Τοποθεσίας Των Atmosphere Mods",
|
||||
"GameListContextMenuOpenSdModsDirectoryToolTip": "Ανοίγει τον εναλλακτικό SD card Atmosphere κατάλογο που περιέχει Mods για το Application. Χρήσιμο για mods τα οποία συσκευάστηκαν για την πραγματική κονσόλα.",
|
||||
"ControllerSettingsRotate90": "Περιστροφή 90° Δεξιόστροφα",
|
||||
"IconSize": "Μέγεθος Εικονιδίου",
|
||||
"IconSizeTooltip": "Αλλάξτε μέγεθος εικονιδίων των παιχνιδιών",
|
||||
|
@ -544,12 +549,13 @@
|
|||
"SwkbdMinCharacters": "Πρέπει να έχει μήκος τουλάχιστον {0} χαρακτήρες",
|
||||
"SwkbdMinRangeCharacters": "Πρέπει να έχει μήκος {0}-{1} χαρακτήρες",
|
||||
"SoftwareKeyboard": "Εικονικό Πληκτρολόγιο",
|
||||
"SoftwareKeyboardModeNumbersOnly": "Must be numbers only",
|
||||
"SoftwareKeyboardModeAlphabet": "Must be non CJK-characters only",
|
||||
"SoftwareKeyboardModeASCII": "Must be ASCII text only",
|
||||
"DialogControllerAppletMessagePlayerRange": "Η εφαρμογή ζητά {0} παίκτη(ες) με:\n\nΤΥΠΟΥΣ: {1}\n\nΠΑΙΚΤΕΣ: {2}\n\n{3}Παρακαλώ ανοίξτε τις ρυθμίσεις και αλλάξτε τις ρυθμίσεις εισαγωγής τώρα ή πατήστε Κλείσιμο.",
|
||||
"DialogControllerAppletMessage": "Η εφαρμογή ζητά ακριβώς {0} παίκτη(ες) με:\n\nΤΥΠΟΥΣ: {1}\n\nΠΑΙΚΤΕΣ: {2}\n\n{3}Παρακαλώ ανοίξτε τις ρυθμίσεις και αλλάξτε τις Ρυθμίσεις εισαγωγής τώρα ή πατήστε Κλείσιμο.",
|
||||
"DialogControllerAppletDockModeSet": "Η κατάσταση Docked ενεργοποιήθηκε. Το συσκευή παλάμης είναι επίσης μην αποδεκτό.",
|
||||
"SoftwareKeyboardModeNumeric": "Πρέπει να είναι 0-9 ή '.' μόνο",
|
||||
"SoftwareKeyboardModeAlphabet": "Πρέπει να μην είναι μόνο χαρακτήρες CJK",
|
||||
"SoftwareKeyboardModeASCII": "Πρέπει να είναι μόνο κείμενο ASCII",
|
||||
"ControllerAppletControllers": "Supported Controllers:",
|
||||
"ControllerAppletPlayers": "Players:",
|
||||
"ControllerAppletDescription": "Your current configuration is invalid. Open settings and reconfigure your inputs.",
|
||||
"ControllerAppletDocked": "Docked mode set. Handheld control should be disabled.",
|
||||
"UpdaterRenaming": "Μετονομασία Παλαιών Αρχείων...",
|
||||
"UpdaterRenameFailed": "Δεν ήταν δυνατή η μετονομασία του αρχείου: {0}",
|
||||
"UpdaterAddingFiles": "Προσθήκη Νέων Αρχείων...",
|
||||
|
@ -587,6 +593,7 @@
|
|||
"Writable": "Εγγράψιμο",
|
||||
"SelectDlcDialogTitle": "Επιλογή αρχείων DLC",
|
||||
"SelectUpdateDialogTitle": "Επιλογή αρχείων ενημέρωσης",
|
||||
"SelectModDialogTitle": "Select mod directory",
|
||||
"UserProfileWindowTitle": "Διαχειριστής Προφίλ Χρήστη",
|
||||
"CheatWindowTitle": "Διαχειριστής των Cheats",
|
||||
"DlcWindowTitle": "Downloadable Content Manager",
|
||||
|
@ -594,10 +601,12 @@
|
|||
"CheatWindowHeading": "Διαθέσιμα Cheats για {0} [{1}]",
|
||||
"BuildId": "BuildId:",
|
||||
"DlcWindowHeading": "{0} Downloadable Content(s) available for {1} ({2})",
|
||||
"ModWindowHeading": "{0} Mod(s)",
|
||||
"UserProfilesEditProfile": "Επεξεργασία Επιλεγμένων",
|
||||
"Cancel": "Ακύρωση",
|
||||
"Save": "Αποθήκευση",
|
||||
"Discard": "Απόρριψη",
|
||||
"Paused": "Σε παύση",
|
||||
"UserProfilesSetProfileImage": "Ορισμός Εικόνας Προφίλ",
|
||||
"UserProfileEmptyNameError": "Απαιτείται όνομα",
|
||||
"UserProfileNoImageError": "Η εικόνα προφίλ πρέπει να οριστεί",
|
||||
|
@ -607,9 +616,9 @@
|
|||
"UserProfilesName": "Όνομα:",
|
||||
"UserProfilesUserId": "User Id:",
|
||||
"SettingsTabGraphicsBackend": "Σύστημα Υποστήριξης Γραφικών",
|
||||
"SettingsTabGraphicsBackendTooltip": "Backend Γραφικών που θα χρησιμοποιηθεί",
|
||||
"SettingsTabGraphicsBackendTooltip": "Select the graphics backend that will be used in the emulator.\n\nVulkan is overall better for all modern graphics cards, as long as their drivers are up to date. Vulkan also features faster shader compilation (less stuttering) on all GPU vendors.\n\nOpenGL may achieve better results on old Nvidia GPUs, on old AMD GPUs on Linux, or on GPUs with lower VRAM, though shader compilation stutters will be greater.\n\nSet to Vulkan if unsure. Set to OpenGL if your GPU does not support Vulkan even with the latest graphics drivers.",
|
||||
"SettingsEnableTextureRecompression": "Ενεργοποίηση Επανασυμπίεσης Των Texture",
|
||||
"SettingsEnableTextureRecompressionTooltip": "Συμπιέζει συγκεκριμένα texture για να μειωθεί η χρήση της VRAM.\nΣυνίσταται για χρήση σε κάρτες γραφικών με λιγότερο από 4 GiB VRAM.\nΑφήστε το Απενεργοποιημένο αν είστε αβέβαιοι.",
|
||||
"SettingsEnableTextureRecompressionTooltip": "Compresses ASTC textures in order to reduce VRAM usage.\n\nGames using this texture format include Astral Chain, Bayonetta 3, Fire Emblem Engage, Metroid Prime Remastered, Super Mario Bros. Wonder and The Legend of Zelda: Tears of the Kingdom.\n\nGraphics cards with 4GiB VRAM or less will likely crash at some point while running these games.\n\nEnable only if you're running out of VRAM on the aforementioned games. Leave OFF if unsure.",
|
||||
"SettingsTabGraphicsPreferredGpu": "Προτιμώμενη GPU",
|
||||
"SettingsTabGraphicsPreferredGpuTooltip": "Επιλέξτε την κάρτα γραφικών η οποία θα χρησιμοποιηθεί από το Vulkan.\n\nΔεν επηρεάζει το OpenGL.\n\nΔιαλέξτε την GPU που διαθέτει την υπόδειξη \"dGPU\" αν δεν είστε βέβαιοι. Αν δεν υπάρχει κάποιαν, το πειράξετε",
|
||||
"SettingsAppRequiredRestartMessage": "Απαιτείται Επανεκκίνηση Του Ryujinx",
|
||||
|
@ -620,8 +629,8 @@
|
|||
"SettingsTabHotkeysVolumeDownHotkey": "Μείωση Έντασης:",
|
||||
"SettingsEnableMacroHLE": "Ενεργοποίηση του Macro HLE",
|
||||
"SettingsEnableMacroHLETooltip": "Προσομοίωση του κώδικα GPU Macro .\n\nΒελτιώνει την απόδοση, αλλά μπορεί να προκαλέσει γραφικά προβλήματα σε μερικά παιχνίδια.\n\nΑφήστε ΕΝΕΡΓΟ αν δεν είστε σίγουροι.",
|
||||
"SettingsEnableColorSpacePassthrough": "Color Space Passthrough",
|
||||
"SettingsEnableColorSpacePassthroughTooltip": "Directs the Vulkan backend to pass through color information without specifying a color space. For users with wide gamut displays, this may result in more vibrant colors, at the cost of color correctness.",
|
||||
"SettingsEnableColorSpacePassthrough": "Διέλευση Χρωματικού Χώρου",
|
||||
"SettingsEnableColorSpacePassthroughTooltip": "Σκηνοθετεί το σύστημα υποστήριξης του Vulkan για να περάσει από πληροφορίες χρώματος χωρίς να καθορίσει έναν χρωματικό χώρο. Για χρήστες με ευρείες οθόνες γκάμας, αυτό μπορεί να οδηγήσει σε πιο ζωηρά χρώματα, με κόστος την ορθότητα του χρώματος.",
|
||||
"VolumeShort": "Έντ.",
|
||||
"UserProfilesManageSaves": "Διαχείριση Των Save",
|
||||
"DeleteUserSave": "Επιθυμείτε να διαγράψετε το save χρήστη για το συγκεκριμένο παιχνίδι;",
|
||||
|
@ -635,12 +644,15 @@
|
|||
"Recover": "Ανάκτηση",
|
||||
"UserProfilesRecoverHeading": "Βρέθηκαν save για τους ακόλουθους λογαριασμούς",
|
||||
"UserProfilesRecoverEmptyList": "Δεν υπάρχουν προφίλ για ανάκτηση",
|
||||
"GraphicsAATooltip": "Εφαρμόζει anti-aliasing στην απόδοση του παιχνιδιού",
|
||||
"GraphicsAATooltip": "Applies anti-aliasing to the game render.\n\nFXAA will blur most of the image, while SMAA will attempt to find jagged edges and smooth them out.\n\nNot recommended to use in conjunction with the FSR scaling filter.\n\nThis option can be changed while a game is running by clicking \"Apply\" below; you can simply move the settings window aside and experiment until you find your preferred look for a game.\n\nLeave on NONE if unsure.",
|
||||
"GraphicsAALabel": "Anti-Aliasing",
|
||||
"GraphicsScalingFilterLabel": "Φίλτρο Κλιμάκωσης:",
|
||||
"GraphicsScalingFilterTooltip": "Ενεργοποιεί Κλίμακα Framebuffer",
|
||||
"GraphicsScalingFilterTooltip": "Choose the scaling filter that will be applied when using resolution scale.\n\nBilinear works well for 3D games and is a safe default option.\n\nNearest is recommended for pixel art games.\n\nFSR 1.0 is merely a sharpening filter, not recommended for use with FXAA or SMAA.\n\nThis option can be changed while a game is running by clicking \"Apply\" below; you can simply move the settings window aside and experiment until you find your preferred look for a game.\n\nLeave on BILINEAR if unsure.",
|
||||
"GraphicsScalingFilterBilinear": "Bilinear",
|
||||
"GraphicsScalingFilterNearest": "Nearest",
|
||||
"GraphicsScalingFilterFsr": "FSR",
|
||||
"GraphicsScalingFilterLevelLabel": "Επίπεδο",
|
||||
"GraphicsScalingFilterLevelTooltip": "Ορισμός Επιπέδου Φίλτρου Κλιμάκωσης",
|
||||
"GraphicsScalingFilterLevelTooltip": "Set FSR 1.0 sharpening level. Higher is sharper.",
|
||||
"SmaaLow": "Χαμηλό SMAA",
|
||||
"SmaaMedium": " Μεσαίο SMAA",
|
||||
"SmaaHigh": "Υψηλό SMAA",
|
||||
|
@ -648,9 +660,14 @@
|
|||
"UserEditorTitle": "Επεξεργασία Χρήστη",
|
||||
"UserEditorTitleCreate": "Δημιουργία Χρήστη",
|
||||
"SettingsTabNetworkInterface": "Διεπαφή Δικτύου",
|
||||
"NetworkInterfaceTooltip": "Η διεπαφή δικτύου που χρησιμοποιείται για τα χαρακτηριστικά LAN",
|
||||
"NetworkInterfaceTooltip": "The network interface used for LAN/LDN features.\n\nIn conjunction with a VPN or XLink Kai and a game with LAN support, can be used to spoof a same-network connection over the Internet.\n\nLeave on DEFAULT if unsure.",
|
||||
"NetworkInterfaceDefault": "Προεπιλογή",
|
||||
"PackagingShaders": "Shaders Συσκευασίας",
|
||||
"AboutChangelogButton": "View Changelog on GitHub",
|
||||
"AboutChangelogButtonTooltipMessage": "Click to open the changelog for this version in your default browser."
|
||||
}
|
||||
"AboutChangelogButton": "Προβολή αρχείου αλλαγών στο GitHub",
|
||||
"AboutChangelogButtonTooltipMessage": "Κάντε κλικ για να ανοίξετε το αρχείο αλλαγών για αυτήν την έκδοση στο προεπιλεγμένο πρόγραμμα περιήγησης σας.",
|
||||
"SettingsTabNetworkMultiplayer": "Πολλαπλοί παίκτες",
|
||||
"MultiplayerMode": "Λειτουργία:",
|
||||
"MultiplayerModeTooltip": "Change LDN multiplayer mode.\n\nLdnMitm will modify local wireless/local play functionality in games to function as if it were LAN, allowing for local, same-network connections with other Ryujinx instances and hacked Nintendo Switch consoles that have the ldn_mitm module installed.\n\nMultiplayer requires all players to be on the same game version (i.e. Super Smash Bros. Ultimate v13.0.1 can't connect to v13.0.0).\n\nLeave DISABLED if unsure.",
|
||||
"MultiplayerModeDisabled": "Disabled",
|
||||
"MultiplayerModeLdnMitm": "ldn_mitm"
|
||||
}
|
||||
|
|
|
@ -342,7 +342,7 @@
|
|||
"DialogThemeRestartMessage": "Theme has been saved. A restart is needed to apply the theme.",
|
||||
"DialogThemeRestartSubMessage": "Do you want to restart",
|
||||
"DialogFirmwareInstallEmbeddedMessage": "Would you like to install the firmware embedded in this game? (Firmware {0})",
|
||||
"DialogFirmwareInstallEmbeddedSuccessMessage": "No installed firmware was found but Ryujinx was able to install firmware {0} from the provided game.\\nThe emulator will now start.",
|
||||
"DialogFirmwareInstallEmbeddedSuccessMessage": "No installed firmware was found but Ryujinx was able to install firmware {0} from the provided game.\nThe emulator will now start.",
|
||||
"DialogFirmwareNoFirmwareInstalledMessage": "No Firmware Installed",
|
||||
"DialogFirmwareInstalledMessage": "Firmware {0} was installed",
|
||||
"DialogInstallFileTypesSuccessMessage": "Successfully installed file types!",
|
||||
|
@ -598,6 +598,7 @@
|
|||
"UserProfileWindowTitle": "User Profiles Manager",
|
||||
"CheatWindowTitle": "Cheats Manager",
|
||||
"DlcWindowTitle": "Manage Downloadable Content for {0} ({1})",
|
||||
"ModWindowTitle": "Manage Mods for {0} ({1})",
|
||||
"UpdateWindowTitle": "Title Update Manager",
|
||||
"CheatWindowHeading": "Cheats Available for {0} [{1}]",
|
||||
"BuildId": "BuildId:",
|
||||
|
@ -649,6 +650,9 @@
|
|||
"GraphicsAALabel": "Anti-Aliasing:",
|
||||
"GraphicsScalingFilterLabel": "Scaling Filter:",
|
||||
"GraphicsScalingFilterTooltip": "Choose the scaling filter that will be applied when using resolution scale.\n\nBilinear works well for 3D games and is a safe default option.\n\nNearest is recommended for pixel art games.\n\nFSR 1.0 is merely a sharpening filter, not recommended for use with FXAA or SMAA.\n\nThis option can be changed while a game is running by clicking \"Apply\" below; you can simply move the settings window aside and experiment until you find your preferred look for a game.\n\nLeave on BILINEAR if unsure.",
|
||||
"GraphicsScalingFilterBilinear": "Bilinear",
|
||||
"GraphicsScalingFilterNearest": "Nearest",
|
||||
"GraphicsScalingFilterFsr": "FSR",
|
||||
"GraphicsScalingFilterLevelLabel": "Level",
|
||||
"GraphicsScalingFilterLevelTooltip": "Set FSR 1.0 sharpening level. Higher is sharper.",
|
||||
"SmaaLow": "SMAA Low",
|
||||
|
@ -665,5 +669,7 @@
|
|||
"AboutChangelogButtonTooltipMessage": "Click to open the changelog for this version in your default browser.",
|
||||
"SettingsTabNetworkMultiplayer": "Multiplayer",
|
||||
"MultiplayerMode": "Mode:",
|
||||
"MultiplayerModeTooltip": "Change LDN multiplayer mode.\n\nLdnMitm will modify local wireless/local play functionality in games to function as if it were LAN, allowing for local, same-network connections with other Ryujinx instances and hacked Nintendo Switch consoles that have the ldn_mitm module installed.\n\nMultiplayer requires all players to be on the same game version (i.e. Super Smash Bros. Ultimate v13.0.1 can't connect to v13.0.0).\n\nLeave DISABLED if unsure."
|
||||
"MultiplayerModeTooltip": "Change LDN multiplayer mode.\n\nLdnMitm will modify local wireless/local play functionality in games to function as if it were LAN, allowing for local, same-network connections with other Ryujinx instances and hacked Nintendo Switch consoles that have the ldn_mitm module installed.\n\nMultiplayer requires all players to be on the same game version (i.e. Super Smash Bros. Ultimate v13.0.1 can't connect to v13.0.0).\n\nLeave DISABLED if unsure.",
|
||||
"MultiplayerModeDisabled": "Disabled",
|
||||
"MultiplayerModeLdnMitm": "ldn_mitm"
|
||||
}
|
||||
|
|
|
@ -30,7 +30,7 @@
|
|||
"MenuBarToolsManageFileTypes": "Administrar tipos de archivo",
|
||||
"MenuBarToolsInstallFileTypes": "Instalar tipos de archivo",
|
||||
"MenuBarToolsUninstallFileTypes": "Desinstalar tipos de archivo",
|
||||
"MenuBarHelp": "Ayuda",
|
||||
"MenuBarHelp": "_Ayuda",
|
||||
"MenuBarHelpCheckForUpdates": "Buscar actualizaciones",
|
||||
"MenuBarHelpAbout": "Acerca de",
|
||||
"MenuSearch": "Buscar...",
|
||||
|
@ -54,17 +54,15 @@
|
|||
"GameListContextMenuManageTitleUpdatesToolTip": "Abrir la ventana de gestión de actualizaciones de esta aplicación",
|
||||
"GameListContextMenuManageDlc": "Gestionar DLC",
|
||||
"GameListContextMenuManageDlcToolTip": "Abrir la ventana de gestión del DLC",
|
||||
"GameListContextMenuOpenModsDirectory": "Abrir carpeta de mods",
|
||||
"GameListContextMenuOpenModsDirectoryToolTip": "Abrir la carpeta que contiene los mods (archivos modificantes) de esta aplicación",
|
||||
"GameListContextMenuCacheManagement": "Gestión de caché ",
|
||||
"GameListContextMenuCacheManagementPurgePptc": "Reconstruir PPTC en cola",
|
||||
"GameListContextMenuCacheManagementPurgePptcToolTip": "Elimina la caché de PPTC de esta aplicación",
|
||||
"GameListContextMenuCacheManagementPurgeShaderCache": "Limpiar caché de sombras",
|
||||
"GameListContextMenuCacheManagementPurgeShaderCacheToolTip": "Eliminar la caché de sombras de esta aplicación",
|
||||
"GameListContextMenuCacheManagementPurgeShaderCache": "Limpiar caché de sombreadores",
|
||||
"GameListContextMenuCacheManagementPurgeShaderCacheToolTip": "Eliminar la caché de sombreadores de esta aplicación",
|
||||
"GameListContextMenuCacheManagementOpenPptcDirectory": "Abrir carpeta de PPTC",
|
||||
"GameListContextMenuCacheManagementOpenPptcDirectoryToolTip": "Abrir la carpeta que contiene la caché de PPTC de esta aplicación",
|
||||
"GameListContextMenuCacheManagementOpenShaderCacheDirectory": "Abrir carpeta de caché de sombras",
|
||||
"GameListContextMenuCacheManagementOpenShaderCacheDirectoryToolTip": "Abrir la carpeta que contiene la caché de sombras de esta aplicación",
|
||||
"GameListContextMenuCacheManagementOpenShaderCacheDirectory": "Abrir carpeta de caché de sombreadores",
|
||||
"GameListContextMenuCacheManagementOpenShaderCacheDirectoryToolTip": "Abrir la carpeta que contiene la caché de sombreadores de esta aplicación",
|
||||
"GameListContextMenuExtractData": "Extraer datos",
|
||||
"GameListContextMenuExtractDataExeFS": "ExeFS",
|
||||
"GameListContextMenuExtractDataExeFSToolTip": "Extraer la sección ExeFS de la configuración actual de la aplicación (incluyendo actualizaciones)",
|
||||
|
@ -72,6 +70,13 @@
|
|||
"GameListContextMenuExtractDataRomFSToolTip": "Extraer la sección RomFS de la configuración actual de la aplicación (incluyendo actualizaciones)",
|
||||
"GameListContextMenuExtractDataLogo": "Logotipo",
|
||||
"GameListContextMenuExtractDataLogoToolTip": "Extraer la sección Logo de la configuración actual de la aplicación (incluyendo actualizaciones)",
|
||||
"GameListContextMenuCreateShortcut": "Crear acceso directo de aplicación",
|
||||
"GameListContextMenuCreateShortcutToolTip": "Crear un acceso directo en el escritorio que lance la aplicación seleccionada",
|
||||
"GameListContextMenuCreateShortcutToolTipMacOS": "Crea un acceso directo en la carpeta de Aplicaciones de macOS que inicie la Aplicación seleccionada",
|
||||
"GameListContextMenuOpenModsDirectory": "Abrir Directorio de Mods",
|
||||
"GameListContextMenuOpenModsDirectoryToolTip": "Abre el directorio que contiene los Mods de la Aplicación.",
|
||||
"GameListContextMenuOpenSdModsDirectory": "Abrir Directorio de Mods de Atmosphere\n\n\n\n\n\n",
|
||||
"GameListContextMenuOpenSdModsDirectoryToolTip": "Abre el directorio alternativo de la tarjeta SD de Atmosphere que contiene los Mods de la Aplicación. Útil para los mods que están empaquetados para el hardware real.",
|
||||
"StatusBarGamesLoaded": "{0}/{1} juegos cargados",
|
||||
"StatusBarSystemVersion": "Versión del sistema: {0}",
|
||||
"LinuxVmMaxMapCountDialogTitle": "Límite inferior para mapeos de memoria detectado",
|
||||
|
@ -138,7 +143,7 @@
|
|||
"SettingsTabSystemIgnoreMissingServices": "Ignorar servicios no implementados",
|
||||
"SettingsTabGraphics": "Gráficos",
|
||||
"SettingsTabGraphicsAPI": "API de gráficos",
|
||||
"SettingsTabGraphicsEnableShaderCache": "Habilitar caché de sombras",
|
||||
"SettingsTabGraphicsEnableShaderCache": "Habilitar caché de sombreadores",
|
||||
"SettingsTabGraphicsAnisotropicFiltering": "Filtro anisotrópico:",
|
||||
"SettingsTabGraphicsAnisotropicFilteringAuto": "Automático",
|
||||
"SettingsTabGraphicsAnisotropicFiltering2x": "x2",
|
||||
|
@ -150,7 +155,7 @@
|
|||
"SettingsTabGraphicsResolutionScaleNative": "Nativa (720p/1080p)",
|
||||
"SettingsTabGraphicsResolutionScale2x": "x2 (1440p/2160p)",
|
||||
"SettingsTabGraphicsResolutionScale3x": "x3 (2160p/3240p)",
|
||||
"SettingsTabGraphicsResolutionScale4x": "x4 (2880p/4320p)",
|
||||
"SettingsTabGraphicsResolutionScale4x": "4x (2880p/4320p) (Not recommended)",
|
||||
"SettingsTabGraphicsAspectRatio": "Relación de aspecto:",
|
||||
"SettingsTabGraphicsAspectRatio4x3": "4:3",
|
||||
"SettingsTabGraphicsAspectRatio16x9": "16:9",
|
||||
|
@ -159,7 +164,7 @@
|
|||
"SettingsTabGraphicsAspectRatio32x9": "32:9",
|
||||
"SettingsTabGraphicsAspectRatioStretch": "Estirar a la ventana",
|
||||
"SettingsTabGraphicsDeveloperOptions": "Opciones de desarrollador",
|
||||
"SettingsTabGraphicsShaderDumpPath": "Directorio de volcado de sombras:",
|
||||
"SettingsTabGraphicsShaderDumpPath": "Directorio de volcado de sombreadores:",
|
||||
"SettingsTabLogging": "Registros",
|
||||
"SettingsTabLoggingLogging": "Registros",
|
||||
"SettingsTabLoggingEnableLoggingToFile": "Habilitar registro a archivo",
|
||||
|
@ -292,13 +297,9 @@
|
|||
"GameListContextMenuRunApplication": "Ejecutar aplicación",
|
||||
"GameListContextMenuToggleFavorite": "Marcar favorito",
|
||||
"GameListContextMenuToggleFavoriteToolTip": "Marca o desmarca el juego como favorito",
|
||||
"SettingsTabGeneralTheme": "Tema",
|
||||
"SettingsTabGeneralThemeCustomTheme": "Directorio de tema personalizado",
|
||||
"SettingsTabGeneralThemeBaseStyle": "Estilo base",
|
||||
"SettingsTabGeneralThemeBaseStyleDark": "Oscuro",
|
||||
"SettingsTabGeneralThemeBaseStyleLight": "Claro",
|
||||
"SettingsTabGeneralThemeEnableCustomTheme": "Habilitar tema personalizado",
|
||||
"ButtonBrowse": "Buscar",
|
||||
"SettingsTabGeneralTheme": "Tema:",
|
||||
"SettingsTabGeneralThemeDark": "Oscuro",
|
||||
"SettingsTabGeneralThemeLight": "Claro",
|
||||
"ControllerSettingsConfigureGeneral": "Configurar",
|
||||
"ControllerSettingsRumble": "Vibración",
|
||||
"ControllerSettingsRumbleStrongMultiplier": "Multiplicador de vibraciones fuertes",
|
||||
|
@ -332,8 +333,6 @@
|
|||
"DialogUpdaterAddingFilesMessage": "Aplicando actualización...",
|
||||
"DialogUpdaterCompleteMessage": "¡Actualización completa!",
|
||||
"DialogUpdaterRestartMessage": "¿Quieres reiniciar Ryujinx?",
|
||||
"DialogUpdaterArchNotSupportedMessage": "¡Tu arquitectura de sistema no es compatible!",
|
||||
"DialogUpdaterArchNotSupportedSubMessage": "(¡Solo son compatibles los sistemas x64!)",
|
||||
"DialogUpdaterNoInternetMessage": "¡No estás conectado a internet!",
|
||||
"DialogUpdaterNoInternetSubMessage": "¡Por favor, verifica que tu conexión a Internet funciona!",
|
||||
"DialogUpdaterDirtyBuildMessage": "¡No puedes actualizar una versión \"dirty\" de Ryujinx!",
|
||||
|
@ -342,7 +341,7 @@
|
|||
"DialogThemeRestartMessage": "Tema guardado. Se necesita reiniciar para aplicar el tema.",
|
||||
"DialogThemeRestartSubMessage": "¿Quieres reiniciar?",
|
||||
"DialogFirmwareInstallEmbeddedMessage": "¿Quieres instalar el firmware incluido en este juego? (Firmware versión {0})",
|
||||
"DialogFirmwareInstallEmbeddedSuccessMessage": "No se encontró firmware instalado pero Ryujinx pudo instalar el firmware {0} a partir de este juego.\nA continuación, se iniciará el emulador.",
|
||||
"DialogFirmwareInstallEmbeddedSuccessMessage": "No installed firmware was found but Ryujinx was able to install firmware {0} from the provided game.\nThe emulator will now start.",
|
||||
"DialogFirmwareNoFirmwareInstalledMessage": "No hay firmware instalado",
|
||||
"DialogFirmwareInstalledMessage": "Se instaló el firmware {0}",
|
||||
"DialogInstallFileTypesSuccessMessage": "¡Tipos de archivos instalados con éxito!",
|
||||
|
@ -385,17 +384,22 @@
|
|||
"DialogUserProfileUnsavedChangesSubMessage": "¿Quieres descartar los cambios realizados?",
|
||||
"DialogControllerSettingsModifiedConfirmMessage": "Se ha actualizado la configuración del mando actual.",
|
||||
"DialogControllerSettingsModifiedConfirmSubMessage": "¿Guardar cambios?",
|
||||
"DialogLoadNcaErrorMessage": "{0}. Archivo con error: {1}",
|
||||
"DialogLoadFileErrorMessage": "{0}. Archivo con error: {1}",
|
||||
"DialogModAlreadyExistsMessage": "El mod ya existe",
|
||||
"DialogModInvalidMessage": "¡El directorio especificado no contiene un mod!",
|
||||
"DialogModDeleteNoParentMessage": "Error al eliminar: ¡No se pudo encontrar el directorio principal para el mod \"{0}\"!",
|
||||
"DialogDlcNoDlcErrorMessage": "¡Ese archivo no contiene contenido descargable para el título seleccionado!",
|
||||
"DialogPerformanceCheckLoggingEnabledMessage": "Has habilitado los registros debug, diseñados solo para uso de los desarrolladores.",
|
||||
"DialogPerformanceCheckLoggingEnabledConfirmMessage": "Para un rendimiento óptimo, se recomienda deshabilitar los registros debug. ¿Quieres deshabilitarlos ahora?",
|
||||
"DialogPerformanceCheckShaderDumpEnabledMessage": "Has habilitado el volcado de sombras, diseñado solo para uso de los desarrolladores.",
|
||||
"DialogPerformanceCheckShaderDumpEnabledConfirmMessage": "Para un rendimiento óptimo, se recomienda deshabilitar el volcado de sombraa. ¿Quieres deshabilitarlo ahora?",
|
||||
"DialogPerformanceCheckShaderDumpEnabledMessage": "Has habilitado el volcado de sombreadores, diseñado solo para uso de los desarrolladores.",
|
||||
"DialogPerformanceCheckShaderDumpEnabledConfirmMessage": "Para un rendimiento óptimo, se recomienda deshabilitar el volcado de sombreadores. ¿Quieres deshabilitarlo ahora?",
|
||||
"DialogLoadAppGameAlreadyLoadedMessage": "Ya has cargado un 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!",
|
||||
"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?",
|
||||
"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",
|
||||
"SettingsTabGraphicsBackendMultithreading": "Multihilado del motor gráfico:",
|
||||
"CommonAuto": "Automático",
|
||||
|
@ -430,6 +434,7 @@
|
|||
"DlcManagerRemoveAllButton": "Quitar todo",
|
||||
"DlcManagerEnableAllButton": "Activar todas",
|
||||
"DlcManagerDisableAllButton": "Desactivar todos",
|
||||
"ModManagerDeleteAllButton": "Eliminar Todo",
|
||||
"MenuBarOptionsChangeLanguage": "Cambiar idioma",
|
||||
"MenuBarShowFileTypes": "Mostrar tipos de archivo",
|
||||
"CommonSort": "Orden",
|
||||
|
@ -447,13 +452,13 @@
|
|||
"CustomThemePathTooltip": "Carpeta que contiene los temas personalizados para la interfaz",
|
||||
"CustomThemeBrowseTooltip": "Busca un tema personalizado para la interfaz",
|
||||
"DockModeToggleTooltip": "El modo dock o modo TV hace que la consola emulada se comporte como una Nintendo Switch en su dock. Esto mejora la calidad gráfica en la mayoría de los juegos. Del mismo modo, si lo desactivas, el sistema emulado se comportará como una Nintendo Switch en modo portátil, reduciendo la cálidad de los gráficos.\n\nConfigura los controles de \"Jugador\" 1 si planeas jugar en modo dock/TV; configura los controles de \"Portátil\" si planeas jugar en modo portátil.\n\nActívalo si no sabes qué hacer.",
|
||||
"DirectKeyboardTooltip": "Activa o desactiva \"soporte para acceso directo al teclado (HID)\" (Permite a los juegos utilizar tu teclado como entrada de texto)",
|
||||
"DirectMouseTooltip": "Activa o desactiva \"soporte para acceso directo al ratón (HID)\" (Permite a los juegos utilizar tu ratón como cursor)",
|
||||
"DirectKeyboardTooltip": "Direct keyboard access (HID) support. Provides games access to your keyboard as a text entry device.\n\nOnly works with games that natively support keyboard usage on Switch hardware.\n\nLeave OFF if unsure.",
|
||||
"DirectMouseTooltip": "Direct mouse access (HID) support. Provides games access to your mouse as a pointing device.\n\nOnly works with games that natively support mouse controls on Switch hardware, which are few and far between.\n\nWhen enabled, touch screen functionality may not work.\n\nLeave OFF if unsure.",
|
||||
"RegionTooltip": "Cambia la región del sistema",
|
||||
"LanguageTooltip": "Cambia el idioma del sistema",
|
||||
"TimezoneTooltip": "Cambia la zona horaria del sistema",
|
||||
"TimeTooltip": "Cambia la hora del sistema",
|
||||
"VSyncToggleTooltip": "Sincronización vertical del sistema emulado. A efectos prácticos es un límite de fotogramas para la mayoría de juegos; deshabilitarlo puede hacer que los juegos se aceleren o que las pantallas de carga tarden más o se atasquen.\n\nPuedes activar y desactivar esto mientras el emulador está funcionando con un atajo de teclado a tu elección. Recomendamos hacer esto en vez de deshabilitarlo.\n\nActívalo si no sabes qué hacer.",
|
||||
"VSyncToggleTooltip": "Emulated console's Vertical Sync. Essentially a frame-limiter for the majority of games; disabling it may cause games to run at higher speed or make loading screens take longer or get stuck.\n\nCan be toggled in-game with a hotkey of your preference (F1 by default). We recommend doing this if you plan on disabling it.\n\nLeave ON if unsure.",
|
||||
"PptcToggleTooltip": "Guarda funciones de JIT traducidas para que no sea necesario traducirlas cada vez que el juego carga.\n\nReduce los tirones y acelera significativamente el tiempo de inicio de los juegos después de haberlos ejecutado al menos una vez.\n\nActívalo si no sabes qué hacer.",
|
||||
"FsIntegrityToggleTooltip": "Comprueba si hay archivos corruptos en los juegos que ejecutes al abrirlos, y si detecta archivos corruptos, muestra un error de Hash en los registros.\n\nEsto no tiene impacto alguno en el rendimiento y está pensado para ayudar a resolver problemas.\n\nActívalo si no sabes qué hacer.",
|
||||
"AudioBackendTooltip": "Cambia el motor usado para renderizar audio.\n\nSDL2 es el preferido, mientras que OpenAL y SoundIO se usan si hay problemas con este. Dummy no produce audio.\n\nSelecciona SDL2 si no sabes qué hacer.",
|
||||
|
@ -464,13 +469,13 @@
|
|||
"UseHypervisorTooltip": "Usar Hypervisor en lugar de JIT. Mejora enormemente el rendimiento cuando está disponible, pero puede ser inestable en su estado actual.",
|
||||
"DRamTooltip": "Expande la memoria DRAM del sistema emulado de 4GiB a 6GiB.\n\nUtilizar solo con packs de texturas HD o mods de resolución 4K. NO mejora el rendimiento.\n\nDesactívalo si no sabes qué hacer.",
|
||||
"IgnoreMissingServicesTooltip": "Hack para ignorar servicios no implementados del Horizon OS. Esto puede ayudar a sobrepasar crasheos cuando inicies ciertos juegos.\n\nDesactívalo si no sabes qué hacer.",
|
||||
"GraphicsBackendThreadingTooltip": "Ejecuta los comandos del motor gráfico en un segundo hilo. Acelera la compilación de sombreadores, reduce los tirones, y mejora el rendimiento en controladores gráficos que no realicen su propio multihilado. Rendimiento máximo ligeramente superior en controladores gráficos que soporten multihilado.\n\nSelecciona \"Auto\" si no sabes qué hacer.",
|
||||
"GalThreadingTooltip": "Ejecuta los comandos del motor gráfico en un segundo hilo. Acelera la compilación de sombreadores, reduce los tirones, y mejora el rendimiento en controladores gráficos que no realicen su propio multihilado. Rendimiento máximo ligeramente superior en controladores gráficos que soporten multihilado.\n\nSelecciona \"Auto\" si no sabes qué hacer.",
|
||||
"GraphicsBackendThreadingTooltip": "Ejecuta los comandos del motor gráfico en un segundo hilo. Acelera la compilación de sombreadores, reduce los tirones, y mejora el rendimiento en controladores gráficos que no realicen su propio procesamiento con múltiples hilos. Rendimiento ligeramente superior en controladores gráficos que soporten múltiples hilos.\n\nSelecciona \"Auto\" si no sabes qué hacer.",
|
||||
"GalThreadingTooltip": "Ejecuta los comandos del motor gráfico en un segundo hilo. Acelera la compilación de sombreadores, reduce los tirones, y mejora el rendimiento en controladores gráficos que no realicen su propio procesamiento con múltiples hilos. Rendimiento ligeramente superior en controladores gráficos que soporten múltiples hilos.\n\nSelecciona \"Auto\" si no sabes qué hacer.",
|
||||
"ShaderCacheToggleTooltip": "Guarda una caché de sombreadores en disco, la cual reduce los tirones a medida que vas jugando.\n\nActívalo si no sabes qué hacer.",
|
||||
"ResolutionScaleTooltip": "Escala de resolución aplicada a objetivos aplicables en el renderizado",
|
||||
"ResolutionScaleTooltip": "Multiplies the game's rendering resolution.\n\nA few games may not work with this and look pixelated even when the resolution is increased; for those games, you may need to find mods that remove anti-aliasing or that increase their internal rendering resolution. For using the latter, you'll likely want to select Native.\n\nThis option can be changed while a game is running by clicking \"Apply\" below; you can simply move the settings window aside and experiment until you find your preferred look for a game.\n\nKeep in mind 4x is overkill for virtually any setup.",
|
||||
"ResolutionScaleEntryTooltip": "Escalado de resolución de coma flotante, como por ejemplo 1,5. Los valores no íntegros pueden causar errores gráficos o crashes.",
|
||||
"AnisotropyTooltip": "Nivel de filtrado anisotrópico (selecciona Auto para utilizar el valor solicitado por el juego)",
|
||||
"AspectRatioTooltip": "Relación de aspecto aplicada a la ventana de renderizado.",
|
||||
"AnisotropyTooltip": "Level of Anisotropic Filtering. Set to Auto to use the value requested by the game.",
|
||||
"AspectRatioTooltip": "Aspect Ratio applied to the renderer window.\n\nOnly change this if you're using an aspect ratio mod for your game, otherwise the graphics will be stretched.\n\nLeave on 16:9 if unsure.",
|
||||
"ShaderDumpPathTooltip": "Directorio en el cual se volcarán los sombreadores de los gráficos",
|
||||
"FileLogTooltip": "Guarda los registros de la consola en archivos en disco. No afectan al rendimiento.",
|
||||
"StubLogTooltip": "Escribe mensajes de Stub en la consola. No afectan al rendimiento.",
|
||||
|
@ -504,6 +509,8 @@
|
|||
"EnableInternetAccessTooltip": "Permite a la aplicación emulada conectarse a Internet.\n\nLos juegos que tengan modo LAN podrán conectarse entre sí habilitando esta opción y estando conectados al mismo módem. Asimismo, esto permite conexiones con consolas reales.\n\nNO permite conectar con los servidores de Nintendo Online. Puede causar que ciertos juegos crasheen al intentar conectarse a sus servidores.\n\nDesactívalo si no estás seguro.",
|
||||
"GameListContextMenuManageCheatToolTip": "Activa o desactiva los cheats",
|
||||
"GameListContextMenuManageCheat": "Administrar cheats",
|
||||
"GameListContextMenuManageModToolTip": "Gestionar Mods",
|
||||
"GameListContextMenuManageMod": "Gestionar Mods",
|
||||
"ControllerSettingsStickRange": "Alcance:",
|
||||
"DialogStopEmulationTitle": "Ryujinx - Detener emulación",
|
||||
"DialogStopEmulationMessage": "¿Seguro que quieres detener la emulación actual?",
|
||||
|
@ -515,13 +522,11 @@
|
|||
"SettingsTabCpuMemory": "Memoria de CPU",
|
||||
"DialogUpdaterFlatpakNotSupportedMessage": "Por favor, actualiza Ryujinx a través de FlatHub.",
|
||||
"UpdaterDisabledWarningTitle": "¡Actualizador deshabilitado!",
|
||||
"GameListContextMenuOpenSdModsDirectory": "Abrir carpeta de mods Atmosphere",
|
||||
"GameListContextMenuOpenSdModsDirectoryToolTip": "Abre la carpeta alternativa de mods en la que puedes insertar mods de Atmosphere. Útil para mods que vengan organizados para uso en consola.",
|
||||
"ControllerSettingsRotate90": "Rotar 90° en el sentido de las agujas del reloj",
|
||||
"IconSize": "Tamaño de iconos",
|
||||
"IconSizeTooltip": "Cambia el tamaño de los iconos de juegos",
|
||||
"MenuBarOptionsShowConsole": "Mostrar consola",
|
||||
"ShaderCachePurgeError": "Error al eliminar la caché en {0}: {1}",
|
||||
"ShaderCachePurgeError": "Error al eliminar la caché de sombreadores en {0}: {1}",
|
||||
"UserErrorNoKeys": "No se encontraron keys",
|
||||
"UserErrorNoFirmware": "No se encontró firmware",
|
||||
"UserErrorFirmwareParsingFailed": "Error al analizar el firmware",
|
||||
|
@ -544,12 +549,13 @@
|
|||
"SwkbdMinCharacters": "Debe tener al menos {0} caracteres",
|
||||
"SwkbdMinRangeCharacters": "Debe tener {0}-{1} caracteres",
|
||||
"SoftwareKeyboard": "Teclado de software",
|
||||
"SoftwareKeyboardModeNumbersOnly": "Solo deben ser números",
|
||||
"SoftwareKeyboardModeNumeric": "Debe ser sólo 0-9 o '.'",
|
||||
"SoftwareKeyboardModeAlphabet": "Solo deben ser caracteres no CJK",
|
||||
"SoftwareKeyboardModeASCII": "Solo deben ser texto ASCII",
|
||||
"DialogControllerAppletMessagePlayerRange": "La aplicación require {0} jugador(es) con:\n\nTYPES: {1}\n\nPLAYERS: {2}\n\n{3}Por favor abre las opciones y reconfigura los dispositivos de entrada o presiona 'Cerrar'.",
|
||||
"DialogControllerAppletMessage": "La aplicación require exactamente {0} jugador(es) con:\n\nTYPES: {1}\n\nPLAYERS: {2}\n\n{3}Por favor abre las opciones y reconfigura los dispositivos de entrada o presiona 'Cerrar'.",
|
||||
"DialogControllerAppletDockModeSet": "Modo dock/TV activo. El control portátil también es inválido.\n\n",
|
||||
"ControllerAppletControllers": "Controladores Compatibles:",
|
||||
"ControllerAppletPlayers": "Jugadores:",
|
||||
"ControllerAppletDescription": "Tu configuración actual no es válida. Abre la configuración y vuelve a configurar tus entradas",
|
||||
"ControllerAppletDocked": "Modo acoplado activado. El modo portátil debería estar desactivado.",
|
||||
"UpdaterRenaming": "Renombrando archivos viejos...",
|
||||
"UpdaterRenameFailed": "El actualizador no pudo renombrar el archivo: {0}",
|
||||
"UpdaterAddingFiles": "Añadiendo nuevos archivos...",
|
||||
|
@ -587,6 +593,7 @@
|
|||
"Writable": "Escribible",
|
||||
"SelectDlcDialogTitle": "Selecciona archivo(s) de DLC",
|
||||
"SelectUpdateDialogTitle": "Selecciona archivo(s) de actualización",
|
||||
"SelectModDialogTitle": "Seleccionar un directorio de Mods",
|
||||
"UserProfileWindowTitle": "Administrar perfiles de usuario",
|
||||
"CheatWindowTitle": "Administrar cheats",
|
||||
"DlcWindowTitle": "Administrar contenido descargable",
|
||||
|
@ -594,10 +601,12 @@
|
|||
"CheatWindowHeading": "Cheats disponibles para {0} [{1}]",
|
||||
"BuildId": "Id de compilación:",
|
||||
"DlcWindowHeading": "Contenido descargable disponible para {0} [{1}]",
|
||||
"ModWindowHeading": "{0} Mod(s)",
|
||||
"UserProfilesEditProfile": "Editar selección",
|
||||
"Cancel": "Cancelar",
|
||||
"Save": "Guardar",
|
||||
"Discard": "Descartar",
|
||||
"Paused": "Pausado",
|
||||
"UserProfilesSetProfileImage": "Elegir Imagen de Perfil ",
|
||||
"UserProfileEmptyNameError": "El nombre es obligatorio",
|
||||
"UserProfileNoImageError": "Debe establecerse la imagen de perfil",
|
||||
|
@ -607,9 +616,9 @@
|
|||
"UserProfilesName": "Nombre:",
|
||||
"UserProfilesUserId": "Id de Usuario:",
|
||||
"SettingsTabGraphicsBackend": "Fondo de gráficos",
|
||||
"SettingsTabGraphicsBackendTooltip": "Back-end de los gráficos a utilizar",
|
||||
"SettingsTabGraphicsBackendTooltip": "Select the graphics backend that will be used in the emulator.\n\nVulkan is overall better for all modern graphics cards, as long as their drivers are up to date. Vulkan also features faster shader compilation (less stuttering) on all GPU vendors.\n\nOpenGL may achieve better results on old Nvidia GPUs, on old AMD GPUs on Linux, or on GPUs with lower VRAM, though shader compilation stutters will be greater.\n\nSet to Vulkan if unsure. Set to OpenGL if your GPU does not support Vulkan even with the latest graphics drivers.",
|
||||
"SettingsEnableTextureRecompression": "Activar recompresión de texturas",
|
||||
"SettingsEnableTextureRecompressionTooltip": "Comprime ciertas texturas para reducir el uso de la VRAM.\n\nRecomendado para GPUs que tienen menos de 4 GB de VRAM.\n\nMantén esta opción desactivada si no estás seguro.",
|
||||
"SettingsEnableTextureRecompressionTooltip": "Compresses ASTC textures in order to reduce VRAM usage.\n\nGames using this texture format include Astral Chain, Bayonetta 3, Fire Emblem Engage, Metroid Prime Remastered, Super Mario Bros. Wonder and The Legend of Zelda: Tears of the Kingdom.\n\nGraphics cards with 4GiB VRAM or less will likely crash at some point while running these games.\n\nEnable only if you're running out of VRAM on the aforementioned games. Leave OFF if unsure.",
|
||||
"SettingsTabGraphicsPreferredGpu": "GPU preferida",
|
||||
"SettingsTabGraphicsPreferredGpuTooltip": "Selecciona la tarjeta gráfica que se utilizará con los back-end de gráficos Vulkan.\n\nNo afecta la GPU que utilizará OpenGL.\n\nFije a la GPU marcada como \"dGUP\" ante dudas. Si no hay una, no haga modificaciones.",
|
||||
"SettingsAppRequiredRestartMessage": "Reinicio de Ryujinx requerido.",
|
||||
|
@ -635,12 +644,15 @@
|
|||
"Recover": "Recuperar",
|
||||
"UserProfilesRecoverHeading": "Datos de guardado fueron encontrados para las siguientes cuentas",
|
||||
"UserProfilesRecoverEmptyList": "No hay perfiles a recuperar",
|
||||
"GraphicsAATooltip": "Aplica el suavizado de bordes al procesamiento del juego",
|
||||
"GraphicsAATooltip": "Applies anti-aliasing to the game render.\n\nFXAA will blur most of the image, while SMAA will attempt to find jagged edges and smooth them out.\n\nNot recommended to use in conjunction with the FSR scaling filter.\n\nThis option can be changed while a game is running by clicking \"Apply\" below; you can simply move the settings window aside and experiment until you find your preferred look for a game.\n\nLeave on NONE if unsure.",
|
||||
"GraphicsAALabel": "Suavizado de bordes:",
|
||||
"GraphicsScalingFilterLabel": "Filtro de escalado:",
|
||||
"GraphicsScalingFilterTooltip": "Activa el escalado de búfer de fotogramas",
|
||||
"GraphicsScalingFilterTooltip": "Choose the scaling filter that will be applied when using resolution scale.\n\nBilinear works well for 3D games and is a safe default option.\n\nNearest is recommended for pixel art games.\n\nFSR 1.0 is merely a sharpening filter, not recommended for use with FXAA or SMAA.\n\nThis option can be changed while a game is running by clicking \"Apply\" below; you can simply move the settings window aside and experiment until you find your preferred look for a game.\n\nLeave on BILINEAR if unsure.",
|
||||
"GraphicsScalingFilterBilinear": "Bilinear",
|
||||
"GraphicsScalingFilterNearest": "Nearest",
|
||||
"GraphicsScalingFilterFsr": "FSR",
|
||||
"GraphicsScalingFilterLevelLabel": "Nivel",
|
||||
"GraphicsScalingFilterLevelTooltip": "Establecer nivel del filtro de escalado",
|
||||
"GraphicsScalingFilterLevelTooltip": "Set FSR 1.0 sharpening level. Higher is sharper.",
|
||||
"SmaaLow": "SMAA Bajo",
|
||||
"SmaaMedium": "SMAA Medio",
|
||||
"SmaaHigh": "SMAA Alto",
|
||||
|
@ -648,9 +660,14 @@
|
|||
"UserEditorTitle": "Editar usuario",
|
||||
"UserEditorTitleCreate": "Crear Usuario",
|
||||
"SettingsTabNetworkInterface": "Interfaz de Red",
|
||||
"NetworkInterfaceTooltip": "Interfaz de red usada para las características LAN",
|
||||
"NetworkInterfaceTooltip": "The network interface used for LAN/LDN features.\n\nIn conjunction with a VPN or XLink Kai and a game with LAN support, can be used to spoof a same-network connection over the Internet.\n\nLeave on DEFAULT if unsure.",
|
||||
"NetworkInterfaceDefault": "Predeterminado",
|
||||
"PackagingShaders": "Empaquetando sombreadores",
|
||||
"AboutChangelogButton": "Ver registro de cambios en GitHub",
|
||||
"AboutChangelogButtonTooltipMessage": "Haga clic para abrir el registro de cambios para esta versión en su navegador predeterminado."
|
||||
}
|
||||
"AboutChangelogButtonTooltipMessage": "Haga clic para abrir el registro de cambios para esta versión en su navegador predeterminado.",
|
||||
"SettingsTabNetworkMultiplayer": "Multijugador",
|
||||
"MultiplayerMode": "Modo:",
|
||||
"MultiplayerModeTooltip": "Change LDN multiplayer mode.\n\nLdnMitm will modify local wireless/local play functionality in games to function as if it were LAN, allowing for local, same-network connections with other Ryujinx instances and hacked Nintendo Switch consoles that have the ldn_mitm module installed.\n\nMultiplayer requires all players to be on the same game version (i.e. Super Smash Bros. Ultimate v13.0.1 can't connect to v13.0.0).\n\nLeave DISABLED if unsure.",
|
||||
"MultiplayerModeDisabled": "Disabled",
|
||||
"MultiplayerModeLdnMitm": "ldn_mitm"
|
||||
}
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
{
|
||||
"Language": "Français",
|
||||
"MenuBarFileOpenApplet": "Ouvrir Applet",
|
||||
"MenuBarFileOpenAppletOpenMiiAppletToolTip": "Ouvrir l'Éditeur Applet Mii en mode autonome",
|
||||
"MenuBarFileOpenApplet": "Ouvrir un applet",
|
||||
"MenuBarFileOpenAppletOpenMiiAppletToolTip": "Ouvrir l'Applet Mii Editor en mode Standalone",
|
||||
"SettingsTabInputDirectMouseAccess": "Accès direct à la souris",
|
||||
"SettingsTabSystemMemoryManagerMode": "Mode de gestion de la mémoire :",
|
||||
"SettingsTabSystemMemoryManagerModeSoftware": "Logiciel",
|
||||
|
@ -14,9 +14,9 @@
|
|||
"MenuBarFileOpenEmuFolder": "Ouvrir le dossier Ryujinx",
|
||||
"MenuBarFileOpenLogsFolder": "Ouvrir le dossier des journaux",
|
||||
"MenuBarFileExit": "_Quitter",
|
||||
"MenuBarOptions": "Options",
|
||||
"MenuBarOptions": "_Options",
|
||||
"MenuBarOptionsToggleFullscreen": "Basculer en plein écran",
|
||||
"MenuBarOptionsStartGamesInFullscreen": "Démarrer jeux en plein écran",
|
||||
"MenuBarOptionsStartGamesInFullscreen": "Démarrer le jeu en plein écran",
|
||||
"MenuBarOptionsStopEmulation": "Arrêter l'émulation",
|
||||
"MenuBarOptionsSettings": "_Paramètres",
|
||||
"MenuBarOptionsManageUserProfiles": "_Gérer les profils d'utilisateurs",
|
||||
|
@ -30,9 +30,9 @@
|
|||
"MenuBarToolsManageFileTypes": "Gérer les types de fichiers",
|
||||
"MenuBarToolsInstallFileTypes": "Installer les types de fichiers",
|
||||
"MenuBarToolsUninstallFileTypes": "Désinstaller les types de fichiers",
|
||||
"MenuBarHelp": "Aide",
|
||||
"MenuBarHelp": "_Aide",
|
||||
"MenuBarHelpCheckForUpdates": "Vérifier les mises à jour",
|
||||
"MenuBarHelpAbout": "Á propos",
|
||||
"MenuBarHelpAbout": "À propos",
|
||||
"MenuSearch": "Rechercher...",
|
||||
"GameListHeaderFavorite": "Favoris",
|
||||
"GameListHeaderIcon": "Icône",
|
||||
|
@ -40,8 +40,8 @@
|
|||
"GameListHeaderDeveloper": "Développeur",
|
||||
"GameListHeaderVersion": "Version",
|
||||
"GameListHeaderTimePlayed": "Temps de jeu",
|
||||
"GameListHeaderLastPlayed": "jouer la dernière fois",
|
||||
"GameListHeaderFileExtension": "Fichier externe",
|
||||
"GameListHeaderLastPlayed": "Dernière partie jouée",
|
||||
"GameListHeaderFileExtension": "Extension du Fichier",
|
||||
"GameListHeaderFileSize": "Taille du Fichier",
|
||||
"GameListHeaderPath": "Chemin",
|
||||
"GameListContextMenuOpenUserSaveDirectory": "Ouvrir le dossier de sauvegarde utilisateur",
|
||||
|
@ -51,15 +51,13 @@
|
|||
"GameListContextMenuOpenBcatSaveDirectory": "Ouvrir le dossier de sauvegarde BCAT",
|
||||
"GameListContextMenuOpenBcatSaveDirectoryToolTip": "Ouvre le dossier contenant la sauvegarde BCAT du jeu",
|
||||
"GameListContextMenuManageTitleUpdates": "Gérer la mise à jour des titres",
|
||||
"GameListContextMenuManageTitleUpdatesToolTip": "Ouvre la fenêtre de gestion de la mise à jour des titres",
|
||||
"GameListContextMenuManageTitleUpdatesToolTip": "Ouvre la fenêtre de gestion des mises à jour du jeu",
|
||||
"GameListContextMenuManageDlc": "Gérer les DLC",
|
||||
"GameListContextMenuManageDlcToolTip": "Ouvre la fenêtre de gestion des DLC",
|
||||
"GameListContextMenuOpenModsDirectory": "Ouvrir le dossier des Mods",
|
||||
"GameListContextMenuOpenModsDirectoryToolTip": "Ouvre le dossier contenant les mods du jeu",
|
||||
"GameListContextMenuCacheManagement": "Gestion des caches",
|
||||
"GameListContextMenuCacheManagementPurgePptc": "Purger le PPTC",
|
||||
"GameListContextMenuCacheManagementPurgePptcToolTip": "Supprime le PPTC du jeu",
|
||||
"GameListContextMenuCacheManagementPurgeShaderCache": "Purger le cache des Shaders",
|
||||
"GameListContextMenuCacheManagementPurgePptc": "Reconstruction du PPTC",
|
||||
"GameListContextMenuCacheManagementPurgePptcToolTip": "Effectuer une reconstruction du PPTC au prochain démarrage du jeu",
|
||||
"GameListContextMenuCacheManagementPurgeShaderCache": "Purger le cache des shaders",
|
||||
"GameListContextMenuCacheManagementPurgeShaderCacheToolTip": "Supprime le cache des shaders du jeu",
|
||||
"GameListContextMenuCacheManagementOpenPptcDirectory": "Ouvrir le dossier du PPTC",
|
||||
"GameListContextMenuCacheManagementOpenPptcDirectoryToolTip": "Ouvre le dossier contenant le PPTC du jeu",
|
||||
|
@ -72,15 +70,22 @@
|
|||
"GameListContextMenuExtractDataRomFSToolTip": "Extrait la section RomFS du jeu (mise à jour incluse)",
|
||||
"GameListContextMenuExtractDataLogo": "Logo",
|
||||
"GameListContextMenuExtractDataLogoToolTip": "Extrait la section Logo du jeu (mise à jour incluse)",
|
||||
"GameListContextMenuCreateShortcut": "Créer un raccourci d'application",
|
||||
"GameListContextMenuCreateShortcutToolTip": "Créer un raccourci sur le bureau qui lance l'application sélectionnée",
|
||||
"GameListContextMenuCreateShortcutToolTipMacOS": "Créer un raccourci dans le dossier Applications de macOS qui lance l'application sélectionnée",
|
||||
"GameListContextMenuOpenModsDirectory": "Ouvrir le dossier des mods",
|
||||
"GameListContextMenuOpenModsDirectoryToolTip": "Ouvre le dossier contenant les mods de l'application",
|
||||
"GameListContextMenuOpenSdModsDirectory": "Ouvrir le dossier des mods Atmosphère",
|
||||
"GameListContextMenuOpenSdModsDirectoryToolTip": "Ouvre le dossier alternatif de la carte SD Atmosphère qui contient les mods de l'application. Utile pour les mods conçus pour du matériel réel.",
|
||||
"StatusBarGamesLoaded": "{0}/{1} Jeux chargés",
|
||||
"StatusBarSystemVersion": "Version du Firmware: {0}",
|
||||
"LinuxVmMaxMapCountDialogTitle": "Limite basse pour les mappages de mémoire détectés",
|
||||
"LinuxVmMaxMapCountDialogTitle": "Limite basse pour les mappings mémoire détectée",
|
||||
"LinuxVmMaxMapCountDialogTextPrimary": "Voulez-vous augmenter la valeur de vm.max_map_count à {0}",
|
||||
"LinuxVmMaxMapCountDialogTextSecondary": "Certains jeux peuvent essayer de créer plus de mappages de mémoire que ce qui est actuellement autorisé. Ryujinx plantera dès que cette limite sera dépassée.",
|
||||
"LinuxVmMaxMapCountDialogTextSecondary": "Certains jeux peuvent essayer de créer plus de mappings mémoire que ce qui est actuellement autorisé. Ryujinx plantera dès que cette limite sera dépassée.",
|
||||
"LinuxVmMaxMapCountDialogButtonUntilRestart": "Oui, jusqu'au prochain redémarrage",
|
||||
"LinuxVmMaxMapCountDialogButtonPersistent": "Oui, en permanence",
|
||||
"LinuxVmMaxMapCountWarningTextPrimary": "La quantité maximale de mappings mémoire est inférieure à la valeur recommandée.",
|
||||
"LinuxVmMaxMapCountWarningTextSecondary": "La valeur actuelle de vm.max_map_count ({0}) est inférieure à {1}. Certains jeux peuvent essayer de créer plus de mappings mémoire que ceux actuellement autorisés. Ryujinx s'écrasera dès que cette limite sera dépassée.\n\nVous pouvez soit augmenter manuellement la limite, soit installer pkexec, ce qui permet à Ryujinx de l'aider.",
|
||||
"LinuxVmMaxMapCountWarningTextSecondary": "La valeur actuelle de vm.max_map_count ({0}) est inférieure à {1}. Certains jeux peuvent essayer de créer plus de mappings mémoire que ceux actuellement autorisés. Ryujinx plantera dès que cette limite sera dépassée.\n\nVous pouvez soit augmenter manuellement la limite, soit installer pkexec, ce qui permet à Ryujinx de l'aider.",
|
||||
"Settings": "Paramètres",
|
||||
"SettingsTabGeneral": "Interface Utilisateur",
|
||||
"SettingsTabGeneralGeneral": "Général",
|
||||
|
@ -91,9 +96,9 @@
|
|||
"SettingsTabGeneralHideCursorNever": "Jamais",
|
||||
"SettingsTabGeneralHideCursorOnIdle": "Masquer le curseur si inactif",
|
||||
"SettingsTabGeneralHideCursorAlways": "Toujours",
|
||||
"SettingsTabGeneralGameDirectories": "Dossiers de Jeux",
|
||||
"SettingsTabGeneralGameDirectories": "Dossiers des jeux",
|
||||
"SettingsTabGeneralAdd": "Ajouter",
|
||||
"SettingsTabGeneralRemove": "Supprimer",
|
||||
"SettingsTabGeneralRemove": "Retirer",
|
||||
"SettingsTabSystem": "Système",
|
||||
"SettingsTabSystemCore": "Cœur",
|
||||
"SettingsTabSystemSystemRegion": "Région du système:",
|
||||
|
@ -124,19 +129,19 @@
|
|||
"SettingsTabSystemSystemLanguageTraditionalChinese": "Chinois traditionnel",
|
||||
"SettingsTabSystemSystemTimeZone": "Fuseau horaire du système :",
|
||||
"SettingsTabSystemSystemTime": "Heure du système:",
|
||||
"SettingsTabSystemEnableVsync": "Activer le VSync",
|
||||
"SettingsTabSystemEnableVsync": "Synchronisation verticale (VSync)",
|
||||
"SettingsTabSystemEnablePptc": "Activer le PPTC (Profiled Persistent Translation Cache)",
|
||||
"SettingsTabSystemEnableFsIntegrityChecks": "Activer la vérification de l'intégrité du système de fichiers",
|
||||
"SettingsTabSystemAudioBackend": "Back-end audio",
|
||||
"SettingsTabSystemAudioBackend": "Bibliothèque Audio :",
|
||||
"SettingsTabSystemAudioBackendDummy": "Factice",
|
||||
"SettingsTabSystemAudioBackendOpenAL": "OpenAL",
|
||||
"SettingsTabSystemAudioBackendSoundIO": "SoundIO",
|
||||
"SettingsTabSystemAudioBackendSDL2": "SDL2",
|
||||
"SettingsTabSystemHacks": "Hacks",
|
||||
"SettingsTabSystemHacksNote": " (Cela peut causer des instabilités)",
|
||||
"SettingsTabSystemHacksNote": "Cela peut causer des instabilités",
|
||||
"SettingsTabSystemExpandDramSize": "Utiliser disposition alternative de la mémoire (développeur)",
|
||||
"SettingsTabSystemIgnoreMissingServices": "Ignorer les services manquants",
|
||||
"SettingsTabGraphics": "Graphique",
|
||||
"SettingsTabGraphics": "Graphismes",
|
||||
"SettingsTabGraphicsAPI": "API Graphique",
|
||||
"SettingsTabGraphicsEnableShaderCache": "Activer le cache des shaders",
|
||||
"SettingsTabGraphicsAnisotropicFiltering": "Filtrage anisotrope:",
|
||||
|
@ -150,8 +155,8 @@
|
|||
"SettingsTabGraphicsResolutionScaleNative": "Natif (720p/1080p)",
|
||||
"SettingsTabGraphicsResolutionScale2x": "x2 (1440p/2160p)",
|
||||
"SettingsTabGraphicsResolutionScale3x": "x3 (2160p/3240p)",
|
||||
"SettingsTabGraphicsResolutionScale4x": "x4 (2880p/4320p)",
|
||||
"SettingsTabGraphicsAspectRatio": "Format :",
|
||||
"SettingsTabGraphicsResolutionScale4x": "4x (2880p/4320p) (Non recommandé)",
|
||||
"SettingsTabGraphicsAspectRatio": "Format d'affichage :",
|
||||
"SettingsTabGraphicsAspectRatio4x3": "4:3",
|
||||
"SettingsTabGraphicsAspectRatio16x9": "16:9",
|
||||
"SettingsTabGraphicsAspectRatio16x10": "16:10",
|
||||
|
@ -159,7 +164,7 @@
|
|||
"SettingsTabGraphicsAspectRatio32x9": "32:9",
|
||||
"SettingsTabGraphicsAspectRatioStretch": "Écran étiré",
|
||||
"SettingsTabGraphicsDeveloperOptions": "Options développeur",
|
||||
"SettingsTabGraphicsShaderDumpPath": "Chemin du dossier de dump des shaders:",
|
||||
"SettingsTabGraphicsShaderDumpPath": "Chemin du dossier de copie des shaders:",
|
||||
"SettingsTabLogging": "Journaux",
|
||||
"SettingsTabLoggingLogging": "Journaux",
|
||||
"SettingsTabLoggingEnableLoggingToFile": "Activer la sauvegarde des journaux vers un fichier",
|
||||
|
@ -169,9 +174,9 @@
|
|||
"SettingsTabLoggingEnableErrorLogs": "Activer les journaux d'erreurs",
|
||||
"SettingsTabLoggingEnableTraceLogs": "Activer journaux d'erreurs Trace",
|
||||
"SettingsTabLoggingEnableGuestLogs": "Activer les journaux du programme simulé",
|
||||
"SettingsTabLoggingEnableFsAccessLogs": "Activer les journaux des accès au système de fichiers",
|
||||
"SettingsTabLoggingFsGlobalAccessLogMode": "Niveau des journaux des accès au système de fichiers:",
|
||||
"SettingsTabLoggingDeveloperOptions": "Options développeur (ATTENTION: Cela peut réduire les performances)",
|
||||
"SettingsTabLoggingEnableFsAccessLogs": "Activer les journaux d'accès au système de fichiers",
|
||||
"SettingsTabLoggingFsGlobalAccessLogMode": "Niveau des journaux d'accès au système de fichiers:",
|
||||
"SettingsTabLoggingDeveloperOptions": "Options développeur",
|
||||
"SettingsTabLoggingDeveloperOptionsNote": "ATTENTION : Réduira les performances",
|
||||
"SettingsTabLoggingGraphicsBackendLogLevel": "Niveau du journal du backend graphique :",
|
||||
"SettingsTabLoggingGraphicsBackendLogLevelNone": "Aucun",
|
||||
|
@ -200,7 +205,7 @@
|
|||
"ControllerSettingsInputDevice": "Périphériques",
|
||||
"ControllerSettingsRefresh": "Actualiser",
|
||||
"ControllerSettingsDeviceDisabled": "Désactivé",
|
||||
"ControllerSettingsControllerType": "Type de Controleur",
|
||||
"ControllerSettingsControllerType": "Type de contrôleur",
|
||||
"ControllerSettingsControllerTypeHandheld": "Portable",
|
||||
"ControllerSettingsControllerTypeProController": "Pro Controller",
|
||||
"ControllerSettingsControllerTypeJoyConPair": "JoyCon Joints",
|
||||
|
@ -218,7 +223,7 @@
|
|||
"ControllerSettingsButtonY": "Y",
|
||||
"ControllerSettingsButtonPlus": "+",
|
||||
"ControllerSettingsButtonMinus": "-",
|
||||
"ControllerSettingsDPad": "Croix Directionnelle",
|
||||
"ControllerSettingsDPad": "Croix directionnelle",
|
||||
"ControllerSettingsDPadUp": "Haut",
|
||||
"ControllerSettingsDPadDown": "Bas",
|
||||
"ControllerSettingsDPadLeft": "Gauche",
|
||||
|
@ -228,7 +233,7 @@
|
|||
"ControllerSettingsStickDown": "Bas",
|
||||
"ControllerSettingsStickLeft": "Gauche",
|
||||
"ControllerSettingsStickRight": "Droite",
|
||||
"ControllerSettingsStickStick": "Stick",
|
||||
"ControllerSettingsStickStick": "Joystick",
|
||||
"ControllerSettingsStickInvertXAxis": "Inverser l'axe X",
|
||||
"ControllerSettingsStickInvertYAxis": "Inverser l'axe Y",
|
||||
"ControllerSettingsStickDeadzone": "Zone morte :",
|
||||
|
@ -256,16 +261,16 @@
|
|||
"ControllerSettingsMotionControllerSlot": "Contrôleur ID:",
|
||||
"ControllerSettingsMotionMirrorInput": "Inverser les contrôles",
|
||||
"ControllerSettingsMotionRightJoyConSlot": "JoyCon Droit ID:",
|
||||
"ControllerSettingsMotionServerHost": "Addresse du Server:",
|
||||
"ControllerSettingsMotionServerHost": "Serveur d'hébergement :",
|
||||
"ControllerSettingsMotionGyroSensitivity": "Sensibilitée du gyroscope:",
|
||||
"ControllerSettingsMotionGyroDeadzone": "Zone morte du gyroscope:",
|
||||
"ControllerSettingsSave": "Enregistrer",
|
||||
"ControllerSettingsClose": "Fermer",
|
||||
"UserProfilesSelectedUserProfile": "Choisir un profil utilisateur:",
|
||||
"UserProfilesSelectedUserProfile": "Profil utilisateur sélectionné :",
|
||||
"UserProfilesSaveProfileName": "Enregistrer le nom du profil",
|
||||
"UserProfilesChangeProfileImage": "Changer l'image du profil",
|
||||
"UserProfilesAvailableUserProfiles": "Profils utilisateurs disponible:",
|
||||
"UserProfilesAddNewProfile": "Ajouter un nouveau profil",
|
||||
"UserProfilesAvailableUserProfiles": "Profils utilisateurs disponibles:",
|
||||
"UserProfilesAddNewProfile": "Créer un profil",
|
||||
"UserProfilesDelete": "Supprimer",
|
||||
"UserProfilesClose": "Fermer",
|
||||
"ProfileNameSelectionWatermark": "Choisir un pseudo",
|
||||
|
@ -280,25 +285,21 @@
|
|||
"InputDialogAddNewProfileTitle": "Choisir un nom de profil",
|
||||
"InputDialogAddNewProfileHeader": "Merci d'entrer un nom de profil",
|
||||
"InputDialogAddNewProfileSubtext": "(Longueur max.: {0})",
|
||||
"AvatarChoose": "Choisir",
|
||||
"AvatarChoose": "Choisir un avatar",
|
||||
"AvatarSetBackgroundColor": "Choisir une couleur de fond",
|
||||
"AvatarClose": "Fermer",
|
||||
"ControllerSettingsLoadProfileToolTip": "Charger un profil",
|
||||
"ControllerSettingsAddProfileToolTip": "Ajouter un profil",
|
||||
"ControllerSettingsRemoveProfileToolTip": "Supprimer un profil",
|
||||
"ControllerSettingsSaveProfileToolTip": "Enregistrer un profil",
|
||||
"MenuBarFileToolsTakeScreenshot": "Prendre une Capture d'Écran",
|
||||
"MenuBarFileToolsTakeScreenshot": "Prendre une capture d'écran",
|
||||
"MenuBarFileToolsHideUi": "Masquer l'interface utilisateur",
|
||||
"GameListContextMenuRunApplication": "Démarrer l'application",
|
||||
"GameListContextMenuToggleFavorite": "Ajouter/Retirer des favoris",
|
||||
"GameListContextMenuToggleFavoriteToolTip": "Activer/désactiver le statut favori du jeu",
|
||||
"SettingsTabGeneralTheme": "Thème",
|
||||
"SettingsTabGeneralThemeCustomTheme": "Chemin du thème personnalisé",
|
||||
"SettingsTabGeneralThemeBaseStyle": "Style par défaut",
|
||||
"SettingsTabGeneralThemeBaseStyleDark": "Sombre",
|
||||
"SettingsTabGeneralThemeBaseStyleLight": "Lumière",
|
||||
"SettingsTabGeneralThemeEnableCustomTheme": "Activer un Thème Personnalisé",
|
||||
"ButtonBrowse": "Parcourir",
|
||||
"SettingsTabGeneralTheme": "Thème :",
|
||||
"SettingsTabGeneralThemeDark": "Sombre",
|
||||
"SettingsTabGeneralThemeLight": "Clair",
|
||||
"ControllerSettingsConfigureGeneral": "Configurer",
|
||||
"ControllerSettingsRumble": "Vibreur",
|
||||
"ControllerSettingsRumbleStrongMultiplier": "Multiplicateur de vibrations fortes",
|
||||
|
@ -312,7 +313,7 @@
|
|||
"DialogExitTitle": "Ryujinx - Quitter",
|
||||
"DialogErrorMessage": "Ryujinx a rencontré une erreur",
|
||||
"DialogExitMessage": "Êtes-vous sûr de vouloir fermer Ryujinx ?",
|
||||
"DialogExitSubMessage": "Toute progression non sauvegardée sera perdue.",
|
||||
"DialogExitSubMessage": "Toutes les données non enregistrées seront perdues !",
|
||||
"DialogMessageCreateSaveErrorMessage": "Une erreur s'est produite lors de la création de la sauvegarde spécifiée : {0}",
|
||||
"DialogMessageFindSaveErrorMessage": "Une erreur s'est produite lors de la recherche de la sauvegarde spécifiée : {0}",
|
||||
"FolderDialogExtractTitle": "Choisissez le dossier dans lequel extraire",
|
||||
|
@ -322,8 +323,8 @@
|
|||
"DialogNcaExtractionCheckLogErrorMessage": "Échec de l'extraction. Lisez le fichier journal pour plus d'informations.",
|
||||
"DialogNcaExtractionSuccessMessage": "Extraction terminée avec succès.",
|
||||
"DialogUpdaterConvertFailedMessage": "Échec de la conversion de la version actuelle de Ryujinx.",
|
||||
"DialogUpdaterCancelUpdateMessage": "Annuler la mise à jour!",
|
||||
"DialogUpdaterAlreadyOnLatestVersionMessage": "Vous utilisez déjà la version la plus mise à jour de Ryujinx!",
|
||||
"DialogUpdaterCancelUpdateMessage": "Annuler la mise à jour !",
|
||||
"DialogUpdaterAlreadyOnLatestVersionMessage": "Vous utilisez déjà la version la plus récente de Ryujinx !",
|
||||
"DialogUpdaterFailedToGetVersionMessage": "Une erreur s'est produite lors de la tentative d'obtention des informations de publication de la version GitHub. Cela peut survenir lorsqu'une nouvelle version est en cours de compilation par GitHub Actions. Réessayez dans quelques minutes.",
|
||||
"DialogUpdaterConvertFailedGithubMessage": "Impossible de convertir la version reçue de Ryujinx depuis Github Release.",
|
||||
"DialogUpdaterDownloadingMessage": "Téléchargement de la mise à jour...",
|
||||
|
@ -332,17 +333,15 @@
|
|||
"DialogUpdaterAddingFilesMessage": "Ajout d'une nouvelle mise à jour...",
|
||||
"DialogUpdaterCompleteMessage": "Mise à jour terminée !",
|
||||
"DialogUpdaterRestartMessage": "Voulez-vous redémarrer Ryujinx maintenant ?",
|
||||
"DialogUpdaterArchNotSupportedMessage": "Vous n'utilisez pas d'architecture système prise en charge !",
|
||||
"DialogUpdaterArchNotSupportedSubMessage": "(Seuls les systèmes x64 sont pris en charge !)",
|
||||
"DialogUpdaterNoInternetMessage": "Vous n'êtes pas connecté à Internet !",
|
||||
"DialogUpdaterNoInternetSubMessage": "Veuillez vérifier que vous avez une connexion Internet fonctionnelle!",
|
||||
"DialogUpdaterDirtyBuildMessage": "Vous ne pouvez pas mettre à jour une version Dirty de Ryujinx!",
|
||||
"DialogUpdaterNoInternetSubMessage": "Veuillez vérifier que vous disposez d'une connexion Internet fonctionnelle !",
|
||||
"DialogUpdaterDirtyBuildMessage": "Vous ne pouvez pas mettre à jour une version Dirty de Ryujinx !",
|
||||
"DialogUpdaterDirtyBuildSubMessage": "Veuillez télécharger Ryujinx sur https://ryujinx.org/ si vous recherchez une version prise en charge.",
|
||||
"DialogRestartRequiredMessage": "Redémarrage Requis",
|
||||
"DialogRestartRequiredMessage": "Redémarrage requis",
|
||||
"DialogThemeRestartMessage": "Le thème a été enregistré. Un redémarrage est requis pour appliquer le thème.",
|
||||
"DialogThemeRestartSubMessage": "Voulez-vous redémarrer",
|
||||
"DialogFirmwareInstallEmbeddedMessage": "Voulez-vous installer le firmware intégré dans ce jeu ? (Firmware {0})",
|
||||
"DialogFirmwareInstallEmbeddedSuccessMessage": "Aucun firmware installé n'a été trouvé mais Ryujinx a pu installer le firmware {0} à partir du jeu fourni.\\nL'émulateur va maintenant démarrer.",
|
||||
"DialogFirmwareInstallEmbeddedSuccessMessage": "Aucun firmware installé n'a été trouvé mais Ryujinx a pu installer le firmware {0} à partir du jeu fourni.\nL'émulateur va maintenant démarrer.",
|
||||
"DialogFirmwareNoFirmwareInstalledMessage": "Aucun Firmware installé",
|
||||
"DialogFirmwareInstalledMessage": "Le firmware {0} a été installé",
|
||||
"DialogInstallFileTypesSuccessMessage": "Types de fichiers installés avec succès!",
|
||||
|
@ -384,8 +383,11 @@
|
|||
"DialogUserProfileUnsavedChangesMessage": "Vous avez effectué des modifications sur ce profil d'utilisateur qui n'ont pas été enregistrées.",
|
||||
"DialogUserProfileUnsavedChangesSubMessage": "Voulez-vous annuler les modifications ?",
|
||||
"DialogControllerSettingsModifiedConfirmMessage": "Les paramètres actuels du contrôleur ont été mis à jour.",
|
||||
"DialogControllerSettingsModifiedConfirmSubMessage": "Voulez-vous sauvegarder?",
|
||||
"DialogLoadNcaErrorMessage": "{0}. Fichier erroné : {1}",
|
||||
"DialogControllerSettingsModifiedConfirmSubMessage": "Voulez-vous sauvegarder ?",
|
||||
"DialogLoadFileErrorMessage": "{0}. Fichier erroné : {1}",
|
||||
"DialogModAlreadyExistsMessage": "Le mod existe déjà",
|
||||
"DialogModInvalidMessage": "Le répertoire spécifié ne contient pas de mod !",
|
||||
"DialogModDeleteNoParentMessage": "Impossible de supprimer : impossible de trouver le répertoire parent pour le mod \"{0} \" !",
|
||||
"DialogDlcNoDlcErrorMessage": "Le fichier spécifié ne contient pas de DLC pour le titre sélectionné !",
|
||||
"DialogPerformanceCheckLoggingEnabledMessage": "Vous avez activé la journalisation des traces, conçue pour être utilisée uniquement par les développeurs.",
|
||||
"DialogPerformanceCheckLoggingEnabledConfirmMessage": "Pour des performances optimales, il est recommandé de désactiver la journalisation des traces. Souhaitez-vous désactiver la journalisation des traces maintenant ?",
|
||||
|
@ -396,6 +398,8 @@
|
|||
"DialogUpdateAddUpdateErrorMessage": "Le fichier spécifié ne contient pas de mise à jour pour le titre sélectionné !",
|
||||
"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 ?",
|
||||
"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",
|
||||
"SettingsTabGraphicsBackendMultithreading": "Interface graphique multithread",
|
||||
"CommonAuto": "Auto",
|
||||
|
@ -413,7 +417,7 @@
|
|||
"AboutGithubUrlTooltipMessage": "Cliquez pour ouvrir la page GitHub de Ryujinx dans votre navigateur par défaut.",
|
||||
"AboutDiscordUrlTooltipMessage": "Cliquez pour ouvrir une invitation au serveur Discord de Ryujinx dans votre navigateur par défaut.",
|
||||
"AboutTwitterUrlTooltipMessage": "Cliquez pour ouvrir la page Twitter de Ryujinx dans votre navigateur par défaut.",
|
||||
"AboutRyujinxAboutTitle": "Á propos:",
|
||||
"AboutRyujinxAboutTitle": "À propos :",
|
||||
"AboutRyujinxAboutContent": "Ryujinx est un émulateur pour la Nintendo Switch™.\nMerci de nous soutenir sur Patreon.\nObtenez toutes les dernières actualités sur notre Twitter ou notre Discord.\nLes développeurs intéressés à contribuer peuvent en savoir plus sur notre GitHub ou notre Discord.",
|
||||
"AboutRyujinxMaintainersTitle": "Maintenu par :",
|
||||
"AboutRyujinxMaintainersContentTooltipMessage": "Cliquez pour ouvrir la page Contributeurs dans votre navigateur par défaut.",
|
||||
|
@ -428,9 +432,10 @@
|
|||
"DlcManagerTableHeadingContainerPathLabel": "Chemin du conteneur",
|
||||
"DlcManagerTableHeadingFullPathLabel": "Chemin complet",
|
||||
"DlcManagerRemoveAllButton": "Tout supprimer",
|
||||
"DlcManagerEnableAllButton": "Activer Tout",
|
||||
"DlcManagerDisableAllButton": "Désactiver Tout",
|
||||
"MenuBarOptionsChangeLanguage": "Changer la Langue",
|
||||
"DlcManagerEnableAllButton": "Tout activer",
|
||||
"DlcManagerDisableAllButton": "Tout désactiver",
|
||||
"ModManagerDeleteAllButton": "Tout supprimer",
|
||||
"MenuBarOptionsChangeLanguage": "Changer la langue",
|
||||
"MenuBarShowFileTypes": "Afficher les types de fichiers",
|
||||
"CommonSort": "Trier",
|
||||
"CommonShowNames": "Afficher les noms",
|
||||
|
@ -442,18 +447,18 @@
|
|||
"ToggleDiscordTooltip": "Choisissez d'afficher ou non Ryujinx sur votre activité « en cours de jeu » Discord",
|
||||
"AddGameDirBoxTooltip": "Entrez un répertoire de jeux à ajouter à la liste",
|
||||
"AddGameDirTooltip": "Ajouter un répertoire de jeux à la liste",
|
||||
"RemoveGameDirTooltip": "Supprimer le dossier sélectionné",
|
||||
"RemoveGameDirTooltip": "Supprimer le répertoire de jeu sélectionné",
|
||||
"CustomThemeCheckTooltip": "Utilisez un thème personnalisé Avalonia pour modifier l'apparence des menus de l'émulateur",
|
||||
"CustomThemePathTooltip": "Chemin vers le thème personnalisé de l'interface utilisateur",
|
||||
"CustomThemeBrowseTooltip": "Parcourir vers un thème personnalisé pour l'interface utilisateur",
|
||||
"DockModeToggleTooltip": "Le mode station d'accueil permet à la console émulée de se comporter comme une Nintendo Switch en mode station d'accueil, ce qui améliore la fidélité graphique dans la plupart des jeux. Inversement, la désactivation de cette option rendra la console émulée comme une console Nintendo Switch portable, réduisant la qualité graphique.\n\nConfigurer les controles du joueur 1 si vous prévoyez d'utiliser le mode station d'accueil; configurez les commandes portable si vous prévoyez d'utiliser le mode portable.\n\nLaissez ACTIVER si vous n'êtes pas sûr.",
|
||||
"DirectKeyboardTooltip": "Prise en charge de l'accès direct au clavier (HID). Fournit aux jeux l'accès à votre clavier en tant que périphérique de saisie de texte.",
|
||||
"DirectMouseTooltip": "Prise en charge de l'accès à la souris (HID). Permet aux jeux d'accéder a votre souris en tant que périphérique de pointage.",
|
||||
"DirectKeyboardTooltip": "Prise en charge de l'accès direct au clavier (HID). Permet aux jeux d'accéder à votre clavier comme périphérique de saisie de texte.\n\nFonctionne uniquement avec les jeux prenant en charge nativement l'utilisation du clavier sur le matériel Switch.\n\nLaissez OFF si vous n'êtes pas sûr.",
|
||||
"DirectMouseTooltip": "Prise en charge de l'accès direct à la souris (HID). Permet aux jeux d'accéder à votre souris en tant que dispositif de pointage.\n\nFonctionne uniquement avec les jeux qui prennent en charge nativement les contrôles de souris sur le matériel Switch, ce qui est rare.\n\nLorsqu'il est activé, la fonctionnalité de l'écran tactile peut ne pas fonctionner.\n\nLaissez sur OFF si vous n'êtes pas sûr.",
|
||||
"RegionTooltip": "Changer la région du système",
|
||||
"LanguageTooltip": "Changer la langue du système",
|
||||
"TimezoneTooltip": "Changer le fuseau horaire du système",
|
||||
"TimeTooltip": "Changer l'heure du système",
|
||||
"VSyncToggleTooltip": "Synchronisation verticale de l'émulateur. Généralement un limiteur d'FPS pour la majorité des jeux, le désactiver peut accélérer les jeux pour rendre les écrans de chargement plus court, mais augemente le risque de crash lors des chargements.\n\nPeut être activer ou desactiver en jeu avec un raccourci de votre choix. Nous vous recommandons de le laisser.\n\nLaissez activer, si vous n'êtes pas sûr.",
|
||||
"VSyncToggleTooltip": "La synchronisation verticale de la console émulée. Essentiellement un limiteur de trame pour la majorité des jeux ; le désactiver peut entraîner un fonctionnement plus rapide des jeux ou prolonger ou bloquer les écrans de chargement.\n\nPeut être activé ou désactivé en jeu avec un raccourci clavier de votre choix (F1 par défaut). Nous recommandons de le faire si vous envisagez de le désactiver.\n\nLaissez activé si vous n'êtes pas sûr.",
|
||||
"PptcToggleTooltip": "Sauvegarde les fonctions JIT afin qu'elles n'aient pas besoin d'être à chaque fois recompiler lorsque le jeu se charge.\n\nRéduit les lags et accélère considérablement le temps de chargement après le premier lancement d'un jeu.\n\nLaissez par défaut si vous n'êtes pas sûr.",
|
||||
"FsIntegrityToggleTooltip": "Vérifie si des fichiers sont corrompus lors du lancement d'un jeu, et si des fichiers corrompus sont détectés, affiche une erreur de hachage dans la console.\n\nN'a aucun impact sur les performances et est destiné à aider le dépannage.\n\nLaissez activer en cas d'incertitude.",
|
||||
"AudioBackendTooltip": "Modifie le backend utilisé pour donnée un rendu audio.\n\nSDL2 est préféré, tandis que OpenAL et SoundIO sont utilisés comme backend secondaire. Le backend Dummy (Factice) ne rends aucun son.\n\nLaissez sur SDL2 si vous n'êtes pas sûr.",
|
||||
|
@ -467,10 +472,10 @@
|
|||
"GraphicsBackendThreadingTooltip": "Exécute des commandes du backend graphiques sur un second thread.\n\nAccélère la compilation des shaders, réduit les crashs et les lags, améliore les performances sur les pilotes GPU sans support de multithreading. Légère augementation des performances sur les pilotes avec multithreading intégrer.\n\nRéglez sur Auto en cas d'incertitude.",
|
||||
"GalThreadingTooltip": "Exécute des commandes du backend graphiques sur un second thread.\n\nAccélère la compilation des shaders, réduit les crashs et les lags, améliore les performances sur les pilotes GPU sans support de multithreading. Légère augementation des performances sur les pilotes avec multithreading intégrer.\n\nRéglez sur Auto en cas d'incertitude.",
|
||||
"ShaderCacheToggleTooltip": "Enregistre un cache de shaders sur le disque dur, réduit le lag lors de multiples exécutions.\n\nLaissez Activer si vous n'êtes pas sûr.",
|
||||
"ResolutionScaleTooltip": "Échelle de résolution appliquer au rendu du jeu",
|
||||
"ResolutionScaleTooltip": "Multiplie la résolution de rendu du jeu.\n\nQuelques jeux peuvent ne pas fonctionner avec cette fonctionnalité et sembler pixelisés même lorsque la résolution est augmentée ; pour ces jeux, vous devrez peut-être trouver des mods qui suppriment l'anti-aliasing ou qui augmentent leur résolution de rendu interne. Pour utiliser cette dernière option, vous voudrez probablement sélectionner \"Native\".\n\nCette option peut être modifiée pendant qu'un jeu est en cours d'exécution en cliquant sur \"Appliquer\" ci-dessous ; vous pouvez simplement déplacer la fenêtre des paramètres de côté et expérimenter jusqu'à ce que vous trouviez l'apparence souhaitée pour un jeu.\n\nGardez à l'esprit que 4x est excessif pour pratiquement n'importe quelle configuration.",
|
||||
"ResolutionScaleEntryTooltip": "Échelle de résolution à virgule flottante, telle que : 1.5. Les échelles non intégrales sont plus susceptibles de causer des problèmes ou des crashs.",
|
||||
"AnisotropyTooltip": "Niveau de Filtrage Anisotropique (mettre sur Auto pour utiliser la valeur demandée par le jeu)",
|
||||
"AspectRatioTooltip": "Ratio d'aspect appliqué à la fenêtre de rendu",
|
||||
"AnisotropyTooltip": "Niveau de filtrage anisotrope. Réglez sur Auto pour utiliser la valeur demandée par le jeu.",
|
||||
"AspectRatioTooltip": "Rapport d'aspect appliqué à la fenêtre du moteur de rendu.\n\nChangez cela uniquement si vous utilisez un mod de rapport d'aspect pour votre jeu, sinon les graphismes seront étirés.\n\nLaissez sur 16:9 si vous n'êtes pas sûr.",
|
||||
"ShaderDumpPathTooltip": "Chemin de copie des Shaders Graphiques",
|
||||
"FileLogTooltip": "Sauver le journal de la console dans un fichier journal sur le disque. Cela n'affecte pas les performances.",
|
||||
"StubLogTooltip": "Affiche les messages de log dans la console. N'affecte pas les performances.",
|
||||
|
@ -504,7 +509,9 @@
|
|||
"EnableInternetAccessTooltip": "Permet à l'application émulée de se connecter à Internet.\n\nLes jeux avec un mode LAN peuvent se connecter les uns aux autres lorsque cette option est cochée et que les systèmes sont connectés au même point d'accès. Cela inclut également les vrais consoles.\n\nCette option n'autorise PAS la connexion aux serveurs Nintendo. Elle peut faire planter certains jeux qui essaient de se connecter à l'Internet.\n\nLaissez DÉSACTIVÉ si vous n'êtes pas sûr.",
|
||||
"GameListContextMenuManageCheatToolTip": "Gérer la triche",
|
||||
"GameListContextMenuManageCheat": "Gérer la triche",
|
||||
"ControllerSettingsStickRange": "Intervalle:",
|
||||
"GameListContextMenuManageModToolTip": "Gérer les mods",
|
||||
"GameListContextMenuManageMod": "Gérer les mods",
|
||||
"ControllerSettingsStickRange": "Intervalle :",
|
||||
"DialogStopEmulationTitle": "Ryujinx - Arrêt de l'émulation",
|
||||
"DialogStopEmulationMessage": "Êtes-vous sûr de vouloir arrêter l'émulation ?",
|
||||
"SettingsTabCpu": "CPU",
|
||||
|
@ -515,9 +522,7 @@
|
|||
"SettingsTabCpuMemory": "Mémoire CPU",
|
||||
"DialogUpdaterFlatpakNotSupportedMessage": "Merci de mettre à jour Ryujinx via FlatHub.",
|
||||
"UpdaterDisabledWarningTitle": "Mise à jour désactivée !",
|
||||
"GameListContextMenuOpenSdModsDirectory": "Ouvrir le dossier Mods d'Atmosphère",
|
||||
"GameListContextMenuOpenSdModsDirectoryToolTip": "Ouvre le répertoire alternatif de carte SD Atmosphère qui contient les Mods d'Application. Utile pour les mods qui sont conçu pour le vrai matériel.",
|
||||
"ControllerSettingsRotate90": "Rotation 90° horaire",
|
||||
"ControllerSettingsRotate90": "Faire pivoter de 90° à droite",
|
||||
"IconSize": "Taille d'icône",
|
||||
"IconSizeTooltip": "Changer la taille des icônes de jeu",
|
||||
"MenuBarOptionsShowConsole": "Afficher la console",
|
||||
|
@ -532,38 +537,39 @@
|
|||
"UserErrorNoFirmwareDescription": "Ryujinx n'a pas trouvé de firmwares installés",
|
||||
"UserErrorFirmwareParsingFailedDescription": "Ryujinx n'a pas pu analyser le firmware fourni. Cela est généralement dû à des clés obsolètes.",
|
||||
"UserErrorApplicationNotFoundDescription": "Ryujinx n'a pas pu trouver une application valide dans le chemin indiqué.",
|
||||
"UserErrorUnknownDescription": "Une erreur inconnue est survenue!",
|
||||
"UserErrorUnknownDescription": "Une erreur inconnue est survenue !",
|
||||
"UserErrorUndefinedDescription": "Une erreur inconnue est survenue ! Cela ne devrait pas se produire, merci de contacter un développeur !",
|
||||
"OpenSetupGuideMessage": "Ouvrir le guide d'installation",
|
||||
"NoUpdate": "Aucune mise à jour",
|
||||
"TitleUpdateVersionLabel": "Version {0} - {1}",
|
||||
"TitleUpdateVersionLabel": "Version {0}",
|
||||
"RyujinxInfo": "Ryujinx - Info",
|
||||
"RyujinxConfirm": "Ryujinx - Confirmation",
|
||||
"FileDialogAllTypes": "Tous les types",
|
||||
"Never": "Jamais",
|
||||
"SwkbdMinCharacters": "Doit comporter au moins {0} caractères",
|
||||
"SwkbdMinRangeCharacters": "Doit contenir {0}-{1} caractères en longueur",
|
||||
"SwkbdMinRangeCharacters": "Doit comporter entre {0} et {1} caractères",
|
||||
"SoftwareKeyboard": "Clavier logiciel",
|
||||
"SoftwareKeyboardModeNumbersOnly": "Doit être uniquement des chiffres",
|
||||
"SoftwareKeyboardModeNumeric": "Doit être 0-9 ou '.' uniquement",
|
||||
"SoftwareKeyboardModeAlphabet": "Doit être uniquement des caractères non CJK",
|
||||
"SoftwareKeyboardModeASCII": "Doit être uniquement du texte ASCII",
|
||||
"DialogControllerAppletMessagePlayerRange": "L'application demande {0} joueur(s) avec :\n\nTYPES : {1}\n\nJOUEURS : {2}\n\n{3}Merci d'ouvrir les Paramètres et de reconfigurer les Périphériques maintenant ou appuyez sur Fermer.",
|
||||
"DialogControllerAppletMessage": "L'application demande exactement {0} joueur(s) avec :\n\nTYPES : {1}\n\nJOUEURS : {2}\n\n{3}Merci d'ouvrir les Paramètres et de reconfigurer les Périphériques maintenant ou appuyez sur Fermer.",
|
||||
"DialogControllerAppletDockModeSet": "Mode station d'accueil défini. Le portable est également invalide.\n\n",
|
||||
"ControllerAppletControllers": "Contrôleurs pris en charge :",
|
||||
"ControllerAppletPlayers": "Joueurs :",
|
||||
"ControllerAppletDescription": "Votre configuration actuelle n'est pas valide. Ouvrez les paramètres et reconfigurez vos contrôles.",
|
||||
"ControllerAppletDocked": "Mode station d'accueil défini. Le mode contrôle portable doit être désactivé.",
|
||||
"UpdaterRenaming": "Renommage des anciens fichiers...",
|
||||
"UpdaterRenameFailed": "Impossible de renommer le fichier : {0}",
|
||||
"UpdaterAddingFiles": "Ajout des nouveaux fichiers...",
|
||||
"UpdaterExtracting": "Extraction de la mise à jour…",
|
||||
"UpdaterDownloading": "Téléchargement de la mise à jour...",
|
||||
"Game": "Jeu",
|
||||
"Docked": "Attaché",
|
||||
"Handheld": "Portable",
|
||||
"Docked": "Mode station d'accueil",
|
||||
"Handheld": "Mode Portable",
|
||||
"ConnectionError": "Erreur de connexion.",
|
||||
"AboutPageDeveloperListMore": "{0} et plus...",
|
||||
"ApiError": "Erreur API.",
|
||||
"LoadingHeading": "Chargement {0}",
|
||||
"CompilingPPTC": "Compilation PTC",
|
||||
"CompilingShaders": "Compilation des Shaders",
|
||||
"CompilingShaders": "Compilation des shaders",
|
||||
"AllKeyboards": "Tous les claviers",
|
||||
"OpenFileDialogTitle": "Sélectionnez un fichier supporté à ouvrir",
|
||||
"OpenFolderDialogTitle": "Sélectionnez un dossier avec un jeu décompressé",
|
||||
|
@ -572,13 +578,13 @@
|
|||
"SettingsTabHotkeys": "Raccourcis clavier",
|
||||
"SettingsTabHotkeysHotkeys": "Raccourcis clavier",
|
||||
"SettingsTabHotkeysToggleVsyncHotkey": "Activer/désactiver la VSync :",
|
||||
"SettingsTabHotkeysScreenshotHotkey": "Captures d'écran :",
|
||||
"SettingsTabHotkeysScreenshotHotkey": "Capture d'écran :",
|
||||
"SettingsTabHotkeysShowUiHotkey": "Afficher UI :",
|
||||
"SettingsTabHotkeysPauseHotkey": "Suspendre :",
|
||||
"SettingsTabHotkeysToggleMuteHotkey": "Muet : ",
|
||||
"ControllerMotionTitle": "Réglages du contrôle par mouvement",
|
||||
"ControllerRumbleTitle": "Paramètres de Vibration",
|
||||
"SettingsSelectThemeFileDialogTitle": "Sélectionnez un Fichier de Thème",
|
||||
"ControllerRumbleTitle": "Paramètres de vibration",
|
||||
"SettingsSelectThemeFileDialogTitle": "Sélectionner un fichier de thème",
|
||||
"SettingsXamlThemeFile": "Fichier thème Xaml",
|
||||
"AvatarWindowTitle": "Gérer les Comptes - Avatar",
|
||||
"Amiibo": "Amiibo",
|
||||
|
@ -587,46 +593,49 @@
|
|||
"Writable": "Ecriture possible",
|
||||
"SelectDlcDialogTitle": "Sélectionner les fichiers DLC",
|
||||
"SelectUpdateDialogTitle": "Sélectionner les fichiers de mise à jour",
|
||||
"SelectModDialogTitle": "Sélectionner le répertoire du mod",
|
||||
"UserProfileWindowTitle": "Gestionnaire de profils utilisateur",
|
||||
"CheatWindowTitle": "Gestionnaire de triches",
|
||||
"DlcWindowTitle": "Gestionnaire de contenus téléchargeables",
|
||||
"DlcWindowTitle": "Gérer le contenu téléchargeable pour {0} ({1})",
|
||||
"UpdateWindowTitle": "Gestionnaire de mises à jour",
|
||||
"CheatWindowHeading": "Cheats disponibles pour {0} [{1}]",
|
||||
"BuildId": "BuildId:",
|
||||
"DlcWindowHeading": "{0} Contenu(s) téléchargeable(s) disponible pour {1} ({2})",
|
||||
"DlcWindowHeading": "{0} Contenu(s) téléchargeable(s)",
|
||||
"ModWindowHeading": "{0} Mod(s)",
|
||||
"UserProfilesEditProfile": "Éditer la sélection",
|
||||
"Cancel": "Annuler",
|
||||
"Save": "Enregistrer",
|
||||
"Discard": "Abandonner",
|
||||
"UserProfilesSetProfileImage": "Modifier l'image du profil",
|
||||
"Paused": "Suspendu",
|
||||
"UserProfilesSetProfileImage": "Définir l'image de profil",
|
||||
"UserProfileEmptyNameError": "Le nom est requis",
|
||||
"UserProfileNoImageError": "L'image du profil doit être définie",
|
||||
"GameUpdateWindowHeading": "{0} mise(s) à jour disponible pour {1} ({2})",
|
||||
"SettingsTabHotkeysResScaleUpHotkey": "Augmenter la résolution:",
|
||||
"GameUpdateWindowHeading": "Gérer les mises à jour pour {0} ({1})",
|
||||
"SettingsTabHotkeysResScaleUpHotkey": "Augmenter la résolution :",
|
||||
"SettingsTabHotkeysResScaleDownHotkey": "Diminuer la résolution :",
|
||||
"UserProfilesName": "Nom :",
|
||||
"UserProfilesUserId": "Identifiant de l'utilisateur :",
|
||||
"SettingsTabGraphicsBackend": "API de Rendu",
|
||||
"SettingsTabGraphicsBackendTooltip": "Interface Graphique à utiliser",
|
||||
"SettingsTabGraphicsBackendTooltip": "Sélectionnez le moteur graphique qui sera utilisé dans l'émulateur.\n\nVulkan est globalement meilleur pour toutes les cartes graphiques modernes, tant que leurs pilotes sont à jour. Vulkan offre également une compilation de shaders plus rapide (moins de saccades) sur tous les fournisseurs de GPU.\n\nOpenGL peut obtenir de meilleurs résultats sur d'anciennes cartes graphiques Nvidia, sur d'anciennes cartes graphiques AMD sous Linux, ou sur des GPU avec moins de VRAM, bien que les saccades dues à la compilation des shaders soient plus importantes.\n\nRéglez sur Vulkan si vous n'êtes pas sûr. Réglez sur OpenGL si votre GPU ne prend pas en charge Vulkan même avec les derniers pilotes graphiques.",
|
||||
"SettingsEnableTextureRecompression": "Activer la recompression des textures",
|
||||
"SettingsEnableTextureRecompressionTooltip": "Compresse certaines textures afin de réduire l'utilisation de la VRAM.\n\nRecommandé pour une utilisation avec des GPU qui ont moins de 4 Go de VRAM.\n\nLaissez DÉSACTIVÉ si vous n'êtes pas sûr.",
|
||||
"SettingsEnableTextureRecompressionTooltip": "Les jeux utilisant ce format de texture incluent Astral Chain, Bayonetta 3, Fire Emblem Engage, Metroid Prime Remastered, Super Mario Bros. Wonder et The Legend of Zelda: Tears of the Kingdom.\n\nLes cartes graphiques avec 4 Go ou moins de VRAM risquent probablement de planter à un moment donné lors de l'exécution de ces jeux.\n\nActivez uniquement si vous manquez de VRAM sur les jeux mentionnés ci-dessus. Laissez DÉSACTIVÉ si vous n'êtes pas sûr.",
|
||||
"SettingsTabGraphicsPreferredGpu": "GPU préféré",
|
||||
"SettingsTabGraphicsPreferredGpuTooltip": "Sélectionnez la carte graphique qui sera utilisée avec l'interface graphique Vulkan.\n\nCela ne change pas le GPU qu'OpenGL utilisera.\n\nChoisissez le GPU noté \"dGPU\" si vous n'êtes pas sûr. S'il n'y en a pas, ne pas modifier.",
|
||||
"SettingsAppRequiredRestartMessage": "Redémarrage de Ryujinx requis",
|
||||
"SettingsGpuBackendRestartMessage": "Les paramètres de l'interface graphique ou du GPU ont été modifiés. Cela nécessitera un redémarrage pour être appliqué",
|
||||
"SettingsGpuBackendRestartSubMessage": "\n\nVoulez-vous redémarrer maintenant?",
|
||||
"SettingsGpuBackendRestartSubMessage": "\n\nVoulez-vous redémarrer maintenant ?",
|
||||
"RyujinxUpdaterMessage": "Voulez-vous mettre à jour Ryujinx vers la dernière version ?",
|
||||
"SettingsTabHotkeysVolumeUpHotkey": "Augmenter le volume :",
|
||||
"SettingsTabHotkeysVolumeDownHotkey": "Diminuer le volume :",
|
||||
"SettingsEnableMacroHLE": "Activer les macros HLE",
|
||||
"SettingsEnableMacroHLETooltip": "Émulation de haut niveau du code de Macro GPU.\n\nAméliore les performances, mais peut causer des bugs graphiques dans certains jeux.\n\nLaissez ACTIVER si vous n'êtes pas sûr.",
|
||||
"SettingsEnableMacroHLETooltip": "Émulation de haut niveau du code de Macro GPU.\n\nAméliore les performances, mais peut causer des artefacts graphiques dans certains jeux.\n\nLaissez ACTIVER si vous n'êtes pas sûr.",
|
||||
"SettingsEnableColorSpacePassthrough": "Traversée de l'espace colorimétrique",
|
||||
"SettingsEnableColorSpacePassthroughTooltip": "Dirige l'interface graphique Vulkan pour qu'il transmette les informations de couleur sans spécifier d'espace colorimétrique. Pour les utilisateurs possédant des écrans haut de gamme, cela peut entraîner des couleurs plus vives, au détriment de l'exactitude des couleurs.",
|
||||
"SettingsEnableColorSpacePassthroughTooltip": "Dirige l'interface graphique Vulkan pour qu'il transmette les informations de couleur sans spécifier d'espace colorimétrique. Pour les utilisateurs possédant des écrans Wide Color Gamut, cela peut entraîner des couleurs plus vives, au détriment de l'exactitude des couleurs.",
|
||||
"VolumeShort": "Vol",
|
||||
"UserProfilesManageSaves": "Gérer les sauvegardes",
|
||||
"DeleteUserSave": "Voulez-vous supprimer la sauvegarde de l'utilisateur pour ce jeu?",
|
||||
"DeleteUserSave": "Voulez-vous supprimer la sauvegarde de l'utilisateur pour ce jeu ?",
|
||||
"IrreversibleActionNote": "Cette action n'est pas réversible.",
|
||||
"SaveManagerHeading": "Gérer les sauvegardes pour {0}",
|
||||
"SaveManagerHeading": "Gérer les sauvegardes pour {0} ({1})",
|
||||
"SaveManagerTitle": "Gestionnaire de sauvegarde",
|
||||
"Name": "Nom ",
|
||||
"Size": "Taille",
|
||||
|
@ -635,12 +644,15 @@
|
|||
"Recover": "Récupérer",
|
||||
"UserProfilesRecoverHeading": "Des sauvegardes ont été trouvées pour les comptes suivants",
|
||||
"UserProfilesRecoverEmptyList": "Aucun profil à restaurer",
|
||||
"GraphicsAATooltip": "Applique l'anticrénelage au rendu du jeu",
|
||||
"GraphicsAATooltip": "FXAA floute la plupart de l'image, tandis que SMAA tente de détecter les contours dentelés et de les lisser.\n\nIl n'est pas recommandé de l'utiliser en conjonction avec le filtre de mise à l'échelle FSR.\n\nCette option peut être modifiée pendant qu'un jeu est en cours d'exécution en cliquant sur \"Appliquer\" ci-dessous ; vous pouvez simplement déplacer la fenêtre des paramètres de côté et expérimenter jusqu'à ce que vous trouviez l'apparence souhaitée pour un jeu.\n\nLaissez sur NONE si vous n'êtes pas sûr.",
|
||||
"GraphicsAALabel": "Anticrénelage :",
|
||||
"GraphicsScalingFilterLabel": "Filtre de mise à l'échelle :",
|
||||
"GraphicsScalingFilterTooltip": "Active la mise à l'échelle du tampon d'image",
|
||||
"GraphicsScalingFilterTooltip": "Choisissez le filtre de mise à l'échelle qui sera appliqué lors de l'utilisation de la mise à l'échelle de la résolution.\n\nLe filtre bilinéaire fonctionne bien pour les jeux en 3D et constitue une option par défaut sûre.\n\nLe filtre le plus proche est recommandé pour les jeux de pixel art.\n\nFSR 1.0 est simplement un filtre de netteté, non recommandé pour une utilisation avec FXAA ou SMAA.\n\nCette option peut être modifiée pendant qu'un jeu est en cours d'exécution en cliquant sur \"Appliquer\" ci-dessous ; vous pouvez simplement déplacer la fenêtre des paramètres de côté et expérimenter jusqu'à ce que vous trouviez l'aspect souhaité pour un jeu.\n\nLaissez sur BILINEAR si vous n'êtes pas sûr.",
|
||||
"GraphicsScalingFilterBilinear": "Bilinear",
|
||||
"GraphicsScalingFilterNearest": "Nearest",
|
||||
"GraphicsScalingFilterFsr": "FSR",
|
||||
"GraphicsScalingFilterLevelLabel": "Niveau ",
|
||||
"GraphicsScalingFilterLevelTooltip": "Définir le niveau du filtre de mise à l'échelle",
|
||||
"GraphicsScalingFilterLevelTooltip": "Définissez le niveau de netteté FSR 1.0. Plus élevé signifie plus net.",
|
||||
"SmaaLow": "SMAA Faible",
|
||||
"SmaaMedium": "SMAA moyen",
|
||||
"SmaaHigh": "SMAA Élevé",
|
||||
|
@ -648,9 +660,14 @@
|
|||
"UserEditorTitle": "Modifier Utilisateur",
|
||||
"UserEditorTitleCreate": "Créer Utilisateur",
|
||||
"SettingsTabNetworkInterface": "Interface Réseau :",
|
||||
"NetworkInterfaceTooltip": "Interface réseau pour les fonctionnalités LAN",
|
||||
"NetworkInterfaceTooltip": "L'interface réseau utilisée pour les fonctionnalités LAN/LDN.\n\nEn conjonction avec un VPN ou XLink Kai et un jeu prenant en charge le LAN, peut être utilisée pour simuler une connexion sur le même réseau via Internet.\n\nLaissez sur DEFAULT si vous n'êtes pas sûr.",
|
||||
"NetworkInterfaceDefault": "Par défaut",
|
||||
"PackagingShaders": "Empaquetage des Shaders",
|
||||
"AboutChangelogButton": "Voir le Changelog sur GitHub",
|
||||
"AboutChangelogButtonTooltipMessage": "Cliquez pour ouvrir le changelog de cette version dans votre navigateur par défaut."
|
||||
}
|
||||
"AboutChangelogButtonTooltipMessage": "Cliquez pour ouvrir le changelog de cette version dans votre navigateur par défaut.",
|
||||
"SettingsTabNetworkMultiplayer": "Multijoueur",
|
||||
"MultiplayerMode": "Mode :",
|
||||
"MultiplayerModeTooltip": "Changer le mode multijoueur LDN.\n\nLdnMitm modifiera la fonctionnalité de jeu sans fil local/jeu local dans les jeux pour fonctionner comme s'il s'agissait d'un LAN, permettant des connexions locales sur le même réseau avec d'autres instances de Ryujinx et des consoles Nintendo Switch piratées ayant le module ldn_mitm installé.\n\nLe multijoueur nécessite que tous les joueurs soient sur la même version du jeu (par exemple, Super Smash Bros. Ultimate v13.0.1 ne peut pas se connecter à v13.0.0).\n\nLaissez DÉSACTIVÉ si vous n'êtes pas sûr.",
|
||||
"MultiplayerModeDisabled": "Disabled",
|
||||
"MultiplayerModeLdnMitm": "ldn_mitm"
|
||||
}
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
{
|
||||
"Language": "אנגלית (ארה\"ב)",
|
||||
"Language": "עִברִית",
|
||||
"MenuBarFileOpenApplet": "פתח יישומון",
|
||||
"MenuBarFileOpenAppletOpenMiiAppletToolTip": "פתח את יישומון עורך ה- Mii במצב עצמאי",
|
||||
"SettingsTabInputDirectMouseAccess": "גישה ישירה לעכבר",
|
||||
|
@ -14,7 +14,7 @@
|
|||
"MenuBarFileOpenEmuFolder": "פתח את תיקיית ריוג'ינקס",
|
||||
"MenuBarFileOpenLogsFolder": "פתח את תיקיית קבצי הלוג",
|
||||
"MenuBarFileExit": "_יציאה",
|
||||
"MenuBarOptions": "הגדרות",
|
||||
"MenuBarOptions": "_אפשרויות",
|
||||
"MenuBarOptionsToggleFullscreen": "שנה מצב- מסך מלא",
|
||||
"MenuBarOptionsStartGamesInFullscreen": "התחל משחקים במסך מלא",
|
||||
"MenuBarOptionsStopEmulation": "עצור אמולציה",
|
||||
|
@ -30,7 +30,7 @@
|
|||
"MenuBarToolsManageFileTypes": "ניהול סוגי קבצים",
|
||||
"MenuBarToolsInstallFileTypes": "סוגי קבצי התקנה",
|
||||
"MenuBarToolsUninstallFileTypes": "סוגי קבצי הסרה",
|
||||
"MenuBarHelp": "עזרה",
|
||||
"MenuBarHelp": "_עזרה",
|
||||
"MenuBarHelpCheckForUpdates": "חפש עדכונים",
|
||||
"MenuBarHelpAbout": "אודות",
|
||||
"MenuSearch": "חפש...",
|
||||
|
@ -54,8 +54,6 @@
|
|||
"GameListContextMenuManageTitleUpdatesToolTip": "פותח את חלון מנהל עדכוני המשחקים",
|
||||
"GameListContextMenuManageDlc": "מנהל הרחבות",
|
||||
"GameListContextMenuManageDlcToolTip": "פותח את חלון מנהל הרחבות המשחקים",
|
||||
"GameListContextMenuOpenModsDirectory": "פתח את תקיית המודים",
|
||||
"GameListContextMenuOpenModsDirectoryToolTip": "פותח את התקייה המכילה את המודים של היישום",
|
||||
"GameListContextMenuCacheManagement": "ניהול מטמון",
|
||||
"GameListContextMenuCacheManagementPurgePptc": "הוסף PPTC לתור בנייה מחדש",
|
||||
"GameListContextMenuCacheManagementPurgePptcToolTip": "גרום ל-PPTC להבנות מחדש בפתיחה הבאה של המשחק",
|
||||
|
@ -72,6 +70,13 @@
|
|||
"GameListContextMenuExtractDataRomFSToolTip": "חלץ את קטע ה-RomFS מתצורת היישום הנוכחית (כולל עדכונים)",
|
||||
"GameListContextMenuExtractDataLogo": "Logo",
|
||||
"GameListContextMenuExtractDataLogoToolTip": "חלץ את קטע ה-Logo מתצורת היישום הנוכחית (כולל עדכונים)",
|
||||
"GameListContextMenuCreateShortcut": "ליצור קיצור דרך לאפליקציה",
|
||||
"GameListContextMenuCreateShortcutToolTip": "ליצור קיצור דרך בשולחן העבודה שיפתח את אפליקציה זו",
|
||||
"GameListContextMenuCreateShortcutToolTipMacOS": "ליצור קיצור דרך בתיקיית האפליקציות של macOS שיפתח את אפליקציה זו",
|
||||
"GameListContextMenuOpenModsDirectory": "פתח תיקיית מודים",
|
||||
"GameListContextMenuOpenModsDirectoryToolTip": "פותח את התיקייה שמכילה מודים של האפליקציה",
|
||||
"GameListContextMenuOpenSdModsDirectory": "פתח תיקיית מודים של Atmosphere",
|
||||
"GameListContextMenuOpenSdModsDirectoryToolTip": "פותח את תיקיית כרטיס ה-SD החלופית של Atmosphere המכילה את המודים של האפליקציה. שימושי עבור מודים שארוזים עבור חומרה אמיתית.",
|
||||
"StatusBarGamesLoaded": "{1}/{0} משחקים נטענו",
|
||||
"StatusBarSystemVersion": "גרסת מערכת: {0}",
|
||||
"LinuxVmMaxMapCountDialogTitle": "זוהתה מגבלה נמוכה עבור מיפויי זיכרון",
|
||||
|
@ -150,7 +155,7 @@
|
|||
"SettingsTabGraphicsResolutionScaleNative": "מקורי (720p/1080p)",
|
||||
"SettingsTabGraphicsResolutionScale2x": "2x (1440p/2160p)",
|
||||
"SettingsTabGraphicsResolutionScale3x": "3x (2160p/3240p)",
|
||||
"SettingsTabGraphicsResolutionScale4x": "4x (2880p/4320p)",
|
||||
"SettingsTabGraphicsResolutionScale4x": "4x (2880p/4320p) (לא מומלץ)",
|
||||
"SettingsTabGraphicsAspectRatio": "יחס גובה-רוחב:",
|
||||
"SettingsTabGraphicsAspectRatio4x3": "4:3",
|
||||
"SettingsTabGraphicsAspectRatio16x9": "16:9",
|
||||
|
@ -292,13 +297,9 @@
|
|||
"GameListContextMenuRunApplication": "הרץ יישום",
|
||||
"GameListContextMenuToggleFavorite": "למתג העדפה",
|
||||
"GameListContextMenuToggleFavoriteToolTip": "למתג סטטוס העדפה של משחק",
|
||||
"SettingsTabGeneralTheme": "ערכת נושא",
|
||||
"SettingsTabGeneralThemeCustomTheme": "נתיב ערכת נושא מותאמת אישית",
|
||||
"SettingsTabGeneralThemeBaseStyle": "סגנון בסיס",
|
||||
"SettingsTabGeneralThemeBaseStyleDark": "כהה",
|
||||
"SettingsTabGeneralThemeBaseStyleLight": "בהיר",
|
||||
"SettingsTabGeneralThemeEnableCustomTheme": "אפשר ערכת נושא מותאמת אישית",
|
||||
"ButtonBrowse": "עיין",
|
||||
"SettingsTabGeneralTheme": "ערכת נושא:",
|
||||
"SettingsTabGeneralThemeDark": "כהה",
|
||||
"SettingsTabGeneralThemeLight": "בהיר",
|
||||
"ControllerSettingsConfigureGeneral": "הגדר",
|
||||
"ControllerSettingsRumble": "רטט",
|
||||
"ControllerSettingsRumbleStrongMultiplier": "העצמת רטט חזק",
|
||||
|
@ -332,8 +333,6 @@
|
|||
"DialogUpdaterAddingFilesMessage": "מוסיף עדכון חדש...",
|
||||
"DialogUpdaterCompleteMessage": "העדכון הושלם!",
|
||||
"DialogUpdaterRestartMessage": "האם אתם רוצים להפעיל מחדש את ריוג'ינקס עכשיו?",
|
||||
"DialogUpdaterArchNotSupportedMessage": "אינך מריץ ארכיטקטורת מערכת נתמכת!",
|
||||
"DialogUpdaterArchNotSupportedSubMessage": "(רק מערכות x64 נתמכות!)",
|
||||
"DialogUpdaterNoInternetMessage": "אתם לא מחוברים לאינטרנט!",
|
||||
"DialogUpdaterNoInternetSubMessage": "אנא ודא שיש לך חיבור אינטרנט תקין!",
|
||||
"DialogUpdaterDirtyBuildMessage": "אתם לא יכולים לעדכן מבנה מלוכלך של ריוג'ינקס!",
|
||||
|
@ -342,7 +341,7 @@
|
|||
"DialogThemeRestartMessage": "ערכת הנושא נשמרה. יש צורך בהפעלה מחדש כדי להחיל את ערכת הנושא.",
|
||||
"DialogThemeRestartSubMessage": "האם ברצונך להפעיל מחדש?",
|
||||
"DialogFirmwareInstallEmbeddedMessage": "האם תרצו להתקין את הקושחה המוטמעת במשחק הזה? (קושחה {0})",
|
||||
"DialogFirmwareInstallEmbeddedSuccessMessage": "לא נמצאה קושחה מותקנת אבל ריוג'ינקס הצליח להתקין קושחה {0} מהמשחק שסופק. \\nהאמולטור יופעל כעת.",
|
||||
"DialogFirmwareInstallEmbeddedSuccessMessage": "לא נמצאה קושחה מותקנת אבל ריוג'ינקס הצליח להתקין קושחה {0} מהמשחק שסופק. \nהאמולטור יופעל כעת.",
|
||||
"DialogFirmwareNoFirmwareInstalledMessage": "לא מותקנת קושחה",
|
||||
"DialogFirmwareInstalledMessage": "הקושחה {0} הותקנה",
|
||||
"DialogInstallFileTypesSuccessMessage": "סוגי קבצים הותקנו בהצלחה!",
|
||||
|
@ -385,7 +384,10 @@
|
|||
"DialogUserProfileUnsavedChangesSubMessage": "האם ברצונך למחוק את השינויים האחרונים?",
|
||||
"DialogControllerSettingsModifiedConfirmMessage": "הגדרות השלט הנוכחי עודכנו.",
|
||||
"DialogControllerSettingsModifiedConfirmSubMessage": "האם ברצונך לשמור?",
|
||||
"DialogLoadNcaErrorMessage": "{0}. קובץ שגוי: {1}",
|
||||
"DialogLoadFileErrorMessage": "{0}. קובץ שגוי: {1}",
|
||||
"DialogModAlreadyExistsMessage": "מוד כבר קיים",
|
||||
"DialogModInvalidMessage": "התיקייה שצוינה אינה מכילה מוד",
|
||||
"DialogModDeleteNoParentMessage": "נכשל למחוק: לא היה ניתן למצוא את תיקיית האב למוד \"{0}\"!\n",
|
||||
"DialogDlcNoDlcErrorMessage": "הקובץ שצוין אינו מכיל DLC עבור המשחק שנבחר!",
|
||||
"DialogPerformanceCheckLoggingEnabledMessage": "הפעלת רישום מעקב, אשר נועד לשמש מפתחים בלבד.",
|
||||
"DialogPerformanceCheckLoggingEnabledConfirmMessage": "לביצועים מיטביים, מומלץ להשבית את רישום המעקב. האם ברצונך להשבית את רישום המעקב כעת?",
|
||||
|
@ -396,6 +398,8 @@
|
|||
"DialogUpdateAddUpdateErrorMessage": "הקובץ שצוין אינו מכיל עדכון עבור המשחק שנבחר!",
|
||||
"DialogSettingsBackendThreadingWarningTitle": "אזהרה - ריבוי תהליכי רקע",
|
||||
"DialogSettingsBackendThreadingWarningMessage": "יש להפעיל מחדש את ריוג'ינקס לאחר שינוי אפשרות זו כדי שהיא תחול במלואה. בהתאם לפלטפורמה שלך, ייתכן שיהיה עליך להשבית ידנית את ריבוי ההליכים של ההתקן שלך בעת השימוש ב-ריוג'ינקס.",
|
||||
"DialogModManagerDeletionWarningMessage": "אתה עומד למחוק את המוד: {0}\nהאם אתה בטוח שאתה רוצה להמשיך?",
|
||||
"DialogModManagerDeletionAllWarningMessage": "אתה עומד למחוק את כל המודים בשביל משחק זה.\n\nהאם אתה בטוח שאתה רוצה להמשיך?",
|
||||
"SettingsTabGraphicsFeaturesOptions": "אפשרויות",
|
||||
"SettingsTabGraphicsBackendMultithreading": "אחראי גרפיקה רב-תהליכי:",
|
||||
"CommonAuto": "אוטומטי",
|
||||
|
@ -430,6 +434,7 @@
|
|||
"DlcManagerRemoveAllButton": "מחק הכל",
|
||||
"DlcManagerEnableAllButton": "אפשר הכל",
|
||||
"DlcManagerDisableAllButton": "השבת הכל",
|
||||
"ModManagerDeleteAllButton": "מחק הכל",
|
||||
"MenuBarOptionsChangeLanguage": "החלף שפה",
|
||||
"MenuBarShowFileTypes": "הצג מזהה סוג קובץ",
|
||||
"CommonSort": "מיין",
|
||||
|
@ -447,13 +452,13 @@
|
|||
"CustomThemePathTooltip": "נתיב לערכת נושא לממשק גראפי מותאם אישית",
|
||||
"CustomThemeBrowseTooltip": "חפש עיצוב ממשק גראפי מותאם אישית",
|
||||
"DockModeToggleTooltip": "מצב עגינה גורם למערכת המדומה להתנהג כ-נינטנדו סוויץ' בתחנת עגינתו. זה משפר את הנאמנות הגרפית ברוב המשחקים.\n לעומת זאת, השבתה של תכונה זו תגרום למערכת המדומה להתנהג כ- נינטנדו סוויץ' נייד, ולהפחית את איכות הגרפיקה.\n\nהגדירו את שלט שחקן 1 אם אתם מתכננים להשתמש במצב עגינה; הגדירו את פקדי כף היד אם אתם מתכננים להשתמש במצב נייד.\n\nמוטב להשאיר דלוק אם אתם לא בטוחים.",
|
||||
"DirectKeyboardTooltip": "תמיכה ישירה למקלדת (HID). מספק גישה בשביל משחקים למקלדת שלך כמכשיר להזנת טקסט.",
|
||||
"DirectMouseTooltip": "תמיכה ישירה לעכבר (HID). מספק גישה בשביל משחקים לעכבר שלך כהתקן הצבעה.",
|
||||
"DirectKeyboardTooltip": "Direct keyboard access (HID) support. Provides games access to your keyboard as a text entry device.\n\nOnly works with games that natively support keyboard usage on Switch hardware.\n\nLeave OFF if unsure.",
|
||||
"DirectMouseTooltip": "Direct mouse access (HID) support. Provides games access to your mouse as a pointing device.\n\nOnly works with games that natively support mouse controls on Switch hardware, which are few and far between.\n\nWhen enabled, touch screen functionality may not work.\n\nLeave OFF if unsure.",
|
||||
"RegionTooltip": "שנה אזור מערכת",
|
||||
"LanguageTooltip": "שנה שפת מערכת",
|
||||
"TimezoneTooltip": "שנה את אזור הזמן של המערכת",
|
||||
"TimeTooltip": "שנה זמן מערכת",
|
||||
"VSyncToggleTooltip": "מדמה סנכרון אנכי של קונסולה. כלומר חסם הפריימים לרוב המשחקים; השבתה שלו עלולה לגרום למשחקים לרוץ מהר יותר או לגרום למסכי טעינה לקחת יותר זמן או להתקע.\n\nניתן לשנות מצב של תפריט זה בזמן משחק עם המקש לבחירתך. אנו ממליצים לעשות זאת אם אתם מתכננים להשבית אותו.\n\nמוטב להשאיר דלוק אם לא בטוחים.",
|
||||
"VSyncToggleTooltip": "Emulated console's Vertical Sync. Essentially a frame-limiter for the majority of games; disabling it may cause games to run at higher speed or make loading screens take longer or get stuck.\n\nCan be toggled in-game with a hotkey of your preference (F1 by default). We recommend doing this if you plan on disabling it.\n\nLeave ON if unsure.",
|
||||
"PptcToggleTooltip": "שומר את פונקציות ה-JIT המתורגמות כך שלא יצטרכו לעבור תרגום שוב כאשר משחק עולה.\n\nמפחית תקיעות ומשפר מהירות עלייה של המערכת אחרי הפתיחה הראשונה של המשחק.\n\nמוטב להשאיר דלוק אם לא בטוחים.",
|
||||
"FsIntegrityToggleTooltip": "בודק לקבצים שגויים כאשר משחק עולה, ואם מתגלים כאלו, מציג את מזהה השגיאה שלהם לקובץ הלוג.\n\nאין לכך השפעה על הביצועים ונועד לעזור לבדיקה וניפוי שגיאות של האמולטור.\n\nמוטב להשאיר דלוק אם לא בטוחים.",
|
||||
"AudioBackendTooltip": "משנה את אחראי השמע.\n\nSDL2 הוא הנבחר, למראת שOpenAL וגם SoundIO משומשים כאפשרויות חלופיות. אפשרות הDummy לא תשמיע קול כלל.\n\nמוטב להשאיר על SDL2 אם לא בטוחים.",
|
||||
|
@ -467,10 +472,10 @@
|
|||
"GraphicsBackendThreadingTooltip": "מריץ פקודות גראפיקה בתהליך שני נפרד.\n\nמאיץ עיבוד הצללות, מפחית תקיעות ומשפר ביצועים של דרייבר כרטיסי מסך אשר לא תומכים בהרצה רב-תהליכית.\n\nמוטב להשאיר על אוטומטי אם לא בטוחים.",
|
||||
"GalThreadingTooltip": "מריץ פקודות גראפיקה בתהליך שני נפרד.\n\nמאיץ עיבוד הצללות, מפחית תקיעות ומשפר ביצועים של דרייבר כרטיסי מסך אשר לא תומכים בהרצה רב-תהליכית.\n\nמוטב להשאיר על אוטומטי אם לא בטוחים.",
|
||||
"ShaderCacheToggleTooltip": "שומר זכרון מטמון של הצללות, דבר שמפחית תקיעות בריצות מסוימות.\n\nמוטב להשאיר דלוק אם לא בטוחים.",
|
||||
"ResolutionScaleTooltip": "שיפור רזולוצייה המאופשרת לעיבוד מטרות.",
|
||||
"ResolutionScaleTooltip": "Multiplies the game's rendering resolution.\n\nA few games may not work with this and look pixelated even when the resolution is increased; for those games, you may need to find mods that remove anti-aliasing or that increase their internal rendering resolution. For using the latter, you'll likely want to select Native.\n\nThis option can be changed while a game is running by clicking \"Apply\" below; you can simply move the settings window aside and experiment until you find your preferred look for a game.\n\nKeep in mind 4x is overkill for virtually any setup.",
|
||||
"ResolutionScaleEntryTooltip": "שיפור רזולוציית נקודה צפה, כגון 1.5. הוא שיפור לא אינטגרלי הנוטה לגרום יותר בעיות או להקריס.",
|
||||
"AnisotropyTooltip": "רמת סינון אניסוטרופי (מוגדר לאוטומטי כדי להשתמש בערך המבוקש על ידי המשחק)",
|
||||
"AspectRatioTooltip": "יחס גובה-רוחב הוחל על חלון המעבד.",
|
||||
"AnisotropyTooltip": "Level of Anisotropic Filtering. Set to Auto to use the value requested by the game.",
|
||||
"AspectRatioTooltip": "Aspect Ratio applied to the renderer window.\n\nOnly change this if you're using an aspect ratio mod for your game, otherwise the graphics will be stretched.\n\nLeave on 16:9 if unsure.",
|
||||
"ShaderDumpPathTooltip": "נתיב השלכת הצללות גראפיות",
|
||||
"FileLogTooltip": "שומר את רישומי שורת הפקודות לזיכרון, לא משפיע על ביצועי היישום.",
|
||||
"StubLogTooltip": "מדפיס רישומים כושלים לשורת הפקודות. לא משפיע על ביצועי היישום.",
|
||||
|
@ -504,6 +509,8 @@
|
|||
"EnableInternetAccessTooltip": "מאפשר ליישומים באמולצייה להתחבר לאינטרנט.\n\nמשחקים עם חיבור לאן יכולים להתחבר אחד לשני כשאופצייה זו מופעלת והמערכות מתחברות לאותה נקודת גישה. כמו כן זה כולל שורות פקודות אמיתיות גם.\n\nאופצייה זו לא מאפשרת חיבור לשרתי נינטנדו. כשהאופצייה דלוקה היא עלולה לגרום לקריסת היישום במשחקים מסויימים שמנסים להתחבר לאינטרנט.\n\nמוטב להשאיר כבוי אם לא בטוחים.",
|
||||
"GameListContextMenuManageCheatToolTip": "נהל צ'יטים",
|
||||
"GameListContextMenuManageCheat": "נהל צ'יטים",
|
||||
"GameListContextMenuManageModToolTip": "נהל מודים",
|
||||
"GameListContextMenuManageMod": "נהל מודים",
|
||||
"ControllerSettingsStickRange": "טווח:",
|
||||
"DialogStopEmulationTitle": "ריוג'ינקס - עצור אמולציה",
|
||||
"DialogStopEmulationMessage": "האם אתם בטוחים שאתם רוצים לסגור את האמולצייה?",
|
||||
|
@ -515,8 +522,6 @@
|
|||
"SettingsTabCpuMemory": "מצב מעבד",
|
||||
"DialogUpdaterFlatpakNotSupportedMessage": "בבקשה עדכן את ריוג'ינקס דרך פלאטהב.",
|
||||
"UpdaterDisabledWarningTitle": "מעדכן מושבת!",
|
||||
"GameListContextMenuOpenSdModsDirectory": "פתח את תקיית המודים של אטמוספרה",
|
||||
"GameListContextMenuOpenSdModsDirectoryToolTip": "פותח את תקיית כרטיס ה-SD החלופית של אטמוספרה המכילה את המודים של האפליקציה. שימושי עבור מודים ארוזים עבור חומרה אמיתית.",
|
||||
"ControllerSettingsRotate90": "סובב 90° עם בכיוון השעון",
|
||||
"IconSize": "גודל הסמל",
|
||||
"IconSizeTooltip": "שנה את גודל הסמלים של משחקים",
|
||||
|
@ -544,12 +549,13 @@
|
|||
"SwkbdMinCharacters": "לפחות {0} תווים",
|
||||
"SwkbdMinRangeCharacters": "באורך {0}-{1} תווים",
|
||||
"SoftwareKeyboard": "מקלדת וירטואלית",
|
||||
"SoftwareKeyboardModeNumbersOnly": "מחויב להיות מספרי בלבד",
|
||||
"SoftwareKeyboardModeNumeric": "חייב להיות בין 0-9 או '.' בלבד",
|
||||
"SoftwareKeyboardModeAlphabet": "מחויב להיות ללא אותיות CJK",
|
||||
"SoftwareKeyboardModeASCII": "מחויב להיות טקסט אסקיי",
|
||||
"DialogControllerAppletMessagePlayerRange": "האפליקציה מבקשת {0} שחקנים עם:\n\nסוגים: {1}\n\nשחקנים: {2}\n\n{3}אנא פתח את ההגדרות והגדר מחדש את הקלט כעת או סגור.",
|
||||
"DialogControllerAppletMessage": "האפליקציה מבקשת בדיוק {0} שחקנים עם:\n\nסוגים: {1}\n\nשחקנים: {2}\n\n{3}אנא פתח את ההגדרות והגדר מחדש את הקלט כעת או סגור.",
|
||||
"DialogControllerAppletDockModeSet": "במצב עגינה. בנוסף מצב נייד לא אפשרי.\n\n",
|
||||
"ControllerAppletControllers": "בקרים נתמכים:",
|
||||
"ControllerAppletPlayers": "שחקנים:",
|
||||
"ControllerAppletDescription": "התצורה הנוכחית אינה תקינה. פתח הגדרות והגדר מחדש את הקלטים שלך.",
|
||||
"ControllerAppletDocked": "מצב עגינה מוגדר. כדאי ששליטה ניידת תהיה מושבתת.",
|
||||
"UpdaterRenaming": "משנה שמות של קבצים ישנים...",
|
||||
"UpdaterRenameFailed": "המעדכן לא הצליח לשנות את שם הקובץ: {0}",
|
||||
"UpdaterAddingFiles": "מוסיף קבצים חדשים...",
|
||||
|
@ -587,6 +593,7 @@
|
|||
"Writable": "ניתן לכתיבה",
|
||||
"SelectDlcDialogTitle": "בחרו קבצי הרחבות משחק",
|
||||
"SelectUpdateDialogTitle": "בחרו קבצי עדכון",
|
||||
"SelectModDialogTitle": "בחר תיקיית מודים",
|
||||
"UserProfileWindowTitle": "ניהול פרופילי משתמש",
|
||||
"CheatWindowTitle": "נהל צ'יטים למשחק",
|
||||
"DlcWindowTitle": "נהל הרחבות משחק עבור {0} ({1})",
|
||||
|
@ -594,10 +601,12 @@
|
|||
"CheatWindowHeading": "צ'יטים זמינים עבור {0} [{1}]",
|
||||
"BuildId": "מזהה בניה:",
|
||||
"DlcWindowHeading": "{0} הרחבות משחק",
|
||||
"ModWindowHeading": "{0} מוד(ים)",
|
||||
"UserProfilesEditProfile": "ערוך נבחר/ים",
|
||||
"Cancel": "בטל",
|
||||
"Save": "שמור",
|
||||
"Discard": "השלך",
|
||||
"Paused": "מושהה",
|
||||
"UserProfilesSetProfileImage": "הגדר תמונת פרופיל",
|
||||
"UserProfileEmptyNameError": "נדרש שם",
|
||||
"UserProfileNoImageError": "נדרשת תמונת פרופיל",
|
||||
|
@ -607,9 +616,9 @@
|
|||
"UserProfilesName": "שם:",
|
||||
"UserProfilesUserId": "מזהה משתמש:",
|
||||
"SettingsTabGraphicsBackend": "אחראי גראפיקה",
|
||||
"SettingsTabGraphicsBackendTooltip": "אחראי גראפיקה לשימוש",
|
||||
"SettingsTabGraphicsBackendTooltip": "Select the graphics backend that will be used in the emulator.\n\nVulkan is overall better for all modern graphics cards, as long as their drivers are up to date. Vulkan also features faster shader compilation (less stuttering) on all GPU vendors.\n\nOpenGL may achieve better results on old Nvidia GPUs, on old AMD GPUs on Linux, or on GPUs with lower VRAM, though shader compilation stutters will be greater.\n\nSet to Vulkan if unsure. Set to OpenGL if your GPU does not support Vulkan even with the latest graphics drivers.",
|
||||
"SettingsEnableTextureRecompression": "אפשר דחיסה מחדש של המרקם",
|
||||
"SettingsEnableTextureRecompressionTooltip": " דוחס מרקמים מסויימים להפחתת השימוש בראם הוירטואלי.\n\nמומלץ לשימוש עם כרטיס גראפי בעל פחות מ-4GiB בראם הוירטואלי.\n\nמוטב להשאיר כבוי אם אינכם בטוחים.",
|
||||
"SettingsEnableTextureRecompressionTooltip": "Compresses ASTC textures in order to reduce VRAM usage.\n\nGames using this texture format include Astral Chain, Bayonetta 3, Fire Emblem Engage, Metroid Prime Remastered, Super Mario Bros. Wonder and The Legend of Zelda: Tears of the Kingdom.\n\nGraphics cards with 4GiB VRAM or less will likely crash at some point while running these games.\n\nEnable only if you're running out of VRAM on the aforementioned games. Leave OFF if unsure.",
|
||||
"SettingsTabGraphicsPreferredGpu": "כרטיס גראפי מועדף",
|
||||
"SettingsTabGraphicsPreferredGpuTooltip": "בחר את הכרטיס הגראפי שישומש עם הגראפיקה של וולקאן.\n\nדבר זה לא משפיע על הכרטיס הגראפי שישומש עם OpenGL.\n\nמוטב לבחור את ה-GPU המסומן כ-\"dGPU\" אם אינכם בטוחים, אם זו לא אופצייה, אל תשנו דבר.",
|
||||
"SettingsAppRequiredRestartMessage": "ריוג'ינקס דורש אתחול מחדש",
|
||||
|
@ -620,8 +629,8 @@
|
|||
"SettingsTabHotkeysVolumeDownHotkey": "הנמך את עוצמת הקול:",
|
||||
"SettingsEnableMacroHLE": "Enable Macro HLE",
|
||||
"SettingsEnableMacroHLETooltip": "אמולצייה ברמה גבוהה של כרטיס גראפי עם קוד מקרו.\n\nמשפר את ביצועי היישום אך עלול לגרום לגליצ'ים חזותיים במשחקים מסויימים.\n\nמוטב להשאיר דלוק אם אינך בטוח.",
|
||||
"SettingsEnableColorSpacePassthrough": "Color Space Passthrough",
|
||||
"SettingsEnableColorSpacePassthroughTooltip": "Directs the Vulkan backend to pass through color information without specifying a color space. For users with wide gamut displays, this may result in more vibrant colors, at the cost of color correctness.",
|
||||
"SettingsEnableColorSpacePassthrough": "שקיפות מרחב צבע",
|
||||
"SettingsEnableColorSpacePassthroughTooltip": "מנחה את המנוע Vulkan להעביר שקיפות בצבעים מבלי לציין מרחב צבע. עבור משתמשים עם מסכים רחבים, הדבר עשוי לגרום לצבעים מרהיבים יותר, בחוסר דיוק בצבעים האמתיים.",
|
||||
"VolumeShort": "שמע",
|
||||
"UserProfilesManageSaves": "נהל שמורים",
|
||||
"DeleteUserSave": "האם ברצונך למחוק את תקיית השמור למשחק זה?",
|
||||
|
@ -635,12 +644,15 @@
|
|||
"Recover": "שחזר",
|
||||
"UserProfilesRecoverHeading": "שמורים נמצאו לחשבונות הבאים",
|
||||
"UserProfilesRecoverEmptyList": "אין פרופילים לשחזור",
|
||||
"GraphicsAATooltip": "מחיל החלקת-עקומות על עיבוד המשחק",
|
||||
"GraphicsAATooltip": "Applies anti-aliasing to the game render.\n\nFXAA will blur most of the image, while SMAA will attempt to find jagged edges and smooth them out.\n\nNot recommended to use in conjunction with the FSR scaling filter.\n\nThis option can be changed while a game is running by clicking \"Apply\" below; you can simply move the settings window aside and experiment until you find your preferred look for a game.\n\nLeave on NONE if unsure.",
|
||||
"GraphicsAALabel": "החלקת-עקומות:",
|
||||
"GraphicsScalingFilterLabel": "מסנן מידת איכות:",
|
||||
"GraphicsScalingFilterTooltip": "אפשר מידת איכות מסוג איגור-תמונה",
|
||||
"GraphicsScalingFilterTooltip": "Choose the scaling filter that will be applied when using resolution scale.\n\nBilinear works well for 3D games and is a safe default option.\n\nNearest is recommended for pixel art games.\n\nFSR 1.0 is merely a sharpening filter, not recommended for use with FXAA or SMAA.\n\nThis option can be changed while a game is running by clicking \"Apply\" below; you can simply move the settings window aside and experiment until you find your preferred look for a game.\n\nLeave on BILINEAR if unsure.",
|
||||
"GraphicsScalingFilterBilinear": "Bilinear",
|
||||
"GraphicsScalingFilterNearest": "Nearest",
|
||||
"GraphicsScalingFilterFsr": "FSR",
|
||||
"GraphicsScalingFilterLevelLabel": "רמה",
|
||||
"GraphicsScalingFilterLevelTooltip": "קבע מידת איכות תמונה לפי רמת סינון",
|
||||
"GraphicsScalingFilterLevelTooltip": "Set FSR 1.0 sharpening level. Higher is sharper.",
|
||||
"SmaaLow": "SMAA נמוך",
|
||||
"SmaaMedium": "SMAA בינוני",
|
||||
"SmaaHigh": "SMAA גבוהה",
|
||||
|
@ -648,9 +660,14 @@
|
|||
"UserEditorTitle": "ערוך משתמש",
|
||||
"UserEditorTitleCreate": "צור משתמש",
|
||||
"SettingsTabNetworkInterface": "ממשק רשת",
|
||||
"NetworkInterfaceTooltip": "ממשק הרשת המשומש עבור יכולות לאן",
|
||||
"NetworkInterfaceTooltip": "The network interface used for LAN/LDN features.\n\nIn conjunction with a VPN or XLink Kai and a game with LAN support, can be used to spoof a same-network connection over the Internet.\n\nLeave on DEFAULT if unsure.",
|
||||
"NetworkInterfaceDefault": "ברירת המחדל",
|
||||
"PackagingShaders": "אורז הצללות",
|
||||
"AboutChangelogButton": "צפה במידע אודות שינויים בגיטהב",
|
||||
"AboutChangelogButtonTooltipMessage": "לחץ כדי לפתוח את יומן השינויים עבור גרסה זו בדפדפן ברירת המחדל שלך."
|
||||
}
|
||||
"AboutChangelogButtonTooltipMessage": "לחץ כדי לפתוח את יומן השינויים עבור גרסה זו בדפדפן ברירת המחדל שלך.",
|
||||
"SettingsTabNetworkMultiplayer": "רב משתתפים",
|
||||
"MultiplayerMode": "מצב:",
|
||||
"MultiplayerModeTooltip": "Change LDN multiplayer mode.\n\nLdnMitm will modify local wireless/local play functionality in games to function as if it were LAN, allowing for local, same-network connections with other Ryujinx instances and hacked Nintendo Switch consoles that have the ldn_mitm module installed.\n\nMultiplayer requires all players to be on the same game version (i.e. Super Smash Bros. Ultimate v13.0.1 can't connect to v13.0.0).\n\nLeave DISABLED if unsure.",
|
||||
"MultiplayerModeDisabled": "Disabled",
|
||||
"MultiplayerModeLdnMitm": "ldn_mitm"
|
||||
}
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
{
|
||||
"Language": "Italiano",
|
||||
"MenuBarFileOpenApplet": "Apri Applet",
|
||||
"MenuBarFileOpenApplet": "Apri applet",
|
||||
"MenuBarFileOpenAppletOpenMiiAppletToolTip": "Apri l'applet Mii Editor in modalità Standalone",
|
||||
"SettingsTabInputDirectMouseAccess": "Accesso diretto mouse",
|
||||
"SettingsTabSystemMemoryManagerMode": "Modalità di gestione della memoria:",
|
||||
|
@ -12,9 +12,9 @@
|
|||
"MenuBarFileOpenFromFile": "_Carica applicazione da un file",
|
||||
"MenuBarFileOpenUnpacked": "Carica _gioco estratto",
|
||||
"MenuBarFileOpenEmuFolder": "Apri cartella di Ryujinx",
|
||||
"MenuBarFileOpenLogsFolder": "Apri cartella dei Log",
|
||||
"MenuBarFileOpenLogsFolder": "Apri cartella dei log",
|
||||
"MenuBarFileExit": "_Esci",
|
||||
"MenuBarOptions": "Opzioni",
|
||||
"MenuBarOptions": "_Opzioni",
|
||||
"MenuBarOptionsToggleFullscreen": "Schermo intero",
|
||||
"MenuBarOptionsStartGamesInFullscreen": "Avvia i giochi a schermo intero",
|
||||
"MenuBarOptionsStopEmulation": "Ferma emulazione",
|
||||
|
@ -30,7 +30,7 @@
|
|||
"MenuBarToolsManageFileTypes": "Gestisci i tipi di file",
|
||||
"MenuBarToolsInstallFileTypes": "Installa i tipi di file",
|
||||
"MenuBarToolsUninstallFileTypes": "Disinstalla i tipi di file",
|
||||
"MenuBarHelp": "Aiuto",
|
||||
"MenuBarHelp": "_Aiuto",
|
||||
"MenuBarHelpCheckForUpdates": "Controlla aggiornamenti",
|
||||
"MenuBarHelpAbout": "Informazioni",
|
||||
"MenuSearch": "Cerca...",
|
||||
|
@ -40,31 +40,29 @@
|
|||
"GameListHeaderDeveloper": "Sviluppatore",
|
||||
"GameListHeaderVersion": "Versione",
|
||||
"GameListHeaderTimePlayed": "Tempo di gioco",
|
||||
"GameListHeaderLastPlayed": "Giocato l'ultima volta",
|
||||
"GameListHeaderLastPlayed": "Ultima partita",
|
||||
"GameListHeaderFileExtension": "Estensione",
|
||||
"GameListHeaderFileSize": "Dimensione file",
|
||||
"GameListHeaderPath": "Percorso",
|
||||
"GameListContextMenuOpenUserSaveDirectory": "Apri la cartella salvataggi dell'utente",
|
||||
"GameListContextMenuOpenUserSaveDirectoryToolTip": "Apre la cartella che contiene i salvataggi di gioco dell'utente",
|
||||
"GameListContextMenuOpenDeviceSaveDirectory": "Apri la cartella dispositivo dell'utente",
|
||||
"GameListContextMenuOpenDeviceSaveDirectoryToolTip": "Apre la cartella che contiene i salvataggi di gioco del dispositivo",
|
||||
"GameListContextMenuOpenBcatSaveDirectory": "Apri la cartella BCAT dell'utente",
|
||||
"GameListContextMenuOpenBcatSaveDirectoryToolTip": "Apre la cartella che contiene i salvataggi BCAT dell'applicazione",
|
||||
"GameListContextMenuOpenUserSaveDirectory": "Apri la cartella dei salvataggi dell'utente",
|
||||
"GameListContextMenuOpenUserSaveDirectoryToolTip": "Apre la cartella che contiene i dati di salvataggio dell'utente",
|
||||
"GameListContextMenuOpenDeviceSaveDirectory": "Apri la cartella dei salvataggi del dispositivo",
|
||||
"GameListContextMenuOpenDeviceSaveDirectoryToolTip": "Apre la cartella che contiene i dati di salvataggio del dispositivo",
|
||||
"GameListContextMenuOpenBcatSaveDirectory": "Apri la cartella del salvataggio BCAT",
|
||||
"GameListContextMenuOpenBcatSaveDirectoryToolTip": "Apre la cartella che contiene il salvataggio BCAT dell'applicazione",
|
||||
"GameListContextMenuManageTitleUpdates": "Gestisci aggiornamenti del gioco",
|
||||
"GameListContextMenuManageTitleUpdatesToolTip": "Apre la finestra di gestione aggiornamenti del gioco",
|
||||
"GameListContextMenuManageDlc": "Gestici DLC",
|
||||
"GameListContextMenuManageDlcToolTip": "Apre la finestra di gestione DLC",
|
||||
"GameListContextMenuOpenModsDirectory": "Apri cartella delle mod",
|
||||
"GameListContextMenuOpenModsDirectoryToolTip": "Apre la cartella che contiene le mod dell'applicazione",
|
||||
"GameListContextMenuManageDlc": "Gestisci DLC",
|
||||
"GameListContextMenuManageDlcToolTip": "Apre la finestra di gestione dei DLC",
|
||||
"GameListContextMenuCacheManagement": "Gestione della cache",
|
||||
"GameListContextMenuCacheManagementPurgePptc": "Pulisci PPTC cache",
|
||||
"GameListContextMenuCacheManagementPurgePptcToolTip": "Elimina la PPTC cache dell'applicazione",
|
||||
"GameListContextMenuCacheManagementPurgeShaderCache": "Pulisci shader cache",
|
||||
"GameListContextMenuCacheManagementPurgeShaderCacheToolTip": "Elimina la shader cache dell'applicazione",
|
||||
"GameListContextMenuCacheManagementOpenPptcDirectory": "Apri cartella PPTC",
|
||||
"GameListContextMenuCacheManagementOpenPptcDirectoryToolTip": "Apre la cartella che contiene la PPTC cache dell'applicazione",
|
||||
"GameListContextMenuCacheManagementOpenShaderCacheDirectory": "Apri cartella shader cache",
|
||||
"GameListContextMenuCacheManagementOpenShaderCacheDirectoryToolTip": "Apre la cartella che contiene la shader cache dell'applicazione",
|
||||
"GameListContextMenuCacheManagementPurgePptc": "Accoda rigenerazione della cache PPTC",
|
||||
"GameListContextMenuCacheManagementPurgePptcToolTip": "Esegue la rigenerazione della cache PPTC al prossimo avvio del gioco",
|
||||
"GameListContextMenuCacheManagementPurgeShaderCache": "Elimina la cache degli shader",
|
||||
"GameListContextMenuCacheManagementPurgeShaderCacheToolTip": "Elimina la cache degli shader dell'applicazione",
|
||||
"GameListContextMenuCacheManagementOpenPptcDirectory": "Apri la cartella della cache PPTC",
|
||||
"GameListContextMenuCacheManagementOpenPptcDirectoryToolTip": "Apre la cartella che contiene la cache PPTC dell'applicazione",
|
||||
"GameListContextMenuCacheManagementOpenShaderCacheDirectory": "Apri la cartella della cache degli shader",
|
||||
"GameListContextMenuCacheManagementOpenShaderCacheDirectoryToolTip": "Apre la cartella che contiene la cache degli shader dell'applicazione",
|
||||
"GameListContextMenuExtractData": "Estrai dati",
|
||||
"GameListContextMenuExtractDataExeFS": "ExeFS",
|
||||
"GameListContextMenuExtractDataExeFSToolTip": "Estrae la sezione ExeFS dall'attuale configurazione dell'applicazione (includendo aggiornamenti)",
|
||||
|
@ -72,9 +70,16 @@
|
|||
"GameListContextMenuExtractDataRomFSToolTip": "Estrae la sezione RomFS dall'attuale configurazione dell'applicazione (includendo aggiornamenti)",
|
||||
"GameListContextMenuExtractDataLogo": "Logo",
|
||||
"GameListContextMenuExtractDataLogoToolTip": "Estrae la sezione Logo dall'attuale configurazione dell'applicazione (includendo aggiornamenti)",
|
||||
"StatusBarGamesLoaded": "{0}/{1} Giochi caricati",
|
||||
"GameListContextMenuCreateShortcut": "Crea collegamento",
|
||||
"GameListContextMenuCreateShortcutToolTip": "Crea un collegamento sul desktop che avvia l'applicazione selezionata",
|
||||
"GameListContextMenuCreateShortcutToolTipMacOS": "Crea un collegamento nella cartella Applicazioni di macOS che avvia l'applicazione selezionata",
|
||||
"GameListContextMenuOpenModsDirectory": "Apri la cartella delle mod",
|
||||
"GameListContextMenuOpenModsDirectoryToolTip": "Apre la cartella che contiene le mod dell'applicazione",
|
||||
"GameListContextMenuOpenSdModsDirectory": "Apri la cartella delle mod Atmosphere",
|
||||
"GameListContextMenuOpenSdModsDirectoryToolTip": "Apre la cartella alternativa di Atmosphere sulla scheda SD che contiene le mod dell'applicazione. Utile per le mod create per funzionare sull'hardware reale.",
|
||||
"StatusBarGamesLoaded": "{0}/{1} giochi caricati",
|
||||
"StatusBarSystemVersion": "Versione di sistema: {0}",
|
||||
"LinuxVmMaxMapCountDialogTitle": "Limite basso per le mappature di memoria rilevate",
|
||||
"LinuxVmMaxMapCountDialogTitle": "Rilevato limite basso per le mappature di memoria",
|
||||
"LinuxVmMaxMapCountDialogTextPrimary": "Vuoi aumentare il valore di vm.max_map_count a {0}?",
|
||||
"LinuxVmMaxMapCountDialogTextSecondary": "Alcuni giochi potrebbero provare a creare più mappature di memoria di quanto sia attualmente consentito. Ryujinx si bloccherà non appena questo limite viene superato.",
|
||||
"LinuxVmMaxMapCountDialogButtonUntilRestart": "Sì, fino al prossimo riavvio",
|
||||
|
@ -89,7 +94,7 @@
|
|||
"SettingsTabGeneralShowConfirmExitDialog": "Mostra dialogo \"Conferma Uscita\"",
|
||||
"SettingsTabGeneralHideCursor": "Nascondi il cursore:",
|
||||
"SettingsTabGeneralHideCursorNever": "Mai",
|
||||
"SettingsTabGeneralHideCursorOnIdle": "Nascondi cursore inattivo",
|
||||
"SettingsTabGeneralHideCursorOnIdle": "Quando è inattivo",
|
||||
"SettingsTabGeneralHideCursorAlways": "Sempre",
|
||||
"SettingsTabGeneralGameDirectories": "Cartelle dei giochi",
|
||||
"SettingsTabGeneralAdd": "Aggiungi",
|
||||
|
@ -128,17 +133,17 @@
|
|||
"SettingsTabSystemEnablePptc": "Attiva PPTC (Profiled Persistent Translation Cache)",
|
||||
"SettingsTabSystemEnableFsIntegrityChecks": "Attiva controlli d'integrità FS",
|
||||
"SettingsTabSystemAudioBackend": "Backend audio:",
|
||||
"SettingsTabSystemAudioBackendDummy": "Manichino",
|
||||
"SettingsTabSystemAudioBackendDummy": "Dummy",
|
||||
"SettingsTabSystemAudioBackendOpenAL": "OpenAL",
|
||||
"SettingsTabSystemAudioBackendSoundIO": "AudioIO",
|
||||
"SettingsTabSystemAudioBackendSoundIO": "SoundIO",
|
||||
"SettingsTabSystemAudioBackendSDL2": "SDL2",
|
||||
"SettingsTabSystemHacks": "Trucchi",
|
||||
"SettingsTabSystemHacksNote": " (Possono causare instabilità)",
|
||||
"SettingsTabSystemExpandDramSize": "Espandi dimensione DRAM a 6GiB",
|
||||
"SettingsTabSystemHacks": "Espedienti",
|
||||
"SettingsTabSystemHacksNote": "Possono causare instabilità",
|
||||
"SettingsTabSystemExpandDramSize": "Usa layout di memoria alternativo (per sviluppatori)",
|
||||
"SettingsTabSystemIgnoreMissingServices": "Ignora servizi mancanti",
|
||||
"SettingsTabGraphics": "Grafica",
|
||||
"SettingsTabGraphicsAPI": "API Grafiche",
|
||||
"SettingsTabGraphicsEnableShaderCache": "Attiva Shader Cache",
|
||||
"SettingsTabGraphicsAPI": "API grafica",
|
||||
"SettingsTabGraphicsEnableShaderCache": "Attiva la cache degli shader",
|
||||
"SettingsTabGraphicsAnisotropicFiltering": "Filtro anisotropico:",
|
||||
"SettingsTabGraphicsAnisotropicFilteringAuto": "Auto",
|
||||
"SettingsTabGraphicsAnisotropicFiltering2x": "2x",
|
||||
|
@ -150,7 +155,7 @@
|
|||
"SettingsTabGraphicsResolutionScaleNative": "Nativa (720p/1080p)",
|
||||
"SettingsTabGraphicsResolutionScale2x": "2x (1440p/2160p)",
|
||||
"SettingsTabGraphicsResolutionScale3x": "3x (2160p/3240p)",
|
||||
"SettingsTabGraphicsResolutionScale4x": "4x (2880p/4320p)",
|
||||
"SettingsTabGraphicsResolutionScale4x": "4x (2880p/4320p) (Non consigliato)",
|
||||
"SettingsTabGraphicsAspectRatio": "Rapporto d'aspetto:",
|
||||
"SettingsTabGraphicsAspectRatio4x3": "4:3",
|
||||
"SettingsTabGraphicsAspectRatio16x9": "16:9",
|
||||
|
@ -158,34 +163,34 @@
|
|||
"SettingsTabGraphicsAspectRatio21x9": "21:9",
|
||||
"SettingsTabGraphicsAspectRatio32x9": "32:9",
|
||||
"SettingsTabGraphicsAspectRatioStretch": "Adatta alla finestra",
|
||||
"SettingsTabGraphicsDeveloperOptions": "Opzioni da sviluppatore",
|
||||
"SettingsTabGraphicsShaderDumpPath": "Percorso di dump degli shaders:",
|
||||
"SettingsTabGraphicsDeveloperOptions": "Opzioni per sviluppatori",
|
||||
"SettingsTabGraphicsShaderDumpPath": "Percorso di dump degli shader:",
|
||||
"SettingsTabLogging": "Log",
|
||||
"SettingsTabLoggingLogging": "Log",
|
||||
"SettingsTabLoggingEnableLoggingToFile": "Salva i log su file",
|
||||
"SettingsTabLoggingEnableStubLogs": "Attiva Stub Logs",
|
||||
"SettingsTabLoggingEnableInfoLogs": "Attiva Info Logs",
|
||||
"SettingsTabLoggingEnableWarningLogs": "Attiva Warning Logs",
|
||||
"SettingsTabLoggingEnableErrorLogs": "Attiva Error Logs",
|
||||
"SettingsTabLoggingEnableTraceLogs": "Attiva Trace Logs",
|
||||
"SettingsTabLoggingEnableGuestLogs": "Attiva Guest Logs",
|
||||
"SettingsTabLoggingEnableFsAccessLogs": "Attiva Fs Access Logs",
|
||||
"SettingsTabLoggingFsGlobalAccessLogMode": "Modalità log accesso globale Fs:",
|
||||
"SettingsTabLoggingDeveloperOptions": "Opzioni da sviluppatore (AVVISO: Ridurrà le prestazioni)",
|
||||
"SettingsTabLoggingEnableStubLogs": "Attiva log di stub",
|
||||
"SettingsTabLoggingEnableInfoLogs": "Attiva log di informazioni",
|
||||
"SettingsTabLoggingEnableWarningLogs": "Attiva log di avviso",
|
||||
"SettingsTabLoggingEnableErrorLogs": "Attiva log di errore",
|
||||
"SettingsTabLoggingEnableTraceLogs": "Attiva log di trace",
|
||||
"SettingsTabLoggingEnableGuestLogs": "Attiva log del guest",
|
||||
"SettingsTabLoggingEnableFsAccessLogs": "Attiva log di accesso FS",
|
||||
"SettingsTabLoggingFsGlobalAccessLogMode": "Modalità log di accesso globale FS:",
|
||||
"SettingsTabLoggingDeveloperOptions": "Opzioni per sviluppatori",
|
||||
"SettingsTabLoggingDeveloperOptionsNote": "ATTENZIONE: ridurrà le prestazioni",
|
||||
"SettingsTabLoggingGraphicsBackendLogLevel": "Livello registro backend grafico:",
|
||||
"SettingsTabLoggingGraphicsBackendLogLevel": "Livello di log del backend grafico:",
|
||||
"SettingsTabLoggingGraphicsBackendLogLevelNone": "Nessuno",
|
||||
"SettingsTabLoggingGraphicsBackendLogLevelError": "Errore",
|
||||
"SettingsTabLoggingGraphicsBackendLogLevelPerformance": "Rallentamenti",
|
||||
"SettingsTabLoggingGraphicsBackendLogLevelAll": "Tutto",
|
||||
"SettingsTabLoggingEnableDebugLogs": "Attiva logs di debug",
|
||||
"SettingsTabLoggingEnableDebugLogs": "Attiva log di debug",
|
||||
"SettingsTabInput": "Input",
|
||||
"SettingsTabInputEnableDockedMode": "Attiva modalità TV",
|
||||
"SettingsTabInputDirectKeyboardAccess": "Accesso diretto alla tastiera",
|
||||
"SettingsButtonSave": "Salva",
|
||||
"SettingsButtonClose": "Chiudi",
|
||||
"SettingsButtonOk": "OK",
|
||||
"SettingsButtonCancel": "Cancella",
|
||||
"SettingsButtonCancel": "Annulla",
|
||||
"SettingsButtonApply": "Applica",
|
||||
"ControllerSettingsPlayer": "Giocatore",
|
||||
"ControllerSettingsPlayer1": "Giocatore 1",
|
||||
|
@ -232,8 +237,8 @@
|
|||
"ControllerSettingsStickInvertXAxis": "Inverti levetta X",
|
||||
"ControllerSettingsStickInvertYAxis": "Inverti levetta Y",
|
||||
"ControllerSettingsStickDeadzone": "Zona morta:",
|
||||
"ControllerSettingsLStick": "Stick sinistro",
|
||||
"ControllerSettingsRStick": "Stick destro",
|
||||
"ControllerSettingsLStick": "Levetta sinistra",
|
||||
"ControllerSettingsRStick": "Levetta destra",
|
||||
"ControllerSettingsTriggersLeft": "Grilletto sinistro",
|
||||
"ControllerSettingsTriggersRight": "Grilletto destro",
|
||||
"ControllerSettingsTriggersButtonsLeft": "Pulsante dorsale sinistro",
|
||||
|
@ -247,7 +252,7 @@
|
|||
"ControllerSettingsLeftSR": "SR",
|
||||
"ControllerSettingsRightSL": "SL",
|
||||
"ControllerSettingsRightSR": "SR",
|
||||
"ControllerSettingsExtraButtonsLeft": "Tasto sinitro",
|
||||
"ControllerSettingsExtraButtonsLeft": "Tasto sinistro",
|
||||
"ControllerSettingsExtraButtonsRight": "Tasto destro",
|
||||
"ControllerSettingsMisc": "Varie",
|
||||
"ControllerSettingsTriggerThreshold": "Sensibilità dei grilletti:",
|
||||
|
@ -274,10 +279,10 @@
|
|||
"ProfileImageSelectionNote": "Puoi importare un'immagine profilo personalizzata o selezionare un avatar dal firmware del sistema",
|
||||
"ProfileImageSelectionImportImage": "Importa file immagine",
|
||||
"ProfileImageSelectionSelectAvatar": "Seleziona avatar dal firmware",
|
||||
"InputDialogTitle": "Finestra di dialogo ",
|
||||
"InputDialogTitle": "Finestra di input",
|
||||
"InputDialogOk": "OK",
|
||||
"InputDialogCancel": "Annulla",
|
||||
"InputDialogAddNewProfileTitle": "Scegli il nome profilo",
|
||||
"InputDialogAddNewProfileTitle": "Scegli il nome del profilo",
|
||||
"InputDialogAddNewProfileHeader": "Digita un nome profilo",
|
||||
"InputDialogAddNewProfileSubtext": "(Lunghezza massima: {0})",
|
||||
"AvatarChoose": "Scegli",
|
||||
|
@ -287,18 +292,14 @@
|
|||
"ControllerSettingsAddProfileToolTip": "Aggiungi profilo",
|
||||
"ControllerSettingsRemoveProfileToolTip": "Rimuovi profilo",
|
||||
"ControllerSettingsSaveProfileToolTip": "Salva profilo",
|
||||
"MenuBarFileToolsTakeScreenshot": "Fai uno screenshot",
|
||||
"MenuBarFileToolsHideUi": "Nascondi UI",
|
||||
"MenuBarFileToolsTakeScreenshot": "Cattura uno screenshot",
|
||||
"MenuBarFileToolsHideUi": "Nascondi l'interfaccia",
|
||||
"GameListContextMenuRunApplication": "Esegui applicazione",
|
||||
"GameListContextMenuToggleFavorite": "Preferito",
|
||||
"GameListContextMenuToggleFavoriteToolTip": "Segna il gioco come preferito",
|
||||
"SettingsTabGeneralTheme": "Tema",
|
||||
"SettingsTabGeneralThemeCustomTheme": "Percorso del tema personalizzato",
|
||||
"SettingsTabGeneralThemeBaseStyle": "Modalità",
|
||||
"SettingsTabGeneralThemeBaseStyleDark": "Scura",
|
||||
"SettingsTabGeneralThemeBaseStyleLight": "Chiara",
|
||||
"SettingsTabGeneralThemeEnableCustomTheme": "Attiva tema personalizzato",
|
||||
"ButtonBrowse": "Sfoglia",
|
||||
"SettingsTabGeneralTheme": "Tema:",
|
||||
"SettingsTabGeneralThemeDark": "Scuro",
|
||||
"SettingsTabGeneralThemeLight": "Chiaro",
|
||||
"ControllerSettingsConfigureGeneral": "Configura",
|
||||
"ControllerSettingsRumble": "Vibrazione",
|
||||
"ControllerSettingsRumbleStrongMultiplier": "Moltiplicatore vibrazione forte",
|
||||
|
@ -317,14 +318,14 @@
|
|||
"DialogMessageFindSaveErrorMessage": "C'è stato un errore durante la ricerca dei dati di salvataggio: {0}",
|
||||
"FolderDialogExtractTitle": "Scegli una cartella in cui estrarre",
|
||||
"DialogNcaExtractionMessage": "Estrazione della sezione {0} da {1}...",
|
||||
"DialogNcaExtractionTitle": "Ryujinx - Estrattore sezione NCA",
|
||||
"DialogNcaExtractionTitle": "Ryujinx - Estrazione sezione NCA",
|
||||
"DialogNcaExtractionMainNcaNotFoundErrorMessage": "L'estrazione è fallita. L'NCA principale non era presente nel file selezionato.",
|
||||
"DialogNcaExtractionCheckLogErrorMessage": "L'estrazione è fallita. Leggi il log per più informazioni.",
|
||||
"DialogNcaExtractionCheckLogErrorMessage": "L'estrazione è fallita. Consulta il file di log per maggiori informazioni.",
|
||||
"DialogNcaExtractionSuccessMessage": "Estrazione completata con successo.",
|
||||
"DialogUpdaterConvertFailedMessage": "La conversione dell'attuale versione di Ryujinx è fallita.",
|
||||
"DialogUpdaterCancelUpdateMessage": "Annullando l'aggiornamento!",
|
||||
"DialogUpdaterCancelUpdateMessage": "Annullamento dell'aggiornamento in corso!",
|
||||
"DialogUpdaterAlreadyOnLatestVersionMessage": "Stai già usando la versione più recente di Ryujinx!",
|
||||
"DialogUpdaterFailedToGetVersionMessage": "Si è verificato un errore durante il tentativo di ottenere informazioni sulla versione da GitHub Release. Ciò può essere causato se una nuova versione viene compilata da GitHub Actions. Riprova tra qualche minuto.",
|
||||
"DialogUpdaterFailedToGetVersionMessage": "Si è verificato un errore durante il tentativo di recuperare le informazioni sulla versione da GitHub Release. Ciò può verificarsi se una nuova versione è in fase di compilazione da GitHub Actions. Riprova tra qualche minuto.",
|
||||
"DialogUpdaterConvertFailedGithubMessage": "La conversione della versione di Ryujinx ricevuta da Github Release è fallita.",
|
||||
"DialogUpdaterDownloadingMessage": "Download dell'aggiornamento...",
|
||||
"DialogUpdaterExtractionMessage": "Estrazione dell'aggiornamento...",
|
||||
|
@ -332,14 +333,12 @@
|
|||
"DialogUpdaterAddingFilesMessage": "Aggiunta del nuovo aggiornamento...",
|
||||
"DialogUpdaterCompleteMessage": "Aggiornamento completato!",
|
||||
"DialogUpdaterRestartMessage": "Vuoi riavviare Ryujinx adesso?",
|
||||
"DialogUpdaterArchNotSupportedMessage": "Non stai usando un'architettura di sistema supportata!",
|
||||
"DialogUpdaterArchNotSupportedSubMessage": "(Solo sistemi x64 sono supportati!)",
|
||||
"DialogUpdaterNoInternetMessage": "Non sei connesso ad Internet!",
|
||||
"DialogUpdaterNoInternetSubMessage": "Verifica di avere una connessione ad Internet funzionante!",
|
||||
"DialogUpdaterDirtyBuildMessage": "Non puoi aggiornare una Dirty build di Ryujinx!",
|
||||
"DialogUpdaterDirtyBuildSubMessage": "Scarica Ryujinx da https://ryujinx.org/ se stai cercando una versione supportata.",
|
||||
"DialogRestartRequiredMessage": "Riavvio richiesto",
|
||||
"DialogThemeRestartMessage": "Il tema è stato salvato. E' richiesto un riavvio per applicare un tema.",
|
||||
"DialogThemeRestartMessage": "Il tema è stato salvato. È richiesto un riavvio per applicare il tema.",
|
||||
"DialogThemeRestartSubMessage": "Vuoi riavviare?",
|
||||
"DialogFirmwareInstallEmbeddedMessage": "Vuoi installare il firmware incorporato in questo gioco? (Firmware {0})",
|
||||
"DialogFirmwareInstallEmbeddedSuccessMessage": "Non è stato trovato alcun firmware installato, ma Ryujinx è riuscito ad installare il firmware {0} dal gioco fornito.\nL'emulatore si avvierà adesso.",
|
||||
|
@ -355,7 +354,7 @@
|
|||
"DialogSoftwareKeyboardErrorExceptionMessage": "Errore nella visualizzazione della tastiera software: {0}",
|
||||
"DialogErrorAppletErrorExceptionMessage": "Errore nella visualizzazione dell'ErrorApplet Dialog: {0}",
|
||||
"DialogUserErrorDialogMessage": "{0}: {1}",
|
||||
"DialogUserErrorDialogInfoMessage": "\nPer più informazioni su come risolvere questo errore, segui la nostra guida all'installazione.",
|
||||
"DialogUserErrorDialogInfoMessage": "\nPer maggiori informazioni su come risolvere questo errore, segui la nostra guida all'installazione.",
|
||||
"DialogUserErrorDialogTitle": "Errore di Ryujinx ({0})",
|
||||
"DialogAmiiboApiTitle": "Amiibo API",
|
||||
"DialogAmiiboApiFailFetchMessage": "Si è verificato un errore durante il recupero delle informazioni dall'API.",
|
||||
|
@ -365,10 +364,10 @@
|
|||
"DialogProfileDeleteProfileTitle": "Eliminazione profilo",
|
||||
"DialogProfileDeleteProfileMessage": "Quest'azione è irreversibile, sei sicuro di voler continuare?",
|
||||
"DialogWarning": "Avviso",
|
||||
"DialogPPTCDeletionMessage": "Stai per eliminare la PPTC cache per :\n\n{0}\n\nSei sicuro di voler proseguire?",
|
||||
"DialogPPTCDeletionErrorMessage": "Errore nell'eliminazione della PPTC cache a {0}: {1}",
|
||||
"DialogShaderDeletionMessage": "Stai per eliminare la Shader cache per :\n\n{0}\n\nSei sicuro di voler proseguire?",
|
||||
"DialogShaderDeletionErrorMessage": "Errore nell'eliminazione della Shader cache a {0}: {1}",
|
||||
"DialogPPTCDeletionMessage": "Stai per accodare la rigenerazione della cache PPTC al prossimo avvio per:\n\n{0}\n\nSei sicuro di voler proseguire?",
|
||||
"DialogPPTCDeletionErrorMessage": "Errore nell'eliminazione della cache PPTC a {0}: {1}",
|
||||
"DialogShaderDeletionMessage": "Stai per eliminare la cache degli shader per:\n\n{0}\n\nSei sicuro di voler proseguire?",
|
||||
"DialogShaderDeletionErrorMessage": "Errore nell'eliminazione della cache degli shader a {0}: {1}",
|
||||
"DialogRyujinxErrorMessage": "Ryujinx ha incontrato un errore",
|
||||
"DialogInvalidTitleIdErrorMessage": "Errore UI: Il gioco selezionato non ha un ID titolo valido",
|
||||
"DialogFirmwareInstallerFirmwareNotFoundErrorMessage": "Un firmware del sistema valido non è stato trovato in {0}.",
|
||||
|
@ -385,26 +384,31 @@
|
|||
"DialogUserProfileUnsavedChangesSubMessage": "Vuoi scartare le modifiche?",
|
||||
"DialogControllerSettingsModifiedConfirmMessage": "Le attuali impostazioni del controller sono state aggiornate.",
|
||||
"DialogControllerSettingsModifiedConfirmSubMessage": "Vuoi salvare?",
|
||||
"DialogLoadNcaErrorMessage": "{0}. File errato: {1}",
|
||||
"DialogLoadFileErrorMessage": "{0}. Errore File: {1}",
|
||||
"DialogModAlreadyExistsMessage": "La mod risulta già installata",
|
||||
"DialogModInvalidMessage": "La cartella specificata non contiene nessuna mod!",
|
||||
"DialogModDeleteNoParentMessage": "Eliminazione non riuscita: impossibile trovare la directory superiore per la mod \"{0}\"!",
|
||||
"DialogDlcNoDlcErrorMessage": "Il file specificato non contiene un DLC per il titolo selezionato!",
|
||||
"DialogPerformanceCheckLoggingEnabledMessage": "Hai abilitato il trace logging, che è progettato per essere usato solo dagli sviluppatori.",
|
||||
"DialogPerformanceCheckLoggingEnabledConfirmMessage": "Per prestazioni ottimali, si raccomanda di disabilitare il trace logging. Vuoi disabilitare il debug logging adesso?",
|
||||
"DialogPerformanceCheckShaderDumpEnabledMessage": "Hai abilitato lo shader dumping, che è progettato per essere usato solo dagli sviluppatori.",
|
||||
"DialogPerformanceCheckShaderDumpEnabledConfirmMessage": "Per prestazioni ottimali, si raccomanda di disabilitare lo shader dumping. Vuoi disabilitare lo shader dumping adesso?",
|
||||
"DialogPerformanceCheckLoggingEnabledConfirmMessage": "Per prestazioni ottimali, si raccomanda di disabilitare il trace logging. Vuoi disabilitarlo adesso?",
|
||||
"DialogPerformanceCheckShaderDumpEnabledMessage": "Hai abilitato il dump degli shader, che è progettato per essere usato solo dagli sviluppatori.",
|
||||
"DialogPerformanceCheckShaderDumpEnabledConfirmMessage": "Per prestazioni ottimali, si raccomanda di disabilitare il dump degli shader. Vuoi disabilitarlo adesso?",
|
||||
"DialogLoadAppGameAlreadyLoadedMessage": "Un gioco è già stato caricato",
|
||||
"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!",
|
||||
"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?",
|
||||
"DialogModManagerDeletionAllWarningMessage": "Stai per eliminare tutte le mod per questo titolo.\n\nVuoi davvero procedere?",
|
||||
"SettingsTabGraphicsFeaturesOptions": "Funzionalità",
|
||||
"SettingsTabGraphicsBackendMultithreading": "Graphics Backend Multithreading",
|
||||
"SettingsTabGraphicsBackendMultithreading": "Multithreading del backend grafico:",
|
||||
"CommonAuto": "Auto",
|
||||
"CommonOff": "Spento",
|
||||
"CommonOn": "Acceso",
|
||||
"InputDialogYes": "Si",
|
||||
"CommonOff": "Disattivato",
|
||||
"CommonOn": "Attivo",
|
||||
"InputDialogYes": "Sì",
|
||||
"InputDialogNo": "No",
|
||||
"DialogProfileInvalidProfileNameErrorMessage": "Il nome del file contiene caratteri non validi. Riprova.",
|
||||
"MenuBarOptionsPauseEmulation": "Pausa",
|
||||
"DialogProfileInvalidProfileNameErrorMessage": "Il nome del file contiene dei caratteri non validi. Riprova.",
|
||||
"MenuBarOptionsPauseEmulation": "Metti in pausa",
|
||||
"MenuBarOptionsResumeEmulation": "Riprendi",
|
||||
"AboutUrlTooltipMessage": "Clicca per aprire il sito web di Ryujinx nel tuo browser predefinito.",
|
||||
"AboutDisclaimerMessage": "Ryujinx non è affiliato con Nintendo™,\no i suoi partner, in alcun modo.",
|
||||
|
@ -414,15 +418,15 @@
|
|||
"AboutDiscordUrlTooltipMessage": "Clicca per aprire un invito al server Discord di Ryujinx nel tuo browser predefinito.",
|
||||
"AboutTwitterUrlTooltipMessage": "Clicca per aprire la pagina Twitter di Ryujinx nel tuo browser predefinito.",
|
||||
"AboutRyujinxAboutTitle": "Informazioni:",
|
||||
"AboutRyujinxAboutContent": "Ryujinx è un emulatore per la Nintendo Switch™.\nPer favore supportaci su Patreon.\nRicevi tutte le ultime notizie sul nostro Twitter o su Discord.\nGli sviluppatori interessati a contribuire possono trovare più informazioni sul nostro GitHub o Discord.",
|
||||
"AboutRyujinxAboutContent": "Ryujinx è un emulatore per la console Nintendo Switch™.\nSostienici su Patreon.\nRicevi tutte le ultime notizie sul nostro Twitter o su Discord.\nGli sviluppatori interessati a contribuire possono trovare più informazioni sul nostro GitHub o Discord.",
|
||||
"AboutRyujinxMaintainersTitle": "Mantenuto da:",
|
||||
"AboutRyujinxMaintainersContentTooltipMessage": "Clicca per aprire la pagina dei Contributors nel tuo browser predefinito.",
|
||||
"AboutRyujinxMaintainersContentTooltipMessage": "Clicca per aprire la pagina dei contributori nel tuo browser predefinito.",
|
||||
"AboutRyujinxSupprtersTitle": "Supportato su Patreon da:",
|
||||
"AmiiboSeriesLabel": "Serie Amiibo",
|
||||
"AmiiboCharacterLabel": "Personaggio",
|
||||
"AmiiboScanButtonLabel": "Scannerizza",
|
||||
"AmiiboScanButtonLabel": "Scansiona",
|
||||
"AmiiboOptionsShowAllLabel": "Mostra tutti gli amiibo",
|
||||
"AmiiboOptionsUsRandomTagLabel": "Hack: Usa un tag uuid casuale",
|
||||
"AmiiboOptionsUsRandomTagLabel": "Espediente: Usa un UUID del tag casuale",
|
||||
"DlcManagerTableHeadingEnabledLabel": "Abilitato",
|
||||
"DlcManagerTableHeadingTitleIdLabel": "ID Titolo",
|
||||
"DlcManagerTableHeadingContainerPathLabel": "Percorso del contenitore",
|
||||
|
@ -430,6 +434,7 @@
|
|||
"DlcManagerRemoveAllButton": "Rimuovi tutti",
|
||||
"DlcManagerEnableAllButton": "Abilita tutto",
|
||||
"DlcManagerDisableAllButton": "Disabilita tutto",
|
||||
"ModManagerDeleteAllButton": "Elimina tutto",
|
||||
"MenuBarOptionsChangeLanguage": "Cambia lingua",
|
||||
"MenuBarShowFileTypes": "Mostra tipi di file",
|
||||
"CommonSort": "Ordina",
|
||||
|
@ -437,73 +442,75 @@
|
|||
"CommonFavorite": "Preferito",
|
||||
"OrderAscending": "Crescente",
|
||||
"OrderDescending": "Decrescente",
|
||||
"SettingsTabGraphicsFeatures": "Funzionalità & Miglioramenti",
|
||||
"ErrorWindowTitle": "Finestra errore",
|
||||
"ToggleDiscordTooltip": "Attiva o disattiva Discord Rich Presence",
|
||||
"AddGameDirBoxTooltip": "Inserisci la directory di un gioco per aggiungerlo alla lista",
|
||||
"AddGameDirTooltip": "Aggiungi la directory di un gioco alla lista",
|
||||
"RemoveGameDirTooltip": "Rimuovi la directory di gioco selezionata",
|
||||
"SettingsTabGraphicsFeatures": "Funzionalità e miglioramenti",
|
||||
"ErrorWindowTitle": "Finestra di errore",
|
||||
"ToggleDiscordTooltip": "Scegli se mostrare o meno Ryujinx nella tua attività su Discord",
|
||||
"AddGameDirBoxTooltip": "Inserisci una cartella dei giochi per aggiungerla alla lista",
|
||||
"AddGameDirTooltip": "Aggiungi una cartella dei giochi alla lista",
|
||||
"RemoveGameDirTooltip": "Rimuovi la cartella dei giochi selezionata",
|
||||
"CustomThemeCheckTooltip": "Attiva o disattiva temi personalizzati nella GUI",
|
||||
"CustomThemePathTooltip": "Percorso al tema GUI personalizzato",
|
||||
"CustomThemeBrowseTooltip": "Sfoglia per cercare un tema GUI personalizzato",
|
||||
"DockModeToggleTooltip": "Attiva o disabilta modalità TV",
|
||||
"DirectKeyboardTooltip": "Attiva o disattiva \"il supporto all'accesso diretto alla tastiera (HID)\" (Fornisce l'accesso ai giochi alla tua tastiera come dispositivo di immissione del testo)",
|
||||
"DirectMouseTooltip": "Attiva o disattiva \"il supporto all'accesso diretto al mouse (HID)\" (Fornisce l'accesso ai giochi al tuo mouse come dispositivo di puntamento)",
|
||||
"DockModeToggleTooltip": "La modalità TV fa sì che il sistema emulato si comporti come una Nintendo Switch posizionata nella sua base. Ciò migliora la qualità grafica nella maggior parte dei giochi. Al contrario, disabilitandola il sistema emulato si comporterà come una Nintendo Switch in modalità portatile, riducendo la qualità grafica.\n\nConfigura i controlli del giocatore 1 se intendi usare la modalità TV; configura i controlli della modalità portatile se intendi usare quest'ultima.\n\nNel dubbio, lascia l'opzione attiva.",
|
||||
"DirectKeyboardTooltip": "Supporto per l'accesso diretto alla tastiera (HID). Fornisce ai giochi l'accesso alla tastiera come dispositivo di inserimento del testo.\n\nFunziona solo con i giochi che supportano nativamente l'utilizzo della tastiera su hardware Switch.\n\nNel dubbio, lascia l'opzione disattivata.",
|
||||
"DirectMouseTooltip": "Supporto per l'accesso diretto al mouse (HID). Fornisce ai giochi l'accesso al mouse come dispositivo di puntamento.\n\nFunziona solo con i rari giochi che supportano nativamente l'utilizzo del mouse su hardware Switch.\n\nQuando questa opzione è attivata, il touchscreen potrebbe non funzionare.\n\nNel dubbio, lascia l'opzione disattivata.",
|
||||
"RegionTooltip": "Cambia regione di sistema",
|
||||
"LanguageTooltip": "Cambia lingua di sistema",
|
||||
"TimezoneTooltip": "Cambia fuso orario di sistema",
|
||||
"TimeTooltip": "Cambia data e ora di sistema",
|
||||
"VSyncToggleTooltip": "Attiva o disattiva sincronizzazione verticale",
|
||||
"PptcToggleTooltip": "Attiva o disattiva PPTC",
|
||||
"FsIntegrityToggleTooltip": "Attiva controlli d'integrità sui file dei contenuti di gioco",
|
||||
"AudioBackendTooltip": "Cambia backend audio",
|
||||
"MemoryManagerTooltip": "Cambia il modo in cui la memoria guest è mappata e vi si accede. Influisce notevolmente sulle prestazioni della CPU emulata.",
|
||||
"VSyncToggleTooltip": "Sincronizzazione verticale della console Emulata. Essenzialmente un limitatore di frame per la maggior parte dei giochi; disabilitarlo può far girare giochi a velocità più alta, allungare le schermate di caricamento o farle bloccare.\n\nPuò essere attivata in gioco con un tasto di scelta rapida (F1 per impostazione predefinita). Ti consigliamo di farlo se hai intenzione di disabilitarlo.\n\nLascia ON se non sei sicuro.",
|
||||
"PptcToggleTooltip": "Salva le funzioni JIT tradotte in modo che non debbano essere tradotte tutte le volte che si avvia un determinato gioco.\n\nRiduce i fenomeni di stuttering e velocizza sensibilmente gli avvii successivi del gioco.\n\nNel dubbio, lascia l'opzione attiva.",
|
||||
"FsIntegrityToggleTooltip": "Controlla la presenza di file corrotti quando si avvia un gioco. Se vengono rilevati dei file corrotti, verrà mostrato un errore di hash nel log.\n\nQuesta opzione non influisce sulle prestazioni ed è pensata per facilitare la risoluzione dei problemi.\n\nNel dubbio, lascia l'opzione attiva.",
|
||||
"AudioBackendTooltip": "Cambia il backend usato per riprodurre l'audio.\n\nSDL2 è quello preferito, mentre OpenAL e SoundIO sono usati come ripiego. Dummy non riprodurrà alcun suono.\n\nNel dubbio, imposta l'opzione su SDL2.",
|
||||
"MemoryManagerTooltip": "Cambia il modo in cui la memoria guest è mappata e vi si accede. Influisce notevolmente sulle prestazioni della CPU emulata.\n\nNel dubbio, imposta l'opzione su Host Unchecked.",
|
||||
"MemoryManagerSoftwareTooltip": "Usa una software page table per la traduzione degli indirizzi. Massima precisione ma prestazioni più lente.",
|
||||
"MemoryManagerHostTooltip": "Mappa direttamente la memoria nello spazio degli indirizzi dell'host. Compilazione ed esecuzione JIT molto più veloce.",
|
||||
"MemoryManagerUnsafeTooltip": "Mappa direttamente la memoria, ma non maschera l'indirizzo all'interno dello spazio degli indirizzi guest prima dell'accesso. Più veloce, ma a costo della sicurezza. L'applicazione guest può accedere alla memoria da qualsiasi punto di Ryujinx, quindi esegui solo programmi di cui ti fidi con questa modalità.",
|
||||
"UseHypervisorTooltip": "Usa Hypervisor invece di JIT. Migliora notevolmente le prestazioni quando disponibile, ma può essere instabile nel suo stato attuale.",
|
||||
"DRamTooltip": "Espande l'ammontare di memoria sul sistema emulato da 4GiB A 6GiB",
|
||||
"IgnoreMissingServicesTooltip": "Attiva o disattiva l'opzione di ignorare i servizi mancanti",
|
||||
"GraphicsBackendThreadingTooltip": "Attiva il Graphics Backend Multithreading",
|
||||
"GalThreadingTooltip": "Esegue i comandi del backend grafico su un secondo thread. Permette il multithreading runtime della compilazione degli shader, riduce lo stuttering e migliora le prestazioni sui driver senza supporto multithreading proprio. Varia leggermente le prestazioni di picco sui driver con multithreading. Ryujinx potrebbe aver bisogno di essere riavviato per disabilitare correttamente il multithreading integrato nel driver, o potrebbe essere necessario farlo manualmente per ottenere le migliori prestazioni.",
|
||||
"ShaderCacheToggleTooltip": "Attiva o disattiva la Shader Cache",
|
||||
"ResolutionScaleTooltip": "Scala della risoluzione applicata ai render targets applicabili",
|
||||
"DRamTooltip": "Utilizza un layout di memoria alternativo per imitare un'unità di sviluppo di Switch.\n\nQuesta opzione è utile soltanto per i pacchetti di texture ad alta risoluzione o per le mod che aumentano la risoluzione a 4K. NON migliora le prestazioni.\n\nNel dubbio, lascia l'opzione disattivata.",
|
||||
"IgnoreMissingServicesTooltip": "Ignora i servizi non implementati del sistema operativo Horizon. Può aiutare ad aggirare gli arresti anomali che si verificano avviando alcuni giochi.\n\nNel dubbio, lascia l'opzione disattivata.",
|
||||
"GraphicsBackendThreadingTooltip": "Esegue i comandi del backend grafico su un secondo thread.\n\nVelocizza la compilazione degli shader, riduce lo stuttering e migliora le prestazioni sui driver grafici senza il supporto integrato al multithreading. Migliora leggermente le prestazioni sui driver che supportano il multithreading.\n\nNel dubbio, imposta l'opzione su Auto.",
|
||||
"GalThreadingTooltip": "Esegue i comandi del backend grafico su un secondo thread.\n\nVelocizza la compilazione degli shader, riduce lo stuttering e migliora le prestazioni sui driver grafici senza il supporto integrato al multithreading. Migliora leggermente le prestazioni sui driver che supportano il multithreading.\n\nNel dubbio, imposta l'opzione su Auto.",
|
||||
"ShaderCacheToggleTooltip": "Salva una cache degli shader su disco che riduce i fenomeni di stuttering nelle esecuzioni successive.\n\nNel dubbio, lascia l'opzione attiva.",
|
||||
"ResolutionScaleTooltip": "Moltiplica la risoluzione di rendering del gioco.\n\nAlcuni giochi potrebbero non funzionare con questa opzione e sembrare pixelati anche quando la risoluzione è aumentata; per quei giochi, potrebbe essere necessario trovare mod che rimuovono l'anti-aliasing o che aumentano la risoluzione di rendering interna. Per quest'ultimo caso, probabilmente dovrai selezionare Nativo (1x).\n\nQuesta opzione può essere modificata mentre un gioco è in esecuzione facendo clic su \"Applica\" qui sotto; puoi semplicemente spostare la finestra delle impostazioni da parte e sperimentare fino a quando non trovi il tuo look preferito per un gioco.\n\nTenete a mente che 4x è troppo per praticamente qualsiasi configurazione.",
|
||||
"ResolutionScaleEntryTooltip": "Scala della risoluzione in virgola mobile, come 1,5. Le scale non integrali hanno maggiori probabilità di causare problemi o crash.",
|
||||
"AnisotropyTooltip": "Livello del filtro anisotropico (imposta su Auto per usare il valore richiesto dal gioco)",
|
||||
"AspectRatioTooltip": "Rapporto d'aspetto applicato alla finestra del renderer.",
|
||||
"ShaderDumpPathTooltip": "Percorso di dump Graphics Shaders",
|
||||
"FileLogTooltip": "Attiva o disattiva il logging su file",
|
||||
"StubLogTooltip": "Attiva messaggi stub log",
|
||||
"InfoLogTooltip": "Attiva messaggi info log",
|
||||
"WarnLogTooltip": "Attiva messaggi warning log",
|
||||
"ErrorLogTooltip": "Attiva messaggi error log",
|
||||
"TraceLogTooltip": "Attiva messaggi trace log",
|
||||
"GuestLogTooltip": "Attiva messaggi guest log",
|
||||
"FileAccessLogTooltip": "Attiva messaggi file access log",
|
||||
"FSAccessLogModeTooltip": "Attiva output FS access log alla console. Le modalità possibili sono 0-3",
|
||||
"AnisotropyTooltip": "Livello del filtro anisotropico. Imposta su Auto per usare il valore richiesto dal gioco.",
|
||||
"AspectRatioTooltip": "Proporzioni dello schermo applicate alla finestra di renderizzazione.\n\nCambialo solo se stai usando una mod di proporzioni per il tuo gioco, altrimenti la grafica verrà allungata.\n\nLasciare il 16:9 se incerto.",
|
||||
"ShaderDumpPathTooltip": "Percorso di dump degli shader",
|
||||
"FileLogTooltip": "Salva il log della console in un file su disco. Non influisce sulle prestazioni.",
|
||||
"StubLogTooltip": "Stampa i messaggi di log relativi alle stub nella console. Non influisce sulle prestazioni.",
|
||||
"InfoLogTooltip": "Stampa i messaggi di log informativi nella console. Non influisce sulle prestazioni.",
|
||||
"WarnLogTooltip": "Stampa i messaggi di log relativi agli avvisi nella console. Non influisce sulle prestazioni.",
|
||||
"ErrorLogTooltip": "Stampa i messaggi di log relativi agli errori nella console. Non influisce sulle prestazioni.",
|
||||
"TraceLogTooltip": "Stampa i messaggi di log relativi al trace nella console. Non influisce sulle prestazioni.",
|
||||
"GuestLogTooltip": "Stampa i messaggi di log del guest nella console. Non influisce sulle prestazioni.",
|
||||
"FileAccessLogTooltip": "Stampa i messaggi di log relativi all'accesso ai file nella console.",
|
||||
"FSAccessLogModeTooltip": "Attiva l'output dei log di accesso FS nella console. Le modalità possibili vanno da 0 a 3",
|
||||
"DeveloperOptionTooltip": "Usa con attenzione",
|
||||
"OpenGlLogLevel": "Richiede livelli di log appropriati abilitati",
|
||||
"DebugLogTooltip": "Attiva messaggi debug log",
|
||||
"OpenGlLogLevel": "Richiede che i livelli di log appropriati siano abilitati",
|
||||
"DebugLogTooltip": "Stampa i messaggi di log per il debug nella console.\n\nUsa questa opzione solo se specificatamente richiesto da un membro del team, dal momento che rende i log difficili da leggere e riduce le prestazioni dell'emulatore.",
|
||||
"LoadApplicationFileTooltip": "Apri un file explorer per scegliere un file compatibile Switch da caricare",
|
||||
"LoadApplicationFolderTooltip": "Apri un file explorer per scegliere un file compatibile Switch, applicazione sfusa da caricare",
|
||||
"OpenRyujinxFolderTooltip": "Apri la cartella del filesystem di Ryujinx",
|
||||
"OpenRyujinxLogsTooltip": "Apre la cartella dove vengono scritti i log",
|
||||
"OpenRyujinxLogsTooltip": "Apre la cartella dove vengono salvati i log",
|
||||
"ExitTooltip": "Esci da Ryujinx",
|
||||
"OpenSettingsTooltip": "Apri finestra delle impostazioni",
|
||||
"OpenSettingsTooltip": "Apri la finestra delle impostazioni",
|
||||
"OpenProfileManagerTooltip": "Apri la finestra di gestione dei profili utente",
|
||||
"StopEmulationTooltip": "Ferma l'emulazione del gioco attuale e torna alla selezione dei giochi",
|
||||
"CheckUpdatesTooltip": "Controlla la presenza di aggiornamenti di Ryujinx",
|
||||
"OpenAboutTooltip": "Apri finestra delle informazioni",
|
||||
"OpenAboutTooltip": "Apri la finestra delle informazioni",
|
||||
"GridSize": "Dimensione griglia",
|
||||
"GridSizeTooltip": "Cambia la dimensione dei riquardi della griglia",
|
||||
"SettingsTabSystemSystemLanguageBrazilianPortuguese": "Portoghese Brasiliano",
|
||||
"AboutRyujinxContributorsButtonHeader": "Vedi tutti i Contributors",
|
||||
"GridSizeTooltip": "Cambia la dimensione dei riquadri della griglia",
|
||||
"SettingsTabSystemSystemLanguageBrazilianPortuguese": "Portoghese brasiliano",
|
||||
"AboutRyujinxContributorsButtonHeader": "Mostra tutti i contributori",
|
||||
"SettingsTabSystemAudioVolume": "Volume: ",
|
||||
"AudioVolumeTooltip": "Cambia volume audio",
|
||||
"SettingsTabSystemEnableInternetAccess": "Attiva Guest Internet Access",
|
||||
"EnableInternetAccessTooltip": "Attiva il guest Internet access. Se abilitato, l'applicazione si comporterà come se la console Switch emulata fosse collegata a Internet. Si noti che in alcuni casi, le applicazioni possono comunque accedere a Internet anche con questa opzione disabilitata",
|
||||
"GameListContextMenuManageCheatToolTip": "Gestisci Cheats",
|
||||
"GameListContextMenuManageCheat": "Gestisci Cheats",
|
||||
"SettingsTabSystemEnableInternetAccess": "Attiva l'accesso a Internet da parte del guest/Modalità LAN",
|
||||
"EnableInternetAccessTooltip": "Consente all'applicazione emulata di connettersi a Internet.\n\nI giochi che dispongono di una modalità LAN possono connettersi tra di loro quando questa opzione è abilitata e sono connessi alla stessa rete, comprese le console reali.\n\nQuesta opzione NON consente la connessione ai server di Nintendo. Potrebbe causare arresti anomali in alcuni giochi che provano a connettersi a Internet.\n\nNel dubbio, lascia l'opzione disattivata.",
|
||||
"GameListContextMenuManageCheatToolTip": "Gestisci trucchi",
|
||||
"GameListContextMenuManageCheat": "Gestisci trucchi",
|
||||
"GameListContextMenuManageModToolTip": "Gestisci mod",
|
||||
"GameListContextMenuManageMod": "Gestisci mod",
|
||||
"ControllerSettingsStickRange": "Raggio:",
|
||||
"DialogStopEmulationTitle": "Ryujinx - Ferma emulazione",
|
||||
"DialogStopEmulationMessage": "Sei sicuro di voler fermare l'emulazione?",
|
||||
|
@ -512,16 +519,14 @@
|
|||
"SettingsTabNetwork": "Rete",
|
||||
"SettingsTabNetworkConnection": "Connessione di rete",
|
||||
"SettingsTabCpuCache": "Cache CPU",
|
||||
"SettingsTabCpuMemory": "Memoria CPU",
|
||||
"DialogUpdaterFlatpakNotSupportedMessage": "Per favore aggiorna Ryujinx via FlatHub.",
|
||||
"SettingsTabCpuMemory": "Modalità CPU",
|
||||
"DialogUpdaterFlatpakNotSupportedMessage": "Aggiorna Ryujinx tramite FlatHub.",
|
||||
"UpdaterDisabledWarningTitle": "Updater disabilitato!",
|
||||
"GameListContextMenuOpenSdModsDirectory": "Apri cartella delle mods Atmosphere",
|
||||
"GameListContextMenuOpenSdModsDirectoryToolTip": "Apre la cartella Atmosphere della scheda SD alternativa che contiene le Mod dell'applicazione. Utile per mod confezionate per hardware reale",
|
||||
"ControllerSettingsRotate90": "Ruota in senso orario di 90°",
|
||||
"IconSize": "Dimensioni icona",
|
||||
"IconSizeTooltip": "Cambia le dimensioni dell'icona di un gioco",
|
||||
"IconSize": "Dimensioni icone",
|
||||
"IconSizeTooltip": "Cambia le dimensioni delle icone dei giochi",
|
||||
"MenuBarOptionsShowConsole": "Mostra console",
|
||||
"ShaderCachePurgeError": "Errore nella pulizia della shader cache a {0}: {1}",
|
||||
"ShaderCachePurgeError": "Errore nell'eliminazione della cache degli shader a {0}: {1}",
|
||||
"UserErrorNoKeys": "Chiavi non trovate",
|
||||
"UserErrorNoFirmware": "Firmware non trovato",
|
||||
"UserErrorFirmwareParsingFailed": "Errori di analisi del firmware",
|
||||
|
@ -533,10 +538,10 @@
|
|||
"UserErrorFirmwareParsingFailedDescription": "Ryujinx non è riuscito ad analizzare il firmware. Questo di solito è causato da chiavi non aggiornate.",
|
||||
"UserErrorApplicationNotFoundDescription": "Ryujinx non è riuscito a trovare un'applicazione valida nel percorso specificato.",
|
||||
"UserErrorUnknownDescription": "Si è verificato un errore sconosciuto!",
|
||||
"UserErrorUndefinedDescription": "Si è verificato un errore sconosciuto! Non dovrebbe succedere, per favore contatta uno sviluppatore!",
|
||||
"UserErrorUndefinedDescription": "Si è verificato un errore sconosciuto! Ciò non dovrebbe accadere, contatta uno sviluppatore!",
|
||||
"OpenSetupGuideMessage": "Apri la guida all'installazione",
|
||||
"NoUpdate": "Nessun aggiornamento",
|
||||
"TitleUpdateVersionLabel": "Versione {0} - {1}",
|
||||
"TitleUpdateVersionLabel": "Versione {0}",
|
||||
"RyujinxInfo": "Ryujinx - Info",
|
||||
"RyujinxConfirm": "Ryujinx - Conferma",
|
||||
"FileDialogAllTypes": "Tutti i tipi",
|
||||
|
@ -544,17 +549,18 @@
|
|||
"SwkbdMinCharacters": "Non può avere meno di {0} caratteri",
|
||||
"SwkbdMinRangeCharacters": "Può avere da {0} a {1} caratteri",
|
||||
"SoftwareKeyboard": "Tastiera software",
|
||||
"SoftwareKeyboardModeNumbersOnly": "Deve essere solo numeri",
|
||||
"SoftwareKeyboardModeNumeric": "Deve essere solo 0-9 o '.'",
|
||||
"SoftwareKeyboardModeAlphabet": "Deve essere solo caratteri non CJK",
|
||||
"SoftwareKeyboardModeASCII": "Deve essere solo testo ASCII",
|
||||
"DialogControllerAppletMessagePlayerRange": "L'applicazione richiede {0} giocatori con:\n\nTIPI: {1}\n\nGIOCATORI: {2}\n\n{3}Apri le impostazioni e riconfigura l'input adesso o premi Chiudi.",
|
||||
"DialogControllerAppletMessage": "L'applicazione richiede esattamente {0} giocatori con:\n\nTIPI: {1}\n\nGIOCATORI: {2}\n\n{3}Apri le impostazioni e riconfigura l'input adesso o premi Chiudi.",
|
||||
"DialogControllerAppletDockModeSet": "Modalità TV attivata. Neanche portatile è valida.\n\n",
|
||||
"ControllerAppletControllers": "Controller supportati:",
|
||||
"ControllerAppletPlayers": "Giocatori:",
|
||||
"ControllerAppletDescription": "La configurazione corrente non è valida. Aprire le impostazioni e riconfigurare gli input.",
|
||||
"ControllerAppletDocked": "Modalità TV attivata. Gli input della modalità portatile dovrebbero essere disabilitati.",
|
||||
"UpdaterRenaming": "Rinominazione dei vecchi files...",
|
||||
"UpdaterRenameFailed": "L'updater non è riuscito a rinominare il file: {0}",
|
||||
"UpdaterAddingFiles": "Aggiunta nuovi files...",
|
||||
"UpdaterExtracting": "Estrazione aggiornamento...",
|
||||
"UpdaterDownloading": "Download aggiornamento...",
|
||||
"UpdaterRenameFailed": "Non è stato possibile rinominare il file: {0}",
|
||||
"UpdaterAddingFiles": "Aggiunta dei nuovi file...",
|
||||
"UpdaterExtracting": "Estrazione dell'aggiornamento...",
|
||||
"UpdaterDownloading": "Download dell'aggiornamento...",
|
||||
"Game": "Gioco",
|
||||
"Docked": "TV",
|
||||
"Handheld": "Portatile",
|
||||
|
@ -562,20 +568,20 @@
|
|||
"AboutPageDeveloperListMore": "{0} e altri ancora...",
|
||||
"ApiError": "Errore dell'API.",
|
||||
"LoadingHeading": "Caricamento di {0}",
|
||||
"CompilingPPTC": "Compilazione PTC",
|
||||
"CompilingShaders": "Compilazione Shaders",
|
||||
"CompilingPPTC": "Compilazione PPTC",
|
||||
"CompilingShaders": "Compilazione degli shader",
|
||||
"AllKeyboards": "Tutte le tastiere",
|
||||
"OpenFileDialogTitle": "Seleziona un file supportato da aprire",
|
||||
"OpenFolderDialogTitle": "Seleziona una cartella con un gioco estratto",
|
||||
"AllSupportedFormats": "Tutti i formati supportati",
|
||||
"RyujinxUpdater": "Aggiornamento Ryujinx",
|
||||
"RyujinxUpdater": "Aggiornamento di Ryujinx",
|
||||
"SettingsTabHotkeys": "Tasti di scelta rapida",
|
||||
"SettingsTabHotkeysHotkeys": "Tasti di scelta rapida",
|
||||
"SettingsTabHotkeysToggleVsyncHotkey": "VSync:",
|
||||
"SettingsTabHotkeysScreenshotHotkey": "Cattura Schermo:",
|
||||
"SettingsTabHotkeysShowUiHotkey": "Mostra UI:",
|
||||
"SettingsTabHotkeysToggleVsyncHotkey": "Attiva/disattiva VSync:",
|
||||
"SettingsTabHotkeysScreenshotHotkey": "Cattura uno screenshot:",
|
||||
"SettingsTabHotkeysShowUiHotkey": "Mostra l'interfaccia:",
|
||||
"SettingsTabHotkeysPauseHotkey": "Metti in pausa:",
|
||||
"SettingsTabHotkeysToggleMuteHotkey": "Muta:",
|
||||
"SettingsTabHotkeysToggleMuteHotkey": "Disattiva l'audio:",
|
||||
"ControllerMotionTitle": "Impostazioni dei sensori di movimento",
|
||||
"ControllerRumbleTitle": "Impostazioni di vibrazione",
|
||||
"SettingsSelectThemeFileDialogTitle": "Seleziona file del tema",
|
||||
|
@ -587,60 +593,66 @@
|
|||
"Writable": "Scrivibile",
|
||||
"SelectDlcDialogTitle": "Seleziona file dei DLC",
|
||||
"SelectUpdateDialogTitle": "Seleziona file di aggiornamento",
|
||||
"UserProfileWindowTitle": "Gestisci profili degli utenti",
|
||||
"CheatWindowTitle": "Gestisci cheat dei giochi",
|
||||
"DlcWindowTitle": "Gestisci DLC dei giochi",
|
||||
"UpdateWindowTitle": "Gestisci aggiornamenti dei giochi",
|
||||
"CheatWindowHeading": "Cheat disponibiili per {0} [{1}]",
|
||||
"SelectModDialogTitle": "Seleziona cartella delle mod",
|
||||
"UserProfileWindowTitle": "Gestione profili utente",
|
||||
"CheatWindowTitle": "Gestione trucchi",
|
||||
"DlcWindowTitle": "Gestisci DLC per {0} ({1})",
|
||||
"UpdateWindowTitle": "Gestione aggiornamenti",
|
||||
"CheatWindowHeading": "Trucchi disponibili per {0} [{1}]",
|
||||
"BuildId": "ID Build",
|
||||
"DlcWindowHeading": "DLC disponibili per {0} [{1}]",
|
||||
"ModWindowHeading": "{0} mod",
|
||||
"UserProfilesEditProfile": "Modifica selezionati",
|
||||
"Cancel": "Annulla",
|
||||
"Save": "Salva",
|
||||
"Discard": "Scarta",
|
||||
"Paused": "In pausa",
|
||||
"UserProfilesSetProfileImage": "Imposta immagine profilo",
|
||||
"UserProfileEmptyNameError": "È richiesto un nome",
|
||||
"UserProfileEmptyNameError": "Il nome è obbligatorio",
|
||||
"UserProfileNoImageError": "Dev'essere impostata un'immagine profilo",
|
||||
"GameUpdateWindowHeading": "Aggiornamenti disponibili per {0} [{1}]",
|
||||
"SettingsTabHotkeysResScaleUpHotkey": "Aumentare la risoluzione:",
|
||||
"SettingsTabHotkeysResScaleDownHotkey": "Diminuire la risoluzione:",
|
||||
"GameUpdateWindowHeading": "Gestisci aggiornamenti per {0} ({1})",
|
||||
"SettingsTabHotkeysResScaleUpHotkey": "Aumenta la risoluzione:",
|
||||
"SettingsTabHotkeysResScaleDownHotkey": "Riduci la risoluzione:",
|
||||
"UserProfilesName": "Nome:",
|
||||
"UserProfilesUserId": "ID utente:",
|
||||
"SettingsTabGraphicsBackend": "Backend grafica",
|
||||
"SettingsTabGraphicsBackendTooltip": "Backend grafica da usare",
|
||||
"SettingsEnableTextureRecompression": "Abilita Ricompressione Texture",
|
||||
"SettingsEnableTextureRecompressionTooltip": "Comprime alcune texture per ridurre l'utilizzo della VRAM.\n\nL'utilizzo è consigliato con GPU con meno di 4GB di VRAM.\n\nLascia su OFF se non sei sicuro.",
|
||||
"SettingsTabGraphicsBackend": "Backend grafico",
|
||||
"SettingsTabGraphicsBackendTooltip": "Seleziona il backend grafico che verrà utilizzato nell'emulatore.\n\nVulkan è nel complesso migliore per tutte le schede grafiche moderne, a condizione che i relativi driver siano aggiornati. Vulkan dispone anche di una compilazione degli shader più veloce (con minore stuttering) su tutte le marche di GPU.\n\nOpenGL può ottenere risultati migliori su vecchie GPU Nvidia, su vecchie GPU AMD su Linux, o su GPU con poca VRAM, anche se lo stuttering dovuto alla compilazione degli shader sarà maggiore.\n\nNel dubbio, scegli Vulkan. Seleziona OpenGL se la GPU non supporta Vulkan nemmeno con i driver grafici più recenti.",
|
||||
"SettingsEnableTextureRecompression": "Attiva la ricompressione delle texture",
|
||||
"SettingsEnableTextureRecompressionTooltip": "Comprime le texture ASTC per ridurre l'utilizzo di VRAM.\n\nI giochi che utilizzano questo formato di texture includono Astral Chain, Bayonetta 3, Fire Emblem Engage, Metroid Prime Remastered, Super Mario Bros. Wonder e The Legend of Zelda: Tears of the Kingdom.\n\nLe schede grafiche con 4GiB o meno di VRAM probabilmente si bloccheranno ad un certo punto durante l'esecuzione di questi giochi.\n\nAttiva questa opzione solo se sei a corto di VRAM nei giochi sopra menzionati. Nel dubbio, lascia l'opzione disattivata.",
|
||||
"SettingsTabGraphicsPreferredGpu": "GPU preferita",
|
||||
"SettingsTabGraphicsPreferredGpuTooltip": "Seleziona la scheda grafica che verrà usata con la backend grafica Vulkan.\n\nNon influenza la GPU che userà OpenGL.\n\nImposta la GPU contrassegnata come \"dGPU\" se non sei sicuro. Se non ce n'è una, lascia intatta quest'impostazione.",
|
||||
"SettingsAppRequiredRestartMessage": "È richiesto un riavvio di Ryujinx",
|
||||
"SettingsGpuBackendRestartMessage": "Le impostazioni della backend grafica o della GPU sono state modificate. Questo richiederà un riavvio perché le modifiche siano applicate",
|
||||
"SettingsGpuBackendRestartSubMessage": "Vuoi riavviare ora?",
|
||||
"RyujinxUpdaterMessage": "Vuoi aggiornare Ryujinx all'ultima versione?",
|
||||
"SettingsTabHotkeysVolumeUpHotkey": "Aumentare il volume:",
|
||||
"SettingsTabHotkeysVolumeDownHotkey": "Diminuire il volume:",
|
||||
"SettingsEnableMacroHLE": "Abilita Macro HLE",
|
||||
"SettingsEnableMacroHLETooltip": "Emulazione di alto livello del codice Macro GPU.\n\nMigliora le prestazioni, ma può causare anomalie grafiche in alcuni giochi.\n\nLasciare ON se non sei sicuro.",
|
||||
"SettingsEnableColorSpacePassthrough": "Spazio colore passante",
|
||||
"SettingsEnableColorSpacePassthroughTooltip": "Indica al backend Vulkan di passare le informazioni sul colore senza specificare uno spazio colore. Per gli utenti con schermi ad ampia gamma, questo può risultare in colori più vivaci, al costo della correttezza del colore.",
|
||||
"SettingsTabHotkeysVolumeUpHotkey": "Alza il volume:",
|
||||
"SettingsTabHotkeysVolumeDownHotkey": "Abbassa il volume:",
|
||||
"SettingsEnableMacroHLE": "Attiva HLE macro",
|
||||
"SettingsEnableMacroHLETooltip": "Emulazione di alto livello del codice macro della GPU.\n\nMigliora le prestazioni, ma può causare anomalie grafiche in alcuni giochi.\n\nNel dubbio, lascia l'opzione attiva.",
|
||||
"SettingsEnableColorSpacePassthrough": "Passthrough dello spazio dei colori",
|
||||
"SettingsEnableColorSpacePassthroughTooltip": "Indica al backend Vulkan di passare le informazioni sul colore senza specificare uno spazio dei colori. Per gli utenti con schermi ad ampia gamma, ciò può rendere i colori più vivaci, sacrificando la correttezza del colore.",
|
||||
"VolumeShort": "Vol",
|
||||
"UserProfilesManageSaves": "Gestisci i salvataggi",
|
||||
"DeleteUserSave": "Vuoi eliminare il salvataggio utente per questo gioco?",
|
||||
"IrreversibleActionNote": "Questa azione non è reversibile.",
|
||||
"SaveManagerHeading": "Gestisci i salvataggi per {0}",
|
||||
"SaveManagerTitle": "Gestione Salvataggi",
|
||||
"SaveManagerHeading": "Gestisci salvataggi per {0} ({1})",
|
||||
"SaveManagerTitle": "Gestione salvataggi",
|
||||
"Name": "Nome",
|
||||
"Size": "Dimensione",
|
||||
"Search": "Cerca",
|
||||
"UserProfilesRecoverLostAccounts": "Recupera il tuo account",
|
||||
"UserProfilesRecoverLostAccounts": "Recupera account persi",
|
||||
"Recover": "Recupera",
|
||||
"UserProfilesRecoverHeading": "Sono stati trovati dei salvataggi per i seguenti account",
|
||||
"UserProfilesRecoverEmptyList": "Nessun profilo da recuperare",
|
||||
"GraphicsAATooltip": "Applica anti-aliasing al rendering del gioco",
|
||||
"GraphicsAATooltip": "Applica anti-aliasing al rendering del gioco.\n\nFXAA sfocerà la maggior parte dell'immagine, mentre SMAA tenterà di trovare bordi frastagliati e lisciarli.\n\nNon si consiglia di usarlo in combinazione con il filtro di scala FSR.\n\nQuesta opzione può essere modificata mentre un gioco è in esecuzione facendo clic su \"Applica\" qui sotto; puoi semplicemente spostare la finestra delle impostazioni da parte e sperimentare fino a quando non trovi il tuo look preferito per un gioco.\n\nLasciare su Nessuno se incerto.",
|
||||
"GraphicsAALabel": "Anti-Aliasing:",
|
||||
"GraphicsScalingFilterLabel": "Filtro di scala:",
|
||||
"GraphicsScalingFilterTooltip": "Abilita scalatura Framebuffer",
|
||||
"GraphicsScalingFilterTooltip": "Scegli il filtro di scaling che verrà applicato quando si utilizza o scaling di risoluzione.\n\nBilineare funziona bene per i giochi 3D ed è un'opzione predefinita affidabile.\n\nNearest è consigliato per i giochi in pixel art.\n\nFSR 1.0 è solo un filtro di nitidezza, non raccomandato per l'uso con FXAA o SMAA.\n\nQuesta opzione può essere modificata mentre un gioco è in esecuzione facendo clic su \"Applica\" qui sotto; puoi semplicemente spostare la finestra delle impostazioni da parte e sperimentare fino a quando non trovi il tuo look preferito per un gioco.\n\nLasciare su Bilineare se incerto.",
|
||||
"GraphicsScalingFilterBilinear": "Bilineare",
|
||||
"GraphicsScalingFilterNearest": "Nearest",
|
||||
"GraphicsScalingFilterFsr": "FSR",
|
||||
"GraphicsScalingFilterLevelLabel": "Livello",
|
||||
"GraphicsScalingFilterLevelTooltip": "Imposta livello del filtro di scala",
|
||||
"GraphicsScalingFilterLevelTooltip": "Imposta il livello di nitidezza di FSR 1.0. Valori più alti comportano una maggiore nitidezza.",
|
||||
"SmaaLow": "SMAA Basso",
|
||||
"SmaaMedium": "SMAA Medio",
|
||||
"SmaaHigh": "SMAA Alto",
|
||||
|
@ -648,9 +660,14 @@
|
|||
"UserEditorTitle": "Modificare L'Utente",
|
||||
"UserEditorTitleCreate": "Crea Un Utente",
|
||||
"SettingsTabNetworkInterface": "Interfaccia di rete:",
|
||||
"NetworkInterfaceTooltip": "L'interfaccia di rete utilizzata per le funzionalità LAN",
|
||||
"NetworkInterfaceTooltip": "L'interfaccia di rete utilizzata per le funzionalità LAN/LDN.\n\nIn combinazione con una VPN o XLink Kai e un gioco che supporta la modalità LAN, questa opzione può essere usata per simulare la connessione alla stessa rete attraverso Internet.\n\nNel dubbio, lascia l'opzione su Predefinito.",
|
||||
"NetworkInterfaceDefault": "Predefinito",
|
||||
"PackagingShaders": "Comprimendo shader",
|
||||
"PackagingShaders": "Salvataggio degli shader",
|
||||
"AboutChangelogButton": "Visualizza changelog su GitHub",
|
||||
"AboutChangelogButtonTooltipMessage": "Clicca per aprire il changelog per questa versione nel tuo browser predefinito."
|
||||
}
|
||||
"AboutChangelogButtonTooltipMessage": "Clicca per aprire il changelog per questa versione nel tuo browser predefinito.",
|
||||
"SettingsTabNetworkMultiplayer": "Multigiocatore",
|
||||
"MultiplayerMode": "Modalità:",
|
||||
"MultiplayerModeTooltip": "Cambia la modalità multigiocatore LDN.\n\nLdnMitm modificherà la funzionalità locale wireless/local play nei giochi per funzionare come se fosse in modalità LAN, consentendo connessioni locali sulla stessa rete con altre istanze di Ryujinx e console Nintendo Switch modificate che hanno il modulo ldn_mitm installato.\n\nLa modalità multigiocatore richiede che tutti i giocatori usino la stessa versione del gioco (es. Super Smash Bros. Ultimate v13.0.1 non può connettersi con la v13.0.0).\n\nNel dubbio, lascia l'opzione su Disabilitato.",
|
||||
"MultiplayerModeDisabled": "Disabilitato",
|
||||
"MultiplayerModeLdnMitm": "ldn_mitm"
|
||||
}
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
{
|
||||
"Language": "英語 (アメリカ)",
|
||||
"Language": "日本語",
|
||||
"MenuBarFileOpenApplet": "アプレットを開く",
|
||||
"MenuBarFileOpenAppletOpenMiiAppletToolTip": "スタンドアロンモードで Mii エディタアプレットを開きます",
|
||||
"SettingsTabInputDirectMouseAccess": "マウス直接アクセス",
|
||||
|
@ -14,10 +14,10 @@
|
|||
"MenuBarFileOpenEmuFolder": "Ryujinx フォルダを開く",
|
||||
"MenuBarFileOpenLogsFolder": "ログフォルダを開く",
|
||||
"MenuBarFileExit": "終了(_E)",
|
||||
"MenuBarOptions": "オプション",
|
||||
"MenuBarOptions": "オプション(_O)",
|
||||
"MenuBarOptionsToggleFullscreen": "全画面切り替え",
|
||||
"MenuBarOptionsStartGamesInFullscreen": "全画面モードでゲームを開始",
|
||||
"MenuBarOptionsStopEmulation": "エミュレーションを停止",
|
||||
"MenuBarOptionsStopEmulation": "エミュレーションを中止",
|
||||
"MenuBarOptionsSettings": "設定(_S)",
|
||||
"MenuBarOptionsManageUserProfiles": "ユーザプロファイルを管理(_M)",
|
||||
"MenuBarActions": "アクション(_A)",
|
||||
|
@ -30,7 +30,7 @@
|
|||
"MenuBarToolsManageFileTypes": "ファイル形式を管理",
|
||||
"MenuBarToolsInstallFileTypes": "ファイル形式をインストール",
|
||||
"MenuBarToolsUninstallFileTypes": "ファイル形式をアンインストール",
|
||||
"MenuBarHelp": "ヘルプ",
|
||||
"MenuBarHelp": "ヘルプ(_H)",
|
||||
"MenuBarHelpCheckForUpdates": "アップデートを確認",
|
||||
"MenuBarHelpAbout": "Ryujinx について",
|
||||
"MenuSearch": "検索...",
|
||||
|
@ -54,8 +54,6 @@
|
|||
"GameListContextMenuManageTitleUpdatesToolTip": "タイトルのアップデート管理ウインドウを開きます",
|
||||
"GameListContextMenuManageDlc": "DLCを管理",
|
||||
"GameListContextMenuManageDlcToolTip": "DLC管理ウインドウを開きます",
|
||||
"GameListContextMenuOpenModsDirectory": "Modディレクトリを開く",
|
||||
"GameListContextMenuOpenModsDirectoryToolTip": "アプリケーションの Mod データを格納するディレクトリを開きます",
|
||||
"GameListContextMenuCacheManagement": "キャッシュ管理",
|
||||
"GameListContextMenuCacheManagementPurgePptc": "PPTC を再構築",
|
||||
"GameListContextMenuCacheManagementPurgePptcToolTip": "次回のゲーム起動時に PPTC を再構築します",
|
||||
|
@ -72,6 +70,13 @@
|
|||
"GameListContextMenuExtractDataRomFSToolTip": "現在のアプリケーション設定(アップデート含む)から RomFS セクションを展開します",
|
||||
"GameListContextMenuExtractDataLogo": "ロゴ",
|
||||
"GameListContextMenuExtractDataLogoToolTip": "現在のアプリケーション設定(アップデート含む)からロゴセクションを展開します",
|
||||
"GameListContextMenuCreateShortcut": "アプリケーションのショートカットを作成",
|
||||
"GameListContextMenuCreateShortcutToolTip": "選択したアプリケーションを起動するデスクトップショートカットを作成します",
|
||||
"GameListContextMenuCreateShortcutToolTipMacOS": "選択したアプリケーションを起動する ショートカットを macOS の Applications フォルダに作成します",
|
||||
"GameListContextMenuOpenModsDirectory": "Modディレクトリを開く",
|
||||
"GameListContextMenuOpenModsDirectoryToolTip": "アプリケーションの Mod データを格納するディレクトリを開きます",
|
||||
"GameListContextMenuOpenSdModsDirectory": "Atmosphere Mods ディレクトリを開く",
|
||||
"GameListContextMenuOpenSdModsDirectoryToolTip": "アプリケーションの Mod データを格納する SD カードの Atmosphere ディレクトリを開きます. 実際のハードウェア用に作成された Mod データに有用です.",
|
||||
"StatusBarGamesLoaded": "{0}/{1} ゲーム",
|
||||
"StatusBarSystemVersion": "システムバージョン: {0}",
|
||||
"LinuxVmMaxMapCountDialogTitle": "メモリマッピング上限値が小さすぎます",
|
||||
|
@ -150,7 +155,7 @@
|
|||
"SettingsTabGraphicsResolutionScaleNative": "ネイティブ (720p/1080p)",
|
||||
"SettingsTabGraphicsResolutionScale2x": "2x (1440p/2160p)",
|
||||
"SettingsTabGraphicsResolutionScale3x": "3x (2160p/3240p)",
|
||||
"SettingsTabGraphicsResolutionScale4x": "4x (2880p/4320p)",
|
||||
"SettingsTabGraphicsResolutionScale4x": "4x (2880p/4320p) (非推奨)",
|
||||
"SettingsTabGraphicsAspectRatio": "アスペクト比:",
|
||||
"SettingsTabGraphicsAspectRatio4x3": "4:3",
|
||||
"SettingsTabGraphicsAspectRatio16x9": "16:9",
|
||||
|
@ -292,13 +297,9 @@
|
|||
"GameListContextMenuRunApplication": "アプリケーションを実行",
|
||||
"GameListContextMenuToggleFavorite": "お気に入りを切り替え",
|
||||
"GameListContextMenuToggleFavoriteToolTip": "ゲームをお気に入りに含めるかどうかを切り替えます",
|
||||
"SettingsTabGeneralTheme": "テーマ",
|
||||
"SettingsTabGeneralThemeCustomTheme": "カスタムテーマパス",
|
||||
"SettingsTabGeneralThemeBaseStyle": "基本スタイル",
|
||||
"SettingsTabGeneralThemeBaseStyleDark": "ダーク",
|
||||
"SettingsTabGeneralThemeBaseStyleLight": "ライト",
|
||||
"SettingsTabGeneralThemeEnableCustomTheme": "カスタムテーマを有効にする",
|
||||
"ButtonBrowse": "参照",
|
||||
"SettingsTabGeneralTheme": "テーマ:",
|
||||
"SettingsTabGeneralThemeDark": "ダーク",
|
||||
"SettingsTabGeneralThemeLight": "ライト",
|
||||
"ControllerSettingsConfigureGeneral": "設定",
|
||||
"ControllerSettingsRumble": "振動",
|
||||
"ControllerSettingsRumbleStrongMultiplier": "強振動の補正値",
|
||||
|
@ -332,8 +333,6 @@
|
|||
"DialogUpdaterAddingFilesMessage": "新規アップデートを追加中...",
|
||||
"DialogUpdaterCompleteMessage": "アップデート完了!",
|
||||
"DialogUpdaterRestartMessage": "すぐに Ryujinx を再起動しますか?",
|
||||
"DialogUpdaterArchNotSupportedMessage": "サポート外のアーキテクチャです!",
|
||||
"DialogUpdaterArchNotSupportedSubMessage": "(x64 システムのみサポートしています!)",
|
||||
"DialogUpdaterNoInternetMessage": "インターネットに接続されていません!",
|
||||
"DialogUpdaterNoInternetSubMessage": "インターネット接続が正常動作しているか確認してください!",
|
||||
"DialogUpdaterDirtyBuildMessage": "Dirty ビルドの Ryujinx はアップデートできません!",
|
||||
|
@ -342,7 +341,7 @@
|
|||
"DialogThemeRestartMessage": "テーマがセーブされました. テーマを適用するには再起動が必要です.",
|
||||
"DialogThemeRestartSubMessage": "再起動しますか",
|
||||
"DialogFirmwareInstallEmbeddedMessage": "このゲームに含まれるファームウェアをインストールしてよろしいですか? (ファームウェア {0})",
|
||||
"DialogFirmwareInstallEmbeddedSuccessMessage": "ファームウェアがインストールされていませんが, ゲームに含まれるファームウェア {0} をインストールできます.\\nエミュレータが開始します.",
|
||||
"DialogFirmwareInstallEmbeddedSuccessMessage": "ファームウェアがインストールされていませんが, ゲームに含まれるファームウェア {0} をインストールできます.\nエミュレータが開始します.",
|
||||
"DialogFirmwareNoFirmwareInstalledMessage": "ファームウェアがインストールされていません",
|
||||
"DialogFirmwareInstalledMessage": "ファームウェア {0} がインストールされました",
|
||||
"DialogInstallFileTypesSuccessMessage": "ファイル形式のインストールに成功しました!",
|
||||
|
@ -385,17 +384,22 @@
|
|||
"DialogUserProfileUnsavedChangesSubMessage": "変更を破棄しますか?",
|
||||
"DialogControllerSettingsModifiedConfirmMessage": "現在のコントローラ設定が更新されました.",
|
||||
"DialogControllerSettingsModifiedConfirmSubMessage": "セーブしますか?",
|
||||
"DialogLoadNcaErrorMessage": "{0}. エラー発生ファイル: {1}",
|
||||
"DialogLoadFileErrorMessage": "{0}. エラー発生ファイル: {1}",
|
||||
"DialogModAlreadyExistsMessage": "Modはすでに存在します",
|
||||
"DialogModInvalidMessage": "指定したディレクトリにはmodが含まれていません!",
|
||||
"DialogModDeleteNoParentMessage": "削除に失敗しました: Mod \"{0}\" の親ディレクトリが見つかりませんでした!",
|
||||
"DialogDlcNoDlcErrorMessage": "選択されたファイルはこのタイトル用の DLC ではありません!",
|
||||
"DialogPerformanceCheckLoggingEnabledMessage": "トレースロギングを有効にします. これは開発者のみに有用な機能です.",
|
||||
"DialogPerformanceCheckLoggingEnabledConfirmMessage": "パフォーマンス最適化のためには,トレースロギングを無効にすることを推奨します. トレースロギングを無効にしてよろしいですか?",
|
||||
"DialogPerformanceCheckShaderDumpEnabledMessage": "シェーダーダンプを有効にします. これは開発者のみに有用な機能です.",
|
||||
"DialogPerformanceCheckShaderDumpEnabledConfirmMessage": "パフォーマンス最適化のためには, シェーダーダンプを無効にすることを推奨します. シェーダーダンプを無効にしてよろしいですか?",
|
||||
"DialogLoadAppGameAlreadyLoadedMessage": "ゲームはすでにロード済みです",
|
||||
"DialogLoadAppGameAlreadyLoadedSubMessage": "別のゲームを起動する前に, エミュレーションを停止またはエミュレータを閉じてください.",
|
||||
"DialogLoadAppGameAlreadyLoadedSubMessage": "別のゲームを起動する前に, エミュレーションを中止またはエミュレータを閉じてください.",
|
||||
"DialogUpdateAddUpdateErrorMessage": "選択されたファイルはこのタイトル用のアップデートではありません!",
|
||||
"DialogSettingsBackendThreadingWarningTitle": "警告 - バックエンドスレッディング",
|
||||
"DialogSettingsBackendThreadingWarningMessage": "このオプションの変更を完全に適用するには Ryujinx の再起動が必要です. プラットフォームによっては, Ryujinx のものを使用する前に手動でドライバ自身のマルチスレッディングを無効にする必要があるかもしれません.",
|
||||
"DialogModManagerDeletionWarningMessage": "以下のModを削除しようとしています: {0}\n\n続行してもよろしいですか?",
|
||||
"DialogModManagerDeletionAllWarningMessage": "このタイトルの Mod をすべて削除しようとしています.\n\n続行してもよろしいですか?",
|
||||
"SettingsTabGraphicsFeaturesOptions": "機能",
|
||||
"SettingsTabGraphicsBackendMultithreading": "グラフィックスバックエンドのマルチスレッド実行:",
|
||||
"CommonAuto": "自動",
|
||||
|
@ -404,7 +408,7 @@
|
|||
"InputDialogYes": "はい",
|
||||
"InputDialogNo": "いいえ",
|
||||
"DialogProfileInvalidProfileNameErrorMessage": "プロファイル名に無効な文字が含まれています. 再度試してみてください.",
|
||||
"MenuBarOptionsPauseEmulation": "中断",
|
||||
"MenuBarOptionsPauseEmulation": "一時停止",
|
||||
"MenuBarOptionsResumeEmulation": "再開",
|
||||
"AboutUrlTooltipMessage": "クリックするとデフォルトのブラウザで Ryujinx のウェブサイトを開きます.",
|
||||
"AboutDisclaimerMessage": "Ryujinx は Nintendo™ および\nそのパートナー企業とは一切関係ありません.",
|
||||
|
@ -430,6 +434,7 @@
|
|||
"DlcManagerRemoveAllButton": "すべて削除",
|
||||
"DlcManagerEnableAllButton": "すべて有効",
|
||||
"DlcManagerDisableAllButton": "すべて無効",
|
||||
"ModManagerDeleteAllButton": "すべて削除",
|
||||
"MenuBarOptionsChangeLanguage": "言語を変更",
|
||||
"MenuBarShowFileTypes": "ファイル形式を表示",
|
||||
"CommonSort": "並べ替え",
|
||||
|
@ -447,13 +452,13 @@
|
|||
"CustomThemePathTooltip": "カスタム GUI テーマのパスです",
|
||||
"CustomThemeBrowseTooltip": "カスタム GUI テーマを参照します",
|
||||
"DockModeToggleTooltip": "有効にすると,ドッキングされた Nintendo Switch をエミュレートします.多くのゲームではグラフィックス品質が向上します.\n無効にすると,携帯モードの Nintendo Switch をエミュレートします.グラフィックスの品質は低下します.\n\nドッキングモード有効ならプレイヤー1の,無効なら携帯の入力を設定してください.\n\nよくわからない場合はオンのままにしてください.",
|
||||
"DirectKeyboardTooltip": "キーボード直接アクセス (HID) に対応します. キーボードをテキスト入力デバイスとして使用できます.",
|
||||
"DirectMouseTooltip": "マウス直接アクセス (HID) に対応します. マウスをポインティングデバイスとして使用できます.",
|
||||
"DirectKeyboardTooltip": "直接キーボード アクセス (HID) のサポートです. テキスト入力デバイスとしてキーボードへのゲームアクセスを提供します.\n\nSwitchハードウェアでキーボードの使用をネイティブにサポートしているゲームでのみ動作します.\n\nわからない場合はオフのままにしてください.",
|
||||
"DirectMouseTooltip": "直接マウスアクセス (HID) のサポートです. ポインティングデバイスとしてマウスへのゲームアクセスを提供します.\n\nSwitchハードウェアでマウスの使用をネイティブにサポートしているゲームでのみ動作します.\n\n有効にしている場合, タッチスクリーン機能は動作しない場合があります.\n\nわからない場合はオフのままにしてください.",
|
||||
"RegionTooltip": "システムの地域を変更します",
|
||||
"LanguageTooltip": "システムの言語を変更します",
|
||||
"TimezoneTooltip": "システムのタイムゾーンを変更します",
|
||||
"TimeTooltip": "システムの時刻を変更します",
|
||||
"VSyncToggleTooltip": "エミュレートされたゲーム機の垂直同期です. 多くのゲームにおいて, フレームリミッタとして機能します. 無効にすると, ゲームが高速で実行されたり, ロード中に時間がかかったり, 止まったりすることがあります.\n\n設定したホットキーで, ゲーム内で切り替え可能です. 無効にする場合は, この操作を行うことをおすすめします.\n\nよくわからない場合はオンのままにしてください.",
|
||||
"VSyncToggleTooltip": "エミュレートされたゲーム機の垂直同期です. 多くのゲームにおいて, フレームリミッタとして機能します. 無効にすると, ゲームが高速で実行されたり, ロード中に時間がかかったり, 止まったりすることがあります.\n\n設定したホットキー(デフォルトではF1)で, ゲーム内で切り替え可能です. 無効にする場合は, この操作を行うことをおすすめします.\n\nよくわからない場合はオンのままにしてください.",
|
||||
"PptcToggleTooltip": "翻訳されたJIT関数をセーブすることで, ゲームをロードするたびに毎回翻訳する処理を不要とします.\n\n一度ゲームを起動すれば,二度目以降の起動時遅延を大きく軽減できます.\n\nよくわからない場合はオンのままにしてください.",
|
||||
"FsIntegrityToggleTooltip": "ゲーム起動時にファイル破損をチェックし,破損が検出されたらログにハッシュエラーを表示します..\n\nパフォーマンスには影響なく, トラブルシューティングに役立ちます.\n\nよくわからない場合はオンのままにしてください.",
|
||||
"AudioBackendTooltip": "音声レンダリングに使用するバックエンドを変更します.\n\nSDL2 が優先され, OpenAL と SoundIO はフォールバックとして使用されます. ダミーは音声出力しません.\n\nよくわからない場合は SDL2 を設定してください.",
|
||||
|
@ -467,10 +472,10 @@
|
|||
"GraphicsBackendThreadingTooltip": "グラフィックスバックエンドのコマンドを別スレッドで実行します.\n\nシェーダのコンパイルを高速化し, 遅延を軽減し, マルチスレッド非対応の GPU ドライバにおいてパフォーマンスを改善します. マルチスレッド対応のドライバでも若干パフォーマンス改善が見られます.\n\nよくわからない場合は自動に設定してください.",
|
||||
"GalThreadingTooltip": "グラフィックスバックエンドのコマンドを別スレッドで実行します.\n\nシェーダのコンパイルを高速化し, 遅延を軽減し, マルチスレッド非対応の GPU ドライバにおいてパフォーマンスを改善します. マルチスレッド対応のドライバでも若干パフォーマンス改善が見られます.\n\nよくわからない場合は自動に設定してください.",
|
||||
"ShaderCacheToggleTooltip": "ディスクシェーダーキャッシュをセーブし,次回以降の実行時遅延を軽減します.\n\nよくわからない場合はオンのままにしてください.",
|
||||
"ResolutionScaleTooltip": "レンダリングに適用される解像度の倍率です",
|
||||
"ResolutionScaleTooltip": "ゲームのレンダリング解像度倍率を設定します.\n\n解像度を上げてもピクセルのように見えるゲームもあります. そのようなゲームでは, アンチエイリアスを削除するか, 内部レンダリング解像度を上げる mod を見つける必要があるかもしれません. その場合, ようなゲームでは、ネイティブを選択してください.\n\nこのオプションはゲーム実行中に下の「適用」をクリックすることで変更できます. 設定ウィンドウを脇に移動して, ゲームが好みの表示になるよう試してみてください.\n\nどのような設定でも, \"4x\" はやり過ぎであることを覚えておいてください.",
|
||||
"ResolutionScaleEntryTooltip": "1.5 のような整数でない倍率を指定すると,問題が発生したりクラッシュしたりする場合があります.",
|
||||
"AnisotropyTooltip": "異方性フィルタリングのレベルです (ゲームが要求する値を使用する場合は「自動」を設定してください)",
|
||||
"AspectRatioTooltip": "レンダリングに適用されるアスペクト比です.",
|
||||
"AnisotropyTooltip": "異方性フィルタリングのレベルです. ゲームが要求する値を使用する場合は「自動」を設定してください.",
|
||||
"AspectRatioTooltip": "レンダリングウインドウに適用するアスペクト比です.\n\nゲームにアスペクト比を変更する mod を使用している場合のみ変更してください.\n\nわからない場合は16:9のままにしておいてください.\n",
|
||||
"ShaderDumpPathTooltip": "グラフィックス シェーダー ダンプのパスです",
|
||||
"FileLogTooltip": "コンソール出力されるログをディスク上のログファイルにセーブします. パフォーマンスには影響を与えません.",
|
||||
"StubLogTooltip": "stub ログメッセージをコンソールに出力します. パフォーマンスには影響を与えません.",
|
||||
|
@ -491,7 +496,7 @@
|
|||
"ExitTooltip": "Ryujinx を終了します",
|
||||
"OpenSettingsTooltip": "設定ウインドウを開きます",
|
||||
"OpenProfileManagerTooltip": "ユーザプロファイル管理ウインドウを開きます",
|
||||
"StopEmulationTooltip": "ゲームのエミュレーションを停止してゲーム選択画面に戻ります",
|
||||
"StopEmulationTooltip": "ゲームのエミュレーションを中止してゲーム選択画面に戻ります",
|
||||
"CheckUpdatesTooltip": "Ryujinx のアップデートを確認します",
|
||||
"OpenAboutTooltip": "Ryujinx についてのウインドウを開きます",
|
||||
"GridSize": "グリッドサイズ",
|
||||
|
@ -504,9 +509,11 @@
|
|||
"EnableInternetAccessTooltip": "エミュレートしたアプリケーションをインターネットに接続できるようにします.\n\nLAN モードを持つゲーム同士は,この機能を有効にして同じアクセスポイントに接続すると接続できます. 実機も含まれます.\n\n任天堂のサーバーには接続できません. インターネットに接続しようとすると,特定のゲームでクラッシュすることがあります.\n\nよくわからない場合はオフのままにしてください.",
|
||||
"GameListContextMenuManageCheatToolTip": "チートを管理します",
|
||||
"GameListContextMenuManageCheat": "チートを管理",
|
||||
"GameListContextMenuManageModToolTip": "Modを管理します",
|
||||
"GameListContextMenuManageMod": "Manage Mods",
|
||||
"ControllerSettingsStickRange": "範囲:",
|
||||
"DialogStopEmulationTitle": "Ryujinx - エミュレーションを停止",
|
||||
"DialogStopEmulationMessage": "エミュレーションを停止してよろしいですか?",
|
||||
"DialogStopEmulationTitle": "Ryujinx - エミュレーションを中止",
|
||||
"DialogStopEmulationMessage": "エミュレーションを中止してよろしいですか?",
|
||||
"SettingsTabCpu": "CPU",
|
||||
"SettingsTabAudio": "音声",
|
||||
"SettingsTabNetwork": "ネットワーク",
|
||||
|
@ -515,8 +522,6 @@
|
|||
"SettingsTabCpuMemory": "CPU メモリ",
|
||||
"DialogUpdaterFlatpakNotSupportedMessage": "FlatHub を使用して Ryujinx をアップデートしてください.",
|
||||
"UpdaterDisabledWarningTitle": "アップデータは無効です!",
|
||||
"GameListContextMenuOpenSdModsDirectory": "Atmosphere Mods ディレクトリを開く",
|
||||
"GameListContextMenuOpenSdModsDirectoryToolTip": "アプリケーションの Mod データを格納する SD カードの Atmosphere ディレクトリを開きます. 実際のハードウェア用にパッケージされた Mod データに有用です.",
|
||||
"ControllerSettingsRotate90": "時計回りに 90° 回転",
|
||||
"IconSize": "アイコンサイズ",
|
||||
"IconSizeTooltip": "ゲームアイコンのサイズを変更します",
|
||||
|
@ -544,12 +549,13 @@
|
|||
"SwkbdMinCharacters": "最低 {0} 文字必要です",
|
||||
"SwkbdMinRangeCharacters": "{0}-{1} 文字にしてください",
|
||||
"SoftwareKeyboard": "ソフトウェアキーボード",
|
||||
"SoftwareKeyboardModeNumbersOnly": "数字のみ",
|
||||
"SoftwareKeyboardModeNumeric": "0-9 または '.' のみでなければなりません",
|
||||
"SoftwareKeyboardModeAlphabet": "CJK文字以外のみ",
|
||||
"SoftwareKeyboardModeASCII": "ASCII文字列のみ",
|
||||
"DialogControllerAppletMessagePlayerRange": "アプリケーションは {0} 名のプレイヤーを要求しています:\n\n種別: {1}\n\nプレイヤー: {2}\n\n{3}設定を開き各プレイヤーの入力設定を行ってから閉じるを押してください.",
|
||||
"DialogControllerAppletMessage": "アプリケーションは {0} 名のプレイヤーを要求しています:\n\n種別: {1}\n\nプレイヤー: {2}\n\n{3}設定を開き各プレイヤーの入力設定を行ってから閉じるを押してください.",
|
||||
"DialogControllerAppletDockModeSet": "ドッキングモードに設定されました. 携帯モードは無効になります.\n\n",
|
||||
"ControllerAppletControllers": "サポートされているコントローラ:",
|
||||
"ControllerAppletPlayers": "プレイヤー:",
|
||||
"ControllerAppletDescription": "現在の設定は無効です. 設定を開いて入力を再設定してください.",
|
||||
"ControllerAppletDocked": "ドッキングモードが設定されています. 携帯コントロールは無効にする必要があります.",
|
||||
"UpdaterRenaming": "古いファイルをリネーム中...",
|
||||
"UpdaterRenameFailed": "ファイルをリネームできませんでした: {0}",
|
||||
"UpdaterAddingFiles": "新規ファイルを追加中...",
|
||||
|
@ -574,7 +580,7 @@
|
|||
"SettingsTabHotkeysToggleVsyncHotkey": "VSync 切り替え:",
|
||||
"SettingsTabHotkeysScreenshotHotkey": "スクリーンショット:",
|
||||
"SettingsTabHotkeysShowUiHotkey": "UI表示:",
|
||||
"SettingsTabHotkeysPauseHotkey": "中断:",
|
||||
"SettingsTabHotkeysPauseHotkey": "一時停止:",
|
||||
"SettingsTabHotkeysToggleMuteHotkey": "ミュート:",
|
||||
"ControllerMotionTitle": "モーションコントロール設定",
|
||||
"ControllerRumbleTitle": "振動設定",
|
||||
|
@ -587,6 +593,7 @@
|
|||
"Writable": "書き込み可能",
|
||||
"SelectDlcDialogTitle": "DLC ファイルを選択",
|
||||
"SelectUpdateDialogTitle": "アップデートファイルを選択",
|
||||
"SelectModDialogTitle": "modディレクトリを選択",
|
||||
"UserProfileWindowTitle": "ユーザプロファイルを管理",
|
||||
"CheatWindowTitle": "チート管理",
|
||||
"DlcWindowTitle": "DLC 管理",
|
||||
|
@ -594,10 +601,12 @@
|
|||
"CheatWindowHeading": "利用可能なチート {0} [{1}]",
|
||||
"BuildId": "ビルドID:",
|
||||
"DlcWindowHeading": "利用可能な DLC {0} [{1}]",
|
||||
"ModWindowHeading": "{0} Mod(s)",
|
||||
"UserProfilesEditProfile": "編集",
|
||||
"Cancel": "キャンセル",
|
||||
"Save": "セーブ",
|
||||
"Discard": "破棄",
|
||||
"Paused": "一時停止中",
|
||||
"UserProfilesSetProfileImage": "プロファイル画像を設定",
|
||||
"UserProfileEmptyNameError": "名称が必要です",
|
||||
"UserProfileNoImageError": "プロファイル画像が必要です",
|
||||
|
@ -607,9 +616,9 @@
|
|||
"UserProfilesName": "名称:",
|
||||
"UserProfilesUserId": "ユーザID:",
|
||||
"SettingsTabGraphicsBackend": "グラフィックスバックエンド",
|
||||
"SettingsTabGraphicsBackendTooltip": "使用するグラフィックスバックエンドです",
|
||||
"SettingsTabGraphicsBackendTooltip": "エミュレーションに使用するグラフィックスバックエンドを選択します.\n\nVulkanは, 最近のグラフィックカードでドライバが最新であれば, 全体的に優れています. すべてのGPUベンダーで, シェーダーコンパイルがより高速で, スタッタリングが少ないのが特徴です.\n\n古いNvidia GPU, Linuxでの古いAMD GPU, VRAMの少ないGPUなどでは, OpenGLの方が良い結果が得られるかもしれません. ですが, シェーダーコンパイルのスタッターは大きくなります.\n\n不明な場合はVulkanに設定してください。最新のグラフィックドライバでもVulkanをサポートしていないGPUの場合は, OpenGLに設定してください.",
|
||||
"SettingsEnableTextureRecompression": "テクスチャの再圧縮を有効にする",
|
||||
"SettingsEnableTextureRecompressionTooltip": "VRAMの使用量を削減するためテクスチャを圧縮します.\n\nGPUのVRAMが4GiB未満の場合は使用を推奨します.\n\nよくわからない場合はオフのままにしてください.",
|
||||
"SettingsEnableTextureRecompressionTooltip": "VRAM使用量を減らすためにASTCテクスチャを圧縮します.\n\nこのテクスチャフォーマットを使用するゲームには, Astral Chain, Bayonetta 3, Fire Emblem Engage, Metroid Prime Remastered, Super Mario Bros. Wonder, The Legend of Zelda: Tears of the Kingdomが含まれます.\n\nVRAMが4GB以下のグラフィックカードでは, これらのゲームを実行中にクラッシュする可能性があります.\n\n前述のゲームでVRAMが不足している場合のみ有効にしてください. 不明な場合はオフにしてください.",
|
||||
"SettingsTabGraphicsPreferredGpu": "優先使用するGPU",
|
||||
"SettingsTabGraphicsPreferredGpuTooltip": "Vulkanグラフィックスバックエンドで使用されるグラフィックスカードを選択します.\n\nOpenGLが使用するGPUには影響しません.\n\n不明な場合は, \"dGPU\" としてフラグが立っているGPUに設定します. ない場合はそのままにします.",
|
||||
"SettingsAppRequiredRestartMessage": "Ryujinx の再起動が必要です",
|
||||
|
@ -635,12 +644,15 @@
|
|||
"Recover": "復旧",
|
||||
"UserProfilesRecoverHeading": "以下のアカウントのセーブデータが見つかりました",
|
||||
"UserProfilesRecoverEmptyList": "復元するプロファイルはありません",
|
||||
"GraphicsAATooltip": "ゲームのレンダリングにアンチエイリアスを適用します",
|
||||
"GraphicsAATooltip": "ゲームレンダリングにアンチエイリアスを適用します.\n\nFXAAは画像の大部分をぼかし, SMAAはギザギザのエッジを見つけて滑らかにします.\n\nFSRスケーリングフィルタとの併用は推奨しません.\n\nこのオプションは, ゲーム実行中に下の「適用」をクリックして変更できます. 設定ウィンドウを脇に移動し, ゲームが好みの表示になるように試してみてください.\n\n不明な場合は「なし」のままにしておいてください.",
|
||||
"GraphicsAALabel": "アンチエイリアス:",
|
||||
"GraphicsScalingFilterLabel": "スケーリングフィルタ:",
|
||||
"GraphicsScalingFilterTooltip": "フレームバッファスケーリングを有効にします",
|
||||
"GraphicsScalingFilterTooltip": "解像度変更時に適用されるスケーリングフィルタを選択します.\n\nBilinearは3Dゲームに適しており, 安全なデフォルトオプションです.\n\nピクセルアートゲームにはNearestを推奨します.\n\nFSR 1.0は単なるシャープニングフィルタであり, FXAAやSMAAとの併用は推奨されません.\n\nこのオプションは, ゲーム実行中に下の「適用」をクリックすることで変更できます. 設定ウィンドウを脇に移動し, ゲームが好みの表示になるように試してみてください.\n\n不明な場合はBilinearのままにしておいてください.",
|
||||
"GraphicsScalingFilterBilinear": "Bilinear",
|
||||
"GraphicsScalingFilterNearest": "Nearest",
|
||||
"GraphicsScalingFilterFsr": "FSR",
|
||||
"GraphicsScalingFilterLevelLabel": "レベル",
|
||||
"GraphicsScalingFilterLevelTooltip": "スケーリングフィルタのレベルを設定",
|
||||
"GraphicsScalingFilterLevelTooltip": "FSR 1.0のシャープ化レベルを設定します. 高い値ほどシャープになります.",
|
||||
"SmaaLow": "SMAA Low",
|
||||
"SmaaMedium": "SMAA Medium",
|
||||
"SmaaHigh": "SMAA High",
|
||||
|
@ -648,9 +660,14 @@
|
|||
"UserEditorTitle": "ユーザを編集",
|
||||
"UserEditorTitleCreate": "ユーザを作成",
|
||||
"SettingsTabNetworkInterface": "ネットワークインタフェース:",
|
||||
"NetworkInterfaceTooltip": "LAN機能に使用されるネットワークインタフェース",
|
||||
"NetworkInterfaceTooltip": "LAN/LDN機能に使用されるネットワークインタフェースです.\n\nVPNやXLink Kai、LAN対応のゲームと併用することで, インターネット上の同一ネットワーク接続になりすますことができます.\n\n不明な場合はデフォルトのままにしてください.",
|
||||
"NetworkInterfaceDefault": "デフォルト",
|
||||
"PackagingShaders": "シェーダーを構築中",
|
||||
"AboutChangelogButton": "GitHub で更新履歴を表示",
|
||||
"AboutChangelogButtonTooltipMessage": "クリックして, このバージョンの更新履歴をデフォルトのブラウザで開きます."
|
||||
}
|
||||
"AboutChangelogButtonTooltipMessage": "クリックして, このバージョンの更新履歴をデフォルトのブラウザで開きます.",
|
||||
"SettingsTabNetworkMultiplayer": "マルチプレイヤー",
|
||||
"MultiplayerMode": "モード:",
|
||||
"MultiplayerModeTooltip": "LDNマルチプレイヤーモードを変更します.\n\nldn_mitmモジュールがインストールされた, 他のRyujinxインスタンスや,ハックされたNintendo Switchコンソールとのローカル/同一ネットワーク接続を可能にします.\n\nマルチプレイでは, すべてのプレイヤーが同じゲームバージョンである必要があります(例:Super Smash Bros. Ultimate v13.0.1はv13.0.0に接続できません).\n\n不明な場合は「無効」のままにしてください.",
|
||||
"MultiplayerModeDisabled": "無効",
|
||||
"MultiplayerModeLdnMitm": "ldn_mitm"
|
||||
}
|
||||
|
|
|
@ -1,8 +1,8 @@
|
|||
{
|
||||
"Language": "한국어",
|
||||
"MenuBarFileOpenApplet": "애플릿 열기",
|
||||
"MenuBarFileOpenAppletOpenMiiAppletToolTip": "독립 실행형 모드에서 Mii 편집기 애플릿 열기",
|
||||
"SettingsTabInputDirectMouseAccess": "직접 마우스 접속",
|
||||
"MenuBarFileOpenAppletOpenMiiAppletToolTip": "독립 실행형 모드로 Mii 편집기 애플릿 열기",
|
||||
"SettingsTabInputDirectMouseAccess": "다이렉트 마우스 접근",
|
||||
"SettingsTabSystemMemoryManagerMode": "메모리 관리자 모드:",
|
||||
"SettingsTabSystemMemoryManagerModeSoftware": "소프트웨어",
|
||||
"SettingsTabSystemMemoryManagerModeHost": "호스트 (빠름)",
|
||||
|
@ -14,7 +14,7 @@
|
|||
"MenuBarFileOpenEmuFolder": "Ryujinx 폴더 열기",
|
||||
"MenuBarFileOpenLogsFolder": "로그 폴더 열기",
|
||||
"MenuBarFileExit": "_종료",
|
||||
"MenuBarOptions": "옵션",
|
||||
"MenuBarOptions": "옵션(_O)",
|
||||
"MenuBarOptionsToggleFullscreen": "전체화면 전환",
|
||||
"MenuBarOptionsStartGamesInFullscreen": "전체 화면 모드에서 게임 시작",
|
||||
"MenuBarOptionsStopEmulation": "에뮬레이션 중지",
|
||||
|
@ -30,7 +30,7 @@
|
|||
"MenuBarToolsManageFileTypes": "파일 형식 관리",
|
||||
"MenuBarToolsInstallFileTypes": "파일 형식 설치",
|
||||
"MenuBarToolsUninstallFileTypes": "파일 형식 설치 제거",
|
||||
"MenuBarHelp": "도움말",
|
||||
"MenuBarHelp": "도움말(_H)",
|
||||
"MenuBarHelpCheckForUpdates": "업데이트 확인",
|
||||
"MenuBarHelpAbout": "정보",
|
||||
"MenuSearch": "검색...",
|
||||
|
@ -46,7 +46,7 @@
|
|||
"GameListHeaderPath": "경로",
|
||||
"GameListContextMenuOpenUserSaveDirectory": "사용자 저장 디렉터리 열기",
|
||||
"GameListContextMenuOpenUserSaveDirectoryToolTip": "응용프로그램의 사용자 저장이 포함된 디렉터리 열기",
|
||||
"GameListContextMenuOpenDeviceSaveDirectory": "사용자 장치 디렉터리 열기",
|
||||
"GameListContextMenuOpenDeviceSaveDirectory": "사용자 장치 디렉토리 열기",
|
||||
"GameListContextMenuOpenDeviceSaveDirectoryToolTip": "응용프로그램의 장치 저장이 포함된 디렉터리 열기",
|
||||
"GameListContextMenuOpenBcatSaveDirectory": "BCAT 저장 디렉터리 열기",
|
||||
"GameListContextMenuOpenBcatSaveDirectoryToolTip": "응용프로그램의 BCAT 저장이 포함된 디렉터리 열기",
|
||||
|
@ -54,8 +54,6 @@
|
|||
"GameListContextMenuManageTitleUpdatesToolTip": "타이틀 업데이트 관리 창 열기",
|
||||
"GameListContextMenuManageDlc": "DLC 관리",
|
||||
"GameListContextMenuManageDlcToolTip": "DLC 관리 창 열기",
|
||||
"GameListContextMenuOpenModsDirectory": "Mod 디렉터리 열기",
|
||||
"GameListContextMenuOpenModsDirectoryToolTip": "응용프로그램의 Mod가 포함된 디렉터리 열기",
|
||||
"GameListContextMenuCacheManagement": "캐시 관리",
|
||||
"GameListContextMenuCacheManagementPurgePptc": "대기열 PPTC 재구성",
|
||||
"GameListContextMenuCacheManagementPurgePptcToolTip": "다음 게임 시작에서 부팅 시 PPTC가 다시 빌드하도록 트리거",
|
||||
|
@ -72,6 +70,13 @@
|
|||
"GameListContextMenuExtractDataRomFSToolTip": "응용 프로그램의 현재 구성에서 RomFS 추출 (업데이트 포함)",
|
||||
"GameListContextMenuExtractDataLogo": "로고",
|
||||
"GameListContextMenuExtractDataLogoToolTip": "응용프로그램의 현재 구성에서 로고 섹션 추출 (업데이트 포함)",
|
||||
"GameListContextMenuCreateShortcut": "애플리케이션 바로 가기 만들기",
|
||||
"GameListContextMenuCreateShortcutToolTip": "선택한 애플리케이션을 실행하는 바탕 화면 바로 가기를 만듭니다.",
|
||||
"GameListContextMenuCreateShortcutToolTipMacOS": "해당 게임을 실행할 수 있는 바로가기를 macOS의 응용 프로그램 폴더에 추가합니다.",
|
||||
"GameListContextMenuOpenModsDirectory": "Mod 디렉터리 열기",
|
||||
"GameListContextMenuOpenModsDirectoryToolTip": "해당 게임의 Mod가 저장된 디렉터리 열기",
|
||||
"GameListContextMenuOpenSdModsDirectory": "Atmosphere Mod 디렉터리 열기",
|
||||
"GameListContextMenuOpenSdModsDirectoryToolTip": "해당 게임의 Mod가 포함된 대체 SD 카드 Atmosphere 디렉터리를 엽니다. 실제 하드웨어용으로 패키징된 Mod에 유용합니다.",
|
||||
"StatusBarGamesLoaded": "{0}/{1}개의 게임 불러옴",
|
||||
"StatusBarSystemVersion": "시스템 버전 : {0}",
|
||||
"LinuxVmMaxMapCountDialogTitle": "감지된 메모리 매핑의 하한선",
|
||||
|
@ -150,7 +155,7 @@
|
|||
"SettingsTabGraphicsResolutionScaleNative": "원본(720p/1080p)",
|
||||
"SettingsTabGraphicsResolutionScale2x": "2배(1440p/2160p)",
|
||||
"SettingsTabGraphicsResolutionScale3x": "3배(2160p/3240p)",
|
||||
"SettingsTabGraphicsResolutionScale4x": "4배(2880p/4320p)",
|
||||
"SettingsTabGraphicsResolutionScale4x": "4x (2880p/4320p) (권장하지 않음)",
|
||||
"SettingsTabGraphicsAspectRatio": "종횡비 :",
|
||||
"SettingsTabGraphicsAspectRatio4x3": "4:3",
|
||||
"SettingsTabGraphicsAspectRatio16x9": "16:9",
|
||||
|
@ -292,13 +297,9 @@
|
|||
"GameListContextMenuRunApplication": "응용프로그램 실행",
|
||||
"GameListContextMenuToggleFavorite": "즐겨찾기 전환",
|
||||
"GameListContextMenuToggleFavoriteToolTip": "게임 즐겨찾기 상태 전환",
|
||||
"SettingsTabGeneralTheme": "테마",
|
||||
"SettingsTabGeneralThemeCustomTheme": "커스텀 테마 경로",
|
||||
"SettingsTabGeneralThemeBaseStyle": "기본 스타일",
|
||||
"SettingsTabGeneralThemeBaseStyleDark": "어두움",
|
||||
"SettingsTabGeneralThemeBaseStyleLight": "밝음",
|
||||
"SettingsTabGeneralThemeEnableCustomTheme": "사용자 정의 테마 활성화",
|
||||
"ButtonBrowse": "찾아보기",
|
||||
"SettingsTabGeneralTheme": "테마:",
|
||||
"SettingsTabGeneralThemeDark": "어두운 테마",
|
||||
"SettingsTabGeneralThemeLight": "밝은 테마",
|
||||
"ControllerSettingsConfigureGeneral": "구성",
|
||||
"ControllerSettingsRumble": "진동",
|
||||
"ControllerSettingsRumbleStrongMultiplier": "강력한 진동 증폭기",
|
||||
|
@ -332,8 +333,6 @@
|
|||
"DialogUpdaterAddingFilesMessage": "새 업데이트 추가 중...",
|
||||
"DialogUpdaterCompleteMessage": "업데이트를 완료했습니다!",
|
||||
"DialogUpdaterRestartMessage": "지금 Ryujinx를 다시 시작하겠습니까?",
|
||||
"DialogUpdaterArchNotSupportedMessage": "지원되는 시스템 아키텍처를 실행하고 있지 않습니다!",
|
||||
"DialogUpdaterArchNotSupportedSubMessage": "(64비트 시스템만 지원됩니다!)",
|
||||
"DialogUpdaterNoInternetMessage": "인터넷에 연결되어 있지 않습니다!",
|
||||
"DialogUpdaterNoInternetSubMessage": "인터넷 연결이 작동하는지 확인하세요!",
|
||||
"DialogUpdaterDirtyBuildMessage": "Ryujinx의 나쁜 빌드는 업데이트할 수 없습니다!\n",
|
||||
|
@ -342,7 +341,7 @@
|
|||
"DialogThemeRestartMessage": "테마가 저장되었습니다. 테마를 적용하려면 다시 시작해야 합니다.",
|
||||
"DialogThemeRestartSubMessage": "다시 시작하겠습니까?",
|
||||
"DialogFirmwareInstallEmbeddedMessage": "이 게임에 내장된 펌웨어를 설치하겠습니까? (펌웨어 {0})",
|
||||
"DialogFirmwareInstallEmbeddedSuccessMessage": "설치된 펌웨어가 없지만 Ryujinx가 제공된 게임에서 펌웨어 {0}을(를) 설치할 수 있었습니다.\\n이제 에뮬레이터가 시작됩니다.",
|
||||
"DialogFirmwareInstallEmbeddedSuccessMessage": "설치된 펌웨어가 없지만 Ryujinx가 제공된 게임에서 펌웨어 {0}을(를) 설치할 수 있었습니다.\n이제 에뮬레이터가 시작됩니다.",
|
||||
"DialogFirmwareNoFirmwareInstalledMessage": "설치된 펌웨어 없음",
|
||||
"DialogFirmwareInstalledMessage": "펌웨어 {0}이(가) 설치됨",
|
||||
"DialogInstallFileTypesSuccessMessage": "파일 형식을 성공적으로 설치했습니다!",
|
||||
|
@ -385,7 +384,10 @@
|
|||
"DialogUserProfileUnsavedChangesSubMessage": "변경사항을 저장하지 않으시겠습니까?",
|
||||
"DialogControllerSettingsModifiedConfirmMessage": "현재 컨트롤러 설정이 업데이트되었습니다.",
|
||||
"DialogControllerSettingsModifiedConfirmSubMessage": "저장하겠습니까?",
|
||||
"DialogLoadNcaErrorMessage": "{0}. 오류 발생 파일 : {1}",
|
||||
"DialogLoadFileErrorMessage": "{0}. 오류 발생 파일 : {1}",
|
||||
"DialogModAlreadyExistsMessage": "Mod가 이미 존재합니다.",
|
||||
"DialogModInvalidMessage": "지정된 디렉터리에 Mod가 없습니다!",
|
||||
"DialogModDeleteNoParentMessage": "삭제 실패: \"{0}\" Mod의 상위 디렉터리를 찾을 수 없습니다!",
|
||||
"DialogDlcNoDlcErrorMessage": "지정된 파일에 선택한 타이틀에 대한 DLC가 포함되어 있지 않습니다!",
|
||||
"DialogPerformanceCheckLoggingEnabledMessage": "개발자만 사용하도록 설계된 추적 로그 기록이 활성화되어 있습니다.",
|
||||
"DialogPerformanceCheckLoggingEnabledConfirmMessage": "최적의 성능을 위해 추적 로그 생성을 비활성화하는 것이 좋습니다. 지금 추적 로그 기록을 비활성화하겠습니까?",
|
||||
|
@ -396,6 +398,8 @@
|
|||
"DialogUpdateAddUpdateErrorMessage": "지정된 파일에 선택한 제목에 대한 업데이트가 포함되어 있지 않습니다!",
|
||||
"DialogSettingsBackendThreadingWarningTitle": "경고 - 후단부 스레딩",
|
||||
"DialogSettingsBackendThreadingWarningMessage": "변경 사항을 완전히 적용하려면 이 옵션을 변경한 후, Ryujinx를 다시 시작해야 합니다. 플랫폼에 따라 Ryujinx를 사용할 때 드라이버 자체의 멀티스레딩을 수동으로 비활성화해야 할 수도 있습니다.",
|
||||
"DialogModManagerDeletionWarningMessage": "해당 Mod를 삭제하려고 합니다: {0}\n\n정말로 삭제하시겠습니까?",
|
||||
"DialogModManagerDeletionAllWarningMessage": "해당 타이틀에 대한 모든 Mod들을 삭제하려고 합니다.\n\n정말로 삭제하시겠습니까?",
|
||||
"SettingsTabGraphicsFeaturesOptions": "기능",
|
||||
"SettingsTabGraphicsBackendMultithreading": "그래픽 후단부 멀티스레딩 :",
|
||||
"CommonAuto": "자동",
|
||||
|
@ -430,6 +434,7 @@
|
|||
"DlcManagerRemoveAllButton": "모두 제거",
|
||||
"DlcManagerEnableAllButton": "모두 활성화",
|
||||
"DlcManagerDisableAllButton": "모두 비활성화",
|
||||
"ModManagerDeleteAllButton": "모두 삭제",
|
||||
"MenuBarOptionsChangeLanguage": "언어 변경",
|
||||
"MenuBarShowFileTypes": "파일 유형 표시",
|
||||
"CommonSort": "정렬",
|
||||
|
@ -447,13 +452,13 @@
|
|||
"CustomThemePathTooltip": "사용자 정의 GUI 테마 경로",
|
||||
"CustomThemeBrowseTooltip": "사용자 정의 GUI 테마 찾아보기",
|
||||
"DockModeToggleTooltip": "독 모드에서는 에뮬레이트된 시스템이 도킹된 닌텐도 스위치처럼 작동합니다. 이것은 대부분의 게임에서 그래픽 품질을 향상시킵니다. 반대로 이 기능을 비활성화하면 에뮬레이트된 시스템이 휴대용 닌텐도 스위치처럼 작동하여 그래픽 품질이 저하됩니다.\n\n독 모드를 사용하려는 경우 플레이어 1의 컨트롤을 구성하세요. 휴대 모드를 사용하려는 경우 휴대용 컨트롤을 구성하세요.\n\n확실하지 않으면 켜 두세요.",
|
||||
"DirectKeyboardTooltip": "직접 키보드 접속 (HID) 지원합니다. 텍스트 입력 장치로 키보드에 대한 게임 접속을 제공합니다.",
|
||||
"DirectMouseTooltip": "직접 마우스 접속 (HID) 지원합니다. 포인팅 장치로 마우스에 대한 게임 접속을 제공합니다.",
|
||||
"DirectKeyboardTooltip": "다이렉트 키보드 접근(HID)은 게임에서 사용자의 키보드를 텍스트 입력 장치로 사용할 수 있게끔 제공합니다.\n\n스위치 하드웨어에서 키보드 사용을 네이티브로 지원하는 게임에서만 작동합니다.\n\n이 옵션에 대해 잘 모른다면 끄기를 권장합니다.",
|
||||
"DirectMouseTooltip": "다이렉트 마우스 접근(HID)은 게임에서 사용자의 마우스를 포인터 장치로 사용할 수 있게끔 제공합니다.\n\n스위치 하드웨어에서 마우스 사용을 네이티브로 지원하는 극히 일부 게임에서만 작동합니다.\n\n이 옵션이 활성화된 경우, 터치 스크린 기능이 작동하지 않을 수 있습니다.\n\n이 옵션에 대해 잘 모른다면 끄기를 권장합니다.",
|
||||
"RegionTooltip": "시스템 지역 변경",
|
||||
"LanguageTooltip": "시스템 언어 변경",
|
||||
"TimezoneTooltip": "시스템 시간대 변경",
|
||||
"TimeTooltip": "시스템 시간 변경",
|
||||
"VSyncToggleTooltip": "에뮬레이트된 콘솔의 수직 동기화입니다. 기본적으로 대부분의 게임에 대한 프레임 제한 장치입니다. 비활성화하면 게임이 더 빠른 속도로 실행되거나 로딩 화면이 더 오래 걸리거나 멈출 수 있습니다.\n\n게임 내에서 선호하는 핫키로 전환할 수 있습니다. 비활성화할 계획이라면 이 작업을 수행하는 것이 좋습니다.\n\n확실하지 않으면 켜 두세요.",
|
||||
"VSyncToggleTooltip": "에뮬레이트된 콘솔의 수직 동기화. 기본적으로 대부분의 게임에 대한 프레임 제한 장치로, 비활성화시 게임이 더 빠른 속도로 실행되거나 로딩 화면이 더 오래 걸리거나 멈출 수 있습니다.\n\n게임 내에서 선호하는 핫키로 전환할 수 있습니다(기본값 F1). 핫키를 비활성화할 계획이라면 이 작업을 수행하는 것이 좋습니다.\n\n이 옵션에 대해 잘 모른다면 켜기를 권장드립니다.",
|
||||
"PptcToggleTooltip": "게임이 불러올 때마다 번역할 필요가 없도록 번역된 JIT 기능을 저장합니다.\n\n게임을 처음 부팅한 후 끊김 현상을 줄이고 부팅 시간을 크게 단축합니다.\n\n확실하지 않으면 켜 두세요.",
|
||||
"FsIntegrityToggleTooltip": "게임을 부팅할 때 손상된 파일을 확인하고 손상된 파일이 감지되면 로그에 해시 오류를 표시합니다.\n\n성능에 영향을 미치지 않으며 문제 해결에 도움이 됩니다.\n\n확실하지 않으면 켜 두세요.",
|
||||
"AudioBackendTooltip": "오디오를 렌더링하는 데 사용되는 백엔드를 변경합니다.\n\nSDL2가 선호되는 반면 OpenAL 및 사운드IO는 폴백으로 사용됩니다. 더미는 소리가 나지 않습니다.\n\n확실하지 않으면 SDL2로 설정하세요.",
|
||||
|
@ -467,10 +472,10 @@
|
|||
"GraphicsBackendThreadingTooltip": "두 번째 스레드에서 그래픽 백엔드 명령을 실행합니다.\n\n세이더 컴파일 속도를 높이고 끊김 현상을 줄이며 자체 멀티스레딩 지원 없이 GPU 드라이버의 성능을 향상시킵니다. 멀티스레딩이 있는 드라이버에서 성능이 약간 향상되었습니다.\n\n잘 모르겠으면 자동으로 설정하세요.",
|
||||
"GalThreadingTooltip": "두 번째 스레드에서 그래픽 백엔드 명령을 실행합니다.\n\n세이더 컴파일 속도를 높이고 끊김 현상을 줄이며 자체 멀티스레딩 지원 없이 GPU 드라이버의 성능을 향상시킵니다. 멀티스레딩이 있는 드라이버에서 성능이 약간 향상되었습니다.\n\n잘 모르겠으면 자동으로 설정하세요.",
|
||||
"ShaderCacheToggleTooltip": "후속 실행에서 끊김 현상을 줄이는 디스크 세이더 캐시를 저장합니다.\n\n확실하지 않으면 켜 두세요.",
|
||||
"ResolutionScaleTooltip": "적용 가능한 렌더 타겟에 적용된 해상도 스케일",
|
||||
"ResolutionScaleTooltip": "게임의 렌더링 해상도를 늘립니다.\n\n일부 게임에서는 해당 기능을 지원하지 않거나 해상도가 늘어났음에도 픽셀이 자글자글해 보일 수 있습니다; 이러한 게임들의 경우 사용자가 직접 안티 앨리어싱 기능을 끄는 Mod나 내부 렌더링 해상도를 증가시키는 Mod 등을 찾아보아야 합니다. 후자의 Mod를 사용 시에는 해당 옵션을 네이티브로 두시는 것이 좋습니다.\n\n이 옵션은 게임이 구동중일 때에도 아래 Apply 버튼을 눌러서 변경할 수 있습니다; 설정 창을 게임 창 옆에 두고 사용자가 선호하는 해상도를 실험하여 고를 수 있습니다.\n\n4x 설정은 어떤 셋업에서도 무리인 점을 유의하세요.",
|
||||
"ResolutionScaleEntryTooltip": "1.5와 같은 부동 소수점 분해능 스케일입니다. 비통합 척도는 문제나 충돌을 일으킬 가능성이 더 큽니다.",
|
||||
"AnisotropyTooltip": "비등방성 필터링 수준 (게임에서 요청한 값을 사용하려면 자동으로 설정)",
|
||||
"AspectRatioTooltip": "렌더러 창에 적용된 화면비입니다.",
|
||||
"AnisotropyTooltip": "비등방성 필터링 레벨. 게임에서 요청한 값을 사용하려면 자동으로 설정하세요.",
|
||||
"AspectRatioTooltip": "렌더러 창에 적용될 화면비.\n\n화면비를 변경하는 Mod를 사용할 때에만 이 옵션을 바꾸세요, 그렇지 않을 경우 그래픽이 늘어나 보일 수 있습니다.\n\n이 옵션에 대해 잘 모른다면 16:9로 설정하세요.",
|
||||
"ShaderDumpPathTooltip": "그래픽 셰이더 덤프 경로",
|
||||
"FileLogTooltip": "디스크의 로그 파일에 콘솔 로깅을 저장합니다. 성능에 영향을 미치지 않습니다.",
|
||||
"StubLogTooltip": "콘솔에 스텁 로그 메시지를 인쇄합니다. 성능에 영향을 미치지 않습니다.",
|
||||
|
@ -504,6 +509,8 @@
|
|||
"EnableInternetAccessTooltip": "에뮬레이션된 응용프로그램이 인터넷에 연결되도록 허용합니다.\n\nLAN 모드가 있는 게임은 이 모드가 활성화되고 시스템이 동일한 접속 포인트에 연결된 경우 서로 연결할 수 있습니다. 여기에는 실제 콘솔도 포함됩니다.\n\n닌텐도 서버에 연결할 수 없습니다. 인터넷에 연결을 시도하는 특정 게임에서 충돌이 발생할 수 있습니다.\n\n확실하지 않으면 꺼두세요.",
|
||||
"GameListContextMenuManageCheatToolTip": "치트 관리",
|
||||
"GameListContextMenuManageCheat": "치트 관리",
|
||||
"GameListContextMenuManageModToolTip": "Mod 관리",
|
||||
"GameListContextMenuManageMod": "Mod 관리",
|
||||
"ControllerSettingsStickRange": "범위 :",
|
||||
"DialogStopEmulationTitle": "Ryujinx - 에뮬레이션 중지",
|
||||
"DialogStopEmulationMessage": "에뮬레이션을 중지하겠습니까?",
|
||||
|
@ -515,8 +522,6 @@
|
|||
"SettingsTabCpuMemory": "CPU 모드",
|
||||
"DialogUpdaterFlatpakNotSupportedMessage": "FlatHub를 통해 Ryujinx를 업데이트하세요.",
|
||||
"UpdaterDisabledWarningTitle": "업데이터 비활성화입니다!",
|
||||
"GameListContextMenuOpenSdModsDirectory": "분위기 모드 디렉터리 열기",
|
||||
"GameListContextMenuOpenSdModsDirectoryToolTip": "응용프로그램의 모드가 포함된 대체 SD 카드 분위기 디렉터리를 엽니다. 실제 하드웨어용으로 패키징된 모드에 유용합니다.",
|
||||
"ControllerSettingsRotate90": "시계 방향으로 90° 회전",
|
||||
"IconSize": "아이콘 크기",
|
||||
"IconSizeTooltip": "게임 아이콘 크기 변경",
|
||||
|
@ -544,12 +549,13 @@
|
|||
"SwkbdMinCharacters": "{0}자 이상이어야 함",
|
||||
"SwkbdMinRangeCharacters": "{0}-{1}자여야 함",
|
||||
"SoftwareKeyboard": "소프트웨어 키보드",
|
||||
"SoftwareKeyboardModeNumbersOnly": "숫자만 가능",
|
||||
"SoftwareKeyboardModeNumeric": "'0~9' 또는 '.'만 가능",
|
||||
"SoftwareKeyboardModeAlphabet": "한중일 문자가 아닌 문자만 가능",
|
||||
"SoftwareKeyboardModeASCII": "ASCII 텍스트만 가능",
|
||||
"DialogControllerAppletMessagePlayerRange": "응용 프로그램은 다음을 사용하는 {0} 명의 플레이어를 요청합니다:\n\n유형: {1}\n\n플레이어: {2}\n\n{3} 지금 설정을 열고 입력을 재구성하거나 닫기를 누르세요.\n",
|
||||
"DialogControllerAppletMessage": "응용 프로그램은 다음을 사용하는 정확히 {0}명의 플레이어를 요청합니다:\n\n유형: {1}\n\n플레이어: {2}\n\n{3} 지금 설정을 열고 입력을 재구성하거나 닫기를 누르세요.\n",
|
||||
"DialogControllerAppletDockModeSet": "독 모드가 설정되었습니다. 휴대 모드도 유효하지 않습니다.",
|
||||
"ControllerAppletControllers": "지원하는 컨트롤러:",
|
||||
"ControllerAppletPlayers": "플레이어:",
|
||||
"ControllerAppletDescription": "현재 설정은 유효하지 않습니다. 설정을 열어 입력 장치를 다시 설정하세요.",
|
||||
"ControllerAppletDocked": "독 모드가 설정되었습니다. 핸드헬드 컨트롤은 비활성화됩니다.",
|
||||
"UpdaterRenaming": "이전 파일 이름 바꾸는 중...",
|
||||
"UpdaterRenameFailed": "업데이터가 파일 이름을 바꿀 수 없음: {0}",
|
||||
"UpdaterAddingFiles": "새로운 파일을 추가하는 중...",
|
||||
|
@ -587,6 +593,7 @@
|
|||
"Writable": "쓰기 가능",
|
||||
"SelectDlcDialogTitle": "DLC 파일 선택",
|
||||
"SelectUpdateDialogTitle": "업데이트 파일 선택",
|
||||
"SelectModDialogTitle": "Mod 디렉터리 선택",
|
||||
"UserProfileWindowTitle": "사용자 프로파일 관리자",
|
||||
"CheatWindowTitle": "치트 관리자",
|
||||
"DlcWindowTitle": "{0} ({1})의 다운로드 가능한 콘텐츠 관리",
|
||||
|
@ -594,10 +601,12 @@
|
|||
"CheatWindowHeading": "{0} [{1}]에 사용할 수 있는 치트",
|
||||
"BuildId": "빌드ID :",
|
||||
"DlcWindowHeading": "{0} 내려받기 가능한 콘텐츠",
|
||||
"ModWindowHeading": "{0} Mod(s)",
|
||||
"UserProfilesEditProfile": "선택된 항목 편집",
|
||||
"Cancel": "취소",
|
||||
"Save": "저장",
|
||||
"Discard": "삭제",
|
||||
"Paused": "일시 중지",
|
||||
"UserProfilesSetProfileImage": "프로파일 이미지 설정",
|
||||
"UserProfileEmptyNameError": "이름 필요",
|
||||
"UserProfileNoImageError": "프로파일 이미지를 설정해야 함",
|
||||
|
@ -607,9 +616,9 @@
|
|||
"UserProfilesName": "이름 :",
|
||||
"UserProfilesUserId": "사용자 ID :",
|
||||
"SettingsTabGraphicsBackend": "그래픽 후단부",
|
||||
"SettingsTabGraphicsBackendTooltip": "사용할 그래픽 후단부",
|
||||
"SettingsTabGraphicsBackendTooltip": "에뮬레이터에 사용될 그래픽 백엔드를 선택합니다.\n\nVulkan이 드라이버가 최신이기 때문에 모든 현대 그래픽 카드들에서 더 좋은 성능을 발휘합니다. 또한 Vulkan은 모든 벤더사의 GPU에서 더 빠른 쉐이더 컴파일을 지원하여 스터터링이 적습니다.\n\nOpenGL의 경우 오래된 Nvidia GPU나 오래된 AMD GPU(리눅스 한정), 혹은 VRAM이 적은 GPU에서 더 나은 성능을 발휘할 수는 있으나 쉐이더 컴파일로 인한 스터터링이 Vulkan보다 심할 수 있습니다.\n\n이 옵션에 대해 잘 모른다면 Vulkan으로 설정하세요. 사용하는 GPU가 최신 그래픽 드라이버에서도 Vulkan을 지원하지 않는다면 그 땐 OpenGL로 설정하세요.",
|
||||
"SettingsEnableTextureRecompression": "텍스처 재압축 활성화",
|
||||
"SettingsEnableTextureRecompressionTooltip": "VRAM 사용량을 줄이기 위해 특정 텍스처를 압축합니다.\n\n4GiB VRAM 미만의 GPU와 함께 사용하는 것이 좋습니다.\n\n확실하지 않으면 꺼 두세요.",
|
||||
"SettingsEnableTextureRecompressionTooltip": "ASTC 텍스처를 압축하여 VRAM 사용량을 줄입니다.\n\n애스트럴 체인, 바요네타 3, 파이어 엠블렘 인게이지, 메트로이드 프라임 리마스터, 슈퍼 마리오브라더스 원더, 젤다의 전설: 티어스 오브 더 킹덤 등이 이러한 텍스처 포맷을 사용합니다.\n\nVRAM이 4GiB 이하인 그래픽 카드로 위와 같은 게임들을 구동할시 특정 지점에서 크래시가 발생할 수 있습니다.\n\n위에 서술된 게임들에서 VRAM이 부족한 경우에만 해당 옵션을 켜고, 그 외의 경우에는 끄기를 권장드립니다.",
|
||||
"SettingsTabGraphicsPreferredGpu": "선호하는 GPU",
|
||||
"SettingsTabGraphicsPreferredGpuTooltip": "Vulkan 그래픽 후단부와 함께 사용할 그래픽 카드를 선택하세요.\n\nOpenGL이 사용할 GPU에는 영향을 미치지 않습니다.\n\n확실하지 않은 경우 \"dGPU\" 플래그가 지정된 GPU로 설정하세요. 없는 경우, 그대로 두세요.",
|
||||
"SettingsAppRequiredRestartMessage": "Ryujinx 다시 시작 필요",
|
||||
|
@ -635,12 +644,15 @@
|
|||
"Recover": "복구",
|
||||
"UserProfilesRecoverHeading": "다음 계정에 대한 저장 발견",
|
||||
"UserProfilesRecoverEmptyList": "복구할 프로파일이 없습니다",
|
||||
"GraphicsAATooltip": "게임 렌더링에 안티 앨리어싱을 적용",
|
||||
"GraphicsAATooltip": "게임 렌더에 안티 앨리어싱을 적용합니다.\n\nFXAA는 대부분의 이미지를 뿌옇게 만들지만, SMAA는 들쭉날쭉한 모서리 부분들을 찾아 부드럽게 만듭니다.\n\nFSR 스케일링 필터와 같이 사용하는 것은 권장하지 않습니다.\n\n이 옵션은 게임이 구동중일 때에도 아래 Apply 버튼을 눌러서 변경할 수 있습니다; 설정 창을 게임 창 옆에 두고 사용자가 선호하는 옵션을 실험하여 고를 수 있습니다.\n\n이 옵션에 대해 잘 모른다면 끄기를 권장드립니다.",
|
||||
"GraphicsAALabel": "안티 앨리어싱:",
|
||||
"GraphicsScalingFilterLabel": "스케일링 필터:",
|
||||
"GraphicsScalingFilterTooltip": "프레임버퍼 스케일링 활성화",
|
||||
"GraphicsScalingFilterTooltip": "해상도 스케일에 사용될 스케일링 필터를 선택하세요.\n\nBilinear는 3D 게임에서 잘 작동하며 안전한 기본값입니다.\n\nNearest는 픽셀 아트 게임에 추천합니다.\n\nFSR 1.0은 그저 샤프닝 필터임으로, FXAA나 SMAA와 같이 사용하는 것은 권장하지 않습니다.\n\n이 옵션은 게임이 구동중일 때에도 아래 Apply 버튼을 눌러서 변경할 수 있습니다; 설정 창을 게임 창 옆에 두고 사용자가 선호하는 옵션을 실험하여 고를 수 있습니다.\n\n이 옵션에 대해 잘 모른다면 BILINEAR로 두세요.",
|
||||
"GraphicsScalingFilterBilinear": "Bilinear",
|
||||
"GraphicsScalingFilterNearest": "Nearest",
|
||||
"GraphicsScalingFilterFsr": "FSR",
|
||||
"GraphicsScalingFilterLevelLabel": "수준",
|
||||
"GraphicsScalingFilterLevelTooltip": "스케일링 필터 수준 설정",
|
||||
"GraphicsScalingFilterLevelTooltip": "FSR 1.0의 샤프닝 레벨을 설정하세요. 높을수록 더 또렷해집니다.",
|
||||
"SmaaLow": "SMAA 낮음",
|
||||
"SmaaMedium": "SMAA 중간",
|
||||
"SmaaHigh": "SMAA 높음",
|
||||
|
@ -648,9 +660,14 @@
|
|||
"UserEditorTitle": "사용자 수정",
|
||||
"UserEditorTitleCreate": "사용자 생성",
|
||||
"SettingsTabNetworkInterface": "네트워크 인터페이스:",
|
||||
"NetworkInterfaceTooltip": "LAN 기능에 사용되는 네트워크 인터페이스",
|
||||
"NetworkInterfaceTooltip": "LAN/LDN 기능에 사용될 네트워크 인터페이스입니다.\n\nLAN 기능을 지원하는 게임에서 VPN이나 XLink Kai 등을 동시에 사용하면, 인터넷을 통해 동일 네트워크 연결인 것을 속일 수 있습니다.\n\n이 옵션에 대해 잘 모른다면 기본값으로 설정하세요.",
|
||||
"NetworkInterfaceDefault": "기본",
|
||||
"PackagingShaders": "셰이더 패키징 중",
|
||||
"AboutChangelogButton": "GitHub에서 변경 로그 보기",
|
||||
"AboutChangelogButtonTooltipMessage": "기본 브라우저에서 이 버전의 변경 로그를 열려면 클릭합니다."
|
||||
}
|
||||
"AboutChangelogButtonTooltipMessage": "기본 브라우저에서 이 버전의 변경 로그를 열려면 클릭합니다.",
|
||||
"SettingsTabNetworkMultiplayer": "멀티 플레이어",
|
||||
"MultiplayerMode": "모드 :",
|
||||
"MultiplayerModeTooltip": "LDN 멀티플레이어 모드를 변경합니다.\n\nLdnMitm은 로컬 무선/로컬 플레이 기능을 수정하여 LAN 모드에 있는 것처럼 만들어 로컬이나 동일한 네트워크 상에 있는 다른 Ryujinx 인스턴스나 커펌된 닌텐도 스위치 콘솔(ldn_mitm 모듈 설치 필요)과 연결할 수 있습니다.\n\n멀티플레이어 모드는 모든 플레이어들이 동일한 게임 버전을 요구합니다. 예를 들어 슈퍼 스매시브라더스 얼티밋 v13.0.1 사용자는 v13.0.0 사용자와 연결할 수 없습니다.\n\n해당 옵션에 대해 잘 모른다면 비활성화해두세요.",
|
||||
"MultiplayerModeDisabled": "비활성화됨",
|
||||
"MultiplayerModeLdnMitm": "ldn_mitm"
|
||||
}
|
||||
|
|
|
@ -1,112 +1,117 @@
|
|||
{
|
||||
"Language": "Angielski (USA)",
|
||||
"Language": "Polski",
|
||||
"MenuBarFileOpenApplet": "Otwórz Aplet",
|
||||
"MenuBarFileOpenAppletOpenMiiAppletToolTip": "Otwórz aplet Mii Editor w trybie Indywidualnym",
|
||||
"SettingsTabInputDirectMouseAccess": "Bezpośredni Dostęp do Myszy",
|
||||
"SettingsTabSystemMemoryManagerMode": "Tryb Menedżera Pamięci:",
|
||||
"MenuBarFileOpenAppletOpenMiiAppletToolTip": "Otwórz aplet Mii Editor w trybie indywidualnym",
|
||||
"SettingsTabInputDirectMouseAccess": "Bezpośredni dostęp do myszy",
|
||||
"SettingsTabSystemMemoryManagerMode": "Tryb menedżera pamięci:",
|
||||
"SettingsTabSystemMemoryManagerModeSoftware": "Oprogramowanie",
|
||||
"SettingsTabSystemMemoryManagerModeHost": "Host (szybko)",
|
||||
"SettingsTabSystemMemoryManagerModeHostUnchecked": "Host Niesprawdzony (najszybciej, niebezpiecznie)",
|
||||
"SettingsTabSystemUseHypervisor": "Użyj Hiperwizora",
|
||||
"SettingsTabSystemMemoryManagerModeHost": "Gospodarz (szybki)",
|
||||
"SettingsTabSystemMemoryManagerModeHostUnchecked": "Gospodarza (NIESPRAWDZONY, najszybszy, niebezpieczne)",
|
||||
"SettingsTabSystemUseHypervisor": "Użyj Hipernadzorcy",
|
||||
"MenuBarFile": "_Plik",
|
||||
"MenuBarFileOpenFromFile": "_Załaduj Aplikację z Pliku",
|
||||
"MenuBarFileOpenUnpacked": "Załaduj _Rozpakowaną Grę",
|
||||
"MenuBarFileOpenEmuFolder": "Otwórz Folder Ryujinx",
|
||||
"MenuBarFileOpenLogsFolder": "Otwórz Folder Logów",
|
||||
"MenuBarFileOpenFromFile": "_Załaduj aplikację z pliku",
|
||||
"MenuBarFileOpenUnpacked": "Załaduj _rozpakowaną grę",
|
||||
"MenuBarFileOpenEmuFolder": "Otwórz folder Ryujinx",
|
||||
"MenuBarFileOpenLogsFolder": "Otwórz folder plików dziennika zdarzeń",
|
||||
"MenuBarFileExit": "_Wyjdź",
|
||||
"MenuBarOptions": "Opcje",
|
||||
"MenuBarOptionsToggleFullscreen": "Przełącz Tryb Pełnoekranowy",
|
||||
"MenuBarOptionsStartGamesInFullscreen": "Uruchamiaj Gry w Trybie Pełnoekranowym",
|
||||
"MenuBarOptionsStopEmulation": "Zatrzymaj Emulację",
|
||||
"MenuBarOptions": "_Opcje",
|
||||
"MenuBarOptionsToggleFullscreen": "Przełącz na tryb pełnoekranowy",
|
||||
"MenuBarOptionsStartGamesInFullscreen": "Uruchamiaj gry w trybie pełnoekranowym",
|
||||
"MenuBarOptionsStopEmulation": "Zatrzymaj emulację",
|
||||
"MenuBarOptionsSettings": "_Ustawienia",
|
||||
"MenuBarOptionsManageUserProfiles": "_Zarządzaj Profilami Użytkowników",
|
||||
"MenuBarOptionsManageUserProfiles": "_Zarządzaj profilami użytkowników",
|
||||
"MenuBarActions": "_Akcje",
|
||||
"MenuBarOptionsSimulateWakeUpMessage": "Symuluj Wiadomość Budzenia",
|
||||
"MenuBarOptionsSimulateWakeUpMessage": "Symuluj wiadomość wybudzania",
|
||||
"MenuBarActionsScanAmiibo": "Skanuj Amiibo",
|
||||
"MenuBarTools": "_Narzędzia",
|
||||
"MenuBarToolsInstallFirmware": "Zainstaluj Firmware",
|
||||
"MenuBarFileToolsInstallFirmwareFromFile": "Zainstaluj Firmware z XCI lub ZIP",
|
||||
"MenuBarFileToolsInstallFirmwareFromDirectory": "Zainstaluj Firmware z Katalogu",
|
||||
"MenuBarToolsManageFileTypes": "Zarządzaj rodzajem plików",
|
||||
"MenuBarToolsInstallFileTypes": "Instalacja typów plików",
|
||||
"MenuBarToolsUninstallFileTypes": "Odinstaluj rodzaje plików",
|
||||
"MenuBarHelp": "Pomoc",
|
||||
"MenuBarHelpCheckForUpdates": "Sprawdź Aktualizacje",
|
||||
"MenuBarHelpAbout": "O Aplikacji",
|
||||
"MenuBarToolsInstallFirmware": "Zainstaluj oprogramowanie",
|
||||
"MenuBarFileToolsInstallFirmwareFromFile": "Zainstaluj oprogramowanie z XCI lub ZIP",
|
||||
"MenuBarFileToolsInstallFirmwareFromDirectory": "Zainstaluj oprogramowanie z katalogu",
|
||||
"MenuBarToolsManageFileTypes": "Zarządzaj rodzajami plików",
|
||||
"MenuBarToolsInstallFileTypes": "Typy plików instalacyjnych",
|
||||
"MenuBarToolsUninstallFileTypes": "Typy plików dezinstalacyjnych",
|
||||
"MenuBarHelp": "_Pomoc",
|
||||
"MenuBarHelpCheckForUpdates": "Sprawdź aktualizacje",
|
||||
"MenuBarHelpAbout": "O programie",
|
||||
"MenuSearch": "Wyszukaj...",
|
||||
"GameListHeaderFavorite": "Ulub",
|
||||
"GameListHeaderFavorite": "Ulubione",
|
||||
"GameListHeaderIcon": "Ikona",
|
||||
"GameListHeaderApplication": "Nazwa",
|
||||
"GameListHeaderDeveloper": "Deweloper",
|
||||
"GameListHeaderDeveloper": "Twórca",
|
||||
"GameListHeaderVersion": "Wersja",
|
||||
"GameListHeaderTimePlayed": "Czas Gry",
|
||||
"GameListHeaderLastPlayed": "Ostatnio Grane",
|
||||
"GameListHeaderFileExtension": "Rozsz. Pliku",
|
||||
"GameListHeaderFileSize": "Rozm. Pliku",
|
||||
"GameListHeaderTimePlayed": "Czas w grze:",
|
||||
"GameListHeaderLastPlayed": "Ostatnio grane",
|
||||
"GameListHeaderFileExtension": "Rozszerzenie pliku",
|
||||
"GameListHeaderFileSize": "Rozmiar pliku",
|
||||
"GameListHeaderPath": "Ścieżka",
|
||||
"GameListContextMenuOpenUserSaveDirectory": "Otwórz Katalog Zapisów Użytkownika",
|
||||
"GameListContextMenuOpenUserSaveDirectoryToolTip": "Otwiera katalog, który zawiera Zapis Użytkownika Aplikacji",
|
||||
"GameListContextMenuOpenDeviceSaveDirectory": "Otwórz Katalog Urządzeń Użytkownika",
|
||||
"GameListContextMenuOpenDeviceSaveDirectoryToolTip": "Otwiera katalog, który zawiera Zapis Urządzenia Aplikacji",
|
||||
"GameListContextMenuOpenBcatSaveDirectory": "Otwórz Katalog BCAT Użytkownika",
|
||||
"GameListContextMenuOpenBcatSaveDirectoryToolTip": "Otwiera katalog, który zawiera Zapis BCAT Aplikacji",
|
||||
"GameListContextMenuManageTitleUpdates": "Zarządzaj Aktualizacjami Tytułów",
|
||||
"GameListContextMenuManageTitleUpdatesToolTip": "Otwiera okno zarządzania Aktualizacjami Tytułu",
|
||||
"GameListContextMenuManageDlc": "Zarządzaj DLC",
|
||||
"GameListContextMenuManageDlcToolTip": "Otwiera okno zarządzania DLC",
|
||||
"GameListContextMenuOpenModsDirectory": "Otwórz Katalog Modów",
|
||||
"GameListContextMenuOpenModsDirectoryToolTip": "Otwiera katalog zawierający Mody Aplikacji",
|
||||
"GameListContextMenuOpenUserSaveDirectory": "Otwórz katalog zapisów użytkownika",
|
||||
"GameListContextMenuOpenUserSaveDirectoryToolTip": "Otwiera katalog, który zawiera zapis użytkownika dla tej aplikacji",
|
||||
"GameListContextMenuOpenDeviceSaveDirectory": "Otwórz katalog zapisów urządzenia",
|
||||
"GameListContextMenuOpenDeviceSaveDirectoryToolTip": "Otwiera katalog, który zawiera zapis urządzenia dla tej aplikacji",
|
||||
"GameListContextMenuOpenBcatSaveDirectory": "Otwórz katalog zapisu BCAT obecnego użytkownika",
|
||||
"GameListContextMenuOpenBcatSaveDirectoryToolTip": "Otwiera katalog, który zawiera zapis BCAT dla tej aplikacji",
|
||||
"GameListContextMenuManageTitleUpdates": "Zarządzaj aktualizacjami",
|
||||
"GameListContextMenuManageTitleUpdatesToolTip": "Otwiera okno zarządzania aktualizacjami danej aplikacji",
|
||||
"GameListContextMenuManageDlc": "Zarządzaj dodatkową zawartością (DLC)",
|
||||
"GameListContextMenuManageDlcToolTip": "Otwiera okno zarządzania dodatkową zawartością",
|
||||
"GameListContextMenuCacheManagement": "Zarządzanie Cache",
|
||||
"GameListContextMenuCacheManagementPurgePptc": "Dodaj Rekompilację PPTC do Kolejki",
|
||||
"GameListContextMenuCacheManagementPurgePptc": "Zakolejkuj rekompilację PPTC",
|
||||
"GameListContextMenuCacheManagementPurgePptcToolTip": "Zainicjuj Rekompilację PPTC przy następnym uruchomieniu gry",
|
||||
"GameListContextMenuCacheManagementPurgeShaderCache": "Wyczyść Cache Shaderów",
|
||||
"GameListContextMenuCacheManagementPurgeShaderCacheToolTip": "Usuwa cache shaderów aplikacji",
|
||||
"GameListContextMenuCacheManagementOpenPptcDirectory": "Otwórz Katalog PPTC",
|
||||
"GameListContextMenuCacheManagementOpenPptcDirectoryToolTip": "Otwiera katalog, który zawiera cache PPTC aplikacji",
|
||||
"GameListContextMenuCacheManagementOpenShaderCacheDirectory": "Otwórz Katalog Cache Shaderów",
|
||||
"GameListContextMenuCacheManagementOpenShaderCacheDirectoryToolTip": "Otwiera katalog, który zawiera cache shaderów aplikacji",
|
||||
"GameListContextMenuExtractData": "Wyodrębnij Dane",
|
||||
"GameListContextMenuCacheManagementPurgeShaderCache": "Wyczyść pamięć podręczną cieni",
|
||||
"GameListContextMenuCacheManagementPurgeShaderCacheToolTip": "Usuwa pamięć podręczną cieni danej aplikacji",
|
||||
"GameListContextMenuCacheManagementOpenPptcDirectory": "Otwórz katalog PPTC",
|
||||
"GameListContextMenuCacheManagementOpenPptcDirectoryToolTip": "Otwiera katalog, który zawiera pamięć podręczną PPTC aplikacji",
|
||||
"GameListContextMenuCacheManagementOpenShaderCacheDirectory": "Otwórz katalog pamięci podręcznej cieni",
|
||||
"GameListContextMenuCacheManagementOpenShaderCacheDirectoryToolTip": "Otwiera katalog, który zawiera pamięć podręczną cieni aplikacji",
|
||||
"GameListContextMenuExtractData": "Wypakuj dane",
|
||||
"GameListContextMenuExtractDataExeFS": "ExeFS",
|
||||
"GameListContextMenuExtractDataExeFSToolTip": "Wyodrębnij sekcję ExeFS z bieżącej konfiguracji aplikacji (w tym aktualizacje)",
|
||||
"GameListContextMenuExtractDataRomFS": "RomFS",
|
||||
"GameListContextMenuExtractDataRomFSToolTip": "Wyodrębnij sekcję RomFS z bieżącej konfiguracji aplikacji (w tym aktualizacje)",
|
||||
"GameListContextMenuExtractDataLogo": "Logo",
|
||||
"GameListContextMenuExtractDataLogoToolTip": "Wyodrębnij sekcję Logo z bieżącej konfiguracji aplikacji (w tym aktualizacje)",
|
||||
"StatusBarGamesLoaded": "{0}/{1} Załadowane Gry",
|
||||
"StatusBarSystemVersion": "Wersja Systemu: {0}",
|
||||
"LinuxVmMaxMapCountDialogTitle": "Wykryto niski limit dla mapowania pamięci",
|
||||
"LinuxVmMaxMapCountDialogTextPrimary": "Czy chciałbyś zwiększyć wartość vm.max_map_count do {0}",
|
||||
"LinuxVmMaxMapCountDialogTextSecondary": "Niektóre gry mogą próbować stworzyć więcej mapowań pamięci niż obecnie, jest to dozwolone. Ryujinx napotka crash, gdy dojdzie do takiej sytuacji.",
|
||||
"GameListContextMenuExtractDataLogoToolTip": "Wyodrębnij sekcję z logiem z bieżącej konfiguracji aplikacji (w tym aktualizacje)",
|
||||
"GameListContextMenuCreateShortcut": "Utwórz skrót aplikacji",
|
||||
"GameListContextMenuCreateShortcutToolTip": "Utwórz skrót na pulpicie, który uruchamia wybraną aplikację",
|
||||
"GameListContextMenuCreateShortcutToolTipMacOS": "Utwórz skrót w folderze 'Aplikacje' w systemie macOS, który uruchamia wybraną aplikację",
|
||||
"GameListContextMenuOpenModsDirectory": "Otwórz katalog modów",
|
||||
"GameListContextMenuOpenModsDirectoryToolTip": "Otwiera katalog zawierający mody dla danej aplikacji",
|
||||
"GameListContextMenuOpenSdModsDirectory": "Otwórz katalog modów Atmosphere",
|
||||
"GameListContextMenuOpenSdModsDirectoryToolTip": "Otwiera alternatywny katalog Atmosphere na karcie SD, który zawiera mody danej aplikacji. Przydatne dla modów przygotowanych pod prawdziwy sprzęt.",
|
||||
"StatusBarGamesLoaded": "{0}/{1} Załadowane gry",
|
||||
"StatusBarSystemVersion": "Wersja systemu: {0}",
|
||||
"LinuxVmMaxMapCountDialogTitle": "Wykryto niski limit dla przypisań pamięci",
|
||||
"LinuxVmMaxMapCountDialogTextPrimary": "Czy chcesz zwiększyć wartość vm.max_map_count do {0}",
|
||||
"LinuxVmMaxMapCountDialogTextSecondary": "Niektóre gry mogą próbować przypisać sobie więcej pamięci niż obecnie, jest to dozwolone. Ryujinx ulegnie awarii, gdy limit zostanie przekroczony.",
|
||||
"LinuxVmMaxMapCountDialogButtonUntilRestart": "Tak, do następnego ponownego uruchomienia",
|
||||
"LinuxVmMaxMapCountDialogButtonPersistent": "Tak, permanentnie ",
|
||||
"LinuxVmMaxMapCountWarningTextPrimary": "Maksymalna ilość mapowania pamięci jest mniejsza niż zalecana.",
|
||||
"LinuxVmMaxMapCountWarningTextPrimary": "Maksymalna ilość przypisanej pamięci jest mniejsza niż zalecana.",
|
||||
"LinuxVmMaxMapCountWarningTextSecondary": "Obecna wartość vm.max_map_count ({0}) jest mniejsza niż {1}. Niektóre gry mogą próbować stworzyć więcej mapowań pamięci niż obecnie jest to dozwolone. Ryujinx napotka crash, gdy dojdzie do takiej sytuacji.\n\nMożesz chcieć ręcznie zwiększyć limit lub zainstalować pkexec, co pozwala Ryujinx na pomoc w tym zakresie.",
|
||||
"Settings": "Ustawienia",
|
||||
"SettingsTabGeneral": "Interfejs Użytkownika",
|
||||
"SettingsTabGeneral": "Interfejs użytkownika",
|
||||
"SettingsTabGeneralGeneral": "Ogólne",
|
||||
"SettingsTabGeneralEnableDiscordRichPresence": "Włącz Bogatą Obecność Discord",
|
||||
"SettingsTabGeneralCheckUpdatesOnLaunch": "Sprawdź Aktualizacje przy Uruchomieniu",
|
||||
"SettingsTabGeneralShowConfirmExitDialog": "Pokaż Okno Dialogowe \"Potwierdzenia Wyjścia\"",
|
||||
"SettingsTabGeneralCheckUpdatesOnLaunch": "Sprawdzaj aktualizacje przy uruchomieniu",
|
||||
"SettingsTabGeneralShowConfirmExitDialog": "Pokazuj okno dialogowe \"Potwierdź wyjście\"",
|
||||
"SettingsTabGeneralHideCursor": "Ukryj kursor:",
|
||||
"SettingsTabGeneralHideCursorNever": "Nigdy",
|
||||
"SettingsTabGeneralHideCursorOnIdle": "Ukryj Kursor Podczas Bezczynności",
|
||||
"SettingsTabGeneralHideCursorOnIdle": "Gdy bezczynny",
|
||||
"SettingsTabGeneralHideCursorAlways": "Zawsze",
|
||||
"SettingsTabGeneralGameDirectories": "Katalogi Gier",
|
||||
"SettingsTabGeneralGameDirectories": "Katalogi gier",
|
||||
"SettingsTabGeneralAdd": "Dodaj",
|
||||
"SettingsTabGeneralRemove": "Usuń",
|
||||
"SettingsTabSystem": "System",
|
||||
"SettingsTabSystemCore": "Główne",
|
||||
"SettingsTabSystemSystemRegion": "Region Systemu:",
|
||||
"SettingsTabSystemSystemRegion": "Region systemu:",
|
||||
"SettingsTabSystemSystemRegionJapan": "Japonia",
|
||||
"SettingsTabSystemSystemRegionUSA": "USA",
|
||||
"SettingsTabSystemSystemRegionUSA": "Stany Zjednoczone",
|
||||
"SettingsTabSystemSystemRegionEurope": "Europa",
|
||||
"SettingsTabSystemSystemRegionAustralia": "Australia",
|
||||
"SettingsTabSystemSystemRegionChina": "Chiny",
|
||||
"SettingsTabSystemSystemRegionKorea": "Korea",
|
||||
"SettingsTabSystemSystemRegionTaiwan": "Tajwan",
|
||||
"SettingsTabSystemSystemLanguage": "Język Systemu:",
|
||||
"SettingsTabSystemSystemLanguage": "Język systemu:",
|
||||
"SettingsTabSystemSystemLanguageJapanese": "Japoński",
|
||||
"SettingsTabSystemSystemLanguageAmericanEnglish": "Amerykański Angielski",
|
||||
"SettingsTabSystemSystemLanguageAmericanEnglish": "Angielski (Stany Zjednoczone)",
|
||||
"SettingsTabSystemSystemLanguageFrench": "Francuski",
|
||||
"SettingsTabSystemSystemLanguageGerman": "Niemiecki",
|
||||
"SettingsTabSystemSystemLanguageItalian": "Włoski",
|
||||
|
@ -117,16 +122,16 @@
|
|||
"SettingsTabSystemSystemLanguagePortuguese": "Portugalski",
|
||||
"SettingsTabSystemSystemLanguageRussian": "Rosyjski",
|
||||
"SettingsTabSystemSystemLanguageTaiwanese": "Tajwański",
|
||||
"SettingsTabSystemSystemLanguageBritishEnglish": "Brytyjski Angielski",
|
||||
"SettingsTabSystemSystemLanguageBritishEnglish": "Angielski (Wielka Brytania)",
|
||||
"SettingsTabSystemSystemLanguageCanadianFrench": "Kanadyjski Francuski",
|
||||
"SettingsTabSystemSystemLanguageLatinAmericanSpanish": "Hiszpański Latynoamerykański",
|
||||
"SettingsTabSystemSystemLanguageSimplifiedChinese": "Chiński Uproszczony",
|
||||
"SettingsTabSystemSystemLanguageTraditionalChinese": "Chiński Tradycyjny",
|
||||
"SettingsTabSystemSystemTimeZone": "Strefa Czasowa Systemu:",
|
||||
"SettingsTabSystemSystemTime": "Czas Systemu:",
|
||||
"SettingsTabSystemEnableVsync": "Włącz synchronizację pionową",
|
||||
"SettingsTabSystemEnablePptc": "PPTC (Profilowany Cache Trwałych Tłumaczeń)",
|
||||
"SettingsTabSystemEnableFsIntegrityChecks": "Kontrole Integralności Systemu Plików",
|
||||
"SettingsTabSystemSystemLanguageLatinAmericanSpanish": "Hiszpański (Ameryka Łacińska)",
|
||||
"SettingsTabSystemSystemLanguageSimplifiedChinese": "Chiński (Uproszczony)",
|
||||
"SettingsTabSystemSystemLanguageTraditionalChinese": "Chiński (Tradycyjny)",
|
||||
"SettingsTabSystemSystemTimeZone": "Strefa czasowa systemu:",
|
||||
"SettingsTabSystemSystemTime": "Czas systemu:",
|
||||
"SettingsTabSystemEnableVsync": "Synchronizacja pionowa",
|
||||
"SettingsTabSystemEnablePptc": "PPTC (Profilowana pamięć podręczna trwałych łłumaczeń)",
|
||||
"SettingsTabSystemEnableFsIntegrityChecks": "Sprawdzanie integralności systemu plików",
|
||||
"SettingsTabSystemAudioBackend": "Backend Dżwięku:",
|
||||
"SettingsTabSystemAudioBackendDummy": "Atrapa",
|
||||
"SettingsTabSystemAudioBackendOpenAL": "OpenAL",
|
||||
|
@ -138,31 +143,31 @@
|
|||
"SettingsTabSystemIgnoreMissingServices": "Ignoruj Brakujące Usługi",
|
||||
"SettingsTabGraphics": "Grafika",
|
||||
"SettingsTabGraphicsAPI": "Graficzne API",
|
||||
"SettingsTabGraphicsEnableShaderCache": "Włącz Cache Shaderów",
|
||||
"SettingsTabGraphicsAnisotropicFiltering": "Filtrowanie Anizotropowe:",
|
||||
"SettingsTabGraphicsAnisotropicFilteringAuto": "Automatyczny",
|
||||
"SettingsTabGraphicsEnableShaderCache": "Włącz pamięć podręczną cieni",
|
||||
"SettingsTabGraphicsAnisotropicFiltering": "Filtrowanie anizotropowe:",
|
||||
"SettingsTabGraphicsAnisotropicFilteringAuto": "Automatyczne",
|
||||
"SettingsTabGraphicsAnisotropicFiltering2x": "2x",
|
||||
"SettingsTabGraphicsAnisotropicFiltering4x": "4x",
|
||||
"SettingsTabGraphicsAnisotropicFiltering8x": "8x",
|
||||
"SettingsTabGraphicsAnisotropicFiltering16x": "16x",
|
||||
"SettingsTabGraphicsResolutionScale": "Skala Rozdzielczości:",
|
||||
"SettingsTabGraphicsResolutionScale": "Skalowanie rozdzielczości:",
|
||||
"SettingsTabGraphicsResolutionScaleCustom": "Niestandardowa (Niezalecane)",
|
||||
"SettingsTabGraphicsResolutionScaleNative": "Natywna (720p/1080p)",
|
||||
"SettingsTabGraphicsResolutionScale2x": "2x (1440p/2160p)",
|
||||
"SettingsTabGraphicsResolutionScale3x": "3x (2160p/3240p)",
|
||||
"SettingsTabGraphicsResolutionScale4x": "4x (2880p/4320p)",
|
||||
"SettingsTabGraphicsAspectRatio": "Współczynnik Proporcji:",
|
||||
"SettingsTabGraphicsResolutionScale4x": "4x (2880p/4320p) (niezalecane)",
|
||||
"SettingsTabGraphicsAspectRatio": "Format obrazu:",
|
||||
"SettingsTabGraphicsAspectRatio4x3": "4:3",
|
||||
"SettingsTabGraphicsAspectRatio16x9": "16:9",
|
||||
"SettingsTabGraphicsAspectRatio16x10": "16:10",
|
||||
"SettingsTabGraphicsAspectRatio21x9": "21:9",
|
||||
"SettingsTabGraphicsAspectRatio32x9": "32:9",
|
||||
"SettingsTabGraphicsAspectRatioStretch": "Rozciągnij do Okna",
|
||||
"SettingsTabGraphicsDeveloperOptions": "Opcje Programistyczne",
|
||||
"SettingsTabGraphicsShaderDumpPath": "Ścieżka Zrzutu Shaderów Grafiki:",
|
||||
"SettingsTabLogging": "Logowanie",
|
||||
"SettingsTabLoggingLogging": "Logowanie",
|
||||
"SettingsTabLoggingEnableLoggingToFile": "Włącz Logowanie do Pliku",
|
||||
"SettingsTabGraphicsDeveloperOptions": "Opcje programisty",
|
||||
"SettingsTabGraphicsShaderDumpPath": "Ścieżka do zgranych cieni graficznych:",
|
||||
"SettingsTabLogging": "Dziennik zdarzeń",
|
||||
"SettingsTabLoggingLogging": "Dziennik zdarzeń",
|
||||
"SettingsTabLoggingEnableLoggingToFile": "Włącz rejestrowanie zdarzeń do pliku",
|
||||
"SettingsTabLoggingEnableStubLogs": "Wlącz Skróty Logów",
|
||||
"SettingsTabLoggingEnableInfoLogs": "Włącz Logi Informacyjne",
|
||||
"SettingsTabLoggingEnableWarningLogs": "Włącz Logi Ostrzeżeń",
|
||||
|
@ -170,18 +175,18 @@
|
|||
"SettingsTabLoggingEnableTraceLogs": "Włącz Logi Śledzenia",
|
||||
"SettingsTabLoggingEnableGuestLogs": "Włącz Logi Gości",
|
||||
"SettingsTabLoggingEnableFsAccessLogs": "Włącz Logi Dostępu do Systemu Plików",
|
||||
"SettingsTabLoggingFsGlobalAccessLogMode": "Tryb Globalnych Logów Systemu Plików:",
|
||||
"SettingsTabLoggingDeveloperOptions": "Opcje programistyczne (OSTRZEŻENIE: Zmniejszą wydajność)",
|
||||
"SettingsTabLoggingDeveloperOptionsNote": "UWAGA: Zredukuje wydajność",
|
||||
"SettingsTabLoggingGraphicsBackendLogLevel": "Ilość Logów Backendu Graficznego:",
|
||||
"SettingsTabLoggingGraphicsBackendLogLevelNone": "Żadne",
|
||||
"SettingsTabLoggingFsGlobalAccessLogMode": "Tryb globalnego dziennika zdarzeń systemu plików:",
|
||||
"SettingsTabLoggingDeveloperOptions": "Opcje programisty (UWAGA: wpływa na wydajność)",
|
||||
"SettingsTabLoggingDeveloperOptionsNote": "UWAGA: Pogrorszy wydajność",
|
||||
"SettingsTabLoggingGraphicsBackendLogLevel": "Poziom rejestrowania do dziennika zdarzeń Backendu Graficznego:",
|
||||
"SettingsTabLoggingGraphicsBackendLogLevelNone": "Nic",
|
||||
"SettingsTabLoggingGraphicsBackendLogLevelError": "Błędy",
|
||||
"SettingsTabLoggingGraphicsBackendLogLevelPerformance": "Spowolnienia",
|
||||
"SettingsTabLoggingGraphicsBackendLogLevelAll": "Wszystkie",
|
||||
"SettingsTabLoggingEnableDebugLogs": "Włącz Logi Debugowania",
|
||||
"SettingsTabLoggingGraphicsBackendLogLevelAll": "Wszystko",
|
||||
"SettingsTabLoggingEnableDebugLogs": "Włącz dzienniki zdarzeń do debugowania",
|
||||
"SettingsTabInput": "Sterowanie",
|
||||
"SettingsTabInputEnableDockedMode": "Tryb Zadokowany",
|
||||
"SettingsTabInputDirectKeyboardAccess": "Bezpośredni Dostęp do Klawiatury",
|
||||
"SettingsTabInputEnableDockedMode": "Tryb zadokowany",
|
||||
"SettingsTabInputDirectKeyboardAccess": "Bezpośredni dostęp do klawiatury",
|
||||
"SettingsButtonSave": "Zapisz",
|
||||
"SettingsButtonClose": "Zamknij",
|
||||
"SettingsButtonOk": "OK",
|
||||
|
@ -197,10 +202,10 @@
|
|||
"ControllerSettingsPlayer7": "Gracz 7",
|
||||
"ControllerSettingsPlayer8": "Gracz 8",
|
||||
"ControllerSettingsHandheld": "Przenośny",
|
||||
"ControllerSettingsInputDevice": "Urządzenie Wejściowe",
|
||||
"ControllerSettingsInputDevice": "Urządzenie wejściowe",
|
||||
"ControllerSettingsRefresh": "Odśwież",
|
||||
"ControllerSettingsDeviceDisabled": "Wyłączone",
|
||||
"ControllerSettingsControllerType": "Typ Kontrolera",
|
||||
"ControllerSettingsControllerType": "Typ kontrolera",
|
||||
"ControllerSettingsControllerTypeHandheld": "Przenośny",
|
||||
"ControllerSettingsControllerTypeProController": "Pro Kontroler",
|
||||
"ControllerSettingsControllerTypeJoyConPair": "Para JoyCon-ów",
|
||||
|
@ -218,7 +223,7 @@
|
|||
"ControllerSettingsButtonY": "Y",
|
||||
"ControllerSettingsButtonPlus": "+",
|
||||
"ControllerSettingsButtonMinus": "-",
|
||||
"ControllerSettingsDPad": "Pad Kierunkowy",
|
||||
"ControllerSettingsDPad": "Krzyżak (D-Pad)",
|
||||
"ControllerSettingsDPadUp": "Góra",
|
||||
"ControllerSettingsDPadDown": "Dół",
|
||||
"ControllerSettingsDPadLeft": "Lewo",
|
||||
|
@ -261,79 +266,73 @@
|
|||
"ControllerSettingsMotionGyroDeadzone": "Deadzone Żyroskopu:",
|
||||
"ControllerSettingsSave": "Zapisz",
|
||||
"ControllerSettingsClose": "Zamknij",
|
||||
"UserProfilesSelectedUserProfile": "Wybrany Profil Użytkownika:",
|
||||
"UserProfilesSaveProfileName": "Zapisz Nazwę Profilu",
|
||||
"UserProfilesChangeProfileImage": "Zmień Obraz Profilu",
|
||||
"UserProfilesAvailableUserProfiles": "Dostępne Profile Użytkowników:",
|
||||
"UserProfilesAddNewProfile": "Utwórz Profil",
|
||||
"UserProfilesDelete": "Usuwać",
|
||||
"UserProfilesSelectedUserProfile": "Wybrany profil użytkownika:",
|
||||
"UserProfilesSaveProfileName": "Zapisz nazwę profilu",
|
||||
"UserProfilesChangeProfileImage": "Zmień obrazek profilu",
|
||||
"UserProfilesAvailableUserProfiles": "Dostępne profile użytkownika:",
|
||||
"UserProfilesAddNewProfile": "Utwórz profil",
|
||||
"UserProfilesDelete": "Usuń",
|
||||
"UserProfilesClose": "Zamknij",
|
||||
"ProfileNameSelectionWatermark": "Wybierz pseudonim",
|
||||
"ProfileImageSelectionTitle": "Wybór Obrazu Profilu",
|
||||
"ProfileImageSelectionHeader": "Wybierz zdjęcie profilowe",
|
||||
"ProfileImageSelectionNote": "Możesz zaimportować niestandardowy obraz profilu lub wybrać awatar z firmware'u systemowego",
|
||||
"ProfileImageSelectionImportImage": "Importuj Plik Obrazu",
|
||||
"ProfileImageSelectionSelectAvatar": "Wybierz Awatar z Firmware'u",
|
||||
"ProfileImageSelectionSelectAvatar": "Wybierz domyślny awatar z oprogramowania konsoli",
|
||||
"InputDialogTitle": "Okno Dialogowe Wprowadzania",
|
||||
"InputDialogOk": "OK",
|
||||
"InputDialogCancel": "Anuluj",
|
||||
"InputDialogAddNewProfileTitle": "Wybierz Nazwę Profilu",
|
||||
"InputDialogAddNewProfileHeader": "Wprowadź Nazwę Profilu",
|
||||
"InputDialogAddNewProfileSubtext": "(Maksymalna Długość: {0})",
|
||||
"AvatarChoose": "Wybierz",
|
||||
"AvatarSetBackgroundColor": "Ustaw Kolor Tła",
|
||||
"InputDialogAddNewProfileTitle": "Wybierz nazwę profilu",
|
||||
"InputDialogAddNewProfileHeader": "Wprowadź nazwę profilu",
|
||||
"InputDialogAddNewProfileSubtext": "(Maksymalna długość: {0})",
|
||||
"AvatarChoose": "Wybierz awatar",
|
||||
"AvatarSetBackgroundColor": "Ustaw kolor tła",
|
||||
"AvatarClose": "Zamknij",
|
||||
"ControllerSettingsLoadProfileToolTip": "Załaduj Profil",
|
||||
"ControllerSettingsAddProfileToolTip": "Dodaj Profil",
|
||||
"ControllerSettingsRemoveProfileToolTip": "Usuń Profil",
|
||||
"ControllerSettingsSaveProfileToolTip": "Zapisz Profil",
|
||||
"MenuBarFileToolsTakeScreenshot": "Zrób Zrzut Ekranu",
|
||||
"MenuBarFileToolsHideUi": "Ukryj UI",
|
||||
"ControllerSettingsLoadProfileToolTip": "Wczytaj profil",
|
||||
"ControllerSettingsAddProfileToolTip": "Dodaj profil",
|
||||
"ControllerSettingsRemoveProfileToolTip": "Usuń profil",
|
||||
"ControllerSettingsSaveProfileToolTip": "Zapisz profil",
|
||||
"MenuBarFileToolsTakeScreenshot": "Zrób zrzut ekranu",
|
||||
"MenuBarFileToolsHideUi": "Ukryj interfejs użytkownika",
|
||||
"GameListContextMenuRunApplication": "Uruchom aplikację ",
|
||||
"GameListContextMenuToggleFavorite": "Przełącz Ulubione",
|
||||
"GameListContextMenuToggleFavorite": "Przełącz na ulubione",
|
||||
"GameListContextMenuToggleFavoriteToolTip": "Przełącz status Ulubionej Gry",
|
||||
"SettingsTabGeneralTheme": "Motyw",
|
||||
"SettingsTabGeneralThemeCustomTheme": "Ścieżka Niestandardowych Motywów",
|
||||
"SettingsTabGeneralThemeBaseStyle": "Styl Podstawowy",
|
||||
"SettingsTabGeneralThemeBaseStyleDark": "Ciemny",
|
||||
"SettingsTabGeneralThemeBaseStyleLight": "Jasny",
|
||||
"SettingsTabGeneralThemeEnableCustomTheme": "Włącz Niestandardowy Motyw",
|
||||
"ButtonBrowse": "Przeglądaj",
|
||||
"SettingsTabGeneralTheme": "Motyw:",
|
||||
"SettingsTabGeneralThemeDark": "Ciemny",
|
||||
"SettingsTabGeneralThemeLight": "Jasny",
|
||||
"ControllerSettingsConfigureGeneral": "Konfiguruj",
|
||||
"ControllerSettingsRumble": "Wibracje",
|
||||
"ControllerSettingsRumbleStrongMultiplier": "Mocny Mnożnik Wibracji",
|
||||
"ControllerSettingsRumbleWeakMultiplier": "Słaby Mnożnik Wibracji",
|
||||
"DialogMessageSaveNotAvailableMessage": "Nie ma danych zapisu dla {0} [{1:x16}]",
|
||||
"DialogMessageSaveNotAvailableCreateSaveMessage": "Czy chcesz utworzyć dane zapisu dla tej gry?",
|
||||
"ControllerSettingsRumbleStrongMultiplier": "Mnożnik mocnych wibracji",
|
||||
"ControllerSettingsRumbleWeakMultiplier": "Mnożnik słabych wibracji",
|
||||
"DialogMessageSaveNotAvailableMessage": "Nie ma zapisanych danych dla {0} [{1:x16}]",
|
||||
"DialogMessageSaveNotAvailableCreateSaveMessage": "Czy chcesz utworzyć zapis danych dla tej gry?",
|
||||
"DialogConfirmationTitle": "Ryujinx - Potwierdzenie",
|
||||
"DialogUpdaterTitle": "Ryujinx - Aktualizator",
|
||||
"DialogUpdaterTitle": "Ryujinx - Asystent aktualizacji",
|
||||
"DialogErrorTitle": "Ryujinx - Błąd",
|
||||
"DialogWarningTitle": "Ryujinx - Uwaga",
|
||||
"DialogWarningTitle": "Ryujinx - Ostrzeżenie",
|
||||
"DialogExitTitle": "Ryujinx - Wyjdź",
|
||||
"DialogErrorMessage": "Ryujinx napotkał błąd",
|
||||
"DialogExitMessage": "Czy na pewno chcesz zamknąć Ryujinx?",
|
||||
"DialogExitSubMessage": "Wszystkie niezapisane dane zostaną utracone!",
|
||||
"DialogMessageCreateSaveErrorMessage": "Wystąpił błąd podczas tworzenia określonych danych zapisu: {0}",
|
||||
"DialogMessageFindSaveErrorMessage": "Wystąpił błąd podczas znajdowania określonych danych zapisu: {0}",
|
||||
"FolderDialogExtractTitle": "Wybierz folder do rozpakowania",
|
||||
"DialogNcaExtractionMessage": "Wyodrębnianie sekcji {0} z {1}...",
|
||||
"DialogNcaExtractionTitle": "Ryujinx - Ekstraktor Sekcji NCA",
|
||||
"DialogNcaExtractionMainNcaNotFoundErrorMessage": "Niepowodzenie ekstrakcji. W wybranym pliku nie było głównego NCA.",
|
||||
"DialogNcaExtractionCheckLogErrorMessage": "Niepowodzenie ekstrakcji. Przeczytaj plik dziennika, aby uzyskać więcej informacji.",
|
||||
"DialogNcaExtractionSuccessMessage": "Ekstrakcja zakończona pomyślnie.",
|
||||
"DialogMessageCreateSaveErrorMessage": "Wystąpił błąd podczas tworzenia określonych zapisanych danych: {0}",
|
||||
"DialogMessageFindSaveErrorMessage": "Wystąpił błąd podczas próby znalezienia określonych zapisanych danych: {0}",
|
||||
"FolderDialogExtractTitle": "Wybierz folder, do którego chcesz rozpakować",
|
||||
"DialogNcaExtractionMessage": "Wypakowywanie sekcji {0} z {1}...",
|
||||
"DialogNcaExtractionTitle": "Ryujinx - Asystent wypakowania sekcji NCA",
|
||||
"DialogNcaExtractionMainNcaNotFoundErrorMessage": "Niepowodzenie podczas wypakowywania. W wybranym pliku nie było głównego NCA.",
|
||||
"DialogNcaExtractionCheckLogErrorMessage": "Niepowodzenie podczas wypakowywania. Przeczytaj plik dziennika, aby uzyskać więcej informacji.",
|
||||
"DialogNcaExtractionSuccessMessage": "Wypakowywanie zakończone pomyślnie.",
|
||||
"DialogUpdaterConvertFailedMessage": "Nie udało się przekonwertować obecnej wersji Ryujinx.",
|
||||
"DialogUpdaterCancelUpdateMessage": "Anulowanie Aktualizacji!",
|
||||
"DialogUpdaterCancelUpdateMessage": "Anulowanie aktualizacji!",
|
||||
"DialogUpdaterAlreadyOnLatestVersionMessage": "Używasz już najnowszej wersji Ryujinx!",
|
||||
"DialogUpdaterFailedToGetVersionMessage": "Wystąpił błąd podczas próby uzyskania informacji o wydaniu z GitHub Release. Może to być spowodowane nową wersją kompilowaną przez GitHub Actions. Spróbuj ponownie za kilka minut.",
|
||||
"DialogUpdaterFailedToGetVersionMessage": "Wystąpił błąd podczas próby uzyskania informacji o obecnej wersji z GitHub Release. Może to być spowodowane nową wersją kompilowaną przez GitHub Actions. Spróbuj ponownie za kilka minut.",
|
||||
"DialogUpdaterConvertFailedGithubMessage": "Nie udało się przekonwertować otrzymanej wersji Ryujinx z Github Release.",
|
||||
"DialogUpdaterDownloadingMessage": "Pobieranie Aktualizacji...",
|
||||
"DialogUpdaterDownloadingMessage": "Pobieranie aktualizacji...",
|
||||
"DialogUpdaterExtractionMessage": "Wypakowywanie Aktualizacji...",
|
||||
"DialogUpdaterRenamingMessage": "Zmiana Nazwy Aktualizacji...",
|
||||
"DialogUpdaterAddingFilesMessage": "Dodawanie Nowej Aktualizacji...",
|
||||
"DialogUpdaterCompleteMessage": "Aktualizacja Zakończona!",
|
||||
"DialogUpdaterRestartMessage": "Czy chcesz teraz zrestartować Ryujinx?",
|
||||
"DialogUpdaterArchNotSupportedMessage": "Nie używasz obsługiwanej architektury systemu!",
|
||||
"DialogUpdaterArchNotSupportedSubMessage": "(Obsługiwane są tylko systemy x64!)",
|
||||
"DialogUpdaterNoInternetMessage": "Nie masz połączenia z Internetem!",
|
||||
"DialogUpdaterNoInternetSubMessage": "Sprawdź, czy masz działające połączenie internetowe!",
|
||||
"DialogUpdaterDirtyBuildMessage": "Nie możesz zaktualizować Dirty wersji Ryujinx!",
|
||||
|
@ -342,7 +341,7 @@
|
|||
"DialogThemeRestartMessage": "Motyw został zapisany. Aby zastosować motyw, konieczne jest ponowne uruchomienie.",
|
||||
"DialogThemeRestartSubMessage": "Czy chcesz uruchomić ponownie?",
|
||||
"DialogFirmwareInstallEmbeddedMessage": "Czy chcesz zainstalować firmware wbudowany w tę grę? (Firmware {0})",
|
||||
"DialogFirmwareInstallEmbeddedSuccessMessage": "Nie znaleziono zainstalowanego firmware'u, ale Ryujinx był w stanie zainstalować firmware {0} z dostarczonej gry.\n\nEmulator uruchomi się teraz.",
|
||||
"DialogFirmwareInstallEmbeddedSuccessMessage": "No installed firmware was found but Ryujinx was able to install firmware {0} from the provided game.\nThe emulator will now start.",
|
||||
"DialogFirmwareNoFirmwareInstalledMessage": "Brak Zainstalowanego Firmware'u",
|
||||
"DialogFirmwareInstalledMessage": "Firmware {0} został zainstalowany",
|
||||
"DialogInstallFileTypesSuccessMessage": "Pomyślnie zainstalowano typy plików!",
|
||||
|
@ -385,7 +384,10 @@
|
|||
"DialogUserProfileUnsavedChangesSubMessage": "Czy chcesz odrzucić zmiany?",
|
||||
"DialogControllerSettingsModifiedConfirmMessage": "Aktualne ustawienia kontrolera zostały zaktualizowane.",
|
||||
"DialogControllerSettingsModifiedConfirmSubMessage": "Czy chcesz zapisać?",
|
||||
"DialogLoadNcaErrorMessage": "{0}. Błędny Plik: {1}",
|
||||
"DialogLoadFileErrorMessage": "{0}. Błędny plik: {1}",
|
||||
"DialogModAlreadyExistsMessage": "Modyfikacja już istnieje",
|
||||
"DialogModInvalidMessage": "Podany katalog nie zawiera modyfikacji!",
|
||||
"DialogModDeleteNoParentMessage": "Nie udało się usunąć: Nie można odnaleźć katalogu nadrzędnego dla modyfikacji \"{0}\"!",
|
||||
"DialogDlcNoDlcErrorMessage": "Określony plik nie zawiera DLC dla wybranego tytułu!",
|
||||
"DialogPerformanceCheckLoggingEnabledMessage": "Masz włączone rejestrowanie śledzenia, które jest przeznaczone tylko dla programistów.",
|
||||
"DialogPerformanceCheckLoggingEnabledConfirmMessage": "Aby uzyskać optymalną wydajność, zaleca się wyłączenie rejestrowania śledzenia. Czy chcesz teraz wyłączyć rejestrowanie śledzenia?",
|
||||
|
@ -396,6 +398,8 @@
|
|||
"DialogUpdateAddUpdateErrorMessage": "Określony plik nie zawiera aktualizacji dla wybranego tytułu!",
|
||||
"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ć?",
|
||||
"DialogModManagerDeletionAllWarningMessage": "Zamierzasz usunąć wszystkie modyfikacje dla wybranego tytułu: {0}\n\nCzy na pewno chcesz kontynuować?",
|
||||
"SettingsTabGraphicsFeaturesOptions": "Funkcje",
|
||||
"SettingsTabGraphicsBackendMultithreading": "Wielowątkowość Backendu Graficznego:",
|
||||
"CommonAuto": "Auto",
|
||||
|
@ -430,7 +434,8 @@
|
|||
"DlcManagerRemoveAllButton": "Usuń Wszystkie",
|
||||
"DlcManagerEnableAllButton": "Włącz Wszystkie",
|
||||
"DlcManagerDisableAllButton": "Wyłącz Wszystkie",
|
||||
"MenuBarOptionsChangeLanguage": "Zmień Język",
|
||||
"ModManagerDeleteAllButton": "Usuń wszystko",
|
||||
"MenuBarOptionsChangeLanguage": "Zmień język",
|
||||
"MenuBarShowFileTypes": "Pokaż typy plików",
|
||||
"CommonSort": "Sortuj",
|
||||
"CommonShowNames": "Pokaż Nazwy",
|
||||
|
@ -447,13 +452,13 @@
|
|||
"CustomThemePathTooltip": "Ścieżka do niestandardowego motywu GUI",
|
||||
"CustomThemeBrowseTooltip": "Wyszukaj niestandardowy motyw GUI",
|
||||
"DockModeToggleTooltip": "Tryb Zadokowany sprawia, że emulowany system zachowuje się jak zadokowany Nintendo Switch. Poprawia to jakość grafiki w większości gier. I odwrotnie, wyłączenie tej opcji sprawi, że emulowany system będzie zachowywał się jak przenośny Nintendo Switch, zmniejszając jakość grafiki.\n\nSkonfiguruj sterowanie gracza 1, jeśli planujesz używać trybu Zadokowanego; Skonfiguruj sterowanie przenośne, jeśli planujesz używać trybu przenośnego.\n\nPozostaw WŁĄCZONY, jeśli nie masz pewności.",
|
||||
"DirectKeyboardTooltip": "Obsługa bezpośredniego dostępu klawiatury (HID). Zapewnia dostęp gier do klawiatury jako urządzenia do wprowadzania tekstu.",
|
||||
"DirectMouseTooltip": "Obsługa bezpośredniego dostępu myszy (HID). Zapewnia grom dostęp do myszy jako urządzenia wskazującego.",
|
||||
"DirectKeyboardTooltip": "Obsługa bezpośredniego dostępu do klawiatury (HID). Zapewnia dostęp gier do klawiatury jako urządzenia do wprowadzania tekstu.\n\nDziała tylko z grami, które natywnie wspierają użycie klawiatury w urządzeniu Switch hardware.\n\nPozostaw wyłączone w razie braku pewności.",
|
||||
"DirectMouseTooltip": "Obsługa bezpośredniego dostępu do myszy (HID). Zapewnia dostęp gier do myszy jako urządzenia wskazującego.\n\nDziała tylko z grami, które natywnie obsługują przyciski myszy w urządzeniu Switch, które są nieliczne i daleko między nimi.\n\nPo włączeniu funkcja ekranu dotykowego może nie działać.\n\nPozostaw wyłączone w razie wątpliwości.",
|
||||
"RegionTooltip": "Zmień Region Systemu",
|
||||
"LanguageTooltip": "Zmień Język Systemu",
|
||||
"LanguageTooltip": "Zmień język systemu",
|
||||
"TimezoneTooltip": "Zmień Strefę Czasową Systemu",
|
||||
"TimeTooltip": "Zmień Czas Systemu",
|
||||
"VSyncToggleTooltip": "Pionowa synchronizacja emulowanej konsoli. Zasadniczo ogranicznik klatek dla większości gier; wyłączenie jej może spowodować, że gry będą działać z większą szybkością, ekrany wczytywania wydłużą się lub nawet utkną.\n\nMoże być przełączana w grze za pomocą preferowanego skrótu klawiszowego. Zalecamy to zrobić, jeśli planujesz ją wyłączyć.\n\nW razie wątpliwości pozostaw WŁĄCZONĄ",
|
||||
"TimeTooltip": "Zmień czas systemowy",
|
||||
"VSyncToggleTooltip": "Synchronizacja pionowa emulowanej konsoli. Zasadniczo ogranicznik klatek dla większości gier; wyłączenie jej może spowodować, że gry będą działać z większą szybkością, ekrany wczytywania wydłużą się lub nawet utkną.\n\nMoże być przełączana w grze za pomocą preferowanego skrótu klawiszowego. Zalecamy to zrobić, jeśli planujesz ją wyłączyć.\n\nW razie wątpliwości pozostaw WŁĄCZONĄ.",
|
||||
"PptcToggleTooltip": "Zapisuje przetłumaczone funkcje JIT, dzięki czemu nie muszą być tłumaczone za każdym razem, gdy gra się ładuje.\n\nZmniejsza zacinanie się i znacznie przyspiesza uruchamianie po pierwszym uruchomieniu gry.\n\nJeśli nie masz pewności, pozostaw WŁĄCZONE",
|
||||
"FsIntegrityToggleTooltip": "Sprawdza pliki podczas uruchamiania gry i jeśli zostaną wykryte uszkodzone pliki, wyświetla w dzienniku błąd hash.\n\nNie ma wpływu na wydajność i ma pomóc w rozwiązywaniu problemów.\n\nPozostaw WŁĄCZONE, jeśli nie masz pewności.",
|
||||
"AudioBackendTooltip": "Zmienia backend używany do renderowania dźwięku.\n\nSDL2 jest preferowany, podczas gdy OpenAL i SoundIO są używane jako rezerwy. Dummy nie będzie odtwarzać dźwięku.\n\nW razie wątpliwości ustaw SDL2.",
|
||||
|
@ -467,10 +472,10 @@
|
|||
"GraphicsBackendThreadingTooltip": "Wykonuje polecenia backend'u graficznego w drugim wątku.\n\nPrzyspiesza kompilację shaderów, zmniejsza zacinanie się i poprawia wydajność sterowników GPU bez własnej obsługi wielowątkowości. Nieco lepsza wydajność w sterownikach z wielowątkowością.\n\nUstaw na AUTO, jeśli nie masz pewności.",
|
||||
"GalThreadingTooltip": "Wykonuje polecenia backend'u graficznego w drugim wątku.\n\nPrzyspiesza kompilację shaderów, zmniejsza zacinanie się i poprawia wydajność sterowników GPU bez własnej obsługi wielowątkowości. Nieco lepsza wydajność w sterownikach z wielowątkowością.\n\nUstaw na AUTO, jeśli nie masz pewności.",
|
||||
"ShaderCacheToggleTooltip": "Zapisuje pamięć podręczną shaderów na dysku, co zmniejsza zacinanie się w kolejnych uruchomieniach.\n\nPozostaw WŁĄCZONE, jeśli nie masz pewności.",
|
||||
"ResolutionScaleTooltip": "Skala Rozdzielczości zastosowana do odpowiednich celów renderowania",
|
||||
"ResolutionScaleTooltip": "Multiplies the game's rendering resolution.\n\nA few games may not work with this and look pixelated even when the resolution is increased; for those games, you may need to find mods that remove anti-aliasing or that increase their internal rendering resolution. For using the latter, you'll likely want to select Native.\n\nThis option can be changed while a game is running by clicking \"Apply\" below; you can simply move the settings window aside and experiment until you find your preferred look for a game.\n\nKeep in mind 4x is overkill for virtually any setup.",
|
||||
"ResolutionScaleEntryTooltip": "Skala rozdzielczości zmiennoprzecinkowej, np. 1,5. Skale niecałkowite częściej powodują problemy lub awarie.",
|
||||
"AnisotropyTooltip": "Poziom filtrowania anizotropowego (ustaw na Auto, aby użyć wartości wymaganej przez grę)",
|
||||
"AspectRatioTooltip": "Współczynnik proporcji zastosowany do okna renderowania.",
|
||||
"AnisotropyTooltip": "Level of Anisotropic Filtering. Set to Auto to use the value requested by the game.",
|
||||
"AspectRatioTooltip": "Aspect Ratio applied to the renderer window.\n\nOnly change this if you're using an aspect ratio mod for your game, otherwise the graphics will be stretched.\n\nLeave on 16:9 if unsure.",
|
||||
"ShaderDumpPathTooltip": "Ścieżka Zrzutu Shaderów Grafiki",
|
||||
"FileLogTooltip": "Zapisuje logowanie konsoli w pliku dziennika na dysku. Nie wpływa na wydajność.",
|
||||
"StubLogTooltip": "Wyświetla w konsoli skrótowe komunikaty dziennika. Nie wpływa na wydajność.",
|
||||
|
@ -504,6 +509,8 @@
|
|||
"EnableInternetAccessTooltip": "Pozwala emulowanej aplikacji na łączenie się z Internetem.\n\nGry w trybie LAN mogą łączyć się ze sobą, gdy ta opcja jest włączona, a systemy są połączone z tym samym punktem dostępu. Dotyczy to również prawdziwych konsol.\n\nNie pozwala na łączenie się z serwerami Nintendo. Może powodować awarie niektórych gier, które próbują połączyć się z Internetem.\n\nPozostaw WYŁĄCZONE, jeśli nie masz pewności.",
|
||||
"GameListContextMenuManageCheatToolTip": "Zarządzaj Kodami",
|
||||
"GameListContextMenuManageCheat": "Zarządzaj Kodami",
|
||||
"GameListContextMenuManageModToolTip": "Zarządzaj modyfikacjami",
|
||||
"GameListContextMenuManageMod": "Zarządzaj modyfikacjami",
|
||||
"ControllerSettingsStickRange": "Zasięg:",
|
||||
"DialogStopEmulationTitle": "Ryujinx - Zatrzymaj Emulację",
|
||||
"DialogStopEmulationMessage": "Czy na pewno chcesz zatrzymać emulację?",
|
||||
|
@ -515,10 +522,8 @@
|
|||
"SettingsTabCpuMemory": "Pamięć CPU",
|
||||
"DialogUpdaterFlatpakNotSupportedMessage": "Zaktualizuj Ryujinx przez FlatHub.",
|
||||
"UpdaterDisabledWarningTitle": "Aktualizator Wyłączony!",
|
||||
"GameListContextMenuOpenSdModsDirectory": "Otwórz Katalog Modów Atmosphere",
|
||||
"GameListContextMenuOpenSdModsDirectoryToolTip": "Otwiera alternatywny katalog Atmosphere na karcie SD, który zawiera modyfikacje aplikacji. Przydatne dla modów, które są pakowane dla prawdziwego sprzętu.",
|
||||
"ControllerSettingsRotate90": "Obróć o 90° w Prawo",
|
||||
"IconSize": "Rozmiar Ikon",
|
||||
"IconSize": "Rozmiar ikon",
|
||||
"IconSizeTooltip": "Zmień rozmiar ikon gry",
|
||||
"MenuBarOptionsShowConsole": "Pokaż Konsolę",
|
||||
"ShaderCachePurgeError": "Błąd podczas czyszczenia cache shaderów w {0}: {1}",
|
||||
|
@ -544,12 +549,13 @@
|
|||
"SwkbdMinCharacters": "Musi mieć co najmniej {0} znaków",
|
||||
"SwkbdMinRangeCharacters": "Musi mieć długość od {0}-{1} znaków",
|
||||
"SoftwareKeyboard": "Klawiatura Oprogramowania",
|
||||
"SoftwareKeyboardModeNumbersOnly": "Mogą być tylko liczby ",
|
||||
"SoftwareKeyboardModeNumeric": "Może składać się jedynie z 0-9 lub '.'",
|
||||
"SoftwareKeyboardModeAlphabet": "Nie może zawierać znaków CJK",
|
||||
"SoftwareKeyboardModeASCII": "Musi zawierać tylko tekst ASCII",
|
||||
"DialogControllerAppletMessagePlayerRange": "Aplikacja żąda {0} graczy z:\n\nTYPY: {1}\n\nGRACZE: {2}\n\n{3}Otwórz Ustawienia i ponownie skonfiguruj Sterowanie lub naciśnij Zamknij.",
|
||||
"DialogControllerAppletMessage": "Aplikacja żąda dokładnie {0} graczy z:\n\nTYPY: {1}\n\nGRACZE: {2}\n\n{3}Otwórz teraz Ustawienia i ponownie skonfiguruj Sterowanie lub naciśnij Zamknij.",
|
||||
"DialogControllerAppletDockModeSet": "Ustawiono tryb Zadokowane. Przenośny też jest nieprawidłowy.\n\n",
|
||||
"ControllerAppletControllers": "Obsługiwane Kontrolery:",
|
||||
"ControllerAppletPlayers": "Gracze:",
|
||||
"ControllerAppletDescription": "Twoja aktualna konfiguracja jest nieprawidłowa. Otwórz ustawienia i skonfiguruj swoje wejścia.",
|
||||
"ControllerAppletDocked": "Ustawiony tryb zadokowany. Sterowanie przenośne powinno być wyłączone.",
|
||||
"UpdaterRenaming": "Zmienianie Nazw Starych Plików...",
|
||||
"UpdaterRenameFailed": "Aktualizator nie mógł zmienić nazwy pliku: {0}",
|
||||
"UpdaterAddingFiles": "Dodawanie Nowych Plików...",
|
||||
|
@ -587,6 +593,7 @@
|
|||
"Writable": "Zapisywalne",
|
||||
"SelectDlcDialogTitle": "Wybierz pliki DLC",
|
||||
"SelectUpdateDialogTitle": "Wybierz pliki aktualizacji",
|
||||
"SelectModDialogTitle": "Wybierz katalog modów",
|
||||
"UserProfileWindowTitle": "Menedżer Profili Użytkowników",
|
||||
"CheatWindowTitle": "Menedżer Kodów",
|
||||
"DlcWindowTitle": "Menedżer Zawartości do Pobrania",
|
||||
|
@ -594,10 +601,12 @@
|
|||
"CheatWindowHeading": "Kody Dostępne dla {0} [{1}]",
|
||||
"BuildId": "Identyfikator wersji:",
|
||||
"DlcWindowHeading": "{0} Zawartości do Pobrania dostępna dla {1} ({2})",
|
||||
"ModWindowHeading": "{0} Mod(y/ów)",
|
||||
"UserProfilesEditProfile": "Edytuj Zaznaczone",
|
||||
"Cancel": "Anuluj",
|
||||
"Save": "Zapisz",
|
||||
"Discard": "Odrzuć",
|
||||
"Paused": "Wstrzymano",
|
||||
"UserProfilesSetProfileImage": "Ustaw Obraz Profilu",
|
||||
"UserProfileEmptyNameError": "Nazwa jest wymagana",
|
||||
"UserProfileNoImageError": "Należy ustawić obraz profilowy",
|
||||
|
@ -607,9 +616,9 @@
|
|||
"UserProfilesName": "Nazwa:",
|
||||
"UserProfilesUserId": "ID Użytkownika:",
|
||||
"SettingsTabGraphicsBackend": "Backend Graficzny",
|
||||
"SettingsTabGraphicsBackendTooltip": "Używalne Backendy Graficzne",
|
||||
"SettingsTabGraphicsBackendTooltip": "Select the graphics backend that will be used in the emulator.\n\nVulkan is overall better for all modern graphics cards, as long as their drivers are up to date. Vulkan also features faster shader compilation (less stuttering) on all GPU vendors.\n\nOpenGL may achieve better results on old Nvidia GPUs, on old AMD GPUs on Linux, or on GPUs with lower VRAM, though shader compilation stutters will be greater.\n\nSet to Vulkan if unsure. Set to OpenGL if your GPU does not support Vulkan even with the latest graphics drivers.",
|
||||
"SettingsEnableTextureRecompression": "Włącz Rekompresję Tekstur",
|
||||
"SettingsEnableTextureRecompressionTooltip": "Kompresuje niektóre tekstury w celu zmniejszenia zużycia pamięci VRAM.\n\nZalecane do użytku z GPU, które mają mniej niż 4 GiB pamięci VRAM.\n\nW razie wątpliwości pozostaw WYŁĄCZONE.",
|
||||
"SettingsEnableTextureRecompressionTooltip": "Compresses ASTC textures in order to reduce VRAM usage.\n\nGames using this texture format include Astral Chain, Bayonetta 3, Fire Emblem Engage, Metroid Prime Remastered, Super Mario Bros. Wonder and The Legend of Zelda: Tears of the Kingdom.\n\nGraphics cards with 4GiB VRAM or less will likely crash at some point while running these games.\n\nEnable only if you're running out of VRAM on the aforementioned games. Leave OFF if unsure.",
|
||||
"SettingsTabGraphicsPreferredGpu": "Preferowane GPU",
|
||||
"SettingsTabGraphicsPreferredGpuTooltip": "Wybierz kartę graficzną, która będzie używana z backendem graficznym Vulkan.\n\nNie wpływa na GPU używane przez OpenGL.\n\nW razie wątpliwości ustaw flagę GPU jako \"dGPU\". Jeśli żadnej nie ma, pozostaw nietknięte.",
|
||||
"SettingsAppRequiredRestartMessage": "Wymagane Zrestartowanie Ryujinx",
|
||||
|
@ -620,8 +629,8 @@
|
|||
"SettingsTabHotkeysVolumeDownHotkey": "Zmniejsz Głośność:",
|
||||
"SettingsEnableMacroHLE": "Włącz Macro HLE",
|
||||
"SettingsEnableMacroHLETooltip": "Wysokopoziomowa emulacja kodu GPU Macro.\n\nPoprawia wydajność, ale może powodować błędy graficzne w niektórych grach.\n\nW razie wątpliwości pozostaw WŁĄCZONE.",
|
||||
"SettingsEnableColorSpacePassthrough": "Color Space Passthrough",
|
||||
"SettingsEnableColorSpacePassthroughTooltip": "Directs the Vulkan backend to pass through color information without specifying a color space. For users with wide gamut displays, this may result in more vibrant colors, at the cost of color correctness.",
|
||||
"SettingsEnableColorSpacePassthrough": "Przekazywanie przestrzeni kolorów",
|
||||
"SettingsEnableColorSpacePassthroughTooltip": "Nakazuje API Vulkan przekazywać informacje o kolorze bez określania przestrzeni kolorów. Dla użytkowników z wyświetlaczami o szerokim zakresie kolorów może to skutkować bardziej żywymi kolorami, kosztem ich poprawności.",
|
||||
"VolumeShort": "Głoś",
|
||||
"UserProfilesManageSaves": "Zarządzaj Zapisami",
|
||||
"DeleteUserSave": "Czy chcesz usunąć zapis użytkownika dla tej gry?",
|
||||
|
@ -635,12 +644,15 @@
|
|||
"Recover": "Odzyskaj",
|
||||
"UserProfilesRecoverHeading": "Znaleziono zapisy dla następujących kont",
|
||||
"UserProfilesRecoverEmptyList": "Brak profili do odzyskania",
|
||||
"GraphicsAATooltip": "Stosuje antyaliasing do renderowania gry",
|
||||
"GraphicsAATooltip": "Applies anti-aliasing to the game render.\n\nFXAA will blur most of the image, while SMAA will attempt to find jagged edges and smooth them out.\n\nNot recommended to use in conjunction with the FSR scaling filter.\n\nThis option can be changed while a game is running by clicking \"Apply\" below; you can simply move the settings window aside and experiment until you find your preferred look for a game.\n\nLeave on NONE if unsure.",
|
||||
"GraphicsAALabel": "Antyaliasing:",
|
||||
"GraphicsScalingFilterLabel": "Filtr skalowania:",
|
||||
"GraphicsScalingFilterTooltip": "Włącza skalowanie bufora ramki",
|
||||
"GraphicsScalingFilterTooltip": "Choose the scaling filter that will be applied when using resolution scale.\n\nBilinear works well for 3D games and is a safe default option.\n\nNearest is recommended for pixel art games.\n\nFSR 1.0 is merely a sharpening filter, not recommended for use with FXAA or SMAA.\n\nThis option can be changed while a game is running by clicking \"Apply\" below; you can simply move the settings window aside and experiment until you find your preferred look for a game.\n\nLeave on BILINEAR if unsure.",
|
||||
"GraphicsScalingFilterBilinear": "Bilinear",
|
||||
"GraphicsScalingFilterNearest": "Nearest",
|
||||
"GraphicsScalingFilterFsr": "FSR",
|
||||
"GraphicsScalingFilterLevelLabel": "Poziom",
|
||||
"GraphicsScalingFilterLevelTooltip": "Ustaw poziom filtra skalowania",
|
||||
"GraphicsScalingFilterLevelTooltip": "Set FSR 1.0 sharpening level. Higher is sharper.",
|
||||
"SmaaLow": "SMAA Niskie",
|
||||
"SmaaMedium": "SMAA Średnie",
|
||||
"SmaaHigh": "SMAA Wysokie",
|
||||
|
@ -648,9 +660,14 @@
|
|||
"UserEditorTitle": "Edytuj użytkownika",
|
||||
"UserEditorTitleCreate": "Utwórz użytkownika",
|
||||
"SettingsTabNetworkInterface": "Interfejs sieci:",
|
||||
"NetworkInterfaceTooltip": "Interfejs sieciowy używany do funkcji LAN",
|
||||
"NetworkInterfaceTooltip": "The network interface used for LAN/LDN features.\n\nIn conjunction with a VPN or XLink Kai and a game with LAN support, can be used to spoof a same-network connection over the Internet.\n\nLeave on DEFAULT if unsure.",
|
||||
"NetworkInterfaceDefault": "Domyślny",
|
||||
"PackagingShaders": "Pakuje Shadery ",
|
||||
"AboutChangelogButton": "Zobacz listę zmian na GitHubie",
|
||||
"AboutChangelogButtonTooltipMessage": "Kliknij, aby otworzyć listę zmian dla tej wersji w domyślnej przeglądarce."
|
||||
}
|
||||
"AboutChangelogButtonTooltipMessage": "Kliknij, aby otworzyć listę zmian dla tej wersji w domyślnej przeglądarce.",
|
||||
"SettingsTabNetworkMultiplayer": "Gra Wieloosobowa",
|
||||
"MultiplayerMode": "Tryb:",
|
||||
"MultiplayerModeTooltip": "Change LDN multiplayer mode.\n\nLdnMitm will modify local wireless/local play functionality in games to function as if it were LAN, allowing for local, same-network connections with other Ryujinx instances and hacked Nintendo Switch consoles that have the ldn_mitm module installed.\n\nMultiplayer requires all players to be on the same game version (i.e. Super Smash Bros. Ultimate v13.0.1 can't connect to v13.0.0).\n\nLeave DISABLED if unsure.",
|
||||
"MultiplayerModeDisabled": "Disabled",
|
||||
"MultiplayerModeLdnMitm": "ldn_mitm"
|
||||
}
|
||||
|
|
|
@ -30,7 +30,7 @@
|
|||
"MenuBarToolsManageFileTypes": "Gerenciar tipos de arquivo",
|
||||
"MenuBarToolsInstallFileTypes": "Instalar tipos de arquivo",
|
||||
"MenuBarToolsUninstallFileTypes": "Desinstalar tipos de arquivos",
|
||||
"MenuBarHelp": "A_juda",
|
||||
"MenuBarHelp": "_Ajuda",
|
||||
"MenuBarHelpCheckForUpdates": "_Verificar se há atualizações",
|
||||
"MenuBarHelpAbout": "_Sobre",
|
||||
"MenuSearch": "Buscar...",
|
||||
|
@ -54,8 +54,6 @@
|
|||
"GameListContextMenuManageTitleUpdatesToolTip": "Abre a janela de gerenciamento de atualizações",
|
||||
"GameListContextMenuManageDlc": "Gerenciar DLCs",
|
||||
"GameListContextMenuManageDlcToolTip": "Abre a janela de gerenciamento de DLCs",
|
||||
"GameListContextMenuOpenModsDirectory": "Abrir diretório de mods",
|
||||
"GameListContextMenuOpenModsDirectoryToolTip": "Abre o diretório que contém modificações (mods) do jogo",
|
||||
"GameListContextMenuCacheManagement": "Gerenciamento de cache",
|
||||
"GameListContextMenuCacheManagementPurgePptc": "Limpar cache PPTC",
|
||||
"GameListContextMenuCacheManagementPurgePptcToolTip": "Deleta o cache PPTC armazenado em disco do jogo",
|
||||
|
@ -72,15 +70,22 @@
|
|||
"GameListContextMenuExtractDataRomFSToolTip": "Extrai a seção RomFS do jogo (incluindo atualizações)",
|
||||
"GameListContextMenuExtractDataLogo": "Logo",
|
||||
"GameListContextMenuExtractDataLogoToolTip": "Extrai a seção Logo do jogo (incluindo atualizações)",
|
||||
"GameListContextMenuCreateShortcut": "Criar atalho da aplicação",
|
||||
"GameListContextMenuCreateShortcutToolTip": "Criar um atalho de área de trabalho que inicia o aplicativo selecionado",
|
||||
"GameListContextMenuCreateShortcutToolTipMacOS": "Crie um atalho na pasta Aplicativos do macOS que abre o Aplicativo selecionado",
|
||||
"GameListContextMenuOpenModsDirectory": "Abrir pasta de Mods",
|
||||
"GameListContextMenuOpenModsDirectoryToolTip": "Abre a pasta que contém os mods da aplicação ",
|
||||
"GameListContextMenuOpenSdModsDirectory": "Abrir diretório de mods Atmosphere",
|
||||
"GameListContextMenuOpenSdModsDirectoryToolTip": "Opens the alternative SD card Atmosphere directory which contains Application's Mods. Useful for mods that are packaged for real hardware.",
|
||||
"StatusBarGamesLoaded": "{0}/{1} jogos carregados",
|
||||
"StatusBarSystemVersion": "Versão do firmware: {0}",
|
||||
"LinuxVmMaxMapCountDialogTitle": "Low limit for memory mappings detected",
|
||||
"LinuxVmMaxMapCountDialogTextPrimary": "Would you like to increase the value of vm.max_map_count to {0}",
|
||||
"LinuxVmMaxMapCountDialogTextSecondary": "Some games might try to create more memory mappings than currently allowed. Ryujinx will crash as soon as this limit gets exceeded.",
|
||||
"LinuxVmMaxMapCountDialogButtonUntilRestart": "Yes, until the next restart",
|
||||
"LinuxVmMaxMapCountDialogButtonPersistent": "Yes, permanently",
|
||||
"LinuxVmMaxMapCountWarningTextPrimary": "Max amount of memory mappings is lower than recommended.",
|
||||
"LinuxVmMaxMapCountWarningTextSecondary": "The current value of vm.max_map_count ({0}) is lower than {1}. Some games might try to create more memory mappings than currently allowed. Ryujinx will crash as soon as this limit gets exceeded.\n\nYou might want to either manually increase the limit or install pkexec, which allows Ryujinx to assist with that.",
|
||||
"LinuxVmMaxMapCountDialogTitle": "Limite baixo para mapeamentos de memória detectado",
|
||||
"LinuxVmMaxMapCountDialogTextPrimary": "Você gostaria de aumentar o valor de vm.max_map_count para {0}",
|
||||
"LinuxVmMaxMapCountDialogTextSecondary": "Alguns jogos podem tentar criar mais mapeamentos de memória do que o atualmente permitido. Ryujinx irá falhar assim que este limite for excedido.",
|
||||
"LinuxVmMaxMapCountDialogButtonUntilRestart": "Sim, até a próxima reinicialização",
|
||||
"LinuxVmMaxMapCountDialogButtonPersistent": "Sim, permanentemente",
|
||||
"LinuxVmMaxMapCountWarningTextPrimary": "A quantidade máxima de mapeamentos de memória é menor que a recomendada.",
|
||||
"LinuxVmMaxMapCountWarningTextSecondary": "O valor atual de vm.max_map_count ({0}) é menor que {1}. Alguns jogos podem tentar criar mais mapeamentos de memória do que o permitido no momento. Ryujinx vai falhar assim que este limite for excedido.\n\nTalvez você queira aumentar o limite manualmente ou instalar pkexec, o que permite que Ryujinx ajude com isso.",
|
||||
"Settings": "Configurações",
|
||||
"SettingsTabGeneral": "Geral",
|
||||
"SettingsTabGeneralGeneral": "Geral",
|
||||
|
@ -150,7 +155,7 @@
|
|||
"SettingsTabGraphicsResolutionScaleNative": "Nativa (720p/1080p)",
|
||||
"SettingsTabGraphicsResolutionScale2x": "2x (1440p/2160p)",
|
||||
"SettingsTabGraphicsResolutionScale3x": "3x (2160p/3240p)",
|
||||
"SettingsTabGraphicsResolutionScale4x": "4x (2880p/4320p)",
|
||||
"SettingsTabGraphicsResolutionScale4x": "4x (2880p/4320p) (não recomendado)",
|
||||
"SettingsTabGraphicsAspectRatio": "Proporção:",
|
||||
"SettingsTabGraphicsAspectRatio4x3": "4:3",
|
||||
"SettingsTabGraphicsAspectRatio16x9": "16:9",
|
||||
|
@ -223,15 +228,15 @@
|
|||
"ControllerSettingsDPadDown": "Baixo",
|
||||
"ControllerSettingsDPadLeft": "Esquerda",
|
||||
"ControllerSettingsDPadRight": "Direita",
|
||||
"ControllerSettingsStickButton": "Button",
|
||||
"ControllerSettingsStickUp": "Up",
|
||||
"ControllerSettingsStickDown": "Down",
|
||||
"ControllerSettingsStickLeft": "Left",
|
||||
"ControllerSettingsStickRight": "Right",
|
||||
"ControllerSettingsStickStick": "Stick",
|
||||
"ControllerSettingsStickInvertXAxis": "Invert Stick X",
|
||||
"ControllerSettingsStickInvertYAxis": "Invert Stick Y",
|
||||
"ControllerSettingsStickDeadzone": "Deadzone:",
|
||||
"ControllerSettingsStickButton": "Botão",
|
||||
"ControllerSettingsStickUp": "Cima",
|
||||
"ControllerSettingsStickDown": "Baixo",
|
||||
"ControllerSettingsStickLeft": "Esquerda",
|
||||
"ControllerSettingsStickRight": "Direita",
|
||||
"ControllerSettingsStickStick": "Analógico",
|
||||
"ControllerSettingsStickInvertXAxis": "Inverter eixo X",
|
||||
"ControllerSettingsStickInvertYAxis": "Inverter eixo Y",
|
||||
"ControllerSettingsStickDeadzone": "Zona morta:",
|
||||
"ControllerSettingsLStick": "Analógico esquerdo",
|
||||
"ControllerSettingsRStick": "Analógico direito",
|
||||
"ControllerSettingsTriggersLeft": "Gatilhos esquerda",
|
||||
|
@ -289,16 +294,12 @@
|
|||
"ControllerSettingsSaveProfileToolTip": "Salvar perfil",
|
||||
"MenuBarFileToolsTakeScreenshot": "Salvar captura de tela",
|
||||
"MenuBarFileToolsHideUi": "Esconder Interface",
|
||||
"GameListContextMenuRunApplication": "Run Application",
|
||||
"GameListContextMenuRunApplication": "Executar Aplicativo",
|
||||
"GameListContextMenuToggleFavorite": "Alternar favorito",
|
||||
"GameListContextMenuToggleFavoriteToolTip": "Marca ou desmarca jogo como favorito",
|
||||
"SettingsTabGeneralTheme": "Tema",
|
||||
"SettingsTabGeneralThemeCustomTheme": "Diretório de tema customizado",
|
||||
"SettingsTabGeneralThemeBaseStyle": "Estilo base",
|
||||
"SettingsTabGeneralThemeBaseStyleDark": "Escuro",
|
||||
"SettingsTabGeneralThemeBaseStyleLight": "Claro",
|
||||
"SettingsTabGeneralThemeEnableCustomTheme": "Habilitar tema customizado",
|
||||
"ButtonBrowse": "Procurar",
|
||||
"SettingsTabGeneralTheme": "Tema:",
|
||||
"SettingsTabGeneralThemeDark": "Escuro",
|
||||
"SettingsTabGeneralThemeLight": "Claro",
|
||||
"ControllerSettingsConfigureGeneral": "Configurar",
|
||||
"ControllerSettingsRumble": "Vibração",
|
||||
"ControllerSettingsRumbleStrongMultiplier": "Multiplicador de vibração forte",
|
||||
|
@ -332,8 +333,6 @@
|
|||
"DialogUpdaterAddingFilesMessage": "Adicionando nova atualização...",
|
||||
"DialogUpdaterCompleteMessage": "Atualização concluída!",
|
||||
"DialogUpdaterRestartMessage": "Deseja reiniciar o Ryujinx agora?",
|
||||
"DialogUpdaterArchNotSupportedMessage": "Você não está rodando uma arquitetura de sistema suportada!",
|
||||
"DialogUpdaterArchNotSupportedSubMessage": "(Apenas sistemas x64 são suportados!)",
|
||||
"DialogUpdaterNoInternetMessage": "Você não está conectado à Internet!",
|
||||
"DialogUpdaterNoInternetSubMessage": "Por favor, certifique-se de que você tem uma conexão funcional à Internet!",
|
||||
"DialogUpdaterDirtyBuildMessage": "Você não pode atualizar uma compilação Dirty do Ryujinx!",
|
||||
|
@ -342,7 +341,7 @@
|
|||
"DialogThemeRestartMessage": "O tema foi salvo. Uma reinicialização é necessária para aplicar o tema.",
|
||||
"DialogThemeRestartSubMessage": "Deseja reiniciar?",
|
||||
"DialogFirmwareInstallEmbeddedMessage": "Gostaria de instalar o firmware incluso neste jogo? (Firmware {0})",
|
||||
"DialogFirmwareInstallEmbeddedSuccessMessage": "Nenhum firmware instalado foi encontrado, mas Ryujinx conseguiu instalar o firmware {0} do jogo fornecido.\nO emulador será reiniciado.",
|
||||
"DialogFirmwareInstallEmbeddedSuccessMessage": "No installed firmware was found but Ryujinx was able to install firmware {0} from the provided game.\nThe emulator will now start.",
|
||||
"DialogFirmwareNoFirmwareInstalledMessage": "Firmware não foi instalado",
|
||||
"DialogFirmwareInstalledMessage": "Firmware {0} foi instalado",
|
||||
"DialogInstallFileTypesSuccessMessage": "Tipos de arquivo instalados com sucesso!",
|
||||
|
@ -385,7 +384,10 @@
|
|||
"DialogUserProfileUnsavedChangesSubMessage": "Deseja descartar as alterações?",
|
||||
"DialogControllerSettingsModifiedConfirmMessage": "As configurações de controle atuais foram atualizadas.",
|
||||
"DialogControllerSettingsModifiedConfirmSubMessage": "Deseja salvar?",
|
||||
"DialogLoadNcaErrorMessage": "{0}. Arquivo com erro: {1}",
|
||||
"DialogLoadFileErrorMessage": "{0}. Errored File: {1}",
|
||||
"DialogModAlreadyExistsMessage": "Mod already exists",
|
||||
"DialogModInvalidMessage": "The specified directory does not contain a mod!",
|
||||
"DialogModDeleteNoParentMessage": "Failed to Delete: Could not find the parent directory for mod \"{0}\"!",
|
||||
"DialogDlcNoDlcErrorMessage": "O arquivo especificado não contém DLCs para o título selecionado!",
|
||||
"DialogPerformanceCheckLoggingEnabledMessage": "Os logs de depuração estão ativos, esse recurso é feito para ser usado apenas por desenvolvedores.",
|
||||
"DialogPerformanceCheckLoggingEnabledConfirmMessage": "Para melhor performance, é recomendável desabilitar os logs de depuração. Gostaria de desabilitar os logs de depuração agora?",
|
||||
|
@ -396,6 +398,8 @@
|
|||
"DialogUpdateAddUpdateErrorMessage": "O arquivo especificado não contém atualizações para o título selecionado!",
|
||||
"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?",
|
||||
"DialogModManagerDeletionAllWarningMessage": "You are about to delete all mods for this title.\n\nAre you sure you want to proceed?",
|
||||
"SettingsTabGraphicsFeaturesOptions": "Recursos",
|
||||
"SettingsTabGraphicsBackendMultithreading": "Multithreading da API gráfica:",
|
||||
"CommonAuto": "Automático",
|
||||
|
@ -430,6 +434,7 @@
|
|||
"DlcManagerRemoveAllButton": "Remover todos",
|
||||
"DlcManagerEnableAllButton": "Habilitar todos",
|
||||
"DlcManagerDisableAllButton": "Desabilitar todos",
|
||||
"ModManagerDeleteAllButton": "Delete All",
|
||||
"MenuBarOptionsChangeLanguage": "Mudar idioma",
|
||||
"MenuBarShowFileTypes": "Mostrar tipos de arquivo",
|
||||
"CommonSort": "Ordenar",
|
||||
|
@ -447,13 +452,13 @@
|
|||
"CustomThemePathTooltip": "Diretório do tema customizado",
|
||||
"CustomThemeBrowseTooltip": "Navegar até um tema customizado",
|
||||
"DockModeToggleTooltip": "Habilita ou desabilita modo TV",
|
||||
"DirectKeyboardTooltip": "Habilita ou desabilita \"acesso direto ao teclado (HID)\" (Permite que o jogo acesse o seu teclado como dispositivo de entrada de texto)",
|
||||
"DirectMouseTooltip": "Habilita ou desabilita \"acesso direto ao mouse (HID)\" (Permite que o jogo acesse o seu mouse como dispositivo apontador)",
|
||||
"DirectKeyboardTooltip": "Direct keyboard access (HID) support. Provides games access to your keyboard as a text entry device.\n\nOnly works with games that natively support keyboard usage on Switch hardware.\n\nLeave OFF if unsure.",
|
||||
"DirectMouseTooltip": "Direct mouse access (HID) support. Provides games access to your mouse as a pointing device.\n\nOnly works with games that natively support mouse controls on Switch hardware, which are few and far between.\n\nWhen enabled, touch screen functionality may not work.\n\nLeave OFF if unsure.",
|
||||
"RegionTooltip": "Mudar a região do sistema",
|
||||
"LanguageTooltip": "Mudar o idioma do sistema",
|
||||
"TimezoneTooltip": "Mudar o fuso-horário do sistema",
|
||||
"TimeTooltip": "Mudar a hora do sistema",
|
||||
"VSyncToggleTooltip": "Habilita ou desabilita a sincronia vertical",
|
||||
"VSyncToggleTooltip": "Emulated console's Vertical Sync. Essentially a frame-limiter for the majority of games; disabling it may cause games to run at higher speed or make loading screens take longer or get stuck.\n\nCan be toggled in-game with a hotkey of your preference (F1 by default). We recommend doing this if you plan on disabling it.\n\nLeave ON if unsure.",
|
||||
"PptcToggleTooltip": "Habilita ou desabilita PPTC",
|
||||
"FsIntegrityToggleTooltip": "Habilita ou desabilita verificação de integridade dos arquivos do jogo",
|
||||
"AudioBackendTooltip": "Mudar biblioteca de áudio",
|
||||
|
@ -467,10 +472,10 @@
|
|||
"GraphicsBackendThreadingTooltip": "Habilita multithreading do backend gráfico",
|
||||
"GalThreadingTooltip": "Executa comandos do backend gráfico em uma segunda thread. Permite multithreading em tempo de execução da compilação de shader, diminui os travamentos, e melhora performance em drivers sem suporte embutido a multithreading. Pequena variação na performance máxima em drivers com suporte a multithreading. Ryujinx pode precisar ser reiniciado para desabilitar adequadamente o multithreading embutido do driver, ou você pode precisar fazer isso manualmente para ter a melhor performance.",
|
||||
"ShaderCacheToggleTooltip": "Habilita ou desabilita o cache de shader",
|
||||
"ResolutionScaleTooltip": "Escala de resolução aplicada às texturas de renderização",
|
||||
"ResolutionScaleTooltip": "Multiplies the game's rendering resolution.\n\nA few games may not work with this and look pixelated even when the resolution is increased; for those games, you may need to find mods that remove anti-aliasing or that increase their internal rendering resolution. For using the latter, you'll likely want to select Native.\n\nThis option can be changed while a game is running by clicking \"Apply\" below; you can simply move the settings window aside and experiment until you find your preferred look for a game.\n\nKeep in mind 4x is overkill for virtually any setup.",
|
||||
"ResolutionScaleEntryTooltip": "Escala de resolução de ponto flutuante, como 1.5. Valores não inteiros tem probabilidade maior de causar problemas ou quebras.",
|
||||
"AnisotropyTooltip": "Nível de filtragem anisotrópica (deixe em Auto para usar o valor solicitado pelo jogo)",
|
||||
"AspectRatioTooltip": "Taxa de proporção aplicada à janela do renderizador.",
|
||||
"AnisotropyTooltip": "Level of Anisotropic Filtering. Set to Auto to use the value requested by the game.",
|
||||
"AspectRatioTooltip": "Aspect Ratio applied to the renderer window.\n\nOnly change this if you're using an aspect ratio mod for your game, otherwise the graphics will be stretched.\n\nLeave on 16:9 if unsure.",
|
||||
"ShaderDumpPathTooltip": "Diretòrio de despejo de shaders",
|
||||
"FileLogTooltip": "Habilita ou desabilita log para um arquivo no disco",
|
||||
"StubLogTooltip": "Habilita ou desabilita exibição de mensagens de stub",
|
||||
|
@ -504,6 +509,8 @@
|
|||
"EnableInternetAccessTooltip": "Habilita acesso à internet do programa convidado. Se habilitado, o aplicativo vai se comportar como se o sistema Switch emulado estivesse conectado a Internet. Note que em alguns casos, aplicativos podem acessar a Internet mesmo com essa opção desabilitada",
|
||||
"GameListContextMenuManageCheatToolTip": "Gerenciar Cheats",
|
||||
"GameListContextMenuManageCheat": "Gerenciar Cheats",
|
||||
"GameListContextMenuManageModToolTip": "Manage Mods",
|
||||
"GameListContextMenuManageMod": "Manage Mods",
|
||||
"ControllerSettingsStickRange": "Intervalo:",
|
||||
"DialogStopEmulationTitle": "Ryujinx - Parar emulação",
|
||||
"DialogStopEmulationMessage": "Tem certeza que deseja parar a emulação?",
|
||||
|
@ -515,8 +522,6 @@
|
|||
"SettingsTabCpuMemory": "Memória da CPU",
|
||||
"DialogUpdaterFlatpakNotSupportedMessage": "Por favor, atualize o Ryujinx pelo FlatHub.",
|
||||
"UpdaterDisabledWarningTitle": "Atualizador desabilitado!",
|
||||
"GameListContextMenuOpenSdModsDirectory": "Abrir diretório de mods Atmosphere",
|
||||
"GameListContextMenuOpenSdModsDirectoryToolTip": "Abre o diretório alternativo Atmosphere no cartão SD que contém mods para o aplicativo",
|
||||
"ControllerSettingsRotate90": "Rodar 90° sentido horário",
|
||||
"IconSize": "Tamanho do ícone",
|
||||
"IconSizeTooltip": "Muda o tamanho do ícone do jogo",
|
||||
|
@ -544,12 +549,13 @@
|
|||
"SwkbdMinCharacters": "Deve ter pelo menos {0} caracteres",
|
||||
"SwkbdMinRangeCharacters": "Deve ter entre {0}-{1} caracteres",
|
||||
"SoftwareKeyboard": "Teclado por Software",
|
||||
"SoftwareKeyboardModeNumbersOnly": "Must be numbers only",
|
||||
"SoftwareKeyboardModeAlphabet": "Must be non CJK-characters only",
|
||||
"SoftwareKeyboardModeASCII": "Must be ASCII text only",
|
||||
"DialogControllerAppletMessagePlayerRange": "O aplicativo requer {0} jogador(es) com:\n\nTIPOS: {1}\n\nJOGADORES: {2}\n\n{3}Por favor, abra as configurações e reconfigure os controles agora ou clique em Fechar.",
|
||||
"DialogControllerAppletMessage": "O aplicativo requer exatamente {0} jogador(es) com:\n\nTIPOS: {1}\n\nJOGADORES: {2}\n\n{3}Por favor, abra as configurações e reconfigure os controles agora ou clique em Fechar.",
|
||||
"DialogControllerAppletDockModeSet": "Modo TV ativado. Portátil também não é válido.\n\n",
|
||||
"SoftwareKeyboardModeNumeric": "Deve ser somente 0-9 ou '.'",
|
||||
"SoftwareKeyboardModeAlphabet": "Apenas devem ser caracteres não CJK.",
|
||||
"SoftwareKeyboardModeASCII": "Deve ser apenas texto ASCII",
|
||||
"ControllerAppletControllers": "Supported Controllers:",
|
||||
"ControllerAppletPlayers": "Players:",
|
||||
"ControllerAppletDescription": "Your current configuration is invalid. Open settings and reconfigure your inputs.",
|
||||
"ControllerAppletDocked": "Docked mode set. Handheld control should be disabled.",
|
||||
"UpdaterRenaming": "Renomeando arquivos antigos...",
|
||||
"UpdaterRenameFailed": "O atualizador não conseguiu renomear o arquivo: {0}",
|
||||
"UpdaterAddingFiles": "Adicionando novos arquivos...",
|
||||
|
@ -587,17 +593,20 @@
|
|||
"Writable": "Gravável",
|
||||
"SelectDlcDialogTitle": "Selecionar arquivos de DLC",
|
||||
"SelectUpdateDialogTitle": "Selecionar arquivos de atualização",
|
||||
"SelectModDialogTitle": "Select mod directory",
|
||||
"UserProfileWindowTitle": "Gerenciador de perfis de usuário",
|
||||
"CheatWindowTitle": "Gerenciador de Cheats",
|
||||
"DlcWindowTitle": "Gerenciador de DLC",
|
||||
"UpdateWindowTitle": "Gerenciador de atualizações",
|
||||
"CheatWindowHeading": "Cheats disponíveis para {0} [{1}]",
|
||||
"BuildId": "BuildId:",
|
||||
"BuildId": "ID da Build",
|
||||
"DlcWindowHeading": "{0} DLCs disponíveis para {1} ({2})",
|
||||
"ModWindowHeading": "{0} Mod(s)",
|
||||
"UserProfilesEditProfile": "Editar selecionado",
|
||||
"Cancel": "Cancelar",
|
||||
"Save": "Salvar",
|
||||
"Discard": "Descartar",
|
||||
"Paused": "Paused",
|
||||
"UserProfilesSetProfileImage": "Definir imagem de perfil",
|
||||
"UserProfileEmptyNameError": "É necessário um nome",
|
||||
"UserProfileNoImageError": "A imagem de perfil deve ser definida",
|
||||
|
@ -607,9 +616,9 @@
|
|||
"UserProfilesName": "Nome:",
|
||||
"UserProfilesUserId": "ID de usuário:",
|
||||
"SettingsTabGraphicsBackend": "Backend gráfico",
|
||||
"SettingsTabGraphicsBackendTooltip": "Backend gráfico a ser usado",
|
||||
"SettingsTabGraphicsBackendTooltip": "Select the graphics backend that will be used in the emulator.\n\nVulkan is overall better for all modern graphics cards, as long as their drivers are up to date. Vulkan also features faster shader compilation (less stuttering) on all GPU vendors.\n\nOpenGL may achieve better results on old Nvidia GPUs, on old AMD GPUs on Linux, or on GPUs with lower VRAM, though shader compilation stutters will be greater.\n\nSet to Vulkan if unsure. Set to OpenGL if your GPU does not support Vulkan even with the latest graphics drivers.",
|
||||
"SettingsEnableTextureRecompression": "Habilitar recompressão de texturas",
|
||||
"SettingsEnableTextureRecompressionTooltip": "Comprime certas texturas para reduzir o uso da VRAM.\n\nRecomendado para uso com GPUs com menos de 4GB VRAM.\n\nEm caso de dúvida, deixe DESLIGADO.",
|
||||
"SettingsEnableTextureRecompressionTooltip": "Compresses ASTC textures in order to reduce VRAM usage.\n\nGames using this texture format include Astral Chain, Bayonetta 3, Fire Emblem Engage, Metroid Prime Remastered, Super Mario Bros. Wonder and The Legend of Zelda: Tears of the Kingdom.\n\nGraphics cards with 4GiB VRAM or less will likely crash at some point while running these games.\n\nEnable only if you're running out of VRAM on the aforementioned games. Leave OFF if unsure.",
|
||||
"SettingsTabGraphicsPreferredGpu": "GPU preferencial",
|
||||
"SettingsTabGraphicsPreferredGpuTooltip": "Selecione a placa de vídeo que será usada com o backend gráfico Vulkan.\n\nNão afeta a GPU que OpenGL usará.\n\nSelecione \"dGPU\" em caso de dúvida. Se não houver nenhuma, não mexa.",
|
||||
"SettingsAppRequiredRestartMessage": "Reinicialização do Ryujinx necessária",
|
||||
|
@ -620,8 +629,8 @@
|
|||
"SettingsTabHotkeysVolumeDownHotkey": "Diminuir volume:",
|
||||
"SettingsEnableMacroHLE": "Habilitar emulação de alto nível para Macros",
|
||||
"SettingsEnableMacroHLETooltip": "Habilita emulação de alto nível de códigos Macro da GPU.\n\nMelhora a performance, mas pode causar problemas gráficos em alguns jogos.\n\nEm caso de dúvida, deixe ATIVADO.",
|
||||
"SettingsEnableColorSpacePassthrough": "Color Space Passthrough",
|
||||
"SettingsEnableColorSpacePassthroughTooltip": "Directs the Vulkan backend to pass through color information without specifying a color space. For users with wide gamut displays, this may result in more vibrant colors, at the cost of color correctness.",
|
||||
"SettingsEnableColorSpacePassthrough": "Passagem de Espaço Cor",
|
||||
"SettingsEnableColorSpacePassthroughTooltip": "Direciona o backend Vulkan para passar informações de cores sem especificar um espaço de cores. Para usuários com telas de ampla gama, isso pode resultar em cores mais vibrantes, ao custo da correção de cores.",
|
||||
"VolumeShort": "Vol",
|
||||
"UserProfilesManageSaves": "Gerenciar jogos salvos",
|
||||
"DeleteUserSave": "Deseja apagar o jogo salvo do usuário para este jogo?",
|
||||
|
@ -635,12 +644,15 @@
|
|||
"Recover": "Recuperar",
|
||||
"UserProfilesRecoverHeading": "Jogos salvos foram encontrados para as seguintes contas",
|
||||
"UserProfilesRecoverEmptyList": "Nenhum perfil para recuperar",
|
||||
"GraphicsAATooltip": "Aplica anti-serrilhamento à renderização do jogo",
|
||||
"GraphicsAATooltip": "Applies anti-aliasing to the game render.\n\nFXAA will blur most of the image, while SMAA will attempt to find jagged edges and smooth them out.\n\nNot recommended to use in conjunction with the FSR scaling filter.\n\nThis option can be changed while a game is running by clicking \"Apply\" below; you can simply move the settings window aside and experiment until you find your preferred look for a game.\n\nLeave on NONE if unsure.",
|
||||
"GraphicsAALabel": "Anti-serrilhado:",
|
||||
"GraphicsScalingFilterLabel": "Filtro de escala:",
|
||||
"GraphicsScalingFilterTooltip": "Habilita escala do Framebuffer",
|
||||
"GraphicsScalingFilterTooltip": "Choose the scaling filter that will be applied when using resolution scale.\n\nBilinear works well for 3D games and is a safe default option.\n\nNearest is recommended for pixel art games.\n\nFSR 1.0 is merely a sharpening filter, not recommended for use with FXAA or SMAA.\n\nThis option can be changed while a game is running by clicking \"Apply\" below; you can simply move the settings window aside and experiment until you find your preferred look for a game.\n\nLeave on BILINEAR if unsure.",
|
||||
"GraphicsScalingFilterBilinear": "Bilinear",
|
||||
"GraphicsScalingFilterNearest": "Nearest",
|
||||
"GraphicsScalingFilterFsr": "FSR",
|
||||
"GraphicsScalingFilterLevelLabel": "Nível",
|
||||
"GraphicsScalingFilterLevelTooltip": "Define o nível do filtro de escala",
|
||||
"GraphicsScalingFilterLevelTooltip": "Set FSR 1.0 sharpening level. Higher is sharper.",
|
||||
"SmaaLow": "SMAA Baixo",
|
||||
"SmaaMedium": "SMAA Médio",
|
||||
"SmaaHigh": "SMAA Alto",
|
||||
|
@ -648,9 +660,14 @@
|
|||
"UserEditorTitle": "Editar usuário",
|
||||
"UserEditorTitleCreate": "Criar usuário",
|
||||
"SettingsTabNetworkInterface": "Interface de rede:",
|
||||
"NetworkInterfaceTooltip": "A interface de rede usada para recursos LAN (rede local)",
|
||||
"NetworkInterfaceTooltip": "The network interface used for LAN/LDN features.\n\nIn conjunction with a VPN or XLink Kai and a game with LAN support, can be used to spoof a same-network connection over the Internet.\n\nLeave on DEFAULT if unsure.",
|
||||
"NetworkInterfaceDefault": "Padrão",
|
||||
"PackagingShaders": "Packaging Shaders",
|
||||
"AboutChangelogButton": "View Changelog on GitHub",
|
||||
"AboutChangelogButtonTooltipMessage": "Click to open the changelog for this version in your default browser."
|
||||
}
|
||||
"PackagingShaders": "Empacotamento de Shaders",
|
||||
"AboutChangelogButton": "Ver mudanças no GitHub",
|
||||
"AboutChangelogButtonTooltipMessage": "Clique para abrir o relatório de alterações para esta versão no seu navegador padrão.",
|
||||
"SettingsTabNetworkMultiplayer": "Multiplayer",
|
||||
"MultiplayerMode": "Modo:",
|
||||
"MultiplayerModeTooltip": "Change LDN multiplayer mode.\n\nLdnMitm will modify local wireless/local play functionality in games to function as if it were LAN, allowing for local, same-network connections with other Ryujinx instances and hacked Nintendo Switch consoles that have the ldn_mitm module installed.\n\nMultiplayer requires all players to be on the same game version (i.e. Super Smash Bros. Ultimate v13.0.1 can't connect to v13.0.0).\n\nLeave DISABLED if unsure.",
|
||||
"MultiplayerModeDisabled": "Disabled",
|
||||
"MultiplayerModeLdnMitm": "ldn_mitm"
|
||||
}
|
||||
|
|
|
@ -1,69 +1,67 @@
|
|||
{
|
||||
"Language": "Русский",
|
||||
"Language": "Русский (RU)",
|
||||
"MenuBarFileOpenApplet": "Открыть апплет",
|
||||
"MenuBarFileOpenAppletOpenMiiAppletToolTip": "Открыть апплет Mii Editor в автономном режиме",
|
||||
"SettingsTabInputDirectMouseAccess": "Прямой доступ к мыши",
|
||||
"SettingsTabInputDirectMouseAccess": "Прямой ввод мыши",
|
||||
"SettingsTabSystemMemoryManagerMode": "Режим диспетчера памяти:",
|
||||
"SettingsTabSystemMemoryManagerModeSoftware": "Программное обеспечение",
|
||||
"SettingsTabSystemMemoryManagerModeHost": "Хост (быстро)",
|
||||
"SettingsTabSystemMemoryManagerModeHostUnchecked": "Хост не установлен (самый быстрый, небезопасный)",
|
||||
"SettingsTabSystemUseHypervisor": "Использовать Гипервизор",
|
||||
"SettingsTabSystemUseHypervisor": "Использовать Hypervisor",
|
||||
"MenuBarFile": "_Файл",
|
||||
"MenuBarFileOpenFromFile": "_Загрузить приложение из файла",
|
||||
"MenuBarFileOpenUnpacked": "Загрузить _Распакованную игру",
|
||||
"MenuBarFileOpenFromFile": "_Добавить приложение из файла",
|
||||
"MenuBarFileOpenUnpacked": "Добавить _распакованную игру",
|
||||
"MenuBarFileOpenEmuFolder": "Открыть папку Ryujinx",
|
||||
"MenuBarFileOpenLogsFolder": "Открыть папку журналов",
|
||||
"MenuBarFileOpenLogsFolder": "Открыть папку с логами",
|
||||
"MenuBarFileExit": "_Выход",
|
||||
"MenuBarOptions": "Опции",
|
||||
"MenuBarOptions": "_Настройки",
|
||||
"MenuBarOptionsToggleFullscreen": "Включить полноэкранный режим",
|
||||
"MenuBarOptionsStartGamesInFullscreen": "Запустить игру в полноэкранном режиме",
|
||||
"MenuBarOptionsStartGamesInFullscreen": "Запускать игры в полноэкранном режиме",
|
||||
"MenuBarOptionsStopEmulation": "Остановить эмуляцию",
|
||||
"MenuBarOptionsSettings": "_Параметры",
|
||||
"MenuBarOptionsManageUserProfiles": "_Управление профилями пользователей",
|
||||
"MenuBarOptionsManageUserProfiles": "_Менеджер учетных записей",
|
||||
"MenuBarActions": "_Действия",
|
||||
"MenuBarOptionsSimulateWakeUpMessage": "Имитировать сообщение пробуждения",
|
||||
"MenuBarActionsScanAmiibo": "Сканировать Amiibo",
|
||||
"MenuBarTools": "_Инструменты",
|
||||
"MenuBarToolsInstallFirmware": "Установить прошивку",
|
||||
"MenuBarToolsInstallFirmware": "Установка прошивки",
|
||||
"MenuBarFileToolsInstallFirmwareFromFile": "Установить прошивку из XCI или ZIP",
|
||||
"MenuBarFileToolsInstallFirmwareFromDirectory": "Установить прошивку из папки",
|
||||
"MenuBarToolsManageFileTypes": "Управление типами файлов",
|
||||
"MenuBarToolsInstallFileTypes": "Установить типы файлов",
|
||||
"MenuBarToolsUninstallFileTypes": "Удалить типы файлов",
|
||||
"MenuBarHelp": "Помощь",
|
||||
"MenuBarHelpCheckForUpdates": "Проверка обновления",
|
||||
"MenuBarHelp": "_Помощь",
|
||||
"MenuBarHelpCheckForUpdates": "Проверить наличие обновлений",
|
||||
"MenuBarHelpAbout": "О программе",
|
||||
"MenuSearch": "Поиск...",
|
||||
"GameListHeaderFavorite": "Избранные",
|
||||
"GameListHeaderFavorite": "Избранное",
|
||||
"GameListHeaderIcon": "Значок",
|
||||
"GameListHeaderApplication": "Название",
|
||||
"GameListHeaderDeveloper": "Разработчик",
|
||||
"GameListHeaderVersion": "Версия",
|
||||
"GameListHeaderTimePlayed": "Время воспроизведения",
|
||||
"GameListHeaderTimePlayed": "Время в игре",
|
||||
"GameListHeaderLastPlayed": "Последняя игра",
|
||||
"GameListHeaderFileExtension": "Расширение файла",
|
||||
"GameListHeaderFileSize": "Размер файла",
|
||||
"GameListHeaderPath": "Путь",
|
||||
"GameListContextMenuOpenUserSaveDirectory": "Открыть папку сохранений пользователя",
|
||||
"GameListContextMenuOpenUserSaveDirectoryToolTip": "Открывает папку, содержащую пользовательские сохранения",
|
||||
"GameListContextMenuOpenUserSaveDirectory": "Открыть папку с сохранениями",
|
||||
"GameListContextMenuOpenUserSaveDirectoryToolTip": "Открывает папку с пользовательскими сохранениями",
|
||||
"GameListContextMenuOpenDeviceSaveDirectory": "Открыть папку сохраненных устройств",
|
||||
"GameListContextMenuOpenDeviceSaveDirectoryToolTip": "Открывает папку, содержащую сохраненные устройства",
|
||||
"GameListContextMenuOpenBcatSaveDirectory": "Открыть папку сохраненных BCAT",
|
||||
"GameListContextMenuOpenBcatSaveDirectoryToolTip": "Открывает папку, содержащую сохраненные BCAT.",
|
||||
"GameListContextMenuManageTitleUpdates": "Управление обновлениями названий",
|
||||
"GameListContextMenuManageTitleUpdatesToolTip": "Открывает окно управления обновлением заголовков",
|
||||
"GameListContextMenuOpenBcatSaveDirectoryToolTip": "Открывает папку, содержащую сохраненные BCAT",
|
||||
"GameListContextMenuManageTitleUpdates": "Управление обновлениями",
|
||||
"GameListContextMenuManageTitleUpdatesToolTip": "Открывает окно управления обновлениями приложения",
|
||||
"GameListContextMenuManageDlc": "Управление DLC",
|
||||
"GameListContextMenuManageDlcToolTip": "Открывает окно управления DLC",
|
||||
"GameListContextMenuOpenModsDirectory": "Открыть папку с модами",
|
||||
"GameListContextMenuOpenModsDirectoryToolTip": "Открывает папку, содержащую моды приложений и игр",
|
||||
"GameListContextMenuCacheManagement": "Управление кэшем",
|
||||
"GameListContextMenuCacheManagementPurgePptc": "Перестройка очереди PPTC",
|
||||
"GameListContextMenuCacheManagementPurgePptcToolTip": "Запускает перестройку PPTC во время запуска следующей игры.",
|
||||
"GameListContextMenuCacheManagementPurgePptc": "Перестроить очередь PPTC",
|
||||
"GameListContextMenuCacheManagementPurgePptcToolTip": "Запускает перестройку PPTC во время следующего запуска игры.",
|
||||
"GameListContextMenuCacheManagementPurgeShaderCache": "Очистить кэш шейдеров",
|
||||
"GameListContextMenuCacheManagementPurgeShaderCacheToolTip": "Удаляет кеш шейдеров приложения",
|
||||
"GameListContextMenuCacheManagementOpenPptcDirectory": "Открыть папку PPTC",
|
||||
"GameListContextMenuCacheManagementOpenPptcDirectoryToolTip": "Открывает папку, содержащую PPTC кэш приложений и игр",
|
||||
"GameListContextMenuCacheManagementOpenShaderCacheDirectory": "Открыть папку кэша шейдеров",
|
||||
"GameListContextMenuCacheManagementOpenShaderCacheDirectory": "Открыть папку с кэшем шейдеров",
|
||||
"GameListContextMenuCacheManagementOpenShaderCacheDirectoryToolTip": "Открывает папку, содержащую кэш шейдеров приложений и игр",
|
||||
"GameListContextMenuExtractData": "Извлечь данные",
|
||||
"GameListContextMenuExtractDataExeFS": "ExeFS",
|
||||
|
@ -72,31 +70,38 @@
|
|||
"GameListContextMenuExtractDataRomFSToolTip": "Извлечение раздела RomFS из текущих настроек приложения (включая обновления)",
|
||||
"GameListContextMenuExtractDataLogo": "Логотип",
|
||||
"GameListContextMenuExtractDataLogoToolTip": "Извлечение раздела с логотипом из текущих настроек приложения (включая обновления)",
|
||||
"StatusBarGamesLoaded": "{0}/{1} Игр загружено",
|
||||
"StatusBarSystemVersion": "Версия системы: {0}",
|
||||
"GameListContextMenuCreateShortcut": "Создать ярлык приложения",
|
||||
"GameListContextMenuCreateShortcutToolTip": "Создает ярлык на рабочем столе, с помощью которого можно запустить игру или приложение",
|
||||
"GameListContextMenuCreateShortcutToolTipMacOS": "Создает ярлык игры или приложения в папке Программы macOS",
|
||||
"GameListContextMenuOpenModsDirectory": "Открыть папку с модами",
|
||||
"GameListContextMenuOpenModsDirectoryToolTip": "Открывает папку, содержащую моды для приложений и игр",
|
||||
"GameListContextMenuOpenSdModsDirectory": "Открыть папку с модами Atmosphere",
|
||||
"GameListContextMenuOpenSdModsDirectoryToolTip": "Открывает папку Atmosphere на альтернативной SD-карте, которая содержит моды для приложений и игр. Полезно для модов, сделанных для реальной консоли.",
|
||||
"StatusBarGamesLoaded": "{0}/{1} игр загружено",
|
||||
"StatusBarSystemVersion": "Версия прошивки: {0}",
|
||||
"LinuxVmMaxMapCountDialogTitle": "Обнаружен низкий лимит разметки памяти",
|
||||
"LinuxVmMaxMapCountDialogTextPrimary": "Вы хотите увеличить значение vm.max_map_count до {0}",
|
||||
"LinuxVmMaxMapCountDialogTextSecondary": "Некоторые игры могут создавать большую разметку памяти, чем разрешено на данный момент по умолчанию. Ryujinx вылетит при превышении этого лимита.",
|
||||
"LinuxVmMaxMapCountDialogButtonUntilRestart": "Да, до следующего перезапуска",
|
||||
"LinuxVmMaxMapCountDialogButtonPersistent": "Да, постоянно",
|
||||
"LinuxVmMaxMapCountWarningTextPrimary": "Максимальная разметка памяти меньше, чем рекомендуется.",
|
||||
"LinuxVmMaxMapCountWarningTextSecondary": "Текущее значение vm.max_map_count ({0}) меньше, чем {1}. Некоторые игры могут попытаться создать большую разметку памяти, чем разрешено в данный момент. Ryujinx вылетит как только этот лимит будет превышен.\n\nВозможно, вы захотите вручную увеличить лимит или установить pkexec, что позволит Ryujinx помочь справиться с превышением лимита.",
|
||||
"LinuxVmMaxMapCountWarningTextSecondary": "Текущее значение vm.max_map_count ({0}) меньше, чем {1}. Некоторые игры могут попытаться создать большую разметку памяти, чем разрешено в данный момент. Ryujinx вылетит как только этот лимит будет превышен.\n\nВозможно, вам потребуется вручную увеличить лимит или установить pkexec, что позволит Ryujinx помочь справиться с превышением лимита.",
|
||||
"Settings": "Параметры",
|
||||
"SettingsTabGeneral": "Пользовательский интерфейс",
|
||||
"SettingsTabGeneral": "Интерфейс",
|
||||
"SettingsTabGeneralGeneral": "Общее",
|
||||
"SettingsTabGeneralEnableDiscordRichPresence": "Включить Discord Rich Presence",
|
||||
"SettingsTabGeneralEnableDiscordRichPresence": "Включить статус активности в Discord",
|
||||
"SettingsTabGeneralCheckUpdatesOnLaunch": "Проверять наличие обновлений при запуске",
|
||||
"SettingsTabGeneralShowConfirmExitDialog": "Показать диалоговое окно \"Подтвердить выход\"",
|
||||
"SettingsTabGeneralHideCursor": "Скрыть курсор",
|
||||
"SettingsTabGeneralShowConfirmExitDialog": "Подтверждать выход из приложения",
|
||||
"SettingsTabGeneralHideCursor": "Скрывать курсор",
|
||||
"SettingsTabGeneralHideCursorNever": "Никогда",
|
||||
"SettingsTabGeneralHideCursorOnIdle": "Скрыть курсор в режиме ожидания",
|
||||
"SettingsTabGeneralHideCursorOnIdle": "В режиме ожидания",
|
||||
"SettingsTabGeneralHideCursorAlways": "Всегда",
|
||||
"SettingsTabGeneralGameDirectories": "Папки с играми",
|
||||
"SettingsTabGeneralAdd": "Добавить",
|
||||
"SettingsTabGeneralRemove": "Удалить",
|
||||
"SettingsTabSystem": "Система",
|
||||
"SettingsTabSystemCore": "Основные настройки",
|
||||
"SettingsTabSystemSystemRegion": "Регион Системы:",
|
||||
"SettingsTabSystemSystemRegion": "Регион прошивки:",
|
||||
"SettingsTabSystemSystemRegionJapan": "Япония",
|
||||
"SettingsTabSystemSystemRegionUSA": "США",
|
||||
"SettingsTabSystemSystemRegionEurope": "Европа",
|
||||
|
@ -104,7 +109,7 @@
|
|||
"SettingsTabSystemSystemRegionChina": "Китай",
|
||||
"SettingsTabSystemSystemRegionKorea": "Корея",
|
||||
"SettingsTabSystemSystemRegionTaiwan": "Тайвань",
|
||||
"SettingsTabSystemSystemLanguage": "Язык системы:",
|
||||
"SettingsTabSystemSystemLanguage": "Язык прошивки:",
|
||||
"SettingsTabSystemSystemLanguageJapanese": "Японский",
|
||||
"SettingsTabSystemSystemLanguageAmericanEnglish": "Английский (США)",
|
||||
"SettingsTabSystemSystemLanguageFrench": "Французский",
|
||||
|
@ -119,22 +124,22 @@
|
|||
"SettingsTabSystemSystemLanguageTaiwanese": "Тайванский",
|
||||
"SettingsTabSystemSystemLanguageBritishEnglish": "Английский (Британия)",
|
||||
"SettingsTabSystemSystemLanguageCanadianFrench": "Французский (Канада)",
|
||||
"SettingsTabSystemSystemLanguageLatinAmericanSpanish": "Испанский (Латиноамериканский)",
|
||||
"SettingsTabSystemSystemLanguageLatinAmericanSpanish": "Испанский (Латинская Америка)",
|
||||
"SettingsTabSystemSystemLanguageSimplifiedChinese": "Китайский упрощённый",
|
||||
"SettingsTabSystemSystemLanguageTraditionalChinese": "Китайский традиционный",
|
||||
"SettingsTabSystemSystemTimeZone": "Часовой пояс системы:",
|
||||
"SettingsTabSystemSystemTime": "Время системы:",
|
||||
"SettingsTabSystemSystemTimeZone": "Часовой пояс прошивки:",
|
||||
"SettingsTabSystemSystemTime": "Время в прошивке:",
|
||||
"SettingsTabSystemEnableVsync": "Включить вертикальную синхронизацию",
|
||||
"SettingsTabSystemEnablePptc": "Включить PPTC (Profiled Persistent Translation Cache)",
|
||||
"SettingsTabSystemEnableFsIntegrityChecks": "Включить проверку целостности FS",
|
||||
"SettingsTabSystemAudioBackend": "Аудио бэкэнд:",
|
||||
"SettingsTabSystemAudioBackendDummy": "Муляж",
|
||||
"SettingsTabSystemEnableFsIntegrityChecks": "Включить проверку целостности файловой системы",
|
||||
"SettingsTabSystemAudioBackend": "Аудио бэкенд:",
|
||||
"SettingsTabSystemAudioBackendDummy": "Без звука",
|
||||
"SettingsTabSystemAudioBackendOpenAL": "OpenAL",
|
||||
"SettingsTabSystemAudioBackendSoundIO": "SoundIO",
|
||||
"SettingsTabSystemAudioBackendSDL2": "SDL2",
|
||||
"SettingsTabSystemHacks": "Хаки",
|
||||
"SettingsTabSystemHacksNote": " (Эти многие настройки вызывают нестабильность)",
|
||||
"SettingsTabSystemExpandDramSize": "Увеличение размера DRAM до 6GiB",
|
||||
"SettingsTabSystemHacksNote": "Возможна нестабильная работа",
|
||||
"SettingsTabSystemExpandDramSize": "Использовать альтернативный макет памяти (для разработчиков)",
|
||||
"SettingsTabSystemIgnoreMissingServices": "Игнорировать отсутствующие службы",
|
||||
"SettingsTabGraphics": "Графика",
|
||||
"SettingsTabGraphicsAPI": "Графические API",
|
||||
|
@ -145,12 +150,12 @@
|
|||
"SettingsTabGraphicsAnisotropicFiltering4x": "4x",
|
||||
"SettingsTabGraphicsAnisotropicFiltering8x": "8x",
|
||||
"SettingsTabGraphicsAnisotropicFiltering16x": "16x",
|
||||
"SettingsTabGraphicsResolutionScale": "Масштаб:",
|
||||
"SettingsTabGraphicsResolutionScaleCustom": "Пользовательский (не рекомендуется)",
|
||||
"SettingsTabGraphicsResolutionScaleNative": "Родной (720p/1080p)",
|
||||
"SettingsTabGraphicsResolutionScale": "Масштабирование:",
|
||||
"SettingsTabGraphicsResolutionScaleCustom": "Пользовательское (не рекомендуется)",
|
||||
"SettingsTabGraphicsResolutionScaleNative": "Нативное (720p/1080p)",
|
||||
"SettingsTabGraphicsResolutionScale2x": "2x (1440p/2160p)",
|
||||
"SettingsTabGraphicsResolutionScale3x": "3x (2160p/3240p)",
|
||||
"SettingsTabGraphicsResolutionScale4x": "4x (2880p/4320p)",
|
||||
"SettingsTabGraphicsResolutionScale4x": "4x (2880p/4320p) (не рекомендуется)",
|
||||
"SettingsTabGraphicsAspectRatio": "Соотношение сторон:",
|
||||
"SettingsTabGraphicsAspectRatio4x3": "4:3",
|
||||
"SettingsTabGraphicsAspectRatio16x9": "16:9",
|
||||
|
@ -172,16 +177,16 @@
|
|||
"SettingsTabLoggingEnableFsAccessLogs": "Включить журналы доступа файловой системы",
|
||||
"SettingsTabLoggingFsGlobalAccessLogMode": "Режим журнала глобального доступа файловой системы:",
|
||||
"SettingsTabLoggingDeveloperOptions": "Параметры разработчика",
|
||||
"SettingsTabLoggingDeveloperOptionsNote": "ВНИМАНИЕ: Снижает производительность",
|
||||
"SettingsTabLoggingDeveloperOptionsNote": "ВНИМАНИЕ: эти настройки снижают производительность",
|
||||
"SettingsTabLoggingGraphicsBackendLogLevel": "Уровень журнала бэкенда графики:",
|
||||
"SettingsTabLoggingGraphicsBackendLogLevelNone": "Ничего",
|
||||
"SettingsTabLoggingGraphicsBackendLogLevelNone": "Нет",
|
||||
"SettingsTabLoggingGraphicsBackendLogLevelError": "Ошибка",
|
||||
"SettingsTabLoggingGraphicsBackendLogLevelPerformance": "Замедления",
|
||||
"SettingsTabLoggingGraphicsBackendLogLevelAll": "Всё",
|
||||
"SettingsTabLoggingEnableDebugLogs": "Включить журнал отладки",
|
||||
"SettingsTabInput": "Управление",
|
||||
"SettingsTabInputEnableDockedMode": "Включить режим закрепления",
|
||||
"SettingsTabInputDirectKeyboardAccess": "Прямой доступ с клавиатуры",
|
||||
"SettingsTabInputEnableDockedMode": "Стационарный режим",
|
||||
"SettingsTabInputDirectKeyboardAccess": "Прямой ввод клавиатуры",
|
||||
"SettingsButtonSave": "Сохранить",
|
||||
"SettingsButtonClose": "Закрыть",
|
||||
"SettingsButtonOk": "Ок",
|
||||
|
@ -202,10 +207,10 @@
|
|||
"ControllerSettingsDeviceDisabled": "Отключить",
|
||||
"ControllerSettingsControllerType": "Тип контроллера",
|
||||
"ControllerSettingsControllerTypeHandheld": "Портативный",
|
||||
"ControllerSettingsControllerTypeProController": "Pro Контроллер",
|
||||
"ControllerSettingsControllerTypeJoyConPair": "JoyCon Пара",
|
||||
"ControllerSettingsControllerTypeJoyConLeft": "JoyCon Левый",
|
||||
"ControllerSettingsControllerTypeJoyConRight": "JoyCon Правый",
|
||||
"ControllerSettingsControllerTypeProController": "Pro Controller",
|
||||
"ControllerSettingsControllerTypeJoyConPair": "JoyCon (пара)",
|
||||
"ControllerSettingsControllerTypeJoyConLeft": "JoyCon (левый)",
|
||||
"ControllerSettingsControllerTypeJoyConRight": "JoyCon (правый)",
|
||||
"ControllerSettingsProfile": "Профиль",
|
||||
"ControllerSettingsProfileDefault": "По умолчанию",
|
||||
"ControllerSettingsLoad": "Загрузить",
|
||||
|
@ -218,19 +223,19 @@
|
|||
"ControllerSettingsButtonY": "Y",
|
||||
"ControllerSettingsButtonPlus": "+",
|
||||
"ControllerSettingsButtonMinus": "-",
|
||||
"ControllerSettingsDPad": "Направляющая панель",
|
||||
"ControllerSettingsDPad": "Кнопки направления",
|
||||
"ControllerSettingsDPadUp": "Вверх",
|
||||
"ControllerSettingsDPadDown": "Вниз",
|
||||
"ControllerSettingsDPadLeft": "Влево",
|
||||
"ControllerSettingsDPadRight": "Вправо",
|
||||
"ControllerSettingsStickButton": "Кнопка",
|
||||
"ControllerSettingsStickButton": "Нажатие на стик",
|
||||
"ControllerSettingsStickUp": "Вверх",
|
||||
"ControllerSettingsStickDown": "Вниз",
|
||||
"ControllerSettingsStickLeft": "Влево",
|
||||
"ControllerSettingsStickRight": "Вправо",
|
||||
"ControllerSettingsStickStick": "Стик",
|
||||
"ControllerSettingsStickInvertXAxis": "Инвертировать X ось",
|
||||
"ControllerSettingsStickInvertYAxis": "Инвертировать Y ось",
|
||||
"ControllerSettingsStickInvertXAxis": "Инвертировать ось X",
|
||||
"ControllerSettingsStickInvertYAxis": "Инвертировать ось Y",
|
||||
"ControllerSettingsStickDeadzone": "Мёртвая зона:",
|
||||
"ControllerSettingsLStick": "Левый стик",
|
||||
"ControllerSettingsRStick": "Правый стик",
|
||||
|
@ -252,10 +257,10 @@
|
|||
"ControllerSettingsMisc": "Разное",
|
||||
"ControllerSettingsTriggerThreshold": "Порог срабатывания:",
|
||||
"ControllerSettingsMotion": "Движение",
|
||||
"ControllerSettingsMotionUseCemuhookCompatibleMotion": "Используйте движение, совместимое с CemuHook",
|
||||
"ControllerSettingsMotionUseCemuhookCompatibleMotion": "Включить совместимость с CemuHook",
|
||||
"ControllerSettingsMotionControllerSlot": "Слот контроллера:",
|
||||
"ControllerSettingsMotionMirrorInput": "Зеркальный ввод",
|
||||
"ControllerSettingsMotionRightJoyConSlot": "Правый JoyCon слот:",
|
||||
"ControllerSettingsMotionRightJoyConSlot": "Слот правого JoyCon:",
|
||||
"ControllerSettingsMotionServerHost": "Хост сервера:",
|
||||
"ControllerSettingsMotionGyroSensitivity": "Чувствительность гироскопа:",
|
||||
"ControllerSettingsMotionGyroDeadzone": "Мертвая зона гироскопа:",
|
||||
|
@ -263,47 +268,43 @@
|
|||
"ControllerSettingsClose": "Закрыть",
|
||||
"UserProfilesSelectedUserProfile": "Выбранный пользовательский профиль:",
|
||||
"UserProfilesSaveProfileName": "Сохранить пользовательский профиль",
|
||||
"UserProfilesChangeProfileImage": "Изменить изображение профиля",
|
||||
"UserProfilesChangeProfileImage": "Изменить аватар",
|
||||
"UserProfilesAvailableUserProfiles": "Доступные профили пользователей:",
|
||||
"UserProfilesAddNewProfile": "Добавить новый профиль",
|
||||
"UserProfilesDelete": "Удалить",
|
||||
"UserProfilesClose": "Закрыть",
|
||||
"ProfileNameSelectionWatermark": "Выберите псевдоним",
|
||||
"ProfileNameSelectionWatermark": "Выберите никнейм",
|
||||
"ProfileImageSelectionTitle": "Выбор изображения профиля",
|
||||
"ProfileImageSelectionHeader": "Выберите изображение профиля",
|
||||
"ProfileImageSelectionNote": "Вы можете импортировать собственное изображение профиля или выбрать аватар из системной прошивки.",
|
||||
"ProfileImageSelectionImportImage": "Импорт файла изображения",
|
||||
"ProfileImageSelectionSelectAvatar": "Выберите аватар прошивки",
|
||||
"ProfileImageSelectionHeader": "Выберите аватар",
|
||||
"ProfileImageSelectionNote": "Вы можете импортировать собственное изображение или выбрать аватар из системной прошивки.",
|
||||
"ProfileImageSelectionImportImage": "Импорт изображения",
|
||||
"ProfileImageSelectionSelectAvatar": "Встроенные аватары",
|
||||
"InputDialogTitle": "Диалоговое окно ввода",
|
||||
"InputDialogOk": "ОК",
|
||||
"InputDialogCancel": "Отмена",
|
||||
"InputDialogAddNewProfileTitle": "Выберите имя профиля",
|
||||
"InputDialogAddNewProfileHeader": "Пожалуйста, введите имя профиля",
|
||||
"InputDialogAddNewProfileSubtext": "(Максимальная длина: {0})",
|
||||
"AvatarChoose": "Выбор аватара",
|
||||
"AvatarChoose": "Выбрать аватар",
|
||||
"AvatarSetBackgroundColor": "Установить цвет фона",
|
||||
"AvatarClose": "Закрыть",
|
||||
"ControllerSettingsLoadProfileToolTip": "Загрузить профиль",
|
||||
"ControllerSettingsAddProfileToolTip": "Добавить профил",
|
||||
"ControllerSettingsAddProfileToolTip": "Добавить профиль",
|
||||
"ControllerSettingsRemoveProfileToolTip": "Удалить профиль",
|
||||
"ControllerSettingsSaveProfileToolTip": "Сохранить профиль",
|
||||
"MenuBarFileToolsTakeScreenshot": "Сделать снимок экрана",
|
||||
"MenuBarFileToolsHideUi": "Скрыть UI",
|
||||
"MenuBarFileToolsHideUi": "Скрыть интерфейс",
|
||||
"GameListContextMenuRunApplication": "Запуск приложения",
|
||||
"GameListContextMenuToggleFavorite": "Переключить Избранное",
|
||||
"GameListContextMenuToggleFavoriteToolTip": "Переключить любимый статус игры",
|
||||
"SettingsTabGeneralTheme": "Тема",
|
||||
"SettingsTabGeneralThemeCustomTheme": "Пользовательский путь к теме",
|
||||
"SettingsTabGeneralThemeBaseStyle": "Базовый стиль",
|
||||
"SettingsTabGeneralThemeBaseStyleDark": "Тёмная",
|
||||
"SettingsTabGeneralThemeBaseStyleLight": "Светлая",
|
||||
"SettingsTabGeneralThemeEnableCustomTheme": "Включить пользовательскую тему",
|
||||
"ButtonBrowse": "Обзор",
|
||||
"GameListContextMenuToggleFavorite": "Добавить в избранное",
|
||||
"GameListContextMenuToggleFavoriteToolTip": "Добавляет игру в избранное и помечает звездочкой",
|
||||
"SettingsTabGeneralTheme": "Тема:",
|
||||
"SettingsTabGeneralThemeDark": "Темная",
|
||||
"SettingsTabGeneralThemeLight": "Светлая",
|
||||
"ControllerSettingsConfigureGeneral": "Настройка",
|
||||
"ControllerSettingsRumble": "Вибрация",
|
||||
"ControllerSettingsRumbleStrongMultiplier": "Множитель сильной вибрации",
|
||||
"ControllerSettingsRumbleWeakMultiplier": "Множитель слабой вибрации",
|
||||
"DialogMessageSaveNotAvailableMessage": "Нет сохраненных данных для {0} [{1:x16}]",
|
||||
"DialogMessageSaveNotAvailableMessage": "Нет сохранений для {0} [{1:x16}]",
|
||||
"DialogMessageSaveNotAvailableCreateSaveMessage": "Создать сохранение для этой игры?",
|
||||
"DialogConfirmationTitle": "Ryujinx - Подтверждение",
|
||||
"DialogUpdaterTitle": "Ryujinx - Обновление",
|
||||
|
@ -312,54 +313,52 @@
|
|||
"DialogExitTitle": "Ryujinx - Выход",
|
||||
"DialogErrorMessage": "Ryujinx обнаружил ошибку",
|
||||
"DialogExitMessage": "Вы уверены, что хотите закрыть Ryujinx?",
|
||||
"DialogExitSubMessage": "Все несохраненные данные будут потеряны!",
|
||||
"DialogExitSubMessage": "Все несохраненные данные будут потеряны",
|
||||
"DialogMessageCreateSaveErrorMessage": "Произошла ошибка при создании указанных данных сохранения: {0}",
|
||||
"DialogMessageFindSaveErrorMessage": "Произошла ошибка при поиске указанных данных сохранения: {0}",
|
||||
"FolderDialogExtractTitle": "Выберите папку для извлечения",
|
||||
"DialogNcaExtractionMessage": "Извлечение {0} раздел от {1}...",
|
||||
"DialogNcaExtractionTitle": "Ryujinx - Экстрактор разделов NCA",
|
||||
"DialogNcaExtractionMessage": "Извлечение {0} раздела из {1}...",
|
||||
"DialogNcaExtractionTitle": "Ryujinx - Извлечение разделов NCA",
|
||||
"DialogNcaExtractionMainNcaNotFoundErrorMessage": "Ошибка извлечения. Основной NCA не присутствовал в выбранном файле.",
|
||||
"DialogNcaExtractionCheckLogErrorMessage": "Ошибка извлечения. Прочтите файл журнала для получения дополнительной информации.",
|
||||
"DialogNcaExtractionSuccessMessage": "Извлечение завершено успешно.",
|
||||
"DialogUpdaterConvertFailedMessage": "Не удалось преобразовать текущую версию Ryujinx.",
|
||||
"DialogUpdaterCancelUpdateMessage": "Отмена обновления!",
|
||||
"DialogUpdaterAlreadyOnLatestVersionMessage": "Вы уже используете самую последнюю версию Ryujinx!",
|
||||
"DialogUpdaterCancelUpdateMessage": "Отмена обновления...",
|
||||
"DialogUpdaterAlreadyOnLatestVersionMessage": "Вы уже используете самую последнюю версию Ryujinx",
|
||||
"DialogUpdaterFailedToGetVersionMessage": "Произошла ошибка при попытке получить информацию о выпуске от GitHub Release. Это может быть вызвано тем, что в данный момент в GitHub Actions компилируется новый релиз. Повторите попытку позже.",
|
||||
"DialogUpdaterConvertFailedGithubMessage": "Не удалось преобразовать полученную версию Ryujinx из Github Release.",
|
||||
"DialogUpdaterDownloadingMessage": "Загрузка обновления...",
|
||||
"DialogUpdaterExtractionMessage": "Извлечение обновления...",
|
||||
"DialogUpdaterRenamingMessage": "Переименование обновления...",
|
||||
"DialogUpdaterAddingFilesMessage": "Добавление нового обновления...",
|
||||
"DialogUpdaterCompleteMessage": "Обновление завершено!",
|
||||
"DialogUpdaterCompleteMessage": "Обновление завершено",
|
||||
"DialogUpdaterRestartMessage": "Вы хотите перезапустить Ryujinx сейчас?",
|
||||
"DialogUpdaterArchNotSupportedMessage": "Вы используете не поддерживаемую системную архитектуру!",
|
||||
"DialogUpdaterArchNotSupportedSubMessage": "(Поддерживаются только x64 системы)",
|
||||
"DialogUpdaterNoInternetMessage": "Вы не подключены к интернету!",
|
||||
"DialogUpdaterNoInternetSubMessage": "Убедитесь, что у вас есть работающее подключение к интернету!",
|
||||
"DialogUpdaterDirtyBuildMessage": "Вы не можете обновить Dirty Build!",
|
||||
"DialogUpdaterNoInternetMessage": "Вы не подключены к интернету",
|
||||
"DialogUpdaterNoInternetSubMessage": "Убедитесь, что у вас работает подключение к интернету",
|
||||
"DialogUpdaterDirtyBuildMessage": "Вы не можете обновлять Dirty Build",
|
||||
"DialogUpdaterDirtyBuildSubMessage": "Загрузите Ryujinx по адресу https://ryujinx.org/ если вам нужна поддерживаемая версия.",
|
||||
"DialogRestartRequiredMessage": "Требуется перезагрузка",
|
||||
"DialogThemeRestartMessage": "Тема сохранена. Для применения темы требуется перезапуск.",
|
||||
"DialogThemeRestartSubMessage": "Вы хотите перезапустить?",
|
||||
"DialogFirmwareInstallEmbeddedMessage": "Хотите установить прошивку, встроенную в эту игру? (Прошивка {0})",
|
||||
"DialogFirmwareInstallEmbeddedSuccessMessage": "Установленная прошивка не найдена, но Ryujinx удалось установить прошивку {0} из предоставленной игры.\nТеперь эмулятор запустится.",
|
||||
"DialogFirmwareInstallEmbeddedSuccessMessage": "Установленная прошивка не была найдена, но Ryujinx удалось установить прошивку {0} из предоставленной игры.\nТеперь эмулятор запустится.",
|
||||
"DialogFirmwareNoFirmwareInstalledMessage": "Прошивка не установлена",
|
||||
"DialogFirmwareInstalledMessage": "Прошивка {0} была установлена",
|
||||
"DialogInstallFileTypesSuccessMessage": "Успешно установлены типы файлов!",
|
||||
"DialogInstallFileTypesSuccessMessage": "Типы файлов успешно установлены",
|
||||
"DialogInstallFileTypesErrorMessage": "Не удалось установить типы файлов.",
|
||||
"DialogUninstallFileTypesSuccessMessage": "Успешно удалены типы файлов!",
|
||||
"DialogUninstallFileTypesSuccessMessage": "Типы файлов успешно удалены",
|
||||
"DialogUninstallFileTypesErrorMessage": "Не удалось удалить типы файлов.",
|
||||
"DialogOpenSettingsWindowLabel": "Открыть окно настроек",
|
||||
"DialogOpenSettingsWindowLabel": "Открыть окно параметров",
|
||||
"DialogControllerAppletTitle": "Апплет контроллера",
|
||||
"DialogMessageDialogErrorExceptionMessage": "Ошибка отображения диалогового окна сообщений: {0}",
|
||||
"DialogMessageDialogErrorExceptionMessage": "Ошибка отображения сообщения: {0}",
|
||||
"DialogSoftwareKeyboardErrorExceptionMessage": "Ошибка отображения программной клавиатуры: {0}",
|
||||
"DialogErrorAppletErrorExceptionMessage": "Ошибка отображения диалогового окна ErrorApplet: {0}",
|
||||
"DialogUserErrorDialogMessage": "{0}: {1}",
|
||||
"DialogUserErrorDialogInfoMessage": "\nДля получения дополнительной информации о том, как исправить эту ошибку, следуйте нашему Руководству по установке.",
|
||||
"DialogUserErrorDialogTitle": "Ошибка Ryujinx! ({0})",
|
||||
"DialogUserErrorDialogTitle": "Ошибка Ryujinx ({0})",
|
||||
"DialogAmiiboApiTitle": "Amiibo API",
|
||||
"DialogAmiiboApiFailFetchMessage": "Произошла ошибка при получении информации из API.",
|
||||
"DialogAmiiboApiConnectErrorMessage": "Не удалось подключиться к серверу Amiibo API. Служба может быть недоступна, или вам может потребоваться проверить, подключено ли ваше интернет-соединение к сети.",
|
||||
"DialogAmiiboApiConnectErrorMessage": "Не удалось подключиться к серверу Amiibo API. Служба может быть недоступна или вам может потребоваться проверить ваше интернет-соединение.",
|
||||
"DialogProfileInvalidProfileErrorMessage": "Профиль {0} несовместим с текущей системой конфигурации ввода.",
|
||||
"DialogProfileDefaultProfileOverwriteErrorMessage": "Профиль по умолчанию не может быть перезаписан",
|
||||
"DialogProfileDeleteProfileTitle": "Удаление профиля",
|
||||
|
@ -370,127 +369,133 @@
|
|||
"DialogShaderDeletionMessage": "Вы собираетесь удалить кэш шейдеров для:\n\n{0}\n\nВы уверены, что хотите продолжить?",
|
||||
"DialogShaderDeletionErrorMessage": "Ошибка очистки кэша шейдеров в {0}: {1}",
|
||||
"DialogRyujinxErrorMessage": "Ryujinx обнаружил ошибку",
|
||||
"DialogInvalidTitleIdErrorMessage": "Ошибка пользовательского интерфейса: выбранная игра не имеет действительного идентификатора названия.",
|
||||
"DialogFirmwareInstallerFirmwareNotFoundErrorMessage": "Действительная системная прошивка не найдена в {0}.",
|
||||
"DialogInvalidTitleIdErrorMessage": "Ошибка пользовательского интерфейса: выбранная игра не имеет действительного ID.",
|
||||
"DialogFirmwareInstallerFirmwareNotFoundErrorMessage": "Валидная системная прошивка не найдена в {0}.",
|
||||
"DialogFirmwareInstallerFirmwareInstallTitle": "Установить прошивку {0}",
|
||||
"DialogFirmwareInstallerFirmwareInstallMessage": "Будет установлена версия системы {0}.",
|
||||
"DialogFirmwareInstallerFirmwareInstallSubMessage": "\n\nЭто заменит текущую версию системы {0}.",
|
||||
"DialogFirmwareInstallerFirmwareInstallMessage": "Будет установлена версия прошивки {0}.",
|
||||
"DialogFirmwareInstallerFirmwareInstallSubMessage": "\n\nЭто заменит текущую версию прошивки {0}.",
|
||||
"DialogFirmwareInstallerFirmwareInstallConfirmMessage": "\n\nПродолжить?",
|
||||
"DialogFirmwareInstallerFirmwareInstallWaitMessage": "Установка прошивки...",
|
||||
"DialogFirmwareInstallerFirmwareInstallSuccessMessage": "Версия системы {0} успешно установлена.",
|
||||
"DialogFirmwareInstallerFirmwareInstallSuccessMessage": "Прошивка версии {0} успешно установлена.",
|
||||
"DialogUserProfileDeletionWarningMessage": "Если выбранный профиль будет удален, другие профили не будут открываться.",
|
||||
"DialogUserProfileDeletionConfirmMessage": "Вы хотите удалить выбранный профиль",
|
||||
"DialogUserProfileUnsavedChangesTitle": "Внимание - Несохраненные изменения",
|
||||
"DialogUserProfileUnsavedChangesMessage": "Вы внесли изменения в этот профиль пользователя которые не были сохранены.",
|
||||
"DialogUserProfileUnsavedChangesSubMessage": "Вы хотите отменить изменения?",
|
||||
"DialogControllerSettingsModifiedConfirmMessage": "Текущие настройки контроллера обновлены.",
|
||||
"DialogControllerSettingsModifiedConfirmSubMessage": "Вы хотите сохранить?",
|
||||
"DialogLoadNcaErrorMessage": "{0}. Файл с ошибкой: {1}",
|
||||
"DialogDlcNoDlcErrorMessage": "Указанный файл не содержит DLC для выбранной игры!",
|
||||
"DialogControllerSettingsModifiedConfirmMessage": "Текущие настройки управления обновлены.",
|
||||
"DialogControllerSettingsModifiedConfirmSubMessage": "Сохранить?",
|
||||
"DialogLoadFileErrorMessage": "{0}. Файл с ошибкой: {1}",
|
||||
"DialogModAlreadyExistsMessage": "Мод уже существует",
|
||||
"DialogModInvalidMessage": "Выбранная папка не содержит модов",
|
||||
"DialogModDeleteNoParentMessage": "Невозможно удалить: не удалось найти папку мода \"{0}\"",
|
||||
"DialogDlcNoDlcErrorMessage": "Указанный файл не содержит DLC для выбранной игры",
|
||||
"DialogPerformanceCheckLoggingEnabledMessage": "У вас включено ведение журнала отладки, предназначенное только для разработчиков.",
|
||||
"DialogPerformanceCheckLoggingEnabledConfirmMessage": "Для оптимальной производительности рекомендуется отключить ведение журнала отладки. Вы хотите отключить ведение журнала отладки сейчас?",
|
||||
"DialogPerformanceCheckShaderDumpEnabledMessage": "У вас включен сброс шейдеров, который предназначен только для разработчиков.",
|
||||
"DialogPerformanceCheckShaderDumpEnabledConfirmMessage": "Для оптимальной производительности рекомендуется отключить сброс шейдеров. Вы хотите отключить сброс шейдеров сейчас?",
|
||||
"DialogPerformanceCheckLoggingEnabledConfirmMessage": "Для оптимальной производительности рекомендуется отключить ведение журнала отладки. Хотите отключить ведение журнала отладки?",
|
||||
"DialogPerformanceCheckShaderDumpEnabledMessage": "У вас включен дамп шейдеров, который предназначен только для разработчиков.",
|
||||
"DialogPerformanceCheckShaderDumpEnabledConfirmMessage": "Для оптимальной производительности рекомендуется отключить дамп шейдеров. Хотите отключить дамп шейдеров?",
|
||||
"DialogLoadAppGameAlreadyLoadedMessage": "Игра уже загружена",
|
||||
"DialogLoadAppGameAlreadyLoadedSubMessage": "Пожалуйста, остановите эмуляцию или закройте эмулятор перед запуском другой игры.",
|
||||
"DialogUpdateAddUpdateErrorMessage": "Указанный файл не содержит обновления для выбранного заголовка!",
|
||||
"DialogUpdateAddUpdateErrorMessage": "Указанный файл не содержит обновлений для выбранного приложения",
|
||||
"DialogSettingsBackendThreadingWarningTitle": "Предупреждение: многопоточность в бэкенде",
|
||||
"DialogSettingsBackendThreadingWarningMessage": "Ryujinx необходимо перезапустить после изменения этой опции, чтобы она полностью применилась. В зависимости от вашей платформы вам может потребоваться вручную отключить собственную многопоточность вашего драйвера при использовании Ryujinx.",
|
||||
"DialogSettingsBackendThreadingWarningMessage": "Для применения этой настройки необходимо перезапустить Ryujinx. В зависимости от используемой вами операционной системы вам может потребоваться вручную отключить многопоточность драйвера при использовании Ryujinx.",
|
||||
"DialogModManagerDeletionWarningMessage": "Вы сейчас удалите мод: {0}\n\nВы уверены, что хотите продолжить?",
|
||||
"DialogModManagerDeletionAllWarningMessage": "Вы сейчас удалите все выбранные моды для этой игры.\n\nВы уверены, что хотите продолжить?",
|
||||
"SettingsTabGraphicsFeaturesOptions": "Функции & Улучшения",
|
||||
"SettingsTabGraphicsBackendMultithreading": "Многопоточность графического бэкенда:",
|
||||
"CommonAuto": "Автоматически",
|
||||
"CommonOff": "Выключен",
|
||||
"CommonOn": "Включен",
|
||||
"CommonOff": "Выключено",
|
||||
"CommonOn": "Включено",
|
||||
"InputDialogYes": "Да",
|
||||
"InputDialogNo": "Нет",
|
||||
"DialogProfileInvalidProfileNameErrorMessage": "Имя файла содержит недопустимые символы. Пожалуйста, попробуйте еще раз.",
|
||||
"MenuBarOptionsPauseEmulation": "Пауза",
|
||||
"MenuBarOptionsPauseEmulation": "Пауза эмуляции",
|
||||
"MenuBarOptionsResumeEmulation": "Продолжить",
|
||||
"AboutUrlTooltipMessage": "Нажмите, чтобы открыть веб-сайт Ryujinx в браузере по умолчанию.",
|
||||
"AboutUrlTooltipMessage": "Нажмите, чтобы открыть веб-сайт Ryujinx",
|
||||
"AboutDisclaimerMessage": "Ryujinx никоим образом не связан ни с Nintendo™, ни с кем-либо из ее партнеров.",
|
||||
"AboutAmiiboDisclaimerMessage": "Amiibo API (www.amiibo api.com) используется\n нашей эмуляции Amiibo.",
|
||||
"AboutPatreonUrlTooltipMessage": "Нажмите, чтобы открыть страницу Ryujinx Patreon в браузере по умолчанию.",
|
||||
"AboutGithubUrlTooltipMessage": "Нажмите, чтобы открыть страницу Ryujinx GitHub в браузере по умолчанию.",
|
||||
"AboutDiscordUrlTooltipMessage": "Нажмите, чтобы открыть приглашение на сервер Ryujinx Discord в браузере по умолчанию.",
|
||||
"AboutTwitterUrlTooltipMessage": "Нажмите, чтобы открыть страницу Ryujinx в Twitter в браузере по умолчанию.",
|
||||
"AboutAmiiboDisclaimerMessage": "Amiibo API (www.amiiboapi.com) используется для эмуляции Amiibo.",
|
||||
"AboutPatreonUrlTooltipMessage": "Нажмите, чтобы открыть страницу Ryujinx на Patreon",
|
||||
"AboutGithubUrlTooltipMessage": "Нажмите, чтобы открыть страницу Ryujinx на GitHub",
|
||||
"AboutDiscordUrlTooltipMessage": "Нажмите, чтобы открыть приглашение на сервер Ryujinx в Discord",
|
||||
"AboutTwitterUrlTooltipMessage": "Нажмите, чтобы открыть страницу Ryujinx в X (бывший Twitter)",
|
||||
"AboutRyujinxAboutTitle": "О программе:",
|
||||
"AboutRyujinxAboutContent": "Ryujinx — это эмулятор Nintendo Switch™.\nПожалуйста, поддержите нас на Patreon.\nУзнавайте все последние новости в нашем Twitter или Discord.\nРазработчики, заинтересованные в участии, могут узнать больше на нашем GitHub или в Discord.",
|
||||
"AboutRyujinxMaintainersTitle": "Поддерживается:",
|
||||
"AboutRyujinxMaintainersContentTooltipMessage": "Нажмите, чтобы открыть страницу Contributors в браузере по умолчанию.",
|
||||
"AboutRyujinxSupprtersTitle": "Поддерживается на Patreon:",
|
||||
"AboutRyujinxAboutContent": "Ryujinx — это эмулятор Nintendo Switch™.\nПожалуйста, поддержите нас на Patreon.\nЧитайте последние новости в наших X (Twitter) или Discord.\nРазработчики, заинтересованные в участии, могут ознакомиться с проектом на GitHub или в Discord.",
|
||||
"AboutRyujinxMaintainersTitle": "Разработка:",
|
||||
"AboutRyujinxMaintainersContentTooltipMessage": "Нажмите, чтобы открыть страницу с участниками",
|
||||
"AboutRyujinxSupprtersTitle": "Поддержка на Patreon:",
|
||||
"AmiiboSeriesLabel": "Серия Amiibo",
|
||||
"AmiiboCharacterLabel": "Персонаж",
|
||||
"AmiiboScanButtonLabel": "Сканировать",
|
||||
"AmiiboOptionsShowAllLabel": "Показать все Amiibo",
|
||||
"AmiiboOptionsUsRandomTagLabel": "Хак: Использовать случайный тег Uuid",
|
||||
"DlcManagerTableHeadingEnabledLabel": "Велючено",
|
||||
"DlcManagerTableHeadingTitleIdLabel": "Идентификатор заголовка",
|
||||
"DlcManagerTableHeadingEnabledLabel": "Включено",
|
||||
"DlcManagerTableHeadingTitleIdLabel": "ID приложения",
|
||||
"DlcManagerTableHeadingContainerPathLabel": "Путь к контейнеру",
|
||||
"DlcManagerTableHeadingFullPathLabel": "Полный путь",
|
||||
"DlcManagerRemoveAllButton": "Убрать все",
|
||||
"DlcManagerRemoveAllButton": "Удалить все",
|
||||
"DlcManagerEnableAllButton": "Включить все",
|
||||
"DlcManagerDisableAllButton": "Отключить все",
|
||||
"MenuBarOptionsChangeLanguage": "Изменить язык",
|
||||
"MenuBarShowFileTypes": "Показать типы файлов",
|
||||
"CommonSort": "Сортировать",
|
||||
"CommonShowNames": "Показать названия",
|
||||
"CommonFavorite": "Избранные",
|
||||
"ModManagerDeleteAllButton": "Удалить все",
|
||||
"MenuBarOptionsChangeLanguage": "Сменить язык",
|
||||
"MenuBarShowFileTypes": "Показывать форматы файлов",
|
||||
"CommonSort": "Сортировка",
|
||||
"CommonShowNames": "Показывать названия",
|
||||
"CommonFavorite": "Избранное",
|
||||
"OrderAscending": "По возрастанию",
|
||||
"OrderDescending": "По убыванию",
|
||||
"SettingsTabGraphicsFeatures": "Функции",
|
||||
"ErrorWindowTitle": "Окно ошибки",
|
||||
"ToggleDiscordTooltip": "Включает или отключает отображение в Discord статуса \"Сейчас играет\"",
|
||||
"AddGameDirBoxTooltip": "Введите папку игры для добавления в список",
|
||||
"AddGameDirTooltip": "AДобавить папку с игрой в список",
|
||||
"AddGameDirTooltip": "Добавить папку с играми в список",
|
||||
"RemoveGameDirTooltip": "Удалить выбранную папку игры",
|
||||
"CustomThemeCheckTooltip": "Включить или отключить пользовательские темы в графическом интерфейсе",
|
||||
"CustomThemePathTooltip": "Путь к пользовательской теме интерфейса",
|
||||
"CustomThemeCheckTooltip": "Включить или отключить пользовательские темы",
|
||||
"CustomThemePathTooltip": "Путь к пользовательской теме для интерфейса",
|
||||
"CustomThemeBrowseTooltip": "Просмотр пользовательской темы интерфейса",
|
||||
"DockModeToggleTooltip": "\"Стационарный\" режим запускает эмулятор, как если бы Nintendo Switch находилась в доке, что улучшает графику и разрешение в большинстве игр. И наоборот, при отключении этого режима эмулятор будет запускать игры в \"Портативном\" режиме, снижая качество графики.\n\nНастройте управление для Игрока 1 если планируете использовать в \"Стационарном\" режиме; настройте портативное управление если планируете использовать эмулятор в \"Портативном\" режиме.\n\nОставьте включенным если не уверены.",
|
||||
"DirectKeyboardTooltip": "Включить или отключить «поддержку прямого доступа к клавиатуре (HID)» (предоставляет играм доступ к клавиатуре как к устройству ввода текста)",
|
||||
"DirectMouseTooltip": "Включить или отключить «поддержку прямого доступа к мыши (HID)» (предоставляет играм доступ к вашей мыши как указывающему устройству)",
|
||||
"RegionTooltip": "Изменение региона системы",
|
||||
"LanguageTooltip": "Изменение языка системы",
|
||||
"TimezoneTooltip": "Изменение часового пояса системы",
|
||||
"DirectKeyboardTooltip": "Поддержка прямого ввода с клавиатуры (HID). Предоставляет игре прямой доступ к клавиатуре в качестве устройства ввода текста.\nРаботает только с играми, которые изначально поддерживают использование клавиатуры с Switch.\nРекомендуется оставить выключенным.",
|
||||
"DirectMouseTooltip": "Поддержка прямого ввода мыши (HID). Предоставляет игре прямой доступ к мыши в качестве указывающего устройства.\nРаботает только с играми, которые изначально поддерживают использование мыши совместно с железом Switch.\nРекомендуется оставить выключенным.",
|
||||
"RegionTooltip": "Изменение региона прошивки",
|
||||
"LanguageTooltip": "Изменение языка прошивки",
|
||||
"TimezoneTooltip": "Изменение часового пояса прошивки",
|
||||
"TimeTooltip": "Изменение системного времени",
|
||||
"VSyncToggleTooltip": "Эмуляция вертикальной синхронизации консоли, которая ограничивает количество кадров в секунду в большинстве игр; отключение может привести к тому, что игры будут запущены с более высокой частотой кадров, но загрузка игры может занять больше времени, либо игра не запустится вообще.\n\nМожно включать и выключать эту настройку непосредственно в игре с помощью горячих клавиш. Если планируете отключить вериткальную синхронизацию, мы рекомендуем настроить горячие клавиши.\n\nРекомендуется оставить включенным.",
|
||||
"PptcToggleTooltip": "Сохранение преобразованных JIT-функций таким образом, чтобы их не нужно преобразовывать по новой каждый раз при загрузке игры.\n\nУменьшает статтеры и значительно ускоряет последующую загрузку игр.\n\nРекомендуется оставить включенным.",
|
||||
"FsIntegrityToggleTooltip": "Проверяет поврежденные файлы при загрузке игры и если поврежденные файлы обнаружены, отображает ошибку о поврежденном хэше в журнале.\n\nНе влияет на производительность и необходим для содействия в устранении неполадок.\n\nРекомендуется оставить включенным.",
|
||||
"AudioBackendTooltip": "Изменяет используемый аудио-бэкенд для рендера звука.\n\nSDL2 является предпочтительным, в то время как OpenAL и SoundIO используются в качестве резервных. При выборе \"Заглушки\" звук будет отсутствовать.\n\nРекомендуется использование SDL2.",
|
||||
"VSyncToggleTooltip": "Эмуляция вертикальной синхронизации консоли, которая ограничивает количество кадров в секунду в большинстве игр; отключение может привести к тому, что игры будут запущены с более высокой частотой кадров, но загрузка игры может занять больше времени, либо игра не запустится вообще.\n\nМожно включать и выключать эту настройку непосредственно в игре с помощью горячих клавиш (F1 по умолчанию). Если планируете отключить вертикальную синхронизацию, рекомендуем настроить горячие клавиши.\n\nРекомендуется оставить включенным.",
|
||||
"PptcToggleTooltip": "Сохранение преобразованных JIT-функций для того, чтобы не преобразовывать их по новой каждый раз при запуске игры.\n\nУменьшает статтеры и значительно ускоряет последующую загрузку игр.\n\nРекомендуется оставить включенным.",
|
||||
"FsIntegrityToggleTooltip": "Проверяет поврежденные файлы при загрузке игры и если поврежденные файлы обнаружены, отображает ошибку о поврежденном хэше в журнале.\n\nНе влияет на производительность и необходим для помощи в устранении неполадок.\n\nРекомендуется оставить включенным.",
|
||||
"AudioBackendTooltip": "Изменяет используемый аудио-бэкенд для рендера звука.\n\nSDL2 является предпочтительным, в то время как OpenAL и SoundIO используются в качестве резервных. \n\nРекомендуется использование SDL2.",
|
||||
"MemoryManagerTooltip": "Изменение разметки и доступа к гостевой памяти. Значительно влияет на производительность процессора.\n\nРекомендуется оставить \"Хост не установлен\"",
|
||||
"MemoryManagerSoftwareTooltip": "Использует таблицу страниц для преобразования адресов. Самая высокая точность, но самая низкая производительность.",
|
||||
"MemoryManagerHostTooltip": "Прямая разметка памяти в адресном пространстве хоста. Значительно более быстрая JIT-компиляция и запуск.",
|
||||
"MemoryManagerUnsafeTooltip": "Производит прямую разметку памяти, но не маскирует адрес в гостевом адресном пространстве перед получением доступа. Быстрее, но менее безопасно. Гостевое приложение может получить доступ к памяти из любой точки Ryujinx, поэтому в этом режиме рекомендуется запускать только те программы, которым вы доверяете.",
|
||||
"UseHypervisorTooltip": "Использует Гипервизор вместо JIT. Значительно увеличивает производительность, но может быть работать нестабильно.",
|
||||
"DRamTooltip": "Использует альтернативный макет MemoryMode для имитации использования Nintendo Switch для разработчика.\n\nПолезно только для пакетов текстур с высоким разрешением или модов добавляющих разрешение 4К. Не улучшает производительность.\n\nРекомендуется оставить выключенным.",
|
||||
"IgnoreMissingServicesTooltip": "Игнорирует нереализованные сервисы Horizon OS. Это поможет избежать вылеты при загрузке определенных игр.\n\nРекомендуется оставить выключенным.",
|
||||
"GraphicsBackendThreadingTooltip": "Выполняет команды графического бэкенда на втором потоке.\n\nУскоряет компиляцию шейдеров, уменьшает статтеры и повышает производительность на драйверах GPU без поддержки многопоточности. Производительность на драйверах с многопоточностью немного выше.\n\nРекомендуется оставить в Авто.",
|
||||
"GalThreadingTooltip": "Выполняет команды графического бэкенда на во втором потоке.\n\nУскоряет компиляцию шейдеров, уменьшает статтеры и повышает производительность на драйверах GPU без поддержки многопоточности. Производительность на драйверах с многопоточностью немного выше.\n\nРекомендуется оставить в Авто.",
|
||||
"ShaderCacheToggleTooltip": "Сохраняет кэш шейдеров на диске, который уменьшает статтеры при последующих запусках.\n\nРекомендуется оставить включенным.",
|
||||
"ResolutionScaleTooltip": "Масштабирование разрешения",
|
||||
"MemoryManagerUnsafeTooltip": "Производит прямую разметку памяти, но не маскирует адрес в гостевом адресном пространстве перед получением доступа. Быстро, но небезопасно. Гостевое приложение может получить доступ к памяти из Ryujinx, поэтому в этом режиме рекомендуется запускать только те программы, которым вы доверяете.",
|
||||
"UseHypervisorTooltip": "Использует Hypervisor вместо JIT. Значительно увеличивает производительность, но может работать нестабильно.",
|
||||
"DRamTooltip": "Использует альтернативный макет MemoryMode для имитации использования Nintendo Switch в режиме разработчика.\n\nПолезно только для пакетов текстур с высоким разрешением или модов добавляющих разрешение 4К. Не улучшает производительность.\n\nРекомендуется оставить выключенным.",
|
||||
"IgnoreMissingServicesTooltip": "Игнорирует нереализованные сервисы Horizon в новых прошивках. Эта настройка поможет избежать вылеты при запуске определенных игр.\n\nРекомендуется оставить выключенным.",
|
||||
"GraphicsBackendThreadingTooltip": "Выполняет команды графического бэкенда на втором потоке.\n\nУскоряет компиляцию шейдеров, уменьшает статтеры и повышает производительность на драйверах GPU без поддержки многопоточности. Производительность на драйверах с многопоточностью немного выше.\n\nРекомендуется оставить Автоматически.",
|
||||
"GalThreadingTooltip": "Выполняет команды графического бэкенда на втором потоке.\n\nУскоряет компиляцию шейдеров, уменьшает статтеры и повышает производительность на драйверах GPU без поддержки многопоточности. Производительность на драйверах с многопоточностью немного выше.\n\nРекомендуется оставить в Авто.",
|
||||
"ShaderCacheToggleTooltip": "Сохраняет кэш шейдеров на диске, для уменьшения статтеров при последующих запусках.\n\nРекомендуется оставить включенным.",
|
||||
"ResolutionScaleTooltip": "Увеличивает разрешение рендера игры.\n\nНекоторые игры могут не работать с этой настройкой и выглядеть смазано даже когда разрешение увеличено; Для таких игр вам может потребоваться установить моды, которые убирают сглаживание или увеличивают разрешение рендеринга. Для использования последнего, вам нужно будет выбрать опцию \"Нативное\".\n\nЭта опция может быть изменена во время игры по нажатию кнопки \"Применить\" ниже; Вы можете просто переместить окно настроек в сторону и поэкспериментировать, пока не подберете подходящие настройки для конкретной игры.\n\nИмейте в виду, что \"4x\" является излишеством.",
|
||||
"ResolutionScaleEntryTooltip": "Масштабирование разрешения с плавающей запятой, например 1,5. Неинтегральное масштабирование с большой вероятностью вызовет сбои в работе.",
|
||||
"AnisotropyTooltip": "Уровень анизотропной фильтрации (установите значение «Авто», чтобы использовать значение в игре по умолчанию)",
|
||||
"AspectRatioTooltip": "Соотношение сторон, применяемое к окну.",
|
||||
"ShaderDumpPathTooltip": "Путь дампа графических шейдеров",
|
||||
"AnisotropyTooltip": "Уровень анизотропной фильтрации. Установите значение «Авто», чтобы использовать в игре значение по умолчанию игре.",
|
||||
"AspectRatioTooltip": "Соотношение сторон окна рендерера.\n\nИзмените эту настройку только если вы используете мод для соотношения сторон, иначе изображение будет растянуто.\n\nРекомендуется настройка 16:9.",
|
||||
"ShaderDumpPathTooltip": "Путь с дампами графических шейдеров",
|
||||
"FileLogTooltip": "Включает или отключает ведение журнала в файл на диске. Не влияет на производительность.",
|
||||
"StubLogTooltip": "Включает ведение журнала-заглушки. Не влияет на производительность.",
|
||||
"InfoLogTooltip": "Включает печать сообщений информационного журнала. Не влияет на производительность.",
|
||||
"WarnLogTooltip": "Включает печать сообщений журнала предупреждений. Не влияет на производительность.",
|
||||
"ErrorLogTooltip": "Включает печать сообщений журнала ошибок. Не влияет на производительность.",
|
||||
"InfoLogTooltip": "Включает вывод сообщений информационного журнала в консоль. Не влияет на производительность.",
|
||||
"WarnLogTooltip": "Включает вывод сообщений журнала предупреждений в консоль. Не влияет на производительность.",
|
||||
"ErrorLogTooltip": "Включает вывод сообщений журнала ошибок. Не влияет на производительность.",
|
||||
"TraceLogTooltip": "Выводит сообщения журнала трассировки в консоли. Не влияет на производительность.",
|
||||
"GuestLogTooltip": "Включает печать сообщений гостевого журнала. Не влияет на производительность.",
|
||||
"FileAccessLogTooltip": "Включает печать сообщений журнала доступа к файлам",
|
||||
"GuestLogTooltip": "Включает вывод сообщений гостевого журнала. Не влияет на производительность.",
|
||||
"FileAccessLogTooltip": "Включает вывод сообщений журнала доступа к файлам.",
|
||||
"FSAccessLogModeTooltip": "Включает вывод журнала доступа к файловой системе. Возможные режимы: 0-3",
|
||||
"DeveloperOptionTooltip": "Используйте с осторожностью",
|
||||
"OpenGlLogLevel": "Требует включения соответствующих уровней ведения журнала",
|
||||
"DebugLogTooltip": "Выводит журнал сообщений отладки в консоли.\n\nИспользуйте только в случае просьбы разработчика, так как включение этой функции затруднит чтение журналов и ухудшит работу эмулятора.",
|
||||
"LoadApplicationFileTooltip": "Открыть файловый менеджер для выбора файла, совместимого с Nintendo Switch.",
|
||||
"LoadApplicationFolderTooltip": "Открыть файловый менеджер для выбора распакованного приложения, совместимого с Nintendo Switch.",
|
||||
"OpenRyujinxFolderTooltip": "Открывает папку файловой системы Ryujinx. ",
|
||||
"OpenRyujinxLogsTooltip": "Открывает папку, в которую записываются журналы",
|
||||
"OpenRyujinxFolderTooltip": "Открывает папку с файлами Ryujinx. ",
|
||||
"OpenRyujinxLogsTooltip": "Открывает папку в которую записываются логи",
|
||||
"ExitTooltip": "Выйти из Ryujinx",
|
||||
"OpenSettingsTooltip": "Открыть окно настроек",
|
||||
"OpenProfileManagerTooltip": "Открыть диспетчер профилей",
|
||||
"OpenSettingsTooltip": "Открыть окно параметров",
|
||||
"OpenProfileManagerTooltip": "Открыть менеджер учетных записей",
|
||||
"StopEmulationTooltip": "Остановка эмуляции текущей игры и возврат к списку игр",
|
||||
"CheckUpdatesTooltip": "Проверка наличия обновления Ryujinx",
|
||||
"OpenAboutTooltip": "Открыть окно «О программе»",
|
||||
|
@ -504,6 +509,8 @@
|
|||
"EnableInternetAccessTooltip": "Позволяет эмулированному приложению подключаться к Интернету.\n\nПри включении этой функции игры с возможностью сетевой игры могут подключаться друг к другу, если все эмуляторы (или реальные консоли) подключены к одной и той же точке доступа.\n\nНЕ разрешает подключение к серверам Nintendo. Может вызвать сбой в некоторых играх, которые пытаются подключиться к Интернету.\n\nРекомендутеся оставить выключенным.",
|
||||
"GameListContextMenuManageCheatToolTip": "Управление читами",
|
||||
"GameListContextMenuManageCheat": "Управление читами",
|
||||
"GameListContextMenuManageModToolTip": "Управление модами",
|
||||
"GameListContextMenuManageMod": "Управление модами",
|
||||
"ControllerSettingsStickRange": "Диапазон:",
|
||||
"DialogStopEmulationTitle": "Ryujinx - Остановить эмуляцию",
|
||||
"DialogStopEmulationMessage": "Вы уверены, что хотите остановить эмуляцию?",
|
||||
|
@ -514,12 +521,10 @@
|
|||
"SettingsTabCpuCache": "Кэш ЦП",
|
||||
"SettingsTabCpuMemory": "Память ЦП",
|
||||
"DialogUpdaterFlatpakNotSupportedMessage": "Пожалуйста, обновите Ryujinx через FlatHub.",
|
||||
"UpdaterDisabledWarningTitle": "Обновление выключено!",
|
||||
"GameListContextMenuOpenSdModsDirectory": "Открыть папку с модами Atmosphere",
|
||||
"GameListContextMenuOpenSdModsDirectoryToolTip": "Открывает альтернативную папку SD-карты Atmosphere, которая содержит моды для приложений и игр. Полезно для модов, сделанных для реальной консоли.",
|
||||
"UpdaterDisabledWarningTitle": "Средство обновления отключено",
|
||||
"ControllerSettingsRotate90": "Повернуть на 90° по часовой стрелке",
|
||||
"IconSize": "Размер иконки",
|
||||
"IconSizeTooltip": "Изменить размер игровых иконок",
|
||||
"IconSize": "Размер обложек",
|
||||
"IconSizeTooltip": "Изменить размер обложек",
|
||||
"MenuBarOptionsShowConsole": "Показать консоль",
|
||||
"ShaderCachePurgeError": "Ошибка очистки кэша шейдеров в {0}: {1}",
|
||||
"UserErrorNoKeys": "Ключи не найдены",
|
||||
|
@ -531,11 +536,11 @@
|
|||
"UserErrorNoKeysDescription": "Ryujinx не удалось найти ваш 'prod.keys' файл",
|
||||
"UserErrorNoFirmwareDescription": "Ryujinx не удалось найти ни одной установленной прошивки",
|
||||
"UserErrorFirmwareParsingFailedDescription": "Ryujinx не удалось распаковать выбранную прошивку. Обычно это вызвано устаревшими ключами.",
|
||||
"UserErrorApplicationNotFoundDescription": "Ryujinx не удалось найти действительное приложение по указанному пути.",
|
||||
"UserErrorUnknownDescription": "Произошла неизвестная ошибка!",
|
||||
"UserErrorUndefinedDescription": "Произошла неизвестная ошибка! Такого не должно происходить. Пожалуйста, свяжитесь с разработчиками!",
|
||||
"UserErrorApplicationNotFoundDescription": "Ryujinx не удалось найти валидное приложение по указанному пути.",
|
||||
"UserErrorUnknownDescription": "Произошла неизвестная ошибка",
|
||||
"UserErrorUndefinedDescription": "Произошла неизвестная ошибка. Этого не должно происходить, пожалуйста, свяжитесь с разработчиками.",
|
||||
"OpenSetupGuideMessage": "Открыть руководство по установке",
|
||||
"NoUpdate": "Нет обновлений",
|
||||
"NoUpdate": "Без обновлений",
|
||||
"TitleUpdateVersionLabel": "Version {0} - {1}",
|
||||
"RyujinxInfo": "Ryujinx - Информация",
|
||||
"RyujinxConfirm": "Ryujinx - Подтверждение",
|
||||
|
@ -544,12 +549,13 @@
|
|||
"SwkbdMinCharacters": "Должно быть не менее {0} символов.",
|
||||
"SwkbdMinRangeCharacters": "Должно быть {0}-{1} символов",
|
||||
"SoftwareKeyboard": "Программная клавиатура",
|
||||
"SoftwareKeyboardModeNumbersOnly": "Должны быть только цифры",
|
||||
"SoftwareKeyboardModeNumeric": "Должно быть в диапазоне 0-9 или '.'",
|
||||
"SoftwareKeyboardModeAlphabet": "Не должно быть CJK-символов",
|
||||
"SoftwareKeyboardModeASCII": "Текст должен быть только в ASCII кодировке",
|
||||
"DialogControllerAppletMessagePlayerRange": "Приложение запрашивает {0} игроков с:\n\nТИПЫ: {1}\n\nИГРОКИ: {2}\n\n{3}Пожалуйста, откройте \"Настройки\" и перенастройте сейчас или нажмите \"Закрыть\".",
|
||||
"DialogControllerAppletMessage": "Приложение запрашивает ровно {0} игроков с:\n\nТИПЫ: {1}\n\nИГРОКИ: {2}\n\n{3}Пожалуйста, откройте \"Настройки\" и перенастройте Ввод или нажмите \"Закрыть\".",
|
||||
"DialogControllerAppletDockModeSet": "Установлен стационарный режим. Портативный режим недоступен.",
|
||||
"ControllerAppletControllers": "Поддерживаемые геймпады:",
|
||||
"ControllerAppletPlayers": "Игроки:",
|
||||
"ControllerAppletDescription": "Текущая конфигурация некорректна. Откройте параметры и перенастройте управление.",
|
||||
"ControllerAppletDocked": "Используется стационарный режим. Управление в портативном режиме должно быть отключено.",
|
||||
"UpdaterRenaming": "Переименование старых файлов...",
|
||||
"UpdaterRenameFailed": "Программе обновления не удалось переименовать файл: {0}",
|
||||
"UpdaterAddingFiles": "Добавление новых файлов...",
|
||||
|
@ -558,8 +564,8 @@
|
|||
"Game": "Игра",
|
||||
"Docked": "Стационарный режим",
|
||||
"Handheld": "Портативный режим",
|
||||
"ConnectionError": "Ошибка соединения!",
|
||||
"AboutPageDeveloperListMore": "{0} и больше...",
|
||||
"ConnectionError": "Ошибка соединения",
|
||||
"AboutPageDeveloperListMore": "{0} и другие...",
|
||||
"ApiError": "Ошибка API.",
|
||||
"LoadingHeading": "Загрузка {0}",
|
||||
"CompilingPPTC": "Компиляция PTC",
|
||||
|
@ -571,11 +577,11 @@
|
|||
"RyujinxUpdater": "Ryujinx - Обновление",
|
||||
"SettingsTabHotkeys": "Горячие клавиши",
|
||||
"SettingsTabHotkeysHotkeys": "Горячие клавиши",
|
||||
"SettingsTabHotkeysToggleVsyncHotkey": "Переключить VSync:",
|
||||
"SettingsTabHotkeysToggleVsyncHotkey": "Вертикальная синхронизация:",
|
||||
"SettingsTabHotkeysScreenshotHotkey": "Скриншот:",
|
||||
"SettingsTabHotkeysShowUiHotkey": "Показать UI:",
|
||||
"SettingsTabHotkeysPauseHotkey": "Пауза:",
|
||||
"SettingsTabHotkeysToggleMuteHotkey": "Приглушить:",
|
||||
"SettingsTabHotkeysShowUiHotkey": "Показать интерфейс:",
|
||||
"SettingsTabHotkeysPauseHotkey": "Пауза эмуляции:",
|
||||
"SettingsTabHotkeysToggleMuteHotkey": "Выключить звук:",
|
||||
"ControllerMotionTitle": "Настройки управления движением",
|
||||
"ControllerRumbleTitle": "Настройки вибрации",
|
||||
"SettingsSelectThemeFileDialogTitle": "Выбрать файл темы",
|
||||
|
@ -586,32 +592,35 @@
|
|||
"Usage": "Применение",
|
||||
"Writable": "Доступно для записи",
|
||||
"SelectDlcDialogTitle": "Выберите файлы DLC",
|
||||
"SelectUpdateDialogTitle": "Выберите файлы обновления",
|
||||
"UserProfileWindowTitle": "Менеджер профилей пользователей",
|
||||
"SelectUpdateDialogTitle": "Выберите файлы обновлений",
|
||||
"SelectModDialogTitle": "Выбрать папку с модами",
|
||||
"UserProfileWindowTitle": "Менеджер учетных записей",
|
||||
"CheatWindowTitle": "Менеджер читов",
|
||||
"DlcWindowTitle": "Управление загружаемым контентом для {0} ({1})",
|
||||
"UpdateWindowTitle": "Менеджер обновления названий",
|
||||
"CheatWindowHeading": "Читы доступны для {0} [{1}]",
|
||||
"DlcWindowTitle": "Управление DLC для {0} ({1})",
|
||||
"UpdateWindowTitle": "Менеджер обновлений игр",
|
||||
"CheatWindowHeading": "Доступные читы для {0} [{1}]",
|
||||
"BuildId": "ID версии:",
|
||||
"DlcWindowHeading": "{0} Загружаемый контент",
|
||||
"DlcWindowHeading": "{0} DLC",
|
||||
"ModWindowHeading": "Моды для {0} ",
|
||||
"UserProfilesEditProfile": "Изменить выбранные",
|
||||
"Cancel": "Отмена",
|
||||
"Save": "Сохранить",
|
||||
"Discard": "Отменить",
|
||||
"UserProfilesSetProfileImage": "Установить изображение профиля",
|
||||
"Paused": "Приостановлено",
|
||||
"UserProfilesSetProfileImage": "Установить аватар профиля",
|
||||
"UserProfileEmptyNameError": "Имя обязательно",
|
||||
"UserProfileNoImageError": "Изображение профиля должно быть установлено",
|
||||
"GameUpdateWindowHeading": "Обновление доступно для {0} ({1})",
|
||||
"UserProfileNoImageError": "Необходимо установить аватар",
|
||||
"GameUpdateWindowHeading": "Доступные обновления для {0} ({1})",
|
||||
"SettingsTabHotkeysResScaleUpHotkey": "Увеличить разрешение:",
|
||||
"SettingsTabHotkeysResScaleDownHotkey": "Уменьшить разрешение:",
|
||||
"UserProfilesName": "Имя:",
|
||||
"UserProfilesUserId": "ID пользователя:",
|
||||
"SettingsTabGraphicsBackend": "Бэкенд графики",
|
||||
"SettingsTabGraphicsBackendTooltip": "Использовать графический бэкенд",
|
||||
"SettingsTabGraphicsBackend": "Графический бэкенд",
|
||||
"SettingsTabGraphicsBackendTooltip": "Выберите бэкенд, который будет использован в эмуляторе.\n\nVulkan является лучшим выбором для всех современных графических карт с актуальными драйверами. В Vulkan также включена более быстрая компиляция шейдеров (меньше статтеров) для всех GPU.\n\nOpenGL может достичь лучших результатов на старых GPU Nvidia, на старых GPU AMD на Linux или на GPU с небольшим количеством VRAM, хотя статтеров при компиляции шейдеров будет больше.\n\nРекомендуется использовать Vulkan. Используйте OpenGL, если ваш GPU не поддерживает Vulkan даже с актуальными драйверами.",
|
||||
"SettingsEnableTextureRecompression": "Включить пережатие текстур",
|
||||
"SettingsEnableTextureRecompressionTooltip": "Сжимает некоторые текстуры для уменьшения использования видеопамяти.\n\nРекомендуется для GPU с 4 гб видеопамяти и менее.\n\nРекомендуется оставить выключенным.",
|
||||
"SettingsEnableTextureRecompressionTooltip": "Сжатие ASTC текстур для уменьшения использования VRAM. \n\nИгры, использующие этот формат текстур: Astral Chain, Bayonetta 3, Fire Emblem Engage, Metroid Prime Remastered, Super Mario Bros. Wonder и The Legend of Zelda: Tears of the Kingdom. \n\nНа GPU с 4GiB VRAM или менее возможны вылеты при запуске этих игр. \n\nВключите, только если у вас заканчивается VRAM в вышеупомянутых играх. Рекомендуется оставить выключенным.",
|
||||
"SettingsTabGraphicsPreferredGpu": "Предпочтительный GPU",
|
||||
"SettingsTabGraphicsPreferredGpuTooltip": "Выберите видеокарту, которая будет использоваться с графическим бэкендом Vulkan.\n\nНе влияет на GPU, который будет использовать OpenGL.\n\nУстановите графический процессор, помеченный как \"dGPU\", если вы не уверены. Если его нет, оставьте нетронутым.",
|
||||
"SettingsTabGraphicsPreferredGpuTooltip": "Выберите GPU, который будет использоваться с графическим бэкендом Vulkan.\n\nЭта настройка не влияет на GPU, который будет использовать OpenGL.\n\nЕсли вы не уверены что нужно выбрать, используйте графический процессор, помеченный как \"dGPU\". Если его нет, оставьте выбор по умолчанию.",
|
||||
"SettingsAppRequiredRestartMessage": "Требуется перезапуск Ryujinx",
|
||||
"SettingsGpuBackendRestartMessage": "Графический бэкенд или настройки графического процессора были изменены. Требуется перезапуск для вступления в силу изменений.",
|
||||
"SettingsGpuBackendRestartSubMessage": "Перезапустить сейчас?",
|
||||
|
@ -621,36 +630,44 @@
|
|||
"SettingsEnableMacroHLE": "Включить Macro HLE",
|
||||
"SettingsEnableMacroHLETooltip": "Высокоуровневая эмуляции макроса GPU.\n\nПовышает производительность, но может вызывать графические сбои в некоторых играх.\n\nРекомендуется оставить включенным.",
|
||||
"SettingsEnableColorSpacePassthrough": "Пропуск цветового пространства",
|
||||
"SettingsEnableColorSpacePassthroughTooltip": "Направляет бэкэнд Vulkan на передачу информации о цвете без указания цветового пространства. Для пользователей с экранами с расширенной гаммой данная настройка приводит к получению более ярких цветов за счет снижения корректности цветопередачи.",
|
||||
"SettingsEnableColorSpacePassthroughTooltip": "Направляет бэкенд Vulkan на передачу информации о цвете без указания цветового пространства. Для пользователей с экранами с расширенной гаммой данная настройка приводит к получению более ярких цветов за счет снижения корректности цветопередачи.",
|
||||
"VolumeShort": "Громкость",
|
||||
"UserProfilesManageSaves": "Управление сохранениями",
|
||||
"DeleteUserSave": "Вы хотите удалить сохранение пользователя для этой игры?",
|
||||
"DeleteUserSave": "Вы хотите удалить сохранения для этой игры?",
|
||||
"IrreversibleActionNote": "Данное действие является необратимым.",
|
||||
"SaveManagerHeading": "Редактирование сохранений для {0} ({1})",
|
||||
"SaveManagerTitle": "Менеджер сохранений",
|
||||
"Name": "Название",
|
||||
"Size": "Размер",
|
||||
"Search": "Поиск",
|
||||
"UserProfilesRecoverLostAccounts": "Восстановить утерянные аккаунты",
|
||||
"UserProfilesRecoverLostAccounts": "Восстановить учетные записи",
|
||||
"Recover": "Восстановление",
|
||||
"UserProfilesRecoverHeading": "Были найдены сохранения для следующих аккаунтов",
|
||||
"UserProfilesRecoverEmptyList": "Нет профилей для восстановления",
|
||||
"GraphicsAATooltip": "Применяет сглаживание к рейдеру игры.",
|
||||
"UserProfilesRecoverEmptyList": "Нет учетных записей для восстановления",
|
||||
"GraphicsAATooltip": "Применимое сглаживание для рендера.\n\nFXAA размывает большую часть изображения, SMAA попытается найти \"зазубренные\" края и сгладить их.\n\nНе рекомендуется использовать вместе с масштабирующим фильтром FSR.\n\nЭта опция может быть изменена во время игры по нажатию \"Применить\" ниже; Вы можете просто переместить окно настроек в сторону и поэкспериментировать, пока не найдёте подходящую настройку игры.\n\nРекомендуется использовать \"Нет\".",
|
||||
"GraphicsAALabel": "Сглаживание:",
|
||||
"GraphicsScalingFilterLabel": "Масштабирующий фильтр:",
|
||||
"GraphicsScalingFilterTooltip": "Включает масштабирование кадрового буфера",
|
||||
"GraphicsScalingFilterLabel": "Интерполяция:",
|
||||
"GraphicsScalingFilterTooltip": "Выберите фильтрацию, которая будет применяться при масштабировании.\n\n\"Билинейная\" хорошо работает для 3D-игр и является настройкой по умолчанию.\n\n\"Ступенчатая\" рекомендуется для пиксельных игр.\n\n\"FSR\" это фильтр резкости, который не рекомендуется использовать с FXAA или SMAA.\n\nЭта опция может быть изменена во время игры по нажатию кнопки \"Применить\" ниже; Вы можете просто переместить окно настроек в сторону и поэкспериментировать, пока не подберете подходящие настройки для конкретной игры.\n\nРекомендуется использовать \"Билинейная\".",
|
||||
"GraphicsScalingFilterBilinear": "Билинейная",
|
||||
"GraphicsScalingFilterNearest": "Ступенчатая",
|
||||
"GraphicsScalingFilterFsr": "FSR",
|
||||
"GraphicsScalingFilterLevelLabel": "Уровень",
|
||||
"GraphicsScalingFilterLevelTooltip": "Установить уровень фильтра масштабирования",
|
||||
"GraphicsScalingFilterLevelTooltip": "Выбор режима работы FSR 1.0. Выше - четче.",
|
||||
"SmaaLow": "SMAA Низкое",
|
||||
"SmaaMedium": "SMAA Среднее",
|
||||
"SmaaHigh": "SMAA Высокое",
|
||||
"SmaaUltra": "SMAA Ультра",
|
||||
"UserEditorTitle": "Редактирование пользователя",
|
||||
"UserEditorTitleCreate": "Создание пользователя",
|
||||
"SettingsTabNetworkInterface": "Сетевой Интерфейс",
|
||||
"NetworkInterfaceTooltip": "Сетевой интерфейс, используемый для функций LAN",
|
||||
"SettingsTabNetworkInterface": "Сетевой интерфейс:",
|
||||
"NetworkInterfaceTooltip": "Сетевой интерфейс, используемый для функций LAN/LDN.\n\nМожет использоваться для игры через интернет в сочетании с VPN или XLink Kai и игрой с поддержкой LAN.\n\nРекомендуется использовать \"По умолчанию\".",
|
||||
"NetworkInterfaceDefault": "По умолчанию",
|
||||
"PackagingShaders": "Упаковка шейдеров",
|
||||
"AboutChangelogButton": "Список изменений на GitHub",
|
||||
"AboutChangelogButtonTooltipMessage": "Нажмите, чтобы открыть список изменений для этой версии в браузере."
|
||||
}
|
||||
"AboutChangelogButtonTooltipMessage": "Нажмите, чтобы открыть список изменений для этой версии",
|
||||
"SettingsTabNetworkMultiplayer": "Мультиплеер",
|
||||
"MultiplayerMode": "Режим:",
|
||||
"MultiplayerModeTooltip": "Изменение многопользовательского режима LDN.\n\nLdnMitm модифицирует функциональность локальной беспроводной/игры на одном устройстве в играх, позволяя играть с другими пользователями Ryujinx или взломанными консолями Nintendo Switch с установленным модулем ldn_mitm, находящимися в одной локальной сети друг с другом.\n\nМногопользовательская игра требует наличия у всех игроков одной и той же версии игры (т.е. Super Smash Bros. Ultimate v13.0.1 не может подключиться к v13.0.0).\n\nРекомендуется оставить отключенным.",
|
||||
"MultiplayerModeDisabled": "Отключено",
|
||||
"MultiplayerModeLdnMitm": "ldn_mitm"
|
||||
}
|
||||
|
|
673
src/Ryujinx/Assets/Locales/th_TH.json
Normal file
|
@ -0,0 +1,673 @@
|
|||
{
|
||||
"Language": "ภาษาไทย",
|
||||
"MenuBarFileOpenApplet": "เปิด Applet",
|
||||
"MenuBarFileOpenAppletOpenMiiAppletToolTip": "เปิด Mii Editor Applet ในโหมดสแตนด์อโลน",
|
||||
"SettingsTabInputDirectMouseAccess": "เข้าถึงเมาส์ได้โดยตรง",
|
||||
"SettingsTabSystemMemoryManagerMode": "โหมดจัดการหน่วยความจำ:",
|
||||
"SettingsTabSystemMemoryManagerModeSoftware": "ซอฟต์แวร์",
|
||||
"SettingsTabSystemMemoryManagerModeHost": "โฮสต์ (เร็ว)",
|
||||
"SettingsTabSystemMemoryManagerModeHostUnchecked": "ไม่ได้ตรวจสอบโฮสต์ (เร็วที่สุด, แต่ไม่ปลอดภัย)",
|
||||
"SettingsTabSystemUseHypervisor": "ใช้งาน Hypervisor",
|
||||
"MenuBarFile": "ไฟล์",
|
||||
"MenuBarFileOpenFromFile": "โหลดแอปพลิเคชั่นจากไฟล์",
|
||||
"MenuBarFileOpenUnpacked": "โหลดเกมที่คลายแพ็กแล้ว",
|
||||
"MenuBarFileOpenEmuFolder": "เปิดโฟลเดอร์ รียูจินซ์",
|
||||
"MenuBarFileOpenLogsFolder": "เปิดโฟลเดอร์ Logs",
|
||||
"MenuBarFileExit": "ออก",
|
||||
"MenuBarOptions": "_ตัวเลือก",
|
||||
"MenuBarOptionsToggleFullscreen": "สลับการแสดงผลแบบเต็มหน้าจอ",
|
||||
"MenuBarOptionsStartGamesInFullscreen": "เริ่มเกมในโหมดเต็มหน้าจอ",
|
||||
"MenuBarOptionsStopEmulation": "หยุดการจำลอง",
|
||||
"MenuBarOptionsSettings": "การตั้งค่า",
|
||||
"MenuBarOptionsManageUserProfiles": "จัดการโปรไฟล์ผู้ใช้งาน",
|
||||
"MenuBarActions": "การดำเนินการ",
|
||||
"MenuBarOptionsSimulateWakeUpMessage": "จำลองข้อความปลุก",
|
||||
"MenuBarActionsScanAmiibo": "สแกนหา อะมิโบ",
|
||||
"MenuBarTools": "_เครื่องมือ",
|
||||
"MenuBarToolsInstallFirmware": "ติดตั้งเฟิร์มแวร์",
|
||||
"MenuBarFileToolsInstallFirmwareFromFile": "ติดตั้งเฟิร์มแวร์จาก ไฟล์ XCI หรือ ไฟล์ ZIP",
|
||||
"MenuBarFileToolsInstallFirmwareFromDirectory": "ติดตั้งเฟิร์มแวร์จากไดเร็กทอรี",
|
||||
"MenuBarToolsManageFileTypes": "จัดการประเภทไฟล์",
|
||||
"MenuBarToolsInstallFileTypes": "ติดตั้งประเภทไฟล์",
|
||||
"MenuBarToolsUninstallFileTypes": "ถอนการติดตั้งประเภทไฟล์",
|
||||
"MenuBarHelp": "_ช่วยเหลือ",
|
||||
"MenuBarHelpCheckForUpdates": "ตรวจหาการอัพเดต",
|
||||
"MenuBarHelpAbout": "เกี่ยวกับ",
|
||||
"MenuSearch": "กำลังค้นหา...",
|
||||
"GameListHeaderFavorite": "ชื่นชอบ",
|
||||
"GameListHeaderIcon": "ไอคอน",
|
||||
"GameListHeaderApplication": "ชื่อ",
|
||||
"GameListHeaderDeveloper": "ผู้พัฒนา",
|
||||
"GameListHeaderVersion": "เวอร์ชั่น",
|
||||
"GameListHeaderTimePlayed": "เวลาที่เล่นไปแล้ว",
|
||||
"GameListHeaderLastPlayed": "เล่นล่าสุด",
|
||||
"GameListHeaderFileExtension": "นามสกุลไฟล์",
|
||||
"GameListHeaderFileSize": "ขนาดไฟล์",
|
||||
"GameListHeaderPath": "ที่เก็บไฟล์",
|
||||
"GameListContextMenuOpenUserSaveDirectory": "เปิดไดเร็กทอรี่บันทึกของผู้ใช้",
|
||||
"GameListContextMenuOpenUserSaveDirectoryToolTip": "เปิดไดเร็กทอรี่ซึ่งมีการบันทึกผู้ใช้ของแอปพลิเคชัน",
|
||||
"GameListContextMenuOpenDeviceSaveDirectory": "เปิดไดเร็กทอรีบันทึกของอุปกรณ์",
|
||||
"GameListContextMenuOpenDeviceSaveDirectoryToolTip": "เปิดไดเรกทอรี่ซึ่งมีบันทึกอุปกรณ์ของแอปพลิเคชัน",
|
||||
"GameListContextMenuOpenBcatSaveDirectory": "เปิดไดเรกทอรีบันทึก BCAT",
|
||||
"GameListContextMenuOpenBcatSaveDirectoryToolTip": "เปิดไดเรกทอรี่ซึ่งมีการบันทึก BCAT ของแอปพลิเคชัน",
|
||||
"GameListContextMenuManageTitleUpdates": "จัดการ การอัปเดตหัวข้อ",
|
||||
"GameListContextMenuManageTitleUpdatesToolTip": "เปิดหน้าต่างการจัดการการอัพเดตหัวข้อ",
|
||||
"GameListContextMenuManageDlc": "จัดการ DLC",
|
||||
"GameListContextMenuManageDlcToolTip": "เปิดหน้าต่างการจัดการ DLC",
|
||||
"GameListContextMenuCacheManagement": "การบริหารจัดการแคช",
|
||||
"GameListContextMenuCacheManagementPurgePptc": "เพิ่มเข้าคิวงาน PPTC ที่สร้างใหม่",
|
||||
"GameListContextMenuCacheManagementPurgePptcToolTip": "ทริกเกอร์ PPTC ให้สร้างใหม่ในเวลาบูตเมื่อเปิดตัวเกมครั้งถัดไป",
|
||||
"GameListContextMenuCacheManagementPurgeShaderCache": "ล้าง เชเดอร์แคช",
|
||||
"GameListContextMenuCacheManagementPurgeShaderCacheToolTip": "ลบ เชเดอร์แคช ของแอปพลิเคชัน",
|
||||
"GameListContextMenuCacheManagementOpenPptcDirectory": "เปิดไดเรกทอรี่่ PPTC",
|
||||
"GameListContextMenuCacheManagementOpenPptcDirectoryToolTip": "เปิดไดเร็กทอรีที่มี PPTC แคช ของแอปพลิเคชัน",
|
||||
"GameListContextMenuCacheManagementOpenShaderCacheDirectory": "เปิดไดเรกทอรี่ เชเดอร์แคช",
|
||||
"GameListContextMenuCacheManagementOpenShaderCacheDirectoryToolTip": "เปิดไดเรกทอรี่ที่มี แคชเชเดอร์ ของแอปพลิเคชัน",
|
||||
"GameListContextMenuExtractData": "แยกข้อมูล",
|
||||
"GameListContextMenuExtractDataExeFS": "ExeFS",
|
||||
"GameListContextMenuExtractDataExeFSToolTip": "แยกส่วน ExeFS ออกจากการกำหนดค่าปัจจุบันของแอปพลิเคชัน (รวมถึงการอัปเดต)",
|
||||
"GameListContextMenuExtractDataRomFS": "RomFS",
|
||||
"GameListContextMenuExtractDataRomFSToolTip": "แยกส่วน RomFS ออกจากการกำหนดค่าปัจจุบันของแอปพลิเคชัน (รวมถึงการอัพเดต)",
|
||||
"GameListContextMenuExtractDataLogo": "โลโก้",
|
||||
"GameListContextMenuExtractDataLogoToolTip": "แยกส่วน โลโก้ ออกจากการกำหนดค่าปัจจุบันของแอปพลิเคชัน (รวมถึงการอัปเดต)",
|
||||
"GameListContextMenuCreateShortcut": "สร้างทางลัดของแอปพลิเคชัน",
|
||||
"GameListContextMenuCreateShortcutToolTip": "สร้างทางลัดบนเดสก์ท็อปที่เรียกใช้แอปพลิเคชันที่เลือก",
|
||||
"GameListContextMenuCreateShortcutToolTipMacOS": "สร้างทางลัดในโฟลเดอร์ Applications ของ macOS ที่เรียกใช้ Application ที่เลือก",
|
||||
"GameListContextMenuOpenModsDirectory": "เปิดไดเรกทอรี่ Mods",
|
||||
"GameListContextMenuOpenModsDirectoryToolTip": "เปิดไดเร็กทอรีซึ่งมี Mods ของแอปพลิเคชัน",
|
||||
"GameListContextMenuOpenSdModsDirectory": "เปิดไดเร็กทอรี Mods Atmosphere",
|
||||
"GameListContextMenuOpenSdModsDirectoryToolTip": "เปิดไดเร็กทอรี Atmosphere ของการ์ด SD สำรองซึ่งมี Mods ของแอปพลิเคชัน มีประโยชน์สำหรับ mods ที่บรรจุมากับฮาร์ดแวร์จริง",
|
||||
"StatusBarGamesLoaded": "เกมส์โหลดแล้ว {0}/{1}",
|
||||
"StatusBarSystemVersion": "เวอร์ชั่นของระบบ: {0}",
|
||||
"LinuxVmMaxMapCountDialogTitle": "ตรวจพบขีดจำกัดต่ำสุดสำหรับการแมปหน่วยความจำ",
|
||||
"LinuxVmMaxMapCountDialogTextPrimary": "คุณต้องการที่จะเพิ่มค่า vm.max_map_count ไปยัง {0}",
|
||||
"LinuxVmMaxMapCountDialogTextSecondary": "บางเกมอาจพยายามสร้างการแมปหน่วยความจำมากกว่าที่ได้รับอนุญาตในปัจจุบัน รียูจินซ์ จะปิดตัวลงเมื่อเกินขีดจำกัดนี้",
|
||||
"LinuxVmMaxMapCountDialogButtonUntilRestart": "ใช่, จนกว่าจะรีสตาร์ทครั้งถัดไป",
|
||||
"LinuxVmMaxMapCountDialogButtonPersistent": "ใช่, อย่างถาวร",
|
||||
"LinuxVmMaxMapCountWarningTextPrimary": "จำนวนสูงสุดของการแม็ปหน่วยความจำ ต่ำกว่าที่แนะนำ",
|
||||
"LinuxVmMaxMapCountWarningTextSecondary": "ค่าปัจจุบันของ vm.max_map_count ({0}) มีค่าต่ำกว่า {1} บางเกมอาจพยายามสร้างการแมปหน่วยความจำมากกว่าที่ได้รับอนุญาตในปัจจุบัน รียูจินซ์ จะปิดตัวลงเมื่อเกินขีดจำกัดนี้\n\nคุณอาจต้องการเพิ่มขีดจำกัดด้วยตนเองหรือติดตั้ง pkexec ซึ่งอนุญาตให้ ริวจินซ์ เพื่อช่วยเหลือคุณได้",
|
||||
"Settings": "การตั้งค่า",
|
||||
"SettingsTabGeneral": "หน้าจอผู้ใช้",
|
||||
"SettingsTabGeneralGeneral": "ทั่วไป",
|
||||
"SettingsTabGeneralEnableDiscordRichPresence": "เปิดใช้งาน Discord Rich Presence",
|
||||
"SettingsTabGeneralCheckUpdatesOnLaunch": "ตรวจหาการอัปเดตเมื่อเปิดโปรแกรม",
|
||||
"SettingsTabGeneralShowConfirmExitDialog": "แสดง \"ยืนยันการออก\" กล่องข้อความโต้ตอบ",
|
||||
"SettingsTabGeneralHideCursor": "ซ่อน เคอร์เซอร์:",
|
||||
"SettingsTabGeneralHideCursorNever": "ไม่มี",
|
||||
"SettingsTabGeneralHideCursorOnIdle": "ซ่อนอัตโนมัติ",
|
||||
"SettingsTabGeneralHideCursorAlways": "ตลอดเวลา",
|
||||
"SettingsTabGeneralGameDirectories": "ไดเรกทอรี่ของเกม",
|
||||
"SettingsTabGeneralAdd": "เพิ่ม",
|
||||
"SettingsTabGeneralRemove": "เอาออก",
|
||||
"SettingsTabSystem": "ระบบ",
|
||||
"SettingsTabSystemCore": "แกนกลาง",
|
||||
"SettingsTabSystemSystemRegion": "ภูมิภาคของระบบ:",
|
||||
"SettingsTabSystemSystemRegionJapan": "ญี่ปุ่น",
|
||||
"SettingsTabSystemSystemRegionUSA": "สหรัฐอเมริกา",
|
||||
"SettingsTabSystemSystemRegionEurope": "ยุโรป",
|
||||
"SettingsTabSystemSystemRegionAustralia": "ออสเตรเลีย",
|
||||
"SettingsTabSystemSystemRegionChina": "จีน",
|
||||
"SettingsTabSystemSystemRegionKorea": "เกาหลี",
|
||||
"SettingsTabSystemSystemRegionTaiwan": "ไต้หวัน",
|
||||
"SettingsTabSystemSystemLanguage": "ภาษาของระบบ:",
|
||||
"SettingsTabSystemSystemLanguageJapanese": "ญี่ปุ่น",
|
||||
"SettingsTabSystemSystemLanguageAmericanEnglish": "อังกฤษ (อเมริกัน)",
|
||||
"SettingsTabSystemSystemLanguageFrench": "ฝรั่งเศส",
|
||||
"SettingsTabSystemSystemLanguageGerman": "เยอรมัน",
|
||||
"SettingsTabSystemSystemLanguageItalian": "อิตาลี",
|
||||
"SettingsTabSystemSystemLanguageSpanish": "สเปน",
|
||||
"SettingsTabSystemSystemLanguageChinese": "จีน",
|
||||
"SettingsTabSystemSystemLanguageKorean": "เกาหลี",
|
||||
"SettingsTabSystemSystemLanguageDutch": "ดัตช์",
|
||||
"SettingsTabSystemSystemLanguagePortuguese": "โปรตุเกส",
|
||||
"SettingsTabSystemSystemLanguageRussian": "รัสเซีย",
|
||||
"SettingsTabSystemSystemLanguageTaiwanese": "จีนตัวเต็ม (ไต้หวัน)",
|
||||
"SettingsTabSystemSystemLanguageBritishEnglish": "อังกฤษ (บริติช)",
|
||||
"SettingsTabSystemSystemLanguageCanadianFrench": "ฝรั่งเศส (แคนาดา)",
|
||||
"SettingsTabSystemSystemLanguageLatinAmericanSpanish": "สเปน (ลาตินอเมริกา)",
|
||||
"SettingsTabSystemSystemLanguageSimplifiedChinese": "จีน (ตัวย่อ)",
|
||||
"SettingsTabSystemSystemLanguageTraditionalChinese": "จีน (ดั้งเดิม)",
|
||||
"SettingsTabSystemSystemTimeZone": "โซนเวลาของระบบ:",
|
||||
"SettingsTabSystemSystemTime": "เวลาของระบบ:",
|
||||
"SettingsTabSystemEnableVsync": "VSync",
|
||||
"SettingsTabSystemEnablePptc": "PPTC (แคชการแปลแบบถาวรที่มีโปรไฟล์)",
|
||||
"SettingsTabSystemEnableFsIntegrityChecks": "การตรวจสอบความถูกต้องของ FS",
|
||||
"SettingsTabSystemAudioBackend": "แบ็กเอนด์เสียง:",
|
||||
"SettingsTabSystemAudioBackendDummy": "ดัมมี่",
|
||||
"SettingsTabSystemAudioBackendOpenAL": "OpenAL",
|
||||
"SettingsTabSystemAudioBackendSoundIO": "SoundIO",
|
||||
"SettingsTabSystemAudioBackendSDL2": "SDL2",
|
||||
"SettingsTabSystemHacks": "แฮ็ก",
|
||||
"SettingsTabSystemHacksNote": "อาจทำให้เกิดข้อผิดพลาดได้",
|
||||
"SettingsTabSystemExpandDramSize": "ใช้รูปแบบหน่วยความจำสำรอง (โหมดนักพัฒนา)",
|
||||
"SettingsTabSystemIgnoreMissingServices": "ไม่สนใจบริการที่ขาดหายไป",
|
||||
"SettingsTabGraphics": "กราฟิก",
|
||||
"SettingsTabGraphicsAPI": "เอพีไอของกราฟิก",
|
||||
"SettingsTabGraphicsEnableShaderCache": "เปิดใช้งาน เชเดอร์ แคช",
|
||||
"SettingsTabGraphicsAnisotropicFiltering": "ตัวกรองแบบ แอนไอโซทรอปิก:",
|
||||
"SettingsTabGraphicsAnisotropicFilteringAuto": "อัตโนมัติ",
|
||||
"SettingsTabGraphicsAnisotropicFiltering2x": "2x",
|
||||
"SettingsTabGraphicsAnisotropicFiltering4x": "4x",
|
||||
"SettingsTabGraphicsAnisotropicFiltering8x": "8x",
|
||||
"SettingsTabGraphicsAnisotropicFiltering16x": "16x",
|
||||
"SettingsTabGraphicsResolutionScale": "อัตราส่วนความละเอียด:",
|
||||
"SettingsTabGraphicsResolutionScaleCustom": "กำหนดเอง (ไม่แนะนำ)",
|
||||
"SettingsTabGraphicsResolutionScaleNative": "พื้นฐานของระบบ (720p/1080p)",
|
||||
"SettingsTabGraphicsResolutionScale2x": "2x (1440p/2160p)",
|
||||
"SettingsTabGraphicsResolutionScale3x": "3x (2160p/3240p)",
|
||||
"SettingsTabGraphicsResolutionScale4x": "4x (2880p/4320p) (ไม่แนะนำ)",
|
||||
"SettingsTabGraphicsAspectRatio": "อัตราส่วนภาพ:",
|
||||
"SettingsTabGraphicsAspectRatio4x3": "4:3",
|
||||
"SettingsTabGraphicsAspectRatio16x9": "16:9",
|
||||
"SettingsTabGraphicsAspectRatio16x10": "16:10",
|
||||
"SettingsTabGraphicsAspectRatio21x9": "21:9",
|
||||
"SettingsTabGraphicsAspectRatio32x9": "32:9",
|
||||
"SettingsTabGraphicsAspectRatioStretch": "ยืดภาพเพื่อให้พอดีกับหน้าต่าง",
|
||||
"SettingsTabGraphicsDeveloperOptions": "ตัวเลือกนักพัฒนา",
|
||||
"SettingsTabGraphicsShaderDumpPath": "ที่เก็บไฟล์ดัมพ์ของ เชเดอร์กราฟิก:",
|
||||
"SettingsTabLogging": "การบันทึก",
|
||||
"SettingsTabLoggingLogging": "การบันทึก",
|
||||
"SettingsTabLoggingEnableLoggingToFile": "เปิดใช้งาน การบันทึกไปยังไฟล์",
|
||||
"SettingsTabLoggingEnableStubLogs": "เปิดใช้งาน บันทึกของต้นขั้ว",
|
||||
"SettingsTabLoggingEnableInfoLogs": "เปิดใช้งาน บันทึกของข้อมูล",
|
||||
"SettingsTabLoggingEnableWarningLogs": "เปิดใช้งาน บันทึกคำเตือน",
|
||||
"SettingsTabLoggingEnableErrorLogs": "เปิดใช้งาน บันทึกข้อผิดพลาด",
|
||||
"SettingsTabLoggingEnableTraceLogs": "เปิดใช้งาน บันทึกการติดตาม",
|
||||
"SettingsTabLoggingEnableGuestLogs": "เปิดใช้งาน บันทึกของผู้เยี่ยมชม",
|
||||
"SettingsTabLoggingEnableFsAccessLogs": "เปิดใช้งาน บันทึกการเข้าถึง Fs",
|
||||
"SettingsTabLoggingFsGlobalAccessLogMode": "โหมดบันทึกการเข้าถึงส่วนกลาง:",
|
||||
"SettingsTabLoggingDeveloperOptions": "ตัวเลือกนักพัฒนา",
|
||||
"SettingsTabLoggingDeveloperOptionsNote": "คำเตือน: จะทำให้ประสิทธิภาพลดลง",
|
||||
"SettingsTabLoggingGraphicsBackendLogLevel": "ระดับการบันทึก แบ็กเอนด์กราฟิก:",
|
||||
"SettingsTabLoggingGraphicsBackendLogLevelNone": "ไม่มี",
|
||||
"SettingsTabLoggingGraphicsBackendLogLevelError": "ผิดพลาด",
|
||||
"SettingsTabLoggingGraphicsBackendLogLevelPerformance": "ชะลอตัว",
|
||||
"SettingsTabLoggingGraphicsBackendLogLevelAll": "ทั้งหมด",
|
||||
"SettingsTabLoggingEnableDebugLogs": "เปิดใช้งานบันทึกการแก้ไขข้อบกพร่อง",
|
||||
"SettingsTabInput": "ป้อนข้อมูล",
|
||||
"SettingsTabInputEnableDockedMode": "ด็อกโหมด",
|
||||
"SettingsTabInputDirectKeyboardAccess": "เข้าถึงคีย์บอร์ดโดยตรง",
|
||||
"SettingsButtonSave": "บันทึก",
|
||||
"SettingsButtonClose": "ปิด",
|
||||
"SettingsButtonOk": "ตกลง",
|
||||
"SettingsButtonCancel": "ยกเลิก",
|
||||
"SettingsButtonApply": "นำไปใช้",
|
||||
"ControllerSettingsPlayer": "ผู้เล่น",
|
||||
"ControllerSettingsPlayer1": "ผู้เล่นคนที่ 1",
|
||||
"ControllerSettingsPlayer2": "ผู้เล่นคนที่ 2",
|
||||
"ControllerSettingsPlayer3": "ผู้เล่นคนที่ 3",
|
||||
"ControllerSettingsPlayer4": "ผู้เล่นคนที่ 4",
|
||||
"ControllerSettingsPlayer5": "ผู้เล่นคนที่ 5",
|
||||
"ControllerSettingsPlayer6": "ผู้เล่นคนที่ 6",
|
||||
"ControllerSettingsPlayer7": "ผู้เล่นคนที่ 7",
|
||||
"ControllerSettingsPlayer8": "ผู้เล่นคนที่ 8",
|
||||
"ControllerSettingsHandheld": "แฮนด์เฮลด์โหมด",
|
||||
"ControllerSettingsInputDevice": "อุปกรณ์ป้อนข้อมูล",
|
||||
"ControllerSettingsRefresh": "รีเฟรช",
|
||||
"ControllerSettingsDeviceDisabled": "ปิดการใช้งาน",
|
||||
"ControllerSettingsControllerType": "ประเภทของคอนโทรลเลอร์",
|
||||
"ControllerSettingsControllerTypeHandheld": "แฮนด์เฮลด์",
|
||||
"ControllerSettingsControllerTypeProController": "โปรคอนโทรลเลอร์",
|
||||
"ControllerSettingsControllerTypeJoyConPair": "จับคู่ จอยคอน",
|
||||
"ControllerSettingsControllerTypeJoyConLeft": "จอยคอน ด้านซ้าย",
|
||||
"ControllerSettingsControllerTypeJoyConRight": "จอยคอน ด้านขวา",
|
||||
"ControllerSettingsProfile": "โปรไฟล์",
|
||||
"ControllerSettingsProfileDefault": "ค่าเริ่มต้น",
|
||||
"ControllerSettingsLoad": "โหลด",
|
||||
"ControllerSettingsAdd": "เพิ่ม",
|
||||
"ControllerSettingsRemove": "เอาออก",
|
||||
"ControllerSettingsButtons": "ปุ่มกด",
|
||||
"ControllerSettingsButtonA": "A",
|
||||
"ControllerSettingsButtonB": "B",
|
||||
"ControllerSettingsButtonX": "X",
|
||||
"ControllerSettingsButtonY": "Y",
|
||||
"ControllerSettingsButtonPlus": "+",
|
||||
"ControllerSettingsButtonMinus": "-",
|
||||
"ControllerSettingsDPad": "ปุ่มลูกศร",
|
||||
"ControllerSettingsDPadUp": "ขึ้น",
|
||||
"ControllerSettingsDPadDown": "ลง",
|
||||
"ControllerSettingsDPadLeft": "ซ้าย",
|
||||
"ControllerSettingsDPadRight": "ขวา",
|
||||
"ControllerSettingsStickButton": "ปุ่ม",
|
||||
"ControllerSettingsStickUp": "ขึ้น",
|
||||
"ControllerSettingsStickDown": "ลง",
|
||||
"ControllerSettingsStickLeft": "ซ้าย",
|
||||
"ControllerSettingsStickRight": "ขวา",
|
||||
"ControllerSettingsStickStick": "จอยสติ๊ก",
|
||||
"ControllerSettingsStickInvertXAxis": "กลับทิศทางของแกน X",
|
||||
"ControllerSettingsStickInvertYAxis": "กลับทิศทางของแกน Y",
|
||||
"ControllerSettingsStickDeadzone": "โซนที่ไม่ทำงานของ จอยสติ๊ก:",
|
||||
"ControllerSettingsLStick": "จอยสติ๊ก ด้านซ้าย",
|
||||
"ControllerSettingsRStick": "จอยสติ๊ก ด้านขวา",
|
||||
"ControllerSettingsTriggersLeft": "ทริกเกอร์ ด้านซ้าย",
|
||||
"ControllerSettingsTriggersRight": "ทริกเกอร์ ด้านขวา",
|
||||
"ControllerSettingsTriggersButtonsLeft": "ปุ่มทริกเกอร์ ด้านซ้าย",
|
||||
"ControllerSettingsTriggersButtonsRight": "ปุ่มทริกเกอร์ ด้านขวา",
|
||||
"ControllerSettingsTriggers": "ทริกเกอร์",
|
||||
"ControllerSettingsTriggerL": "L",
|
||||
"ControllerSettingsTriggerR": "R",
|
||||
"ControllerSettingsTriggerZL": "ZL",
|
||||
"ControllerSettingsTriggerZR": "ZR",
|
||||
"ControllerSettingsLeftSL": "SL",
|
||||
"ControllerSettingsLeftSR": "SR",
|
||||
"ControllerSettingsRightSL": "SL",
|
||||
"ControllerSettingsRightSR": "SR",
|
||||
"ControllerSettingsExtraButtonsLeft": "ปุ่มกดเสริม ด้านซ้าย",
|
||||
"ControllerSettingsExtraButtonsRight": "ปุ่มกดเสริม ด้านขวา",
|
||||
"ControllerSettingsMisc": "การควบคุมเพิ่มเติม",
|
||||
"ControllerSettingsTriggerThreshold": "ตั้งค่าขีดจำกัดของ ทริกเกอร์:",
|
||||
"ControllerSettingsMotion": "การเคลื่อนไหว",
|
||||
"ControllerSettingsMotionUseCemuhookCompatibleMotion": "ใช้การเคลื่อนไหวที่เข้ากันได้กับ CemuHook",
|
||||
"ControllerSettingsMotionControllerSlot": "ช่องเสียบ คอนโทรลเลอร์:",
|
||||
"ControllerSettingsMotionMirrorInput": "นำเข้าการสะท้อน การควบคุม",
|
||||
"ControllerSettingsMotionRightJoyConSlot": "ช่องเสียบ จอยคอน ด้านขวา:",
|
||||
"ControllerSettingsMotionServerHost": "เซิร์ฟเวอร์โฮสต์:",
|
||||
"ControllerSettingsMotionGyroSensitivity": "ความไวของไจโร:",
|
||||
"ControllerSettingsMotionGyroDeadzone": "โซนที่ไม่ทำงานของไจโร:",
|
||||
"ControllerSettingsSave": "บันทึก",
|
||||
"ControllerSettingsClose": "ปิด",
|
||||
"UserProfilesSelectedUserProfile": "โปรไฟล์ผู้ใช้งานที่เลือก:",
|
||||
"UserProfilesSaveProfileName": "บันทึกชื่อโปรไฟล์",
|
||||
"UserProfilesChangeProfileImage": "เปลี่ยนรูปโปรไฟล์",
|
||||
"UserProfilesAvailableUserProfiles": "โปรไฟล์ผู้ใช้ที่ใช้งานได้:",
|
||||
"UserProfilesAddNewProfile": "สร้างโปรไฟล์ใหม่",
|
||||
"UserProfilesDelete": "ลบ",
|
||||
"UserProfilesClose": "ปิด",
|
||||
"ProfileNameSelectionWatermark": "เลือกชื่อเล่น",
|
||||
"ProfileImageSelectionTitle": "เลือกรูปโปรไฟล์ของคุณ",
|
||||
"ProfileImageSelectionHeader": "เลือกรูปโปรไฟล์",
|
||||
"ProfileImageSelectionNote": "คุณสามารถนำเข้ารูปโปรไฟล์ที่กำหนดเอง หรือเลือกอวาต้าจากเฟิร์มแวร์ระบบได้",
|
||||
"ProfileImageSelectionImportImage": "นำเข้าไฟล์รูปภาพ",
|
||||
"ProfileImageSelectionSelectAvatar": "เลือกรูปอวาต้าเฟิร์มแวร์",
|
||||
"InputDialogTitle": "กล่องโต้ตอบการป้อนข้อมูล",
|
||||
"InputDialogOk": "ตกลง",
|
||||
"InputDialogCancel": "ยกเลิก",
|
||||
"InputDialogAddNewProfileTitle": "เลือกชื่อโปรไฟล์",
|
||||
"InputDialogAddNewProfileHeader": "กรุณาใส่ชื่อโปรไฟล์",
|
||||
"InputDialogAddNewProfileSubtext": "(ความยาวสูงสุด: {0})",
|
||||
"AvatarChoose": "เลือกรูปอวาต้าของคุณ",
|
||||
"AvatarSetBackgroundColor": "ตั้งค่าสีพื้นหลัง",
|
||||
"AvatarClose": "ปิด",
|
||||
"ControllerSettingsLoadProfileToolTip": "โหลดโปรไฟล์",
|
||||
"ControllerSettingsAddProfileToolTip": "เพิ่มโปรไฟล์",
|
||||
"ControllerSettingsRemoveProfileToolTip": "ลบโปรไฟล์",
|
||||
"ControllerSettingsSaveProfileToolTip": "บันทึกโปรไฟล์",
|
||||
"MenuBarFileToolsTakeScreenshot": "ถ่ายภาพหน้าจอ",
|
||||
"MenuBarFileToolsHideUi": "ซ่อน UI",
|
||||
"GameListContextMenuRunApplication": "เรียกใช้แอปพลิเคชัน",
|
||||
"GameListContextMenuToggleFavorite": "สลับรายการโปรด",
|
||||
"GameListContextMenuToggleFavoriteToolTip": "สลับสถานะเกมที่ชื่นชอบ",
|
||||
"SettingsTabGeneralTheme": "ธีม:",
|
||||
"SettingsTabGeneralThemeDark": "มืด",
|
||||
"SettingsTabGeneralThemeLight": "สว่าง",
|
||||
"ControllerSettingsConfigureGeneral": "กำหนดค่า",
|
||||
"ControllerSettingsRumble": "การสั่นไหว",
|
||||
"ControllerSettingsRumbleStrongMultiplier": "เพิ่มความแรงการสั่นไหว",
|
||||
"ControllerSettingsRumbleWeakMultiplier": "ลดความแรงการสั่นไหว",
|
||||
"DialogMessageSaveNotAvailableMessage": "ไม่มีข้อมูลบันทึกไว้สำหรับ {0} [{1:x16}]",
|
||||
"DialogMessageSaveNotAvailableCreateSaveMessage": "คุณต้องการสร้างข้อมูลบันทึกสำหรับเกมนี้หรือไม่?",
|
||||
"DialogConfirmationTitle": "ริวจินซ์ - ยืนยัน",
|
||||
"DialogUpdaterTitle": "รียูจินซ์ - อัพเดต",
|
||||
"DialogErrorTitle": "รียูจินซ์ - ผิดพลาด",
|
||||
"DialogWarningTitle": "รียูจินซ์ - คำเตือน",
|
||||
"DialogExitTitle": "รียูจินซ์ - ออก",
|
||||
"DialogErrorMessage": "รียูจินซ์ พบข้อผิดพลาด",
|
||||
"DialogExitMessage": "คุณแน่ใจหรือไม่ว่าต้องการปิด ริวจินซ์ หรือไม่?",
|
||||
"DialogExitSubMessage": "ข้อมูลที่ไม่ได้บันทึกทั้งหมดจะสูญหาย!",
|
||||
"DialogMessageCreateSaveErrorMessage": "มีข้อผิดพลาดในการสร้างข้อมูลการบันทึกที่ระบุ: {0}",
|
||||
"DialogMessageFindSaveErrorMessage": "มีข้อผิดพลาดในการค้นหาข้อมูลที่บันทึกไว้ที่ระบุ: {0}",
|
||||
"FolderDialogExtractTitle": "เลือกโฟลเดอร์ที่จะแตกไฟล์เข้าไป",
|
||||
"DialogNcaExtractionMessage": "กำลังแตกไฟล์ {0} จากส่วน {1}...",
|
||||
"DialogNcaExtractionTitle": "รียูจินซ์ - เครื่องมือแตกไฟล์ของ NCA",
|
||||
"DialogNcaExtractionMainNcaNotFoundErrorMessage": "เกิดความล้มเหลวในการแตกไฟล์เนื่องจากไม่พบ NCA หลักในไฟล์ที่เลือก",
|
||||
"DialogNcaExtractionCheckLogErrorMessage": "เกิดความล้มเหลวในการแตกไฟล์ โปรดอ่านไฟล์บันทึกเพื่อดูข้อมูลเพิ่มเติม",
|
||||
"DialogNcaExtractionSuccessMessage": "การแตกไฟล์เสร็จสมบูรณ์แล้ว",
|
||||
"DialogUpdaterConvertFailedMessage": "ไม่สามารถแปลงเวอร์ชั่น รียูจินซ์ ปัจจุบันได้",
|
||||
"DialogUpdaterCancelUpdateMessage": "ยกเลิกการอัพเดต!",
|
||||
"DialogUpdaterAlreadyOnLatestVersionMessage": "คุณกำลังใช้ รียูจินซ์ เวอร์ชั่นที่อัปเดตล่าสุด!",
|
||||
"DialogUpdaterFailedToGetVersionMessage": "เกิดข้อผิดพลาดขณะพยายามรับข้อมูลเวอร์ชั่นจาก GitHub Release ปัญหานี้อาจเกิดขึ้นได้หากมีการรวบรวมเวอร์ชั่นใหม่โดย GitHub Actions โปรดลองอีกครั้งในอีกไม่กี่นาทีข้างหน้า",
|
||||
"DialogUpdaterConvertFailedGithubMessage": "ไม่สามารถแปลงเวอร์ชั่น รียูจินซ์ ที่ได้รับจาก Github Release",
|
||||
"DialogUpdaterDownloadingMessage": "กำลังดาวน์โหลดอัปเดต...",
|
||||
"DialogUpdaterExtractionMessage": "กำลังแตกไฟล์อัปเดต...",
|
||||
"DialogUpdaterRenamingMessage": "กำลังลบไฟล์เก่า...",
|
||||
"DialogUpdaterAddingFilesMessage": "กำลังเพิ่มไฟล์อัปเดตใหม่...",
|
||||
"DialogUpdaterCompleteMessage": "อัปเดตเสร็จสมบูรณ์แล้ว!",
|
||||
"DialogUpdaterRestartMessage": "คุณต้องการรีสตาร์ท รียูจินซ์ ตอนนี้หรือไม่?",
|
||||
"DialogUpdaterNoInternetMessage": "คุณไม่ได้เชื่อมต่อกับอินเทอร์เน็ต!",
|
||||
"DialogUpdaterNoInternetSubMessage": "โปรดตรวจสอบว่าคุณมีการเชื่อมต่ออินเทอร์เน็ตว่ามีการใช้งานได้หรือไม่!",
|
||||
"DialogUpdaterDirtyBuildMessage": "คุณไม่สามารถอัปเดต Dirty build ของ รียูจินซ์ ได้!",
|
||||
"DialogUpdaterDirtyBuildSubMessage": "โปรดดาวน์โหลด รียูจินซ์ ได้ที่ https://ryujinx.org/ หากคุณกำลังมองหาเวอร์ชั่นที่รองรับ",
|
||||
"DialogRestartRequiredMessage": "จำเป็นต้องรีสตาร์ทเพื่อให้การอัพเดตสามารถให้งานได้",
|
||||
"DialogThemeRestartMessage": "บันทึกธีมแล้ว จำเป็นต้องรีสตาร์ทเพื่อใช้ธีม",
|
||||
"DialogThemeRestartSubMessage": "คุณต้องการรีสตาร์ทหรือไม่?",
|
||||
"DialogFirmwareInstallEmbeddedMessage": "คุณต้องการติดตั้งเฟิร์มแวร์ที่ฝังอยู่ในเกมนี้หรือไม่? (เฟิร์มแวร์ {0})",
|
||||
"DialogFirmwareInstallEmbeddedSuccessMessage": "ไม่พบเฟิร์มแวร์ที่ติดตั้งไว้ แต่ รียูจินซ์ สามารถติดตั้งเฟิร์มแวร์ได้ {0} จากเกมที่ให้มา\nตอนนี้โปรแกรมจำลองจะเริ่มทำงาน",
|
||||
"DialogFirmwareNoFirmwareInstalledMessage": "ไม่มีการติดตั้งเฟิร์มแวร์",
|
||||
"DialogFirmwareInstalledMessage": "เฟิร์มแวร์ทำการติดตั้งแล้ว {0}",
|
||||
"DialogInstallFileTypesSuccessMessage": "ติดตั้งประเภทไฟล์สำเร็จแล้ว!",
|
||||
"DialogInstallFileTypesErrorMessage": "ติดตั้งประเภทไฟล์ไม่สำเร็จ",
|
||||
"DialogUninstallFileTypesSuccessMessage": "ถอนการติดตั้งประเภทไฟล์สำเร็จแล้ว!",
|
||||
"DialogUninstallFileTypesErrorMessage": "ไม่สามารถถอนการติดตั้งประเภทไฟล์ได้",
|
||||
"DialogOpenSettingsWindowLabel": "เปิดหน้าต่างการตั้งค่า",
|
||||
"DialogControllerAppletTitle": "แอพเพล็ตคอนโทรลเลอร์",
|
||||
"DialogMessageDialogErrorExceptionMessage": "เกิดข้อผิดพลาดในการแสดงกล่องโต้ตอบข้อความ: {0}",
|
||||
"DialogSoftwareKeyboardErrorExceptionMessage": "เกิดข้อผิดพลาดในการแสดงซอฟต์แวร์แป้นพิมพ์: {0}",
|
||||
"DialogErrorAppletErrorExceptionMessage": "เกิดข้อผิดพลาดในการแสดงกล่องโต้ตอบ ข้อผิดพลาด แอปเพล็ต: {0}",
|
||||
"DialogUserErrorDialogMessage": "{0}: {1}",
|
||||
"DialogUserErrorDialogInfoMessage": "\nสำหรับข้อมูลเพิ่มเติมเกี่ยวกับวิธีแก้ไขข้อผิดพลาดนี้ โปรดทำตามคำแนะนำในการตั้งค่าของเรา",
|
||||
"DialogUserErrorDialogTitle": "ข้อผิดพลาด รียูจินซ์ ({0})",
|
||||
"DialogAmiiboApiTitle": "อะมิโบ API",
|
||||
"DialogAmiiboApiFailFetchMessage": "เกิดข้อผิดพลาดขณะเรียกข้อมูลจาก API",
|
||||
"DialogAmiiboApiConnectErrorMessage": "ไม่สามารถเชื่อมต่อกับเซิร์ฟเวอร์ อะมิโบ API บ้างบริการอาจหยุดทำงาน หรือไม่คุณต้องทำการตรวจสอบว่าการเชื่อมต่ออินเทอร์เน็ตของคุณอยู่ในสถานะเชื่อมต่ออยู่หรือไม่",
|
||||
"DialogProfileInvalidProfileErrorMessage": "โปรไฟล์ {0} เข้ากันไม่ได้กับระบบการกำหนดค่าอินพุตปัจจุบัน",
|
||||
"DialogProfileDefaultProfileOverwriteErrorMessage": "ไม่สามารถเขียนทับโปรไฟล์เริ่มต้นได้",
|
||||
"DialogProfileDeleteProfileTitle": "กำลังลบโปรไฟล์",
|
||||
"DialogProfileDeleteProfileMessage": "การดำเนินการนี้ไม่สามารถย้อนกลับได้ คุณแน่ใจหรือไม่ว่าต้องการดำเนินการต่อหรือไม่?",
|
||||
"DialogWarning": "คำเตือน",
|
||||
"DialogPPTCDeletionMessage": "คุณกำลังจะจัดคิวการสร้าง PPTC ใหม่ในการบูตครั้งถัดไป:\n\n{0}\n\nคุณแน่ใจหรือไม่ว่าต้องการดำเนินการต่อหรือไม่?",
|
||||
"DialogPPTCDeletionErrorMessage": "มีข้อผิดพลาดในการล้างแคช PPTC {0}: {1}",
|
||||
"DialogShaderDeletionMessage": "คุณกำลังจะลบ เชเดอร์แคช:\n\n{0}\n\nคุณแน่ใจหรือไม่ว่าต้องการดำเนินการต่อหรือไม่?",
|
||||
"DialogShaderDeletionErrorMessage": "เกิดข้อผิดพลาดในการล้าง เชเดอร์แคช {0}: {1}",
|
||||
"DialogRyujinxErrorMessage": "รียูจินซ์ พบข้อผิดพลาด",
|
||||
"DialogInvalidTitleIdErrorMessage": "ข้อผิดพลาดของ ยูไอ: เกมที่เลือกไม่มีชื่อ ID ที่ถูกต้อง",
|
||||
"DialogFirmwareInstallerFirmwareNotFoundErrorMessage": "ไม่พบเฟิร์มแวร์ของระบบที่ถูกต้อง {0}.",
|
||||
"DialogFirmwareInstallerFirmwareInstallTitle": "ติดตั้งเฟิร์มแวร์ {0}",
|
||||
"DialogFirmwareInstallerFirmwareInstallMessage": "นี่คื่อเวอร์ชั่นของระบบ {0} ที่ได้รับการติดตั้งเมื่อเร็วๆ นี้",
|
||||
"DialogFirmwareInstallerFirmwareInstallSubMessage": "\n\nสิ่งนี้จะแทนที่เวอร์ชั่นของระบบปัจจุบัน {0}.",
|
||||
"DialogFirmwareInstallerFirmwareInstallConfirmMessage": "\n\nคุณต้องการดำเนินการต่อหรือไม่?",
|
||||
"DialogFirmwareInstallerFirmwareInstallWaitMessage": "กำลังติดตั้งเฟิร์มแวร์...",
|
||||
"DialogFirmwareInstallerFirmwareInstallSuccessMessage": "การติดตั้งเวอร์ชั่นระบบ {0} เรียบร้อยแล้ว",
|
||||
"DialogUserProfileDeletionWarningMessage": "จะไม่มีโปรไฟล์อื่นให้เปิดหากโปรไฟล์ที่เลือกถูกลบ",
|
||||
"DialogUserProfileDeletionConfirmMessage": "คุณต้องการลบโปรไฟล์ที่เลือกหรือไม่?",
|
||||
"DialogUserProfileUnsavedChangesTitle": "คำเตือน - มีการเปลี่ยนแปลงที่ไม่ได้บันทึก",
|
||||
"DialogUserProfileUnsavedChangesMessage": "คุณได้ทำการเปลี่ยนแปลงโปรไฟล์ผู้ใช้นี้โดยไม่ได้รับการบันทึก",
|
||||
"DialogUserProfileUnsavedChangesSubMessage": "คุณต้องการยกเลิกการเปลี่ยนแปลงของคุณหรือไม่?",
|
||||
"DialogControllerSettingsModifiedConfirmMessage": "การตั้งค่าคอนโทรลเลอร์ปัจจุบันได้รับการอัปเดตแล้ว",
|
||||
"DialogControllerSettingsModifiedConfirmSubMessage": "คุณต้องการบันทึกหรือไม่?",
|
||||
"DialogLoadFileErrorMessage": "{0} ไฟล์เกิดข้อผิดพลาด: {1}",
|
||||
"DialogModAlreadyExistsMessage": "มีม็อดอยู่แล้ว",
|
||||
"DialogModInvalidMessage": "ไดเร็กทอรีที่ระบุไม่มี ม็อดอยู่!",
|
||||
"DialogModDeleteNoParentMessage": "ไม่สามารถลบ: ไม่พบไดเร็กทอรีหลักสำหรับ ม็อด \"{0}\"!",
|
||||
"DialogDlcNoDlcErrorMessage": "ไฟล์ที่ระบุไม่มี DLC สำหรับชื่อที่เลือก!",
|
||||
"DialogPerformanceCheckLoggingEnabledMessage": "คุณได้เปิดใช้งานการบันทึกการติดตาม ซึ่งออกแบบมาเพื่อให้นักพัฒนาใช้เท่านั้น",
|
||||
"DialogPerformanceCheckLoggingEnabledConfirmMessage": "เพื่อประสิทธิภาพสูงสุด ขอแนะนำให้ปิดใช้งานการบันทึกการติดตาม คุณต้องการปิดใช้การบันทึกการติดตามตอนนี้หรือไม่?",
|
||||
"DialogPerformanceCheckShaderDumpEnabledMessage": "คุณได้เปิดใช้งาน การดัมพ์เชเดอร์ ซึ่งออกแบบมาเพื่อให้นักพัฒนาใช้งานเท่านั้น",
|
||||
"DialogPerformanceCheckShaderDumpEnabledConfirmMessage": "เพื่อประสิทธิภาพสูงสุด ขอแนะนำให้ปิดใช้การดัมพ์เชเดอร์ คุณต้องการปิดการใช้งานการ ดัมพ์เชเดอร์ ตอนนี้หรือไม่?",
|
||||
"DialogLoadAppGameAlreadyLoadedMessage": "ทำการโหลดเกมเรียบร้อยแล้ว",
|
||||
"DialogLoadAppGameAlreadyLoadedSubMessage": "โปรดหยุดการจำลอง หรือปิดโปรแกรมจำลองก่อนที่จะเปิดเกมอื่น",
|
||||
"DialogUpdateAddUpdateErrorMessage": "ไฟล์ที่ระบุไม่มีการอัพเดตสำหรับชื่อเรื่องที่เลือก!",
|
||||
"DialogSettingsBackendThreadingWarningTitle": "คำเตือน - การทำเธรดแบ็กเอนด์",
|
||||
"DialogSettingsBackendThreadingWarningMessage": "รียูจินซ์ ต้องรีสตาร์ทหลังจากเปลี่ยนตัวเลือกนี้จึงจะใช้งานได้อย่างสมบูรณ์ คุณอาจต้องปิดการใช้งาน มัลติเธรด ของไดรเวอร์ของคุณด้วยตนเองเมื่อใช้ รียูจินซ์ ทั้งนี้ขึ้นอยู่กับแพลตฟอร์มของคุณ",
|
||||
"DialogModManagerDeletionWarningMessage": "คุณกำลังจะลบ ม็อด: {0}\n\nคุณแน่ใจหรือไม่ว่าต้องการดำเนินการต่อ?",
|
||||
"DialogModManagerDeletionAllWarningMessage": "คุณกำลังจะลบม็อดทั้งหมดสำหรับชื่อนี้\n\nคุณแน่ใจหรือไม่ว่าต้องการดำเนินการต่อ?",
|
||||
"SettingsTabGraphicsFeaturesOptions": "คุณสมบัติ",
|
||||
"SettingsTabGraphicsBackendMultithreading": "มัลติเธรด แบ็กเอนด์กราฟิก:",
|
||||
"CommonAuto": "อัตโนมัติ",
|
||||
"CommonOff": "ปิดการใช้งาน",
|
||||
"CommonOn": "เปิดใช้งาน",
|
||||
"InputDialogYes": "ใช่",
|
||||
"InputDialogNo": "ไม่ใช่",
|
||||
"DialogProfileInvalidProfileNameErrorMessage": "ชื่อไฟล์ประกอบด้วยอักขระที่ไม่ถูกต้อง กรุณาลองอีกครั้ง",
|
||||
"MenuBarOptionsPauseEmulation": "หยุดชั่วคราว",
|
||||
"MenuBarOptionsResumeEmulation": "ดำเนินการต่อ",
|
||||
"AboutUrlTooltipMessage": "คลิกเพื่อเปิดเว็บไซต์ รียูจินซ์ บนเบราว์เซอร์เริ่มต้นของคุณ",
|
||||
"AboutDisclaimerMessage": "ทางผู้พัฒนาโปรแกรม รียูจินซ์ ไม่มีส่วนเกี่ยวข้องกับทางบริษัท Nintendo™\nหรือพันธมิตรใดๆ ทั้งสิ้น!",
|
||||
"AboutAmiiboDisclaimerMessage": "AmiiboAPI (www.amiiboapi.com) ถูกใช้\nในการจำลอง อะมิโบ ของเรา",
|
||||
"AboutPatreonUrlTooltipMessage": "คลิกเพื่อเปิดหน้า เพทรีออน ของ รียูจินซ์ บนเบราว์เซอร์เริ่มต้นของคุณ",
|
||||
"AboutGithubUrlTooltipMessage": "คลิกเพื่อเปิดหน้า กิตฮับ ของ ริวจินซ์ บนเบราว์เซอร์เริ่มต้นของคุณ",
|
||||
"AboutDiscordUrlTooltipMessage": "คลิกเพื่อเปิดคำเชิญเข้าสู่เซิร์ฟเวอร์ ดิสคอร์ด ของ รียูจินซ์ บนเบราว์เซอร์เริ่มต้นของคุณ",
|
||||
"AboutTwitterUrlTooltipMessage": "คลิกเพื่อเปิดหน้าเพจ ทวิตเตอร์ ของ รียูจินซ์ บนเบราว์เซอร์เริ่มต้นของคุณ",
|
||||
"AboutRyujinxAboutTitle": "เกี่ยวกับ:",
|
||||
"AboutRyujinxAboutContent": "รียูจินซ์ เป็นอีมูเลเตอร์สำหรับ Nintendo Switch™\nโปรดสนับสนุนเราบน เพทรีออน\nรับข่าวสารล่าสุดทั้งหมดบน ทวิตเตอร์ หรือ ดิสคอร์ด ของเรา\nนักพัฒนาที่สนใจจะมีส่วนร่วมสามารถดูข้อมูลเพิ่มเติมได้ที่ กิตฮับ หรือ ดิสคอร์ด ของเรา",
|
||||
"AboutRyujinxMaintainersTitle": "ได้รับการดูแลรักษาโดย:",
|
||||
"AboutRyujinxMaintainersContentTooltipMessage": "คลิกเพื่อเปิดหน้าผู้ร่วมให้ข้อมูลในเบราว์เซอร์เริ่มต้นของคุณ",
|
||||
"AboutRyujinxSupprtersTitle": "สนับสนุนบน เพทรีออน โดย:",
|
||||
"AmiiboSeriesLabel": "อะมิโบซีรีส์",
|
||||
"AmiiboCharacterLabel": "ตัวละคร",
|
||||
"AmiiboScanButtonLabel": "สแกนเลย",
|
||||
"AmiiboOptionsShowAllLabel": "แสดง อะมิโบ ทั้งหมด",
|
||||
"AmiiboOptionsUsRandomTagLabel": "แฮ็ค: ใช้แท็กสุ่ม Uuid",
|
||||
"DlcManagerTableHeadingEnabledLabel": "เปิดใช้งานแล้ว",
|
||||
"DlcManagerTableHeadingTitleIdLabel": "ชื่อไอดี",
|
||||
"DlcManagerTableHeadingContainerPathLabel": "ที่เก็บไฟล์ คอนเทนเนอร์",
|
||||
"DlcManagerTableHeadingFullPathLabel": "ที่เก็บไฟล์แบบเต็ม",
|
||||
"DlcManagerRemoveAllButton": "ลบทั้งหมด",
|
||||
"DlcManagerEnableAllButton": "เปิดใช้งานทั้งหมด",
|
||||
"DlcManagerDisableAllButton": "ปิดใช้งานทั้งหมด",
|
||||
"ModManagerDeleteAllButton": "ลบทั้งหมด",
|
||||
"MenuBarOptionsChangeLanguage": "เปลี่ยนภาษา",
|
||||
"MenuBarShowFileTypes": "แสดงประเภทของไฟล์",
|
||||
"CommonSort": "เรียงลำดับ",
|
||||
"CommonShowNames": "แสดงชื่อ",
|
||||
"CommonFavorite": "สิ่งที่ชื่นชอบ",
|
||||
"OrderAscending": "จากน้อยไปมาก",
|
||||
"OrderDescending": "จากมากไปน้อย",
|
||||
"SettingsTabGraphicsFeatures": "คุณสมบัติ และ การเพิ่มประสิทธิภาพ",
|
||||
"ErrorWindowTitle": "หน้าต่างแสดงข้อผิดพลาด",
|
||||
"ToggleDiscordTooltip": "เลือกว่าจะแสดง รียูจินซ์ ในกิจกรรม ดิสคอร์ด \"ที่กำลังเล่นอยู่\" ของคุณหรือไม่?",
|
||||
"AddGameDirBoxTooltip": "ป้อนไดเรกทอรี่เกมที่จะทำการเพิ่มลงในรายการ",
|
||||
"AddGameDirTooltip": "เพิ่มไดเรกทอรี่เกมลงในรายการ",
|
||||
"RemoveGameDirTooltip": "ลบไดเรกทอรี่เกมที่เลือก",
|
||||
"CustomThemeCheckTooltip": "ใช้ธีม Avalonia แบบกำหนดเองสำหรับ GUI เพื่อเปลี่ยนรูปลักษณ์ของเมนูโปรแกรมจำลอง",
|
||||
"CustomThemePathTooltip": "ไปยังที่เก็บไฟล์ธีม GUI แบบกำหนดเอง",
|
||||
"CustomThemeBrowseTooltip": "เรียกดูธีม GUI ที่กำหนดเอง",
|
||||
"DockModeToggleTooltip": "ด็อกโหมดทำให้ระบบจำลองการทำงานเสมือน Nintendo ที่กำลังเชื่อมต่ออยู่ด็อก สิ่งนี้จะปรับปรุงความเสถียรภาพของกราฟิกในเกมส่วนใหญ่ ในทางกลับกัน การปิดใช้จะทำให้ระบบจำลองทำงานเหมือนกับ Nintendo Switch แบบพกพา ส่งผลให้คุณภาพกราฟิกลดลง\n\nกำหนดค่าส่วนควบคุมของผู้เล่น 1 หากวางแผนที่จะใช้ด็อกโหมด กำหนดค่าการควบคุมแบบ แฮนด์เฮลด์ หากวางแผนที่จะใช้โหมดแฮนด์เฮลด์\n\nเปิดทิ้งไว้หากคุณไม่แน่ใจ",
|
||||
"DirectKeyboardTooltip": "รองรับการเข้าถึงแป้นพิมพ์โดยตรง (HID) ให้เกมเข้าถึงคีย์บอร์ดของคุณเป็นอุปกรณ์ป้อนข้อความ\n\nใช้งานได้กับเกมที่รองรับการใช้งานคีย์บอร์ดบนฮาร์ดแวร์ของ Switch เท่านั้น\n\nหากคุณไม่แน่ใจปล่อยให้ปิดอย่างนั้น",
|
||||
"DirectMouseTooltip": "รองรับการเข้าถึงเมาส์โดยตรง (HID) ให้เกมเข้าถึงเมาส์ของคุณเป็นอุปกรณ์ชี้ตำแหน่ง\n\nใช้งานได้เฉพาะกับเกมที่รองรับการควบคุมเมาส์บนฮาร์ดแวร์ของ Switch เท่านั้น ซึ่งมีอยู่ไม่มากนัก\n\nเมื่อเปิดใช้งาน ฟังก์ชั่นหน้าจอสัมผัสอาจไม่ทำงาน\n\nหากคุณไม่แน่ใจปล่อยให้ปิดอย่างนั้น",
|
||||
"RegionTooltip": "เปลี่ยนภูมิภาคของระบบ",
|
||||
"LanguageTooltip": "เปลี่ยนภาษาของระบบ",
|
||||
"TimezoneTooltip": "เปลี่ยนโซนเวลาของระบบ",
|
||||
"TimeTooltip": "เปลี่ยนเวลาของระบบ",
|
||||
"VSyncToggleTooltip": "Vertical Sync ของคอนโซลจำลอง โดยพื้นฐานแล้วเป็นตัวจำกัดเฟรมสำหรับเกมส่วนใหญ่ การปิดใช้งานอาจทำให้เกมทำงานด้วยความเร็วสูงขึ้น หรือทำให้หน้าจอการโหลดใช้เวลานานขึ้นหรือค้าง\n\nสามารถสลับได้ในเกมด้วยปุ่มลัดตามที่คุณต้องการ (F1 เป็นค่าเริ่มต้น) เราขอแนะนำให้ทำเช่นนี้หากคุณวางแผนที่จะปิดการใช้งาน\n\nหากคุณไม่แน่ใจให้ปล่อยไว้อย่างนั้น",
|
||||
"PptcToggleTooltip": "บันทึกฟังก์ชั่น JIT ที่แปลแล้ว ดังนั้นจึงไม่จำเป็นต้องแปลทุกครั้งที่โหลดเกม\n\nลดอาการกระตุกและเร่งความเร็วการบูตได้อย่างมากหลังจากการบูตครั้งแรกของเกม\n\nปล่อยไว้หากคุณไม่แน่ใจ",
|
||||
"FsIntegrityToggleTooltip": "ตรวจสอบไฟล์ที่เสียหายเมื่อบูตเกม และหากตรวจพบไฟล์ที่เสียหาย จะแสดงข้อผิดพลาดของแฮชในบันทึก\n\nไม่มีผลกระทบต่อประสิทธิภาพการทำงานและมีไว้เพื่อช่วยในการแก้ไขปัญหา\n\nปล่อยไว้หากคุณไม่แน่ใจ",
|
||||
"AudioBackendTooltip": "เปลี่ยนแบ็กเอนด์ที่ใช้ในการเรนเดอร์เสียง\n\nSDL2 เป็นที่ต้องการ ในขณะที่ OpenAL และ SoundIO ถูกใช้เป็นทางเลือกสำรอง ดัมมี่จะไม่มีเสียง\n\nปล่อยไว้หากคุณไม่แน่ใจ",
|
||||
"MemoryManagerTooltip": "เปลี่ยนวิธีการแมปและเข้าถึงหน่วยความจำของผู้เยี่ยมชม ส่งผลอย่างมากต่อประสิทธิภาพการทำงานของ CPU ที่จำลอง\n\nตั้งค่าเป็น ไม่ทำการตรวจสอบ โฮสต์ หากคุณไม่แน่ใจ",
|
||||
"MemoryManagerSoftwareTooltip": "ใช้ตารางหน้าซอฟต์แวร์สำหรับการแปลที่อยู่ ความแม่นยำสูงสุดแต่ประสิทธิภาพช้าที่สุด",
|
||||
"MemoryManagerHostTooltip": "แมปหน่วยความจำในพื้นที่ที่อยู่โฮสต์โดยตรง การคอมไพล์และดำเนินการ JIT เร็วขึ้นมาก",
|
||||
"MemoryManagerUnsafeTooltip": "แมปหน่วยความจำโดยตรง แต่อย่าปิดบังที่อยู่ภายในพื้นที่ที่อยู่ของผู้เยี่ยมชมก่อนที่จะเข้าถึง เร็วกว่า แต่ต้องแลกกับความปลอดภัย แอปพลิเคชั่นผู้เยี่ยมชมสามารถเข้าถึงหน่วยความจำได้จากทุกที่ใน รียูจินซ์ ดังนั้นให้รันเฉพาะโปรแกรมที่คุณเชื่อถือในโหมดนี้",
|
||||
"UseHypervisorTooltip": "ใช้ Hypervisor แทน JIT ปรับปรุงประสิทธิภาพอย่างมากเมื่อพร้อมใช้งาน แต่อาจไม่เสถียรในสถานะปัจจุบัน",
|
||||
"DRamTooltip": "ใช้เค้าโครง MemoryMode ทางเลือกเพื่อเลียนแบบโมเดลการพัฒนาสวิตช์\n\nสิ่งนี้มีประโยชน์สำหรับแพ็กพื้นผิวที่มีความละเอียดสูงกว่าหรือม็อดที่มีความละเอียด 4k เท่านั้น ไม่ปรับปรุงประสิทธิภาพ\n\nปล่อยให้ปิดหากคุณไม่แน่ใจ",
|
||||
"IgnoreMissingServicesTooltip": "ละเว้นบริการ Horizon OS ที่ยังไม่ได้ใช้งาน วิธีนี้อาจช่วยในการหลีกเลี่ยงข้อผิดพลาดเมื่อบู๊ตเกมบางเกม\n\nปล่อยให้ปิดหากคุณไม่แน่ใจ",
|
||||
"GraphicsBackendThreadingTooltip": "ดำเนินการคำสั่งแบ็กเอนด์กราฟิกบนเธรดที่สอง\n\nเร่งความเร็วการคอมไพล์เชเดอร์ ลดการกระตุก และปรับปรุงประสิทธิภาพการทำงานของไดรเวอร์ GPU โดยไม่ต้องรองรับมัลติเธรดในตัว ประสิทธิภาพที่ดีขึ้นเล็กน้อยสำหรับไดรเวอร์ที่มีมัลติเธรด\n\nตั้งเป็น อัตโนมัติ หากคุณไม่แน่ใจ",
|
||||
"GalThreadingTooltip": "ดำเนินการคำสั่งแบ็กเอนด์กราฟิกบนเธรดที่สอง\n\nเร่งความเร็วการคอมไพล์เชเดอร์ ลดการกระตุก และปรับปรุงประสิทธิภาพการทำงานของไดรเวอร์ GPU โดยไม่ต้องรองรับมัลติเธรดในตัว ประสิทธิภาพที่ดีขึ้นเล็กน้อยสำหรับไดรเวอร์ที่มีมัลติเธรด\n\nตั้งเป็น อัตโนมัติ หากคุณไม่แน่ใจ",
|
||||
"ShaderCacheToggleTooltip": "บันทึกแคชเชเดอร์ของดิสก์ซึ่งช่วยลดการกระตุกในการรันครั้งต่อๆ ไป\n\nปล่อยไว้หากคุณไม่แน่ใจ",
|
||||
"ResolutionScaleTooltip": "คูณความละเอียดการเรนเดอร์ของเกม\n\nเกมบางเกมอาจไม่สามารถใช้งานได้และดูเป็นพิกเซลแม้ว่าความละเอียดจะเพิ่มขึ้นก็ตาม สำหรับเกมเหล่านั้น คุณอาจต้องค้นหาม็อดที่ลบรอยหยักของภาพหรือเพิ่มความละเอียดในการเรนเดอร์ภายใน หากต้องการใช้อย่างหลัง คุณอาจต้องเลือก Native\n\nตัวเลือกนี้สามารถเปลี่ยนแปลงได้ในขณะที่เกมกำลังทำงานอยู่โดยคลิก \"นำมาใช้\" ด้านล่าง คุณสามารถย้ายหน้าต่างการตั้งค่าไปด้านข้างและทดลองจนกว่าคุณจะพบรูปลักษณ์ที่คุณต้องการสำหรับเกม\n\nโปรดทราบว่า 4x นั้นเกินความจำเป็นสำหรับการตั้งค่าแทบทุกประเภท",
|
||||
"ResolutionScaleEntryTooltip": "สเกลความละเอียดจุดทศนิยม เช่น 1.5 ไม่ใช่จำนวนเต็มของสเกล มีแนวโน้มที่จะก่อให้เกิดปัญหาหรือความผิดพลาดได้",
|
||||
"AnisotropyTooltip": "ระดับของการกรองแบบ Anisotropic ตั้งค่าเป็นอัตโนมัติเพื่อใช้ค่าที่เกมร้องขอ",
|
||||
"AspectRatioTooltip": "อัตราส่วนภาพที่ใช้กับหน้าต่างตัวแสดงภาพ\n\nเปลี่ยนสิ่งนี้หากคุณใช้ตัวดัดแปลงอัตราส่วนกว้างยาวสำหรับเกมของคุณ ไม่เช่นนั้นกราฟิกจะถูกยืดออก\n\nทิ้งไว้ที่ 16:9 หากไม่แน่ใจ",
|
||||
"ShaderDumpPathTooltip": "ที่เก็บ ดัมพ์ไฟล์ของ เชเดอร์กราฟิก",
|
||||
"FileLogTooltip": "บันทึกการบันทึกคอนโซลลงในไฟล์บันทึกบนดิสก์ จะไม่ส่งผลกระทบต่อประสิทธิภาพการทำงาน",
|
||||
"StubLogTooltip": "พิมพ์ข้อความบันทึกต้นขั้วในคอนโซล จะไม่ส่งผลกระทบต่อประสิทธิภาพการทำงาน",
|
||||
"InfoLogTooltip": "พิมพ์ข้อความบันทึกข้อมูลในคอนโซล จะไม่ส่งผลกระทบต่อประสิทธิภาพการทำงาน",
|
||||
"WarnLogTooltip": "พิมพ์ข้อความบันทึกแจ้งตือนในคอนโซล จะไม่ส่งผลกระทบต่อประสิทธิภาพการทำงาน",
|
||||
"ErrorLogTooltip": "พิมพ์ข้อความบันทึกข้อผิดพลาดในคอนโซล จะไม่ส่งผลกระทบต่อประสิทธิภาพการทำงาน",
|
||||
"TraceLogTooltip": "พิมพ์ข้อความบันทึกการติดตามในคอนโซล ไม่ส่งผลกระทบต่อประสิทธิภาพการทำงาน",
|
||||
"GuestLogTooltip": "พิมพ์ข้อความบันทึกของผู้เยี่ยมชมในคอนโซล ไม่ส่งผลกระทบต่อประสิทธิภาพการทำงาน",
|
||||
"FileAccessLogTooltip": "พิมพ์ข้อความบันทึกการเข้าถึงไฟล์ในคอนโซล",
|
||||
"FSAccessLogModeTooltip": "เปิดใช้งานเอาต์พุตบันทึกการเข้าถึง FS ไปยังคอนโซล โหมดที่เป็นไปได้คือ 0-3",
|
||||
"DeveloperOptionTooltip": "โปรดใช้ด้วยความระมัดระวัง",
|
||||
"OpenGlLogLevel": "จำเป็นต้องเปิดใช้งานระดับบันทึกที่เหมาะสม",
|
||||
"DebugLogTooltip": "พิมพ์ข้อความบันทึกการแก้ไขข้อบกพร่องในคอนโซล\n\nใช้สิ่งนี้เฉพาะเมื่อได้รับคำแนะนำจากเจ้าหน้าที่โดยเฉพาะเท่านั้น เนื่องจากจะทำให้บันทึกอ่านยากและทำให้ประสิทธิภาพของโปรแกรมจำลองแย่ลง",
|
||||
"LoadApplicationFileTooltip": "เปิด File Explorer เพื่อเลือกไฟล์ที่เข้ากันได้กับ Switch ที่จะโหลด",
|
||||
"LoadApplicationFolderTooltip": "เปิดตัวสำรวจไฟล์เพื่อเลือกไฟล์ที่เข้ากันได้กับ Switch ที่จะโหลด",
|
||||
"OpenRyujinxFolderTooltip": "เปิดโฟลเดอร์ระบบไฟล์ รียูจินซ์",
|
||||
"OpenRyujinxLogsTooltip": "เปิดโฟลเดอร์ที่มีการเขียนบันทึก",
|
||||
"ExitTooltip": "ออกจากโปรแกรม รียูจินซ์",
|
||||
"OpenSettingsTooltip": "เปิดหน้าต่างการตั้งค่า",
|
||||
"OpenProfileManagerTooltip": "เปิดหน้าต่างตัวจัดการโปรไฟล์ผู้ใช้",
|
||||
"StopEmulationTooltip": "หยุดการจำลองเกมปัจจุบันและกลับไปยังการเลือกเกม",
|
||||
"CheckUpdatesTooltip": "ตรวจสอบการอัปเดตของ รียูจินซ์",
|
||||
"OpenAboutTooltip": "เปิดหน้าต่าง เกี่ยวกับ",
|
||||
"GridSize": "ขนาดตาราง",
|
||||
"GridSizeTooltip": "เปลี่ยนขนาด ของตาราง",
|
||||
"SettingsTabSystemSystemLanguageBrazilianPortuguese": "บราซิล โปรตุเกส",
|
||||
"AboutRyujinxContributorsButtonHeader": "ดูผู้มีส่วนร่วมทั้งหมด",
|
||||
"SettingsTabSystemAudioVolume": "ระดับเสียง: ",
|
||||
"AudioVolumeTooltip": "ปรับระดับเสียง",
|
||||
"SettingsTabSystemEnableInternetAccess": "การเข้าถึงอินเทอร์เน็ตของผู้เยี่ยมชม/โหมด LAN",
|
||||
"EnableInternetAccessTooltip": "อนุญาตให้แอปพลิเคชันจำลองเชื่อมต่ออินเทอร์เน็ต\n\nเกมที่มีโหมด LAN สามารถเชื่อมต่อระหว่างกันได้เมื่อเปิดใช้งานและระบบเชื่อมต่อกับจุดเชื่อมต่อเดียวกัน รวมถึงคอนโซลจริงด้วย\n\nไม่อนุญาตให้มีการเชื่อมต่อกับเซิร์ฟเวอร์ Nintendo อาจทำให้เกิดการหยุดทำงานในบางเกมที่พยายามเชื่อมต่ออินเทอร์เน็ต\n\nปล่อยให้ปิดหากคุณไม่แน่ใจ",
|
||||
"GameListContextMenuManageCheatToolTip": "ฟังชั่นจัดการสูตรโกง",
|
||||
"GameListContextMenuManageCheat": "จัดการสูตรโกง",
|
||||
"GameListContextMenuManageModToolTip": "จัดการ ม็อด",
|
||||
"GameListContextMenuManageMod": "จัดการ ม็อด",
|
||||
"ControllerSettingsStickRange": "ขอบเขต:",
|
||||
"DialogStopEmulationTitle": "รียูจินซ์ - หยุดการจำลอง",
|
||||
"DialogStopEmulationMessage": "คุณแน่ใจหรือไม่ว่าต้องการหยุดการจำลองหรือไม่?",
|
||||
"SettingsTabCpu": "หน่วยประมวลผลกลาง",
|
||||
"SettingsTabAudio": "เสียง",
|
||||
"SettingsTabNetwork": "เครือข่าย",
|
||||
"SettingsTabNetworkConnection": "การเชื่อมต่อเครือข่าย",
|
||||
"SettingsTabCpuCache": "ซีพียู แคช",
|
||||
"SettingsTabCpuMemory": "ซีพียูเมมโมรี่ แคช",
|
||||
"DialogUpdaterFlatpakNotSupportedMessage": "โปรดอัปเดต รียูจินซ์ ผ่านช่องทาง FlatHub",
|
||||
"UpdaterDisabledWarningTitle": "ปิดใช้งานการอัปเดตแล้ว!",
|
||||
"ControllerSettingsRotate90": "หมุน 90 องศา ตามเข็มนาฬิกา",
|
||||
"IconSize": "ขนาดไอคอน",
|
||||
"IconSizeTooltip": "เปลี่ยนขนาดของไอคอนเกม",
|
||||
"MenuBarOptionsShowConsole": "แสดง คอนโซล",
|
||||
"ShaderCachePurgeError": "เกิดข้อผิดพลาดในการล้างแคชเชเดอร์ {0}: {1}",
|
||||
"UserErrorNoKeys": "ไม่พบคีย์",
|
||||
"UserErrorNoFirmware": "ไม่พบเฟิร์มแวร์",
|
||||
"UserErrorFirmwareParsingFailed": "เกิดข้อผิดพลาดในการแยกวิเคราะห์เฟิร์มแวร์",
|
||||
"UserErrorApplicationNotFound": "ไม่พบแอปพลิเคชัน",
|
||||
"UserErrorUnknown": "ข้อผิดพลาดที่ไม่รู้จัก",
|
||||
"UserErrorUndefined": "ข้อผิดพลาดที่ไม่ได้ระบุ",
|
||||
"UserErrorNoKeysDescription": "รียูจินซ์ ไม่พบไฟล์ 'prod.keys' ของคุณ",
|
||||
"UserErrorNoFirmwareDescription": "รียูจินซ์ ไม่พบเฟิร์มแวร์ที่ติดตั้งไว้",
|
||||
"UserErrorFirmwareParsingFailedDescription": "รียูจินซ์ ไม่สามารถแยกวิเคราะห์เฟิร์มแวร์ที่ให้มาได้ ซึ่งมักมีสาเหตุมาจากคีย์ที่ล้าสมัย",
|
||||
"UserErrorApplicationNotFoundDescription": "รียูจินซ์ ไม่พบแอปพลิเคชันที่ถูกต้องในที่เก็บไฟล์ที่กำหนด",
|
||||
"UserErrorUnknownDescription": "เกิดข้อผิดพลาดที่ไม่รู้จักเกิดขึ้น!",
|
||||
"UserErrorUndefinedDescription": "เกิดข้อผิดพลาดที่ไม่สามารถระบุได้! สิ่งนี้ไม่ควรเกิดขึ้น โปรดติดต่อผู้พัฒนา!",
|
||||
"OpenSetupGuideMessage": "เปิดคู่มือการตั้งค่า",
|
||||
"NoUpdate": "ไม่มีการอัพเดต",
|
||||
"TitleUpdateVersionLabel": "เวอร์ชั่น {0}",
|
||||
"RyujinxInfo": "รียูจินซ์ – ข้อมูล",
|
||||
"RyujinxConfirm": "รียูจินซ์ - ยืนยัน",
|
||||
"FileDialogAllTypes": "ทุกประเภท",
|
||||
"Never": "ไม่มี",
|
||||
"SwkbdMinCharacters": "ต้องมีความยาวของตัวอักษรอย่างน้อย {0} ตัว",
|
||||
"SwkbdMinRangeCharacters": "ต้องมีความยาวของตัวอักษร {0}-{1} ตัว",
|
||||
"SoftwareKeyboard": "ซอฟต์แวร์ ของคีย์บอร์ด",
|
||||
"SoftwareKeyboardModeNumeric": "ต้องเป็น 0-9 หรือ '.' เท่านั้น",
|
||||
"SoftwareKeyboardModeAlphabet": "ต้องเป็นตัวอักษรที่ไม่ใช่ CJK เท่านั้น",
|
||||
"SoftwareKeyboardModeASCII": "ต้องเป็นตัวอักษร ASCII เท่านั้น",
|
||||
"ControllerAppletControllers": "คอนโทรลเลอร์ที่รองรับ:",
|
||||
"ControllerAppletPlayers": "ผู้เล่น:",
|
||||
"ControllerAppletDescription": "การกำหนดค่าปัจจุบันของคุณไม่ถูกต้อง เปิดการตั้งค่าและกำหนดค่าอินพุตของคุณใหม่",
|
||||
"ControllerAppletDocked": "ตั้งค่าด็อกโหมด ควรปิดใช้งานการควบคุมแบบแฮนด์เฮลด์",
|
||||
"UpdaterRenaming": "กำลังเปลี่ยนชื่อไฟล์เก่า...",
|
||||
"UpdaterRenameFailed": "โปรแกรมอัปเดตไม่สามารถเปลี่ยนชื่อไฟล์ได้: {0}",
|
||||
"UpdaterAddingFiles": "กำลังเพิ่มไฟล์ใหม่...",
|
||||
"UpdaterExtracting": "กำลังแยกการอัปเดต...",
|
||||
"UpdaterDownloading": "กำลังดาวน์โหลดอัปเดต...",
|
||||
"Game": "เกมส์",
|
||||
"Docked": "ด็อก",
|
||||
"Handheld": "แฮนด์เฮลด์",
|
||||
"ConnectionError": "การเชื่อมต่อล้มเหลว",
|
||||
"AboutPageDeveloperListMore": "{0} และอื่น ๆ...",
|
||||
"ApiError": "ข้อผิดพลาดของ API",
|
||||
"LoadingHeading": "กำลังโหลด {0}",
|
||||
"CompilingPPTC": "กำลังคอมไพล์ PTC",
|
||||
"CompilingShaders": "กำลังคอมไพล์ เชเดอร์",
|
||||
"AllKeyboards": "คีย์บอร์ดทั้งหมด",
|
||||
"OpenFileDialogTitle": "เลือกไฟล์ที่สนับสนุนเพื่อเปิด",
|
||||
"OpenFolderDialogTitle": "เลือกโฟลเดอร์ที่มีเกมที่แตกไฟล์แล้ว",
|
||||
"AllSupportedFormats": "รูปแบบที่รองรับทั้งหมด",
|
||||
"RyujinxUpdater": "อัพเดต รียูจินซ์",
|
||||
"SettingsTabHotkeys": "ปุ่มลัดของคีย์บอร์ด",
|
||||
"SettingsTabHotkeysHotkeys": "ปุ่มลัดของคีย์บอร์ด",
|
||||
"SettingsTabHotkeysToggleVsyncHotkey": "สลับเป็น VSync:",
|
||||
"SettingsTabHotkeysScreenshotHotkey": "ภาพหน้าจอ:",
|
||||
"SettingsTabHotkeysShowUiHotkey": "แสดง UI:",
|
||||
"SettingsTabHotkeysPauseHotkey": "หยุดชั่วคราว:",
|
||||
"SettingsTabHotkeysToggleMuteHotkey": "ปิดเสียง:",
|
||||
"ControllerMotionTitle": "การตั้งค่าการควบคุมการเคลื่อนไหว",
|
||||
"ControllerRumbleTitle": "ตั้งค่าการสั่นไหว",
|
||||
"SettingsSelectThemeFileDialogTitle": "เลือกไฟล์ธีม",
|
||||
"SettingsXamlThemeFile": "ไฟล์ธีมรูปแบบ XAML",
|
||||
"AvatarWindowTitle": "จัดการบัญชี - อวาต้า",
|
||||
"Amiibo": "อะมิโบ",
|
||||
"Unknown": "ไม่รู้จัก",
|
||||
"Usage": "การใช้งาน",
|
||||
"Writable": "สามารถเขียนได้",
|
||||
"SelectDlcDialogTitle": "เลือกไฟล์ DLC",
|
||||
"SelectUpdateDialogTitle": "เลือกไฟล์อัพเดต",
|
||||
"SelectModDialogTitle": "เลือกไดเรกทอรี ม็อด",
|
||||
"UserProfileWindowTitle": "จัดการโปรไฟล์ผู้ใช้",
|
||||
"CheatWindowTitle": "จัดการสูตรโกง",
|
||||
"DlcWindowTitle": "จัดการเนื้อหาที่ดาวน์โหลดได้สำหรับ {0} ({1})",
|
||||
"UpdateWindowTitle": "จัดการการอัพเดตชื่อเรื่อง",
|
||||
"CheatWindowHeading": "สูตรโกงมีให้สำหรับ {0} [{1}]",
|
||||
"BuildId": "รหัสบิวด์:",
|
||||
"DlcWindowHeading": "{0} เนื้อหาที่สามารถดาวน์โหลดได้",
|
||||
"ModWindowHeading": "{0} ม็อด",
|
||||
"UserProfilesEditProfile": "แก้ไขที่เลือกแล้ว",
|
||||
"Cancel": "ยกเลิก",
|
||||
"Save": "บันทึก",
|
||||
"Discard": "ละทิ้ง",
|
||||
"Paused": "หยุดชั่วคราว",
|
||||
"UserProfilesSetProfileImage": "ตั้งค่ารูปโปรไฟล์",
|
||||
"UserProfileEmptyNameError": "จำเป็นต้องมีการระบุชื่อ",
|
||||
"UserProfileNoImageError": "จำเป็นต้องตั้งค่ารูปโปรไฟล์",
|
||||
"GameUpdateWindowHeading": "จัดการอัพเดตสำหรับ {0} ({1})",
|
||||
"SettingsTabHotkeysResScaleUpHotkey": "เพิ่มความละเอียด:",
|
||||
"SettingsTabHotkeysResScaleDownHotkey": "ลดความละเอียด:",
|
||||
"UserProfilesName": "ชื่อ:",
|
||||
"UserProfilesUserId": "รหัสผู้ใช้:",
|
||||
"SettingsTabGraphicsBackend": "แบ็กเอนด์กราฟิก",
|
||||
"SettingsTabGraphicsBackendTooltip": "เลือกแบ็กเอนด์กราฟิกที่จะใช้ในโปรแกรมจำลอง\n\nโดยรวมแล้ว Vulkan นั้นดีกว่าสำหรับกราฟิกการ์ดรุ่นใหม่ทั้งหมด ตราบใดที่ไดรเวอร์ยังอัพเดทอยู่เสมอ Vulkan ยังมีคุณสมบัติการคอมไพล์เชเดอร์ที่เร็วขึ้น (ลดอาการกระตุก) ของผู้จำหน่าย GPU ทุกรายอยู่แล้ว\n\nOpenGL อาจได้รับผลลัพธ์ที่ดีกว่าบน Nvidia GPU รุ่นเก่า, AMD GPU รุ่นเก่าบน Linux หรือบน GPU ที่มี VRAM ต่ำกว่า แม้ว่าการคอมไพล์เชเดอร์จะสะดุดมากขึ้นก็ตาม\n\nตั้งค่าเป็น Vulkan หากไม่แน่ใจ ตั้งค่าเป็น OpenGL หาก GPU ของคุณไม่รองรับ Vulkan แม้จะมีไดรเวอร์กราฟิกล่าสุดก็ตาม",
|
||||
"SettingsEnableTextureRecompression": "เปิดใช้งานการบีบอัดพื้นผิวอีกครั้ง",
|
||||
"SettingsEnableTextureRecompressionTooltip": "บีบอัดพื้นผิว ASTC เพื่อลดการใช้งาน VRAM\n\nเกมที่ใช้รูปแบบพื้นผิวนี้ ได้แก่ Astral Chain, Bayonetta 3, Fire Emblem Engage, Metroid Prime Remastered, Super Mario Bros. Wonder และ The Legend of Zelda: Tears of the Kingdom\n\nกราฟิกการ์ดที่มี 4 กิกะไบต์ VRAM หรือน้อยกว่ามีแนวโน้มที่จะให้แคชในบางจุดขณะเล่นเกมเหล่านี้\n\nเปิดใช้งานเฉพาะในกรณีที่ VRAM ของคุณใกล้หมดในเกมที่กล่าวมาข้างต้น ปล่อยให้ปิดหากไม่แน่ใจ",
|
||||
"SettingsTabGraphicsPreferredGpu": "GPU ที่ต้องการ",
|
||||
"SettingsTabGraphicsPreferredGpuTooltip": "เลือกกราฟิกการ์ดที่จะใช้กับแบ็กเอนด์กราฟิก Vulkan\n\nไม่ส่งผลต่อ GPU ที่ OpenGL จะใช้\n\nตั้งค่าเป็น GPU ที่ถูกตั้งค่าสถานะเป็น \"dGPU\" หากคุณไม่แน่ใจ หากไม่มีก็ปล่อยทิ้งไว้โดยไม่มีใครแตะต้องมัน",
|
||||
"SettingsAppRequiredRestartMessage": "จำเป็นต้องรีสตาร์ท รียูจินซ์",
|
||||
"SettingsGpuBackendRestartMessage": "การตั้งค่ากราฟิกแบ็กเอนด์หรือ GPU ได้รับการแก้ไขแล้ว สิ่งนี้จะต้องมีการรีสตาร์ทจึงจะสามารถใช้งานได้",
|
||||
"SettingsGpuBackendRestartSubMessage": "คุณต้องการรีสตาร์ทตอนนี้หรือไม่?",
|
||||
"RyujinxUpdaterMessage": "คุณต้องการอัพเดต รียูจินซ์ เป็นเวอร์ชั่นล่าสุดหรือไม่?",
|
||||
"SettingsTabHotkeysVolumeUpHotkey": "เพิ่มระดับเสียง:",
|
||||
"SettingsTabHotkeysVolumeDownHotkey": "ลดระดับเสียง:",
|
||||
"SettingsEnableMacroHLE": "เปิดใช้งาน มาโคร HLE",
|
||||
"SettingsEnableMacroHLETooltip": "การจำลองระดับสูงของโค้ดมาโคร GPU\n\nปรับปรุงประสิทธิภาพ แต่อาจทำให้เกิดข้อผิดพลาดด้านกราฟิกในบางเกม\n\nปล่อยไว้หากคุณไม่แน่ใจ",
|
||||
"SettingsEnableColorSpacePassthrough": "ทะลุผ่านพื้นที่สี",
|
||||
"SettingsEnableColorSpacePassthroughTooltip": "สั่งให้แบ็กเอนด์ Vulkan ส่งผ่านข้อมูลสีโดยไม่ต้องระบุค่าของสี สำหรับผู้ใช้ที่มีการแสดงกระจายตัวของสี อาจส่งผลให้สีสดใสมากขึ้น โดยต้องแลกกับความถูกต้องของสี",
|
||||
"VolumeShort": "ระดับเสียง",
|
||||
"UserProfilesManageSaves": "จัดการบันทึก",
|
||||
"DeleteUserSave": "คุณต้องการลบบันทึกผู้ใช้สำหรับเกมนี้หรือไม่?",
|
||||
"IrreversibleActionNote": "การดำเนินการนี้ไม่สามารถย้อนกลับได้",
|
||||
"SaveManagerHeading": "จัดการบันทึกสำหรับ {0} ({1})",
|
||||
"SaveManagerTitle": "จัดการบันทึก",
|
||||
"Name": "ชื่อ",
|
||||
"Size": "ขนาด",
|
||||
"Search": "ค้นหา",
|
||||
"UserProfilesRecoverLostAccounts": "กู้คืนบัญชีที่สูญหาย",
|
||||
"Recover": "กู้คืน",
|
||||
"UserProfilesRecoverHeading": "พบบันทึกสำหรับบัญชีดังต่อไปนี้",
|
||||
"UserProfilesRecoverEmptyList": "ไม่มีโปรไฟล์ที่สามารถกู้คืนได้",
|
||||
"GraphicsAATooltip": "ใช้การลดรอยหยักกับการเรนเดอร์เกม\n\nFXAA จะเบลอภาพส่วนใหญ่ ในขณะที่ SMAA จะพยายามค้นหาขอบหยักและปรับให้เรียบ\n\nไม่แนะนำให้ใช้ร่วมกับตัวกรองสเกล FSR\n\nตัวเลือกนี้สามารถเปลี่ยนแปลงได้ในขณะที่เกมกำลังทำงานอยู่โดยคลิก \"นำไปใช้\" ด้านล่าง คุณสามารถย้ายหน้าต่างการตั้งค่าไปด้านข้างและทดลองจนกว่าคุณจะพบรูปลักษณ์ที่คุณต้องการสำหรับเกม\n\nปล่อยไว้ที่ NONE หากไม่แน่ใจ",
|
||||
"GraphicsAALabel": "ลดการฉีกขาดของภาพ:",
|
||||
"GraphicsScalingFilterLabel": "ปรับขนาดตัวกรอง:",
|
||||
"GraphicsScalingFilterTooltip": "เลือกตัวกรองสเกลที่จะใช้เมื่อใช้สเกลความละเอียด\n\nBilinear ทำงานได้ดีกับเกม 3D และเป็นตัวเลือกเริ่มต้นที่ปลอดภัย\n\nแนะนำให้ใช้เกมภาพพิกเซลที่ใกล้เคียงที่สุด\n\nFSR 1.0 เป็นเพียงตัวกรองความคมชัด ไม่แนะนำให้ใช้กับ FXAA หรือ SMAA\n\nตัวเลือกนี้สามารถเปลี่ยนแปลงได้ในขณะที่เกมกำลังทำงานอยู่โดยคลิก \"นำไปใช้\" ด้านล่าง คุณสามารถย้ายหน้าต่างการตั้งค่าไปด้านข้างและทดลองจนกว่าคุณจะพบรูปลักษณ์ที่คุณต้องการสำหรับเกม",
|
||||
"GraphicsScalingFilterBilinear": "Bilinear",
|
||||
"GraphicsScalingFilterNearest": "Nearest",
|
||||
"GraphicsScalingFilterFsr": "FSR",
|
||||
"GraphicsScalingFilterLevelLabel": "ระดับ",
|
||||
"GraphicsScalingFilterLevelTooltip": "ตั้งค่าระดับความคมชัด FSR 1.0 สูงกว่าจะคมชัดกว่า",
|
||||
"SmaaLow": "SMAA ต่ำ",
|
||||
"SmaaMedium": "SMAA ปานกลาง",
|
||||
"SmaaHigh": "SMAA สูง",
|
||||
"SmaaUltra": "SMAA สูงมาก",
|
||||
"UserEditorTitle": "แก้ไขผู้ใช้",
|
||||
"UserEditorTitleCreate": "สร้างผู้ใช้",
|
||||
"SettingsTabNetworkInterface": "เชื่อมต่อเครือข่าย:",
|
||||
"NetworkInterfaceTooltip": "อินเทอร์เฟซเครือข่ายที่ใช้สำหรับคุณสมบัติ LAN/LDN\n\nเมื่อใช้ร่วมกับ VPN หรือ XLink Kai และเกมที่รองรับ LAN สามารถใช้เพื่อปลอมการเชื่อมต่อเครือข่ายเดียวกันผ่านทางอินเทอร์เน็ต\n\nปล่อยให้เป็น ค่าเริ่มต้น หากคุณไม่แน่ใจ",
|
||||
"NetworkInterfaceDefault": "ค่าเริ่มต้น",
|
||||
"PackagingShaders": "แพ็คเชเดอร์ไฟล์",
|
||||
"AboutChangelogButton": "ดูบันทึกการเปลี่ยนแปลงบน GitHub",
|
||||
"AboutChangelogButtonTooltipMessage": "คลิกเพื่อเปิดบันทึกการเปลี่ยนแปลงสำหรับเวอร์ชั่นนี้ บนเบราว์เซอร์เริ่มต้นของคุณ",
|
||||
"SettingsTabNetworkMultiplayer": "ผู้เล่นหลายคน",
|
||||
"MultiplayerMode": "โหมด:",
|
||||
"MultiplayerModeTooltip": "เปลี่ยนโหมดผู้เล่นหลายคนของ LDN\n\nLdnMitm จะปรับเปลี่ยนฟังก์ชันการเล่นแบบไร้สาย/ภายใน จะให้เกมทำงานเหมือนกับว่าเป็น LAN ช่วยให้สามารถเชื่อมต่อภายในเครือข่ายเดียวกันกับอินสแตนซ์ Ryujinx อื่น ๆ และคอนโซล Nintendo Switch ที่ถูกแฮ็กซึ่งมีโมดูล ldn_mitm ติดตั้งอยู่\n\nผู้เล่นหลายคนต้องการให้ผู้เล่นทุกคนอยู่ในเกมเวอร์ชันเดียวกัน (เช่น Super Smash Bros. Ultimate v13.0.1 ไม่สามารถเชื่อมต่อกับ v13.0.0)\n\nปล่อยให้ปิดการใช้งานหากไม่แน่ใจ",
|
||||
"MultiplayerModeDisabled": "Disabled",
|
||||
"MultiplayerModeLdnMitm": "ldn_mitm"
|
||||
}
|
|
@ -14,7 +14,7 @@
|
|||
"MenuBarFileOpenEmuFolder": "Ryujinx Klasörünü aç",
|
||||
"MenuBarFileOpenLogsFolder": "Logs Klasörünü aç",
|
||||
"MenuBarFileExit": "_Çıkış",
|
||||
"MenuBarOptions": "Seçenekler",
|
||||
"MenuBarOptions": "_Seçenekler",
|
||||
"MenuBarOptionsToggleFullscreen": "Tam Ekran Modunu Aç",
|
||||
"MenuBarOptionsStartGamesInFullscreen": "Oyunları Tam Ekran Modunda Başlat",
|
||||
"MenuBarOptionsStopEmulation": "Emülasyonu Durdur",
|
||||
|
@ -30,7 +30,7 @@
|
|||
"MenuBarToolsManageFileTypes": "Dosya uzantılarını yönet",
|
||||
"MenuBarToolsInstallFileTypes": "Dosya uzantılarını yükle",
|
||||
"MenuBarToolsUninstallFileTypes": "Dosya uzantılarını kaldır",
|
||||
"MenuBarHelp": "Yardım",
|
||||
"MenuBarHelp": "_Yardım",
|
||||
"MenuBarHelpCheckForUpdates": "Güncellemeleri Denetle",
|
||||
"MenuBarHelpAbout": "Hakkında",
|
||||
"MenuSearch": "Ara...",
|
||||
|
@ -54,8 +54,6 @@
|
|||
"GameListContextMenuManageTitleUpdatesToolTip": "Oyun Güncelleme Yönetim Penceresini Açar",
|
||||
"GameListContextMenuManageDlc": "DLC'leri Yönet",
|
||||
"GameListContextMenuManageDlcToolTip": "DLC yönetim penceresini açar",
|
||||
"GameListContextMenuOpenModsDirectory": "Mod Dizinini Aç",
|
||||
"GameListContextMenuOpenModsDirectoryToolTip": "Uygulamanın modlarının bulunduğu dizini açar",
|
||||
"GameListContextMenuCacheManagement": "Önbellek Yönetimi",
|
||||
"GameListContextMenuCacheManagementPurgePptc": "PPTC Yeniden Yapılandırmasını Başlat",
|
||||
"GameListContextMenuCacheManagementPurgePptcToolTip": "Oyunun bir sonraki açılışında PPTC'yi yeniden yapılandır",
|
||||
|
@ -72,6 +70,13 @@
|
|||
"GameListContextMenuExtractDataRomFSToolTip": "Uygulamanın geçerli yapılandırmasından RomFS kısmını ayıkla (Güncellemeler dahil)",
|
||||
"GameListContextMenuExtractDataLogo": "Simge",
|
||||
"GameListContextMenuExtractDataLogoToolTip": "Uygulamanın geçerli yapılandırmasından Logo kısmını ayıkla (Güncellemeler dahil)",
|
||||
"GameListContextMenuCreateShortcut": "Uygulama Kısayolu Oluştur",
|
||||
"GameListContextMenuCreateShortcutToolTip": "Seçilmiş uygulamayı çalıştıracak bir masaüstü kısayolu oluştur",
|
||||
"GameListContextMenuCreateShortcutToolTipMacOS": "Create a shortcut in macOS's Applications folder that launches the selected Application",
|
||||
"GameListContextMenuOpenModsDirectory": "Open Mods Directory",
|
||||
"GameListContextMenuOpenModsDirectoryToolTip": "Opens the directory which contains Application's Mods",
|
||||
"GameListContextMenuOpenSdModsDirectory": "Open Atmosphere Mods Directory",
|
||||
"GameListContextMenuOpenSdModsDirectoryToolTip": "Opens the alternative SD card Atmosphere directory which contains Application's Mods. Useful for mods that are packaged for real hardware.",
|
||||
"StatusBarGamesLoaded": "{0}/{1} Oyun Yüklendi",
|
||||
"StatusBarSystemVersion": "Sistem Sürümü: {0}",
|
||||
"LinuxVmMaxMapCountDialogTitle": "Bellek Haritaları İçin Düşük Limit Tespit Edildi ",
|
||||
|
@ -150,7 +155,7 @@
|
|||
"SettingsTabGraphicsResolutionScaleNative": "Yerel (720p/1080p)",
|
||||
"SettingsTabGraphicsResolutionScale2x": "2x (1440p/2160p)",
|
||||
"SettingsTabGraphicsResolutionScale3x": "3x (2160p/3240p)",
|
||||
"SettingsTabGraphicsResolutionScale4x": "4x (2880p/4320p)",
|
||||
"SettingsTabGraphicsResolutionScale4x": "4x (2880p/4320p) (Not recommended)",
|
||||
"SettingsTabGraphicsAspectRatio": "En-Boy Oranı:",
|
||||
"SettingsTabGraphicsAspectRatio4x3": "4:3",
|
||||
"SettingsTabGraphicsAspectRatio16x9": "16:9",
|
||||
|
@ -200,9 +205,9 @@
|
|||
"ControllerSettingsInputDevice": "Giriş Cihazı",
|
||||
"ControllerSettingsRefresh": "Yenile",
|
||||
"ControllerSettingsDeviceDisabled": "Devre Dışı",
|
||||
"ControllerSettingsControllerType": "Kontrolcü Tipi",
|
||||
"ControllerSettingsControllerType": "Kumanda Tipi",
|
||||
"ControllerSettingsControllerTypeHandheld": "Portatif Mod",
|
||||
"ControllerSettingsControllerTypeProController": "Profesyonel Denetleyici",
|
||||
"ControllerSettingsControllerTypeProController": "Profesyonel Kumanda",
|
||||
"ControllerSettingsControllerTypeJoyConPair": "JoyCon Çifti",
|
||||
"ControllerSettingsControllerTypeJoyConLeft": "JoyCon Sol",
|
||||
"ControllerSettingsControllerTypeJoyConRight": "JoyCon Sağ",
|
||||
|
@ -253,7 +258,7 @@
|
|||
"ControllerSettingsTriggerThreshold": "Tetik Eşiği:",
|
||||
"ControllerSettingsMotion": "Hareket",
|
||||
"ControllerSettingsMotionUseCemuhookCompatibleMotion": "CemuHook uyumlu hareket kullan",
|
||||
"ControllerSettingsMotionControllerSlot": "Kontrolcü Yuvası:",
|
||||
"ControllerSettingsMotionControllerSlot": "Kumanda Yuvası:",
|
||||
"ControllerSettingsMotionMirrorInput": "Girişi Aynala",
|
||||
"ControllerSettingsMotionRightJoyConSlot": "Sağ JoyCon Yuvası:",
|
||||
"ControllerSettingsMotionServerHost": "Sunucu Sahibi:",
|
||||
|
@ -292,13 +297,9 @@
|
|||
"GameListContextMenuRunApplication": "Uygulamayı Çalıştır",
|
||||
"GameListContextMenuToggleFavorite": "Favori Ayarla",
|
||||
"GameListContextMenuToggleFavoriteToolTip": "Oyunu Favorilere Ekle/Çıkar",
|
||||
"SettingsTabGeneralTheme": "Tema",
|
||||
"SettingsTabGeneralThemeCustomTheme": "Özel Tema Yolu",
|
||||
"SettingsTabGeneralThemeBaseStyle": "Temel Stil",
|
||||
"SettingsTabGeneralThemeBaseStyleDark": "Karanlık",
|
||||
"SettingsTabGeneralThemeBaseStyleLight": "Aydınlık",
|
||||
"SettingsTabGeneralThemeEnableCustomTheme": "Özel Tema Etkinleştir",
|
||||
"ButtonBrowse": "Göz At",
|
||||
"SettingsTabGeneralTheme": "Theme:",
|
||||
"SettingsTabGeneralThemeDark": "Dark",
|
||||
"SettingsTabGeneralThemeLight": "Light",
|
||||
"ControllerSettingsConfigureGeneral": "Ayarla",
|
||||
"ControllerSettingsRumble": "Titreşim",
|
||||
"ControllerSettingsRumbleStrongMultiplier": "Güçlü Titreşim Çoklayıcı",
|
||||
|
@ -332,8 +333,6 @@
|
|||
"DialogUpdaterAddingFilesMessage": "Yeni Güncelleme Ekleniyor...",
|
||||
"DialogUpdaterCompleteMessage": "Güncelleme Tamamlandı!",
|
||||
"DialogUpdaterRestartMessage": "Ryujinx'i şimdi yeniden başlatmak istiyor musunuz?",
|
||||
"DialogUpdaterArchNotSupportedMessage": "Sistem mimariniz desteklenmemektedir!",
|
||||
"DialogUpdaterArchNotSupportedSubMessage": "(Sadece x64 sistemleri desteklenmektedir!)",
|
||||
"DialogUpdaterNoInternetMessage": "İnternete bağlı değilsiniz!",
|
||||
"DialogUpdaterNoInternetSubMessage": "Lütfen aktif bir internet bağlantınız olduğunu kontrol edin!",
|
||||
"DialogUpdaterDirtyBuildMessage": "Ryujinx'in Dirty build'lerini güncelleyemezsiniz!",
|
||||
|
@ -342,7 +341,7 @@
|
|||
"DialogThemeRestartMessage": "Tema kaydedildi. Temayı uygulamak için yeniden başlatma gerekiyor.",
|
||||
"DialogThemeRestartSubMessage": "Yeniden başlatmak ister misiniz",
|
||||
"DialogFirmwareInstallEmbeddedMessage": "Bu oyunun içine gömülü olan yazılımı yüklemek ister misiniz? (Firmware {0})",
|
||||
"DialogFirmwareInstallEmbeddedSuccessMessage": "Yüklü firmware bulunamadı ancak Ryujinx sağlanan oyundan {0} firmware sürümünü yükledi.\nEmülatör şimdi başlatılacak.",
|
||||
"DialogFirmwareInstallEmbeddedSuccessMessage": "No installed firmware was found but Ryujinx was able to install firmware {0} from the provided game.\nThe emulator will now start.",
|
||||
"DialogFirmwareNoFirmwareInstalledMessage": "Yazılım Yüklü Değil",
|
||||
"DialogFirmwareInstalledMessage": "Yazılım {0} yüklendi",
|
||||
"DialogInstallFileTypesSuccessMessage": "Dosya uzantıları başarıyla yüklendi!",
|
||||
|
@ -350,7 +349,7 @@
|
|||
"DialogUninstallFileTypesSuccessMessage": "Dosya uzantıları başarıyla kaldırıldı!",
|
||||
"DialogUninstallFileTypesErrorMessage": "Dosya uzantıları kaldırma işlemi başarısız oldu.",
|
||||
"DialogOpenSettingsWindowLabel": "Seçenekler Penceresini Aç",
|
||||
"DialogControllerAppletTitle": "Kontrolcü Applet'i",
|
||||
"DialogControllerAppletTitle": "Kumanda Applet'i",
|
||||
"DialogMessageDialogErrorExceptionMessage": "Mesaj diyaloğu gösterilirken hata: {0}",
|
||||
"DialogSoftwareKeyboardErrorExceptionMessage": "Mesaj diyaloğu gösterilirken hata: {0}",
|
||||
"DialogErrorAppletErrorExceptionMessage": "Applet diyaloğu gösterilirken hata: {0}",
|
||||
|
@ -383,9 +382,12 @@
|
|||
"DialogUserProfileUnsavedChangesTitle": "Uyarı - Kaydedilmemiş Değişiklikler",
|
||||
"DialogUserProfileUnsavedChangesMessage": "Kullanıcı profilinizde kaydedilmemiş değişiklikler var.",
|
||||
"DialogUserProfileUnsavedChangesSubMessage": "Yaptığınız değişiklikleri iptal etmek istediğinize emin misiniz?",
|
||||
"DialogControllerSettingsModifiedConfirmMessage": "Güncel kontrolcü seçenekleri güncellendi.",
|
||||
"DialogControllerSettingsModifiedConfirmMessage": "Geçerli kumanda seçenekleri güncellendi.",
|
||||
"DialogControllerSettingsModifiedConfirmSubMessage": "Kaydetmek istiyor musunuz?",
|
||||
"DialogLoadNcaErrorMessage": "{0}. Hatalı Dosya: {1}",
|
||||
"DialogLoadFileErrorMessage": "{0}. Errored File: {1}",
|
||||
"DialogModAlreadyExistsMessage": "Mod already exists",
|
||||
"DialogModInvalidMessage": "The specified directory does not contain a mod!",
|
||||
"DialogModDeleteNoParentMessage": "Failed to Delete: Could not find the parent directory for mod \"{0}\"!",
|
||||
"DialogDlcNoDlcErrorMessage": "Belirtilen dosya seçilen oyun için DLC içermiyor!",
|
||||
"DialogPerformanceCheckLoggingEnabledMessage": "Sadece geliştiriler için dizayn edilen Trace Loglama seçeneği etkin.",
|
||||
"DialogPerformanceCheckLoggingEnabledConfirmMessage": "En iyi performans için trace loglama'nın devre dışı bırakılması tavsiye edilir. Trace loglama seçeneğini şimdi devre dışı bırakmak ister misiniz?",
|
||||
|
@ -396,6 +398,8 @@
|
|||
"DialogUpdateAddUpdateErrorMessage": "Belirtilen dosya seçilen oyun için güncelleme içermiyor!",
|
||||
"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?",
|
||||
"DialogModManagerDeletionAllWarningMessage": "You are about to delete all mods for this title.\n\nAre you sure you want to proceed?",
|
||||
"SettingsTabGraphicsFeaturesOptions": "Özellikler",
|
||||
"SettingsTabGraphicsBackendMultithreading": "Grafik Backend Multithreading:",
|
||||
"CommonAuto": "Otomatik",
|
||||
|
@ -430,6 +434,7 @@
|
|||
"DlcManagerRemoveAllButton": "Tümünü kaldır",
|
||||
"DlcManagerEnableAllButton": "Tümünü Aktif Et",
|
||||
"DlcManagerDisableAllButton": "Tümünü Devre Dışı Bırak",
|
||||
"ModManagerDeleteAllButton": "Delete All",
|
||||
"MenuBarOptionsChangeLanguage": "Dili Değiştir",
|
||||
"MenuBarShowFileTypes": "Dosya Uzantılarını Göster",
|
||||
"CommonSort": "Sırala",
|
||||
|
@ -446,14 +451,14 @@
|
|||
"CustomThemeCheckTooltip": "Emülatör pencerelerinin görünümünü değiştirmek için özel bir Avalonia teması kullan",
|
||||
"CustomThemePathTooltip": "Özel arayüz temasının yolu",
|
||||
"CustomThemeBrowseTooltip": "Özel arayüz teması için göz at",
|
||||
"DockModeToggleTooltip": "Docked modu emüle edilen sistemin yerleşik Nintendo Switch gibi davranmasını sağlar. Bu çoğu oyunda grafik kalitesini arttırır. Diğer yandan, bu seçeneği devre dışı bırakmak emüle edilen sistemin elde Ninendo Switch gibi davranmasını sağlayıp grafik kalitesini düşürür.\n\nDocked modu kullanmayı düşünüyorsanız 1. Oyuncu kontrollerini; Handheld modunu kullanmak istiyorsanız Handheld kontrollerini konfigüre edin.\n\nEmin değilseniz aktif halde bırakın.",
|
||||
"DirectKeyboardTooltip": "Doğrudan Klavye Erişimi (HID) desteği. Oyunların klavyenizi metin giriş cihazı olarak kullanmasını sağlar.",
|
||||
"DirectMouseTooltip": "Doğrudan Fare Erişimi (HID) desteği. Oyunların farenizi işaret aygıtı olarak kullanmasını sağlar.",
|
||||
"DockModeToggleTooltip": "Docked modu emüle edilen sistemin yerleşik Nintendo Switch gibi davranmasını sağlar. Bu çoğu oyunda grafik kalitesini arttırır. Diğer yandan, bu seçeneği devre dışı bırakmak emüle edilen sistemin portatif Ninendo Switch gibi davranmasını sağlayıp grafik kalitesini düşürür.\n\nDocked modu kullanmayı düşünüyorsanız 1. Oyuncu kontrollerini; Handheld modunu kullanmak istiyorsanız portatif kontrollerini konfigüre edin.\n\nEmin değilseniz aktif halde bırakın.",
|
||||
"DirectKeyboardTooltip": "Direct keyboard access (HID) support. Provides games access to your keyboard as a text entry device.\n\nOnly works with games that natively support keyboard usage on Switch hardware.\n\nLeave OFF if unsure.",
|
||||
"DirectMouseTooltip": "Direct mouse access (HID) support. Provides games access to your mouse as a pointing device.\n\nOnly works with games that natively support mouse controls on Switch hardware, which are few and far between.\n\nWhen enabled, touch screen functionality may not work.\n\nLeave OFF if unsure.",
|
||||
"RegionTooltip": "Sistem Bölgesini Değiştir",
|
||||
"LanguageTooltip": "Sistem Dilini Değiştir",
|
||||
"TimezoneTooltip": "Sistem Saat Dilimini Değiştir",
|
||||
"TimeTooltip": "Sistem Saatini Değiştir",
|
||||
"VSyncToggleTooltip": "Emüle edilen konsolun Dikey Senkronizasyonu. Çoğu oyun için kare sınırlayıcı işlevi görür, bu seçeneği devre dışı bırakmak bazı oyunların normalden yüksek hızda çalışmasını ve yükleme ekranlarının daha uzun sürmesini veya sıkışıp kalmasını sağlar.\n\nTercih ettiğiniz bir kısayol ile oyun içindeyken etkinleştirilip devre dışı bırakılabilir. Bu seçeneği devre dışı bırakmayı düşünüyorsanız bir kısayol atamanızı öneririz.\n\nEmin değilseniz aktif halde bırakın.",
|
||||
"VSyncToggleTooltip": "Emulated console's Vertical Sync. Essentially a frame-limiter for the majority of games; disabling it may cause games to run at higher speed or make loading screens take longer or get stuck.\n\nCan be toggled in-game with a hotkey of your preference (F1 by default). We recommend doing this if you plan on disabling it.\n\nLeave ON if unsure.",
|
||||
"PptcToggleTooltip": "Çevrilen JIT fonksiyonlarını oyun her açıldığında çevrilmek zorunda kalmaması için kaydeder.\n\nTeklemeyi azaltır ve ilk açılıştan sonra oyunların ilk açılış süresini ciddi biçimde hızlandırır.\n\nEmin değilseniz aktif halde bırakın.",
|
||||
"FsIntegrityToggleTooltip": "Oyun açarken hatalı dosyaların olup olmadığını kontrol eder, ve hatalı dosya bulursa log dosyasında hash hatası görüntüler.\n\nPerformansa herhangi bir etkisi yoktur ve sorun gidermeye yardımcı olur.\n\nEmin değilseniz aktif halde bırakın.",
|
||||
"AudioBackendTooltip": "Ses çıkış motorunu değiştirir.\n\nSDL2 tercih edilen seçenektir, OpenAL ve SoundIO ise alternatif olarak kullanılabilir. Dummy seçeneğinde ses çıkışı olmayacaktır.\n\nEmin değilseniz SDL2 seçeneğine ayarlayın.",
|
||||
|
@ -467,10 +472,10 @@
|
|||
"GraphicsBackendThreadingTooltip": "Grafik arka uç komutlarını ikinci bir iş parçacığında işletir.\n\nKendi multithreading desteği olmayan sürücülerde shader derlemeyi hızlandırıp performansı artırır. Multithreading desteği olan sürücülerde çok az daha iyi performans sağlar.\n\nEmin değilseniz Otomatik seçeneğine ayarlayın.",
|
||||
"GalThreadingTooltip": "Grafik arka uç komutlarını ikinci bir iş parçacığında işletir.\n\nKendi multithreading desteği olmayan sürücülerde shader derlemeyi hızlandırıp performansı artırır. Multithreading desteği olan sürücülerde çok az daha iyi performans sağlar.\n\nEmin değilseniz Otomatik seçeneğine ayarlayın.",
|
||||
"ShaderCacheToggleTooltip": "Sonraki çalışmalarda takılmaları engelleyen bir gölgelendirici disk önbelleğine kaydeder.",
|
||||
"ResolutionScaleTooltip": "Uygulanabilir grafik hedeflerine uygulanan çözünürlük ölçeği",
|
||||
"ResolutionScaleTooltip": "Multiplies the game's rendering resolution.\n\nA few games may not work with this and look pixelated even when the resolution is increased; for those games, you may need to find mods that remove anti-aliasing or that increase their internal rendering resolution. For using the latter, you'll likely want to select Native.\n\nThis option can be changed while a game is running by clicking \"Apply\" below; you can simply move the settings window aside and experiment until you find your preferred look for a game.\n\nKeep in mind 4x is overkill for virtually any setup.",
|
||||
"ResolutionScaleEntryTooltip": "Küsüratlı çözünürlük ölçeği, 1.5 gibi. Küsüratlı ölçekler hata oluşturmaya ve çökmeye daha yatkındır.",
|
||||
"AnisotropyTooltip": "Eşyönsüz doku süzmesi seviyesi (Oyun tarafından istenen değeri kullanmak için Otomatik seçeneğine ayarlayın)",
|
||||
"AspectRatioTooltip": "Grafik penceresine uygulanan en-boy oranı.",
|
||||
"AnisotropyTooltip": "Level of Anisotropic Filtering. Set to Auto to use the value requested by the game.",
|
||||
"AspectRatioTooltip": "Aspect Ratio applied to the renderer window.\n\nOnly change this if you're using an aspect ratio mod for your game, otherwise the graphics will be stretched.\n\nLeave on 16:9 if unsure.",
|
||||
"ShaderDumpPathTooltip": "Grafik Shader Döküm Yolu",
|
||||
"FileLogTooltip": "Konsol loglarını diskte bir log dosyasına kaydeder. Performansı etkilemez.",
|
||||
"StubLogTooltip": "Stub log mesajlarını konsola yazdırır. Performansı etkilemez.",
|
||||
|
@ -504,6 +509,8 @@
|
|||
"EnableInternetAccessTooltip": "Emüle edilen uygulamanın internete bağlanmasını sağlar.\n\nLAN modu bulunan oyunlar bu seçenek ile birbirine bağlanabilir ve sistemler aynı access point'e bağlanır. Bu gerçek konsolları da kapsar.\n\nNintendo sunucularına bağlanmayı sağlaMAZ. Internete bağlanmaya çalışan baz oyunların çökmesine sebep olabilr.\n\nEmin değilseniz devre dışı bırakın.",
|
||||
"GameListContextMenuManageCheatToolTip": "Hileleri yönetmeyi sağlar",
|
||||
"GameListContextMenuManageCheat": "Hileleri Yönet",
|
||||
"GameListContextMenuManageModToolTip": "Manage Mods",
|
||||
"GameListContextMenuManageMod": "Manage Mods",
|
||||
"ControllerSettingsStickRange": "Menzil:",
|
||||
"DialogStopEmulationTitle": "Ryujinx - Emülasyonu Durdur",
|
||||
"DialogStopEmulationMessage": "Emülasyonu durdurmak istediğinizden emin misiniz?",
|
||||
|
@ -515,8 +522,6 @@
|
|||
"SettingsTabCpuMemory": "CPU Hafızası",
|
||||
"DialogUpdaterFlatpakNotSupportedMessage": "Lütfen Ryujinx'i FlatHub aracılığıyla güncelleyin.",
|
||||
"UpdaterDisabledWarningTitle": "Güncelleyici Devre Dışı!",
|
||||
"GameListContextMenuOpenSdModsDirectory": "Atmosphere Mod Dizini",
|
||||
"GameListContextMenuOpenSdModsDirectoryToolTip": "Uygulama Modlarını içeren alternatif SD kart Atmosfer dizinini açar. Gerçek donanım için paketlenmiş modlar için kullanışlıdır.",
|
||||
"ControllerSettingsRotate90": "Saat yönünde 90° Döndür",
|
||||
"IconSize": "Ikon Boyutu",
|
||||
"IconSizeTooltip": "Oyun ikonlarının boyutunu değiştirmeyi sağlar",
|
||||
|
@ -544,19 +549,20 @@
|
|||
"SwkbdMinCharacters": "En az {0} karakter uzunluğunda olmalı",
|
||||
"SwkbdMinRangeCharacters": "{0}-{1} karakter uzunluğunda olmalı",
|
||||
"SoftwareKeyboard": "Yazılım Klavyesi",
|
||||
"SoftwareKeyboardModeNumbersOnly": "Sadece Numara Olabilir",
|
||||
"SoftwareKeyboardModeNumeric": "Sadece 0-9 veya '.' olabilir",
|
||||
"SoftwareKeyboardModeAlphabet": "Sadece CJK-characters olmayan karakterler olabilir",
|
||||
"SoftwareKeyboardModeASCII": "Sadece ASCII karakterler olabilir",
|
||||
"DialogControllerAppletMessagePlayerRange": "Uygulama belirtilen türde {0} oyuncu istiyor:\n\nTÜRLER: {1}\n\nOYUNCULAR: {2}\n\n{3}Lütfen şimdi seçeneklerden giriş aygıtlarını ayarlayın veya Kapat'a basın.",
|
||||
"DialogControllerAppletMessage": "Uygulama belirtilen türde tam olarak {0} oyuncu istiyor:\n\nTÜRLER: {1}\n\nOYUNCULAR: {2}\n\n{3}Lütfen şimdi seçeneklerden giriş aygıtlarını ayarlayın veya Kapat'a basın.",
|
||||
"DialogControllerAppletDockModeSet": "Docked mode etkin. Handheld geçersiz.\n\n",
|
||||
"ControllerAppletControllers": "Desteklenen Kumandalar:",
|
||||
"ControllerAppletPlayers": "Oyuncular:",
|
||||
"ControllerAppletDescription": "Halihazırdaki konfigürasyonunuz geçersiz. Ayarları açın ve girişlerinizi yeniden konfigüre edin.",
|
||||
"ControllerAppletDocked": "Docked mod ayarlandı. Portatif denetim devre dışı bırakılmalı.",
|
||||
"UpdaterRenaming": "Eski dosyalar yeniden adlandırılıyor...",
|
||||
"UpdaterRenameFailed": "Güncelleyici belirtilen dosyayı yeniden adlandıramadı: {0}",
|
||||
"UpdaterAddingFiles": "Yeni Dosyalar Ekleniyor...",
|
||||
"UpdaterExtracting": "Güncelleme Ayrıştırılıyor...",
|
||||
"UpdaterDownloading": "Güncelleme İndiriliyor...",
|
||||
"Game": "Oyun",
|
||||
"Docked": "Yerleştirildi",
|
||||
"Docked": "Docked",
|
||||
"Handheld": "El tipi",
|
||||
"ConnectionError": "Bağlantı Hatası.",
|
||||
"AboutPageDeveloperListMore": "{0} ve daha fazla...",
|
||||
|
@ -587,6 +593,7 @@
|
|||
"Writable": "Yazılabilir",
|
||||
"SelectDlcDialogTitle": "DLC dosyalarını seç",
|
||||
"SelectUpdateDialogTitle": "Güncelleme dosyalarını seç",
|
||||
"SelectModDialogTitle": "Select mod directory",
|
||||
"UserProfileWindowTitle": "Kullanıcı Profillerini Yönet",
|
||||
"CheatWindowTitle": "Oyun Hilelerini Yönet",
|
||||
"DlcWindowTitle": "Oyun DLC'lerini Yönet",
|
||||
|
@ -594,10 +601,12 @@
|
|||
"CheatWindowHeading": "{0} için Hile mevcut [{1}]",
|
||||
"BuildId": "BuildId:",
|
||||
"DlcWindowHeading": "{0} için DLC mevcut [{1}]",
|
||||
"ModWindowHeading": "{0} Mod(s)",
|
||||
"UserProfilesEditProfile": "Seçiliyi Düzenle",
|
||||
"Cancel": "İptal",
|
||||
"Save": "Kaydet",
|
||||
"Discard": "Iskarta",
|
||||
"Paused": "Durduruldu",
|
||||
"UserProfilesSetProfileImage": "Profil Resmi Ayarla",
|
||||
"UserProfileEmptyNameError": "İsim gerekli",
|
||||
"UserProfileNoImageError": "Profil resmi ayarlanmalıdır",
|
||||
|
@ -607,9 +616,9 @@
|
|||
"UserProfilesName": "İsim:",
|
||||
"UserProfilesUserId": "Kullanıcı Adı:",
|
||||
"SettingsTabGraphicsBackend": "Grafik Arka Ucu",
|
||||
"SettingsTabGraphicsBackendTooltip": "Kullanılacak Grafik Arka Uç",
|
||||
"SettingsTabGraphicsBackendTooltip": "Select the graphics backend that will be used in the emulator.\n\nVulkan is overall better for all modern graphics cards, as long as their drivers are up to date. Vulkan also features faster shader compilation (less stuttering) on all GPU vendors.\n\nOpenGL may achieve better results on old Nvidia GPUs, on old AMD GPUs on Linux, or on GPUs with lower VRAM, though shader compilation stutters will be greater.\n\nSet to Vulkan if unsure. Set to OpenGL if your GPU does not support Vulkan even with the latest graphics drivers.",
|
||||
"SettingsEnableTextureRecompression": "Yeniden Doku Sıkıştırılmasını Aktif Et",
|
||||
"SettingsEnableTextureRecompressionTooltip": "4GB VRAM'in Altında Sistemler için önerilir.\n\nEmin değilseniz kapalı bırakın",
|
||||
"SettingsEnableTextureRecompressionTooltip": "Compresses ASTC textures in order to reduce VRAM usage.\n\nGames using this texture format include Astral Chain, Bayonetta 3, Fire Emblem Engage, Metroid Prime Remastered, Super Mario Bros. Wonder and The Legend of Zelda: Tears of the Kingdom.\n\nGraphics cards with 4GiB VRAM or less will likely crash at some point while running these games.\n\nEnable only if you're running out of VRAM on the aforementioned games. Leave OFF if unsure.",
|
||||
"SettingsTabGraphicsPreferredGpu": "Kullanılan GPU",
|
||||
"SettingsTabGraphicsPreferredGpuTooltip": "Vulkan Grafik Arka Ucu ile kullanılacak Ekran Kartını Seçin.\n\nOpenGL'nin kullanacağı GPU'yu etkilemez.\n\n Emin değilseniz \"dGPU\" olarak işaretlenmiş GPU'ya ayarlayın. Eğer yoksa, dokunmadan bırakın.\n",
|
||||
"SettingsAppRequiredRestartMessage": "Ryujinx'i Yeniden Başlatma Gerekli",
|
||||
|
@ -635,12 +644,15 @@
|
|||
"Recover": "Kurtar",
|
||||
"UserProfilesRecoverHeading": "Aşağıdaki hesaplar için kayıtlar bulundu",
|
||||
"UserProfilesRecoverEmptyList": "Kurtarılacak profil bulunamadı",
|
||||
"GraphicsAATooltip": "Oyuna Kenar Yumuşatma Ekler",
|
||||
"GraphicsAATooltip": "Applies anti-aliasing to the game render.\n\nFXAA will blur most of the image, while SMAA will attempt to find jagged edges and smooth them out.\n\nNot recommended to use in conjunction with the FSR scaling filter.\n\nThis option can be changed while a game is running by clicking \"Apply\" below; you can simply move the settings window aside and experiment until you find your preferred look for a game.\n\nLeave on NONE if unsure.",
|
||||
"GraphicsAALabel": "Kenar Yumuşatma:",
|
||||
"GraphicsScalingFilterLabel": "Ölçekleme Filtresi:",
|
||||
"GraphicsScalingFilterTooltip": "Çerçeve Arabellek Filtresini Açar",
|
||||
"GraphicsScalingFilterTooltip": "Choose the scaling filter that will be applied when using resolution scale.\n\nBilinear works well for 3D games and is a safe default option.\n\nNearest is recommended for pixel art games.\n\nFSR 1.0 is merely a sharpening filter, not recommended for use with FXAA or SMAA.\n\nThis option can be changed while a game is running by clicking \"Apply\" below; you can simply move the settings window aside and experiment until you find your preferred look for a game.\n\nLeave on BILINEAR if unsure.",
|
||||
"GraphicsScalingFilterBilinear": "Bilinear",
|
||||
"GraphicsScalingFilterNearest": "Nearest",
|
||||
"GraphicsScalingFilterFsr": "FSR",
|
||||
"GraphicsScalingFilterLevelLabel": "Seviye",
|
||||
"GraphicsScalingFilterLevelTooltip": "Ölçekleme Filtre Seviyesini Belirle",
|
||||
"GraphicsScalingFilterLevelTooltip": "Set FSR 1.0 sharpening level. Higher is sharper.",
|
||||
"SmaaLow": "Düşük SMAA",
|
||||
"SmaaMedium": "Orta SMAA",
|
||||
"SmaaHigh": "Yüksek SMAA",
|
||||
|
@ -648,9 +660,14 @@
|
|||
"UserEditorTitle": "Kullanıcıyı Düzenle",
|
||||
"UserEditorTitleCreate": "Kullanıcı Oluştur",
|
||||
"SettingsTabNetworkInterface": "Ağ Bağlantısı:",
|
||||
"NetworkInterfaceTooltip": "LAN özellikleri için kullanılan ağ bağlantısı",
|
||||
"NetworkInterfaceTooltip": "The network interface used for LAN/LDN features.\n\nIn conjunction with a VPN or XLink Kai and a game with LAN support, can be used to spoof a same-network connection over the Internet.\n\nLeave on DEFAULT if unsure.",
|
||||
"NetworkInterfaceDefault": "Varsayılan",
|
||||
"PackagingShaders": "Gölgeler Paketleniyor",
|
||||
"AboutChangelogButton": "GitHub'da Değişiklikleri Görüntüle",
|
||||
"AboutChangelogButtonTooltipMessage": "Kullandığınız versiyon için olan değişiklikleri varsayılan tarayıcınızda görmek için tıklayın"
|
||||
}
|
||||
"AboutChangelogButtonTooltipMessage": "Kullandığınız versiyon için olan değişiklikleri varsayılan tarayıcınızda görmek için tıklayın",
|
||||
"SettingsTabNetworkMultiplayer": "Çok Oyunculu",
|
||||
"MultiplayerMode": "Mod:",
|
||||
"MultiplayerModeTooltip": "Change LDN multiplayer mode.\n\nLdnMitm will modify local wireless/local play functionality in games to function as if it were LAN, allowing for local, same-network connections with other Ryujinx instances and hacked Nintendo Switch consoles that have the ldn_mitm module installed.\n\nMultiplayer requires all players to be on the same game version (i.e. Super Smash Bros. Ultimate v13.0.1 can't connect to v13.0.0).\n\nLeave DISABLED if unsure.",
|
||||
"MultiplayerModeDisabled": "Disabled",
|
||||
"MultiplayerModeLdnMitm": "ldn_mitm"
|
||||
}
|
||||
|
|
|
@ -1,50 +1,50 @@
|
|||
{
|
||||
"Language": "Yкраїнська",
|
||||
"Language": "Українська",
|
||||
"MenuBarFileOpenApplet": "Відкрити аплет",
|
||||
"MenuBarFileOpenAppletOpenMiiAppletToolTip": "Відкрийте аплет Mii Editor в автономному режимі",
|
||||
"MenuBarFileOpenAppletOpenMiiAppletToolTip": "Відкрити аплет Mii Editor в автономному режимі",
|
||||
"SettingsTabInputDirectMouseAccess": "Прямий доступ мишею",
|
||||
"SettingsTabSystemMemoryManagerMode": "Режим диспетчера пам'яті:",
|
||||
"SettingsTabSystemMemoryManagerMode": "Режим диспетчера пам’яті:",
|
||||
"SettingsTabSystemMemoryManagerModeSoftware": "Програмне забезпечення",
|
||||
"SettingsTabSystemMemoryManagerModeHost": "Хост (швидко)",
|
||||
"SettingsTabSystemMemoryManagerModeHostUnchecked": "Неперевірений хост (найшвидший, небезпечний)",
|
||||
"SettingsTabSystemUseHypervisor": "Use Hypervisor",
|
||||
"SettingsTabSystemUseHypervisor": "Використовувати гіпервізор",
|
||||
"MenuBarFile": "_Файл",
|
||||
"MenuBarFileOpenFromFile": "_Завантажити програму з файлу",
|
||||
"MenuBarFileOpenUnpacked": "Завантажити _розпаковану гру",
|
||||
"MenuBarFileOpenEmuFolder": "Відкрити теку Ryujinx",
|
||||
"MenuBarFileOpenLogsFolder": "Відкрити теку журналів змін",
|
||||
"MenuBarFileExit": "_Вихід",
|
||||
"MenuBarOptions": "Опції",
|
||||
"MenuBarOptionsToggleFullscreen": "Перемкнути на весь екран",
|
||||
"MenuBarOptions": "_Параметри",
|
||||
"MenuBarOptionsToggleFullscreen": "На весь екран",
|
||||
"MenuBarOptionsStartGamesInFullscreen": "Запускати ігри на весь екран",
|
||||
"MenuBarOptionsStopEmulation": "Зупинити емуляцію",
|
||||
"MenuBarOptionsSettings": "_Налаштування",
|
||||
"MenuBarOptionsManageUserProfiles": "_Керування профілями користувачів",
|
||||
"MenuBarOptionsManageUserProfiles": "_Керувати профілями користувачів",
|
||||
"MenuBarActions": "_Дії",
|
||||
"MenuBarOptionsSimulateWakeUpMessage": "Симулювати повідомлення про пробудження",
|
||||
"MenuBarActionsScanAmiibo": "Сканувати Amiibo",
|
||||
"MenuBarTools": "_Інструменти",
|
||||
"MenuBarToolsInstallFirmware": "Встановити прошивку",
|
||||
"MenuBarFileToolsInstallFirmwareFromFile": "Встановити прошивку з XCI або ZIP",
|
||||
"MenuBarFileToolsInstallFirmwareFromDirectory": "Встановити прошивку з теки",
|
||||
"MenuBarToolsManageFileTypes": "Manage file types",
|
||||
"MenuBarToolsInstallFileTypes": "Install file types",
|
||||
"MenuBarToolsUninstallFileTypes": "Uninstall file types",
|
||||
"MenuBarHelp": "Довідка",
|
||||
"MenuBarToolsInstallFirmware": "Установити прошивку",
|
||||
"MenuBarFileToolsInstallFirmwareFromFile": "Установити прошивку з XCI або ZIP",
|
||||
"MenuBarFileToolsInstallFirmwareFromDirectory": "Установити прошивку з теки",
|
||||
"MenuBarToolsManageFileTypes": "Керувати типами файлів",
|
||||
"MenuBarToolsInstallFileTypes": "Установити типи файлів",
|
||||
"MenuBarToolsUninstallFileTypes": "Видалити типи файлів",
|
||||
"MenuBarHelp": "_Допомога",
|
||||
"MenuBarHelpCheckForUpdates": "Перевірити оновлення",
|
||||
"MenuBarHelpAbout": "Про програму",
|
||||
"MenuBarHelpAbout": "Про застосунок",
|
||||
"MenuSearch": "Пошук...",
|
||||
"GameListHeaderFavorite": "Вибране",
|
||||
"GameListHeaderFavorite": "Обране",
|
||||
"GameListHeaderIcon": "Значок",
|
||||
"GameListHeaderApplication": "Назва",
|
||||
"GameListHeaderDeveloper": "Розробник",
|
||||
"GameListHeaderVersion": "Версія",
|
||||
"GameListHeaderTimePlayed": "Зіграно часу",
|
||||
"GameListHeaderLastPlayed": "Остання гра",
|
||||
"GameListHeaderLastPlayed": "Востаннє зіграно",
|
||||
"GameListHeaderFileExtension": "Розширення файлу",
|
||||
"GameListHeaderFileSize": "Розмір файлу",
|
||||
"GameListHeaderPath": "Шлях",
|
||||
"GameListContextMenuOpenUserSaveDirectory": "Відкрити каталог збереження користувача",
|
||||
"GameListContextMenuOpenUserSaveDirectory": "Відкрити теку збереження користувача",
|
||||
"GameListContextMenuOpenUserSaveDirectoryToolTip": "Відкриває каталог, який містить збереження користувача програми",
|
||||
"GameListContextMenuOpenDeviceSaveDirectory": "Відкрити каталог пристроїв користувача",
|
||||
"GameListContextMenuOpenDeviceSaveDirectoryToolTip": "Відкриває каталог, який містить збереження пристрою програми",
|
||||
|
@ -54,8 +54,6 @@
|
|||
"GameListContextMenuManageTitleUpdatesToolTip": "Відкриває вікно керування оновленням заголовка",
|
||||
"GameListContextMenuManageDlc": "Керування DLC",
|
||||
"GameListContextMenuManageDlcToolTip": "Відкриває вікно керування DLC",
|
||||
"GameListContextMenuOpenModsDirectory": "Відкрити каталог модифікацій",
|
||||
"GameListContextMenuOpenModsDirectoryToolTip": "Відкриває каталог, який містить модифікації програм",
|
||||
"GameListContextMenuCacheManagement": "Керування кешем",
|
||||
"GameListContextMenuCacheManagementPurgePptc": "Очистити кеш PPTC",
|
||||
"GameListContextMenuCacheManagementPurgePptcToolTip": "Видаляє кеш PPTC програми",
|
||||
|
@ -72,26 +70,33 @@
|
|||
"GameListContextMenuExtractDataRomFSToolTip": "Видобуває розділ RomFS із поточної конфігурації програми (включаючи оновлення)",
|
||||
"GameListContextMenuExtractDataLogo": "Логотип",
|
||||
"GameListContextMenuExtractDataLogoToolTip": "Видобуває розділ логотипу з поточної конфігурації програми (включаючи оновлення)",
|
||||
"StatusBarGamesLoaded": "{0}/{1} Ігор завантажено",
|
||||
"GameListContextMenuCreateShortcut": "Створити ярлик застосунку",
|
||||
"GameListContextMenuCreateShortcutToolTip": "Створити ярлик на робочому столі, який запускає вибраний застосунок",
|
||||
"GameListContextMenuCreateShortcutToolTipMacOS": "Створити ярлик у каталозі macOS програм, що запускає обраний Додаток",
|
||||
"GameListContextMenuOpenModsDirectory": "Відкрити теку з модами",
|
||||
"GameListContextMenuOpenModsDirectoryToolTip": "Відкриває каталог, який містить модифікації Додатків",
|
||||
"GameListContextMenuOpenSdModsDirectory": "Відкрити каталог модифікацій Atmosphere",
|
||||
"GameListContextMenuOpenSdModsDirectoryToolTip": "Відкриває альтернативний каталог SD-карти Atmosphere, що містить модифікації Додатків. Корисно для модифікацій, зроблених для реального обладнання.",
|
||||
"StatusBarGamesLoaded": "{0}/{1} ігор завантажено",
|
||||
"StatusBarSystemVersion": "Версія системи: {0}",
|
||||
"LinuxVmMaxMapCountDialogTitle": "Low limit for memory mappings detected",
|
||||
"LinuxVmMaxMapCountDialogTextPrimary": "Would you like to increase the value of vm.max_map_count to {0}",
|
||||
"LinuxVmMaxMapCountDialogTextSecondary": "Some games might try to create more memory mappings than currently allowed. Ryujinx will crash as soon as this limit gets exceeded.",
|
||||
"LinuxVmMaxMapCountDialogButtonUntilRestart": "Yes, until the next restart",
|
||||
"LinuxVmMaxMapCountDialogButtonPersistent": "Yes, permanently",
|
||||
"LinuxVmMaxMapCountWarningTextPrimary": "Max amount of memory mappings is lower than recommended.",
|
||||
"LinuxVmMaxMapCountWarningTextSecondary": "The current value of vm.max_map_count ({0}) is lower than {1}. Some games might try to create more memory mappings than currently allowed. Ryujinx will crash as soon as this limit gets exceeded.\n\nYou might want to either manually increase the limit or install pkexec, which allows Ryujinx to assist with that.",
|
||||
"LinuxVmMaxMapCountDialogTitle": "Виявлено низьку межу для відображення памʼяті",
|
||||
"LinuxVmMaxMapCountDialogTextPrimary": "Бажаєте збільшити значення vm.max_map_count на {0}",
|
||||
"LinuxVmMaxMapCountDialogTextSecondary": "Деякі ігри можуть спробувати створити більше відображень памʼяті, ніж дозволено наразі. Ryujinx завершить роботу, щойно цей ліміт буде перевищено.",
|
||||
"LinuxVmMaxMapCountDialogButtonUntilRestart": "Так, до наст. перезапуску",
|
||||
"LinuxVmMaxMapCountDialogButtonPersistent": "Так, назавжди",
|
||||
"LinuxVmMaxMapCountWarningTextPrimary": "Максимальна кількість відображення памʼяті менша, ніж рекомендовано.",
|
||||
"LinuxVmMaxMapCountWarningTextSecondary": "Поточне значення vm.max_map_count ({0}) менше за {1}. Деякі ігри можуть спробувати створити більше відображень пам’яті, ніж дозволено наразі. Ryujinx завершить роботу, щойно цей ліміт буде перевищено.\n\nВи можете збільшити ліміт вручну або встановити pkexec, який дозволяє Ryujinx допомогти з цим.",
|
||||
"Settings": "Налаштування",
|
||||
"SettingsTabGeneral": "Інтерфейс користувача",
|
||||
"SettingsTabGeneralGeneral": "Загальні",
|
||||
"SettingsTabGeneralEnableDiscordRichPresence": "Увімкнути розширену присутність Discord",
|
||||
"SettingsTabGeneralCheckUpdatesOnLaunch": "Перевіряти наявність оновлень під час запуску",
|
||||
"SettingsTabGeneralShowConfirmExitDialog": "Показати діалогове вікно «Підтвердити вихід».",
|
||||
"SettingsTabGeneralHideCursor": "Hide Cursor:",
|
||||
"SettingsTabGeneralHideCursorNever": "Never",
|
||||
"SettingsTabGeneralHideCursorOnIdle": "Приховати курсор у режимі очікування",
|
||||
"SettingsTabGeneralHideCursorAlways": "Always",
|
||||
"SettingsTabGeneralGameDirectories": "Каталоги ігор",
|
||||
"SettingsTabGeneralHideCursor": "Сховати вказівник:",
|
||||
"SettingsTabGeneralHideCursorNever": "Ніколи",
|
||||
"SettingsTabGeneralHideCursorOnIdle": "Сховати у режимі очікування",
|
||||
"SettingsTabGeneralHideCursorAlways": "Завжди",
|
||||
"SettingsTabGeneralGameDirectories": "Тека ігор",
|
||||
"SettingsTabGeneralAdd": "Додати",
|
||||
"SettingsTabGeneralRemove": "Видалити",
|
||||
"SettingsTabSystem": "Система",
|
||||
|
@ -150,7 +155,7 @@
|
|||
"SettingsTabGraphicsResolutionScaleNative": "Стандартний (720p/1080p)",
|
||||
"SettingsTabGraphicsResolutionScale2x": "2x (1440p/2160p)",
|
||||
"SettingsTabGraphicsResolutionScale3x": "3x (2160p/3240p)",
|
||||
"SettingsTabGraphicsResolutionScale4x": "4x (2880p/4320p)",
|
||||
"SettingsTabGraphicsResolutionScale4x": "4x (2880p/4320p) (Не рекомендується)",
|
||||
"SettingsTabGraphicsAspectRatio": "Співвідношення сторін:",
|
||||
"SettingsTabGraphicsAspectRatio4x3": "4:3",
|
||||
"SettingsTabGraphicsAspectRatio16x9": "16:9",
|
||||
|
@ -158,7 +163,7 @@
|
|||
"SettingsTabGraphicsAspectRatio21x9": "21:9",
|
||||
"SettingsTabGraphicsAspectRatio32x9": "32:9",
|
||||
"SettingsTabGraphicsAspectRatioStretch": "Розтягнути до розміру вікна",
|
||||
"SettingsTabGraphicsDeveloperOptions": "Налаштування виробника",
|
||||
"SettingsTabGraphicsDeveloperOptions": "Параметри розробника",
|
||||
"SettingsTabGraphicsShaderDumpPath": "Шлях скидання графічного шейдера:",
|
||||
"SettingsTabLogging": "Налагодження",
|
||||
"SettingsTabLoggingLogging": "Налагодження",
|
||||
|
@ -172,9 +177,9 @@
|
|||
"SettingsTabLoggingEnableFsAccessLogs": "Увімкнути журнали доступу Fs",
|
||||
"SettingsTabLoggingFsGlobalAccessLogMode": "Режим журналу глобального доступу Fs:",
|
||||
"SettingsTabLoggingDeveloperOptions": "Параметри розробника (УВАГА: знизиться продуктивність)",
|
||||
"SettingsTabLoggingDeveloperOptionsNote": "WARNING: Will reduce performance",
|
||||
"SettingsTabLoggingDeveloperOptionsNote": "УВАГА: Знижує продуктивність",
|
||||
"SettingsTabLoggingGraphicsBackendLogLevel": "Рівень журналу графічного сервера:",
|
||||
"SettingsTabLoggingGraphicsBackendLogLevelNone": "Ні",
|
||||
"SettingsTabLoggingGraphicsBackendLogLevelNone": "Немає",
|
||||
"SettingsTabLoggingGraphicsBackendLogLevelError": "Помилка",
|
||||
"SettingsTabLoggingGraphicsBackendLogLevelPerformance": "Уповільнення",
|
||||
"SettingsTabLoggingGraphicsBackendLogLevelAll": "Все",
|
||||
|
@ -223,15 +228,15 @@
|
|||
"ControllerSettingsDPadDown": "Вниз",
|
||||
"ControllerSettingsDPadLeft": "Вліво",
|
||||
"ControllerSettingsDPadRight": "Вправо",
|
||||
"ControllerSettingsStickButton": "Button",
|
||||
"ControllerSettingsStickUp": "Up",
|
||||
"ControllerSettingsStickDown": "Down",
|
||||
"ControllerSettingsStickLeft": "Left",
|
||||
"ControllerSettingsStickRight": "Right",
|
||||
"ControllerSettingsStickStick": "Stick",
|
||||
"ControllerSettingsStickInvertXAxis": "Invert Stick X",
|
||||
"ControllerSettingsStickInvertYAxis": "Invert Stick Y",
|
||||
"ControllerSettingsStickDeadzone": "Deadzone:",
|
||||
"ControllerSettingsStickButton": "Кнопка",
|
||||
"ControllerSettingsStickUp": "Уверх",
|
||||
"ControllerSettingsStickDown": "Униз",
|
||||
"ControllerSettingsStickLeft": "Ліворуч",
|
||||
"ControllerSettingsStickRight": "Праворуч",
|
||||
"ControllerSettingsStickStick": "Стик",
|
||||
"ControllerSettingsStickInvertXAxis": "Обернути вісь стику X",
|
||||
"ControllerSettingsStickInvertYAxis": "Обернути вісь стику Y",
|
||||
"ControllerSettingsStickDeadzone": "Мертва зона:",
|
||||
"ControllerSettingsLStick": "Лівий джойстик",
|
||||
"ControllerSettingsRStick": "Правий джойстик",
|
||||
"ControllerSettingsTriggersLeft": "Тригери ліворуч",
|
||||
|
@ -266,9 +271,9 @@
|
|||
"UserProfilesChangeProfileImage": "Змінити зображення профілю",
|
||||
"UserProfilesAvailableUserProfiles": "Доступні профілі користувачів:",
|
||||
"UserProfilesAddNewProfile": "Створити профіль",
|
||||
"UserProfilesDelete": "Delete",
|
||||
"UserProfilesDelete": "Видалити",
|
||||
"UserProfilesClose": "Закрити",
|
||||
"ProfileNameSelectionWatermark": "Choose a nickname",
|
||||
"ProfileNameSelectionWatermark": "Оберіть псевдонім",
|
||||
"ProfileImageSelectionTitle": "Вибір зображення профілю",
|
||||
"ProfileImageSelectionHeader": "Виберіть зображення профілю",
|
||||
"ProfileImageSelectionNote": "Ви можете імпортувати власне зображення профілю або вибрати аватар із мікропрограми системи",
|
||||
|
@ -289,16 +294,12 @@
|
|||
"ControllerSettingsSaveProfileToolTip": "Зберегти профіль",
|
||||
"MenuBarFileToolsTakeScreenshot": "Зробити знімок екрана",
|
||||
"MenuBarFileToolsHideUi": "Сховати інтерфейс",
|
||||
"GameListContextMenuRunApplication": "Run Application",
|
||||
"GameListContextMenuRunApplication": "Запустити додаток",
|
||||
"GameListContextMenuToggleFavorite": "Перемкнути вибране",
|
||||
"GameListContextMenuToggleFavoriteToolTip": "Перемкнути улюблений статус гри",
|
||||
"SettingsTabGeneralTheme": "Тема",
|
||||
"SettingsTabGeneralThemeCustomTheme": "Користувацький шлях до теми",
|
||||
"SettingsTabGeneralThemeBaseStyle": "Базовий стиль",
|
||||
"SettingsTabGeneralThemeBaseStyleDark": "Темна",
|
||||
"SettingsTabGeneralThemeBaseStyleLight": "Світла",
|
||||
"SettingsTabGeneralThemeEnableCustomTheme": "Увімкнути користуваьку тему",
|
||||
"ButtonBrowse": "Огляд",
|
||||
"SettingsTabGeneralTheme": "Тема:",
|
||||
"SettingsTabGeneralThemeDark": "Темна",
|
||||
"SettingsTabGeneralThemeLight": "Світла",
|
||||
"ControllerSettingsConfigureGeneral": "Налаштування",
|
||||
"ControllerSettingsRumble": "Вібрація",
|
||||
"ControllerSettingsRumbleStrongMultiplier": "Множник сильної вібрації",
|
||||
|
@ -332,8 +333,6 @@
|
|||
"DialogUpdaterAddingFilesMessage": "Додавання нового оновлення...",
|
||||
"DialogUpdaterCompleteMessage": "Оновлення завершено!",
|
||||
"DialogUpdaterRestartMessage": "Перезапустити Ryujinx зараз?",
|
||||
"DialogUpdaterArchNotSupportedMessage": "Ви використовуєте не підтримувану архітектуру системи!",
|
||||
"DialogUpdaterArchNotSupportedSubMessage": "(Підтримуються лише системи x64!)",
|
||||
"DialogUpdaterNoInternetMessage": "Ви не підключені до Інтернету!",
|
||||
"DialogUpdaterNoInternetSubMessage": "Будь ласка, переконайтеся, що у вас є робоче підключення до Інтернету!",
|
||||
"DialogUpdaterDirtyBuildMessage": "Ви не можете оновити брудну збірку Ryujinx!",
|
||||
|
@ -342,13 +341,13 @@
|
|||
"DialogThemeRestartMessage": "Тему збережено. Щоб застосувати тему, потрібен перезапуск.",
|
||||
"DialogThemeRestartSubMessage": "Ви хочете перезапустити",
|
||||
"DialogFirmwareInstallEmbeddedMessage": "Бажаєте встановити прошивку, вбудовану в цю гру? (Прошивка {0})",
|
||||
"DialogFirmwareInstallEmbeddedSuccessMessage": "Встановлену прошивку не знайдено, але Ryujinx вдалося встановити прошивку {0} з наданої гри.\\nТепер запуститься емулятор.",
|
||||
"DialogFirmwareInstallEmbeddedSuccessMessage": "Встановлену прошивку не знайдено, але Ryujinx вдалося встановити прошивку {0} з наданої гри.\nТепер запуститься емулятор.",
|
||||
"DialogFirmwareNoFirmwareInstalledMessage": "Прошивка не встановлена",
|
||||
"DialogFirmwareInstalledMessage": "Встановлено прошивку {0}",
|
||||
"DialogInstallFileTypesSuccessMessage": "Successfully installed file types!",
|
||||
"DialogInstallFileTypesErrorMessage": "Failed to install file types.",
|
||||
"DialogUninstallFileTypesSuccessMessage": "Successfully uninstalled file types!",
|
||||
"DialogUninstallFileTypesErrorMessage": "Failed to uninstall file types.",
|
||||
"DialogInstallFileTypesSuccessMessage": "Успішно встановлено типи файлів!",
|
||||
"DialogInstallFileTypesErrorMessage": "Не вдалося встановити типи файлів.",
|
||||
"DialogUninstallFileTypesSuccessMessage": "Успішно видалено типи файлів!",
|
||||
"DialogUninstallFileTypesErrorMessage": "Не вдалося видалити типи файлів.",
|
||||
"DialogOpenSettingsWindowLabel": "Відкрити вікно налаштувань",
|
||||
"DialogControllerAppletTitle": "Аплет контролера",
|
||||
"DialogMessageDialogErrorExceptionMessage": "Помилка показу діалогового вікна повідомлення: {0}",
|
||||
|
@ -380,12 +379,15 @@
|
|||
"DialogFirmwareInstallerFirmwareInstallSuccessMessage": "Версію системи {0} успішно встановлено.",
|
||||
"DialogUserProfileDeletionWarningMessage": "Якщо вибраний профіль буде видалено, інші профілі не відкриватимуться",
|
||||
"DialogUserProfileDeletionConfirmMessage": "Ви хочете видалити вибраний профіль",
|
||||
"DialogUserProfileUnsavedChangesTitle": "Warning - Unsaved Changes",
|
||||
"DialogUserProfileUnsavedChangesMessage": "You have made changes to this user profile that have not been saved.",
|
||||
"DialogUserProfileUnsavedChangesSubMessage": "Do you want to discard your changes?",
|
||||
"DialogUserProfileUnsavedChangesTitle": "Увага — Незбережені зміни",
|
||||
"DialogUserProfileUnsavedChangesMessage": "Ви зробили зміни у цьому профілю користувача які не було збережено.",
|
||||
"DialogUserProfileUnsavedChangesSubMessage": "Бажаєте скасувати зміни?",
|
||||
"DialogControllerSettingsModifiedConfirmMessage": "Поточні налаштування контролера оновлено.",
|
||||
"DialogControllerSettingsModifiedConfirmSubMessage": "Ви хочете зберегти?",
|
||||
"DialogLoadNcaErrorMessage": "{0}. Файл з помилкою: {1}",
|
||||
"DialogLoadFileErrorMessage": "{0}. Файл з помилкою: {1}",
|
||||
"DialogModAlreadyExistsMessage": "Модифікація вже існує",
|
||||
"DialogModInvalidMessage": "Вказаний каталог не містить модифікації!",
|
||||
"DialogModDeleteNoParentMessage": "Не видалено: Не знайдено батьківський каталог для модифікації \"{0}\"!",
|
||||
"DialogDlcNoDlcErrorMessage": "Зазначений файл не містить DLC для вибраного заголовку!",
|
||||
"DialogPerformanceCheckLoggingEnabledMessage": "Ви увімкнули журнал налагодження, призначений лише для розробників.",
|
||||
"DialogPerformanceCheckLoggingEnabledConfirmMessage": "Для оптимальної продуктивності рекомендується вимкнути ведення журналу налагодження. Ви хочете вимкнути ведення журналу налагодження зараз?",
|
||||
|
@ -396,6 +398,8 @@
|
|||
"DialogUpdateAddUpdateErrorMessage": "Зазначений файл не містить оновлення для вибраного заголовка!",
|
||||
"DialogSettingsBackendThreadingWarningTitle": "Попередження - потокове керування сервером",
|
||||
"DialogSettingsBackendThreadingWarningMessage": "Ryujinx потрібно перезапустити після зміни цього параметра, щоб він застосовувався повністю. Залежно від вашої платформи вам може знадобитися вручну вимкнути власну багатопотоковість драйвера під час використання Ryujinx.",
|
||||
"DialogModManagerDeletionWarningMessage": "Ви збираєтесь видалити модифікацію: {0}\n\nВи дійсно бажаєте продовжити?",
|
||||
"DialogModManagerDeletionAllWarningMessage": "Ви збираєтесь видалити всі модифікації для цього Додатка.\n\nВи дійсно бажаєте продовжити?",
|
||||
"SettingsTabGraphicsFeaturesOptions": "Особливості",
|
||||
"SettingsTabGraphicsBackendMultithreading": "Багатопотоковість графічного сервера:",
|
||||
"CommonAuto": "Авто",
|
||||
|
@ -430,8 +434,9 @@
|
|||
"DlcManagerRemoveAllButton": "Видалити все",
|
||||
"DlcManagerEnableAllButton": "Увімкнути всі",
|
||||
"DlcManagerDisableAllButton": "Вимкнути всі",
|
||||
"ModManagerDeleteAllButton": "Видалити все",
|
||||
"MenuBarOptionsChangeLanguage": "Змінити мову",
|
||||
"MenuBarShowFileTypes": "Show File Types",
|
||||
"MenuBarShowFileTypes": "Показати типи файлів",
|
||||
"CommonSort": "Сортувати",
|
||||
"CommonShowNames": "Показати назви",
|
||||
"CommonFavorite": "Вибрані",
|
||||
|
@ -447,13 +452,13 @@
|
|||
"CustomThemePathTooltip": "Шлях до користувацької теми графічного інтерфейсу",
|
||||
"CustomThemeBrowseTooltip": "Огляд користувацької теми графічного інтерфейсу",
|
||||
"DockModeToggleTooltip": "У режимі док-станції емульована система веде себе як приєднаний Nintendo Switch. Це покращує точність графіки в більшості ігор. І навпаки, вимкнення цього призведе до того, що емульована система поводитиметься як портативний комутатор Nintendo, погіршуючи якість графіки.\n\nНалаштуйте елементи керування для гравця 1, якщо плануєте використовувати режим док-станції; налаштуйте ручні елементи керування, якщо плануєте використовувати портативний режим.\n\nЗалиште увімкненим, якщо не впевнені.",
|
||||
"DirectKeyboardTooltip": "Підтримка прямого доступу з клавіатури (HID). Надає іграм доступ до клавіатури як пристрою для введення тексту.",
|
||||
"DirectMouseTooltip": "Підтримка прямого доступу миші (HID). Надає іграм доступ до миші як вказівного пристрою.",
|
||||
"DirectKeyboardTooltip": "Підтримка прямого доступу до клавіатури (HID). Надає іграм доступ до клавіатури для вводу тексту.\n\nПрацює тільки з іграми, які підтримують клавіатуру на обладнанні Switch.\n\nЗалиште вимкненим, якщо не впевнені.",
|
||||
"DirectMouseTooltip": "Підтримка прямого доступу до миші (HID). Надає іграм доступ до миші, як пристрій вказування.\n\nПрацює тільки з іграми, які підтримують мишу на обладнанні Switch, їх небагато.\n\nФункціонал сенсорного екрана може не працювати, якщо функція ввімкнена.\n\nЗалиште вимкненим, якщо не впевнені.",
|
||||
"RegionTooltip": "Змінити регіон системи",
|
||||
"LanguageTooltip": "Змінити мову системи",
|
||||
"TimezoneTooltip": "Змінити часовий пояс системи",
|
||||
"TimeTooltip": "Змінити час системи",
|
||||
"VSyncToggleTooltip": "Емульована вертикальна синхронізація консолі. По суті, обмежувач кадрів для більшості ігор; його вимкнення може призвести до того, що ігри працюватимуть на вищій швидкості, екрани завантаження триватимуть довше чи зупинятимуться.\n\nМожна перемикати в грі гарячою клавішею за вашим бажанням. Ми рекомендуємо зробити це, якщо ви плануєте вимкнути його.\n\nЗалиште увімкненим, якщо не впевнені.",
|
||||
"VSyncToggleTooltip": "Емульована вертикальна синхронізація консолі. По суті, обмежувач кадрів для більшості ігор; його вимкнення може призвести до того, що ігри працюватимуть на вищій швидкості, екрани завантаження триватимуть довше чи зупинятимуться.\n\nМожна перемикати в грі гарячою клавішею (За умовчанням F1). Якщо ви плануєте вимкнути функцію, рекомендуємо зробити це через гарячу клавішу.\n\nЗалиште увімкненим, якщо не впевнені.",
|
||||
"PptcToggleTooltip": "Зберігає перекладені функції JIT, щоб їх не потрібно було перекладати кожного разу, коли гра завантажується.\n\nЗменшує заїкання та значно прискорює час завантаження після першого завантаження гри.\n\nЗалиште увімкненим, якщо не впевнені.",
|
||||
"FsIntegrityToggleTooltip": "Перевіряє наявність пошкоджених файлів під час завантаження гри, і якщо виявлено пошкоджені файли, показує помилку хешу в журналі.\n\nНе впливає на продуктивність і призначений для усунення несправностей.\n\nЗалиште увімкненим, якщо не впевнені.",
|
||||
"AudioBackendTooltip": "Змінює серверну частину, яка використовується для відтворення аудіо.\n\nSDL2 є кращим, тоді як OpenAL і SoundIO використовуються як резервні варіанти. Dummy не матиме звуку.\n\nВстановіть SDL2, якщо не впевнені.",
|
||||
|
@ -461,16 +466,16 @@
|
|||
"MemoryManagerSoftwareTooltip": "Використовує програмну таблицю сторінок для перекладу адрес. Найвища точність, але найповільніша продуктивність.",
|
||||
"MemoryManagerHostTooltip": "Пряме відображення пам'яті в адресному просторі хосту. Набагато швидша компіляція та виконання JIT.",
|
||||
"MemoryManagerUnsafeTooltip": "Пряме відображення пам’яті, але не маскує адресу в гостьовому адресному просторі перед доступом. Швидше, але ціною безпеки. Гостьова програма може отримати доступ до пам’яті з будь-якого місця в Ryujinx, тому запускайте в цьому режимі лише програми, яким ви довіряєте.",
|
||||
"UseHypervisorTooltip": "Use Hypervisor instead of JIT. Greatly improves performance when available, but can be unstable in its current state.",
|
||||
"UseHypervisorTooltip": "Використання гіпервізор замість JIT. Значно покращує продуктивність, коли доступний, але може бути нестабільним у поточному стані.",
|
||||
"DRamTooltip": "Використовує альтернативний макет MemoryMode для імітації моделі розробки Switch.\n\nЦе корисно лише для пакетів текстур з вищою роздільною здатністю або модифікацій із роздільною здатністю 4K. НЕ покращує продуктивність.\n\nЗалиште вимкненим, якщо не впевнені.",
|
||||
"IgnoreMissingServicesTooltip": "Ігнорує нереалізовані служби Horizon OS. Це може допомогти в обході збоїв під час завантаження певних ігор.\n\nЗалиште вимкненим, якщо не впевнені.",
|
||||
"GraphicsBackendThreadingTooltip": "Виконує команди графічного сервера в другому потоці.\n\nПрискорює компіляцію шейдерів, зменшує затримки та покращує продуктивність драйверів GPU без власної підтримки багатопоточності. Трохи краща продуктивність на драйверах з багатопотоковістю.\nВстановіть значення «Авто», якщо не впевнені",
|
||||
"GalThreadingTooltip": "Виконує команди графічного сервера в другому потоці.\n\nПрискорює компіляцію шейдерів, зменшує затримки та покращує продуктивність драйверів GPU без власної підтримки багатопоточності. Трохи краща продуктивність на драйверах з багатопотоковістю.\n\nВстановіть значення «Авто», якщо не впевнені.",
|
||||
"ShaderCacheToggleTooltip": "Зберігає кеш дискового шейдера, що зменшує затримки під час наступних запусків.\n\nЗалиште увімкненим, якщо не впевнені.",
|
||||
"ResolutionScaleTooltip": "Масштаб роздільної здатності, застосована до відповідних цілей візуалізації",
|
||||
"ResolutionScaleTooltip": "Множить роздільну здатність гри.\n\nДеякі ігри можуть не працювати з цією функцією, і виглядатимуть піксельними; для цих ігор треба знайти модифікації, що зупиняють згладжування або підвищують роздільну здатність. Для останніх модифікацій, вибирайте \"Native\".\n\nЦей параметр можна міняти коли гра запущена кліком на \"Застосувати\"; ви можете перемістити вікно налаштувань і поекспериментувати з видом гри.\n\nМайте на увазі, що 4x це занадто для будь-якого комп'ютера.",
|
||||
"ResolutionScaleEntryTooltip": "Масштаб роздільної здатності з плаваючою комою, наприклад 1,5. Не інтегральні масштаби, швидше за все, спричинять проблеми або збій.",
|
||||
"AnisotropyTooltip": "Рівень анізотропної фільтрації (встановіть на «Авто», щоб використовувати значення, яке вимагає гра)",
|
||||
"AspectRatioTooltip": "Співвідношення сторін, застосоване до вікна візуалізації.",
|
||||
"AnisotropyTooltip": "Рівень анізотропної фільтрації. Встановіть на «Авто», щоб використовувати значення, яке вимагає гра.",
|
||||
"AspectRatioTooltip": "Співвідношення сторін застосовано до вікна рендера.\n\nМіняйте тільки, якщо використовуєте модифікацію співвідношення сторін для гри, інакше графіка буде розтягнута.\n\nЗалиште на \"16:9\", якщо не впевнені.",
|
||||
"ShaderDumpPathTooltip": "Шлях скидання графічних шейдерів",
|
||||
"FileLogTooltip": "Зберігає журнал консолі у файл журналу на диску. Не впливає на продуктивність.",
|
||||
"StubLogTooltip": "Друкує повідомлення журналу-заглушки на консолі. Не впливає на продуктивність.",
|
||||
|
@ -504,6 +509,8 @@
|
|||
"EnableInternetAccessTooltip": "Дозволяє емульованій програмі підключатися до Інтернету.\n\nІгри з режимом локальної мережі можуть підключатися одна до одної, якщо це увімкнено, і системи підключені до однієї точки доступу. Сюди входять і справжні консолі.\n\nНЕ дозволяє підключатися до серверів Nintendo. Може призвести до збою в деяких іграх, які намагаються підключитися до Інтернету.\n\nЗалиште вимкненим, якщо не впевнені.",
|
||||
"GameListContextMenuManageCheatToolTip": "Керування читами",
|
||||
"GameListContextMenuManageCheat": "Керування читами",
|
||||
"GameListContextMenuManageModToolTip": "Керування модами",
|
||||
"GameListContextMenuManageMod": "Керування модами",
|
||||
"ControllerSettingsStickRange": "Діапазон:",
|
||||
"DialogStopEmulationTitle": "Ryujinx - Зупинити емуляцію",
|
||||
"DialogStopEmulationMessage": "Ви впевнені, що хочете зупинити емуляцію?",
|
||||
|
@ -515,8 +522,6 @@
|
|||
"SettingsTabCpuMemory": "Пам'ять ЦП",
|
||||
"DialogUpdaterFlatpakNotSupportedMessage": "Будь ласка, оновіть Ryujinx через FlatHub.",
|
||||
"UpdaterDisabledWarningTitle": "Програму оновлення вимкнено!",
|
||||
"GameListContextMenuOpenSdModsDirectory": "Відкрити каталог модифікацій Atmosphere",
|
||||
"GameListContextMenuOpenSdModsDirectoryToolTip": "Відкриває альтернативний каталог SD-карти Atmosphere, який містить модифікації програми. Корисно для модифікацій, упакованих для реального обладнання.",
|
||||
"ControllerSettingsRotate90": "Повернути на 90° за годинниковою стрілкою",
|
||||
"IconSize": "Розмір значка",
|
||||
"IconSizeTooltip": "Змінити розмір значків гри",
|
||||
|
@ -544,12 +549,13 @@
|
|||
"SwkbdMinCharacters": "Мінімальна кількість символів: {0}",
|
||||
"SwkbdMinRangeCharacters": "Має бути {0}-{1} символів",
|
||||
"SoftwareKeyboard": "Програмна клавіатура",
|
||||
"SoftwareKeyboardModeNumbersOnly": "Must be numbers only",
|
||||
"SoftwareKeyboardModeAlphabet": "Must be non CJK-characters only",
|
||||
"SoftwareKeyboardModeASCII": "Must be ASCII text only",
|
||||
"DialogControllerAppletMessagePlayerRange": "Програма запитує {0} гравця(ів) з:\n\nТИПИ: {1}\n\nГРАВЦІ: {2}\n\n{3}Будь ласка, відкрийте «Налаштування» та повторно налаштуйте «Введення» або натисніть «Закрити».",
|
||||
"DialogControllerAppletMessage": "Програма запитує рівно стільки гравців: {0} з:\n\nТИПАМИ: {1}\n\nГРАВЦІВ: {2}\n\n{3}Будь ласка, відкрийте «Налаштування» та повторно налаштуйте «Введення» або натисніть «Закрити».",
|
||||
"DialogControllerAppletDockModeSet": "Встановлено режим док-станції. Ручний також недійсний.\n",
|
||||
"SoftwareKeyboardModeNumeric": "Повинно бути лише 0-9 або “.”",
|
||||
"SoftwareKeyboardModeAlphabet": "Повинно бути лише не CJK-символи",
|
||||
"SoftwareKeyboardModeASCII": "Повинно бути лише ASCII текст",
|
||||
"ControllerAppletControllers": "Підтримувані контролери:",
|
||||
"ControllerAppletPlayers": "Гравці:",
|
||||
"ControllerAppletDescription": "Поточна конфігурація невірна. Відкрийте налаштування та переналаштуйте Ваші дані.",
|
||||
"ControllerAppletDocked": "Встановлений режим в док-станції. Вимкніть портативні контролери.",
|
||||
"UpdaterRenaming": "Перейменування старих файлів...",
|
||||
"UpdaterRenameFailed": "Програмі оновлення не вдалося перейменувати файл: {0}",
|
||||
"UpdaterAddingFiles": "Додавання нових файлів...",
|
||||
|
@ -587,42 +593,45 @@
|
|||
"Writable": "Можливість запису",
|
||||
"SelectDlcDialogTitle": "Виберіть файли DLC",
|
||||
"SelectUpdateDialogTitle": "Виберіть файли оновлення",
|
||||
"SelectModDialogTitle": "Виберіть теку з модами",
|
||||
"UserProfileWindowTitle": "Менеджер профілів користувачів",
|
||||
"CheatWindowTitle": "Менеджер читів",
|
||||
"DlcWindowTitle": "Менеджер вмісту для завантаження",
|
||||
"UpdateWindowTitle": "Менеджер оновлення назв",
|
||||
"CheatWindowHeading": "Коди доступні для {0} [{1}]",
|
||||
"BuildId": "BuildId:",
|
||||
"BuildId": "ID збірки:",
|
||||
"DlcWindowHeading": "Вміст для завантаження, доступний для {1} ({2}): {0}",
|
||||
"ModWindowHeading": "{0} мод(ів)",
|
||||
"UserProfilesEditProfile": "Редагувати вибране",
|
||||
"Cancel": "Скасувати",
|
||||
"Save": "Зберегти",
|
||||
"Discard": "Скасувати",
|
||||
"Paused": "Призупинено",
|
||||
"UserProfilesSetProfileImage": "Встановити зображення профілю",
|
||||
"UserProfileEmptyNameError": "Назва обов'язкова",
|
||||
"UserProfileNoImageError": "Зображення профілю обов'язкове",
|
||||
"UserProfileEmptyNameError": "Імʼя обовʼязкове",
|
||||
"UserProfileNoImageError": "Зображення профілю обовʼязкове",
|
||||
"GameUpdateWindowHeading": "{0} Доступні оновлення для {1} ({2})",
|
||||
"SettingsTabHotkeysResScaleUpHotkey": "Збільшити роздільну здатність:",
|
||||
"SettingsTabHotkeysResScaleDownHotkey": "Зменшити роздільну здатність:",
|
||||
"UserProfilesName": "Ім'я",
|
||||
"SettingsTabHotkeysResScaleUpHotkey": "Збільшити роздільність:",
|
||||
"SettingsTabHotkeysResScaleDownHotkey": "Зменшити роздільність:",
|
||||
"UserProfilesName": "Імʼя",
|
||||
"UserProfilesUserId": "ID користувача:",
|
||||
"SettingsTabGraphicsBackend": "Графічний сервер",
|
||||
"SettingsTabGraphicsBackendTooltip": "Графічний сервер для використання",
|
||||
"SettingsTabGraphicsBackendTooltip": "Виберіть backend графіки, що буде використовуватись в емуляторі.\n\n\"Vulkan\" краще для всіх сучасних відеокарт, якщо драйвери вчасно оновлюються. У Vulkan також швидше компілюються шейдери (менше \"заїкання\" зображення) на відеокартах всіх компаній.\n\n\"OpenGL\" може дати кращі результати на старих відеокартах Nvidia, старих відеокартах AMD на Linux, або на відеокартах з маленькою кількістю VRAM, але \"заїкання\" через компіляцію шейдерів будуть частіші.\n\nЯкщо не впевнені, встановіть на \"Vulkan\". Встановіть на \"OpenGL\", якщо Ваша відеокарта не підтримує Vulkan навіть на останніх драйверах.",
|
||||
"SettingsEnableTextureRecompression": "Увімкнути рекомпресію текстури",
|
||||
"SettingsEnableTextureRecompressionTooltip": "Стискає певні текстури, щоб зменшити використання VRAM.\n\nРекомендовано для використання з графічними процесорами, які мають менш ніж 4 ГБ відеопам’яті.\n\nЗалиште вимкненим, якщо не впевнені.",
|
||||
"SettingsEnableTextureRecompressionTooltip": "Стискає текстури ASTC, щоб зменшити використання VRAM.\n\nЦим форматом текстур користуються такі ігри, як Astral Chain, Bayonetta 3, Fire Emblem Engage, Metroid Prime Remastered, Super Mario Bros. Wonder і The Legend of Zelda: Tears of the Kingdom.\n\nЦі ігри, скоріше всього крашнуться на відеокартах з розміром VRAM в 4 Гб і менше.\n\nВмикайте тільки якщо у Вас закінчується VRAM на цих іграх. Залиште на \"Вимкнути\", якщо не впевнені.",
|
||||
"SettingsTabGraphicsPreferredGpu": "Бажаний GPU",
|
||||
"SettingsTabGraphicsPreferredGpuTooltip": "Виберіть відеокарту, яка використовуватиметься з графічним сервером Vulkan.\n\nНе впливає на графічний процесор, який використовуватиме OpenGL.\n\nЯкщо не впевнені, встановіть графічний процесор, позначений як «dGPU». Якщо такого немає, залиште це.",
|
||||
"SettingsTabGraphicsPreferredGpuTooltip": "Виберіть відеокарту, яка використовуватиметься з графічним сервером Vulkan.\n\nНе впливає на графічний процесор, який використовуватиме OpenGL.\n\nВстановіть графічний процесор, позначений як «dGPU», якщо не впевнені. Якщо такого немає, не чіпайте.",
|
||||
"SettingsAppRequiredRestartMessage": "Необхідно перезапустити Ryujinx",
|
||||
"SettingsGpuBackendRestartMessage": "Налаштування графічного сервера або GPU було змінено. Для цього знадобиться перезапуск",
|
||||
"SettingsGpuBackendRestartSubMessage": "Ви хочете перезапустити зараз?",
|
||||
"RyujinxUpdaterMessage": "Хочете оновити Ryujinx до останньої версії?",
|
||||
"SettingsGpuBackendRestartSubMessage": "Бажаєте перезапустити зараз?",
|
||||
"RyujinxUpdaterMessage": "Бажаєте оновити Ryujinx до останньої версії?",
|
||||
"SettingsTabHotkeysVolumeUpHotkey": "Збільшити гучність:",
|
||||
"SettingsTabHotkeysVolumeDownHotkey": "Зменшити гучність:",
|
||||
"SettingsEnableMacroHLE": "Увімкнути макрос HLE",
|
||||
"SettingsEnableMacroHLETooltip": "Високорівнева емуляція коду макросу GPU.\n\nПокращує продуктивність, але може викликати графічні збої в деяких іграх.\n\nЗалиште увімкненим, якщо не впевнені.",
|
||||
"SettingsEnableColorSpacePassthrough": "Color Space Passthrough",
|
||||
"SettingsEnableColorSpacePassthroughTooltip": "Directs the Vulkan backend to pass through color information without specifying a color space. For users with wide gamut displays, this may result in more vibrant colors, at the cost of color correctness.",
|
||||
"VolumeShort": "Гуч",
|
||||
"SettingsEnableColorSpacePassthrough": "Наскрізний колірний простір",
|
||||
"SettingsEnableColorSpacePassthroughTooltip": "Дозволяє серверу Vulkan передавати інформацію про колір без вказівки колірного простору. Для користувачів з екранами з широкою гамою це може призвести до більш яскравих кольорів, але шляхом втрати коректності передачі кольору.",
|
||||
"VolumeShort": "Гуч.",
|
||||
"UserProfilesManageSaves": "Керувати збереженнями",
|
||||
"DeleteUserSave": "Ви хочете видалити збереження користувача для цієї гри?",
|
||||
"IrreversibleActionNote": "Цю дію не можна скасувати.",
|
||||
|
@ -634,23 +643,31 @@
|
|||
"UserProfilesRecoverLostAccounts": "Відновлення втрачених облікових записів",
|
||||
"Recover": "Відновити",
|
||||
"UserProfilesRecoverHeading": "Знайдено збереження для наступних облікових записів",
|
||||
"UserProfilesRecoverEmptyList": "No profiles to recover",
|
||||
"GraphicsAATooltip": "Applies anti-aliasing to the game render",
|
||||
"GraphicsAALabel": "Anti-Aliasing:",
|
||||
"GraphicsScalingFilterLabel": "Scaling Filter:",
|
||||
"GraphicsScalingFilterTooltip": "Enables Framebuffer Scaling",
|
||||
"GraphicsScalingFilterLevelLabel": "Level",
|
||||
"GraphicsScalingFilterLevelTooltip": "Set Scaling Filter Level",
|
||||
"SmaaLow": "SMAA Low",
|
||||
"SmaaMedium": "SMAA Medium",
|
||||
"SmaaHigh": "SMAA High",
|
||||
"SmaaUltra": "SMAA Ultra",
|
||||
"UserEditorTitle": "Edit User",
|
||||
"UserEditorTitleCreate": "Create User",
|
||||
"SettingsTabNetworkInterface": "Network Interface:",
|
||||
"NetworkInterfaceTooltip": "The network interface used for LAN features",
|
||||
"NetworkInterfaceDefault": "Default",
|
||||
"PackagingShaders": "Packaging Shaders",
|
||||
"AboutChangelogButton": "View Changelog on GitHub",
|
||||
"AboutChangelogButtonTooltipMessage": "Click to open the changelog for this version in your default browser."
|
||||
}
|
||||
"UserProfilesRecoverEmptyList": "Немає профілів для відновлення",
|
||||
"GraphicsAATooltip": "Застосовує згладження до рендера гри.\n\nFXAA розмиє більшість зображення, а SMAA спробує знайти нерівні краї та згладити їх.\n\nНе рекомендується використовувати разом з фільтром масштабування FSR.\n\nЦю опцію можна міняти коли гра запущена кліком на \"Застосувати; ви можете відсунути вікно налаштувань і поекспериментувати з видом гри.\n\nЗалиште на \"Немає\", якщо не впевнені.",
|
||||
"GraphicsAALabel": "Згладжування:",
|
||||
"GraphicsScalingFilterLabel": "Фільтр масштабування:",
|
||||
"GraphicsScalingFilterTooltip": "Виберіть фільтр масштабування, що використається при збільшенні роздільної здатності.\n\n\"Білінійний\" добре виглядає в 3D іграх, і хороше налаштування за умовчуванням.\n\n\"Найближчий\" рекомендується для ігор з піксель-артом.\n\n\"FSR 1.0\" - це просто фільтр різкості, не рекомендується використовувати разом з FXAA або SMAA.\n\nЦю опцію можна міняти коли гра запущена кліком на \"Застосувати; ви можете відсунути вікно налаштувань і поекспериментувати з видом гри.\n\nЗалиште на \"Білінійний\", якщо не впевнені.",
|
||||
"GraphicsScalingFilterBilinear": "Білінійний",
|
||||
"GraphicsScalingFilterNearest": "Найближчий",
|
||||
"GraphicsScalingFilterFsr": "FSR",
|
||||
"GraphicsScalingFilterLevelLabel": "Рівень",
|
||||
"GraphicsScalingFilterLevelTooltip": "Встановити рівень різкості в FSR 1.0. Чим вище - тим різкіше.",
|
||||
"SmaaLow": "SMAA Низький",
|
||||
"SmaaMedium": "SMAA Середній",
|
||||
"SmaaHigh": "SMAA Високий",
|
||||
"SmaaUltra": "SMAA Ультра",
|
||||
"UserEditorTitle": "Редагувати користувача",
|
||||
"UserEditorTitleCreate": "Створити користувача",
|
||||
"SettingsTabNetworkInterface": "Мережевий інтерфейс:",
|
||||
"NetworkInterfaceTooltip": "Мережевий інтерфейс, що використовується для LAN/LDN.\n\nРазом з VPN або XLink Kai, і грою що підтримує LAN, може імітувати з'єднання в однаковій мережі через Інтернет.",
|
||||
"NetworkInterfaceDefault": "Стандартний",
|
||||
"PackagingShaders": "Пакування шейдерів",
|
||||
"AboutChangelogButton": "Переглянути журнал змін на GitHub",
|
||||
"AboutChangelogButtonTooltipMessage": "Клацніть, щоб відкрити журнал змін для цієї версії у стандартному браузері.",
|
||||
"SettingsTabNetworkMultiplayer": "Мережева гра",
|
||||
"MultiplayerMode": "Режим:",
|
||||
"MultiplayerModeTooltip": "Змінити LDN мультиплеєру.\n\nLdnMitm змінить функціонал бездротової/локальної гри в іграх, щоб вони працювали так, ніби це LAN, що дозволяє локальні підключення в тій самій мережі з іншими екземплярами Ryujinx та хакнутими консолями Nintendo Switch, які мають встановлений модуль ldn_mitm.\n\nМультиплеєр вимагає, щоб усі гравці були на одній і тій же версії гри (наприклад Super Smash Bros. Ultimate v13.0.1 не зможе під'єднатися до v13.0.0).\n\nЗалиште на \"Вимкнено\", якщо не впевнені, ",
|
||||
"MultiplayerModeDisabled": "Вимкнено",
|
||||
"MultiplayerModeLdnMitm": "ldn_mitm"
|
||||
}
|
||||
|
|