Merge branch 'master' into pr/418
This commit is contained in:
commit
1a3bbf71cd
@ -14,20 +14,20 @@ namespace Ryujinx.BuildValidationTasks
|
||||
{
|
||||
string path = System.Reflection.Assembly.GetExecutingAssembly().Location;
|
||||
|
||||
if (path.Split(new string[] { "src" }, StringSplitOptions.None).Length == 1 )
|
||||
if (path.Split(["src"], StringSplitOptions.None).Length == 1)
|
||||
{
|
||||
//i assume that we are in a build directory in the solution dir
|
||||
path = new FileInfo(path).Directory.Parent.GetDirectories("src")[0].GetDirectories("Ryujinx")[0].GetDirectories("Assets")[0].GetFiles("locales.json")[0].FullName;
|
||||
path = new FileInfo(path).Directory!.Parent!.GetDirectories("src")[0].GetDirectories("Ryujinx")[0].GetDirectories("Assets")[0].GetFiles("locales.json")[0].FullName;
|
||||
}
|
||||
else
|
||||
{
|
||||
path = path.Split(new string[] { "src" }, StringSplitOptions.None)[0];
|
||||
path = new FileInfo(path).Directory.GetDirectories("src")[0].GetDirectories("Ryujinx")[0].GetDirectories("Assets")[0].GetFiles("locales.json")[0].FullName;
|
||||
path = path.Split(["src"], StringSplitOptions.None)[0];
|
||||
path = new FileInfo(path).Directory!.GetDirectories("src")[0].GetDirectories("Ryujinx")[0].GetDirectories("Assets")[0].GetFiles("locales.json")[0].FullName;
|
||||
}
|
||||
|
||||
string data;
|
||||
|
||||
using (StreamReader sr = new StreamReader(path))
|
||||
using (StreamReader sr = new(path))
|
||||
{
|
||||
data = sr.ReadToEnd();
|
||||
}
|
||||
@ -38,13 +38,10 @@ namespace Ryujinx.BuildValidationTasks
|
||||
{
|
||||
LocalesEntry locale = json.Locales[i];
|
||||
|
||||
foreach (string language in json.Languages)
|
||||
foreach (string langCode in json.Languages.Where(it => !locale.Translations.ContainsKey(it)))
|
||||
{
|
||||
if (!locale.Translations.ContainsKey(language))
|
||||
{
|
||||
locale.Translations.Add(language, "");
|
||||
Log.LogMessage(MessageImportance.High, $"Added {{{language}}} to Locale {{{locale.ID}}}");
|
||||
}
|
||||
locale.Translations.Add(langCode, string.Empty);
|
||||
Log.LogMessage(MessageImportance.High, $"Added '{langCode}' to Locale '{locale.ID}'");
|
||||
}
|
||||
|
||||
locale.Translations = locale.Translations.OrderBy(pair => pair.Key).ToDictionary(pair => pair.Key, pair => pair.Value);
|
||||
@ -53,7 +50,7 @@ namespace Ryujinx.BuildValidationTasks
|
||||
|
||||
string jsonString = JsonConvert.SerializeObject(json, Formatting.Indented);
|
||||
|
||||
using (StreamWriter sw = new StreamWriter(path))
|
||||
using (StreamWriter sw = new(path))
|
||||
{
|
||||
sw.Write(jsonString);
|
||||
}
|
||||
|
@ -6,7 +6,6 @@ namespace Ryujinx.Common
|
||||
// DO NOT EDIT, filled by CI
|
||||
public static class ReleaseInformation
|
||||
{
|
||||
private const string FlatHubChannel = "flathub";
|
||||
private const string CanaryChannel = "canary";
|
||||
private const string ReleaseChannel = "release";
|
||||
|
||||
@ -29,8 +28,6 @@ namespace Ryujinx.Common
|
||||
!ReleaseChannelRepo.StartsWith("%%") &&
|
||||
!ConfigFileName.StartsWith("%%");
|
||||
|
||||
public static bool IsFlatHubBuild => IsValid && ReleaseChannelOwner.Equals(FlatHubChannel);
|
||||
|
||||
public static bool IsCanaryBuild => IsValid && ReleaseChannelName.Equals(CanaryChannel);
|
||||
|
||||
public static bool IsReleaseBuild => IsValid && ReleaseChannelName.Equals(ReleaseChannel);
|
||||
|
@ -230,25 +230,20 @@ namespace Ryujinx.Cpu.AppleHv
|
||||
{
|
||||
if (size == 0)
|
||||
{
|
||||
return Enumerable.Empty<HostMemoryRange>();
|
||||
yield break;
|
||||
}
|
||||
|
||||
var guestRegions = GetPhysicalRegionsImpl(va, size);
|
||||
if (guestRegions == null)
|
||||
{
|
||||
return null;
|
||||
yield break;
|
||||
}
|
||||
|
||||
var regions = new HostMemoryRange[guestRegions.Count];
|
||||
|
||||
for (int i = 0; i < regions.Length; i++)
|
||||
foreach (var guestRegion in guestRegions)
|
||||
{
|
||||
var guestRegion = guestRegions[i];
|
||||
nint pointer = _backingMemory.GetPointer(guestRegion.Address, guestRegion.Size);
|
||||
regions[i] = new HostMemoryRange((nuint)(ulong)pointer, guestRegion.Size);
|
||||
yield return new HostMemoryRange((nuint)(ulong)pointer, guestRegion.Size);
|
||||
}
|
||||
|
||||
return regions;
|
||||
}
|
||||
|
||||
/// <inheritdoc/>
|
||||
@ -256,23 +251,24 @@ namespace Ryujinx.Cpu.AppleHv
|
||||
{
|
||||
if (size == 0)
|
||||
{
|
||||
return Enumerable.Empty<MemoryRange>();
|
||||
yield break;
|
||||
}
|
||||
|
||||
return GetPhysicalRegionsImpl(va, size);
|
||||
foreach (var physicalRegion in GetPhysicalRegionsImpl(va, size))
|
||||
{
|
||||
yield return physicalRegion;
|
||||
}
|
||||
}
|
||||
|
||||
private List<MemoryRange> GetPhysicalRegionsImpl(ulong va, ulong size)
|
||||
private IEnumerable<MemoryRange> GetPhysicalRegionsImpl(ulong va, ulong size)
|
||||
{
|
||||
if (!ValidateAddress(va) || !ValidateAddressAndSize(va, size))
|
||||
{
|
||||
return null;
|
||||
yield break;
|
||||
}
|
||||
|
||||
int pages = GetPagesCount(va, (uint)size, out va);
|
||||
|
||||
var regions = new List<MemoryRange>();
|
||||
|
||||
ulong regionStart = GetPhysicalAddressInternal(va);
|
||||
ulong regionSize = PageSize;
|
||||
|
||||
@ -280,14 +276,14 @@ namespace Ryujinx.Cpu.AppleHv
|
||||
{
|
||||
if (!ValidateAddress(va + PageSize))
|
||||
{
|
||||
return null;
|
||||
yield break;
|
||||
}
|
||||
|
||||
ulong newPa = GetPhysicalAddressInternal(va + PageSize);
|
||||
|
||||
if (GetPhysicalAddressInternal(va) + PageSize != newPa)
|
||||
{
|
||||
regions.Add(new MemoryRange(regionStart, regionSize));
|
||||
yield return new MemoryRange(regionStart, regionSize);
|
||||
regionStart = newPa;
|
||||
regionSize = 0;
|
||||
}
|
||||
@ -296,9 +292,7 @@ namespace Ryujinx.Cpu.AppleHv
|
||||
regionSize += PageSize;
|
||||
}
|
||||
|
||||
regions.Add(new MemoryRange(regionStart, regionSize));
|
||||
|
||||
return regions;
|
||||
yield return new MemoryRange(regionStart, regionSize);
|
||||
}
|
||||
|
||||
/// <remarks>
|
||||
|
@ -250,25 +250,20 @@ namespace Ryujinx.Cpu.Jit
|
||||
{
|
||||
if (size == 0)
|
||||
{
|
||||
return Enumerable.Empty<HostMemoryRange>();
|
||||
yield break;
|
||||
}
|
||||
|
||||
var guestRegions = GetPhysicalRegionsImpl(va, size);
|
||||
if (guestRegions == null)
|
||||
{
|
||||
return null;
|
||||
yield break;
|
||||
}
|
||||
|
||||
var regions = new HostMemoryRange[guestRegions.Count];
|
||||
|
||||
for (int i = 0; i < regions.Length; i++)
|
||||
foreach (var guestRegion in guestRegions)
|
||||
{
|
||||
var guestRegion = guestRegions[i];
|
||||
nint pointer = _backingMemory.GetPointer(guestRegion.Address, guestRegion.Size);
|
||||
regions[i] = new HostMemoryRange((nuint)(ulong)pointer, guestRegion.Size);
|
||||
yield return new HostMemoryRange((nuint)(ulong)pointer, guestRegion.Size);
|
||||
}
|
||||
|
||||
return regions;
|
||||
}
|
||||
|
||||
/// <inheritdoc/>
|
||||
@ -276,23 +271,24 @@ namespace Ryujinx.Cpu.Jit
|
||||
{
|
||||
if (size == 0)
|
||||
{
|
||||
return Enumerable.Empty<MemoryRange>();
|
||||
yield break;
|
||||
}
|
||||
|
||||
return GetPhysicalRegionsImpl(va, size);
|
||||
foreach (var physicalRegion in GetPhysicalRegionsImpl(va, size))
|
||||
{
|
||||
yield return physicalRegion;
|
||||
}
|
||||
}
|
||||
|
||||
private List<MemoryRange> GetPhysicalRegionsImpl(ulong va, ulong size)
|
||||
private IEnumerable<MemoryRange> GetPhysicalRegionsImpl(ulong va, ulong size)
|
||||
{
|
||||
if (!ValidateAddress(va) || !ValidateAddressAndSize(va, size))
|
||||
{
|
||||
return null;
|
||||
yield break;
|
||||
}
|
||||
|
||||
int pages = GetPagesCount(va, (uint)size, out va);
|
||||
|
||||
var regions = new List<MemoryRange>();
|
||||
|
||||
ulong regionStart = GetPhysicalAddressInternal(va);
|
||||
ulong regionSize = PageSize;
|
||||
|
||||
@ -300,14 +296,14 @@ namespace Ryujinx.Cpu.Jit
|
||||
{
|
||||
if (!ValidateAddress(va + PageSize))
|
||||
{
|
||||
return null;
|
||||
yield break;
|
||||
}
|
||||
|
||||
ulong newPa = GetPhysicalAddressInternal(va + PageSize);
|
||||
|
||||
if (GetPhysicalAddressInternal(va) + PageSize != newPa)
|
||||
{
|
||||
regions.Add(new MemoryRange(regionStart, regionSize));
|
||||
yield return new MemoryRange(regionStart, regionSize);
|
||||
regionStart = newPa;
|
||||
regionSize = 0;
|
||||
}
|
||||
@ -316,9 +312,7 @@ namespace Ryujinx.Cpu.Jit
|
||||
regionSize += PageSize;
|
||||
}
|
||||
|
||||
regions.Add(new MemoryRange(regionStart, regionSize));
|
||||
|
||||
return regions;
|
||||
yield return new MemoryRange(regionStart, regionSize);
|
||||
}
|
||||
|
||||
/// <inheritdoc/>
|
||||
|
@ -475,17 +475,15 @@ namespace Ryujinx.Cpu.Jit
|
||||
return GetPhysicalRegionsImpl(va, size);
|
||||
}
|
||||
|
||||
private List<MemoryRange> GetPhysicalRegionsImpl(ulong va, ulong size)
|
||||
private IEnumerable<MemoryRange> GetPhysicalRegionsImpl(ulong va, ulong size)
|
||||
{
|
||||
if (!ValidateAddress(va) || !ValidateAddressAndSize(va, size))
|
||||
{
|
||||
return null;
|
||||
yield break;
|
||||
}
|
||||
|
||||
int pages = GetPagesCount(va, (uint)size, out va);
|
||||
|
||||
var regions = new List<MemoryRange>();
|
||||
|
||||
ulong regionStart = GetPhysicalAddressInternal(va);
|
||||
ulong regionSize = PageSize;
|
||||
|
||||
@ -493,14 +491,14 @@ namespace Ryujinx.Cpu.Jit
|
||||
{
|
||||
if (!ValidateAddress(va + PageSize))
|
||||
{
|
||||
return null;
|
||||
yield break;
|
||||
}
|
||||
|
||||
ulong newPa = GetPhysicalAddressInternal(va + PageSize);
|
||||
|
||||
if (GetPhysicalAddressInternal(va) + PageSize != newPa)
|
||||
{
|
||||
regions.Add(new MemoryRange(regionStart, regionSize));
|
||||
yield return new MemoryRange(regionStart, regionSize);
|
||||
regionStart = newPa;
|
||||
regionSize = 0;
|
||||
}
|
||||
@ -509,9 +507,7 @@ namespace Ryujinx.Cpu.Jit
|
||||
regionSize += PageSize;
|
||||
}
|
||||
|
||||
regions.Add(new MemoryRange(regionStart, regionSize));
|
||||
|
||||
return regions;
|
||||
yield return new MemoryRange(regionStart, regionSize);
|
||||
}
|
||||
|
||||
/// <inheritdoc/>
|
||||
|
@ -8,8 +8,6 @@ namespace Ryujinx.Cpu.LightningJit.CodeGen.Arm64
|
||||
{
|
||||
public IEnumerable<ulong> GetCallStack(nint framePointer, nint codeRegionStart, int codeRegionSize, nint codeRegion2Start, int codeRegion2Size)
|
||||
{
|
||||
List<ulong> functionPointers = new();
|
||||
|
||||
while (true)
|
||||
{
|
||||
nint functionPointer = Marshal.ReadIntPtr(framePointer, nint.Size);
|
||||
@ -20,11 +18,9 @@ namespace Ryujinx.Cpu.LightningJit.CodeGen.Arm64
|
||||
break;
|
||||
}
|
||||
|
||||
functionPointers.Add((ulong)functionPointer - 4);
|
||||
yield return (ulong)functionPointer - 4;
|
||||
framePointer = Marshal.ReadIntPtr(framePointer);
|
||||
}
|
||||
|
||||
return functionPointers;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -168,16 +168,14 @@ namespace Ryujinx.Graphics.Vulkan
|
||||
return BinarySearch(list, offset, size) >= 0;
|
||||
}
|
||||
|
||||
public readonly List<Range> FindOverlaps(int offset, int size)
|
||||
public readonly IEnumerable<Range> FindOverlaps(int offset, int size)
|
||||
{
|
||||
var list = _ranges;
|
||||
if (list == null)
|
||||
{
|
||||
return null;
|
||||
yield break;
|
||||
}
|
||||
|
||||
List<Range> result = null;
|
||||
|
||||
int index = BinarySearch(list, offset, size);
|
||||
|
||||
if (index >= 0)
|
||||
@ -189,12 +187,10 @@ namespace Ryujinx.Graphics.Vulkan
|
||||
|
||||
do
|
||||
{
|
||||
(result ??= new List<Range>()).Add(list[index++]);
|
||||
yield return list[index++];
|
||||
}
|
||||
while (index < list.Count && list[index].OverlapsWith(offset, size));
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
private static int BinarySearch(List<Range> list, int offset, int size)
|
||||
|
@ -62,7 +62,7 @@ namespace Ryujinx.Graphics.Vulkan
|
||||
_api = api;
|
||||
_physicalDevice = physicalDevice;
|
||||
|
||||
int totalFormats = Enum.GetNames(typeof(Format)).Length;
|
||||
int totalFormats = Enum.GetNames<Format>().Length;
|
||||
|
||||
_bufferTable = new FormatFeatureFlags[totalFormats];
|
||||
_optimalTable = new FormatFeatureFlags[totalFormats];
|
||||
|
@ -12,7 +12,7 @@ namespace Ryujinx.Graphics.Vulkan
|
||||
|
||||
static FormatTable()
|
||||
{
|
||||
_table = new VkFormat[Enum.GetNames(typeof(Format)).Length];
|
||||
_table = new VkFormat[Enum.GetNames<Format>().Length];
|
||||
_reverseMap = new Dictionary<VkFormat, Format>();
|
||||
|
||||
#pragma warning disable IDE0055 // Disable formatting
|
||||
|
@ -13,7 +13,7 @@ namespace Ryujinx.Graphics.Vulkan.Queries
|
||||
{
|
||||
_pipeline = pipeline;
|
||||
|
||||
int count = Enum.GetNames(typeof(CounterType)).Length;
|
||||
int count = Enum.GetNames<CounterType>().Length;
|
||||
|
||||
_counterQueues = new CounterQueue[count];
|
||||
|
||||
|
@ -341,7 +341,7 @@ namespace Ryujinx.HLE.HOS
|
||||
{
|
||||
if (VirtualAmiibo.ApplicationBytes.Length > 0)
|
||||
{
|
||||
VirtualAmiibo.ApplicationBytes = new byte[0];
|
||||
VirtualAmiibo.ApplicationBytes = Array.Empty<byte>();
|
||||
VirtualAmiibo.InputBin = string.Empty;
|
||||
}
|
||||
if (NfpDevices[nfpDeviceId].State == NfpDeviceState.SearchingForTag)
|
||||
@ -356,7 +356,7 @@ namespace Ryujinx.HLE.HOS
|
||||
VirtualAmiibo.InputBin = path;
|
||||
if (VirtualAmiibo.ApplicationBytes.Length > 0)
|
||||
{
|
||||
VirtualAmiibo.ApplicationBytes = new byte[0];
|
||||
VirtualAmiibo.ApplicationBytes = Array.Empty<byte>();
|
||||
}
|
||||
byte[] encryptedData = File.ReadAllBytes(path);
|
||||
VirtualAmiiboFile newFile = AmiiboBinReader.ReadBinFile(encryptedData);
|
||||
|
@ -15,7 +15,8 @@ namespace Ryujinx.HLE.HOS.Kernel.Common
|
||||
private readonly long[] _current2;
|
||||
private readonly long[] _peak;
|
||||
|
||||
private readonly Lock _lock = new();
|
||||
// type is not Lock due to Monitor class usage
|
||||
private readonly object _lock = new();
|
||||
|
||||
private readonly LinkedList<KThread> _waitingThreads;
|
||||
|
||||
|
@ -357,7 +357,6 @@ namespace Ryujinx.HLE.HOS
|
||||
{
|
||||
string cheatName = DefaultCheatName;
|
||||
List<string> instructions = new();
|
||||
List<Cheat> cheats = new();
|
||||
|
||||
using StreamReader cheatData = cheatFile.OpenText();
|
||||
while (cheatData.ReadLine() is { } line)
|
||||
@ -373,13 +372,13 @@ namespace Ryujinx.HLE.HOS
|
||||
|
||||
Logger.Warning?.Print(LogClass.ModLoader, $"Ignoring cheat '{cheatFile.FullName}' because it is malformed");
|
||||
|
||||
return Array.Empty<Cheat>();
|
||||
yield break;
|
||||
}
|
||||
|
||||
// Add the previous section to the list.
|
||||
if (instructions.Count > 0)
|
||||
{
|
||||
cheats.Add(new Cheat($"<{cheatName} Cheat>", cheatFile, instructions));
|
||||
yield return new Cheat($"<{cheatName} Cheat>", cheatFile, instructions);
|
||||
}
|
||||
|
||||
// Start a new cheat section.
|
||||
@ -396,10 +395,8 @@ namespace Ryujinx.HLE.HOS
|
||||
// Add the last section being processed.
|
||||
if (instructions.Count > 0)
|
||||
{
|
||||
cheats.Add(new Cheat($"<{cheatName} Cheat>", cheatFile, instructions));
|
||||
yield return new Cheat($"<{cheatName} Cheat>", cheatFile, instructions);
|
||||
}
|
||||
|
||||
return cheats;
|
||||
}
|
||||
|
||||
// Assumes searchDirPaths don't overlap
|
||||
|
@ -23,18 +23,18 @@ namespace Ryujinx.HLE.HOS.Services
|
||||
|
||||
public IpcService(ServerBase server = null)
|
||||
{
|
||||
CmifCommands = typeof(IpcService).Assembly.GetTypes()
|
||||
CmifCommands = GetType().Assembly.GetTypes()
|
||||
.Where(type => type == GetType())
|
||||
.SelectMany(type => type.GetMethods(BindingFlags.Instance | BindingFlags.Static | BindingFlags.Public))
|
||||
.SelectMany(methodInfo => methodInfo.GetCustomAttributes(typeof(CommandCmifAttribute))
|
||||
.Select(command => (((CommandCmifAttribute)command).Id, methodInfo)))
|
||||
.SelectMany(methodInfo => methodInfo.GetCustomAttributes<CommandCmifAttribute>()
|
||||
.Select(command => (command.Id, methodInfo)))
|
||||
.ToDictionary(command => command.Id, command => command.methodInfo);
|
||||
|
||||
TipcCommands = typeof(IpcService).Assembly.GetTypes()
|
||||
TipcCommands = GetType().Assembly.GetTypes()
|
||||
.Where(type => type == GetType())
|
||||
.SelectMany(type => type.GetMethods(BindingFlags.Instance | BindingFlags.Static | BindingFlags.Public))
|
||||
.SelectMany(methodInfo => methodInfo.GetCustomAttributes(typeof(CommandTipcAttribute))
|
||||
.Select(command => (((CommandTipcAttribute)command).Id, methodInfo)))
|
||||
.SelectMany(methodInfo => methodInfo.GetCustomAttributes<CommandTipcAttribute>()
|
||||
.Select(command => (command.Id, methodInfo)))
|
||||
.ToDictionary(command => command.Id, command => command.methodInfo);
|
||||
|
||||
Server = server;
|
||||
|
@ -444,7 +444,7 @@ namespace Ryujinx.HLE.HOS.Services.Ldn.UserServiceCreator
|
||||
|
||||
private ResultCode ScanInternal(IVirtualMemoryManager memory, ushort channel, ScanFilter scanFilter, ulong bufferPosition, ulong bufferSize, out ulong counter)
|
||||
{
|
||||
ulong networkInfoSize = (ulong)Marshal.SizeOf(typeof(NetworkInfo));
|
||||
ulong networkInfoSize = (ulong)Marshal.SizeOf<NetworkInfo>();
|
||||
ulong maxGames = bufferSize / networkInfoSize;
|
||||
|
||||
MemoryHelper.FillWithZeros(memory, bufferPosition, (int)bufferSize);
|
||||
|
@ -16,7 +16,7 @@ namespace Ryujinx.HLE.HOS.Services.Nfc.Nfp
|
||||
static class VirtualAmiibo
|
||||
{
|
||||
public static uint OpenedApplicationAreaId;
|
||||
public static byte[] ApplicationBytes = new byte[0];
|
||||
public static byte[] ApplicationBytes = Array.Empty<byte>();
|
||||
public static string InputBin = string.Empty;
|
||||
public static string NickName = string.Empty;
|
||||
private static readonly AmiiboJsonSerializerContext _serializerContext = AmiiboJsonSerializerContext.Default;
|
||||
@ -137,7 +137,7 @@ namespace Ryujinx.HLE.HOS.Services.Nfc.Nfp
|
||||
if (ApplicationBytes.Length > 0)
|
||||
{
|
||||
byte[] bytes = ApplicationBytes;
|
||||
ApplicationBytes = new byte[0];
|
||||
ApplicationBytes = Array.Empty<byte>();
|
||||
return bytes;
|
||||
}
|
||||
VirtualAmiiboFile virtualAmiiboFile = LoadAmiiboFile(amiiboId);
|
||||
|
@ -94,7 +94,7 @@ namespace Ryujinx.HLE.HOS.Services.Sm
|
||||
{
|
||||
if (_services.TryGetValue(name, out Type type))
|
||||
{
|
||||
ServiceAttribute serviceAttribute = (ServiceAttribute)type.GetCustomAttributes(typeof(ServiceAttribute)).First(service => ((ServiceAttribute)service).Name == name);
|
||||
ServiceAttribute serviceAttribute = type.GetCustomAttributes<ServiceAttribute>().First(service => service.Name == name);
|
||||
|
||||
IpcService service = GetServiceInstance(type, context, serviceAttribute.Parameter);
|
||||
|
||||
|
@ -34,14 +34,14 @@ namespace Ryujinx.Horizon.Kernel.Generators
|
||||
private const string TypeResult = NamespaceHorizonCommon + "." + TypeResultName;
|
||||
private const string TypeExecutionContext = "IExecutionContext";
|
||||
|
||||
private static readonly string[] _expectedResults = new string[]
|
||||
{
|
||||
private static readonly string[] _expectedResults =
|
||||
[
|
||||
$"{TypeResultName}.Success",
|
||||
$"{TypeKernelResultName}.TimedOut",
|
||||
$"{TypeKernelResultName}.Cancelled",
|
||||
$"{TypeKernelResultName}.PortRemoteClosed",
|
||||
$"{TypeKernelResultName}.InvalidState",
|
||||
};
|
||||
];
|
||||
|
||||
private readonly struct OutParameter
|
||||
{
|
||||
|
@ -106,10 +106,13 @@ namespace Ryujinx.Memory
|
||||
{
|
||||
if (size == 0)
|
||||
{
|
||||
return Enumerable.Empty<HostMemoryRange>();
|
||||
yield break;
|
||||
}
|
||||
|
||||
return GetHostRegionsImpl(va, size);
|
||||
foreach (var hostRegion in GetHostRegionsImpl(va, size))
|
||||
{
|
||||
yield return hostRegion;
|
||||
}
|
||||
}
|
||||
|
||||
/// <inheritdoc/>
|
||||
@ -117,51 +120,36 @@ namespace Ryujinx.Memory
|
||||
{
|
||||
if (size == 0)
|
||||
{
|
||||
return Enumerable.Empty<MemoryRange>();
|
||||
yield break;
|
||||
}
|
||||
|
||||
var hostRegions = GetHostRegionsImpl(va, size);
|
||||
if (hostRegions == null)
|
||||
{
|
||||
return null;
|
||||
yield break;
|
||||
}
|
||||
|
||||
var regions = new MemoryRange[hostRegions.Count];
|
||||
|
||||
ulong backingStart = (ulong)_backingMemory.Pointer;
|
||||
ulong backingEnd = backingStart + _backingMemory.Size;
|
||||
|
||||
int count = 0;
|
||||
|
||||
for (int i = 0; i < regions.Length; i++)
|
||||
foreach (var hostRegion in hostRegions)
|
||||
{
|
||||
var hostRegion = hostRegions[i];
|
||||
|
||||
if (hostRegion.Address >= backingStart && hostRegion.Address < backingEnd)
|
||||
{
|
||||
regions[count++] = new MemoryRange(hostRegion.Address - backingStart, hostRegion.Size);
|
||||
yield return new MemoryRange(hostRegion.Address - backingStart, hostRegion.Size);
|
||||
}
|
||||
}
|
||||
|
||||
if (count != regions.Length)
|
||||
{
|
||||
return new ArraySegment<MemoryRange>(regions, 0, count);
|
||||
}
|
||||
|
||||
return regions;
|
||||
}
|
||||
|
||||
private List<HostMemoryRange> GetHostRegionsImpl(ulong va, ulong size)
|
||||
private IEnumerable<HostMemoryRange> GetHostRegionsImpl(ulong va, ulong size)
|
||||
{
|
||||
if (!ValidateAddress(va) || !ValidateAddressAndSize(va, size))
|
||||
{
|
||||
return null;
|
||||
yield break;
|
||||
}
|
||||
|
||||
int pages = GetPagesCount(va, size, out va);
|
||||
|
||||
var regions = new List<HostMemoryRange>();
|
||||
|
||||
nuint regionStart = GetHostAddress(va);
|
||||
ulong regionSize = PageSize;
|
||||
|
||||
@ -169,14 +157,14 @@ namespace Ryujinx.Memory
|
||||
{
|
||||
if (!ValidateAddress(va + PageSize))
|
||||
{
|
||||
return null;
|
||||
yield break;
|
||||
}
|
||||
|
||||
nuint newHostAddress = GetHostAddress(va + PageSize);
|
||||
|
||||
if (GetHostAddress(va) + PageSize != newHostAddress)
|
||||
{
|
||||
regions.Add(new HostMemoryRange(regionStart, regionSize));
|
||||
yield return new HostMemoryRange(regionStart, regionSize);
|
||||
regionStart = newHostAddress;
|
||||
regionSize = 0;
|
||||
}
|
||||
@ -185,9 +173,7 @@ namespace Ryujinx.Memory
|
||||
regionSize += PageSize;
|
||||
}
|
||||
|
||||
regions.Add(new HostMemoryRange(regionStart, regionSize));
|
||||
|
||||
return regions;
|
||||
yield return new HostMemoryRange(regionStart, regionSize);
|
||||
}
|
||||
|
||||
[MethodImpl(MethodImplOptions.AggressiveInlining)]
|
||||
|
@ -38,7 +38,7 @@ namespace Ryujinx.UI.App.Common
|
||||
|
||||
public string TimePlayedString => ValueFormatUtils.FormatTimeSpan(TimePlayed);
|
||||
|
||||
public string LastPlayedString => ValueFormatUtils.FormatDateTime(LastPlayed) ?? LocalizedNever();
|
||||
public string LastPlayedString => ValueFormatUtils.FormatDateTime(LastPlayed)?.Replace(" ", "\n") ?? LocalizedNever();
|
||||
|
||||
public string FileSizeString => ValueFormatUtils.FormatFileSize(FileSize);
|
||||
|
||||
|
@ -23,7 +23,7 @@ namespace Ryujinx.UI.Common.Helper
|
||||
[LibraryImport("shell32.dll", SetLastError = true)]
|
||||
public static partial void SHChangeNotify(uint wEventId, uint uFlags, nint dwItem1, nint dwItem2);
|
||||
|
||||
public static bool IsTypeAssociationSupported => (OperatingSystem.IsLinux() || OperatingSystem.IsWindows()) && !ReleaseInformation.IsFlatHubBuild;
|
||||
public static bool IsTypeAssociationSupported => (OperatingSystem.IsLinux() || OperatingSystem.IsWindows());
|
||||
|
||||
public static bool AreMimeTypesRegistered
|
||||
{
|
||||
|
@ -701,11 +701,11 @@
|
||||
"el_GR": "",
|
||||
"en_US": "Scan An Amiibo (From Bin)",
|
||||
"es_ES": "",
|
||||
"fr_FR": "",
|
||||
"fr_FR": "Scanner un Amiibo (à partir d'un .bin)",
|
||||
"he_IL": "",
|
||||
"it_IT": "",
|
||||
"ja_JP": "",
|
||||
"ko_KR": "",
|
||||
"ko_KR": "Amiibo 스캔(빈에서)",
|
||||
"no_NO": "Skann en Amiibo (fra bin fil)",
|
||||
"pl_PL": "",
|
||||
"pt_BR": "",
|
||||
@ -749,7 +749,7 @@
|
||||
"el_GR": "Εγκατάσταση Firmware",
|
||||
"en_US": "Install Firmware",
|
||||
"es_ES": "Instalar firmware",
|
||||
"fr_FR": "Installer un firmware",
|
||||
"fr_FR": "Installer le firmware",
|
||||
"he_IL": "התקן קושחה",
|
||||
"it_IT": "Installa firmware",
|
||||
"ja_JP": "ファームウェアをインストール",
|
||||
@ -821,7 +821,7 @@
|
||||
"el_GR": "",
|
||||
"en_US": "Install Keys",
|
||||
"es_ES": "",
|
||||
"fr_FR": "",
|
||||
"fr_FR": "Installer des clés",
|
||||
"he_IL": "",
|
||||
"it_IT": "Installa Chiavi",
|
||||
"ja_JP": "",
|
||||
@ -845,7 +845,7 @@
|
||||
"el_GR": "",
|
||||
"en_US": "Install keys from KEYS or ZIP",
|
||||
"es_ES": "Instalar keys de KEYS o ZIP",
|
||||
"fr_FR": "",
|
||||
"fr_FR": "Installer des clés à partir de .KEYS or .ZIP",
|
||||
"he_IL": "",
|
||||
"it_IT": "Installa Chiavi da file KEYS o ZIP",
|
||||
"ja_JP": "",
|
||||
@ -869,7 +869,7 @@
|
||||
"el_GR": "",
|
||||
"en_US": "Install keys from a directory",
|
||||
"es_ES": "Instalar keys de un directorio",
|
||||
"fr_FR": "",
|
||||
"fr_FR": "Installer des clés à partir d'un dossier",
|
||||
"he_IL": "",
|
||||
"it_IT": "Installa Chiavi da una Cartella",
|
||||
"ja_JP": "",
|
||||
@ -1077,6 +1077,54 @@
|
||||
"zh_TW": ""
|
||||
}
|
||||
},
|
||||
{
|
||||
"ID": "MenuBarViewWindow1440",
|
||||
"Translations": {
|
||||
"ar_SA": "",
|
||||
"de_DE": "",
|
||||
"el_GR": "",
|
||||
"en_US": "1440p",
|
||||
"es_ES": "",
|
||||
"fr_FR": "",
|
||||
"he_IL": "",
|
||||
"it_IT": "",
|
||||
"ja_JP": "",
|
||||
"ko_KR": "",
|
||||
"no_NO": "",
|
||||
"pl_PL": "",
|
||||
"pt_BR": "",
|
||||
"ru_RU": "",
|
||||
"th_TH": "",
|
||||
"tr_TR": "",
|
||||
"uk_UA": "",
|
||||
"zh_CN": "",
|
||||
"zh_TW": ""
|
||||
}
|
||||
},
|
||||
{
|
||||
"ID": "MenuBarViewWindow2160",
|
||||
"Translations": {
|
||||
"ar_SA": "",
|
||||
"de_DE": "",
|
||||
"el_GR": "",
|
||||
"en_US": "2160p",
|
||||
"es_ES": "",
|
||||
"fr_FR": "",
|
||||
"he_IL": "",
|
||||
"it_IT": "",
|
||||
"ja_JP": "",
|
||||
"ko_KR": "",
|
||||
"no_NO": "",
|
||||
"pl_PL": "",
|
||||
"pt_BR": "",
|
||||
"ru_RU": "",
|
||||
"th_TH": "",
|
||||
"tr_TR": "",
|
||||
"uk_UA": "",
|
||||
"zh_CN": "",
|
||||
"zh_TW": ""
|
||||
}
|
||||
},
|
||||
{
|
||||
"ID": "MenuBarHelp",
|
||||
"Translations": {
|
||||
@ -1125,6 +1173,30 @@
|
||||
"zh_TW": "檢查更新"
|
||||
}
|
||||
},
|
||||
{
|
||||
"ID": "MenuBarHelpFaqAndGuides",
|
||||
"Translations": {
|
||||
"ar_SA": "",
|
||||
"de_DE": "",
|
||||
"el_GR": "",
|
||||
"en_US": "FAQ & Guides",
|
||||
"es_ES": "",
|
||||
"fr_FR": "",
|
||||
"he_IL": "",
|
||||
"it_IT": "",
|
||||
"ja_JP": "",
|
||||
"ko_KR": "",
|
||||
"no_NO": "",
|
||||
"pl_PL": "",
|
||||
"pt_BR": "",
|
||||
"ru_RU": "",
|
||||
"th_TH": "",
|
||||
"tr_TR": "",
|
||||
"uk_UA": "",
|
||||
"zh_CN": "",
|
||||
"zh_TW": ""
|
||||
}
|
||||
},
|
||||
{
|
||||
"ID": "MenuBarHelpFaq",
|
||||
"Translations": {
|
||||
@ -1137,7 +1209,7 @@
|
||||
"he_IL": "",
|
||||
"it_IT": "",
|
||||
"ja_JP": "",
|
||||
"ko_KR": "",
|
||||
"ko_KR": "자주 묻는 질문(FAQ) 및 문제해결 페이지",
|
||||
"no_NO": "FAQ- og feilsøkingsside",
|
||||
"pl_PL": "",
|
||||
"pt_BR": "",
|
||||
@ -1161,7 +1233,7 @@
|
||||
"he_IL": "",
|
||||
"it_IT": "",
|
||||
"ja_JP": "",
|
||||
"ko_KR": "",
|
||||
"ko_KR": "공식 Ryujinx 위키에서 자주 묻는 질문(FAQ) 및 문제 해결 페이지 열기",
|
||||
"no_NO": "Åpner FAQ- og feilsøkingssiden på den offisielle Ryujinx-wikien",
|
||||
"pl_PL": "",
|
||||
"pt_BR": "",
|
||||
@ -1185,7 +1257,7 @@
|
||||
"he_IL": "",
|
||||
"it_IT": "",
|
||||
"ja_JP": "",
|
||||
"ko_KR": "",
|
||||
"ko_KR": "설치 및 구성 안내",
|
||||
"no_NO": "Oppsett- og konfigurasjonsveiledning",
|
||||
"pl_PL": "",
|
||||
"pt_BR": "",
|
||||
@ -1209,7 +1281,7 @@
|
||||
"he_IL": "",
|
||||
"it_IT": "",
|
||||
"ja_JP": "",
|
||||
"ko_KR": "",
|
||||
"ko_KR": "공식 Ryujinx 위키에서 설정 및 구성 안내 열기",
|
||||
"no_NO": "Åpner oppsett- og konfigurasjonsveiledningen på den offisielle Ryujinx-wikien",
|
||||
"pl_PL": "",
|
||||
"pt_BR": "",
|
||||
@ -1233,7 +1305,7 @@
|
||||
"he_IL": "",
|
||||
"it_IT": "",
|
||||
"ja_JP": "",
|
||||
"ko_KR": "",
|
||||
"ko_KR": "멀티플레이어(LDN/LAN) 안내",
|
||||
"no_NO": "Flerspillerveiledning (LDN/LAN)",
|
||||
"pl_PL": "",
|
||||
"pt_BR": "",
|
||||
@ -1257,7 +1329,7 @@
|
||||
"he_IL": "",
|
||||
"it_IT": "",
|
||||
"ja_JP": "",
|
||||
"ko_KR": "",
|
||||
"ko_KR": "공식 Ryujinx 위키에서 멀티플레이어 안내 열기",
|
||||
"no_NO": "Åpner flerspillerveiledningen på den offisielle Ryujinx-wikien",
|
||||
"pl_PL": "",
|
||||
"pt_BR": "",
|
||||
@ -3149,7 +3221,7 @@
|
||||
"el_GR": "ΗΠΑ",
|
||||
"en_US": "USA",
|
||||
"es_ES": "EEUU",
|
||||
"fr_FR": "",
|
||||
"fr_FR": "États-Unis",
|
||||
"he_IL": "ארה\"ב",
|
||||
"it_IT": "Stati Uniti d'America",
|
||||
"ja_JP": "アメリカ",
|
||||
@ -3771,9 +3843,9 @@
|
||||
"ar_SA": "",
|
||||
"de_DE": "",
|
||||
"el_GR": "",
|
||||
"en_US": "Match PC Time",
|
||||
"en_US": "Resync to PC Date & Time",
|
||||
"es_ES": "",
|
||||
"fr_FR": "",
|
||||
"fr_FR": "Resynchronier la Date à celle du PC",
|
||||
"he_IL": "",
|
||||
"it_IT": "",
|
||||
"ja_JP": "",
|
||||
@ -3989,7 +4061,7 @@
|
||||
"el_GR": "Μικροδιορθώσεις",
|
||||
"en_US": "Hacks",
|
||||
"es_ES": "",
|
||||
"fr_FR": "",
|
||||
"fr_FR": "Hacks",
|
||||
"he_IL": "האצות",
|
||||
"it_IT": "Espedienti",
|
||||
"ja_JP": "ハック",
|
||||
@ -4541,7 +4613,7 @@
|
||||
"el_GR": "",
|
||||
"en_US": "4x (2880p/4320p) (Not recommended)",
|
||||
"es_ES": "4x (2880p/4320p) (no recomendado)",
|
||||
"fr_FR": "4x (2880p/4320p) (Non recommandé)",
|
||||
"fr_FR": "x4 (2880p/4320p) (Non recommandé)",
|
||||
"he_IL": "4x (2880p/4320p) (לא מומלץ)",
|
||||
"it_IT": "4x (2880p/4320p) (Non consigliato)",
|
||||
"ja_JP": "4x (2880p/4320p) (非推奨)",
|
||||
@ -4565,7 +4637,7 @@
|
||||
"el_GR": "Αναλογία Απεικόνισης:",
|
||||
"en_US": "Aspect Ratio:",
|
||||
"es_ES": "Relación de aspecto:",
|
||||
"fr_FR": "Format d'affichage :",
|
||||
"fr_FR": "Format d'affichage :",
|
||||
"he_IL": "יחס גובה-רוחב:",
|
||||
"it_IT": "Rapporto d'aspetto:",
|
||||
"ja_JP": "アスペクト比:",
|
||||
@ -8073,7 +8145,7 @@
|
||||
"he_IL": "",
|
||||
"it_IT": "",
|
||||
"ja_JP": "",
|
||||
"ko_KR": "지우기",
|
||||
"ko_KR": "",
|
||||
"no_NO": "Tøm",
|
||||
"pl_PL": "",
|
||||
"pt_BR": "",
|
||||
@ -10229,7 +10301,7 @@
|
||||
"el_GR": "",
|
||||
"en_US": "View Profile",
|
||||
"es_ES": "Ver perfil",
|
||||
"fr_FR": "",
|
||||
"fr_FR": "Voir Profil",
|
||||
"he_IL": "",
|
||||
"it_IT": "Visualizza profilo",
|
||||
"ja_JP": "",
|
||||
@ -11165,20 +11237,20 @@
|
||||
"el_GR": "Αποτυχία μετατροπής της ληφθείσας έκδοσης Ryujinx από την έκδοση GitHub.",
|
||||
"en_US": "Failed to convert the Ryujinx version received from GitHub.",
|
||||
"es_ES": "No se pudo convertir la versión de Ryujinx recibida de GitHub Release.",
|
||||
"fr_FR": "Impossible de convertir la version reçue de Ryujinx depuis Github Release.",
|
||||
"fr_FR": "Impossible de convertir la version reçue de Ryujinx depuis GitHub Release.",
|
||||
"he_IL": "המרת גרסת ריוג'ינקס שהתקבלה מ-עדכון הגרסאות של גיטהב נכשלה.",
|
||||
"it_IT": "La conversione della versione di Ryujinx ricevuta da Github Release è fallita.",
|
||||
"it_IT": "La conversione della versione di Ryujinx ricevuta da GitHub Release è fallita.",
|
||||
"ja_JP": "Github から取得した Ryujinx バージョンの変換に失敗しました.",
|
||||
"ko_KR": "GitHub에서 받은 Ryujinx 버전을 변환하지 못했습니다.",
|
||||
"no_NO": "Kan ikke konvertere mottatt Ryujinx-versjon fra Github Utgivelse.",
|
||||
"no_NO": "Kan ikke konvertere mottatt Ryujinx-versjon fra GitHub Utgivelse.",
|
||||
"pl_PL": "Nie udało się przekonwertować otrzymanej wersji Ryujinx z Github Release.",
|
||||
"pt_BR": "Falha ao converter a versão do Ryujinx recebida do AppVeyor.",
|
||||
"ru_RU": "Не удалось преобразовать полученную версию Ryujinx из Github Release.",
|
||||
"th_TH": "ไม่สามารถแปลงเวอร์ชั่น Ryujinx ที่ได้รับจาก Github Release",
|
||||
"ru_RU": "Не удалось преобразовать полученную версию Ryujinx из GitHub Release.",
|
||||
"th_TH": "ไม่สามารถแปลงเวอร์ชั่น Ryujinx ที่ได้รับจาก GitHub Release",
|
||||
"tr_TR": "Github Release'den alınan Ryujinx sürümü dönüştürülemedi.",
|
||||
"uk_UA": "Не вдалося конвертувати отриману версію Ryujinx із випуску Github.",
|
||||
"zh_CN": "无法切换至从 Github 接收到的新版 Ryujinx 模拟器。",
|
||||
"zh_TW": "無法轉換從 Github Release 接收到的 Ryujinx 版本。"
|
||||
"uk_UA": "Не вдалося конвертувати отриману версію Ryujinx із випуску GitHub.",
|
||||
"zh_CN": "无法切换至从 GitHub 接收到的新版 Ryujinx 模拟器。",
|
||||
"zh_TW": "無法轉換從 GitHub Release 接收到的 Ryujinx 版本。"
|
||||
}
|
||||
},
|
||||
{
|
||||
@ -11285,7 +11357,7 @@
|
||||
"el_GR": "",
|
||||
"en_US": "Show Changelog",
|
||||
"es_ES": "",
|
||||
"fr_FR": "",
|
||||
"fr_FR": "Afficher Changelog",
|
||||
"he_IL": "",
|
||||
"it_IT": "",
|
||||
"ja_JP": "",
|
||||
@ -11865,7 +11937,7 @@
|
||||
"he_IL": "",
|
||||
"it_IT": "",
|
||||
"ja_JP": "",
|
||||
"ko_KR": "",
|
||||
"ko_KR": "{0} : {1}",
|
||||
"no_NO": "",
|
||||
"pl_PL": "",
|
||||
"pt_BR": "",
|
||||
@ -12245,7 +12317,7 @@
|
||||
"el_GR": "Σφάλμα UI: Το επιλεγμένο παιχνίδι δεν έχει έγκυρο αναγνωριστικό τίτλου",
|
||||
"en_US": "UI error: The selected game did not have a valid title ID",
|
||||
"es_ES": "Error de interfaz: El juego seleccionado no tiene una ID válida",
|
||||
"fr_FR": "Erreur d'UI : le jeu sélectionné n'a pas d'ID de titre valide",
|
||||
"fr_FR": "Erreur d'UI : Le jeu sélectionné n'a pas d'ID de titre valide",
|
||||
"he_IL": "שגיאת ממשק משתמש: למשחק שנבחר לא קיים מזהה משחק",
|
||||
"it_IT": "Errore UI: Il gioco selezionato non ha un ID titolo valido",
|
||||
"ja_JP": "UI エラー: 選択されたゲームは有効なタイトル ID を保持していません",
|
||||
@ -12437,7 +12509,7 @@
|
||||
"el_GR": "",
|
||||
"en_US": "An invalid Keys file was found in {0}",
|
||||
"es_ES": "Se halló un archivo Keys inválido en {0}",
|
||||
"fr_FR": "",
|
||||
"fr_FR": "Un fichier de clés invalide a été trouvé dans {0}",
|
||||
"he_IL": "",
|
||||
"it_IT": "E' stato trovato un file di chiavi invalido ' {0}",
|
||||
"ja_JP": "",
|
||||
@ -12461,7 +12533,7 @@
|
||||
"el_GR": "",
|
||||
"en_US": "Install Keys",
|
||||
"es_ES": "Instalar Keys",
|
||||
"fr_FR": "",
|
||||
"fr_FR": "Installer des clés",
|
||||
"he_IL": "",
|
||||
"it_IT": "Installa Chavi",
|
||||
"ja_JP": "",
|
||||
@ -12485,7 +12557,7 @@
|
||||
"el_GR": "",
|
||||
"en_US": "New Keys file will be installed.",
|
||||
"es_ES": "Un nuevo archivo Keys será instalado.",
|
||||
"fr_FR": "",
|
||||
"fr_FR": "Nouveau fichier de clés sera installé.",
|
||||
"he_IL": "",
|
||||
"it_IT": "Un nuovo file di Chiavi sarà intallato.",
|
||||
"ja_JP": "",
|
||||
@ -12509,7 +12581,7 @@
|
||||
"el_GR": "",
|
||||
"en_US": "\n\nThis may replace some of the current installed Keys.",
|
||||
"es_ES": "\n\nEsto puede reemplazar algunas de las Keys actualmente instaladas.",
|
||||
"fr_FR": "",
|
||||
"fr_FR": "\n\nCela pourrait remplacer les clés qui sont installés.",
|
||||
"he_IL": "",
|
||||
"it_IT": "\n\nQuesto potrebbe sovrascrivere alcune delle Chiavi già installate.",
|
||||
"ja_JP": "",
|
||||
@ -12533,7 +12605,7 @@
|
||||
"el_GR": "",
|
||||
"en_US": "\n\nDo you want to continue?",
|
||||
"es_ES": "\n\nDeseas continuar?",
|
||||
"fr_FR": "",
|
||||
"fr_FR": "\n\nVoulez-vous continuez ?",
|
||||
"he_IL": "",
|
||||
"it_IT": "\n\nVuoi continuare?",
|
||||
"ja_JP": "",
|
||||
@ -12557,7 +12629,7 @@
|
||||
"el_GR": "",
|
||||
"en_US": "Installing Keys...",
|
||||
"es_ES": "Instalando Keys...",
|
||||
"fr_FR": "",
|
||||
"fr_FR": "Installation des clés...",
|
||||
"he_IL": "",
|
||||
"it_IT": "Installando le chiavi...",
|
||||
"ja_JP": "",
|
||||
@ -12581,7 +12653,7 @@
|
||||
"el_GR": "",
|
||||
"en_US": "New Keys file successfully installed.",
|
||||
"es_ES": "Nuevo archivo Keys instalado con éxito.",
|
||||
"fr_FR": "",
|
||||
"fr_FR": "Nouveau fichier de clés a été installé.",
|
||||
"he_IL": "",
|
||||
"it_IT": "Nuovo file di chiavi installato con successo.",
|
||||
"ja_JP": "",
|
||||
@ -13541,7 +13613,7 @@
|
||||
"el_GR": "",
|
||||
"en_US": "Ryujinx is an emulator for the Nintendo Switch™.\nGet all the latest news in our Discord.\nDevelopers interested in contributing can find out more on our GitHub or Discord.",
|
||||
"es_ES": "",
|
||||
"fr_FR": "",
|
||||
"fr_FR": "Ryujinx est un émulateur pour la Nintendo Switch™.\nObtenez le dernières nouvelles sur le Discord.\nLes développeurs qui veulent contribuer peuvent en savoir plus sur notre GitHub ou Discord.",
|
||||
"he_IL": "",
|
||||
"it_IT": "",
|
||||
"ja_JP": "",
|
||||
@ -13589,7 +13661,7 @@
|
||||
"el_GR": "",
|
||||
"en_US": "Formerly Maintained By:",
|
||||
"es_ES": "",
|
||||
"fr_FR": "",
|
||||
"fr_FR": "Anciennement Maintenu par :",
|
||||
"he_IL": "",
|
||||
"it_IT": "",
|
||||
"ja_JP": "",
|
||||
@ -14429,7 +14501,7 @@
|
||||
"el_GR": "",
|
||||
"en_US": "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.",
|
||||
"es_ES": "Soporte de acceso directo al teclado (HID). Proporciona a los juegos acceso a su teclado como dispositivo de entrada de texto.\n\nSolo funciona con juegos que permiten de forma nativa el uso del teclado en el hardware de Switch.\n\nDesactívalo si no sabes qué hacer.",
|
||||
"fr_FR": "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.",
|
||||
"fr_FR": "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 désactiver si vous n'êtes pas sûr.",
|
||||
"he_IL": "",
|
||||
"it_IT": "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.",
|
||||
"ja_JP": "直接キーボード アクセス (HID) のサポートです. テキスト入力デバイスとしてキーボードへのゲームアクセスを提供します.\n\nSwitchハードウェアでキーボードの使用をネイティブにサポートしているゲームでのみ動作します.\n\nわからない場合はオフのままにしてください.",
|
||||
@ -14453,7 +14525,7 @@
|
||||
"el_GR": "",
|
||||
"en_US": "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.",
|
||||
"es_ES": "Soporte de acceso directo al mouse (HID). Proporciona a los juegos acceso a su mouse como puntero.\n\nSolo funciona con juegos que permiten de forma nativa el uso de controles con mouse en el hardware de switch, lo cual son pocos.\n\nCuando esté activado, la funcionalidad de pantalla táctil puede no funcionar.\n\nDesactívalo si no sabes qué hacer.",
|
||||
"fr_FR": "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.",
|
||||
"fr_FR": "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 désactiver si vous n'êtes pas sûr.",
|
||||
"he_IL": "",
|
||||
"it_IT": "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.",
|
||||
"ja_JP": "直接マウスアクセス (HID) のサポートです. ポインティングデバイスとしてマウスへのゲームアクセスを提供します.\n\nSwitchハードウェアでマウスの使用をネイティブにサポートしているゲームでのみ動作します.\n\n有効にしている場合, タッチスクリーン機能は動作しない場合があります.\n\nわからない場合はオフのままにしてください.",
|
||||
@ -14571,9 +14643,9 @@
|
||||
"ar_SA": "",
|
||||
"de_DE": "",
|
||||
"el_GR": "",
|
||||
"en_US": "Change System Time to match your PC's date & time.",
|
||||
"en_US": "Resync System Time to match your PC's current date & time.\n\nThis is not an active setting, it can still fall out of sync; in which case just click this button again.",
|
||||
"es_ES": "",
|
||||
"fr_FR": "",
|
||||
"fr_FR": "Resynchronise la Date du Système pour qu'elle soit la même que celle du PC.\n\nCeci n'est pas un paramètrage automatique, la date peut se désynchroniser; dans ce cas là, rappuyer sur le boutton.",
|
||||
"he_IL": "",
|
||||
"it_IT": "",
|
||||
"ja_JP": "",
|
||||
@ -15965,7 +16037,7 @@
|
||||
"el_GR": "Εύρος:",
|
||||
"en_US": "Range:",
|
||||
"es_ES": "Alcance:",
|
||||
"fr_FR": "Intervalle :",
|
||||
"fr_FR": "Intervalle :",
|
||||
"he_IL": "טווח:",
|
||||
"it_IT": "Raggio:",
|
||||
"ja_JP": "範囲:",
|
||||
@ -16173,30 +16245,6 @@
|
||||
"zh_TW": "CPU 模式"
|
||||
}
|
||||
},
|
||||
{
|
||||
"ID": "DialogUpdaterFlatpakNotSupportedMessage",
|
||||
"Translations": {
|
||||
"ar_SA": "الرجاء تحديث ريوجينكس عبر فلات هاب.",
|
||||
"de_DE": "Bitte aktualisiere Ryujinx über FlatHub",
|
||||
"el_GR": "Παρακαλούμε ενημερώστε το Ryujinx μέσω FlatHub.",
|
||||
"en_US": "Please update Ryujinx via FlatHub.",
|
||||
"es_ES": "Por favor, actualiza Ryujinx a través de FlatHub.",
|
||||
"fr_FR": "Merci de mettre à jour Ryujinx via FlatHub.",
|
||||
"he_IL": "בבקשה עדכן את ריוג'ינקס דרך פלאטהב.",
|
||||
"it_IT": "Aggiorna Ryujinx tramite FlatHub.",
|
||||
"ja_JP": "FlatHub を使用して Ryujinx をアップデートしてください.",
|
||||
"ko_KR": "FlatHub를 통해 Ryujinx를 업데이트하세요.",
|
||||
"no_NO": "Vennligst oppdater Ryujinx via FlatHub.",
|
||||
"pl_PL": "Zaktualizuj Ryujinx przez FlatHub.",
|
||||
"pt_BR": "Por favor, atualize o Ryujinx pelo FlatHub.",
|
||||
"ru_RU": "Пожалуйста, обновите Ryujinx через FlatHub.",
|
||||
"th_TH": "โปรดอัปเดต Ryujinx ผ่านช่องทาง FlatHub",
|
||||
"tr_TR": "Lütfen Ryujinx'i FlatHub aracılığıyla güncelleyin.",
|
||||
"uk_UA": "",
|
||||
"zh_CN": "请通过 FlatHub 更新 Ryujinx 模拟器。",
|
||||
"zh_TW": "請透過 Flathub 更新 Ryujinx。"
|
||||
}
|
||||
},
|
||||
{
|
||||
"ID": "UpdaterDisabledWarningTitle",
|
||||
"Translations": {
|
||||
@ -17045,7 +17093,7 @@
|
||||
"el_GR": "",
|
||||
"en_US": "Cabinet Dialog",
|
||||
"es_ES": "Diálogo Gabinete",
|
||||
"fr_FR": "",
|
||||
"fr_FR": "Dialogue de Cabinet",
|
||||
"he_IL": "",
|
||||
"it_IT": "",
|
||||
"ja_JP": "",
|
||||
@ -17069,7 +17117,7 @@
|
||||
"el_GR": "",
|
||||
"en_US": "Enter your Amiibo's new name",
|
||||
"es_ES": "Ingresa el nuevo nombre de tu Amiibo",
|
||||
"fr_FR": "",
|
||||
"fr_FR": "Entrer le nouveau nom de votre Amiibo",
|
||||
"he_IL": "",
|
||||
"it_IT": "",
|
||||
"ja_JP": "",
|
||||
@ -17093,7 +17141,7 @@
|
||||
"el_GR": "",
|
||||
"en_US": "Please scan your Amiibo now.",
|
||||
"es_ES": "Escanea tu Amiibo ahora.",
|
||||
"fr_FR": "",
|
||||
"fr_FR": "Veuillez scannez votre Amiibo.",
|
||||
"he_IL": "",
|
||||
"it_IT": "",
|
||||
"ja_JP": "",
|
||||
@ -18801,7 +18849,7 @@
|
||||
"he_IL": "",
|
||||
"it_IT": "",
|
||||
"ja_JP": "",
|
||||
"ko_KR": "",
|
||||
"ko_KR": "{0:n0}MB",
|
||||
"no_NO": "",
|
||||
"pl_PL": "",
|
||||
"pt_BR": "",
|
||||
@ -19085,11 +19133,11 @@
|
||||
"el_GR": "",
|
||||
"en_US": "{0} DLC(s) available",
|
||||
"es_ES": "",
|
||||
"fr_FR": "",
|
||||
"fr_FR": "{0} DLC(s) disponibles",
|
||||
"he_IL": "{0} הרחבות משחק",
|
||||
"it_IT": "",
|
||||
"ja_JP": "",
|
||||
"ko_KR": "",
|
||||
"ko_KR": "{0} DLC 사용 가능",
|
||||
"no_NO": "{0} Nedlastbare innhold(er)",
|
||||
"pl_PL": "",
|
||||
"pt_BR": "",
|
||||
@ -19541,7 +19589,7 @@
|
||||
"el_GR": "Όνομα:",
|
||||
"en_US": "Name:",
|
||||
"es_ES": "Nombre:",
|
||||
"fr_FR": "Nom :",
|
||||
"fr_FR": "Nom :",
|
||||
"he_IL": "שם:",
|
||||
"it_IT": "Nome:",
|
||||
"ja_JP": "名称:",
|
||||
@ -21221,11 +21269,11 @@
|
||||
"el_GR": "",
|
||||
"en_US": "VSync:",
|
||||
"es_ES": "",
|
||||
"fr_FR": "",
|
||||
"fr_FR": "VSync :",
|
||||
"he_IL": "",
|
||||
"it_IT": "",
|
||||
"ja_JP": "",
|
||||
"ko_KR": "",
|
||||
"ko_KR": "수직 동기화 :",
|
||||
"no_NO": "",
|
||||
"pl_PL": "",
|
||||
"pt_BR": "",
|
||||
@ -21245,11 +21293,11 @@
|
||||
"el_GR": "",
|
||||
"en_US": "Enable custom refresh rate (Experimental)",
|
||||
"es_ES": "",
|
||||
"fr_FR": "",
|
||||
"fr_FR": "Activer le taux de rafraîchissement customisé (Expérimental)",
|
||||
"he_IL": "",
|
||||
"it_IT": "",
|
||||
"ja_JP": "",
|
||||
"ko_KR": "",
|
||||
"ko_KR": "사용자 정의 주사율 활성화(실험적)",
|
||||
"no_NO": "Aktiver egendefinert oppdateringsfrekvens (eksperimentell)",
|
||||
"pl_PL": "",
|
||||
"pt_BR": "",
|
||||
@ -21269,11 +21317,11 @@
|
||||
"el_GR": "",
|
||||
"en_US": "Switch",
|
||||
"es_ES": "",
|
||||
"fr_FR": "",
|
||||
"fr_FR": "Switch",
|
||||
"he_IL": "",
|
||||
"it_IT": "",
|
||||
"ja_JP": "",
|
||||
"ko_KR": "",
|
||||
"ko_KR": "스위치",
|
||||
"no_NO": "",
|
||||
"pl_PL": "",
|
||||
"pt_BR": "",
|
||||
@ -21293,11 +21341,11 @@
|
||||
"el_GR": "",
|
||||
"en_US": "Unbounded",
|
||||
"es_ES": "",
|
||||
"fr_FR": "",
|
||||
"fr_FR": "Sans Limite",
|
||||
"he_IL": "",
|
||||
"it_IT": "",
|
||||
"ja_JP": "",
|
||||
"ko_KR": "",
|
||||
"ko_KR": "무제한",
|
||||
"no_NO": "Ubegrenset",
|
||||
"pl_PL": "",
|
||||
"pt_BR": "",
|
||||
@ -21317,11 +21365,11 @@
|
||||
"el_GR": "",
|
||||
"en_US": "Custom Refresh Rate",
|
||||
"es_ES": "",
|
||||
"fr_FR": "",
|
||||
"fr_FR": "Taux de Rafraîchissement Customisé",
|
||||
"he_IL": "",
|
||||
"it_IT": "",
|
||||
"ja_JP": "",
|
||||
"ko_KR": "",
|
||||
"ko_KR": "사용자 정의 주사율",
|
||||
"no_NO": "Egendefinert oppdateringsfrekvens",
|
||||
"pl_PL": "",
|
||||
"pt_BR": "",
|
||||
@ -21341,11 +21389,11 @@
|
||||
"el_GR": "",
|
||||
"en_US": "Emulated Vertical Sync. 'Switch' emulates the Switch's refresh rate of 60Hz. 'Unbounded' is an unbounded refresh rate.",
|
||||
"es_ES": "",
|
||||
"fr_FR": "",
|
||||
"fr_FR": "VSync émulé. 'Switch' émule le taux de rafraîchissement de la Switch (60Hz). 'Sans Limite' est un taux de rafraîchissement qui n'est pas limité.",
|
||||
"he_IL": "",
|
||||
"it_IT": "",
|
||||
"ja_JP": "",
|
||||
"ko_KR": "",
|
||||
"ko_KR": "에뮬레이트된 수직 동기화. '스위치'는 스위치의 60Hz 주사율을 에뮬레이트합니다. '무한'은 무제한 주사율입니다.",
|
||||
"no_NO": "Emulert vertikal synkronisering. «Switch» emulerer Switchs oppdateringsfrekvens på 60 Hz. «Ubegrenset» er en ubegrenset oppdateringsfrekvens.",
|
||||
"pl_PL": "",
|
||||
"pt_BR": "",
|
||||
@ -21363,13 +21411,13 @@
|
||||
"ar_SA": "",
|
||||
"de_DE": "",
|
||||
"el_GR": "",
|
||||
"en_US": "Emulated Vertical Sync. 'Switch' emulates the Switch's refresh rate of 60Hz. 'Unbounded' is an unbounded refresh rate. 'Custom' emulates the specified custom refresh rate.",
|
||||
"en_US": "Emulated Vertical Sync. 'Switch' emulates the Switch's refresh rate of 60Hz. 'Unbounded' is an unbounded refresh rate. 'Custom Refresh Rate' emulates the specified custom refresh rate.",
|
||||
"es_ES": "",
|
||||
"fr_FR": "",
|
||||
"fr_FR": "VSync émulé. 'Switch' émule le taux de rafraîchissement de la Switch (60Hz). 'Sans Limite' est un taux de rafraîchissement qui n'est pas limité. 'Taux de Rafraîchissement Customisé' émule le taux de rafraîchissement spécifié.",
|
||||
"he_IL": "",
|
||||
"it_IT": "",
|
||||
"ja_JP": "",
|
||||
"ko_KR": "",
|
||||
"ko_KR": "에뮬레이트된 수직 동기화. '스위치'는 스위치의 60Hz 주사율을 에뮬레이트합니다. '무한'은 무제한 주사율입니다. '사용자 지정'은 지정된 사용자 지정 주사율을 에뮬레이트합니다.",
|
||||
"no_NO": "Emulert vertikal synkronisering. «Switch» emulerer Switchs oppdateringsfrekvens på 60 Hz. «Ubegrenset» er en ubegrenset oppdateringsfrekvens. «Egendefinert» emulerer den angitte egendefinerte oppdateringsfrekvensen.",
|
||||
"pl_PL": "",
|
||||
"pt_BR": "",
|
||||
@ -21389,11 +21437,11 @@
|
||||
"el_GR": "",
|
||||
"en_US": "Allows the user to specify an emulated refresh rate. In some titles, this may speed up or slow down the rate of gameplay logic. In other titles, it may allow for capping FPS at some multiple of the refresh rate, or lead to unpredictable behavior. This is an experimental feature, with no guarantees for how gameplay will be affected. \n\nLeave OFF if unsure.",
|
||||
"es_ES": "",
|
||||
"fr_FR": "",
|
||||
"fr_FR": "Permet à l'utilisateur de spécifier un taux de rafraîchissement émulé. Dans certains jeux, ceci pourrait accélérer ou ralentir le taux de logique du gameplay. Dans d'autre titres, cela permettrait limiter le FPS à un multiple du taux de rafraîchissement, ou conduire à un comportement imprévisible. Ceci est une fonctionnalité expérimentale, avec aucune garanties pour comment le gameplay sera affecté. \n\nLaisser désactiver en cas de doute.",
|
||||
"he_IL": "",
|
||||
"it_IT": "",
|
||||
"ja_JP": "",
|
||||
"ko_KR": "",
|
||||
"ko_KR": "사용자가 에뮬레이트된 화면 주사율을 지정할 수 있습니다. 일부 타이틀에서는 게임플레이 로직 속도가 빨라지거나 느려질 수 있습니다. 다른 타이틀에서는 주사율의 배수로 FPS를 제한하거나 예측할 수 없는 동작으로 이어질 수 있습니다. 이는 실험적 기능으로 게임 플레이에 어떤 영향을 미칠지 보장할 수 없습니다. \n\n모르면 끔으로 두세요.",
|
||||
"no_NO": "Gjør det mulig for brukeren å angi en emulert oppdateringsfrekvens. I noen titler kan dette øke eller senke hastigheten på spillogikken. I andre titler kan det gjøre det mulig å begrense FPS til et multiplum av oppdateringsfrekvensen, eller føre til uforutsigbar oppførsel. Dette er en eksperimentell funksjon, og det gis ingen garantier for hvordan spillingen påvirkes. \n\nLa AV stå hvis du er usikker.",
|
||||
"pl_PL": "",
|
||||
"pt_BR": "",
|
||||
@ -21413,11 +21461,11 @@
|
||||
"el_GR": "",
|
||||
"en_US": "The custom refresh rate target value.",
|
||||
"es_ES": "",
|
||||
"fr_FR": "",
|
||||
"fr_FR": "La valeur cible du taux de rafraîchissement customisé.",
|
||||
"he_IL": "",
|
||||
"it_IT": "",
|
||||
"ja_JP": "",
|
||||
"ko_KR": "",
|
||||
"ko_KR": "사용자 정의 주사율 목표 값입니다.",
|
||||
"no_NO": "Den egendefinerte målverdien for oppdateringsfrekvens.",
|
||||
"pl_PL": "",
|
||||
"pt_BR": "",
|
||||
@ -21437,11 +21485,11 @@
|
||||
"el_GR": "",
|
||||
"en_US": "The custom refresh rate, as a percentage of the normal Switch refresh rate.",
|
||||
"es_ES": "",
|
||||
"fr_FR": "",
|
||||
"fr_FR": "Le taux de rafraîchissement customisé, comme un pourcentage du taux de rafraîchissement normal de la Switch.",
|
||||
"he_IL": "",
|
||||
"it_IT": "",
|
||||
"ja_JP": "",
|
||||
"ko_KR": "",
|
||||
"ko_KR": "일반 스위치 주사율의 백분율로 나타낸 사용자 지정 주사율입니다.",
|
||||
"no_NO": "Den egendefinerte oppdateringsfrekvensen, i prosent av den normale oppdateringsfrekvensen for Switch-konsollen.",
|
||||
"pl_PL": "",
|
||||
"pt_BR": "",
|
||||
@ -21461,11 +21509,11 @@
|
||||
"el_GR": "",
|
||||
"en_US": "Custom Refresh Rate %:",
|
||||
"es_ES": "",
|
||||
"fr_FR": "",
|
||||
"fr_FR": "Pourcentage du Taux de Rafraîchissement Customisé :",
|
||||
"he_IL": "",
|
||||
"it_IT": "",
|
||||
"ja_JP": "",
|
||||
"ko_KR": "",
|
||||
"ko_KR": "사용자 정의 주사율 % :",
|
||||
"no_NO": "Egendefinert oppdateringsfrekvens %:",
|
||||
"pl_PL": "",
|
||||
"pt_BR": "",
|
||||
@ -21485,11 +21533,11 @@
|
||||
"el_GR": "",
|
||||
"en_US": "Custom Refresh Rate Value:",
|
||||
"es_ES": "",
|
||||
"fr_FR": "",
|
||||
"fr_FR": "Valeur du Taux de Rafraîchissement Customisé :",
|
||||
"he_IL": "",
|
||||
"it_IT": "",
|
||||
"ja_JP": "",
|
||||
"ko_KR": "",
|
||||
"ko_KR": "사용자 정의 주사율 값 :",
|
||||
"no_NO": "Egendefinert verdi for oppdateringsfrekvens:",
|
||||
"pl_PL": "",
|
||||
"pt_BR": "",
|
||||
@ -21509,11 +21557,11 @@
|
||||
"el_GR": "",
|
||||
"en_US": "Interval",
|
||||
"es_ES": "",
|
||||
"fr_FR": "",
|
||||
"fr_FR": "Intervalle",
|
||||
"he_IL": "",
|
||||
"it_IT": "",
|
||||
"ja_JP": "",
|
||||
"ko_KR": "",
|
||||
"ko_KR": "간격",
|
||||
"no_NO": "Intervall",
|
||||
"pl_PL": "",
|
||||
"pt_BR": "",
|
||||
@ -21533,11 +21581,11 @@
|
||||
"el_GR": "",
|
||||
"en_US": "Toggle VSync mode:",
|
||||
"es_ES": "",
|
||||
"fr_FR": "",
|
||||
"fr_FR": "Activer/Désactiver mode VSync :",
|
||||
"he_IL": "",
|
||||
"it_IT": "",
|
||||
"ja_JP": "",
|
||||
"ko_KR": "",
|
||||
"ko_KR": "수직 동기화 모드 전환 :",
|
||||
"no_NO": "Veksle mellom VSync-modus:",
|
||||
"pl_PL": "",
|
||||
"pt_BR": "",
|
||||
@ -21557,11 +21605,11 @@
|
||||
"el_GR": "",
|
||||
"en_US": "Raise custom refresh rate",
|
||||
"es_ES": "",
|
||||
"fr_FR": "",
|
||||
"fr_FR": "Augmenter le taux de rafraîchissement customisé :",
|
||||
"he_IL": "",
|
||||
"it_IT": "",
|
||||
"ja_JP": "",
|
||||
"ko_KR": "",
|
||||
"ko_KR": "사용자 정의 주사율 증가",
|
||||
"no_NO": "Øk den egendefinerte oppdateringsfrekvensen",
|
||||
"pl_PL": "",
|
||||
"pt_BR": "",
|
||||
@ -21579,13 +21627,13 @@
|
||||
"ar_SA": "",
|
||||
"de_DE": "",
|
||||
"el_GR": "",
|
||||
"en_US": "Lower custom refresh rate",
|
||||
"en_US": "Lower custom refresh rate:",
|
||||
"es_ES": "",
|
||||
"fr_FR": "",
|
||||
"fr_FR": "Baisser le taux de rafraîchissement customisé :",
|
||||
"he_IL": "",
|
||||
"it_IT": "",
|
||||
"ja_JP": "",
|
||||
"ko_KR": "",
|
||||
"ko_KR": "사용자 정의 주사율 감소",
|
||||
"no_NO": "Lavere tilpasset oppdateringsfrekvens",
|
||||
"pl_PL": "",
|
||||
"pt_BR": "",
|
||||
|
@ -17,7 +17,6 @@
|
||||
<MenuItem
|
||||
Click="CreateApplicationShortcut_Click"
|
||||
Header="{ext:Locale GameListContextMenuCreateShortcut}"
|
||||
IsEnabled="{Binding CreateShortcutEnabled}"
|
||||
Icon="{ext:Icon fa-solid fa-bookmark}"
|
||||
ToolTip.Tip="{OnPlatform Default={ext:Locale GameListContextMenuCreateShortcutToolTip}, macOS={ext:Locale GameListContextMenuCreateShortcutToolTipMacOS}}" />
|
||||
<Separator />
|
||||
|
@ -97,7 +97,7 @@ namespace Ryujinx.Ava.UI.ViewModels.Input
|
||||
{
|
||||
if (IsModified)
|
||||
{
|
||||
|
||||
|
||||
_playerIdChoose = value;
|
||||
return;
|
||||
}
|
||||
@ -105,7 +105,7 @@ namespace Ryujinx.Ava.UI.ViewModels.Input
|
||||
IsModified = false;
|
||||
_playerId = value;
|
||||
|
||||
if (!Enum.IsDefined(typeof(PlayerIndex), _playerId))
|
||||
if (!Enum.IsDefined<PlayerIndex>(_playerId))
|
||||
{
|
||||
_playerId = PlayerIndex.Player1;
|
||||
|
||||
|
@ -424,8 +424,6 @@ namespace Ryujinx.Ava.UI.ViewModels
|
||||
|
||||
public bool OpenBcatSaveDirectoryEnabled => !SelectedApplication.ControlHolder.ByteSpan.IsZeros() && SelectedApplication.ControlHolder.Value.BcatDeliveryCacheStorageSize > 0;
|
||||
|
||||
public bool CreateShortcutEnabled => !ReleaseInformation.IsFlatHubBuild;
|
||||
|
||||
public string LoadHeading
|
||||
{
|
||||
get => _loadHeading;
|
||||
|
@ -287,9 +287,16 @@
|
||||
<MenuItem VerticalAlignment="Center" Header="{ext:Locale MenuBarViewWindow}">
|
||||
<MenuItem Header="{ext:Locale MenuBarViewWindow720}" Tag="1280 720" Click="ChangeWindowSize_Click" />
|
||||
<MenuItem Header="{ext:Locale MenuBarViewWindow1080}" Tag="1920 1080" Click="ChangeWindowSize_Click" />
|
||||
<MenuItem Header="{ext:Locale MenuBarViewWindow1440}" Tag="2560 1440" Click="ChangeWindowSize_Click" />
|
||||
<MenuItem Header="{ext:Locale MenuBarViewWindow2160}" Tag="3840 2160" Click="ChangeWindowSize_Click" />
|
||||
</MenuItem>
|
||||
</MenuItem>
|
||||
<MenuItem VerticalAlignment="Center" Header="{ext:Locale MenuBarHelp}">
|
||||
<MenuItem
|
||||
Click="OpenAboutWindow"
|
||||
Header="{ext:Locale MenuBarHelpAbout}"
|
||||
Icon="{ext:Icon fa-solid fa-circle-info}"
|
||||
ToolTip.Tip="{ext:Locale OpenAboutTooltip}" />
|
||||
<MenuItem
|
||||
Name="UpdateMenuItem"
|
||||
IsEnabled="{Binding CanUpdate}"
|
||||
@ -298,30 +305,26 @@
|
||||
Icon="{ext:Icon mdi-update}"
|
||||
ToolTip.Tip="{ext:Locale CheckUpdatesTooltip}" />
|
||||
<Separator />
|
||||
<MenuItem
|
||||
Click="MenuItem_OnClick"
|
||||
Header="{ext:Locale MenuBarHelpFaq}"
|
||||
Icon="{ext:Icon fa-github}"
|
||||
Tag="https://github.com/GreemDev/Ryujinx/wiki/FAQ-and-Troubleshooting"
|
||||
ToolTip.Tip="{ext:Locale MenuBarHelpFaqTooltip}" />
|
||||
<MenuItem
|
||||
Click="MenuItem_OnClick"
|
||||
Header="{ext:Locale MenuBarHelpSetup}"
|
||||
Icon="{ext:Icon fa-github}"
|
||||
Tag="https://github.com/GreemDev/Ryujinx/wiki/Ryujinx-Setup-&-Configuration-Guide"
|
||||
ToolTip.Tip="{ext:Locale MenuBarHelpSetupTooltip}" />
|
||||
<MenuItem
|
||||
Click="MenuItem_OnClick"
|
||||
Header="{ext:Locale MenuBarHelpMultiplayer}"
|
||||
Icon="{ext:Icon fa-github}"
|
||||
Tag="https://github.com/GreemDev/Ryujinx/wiki/Multiplayer%E2%80%90(LDN%E2%80%90Local%E2%80%90Wireless)%E2%80%90Guide"
|
||||
ToolTip.Tip="{ext:Locale MenuBarHelpMultiplayerTooltip}" />
|
||||
<Separator />
|
||||
<MenuItem
|
||||
Click="OpenAboutWindow"
|
||||
Header="{ext:Locale MenuBarHelpAbout}"
|
||||
Icon="{ext:Icon fa-solid fa-circle-info}"
|
||||
ToolTip.Tip="{ext:Locale OpenAboutTooltip}" />
|
||||
<MenuItem VerticalAlignment="Center" Header="{ext:Locale MenuBarHelpFaqAndGuides}" Icon="{ext:Icon fa-solid fa-question}" >
|
||||
<MenuItem
|
||||
Click="MenuItem_OnClick"
|
||||
Header="{ext:Locale MenuBarHelpFaq}"
|
||||
Icon="{ext:Icon fa-github}"
|
||||
Tag="https://github.com/GreemDev/Ryujinx/wiki/FAQ-and-Troubleshooting"
|
||||
ToolTip.Tip="{ext:Locale MenuBarHelpFaqTooltip}" />
|
||||
<MenuItem
|
||||
Click="MenuItem_OnClick"
|
||||
Header="{ext:Locale MenuBarHelpSetup}"
|
||||
Icon="{ext:Icon fa-github}"
|
||||
Tag="https://github.com/GreemDev/Ryujinx/wiki/Ryujinx-Setup-&-Configuration-Guide"
|
||||
ToolTip.Tip="{ext:Locale MenuBarHelpSetupTooltip}" />
|
||||
<MenuItem
|
||||
Click="MenuItem_OnClick"
|
||||
Header="{ext:Locale MenuBarHelpMultiplayer}"
|
||||
Icon="{ext:Icon fa-github}"
|
||||
Tag="https://github.com/GreemDev/Ryujinx/wiki/Multiplayer%E2%80%90(LDN%E2%80%90Local%E2%80%90Wireless)%E2%80%90Guide"
|
||||
ToolTip.Tip="{ext:Locale MenuBarHelpMultiplayerTooltip}" />
|
||||
</MenuItem>
|
||||
</MenuItem>
|
||||
</Menu>
|
||||
</DockPanel>
|
||||
|
@ -52,7 +52,7 @@ namespace Ryujinx.Ava.UI.Views.Main
|
||||
private void AspectRatioStatus_OnClick(object sender, RoutedEventArgs e)
|
||||
{
|
||||
AspectRatio aspectRatio = ConfigurationState.Instance.Graphics.AspectRatio.Value;
|
||||
ConfigurationState.Instance.Graphics.AspectRatio.Value = (int)aspectRatio + 1 > Enum.GetNames(typeof(AspectRatio)).Length - 1 ? AspectRatio.Fixed4x3 : aspectRatio + 1;
|
||||
ConfigurationState.Instance.Graphics.AspectRatio.Value = (int)aspectRatio + 1 > Enum.GetNames<AspectRatio>().Length - 1 ? AspectRatio.Fixed4x3 : aspectRatio + 1;
|
||||
}
|
||||
|
||||
private void Refresh_OnClick(object sender, RoutedEventArgs e) => Window.LoadApplications();
|
||||
|
@ -181,15 +181,11 @@
|
||||
SelectedTime="{Binding CurrentTime}"
|
||||
Width="350"
|
||||
ToolTip.Tip="{ext:Locale TimeTooltip}" />
|
||||
</StackPanel>
|
||||
<StackPanel
|
||||
Margin="350,0,0,10"
|
||||
Orientation="Horizontal">
|
||||
<Button
|
||||
Margin="10, 0, 0, 0"
|
||||
VerticalAlignment="Center"
|
||||
Click="MatchSystemTime_OnClick"
|
||||
Background="{DynamicResource SystemAccentColor}"
|
||||
Width="150"
|
||||
ToolTip.Tip="{ext:Locale MatchTimeTooltip}">
|
||||
<TextBlock Text="{ext:Locale SettingsTabSystemSystemTimeMatch}" />
|
||||
</Button>
|
||||
|
@ -1,7 +1,7 @@
|
||||
using Avalonia;
|
||||
using Avalonia.Controls;
|
||||
using Avalonia.Interactivity;
|
||||
using Ryujinx.Ava.UI.ViewModels;
|
||||
using System;
|
||||
using TimeZone = Ryujinx.Ava.UI.Models.TimeZone;
|
||||
|
||||
namespace Ryujinx.Ava.UI.Views.Settings
|
||||
|
@ -686,22 +686,11 @@ namespace Ryujinx.Ava
|
||||
#else
|
||||
if (showWarnings)
|
||||
{
|
||||
if (ReleaseInformation.IsFlatHubBuild)
|
||||
{
|
||||
Dispatcher.UIThread.InvokeAsync(() =>
|
||||
ContentDialogHelper.CreateWarningDialog(
|
||||
LocaleManager.Instance[LocaleKeys.UpdaterDisabledWarningTitle],
|
||||
LocaleManager.Instance[LocaleKeys.DialogUpdaterFlatpakNotSupportedMessage])
|
||||
Dispatcher.UIThread.InvokeAsync(() =>
|
||||
ContentDialogHelper.CreateWarningDialog(
|
||||
LocaleManager.Instance[LocaleKeys.UpdaterDisabledWarningTitle],
|
||||
LocaleManager.Instance[LocaleKeys.DialogUpdaterDirtyBuildSubMessage])
|
||||
);
|
||||
}
|
||||
else
|
||||
{
|
||||
Dispatcher.UIThread.InvokeAsync(() =>
|
||||
ContentDialogHelper.CreateWarningDialog(
|
||||
LocaleManager.Instance[LocaleKeys.UpdaterDisabledWarningTitle],
|
||||
LocaleManager.Instance[LocaleKeys.DialogUpdaterDirtyBuildSubMessage])
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
|
Loading…
x
Reference in New Issue
Block a user