mirror of
https://git.ryujinx.app/ryubing/ryujinx.git
synced 2025-09-11 20:37:35 +00:00
Compare commits
23 Commits
Canary-1.2
...
Canary-1.2
Author | SHA1 | Date | |
---|---|---|---|
|
315a1819c0 | ||
|
4ffb8aef12 | ||
|
290a6ad5de | ||
|
eda4f4349b | ||
|
5fbcb1f3a7 | ||
|
d00754477e | ||
|
0bc1eddaeb | ||
|
baad1e313f | ||
|
a1e6d11dcb | ||
|
3d168a8bfa | ||
|
000c1756de | ||
|
1d0152b961 | ||
|
07690e4527 | ||
|
08b7257be5 | ||
|
17483aad24 | ||
|
6b5cb151c3 | ||
|
3680df6092 | ||
|
facc12a94a | ||
|
8e55e6d6d7 | ||
|
346dfe9542 | ||
|
8a2b56cae6 | ||
|
baf179efdb | ||
|
2a72fb2088 |
3
.gitignore
vendored
3
.gitignore
vendored
@@ -175,3 +175,6 @@ PublishProfiles/
|
|||||||
|
|
||||||
# Glade backup files
|
# Glade backup files
|
||||||
*.glade~
|
*.glade~
|
||||||
|
|
||||||
|
# Ignore MacOS Attribute Files
|
||||||
|
._*
|
||||||
|
@@ -38,7 +38,7 @@
|
|||||||
<PackageVersion Include="Ryujinx.Graphics.Nvdec.Dependencies" Version="5.0.3-build14" />
|
<PackageVersion Include="Ryujinx.Graphics.Nvdec.Dependencies" Version="5.0.3-build14" />
|
||||||
<PackageVersion Include="Ryujinx.Graphics.Vulkan.Dependencies.MoltenVK" Version="1.2.0" />
|
<PackageVersion Include="Ryujinx.Graphics.Vulkan.Dependencies.MoltenVK" Version="1.2.0" />
|
||||||
<PackageVersion Include="Ryujinx.SDL2-CS" Version="2.30.0-build32" />
|
<PackageVersion Include="Ryujinx.SDL2-CS" Version="2.30.0-build32" />
|
||||||
<PackageVersion Include="Gommon" Version="2.6.6" />
|
<PackageVersion Include="Gommon" Version="2.6.8" />
|
||||||
<PackageVersion Include="securifybv.ShellLink" Version="0.1.0" />
|
<PackageVersion Include="securifybv.ShellLink" Version="0.1.0" />
|
||||||
<PackageVersion Include="shaderc.net" Version="0.1.0" />
|
<PackageVersion Include="shaderc.net" Version="0.1.0" />
|
||||||
<PackageVersion Include="SharpZipLib" Version="1.4.2" />
|
<PackageVersion Include="SharpZipLib" Version="1.4.2" />
|
||||||
|
@@ -14,7 +14,7 @@ if [ -z "$RYUJINX_BIN" ]; then
|
|||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
|
|
||||||
COMMAND="env DOTNET_EnableAlternateStackCheck=1"
|
COMMAND="env LANG=C.UTF-8 DOTNET_EnableAlternateStackCheck=1"
|
||||||
|
|
||||||
if command -v gamemoderun > /dev/null 2>&1; then
|
if command -v gamemoderun > /dev/null 2>&1; then
|
||||||
COMMAND="$COMMAND gamemoderun"
|
COMMAND="$COMMAND gamemoderun"
|
||||||
|
@@ -40,11 +40,11 @@
|
|||||||
<key>CFBundlePackageType</key>
|
<key>CFBundlePackageType</key>
|
||||||
<string>APPL</string>
|
<string>APPL</string>
|
||||||
<key>CFBundleShortVersionString</key>
|
<key>CFBundleShortVersionString</key>
|
||||||
<string>1.1</string>
|
<string>1.2</string>
|
||||||
<key>CFBundleSignature</key>
|
<key>CFBundleSignature</key>
|
||||||
<string>????</string>
|
<string>????</string>
|
||||||
<key>CFBundleVersion</key>
|
<key>CFBundleVersion</key>
|
||||||
<string>1.1.0</string>
|
<string>1.2.0</string>
|
||||||
<key>NSHighResolutionCapable</key>
|
<key>NSHighResolutionCapable</key>
|
||||||
<true/>
|
<true/>
|
||||||
<key>CSResourcesFileMapped</key>
|
<key>CSResourcesFileMapped</key>
|
||||||
|
@@ -17,7 +17,7 @@ error_handler() {
|
|||||||
set the button_pressed to the button returned of the result
|
set the button_pressed to the button returned of the result
|
||||||
|
|
||||||
if the button_pressed is \"Open Download Page\" then
|
if the button_pressed is \"Open Download Page\" then
|
||||||
open location \"https://ryujinx.org/download\"
|
open location \"https://ryujinx.app/download\"
|
||||||
end if
|
end if
|
||||||
"""
|
"""
|
||||||
|
|
||||||
@@ -54,4 +54,4 @@ if [ "$#" -le 3 ]; then
|
|||||||
open -a "$INSTALL_DIRECTORY"
|
open -a "$INSTALL_DIRECTORY"
|
||||||
else
|
else
|
||||||
open -a "$INSTALL_DIRECTORY" --args "${APP_ARGUMENTS[@]}"
|
open -a "$INSTALL_DIRECTORY" --args "${APP_ARGUMENTS[@]}"
|
||||||
fi
|
fi
|
||||||
|
@@ -3,6 +3,7 @@
|
|||||||
<PropertyGroup>
|
<PropertyGroup>
|
||||||
<TargetFramework>net8.0</TargetFramework>
|
<TargetFramework>net8.0</TargetFramework>
|
||||||
<AllowUnsafeBlocks>true</AllowUnsafeBlocks>
|
<AllowUnsafeBlocks>true</AllowUnsafeBlocks>
|
||||||
|
<DefaultItemExcludes>$(DefaultItemExcludes);._*</DefaultItemExcludes>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
|
@@ -36,9 +36,9 @@ namespace ARMeilleure.Common
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="address">Guest address</param>
|
/// <param name="address">Guest address</param>
|
||||||
/// <returns>Value of the <see cref="AddressTableLevel"/> from the specified guest <paramref name="address"/></returns>
|
/// <returns>Value of the <see cref="AddressTableLevel"/> from the specified guest <paramref name="address"/></returns>
|
||||||
public int GetValue(ulong address)
|
public long GetValue(ulong address)
|
||||||
{
|
{
|
||||||
return (int)((address & Mask) >> Index);
|
return (long)((address & Mask) >> Index);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -88,7 +88,7 @@ namespace ARMeilleure.Instructions
|
|||||||
EmitSetTpidrEl0(context);
|
EmitSetTpidrEl0(context);
|
||||||
return;
|
return;
|
||||||
case 0b11_011_1101_0000_101:
|
case 0b11_011_1101_0000_101:
|
||||||
EmitGetTpidr2El0(context);
|
EmitSetTpidr2El0(context);
|
||||||
return;
|
return;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
@@ -291,5 +291,16 @@ namespace ARMeilleure.Instructions
|
|||||||
|
|
||||||
context.Store(context.Add(nativeContext, Const((ulong)NativeContext.GetTpidrEl0Offset())), value);
|
context.Store(context.Add(nativeContext, Const((ulong)NativeContext.GetTpidrEl0Offset())), value);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private static void EmitSetTpidr2El0(ArmEmitterContext context)
|
||||||
|
{
|
||||||
|
OpCodeSystem op = (OpCodeSystem)context.CurrOp;
|
||||||
|
|
||||||
|
Operand value = GetIntOrZR(context, op.Rt);
|
||||||
|
|
||||||
|
Operand nativeContext = context.LoadArgument(OperandType.I64, 0);
|
||||||
|
|
||||||
|
context.Store(context.Add(nativeContext, Const((ulong)NativeContext.GetTpidr2El0Offset())), value);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -30,7 +30,7 @@ namespace ARMeilleure.Translation.PTC
|
|||||||
private const string OuterHeaderMagicString = "PTCohd\0\0";
|
private const string OuterHeaderMagicString = "PTCohd\0\0";
|
||||||
private const string InnerHeaderMagicString = "PTCihd\0\0";
|
private const string InnerHeaderMagicString = "PTCihd\0\0";
|
||||||
|
|
||||||
private const uint InternalVersion = 6992; //! To be incremented manually for each change to the ARMeilleure project.
|
private const uint InternalVersion = 6997; //! To be incremented manually for each change to the ARMeilleure project.
|
||||||
|
|
||||||
private const string ActualDir = "0";
|
private const string ActualDir = "0";
|
||||||
private const string BackupDir = "1";
|
private const string BackupDir = "1";
|
||||||
|
@@ -2,6 +2,7 @@
|
|||||||
|
|
||||||
<PropertyGroup>
|
<PropertyGroup>
|
||||||
<TargetFramework>net8.0</TargetFramework>
|
<TargetFramework>net8.0</TargetFramework>
|
||||||
|
<DefaultItemExcludes>$(DefaultItemExcludes);._*</DefaultItemExcludes>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
|
@@ -3,6 +3,7 @@
|
|||||||
<PropertyGroup>
|
<PropertyGroup>
|
||||||
<TargetFramework>net8.0</TargetFramework>
|
<TargetFramework>net8.0</TargetFramework>
|
||||||
<AllowUnsafeBlocks>true</AllowUnsafeBlocks>
|
<AllowUnsafeBlocks>true</AllowUnsafeBlocks>
|
||||||
|
<DefaultItemExcludes>$(DefaultItemExcludes);._*</DefaultItemExcludes>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
|
@@ -4,6 +4,7 @@
|
|||||||
<TargetFramework>net8.0</TargetFramework>
|
<TargetFramework>net8.0</TargetFramework>
|
||||||
<AllowUnsafeBlocks>true</AllowUnsafeBlocks>
|
<AllowUnsafeBlocks>true</AllowUnsafeBlocks>
|
||||||
<RuntimeIdentifiers>win-x64;osx-x64;linux-x64</RuntimeIdentifiers>
|
<RuntimeIdentifiers>win-x64;osx-x64;linux-x64</RuntimeIdentifiers>
|
||||||
|
<DefaultItemExcludes>$(DefaultItemExcludes);._*</DefaultItemExcludes>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
|
@@ -3,6 +3,7 @@
|
|||||||
<PropertyGroup>
|
<PropertyGroup>
|
||||||
<TargetFramework>net8.0</TargetFramework>
|
<TargetFramework>net8.0</TargetFramework>
|
||||||
<AllowUnsafeBlocks>true</AllowUnsafeBlocks>
|
<AllowUnsafeBlocks>true</AllowUnsafeBlocks>
|
||||||
|
<DefaultItemExcludes>$(DefaultItemExcludes);._*</DefaultItemExcludes>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
|
@@ -1,6 +1,8 @@
|
|||||||
namespace Ryujinx.Common.Configuration.Hid.Controller
|
namespace Ryujinx.Common.Configuration.Hid.Controller
|
||||||
{
|
{
|
||||||
public class JoyconConfigControllerStick<TButton, TStick> where TButton : unmanaged where TStick : unmanaged
|
public class JoyconConfigControllerStick<TButton, TStick>
|
||||||
|
where TButton : unmanaged
|
||||||
|
where TStick : unmanaged
|
||||||
{
|
{
|
||||||
public TStick Joystick { get; set; }
|
public TStick Joystick { get; set; }
|
||||||
public bool InvertStickX { get; set; }
|
public bool InvertStickX { get; set; }
|
||||||
|
@@ -4,6 +4,7 @@
|
|||||||
<TargetFramework>net8.0</TargetFramework>
|
<TargetFramework>net8.0</TargetFramework>
|
||||||
<AllowUnsafeBlocks>true</AllowUnsafeBlocks>
|
<AllowUnsafeBlocks>true</AllowUnsafeBlocks>
|
||||||
<DefineConstants Condition=" '$(ExtraDefineConstants)' != '' ">$(DefineConstants);$(ExtraDefineConstants)</DefineConstants>
|
<DefineConstants Condition=" '$(ExtraDefineConstants)' != '' ">$(DefineConstants);$(ExtraDefineConstants)</DefineConstants>
|
||||||
|
<DefaultItemExcludes>$(DefaultItemExcludes);._*</DefaultItemExcludes>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
|
@@ -238,7 +238,7 @@ namespace ARMeilleure.Common
|
|||||||
{
|
{
|
||||||
TEntry* page = GetPage(address);
|
TEntry* page = GetPage(address);
|
||||||
|
|
||||||
int index = Levels[^1].GetValue(address);
|
long index = Levels[^1].GetValue(address);
|
||||||
|
|
||||||
EnsureMapped((IntPtr)(page + index));
|
EnsureMapped((IntPtr)(page + index));
|
||||||
|
|
||||||
|
@@ -3,6 +3,7 @@
|
|||||||
<PropertyGroup>
|
<PropertyGroup>
|
||||||
<TargetFramework>net8.0</TargetFramework>
|
<TargetFramework>net8.0</TargetFramework>
|
||||||
<AllowUnsafeBlocks>true</AllowUnsafeBlocks>
|
<AllowUnsafeBlocks>true</AllowUnsafeBlocks>
|
||||||
|
<DefaultItemExcludes>$(DefaultItemExcludes);._*</DefaultItemExcludes>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
|
@@ -2,6 +2,7 @@
|
|||||||
|
|
||||||
<PropertyGroup>
|
<PropertyGroup>
|
||||||
<TargetFramework>net8.0</TargetFramework>
|
<TargetFramework>net8.0</TargetFramework>
|
||||||
|
<DefaultItemExcludes>$(DefaultItemExcludes);._*</DefaultItemExcludes>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
|
@@ -2,6 +2,7 @@
|
|||||||
|
|
||||||
<PropertyGroup>
|
<PropertyGroup>
|
||||||
<TargetFramework>net8.0</TargetFramework>
|
<TargetFramework>net8.0</TargetFramework>
|
||||||
|
<DefaultItemExcludes>$(DefaultItemExcludes);._*</DefaultItemExcludes>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
|
|
||||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|AnyCPU'">
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|AnyCPU'">
|
||||||
|
@@ -3,6 +3,7 @@
|
|||||||
<PropertyGroup>
|
<PropertyGroup>
|
||||||
<TargetFramework>net8.0</TargetFramework>
|
<TargetFramework>net8.0</TargetFramework>
|
||||||
<AllowUnsafeBlocks>true</AllowUnsafeBlocks>
|
<AllowUnsafeBlocks>true</AllowUnsafeBlocks>
|
||||||
|
<DefaultItemExcludes>$(DefaultItemExcludes);._*</DefaultItemExcludes>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
|
@@ -2,6 +2,7 @@
|
|||||||
|
|
||||||
<PropertyGroup>
|
<PropertyGroup>
|
||||||
<TargetFramework>net8.0</TargetFramework>
|
<TargetFramework>net8.0</TargetFramework>
|
||||||
|
<DefaultItemExcludes>$(DefaultItemExcludes);._*</DefaultItemExcludes>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
|
@@ -3,6 +3,7 @@
|
|||||||
<PropertyGroup>
|
<PropertyGroup>
|
||||||
<TargetFramework>net8.0</TargetFramework>
|
<TargetFramework>net8.0</TargetFramework>
|
||||||
<AllowUnsafeBlocks>true</AllowUnsafeBlocks>
|
<AllowUnsafeBlocks>true</AllowUnsafeBlocks>
|
||||||
|
<DefaultItemExcludes>$(DefaultItemExcludes);._*</DefaultItemExcludes>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
|
@@ -3,6 +3,7 @@
|
|||||||
<PropertyGroup>
|
<PropertyGroup>
|
||||||
<TargetFramework>net8.0</TargetFramework>
|
<TargetFramework>net8.0</TargetFramework>
|
||||||
<AllowUnsafeBlocks>true</AllowUnsafeBlocks>
|
<AllowUnsafeBlocks>true</AllowUnsafeBlocks>
|
||||||
|
<DefaultItemExcludes>$(DefaultItemExcludes);._*</DefaultItemExcludes>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
|
@@ -3,6 +3,7 @@
|
|||||||
<PropertyGroup>
|
<PropertyGroup>
|
||||||
<TargetFramework>net8.0</TargetFramework>
|
<TargetFramework>net8.0</TargetFramework>
|
||||||
<AllowUnsafeBlocks>true</AllowUnsafeBlocks>
|
<AllowUnsafeBlocks>true</AllowUnsafeBlocks>
|
||||||
|
<DefaultItemExcludes>$(DefaultItemExcludes);._*</DefaultItemExcludes>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
|
@@ -3,6 +3,7 @@
|
|||||||
<PropertyGroup>
|
<PropertyGroup>
|
||||||
<TargetFramework>net8.0</TargetFramework>
|
<TargetFramework>net8.0</TargetFramework>
|
||||||
<AllowUnsafeBlocks>true</AllowUnsafeBlocks>
|
<AllowUnsafeBlocks>true</AllowUnsafeBlocks>
|
||||||
|
<DefaultItemExcludes>$(DefaultItemExcludes);._*</DefaultItemExcludes>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
|
@@ -2,6 +2,7 @@
|
|||||||
|
|
||||||
<PropertyGroup>
|
<PropertyGroup>
|
||||||
<TargetFramework>net8.0</TargetFramework>
|
<TargetFramework>net8.0</TargetFramework>
|
||||||
|
<DefaultItemExcludes>$(DefaultItemExcludes);._*</DefaultItemExcludes>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
|
@@ -2,6 +2,7 @@
|
|||||||
<PropertyGroup>
|
<PropertyGroup>
|
||||||
<TargetFramework>net8.0</TargetFramework>
|
<TargetFramework>net8.0</TargetFramework>
|
||||||
<AllowUnsafeBlocks>true</AllowUnsafeBlocks>
|
<AllowUnsafeBlocks>true</AllowUnsafeBlocks>
|
||||||
|
<DefaultItemExcludes>$(DefaultItemExcludes);._*</DefaultItemExcludes>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
|
@@ -3,6 +3,7 @@
|
|||||||
<PropertyGroup>
|
<PropertyGroup>
|
||||||
<TargetFramework>net8.0</TargetFramework>
|
<TargetFramework>net8.0</TargetFramework>
|
||||||
<AllowUnsafeBlocks>true</AllowUnsafeBlocks>
|
<AllowUnsafeBlocks>true</AllowUnsafeBlocks>
|
||||||
|
<DefaultItemExcludes>$(DefaultItemExcludes);._*</DefaultItemExcludes>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
|
@@ -2,6 +2,7 @@
|
|||||||
|
|
||||||
<PropertyGroup>
|
<PropertyGroup>
|
||||||
<TargetFramework>net8.0</TargetFramework>
|
<TargetFramework>net8.0</TargetFramework>
|
||||||
|
<DefaultItemExcludes>$(DefaultItemExcludes);._*</DefaultItemExcludes>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
|
@@ -2,6 +2,7 @@
|
|||||||
|
|
||||||
<PropertyGroup>
|
<PropertyGroup>
|
||||||
<TargetFramework>net8.0</TargetFramework>
|
<TargetFramework>net8.0</TargetFramework>
|
||||||
|
<DefaultItemExcludes>$(DefaultItemExcludes);._*</DefaultItemExcludes>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
|
|
||||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|AnyCPU'">
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|AnyCPU'">
|
||||||
|
@@ -182,6 +182,16 @@ namespace Ryujinx.Graphics.Vulkan
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//Prevent the sum of descriptors from exceeding MaxPushDescriptors
|
||||||
|
int totalDescriptors = 0;
|
||||||
|
foreach (ResourceDescriptor desc in layout.Sets.First().Descriptors)
|
||||||
|
{
|
||||||
|
if (!reserved.Contains(desc.Binding))
|
||||||
|
totalDescriptors += desc.Count;
|
||||||
|
}
|
||||||
|
if (totalDescriptors > gd.Capabilities.MaxPushDescriptors)
|
||||||
|
return false;
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
@@ -6,6 +6,7 @@
|
|||||||
<EmitCompilerGeneratedFiles>true</EmitCompilerGeneratedFiles>
|
<EmitCompilerGeneratedFiles>true</EmitCompilerGeneratedFiles>
|
||||||
<CompilerGeneratedFilesOutputPath>Generated</CompilerGeneratedFilesOutputPath>
|
<CompilerGeneratedFilesOutputPath>Generated</CompilerGeneratedFilesOutputPath>
|
||||||
<IsRoslynComponent>true</IsRoslynComponent>
|
<IsRoslynComponent>true</IsRoslynComponent>
|
||||||
|
<DefaultItemExcludes>$(DefaultItemExcludes);._*</DefaultItemExcludes>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
|
@@ -21,6 +21,7 @@ using System.IO;
|
|||||||
using System.IO.Compression;
|
using System.IO.Compression;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
using System.Text;
|
using System.Text;
|
||||||
|
using System.Text.RegularExpressions;
|
||||||
using Path = System.IO.Path;
|
using Path = System.IO.Path;
|
||||||
|
|
||||||
namespace Ryujinx.HLE.FileSystem
|
namespace Ryujinx.HLE.FileSystem
|
||||||
@@ -474,6 +475,74 @@ namespace Ryujinx.HLE.FileSystem
|
|||||||
FinishInstallation(temporaryDirectory, registeredDirectory);
|
FinishInstallation(temporaryDirectory, registeredDirectory);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void InstallKeys(string keysSource, string installDirectory)
|
||||||
|
{
|
||||||
|
if (Directory.Exists(keysSource))
|
||||||
|
{
|
||||||
|
foreach (var filePath in Directory.EnumerateFiles(keysSource, "*.keys"))
|
||||||
|
{
|
||||||
|
VerifyKeysFile(filePath);
|
||||||
|
File.Copy(filePath, Path.Combine(installDirectory, Path.GetFileName(filePath)), true);
|
||||||
|
}
|
||||||
|
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!File.Exists(keysSource))
|
||||||
|
{
|
||||||
|
throw new FileNotFoundException("Keys file does not exist.");
|
||||||
|
}
|
||||||
|
|
||||||
|
FileInfo info = new(keysSource);
|
||||||
|
|
||||||
|
using FileStream file = File.OpenRead(keysSource);
|
||||||
|
|
||||||
|
switch (info.Extension)
|
||||||
|
{
|
||||||
|
case ".zip":
|
||||||
|
using (ZipArchive archive = ZipFile.OpenRead(keysSource))
|
||||||
|
{
|
||||||
|
InstallKeysFromZip(archive, installDirectory);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case ".keys":
|
||||||
|
VerifyKeysFile(keysSource);
|
||||||
|
File.Copy(keysSource, Path.Combine(installDirectory, info.Name), true);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
throw new InvalidFirmwarePackageException("Input file is not a valid key package");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void InstallKeysFromZip(ZipArchive archive, string installDirectory)
|
||||||
|
{
|
||||||
|
string temporaryDirectory = Path.Combine(installDirectory, "temp");
|
||||||
|
if (Directory.Exists(temporaryDirectory))
|
||||||
|
{
|
||||||
|
Directory.Delete(temporaryDirectory, true);
|
||||||
|
}
|
||||||
|
Directory.CreateDirectory(temporaryDirectory);
|
||||||
|
foreach (var entry in archive.Entries)
|
||||||
|
{
|
||||||
|
if (Path.GetExtension(entry.FullName).Equals(".keys", StringComparison.OrdinalIgnoreCase))
|
||||||
|
{
|
||||||
|
string extractDestination = Path.Combine(temporaryDirectory, entry.Name);
|
||||||
|
entry.ExtractToFile(extractDestination, overwrite: true);
|
||||||
|
try
|
||||||
|
{
|
||||||
|
VerifyKeysFile(extractDestination);
|
||||||
|
File.Move(extractDestination, Path.Combine(installDirectory, entry.Name), true);
|
||||||
|
}
|
||||||
|
catch (Exception)
|
||||||
|
{
|
||||||
|
Directory.Delete(temporaryDirectory, true);
|
||||||
|
throw;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Directory.Delete(temporaryDirectory, true);
|
||||||
|
}
|
||||||
|
|
||||||
private void FinishInstallation(string temporaryDirectory, string registeredDirectory)
|
private void FinishInstallation(string temporaryDirectory, string registeredDirectory)
|
||||||
{
|
{
|
||||||
if (Directory.Exists(registeredDirectory))
|
if (Directory.Exists(registeredDirectory))
|
||||||
@@ -947,5 +1016,70 @@ namespace Ryujinx.HLE.FileSystem
|
|||||||
|
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void VerifyKeysFile(string filePath)
|
||||||
|
{
|
||||||
|
// Verify the keys file format refers to https://github.com/Thealexbarney/LibHac/blob/master/KEYS.md
|
||||||
|
string genericPattern = @"^[a-z0-9_]+ = [a-z0-9]+$";
|
||||||
|
string titlePattern = @"^[a-z0-9]{32} = [a-z0-9]{32}$";
|
||||||
|
|
||||||
|
if (File.Exists(filePath))
|
||||||
|
{
|
||||||
|
// Read all lines from the file
|
||||||
|
string fileName = Path.GetFileName(filePath);
|
||||||
|
string[] lines = File.ReadAllLines(filePath);
|
||||||
|
|
||||||
|
bool verified = false;
|
||||||
|
switch (fileName)
|
||||||
|
{
|
||||||
|
case "prod.keys":
|
||||||
|
verified = verifyKeys(lines, genericPattern);
|
||||||
|
break;
|
||||||
|
case "title.keys":
|
||||||
|
verified = verifyKeys(lines, titlePattern);
|
||||||
|
break;
|
||||||
|
case "console.keys":
|
||||||
|
verified = verifyKeys(lines, genericPattern);
|
||||||
|
break;
|
||||||
|
case "dev.keys":
|
||||||
|
verified = verifyKeys(lines, genericPattern);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
throw new FormatException($"Keys file name \"{fileName}\" not supported. Only \"prod.keys\", \"title.keys\", \"console.keys\", \"dev.keys\" are supported.");
|
||||||
|
}
|
||||||
|
if (!verified)
|
||||||
|
{
|
||||||
|
throw new FormatException($"Invalid \"{filePath}\" file format.");
|
||||||
|
}
|
||||||
|
} else
|
||||||
|
{
|
||||||
|
throw new FileNotFoundException($"Keys file not found at \"{filePath}\".");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private bool verifyKeys(string[] lines, string regex)
|
||||||
|
{
|
||||||
|
foreach (string line in lines)
|
||||||
|
{
|
||||||
|
if (!Regex.IsMatch(line, regex))
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
public bool AreKeysAlredyPresent(string pathToCheck)
|
||||||
|
{
|
||||||
|
string[] fileNames = { "prod.keys", "title.keys", "console.keys", "dev.keys" };
|
||||||
|
foreach (var file in fileNames)
|
||||||
|
{
|
||||||
|
if (File.Exists(Path.Combine(pathToCheck, file)))
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -223,9 +223,10 @@ namespace Ryujinx.HLE.FileSystem
|
|||||||
{
|
{
|
||||||
KeySet ??= KeySet.CreateDefaultKeySet();
|
KeySet ??= KeySet.CreateDefaultKeySet();
|
||||||
|
|
||||||
string keyFile = null;
|
string prodKeyFile = null;
|
||||||
string titleKeyFile = null;
|
string titleKeyFile = null;
|
||||||
string consoleKeyFile = null;
|
string consoleKeyFile = null;
|
||||||
|
string devKeyFile = null;
|
||||||
|
|
||||||
if (AppDataManager.Mode == AppDataManager.LaunchMode.UserProfile)
|
if (AppDataManager.Mode == AppDataManager.LaunchMode.UserProfile)
|
||||||
{
|
{
|
||||||
@@ -236,13 +237,14 @@ namespace Ryujinx.HLE.FileSystem
|
|||||||
|
|
||||||
void LoadSetAtPath(string basePath)
|
void LoadSetAtPath(string basePath)
|
||||||
{
|
{
|
||||||
string localKeyFile = Path.Combine(basePath, "prod.keys");
|
string localProdKeyFile = Path.Combine(basePath, "prod.keys");
|
||||||
string localTitleKeyFile = Path.Combine(basePath, "title.keys");
|
string localTitleKeyFile = Path.Combine(basePath, "title.keys");
|
||||||
string localConsoleKeyFile = Path.Combine(basePath, "console.keys");
|
string localConsoleKeyFile = Path.Combine(basePath, "console.keys");
|
||||||
|
string localDevKeyFile = Path.Combine(basePath, "dev.keys");
|
||||||
|
|
||||||
if (File.Exists(localKeyFile))
|
if (File.Exists(localProdKeyFile))
|
||||||
{
|
{
|
||||||
keyFile = localKeyFile;
|
prodKeyFile = localProdKeyFile;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (File.Exists(localTitleKeyFile))
|
if (File.Exists(localTitleKeyFile))
|
||||||
@@ -254,9 +256,14 @@ namespace Ryujinx.HLE.FileSystem
|
|||||||
{
|
{
|
||||||
consoleKeyFile = localConsoleKeyFile;
|
consoleKeyFile = localConsoleKeyFile;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (File.Exists(localDevKeyFile))
|
||||||
|
{
|
||||||
|
devKeyFile = localDevKeyFile;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
ExternalKeyReader.ReadKeyFile(KeySet, keyFile, titleKeyFile, consoleKeyFile, null);
|
ExternalKeyReader.ReadKeyFile(KeySet, prodKeyFile, devKeyFile, titleKeyFile, consoleKeyFile, null);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void ImportTickets(IFileSystem fs)
|
public void ImportTickets(IFileSystem fs)
|
||||||
|
@@ -1,5 +1,6 @@
|
|||||||
using Ryujinx.Common.Logging;
|
using Ryujinx.Common.Logging;
|
||||||
using Ryujinx.HLE.HOS.Applets.Browser;
|
using Ryujinx.HLE.HOS.Applets.Browser;
|
||||||
|
using Ryujinx.HLE.HOS.Applets.Cabinet;
|
||||||
using Ryujinx.HLE.HOS.Applets.Dummy;
|
using Ryujinx.HLE.HOS.Applets.Dummy;
|
||||||
using Ryujinx.HLE.HOS.Applets.Error;
|
using Ryujinx.HLE.HOS.Applets.Error;
|
||||||
using Ryujinx.HLE.HOS.Services.Am.AppletAE;
|
using Ryujinx.HLE.HOS.Services.Am.AppletAE;
|
||||||
@@ -23,14 +24,14 @@ namespace Ryujinx.HLE.HOS.Applets
|
|||||||
case AppletId.SoftwareKeyboard:
|
case AppletId.SoftwareKeyboard:
|
||||||
return new SoftwareKeyboardApplet(system);
|
return new SoftwareKeyboardApplet(system);
|
||||||
case AppletId.LibAppletWeb:
|
case AppletId.LibAppletWeb:
|
||||||
return new BrowserApplet(system);
|
|
||||||
case AppletId.LibAppletShop:
|
case AppletId.LibAppletShop:
|
||||||
return new BrowserApplet(system);
|
|
||||||
case AppletId.LibAppletOff:
|
case AppletId.LibAppletOff:
|
||||||
return new BrowserApplet(system);
|
return new BrowserApplet();
|
||||||
case AppletId.MiiEdit:
|
case AppletId.MiiEdit:
|
||||||
Logger.Warning?.Print(LogClass.Application, $"Please use the MiiEdit inside File/Open Applet");
|
Logger.Warning?.Print(LogClass.Application, $"Please use the MiiEdit inside File/Open Applet");
|
||||||
return new DummyApplet(system);
|
return new DummyApplet(system);
|
||||||
|
case AppletId.Cabinet:
|
||||||
|
return new CabinetApplet(system);
|
||||||
}
|
}
|
||||||
|
|
||||||
Logger.Warning?.Print(LogClass.Application, $"Applet {applet} not implemented!");
|
Logger.Warning?.Print(LogClass.Application, $"Applet {applet} not implemented!");
|
||||||
|
@@ -18,13 +18,6 @@ namespace Ryujinx.HLE.HOS.Applets.Browser
|
|||||||
private List<BrowserArgument> _arguments;
|
private List<BrowserArgument> _arguments;
|
||||||
private ShimKind _shimKind;
|
private ShimKind _shimKind;
|
||||||
|
|
||||||
public BrowserApplet(Horizon system) { }
|
|
||||||
|
|
||||||
public ResultCode GetResult()
|
|
||||||
{
|
|
||||||
return ResultCode.Success;
|
|
||||||
}
|
|
||||||
|
|
||||||
public ResultCode Start(AppletSession normalSession, AppletSession interactiveSession)
|
public ResultCode Start(AppletSession normalSession, AppletSession interactiveSession)
|
||||||
{
|
{
|
||||||
_normalSession = normalSession;
|
_normalSession = normalSession;
|
||||||
|
182
src/Ryujinx.HLE/HOS/Applets/Cabinet/CabinetApplet.cs
Normal file
182
src/Ryujinx.HLE/HOS/Applets/Cabinet/CabinetApplet.cs
Normal file
@@ -0,0 +1,182 @@
|
|||||||
|
using Ryujinx.Common.Logging;
|
||||||
|
using Ryujinx.Common.Memory;
|
||||||
|
using Ryujinx.HLE.HOS.Services.Am.AppletAE;
|
||||||
|
using Ryujinx.HLE.HOS.Services.Hid.HidServer;
|
||||||
|
using Ryujinx.HLE.HOS.Services.Hid;
|
||||||
|
using Ryujinx.HLE.HOS.Services.Nfc.Nfp;
|
||||||
|
using Ryujinx.HLE.HOS.Services.Nfc.Nfp.NfpManager;
|
||||||
|
using System;
|
||||||
|
using System.Runtime.CompilerServices;
|
||||||
|
using System.Runtime.InteropServices;
|
||||||
|
using System.Text;
|
||||||
|
|
||||||
|
namespace Ryujinx.HLE.HOS.Applets.Cabinet
|
||||||
|
{
|
||||||
|
internal unsafe class CabinetApplet : IApplet
|
||||||
|
{
|
||||||
|
private readonly Horizon _system;
|
||||||
|
private AppletSession _normalSession;
|
||||||
|
|
||||||
|
public event EventHandler AppletStateChanged;
|
||||||
|
|
||||||
|
public CabinetApplet(Horizon system)
|
||||||
|
{
|
||||||
|
_system = system;
|
||||||
|
}
|
||||||
|
|
||||||
|
public ResultCode Start(AppletSession normalSession, AppletSession interactiveSession)
|
||||||
|
{
|
||||||
|
_normalSession = normalSession;
|
||||||
|
|
||||||
|
byte[] launchParams = _normalSession.Pop();
|
||||||
|
byte[] startParamBytes = _normalSession.Pop();
|
||||||
|
|
||||||
|
StartParamForAmiiboSettings startParam = IApplet.ReadStruct<StartParamForAmiiboSettings>(startParamBytes);
|
||||||
|
|
||||||
|
Logger.Stub?.PrintStub(LogClass.ServiceAm, $"CabinetApplet Start Type: {startParam.Type}");
|
||||||
|
|
||||||
|
switch (startParam.Type)
|
||||||
|
{
|
||||||
|
case 0:
|
||||||
|
StartNicknameAndOwnerSettings(ref startParam);
|
||||||
|
break;
|
||||||
|
case 1:
|
||||||
|
case 3:
|
||||||
|
StartFormatter(ref startParam);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
Logger.Error?.Print(LogClass.ServiceAm, $"Unknown AmiiboSettings type: {startParam.Type}");
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Prepare the response
|
||||||
|
ReturnValueForAmiiboSettings returnValue = new()
|
||||||
|
{
|
||||||
|
AmiiboSettingsReturnFlag = (byte)AmiiboSettingsReturnFlag.HasRegisterInfo,
|
||||||
|
DeviceHandle = new DeviceHandle
|
||||||
|
{
|
||||||
|
Handle = 0 // Dummy device handle
|
||||||
|
},
|
||||||
|
RegisterInfo = startParam.RegisterInfo
|
||||||
|
};
|
||||||
|
|
||||||
|
// Push the response
|
||||||
|
_normalSession.Push(BuildResponse(returnValue));
|
||||||
|
AppletStateChanged?.Invoke(this, null);
|
||||||
|
|
||||||
|
_system.ReturnFocus();
|
||||||
|
|
||||||
|
return ResultCode.Success;
|
||||||
|
}
|
||||||
|
|
||||||
|
public ResultCode GetResult()
|
||||||
|
{
|
||||||
|
_system.Device.System.NfpDevices.RemoveAt(0);
|
||||||
|
return ResultCode.Success;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void StartFormatter(ref StartParamForAmiiboSettings startParam)
|
||||||
|
{
|
||||||
|
// Initialize RegisterInfo
|
||||||
|
startParam.RegisterInfo = new RegisterInfo();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void StartNicknameAndOwnerSettings(ref StartParamForAmiiboSettings startParam)
|
||||||
|
{
|
||||||
|
_system.Device.UIHandler.DisplayCabinetDialog(out string newName);
|
||||||
|
byte[] nameBytes = Encoding.UTF8.GetBytes(newName);
|
||||||
|
Array41<byte> nickName = new Array41<byte>();
|
||||||
|
nameBytes.CopyTo(nickName.AsSpan());
|
||||||
|
startParam.RegisterInfo.Nickname = nickName;
|
||||||
|
NfpDevice devicePlayer1 = new()
|
||||||
|
{
|
||||||
|
NpadIdType = NpadIdType.Player1,
|
||||||
|
Handle = HidUtils.GetIndexFromNpadIdType(NpadIdType.Player1),
|
||||||
|
State = NfpDeviceState.SearchingForTag,
|
||||||
|
};
|
||||||
|
_system.Device.System.NfpDevices.Add(devicePlayer1);
|
||||||
|
_system.Device.UIHandler.DisplayCabinetMessageDialog();
|
||||||
|
string amiiboId = string.Empty;
|
||||||
|
bool scanned = false;
|
||||||
|
while (!scanned)
|
||||||
|
{
|
||||||
|
for (int i = 0; i < _system.Device.System.NfpDevices.Count; i++)
|
||||||
|
{
|
||||||
|
if (_system.Device.System.NfpDevices[i].State == NfpDeviceState.TagFound)
|
||||||
|
{
|
||||||
|
amiiboId = _system.Device.System.NfpDevices[i].AmiiboId;
|
||||||
|
scanned = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
VirtualAmiibo.UpdateNickName(amiiboId, newName);
|
||||||
|
}
|
||||||
|
|
||||||
|
private static byte[] BuildResponse(ReturnValueForAmiiboSettings returnValue)
|
||||||
|
{
|
||||||
|
int size = Unsafe.SizeOf<ReturnValueForAmiiboSettings>();
|
||||||
|
byte[] bytes = new byte[size];
|
||||||
|
|
||||||
|
fixed (byte* bytesPtr = bytes)
|
||||||
|
{
|
||||||
|
Unsafe.Write(bytesPtr, returnValue);
|
||||||
|
}
|
||||||
|
|
||||||
|
return bytes;
|
||||||
|
}
|
||||||
|
|
||||||
|
#region Structs
|
||||||
|
|
||||||
|
[StructLayout(LayoutKind.Sequential, Pack = 1)]
|
||||||
|
public unsafe struct TagInfo
|
||||||
|
{
|
||||||
|
public fixed byte Data[0x58];
|
||||||
|
}
|
||||||
|
|
||||||
|
[StructLayout(LayoutKind.Sequential, Pack = 1)]
|
||||||
|
public unsafe struct StartParamForAmiiboSettings
|
||||||
|
{
|
||||||
|
public byte ZeroValue; // Left at zero by sdknso
|
||||||
|
public byte Type;
|
||||||
|
public byte Flags;
|
||||||
|
public byte AmiiboSettingsStartParamOffset28;
|
||||||
|
public ulong AmiiboSettingsStartParam0;
|
||||||
|
|
||||||
|
public TagInfo TagInfo; // Only enabled when flags bit 1 is set
|
||||||
|
public RegisterInfo RegisterInfo; // Only enabled when flags bit 2 is set
|
||||||
|
|
||||||
|
public fixed byte StartParamExtraData[0x20];
|
||||||
|
|
||||||
|
public fixed byte Reserved[0x24];
|
||||||
|
}
|
||||||
|
|
||||||
|
[StructLayout(LayoutKind.Sequential, Pack = 1)]
|
||||||
|
public unsafe struct ReturnValueForAmiiboSettings
|
||||||
|
{
|
||||||
|
public byte AmiiboSettingsReturnFlag;
|
||||||
|
private byte Padding1;
|
||||||
|
private byte Padding2;
|
||||||
|
private byte Padding3;
|
||||||
|
public DeviceHandle DeviceHandle;
|
||||||
|
public TagInfo TagInfo;
|
||||||
|
public RegisterInfo RegisterInfo;
|
||||||
|
public fixed byte IgnoredBySdknso[0x24];
|
||||||
|
}
|
||||||
|
|
||||||
|
[StructLayout(LayoutKind.Sequential, Pack = 1)]
|
||||||
|
public struct DeviceHandle
|
||||||
|
{
|
||||||
|
public ulong Handle;
|
||||||
|
}
|
||||||
|
|
||||||
|
public enum AmiiboSettingsReturnFlag : byte
|
||||||
|
{
|
||||||
|
Cancel = 0,
|
||||||
|
HasTagInfo = 2,
|
||||||
|
HasRegisterInfo = 4,
|
||||||
|
HasTagInfoAndRegisterInfo = 6
|
||||||
|
}
|
||||||
|
|
||||||
|
#endregion
|
||||||
|
}
|
||||||
|
}
|
@@ -117,11 +117,6 @@ namespace Ryujinx.HLE.HOS.Applets
|
|||||||
return ResultCode.Success;
|
return ResultCode.Success;
|
||||||
}
|
}
|
||||||
|
|
||||||
public ResultCode GetResult()
|
|
||||||
{
|
|
||||||
return ResultCode.Success;
|
|
||||||
}
|
|
||||||
|
|
||||||
private static byte[] BuildResponse(ControllerSupportResultInfo result)
|
private static byte[] BuildResponse(ControllerSupportResultInfo result)
|
||||||
{
|
{
|
||||||
using MemoryStream stream = MemoryStreamManager.Shared.GetStream();
|
using MemoryStream stream = MemoryStreamManager.Shared.GetStream();
|
||||||
|
@@ -11,11 +11,14 @@ namespace Ryujinx.HLE.HOS.Applets.Dummy
|
|||||||
{
|
{
|
||||||
private readonly Horizon _system;
|
private readonly Horizon _system;
|
||||||
private AppletSession _normalSession;
|
private AppletSession _normalSession;
|
||||||
|
|
||||||
public event EventHandler AppletStateChanged;
|
public event EventHandler AppletStateChanged;
|
||||||
|
|
||||||
public DummyApplet(Horizon system)
|
public DummyApplet(Horizon system)
|
||||||
{
|
{
|
||||||
_system = system;
|
_system = system;
|
||||||
}
|
}
|
||||||
|
|
||||||
public ResultCode Start(AppletSession normalSession, AppletSession interactiveSession)
|
public ResultCode Start(AppletSession normalSession, AppletSession interactiveSession)
|
||||||
{
|
{
|
||||||
_normalSession = normalSession;
|
_normalSession = normalSession;
|
||||||
@@ -24,10 +27,7 @@ namespace Ryujinx.HLE.HOS.Applets.Dummy
|
|||||||
_system.ReturnFocus();
|
_system.ReturnFocus();
|
||||||
return ResultCode.Success;
|
return ResultCode.Success;
|
||||||
}
|
}
|
||||||
private static T ReadStruct<T>(byte[] data) where T : struct
|
|
||||||
{
|
|
||||||
return MemoryMarshal.Read<T>(data.AsSpan());
|
|
||||||
}
|
|
||||||
private static byte[] BuildResponse()
|
private static byte[] BuildResponse()
|
||||||
{
|
{
|
||||||
using MemoryStream stream = MemoryStreamManager.Shared.GetStream();
|
using MemoryStream stream = MemoryStreamManager.Shared.GetStream();
|
||||||
@@ -35,9 +35,5 @@ namespace Ryujinx.HLE.HOS.Applets.Dummy
|
|||||||
writer.Write((ulong)ResultCode.Success);
|
writer.Write((ulong)ResultCode.Success);
|
||||||
return stream.ToArray();
|
return stream.ToArray();
|
||||||
}
|
}
|
||||||
public ResultCode GetResult()
|
|
||||||
{
|
|
||||||
return ResultCode.Success;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -203,10 +203,5 @@ namespace Ryujinx.HLE.HOS.Applets.Error
|
|||||||
_horizon.Device.UIHandler.DisplayErrorAppletDialog($"Error Number: {applicationErrorArg.ErrorNumber} (Details)", "\n" + detailsText, buttons.ToArray());
|
_horizon.Device.UIHandler.DisplayErrorAppletDialog($"Error Number: {applicationErrorArg.ErrorNumber} (Details)", "\n" + detailsText, buttons.ToArray());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public ResultCode GetResult()
|
|
||||||
{
|
|
||||||
return ResultCode.Success;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -13,7 +13,7 @@ namespace Ryujinx.HLE.HOS.Applets
|
|||||||
ResultCode Start(AppletSession normalSession,
|
ResultCode Start(AppletSession normalSession,
|
||||||
AppletSession interactiveSession);
|
AppletSession interactiveSession);
|
||||||
|
|
||||||
ResultCode GetResult();
|
ResultCode GetResult() => ResultCode.Success;
|
||||||
|
|
||||||
bool DrawTo(RenderingSurfaceInfo surfaceInfo, IVirtualMemoryManager destination, ulong position) => false;
|
bool DrawTo(RenderingSurfaceInfo surfaceInfo, IVirtualMemoryManager destination, ulong position) => false;
|
||||||
|
|
||||||
|
@@ -37,11 +37,6 @@ namespace Ryujinx.HLE.HOS.Applets
|
|||||||
return ResultCode.Success;
|
return ResultCode.Success;
|
||||||
}
|
}
|
||||||
|
|
||||||
public ResultCode GetResult()
|
|
||||||
{
|
|
||||||
return ResultCode.Success;
|
|
||||||
}
|
|
||||||
|
|
||||||
private byte[] BuildResponse()
|
private byte[] BuildResponse()
|
||||||
{
|
{
|
||||||
UserProfile currentUser = _system.AccountManager.LastOpenedUser;
|
UserProfile currentUser = _system.AccountManager.LastOpenedUser;
|
||||||
|
@@ -144,11 +144,6 @@ namespace Ryujinx.HLE.HOS.Applets
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public ResultCode GetResult()
|
|
||||||
{
|
|
||||||
return ResultCode.Success;
|
|
||||||
}
|
|
||||||
|
|
||||||
private bool IsKeyboardActive()
|
private bool IsKeyboardActive()
|
||||||
{
|
{
|
||||||
return _backgroundState >= InlineKeyboardState.Appearing && _backgroundState < InlineKeyboardState.Disappearing;
|
return _backgroundState >= InlineKeyboardState.Appearing && _backgroundState < InlineKeyboardState.Disappearing;
|
||||||
|
@@ -2,7 +2,7 @@ namespace Ryujinx.HLE.HOS.Applets.SoftwareKeyboard
|
|||||||
{
|
{
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Wraps a type in a class so it gets stored in the GC managed heap. This is used as communication mechanism
|
/// Wraps a type in a class so it gets stored in the GC managed heap. This is used as communication mechanism
|
||||||
/// between classed that need to be disposed and, thus, can't share their references.
|
/// between classes that need to be disposed and, thus, can't share their references.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <typeparam name="T">The internal type.</typeparam>
|
/// <typeparam name="T">The internal type.</typeparam>
|
||||||
class TRef<T>
|
class TRef<T>
|
||||||
|
@@ -5,5 +5,23 @@ namespace Ryujinx.HLE.HOS.Services.Ldn.Lp2p
|
|||||||
class IServiceCreator : IpcService
|
class IServiceCreator : IpcService
|
||||||
{
|
{
|
||||||
public IServiceCreator(ServiceCtx context) { }
|
public IServiceCreator(ServiceCtx context) { }
|
||||||
|
|
||||||
|
[CommandCmif(0)]
|
||||||
|
// CreateNetworkService(pid, u64, u32) -> object<nn::ldn::detail::ISfService>
|
||||||
|
public ResultCode CreateNetworkService(ServiceCtx context)
|
||||||
|
{
|
||||||
|
MakeObject(context, new ISfService(context));
|
||||||
|
|
||||||
|
return ResultCode.Success;
|
||||||
|
}
|
||||||
|
|
||||||
|
[CommandCmif(8)]
|
||||||
|
// CreateNetworkServiceMonitor(pid, u64) -> object<nn::ldn::detail::ISfServiceMonitor>
|
||||||
|
public ResultCode CreateNetworkServiceMonitor(ServiceCtx context)
|
||||||
|
{
|
||||||
|
MakeObject(context, new ISfServiceMonitor(context));
|
||||||
|
|
||||||
|
return ResultCode.Success;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
54
src/Ryujinx.HLE/HOS/Services/Ldn/Lp2p/ISfService.cs
Normal file
54
src/Ryujinx.HLE/HOS/Services/Ldn/Lp2p/ISfService.cs
Normal file
@@ -0,0 +1,54 @@
|
|||||||
|
using Ryujinx.Common.Logging;
|
||||||
|
|
||||||
|
namespace Ryujinx.HLE.HOS.Services.Ldn.Lp2p
|
||||||
|
{
|
||||||
|
class ISfService : IpcService
|
||||||
|
{
|
||||||
|
public ISfService(ServiceCtx context) { }
|
||||||
|
|
||||||
|
[CommandCmif(0)]
|
||||||
|
// Initialize()
|
||||||
|
public ResultCode Initialize(ServiceCtx context)
|
||||||
|
{
|
||||||
|
context.ResponseData.Write(0);
|
||||||
|
|
||||||
|
return ResultCode.Success;
|
||||||
|
}
|
||||||
|
|
||||||
|
[CommandCmif(768)]
|
||||||
|
// CreateGroup(buffer<nn::lp2p::GroupInfo, 0x31)
|
||||||
|
public ResultCode CreateGroup(ServiceCtx context)
|
||||||
|
{
|
||||||
|
Logger.Stub?.PrintStub(LogClass.ServiceLdn);
|
||||||
|
|
||||||
|
return ResultCode.Success;
|
||||||
|
}
|
||||||
|
|
||||||
|
[CommandCmif(776)]
|
||||||
|
// DestroyGroup()
|
||||||
|
public ResultCode DestroyGroup(ServiceCtx context)
|
||||||
|
{
|
||||||
|
Logger.Stub?.PrintStub(LogClass.ServiceLdn);
|
||||||
|
|
||||||
|
return ResultCode.Success;
|
||||||
|
}
|
||||||
|
|
||||||
|
[CommandCmif(1536)]
|
||||||
|
// SendToOtherGroup(nn::lp2p::MacAddress, nn::lp2p::GroupId, s16, s16, u32, buffer<unknown, 0x21>)
|
||||||
|
public ResultCode SendToOtherGroup(ServiceCtx context)
|
||||||
|
{
|
||||||
|
Logger.Stub?.PrintStub(LogClass.ServiceLdn);
|
||||||
|
|
||||||
|
return ResultCode.Success;
|
||||||
|
}
|
||||||
|
|
||||||
|
[CommandCmif(1544)]
|
||||||
|
// RecvFromOtherGroup(u32, buffer<unknown, 0x22>) -> (nn::lp2p::MacAddress, u16, s16, u32, s32)
|
||||||
|
public ResultCode RecvFromOtherGroup(ServiceCtx context)
|
||||||
|
{
|
||||||
|
Logger.Stub?.PrintStub(LogClass.ServiceLdn);
|
||||||
|
|
||||||
|
return ResultCode.Success;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
86
src/Ryujinx.HLE/HOS/Services/Ldn/Lp2p/ISfServiceMonitor.cs
Normal file
86
src/Ryujinx.HLE/HOS/Services/Ldn/Lp2p/ISfServiceMonitor.cs
Normal file
@@ -0,0 +1,86 @@
|
|||||||
|
using Ryujinx.Common.Logging;
|
||||||
|
using Ryujinx.HLE.HOS.Ipc;
|
||||||
|
using Ryujinx.HLE.HOS.Kernel.Threading;
|
||||||
|
using Ryujinx.Horizon.Common;
|
||||||
|
using System;
|
||||||
|
|
||||||
|
namespace Ryujinx.HLE.HOS.Services.Ldn.Lp2p
|
||||||
|
{
|
||||||
|
class ISfServiceMonitor : IpcService
|
||||||
|
{
|
||||||
|
private readonly KEvent _stateChangeEvent;
|
||||||
|
private readonly KEvent _jointEvent;
|
||||||
|
private int _stateChangeEventHandle = 0;
|
||||||
|
private int _jointEventHandle = 0;
|
||||||
|
|
||||||
|
public ISfServiceMonitor(ServiceCtx context)
|
||||||
|
{
|
||||||
|
_stateChangeEvent = new KEvent(context.Device.System.KernelContext);
|
||||||
|
_jointEvent = new KEvent(context.Device.System.KernelContext);
|
||||||
|
}
|
||||||
|
|
||||||
|
[CommandCmif(0)]
|
||||||
|
// Initialize()
|
||||||
|
public ResultCode Initialize(ServiceCtx context)
|
||||||
|
{
|
||||||
|
context.ResponseData.Write(0);
|
||||||
|
|
||||||
|
return ResultCode.Success;
|
||||||
|
}
|
||||||
|
|
||||||
|
[CommandCmif(256)]
|
||||||
|
// AttachNetworkInterfaceStateChangeEvent() -> handle<copy>
|
||||||
|
public ResultCode AttachNetworkInterfaceStateChangeEvent(ServiceCtx context)
|
||||||
|
{
|
||||||
|
if (context.Process.HandleTable.GenerateHandle(_stateChangeEvent.ReadableEvent, out _stateChangeEventHandle) != Result.Success)
|
||||||
|
{
|
||||||
|
throw new InvalidOperationException("Out of handles!");
|
||||||
|
}
|
||||||
|
|
||||||
|
context.Response.HandleDesc = IpcHandleDesc.MakeCopy(_stateChangeEventHandle);
|
||||||
|
|
||||||
|
return ResultCode.Success;
|
||||||
|
}
|
||||||
|
|
||||||
|
[CommandCmif(288)]
|
||||||
|
// GetGroupInfo(buffer<nn::lp2p::GroupInfo, 0x32>)
|
||||||
|
public ResultCode GetGroupInfo(ServiceCtx context)
|
||||||
|
{
|
||||||
|
Logger.Stub?.PrintStub(LogClass.ServiceLdn);
|
||||||
|
|
||||||
|
return ResultCode.Success;
|
||||||
|
}
|
||||||
|
|
||||||
|
[CommandCmif(296)]
|
||||||
|
// GetGroupInfo2(buffer<nn::lp2p::GroupInfo, 0x32>, buffer<nn::lp2p::GroupInfo, 0x31>)
|
||||||
|
public ResultCode GetGroupInfo2(ServiceCtx context)
|
||||||
|
{
|
||||||
|
Logger.Stub?.PrintStub(LogClass.ServiceLdn);
|
||||||
|
|
||||||
|
return ResultCode.Success;
|
||||||
|
}
|
||||||
|
|
||||||
|
[CommandCmif(312)]
|
||||||
|
// GetIpConfig(buffer<unknown<0x100>, 0x1a>)
|
||||||
|
public ResultCode GetIpConfig(ServiceCtx context)
|
||||||
|
{
|
||||||
|
Logger.Stub?.PrintStub(LogClass.ServiceLdn);
|
||||||
|
|
||||||
|
return ResultCode.Success;
|
||||||
|
}
|
||||||
|
|
||||||
|
[CommandCmif(328)]
|
||||||
|
// AttachNetworkInterfaceStateChangeEvent() -> handle<copy>
|
||||||
|
public ResultCode AttachJoinEvent(ServiceCtx context)
|
||||||
|
{
|
||||||
|
if (context.Process.HandleTable.GenerateHandle(_jointEvent.ReadableEvent, out _jointEventHandle) != Result.Success)
|
||||||
|
{
|
||||||
|
throw new InvalidOperationException("Out of handles!");
|
||||||
|
}
|
||||||
|
|
||||||
|
context.Response.HandleDesc = IpcHandleDesc.MakeCopy(_jointEventHandle);
|
||||||
|
|
||||||
|
return ResultCode.Success;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@@ -1,3 +1,5 @@
|
|||||||
|
using Gommon;
|
||||||
|
using Humanizer;
|
||||||
using NetCoreServer;
|
using NetCoreServer;
|
||||||
using Open.Nat;
|
using Open.Nat;
|
||||||
using Ryujinx.Common.Logging;
|
using Ryujinx.Common.Logging;
|
||||||
@@ -153,7 +155,10 @@ namespace Ryujinx.HLE.HOS.Services.Ldn.UserServiceCreator.LdnRyu.Proxy
|
|||||||
|
|
||||||
if (_publicPort != 0)
|
if (_publicPort != 0)
|
||||||
{
|
{
|
||||||
_ = Task.Delay(PortLeaseRenew * 1000, _disposedCancellation.Token).ContinueWith((task) => Task.Run(RefreshLease));
|
_ = Executor.ExecuteAfterDelayAsync(
|
||||||
|
PortLeaseRenew.Seconds(),
|
||||||
|
_disposedCancellation.Token,
|
||||||
|
RefreshLease);
|
||||||
}
|
}
|
||||||
|
|
||||||
_natDevice = device;
|
_natDevice = device;
|
||||||
@@ -257,7 +262,10 @@ namespace Ryujinx.HLE.HOS.Services.Ldn.UserServiceCreator.LdnRyu.Proxy
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
_ = Task.Delay(PortLeaseRenew, _disposedCancellation.Token).ContinueWith((task) => Task.Run(RefreshLease));
|
_ = Executor.ExecuteAfterDelayAsync(
|
||||||
|
PortLeaseRenew.Milliseconds(),
|
||||||
|
_disposedCancellation.Token,
|
||||||
|
RefreshLease);
|
||||||
}
|
}
|
||||||
|
|
||||||
public bool TryRegisterUser(P2pProxySession session, ExternalProxyConfig config)
|
public bool TryRegisterUser(P2pProxySession session, ExternalProxyConfig config)
|
||||||
|
@@ -93,6 +93,13 @@ namespace Ryujinx.HLE.HOS.Services.Nfc.Nfp
|
|||||||
return registerInfo;
|
return registerInfo;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static void UpdateNickName(string amiiboId, string newNickName)
|
||||||
|
{
|
||||||
|
VirtualAmiiboFile virtualAmiiboFile = LoadAmiiboFile(amiiboId);
|
||||||
|
virtualAmiiboFile.NickName = newNickName;
|
||||||
|
SaveAmiiboFile(virtualAmiiboFile);
|
||||||
|
}
|
||||||
|
|
||||||
public static bool OpenApplicationArea(string amiiboId, uint applicationAreaId)
|
public static bool OpenApplicationArea(string amiiboId, uint applicationAreaId)
|
||||||
{
|
{
|
||||||
VirtualAmiiboFile virtualAmiiboFile = LoadAmiiboFile(amiiboId);
|
VirtualAmiiboFile virtualAmiiboFile = LoadAmiiboFile(amiiboId);
|
||||||
|
@@ -26,7 +26,7 @@ namespace Ryujinx.HLE.Loaders.Processes.Extensions
|
|||||||
{
|
{
|
||||||
private static readonly TitleUpdateMetadataJsonSerializerContext _applicationSerializerContext = new(JsonHelper.GetDefaultSerializerOptions());
|
private static readonly TitleUpdateMetadataJsonSerializerContext _applicationSerializerContext = new(JsonHelper.GetDefaultSerializerOptions());
|
||||||
|
|
||||||
public static ProcessResult Load(this Nca nca, Switch device, Nca patchNca, Nca controlNca)
|
public static ProcessResult Load(this Nca nca, Switch device, Nca patchNca, Nca controlNca, BlitStruct<ApplicationControlProperty>? customNacpData = null)
|
||||||
{
|
{
|
||||||
// Extract RomFs and ExeFs from NCA.
|
// Extract RomFs and ExeFs from NCA.
|
||||||
IStorage romFs = nca.GetRomFs(device, patchNca);
|
IStorage romFs = nca.GetRomFs(device, patchNca);
|
||||||
@@ -55,6 +55,10 @@ namespace Ryujinx.HLE.Loaders.Processes.Extensions
|
|||||||
{
|
{
|
||||||
nacpData = controlNca.GetNacp(device);
|
nacpData = controlNca.GetNacp(device);
|
||||||
}
|
}
|
||||||
|
else if (customNacpData != null) // if the Application doesn't provide a nacp file but the Application provides an override, use the provided nacp override
|
||||||
|
{
|
||||||
|
nacpData = (BlitStruct<ApplicationControlProperty>)customNacpData;
|
||||||
|
}
|
||||||
|
|
||||||
/* TODO: Rework this since it's wrong and doesn't work as it takes the DisplayVersion from a "potential" non-existent update.
|
/* TODO: Rework this since it's wrong and doesn't work as it takes the DisplayVersion from a "potential" non-existent update.
|
||||||
|
|
||||||
|
@@ -98,12 +98,12 @@ namespace Ryujinx.HLE.Loaders.Processes
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
public bool LoadNca(string path)
|
public bool LoadNca(string path, BlitStruct<ApplicationControlProperty>? customNacpData = null)
|
||||||
{
|
{
|
||||||
FileStream file = new(path, FileMode.Open, FileAccess.Read);
|
FileStream file = new(path, FileMode.Open, FileAccess.Read);
|
||||||
Nca nca = new(_device.Configuration.VirtualFileSystem.KeySet, file.AsStorage(false));
|
Nca nca = new(_device.Configuration.VirtualFileSystem.KeySet, file.AsStorage(false));
|
||||||
|
|
||||||
ProcessResult processResult = nca.Load(_device, null, null);
|
ProcessResult processResult = nca.Load(_device, null, null, customNacpData);
|
||||||
|
|
||||||
if (processResult.ProcessId != 0 && _processesByPid.TryAdd(processResult.ProcessId, processResult))
|
if (processResult.ProcessId != 0 && _processesByPid.TryAdd(processResult.ProcessId, processResult))
|
||||||
{
|
{
|
||||||
|
@@ -84,12 +84,19 @@ namespace Ryujinx.HLE.Loaders.Processes
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool isFirmware = ProgramId is >= 0x0100000000000819 and <= 0x010000000000081C;
|
||||||
|
bool isFirmwareApplication = ProgramId <= 0x0100000000007FFF;
|
||||||
|
|
||||||
|
string name = !isFirmware
|
||||||
|
? (isFirmwareApplication ? "Firmware Application " : "") + (!string.IsNullOrWhiteSpace(Name) ? Name : "<Unknown Name>")
|
||||||
|
: "Firmware";
|
||||||
|
|
||||||
// TODO: LibHac npdm currently doesn't support version field.
|
// TODO: LibHac npdm currently doesn't support version field.
|
||||||
string version = ProgramId > 0x0100000000007FFF
|
string version = !isFirmware
|
||||||
? DisplayVersion
|
? (!string.IsNullOrWhiteSpace(DisplayVersion) ? DisplayVersion : "<Unknown Version>")
|
||||||
: device.System.ContentManager.GetCurrentFirmwareVersion()?.VersionString ?? "?";
|
: device.System.ContentManager.GetCurrentFirmwareVersion()?.VersionString ?? "?";
|
||||||
|
|
||||||
Logger.Info?.Print(LogClass.Loader, $"Application Loaded: {Name} v{version} [{ProgramIdText}] [{(Is64Bit ? "64-bit" : "32-bit")}]");
|
Logger.Info?.Print(LogClass.Loader, $"Application Loaded: {name} v{version} [{ProgramIdText}] [{(Is64Bit ? "64-bit" : "32-bit")}]");
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
@@ -3,6 +3,7 @@
|
|||||||
<PropertyGroup>
|
<PropertyGroup>
|
||||||
<TargetFramework>net8.0</TargetFramework>
|
<TargetFramework>net8.0</TargetFramework>
|
||||||
<AllowUnsafeBlocks>true</AllowUnsafeBlocks>
|
<AllowUnsafeBlocks>true</AllowUnsafeBlocks>
|
||||||
|
<DefaultItemExcludes>$(DefaultItemExcludes);._*</DefaultItemExcludes>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
|
37
src/Ryujinx.HLE/StructHelpers.cs
Normal file
37
src/Ryujinx.HLE/StructHelpers.cs
Normal file
@@ -0,0 +1,37 @@
|
|||||||
|
using LibHac.Common;
|
||||||
|
using LibHac.Ns;
|
||||||
|
using System;
|
||||||
|
using System.Text;
|
||||||
|
|
||||||
|
namespace Ryujinx.HLE
|
||||||
|
{
|
||||||
|
public static class StructHelpers
|
||||||
|
{
|
||||||
|
public static BlitStruct<ApplicationControlProperty> CreateCustomNacpData(string name, string version)
|
||||||
|
{
|
||||||
|
// https://switchbrew.org/wiki/NACP
|
||||||
|
const int OffsetOfDisplayVersion = 0x3060;
|
||||||
|
|
||||||
|
// https://switchbrew.org/wiki/NACP#ApplicationTitle
|
||||||
|
const int TotalApplicationTitles = 0x10;
|
||||||
|
const int SizeOfApplicationTitle = 0x300;
|
||||||
|
const int OffsetOfApplicationPublisherStrings = 0x200;
|
||||||
|
|
||||||
|
|
||||||
|
var nacpData = new BlitStruct<ApplicationControlProperty>(1);
|
||||||
|
|
||||||
|
// name and publisher buffer
|
||||||
|
// repeat once for each locale (the ApplicationControlProperty has 16 locales)
|
||||||
|
for (int i = 0; i < TotalApplicationTitles; i++)
|
||||||
|
{
|
||||||
|
Encoding.ASCII.GetBytes(name).AsSpan().CopyTo(nacpData.ByteSpan[(i * SizeOfApplicationTitle)..]);
|
||||||
|
"Ryujinx"u8.CopyTo(nacpData.ByteSpan[(i * SizeOfApplicationTitle + OffsetOfApplicationPublisherStrings)..]);
|
||||||
|
}
|
||||||
|
|
||||||
|
// version buffer
|
||||||
|
Encoding.ASCII.GetBytes(version).AsSpan().CopyTo(nacpData.ByteSpan[OffsetOfDisplayVersion..]);
|
||||||
|
|
||||||
|
return nacpData;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@@ -1,3 +1,5 @@
|
|||||||
|
using LibHac.Common;
|
||||||
|
using LibHac.Ns;
|
||||||
using Ryujinx.Audio.Backends.CompatLayer;
|
using Ryujinx.Audio.Backends.CompatLayer;
|
||||||
using Ryujinx.Audio.Integration;
|
using Ryujinx.Audio.Integration;
|
||||||
using Ryujinx.Common.Configuration;
|
using Ryujinx.Common.Configuration;
|
||||||
@@ -111,7 +113,7 @@ namespace Ryujinx.HLE
|
|||||||
|
|
||||||
public bool LoadCart(string exeFsDir, string romFsFile = null) => Processes.LoadUnpackedNca(exeFsDir, romFsFile);
|
public bool LoadCart(string exeFsDir, string romFsFile = null) => Processes.LoadUnpackedNca(exeFsDir, romFsFile);
|
||||||
public bool LoadXci(string xciFile, ulong applicationId = 0) => Processes.LoadXci(xciFile, applicationId);
|
public bool LoadXci(string xciFile, ulong applicationId = 0) => Processes.LoadXci(xciFile, applicationId);
|
||||||
public bool LoadNca(string ncaFile) => Processes.LoadNca(ncaFile);
|
public bool LoadNca(string ncaFile, BlitStruct<ApplicationControlProperty>? customNacpData = null) => Processes.LoadNca(ncaFile, customNacpData);
|
||||||
public bool LoadNsp(string nspFile, ulong applicationId = 0) => Processes.LoadNsp(nspFile, applicationId);
|
public bool LoadNsp(string nspFile, ulong applicationId = 0) => Processes.LoadNsp(nspFile, applicationId);
|
||||||
public bool LoadProgram(string fileName) => Processes.LoadNxo(fileName);
|
public bool LoadProgram(string fileName) => Processes.LoadNxo(fileName);
|
||||||
|
|
||||||
|
@@ -24,6 +24,18 @@ namespace Ryujinx.HLE.UI
|
|||||||
/// <returns>True when OK is pressed, False otherwise.</returns>
|
/// <returns>True when OK is pressed, False otherwise.</returns>
|
||||||
bool DisplayMessageDialog(ControllerAppletUIArgs args);
|
bool DisplayMessageDialog(ControllerAppletUIArgs args);
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Displays an Input Dialog box to the user so they can enter the Amiibo's new name
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="userText">Text that the user entered. Set to `null` on internal errors</param>
|
||||||
|
/// <returns>True when OK is pressed, False otherwise. Also returns True on internal errors</returns>
|
||||||
|
bool DisplayCabinetDialog(out string userText);
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Displays a Message Dialog box to the user to notify them to scan the Amiibo.
|
||||||
|
/// </summary>
|
||||||
|
void DisplayCabinetMessageDialog();
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Tell the UI that we need to transition to another program.
|
/// Tell the UI that we need to transition to another program.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
@@ -1,4 +1,5 @@
|
|||||||
using CommandLine;
|
using CommandLine;
|
||||||
|
using Gommon;
|
||||||
using LibHac.Tools.FsSystem;
|
using LibHac.Tools.FsSystem;
|
||||||
using Ryujinx.Audio.Backends.SDL2;
|
using Ryujinx.Audio.Backends.SDL2;
|
||||||
using Ryujinx.Common;
|
using Ryujinx.Common;
|
||||||
@@ -96,8 +97,13 @@ namespace Ryujinx.Headless.SDL2
|
|||||||
}
|
}
|
||||||
|
|
||||||
Parser.Default.ParseArguments<Options>(args)
|
Parser.Default.ParseArguments<Options>(args)
|
||||||
.WithParsed(Load)
|
.WithParsed(Load)
|
||||||
.WithNotParsed(errors => errors.Output());
|
.WithNotParsed(errors =>
|
||||||
|
{
|
||||||
|
Logger.Error?.PrintMsg(LogClass.Application, "Error parsing command-line arguments:");
|
||||||
|
|
||||||
|
errors.ForEach(err => Logger.Error?.PrintMsg(LogClass.Application, $" - {err.Tag}"));
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
private static InputConfig HandlePlayerConfiguration(string inputProfileName, string inputId, PlayerIndex index)
|
private static InputConfig HandlePlayerConfiguration(string inputProfileName, string inputId, PlayerIndex index)
|
||||||
@@ -579,8 +585,8 @@ namespace Ryujinx.Headless.SDL2
|
|||||||
options.MultiplayerLanInterfaceId,
|
options.MultiplayerLanInterfaceId,
|
||||||
Common.Configuration.Multiplayer.MultiplayerMode.Disabled,
|
Common.Configuration.Multiplayer.MultiplayerMode.Disabled,
|
||||||
false,
|
false,
|
||||||
"",
|
string.Empty,
|
||||||
"",
|
string.Empty,
|
||||||
options.CustomVSyncInterval);
|
options.CustomVSyncInterval);
|
||||||
|
|
||||||
return new Switch(configuration);
|
return new Switch(configuration);
|
||||||
|
@@ -9,6 +9,7 @@
|
|||||||
<DefineConstants Condition=" '$(ExtraDefineConstants)' != '' ">$(DefineConstants);$(ExtraDefineConstants)</DefineConstants>
|
<DefineConstants Condition=" '$(ExtraDefineConstants)' != '' ">$(DefineConstants);$(ExtraDefineConstants)</DefineConstants>
|
||||||
<SigningCertificate Condition=" '$(SigningCertificate)' == '' ">-</SigningCertificate>
|
<SigningCertificate Condition=" '$(SigningCertificate)' == '' ">-</SigningCertificate>
|
||||||
<TieredPGO>true</TieredPGO>
|
<TieredPGO>true</TieredPGO>
|
||||||
|
<DefaultItemExcludes>$(DefaultItemExcludes);._*</DefaultItemExcludes>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
|
@@ -1,4 +1,5 @@
|
|||||||
using Humanizer;
|
using Humanizer;
|
||||||
|
using LibHac.Tools.Fs;
|
||||||
using Ryujinx.Common.Configuration;
|
using Ryujinx.Common.Configuration;
|
||||||
using Ryujinx.Common.Configuration.Hid;
|
using Ryujinx.Common.Configuration.Hid;
|
||||||
using Ryujinx.Common.Logging;
|
using Ryujinx.Common.Logging;
|
||||||
@@ -485,6 +486,19 @@ namespace Ryujinx.Headless.SDL2
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public bool DisplayCabinetDialog(out string userText)
|
||||||
|
{
|
||||||
|
// SDL2 doesn't support input dialogs
|
||||||
|
userText = "Ryujinx";
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void DisplayCabinetMessageDialog()
|
||||||
|
{
|
||||||
|
SDL_ShowSimpleMessageBox(SDL_MessageBoxFlags.SDL_MESSAGEBOX_INFORMATION, "Cabinet Dialog", "Please scan your Amiibo now.", WindowHandle);
|
||||||
|
}
|
||||||
|
|
||||||
public bool DisplayMessageDialog(ControllerAppletUIArgs args)
|
public bool DisplayMessageDialog(ControllerAppletUIArgs args)
|
||||||
{
|
{
|
||||||
if (_ignoreControllerApplet) return false;
|
if (_ignoreControllerApplet) return false;
|
||||||
|
@@ -2,6 +2,7 @@
|
|||||||
|
|
||||||
<PropertyGroup>
|
<PropertyGroup>
|
||||||
<TargetFramework>net8.0</TargetFramework>
|
<TargetFramework>net8.0</TargetFramework>
|
||||||
|
<DefaultItemExcludes>$(DefaultItemExcludes);._*</DefaultItemExcludes>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
|
@@ -3,6 +3,7 @@
|
|||||||
<PropertyGroup>
|
<PropertyGroup>
|
||||||
<TargetFramework>netstandard2.0</TargetFramework>
|
<TargetFramework>netstandard2.0</TargetFramework>
|
||||||
<EnforceExtendedAnalyzerRules>true</EnforceExtendedAnalyzerRules>
|
<EnforceExtendedAnalyzerRules>true</EnforceExtendedAnalyzerRules>
|
||||||
|
<DefaultItemExcludes>$(DefaultItemExcludes);._*</DefaultItemExcludes>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
|
@@ -3,6 +3,8 @@
|
|||||||
<PropertyGroup>
|
<PropertyGroup>
|
||||||
<TargetFramework>netstandard2.0</TargetFramework>
|
<TargetFramework>netstandard2.0</TargetFramework>
|
||||||
<EnforceExtendedAnalyzerRules>true</EnforceExtendedAnalyzerRules>
|
<EnforceExtendedAnalyzerRules>true</EnforceExtendedAnalyzerRules>
|
||||||
|
<DefaultItemExcludes>$(DefaultItemExcludes);._*</DefaultItemExcludes>
|
||||||
|
<DefaultItemExcludes>$(DefaultItemExcludes);._*</DefaultItemExcludes>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
|
@@ -2,6 +2,7 @@
|
|||||||
|
|
||||||
<PropertyGroup>
|
<PropertyGroup>
|
||||||
<TargetFramework>net8.0</TargetFramework>
|
<TargetFramework>net8.0</TargetFramework>
|
||||||
|
<DefaultItemExcludes>$(DefaultItemExcludes);._*</DefaultItemExcludes>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
|
@@ -3,6 +3,7 @@
|
|||||||
<PropertyGroup>
|
<PropertyGroup>
|
||||||
<TargetFramework>net8.0</TargetFramework>
|
<TargetFramework>net8.0</TargetFramework>
|
||||||
<AllowUnsafeBlocks>true</AllowUnsafeBlocks>
|
<AllowUnsafeBlocks>true</AllowUnsafeBlocks>
|
||||||
|
<DefaultItemExcludes>$(DefaultItemExcludes);._*</DefaultItemExcludes>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
|
@@ -3,6 +3,7 @@
|
|||||||
<PropertyGroup>
|
<PropertyGroup>
|
||||||
<TargetFramework>net8.0</TargetFramework>
|
<TargetFramework>net8.0</TargetFramework>
|
||||||
<AllowUnsafeBlocks>true</AllowUnsafeBlocks>
|
<AllowUnsafeBlocks>true</AllowUnsafeBlocks>
|
||||||
|
<DefaultItemExcludes>$(DefaultItemExcludes);._*</DefaultItemExcludes>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
|
@@ -3,6 +3,7 @@
|
|||||||
<PropertyGroup>
|
<PropertyGroup>
|
||||||
<TargetFramework>net8.0</TargetFramework>
|
<TargetFramework>net8.0</TargetFramework>
|
||||||
<AllowUnsafeBlocks>true</AllowUnsafeBlocks>
|
<AllowUnsafeBlocks>true</AllowUnsafeBlocks>
|
||||||
|
<DefaultItemExcludes>$(DefaultItemExcludes);._*</DefaultItemExcludes>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
|
@@ -2,6 +2,7 @@
|
|||||||
|
|
||||||
<PropertyGroup>
|
<PropertyGroup>
|
||||||
<TargetFramework>net8.0</TargetFramework>
|
<TargetFramework>net8.0</TargetFramework>
|
||||||
|
<DefaultItemExcludes>$(DefaultItemExcludes);._*</DefaultItemExcludes>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
|
@@ -4,6 +4,7 @@
|
|||||||
<TargetFramework>net8.0</TargetFramework>
|
<TargetFramework>net8.0</TargetFramework>
|
||||||
<OutputType>Exe</OutputType>
|
<OutputType>Exe</OutputType>
|
||||||
<Configurations>Debug;Release</Configurations>
|
<Configurations>Debug;Release</Configurations>
|
||||||
|
<DefaultItemExcludes>$(DefaultItemExcludes);._*</DefaultItemExcludes>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
|
@@ -3,6 +3,7 @@
|
|||||||
<PropertyGroup>
|
<PropertyGroup>
|
||||||
<TargetFramework>net8.0</TargetFramework>
|
<TargetFramework>net8.0</TargetFramework>
|
||||||
<IsPackable>false</IsPackable>
|
<IsPackable>false</IsPackable>
|
||||||
|
<DefaultItemExcludes>$(DefaultItemExcludes);._*</DefaultItemExcludes>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
|
@@ -4,6 +4,7 @@
|
|||||||
<TargetFramework>net8.0</TargetFramework>
|
<TargetFramework>net8.0</TargetFramework>
|
||||||
<AllowUnsafeBlocks>true</AllowUnsafeBlocks>
|
<AllowUnsafeBlocks>true</AllowUnsafeBlocks>
|
||||||
<Configurations>Debug;Release</Configurations>
|
<Configurations>Debug;Release</Configurations>
|
||||||
|
<DefaultItemExcludes>$(DefaultItemExcludes);._*</DefaultItemExcludes>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
|
|
||||||
<PropertyGroup>
|
<PropertyGroup>
|
||||||
|
@@ -10,6 +10,7 @@
|
|||||||
<TargetOS Condition="'$([System.Runtime.InteropServices.RuntimeInformation]::IsOSPlatform($([System.Runtime.InteropServices.OSPlatform]::Linux)))' == 'true'">linux</TargetOS>
|
<TargetOS Condition="'$([System.Runtime.InteropServices.RuntimeInformation]::IsOSPlatform($([System.Runtime.InteropServices.OSPlatform]::Linux)))' == 'true'">linux</TargetOS>
|
||||||
<Configurations>Debug;Release</Configurations>
|
<Configurations>Debug;Release</Configurations>
|
||||||
<RunSettingsFilePath>$(MSBuildProjectDirectory)\.runsettings</RunSettingsFilePath>
|
<RunSettingsFilePath>$(MSBuildProjectDirectory)\.runsettings</RunSettingsFilePath>
|
||||||
|
<DefaultItemExcludes>$(DefaultItemExcludes);._*</DefaultItemExcludes>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
|
|
||||||
<PropertyGroup>
|
<PropertyGroup>
|
||||||
|
@@ -1,5 +1,4 @@
|
|||||||
using DynamicData;
|
using DynamicData;
|
||||||
using DynamicData.Kernel;
|
|
||||||
using Gommon;
|
using Gommon;
|
||||||
using LibHac;
|
using LibHac;
|
||||||
using LibHac.Common;
|
using LibHac.Common;
|
||||||
@@ -37,14 +36,13 @@ using System.Threading.Tasks;
|
|||||||
using ContentType = LibHac.Ncm.ContentType;
|
using ContentType = LibHac.Ncm.ContentType;
|
||||||
using MissingKeyException = LibHac.Common.Keys.MissingKeyException;
|
using MissingKeyException = LibHac.Common.Keys.MissingKeyException;
|
||||||
using Path = System.IO.Path;
|
using Path = System.IO.Path;
|
||||||
using SpanHelpers = LibHac.Common.SpanHelpers;
|
|
||||||
using TimeSpan = System.TimeSpan;
|
using TimeSpan = System.TimeSpan;
|
||||||
|
|
||||||
namespace Ryujinx.UI.App.Common
|
namespace Ryujinx.UI.App.Common
|
||||||
{
|
{
|
||||||
public class ApplicationLibrary
|
public class ApplicationLibrary
|
||||||
{
|
{
|
||||||
public static string DefaultLanPlayWebHost = "ryuldnweb.vudjun.com";
|
public const string DefaultLanPlayWebHost = "ryuldnweb.vudjun.com";
|
||||||
public Language DesiredLanguage { get; set; }
|
public Language DesiredLanguage { get; set; }
|
||||||
public event EventHandler<ApplicationCountUpdatedEventArgs> ApplicationCountUpdated;
|
public event EventHandler<ApplicationCountUpdatedEventArgs> ApplicationCountUpdated;
|
||||||
public event EventHandler<LdnGameDataReceivedEventArgs> LdnGameDataReceived;
|
public event EventHandler<LdnGameDataReceivedEventArgs> LdnGameDataReceived;
|
||||||
@@ -191,12 +189,9 @@ namespace Ryujinx.UI.App.Common
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (isExeFs)
|
return isExeFs
|
||||||
{
|
? GetApplicationFromExeFs(pfs, filePath)
|
||||||
return GetApplicationFromExeFs(pfs, filePath);
|
: null;
|
||||||
}
|
|
||||||
|
|
||||||
return null;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <exception cref="LibHac.Common.Keys.MissingKeyException">The configured key set is missing a key.</exception>
|
/// <exception cref="LibHac.Common.Keys.MissingKeyException">The configured key set is missing a key.</exception>
|
||||||
@@ -512,10 +507,6 @@ namespace Ryujinx.UI.App.Common
|
|||||||
case ".xci":
|
case ".xci":
|
||||||
case ".nsp":
|
case ".nsp":
|
||||||
{
|
{
|
||||||
IntegrityCheckLevel checkLevel = ConfigurationState.Instance.System.EnableFsIntegrityChecks
|
|
||||||
? IntegrityCheckLevel.ErrorOnInvalid
|
|
||||||
: IntegrityCheckLevel.None;
|
|
||||||
|
|
||||||
using IFileSystem pfs = PartitionFileSystemUtils.OpenApplicationFileSystem(filePath, _virtualFileSystem);
|
using IFileSystem pfs = PartitionFileSystemUtils.OpenApplicationFileSystem(filePath, _virtualFileSystem);
|
||||||
|
|
||||||
foreach (DirectoryEntryEx fileEntry in pfs.EnumerateEntries("/", "*.nca"))
|
foreach (DirectoryEntryEx fileEntry in pfs.EnumerateEntries("/", "*.nca"))
|
||||||
@@ -604,7 +595,7 @@ namespace Ryujinx.UI.App.Common
|
|||||||
controlNca.OpenFileSystem(NcaSectionType.Data, IntegrityCheckLevel.None)
|
controlNca.OpenFileSystem(NcaSectionType.Data, IntegrityCheckLevel.None)
|
||||||
.OpenFile(ref nacpFile.Ref, "/control.nacp".ToU8Span(), OpenMode.Read)
|
.OpenFile(ref nacpFile.Ref, "/control.nacp".ToU8Span(), OpenMode.Read)
|
||||||
.ThrowIfFailure();
|
.ThrowIfFailure();
|
||||||
nacpFile.Get.Read(out _, 0, SpanHelpers.AsByteSpan(ref controlData),
|
nacpFile.Get.Read(out _, 0, LibHac.Common.SpanHelpers.AsByteSpan(ref controlData),
|
||||||
ReadOption.None).ThrowIfFailure();
|
ReadOption.None).ThrowIfFailure();
|
||||||
|
|
||||||
var displayVersion = controlData.DisplayVersionString.ToString();
|
var displayVersion = controlData.DisplayVersionString.ToString();
|
||||||
@@ -827,7 +818,7 @@ namespace Ryujinx.UI.App.Common
|
|||||||
{
|
{
|
||||||
_downloadableContents.Edit(it =>
|
_downloadableContents.Edit(it =>
|
||||||
{
|
{
|
||||||
DownloadableContentsHelper.SaveDownloadableContentsJson(_virtualFileSystem, application.IdBase, dlcs);
|
DownloadableContentsHelper.SaveDownloadableContentsJson(application.IdBase, dlcs);
|
||||||
|
|
||||||
it.Remove(it.Items.Where(item => item.Dlc.TitleIdBase == application.IdBase));
|
it.Remove(it.Items.Where(item => item.Dlc.TitleIdBase == application.IdBase));
|
||||||
it.AddOrUpdate(dlcs);
|
it.AddOrUpdate(dlcs);
|
||||||
@@ -839,7 +830,7 @@ namespace Ryujinx.UI.App.Common
|
|||||||
{
|
{
|
||||||
_titleUpdates.Edit(it =>
|
_titleUpdates.Edit(it =>
|
||||||
{
|
{
|
||||||
TitleUpdatesHelper.SaveTitleUpdatesJson(_virtualFileSystem, application.IdBase, updates);
|
TitleUpdatesHelper.SaveTitleUpdatesJson(application.IdBase, updates);
|
||||||
|
|
||||||
it.Remove(it.Items.Where(item => item.TitleUpdate.TitleIdBase == application.IdBase));
|
it.Remove(it.Items.Where(item => item.TitleUpdate.TitleIdBase == application.IdBase));
|
||||||
it.AddOrUpdate(updates);
|
it.AddOrUpdate(updates);
|
||||||
@@ -1088,14 +1079,15 @@ namespace Ryujinx.UI.App.Common
|
|||||||
|
|
||||||
private bool AddAndAutoSelectUpdate(TitleUpdateModel update)
|
private bool AddAndAutoSelectUpdate(TitleUpdateModel update)
|
||||||
{
|
{
|
||||||
var currentlySelected = TitleUpdates.Items.FirstOrOptional(it =>
|
if (update == null) return false;
|
||||||
|
|
||||||
|
var currentlySelected = TitleUpdates.Items.FindFirst(it =>
|
||||||
it.TitleUpdate.TitleIdBase == update.TitleIdBase && it.IsSelected);
|
it.TitleUpdate.TitleIdBase == update.TitleIdBase && it.IsSelected);
|
||||||
|
|
||||||
var shouldSelect = !currentlySelected.HasValue ||
|
var shouldSelect = currentlySelected.Check(curr => curr.TitleUpdate?.Version < update.Version);
|
||||||
currentlySelected.Value.TitleUpdate.Version < update.Version;
|
|
||||||
|
|
||||||
_titleUpdates.AddOrUpdate((update, shouldSelect));
|
_titleUpdates.AddOrUpdate((update, shouldSelect));
|
||||||
|
|
||||||
if (currentlySelected.HasValue && shouldSelect)
|
if (currentlySelected.HasValue && shouldSelect)
|
||||||
{
|
{
|
||||||
_titleUpdates.AddOrUpdate((currentlySelected.Value.TitleUpdate, false));
|
_titleUpdates.AddOrUpdate((currentlySelected.Value.TitleUpdate, false));
|
||||||
@@ -1464,7 +1456,7 @@ namespace Ryujinx.UI.App.Common
|
|||||||
if (addedNewDlc)
|
if (addedNewDlc)
|
||||||
{
|
{
|
||||||
var gameDlcs = it.Items.Where(dlc => dlc.Dlc.TitleIdBase == application.IdBase).ToList();
|
var gameDlcs = it.Items.Where(dlc => dlc.Dlc.TitleIdBase == application.IdBase).ToList();
|
||||||
DownloadableContentsHelper.SaveDownloadableContentsJson(_virtualFileSystem, application.IdBase,
|
DownloadableContentsHelper.SaveDownloadableContentsJson(application.IdBase,
|
||||||
gameDlcs);
|
gameDlcs);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1483,11 +1475,11 @@ namespace Ryujinx.UI.App.Common
|
|||||||
TitleUpdatesHelper.LoadTitleUpdatesJson(_virtualFileSystem, application.IdBase);
|
TitleUpdatesHelper.LoadTitleUpdatesJson(_virtualFileSystem, application.IdBase);
|
||||||
it.AddOrUpdate(savedUpdates);
|
it.AddOrUpdate(savedUpdates);
|
||||||
|
|
||||||
var selectedUpdate = savedUpdates.FirstOrOptional(update => update.IsSelected);
|
var selectedUpdate = savedUpdates.FindFirst(update => update.IsSelected);
|
||||||
|
|
||||||
if (TryGetTitleUpdatesFromFile(application.Path, out var bundledUpdates))
|
if (TryGetTitleUpdatesFromFile(application.Path, out var bundledUpdates))
|
||||||
{
|
{
|
||||||
var savedUpdateLookup = savedUpdates.Select(update => update.Item1).ToHashSet();
|
var savedUpdateLookup = savedUpdates.Select(update => update.Update).ToHashSet();
|
||||||
bool updatesChanged = false;
|
bool updatesChanged = false;
|
||||||
|
|
||||||
foreach (var update in bundledUpdates.OrderByDescending(bundled => bundled.Version))
|
foreach (var update in bundledUpdates.OrderByDescending(bundled => bundled.Version))
|
||||||
@@ -1495,12 +1487,11 @@ namespace Ryujinx.UI.App.Common
|
|||||||
if (!savedUpdateLookup.Contains(update))
|
if (!savedUpdateLookup.Contains(update))
|
||||||
{
|
{
|
||||||
bool shouldSelect = false;
|
bool shouldSelect = false;
|
||||||
if (!selectedUpdate.HasValue || selectedUpdate.Value.Item1.Version < update.Version)
|
if (selectedUpdate.Check(su => su.Update?.Version < update.Version))
|
||||||
{
|
{
|
||||||
shouldSelect = true;
|
shouldSelect = true;
|
||||||
if (selectedUpdate.HasValue)
|
_titleUpdates.AddOrUpdate((selectedUpdate.Value.Update, false));
|
||||||
_titleUpdates.AddOrUpdate((selectedUpdate.Value.Item1, false));
|
selectedUpdate = (update, true);
|
||||||
selectedUpdate = DynamicData.Kernel.Optional<(TitleUpdateModel, bool IsSelected)>.Create((update, true));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
modifiedVersion = modifiedVersion || shouldSelect;
|
modifiedVersion = modifiedVersion || shouldSelect;
|
||||||
@@ -1513,7 +1504,7 @@ namespace Ryujinx.UI.App.Common
|
|||||||
if (updatesChanged)
|
if (updatesChanged)
|
||||||
{
|
{
|
||||||
var gameUpdates = it.Items.Where(update => update.TitleUpdate.TitleIdBase == application.IdBase).ToList();
|
var gameUpdates = it.Items.Where(update => update.TitleUpdate.TitleIdBase == application.IdBase).ToList();
|
||||||
TitleUpdatesHelper.SaveTitleUpdatesJson(_virtualFileSystem, application.IdBase, gameUpdates);
|
TitleUpdatesHelper.SaveTitleUpdatesJson(application.IdBase, gameUpdates);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
@@ -1525,14 +1516,14 @@ namespace Ryujinx.UI.App.Common
|
|||||||
private void SaveDownloadableContentsForGame(ulong titleIdBase)
|
private void SaveDownloadableContentsForGame(ulong titleIdBase)
|
||||||
{
|
{
|
||||||
var dlcs = DownloadableContents.Items.Where(dlc => dlc.Dlc.TitleIdBase == titleIdBase).ToList();
|
var dlcs = DownloadableContents.Items.Where(dlc => dlc.Dlc.TitleIdBase == titleIdBase).ToList();
|
||||||
DownloadableContentsHelper.SaveDownloadableContentsJson(_virtualFileSystem, titleIdBase, dlcs);
|
DownloadableContentsHelper.SaveDownloadableContentsJson(titleIdBase, dlcs);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Save the _currently tracked_ update state for the game
|
// Save the _currently tracked_ update state for the game
|
||||||
private void SaveTitleUpdatesForGame(ulong titleIdBase)
|
private void SaveTitleUpdatesForGame(ulong titleIdBase)
|
||||||
{
|
{
|
||||||
var updates = TitleUpdates.Items.Where(update => update.TitleUpdate.TitleIdBase == titleIdBase).ToList();
|
var updates = TitleUpdates.Items.Where(update => update.TitleUpdate.TitleIdBase == titleIdBase).ToList();
|
||||||
TitleUpdatesHelper.SaveTitleUpdatesJson(_virtualFileSystem, titleIdBase, updates);
|
TitleUpdatesHelper.SaveTitleUpdatesJson(titleIdBase, updates);
|
||||||
}
|
}
|
||||||
|
|
||||||
// ApplicationData isnt live-updating (e.g. when an update gets applied) and so this is meant to trigger a refresh
|
// ApplicationData isnt live-updating (e.g. when an update gets applied) and so this is meant to trigger a refresh
|
||||||
|
@@ -1,16 +1,12 @@
|
|||||||
using ARMeilleure;
|
|
||||||
using Ryujinx.Common.Configuration;
|
using Ryujinx.Common.Configuration;
|
||||||
using Ryujinx.Common.Configuration.Hid;
|
using Ryujinx.Common.Configuration.Hid;
|
||||||
using Ryujinx.Common.Configuration.Hid.Controller;
|
|
||||||
using Ryujinx.Common.Configuration.Hid.Keyboard;
|
using Ryujinx.Common.Configuration.Hid.Keyboard;
|
||||||
using Ryujinx.Common.Configuration.Multiplayer;
|
using Ryujinx.Common.Configuration.Multiplayer;
|
||||||
using Ryujinx.Common.Logging;
|
|
||||||
using Ryujinx.Graphics.Vulkan;
|
using Ryujinx.Graphics.Vulkan;
|
||||||
using Ryujinx.HLE;
|
using Ryujinx.HLE;
|
||||||
using Ryujinx.UI.Common.Configuration.System;
|
using Ryujinx.UI.Common.Configuration.System;
|
||||||
using Ryujinx.UI.Common.Configuration.UI;
|
using Ryujinx.UI.Common.Configuration.UI;
|
||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
|
||||||
|
|
||||||
namespace Ryujinx.UI.Common.Configuration
|
namespace Ryujinx.UI.Common.Configuration
|
||||||
{
|
{
|
||||||
@@ -21,10 +17,10 @@ namespace Ryujinx.UI.Common.Configuration
|
|||||||
if (Instance != null)
|
if (Instance != null)
|
||||||
{
|
{
|
||||||
throw new InvalidOperationException("Configuration is already initialized");
|
throw new InvalidOperationException("Configuration is already initialized");
|
||||||
}
|
}
|
||||||
|
|
||||||
Instance = new ConfigurationState();
|
Instance = new ConfigurationState();
|
||||||
}
|
}
|
||||||
|
|
||||||
public ConfigurationFileFormat ToFileFormat()
|
public ConfigurationFileFormat ToFileFormat()
|
||||||
{
|
{
|
||||||
|
@@ -247,6 +247,7 @@ namespace Ryujinx.UI.Common
|
|||||||
"0100dbf01000a000", // Burnout Paradise Remastered
|
"0100dbf01000a000", // Burnout Paradise Remastered
|
||||||
"0100744001588000", // Cars 3: Driven to Win
|
"0100744001588000", // Cars 3: Driven to Win
|
||||||
"0100b41013c82000", // Cruis'n Blast
|
"0100b41013c82000", // Cruis'n Blast
|
||||||
|
"01001b300b9be000", // Diablo III: Eternal Collection
|
||||||
"01008c8012920000", // Dying Light Platinum Edition
|
"01008c8012920000", // Dying Light Platinum Edition
|
||||||
"010073c01af34000", // LEGO Horizon Adventures
|
"010073c01af34000", // LEGO Horizon Adventures
|
||||||
"0100770008dd8000", // Monster Hunter Generations Ultimate
|
"0100770008dd8000", // Monster Hunter Generations Ultimate
|
||||||
|
@@ -42,7 +42,7 @@ namespace Ryujinx.UI.Common.Helper
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void SaveDownloadableContentsJson(VirtualFileSystem vfs, ulong applicationIdBase, List<(DownloadableContentModel, bool IsEnabled)> dlcs)
|
public static void SaveDownloadableContentsJson(ulong applicationIdBase, List<(DownloadableContentModel, bool IsEnabled)> dlcs)
|
||||||
{
|
{
|
||||||
DownloadableContentContainer container = default;
|
DownloadableContentContainer container = default;
|
||||||
List<DownloadableContentContainer> downloadableContentContainerList = new();
|
List<DownloadableContentContainer> downloadableContentContainerList = new();
|
||||||
|
@@ -28,7 +28,7 @@ namespace Ryujinx.UI.Common.Helper
|
|||||||
{
|
{
|
||||||
private static readonly TitleUpdateMetadataJsonSerializerContext _serializerContext = new(JsonHelper.GetDefaultSerializerOptions());
|
private static readonly TitleUpdateMetadataJsonSerializerContext _serializerContext = new(JsonHelper.GetDefaultSerializerOptions());
|
||||||
|
|
||||||
public static List<(TitleUpdateModel, bool IsSelected)> LoadTitleUpdatesJson(VirtualFileSystem vfs, ulong applicationIdBase)
|
public static List<(TitleUpdateModel Update, bool IsSelected)> LoadTitleUpdatesJson(VirtualFileSystem vfs, ulong applicationIdBase)
|
||||||
{
|
{
|
||||||
var titleUpdatesJsonPath = PathToGameUpdatesJson(applicationIdBase);
|
var titleUpdatesJsonPath = PathToGameUpdatesJson(applicationIdBase);
|
||||||
|
|
||||||
@@ -49,7 +49,7 @@ namespace Ryujinx.UI.Common.Helper
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void SaveTitleUpdatesJson(VirtualFileSystem vfs, ulong applicationIdBase, List<(TitleUpdateModel, bool IsSelected)> updates)
|
public static void SaveTitleUpdatesJson(ulong applicationIdBase, List<(TitleUpdateModel, bool IsSelected)> updates)
|
||||||
{
|
{
|
||||||
var titleUpdateWindowData = new TitleUpdateMetadata
|
var titleUpdateWindowData = new TitleUpdateMetadata
|
||||||
{
|
{
|
||||||
@@ -77,7 +77,7 @@ namespace Ryujinx.UI.Common.Helper
|
|||||||
JsonHelper.SerializeToFile(titleUpdatesJsonPath, titleUpdateWindowData, _serializerContext.TitleUpdateMetadata);
|
JsonHelper.SerializeToFile(titleUpdatesJsonPath, titleUpdateWindowData, _serializerContext.TitleUpdateMetadata);
|
||||||
}
|
}
|
||||||
|
|
||||||
private static List<(TitleUpdateModel, bool IsSelected)> LoadTitleUpdates(VirtualFileSystem vfs, TitleUpdateMetadata titleUpdateMetadata, ulong applicationIdBase)
|
private static List<(TitleUpdateModel Update, bool IsSelected)> LoadTitleUpdates(VirtualFileSystem vfs, TitleUpdateMetadata titleUpdateMetadata, ulong applicationIdBase)
|
||||||
{
|
{
|
||||||
var result = new List<(TitleUpdateModel, bool IsSelected)>();
|
var result = new List<(TitleUpdateModel, bool IsSelected)>();
|
||||||
|
|
||||||
|
@@ -3,6 +3,7 @@
|
|||||||
<PropertyGroup>
|
<PropertyGroup>
|
||||||
<TargetFramework>net8.0</TargetFramework>
|
<TargetFramework>net8.0</TargetFramework>
|
||||||
<AllowUnsafeBlocks>true</AllowUnsafeBlocks>
|
<AllowUnsafeBlocks>true</AllowUnsafeBlocks>
|
||||||
|
<DefaultItemExcludes>$(DefaultItemExcludes);._*</DefaultItemExcludes>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
|
@@ -5,6 +5,7 @@
|
|||||||
<Nullable>enable</Nullable>
|
<Nullable>enable</Nullable>
|
||||||
<LangVersion>latest</LangVersion>
|
<LangVersion>latest</LangVersion>
|
||||||
<EnforceExtendedAnalyzerRules>true</EnforceExtendedAnalyzerRules>
|
<EnforceExtendedAnalyzerRules>true</EnforceExtendedAnalyzerRules>
|
||||||
|
<DefaultItemExcludes>$(DefaultItemExcludes);._*</DefaultItemExcludes>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
|
@@ -3,6 +3,8 @@ using Avalonia.Controls;
|
|||||||
using Avalonia.Controls.ApplicationLifetimes;
|
using Avalonia.Controls.ApplicationLifetimes;
|
||||||
using Avalonia.Input;
|
using Avalonia.Input;
|
||||||
using Avalonia.Threading;
|
using Avalonia.Threading;
|
||||||
|
using LibHac.Common;
|
||||||
|
using LibHac.Ns;
|
||||||
using LibHac.Tools.FsSystem;
|
using LibHac.Tools.FsSystem;
|
||||||
using Ryujinx.Audio.Backends.Dummy;
|
using Ryujinx.Audio.Backends.Dummy;
|
||||||
using Ryujinx.Audio.Backends.OpenAL;
|
using Ryujinx.Audio.Backends.OpenAL;
|
||||||
@@ -670,7 +672,7 @@ namespace Ryujinx.Ava
|
|||||||
_cursorState = CursorStates.ForceChangeCursor;
|
_cursorState = CursorStates.ForceChangeCursor;
|
||||||
}
|
}
|
||||||
|
|
||||||
public async Task<bool> LoadGuestApplication()
|
public async Task<bool> LoadGuestApplication(BlitStruct<ApplicationControlProperty>? customNacpData = null)
|
||||||
{
|
{
|
||||||
InitializeSwitchInstance();
|
InitializeSwitchInstance();
|
||||||
MainWindow.UpdateGraphicsConfig();
|
MainWindow.UpdateGraphicsConfig();
|
||||||
@@ -740,7 +742,7 @@ namespace Ryujinx.Ava
|
|||||||
{
|
{
|
||||||
Logger.Info?.Print(LogClass.Application, "Loading as Firmware Title (NCA).");
|
Logger.Info?.Print(LogClass.Application, "Loading as Firmware Title (NCA).");
|
||||||
|
|
||||||
if (!Device.LoadNca(ApplicationPath))
|
if (!Device.LoadNca(ApplicationPath, customNacpData))
|
||||||
{
|
{
|
||||||
Device.Dispose();
|
Device.Dispose();
|
||||||
|
|
||||||
@@ -1137,7 +1139,7 @@ namespace Ryujinx.Ava
|
|||||||
LocaleManager.Instance[LocaleKeys.VolumeShort] + $": {(int)(Device.GetVolume() * 100)}%",
|
LocaleManager.Instance[LocaleKeys.VolumeShort] + $": {(int)(Device.GetVolume() * 100)}%",
|
||||||
dockedMode,
|
dockedMode,
|
||||||
ConfigurationState.Instance.Graphics.AspectRatio.Value.ToText(),
|
ConfigurationState.Instance.Graphics.AspectRatio.Value.ToText(),
|
||||||
LocaleManager.Instance[LocaleKeys.Game] + $": {Device.Statistics.GetGameFrameRate():00.00} FPS ({Device.Statistics.GetGameFrameTime():00.00} ms)",
|
$"{Device.Statistics.GetGameFrameRate():00.00} FPS ({Device.Statistics.GetGameFrameTime():00.00} ms)",
|
||||||
$"FIFO: {Device.Statistics.GetFifoPercent():00.00} %",
|
$"FIFO: {Device.Statistics.GetFifoPercent():00.00} %",
|
||||||
_displayCount));
|
_displayCount));
|
||||||
}
|
}
|
||||||
|
@@ -31,6 +31,9 @@
|
|||||||
"MenuBarToolsInstallFirmware": "تثبيت البرنامج الثابت",
|
"MenuBarToolsInstallFirmware": "تثبيت البرنامج الثابت",
|
||||||
"MenuBarFileToolsInstallFirmwareFromFile": "تثبيت برنامج ثابت من XCI أو ZIP",
|
"MenuBarFileToolsInstallFirmwareFromFile": "تثبيت برنامج ثابت من XCI أو ZIP",
|
||||||
"MenuBarFileToolsInstallFirmwareFromDirectory": "تثبيت برنامج ثابت من مجلد",
|
"MenuBarFileToolsInstallFirmwareFromDirectory": "تثبيت برنامج ثابت من مجلد",
|
||||||
|
"MenuBarToolsInstallKeys": "Install Keys",
|
||||||
|
"MenuBarFileToolsInstallKeysFromFile": "Install keys from KEYS or ZIP",
|
||||||
|
"MenuBarFileToolsInstallKeysFromFolder": "Install keys from a directory",
|
||||||
"MenuBarToolsManageFileTypes": "إدارة أنواع الملفات",
|
"MenuBarToolsManageFileTypes": "إدارة أنواع الملفات",
|
||||||
"MenuBarToolsInstallFileTypes": "تثبيت أنواع الملفات",
|
"MenuBarToolsInstallFileTypes": "تثبيت أنواع الملفات",
|
||||||
"MenuBarToolsUninstallFileTypes": "إزالة أنواع الملفات",
|
"MenuBarToolsUninstallFileTypes": "إزالة أنواع الملفات",
|
||||||
@@ -506,6 +509,13 @@
|
|||||||
"DialogFirmwareInstallerFirmwareInstallConfirmMessage": "\nهل تريد المتابعة؟",
|
"DialogFirmwareInstallerFirmwareInstallConfirmMessage": "\nهل تريد المتابعة؟",
|
||||||
"DialogFirmwareInstallerFirmwareInstallWaitMessage": "تثبيت البرنامج الثابت...",
|
"DialogFirmwareInstallerFirmwareInstallWaitMessage": "تثبيت البرنامج الثابت...",
|
||||||
"DialogFirmwareInstallerFirmwareInstallSuccessMessage": "تم تثبيت إصدار النظام {0} بنجاح.",
|
"DialogFirmwareInstallerFirmwareInstallSuccessMessage": "تم تثبيت إصدار النظام {0} بنجاح.",
|
||||||
|
"DialogKeysInstallerKeysNotFoundErrorMessage": "An invalid Keys file was found in {0}",
|
||||||
|
"DialogKeysInstallerKeysInstallTitle": "Install Keys",
|
||||||
|
"DialogKeysInstallerKeysInstallMessage": "New Keys file will be installed.",
|
||||||
|
"DialogKeysInstallerKeysInstallSubMessage": "\n\nThis may replace some of the current installed Keys.",
|
||||||
|
"DialogKeysInstallerKeysInstallConfirmMessage": "\n\nDo you want to continue?",
|
||||||
|
"DialogKeysInstallerKeysInstallWaitMessage": "Installing Keys...",
|
||||||
|
"DialogKeysInstallerKeysInstallSuccessMessage": "New Keys file successfully installed.",
|
||||||
"DialogUserProfileDeletionWarningMessage": "لن تكون هناك ملفات الشخصية أخرى لفتحها إذا تم حذف الملف الشخصي المحدد",
|
"DialogUserProfileDeletionWarningMessage": "لن تكون هناك ملفات الشخصية أخرى لفتحها إذا تم حذف الملف الشخصي المحدد",
|
||||||
"DialogUserProfileDeletionConfirmMessage": "هل تريد حذف الملف الشخصي المحدد",
|
"DialogUserProfileDeletionConfirmMessage": "هل تريد حذف الملف الشخصي المحدد",
|
||||||
"DialogUserProfileUnsavedChangesTitle": "تحذير - التغييرات غير محفوظة",
|
"DialogUserProfileUnsavedChangesTitle": "تحذير - التغييرات غير محفوظة",
|
||||||
@@ -692,6 +702,9 @@
|
|||||||
"Never": "مطلقا",
|
"Never": "مطلقا",
|
||||||
"SwkbdMinCharacters": "يجب أن يبلغ طوله {0} حرفا على الأقل",
|
"SwkbdMinCharacters": "يجب أن يبلغ طوله {0} حرفا على الأقل",
|
||||||
"SwkbdMinRangeCharacters": "يجب أن يتكون من {0}-{1} حرفا",
|
"SwkbdMinRangeCharacters": "يجب أن يتكون من {0}-{1} حرفا",
|
||||||
|
"CabinetTitle": "Cabinet Dialog",
|
||||||
|
"CabinetDialog": "Enter your Amiibo's new name",
|
||||||
|
"CabinetScanDialog": "Please scan your Amiibo now.",
|
||||||
"SoftwareKeyboard": "لوحة المفاتيح البرمجية",
|
"SoftwareKeyboard": "لوحة المفاتيح البرمجية",
|
||||||
"SoftwareKeyboardModeNumeric": "يجب أن يكون 0-9 أو '.' فقط",
|
"SoftwareKeyboardModeNumeric": "يجب أن يكون 0-9 أو '.' فقط",
|
||||||
"SoftwareKeyboardModeAlphabet": "يجب أن تكون الأحرف غير CJK فقط",
|
"SoftwareKeyboardModeAlphabet": "يجب أن تكون الأحرف غير CJK فقط",
|
||||||
@@ -705,7 +718,6 @@
|
|||||||
"UpdaterAddingFiles": "إضافة ملفات جديدة...",
|
"UpdaterAddingFiles": "إضافة ملفات جديدة...",
|
||||||
"UpdaterExtracting": "استخراج التحديث...",
|
"UpdaterExtracting": "استخراج التحديث...",
|
||||||
"UpdaterDownloading": "تحميل التحديث...",
|
"UpdaterDownloading": "تحميل التحديث...",
|
||||||
"Game": "لعبة",
|
|
||||||
"Docked": "تركيب بالمنصة",
|
"Docked": "تركيب بالمنصة",
|
||||||
"Handheld": "محمول",
|
"Handheld": "محمول",
|
||||||
"ConnectionError": "خطأ في الاتصال",
|
"ConnectionError": "خطأ في الاتصال",
|
||||||
|
@@ -31,6 +31,9 @@
|
|||||||
"MenuBarToolsInstallFirmware": "Firmware installieren",
|
"MenuBarToolsInstallFirmware": "Firmware installieren",
|
||||||
"MenuBarFileToolsInstallFirmwareFromFile": "Firmware von einer XCI- oder einer ZIP-Datei installieren",
|
"MenuBarFileToolsInstallFirmwareFromFile": "Firmware von einer XCI- oder einer ZIP-Datei installieren",
|
||||||
"MenuBarFileToolsInstallFirmwareFromDirectory": "Firmware aus einem Verzeichnis installieren",
|
"MenuBarFileToolsInstallFirmwareFromDirectory": "Firmware aus einem Verzeichnis installieren",
|
||||||
|
"MenuBarToolsInstallKeys": "Install Keys",
|
||||||
|
"MenuBarFileToolsInstallKeysFromFile": "Install keys from KEYS or ZIP",
|
||||||
|
"MenuBarFileToolsInstallKeysFromFolder": "Install keys from a directory",
|
||||||
"MenuBarToolsManageFileTypes": "Dateitypen verwalten",
|
"MenuBarToolsManageFileTypes": "Dateitypen verwalten",
|
||||||
"MenuBarToolsInstallFileTypes": "Dateitypen installieren",
|
"MenuBarToolsInstallFileTypes": "Dateitypen installieren",
|
||||||
"MenuBarToolsUninstallFileTypes": "Dateitypen deinstallieren",
|
"MenuBarToolsUninstallFileTypes": "Dateitypen deinstallieren",
|
||||||
@@ -506,6 +509,13 @@
|
|||||||
"DialogFirmwareInstallerFirmwareInstallConfirmMessage": "\n\nMöchtest du fortfahren?",
|
"DialogFirmwareInstallerFirmwareInstallConfirmMessage": "\n\nMöchtest du fortfahren?",
|
||||||
"DialogFirmwareInstallerFirmwareInstallWaitMessage": "Firmware wird installiert...",
|
"DialogFirmwareInstallerFirmwareInstallWaitMessage": "Firmware wird installiert...",
|
||||||
"DialogFirmwareInstallerFirmwareInstallSuccessMessage": "Systemversion {0} wurde erfolgreich installiert.",
|
"DialogFirmwareInstallerFirmwareInstallSuccessMessage": "Systemversion {0} wurde erfolgreich installiert.",
|
||||||
|
"DialogKeysInstallerKeysNotFoundErrorMessage": "An invalid Keys file was found in {0}",
|
||||||
|
"DialogKeysInstallerKeysInstallTitle": "Install Keys",
|
||||||
|
"DialogKeysInstallerKeysInstallMessage": "New Keys file will be installed.",
|
||||||
|
"DialogKeysInstallerKeysInstallSubMessage": "\n\nThis may replace some of the current installed Keys.",
|
||||||
|
"DialogKeysInstallerKeysInstallConfirmMessage": "\n\nDo you want to continue?",
|
||||||
|
"DialogKeysInstallerKeysInstallWaitMessage": "Installing Keys...",
|
||||||
|
"DialogKeysInstallerKeysInstallSuccessMessage": "New Keys file successfully installed.",
|
||||||
"DialogUserProfileDeletionWarningMessage": "Es können keine anderen Profile geöffnet werden, wenn das ausgewählte Profil gelöscht wird.",
|
"DialogUserProfileDeletionWarningMessage": "Es können keine anderen Profile geöffnet werden, wenn das ausgewählte Profil gelöscht wird.",
|
||||||
"DialogUserProfileDeletionConfirmMessage": "Möchtest du das ausgewählte Profil löschen?",
|
"DialogUserProfileDeletionConfirmMessage": "Möchtest du das ausgewählte Profil löschen?",
|
||||||
"DialogUserProfileUnsavedChangesTitle": "Warnung - Nicht gespeicherte Änderungen",
|
"DialogUserProfileUnsavedChangesTitle": "Warnung - Nicht gespeicherte Änderungen",
|
||||||
@@ -692,6 +702,9 @@
|
|||||||
"Never": "Niemals",
|
"Never": "Niemals",
|
||||||
"SwkbdMinCharacters": "Muss mindestens {0} Zeichen lang sein",
|
"SwkbdMinCharacters": "Muss mindestens {0} Zeichen lang sein",
|
||||||
"SwkbdMinRangeCharacters": "Muss {0}-{1} Zeichen lang sein",
|
"SwkbdMinRangeCharacters": "Muss {0}-{1} Zeichen lang sein",
|
||||||
|
"CabinetTitle": "Cabinet Dialog",
|
||||||
|
"CabinetDialog": "Enter your Amiibo's new name",
|
||||||
|
"CabinetScanDialog": "Please scan your Amiibo now.",
|
||||||
"SoftwareKeyboard": "Software-Tastatur",
|
"SoftwareKeyboard": "Software-Tastatur",
|
||||||
"SoftwareKeyboardModeNumeric": "Darf nur 0-9 oder \".\" sein",
|
"SoftwareKeyboardModeNumeric": "Darf nur 0-9 oder \".\" sein",
|
||||||
"SoftwareKeyboardModeAlphabet": "Keine CJK-Zeichen",
|
"SoftwareKeyboardModeAlphabet": "Keine CJK-Zeichen",
|
||||||
@@ -705,7 +718,6 @@
|
|||||||
"UpdaterAddingFiles": "Neue Dateien hinzufügen...",
|
"UpdaterAddingFiles": "Neue Dateien hinzufügen...",
|
||||||
"UpdaterExtracting": "Update extrahieren...",
|
"UpdaterExtracting": "Update extrahieren...",
|
||||||
"UpdaterDownloading": "Update herunterladen...",
|
"UpdaterDownloading": "Update herunterladen...",
|
||||||
"Game": "Spiel",
|
|
||||||
"Docked": "Docked",
|
"Docked": "Docked",
|
||||||
"Handheld": "Handheld",
|
"Handheld": "Handheld",
|
||||||
"ConnectionError": "Verbindungsfehler.",
|
"ConnectionError": "Verbindungsfehler.",
|
||||||
|
@@ -31,6 +31,9 @@
|
|||||||
"MenuBarToolsInstallFirmware": "Εγκατάσταση Firmware",
|
"MenuBarToolsInstallFirmware": "Εγκατάσταση Firmware",
|
||||||
"MenuBarFileToolsInstallFirmwareFromFile": "Εγκατάσταση Firmware από XCI ή ZIP",
|
"MenuBarFileToolsInstallFirmwareFromFile": "Εγκατάσταση Firmware από XCI ή ZIP",
|
||||||
"MenuBarFileToolsInstallFirmwareFromDirectory": "Εγκατάσταση Firmware από τοποθεσία",
|
"MenuBarFileToolsInstallFirmwareFromDirectory": "Εγκατάσταση Firmware από τοποθεσία",
|
||||||
|
"MenuBarToolsInstallKeys": "Install Keys",
|
||||||
|
"MenuBarFileToolsInstallKeysFromFile": "Install keys from KEYS or ZIP",
|
||||||
|
"MenuBarFileToolsInstallKeysFromFolder": "Install keys from a directory",
|
||||||
"MenuBarToolsManageFileTypes": "Διαχείριση τύπων αρχείων",
|
"MenuBarToolsManageFileTypes": "Διαχείριση τύπων αρχείων",
|
||||||
"MenuBarToolsInstallFileTypes": "Εγκαταστήσετε τύπους αρχείων.",
|
"MenuBarToolsInstallFileTypes": "Εγκαταστήσετε τύπους αρχείων.",
|
||||||
"MenuBarToolsUninstallFileTypes": "Απεγκαταστήσετε τύπους αρχείων",
|
"MenuBarToolsUninstallFileTypes": "Απεγκαταστήσετε τύπους αρχείων",
|
||||||
@@ -506,6 +509,13 @@
|
|||||||
"DialogFirmwareInstallerFirmwareInstallConfirmMessage": "\n\nΘέλετε να συνεχίσετε;",
|
"DialogFirmwareInstallerFirmwareInstallConfirmMessage": "\n\nΘέλετε να συνεχίσετε;",
|
||||||
"DialogFirmwareInstallerFirmwareInstallWaitMessage": "Εγκατάσταση Firmware...",
|
"DialogFirmwareInstallerFirmwareInstallWaitMessage": "Εγκατάσταση Firmware...",
|
||||||
"DialogFirmwareInstallerFirmwareInstallSuccessMessage": "Η έκδοση συστήματος {0} εγκαταστάθηκε με επιτυχία.",
|
"DialogFirmwareInstallerFirmwareInstallSuccessMessage": "Η έκδοση συστήματος {0} εγκαταστάθηκε με επιτυχία.",
|
||||||
|
"DialogKeysInstallerKeysNotFoundErrorMessage": "An invalid Keys file was found in {0}",
|
||||||
|
"DialogKeysInstallerKeysInstallTitle": "Install Keys",
|
||||||
|
"DialogKeysInstallerKeysInstallMessage": "New Keys file will be installed.",
|
||||||
|
"DialogKeysInstallerKeysInstallSubMessage": "\n\nThis may replace some of the current installed Keys.",
|
||||||
|
"DialogKeysInstallerKeysInstallConfirmMessage": "\n\nDo you want to continue?",
|
||||||
|
"DialogKeysInstallerKeysInstallWaitMessage": "Installing Keys...",
|
||||||
|
"DialogKeysInstallerKeysInstallSuccessMessage": "New Keys file successfully installed.",
|
||||||
"DialogUserProfileDeletionWarningMessage": "Δεν θα υπάρχουν άλλα προφίλ εάν διαγραφεί το επιλεγμένο",
|
"DialogUserProfileDeletionWarningMessage": "Δεν θα υπάρχουν άλλα προφίλ εάν διαγραφεί το επιλεγμένο",
|
||||||
"DialogUserProfileDeletionConfirmMessage": "Θέλετε να διαγράψετε το επιλεγμένο προφίλ",
|
"DialogUserProfileDeletionConfirmMessage": "Θέλετε να διαγράψετε το επιλεγμένο προφίλ",
|
||||||
"DialogUserProfileUnsavedChangesTitle": "Προσοχή - Μην Αποθηκευμένες Αλλαγές.",
|
"DialogUserProfileUnsavedChangesTitle": "Προσοχή - Μην Αποθηκευμένες Αλλαγές.",
|
||||||
@@ -692,6 +702,9 @@
|
|||||||
"Never": "Ποτέ",
|
"Never": "Ποτέ",
|
||||||
"SwkbdMinCharacters": "Πρέπει να έχει μήκος τουλάχιστον {0} χαρακτήρες",
|
"SwkbdMinCharacters": "Πρέπει να έχει μήκος τουλάχιστον {0} χαρακτήρες",
|
||||||
"SwkbdMinRangeCharacters": "Πρέπει να έχει μήκος {0}-{1} χαρακτήρες",
|
"SwkbdMinRangeCharacters": "Πρέπει να έχει μήκος {0}-{1} χαρακτήρες",
|
||||||
|
"CabinetTitle": "Cabinet Dialog",
|
||||||
|
"CabinetDialog": "Enter your Amiibo's new name",
|
||||||
|
"CabinetScanDialog": "Please scan your Amiibo now.",
|
||||||
"SoftwareKeyboard": "Εικονικό Πληκτρολόγιο",
|
"SoftwareKeyboard": "Εικονικό Πληκτρολόγιο",
|
||||||
"SoftwareKeyboardModeNumeric": "Πρέπει να είναι 0-9 ή '.' μόνο",
|
"SoftwareKeyboardModeNumeric": "Πρέπει να είναι 0-9 ή '.' μόνο",
|
||||||
"SoftwareKeyboardModeAlphabet": "Πρέπει να μην είναι μόνο χαρακτήρες CJK",
|
"SoftwareKeyboardModeAlphabet": "Πρέπει να μην είναι μόνο χαρακτήρες CJK",
|
||||||
@@ -705,7 +718,6 @@
|
|||||||
"UpdaterAddingFiles": "Προσθήκη Νέων Αρχείων...",
|
"UpdaterAddingFiles": "Προσθήκη Νέων Αρχείων...",
|
||||||
"UpdaterExtracting": "Εξαγωγή Ενημέρωσης...",
|
"UpdaterExtracting": "Εξαγωγή Ενημέρωσης...",
|
||||||
"UpdaterDownloading": "Λήψη Ενημέρωσης...",
|
"UpdaterDownloading": "Λήψη Ενημέρωσης...",
|
||||||
"Game": "Παιχνίδι",
|
|
||||||
"Docked": "Προσκολλημένο",
|
"Docked": "Προσκολλημένο",
|
||||||
"Handheld": "Χειροκίνητο",
|
"Handheld": "Χειροκίνητο",
|
||||||
"ConnectionError": "Σφάλμα Σύνδεσης.",
|
"ConnectionError": "Σφάλμα Σύνδεσης.",
|
||||||
|
@@ -31,6 +31,9 @@
|
|||||||
"MenuBarToolsInstallFirmware": "Install Firmware",
|
"MenuBarToolsInstallFirmware": "Install Firmware",
|
||||||
"MenuBarFileToolsInstallFirmwareFromFile": "Install a firmware from XCI or ZIP",
|
"MenuBarFileToolsInstallFirmwareFromFile": "Install a firmware from XCI or ZIP",
|
||||||
"MenuBarFileToolsInstallFirmwareFromDirectory": "Install a firmware from a directory",
|
"MenuBarFileToolsInstallFirmwareFromDirectory": "Install a firmware from a directory",
|
||||||
|
"MenuBarToolsInstallKeys": "Install Keys",
|
||||||
|
"MenuBarFileToolsInstallKeysFromFile": "Install keys from KEYS or ZIP",
|
||||||
|
"MenuBarFileToolsInstallKeysFromFolder": "Install keys from a directory",
|
||||||
"MenuBarToolsManageFileTypes": "Manage file types",
|
"MenuBarToolsManageFileTypes": "Manage file types",
|
||||||
"MenuBarToolsInstallFileTypes": "Install file types",
|
"MenuBarToolsInstallFileTypes": "Install file types",
|
||||||
"MenuBarToolsUninstallFileTypes": "Uninstall file types",
|
"MenuBarToolsUninstallFileTypes": "Uninstall file types",
|
||||||
@@ -518,6 +521,13 @@
|
|||||||
"DialogFirmwareInstallerFirmwareInstallConfirmMessage": "\n\nDo you want to continue?",
|
"DialogFirmwareInstallerFirmwareInstallConfirmMessage": "\n\nDo you want to continue?",
|
||||||
"DialogFirmwareInstallerFirmwareInstallWaitMessage": "Installing firmware...",
|
"DialogFirmwareInstallerFirmwareInstallWaitMessage": "Installing firmware...",
|
||||||
"DialogFirmwareInstallerFirmwareInstallSuccessMessage": "System version {0} successfully installed.",
|
"DialogFirmwareInstallerFirmwareInstallSuccessMessage": "System version {0} successfully installed.",
|
||||||
|
"DialogKeysInstallerKeysNotFoundErrorMessage": "An invalid Keys file was found in {0}",
|
||||||
|
"DialogKeysInstallerKeysInstallTitle": "Install Keys",
|
||||||
|
"DialogKeysInstallerKeysInstallMessage": "New Keys file will be installed.",
|
||||||
|
"DialogKeysInstallerKeysInstallSubMessage": "\n\nThis may replace some of the current installed Keys.",
|
||||||
|
"DialogKeysInstallerKeysInstallConfirmMessage": "\n\nDo you want to continue?",
|
||||||
|
"DialogKeysInstallerKeysInstallWaitMessage": "Installing Keys...",
|
||||||
|
"DialogKeysInstallerKeysInstallSuccessMessage": "New Keys file successfully installed.",
|
||||||
"DialogUserProfileDeletionWarningMessage": "There would be no other profiles to be opened if selected profile is deleted",
|
"DialogUserProfileDeletionWarningMessage": "There would be no other profiles to be opened if selected profile is deleted",
|
||||||
"DialogUserProfileDeletionConfirmMessage": "Do you want to delete the selected profile",
|
"DialogUserProfileDeletionConfirmMessage": "Do you want to delete the selected profile",
|
||||||
"DialogUserProfileUnsavedChangesTitle": "Warning - Unsaved Changes",
|
"DialogUserProfileUnsavedChangesTitle": "Warning - Unsaved Changes",
|
||||||
@@ -704,6 +714,9 @@
|
|||||||
"Never": "Never",
|
"Never": "Never",
|
||||||
"SwkbdMinCharacters": "Must be at least {0} characters long",
|
"SwkbdMinCharacters": "Must be at least {0} characters long",
|
||||||
"SwkbdMinRangeCharacters": "Must be {0}-{1} characters long",
|
"SwkbdMinRangeCharacters": "Must be {0}-{1} characters long",
|
||||||
|
"CabinetTitle": "Cabinet Dialog",
|
||||||
|
"CabinetDialog": "Enter your Amiibo's new name",
|
||||||
|
"CabinetScanDialog": "Please scan your Amiibo now.",
|
||||||
"SoftwareKeyboard": "Software Keyboard",
|
"SoftwareKeyboard": "Software Keyboard",
|
||||||
"SoftwareKeyboardModeNumeric": "Must be 0-9 or '.' only",
|
"SoftwareKeyboardModeNumeric": "Must be 0-9 or '.' only",
|
||||||
"SoftwareKeyboardModeAlphabet": "Must be non CJK-characters only",
|
"SoftwareKeyboardModeAlphabet": "Must be non CJK-characters only",
|
||||||
@@ -717,7 +730,6 @@
|
|||||||
"UpdaterAddingFiles": "Adding New Files...",
|
"UpdaterAddingFiles": "Adding New Files...",
|
||||||
"UpdaterExtracting": "Extracting Update...",
|
"UpdaterExtracting": "Extracting Update...",
|
||||||
"UpdaterDownloading": "Downloading Update...",
|
"UpdaterDownloading": "Downloading Update...",
|
||||||
"Game": "Game",
|
|
||||||
"Docked": "Docked",
|
"Docked": "Docked",
|
||||||
"Handheld": "Handheld",
|
"Handheld": "Handheld",
|
||||||
"ConnectionError": "Connection Error.",
|
"ConnectionError": "Connection Error.",
|
||||||
|
@@ -1,7 +1,7 @@
|
|||||||
{
|
{
|
||||||
"Language": "Español (ES)",
|
"Language": "Español (ES)",
|
||||||
"MenuBarFileOpenApplet": "Abrir applet",
|
"MenuBarFileOpenApplet": "Abrir applet",
|
||||||
"MenuBarFileOpenAppletOpenMiiApplet": "Mii Edit Applet",
|
"MenuBarFileOpenAppletOpenMiiApplet": "Applet Editor Mii",
|
||||||
"MenuBarFileOpenAppletOpenMiiAppletToolTip": "Abre el editor de Mii en modo autónomo",
|
"MenuBarFileOpenAppletOpenMiiAppletToolTip": "Abre el editor de Mii en modo autónomo",
|
||||||
"SettingsTabInputDirectMouseAccess": "Acceso directo al ratón",
|
"SettingsTabInputDirectMouseAccess": "Acceso directo al ratón",
|
||||||
"SettingsTabSystemMemoryManagerMode": "Modo del administrador de memoria:",
|
"SettingsTabSystemMemoryManagerMode": "Modo del administrador de memoria:",
|
||||||
@@ -31,10 +31,13 @@
|
|||||||
"MenuBarToolsInstallFirmware": "Instalar firmware",
|
"MenuBarToolsInstallFirmware": "Instalar firmware",
|
||||||
"MenuBarFileToolsInstallFirmwareFromFile": "Instalar firmware desde un archivo XCI o ZIP",
|
"MenuBarFileToolsInstallFirmwareFromFile": "Instalar firmware desde un archivo XCI o ZIP",
|
||||||
"MenuBarFileToolsInstallFirmwareFromDirectory": "Instalar firmware desde una carpeta",
|
"MenuBarFileToolsInstallFirmwareFromDirectory": "Instalar firmware desde una carpeta",
|
||||||
|
"MenuBarToolsInstallKeys": "Install Keys",
|
||||||
|
"MenuBarFileToolsInstallKeysFromFile": "Instalar keys de KEYS o ZIP",
|
||||||
|
"MenuBarFileToolsInstallKeysFromFolder": "Instalar keys de un directorio",
|
||||||
"MenuBarToolsManageFileTypes": "Administrar tipos de archivo",
|
"MenuBarToolsManageFileTypes": "Administrar tipos de archivo",
|
||||||
"MenuBarToolsInstallFileTypes": "Instalar tipos de archivo",
|
"MenuBarToolsInstallFileTypes": "Instalar tipos de archivo",
|
||||||
"MenuBarToolsUninstallFileTypes": "Desinstalar tipos de archivo",
|
"MenuBarToolsUninstallFileTypes": "Desinstalar tipos de archivo",
|
||||||
"MenuBarToolsXCITrimmer": "Trim XCI Files",
|
"MenuBarToolsXCITrimmer": "Recortar archivos XCI",
|
||||||
"MenuBarView": "_View",
|
"MenuBarView": "_View",
|
||||||
"MenuBarViewWindow": "Tamaño Ventana",
|
"MenuBarViewWindow": "Tamaño Ventana",
|
||||||
"MenuBarViewWindow720": "720p",
|
"MenuBarViewWindow720": "720p",
|
||||||
@@ -86,11 +89,11 @@
|
|||||||
"GameListContextMenuOpenModsDirectoryToolTip": "Abre el directorio que contiene los Mods de la Aplicación.",
|
"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",
|
"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.",
|
"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.",
|
||||||
"GameListContextMenuTrimXCI": "Check and Trim XCI File",
|
"GameListContextMenuTrimXCI": "Verificar y recortar archivo XCI",
|
||||||
"GameListContextMenuTrimXCIToolTip": "Check and Trim XCI File to Save Disk Space",
|
"GameListContextMenuTrimXCIToolTip": "Verificar y recortar archivo XCI para ahorrar espacio en disco",
|
||||||
"StatusBarGamesLoaded": "{0}/{1} juegos cargados",
|
"StatusBarGamesLoaded": "{0}/{1} juegos cargados",
|
||||||
"StatusBarSystemVersion": "Versión del sistema: {0}",
|
"StatusBarSystemVersion": "Versión del sistema: {0}",
|
||||||
"StatusBarXCIFileTrimming": "Trimming XCI File '{0}'",
|
"StatusBarXCIFileTrimming": "Recortando el siguiente archivo XCI: '{0}'",
|
||||||
"LinuxVmMaxMapCountDialogTitle": "Límite inferior para mapeos de memoria detectado",
|
"LinuxVmMaxMapCountDialogTitle": "Límite inferior para mapeos de memoria detectado",
|
||||||
"LinuxVmMaxMapCountDialogTextPrimary": "¿Quieres aumentar el valor de vm.max_map_count a {0}?",
|
"LinuxVmMaxMapCountDialogTextPrimary": "¿Quieres aumentar el valor de vm.max_map_count a {0}?",
|
||||||
"LinuxVmMaxMapCountDialogTextSecondary": "Algunos juegos podrían intentar crear más mapeos de memoria de los permitidos. Ryujinx se bloqueará tan pronto como se supere este límite.",
|
"LinuxVmMaxMapCountDialogTextSecondary": "Algunos juegos podrían intentar crear más mapeos de memoria de los permitidos. Ryujinx se bloqueará tan pronto como se supere este límite.",
|
||||||
@@ -477,7 +480,7 @@
|
|||||||
"DialogUninstallFileTypesSuccessMessage": "¡Tipos de archivos desinstalados con éxito!",
|
"DialogUninstallFileTypesSuccessMessage": "¡Tipos de archivos desinstalados con éxito!",
|
||||||
"DialogUninstallFileTypesErrorMessage": "No se pudo desinstalar los tipos de archivo.",
|
"DialogUninstallFileTypesErrorMessage": "No se pudo desinstalar los tipos de archivo.",
|
||||||
"DialogOpenSettingsWindowLabel": "Abrir ventana de opciones",
|
"DialogOpenSettingsWindowLabel": "Abrir ventana de opciones",
|
||||||
"DialogOpenXCITrimmerWindowLabel": "XCI Trimmer Window",
|
"DialogOpenXCITrimmerWindowLabel": "Ventana recortador XCI",
|
||||||
"DialogControllerAppletTitle": "Applet de mandos",
|
"DialogControllerAppletTitle": "Applet de mandos",
|
||||||
"DialogMessageDialogErrorExceptionMessage": "Error al mostrar cuadro de diálogo: {0}",
|
"DialogMessageDialogErrorExceptionMessage": "Error al mostrar cuadro de diálogo: {0}",
|
||||||
"DialogSoftwareKeyboardErrorExceptionMessage": "Error al mostrar teclado de software: {0}",
|
"DialogSoftwareKeyboardErrorExceptionMessage": "Error al mostrar teclado de software: {0}",
|
||||||
@@ -506,6 +509,13 @@
|
|||||||
"DialogFirmwareInstallerFirmwareInstallConfirmMessage": "\n\n¿Continuar?",
|
"DialogFirmwareInstallerFirmwareInstallConfirmMessage": "\n\n¿Continuar?",
|
||||||
"DialogFirmwareInstallerFirmwareInstallWaitMessage": "Instalando firmware...",
|
"DialogFirmwareInstallerFirmwareInstallWaitMessage": "Instalando firmware...",
|
||||||
"DialogFirmwareInstallerFirmwareInstallSuccessMessage": "Versión de sistema {0} instalada con éxito.",
|
"DialogFirmwareInstallerFirmwareInstallSuccessMessage": "Versión de sistema {0} instalada con éxito.",
|
||||||
|
"DialogKeysInstallerKeysNotFoundErrorMessage": "Se halló un archivo Keys inválido en {0}",
|
||||||
|
"DialogKeysInstallerKeysInstallTitle": "Instalar Keys",
|
||||||
|
"DialogKeysInstallerKeysInstallMessage": "Un nuevo archivo Keys será instalado.",
|
||||||
|
"DialogKeysInstallerKeysInstallSubMessage": "\n\nEsto puede reemplazar algunas de las Keys actualmente instaladas.",
|
||||||
|
"DialogKeysInstallerKeysInstallConfirmMessage": "\n\nDeseas continuar?",
|
||||||
|
"DialogKeysInstallerKeysInstallWaitMessage": "Instalando Keys...",
|
||||||
|
"DialogKeysInstallerKeysInstallSuccessMessage": "Nuevo archivo Keys instalado con éxito.",
|
||||||
"DialogUserProfileDeletionWarningMessage": "Si eliminas el perfil seleccionado no quedará ningún otro perfil",
|
"DialogUserProfileDeletionWarningMessage": "Si eliminas el perfil seleccionado no quedará ningún otro perfil",
|
||||||
"DialogUserProfileDeletionConfirmMessage": "¿Quieres eliminar el perfil seleccionado?",
|
"DialogUserProfileDeletionConfirmMessage": "¿Quieres eliminar el perfil seleccionado?",
|
||||||
"DialogUserProfileUnsavedChangesTitle": "Advertencia - Cambios sin guardar",
|
"DialogUserProfileUnsavedChangesTitle": "Advertencia - Cambios sin guardar",
|
||||||
@@ -678,20 +688,23 @@
|
|||||||
"OpenSetupGuideMessage": "Abrir la guía de instalación",
|
"OpenSetupGuideMessage": "Abrir la guía de instalación",
|
||||||
"NoUpdate": "No actualizado",
|
"NoUpdate": "No actualizado",
|
||||||
"TitleUpdateVersionLabel": "Versión {0} - {1}",
|
"TitleUpdateVersionLabel": "Versión {0} - {1}",
|
||||||
"TitleBundledUpdateVersionLabel": "Bundled: Version {0}",
|
"TitleBundledUpdateVersionLabel": "Incorporado: Versión {0}",
|
||||||
"TitleBundledDlcLabel": "Bundled:",
|
"TitleBundledDlcLabel": "Incorporado:",
|
||||||
"TitleXCIStatusPartialLabel": "Partial",
|
"TitleXCIStatusPartialLabel": "Parcial",
|
||||||
"TitleXCIStatusTrimmableLabel": "Untrimmed",
|
"TitleXCIStatusTrimmableLabel": "Sin recortar",
|
||||||
"TitleXCIStatusUntrimmableLabel": "Trimmed",
|
"TitleXCIStatusUntrimmableLabel": "Recortado",
|
||||||
"TitleXCIStatusFailedLabel": "(Failed)",
|
"TitleXCIStatusFailedLabel": "(Fallido)",
|
||||||
"TitleXCICanSaveLabel": "Save {0:n0} Mb",
|
"TitleXCICanSaveLabel": "Ahorra {0:n0} Mb",
|
||||||
"TitleXCISavingLabel": "Saved {0:n0} Mb",
|
"TitleXCISavingLabel": "{0:n0} Mb ahorrado(s)",
|
||||||
"RyujinxInfo": "Ryujinx - Info",
|
"RyujinxInfo": "Ryujinx - Info",
|
||||||
"RyujinxConfirm": "Ryujinx - Confirmación",
|
"RyujinxConfirm": "Ryujinx - Confirmación",
|
||||||
"FileDialogAllTypes": "Todos los tipos",
|
"FileDialogAllTypes": "Todos los tipos",
|
||||||
"Never": "Nunca",
|
"Never": "Nunca",
|
||||||
"SwkbdMinCharacters": "Debe tener al menos {0} caracteres",
|
"SwkbdMinCharacters": "Debe tener al menos {0} caracteres",
|
||||||
"SwkbdMinRangeCharacters": "Debe tener {0}-{1} caracteres",
|
"SwkbdMinRangeCharacters": "Debe tener {0}-{1} caracteres",
|
||||||
|
"CabinetTitle": "Diálogo Gabinete",
|
||||||
|
"CabinetDialog": "Ingresa el nuevo nombre de tu Amiibo",
|
||||||
|
"CabinetScanDialog": "Escanea tu Amiibo ahora.",
|
||||||
"SoftwareKeyboard": "Teclado de software",
|
"SoftwareKeyboard": "Teclado de software",
|
||||||
"SoftwareKeyboardModeNumeric": "Debe ser sólo 0-9 o '.'",
|
"SoftwareKeyboardModeNumeric": "Debe ser sólo 0-9 o '.'",
|
||||||
"SoftwareKeyboardModeAlphabet": "Solo deben ser caracteres no CJK",
|
"SoftwareKeyboardModeAlphabet": "Solo deben ser caracteres no CJK",
|
||||||
@@ -705,7 +718,6 @@
|
|||||||
"UpdaterAddingFiles": "Añadiendo nuevos archivos...",
|
"UpdaterAddingFiles": "Añadiendo nuevos archivos...",
|
||||||
"UpdaterExtracting": "Extrayendo actualización...",
|
"UpdaterExtracting": "Extrayendo actualización...",
|
||||||
"UpdaterDownloading": "Descargando actualización...",
|
"UpdaterDownloading": "Descargando actualización...",
|
||||||
"Game": "Juego",
|
|
||||||
"Docked": "Dock/TV",
|
"Docked": "Dock/TV",
|
||||||
"Handheld": "Portátil",
|
"Handheld": "Portátil",
|
||||||
"ConnectionError": "Error de conexión.",
|
"ConnectionError": "Error de conexión.",
|
||||||
@@ -738,39 +750,39 @@
|
|||||||
"SelectDlcDialogTitle": "Selecciona archivo(s) de DLC",
|
"SelectDlcDialogTitle": "Selecciona archivo(s) de DLC",
|
||||||
"SelectUpdateDialogTitle": "Selecciona archivo(s) de actualización",
|
"SelectUpdateDialogTitle": "Selecciona archivo(s) de actualización",
|
||||||
"SelectModDialogTitle": "Seleccionar un directorio de Mods",
|
"SelectModDialogTitle": "Seleccionar un directorio de Mods",
|
||||||
"TrimXCIFileDialogTitle": "Check and Trim XCI File",
|
"TrimXCIFileDialogTitle": "Verificar y recortar archivo XCI",
|
||||||
"TrimXCIFileDialogPrimaryText": "This function will first check the empty space and then trim the XCI File to save disk space.",
|
"TrimXCIFileDialogPrimaryText": "Esta función verificará el espacio vacío y después recortará el archivo XCI para ahorrar espacio en disco",
|
||||||
"TrimXCIFileDialogSecondaryText": "Current File Size: {0:n} MB\nGame Data Size: {1:n} MB\nDisk Space Savings: {2:n} MB",
|
"TrimXCIFileDialogSecondaryText": "Tamaño de archivo actual: {0:n} MB\nTamaño de datos de juego: {1:n} MB\nAhorro de espacio en disco: {2:n} MB",
|
||||||
"TrimXCIFileNoTrimNecessary": "XCI File does not need to be trimmed. Check logs for further details",
|
"TrimXCIFileNoTrimNecessary": "El archivo XCI no necesita ser recortado. Verifica los logs para más detalles.",
|
||||||
"TrimXCIFileNoUntrimPossible": "XCI File cannot be untrimmed. Check logs for further details",
|
"TrimXCIFileNoUntrimPossible": "El recorte del archivo XCI no puede ser deshecho. Verifica los registros para más detalles.",
|
||||||
"TrimXCIFileReadOnlyFileCannotFix": "XCI File is Read Only and could not be made writable. Check logs for further details",
|
"TrimXCIFileReadOnlyFileCannotFix": "El archivo XCI es de solo Lectura y no se le puede escribir. Lee el registro para más información.",
|
||||||
"TrimXCIFileFileSizeChanged": "XCI File has changed in size since it was scanned. Please check the file is not being written to and try again.",
|
"TrimXCIFileFileSizeChanged": "El archivo XCI ha cambiado de tamaño desde que fue escaneado. Verifica que no se esté escribiendo al archivo y vuelve a intentarlo.",
|
||||||
"TrimXCIFileFreeSpaceCheckFailed": "XCI File has data in the free space area, it is not safe to trim",
|
"TrimXCIFileFreeSpaceCheckFailed": "El archivo XCI tiene datos en el área de espacio libre, no es seguro recortar.",
|
||||||
"TrimXCIFileInvalidXCIFile": "XCI File contains invalid data. Check logs for further details",
|
"TrimXCIFileInvalidXCIFile": "El archivo XCI contiene datos inválidos. Lee el registro para más información.",
|
||||||
"TrimXCIFileFileIOWriteError": "XCI File could not be opened for writing. Check logs for further details",
|
"TrimXCIFileFileIOWriteError": "El archivo XCI no se puede abrir para escribirlo. Lee el registro para más información.",
|
||||||
"TrimXCIFileFailedPrimaryText": "Trimming of the XCI file failed",
|
"TrimXCIFileFailedPrimaryText": "El recorte del archivo XCI falló",
|
||||||
"TrimXCIFileCancelled": "The operation was cancelled",
|
"TrimXCIFileCancelled": "La operación fue cancelada",
|
||||||
"TrimXCIFileFileUndertermined": "No operation was performed",
|
"TrimXCIFileFileUndertermined": "No se realizó ninguna operación",
|
||||||
"UserProfileWindowTitle": "Administrar perfiles de usuario",
|
"UserProfileWindowTitle": "Administrar perfiles de usuario",
|
||||||
"CheatWindowTitle": "Administrar cheats",
|
"CheatWindowTitle": "Administrar cheats",
|
||||||
"DlcWindowTitle": "Administrar contenido descargable",
|
"DlcWindowTitle": "Administrar contenido descargable",
|
||||||
"ModWindowTitle": "Administrar Mods para {0} ({1})",
|
"ModWindowTitle": "Administrar Mods para {0} ({1})",
|
||||||
"UpdateWindowTitle": "Administrar actualizaciones",
|
"UpdateWindowTitle": "Administrar actualizaciones",
|
||||||
"XCITrimmerWindowTitle": "XCI File Trimmer",
|
"XCITrimmerWindowTitle": "Recortador de archivos XCI",
|
||||||
"XCITrimmerTitleStatusCount": "{0} of {1} Title(s) Selected",
|
"XCITrimmerTitleStatusCount": "{0} de {1} Título(s) seleccionado(s)",
|
||||||
"XCITrimmerTitleStatusCountWithFilter": "{0} of {1} Title(s) Selected ({2} displayed)",
|
"XCITrimmerTitleStatusCountWithFilter": "{0} de {1} Título(s) seleccionado(s) ({2} mostrado(s))",
|
||||||
"XCITrimmerTitleStatusTrimming": "Trimming {0} Title(s)...",
|
"XCITrimmerTitleStatusTrimming": "Recortando {0} Título(s)...",
|
||||||
"XCITrimmerTitleStatusUntrimming": "Untrimming {0} Title(s)...",
|
"XCITrimmerTitleStatusUntrimming": "Deshaciendo recorte de {0} Título(s)...",
|
||||||
"XCITrimmerTitleStatusFailed": "Failed",
|
"XCITrimmerTitleStatusFailed": "Fallido",
|
||||||
"XCITrimmerPotentialSavings": "Potential Savings",
|
"XCITrimmerPotentialSavings": "Ahorro potencial",
|
||||||
"XCITrimmerActualSavings": "Actual Savings",
|
"XCITrimmerActualSavings": "Ahorro real",
|
||||||
"XCITrimmerSavingsMb": "{0:n0} Mb",
|
"XCITrimmerSavingsMb": "{0:n0} Mb",
|
||||||
"XCITrimmerSelectDisplayed": "Select Shown",
|
"XCITrimmerSelectDisplayed": "Seleccionar mostrado(s)",
|
||||||
"XCITrimmerDeselectDisplayed": "Deselect Shown",
|
"XCITrimmerDeselectDisplayed": "Deseleccionar mostrado(s)",
|
||||||
"XCITrimmerSortName": "Title",
|
"XCITrimmerSortName": "Título",
|
||||||
"XCITrimmerSortSaved": "Space Savings",
|
"XCITrimmerSortSaved": "Ahorro de espacio",
|
||||||
"XCITrimmerTrim": "Trim",
|
"XCITrimmerTrim": "Recortar",
|
||||||
"XCITrimmerUntrim": "Untrim",
|
"XCITrimmerUntrim": "Deshacer recorte",
|
||||||
"UpdateWindowUpdateAddedMessage": "{0} nueva(s) actualización(es) agregada(s)",
|
"UpdateWindowUpdateAddedMessage": "{0} nueva(s) actualización(es) agregada(s)",
|
||||||
"UpdateWindowBundledContentNotice": "Las actualizaciones agrupadas no pueden ser eliminadas, solamente deshabilitadas.",
|
"UpdateWindowBundledContentNotice": "Las actualizaciones agrupadas no pueden ser eliminadas, solamente deshabilitadas.",
|
||||||
"CheatWindowHeading": "Cheats disponibles para {0} [{1}]",
|
"CheatWindowHeading": "Cheats disponibles para {0} [{1}]",
|
||||||
@@ -783,7 +795,7 @@
|
|||||||
"AutoloadUpdateRemovedMessage": "Se eliminaron {0} actualización(es) faltantes",
|
"AutoloadUpdateRemovedMessage": "Se eliminaron {0} actualización(es) faltantes",
|
||||||
"ModWindowHeading": "{0} Mod(s)",
|
"ModWindowHeading": "{0} Mod(s)",
|
||||||
"UserProfilesEditProfile": "Editar selección",
|
"UserProfilesEditProfile": "Editar selección",
|
||||||
"Continue": "Continue",
|
"Continue": "Continuar",
|
||||||
"Cancel": "Cancelar",
|
"Cancel": "Cancelar",
|
||||||
"Save": "Guardar",
|
"Save": "Guardar",
|
||||||
"Discard": "Descartar",
|
"Discard": "Descartar",
|
||||||
|
@@ -31,6 +31,9 @@
|
|||||||
"MenuBarToolsInstallFirmware": "Installer un firmware",
|
"MenuBarToolsInstallFirmware": "Installer un firmware",
|
||||||
"MenuBarFileToolsInstallFirmwareFromFile": "Installer un firmware depuis un fichier XCI ou ZIP",
|
"MenuBarFileToolsInstallFirmwareFromFile": "Installer un firmware depuis un fichier XCI ou ZIP",
|
||||||
"MenuBarFileToolsInstallFirmwareFromDirectory": "Installer un firmware depuis un dossier",
|
"MenuBarFileToolsInstallFirmwareFromDirectory": "Installer un firmware depuis un dossier",
|
||||||
|
"MenuBarToolsInstallKeys": "Install Keys",
|
||||||
|
"MenuBarFileToolsInstallKeysFromFile": "Install keys from KEYS or ZIP",
|
||||||
|
"MenuBarFileToolsInstallKeysFromFolder": "Install keys from a directory",
|
||||||
"MenuBarToolsManageFileTypes": "Gérer les types de fichiers",
|
"MenuBarToolsManageFileTypes": "Gérer les types de fichiers",
|
||||||
"MenuBarToolsInstallFileTypes": "Installer les types de fichiers",
|
"MenuBarToolsInstallFileTypes": "Installer les types de fichiers",
|
||||||
"MenuBarToolsUninstallFileTypes": "Désinstaller les types de fichiers",
|
"MenuBarToolsUninstallFileTypes": "Désinstaller les types de fichiers",
|
||||||
@@ -506,6 +509,13 @@
|
|||||||
"DialogFirmwareInstallerFirmwareInstallConfirmMessage": "\n\nVoulez-vous continuer ?",
|
"DialogFirmwareInstallerFirmwareInstallConfirmMessage": "\n\nVoulez-vous continuer ?",
|
||||||
"DialogFirmwareInstallerFirmwareInstallWaitMessage": "Installation du firmware...",
|
"DialogFirmwareInstallerFirmwareInstallWaitMessage": "Installation du firmware...",
|
||||||
"DialogFirmwareInstallerFirmwareInstallSuccessMessage": "Version du système {0} installée avec succès.",
|
"DialogFirmwareInstallerFirmwareInstallSuccessMessage": "Version du système {0} installée avec succès.",
|
||||||
|
"DialogKeysInstallerKeysNotFoundErrorMessage": "An invalid Keys file was found in {0}",
|
||||||
|
"DialogKeysInstallerKeysInstallTitle": "Install Keys",
|
||||||
|
"DialogKeysInstallerKeysInstallMessage": "New Keys file will be installed.",
|
||||||
|
"DialogKeysInstallerKeysInstallSubMessage": "\n\nThis may replace some of the current installed Keys.",
|
||||||
|
"DialogKeysInstallerKeysInstallConfirmMessage": "\n\nDo you want to continue?",
|
||||||
|
"DialogKeysInstallerKeysInstallWaitMessage": "Installing Keys...",
|
||||||
|
"DialogKeysInstallerKeysInstallSuccessMessage": "New Keys file successfully installed.",
|
||||||
"DialogUserProfileDeletionWarningMessage": "Il n'y aurait aucun autre profil à ouvrir si le profil sélectionné est supprimé",
|
"DialogUserProfileDeletionWarningMessage": "Il n'y aurait aucun autre profil à ouvrir si le profil sélectionné est supprimé",
|
||||||
"DialogUserProfileDeletionConfirmMessage": "Voulez-vous supprimer le profil sélectionné ?",
|
"DialogUserProfileDeletionConfirmMessage": "Voulez-vous supprimer le profil sélectionné ?",
|
||||||
"DialogUserProfileUnsavedChangesTitle": "Avertissement - Modifications non enregistrées",
|
"DialogUserProfileUnsavedChangesTitle": "Avertissement - Modifications non enregistrées",
|
||||||
@@ -692,6 +702,9 @@
|
|||||||
"Never": "Jamais",
|
"Never": "Jamais",
|
||||||
"SwkbdMinCharacters": "Doit comporter au moins {0} caractères",
|
"SwkbdMinCharacters": "Doit comporter au moins {0} caractères",
|
||||||
"SwkbdMinRangeCharacters": "Doit comporter entre {0} et {1} caractères",
|
"SwkbdMinRangeCharacters": "Doit comporter entre {0} et {1} caractères",
|
||||||
|
"CabinetTitle": "Cabinet Dialog",
|
||||||
|
"CabinetDialog": "Enter your Amiibo's new name",
|
||||||
|
"CabinetScanDialog": "Please scan your Amiibo now.",
|
||||||
"SoftwareKeyboard": "Clavier logiciel",
|
"SoftwareKeyboard": "Clavier logiciel",
|
||||||
"SoftwareKeyboardModeNumeric": "Doit être 0-9 ou '.' uniquement",
|
"SoftwareKeyboardModeNumeric": "Doit être 0-9 ou '.' uniquement",
|
||||||
"SoftwareKeyboardModeAlphabet": "Doit être uniquement des caractères non CJK",
|
"SoftwareKeyboardModeAlphabet": "Doit être uniquement des caractères non CJK",
|
||||||
@@ -705,7 +718,6 @@
|
|||||||
"UpdaterAddingFiles": "Ajout des nouveaux fichiers...",
|
"UpdaterAddingFiles": "Ajout des nouveaux fichiers...",
|
||||||
"UpdaterExtracting": "Extraction de la mise à jour…",
|
"UpdaterExtracting": "Extraction de la mise à jour…",
|
||||||
"UpdaterDownloading": "Téléchargement de la mise à jour...",
|
"UpdaterDownloading": "Téléchargement de la mise à jour...",
|
||||||
"Game": "Jeu",
|
|
||||||
"Docked": "Mode station d'accueil",
|
"Docked": "Mode station d'accueil",
|
||||||
"Handheld": "Mode Portable",
|
"Handheld": "Mode Portable",
|
||||||
"ConnectionError": "Erreur de connexion.",
|
"ConnectionError": "Erreur de connexion.",
|
||||||
|
@@ -31,6 +31,9 @@
|
|||||||
"MenuBarToolsInstallFirmware": "התקן קושחה",
|
"MenuBarToolsInstallFirmware": "התקן קושחה",
|
||||||
"MenuBarFileToolsInstallFirmwareFromFile": "התקן קושחה מקובץ- ZIP/XCI",
|
"MenuBarFileToolsInstallFirmwareFromFile": "התקן קושחה מקובץ- ZIP/XCI",
|
||||||
"MenuBarFileToolsInstallFirmwareFromDirectory": "התקן קושחה מתוך תקייה",
|
"MenuBarFileToolsInstallFirmwareFromDirectory": "התקן קושחה מתוך תקייה",
|
||||||
|
"MenuBarToolsInstallKeys": "Install Keys",
|
||||||
|
"MenuBarFileToolsInstallKeysFromFile": "Install keys from KEYS or ZIP",
|
||||||
|
"MenuBarFileToolsInstallKeysFromFolder": "Install keys from a directory",
|
||||||
"MenuBarToolsManageFileTypes": "ניהול סוגי קבצים",
|
"MenuBarToolsManageFileTypes": "ניהול סוגי קבצים",
|
||||||
"MenuBarToolsInstallFileTypes": "סוגי קבצי התקנה",
|
"MenuBarToolsInstallFileTypes": "סוגי קבצי התקנה",
|
||||||
"MenuBarToolsUninstallFileTypes": "סוגי קבצי הסרה",
|
"MenuBarToolsUninstallFileTypes": "סוגי קבצי הסרה",
|
||||||
@@ -506,6 +509,13 @@
|
|||||||
"DialogFirmwareInstallerFirmwareInstallConfirmMessage": "\n\nהאם ברצונך להמשיך?",
|
"DialogFirmwareInstallerFirmwareInstallConfirmMessage": "\n\nהאם ברצונך להמשיך?",
|
||||||
"DialogFirmwareInstallerFirmwareInstallWaitMessage": "מתקין קושחה...",
|
"DialogFirmwareInstallerFirmwareInstallWaitMessage": "מתקין קושחה...",
|
||||||
"DialogFirmwareInstallerFirmwareInstallSuccessMessage": "גרסת המערכת {0} הותקנה בהצלחה.",
|
"DialogFirmwareInstallerFirmwareInstallSuccessMessage": "גרסת המערכת {0} הותקנה בהצלחה.",
|
||||||
|
"DialogKeysInstallerKeysNotFoundErrorMessage": "An invalid Keys file was found in {0}",
|
||||||
|
"DialogKeysInstallerKeysInstallTitle": "Install Keys",
|
||||||
|
"DialogKeysInstallerKeysInstallMessage": "New Keys file will be installed.",
|
||||||
|
"DialogKeysInstallerKeysInstallSubMessage": "\n\nThis may replace some of the current installed Keys.",
|
||||||
|
"DialogKeysInstallerKeysInstallConfirmMessage": "\n\nDo you want to continue?",
|
||||||
|
"DialogKeysInstallerKeysInstallWaitMessage": "Installing Keys...",
|
||||||
|
"DialogKeysInstallerKeysInstallSuccessMessage": "New Keys file successfully installed.",
|
||||||
"DialogUserProfileDeletionWarningMessage": "לא יהיו פרופילים אחרים שייפתחו אם הפרופיל שנבחר יימחק",
|
"DialogUserProfileDeletionWarningMessage": "לא יהיו פרופילים אחרים שייפתחו אם הפרופיל שנבחר יימחק",
|
||||||
"DialogUserProfileDeletionConfirmMessage": "האם ברצונך למחוק את הפרופיל שנבחר",
|
"DialogUserProfileDeletionConfirmMessage": "האם ברצונך למחוק את הפרופיל שנבחר",
|
||||||
"DialogUserProfileUnsavedChangesTitle": "אזהרה - שינויים לא שמורים",
|
"DialogUserProfileUnsavedChangesTitle": "אזהרה - שינויים לא שמורים",
|
||||||
@@ -692,6 +702,9 @@
|
|||||||
"Never": "אף פעם",
|
"Never": "אף פעם",
|
||||||
"SwkbdMinCharacters": "לפחות {0} תווים",
|
"SwkbdMinCharacters": "לפחות {0} תווים",
|
||||||
"SwkbdMinRangeCharacters": "באורך {0}-{1} תווים",
|
"SwkbdMinRangeCharacters": "באורך {0}-{1} תווים",
|
||||||
|
"CabinetTitle": "Cabinet Dialog",
|
||||||
|
"CabinetDialog": "Enter your Amiibo's new name",
|
||||||
|
"CabinetScanDialog": "Please scan your Amiibo now.",
|
||||||
"SoftwareKeyboard": "מקלדת וירטואלית",
|
"SoftwareKeyboard": "מקלדת וירטואלית",
|
||||||
"SoftwareKeyboardModeNumeric": "חייב להיות בין 0-9 או '.' בלבד",
|
"SoftwareKeyboardModeNumeric": "חייב להיות בין 0-9 או '.' בלבד",
|
||||||
"SoftwareKeyboardModeAlphabet": "מחויב להיות ללא אותיות CJK",
|
"SoftwareKeyboardModeAlphabet": "מחויב להיות ללא אותיות CJK",
|
||||||
@@ -705,7 +718,6 @@
|
|||||||
"UpdaterAddingFiles": "מוסיף קבצים חדשים...",
|
"UpdaterAddingFiles": "מוסיף קבצים חדשים...",
|
||||||
"UpdaterExtracting": "מחלץ עדכון...",
|
"UpdaterExtracting": "מחלץ עדכון...",
|
||||||
"UpdaterDownloading": "מוריד עדכון...",
|
"UpdaterDownloading": "מוריד עדכון...",
|
||||||
"Game": "משחק",
|
|
||||||
"Docked": "בתחנת עגינה",
|
"Docked": "בתחנת עגינה",
|
||||||
"Handheld": "נייד",
|
"Handheld": "נייד",
|
||||||
"ConnectionError": "שגיאת חיבור",
|
"ConnectionError": "שגיאת חיבור",
|
||||||
|
@@ -28,6 +28,9 @@
|
|||||||
"MenuBarToolsInstallFirmware": "Installa firmware",
|
"MenuBarToolsInstallFirmware": "Installa firmware",
|
||||||
"MenuBarFileToolsInstallFirmwareFromFile": "Installa un firmware da file XCI o ZIP",
|
"MenuBarFileToolsInstallFirmwareFromFile": "Installa un firmware da file XCI o ZIP",
|
||||||
"MenuBarFileToolsInstallFirmwareFromDirectory": "Installa un firmare da una cartella",
|
"MenuBarFileToolsInstallFirmwareFromDirectory": "Installa un firmare da una cartella",
|
||||||
|
"MenuBarToolsInstallKeys": "Installa Chiavi",
|
||||||
|
"MenuBarFileToolsInstallKeysFromFile": "Installa Chiavi da file KEYS o ZIP",
|
||||||
|
"MenuBarFileToolsInstallKeysFromFolder": "Installa Chiavi da una Cartella",
|
||||||
"MenuBarToolsManageFileTypes": "Gestisci i tipi di file",
|
"MenuBarToolsManageFileTypes": "Gestisci i tipi di file",
|
||||||
"MenuBarToolsInstallFileTypes": "Installa i tipi di file",
|
"MenuBarToolsInstallFileTypes": "Installa i tipi di file",
|
||||||
"MenuBarToolsUninstallFileTypes": "Disinstalla i tipi di file",
|
"MenuBarToolsUninstallFileTypes": "Disinstalla i tipi di file",
|
||||||
@@ -506,6 +509,13 @@
|
|||||||
"DialogFirmwareInstallerFirmwareInstallConfirmMessage": "\n\nVuoi continuare?",
|
"DialogFirmwareInstallerFirmwareInstallConfirmMessage": "\n\nVuoi continuare?",
|
||||||
"DialogFirmwareInstallerFirmwareInstallWaitMessage": "Installazione del firmware...",
|
"DialogFirmwareInstallerFirmwareInstallWaitMessage": "Installazione del firmware...",
|
||||||
"DialogFirmwareInstallerFirmwareInstallSuccessMessage": "La versione del sistema {0} è stata installata.",
|
"DialogFirmwareInstallerFirmwareInstallSuccessMessage": "La versione del sistema {0} è stata installata.",
|
||||||
|
"DialogKeysInstallerKeysNotFoundErrorMessage": "E' stato trovato un file di chiavi invalido ' {0}",
|
||||||
|
"DialogKeysInstallerKeysInstallTitle": "Installa Chavi",
|
||||||
|
"DialogKeysInstallerKeysInstallMessage": "Un nuovo file di Chiavi sarà intallato.",
|
||||||
|
"DialogKeysInstallerKeysInstallSubMessage": "\n\nQuesto potrebbe sovrascrivere alcune delle Chiavi già installate.",
|
||||||
|
"DialogKeysInstallerKeysInstallConfirmMessage": "\n\nVuoi continuare?",
|
||||||
|
"DialogKeysInstallerKeysInstallWaitMessage": "Installando le chiavi...",
|
||||||
|
"DialogKeysInstallerKeysInstallSuccessMessage": "Nuovo file di chiavi installato con successo.",
|
||||||
"DialogUserProfileDeletionWarningMessage": "Non ci sarebbero altri profili da aprire se il profilo selezionato viene cancellato",
|
"DialogUserProfileDeletionWarningMessage": "Non ci sarebbero altri profili da aprire se il profilo selezionato viene cancellato",
|
||||||
"DialogUserProfileDeletionConfirmMessage": "Vuoi eliminare il profilo selezionato?",
|
"DialogUserProfileDeletionConfirmMessage": "Vuoi eliminare il profilo selezionato?",
|
||||||
"DialogUserProfileUnsavedChangesTitle": "Attenzione - Modifiche Non Salvate",
|
"DialogUserProfileUnsavedChangesTitle": "Attenzione - Modifiche Non Salvate",
|
||||||
@@ -692,6 +702,9 @@
|
|||||||
"Never": "Mai",
|
"Never": "Mai",
|
||||||
"SwkbdMinCharacters": "Non può avere meno di {0} caratteri",
|
"SwkbdMinCharacters": "Non può avere meno di {0} caratteri",
|
||||||
"SwkbdMinRangeCharacters": "Può avere da {0} a {1} caratteri",
|
"SwkbdMinRangeCharacters": "Può avere da {0} a {1} caratteri",
|
||||||
|
"CabinetTitle": "Cabinet Dialog",
|
||||||
|
"CabinetDialog": "Enter your Amiibo's new name",
|
||||||
|
"CabinetScanDialog": "Please scan your Amiibo now.",
|
||||||
"SoftwareKeyboard": "Tastiera software",
|
"SoftwareKeyboard": "Tastiera software",
|
||||||
"SoftwareKeyboardModeNumeric": "Deve essere solo 0-9 o '.'",
|
"SoftwareKeyboardModeNumeric": "Deve essere solo 0-9 o '.'",
|
||||||
"SoftwareKeyboardModeAlphabet": "Deve essere solo caratteri non CJK",
|
"SoftwareKeyboardModeAlphabet": "Deve essere solo caratteri non CJK",
|
||||||
@@ -705,7 +718,6 @@
|
|||||||
"UpdaterAddingFiles": "Aggiunta dei nuovi file...",
|
"UpdaterAddingFiles": "Aggiunta dei nuovi file...",
|
||||||
"UpdaterExtracting": "Estrazione dell'aggiornamento...",
|
"UpdaterExtracting": "Estrazione dell'aggiornamento...",
|
||||||
"UpdaterDownloading": "Download dell'aggiornamento...",
|
"UpdaterDownloading": "Download dell'aggiornamento...",
|
||||||
"Game": "Gioco",
|
|
||||||
"Docked": "TV",
|
"Docked": "TV",
|
||||||
"Handheld": "Portatile",
|
"Handheld": "Portatile",
|
||||||
"ConnectionError": "Errore di connessione.",
|
"ConnectionError": "Errore di connessione.",
|
||||||
|
@@ -31,6 +31,9 @@
|
|||||||
"MenuBarToolsInstallFirmware": "ファームウェアをインストール",
|
"MenuBarToolsInstallFirmware": "ファームウェアをインストール",
|
||||||
"MenuBarFileToolsInstallFirmwareFromFile": "XCI または ZIP からファームウェアをインストール",
|
"MenuBarFileToolsInstallFirmwareFromFile": "XCI または ZIP からファームウェアをインストール",
|
||||||
"MenuBarFileToolsInstallFirmwareFromDirectory": "ディレクトリからファームウェアをインストール",
|
"MenuBarFileToolsInstallFirmwareFromDirectory": "ディレクトリからファームウェアをインストール",
|
||||||
|
"MenuBarToolsInstallKeys": "Install Keys",
|
||||||
|
"MenuBarFileToolsInstallKeysFromFile": "Install keys from KEYS or ZIP",
|
||||||
|
"MenuBarFileToolsInstallKeysFromFolder": "Install keys from a directory",
|
||||||
"MenuBarToolsManageFileTypes": "ファイル形式を管理",
|
"MenuBarToolsManageFileTypes": "ファイル形式を管理",
|
||||||
"MenuBarToolsInstallFileTypes": "ファイル形式をインストール",
|
"MenuBarToolsInstallFileTypes": "ファイル形式をインストール",
|
||||||
"MenuBarToolsUninstallFileTypes": "ファイル形式をアンインストール",
|
"MenuBarToolsUninstallFileTypes": "ファイル形式をアンインストール",
|
||||||
@@ -506,6 +509,13 @@
|
|||||||
"DialogFirmwareInstallerFirmwareInstallConfirmMessage": "\n\n続けてよろしいですか?",
|
"DialogFirmwareInstallerFirmwareInstallConfirmMessage": "\n\n続けてよろしいですか?",
|
||||||
"DialogFirmwareInstallerFirmwareInstallWaitMessage": "ファームウェアをインストール中...",
|
"DialogFirmwareInstallerFirmwareInstallWaitMessage": "ファームウェアをインストール中...",
|
||||||
"DialogFirmwareInstallerFirmwareInstallSuccessMessage": "システムバージョン {0} が正常にインストールされました.",
|
"DialogFirmwareInstallerFirmwareInstallSuccessMessage": "システムバージョン {0} が正常にインストールされました.",
|
||||||
|
"DialogKeysInstallerKeysNotFoundErrorMessage": "An invalid Keys file was found in {0}",
|
||||||
|
"DialogKeysInstallerKeysInstallTitle": "Install Keys",
|
||||||
|
"DialogKeysInstallerKeysInstallMessage": "New Keys file will be installed.",
|
||||||
|
"DialogKeysInstallerKeysInstallSubMessage": "\n\nThis may replace some of the current installed Keys.",
|
||||||
|
"DialogKeysInstallerKeysInstallConfirmMessage": "\n\nDo you want to continue?",
|
||||||
|
"DialogKeysInstallerKeysInstallWaitMessage": "Installing Keys...",
|
||||||
|
"DialogKeysInstallerKeysInstallSuccessMessage": "New Keys file successfully installed.",
|
||||||
"DialogUserProfileDeletionWarningMessage": "選択されたプロファイルを削除すると,プロファイルがひとつも存在しなくなります",
|
"DialogUserProfileDeletionWarningMessage": "選択されたプロファイルを削除すると,プロファイルがひとつも存在しなくなります",
|
||||||
"DialogUserProfileDeletionConfirmMessage": "選択されたプロファイルを削除しますか",
|
"DialogUserProfileDeletionConfirmMessage": "選択されたプロファイルを削除しますか",
|
||||||
"DialogUserProfileUnsavedChangesTitle": "警告 - 保存されていない変更",
|
"DialogUserProfileUnsavedChangesTitle": "警告 - 保存されていない変更",
|
||||||
@@ -692,6 +702,9 @@
|
|||||||
"Never": "決して",
|
"Never": "決して",
|
||||||
"SwkbdMinCharacters": "最低 {0} 文字必要です",
|
"SwkbdMinCharacters": "最低 {0} 文字必要です",
|
||||||
"SwkbdMinRangeCharacters": "{0}-{1} 文字にしてください",
|
"SwkbdMinRangeCharacters": "{0}-{1} 文字にしてください",
|
||||||
|
"CabinetTitle": "Cabinet Dialog",
|
||||||
|
"CabinetDialog": "Enter your Amiibo's new name",
|
||||||
|
"CabinetScanDialog": "Please scan your Amiibo now.",
|
||||||
"SoftwareKeyboard": "ソフトウェアキーボード",
|
"SoftwareKeyboard": "ソフトウェアキーボード",
|
||||||
"SoftwareKeyboardModeNumeric": "0-9 または '.' のみでなければなりません",
|
"SoftwareKeyboardModeNumeric": "0-9 または '.' のみでなければなりません",
|
||||||
"SoftwareKeyboardModeAlphabet": "CJK文字以外のみ",
|
"SoftwareKeyboardModeAlphabet": "CJK文字以外のみ",
|
||||||
@@ -705,7 +718,6 @@
|
|||||||
"UpdaterAddingFiles": "新規ファイルを追加中...",
|
"UpdaterAddingFiles": "新規ファイルを追加中...",
|
||||||
"UpdaterExtracting": "アップデートを展開中...",
|
"UpdaterExtracting": "アップデートを展開中...",
|
||||||
"UpdaterDownloading": "アップデートをダウンロード中...",
|
"UpdaterDownloading": "アップデートをダウンロード中...",
|
||||||
"Game": "ゲーム",
|
|
||||||
"Docked": "ドッキング",
|
"Docked": "ドッキング",
|
||||||
"Handheld": "携帯",
|
"Handheld": "携帯",
|
||||||
"ConnectionError": "接続エラー.",
|
"ConnectionError": "接続エラー.",
|
||||||
|
@@ -1,7 +1,7 @@
|
|||||||
{
|
{
|
||||||
"Language": "한국어",
|
"Language": "한국어",
|
||||||
"MenuBarFileOpenApplet": "애플릿 열기",
|
"MenuBarFileOpenApplet": "애플릿 열기",
|
||||||
"MenuBarFileOpenAppletOpenMiiApplet": "Mii Edit Applet",
|
"MenuBarFileOpenAppletOpenMiiApplet": "Mii 편집 애플릿",
|
||||||
"MenuBarFileOpenAppletOpenMiiAppletToolTip": "독립 실행형 모드로 Mii 편집기 애플릿 열기",
|
"MenuBarFileOpenAppletOpenMiiAppletToolTip": "독립 실행형 모드로 Mii 편집기 애플릿 열기",
|
||||||
"SettingsTabInputDirectMouseAccess": "마우스 직접 접근",
|
"SettingsTabInputDirectMouseAccess": "마우스 직접 접근",
|
||||||
"SettingsTabSystemMemoryManagerMode": "메모리 관리자 모드 :",
|
"SettingsTabSystemMemoryManagerMode": "메모리 관리자 모드 :",
|
||||||
@@ -31,6 +31,9 @@
|
|||||||
"MenuBarToolsInstallFirmware": "펌웨어 설치",
|
"MenuBarToolsInstallFirmware": "펌웨어 설치",
|
||||||
"MenuBarFileToolsInstallFirmwareFromFile": "XCI 또는 ZIP으로 펌웨어 설치",
|
"MenuBarFileToolsInstallFirmwareFromFile": "XCI 또는 ZIP으로 펌웨어 설치",
|
||||||
"MenuBarFileToolsInstallFirmwareFromDirectory": "디렉터리에서 펌웨어 설치",
|
"MenuBarFileToolsInstallFirmwareFromDirectory": "디렉터리에서 펌웨어 설치",
|
||||||
|
"MenuBarToolsInstallKeys": "설치 키",
|
||||||
|
"MenuBarFileToolsInstallKeysFromFile": "키나 ZIP에서 키 설치",
|
||||||
|
"MenuBarFileToolsInstallKeysFromFolder": "디렉터리에서 키 설치",
|
||||||
"MenuBarToolsManageFileTypes": "파일 형식 관리",
|
"MenuBarToolsManageFileTypes": "파일 형식 관리",
|
||||||
"MenuBarToolsInstallFileTypes": "파일 형식 설치",
|
"MenuBarToolsInstallFileTypes": "파일 형식 설치",
|
||||||
"MenuBarToolsUninstallFileTypes": "파일 형식 제거",
|
"MenuBarToolsUninstallFileTypes": "파일 형식 제거",
|
||||||
@@ -481,7 +484,7 @@
|
|||||||
"DialogControllerAppletTitle": "컨트롤러 애플릿",
|
"DialogControllerAppletTitle": "컨트롤러 애플릿",
|
||||||
"DialogMessageDialogErrorExceptionMessage": "메시지 대화 상자 표시 오류 : {0}",
|
"DialogMessageDialogErrorExceptionMessage": "메시지 대화 상자 표시 오류 : {0}",
|
||||||
"DialogSoftwareKeyboardErrorExceptionMessage": "소프트웨어 키보드 표시 오류 : {0}",
|
"DialogSoftwareKeyboardErrorExceptionMessage": "소프트웨어 키보드 표시 오류 : {0}",
|
||||||
"DialogErrorAppletErrorExceptionMessage": "ErrorApplet 대화 상자 표시 오류 : {0}",
|
"DialogErrorAppletErrorExceptionMessage": "애플릿 오류류 대화 상자 표시 오류 : {0}",
|
||||||
"DialogUserErrorDialogMessage": "{0}: {1}",
|
"DialogUserErrorDialogMessage": "{0}: {1}",
|
||||||
"DialogUserErrorDialogInfoMessage": "\n이 오류를 해결하는 방법에 대한 자세한 내용은 설정 가이드를 참조하세요.",
|
"DialogUserErrorDialogInfoMessage": "\n이 오류를 해결하는 방법에 대한 자세한 내용은 설정 가이드를 참조하세요.",
|
||||||
"DialogUserErrorDialogTitle": "Ryujinx 오류 ({0})",
|
"DialogUserErrorDialogTitle": "Ryujinx 오류 ({0})",
|
||||||
@@ -506,6 +509,13 @@
|
|||||||
"DialogFirmwareInstallerFirmwareInstallConfirmMessage": "\n\n계속하시겠습니까?",
|
"DialogFirmwareInstallerFirmwareInstallConfirmMessage": "\n\n계속하시겠습니까?",
|
||||||
"DialogFirmwareInstallerFirmwareInstallWaitMessage": "펌웨어 설치 중...",
|
"DialogFirmwareInstallerFirmwareInstallWaitMessage": "펌웨어 설치 중...",
|
||||||
"DialogFirmwareInstallerFirmwareInstallSuccessMessage": "시스템 버전 {0}이(가) 설치되었습니다.",
|
"DialogFirmwareInstallerFirmwareInstallSuccessMessage": "시스템 버전 {0}이(가) 설치되었습니다.",
|
||||||
|
"DialogKeysInstallerKeysNotFoundErrorMessage": "{0}에서 잘못된 키 파일이 발견",
|
||||||
|
"DialogKeysInstallerKeysInstallTitle": "설치 키",
|
||||||
|
"DialogKeysInstallerKeysInstallMessage": "새로운 키 파일이 설치됩니다.",
|
||||||
|
"DialogKeysInstallerKeysInstallSubMessage": "\n\n이로 인해 현재 설치된 키 중 일부가 대체될 수 있습니다.",
|
||||||
|
"DialogKeysInstallerKeysInstallConfirmMessage": "\n\n계속하시겠습니까?",
|
||||||
|
"DialogKeysInstallerKeysInstallWaitMessage": "키 설치 중...",
|
||||||
|
"DialogKeysInstallerKeysInstallSuccessMessage": "새로운 키 파일이 성공적으로 설치되었습니다.",
|
||||||
"DialogUserProfileDeletionWarningMessage": "선택한 프로필을 삭제하면 다른 프로필을 열 수 없음",
|
"DialogUserProfileDeletionWarningMessage": "선택한 프로필을 삭제하면 다른 프로필을 열 수 없음",
|
||||||
"DialogUserProfileDeletionConfirmMessage": "선택한 프로필을 삭제하시겠습니까?",
|
"DialogUserProfileDeletionConfirmMessage": "선택한 프로필을 삭제하시겠습니까?",
|
||||||
"DialogUserProfileUnsavedChangesTitle": "경고 - 저장되지 않은 변경 사항",
|
"DialogUserProfileUnsavedChangesTitle": "경고 - 저장되지 않은 변경 사항",
|
||||||
@@ -692,6 +702,9 @@
|
|||||||
"Never": "절대 안 함",
|
"Never": "절대 안 함",
|
||||||
"SwkbdMinCharacters": "{0}자 이상이어야 함",
|
"SwkbdMinCharacters": "{0}자 이상이어야 함",
|
||||||
"SwkbdMinRangeCharacters": "{0}-{1}자 길이여야 함",
|
"SwkbdMinRangeCharacters": "{0}-{1}자 길이여야 함",
|
||||||
|
"CabinetTitle": "캐비닛 대화 상자",
|
||||||
|
"CabinetDialog": "Amiibo의 새 이름 입력하기",
|
||||||
|
"CabinetScanDialog": "지금 Amiibo를 스캔하세요.",
|
||||||
"SoftwareKeyboard": "소프트웨어 키보드",
|
"SoftwareKeyboard": "소프트웨어 키보드",
|
||||||
"SoftwareKeyboardModeNumeric": "0-9 또는 '.'만 가능",
|
"SoftwareKeyboardModeNumeric": "0-9 또는 '.'만 가능",
|
||||||
"SoftwareKeyboardModeAlphabet": "CJK 문자가 아닌 문자만 가능",
|
"SoftwareKeyboardModeAlphabet": "CJK 문자가 아닌 문자만 가능",
|
||||||
@@ -705,7 +718,6 @@
|
|||||||
"UpdaterAddingFiles": "새 파일 추가...",
|
"UpdaterAddingFiles": "새 파일 추가...",
|
||||||
"UpdaterExtracting": "업데이트 추출...",
|
"UpdaterExtracting": "업데이트 추출...",
|
||||||
"UpdaterDownloading": "업데이트 내려받기 중...",
|
"UpdaterDownloading": "업데이트 내려받기 중...",
|
||||||
"Game": "게임",
|
|
||||||
"Docked": "도킹",
|
"Docked": "도킹",
|
||||||
"Handheld": "휴대",
|
"Handheld": "휴대",
|
||||||
"ConnectionError": "연결 오류가 발생했습니다.",
|
"ConnectionError": "연결 오류가 발생했습니다.",
|
||||||
@@ -769,8 +781,8 @@
|
|||||||
"XCITrimmerDeselectDisplayed": "표시됨 선택 취소",
|
"XCITrimmerDeselectDisplayed": "표시됨 선택 취소",
|
||||||
"XCITrimmerSortName": "타이틀",
|
"XCITrimmerSortName": "타이틀",
|
||||||
"XCITrimmerSortSaved": "공간 절약s",
|
"XCITrimmerSortSaved": "공간 절약s",
|
||||||
"XCITrimmerTrim": "Trim",
|
"XCITrimmerTrim": "트림",
|
||||||
"XCITrimmerUntrim": "Untrim",
|
"XCITrimmerUntrim": "언트림",
|
||||||
"UpdateWindowUpdateAddedMessage": "{0}개의 새 업데이트가 추가됨",
|
"UpdateWindowUpdateAddedMessage": "{0}개의 새 업데이트가 추가됨",
|
||||||
"UpdateWindowBundledContentNotice": "번들 업데이트는 제거할 수 없으며, 비활성화만 가능합니다.",
|
"UpdateWindowBundledContentNotice": "번들 업데이트는 제거할 수 없으며, 비활성화만 가능합니다.",
|
||||||
"CheatWindowHeading": "{0} [{1}]에 사용 가능한 치트",
|
"CheatWindowHeading": "{0} [{1}]에 사용 가능한 치트",
|
||||||
|
@@ -31,6 +31,9 @@
|
|||||||
"MenuBarToolsInstallFirmware": "Zainstaluj oprogramowanie",
|
"MenuBarToolsInstallFirmware": "Zainstaluj oprogramowanie",
|
||||||
"MenuBarFileToolsInstallFirmwareFromFile": "Zainstaluj oprogramowanie z XCI lub ZIP",
|
"MenuBarFileToolsInstallFirmwareFromFile": "Zainstaluj oprogramowanie z XCI lub ZIP",
|
||||||
"MenuBarFileToolsInstallFirmwareFromDirectory": "Zainstaluj oprogramowanie z katalogu",
|
"MenuBarFileToolsInstallFirmwareFromDirectory": "Zainstaluj oprogramowanie z katalogu",
|
||||||
|
"MenuBarToolsInstallKeys": "Install Keys",
|
||||||
|
"MenuBarFileToolsInstallKeysFromFile": "Install keys from KEYS or ZIP",
|
||||||
|
"MenuBarFileToolsInstallKeysFromFolder": "Install keys from a directory",
|
||||||
"MenuBarToolsManageFileTypes": "Zarządzaj rodzajami plików",
|
"MenuBarToolsManageFileTypes": "Zarządzaj rodzajami plików",
|
||||||
"MenuBarToolsInstallFileTypes": "Typy plików instalacyjnych",
|
"MenuBarToolsInstallFileTypes": "Typy plików instalacyjnych",
|
||||||
"MenuBarToolsUninstallFileTypes": "Typy plików dezinstalacyjnych",
|
"MenuBarToolsUninstallFileTypes": "Typy plików dezinstalacyjnych",
|
||||||
@@ -506,6 +509,13 @@
|
|||||||
"DialogFirmwareInstallerFirmwareInstallConfirmMessage": "\n\nCzy chcesz kontynuować?",
|
"DialogFirmwareInstallerFirmwareInstallConfirmMessage": "\n\nCzy chcesz kontynuować?",
|
||||||
"DialogFirmwareInstallerFirmwareInstallWaitMessage": "Instalowanie firmware'u...",
|
"DialogFirmwareInstallerFirmwareInstallWaitMessage": "Instalowanie firmware'u...",
|
||||||
"DialogFirmwareInstallerFirmwareInstallSuccessMessage": "Wersja systemu {0} została pomyślnie zainstalowana.",
|
"DialogFirmwareInstallerFirmwareInstallSuccessMessage": "Wersja systemu {0} została pomyślnie zainstalowana.",
|
||||||
|
"DialogKeysInstallerKeysNotFoundErrorMessage": "An invalid Keys file was found in {0}",
|
||||||
|
"DialogKeysInstallerKeysInstallTitle": "Install Keys",
|
||||||
|
"DialogKeysInstallerKeysInstallMessage": "New Keys file will be installed.",
|
||||||
|
"DialogKeysInstallerKeysInstallSubMessage": "\n\nThis may replace some of the current installed Keys.",
|
||||||
|
"DialogKeysInstallerKeysInstallConfirmMessage": "\n\nDo you want to continue?",
|
||||||
|
"DialogKeysInstallerKeysInstallWaitMessage": "Installing Keys...",
|
||||||
|
"DialogKeysInstallerKeysInstallSuccessMessage": "New Keys file successfully installed.",
|
||||||
"DialogUserProfileDeletionWarningMessage": "Nie będzie innych profili do otwarcia, jeśli wybrany profil zostanie usunięty",
|
"DialogUserProfileDeletionWarningMessage": "Nie będzie innych profili do otwarcia, jeśli wybrany profil zostanie usunięty",
|
||||||
"DialogUserProfileDeletionConfirmMessage": "Czy chcesz usunąć wybrany profil",
|
"DialogUserProfileDeletionConfirmMessage": "Czy chcesz usunąć wybrany profil",
|
||||||
"DialogUserProfileUnsavedChangesTitle": "Uwaga - Niezapisane zmiany",
|
"DialogUserProfileUnsavedChangesTitle": "Uwaga - Niezapisane zmiany",
|
||||||
@@ -692,6 +702,9 @@
|
|||||||
"Never": "Nigdy",
|
"Never": "Nigdy",
|
||||||
"SwkbdMinCharacters": "Musi mieć co najmniej {0} znaków",
|
"SwkbdMinCharacters": "Musi mieć co najmniej {0} znaków",
|
||||||
"SwkbdMinRangeCharacters": "Musi mieć długość od {0}-{1} znaków",
|
"SwkbdMinRangeCharacters": "Musi mieć długość od {0}-{1} znaków",
|
||||||
|
"CabinetTitle": "Cabinet Dialog",
|
||||||
|
"CabinetDialog": "Enter your Amiibo's new name",
|
||||||
|
"CabinetScanDialog": "Please scan your Amiibo now.",
|
||||||
"SoftwareKeyboard": "Klawiatura Oprogramowania",
|
"SoftwareKeyboard": "Klawiatura Oprogramowania",
|
||||||
"SoftwareKeyboardModeNumeric": "Może składać się jedynie z 0-9 lub '.'",
|
"SoftwareKeyboardModeNumeric": "Może składać się jedynie z 0-9 lub '.'",
|
||||||
"SoftwareKeyboardModeAlphabet": "Nie może zawierać znaków CJK",
|
"SoftwareKeyboardModeAlphabet": "Nie może zawierać znaków CJK",
|
||||||
@@ -705,7 +718,6 @@
|
|||||||
"UpdaterAddingFiles": "Dodawanie Nowych Plików...",
|
"UpdaterAddingFiles": "Dodawanie Nowych Plików...",
|
||||||
"UpdaterExtracting": "Wypakowywanie Aktualizacji...",
|
"UpdaterExtracting": "Wypakowywanie Aktualizacji...",
|
||||||
"UpdaterDownloading": "Pobieranie Aktualizacji...",
|
"UpdaterDownloading": "Pobieranie Aktualizacji...",
|
||||||
"Game": "Gra",
|
|
||||||
"Docked": "Zadokowany",
|
"Docked": "Zadokowany",
|
||||||
"Handheld": "Przenośny",
|
"Handheld": "Przenośny",
|
||||||
"ConnectionError": "Błąd Połączenia.",
|
"ConnectionError": "Błąd Połączenia.",
|
||||||
|
@@ -31,6 +31,9 @@
|
|||||||
"MenuBarToolsInstallFirmware": "_Instalar firmware",
|
"MenuBarToolsInstallFirmware": "_Instalar firmware",
|
||||||
"MenuBarFileToolsInstallFirmwareFromFile": "Instalar firmware a partir de um arquivo ZIP/XCI",
|
"MenuBarFileToolsInstallFirmwareFromFile": "Instalar firmware a partir de um arquivo ZIP/XCI",
|
||||||
"MenuBarFileToolsInstallFirmwareFromDirectory": "Instalar firmware a partir de um diretório",
|
"MenuBarFileToolsInstallFirmwareFromDirectory": "Instalar firmware a partir de um diretório",
|
||||||
|
"MenuBarToolsInstallKeys": "Install Keys",
|
||||||
|
"MenuBarFileToolsInstallKeysFromFile": "Install keys from KEYS or ZIP",
|
||||||
|
"MenuBarFileToolsInstallKeysFromFolder": "Install keys from a directory",
|
||||||
"MenuBarToolsManageFileTypes": "Gerenciar tipos de arquivo",
|
"MenuBarToolsManageFileTypes": "Gerenciar tipos de arquivo",
|
||||||
"MenuBarToolsInstallFileTypes": "Instalar tipos de arquivo",
|
"MenuBarToolsInstallFileTypes": "Instalar tipos de arquivo",
|
||||||
"MenuBarToolsUninstallFileTypes": "Desinstalar tipos de arquivos",
|
"MenuBarToolsUninstallFileTypes": "Desinstalar tipos de arquivos",
|
||||||
@@ -506,6 +509,13 @@
|
|||||||
"DialogFirmwareInstallerFirmwareInstallConfirmMessage": "\n\nDeseja continuar?",
|
"DialogFirmwareInstallerFirmwareInstallConfirmMessage": "\n\nDeseja continuar?",
|
||||||
"DialogFirmwareInstallerFirmwareInstallWaitMessage": "Instalando firmware...",
|
"DialogFirmwareInstallerFirmwareInstallWaitMessage": "Instalando firmware...",
|
||||||
"DialogFirmwareInstallerFirmwareInstallSuccessMessage": "Versão do sistema {0} instalada com sucesso.",
|
"DialogFirmwareInstallerFirmwareInstallSuccessMessage": "Versão do sistema {0} instalada com sucesso.",
|
||||||
|
"DialogKeysInstallerKeysNotFoundErrorMessage": "An invalid Keys file was found in {0}",
|
||||||
|
"DialogKeysInstallerKeysInstallTitle": "Install Keys",
|
||||||
|
"DialogKeysInstallerKeysInstallMessage": "New Keys file will be installed.",
|
||||||
|
"DialogKeysInstallerKeysInstallSubMessage": "\n\nThis may replace some of the current installed Keys.",
|
||||||
|
"DialogKeysInstallerKeysInstallConfirmMessage": "\n\nDo you want to continue?",
|
||||||
|
"DialogKeysInstallerKeysInstallWaitMessage": "Installing Keys...",
|
||||||
|
"DialogKeysInstallerKeysInstallSuccessMessage": "New Keys file successfully installed.",
|
||||||
"DialogUserProfileDeletionWarningMessage": "Não haveria nenhum perfil selecionado se o perfil atual fosse deletado",
|
"DialogUserProfileDeletionWarningMessage": "Não haveria nenhum perfil selecionado se o perfil atual fosse deletado",
|
||||||
"DialogUserProfileDeletionConfirmMessage": "Deseja deletar o perfil selecionado",
|
"DialogUserProfileDeletionConfirmMessage": "Deseja deletar o perfil selecionado",
|
||||||
"DialogUserProfileUnsavedChangesTitle": "Alerta - Alterações não salvas",
|
"DialogUserProfileUnsavedChangesTitle": "Alerta - Alterações não salvas",
|
||||||
@@ -691,6 +701,9 @@
|
|||||||
"Never": "Nunca",
|
"Never": "Nunca",
|
||||||
"SwkbdMinCharacters": "Deve ter pelo menos {0} caracteres",
|
"SwkbdMinCharacters": "Deve ter pelo menos {0} caracteres",
|
||||||
"SwkbdMinRangeCharacters": "Deve ter entre {0}-{1} caracteres",
|
"SwkbdMinRangeCharacters": "Deve ter entre {0}-{1} caracteres",
|
||||||
|
"CabinetTitle": "Cabinet Dialog",
|
||||||
|
"CabinetDialog": "Enter your Amiibo's new name",
|
||||||
|
"CabinetScanDialog": "Please scan your Amiibo now.",
|
||||||
"SoftwareKeyboard": "Teclado por Software",
|
"SoftwareKeyboard": "Teclado por Software",
|
||||||
"SoftwareKeyboardModeNumeric": "Deve ser somente 0-9 ou '.'",
|
"SoftwareKeyboardModeNumeric": "Deve ser somente 0-9 ou '.'",
|
||||||
"SoftwareKeyboardModeAlphabet": "Apenas devem ser caracteres não CJK.",
|
"SoftwareKeyboardModeAlphabet": "Apenas devem ser caracteres não CJK.",
|
||||||
@@ -704,7 +717,6 @@
|
|||||||
"UpdaterAddingFiles": "Adicionando novos arquivos...",
|
"UpdaterAddingFiles": "Adicionando novos arquivos...",
|
||||||
"UpdaterExtracting": "Extraíndo atualização...",
|
"UpdaterExtracting": "Extraíndo atualização...",
|
||||||
"UpdaterDownloading": "Baixando atualização...",
|
"UpdaterDownloading": "Baixando atualização...",
|
||||||
"Game": "Jogo",
|
|
||||||
"Docked": "TV",
|
"Docked": "TV",
|
||||||
"Handheld": "Portátil",
|
"Handheld": "Portátil",
|
||||||
"ConnectionError": "Erro de conexão.",
|
"ConnectionError": "Erro de conexão.",
|
||||||
|
@@ -31,6 +31,9 @@
|
|||||||
"MenuBarToolsInstallFirmware": "Установка прошивки",
|
"MenuBarToolsInstallFirmware": "Установка прошивки",
|
||||||
"MenuBarFileToolsInstallFirmwareFromFile": "Установить прошивку из XCI или ZIP",
|
"MenuBarFileToolsInstallFirmwareFromFile": "Установить прошивку из XCI или ZIP",
|
||||||
"MenuBarFileToolsInstallFirmwareFromDirectory": "Установить прошивку из папки",
|
"MenuBarFileToolsInstallFirmwareFromDirectory": "Установить прошивку из папки",
|
||||||
|
"MenuBarToolsInstallKeys": "Install Keys",
|
||||||
|
"MenuBarFileToolsInstallKeysFromFile": "Install keys from KEYS or ZIP",
|
||||||
|
"MenuBarFileToolsInstallKeysFromFolder": "Install keys from a directory",
|
||||||
"MenuBarToolsManageFileTypes": "Управление типами файлов",
|
"MenuBarToolsManageFileTypes": "Управление типами файлов",
|
||||||
"MenuBarToolsInstallFileTypes": "Установить типы файлов",
|
"MenuBarToolsInstallFileTypes": "Установить типы файлов",
|
||||||
"MenuBarToolsUninstallFileTypes": "Удалить типы файлов",
|
"MenuBarToolsUninstallFileTypes": "Удалить типы файлов",
|
||||||
@@ -506,6 +509,13 @@
|
|||||||
"DialogFirmwareInstallerFirmwareInstallConfirmMessage": "\n\nПродолжить?",
|
"DialogFirmwareInstallerFirmwareInstallConfirmMessage": "\n\nПродолжить?",
|
||||||
"DialogFirmwareInstallerFirmwareInstallWaitMessage": "Установка прошивки...",
|
"DialogFirmwareInstallerFirmwareInstallWaitMessage": "Установка прошивки...",
|
||||||
"DialogFirmwareInstallerFirmwareInstallSuccessMessage": "Прошивка версии {0} успешно установлена.",
|
"DialogFirmwareInstallerFirmwareInstallSuccessMessage": "Прошивка версии {0} успешно установлена.",
|
||||||
|
"DialogKeysInstallerKeysNotFoundErrorMessage": "An invalid Keys file was found in {0}",
|
||||||
|
"DialogKeysInstallerKeysInstallTitle": "Install Keys",
|
||||||
|
"DialogKeysInstallerKeysInstallMessage": "New Keys file will be installed.",
|
||||||
|
"DialogKeysInstallerKeysInstallSubMessage": "\n\nThis may replace some of the current installed Keys.",
|
||||||
|
"DialogKeysInstallerKeysInstallConfirmMessage": "\n\nDo you want to continue?",
|
||||||
|
"DialogKeysInstallerKeysInstallWaitMessage": "Installing Keys...",
|
||||||
|
"DialogKeysInstallerKeysInstallSuccessMessage": "New Keys file successfully installed.",
|
||||||
"DialogUserProfileDeletionWarningMessage": "Если выбранный профиль будет удален, другие профили не будут открываться.",
|
"DialogUserProfileDeletionWarningMessage": "Если выбранный профиль будет удален, другие профили не будут открываться.",
|
||||||
"DialogUserProfileDeletionConfirmMessage": "Удалить выбранный профиль?",
|
"DialogUserProfileDeletionConfirmMessage": "Удалить выбранный профиль?",
|
||||||
"DialogUserProfileUnsavedChangesTitle": "Внимание - Несохраненные изменения",
|
"DialogUserProfileUnsavedChangesTitle": "Внимание - Несохраненные изменения",
|
||||||
@@ -692,6 +702,9 @@
|
|||||||
"Never": "Никогда",
|
"Never": "Никогда",
|
||||||
"SwkbdMinCharacters": "Должно быть не менее {0} символов.",
|
"SwkbdMinCharacters": "Должно быть не менее {0} символов.",
|
||||||
"SwkbdMinRangeCharacters": "Должно быть {0}-{1} символов",
|
"SwkbdMinRangeCharacters": "Должно быть {0}-{1} символов",
|
||||||
|
"CabinetTitle": "Cabinet Dialog",
|
||||||
|
"CabinetDialog": "Enter your Amiibo's new name",
|
||||||
|
"CabinetScanDialog": "Please scan your Amiibo now.",
|
||||||
"SoftwareKeyboard": "Программная клавиатура",
|
"SoftwareKeyboard": "Программная клавиатура",
|
||||||
"SoftwareKeyboardModeNumeric": "Должно быть в диапазоне 0-9 или '.'",
|
"SoftwareKeyboardModeNumeric": "Должно быть в диапазоне 0-9 или '.'",
|
||||||
"SoftwareKeyboardModeAlphabet": "Не должно быть CJK-символов",
|
"SoftwareKeyboardModeAlphabet": "Не должно быть CJK-символов",
|
||||||
@@ -705,7 +718,6 @@
|
|||||||
"UpdaterAddingFiles": "Добавление новых файлов...",
|
"UpdaterAddingFiles": "Добавление новых файлов...",
|
||||||
"UpdaterExtracting": "Извлечение обновления...",
|
"UpdaterExtracting": "Извлечение обновления...",
|
||||||
"UpdaterDownloading": "Загрузка обновления...",
|
"UpdaterDownloading": "Загрузка обновления...",
|
||||||
"Game": "Игра",
|
|
||||||
"Docked": "Стационарный режим",
|
"Docked": "Стационарный режим",
|
||||||
"Handheld": "Портативный режим",
|
"Handheld": "Портативный режим",
|
||||||
"ConnectionError": "Ошибка соединения",
|
"ConnectionError": "Ошибка соединения",
|
||||||
|
@@ -31,6 +31,9 @@
|
|||||||
"MenuBarToolsInstallFirmware": "ติดตั้งเฟิร์มแวร์",
|
"MenuBarToolsInstallFirmware": "ติดตั้งเฟิร์มแวร์",
|
||||||
"MenuBarFileToolsInstallFirmwareFromFile": "ติดตั้งเฟิร์มแวร์จาก ไฟล์ XCI หรือ ไฟล์ ZIP",
|
"MenuBarFileToolsInstallFirmwareFromFile": "ติดตั้งเฟิร์มแวร์จาก ไฟล์ XCI หรือ ไฟล์ ZIP",
|
||||||
"MenuBarFileToolsInstallFirmwareFromDirectory": "ติดตั้งเฟิร์มแวร์จากไดเร็กทอรี",
|
"MenuBarFileToolsInstallFirmwareFromDirectory": "ติดตั้งเฟิร์มแวร์จากไดเร็กทอรี",
|
||||||
|
"MenuBarToolsInstallKeys": "Install Keys",
|
||||||
|
"MenuBarFileToolsInstallKeysFromFile": "Install keys from KEYS or ZIP",
|
||||||
|
"MenuBarFileToolsInstallKeysFromFolder": "Install keys from a directory",
|
||||||
"MenuBarToolsManageFileTypes": "จัดการประเภทไฟล์",
|
"MenuBarToolsManageFileTypes": "จัดการประเภทไฟล์",
|
||||||
"MenuBarToolsInstallFileTypes": "ติดตั้งประเภทไฟล์",
|
"MenuBarToolsInstallFileTypes": "ติดตั้งประเภทไฟล์",
|
||||||
"MenuBarToolsUninstallFileTypes": "ถอนการติดตั้งประเภทไฟล์",
|
"MenuBarToolsUninstallFileTypes": "ถอนการติดตั้งประเภทไฟล์",
|
||||||
@@ -506,6 +509,13 @@
|
|||||||
"DialogFirmwareInstallerFirmwareInstallConfirmMessage": "\n\nคุณต้องการดำเนินการต่อหรือไม่?",
|
"DialogFirmwareInstallerFirmwareInstallConfirmMessage": "\n\nคุณต้องการดำเนินการต่อหรือไม่?",
|
||||||
"DialogFirmwareInstallerFirmwareInstallWaitMessage": "กำลังติดตั้งเฟิร์มแวร์...",
|
"DialogFirmwareInstallerFirmwareInstallWaitMessage": "กำลังติดตั้งเฟิร์มแวร์...",
|
||||||
"DialogFirmwareInstallerFirmwareInstallSuccessMessage": "ระบบเวอร์ชั่น {0} ติดตั้งเรียบร้อยแล้ว",
|
"DialogFirmwareInstallerFirmwareInstallSuccessMessage": "ระบบเวอร์ชั่น {0} ติดตั้งเรียบร้อยแล้ว",
|
||||||
|
"DialogKeysInstallerKeysNotFoundErrorMessage": "An invalid Keys file was found in {0}",
|
||||||
|
"DialogKeysInstallerKeysInstallTitle": "Install Keys",
|
||||||
|
"DialogKeysInstallerKeysInstallMessage": "New Keys file will be installed.",
|
||||||
|
"DialogKeysInstallerKeysInstallSubMessage": "\n\nThis may replace some of the current installed Keys.",
|
||||||
|
"DialogKeysInstallerKeysInstallConfirmMessage": "\n\nDo you want to continue?",
|
||||||
|
"DialogKeysInstallerKeysInstallWaitMessage": "Installing Keys...",
|
||||||
|
"DialogKeysInstallerKeysInstallSuccessMessage": "New Keys file successfully installed.",
|
||||||
"DialogUserProfileDeletionWarningMessage": "จะไม่มีโปรไฟล์อื่นให้เปิดหากโปรไฟล์ที่เลือกถูกลบ",
|
"DialogUserProfileDeletionWarningMessage": "จะไม่มีโปรไฟล์อื่นให้เปิดหากโปรไฟล์ที่เลือกถูกลบ",
|
||||||
"DialogUserProfileDeletionConfirmMessage": "คุณต้องการลบโปรไฟล์ที่เลือกหรือไม่?",
|
"DialogUserProfileDeletionConfirmMessage": "คุณต้องการลบโปรไฟล์ที่เลือกหรือไม่?",
|
||||||
"DialogUserProfileUnsavedChangesTitle": "คำเตือน - มีการเปลี่ยนแปลงที่ไม่ได้บันทึก",
|
"DialogUserProfileUnsavedChangesTitle": "คำเตือน - มีการเปลี่ยนแปลงที่ไม่ได้บันทึก",
|
||||||
@@ -692,6 +702,9 @@
|
|||||||
"Never": "ไม่ต้อง",
|
"Never": "ไม่ต้อง",
|
||||||
"SwkbdMinCharacters": "ต้องมีความยาวของตัวอักษรอย่างน้อย {0} ตัว",
|
"SwkbdMinCharacters": "ต้องมีความยาวของตัวอักษรอย่างน้อย {0} ตัว",
|
||||||
"SwkbdMinRangeCharacters": "ต้องมีความยาวของตัวอักษร {0}-{1} ตัว",
|
"SwkbdMinRangeCharacters": "ต้องมีความยาวของตัวอักษร {0}-{1} ตัว",
|
||||||
|
"CabinetTitle": "Cabinet Dialog",
|
||||||
|
"CabinetDialog": "Enter your Amiibo's new name",
|
||||||
|
"CabinetScanDialog": "Please scan your Amiibo now.",
|
||||||
"SoftwareKeyboard": "ซอฟต์แวร์คีย์บอร์ด",
|
"SoftwareKeyboard": "ซอฟต์แวร์คีย์บอร์ด",
|
||||||
"SoftwareKeyboardModeNumeric": "ต้องเป็น 0-9 หรือ '.' เท่านั้น",
|
"SoftwareKeyboardModeNumeric": "ต้องเป็น 0-9 หรือ '.' เท่านั้น",
|
||||||
"SoftwareKeyboardModeAlphabet": "ต้องเป็นตัวอักษรที่ไม่ใช่ประเภท CJK เท่านั้น",
|
"SoftwareKeyboardModeAlphabet": "ต้องเป็นตัวอักษรที่ไม่ใช่ประเภท CJK เท่านั้น",
|
||||||
@@ -705,7 +718,6 @@
|
|||||||
"UpdaterAddingFiles": "กำลังเพิ่มไฟล์ใหม่...",
|
"UpdaterAddingFiles": "กำลังเพิ่มไฟล์ใหม่...",
|
||||||
"UpdaterExtracting": "กำลังแยกการอัปเดต...",
|
"UpdaterExtracting": "กำลังแยกการอัปเดต...",
|
||||||
"UpdaterDownloading": "กำลังดาวน์โหลดอัปเดต...",
|
"UpdaterDownloading": "กำลังดาวน์โหลดอัปเดต...",
|
||||||
"Game": "เกมส์",
|
|
||||||
"Docked": "ด็อก",
|
"Docked": "ด็อก",
|
||||||
"Handheld": "แฮนด์เฮลด์",
|
"Handheld": "แฮนด์เฮลด์",
|
||||||
"ConnectionError": "การเชื่อมต่อล้มเหลว",
|
"ConnectionError": "การเชื่อมต่อล้มเหลว",
|
||||||
|
@@ -31,6 +31,9 @@
|
|||||||
"MenuBarToolsInstallFirmware": "Yazılım Yükle",
|
"MenuBarToolsInstallFirmware": "Yazılım Yükle",
|
||||||
"MenuBarFileToolsInstallFirmwareFromFile": "XCI veya ZIP'ten Yazılım Yükle",
|
"MenuBarFileToolsInstallFirmwareFromFile": "XCI veya ZIP'ten Yazılım Yükle",
|
||||||
"MenuBarFileToolsInstallFirmwareFromDirectory": "Bir Dizin Üzerinden Yazılım Yükle",
|
"MenuBarFileToolsInstallFirmwareFromDirectory": "Bir Dizin Üzerinden Yazılım Yükle",
|
||||||
|
"MenuBarToolsInstallKeys": "Install Keys",
|
||||||
|
"MenuBarFileToolsInstallKeysFromFile": "Install keys from KEYS or ZIP",
|
||||||
|
"MenuBarFileToolsInstallKeysFromFolder": "Install keys from a directory",
|
||||||
"MenuBarToolsManageFileTypes": "Dosya uzantılarını yönet",
|
"MenuBarToolsManageFileTypes": "Dosya uzantılarını yönet",
|
||||||
"MenuBarToolsInstallFileTypes": "Dosya uzantılarını yükle",
|
"MenuBarToolsInstallFileTypes": "Dosya uzantılarını yükle",
|
||||||
"MenuBarToolsUninstallFileTypes": "Dosya uzantılarını kaldır",
|
"MenuBarToolsUninstallFileTypes": "Dosya uzantılarını kaldır",
|
||||||
@@ -506,6 +509,13 @@
|
|||||||
"DialogFirmwareInstallerFirmwareInstallConfirmMessage": "\n\nDevam etmek istiyor musunuz?",
|
"DialogFirmwareInstallerFirmwareInstallConfirmMessage": "\n\nDevam etmek istiyor musunuz?",
|
||||||
"DialogFirmwareInstallerFirmwareInstallWaitMessage": "Firmware yükleniyor...",
|
"DialogFirmwareInstallerFirmwareInstallWaitMessage": "Firmware yükleniyor...",
|
||||||
"DialogFirmwareInstallerFirmwareInstallSuccessMessage": "Sistem sürümü {0} başarıyla yüklendi.",
|
"DialogFirmwareInstallerFirmwareInstallSuccessMessage": "Sistem sürümü {0} başarıyla yüklendi.",
|
||||||
|
"DialogKeysInstallerKeysNotFoundErrorMessage": "An invalid Keys file was found in {0}",
|
||||||
|
"DialogKeysInstallerKeysInstallTitle": "Install Keys",
|
||||||
|
"DialogKeysInstallerKeysInstallMessage": "New Keys file will be installed.",
|
||||||
|
"DialogKeysInstallerKeysInstallSubMessage": "\n\nThis may replace some of the current installed Keys.",
|
||||||
|
"DialogKeysInstallerKeysInstallConfirmMessage": "\n\nDo you want to continue?",
|
||||||
|
"DialogKeysInstallerKeysInstallWaitMessage": "Installing Keys...",
|
||||||
|
"DialogKeysInstallerKeysInstallSuccessMessage": "New Keys file successfully installed.",
|
||||||
"DialogUserProfileDeletionWarningMessage": "Seçilen profil silinirse kullanılabilen başka profil kalmayacak",
|
"DialogUserProfileDeletionWarningMessage": "Seçilen profil silinirse kullanılabilen başka profil kalmayacak",
|
||||||
"DialogUserProfileDeletionConfirmMessage": "Seçilen profili silmek istiyor musunuz",
|
"DialogUserProfileDeletionConfirmMessage": "Seçilen profili silmek istiyor musunuz",
|
||||||
"DialogUserProfileUnsavedChangesTitle": "Uyarı - Kaydedilmemiş Değişiklikler",
|
"DialogUserProfileUnsavedChangesTitle": "Uyarı - Kaydedilmemiş Değişiklikler",
|
||||||
@@ -692,6 +702,9 @@
|
|||||||
"Never": "Hiçbir Zaman",
|
"Never": "Hiçbir Zaman",
|
||||||
"SwkbdMinCharacters": "En az {0} karakter uzunluğunda olmalı",
|
"SwkbdMinCharacters": "En az {0} karakter uzunluğunda olmalı",
|
||||||
"SwkbdMinRangeCharacters": "{0}-{1} karakter uzunluğunda olmalı",
|
"SwkbdMinRangeCharacters": "{0}-{1} karakter uzunluğunda olmalı",
|
||||||
|
"CabinetTitle": "Cabinet Dialog",
|
||||||
|
"CabinetDialog": "Enter your Amiibo's new name",
|
||||||
|
"CabinetScanDialog": "Please scan your Amiibo now.",
|
||||||
"SoftwareKeyboard": "Yazılım Klavyesi",
|
"SoftwareKeyboard": "Yazılım Klavyesi",
|
||||||
"SoftwareKeyboardModeNumeric": "Sadece 0-9 veya '.' olabilir",
|
"SoftwareKeyboardModeNumeric": "Sadece 0-9 veya '.' olabilir",
|
||||||
"SoftwareKeyboardModeAlphabet": "Sadece CJK-characters olmayan karakterler olabilir",
|
"SoftwareKeyboardModeAlphabet": "Sadece CJK-characters olmayan karakterler olabilir",
|
||||||
@@ -705,7 +718,6 @@
|
|||||||
"UpdaterAddingFiles": "Yeni Dosyalar Ekleniyor...",
|
"UpdaterAddingFiles": "Yeni Dosyalar Ekleniyor...",
|
||||||
"UpdaterExtracting": "Güncelleme Ayrıştırılıyor...",
|
"UpdaterExtracting": "Güncelleme Ayrıştırılıyor...",
|
||||||
"UpdaterDownloading": "Güncelleme İndiriliyor...",
|
"UpdaterDownloading": "Güncelleme İndiriliyor...",
|
||||||
"Game": "Oyun",
|
|
||||||
"Docked": "Docked",
|
"Docked": "Docked",
|
||||||
"Handheld": "El tipi",
|
"Handheld": "El tipi",
|
||||||
"ConnectionError": "Bağlantı Hatası.",
|
"ConnectionError": "Bağlantı Hatası.",
|
||||||
|
@@ -31,6 +31,9 @@
|
|||||||
"MenuBarToolsInstallFirmware": "Установити прошивку",
|
"MenuBarToolsInstallFirmware": "Установити прошивку",
|
||||||
"MenuBarFileToolsInstallFirmwareFromFile": "Установити прошивку з XCI або ZIP",
|
"MenuBarFileToolsInstallFirmwareFromFile": "Установити прошивку з XCI або ZIP",
|
||||||
"MenuBarFileToolsInstallFirmwareFromDirectory": "Установити прошивку з теки",
|
"MenuBarFileToolsInstallFirmwareFromDirectory": "Установити прошивку з теки",
|
||||||
|
"MenuBarToolsInstallKeys": "Install Keys",
|
||||||
|
"MenuBarFileToolsInstallKeysFromFile": "Install keys from KEYS or ZIP",
|
||||||
|
"MenuBarFileToolsInstallKeysFromFolder": "Install keys from a directory",
|
||||||
"MenuBarToolsManageFileTypes": "Керувати типами файлів",
|
"MenuBarToolsManageFileTypes": "Керувати типами файлів",
|
||||||
"MenuBarToolsInstallFileTypes": "Установити типи файлів",
|
"MenuBarToolsInstallFileTypes": "Установити типи файлів",
|
||||||
"MenuBarToolsUninstallFileTypes": "Видалити типи файлів",
|
"MenuBarToolsUninstallFileTypes": "Видалити типи файлів",
|
||||||
@@ -506,6 +509,13 @@
|
|||||||
"DialogFirmwareInstallerFirmwareInstallConfirmMessage": "\n\nВи хочете продовжити?",
|
"DialogFirmwareInstallerFirmwareInstallConfirmMessage": "\n\nВи хочете продовжити?",
|
||||||
"DialogFirmwareInstallerFirmwareInstallWaitMessage": "Встановлення прошивки...",
|
"DialogFirmwareInstallerFirmwareInstallWaitMessage": "Встановлення прошивки...",
|
||||||
"DialogFirmwareInstallerFirmwareInstallSuccessMessage": "Версію системи {0} успішно встановлено.",
|
"DialogFirmwareInstallerFirmwareInstallSuccessMessage": "Версію системи {0} успішно встановлено.",
|
||||||
|
"DialogKeysInstallerKeysNotFoundErrorMessage": "An invalid Keys file was found in {0}",
|
||||||
|
"DialogKeysInstallerKeysInstallTitle": "Install Keys",
|
||||||
|
"DialogKeysInstallerKeysInstallMessage": "New Keys file will be installed.",
|
||||||
|
"DialogKeysInstallerKeysInstallSubMessage": "\n\nThis may replace some of the current installed Keys.",
|
||||||
|
"DialogKeysInstallerKeysInstallConfirmMessage": "\n\nDo you want to continue?",
|
||||||
|
"DialogKeysInstallerKeysInstallWaitMessage": "Installing Keys...",
|
||||||
|
"DialogKeysInstallerKeysInstallSuccessMessage": "New Keys file successfully installed.",
|
||||||
"DialogUserProfileDeletionWarningMessage": "Якщо вибраний профіль буде видалено, інші профілі не відкриватимуться",
|
"DialogUserProfileDeletionWarningMessage": "Якщо вибраний профіль буде видалено, інші профілі не відкриватимуться",
|
||||||
"DialogUserProfileDeletionConfirmMessage": "Ви хочете видалити вибраний профіль",
|
"DialogUserProfileDeletionConfirmMessage": "Ви хочете видалити вибраний профіль",
|
||||||
"DialogUserProfileUnsavedChangesTitle": "Увага — Незбережені зміни",
|
"DialogUserProfileUnsavedChangesTitle": "Увага — Незбережені зміни",
|
||||||
@@ -692,6 +702,9 @@
|
|||||||
"Never": "Ніколи",
|
"Never": "Ніколи",
|
||||||
"SwkbdMinCharacters": "Мінімальна кількість символів: {0}",
|
"SwkbdMinCharacters": "Мінімальна кількість символів: {0}",
|
||||||
"SwkbdMinRangeCharacters": "Має бути {0}-{1} символів",
|
"SwkbdMinRangeCharacters": "Має бути {0}-{1} символів",
|
||||||
|
"CabinetTitle": "Cabinet Dialog",
|
||||||
|
"CabinetDialog": "Enter your Amiibo's new name",
|
||||||
|
"CabinetScanDialog": "Please scan your Amiibo now.",
|
||||||
"SoftwareKeyboard": "Програмна клавіатура",
|
"SoftwareKeyboard": "Програмна клавіатура",
|
||||||
"SoftwareKeyboardModeNumeric": "Повинно бути лише 0-9 або “.”",
|
"SoftwareKeyboardModeNumeric": "Повинно бути лише 0-9 або “.”",
|
||||||
"SoftwareKeyboardModeAlphabet": "Повинно бути лише не CJK-символи",
|
"SoftwareKeyboardModeAlphabet": "Повинно бути лише не CJK-символи",
|
||||||
@@ -705,7 +718,6 @@
|
|||||||
"UpdaterAddingFiles": "Додавання нових файлів...",
|
"UpdaterAddingFiles": "Додавання нових файлів...",
|
||||||
"UpdaterExtracting": "Видобування оновлення...",
|
"UpdaterExtracting": "Видобування оновлення...",
|
||||||
"UpdaterDownloading": "Завантаження оновлення...",
|
"UpdaterDownloading": "Завантаження оновлення...",
|
||||||
"Game": "Гра",
|
|
||||||
"Docked": "Док-станція",
|
"Docked": "Док-станція",
|
||||||
"Handheld": "Портативний",
|
"Handheld": "Портативний",
|
||||||
"ConnectionError": "Помилка з'єднання.",
|
"ConnectionError": "Помилка з'єднання.",
|
||||||
|
@@ -31,6 +31,9 @@
|
|||||||
"MenuBarToolsInstallFirmware": "安装系统固件",
|
"MenuBarToolsInstallFirmware": "安装系统固件",
|
||||||
"MenuBarFileToolsInstallFirmwareFromFile": "从 XCI 或 ZIP 文件中安装系统固件",
|
"MenuBarFileToolsInstallFirmwareFromFile": "从 XCI 或 ZIP 文件中安装系统固件",
|
||||||
"MenuBarFileToolsInstallFirmwareFromDirectory": "从文件夹中安装系统固件",
|
"MenuBarFileToolsInstallFirmwareFromDirectory": "从文件夹中安装系统固件",
|
||||||
|
"MenuBarToolsInstallKeys": "Install Keys",
|
||||||
|
"MenuBarFileToolsInstallKeysFromFile": "Install keys from KEYS or ZIP",
|
||||||
|
"MenuBarFileToolsInstallKeysFromFolder": "Install keys from a directory",
|
||||||
"MenuBarToolsManageFileTypes": "管理文件扩展名",
|
"MenuBarToolsManageFileTypes": "管理文件扩展名",
|
||||||
"MenuBarToolsInstallFileTypes": "关联文件扩展名",
|
"MenuBarToolsInstallFileTypes": "关联文件扩展名",
|
||||||
"MenuBarToolsUninstallFileTypes": "取消关联扩展名",
|
"MenuBarToolsUninstallFileTypes": "取消关联扩展名",
|
||||||
@@ -506,6 +509,13 @@
|
|||||||
"DialogFirmwareInstallerFirmwareInstallConfirmMessage": "\n\n是否继续?",
|
"DialogFirmwareInstallerFirmwareInstallConfirmMessage": "\n\n是否继续?",
|
||||||
"DialogFirmwareInstallerFirmwareInstallWaitMessage": "安装系统固件中...",
|
"DialogFirmwareInstallerFirmwareInstallWaitMessage": "安装系统固件中...",
|
||||||
"DialogFirmwareInstallerFirmwareInstallSuccessMessage": "成功安装系统固件版本 {0} 。",
|
"DialogFirmwareInstallerFirmwareInstallSuccessMessage": "成功安装系统固件版本 {0} 。",
|
||||||
|
"DialogKeysInstallerKeysNotFoundErrorMessage": "An invalid Keys file was found in {0}",
|
||||||
|
"DialogKeysInstallerKeysInstallTitle": "Install Keys",
|
||||||
|
"DialogKeysInstallerKeysInstallMessage": "New Keys file will be installed.",
|
||||||
|
"DialogKeysInstallerKeysInstallSubMessage": "\n\nThis may replace some of the current installed Keys.",
|
||||||
|
"DialogKeysInstallerKeysInstallConfirmMessage": "\n\nDo you want to continue?",
|
||||||
|
"DialogKeysInstallerKeysInstallWaitMessage": "Installing Keys...",
|
||||||
|
"DialogKeysInstallerKeysInstallSuccessMessage": "New Keys file successfully installed.",
|
||||||
"DialogUserProfileDeletionWarningMessage": "删除后将没有可用的账户",
|
"DialogUserProfileDeletionWarningMessage": "删除后将没有可用的账户",
|
||||||
"DialogUserProfileDeletionConfirmMessage": "是否删除所选账户",
|
"DialogUserProfileDeletionConfirmMessage": "是否删除所选账户",
|
||||||
"DialogUserProfileUnsavedChangesTitle": "警告 - 有未保存的更改",
|
"DialogUserProfileUnsavedChangesTitle": "警告 - 有未保存的更改",
|
||||||
@@ -692,6 +702,9 @@
|
|||||||
"Never": "从不",
|
"Never": "从不",
|
||||||
"SwkbdMinCharacters": "不少于 {0} 个字符",
|
"SwkbdMinCharacters": "不少于 {0} 个字符",
|
||||||
"SwkbdMinRangeCharacters": "必须为 {0}-{1} 个字符",
|
"SwkbdMinRangeCharacters": "必须为 {0}-{1} 个字符",
|
||||||
|
"CabinetTitle": "Cabinet Dialog",
|
||||||
|
"CabinetDialog": "Enter your Amiibo's new name",
|
||||||
|
"CabinetScanDialog": "Please scan your Amiibo now.",
|
||||||
"SoftwareKeyboard": "软键盘",
|
"SoftwareKeyboard": "软键盘",
|
||||||
"SoftwareKeyboardModeNumeric": "只能输入 0-9 或 \".\"",
|
"SoftwareKeyboardModeNumeric": "只能输入 0-9 或 \".\"",
|
||||||
"SoftwareKeyboardModeAlphabet": "仅支持非中文字符",
|
"SoftwareKeyboardModeAlphabet": "仅支持非中文字符",
|
||||||
@@ -705,7 +718,6 @@
|
|||||||
"UpdaterAddingFiles": "安装更新中...",
|
"UpdaterAddingFiles": "安装更新中...",
|
||||||
"UpdaterExtracting": "正在提取更新...",
|
"UpdaterExtracting": "正在提取更新...",
|
||||||
"UpdaterDownloading": "下载更新中...",
|
"UpdaterDownloading": "下载更新中...",
|
||||||
"Game": "游戏",
|
|
||||||
"Docked": "主机模式",
|
"Docked": "主机模式",
|
||||||
"Handheld": "掌机模式",
|
"Handheld": "掌机模式",
|
||||||
"ConnectionError": "连接错误。",
|
"ConnectionError": "连接错误。",
|
||||||
|
@@ -31,6 +31,9 @@
|
|||||||
"MenuBarToolsInstallFirmware": "安裝韌體",
|
"MenuBarToolsInstallFirmware": "安裝韌體",
|
||||||
"MenuBarFileToolsInstallFirmwareFromFile": "從 XCI 或 ZIP 安裝韌體",
|
"MenuBarFileToolsInstallFirmwareFromFile": "從 XCI 或 ZIP 安裝韌體",
|
||||||
"MenuBarFileToolsInstallFirmwareFromDirectory": "從資料夾安裝韌體",
|
"MenuBarFileToolsInstallFirmwareFromDirectory": "從資料夾安裝韌體",
|
||||||
|
"MenuBarToolsInstallKeys": "Install Keys",
|
||||||
|
"MenuBarFileToolsInstallKeysFromFile": "Install keys from KEYS or ZIP",
|
||||||
|
"MenuBarFileToolsInstallKeysFromFolder": "Install keys from a directory",
|
||||||
"MenuBarToolsManageFileTypes": "管理檔案類型",
|
"MenuBarToolsManageFileTypes": "管理檔案類型",
|
||||||
"MenuBarToolsInstallFileTypes": "安裝檔案類型",
|
"MenuBarToolsInstallFileTypes": "安裝檔案類型",
|
||||||
"MenuBarToolsUninstallFileTypes": "移除檔案類型",
|
"MenuBarToolsUninstallFileTypes": "移除檔案類型",
|
||||||
@@ -506,6 +509,13 @@
|
|||||||
"DialogFirmwareInstallerFirmwareInstallConfirmMessage": "\n\n您確定要繼續嗎?",
|
"DialogFirmwareInstallerFirmwareInstallConfirmMessage": "\n\n您確定要繼續嗎?",
|
||||||
"DialogFirmwareInstallerFirmwareInstallWaitMessage": "正在安裝韌體...",
|
"DialogFirmwareInstallerFirmwareInstallWaitMessage": "正在安裝韌體...",
|
||||||
"DialogFirmwareInstallerFirmwareInstallSuccessMessage": "成功安裝系統版本 {0}。",
|
"DialogFirmwareInstallerFirmwareInstallSuccessMessage": "成功安裝系統版本 {0}。",
|
||||||
|
"DialogKeysInstallerKeysNotFoundErrorMessage": "An invalid Keys file was found in {0}",
|
||||||
|
"DialogKeysInstallerKeysInstallTitle": "Install Keys",
|
||||||
|
"DialogKeysInstallerKeysInstallMessage": "New Keys file will be installed.",
|
||||||
|
"DialogKeysInstallerKeysInstallSubMessage": "\n\nThis may replace some of the current installed Keys.",
|
||||||
|
"DialogKeysInstallerKeysInstallConfirmMessage": "\n\nDo you want to continue?",
|
||||||
|
"DialogKeysInstallerKeysInstallWaitMessage": "Installing Keys...",
|
||||||
|
"DialogKeysInstallerKeysInstallSuccessMessage": "New Keys file successfully installed.",
|
||||||
"DialogUserProfileDeletionWarningMessage": "如果刪除選取的設定檔,將無法開啟其他設定檔",
|
"DialogUserProfileDeletionWarningMessage": "如果刪除選取的設定檔,將無法開啟其他設定檔",
|
||||||
"DialogUserProfileDeletionConfirmMessage": "您是否要刪除所選設定檔",
|
"DialogUserProfileDeletionConfirmMessage": "您是否要刪除所選設定檔",
|
||||||
"DialogUserProfileUnsavedChangesTitle": "警告 - 未儲存的變更",
|
"DialogUserProfileUnsavedChangesTitle": "警告 - 未儲存的變更",
|
||||||
@@ -692,6 +702,9 @@
|
|||||||
"Never": "從不",
|
"Never": "從不",
|
||||||
"SwkbdMinCharacters": "長度必須至少為 {0} 個字元",
|
"SwkbdMinCharacters": "長度必須至少為 {0} 個字元",
|
||||||
"SwkbdMinRangeCharacters": "長度必須為 {0} 到 {1} 個字元",
|
"SwkbdMinRangeCharacters": "長度必須為 {0} 到 {1} 個字元",
|
||||||
|
"CabinetTitle": "Cabinet Dialog",
|
||||||
|
"CabinetDialog": "Enter your Amiibo's new name",
|
||||||
|
"CabinetScanDialog": "Please scan your Amiibo now.",
|
||||||
"SoftwareKeyboard": "軟體鍵盤",
|
"SoftwareKeyboard": "軟體鍵盤",
|
||||||
"SoftwareKeyboardModeNumeric": "必須是 0 到 9 或「.」",
|
"SoftwareKeyboardModeNumeric": "必須是 0 到 9 或「.」",
|
||||||
"SoftwareKeyboardModeAlphabet": "必須是「非中日韓字元」 (non CJK)",
|
"SoftwareKeyboardModeAlphabet": "必須是「非中日韓字元」 (non CJK)",
|
||||||
@@ -705,7 +718,6 @@
|
|||||||
"UpdaterAddingFiles": "正在加入新檔案...",
|
"UpdaterAddingFiles": "正在加入新檔案...",
|
||||||
"UpdaterExtracting": "正在提取更新...",
|
"UpdaterExtracting": "正在提取更新...",
|
||||||
"UpdaterDownloading": "正在下載更新...",
|
"UpdaterDownloading": "正在下載更新...",
|
||||||
"Game": "遊戲",
|
|
||||||
"Docked": "底座模式",
|
"Docked": "底座模式",
|
||||||
"Handheld": "手提模式",
|
"Handheld": "手提模式",
|
||||||
"ConnectionError": "連線錯誤。",
|
"ConnectionError": "連線錯誤。",
|
||||||
|
@@ -11,6 +11,7 @@
|
|||||||
<TieredPGO>true</TieredPGO>
|
<TieredPGO>true</TieredPGO>
|
||||||
<AvaloniaUseCompiledBindingsByDefault>true</AvaloniaUseCompiledBindingsByDefault>
|
<AvaloniaUseCompiledBindingsByDefault>true</AvaloniaUseCompiledBindingsByDefault>
|
||||||
<ApplicationManifest>app.manifest</ApplicationManifest>
|
<ApplicationManifest>app.manifest</ApplicationManifest>
|
||||||
|
<DefaultItemExcludes>$(DefaultItemExcludes);._*</DefaultItemExcludes>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
|
|
||||||
<Target Name="PostBuild" AfterTargets="PostBuildEvent" Condition="$([MSBuild]::IsOSPlatform('OSX'))">
|
<Target Name="PostBuild" AfterTargets="PostBuildEvent" Condition="$([MSBuild]::IsOSPlatform('OSX'))">
|
||||||
|
@@ -7,6 +7,7 @@ using Ryujinx.Ava.UI.Helpers;
|
|||||||
using Ryujinx.Ava.UI.Windows;
|
using Ryujinx.Ava.UI.Windows;
|
||||||
using Ryujinx.HLE;
|
using Ryujinx.HLE;
|
||||||
using Ryujinx.HLE.HOS.Applets;
|
using Ryujinx.HLE.HOS.Applets;
|
||||||
|
using Ryujinx.HLE.HOS.Applets.SoftwareKeyboard;
|
||||||
using Ryujinx.HLE.HOS.Services.Am.AppletOE.ApplicationProxyService.ApplicationProxy.Types;
|
using Ryujinx.HLE.HOS.Services.Am.AppletOE.ApplicationProxyService.ApplicationProxy.Types;
|
||||||
using Ryujinx.HLE.UI;
|
using Ryujinx.HLE.UI;
|
||||||
using Ryujinx.UI.Common.Configuration;
|
using Ryujinx.UI.Common.Configuration;
|
||||||
@@ -155,6 +156,55 @@ namespace Ryujinx.Ava.UI.Applet
|
|||||||
return error || okPressed;
|
return error || okPressed;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public bool DisplayCabinetDialog(out string userText)
|
||||||
|
{
|
||||||
|
ManualResetEvent dialogCloseEvent = new(false);
|
||||||
|
bool okPressed = false;
|
||||||
|
string inputText = "My Amiibo";
|
||||||
|
Dispatcher.UIThread.InvokeAsync(async () =>
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
_parent.ViewModel.AppHost.NpadManager.BlockInputUpdates();
|
||||||
|
SoftwareKeyboardUIArgs args = new SoftwareKeyboardUIArgs();
|
||||||
|
args.KeyboardMode = KeyboardMode.Default;
|
||||||
|
args.InitialText = "Ryujinx";
|
||||||
|
args.StringLengthMin = 1;
|
||||||
|
args.StringLengthMax = 25;
|
||||||
|
(UserResult result, string userInput) = await SwkbdAppletDialog.ShowInputDialog(LocaleManager.Instance[LocaleKeys.CabinetDialog], args);
|
||||||
|
if (result == UserResult.Ok)
|
||||||
|
{
|
||||||
|
inputText = userInput;
|
||||||
|
okPressed = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
finally
|
||||||
|
{
|
||||||
|
dialogCloseEvent.Set();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
dialogCloseEvent.WaitOne();
|
||||||
|
_parent.ViewModel.AppHost.NpadManager.UnblockInputUpdates();
|
||||||
|
userText = inputText;
|
||||||
|
return okPressed;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void DisplayCabinetMessageDialog()
|
||||||
|
{
|
||||||
|
ManualResetEvent dialogCloseEvent = new(false);
|
||||||
|
Dispatcher.UIThread.InvokeAsync(async () =>
|
||||||
|
{
|
||||||
|
dialogCloseEvent.Set();
|
||||||
|
await ContentDialogHelper.CreateInfoDialog(LocaleManager.Instance[LocaleKeys.CabinetScanDialog],
|
||||||
|
string.Empty,
|
||||||
|
LocaleManager.Instance[LocaleKeys.InputDialogOk],
|
||||||
|
string.Empty,
|
||||||
|
LocaleManager.Instance[LocaleKeys.CabinetTitle]);
|
||||||
|
});
|
||||||
|
dialogCloseEvent.WaitOne();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
public void ExecuteProgram(Switch device, ProgramSpecifyKind kind, ulong value)
|
public void ExecuteProgram(Switch device, ProgramSpecifyKind kind, ulong value)
|
||||||
{
|
{
|
||||||
device.Configuration.UserChannelPersistence.ExecuteProgram(kind, value);
|
device.Configuration.UserChannelPersistence.ExecuteProgram(kind, value);
|
||||||
|
@@ -10,6 +10,7 @@ using DynamicData;
|
|||||||
using DynamicData.Binding;
|
using DynamicData.Binding;
|
||||||
using FluentAvalonia.UI.Controls;
|
using FluentAvalonia.UI.Controls;
|
||||||
using LibHac.Common;
|
using LibHac.Common;
|
||||||
|
using LibHac.Ns;
|
||||||
using Ryujinx.Ava.Common;
|
using Ryujinx.Ava.Common;
|
||||||
using Ryujinx.Ava.Common.Locale;
|
using Ryujinx.Ava.Common.Locale;
|
||||||
using Ryujinx.Ava.Input;
|
using Ryujinx.Ava.Input;
|
||||||
@@ -70,7 +71,7 @@ namespace Ryujinx.Ava.UI.ViewModels
|
|||||||
private string _gpuStatusText;
|
private string _gpuStatusText;
|
||||||
private string _shaderCountText;
|
private string _shaderCountText;
|
||||||
private bool _isAmiiboRequested;
|
private bool _isAmiiboRequested;
|
||||||
private bool _showRightmostSeparator;
|
private bool _showShaderCompilationHint;
|
||||||
private bool _isGameRunning;
|
private bool _isGameRunning;
|
||||||
private bool _isFullScreen;
|
private bool _isFullScreen;
|
||||||
private int _progressMaximum;
|
private int _progressMaximum;
|
||||||
@@ -275,12 +276,12 @@ namespace Ryujinx.Ava.UI.ViewModels
|
|||||||
|
|
||||||
public bool ShowFirmwareStatus => !ShowLoadProgress;
|
public bool ShowFirmwareStatus => !ShowLoadProgress;
|
||||||
|
|
||||||
public bool ShowRightmostSeparator
|
public bool ShowShaderCompilationHint
|
||||||
{
|
{
|
||||||
get => _showRightmostSeparator;
|
get => _showShaderCompilationHint;
|
||||||
set
|
set
|
||||||
{
|
{
|
||||||
_showRightmostSeparator = value;
|
_showShaderCompilationHint = value;
|
||||||
|
|
||||||
OnPropertyChanged();
|
OnPropertyChanged();
|
||||||
}
|
}
|
||||||
@@ -1271,6 +1272,108 @@ namespace Ryujinx.Ava.UI.ViewModels
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private async Task HandleKeysInstallation(string filename)
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
string systemDirectory = AppDataManager.KeysDirPath;
|
||||||
|
if (AppDataManager.Mode == AppDataManager.LaunchMode.UserProfile && Directory.Exists(AppDataManager.KeysDirPathUser))
|
||||||
|
{
|
||||||
|
systemDirectory = AppDataManager.KeysDirPathUser;
|
||||||
|
}
|
||||||
|
|
||||||
|
string dialogTitle = LocaleManager.Instance.UpdateAndGetDynamicValue(LocaleKeys.DialogKeysInstallerKeysInstallTitle);
|
||||||
|
string dialogMessage = LocaleManager.Instance.UpdateAndGetDynamicValue(LocaleKeys.DialogKeysInstallerKeysInstallMessage);
|
||||||
|
|
||||||
|
bool alreadyKesyInstalled = ContentManager.AreKeysAlredyPresent(systemDirectory);
|
||||||
|
if (alreadyKesyInstalled)
|
||||||
|
{
|
||||||
|
dialogMessage += LocaleManager.Instance.UpdateAndGetDynamicValue(LocaleKeys.DialogKeysInstallerKeysInstallSubMessage);
|
||||||
|
}
|
||||||
|
|
||||||
|
dialogMessage += LocaleManager.Instance[LocaleKeys.DialogKeysInstallerKeysInstallConfirmMessage];
|
||||||
|
|
||||||
|
UserResult result = await ContentDialogHelper.CreateConfirmationDialog(
|
||||||
|
dialogTitle,
|
||||||
|
dialogMessage,
|
||||||
|
LocaleManager.Instance[LocaleKeys.InputDialogYes],
|
||||||
|
LocaleManager.Instance[LocaleKeys.InputDialogNo],
|
||||||
|
LocaleManager.Instance[LocaleKeys.RyujinxConfirm]);
|
||||||
|
|
||||||
|
UpdateWaitWindow waitingDialog = new(dialogTitle, LocaleManager.Instance[LocaleKeys.DialogKeysInstallerKeysInstallWaitMessage]);
|
||||||
|
|
||||||
|
if (result == UserResult.Yes)
|
||||||
|
{
|
||||||
|
Logger.Info?.Print(LogClass.Application, $"Installing Keys");
|
||||||
|
|
||||||
|
Thread thread = new(() =>
|
||||||
|
{
|
||||||
|
Dispatcher.UIThread.InvokeAsync(delegate
|
||||||
|
{
|
||||||
|
waitingDialog.Show();
|
||||||
|
});
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
|
ContentManager.InstallKeys(filename, systemDirectory);
|
||||||
|
|
||||||
|
Dispatcher.UIThread.InvokeAsync(async delegate
|
||||||
|
{
|
||||||
|
waitingDialog.Close();
|
||||||
|
|
||||||
|
string message = LocaleManager.Instance.UpdateAndGetDynamicValue(LocaleKeys.DialogKeysInstallerKeysInstallSuccessMessage);
|
||||||
|
|
||||||
|
await ContentDialogHelper.CreateInfoDialog(
|
||||||
|
dialogTitle,
|
||||||
|
message,
|
||||||
|
LocaleManager.Instance[LocaleKeys.InputDialogOk],
|
||||||
|
string.Empty,
|
||||||
|
LocaleManager.Instance[LocaleKeys.RyujinxInfo]);
|
||||||
|
|
||||||
|
Logger.Info?.Print(LogClass.Application, message);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
Dispatcher.UIThread.InvokeAsync(async () =>
|
||||||
|
{
|
||||||
|
waitingDialog.Close();
|
||||||
|
|
||||||
|
string message = ex.Message;
|
||||||
|
if(ex is FormatException)
|
||||||
|
{
|
||||||
|
message = LocaleManager.Instance.UpdateAndGetDynamicValue(LocaleKeys.DialogKeysInstallerKeysNotFoundErrorMessage, filename);
|
||||||
|
}
|
||||||
|
|
||||||
|
await ContentDialogHelper.CreateErrorDialog(message);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
finally
|
||||||
|
{
|
||||||
|
VirtualFileSystem.ReloadKeySet();
|
||||||
|
}
|
||||||
|
})
|
||||||
|
{
|
||||||
|
Name = "GUI.KeysInstallerThread",
|
||||||
|
};
|
||||||
|
|
||||||
|
thread.Start();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch (MissingKeyException ex)
|
||||||
|
{
|
||||||
|
if (Application.Current?.ApplicationLifetime is IClassicDesktopStyleApplicationLifetime)
|
||||||
|
{
|
||||||
|
Logger.Error?.Print(LogClass.Application, ex.ToString());
|
||||||
|
|
||||||
|
await UserErrorDialog.ShowUserErrorDialog(UserError.NoKeys);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
await ContentDialogHelper.CreateErrorDialog(ex.Message);
|
||||||
|
}
|
||||||
|
}
|
||||||
private void ProgressHandler<T>(T state, int current, int total) where T : Enum
|
private void ProgressHandler<T>(T state, int current, int total) where T : Enum
|
||||||
{
|
{
|
||||||
Dispatcher.UIThread.Post(() =>
|
Dispatcher.UIThread.Post(() =>
|
||||||
@@ -1395,7 +1498,7 @@ namespace Ryujinx.Ava.UI.ViewModels
|
|||||||
VolumeStatusText = args.VolumeStatus;
|
VolumeStatusText = args.VolumeStatus;
|
||||||
FifoStatusText = args.FifoStatus;
|
FifoStatusText = args.FifoStatus;
|
||||||
|
|
||||||
ShaderCountText = (ShowRightmostSeparator = args.ShaderCount > 0)
|
ShaderCountText = (ShowShaderCompilationHint = args.ShaderCount > 0)
|
||||||
? $"{LocaleManager.Instance[LocaleKeys.CompilingShaders]}: {args.ShaderCount}"
|
? $"{LocaleManager.Instance[LocaleKeys.CompilingShaders]}: {args.ShaderCount}"
|
||||||
: string.Empty;
|
: string.Empty;
|
||||||
|
|
||||||
@@ -1559,6 +1662,53 @@ namespace Ryujinx.Ava.UI.ViewModels
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public async Task InstallKeysFromFile()
|
||||||
|
{
|
||||||
|
var result = await StorageProvider.OpenFilePickerAsync(new FilePickerOpenOptions
|
||||||
|
{
|
||||||
|
AllowMultiple = false,
|
||||||
|
FileTypeFilter = new List<FilePickerFileType>
|
||||||
|
{
|
||||||
|
new(LocaleManager.Instance[LocaleKeys.FileDialogAllTypes])
|
||||||
|
{
|
||||||
|
Patterns = new[] { "*.keys", "*.zip" },
|
||||||
|
AppleUniformTypeIdentifiers = new[] { "com.ryujinx.xci", "public.zip-archive" },
|
||||||
|
MimeTypes = new[] { "application/keys", "application/zip" },
|
||||||
|
},
|
||||||
|
new("KEYS")
|
||||||
|
{
|
||||||
|
Patterns = new[] { "*.keys" },
|
||||||
|
AppleUniformTypeIdentifiers = new[] { "com.ryujinx.xci" },
|
||||||
|
MimeTypes = new[] { "application/keys" },
|
||||||
|
},
|
||||||
|
new("ZIP")
|
||||||
|
{
|
||||||
|
Patterns = new[] { "*.zip" },
|
||||||
|
AppleUniformTypeIdentifiers = new[] { "public.zip-archive" },
|
||||||
|
MimeTypes = new[] { "application/zip" },
|
||||||
|
},
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
|
if (result.Count > 0)
|
||||||
|
{
|
||||||
|
await HandleKeysInstallation(result[0].Path.LocalPath);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public async Task InstallKeysFromFolder()
|
||||||
|
{
|
||||||
|
var result = await StorageProvider.OpenFolderPickerAsync(new FolderPickerOpenOptions
|
||||||
|
{
|
||||||
|
AllowMultiple = false,
|
||||||
|
});
|
||||||
|
|
||||||
|
if (result.Count > 0)
|
||||||
|
{
|
||||||
|
await HandleKeysInstallation(result[0].Path.LocalPath);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public void OpenRyujinxFolder()
|
public void OpenRyujinxFolder()
|
||||||
{
|
{
|
||||||
OpenHelper.OpenFolder(AppDataManager.BaseDirPath);
|
OpenHelper.OpenFolder(AppDataManager.BaseDirPath);
|
||||||
@@ -1748,7 +1898,7 @@ namespace Ryujinx.Ava.UI.ViewModels
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public async Task LoadApplication(ApplicationData application, bool startFullscreen = false)
|
public async Task LoadApplication(ApplicationData application, bool startFullscreen = false, BlitStruct<ApplicationControlProperty>? customNacpData = null)
|
||||||
{
|
{
|
||||||
if (AppHost != null)
|
if (AppHost != null)
|
||||||
{
|
{
|
||||||
@@ -1786,7 +1936,7 @@ namespace Ryujinx.Ava.UI.ViewModels
|
|||||||
this,
|
this,
|
||||||
TopLevel);
|
TopLevel);
|
||||||
|
|
||||||
if (!await AppHost.LoadGuestApplication())
|
if (!await AppHost.LoadGuestApplication(customNacpData))
|
||||||
{
|
{
|
||||||
AppHost.DisposeContext();
|
AppHost.DisposeContext();
|
||||||
AppHost = null;
|
AppHost = null;
|
||||||
|
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user