mirror of
https://git.ryujinx.app/ryubing/ryujinx.git
synced 2025-09-18 08:35:10 +00:00
Compare commits
28 Commits
Canary-1.2
...
Canary-1.2
Author | SHA1 | Date | |
---|---|---|---|
|
8994e7476c | ||
|
b3944a18b7 | ||
|
18c957f90b | ||
|
1a005f96e7 | ||
|
072cd2824a | ||
|
9da97bc911 | ||
|
39252b7267 | ||
|
ec11bf2af9 | ||
|
8ae72c1a00 | ||
|
06abba25c1 | ||
|
de00a71690 | ||
|
315a1819c0 | ||
|
4ffb8aef12 | ||
|
290a6ad5de | ||
|
eda4f4349b | ||
|
5fbcb1f3a7 | ||
|
d00754477e | ||
|
0bc1eddaeb | ||
|
baad1e313f | ||
|
a1e6d11dcb | ||
|
3d168a8bfa | ||
|
000c1756de | ||
|
1d0152b961 | ||
|
07690e4527 | ||
|
08b7257be5 | ||
|
17483aad24 | ||
|
6b5cb151c3 | ||
|
3680df6092 |
42
.github/workflows/canary.yml
vendored
42
.github/workflows/canary.yml
vendored
@@ -54,7 +54,19 @@ jobs:
|
||||
with:
|
||||
name: "Canary ${{ steps.version_info.outputs.build_version }}"
|
||||
tag: ${{ steps.version_info.outputs.build_version }}
|
||||
body: "**Full Changelog**: https://github.com/${{ github.repository }}/compare/Canary-${{ steps.version_info.outputs.prev_build_version }}...Canary-${{ steps.version_info.outputs.build_version }}"
|
||||
body: |
|
||||
# Canary builds:
|
||||
|
||||
These builds are experimental and may sometimes not work, use [regular builds](https://github.com/${{ github.repository }}/releases/latest) instead if that sounds like something you don't want to deal with.
|
||||
|
||||
| Platform | Artifact |
|
||||
|--|--|
|
||||
| Windows 64 bit | [Canary Windows Artifact](https://github.com/${{ env.RYUJINX_TARGET_RELEASE_CHANNEL_OWNER }}/${{ env.RYUJINX_TARGET_RELEASE_CHANNEL_REPO }}/releases/download/${{ steps.version_info.outputs.build_version }}/ryujinx-canary-${{ steps.version_info.outputs.build_version }}-win_x64.zip) |
|
||||
| Linux 64 bit | [Canary Linux Artifact](https://github.com/${{ env.RYUJINX_TARGET_RELEASE_CHANNEL_OWNER }}/${{ env.RYUJINX_TARGET_RELEASE_CHANNEL_REPO }}/releases/download/${{ steps.version_info.outputs.build_version }}/ryujinx-canary-${{ steps.version_info.outputs.build_version }}-linux_x64.tar.gz) |
|
||||
| Linux arm 64 bit | [Canary Linux arm Artifact](https://github.com/${{ env.RYUJINX_TARGET_RELEASE_CHANNEL_OWNER }}/${{ env.RYUJINX_TARGET_RELEASE_CHANNEL_REPO }}/releases/download/${{ steps.version_info.outputs.build_version }}/ryujinx-canary-${{ steps.version_info.outputs.build_version }}-linux_arm64.tar.gz) |
|
||||
| macOS | [Canary macOS artifact](https://github.com/${{ env.RYUJINX_TARGET_RELEASE_CHANNEL_OWNER }}/${{ env.RYUJINX_TARGET_RELEASE_CHANNEL_REPO }}/releases/download/${{ steps.version_info.outputs.build_version }}/ryujinx-canary-${{ steps.version_info.outputs.build_version }}-macos_universal.app.tar.gz) |
|
||||
|
||||
**Full Changelog**: https://github.com/${{ env.RYUJINX_TARGET_RELEASE_CHANNEL_OWNER }}/${{ env.RYUJINX_TARGET_RELEASE_CHANNEL_REPO }}/compare/Canary-${{ steps.version_info.outputs.prev_build_version }}...Canary-${{ steps.version_info.outputs.build_version }}
|
||||
omitBodyDuringUpdate: true
|
||||
owner: ${{ env.RYUJINX_TARGET_RELEASE_CHANNEL_OWNER }}
|
||||
repo: ${{ env.RYUJINX_TARGET_RELEASE_CHANNEL_REPO }}
|
||||
@@ -181,7 +193,19 @@ jobs:
|
||||
artifacts: "release_output/*.tar.gz,release_output/*.zip"
|
||||
#artifacts: "release_output/*.tar.gz,release_output/*.zip/*AppImage*"
|
||||
tag: ${{ steps.version_info.outputs.build_version }}
|
||||
body: "**Full Changelog**: https://github.com/${{ github.repository }}/compare/Canary-${{ steps.version_info.outputs.prev_build_version }}...Canary-${{ steps.version_info.outputs.build_version }}"
|
||||
body: |
|
||||
# Canary builds:
|
||||
|
||||
These builds are experimental and may sometimes not work, use [regular builds](https://github.com/GreemDev/Ryujinx/releases/latest) instead if that sounds like something you don't want to deal with.
|
||||
|
||||
| Platform | Artifact |
|
||||
|--|--|
|
||||
| Windows 64 bit | https://github.com/${{ github.repository }}/releases/download/${{ steps.version_info.outputs.build_version }}/ryujinx-canary-${{ steps.version_info.outputs.build_version }}-win_x64.zip |
|
||||
| Linux 64 bit | https://github.com/${{ github.repository }}/releases/download/${{ steps.version_info.outputs.build_version }}/ryujinx-canary-${{ steps.version_info.outputs.build_version }}-linux_x64.tar.gz |
|
||||
| Linux arm 64 bit | https://github.com/${{ github.repository }}/releases/download/${{ steps.version_info.outputs.build_version }}/ryujinx-canary-${{ steps.version_info.outputs.build_version }}-linux_arm64.tar.gz |
|
||||
| Macos | https://github.com/${{ github.repository }}/releases/download/${{ steps.version_info.outputs.build_version }}/ryujinx-canary-${{ steps.version_info.outputs.build_version }}-macos_universal.app.tar.gz |
|
||||
|
||||
"**Full Changelog**: https://github.com/${{ github.repository }}/compare/Canary-${{ steps.version_info.outputs.prev_build_version }}...Canary-${{ steps.version_info.outputs.build_version }}"
|
||||
omitBodyDuringUpdate: true
|
||||
allowUpdates: true
|
||||
replacesArtifacts: true
|
||||
@@ -248,7 +272,19 @@ jobs:
|
||||
name: "Canary ${{ steps.version_info.outputs.build_version }}"
|
||||
artifacts: "publish_ava/*.tar.gz, publish_headless/*.tar.gz"
|
||||
tag: ${{ steps.version_info.outputs.build_version }}
|
||||
body: "**Full Changelog**: https://github.com/${{ github.repository }}/compare/Canary-${{ steps.version_info.outputs.prev_build_version }}...Canary-${{ steps.version_info.outputs.build_version }}"
|
||||
body: |
|
||||
# Canary builds:
|
||||
|
||||
These builds are experimental and may sometimes not work, use [regular builds](https://github.com/GreemDev/Ryujinx/releases/latest) instead if that sounds like something you don't want to deal with.
|
||||
|
||||
| Platform | Artifact |
|
||||
|--|--|
|
||||
| Windows 64 bit | https://github.com/${{ github.repository }}/releases/download/${{ steps.version_info.outputs.build_version }}/ryujinx-canary-${{ steps.version_info.outputs.build_version }}-win_x64.zip |
|
||||
| Linux 64 bit | https://github.com/${{ github.repository }}/releases/download/${{ steps.version_info.outputs.build_version }}/ryujinx-canary-${{ steps.version_info.outputs.build_version }}-linux_x64.tar.gz |
|
||||
| Linux arm 64 bit | https://github.com/${{ github.repository }}/releases/download/${{ steps.version_info.outputs.build_version }}/ryujinx-canary-${{ steps.version_info.outputs.build_version }}-linux_arm64.tar.gz |
|
||||
| Macos | https://github.com/${{ github.repository }}/releases/download/${{ steps.version_info.outputs.build_version }}/ryujinx-canary-${{ steps.version_info.outputs.build_version }}-macos_universal.app.tar.gz |
|
||||
|
||||
"**Full Changelog**: https://github.com/${{ github.repository }}/compare/Canary-${{ steps.version_info.outputs.prev_build_version }}...Canary-${{ steps.version_info.outputs.build_version }}"
|
||||
omitBodyDuringUpdate: true
|
||||
allowUpdates: true
|
||||
replacesArtifacts: true
|
||||
|
33
.github/workflows/release.yml
vendored
33
.github/workflows/release.yml
vendored
@@ -53,7 +53,16 @@ jobs:
|
||||
with:
|
||||
name: ${{ steps.version_info.outputs.build_version }}
|
||||
tag: ${{ steps.version_info.outputs.build_version }}
|
||||
body: "**Full Changelog**: https://github.com/${{ github.repository }}/compare/${{ steps.version_info.outputs.prev_build_version }}...${{ steps.version_info.outputs.build_version }}"
|
||||
body: |
|
||||
# Regular builds:
|
||||
| Platform | Artifact |
|
||||
|--|--|
|
||||
| Windows 64 bit | [Release Windows Artifact](https://github.com/${{ env.RYUJINX_TARGET_RELEASE_CHANNEL_OWNER }}/${{ env.RYUJINX_TARGET_RELEASE_CHANNEL_REPO }}/releases/download/${{ steps.version_info.outputs.build_version }}/ryujinx-${{ steps.version_info.outputs.build_version }}-win_x64.zip) |
|
||||
| Linux 64 bit | [Release Linux Artifact](https://github.com/${{ env.RYUJINX_TARGET_RELEASE_CHANNEL_OWNER }}/${{ env.RYUJINX_TARGET_RELEASE_CHANNEL_REPO }}/releases/download/${{ steps.version_info.outputs.build_version }}/ryujinx-${{ steps.version_info.outputs.build_version }}-linux_x64.tar.gz) |
|
||||
| Linux arm 64 bit | [Release Linux arm Artifact](https://github.com/${{ env.RYUJINX_TARGET_RELEASE_CHANNEL_OWNER }}/${{ env.RYUJINX_TARGET_RELEASE_CHANNEL_REPO }}/releases/download/${{ steps.version_info.outputs.build_version }}/ryujinx-${{ steps.version_info.outputs.build_version }}-linux_arm64.tar.gz) |
|
||||
| macOS | [Release macOS Artifact](https://github.com/${{ env.RYUJINX_TARGET_RELEASE_CHANNEL_OWNER }}/${{ env.RYUJINX_TARGET_RELEASE_CHANNEL_REPO }}/releases/download/${{ steps.version_info.outputs.build_version }}/ryujinx-${{ steps.version_info.outputs.build_version }}-macos_universal.app.tar.gz) |
|
||||
|
||||
**Full Changelog**: https://github.com/${{ env.RYUJINX_TARGET_RELEASE_CHANNEL_OWNER }}/${{ env.RYUJINX_TARGET_RELEASE_CHANNEL_REPO }}/compare/${{ steps.version_info.outputs.prev_build_version }}...${{ steps.version_info.outputs.build_version }}
|
||||
omitBodyDuringUpdate: true
|
||||
owner: ${{ env.RYUJINX_TARGET_RELEASE_CHANNEL_OWNER }}
|
||||
repo: ${{ env.RYUJINX_TARGET_RELEASE_CHANNEL_REPO }}
|
||||
@@ -176,7 +185,16 @@ jobs:
|
||||
name: ${{ steps.version_info.outputs.build_version }}
|
||||
artifacts: "release_output/*.tar.gz,release_output/*.zip,release_output/*AppImage*"
|
||||
tag: ${{ steps.version_info.outputs.build_version }}
|
||||
body: "**Full Changelog**: https://github.com/${{ github.repository }}/compare/${{ steps.version_info.outputs.prev_build_version }}...${{ steps.version_info.outputs.build_version }}"
|
||||
body: |
|
||||
# Regular builds:
|
||||
| Platform | Artifact |
|
||||
|--|--|
|
||||
| Windows 64 bit | https://github.com/${{ github.repository }}/releases/download/${{ steps.version_info.outputs.build_version }}/ryujinx-${{ steps.version_info.outputs.build_version }}-win_x64.zip |
|
||||
| Linux 64 bit | https://github.com/${{ github.repository }}/releases/download/${{ steps.version_info.outputs.build_version }}/ryujinx-${{ steps.version_info.outputs.build_version }}-linux_x64.tar.gz |
|
||||
| Linux arm 64 bit | https://github.com/${{ github.repository }}/releases/download/${{ steps.version_info.outputs.build_version }}/ryujinx-${{ steps.version_info.outputs.build_version }}-linux_arm64.tar.gz |
|
||||
| Macos | https://github.com/${{ github.repository }}/releases/download/${{ steps.version_info.outputs.build_version }}/ryujinx-${{ steps.version_info.outputs.build_version }}-macos_universal.app.tar.gz |
|
||||
|
||||
"**Full Changelog**: https://github.com/${{ github.repository }}/compare/${{ steps.version_info.outputs.prev_build_version }}...${{ steps.version_info.outputs.build_version }}"
|
||||
omitBodyDuringUpdate: true
|
||||
allowUpdates: true
|
||||
replacesArtifacts: true
|
||||
@@ -243,7 +261,16 @@ jobs:
|
||||
name: ${{ steps.version_info.outputs.build_version }}
|
||||
artifacts: "publish/*.tar.gz, publish_headless/*.tar.gz"
|
||||
tag: ${{ steps.version_info.outputs.build_version }}
|
||||
body: "**Full Changelog**: https://github.com/${{ github.repository }}/compare/${{ steps.version_info.outputs.prev_build_version }}...${{ steps.version_info.outputs.build_version }}"
|
||||
body: |
|
||||
# Regular builds:
|
||||
| Platform | Artifact |
|
||||
|--|--|
|
||||
| Windows 64 bit | https://github.com/${{ github.repository }}/releases/download/${{ steps.version_info.outputs.build_version }}/ryujinx-${{ steps.version_info.outputs.build_version }}-win_x64.zip |
|
||||
| Linux 64 bit | https://github.com/${{ github.repository }}/releases/download/${{ steps.version_info.outputs.build_version }}/ryujinx-${{ steps.version_info.outputs.build_version }}-linux_x64.tar.gz |
|
||||
| Linux arm 64 bit | https://github.com/${{ github.repository }}/releases/download/${{ steps.version_info.outputs.build_version }}/ryujinx-${{ steps.version_info.outputs.build_version }}-linux_arm64.tar.gz |
|
||||
| Macos | https://github.com/${{ github.repository }}/releases/download/${{ steps.version_info.outputs.build_version }}/ryujinx-${{ steps.version_info.outputs.build_version }}-macos_universal.app.tar.gz |
|
||||
|
||||
"**Full Changelog**: https://github.com/${{ github.repository }}/compare/${{ steps.version_info.outputs.prev_build_version }}...${{ steps.version_info.outputs.build_version }}"
|
||||
omitBodyDuringUpdate: true
|
||||
allowUpdates: true
|
||||
replacesArtifacts: true
|
||||
|
@@ -38,7 +38,7 @@
|
||||
<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.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="shaderc.net" Version="0.1.0" />
|
||||
<PackageVersion Include="SharpZipLib" Version="1.4.2" />
|
||||
|
@@ -14,7 +14,7 @@ if [ -z "$RYUJINX_BIN" ]; then
|
||||
exit 1
|
||||
fi
|
||||
|
||||
COMMAND="env DOTNET_EnableAlternateStackCheck=1"
|
||||
COMMAND="env LANG=C.UTF-8 DOTNET_EnableAlternateStackCheck=1"
|
||||
|
||||
if command -v gamemoderun > /dev/null 2>&1; then
|
||||
COMMAND="$COMMAND gamemoderun"
|
||||
|
@@ -40,11 +40,11 @@
|
||||
<key>CFBundlePackageType</key>
|
||||
<string>APPL</string>
|
||||
<key>CFBundleShortVersionString</key>
|
||||
<string>1.1</string>
|
||||
<string>1.2</string>
|
||||
<key>CFBundleSignature</key>
|
||||
<string>????</string>
|
||||
<key>CFBundleVersion</key>
|
||||
<string>1.1.0</string>
|
||||
<string>1.2.0</string>
|
||||
<key>NSHighResolutionCapable</key>
|
||||
<true/>
|
||||
<key>CSResourcesFileMapped</key>
|
||||
|
@@ -17,7 +17,7 @@ error_handler() {
|
||||
set the button_pressed to the button returned of the result
|
||||
|
||||
if the button_pressed is \"Open Download Page\" then
|
||||
open location \"https://ryujinx.org/download\"
|
||||
open location \"https://ryujinx.app/download\"
|
||||
end if
|
||||
"""
|
||||
|
||||
@@ -54,4 +54,4 @@ if [ "$#" -le 3 ]; then
|
||||
open -a "$INSTALL_DIRECTORY"
|
||||
else
|
||||
open -a "$INSTALL_DIRECTORY" --args "${APP_ARGUMENTS[@]}"
|
||||
fi
|
||||
fi
|
||||
|
@@ -88,7 +88,7 @@ namespace ARMeilleure.Instructions
|
||||
EmitSetTpidrEl0(context);
|
||||
return;
|
||||
case 0b11_011_1101_0000_101:
|
||||
EmitGetTpidr2El0(context);
|
||||
EmitSetTpidr2El0(context);
|
||||
return;
|
||||
|
||||
default:
|
||||
@@ -291,5 +291,16 @@ namespace ARMeilleure.Instructions
|
||||
|
||||
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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@@ -1,6 +1,8 @@
|
||||
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 bool InvertStickX { get; set; }
|
||||
|
@@ -1,5 +1,6 @@
|
||||
using Ryujinx.Common.Logging;
|
||||
using Ryujinx.HLE.HOS.Applets.Browser;
|
||||
using Ryujinx.HLE.HOS.Applets.Cabinet;
|
||||
using Ryujinx.HLE.HOS.Applets.Dummy;
|
||||
using Ryujinx.HLE.HOS.Applets.Error;
|
||||
using Ryujinx.HLE.HOS.Services.Am.AppletAE;
|
||||
@@ -23,14 +24,14 @@ namespace Ryujinx.HLE.HOS.Applets
|
||||
case AppletId.SoftwareKeyboard:
|
||||
return new SoftwareKeyboardApplet(system);
|
||||
case AppletId.LibAppletWeb:
|
||||
return new BrowserApplet(system);
|
||||
case AppletId.LibAppletShop:
|
||||
return new BrowserApplet(system);
|
||||
case AppletId.LibAppletOff:
|
||||
return new BrowserApplet(system);
|
||||
return new BrowserApplet();
|
||||
case AppletId.MiiEdit:
|
||||
Logger.Warning?.Print(LogClass.Application, $"Please use the MiiEdit inside File/Open Applet");
|
||||
return new DummyApplet(system);
|
||||
case AppletId.Cabinet:
|
||||
return new CabinetApplet(system);
|
||||
}
|
||||
|
||||
Logger.Warning?.Print(LogClass.Application, $"Applet {applet} not implemented!");
|
||||
|
@@ -18,13 +18,6 @@ namespace Ryujinx.HLE.HOS.Applets.Browser
|
||||
private List<BrowserArgument> _arguments;
|
||||
private ShimKind _shimKind;
|
||||
|
||||
public BrowserApplet(Horizon system) { }
|
||||
|
||||
public ResultCode GetResult()
|
||||
{
|
||||
return ResultCode.Success;
|
||||
}
|
||||
|
||||
public ResultCode Start(AppletSession normalSession, AppletSession interactiveSession)
|
||||
{
|
||||
_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;
|
||||
}
|
||||
|
||||
public ResultCode GetResult()
|
||||
{
|
||||
return ResultCode.Success;
|
||||
}
|
||||
|
||||
private static byte[] BuildResponse(ControllerSupportResultInfo result)
|
||||
{
|
||||
using MemoryStream stream = MemoryStreamManager.Shared.GetStream();
|
||||
|
@@ -11,11 +11,14 @@ namespace Ryujinx.HLE.HOS.Applets.Dummy
|
||||
{
|
||||
private readonly Horizon _system;
|
||||
private AppletSession _normalSession;
|
||||
|
||||
public event EventHandler AppletStateChanged;
|
||||
|
||||
public DummyApplet(Horizon system)
|
||||
{
|
||||
_system = system;
|
||||
}
|
||||
|
||||
public ResultCode Start(AppletSession normalSession, AppletSession interactiveSession)
|
||||
{
|
||||
_normalSession = normalSession;
|
||||
@@ -24,10 +27,7 @@ namespace Ryujinx.HLE.HOS.Applets.Dummy
|
||||
_system.ReturnFocus();
|
||||
return ResultCode.Success;
|
||||
}
|
||||
private static T ReadStruct<T>(byte[] data) where T : struct
|
||||
{
|
||||
return MemoryMarshal.Read<T>(data.AsSpan());
|
||||
}
|
||||
|
||||
private static byte[] BuildResponse()
|
||||
{
|
||||
using MemoryStream stream = MemoryStreamManager.Shared.GetStream();
|
||||
@@ -35,9 +35,5 @@ namespace Ryujinx.HLE.HOS.Applets.Dummy
|
||||
writer.Write((ulong)ResultCode.Success);
|
||||
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());
|
||||
}
|
||||
}
|
||||
|
||||
public ResultCode GetResult()
|
||||
{
|
||||
return ResultCode.Success;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@@ -13,7 +13,7 @@ namespace Ryujinx.HLE.HOS.Applets
|
||||
ResultCode Start(AppletSession normalSession,
|
||||
AppletSession interactiveSession);
|
||||
|
||||
ResultCode GetResult();
|
||||
ResultCode GetResult() => ResultCode.Success;
|
||||
|
||||
bool DrawTo(RenderingSurfaceInfo surfaceInfo, IVirtualMemoryManager destination, ulong position) => false;
|
||||
|
||||
|
@@ -37,11 +37,6 @@ namespace Ryujinx.HLE.HOS.Applets
|
||||
return ResultCode.Success;
|
||||
}
|
||||
|
||||
public ResultCode GetResult()
|
||||
{
|
||||
return ResultCode.Success;
|
||||
}
|
||||
|
||||
private byte[] BuildResponse()
|
||||
{
|
||||
UserProfile currentUser = _system.AccountManager.LastOpenedUser;
|
||||
|
@@ -144,11 +144,6 @@ namespace Ryujinx.HLE.HOS.Applets
|
||||
}
|
||||
}
|
||||
|
||||
public ResultCode GetResult()
|
||||
{
|
||||
return ResultCode.Success;
|
||||
}
|
||||
|
||||
private bool IsKeyboardActive()
|
||||
{
|
||||
return _backgroundState >= InlineKeyboardState.Appearing && _backgroundState < InlineKeyboardState.Disappearing;
|
||||
|
@@ -2,7 +2,7 @@ namespace Ryujinx.HLE.HOS.Applets.SoftwareKeyboard
|
||||
{
|
||||
/// <summary>
|
||||
/// 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>
|
||||
/// <typeparam name="T">The internal type.</typeparam>
|
||||
class TRef<T>
|
||||
|
@@ -5,5 +5,23 @@ namespace Ryujinx.HLE.HOS.Services.Ldn.Lp2p
|
||||
class IServiceCreator : IpcService
|
||||
{
|
||||
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 Open.Nat;
|
||||
using Ryujinx.Common.Logging;
|
||||
@@ -153,7 +155,10 @@ namespace Ryujinx.HLE.HOS.Services.Ldn.UserServiceCreator.LdnRyu.Proxy
|
||||
|
||||
if (_publicPort != 0)
|
||||
{
|
||||
_ = Task.Delay(PortLeaseRenew * 1000, _disposedCancellation.Token).ContinueWith((task) => Task.Run(RefreshLease));
|
||||
_ = Executor.ExecuteAfterDelayAsync(
|
||||
PortLeaseRenew.Seconds(),
|
||||
_disposedCancellation.Token,
|
||||
RefreshLease);
|
||||
}
|
||||
|
||||
_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)
|
||||
|
@@ -93,6 +93,13 @@ namespace Ryujinx.HLE.HOS.Services.Nfc.Nfp
|
||||
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)
|
||||
{
|
||||
VirtualAmiiboFile virtualAmiiboFile = LoadAmiiboFile(amiiboId);
|
||||
|
@@ -26,7 +26,7 @@ namespace Ryujinx.HLE.Loaders.Processes.Extensions
|
||||
{
|
||||
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.
|
||||
IStorage romFs = nca.GetRomFs(device, patchNca);
|
||||
@@ -55,6 +55,10 @@ namespace Ryujinx.HLE.Loaders.Processes.Extensions
|
||||
{
|
||||
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.
|
||||
|
||||
|
@@ -98,12 +98,12 @@ namespace Ryujinx.HLE.Loaders.Processes
|
||||
return false;
|
||||
}
|
||||
|
||||
public bool LoadNca(string path)
|
||||
public bool LoadNca(string path, BlitStruct<ApplicationControlProperty>? customNacpData = null)
|
||||
{
|
||||
FileStream file = new(path, FileMode.Open, FileAccess.Read);
|
||||
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))
|
||||
{
|
||||
|
@@ -84,12 +84,19 @@ namespace Ryujinx.HLE.Loaders.Processes
|
||||
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.
|
||||
string version = ProgramId > 0x0100000000007FFF
|
||||
? DisplayVersion
|
||||
string version = !isFirmware
|
||||
? (!string.IsNullOrWhiteSpace(DisplayVersion) ? DisplayVersion : "<Unknown Version>")
|
||||
: 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;
|
||||
}
|
||||
|
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.Integration;
|
||||
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 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 LoadProgram(string fileName) => Processes.LoadNxo(fileName);
|
||||
|
||||
|
@@ -24,6 +24,18 @@ namespace Ryujinx.HLE.UI
|
||||
/// <returns>True when OK is pressed, False otherwise.</returns>
|
||||
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>
|
||||
/// Tell the UI that we need to transition to another program.
|
||||
/// </summary>
|
||||
|
@@ -1,4 +1,5 @@
|
||||
using CommandLine;
|
||||
using Gommon;
|
||||
using LibHac.Tools.FsSystem;
|
||||
using Ryujinx.Audio.Backends.SDL2;
|
||||
using Ryujinx.Common;
|
||||
@@ -96,8 +97,13 @@ namespace Ryujinx.Headless.SDL2
|
||||
}
|
||||
|
||||
Parser.Default.ParseArguments<Options>(args)
|
||||
.WithParsed(Load)
|
||||
.WithNotParsed(errors => errors.Output());
|
||||
.WithParsed(Load)
|
||||
.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)
|
||||
@@ -579,8 +585,8 @@ namespace Ryujinx.Headless.SDL2
|
||||
options.MultiplayerLanInterfaceId,
|
||||
Common.Configuration.Multiplayer.MultiplayerMode.Disabled,
|
||||
false,
|
||||
"",
|
||||
"",
|
||||
string.Empty,
|
||||
string.Empty,
|
||||
options.CustomVSyncInterval);
|
||||
|
||||
return new Switch(configuration);
|
||||
|
@@ -1,4 +1,5 @@
|
||||
using Humanizer;
|
||||
using LibHac.Tools.Fs;
|
||||
using Ryujinx.Common.Configuration;
|
||||
using Ryujinx.Common.Configuration.Hid;
|
||||
using Ryujinx.Common.Logging;
|
||||
@@ -485,6 +486,19 @@ namespace Ryujinx.Headless.SDL2
|
||||
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)
|
||||
{
|
||||
if (_ignoreControllerApplet) return false;
|
||||
|
@@ -1,5 +1,4 @@
|
||||
using DynamicData;
|
||||
using DynamicData.Kernel;
|
||||
using Gommon;
|
||||
using LibHac;
|
||||
using LibHac.Common;
|
||||
@@ -37,14 +36,13 @@ using System.Threading.Tasks;
|
||||
using ContentType = LibHac.Ncm.ContentType;
|
||||
using MissingKeyException = LibHac.Common.Keys.MissingKeyException;
|
||||
using Path = System.IO.Path;
|
||||
using SpanHelpers = LibHac.Common.SpanHelpers;
|
||||
using TimeSpan = System.TimeSpan;
|
||||
|
||||
namespace Ryujinx.UI.App.Common
|
||||
{
|
||||
public class ApplicationLibrary
|
||||
{
|
||||
public static string DefaultLanPlayWebHost = "ryuldnweb.vudjun.com";
|
||||
public const string DefaultLanPlayWebHost = "ryuldnweb.vudjun.com";
|
||||
public Language DesiredLanguage { get; set; }
|
||||
public event EventHandler<ApplicationCountUpdatedEventArgs> ApplicationCountUpdated;
|
||||
public event EventHandler<LdnGameDataReceivedEventArgs> LdnGameDataReceived;
|
||||
@@ -191,12 +189,9 @@ namespace Ryujinx.UI.App.Common
|
||||
}
|
||||
}
|
||||
|
||||
if (isExeFs)
|
||||
{
|
||||
return GetApplicationFromExeFs(pfs, filePath);
|
||||
}
|
||||
|
||||
return null;
|
||||
return isExeFs
|
||||
? GetApplicationFromExeFs(pfs, filePath)
|
||||
: null;
|
||||
}
|
||||
|
||||
/// <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 ".nsp":
|
||||
{
|
||||
IntegrityCheckLevel checkLevel = ConfigurationState.Instance.System.EnableFsIntegrityChecks
|
||||
? IntegrityCheckLevel.ErrorOnInvalid
|
||||
: IntegrityCheckLevel.None;
|
||||
|
||||
using IFileSystem pfs = PartitionFileSystemUtils.OpenApplicationFileSystem(filePath, _virtualFileSystem);
|
||||
|
||||
foreach (DirectoryEntryEx fileEntry in pfs.EnumerateEntries("/", "*.nca"))
|
||||
@@ -604,7 +595,7 @@ namespace Ryujinx.UI.App.Common
|
||||
controlNca.OpenFileSystem(NcaSectionType.Data, IntegrityCheckLevel.None)
|
||||
.OpenFile(ref nacpFile.Ref, "/control.nacp".ToU8Span(), OpenMode.Read)
|
||||
.ThrowIfFailure();
|
||||
nacpFile.Get.Read(out _, 0, SpanHelpers.AsByteSpan(ref controlData),
|
||||
nacpFile.Get.Read(out _, 0, LibHac.Common.SpanHelpers.AsByteSpan(ref controlData),
|
||||
ReadOption.None).ThrowIfFailure();
|
||||
|
||||
var displayVersion = controlData.DisplayVersionString.ToString();
|
||||
@@ -827,7 +818,7 @@ namespace Ryujinx.UI.App.Common
|
||||
{
|
||||
_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.AddOrUpdate(dlcs);
|
||||
@@ -839,7 +830,7 @@ namespace Ryujinx.UI.App.Common
|
||||
{
|
||||
_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.AddOrUpdate(updates);
|
||||
@@ -1088,14 +1079,15 @@ namespace Ryujinx.UI.App.Common
|
||||
|
||||
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);
|
||||
|
||||
var shouldSelect = !currentlySelected.HasValue ||
|
||||
currentlySelected.Value.TitleUpdate.Version < update.Version;
|
||||
var shouldSelect = currentlySelected.Check(curr => curr.TitleUpdate?.Version < update.Version);
|
||||
|
||||
_titleUpdates.AddOrUpdate((update, shouldSelect));
|
||||
|
||||
|
||||
if (currentlySelected.HasValue && shouldSelect)
|
||||
{
|
||||
_titleUpdates.AddOrUpdate((currentlySelected.Value.TitleUpdate, false));
|
||||
@@ -1464,7 +1456,7 @@ namespace Ryujinx.UI.App.Common
|
||||
if (addedNewDlc)
|
||||
{
|
||||
var gameDlcs = it.Items.Where(dlc => dlc.Dlc.TitleIdBase == application.IdBase).ToList();
|
||||
DownloadableContentsHelper.SaveDownloadableContentsJson(_virtualFileSystem, application.IdBase,
|
||||
DownloadableContentsHelper.SaveDownloadableContentsJson(application.IdBase,
|
||||
gameDlcs);
|
||||
}
|
||||
}
|
||||
@@ -1483,11 +1475,11 @@ namespace Ryujinx.UI.App.Common
|
||||
TitleUpdatesHelper.LoadTitleUpdatesJson(_virtualFileSystem, application.IdBase);
|
||||
it.AddOrUpdate(savedUpdates);
|
||||
|
||||
var selectedUpdate = savedUpdates.FirstOrOptional(update => update.IsSelected);
|
||||
var selectedUpdate = savedUpdates.FindFirst(update => update.IsSelected);
|
||||
|
||||
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;
|
||||
|
||||
foreach (var update in bundledUpdates.OrderByDescending(bundled => bundled.Version))
|
||||
@@ -1495,12 +1487,11 @@ namespace Ryujinx.UI.App.Common
|
||||
if (!savedUpdateLookup.Contains(update))
|
||||
{
|
||||
bool shouldSelect = false;
|
||||
if (!selectedUpdate.HasValue || selectedUpdate.Value.Item1.Version < update.Version)
|
||||
if (selectedUpdate.Check(su => su.Update?.Version < update.Version))
|
||||
{
|
||||
shouldSelect = true;
|
||||
if (selectedUpdate.HasValue)
|
||||
_titleUpdates.AddOrUpdate((selectedUpdate.Value.Item1, false));
|
||||
selectedUpdate = DynamicData.Kernel.Optional<(TitleUpdateModel, bool IsSelected)>.Create((update, true));
|
||||
_titleUpdates.AddOrUpdate((selectedUpdate.Value.Update, false));
|
||||
selectedUpdate = (update, true);
|
||||
}
|
||||
|
||||
modifiedVersion = modifiedVersion || shouldSelect;
|
||||
@@ -1513,7 +1504,7 @@ namespace Ryujinx.UI.App.Common
|
||||
if (updatesChanged)
|
||||
{
|
||||
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)
|
||||
{
|
||||
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
|
||||
private void SaveTitleUpdatesForGame(ulong titleIdBase)
|
||||
{
|
||||
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
|
||||
|
@@ -1,16 +1,12 @@
|
||||
using ARMeilleure;
|
||||
using Ryujinx.Common.Configuration;
|
||||
using Ryujinx.Common.Configuration.Hid;
|
||||
using Ryujinx.Common.Configuration.Hid.Controller;
|
||||
using Ryujinx.Common.Configuration.Hid.Keyboard;
|
||||
using Ryujinx.Common.Configuration.Multiplayer;
|
||||
using Ryujinx.Common.Logging;
|
||||
using Ryujinx.Graphics.Vulkan;
|
||||
using Ryujinx.HLE;
|
||||
using Ryujinx.UI.Common.Configuration.System;
|
||||
using Ryujinx.UI.Common.Configuration.UI;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
|
||||
namespace Ryujinx.UI.Common.Configuration
|
||||
{
|
||||
@@ -21,10 +17,10 @@ namespace Ryujinx.UI.Common.Configuration
|
||||
if (Instance != null)
|
||||
{
|
||||
throw new InvalidOperationException("Configuration is already initialized");
|
||||
}
|
||||
}
|
||||
|
||||
Instance = new ConfigurationState();
|
||||
}
|
||||
}
|
||||
|
||||
public ConfigurationFileFormat ToFileFormat()
|
||||
{
|
||||
|
@@ -7,6 +7,24 @@ namespace Ryujinx.UI.Common.Helper
|
||||
{
|
||||
public static partial class ConsoleHelper
|
||||
{
|
||||
[SupportedOSPlatform("windows")]
|
||||
[LibraryImport("kernel32")]
|
||||
private static partial nint GetConsoleWindow();
|
||||
|
||||
[SupportedOSPlatform("windows")]
|
||||
[LibraryImport("user32")]
|
||||
[return: MarshalAs(UnmanagedType.Bool)]
|
||||
private static partial bool ShowWindow(nint hWnd, int nCmdShow);
|
||||
|
||||
[SupportedOSPlatform("windows")]
|
||||
[LibraryImport("user32")]
|
||||
private static partial nint GetForegroundWindow();
|
||||
|
||||
[SupportedOSPlatform("windows")]
|
||||
[LibraryImport("user32")]
|
||||
[return: MarshalAs(UnmanagedType.Bool)]
|
||||
private static partial bool SetForegroundWindow(nint hWnd);
|
||||
|
||||
public static bool SetConsoleWindowStateSupported => OperatingSystem.IsWindows();
|
||||
|
||||
public static void SetConsoleWindowState(bool show)
|
||||
@@ -35,16 +53,11 @@ namespace Ryujinx.UI.Common.Helper
|
||||
return;
|
||||
}
|
||||
|
||||
SetForegroundWindow(hWnd);
|
||||
|
||||
hWnd = GetForegroundWindow();
|
||||
|
||||
ShowWindow(hWnd, show ? SW_SHOW : SW_HIDE);
|
||||
}
|
||||
|
||||
[SupportedOSPlatform("windows")]
|
||||
[LibraryImport("kernel32")]
|
||||
private static partial nint GetConsoleWindow();
|
||||
|
||||
[SupportedOSPlatform("windows")]
|
||||
[LibraryImport("user32")]
|
||||
[return: MarshalAs(UnmanagedType.Bool)]
|
||||
private static partial bool ShowWindow(nint hWnd, int nCmdShow);
|
||||
}
|
||||
}
|
||||
|
@@ -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;
|
||||
List<DownloadableContentContainer> downloadableContentContainerList = new();
|
||||
|
@@ -28,7 +28,7 @@ namespace Ryujinx.UI.Common.Helper
|
||||
{
|
||||
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);
|
||||
|
||||
@@ -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
|
||||
{
|
||||
@@ -77,7 +77,7 @@ namespace Ryujinx.UI.Common.Helper
|
||||
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)>();
|
||||
|
||||
|
@@ -11,7 +11,7 @@
|
||||
</ResourceDictionary>
|
||||
</Application.Resources>
|
||||
<Application.Styles>
|
||||
<sty:FluentAvaloniaTheme PreferSystemTheme="False" />
|
||||
<sty:FluentAvaloniaTheme PreferUserAccentColor="True" PreferSystemTheme="False" />
|
||||
<StyleInclude Source="/Assets/Styles/Styles.xaml" />
|
||||
</Application.Styles>
|
||||
</Application>
|
||||
|
@@ -3,6 +3,8 @@ using Avalonia.Controls;
|
||||
using Avalonia.Controls.ApplicationLifetimes;
|
||||
using Avalonia.Input;
|
||||
using Avalonia.Threading;
|
||||
using LibHac.Common;
|
||||
using LibHac.Ns;
|
||||
using LibHac.Tools.FsSystem;
|
||||
using Ryujinx.Audio.Backends.Dummy;
|
||||
using Ryujinx.Audio.Backends.OpenAL;
|
||||
@@ -670,7 +672,7 @@ namespace Ryujinx.Ava
|
||||
_cursorState = CursorStates.ForceChangeCursor;
|
||||
}
|
||||
|
||||
public async Task<bool> LoadGuestApplication()
|
||||
public async Task<bool> LoadGuestApplication(BlitStruct<ApplicationControlProperty>? customNacpData = null)
|
||||
{
|
||||
InitializeSwitchInstance();
|
||||
MainWindow.UpdateGraphicsConfig();
|
||||
@@ -740,7 +742,7 @@ namespace Ryujinx.Ava
|
||||
{
|
||||
Logger.Info?.Print(LogClass.Application, "Loading as Firmware Title (NCA).");
|
||||
|
||||
if (!Device.LoadNca(ApplicationPath))
|
||||
if (!Device.LoadNca(ApplicationPath, customNacpData))
|
||||
{
|
||||
Device.Dispose();
|
||||
|
||||
@@ -1137,7 +1139,7 @@ namespace Ryujinx.Ava
|
||||
LocaleManager.Instance[LocaleKeys.VolumeShort] + $": {(int)(Device.GetVolume() * 100)}%",
|
||||
dockedMode,
|
||||
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} %",
|
||||
_displayCount));
|
||||
}
|
||||
|
@@ -552,15 +552,13 @@
|
||||
"AboutUrlTooltipMessage": "انقر لفتح موقع ريوجينكس في متصفحك الافتراضي.",
|
||||
"AboutDisclaimerMessage": "ريوجينكس لا ينتمي إلى نينتندو™،\nأو أي من شركائها بأي شكل من الأشكال.",
|
||||
"AboutAmiiboDisclaimerMessage": "AmiiboAPI (www.amiiboapi.com) يتم \nاستخدامه في محاكاة أمبيو لدينا.",
|
||||
"AboutPatreonUrlTooltipMessage": "انقر لفتح صفحة ريوجينكس في باتريون في متصفحك الافتراضي.",
|
||||
"AboutGithubUrlTooltipMessage": "انقر لفتح صفحة ريوجينكس في غيت هاب في متصفحك الافتراضي.",
|
||||
"AboutDiscordUrlTooltipMessage": "انقر لفتح دعوة إلى خادم ريوجينكس في ديكسورد في متصفحك الافتراضي.",
|
||||
"AboutTwitterUrlTooltipMessage": "انقر لفتح صفحة ريوجينكس في تويتر في متصفحك الافتراضي.",
|
||||
"AboutRyujinxAboutTitle": "حول:",
|
||||
"AboutRyujinxAboutContent": "ريوجينكس هو محاكي لجهاز نينتندو سويتش™.\nمن فضلك ادعمنا على باتريون.\nاحصل على آخر الأخبار على تويتر أو ديسكورد.\nيمكن للمطورين المهتمين بالمساهمة معرفة المزيد على غيت هاب أو ديسكورد.",
|
||||
"AboutRyujinxAboutContent": "Ryujinx is an emulator for the Nintendo Switch™.\nGet all the latest news in our Discord.\nDevelopers interested in contributing can find out more on our GitHub or Discord.",
|
||||
"AboutRyujinxMaintainersTitle": "تتم صيانته بواسطة:",
|
||||
"AboutRyujinxFormerMaintainersTitle": "Formerly Maintained By:",
|
||||
"AboutRyujinxMaintainersContentTooltipMessage": "انقر لفتح صفحة المساهمين في متصفحك الافتراضي.",
|
||||
"AboutRyujinxSupprtersTitle": "مدعوم على باتريون بواسطة:",
|
||||
"AmiiboSeriesLabel": "مجموعة أميبو",
|
||||
"AmiiboCharacterLabel": "شخصية",
|
||||
"AmiiboScanButtonLabel": "فحصه",
|
||||
@@ -702,6 +700,9 @@
|
||||
"Never": "مطلقا",
|
||||
"SwkbdMinCharacters": "يجب أن يبلغ طوله {0} حرفا على الأقل",
|
||||
"SwkbdMinRangeCharacters": "يجب أن يتكون من {0}-{1} حرفا",
|
||||
"CabinetTitle": "Cabinet Dialog",
|
||||
"CabinetDialog": "Enter your Amiibo's new name",
|
||||
"CabinetScanDialog": "Please scan your Amiibo now.",
|
||||
"SoftwareKeyboard": "لوحة المفاتيح البرمجية",
|
||||
"SoftwareKeyboardModeNumeric": "يجب أن يكون 0-9 أو '.' فقط",
|
||||
"SoftwareKeyboardModeAlphabet": "يجب أن تكون الأحرف غير CJK فقط",
|
||||
@@ -715,7 +716,6 @@
|
||||
"UpdaterAddingFiles": "إضافة ملفات جديدة...",
|
||||
"UpdaterExtracting": "استخراج التحديث...",
|
||||
"UpdaterDownloading": "تحميل التحديث...",
|
||||
"Game": "لعبة",
|
||||
"Docked": "تركيب بالمنصة",
|
||||
"Handheld": "محمول",
|
||||
"ConnectionError": "خطأ في الاتصال",
|
||||
@@ -786,7 +786,7 @@
|
||||
"CheatWindowHeading": "الغش متوفر لـ {0} [{1}]",
|
||||
"BuildId": "معرف البناء:",
|
||||
"DlcWindowBundledContentNotice": "Bundled DLC cannot be removed, only disabled.",
|
||||
"DlcWindowHeading": "المحتويات القابلة للتنزيل {0}",
|
||||
"DlcWindowHeading": "{0} DLC(s) available",
|
||||
"DlcWindowDlcAddedMessage": "{0} new downloadable content(s) added",
|
||||
"AutoloadDlcAddedMessage": "{0} new downloadable content(s) added",
|
||||
"AutoloadDlcRemovedMessage": "{0} missing downloadable content(s) removed",
|
||||
|
@@ -552,15 +552,13 @@
|
||||
"AboutUrlTooltipMessage": "Klicke hier, um die Ryujinx Website im Standardbrowser zu öffnen.",
|
||||
"AboutDisclaimerMessage": "Ryujinx ist in keinster Weise weder mit Nintendo™, \nnoch mit deren Partnern verbunden.",
|
||||
"AboutAmiiboDisclaimerMessage": "AmiiboAPI (www.amiiboapi.com) wird in unserer Amiibo \nEmulation benutzt.",
|
||||
"AboutPatreonUrlTooltipMessage": "Klicke hier, um die Ryujinx Patreon Seite im Standardbrowser zu öffnen.",
|
||||
"AboutGithubUrlTooltipMessage": "Klicke hier, um die Ryujinx GitHub Seite im Standardbrowser zu öffnen.",
|
||||
"AboutDiscordUrlTooltipMessage": "Klicke hier, um eine Einladung zum Ryujinx Discord Server im Standardbrowser zu öffnen.",
|
||||
"AboutTwitterUrlTooltipMessage": "Klicke hier, um die Ryujinx Twitter Seite im Standardbrowser zu öffnen.",
|
||||
"AboutRyujinxAboutTitle": "Über:",
|
||||
"AboutRyujinxAboutContent": "Ryujinx ist ein Nintendo Switch™ Emulator.\nBitte unterstütze uns auf Patreon.\nAuf Twitter oder Discord erfährst du alle Neuigkeiten.\nEntwickler, die an einer Mitarbeit interessiert sind, können auf GitHub oder Discord mehr erfahren.",
|
||||
"AboutRyujinxAboutContent": "Ryujinx is an emulator for the Nintendo Switch™.\nGet all the latest news in our Discord.\nDevelopers interested in contributing can find out more on our GitHub or Discord.",
|
||||
"AboutRyujinxMaintainersTitle": "Entwickelt von:",
|
||||
"AboutRyujinxFormerMaintainersTitle": "Formerly Maintained By:",
|
||||
"AboutRyujinxMaintainersContentTooltipMessage": "Klicke hier, um die Liste der Mitwirkenden im Standardbrowser zu öffnen.",
|
||||
"AboutRyujinxSupprtersTitle": "Unterstützt auf Patreon von:",
|
||||
"AmiiboSeriesLabel": "Amiibo-Serie",
|
||||
"AmiiboCharacterLabel": "Charakter",
|
||||
"AmiiboScanButtonLabel": "Einscannen",
|
||||
@@ -702,6 +700,9 @@
|
||||
"Never": "Niemals",
|
||||
"SwkbdMinCharacters": "Muss mindestens {0} 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",
|
||||
"SoftwareKeyboardModeNumeric": "Darf nur 0-9 oder \".\" sein",
|
||||
"SoftwareKeyboardModeAlphabet": "Keine CJK-Zeichen",
|
||||
@@ -715,7 +716,6 @@
|
||||
"UpdaterAddingFiles": "Neue Dateien hinzufügen...",
|
||||
"UpdaterExtracting": "Update extrahieren...",
|
||||
"UpdaterDownloading": "Update herunterladen...",
|
||||
"Game": "Spiel",
|
||||
"Docked": "Docked",
|
||||
"Handheld": "Handheld",
|
||||
"ConnectionError": "Verbindungsfehler.",
|
||||
@@ -786,7 +786,7 @@
|
||||
"CheatWindowHeading": "Cheats verfügbar für {0} [{1}]",
|
||||
"DlcWindowBundledContentNotice": "Bundled DLC cannot be removed, only disabled.",
|
||||
"BuildId": "BuildId:",
|
||||
"DlcWindowHeading": "DLC verfügbar für {0} [{1}]",
|
||||
"DlcWindowHeading": "{0} DLC(s) available",
|
||||
"DlcWindowDlcAddedMessage": "{0} new downloadable content(s) added",
|
||||
"AutoloadDlcAddedMessage": "{0} new downloadable content(s) added",
|
||||
"AutoloadDlcRemovedMessage": "{0} missing downloadable content(s) removed",
|
||||
|
@@ -552,15 +552,13 @@
|
||||
"AboutUrlTooltipMessage": "Κάντε κλικ για να ανοίξετε τον ιστότοπο Ryujinx στο προεπιλεγμένο πρόγραμμα περιήγησης.",
|
||||
"AboutDisclaimerMessage": "Το Ryujinx δεν είναι συνδεδεμένο με τη Nintendo™,\nούτε με κανέναν από τους συνεργάτες της, με οποιονδήποτε τρόπο.",
|
||||
"AboutAmiiboDisclaimerMessage": "Το AmiiboAPI (www.amiiboapi.com) χρησιμοποιείται\nστην προσομοίωση Amiibo.",
|
||||
"AboutPatreonUrlTooltipMessage": "Κάντε κλικ για να ανοίξετε τη σελίδα Ryujinx Patreon στο προεπιλεγμένο πρόγραμμα περιήγησης.",
|
||||
"AboutGithubUrlTooltipMessage": "Κάντε κλικ για να ανοίξετε τη σελίδα Ryujinx GitHub στο προεπιλεγμένο πρόγραμμα περιήγησης.",
|
||||
"AboutDiscordUrlTooltipMessage": "Κάντε κλικ για να ανοίξετε μία πρόσκληση στον διακομιστή Ryujinx Discord στο προεπιλεγμένο πρόγραμμα περιήγησης.",
|
||||
"AboutTwitterUrlTooltipMessage": "Κάντε κλικ για να ανοίξετε τη σελίδα Ryujinx Twitter στο προεπιλεγμένο πρόγραμμα περιήγησης.",
|
||||
"AboutRyujinxAboutTitle": "Σχετικά με:",
|
||||
"AboutRyujinxAboutContent": "Το Ryujinx είναι ένας εξομοιωτής για το Nintendo Switch™.\nΥποστηρίξτε μας στο Patreon.\nΛάβετε όλα τα τελευταία νέα στο Twitter ή στο Discord.\nΟι προγραμματιστές που ενδιαφέρονται να συνεισφέρουν μπορούν να μάθουν περισσότερα στο GitHub ή στο Discord μας.",
|
||||
"AboutRyujinxAboutContent": "Ryujinx is an emulator for the Nintendo Switch™.\nGet all the latest news in our Discord.\nDevelopers interested in contributing can find out more on our GitHub or Discord.",
|
||||
"AboutRyujinxMaintainersTitle": "Συντηρείται από:",
|
||||
"AboutRyujinxFormerMaintainersTitle": "Formerly Maintained By:",
|
||||
"AboutRyujinxMaintainersContentTooltipMessage": "Κάντε κλικ για να ανοίξετε τη σελίδα Συνεισφέροντες στο προεπιλεγμένο πρόγραμμα περιήγησης.",
|
||||
"AboutRyujinxSupprtersTitle": "Υποστηρίζεται στο Patreon από:",
|
||||
"AmiiboSeriesLabel": "Σειρά Amiibo",
|
||||
"AmiiboCharacterLabel": "Χαρακτήρας",
|
||||
"AmiiboScanButtonLabel": "Σαρώστε το",
|
||||
@@ -702,6 +700,9 @@
|
||||
"Never": "Ποτέ",
|
||||
"SwkbdMinCharacters": "Πρέπει να έχει μήκος τουλάχιστον {0} χαρακτήρες",
|
||||
"SwkbdMinRangeCharacters": "Πρέπει να έχει μήκος {0}-{1} χαρακτήρες",
|
||||
"CabinetTitle": "Cabinet Dialog",
|
||||
"CabinetDialog": "Enter your Amiibo's new name",
|
||||
"CabinetScanDialog": "Please scan your Amiibo now.",
|
||||
"SoftwareKeyboard": "Εικονικό Πληκτρολόγιο",
|
||||
"SoftwareKeyboardModeNumeric": "Πρέπει να είναι 0-9 ή '.' μόνο",
|
||||
"SoftwareKeyboardModeAlphabet": "Πρέπει να μην είναι μόνο χαρακτήρες CJK",
|
||||
@@ -715,7 +716,6 @@
|
||||
"UpdaterAddingFiles": "Προσθήκη Νέων Αρχείων...",
|
||||
"UpdaterExtracting": "Εξαγωγή Ενημέρωσης...",
|
||||
"UpdaterDownloading": "Λήψη Ενημέρωσης...",
|
||||
"Game": "Παιχνίδι",
|
||||
"Docked": "Προσκολλημένο",
|
||||
"Handheld": "Χειροκίνητο",
|
||||
"ConnectionError": "Σφάλμα Σύνδεσης.",
|
||||
@@ -786,7 +786,7 @@
|
||||
"CheatWindowHeading": "Διαθέσιμα Cheats για {0} [{1}]",
|
||||
"BuildId": "BuildId:",
|
||||
"DlcWindowBundledContentNotice": "Bundled DLC cannot be removed, only disabled.",
|
||||
"DlcWindowHeading": "{0} Downloadable Content(s) available for {1} ({2})",
|
||||
"DlcWindowHeading": "{0} DLC(s) available",
|
||||
"DlcWindowDlcAddedMessage": "{0} new downloadable content(s) added",
|
||||
"AutoloadDlcAddedMessage": "{0} new downloadable content(s) added",
|
||||
"AutoloadDlcRemovedMessage": "{0} missing downloadable content(s) removed",
|
||||
|
@@ -564,15 +564,13 @@
|
||||
"AboutUrlTooltipMessage": "Click to open the Ryujinx website in your default browser.",
|
||||
"AboutDisclaimerMessage": "Ryujinx is not affiliated with Nintendo™,\nor any of its partners, in any way.",
|
||||
"AboutAmiiboDisclaimerMessage": "AmiiboAPI (www.amiiboapi.com) is used\nin our Amiibo emulation.",
|
||||
"AboutPatreonUrlTooltipMessage": "Click to open the Ryujinx Patreon page in your default browser.",
|
||||
"AboutGithubUrlTooltipMessage": "Click to open the Ryujinx GitHub page in your default browser.",
|
||||
"AboutDiscordUrlTooltipMessage": "Click to open an invite to the Ryujinx Discord server in your default browser.",
|
||||
"AboutTwitterUrlTooltipMessage": "Click to open the Ryujinx Twitter page in your default browser.",
|
||||
"AboutRyujinxAboutTitle": "About:",
|
||||
"AboutRyujinxAboutContent": "Ryujinx is an emulator for the Nintendo Switch™.\nPlease support us on Patreon.\nGet all the latest news on our Twitter or Discord.\nDevelopers interested in contributing can find out more on our GitHub or Discord.",
|
||||
"AboutRyujinxAboutContent": "Ryujinx is an emulator for the Nintendo Switch™.\nGet all the latest news in our Discord.\nDevelopers interested in contributing can find out more on our GitHub or Discord.",
|
||||
"AboutRyujinxMaintainersTitle": "Maintained By:",
|
||||
"AboutRyujinxFormerMaintainersTitle": "Formerly Maintained By:",
|
||||
"AboutRyujinxMaintainersContentTooltipMessage": "Click to open the Contributors page in your default browser.",
|
||||
"AboutRyujinxSupprtersTitle": "Supported on Patreon By:",
|
||||
"AmiiboSeriesLabel": "Amiibo Series",
|
||||
"AmiiboCharacterLabel": "Character",
|
||||
"AmiiboScanButtonLabel": "Scan It",
|
||||
@@ -714,6 +712,9 @@
|
||||
"Never": "Never",
|
||||
"SwkbdMinCharacters": "Must be at least {0} 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",
|
||||
"SoftwareKeyboardModeNumeric": "Must be 0-9 or '.' only",
|
||||
"SoftwareKeyboardModeAlphabet": "Must be non CJK-characters only",
|
||||
@@ -727,7 +728,6 @@
|
||||
"UpdaterAddingFiles": "Adding New Files...",
|
||||
"UpdaterExtracting": "Extracting Update...",
|
||||
"UpdaterDownloading": "Downloading Update...",
|
||||
"Game": "Game",
|
||||
"Docked": "Docked",
|
||||
"Handheld": "Handheld",
|
||||
"ConnectionError": "Connection Error.",
|
||||
@@ -800,7 +800,7 @@
|
||||
"CheatWindowHeading": "Cheats Available for {0} [{1}]",
|
||||
"BuildId": "BuildId:",
|
||||
"DlcWindowBundledContentNotice": "Bundled DLC cannot be removed, only disabled.",
|
||||
"DlcWindowHeading": "{0} Downloadable Content(s) available for {1} ({2})",
|
||||
"DlcWindowHeading": "{0} DLC(s) available",
|
||||
"DlcWindowDlcAddedMessage": "{0} new downloadable content(s) added",
|
||||
"AutoloadDlcAddedMessage": "{0} new downloadable content(s) added",
|
||||
"AutoloadDlcRemovedMessage": "{0} missing downloadable content(s) removed",
|
||||
|
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"Language": "Español (ES)",
|
||||
"MenuBarFileOpenApplet": "Abrir applet",
|
||||
"MenuBarFileOpenAppletOpenMiiApplet": "Mii Edit Applet",
|
||||
"MenuBarFileOpenAppletOpenMiiApplet": "Applet Editor Mii",
|
||||
"MenuBarFileOpenAppletOpenMiiAppletToolTip": "Abre el editor de Mii en modo autónomo",
|
||||
"SettingsTabInputDirectMouseAccess": "Acceso directo al ratón",
|
||||
"SettingsTabSystemMemoryManagerMode": "Modo del administrador de memoria:",
|
||||
@@ -32,12 +32,12 @@
|
||||
"MenuBarFileToolsInstallFirmwareFromFile": "Instalar firmware desde un archivo XCI o ZIP",
|
||||
"MenuBarFileToolsInstallFirmwareFromDirectory": "Instalar firmware desde una carpeta",
|
||||
"MenuBarToolsInstallKeys": "Install Keys",
|
||||
"MenuBarFileToolsInstallKeysFromFile": "Install keys from KEYS or ZIP",
|
||||
"MenuBarFileToolsInstallKeysFromFolder": "Install keys from a directory",
|
||||
"MenuBarFileToolsInstallKeysFromFile": "Instalar keys de KEYS o ZIP",
|
||||
"MenuBarFileToolsInstallKeysFromFolder": "Instalar keys de un directorio",
|
||||
"MenuBarToolsManageFileTypes": "Administrar tipos de archivo",
|
||||
"MenuBarToolsInstallFileTypes": "Instalar tipos de archivo",
|
||||
"MenuBarToolsUninstallFileTypes": "Desinstalar tipos de archivo",
|
||||
"MenuBarToolsXCITrimmer": "Trim XCI Files",
|
||||
"MenuBarToolsXCITrimmer": "Recortar archivos XCI",
|
||||
"MenuBarView": "_View",
|
||||
"MenuBarViewWindow": "Tamaño Ventana",
|
||||
"MenuBarViewWindow720": "720p",
|
||||
@@ -89,11 +89,11 @@
|
||||
"GameListContextMenuOpenModsDirectoryToolTip": "Abre el directorio que contiene los Mods de la Aplicación.",
|
||||
"GameListContextMenuOpenSdModsDirectory": "Abrir Directorio de Mods de Atmosphere\n\n\n\n\n\n",
|
||||
"GameListContextMenuOpenSdModsDirectoryToolTip": "Abre el directorio alternativo de la tarjeta SD de Atmosphere que contiene los Mods de la Aplicación. Útil para los mods que están empaquetados para el hardware real.",
|
||||
"GameListContextMenuTrimXCI": "Check and Trim XCI File",
|
||||
"GameListContextMenuTrimXCIToolTip": "Check and Trim XCI File to Save Disk Space",
|
||||
"GameListContextMenuTrimXCI": "Verificar y recortar archivo XCI",
|
||||
"GameListContextMenuTrimXCIToolTip": "Verificar y recortar archivo XCI para ahorrar espacio en disco",
|
||||
"StatusBarGamesLoaded": "{0}/{1} juegos cargados",
|
||||
"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",
|
||||
"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.",
|
||||
@@ -480,7 +480,7 @@
|
||||
"DialogUninstallFileTypesSuccessMessage": "¡Tipos de archivos desinstalados con éxito!",
|
||||
"DialogUninstallFileTypesErrorMessage": "No se pudo desinstalar los tipos de archivo.",
|
||||
"DialogOpenSettingsWindowLabel": "Abrir ventana de opciones",
|
||||
"DialogOpenXCITrimmerWindowLabel": "XCI Trimmer Window",
|
||||
"DialogOpenXCITrimmerWindowLabel": "Ventana recortador XCI",
|
||||
"DialogControllerAppletTitle": "Applet de mandos",
|
||||
"DialogMessageDialogErrorExceptionMessage": "Error al mostrar cuadro de diálogo: {0}",
|
||||
"DialogSoftwareKeyboardErrorExceptionMessage": "Error al mostrar teclado de software: {0}",
|
||||
@@ -509,13 +509,13 @@
|
||||
"DialogFirmwareInstallerFirmwareInstallConfirmMessage": "\n\n¿Continuar?",
|
||||
"DialogFirmwareInstallerFirmwareInstallWaitMessage": "Instalando firmware...",
|
||||
"DialogFirmwareInstallerFirmwareInstallSuccessMessage": "Versión de sistema {0} instalada con éxito.",
|
||||
"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.",
|
||||
"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",
|
||||
"DialogUserProfileDeletionConfirmMessage": "¿Quieres eliminar el perfil seleccionado?",
|
||||
"DialogUserProfileUnsavedChangesTitle": "Advertencia - Cambios sin guardar",
|
||||
@@ -552,15 +552,13 @@
|
||||
"AboutUrlTooltipMessage": "Haz clic para abrir el sitio web de Ryujinx en tu navegador predeterminado.",
|
||||
"AboutDisclaimerMessage": "Ryujinx no tiene afiliación alguna con Nintendo™,\nni con ninguno de sus socios.",
|
||||
"AboutAmiiboDisclaimerMessage": "Utilizamos AmiiboAPI (www.amiiboapi.com)\nen nuestra emulación de Amiibo.",
|
||||
"AboutPatreonUrlTooltipMessage": "Haz clic para abrir el Patreon de Ryujinx en tu navegador predeterminado.",
|
||||
"AboutGithubUrlTooltipMessage": "Haz clic para abrir el GitHub de Ryujinx en tu navegador predeterminado.",
|
||||
"AboutDiscordUrlTooltipMessage": "Haz clic para recibir una invitación al Discord de Ryujinx en tu navegador predeterminado.",
|
||||
"AboutTwitterUrlTooltipMessage": "Haz clic para abrir el Twitter de Ryujinx en tu navegador predeterminado.",
|
||||
"AboutRyujinxAboutTitle": "Acerca de:",
|
||||
"AboutRyujinxAboutContent": "Ryujinx es un emulador para Nintendo Switch™.\nPor favor, apóyanos en Patreon.\nEncuentra las noticias más recientes en nuestro Twitter o Discord.\nDesarrolladores interesados en contribuir pueden encontrar más información en GitHub o Discord.",
|
||||
"AboutRyujinxAboutContent": "Ryujinx is an emulator for the Nintendo Switch™.\nGet all the latest news in our Discord.\nDevelopers interested in contributing can find out more on our GitHub or Discord.",
|
||||
"AboutRyujinxMaintainersTitle": "Mantenido por:",
|
||||
"AboutRyujinxFormerMaintainersTitle": "Formerly Maintained By:",
|
||||
"AboutRyujinxMaintainersContentTooltipMessage": "Haz clic para abrir la página de contribuidores en tu navegador predeterminado.",
|
||||
"AboutRyujinxSupprtersTitle": "Apoyado en Patreon Por:",
|
||||
"AmiiboSeriesLabel": "Serie de Amiibo",
|
||||
"AmiiboCharacterLabel": "Personaje",
|
||||
"AmiiboScanButtonLabel": "Escanear",
|
||||
@@ -688,20 +686,23 @@
|
||||
"OpenSetupGuideMessage": "Abrir la guía de instalación",
|
||||
"NoUpdate": "No actualizado",
|
||||
"TitleUpdateVersionLabel": "Versión {0} - {1}",
|
||||
"TitleBundledUpdateVersionLabel": "Bundled: Version {0}",
|
||||
"TitleBundledDlcLabel": "Bundled:",
|
||||
"TitleXCIStatusPartialLabel": "Partial",
|
||||
"TitleXCIStatusTrimmableLabel": "Untrimmed",
|
||||
"TitleXCIStatusUntrimmableLabel": "Trimmed",
|
||||
"TitleXCIStatusFailedLabel": "(Failed)",
|
||||
"TitleXCICanSaveLabel": "Save {0:n0} Mb",
|
||||
"TitleXCISavingLabel": "Saved {0:n0} Mb",
|
||||
"TitleBundledUpdateVersionLabel": "Incorporado: Versión {0}",
|
||||
"TitleBundledDlcLabel": "Incorporado:",
|
||||
"TitleXCIStatusPartialLabel": "Parcial",
|
||||
"TitleXCIStatusTrimmableLabel": "Sin recortar",
|
||||
"TitleXCIStatusUntrimmableLabel": "Recortado",
|
||||
"TitleXCIStatusFailedLabel": "(Fallido)",
|
||||
"TitleXCICanSaveLabel": "Ahorra {0:n0} Mb",
|
||||
"TitleXCISavingLabel": "{0:n0} Mb ahorrado(s)",
|
||||
"RyujinxInfo": "Ryujinx - Info",
|
||||
"RyujinxConfirm": "Ryujinx - Confirmación",
|
||||
"FileDialogAllTypes": "Todos los tipos",
|
||||
"Never": "Nunca",
|
||||
"SwkbdMinCharacters": "Debe tener al menos {0} 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",
|
||||
"SoftwareKeyboardModeNumeric": "Debe ser sólo 0-9 o '.'",
|
||||
"SoftwareKeyboardModeAlphabet": "Solo deben ser caracteres no CJK",
|
||||
@@ -715,7 +716,6 @@
|
||||
"UpdaterAddingFiles": "Añadiendo nuevos archivos...",
|
||||
"UpdaterExtracting": "Extrayendo actualización...",
|
||||
"UpdaterDownloading": "Descargando actualización...",
|
||||
"Game": "Juego",
|
||||
"Docked": "Dock/TV",
|
||||
"Handheld": "Portátil",
|
||||
"ConnectionError": "Error de conexión.",
|
||||
@@ -748,44 +748,44 @@
|
||||
"SelectDlcDialogTitle": "Selecciona archivo(s) de DLC",
|
||||
"SelectUpdateDialogTitle": "Selecciona archivo(s) de actualización",
|
||||
"SelectModDialogTitle": "Seleccionar un directorio de Mods",
|
||||
"TrimXCIFileDialogTitle": "Check and Trim XCI File",
|
||||
"TrimXCIFileDialogPrimaryText": "This function will first check the empty space and then trim the XCI File to save disk space.",
|
||||
"TrimXCIFileDialogSecondaryText": "Current File Size: {0:n} MB\nGame Data Size: {1:n} MB\nDisk Space Savings: {2:n} MB",
|
||||
"TrimXCIFileNoTrimNecessary": "XCI File does not need to be trimmed. Check logs for further details",
|
||||
"TrimXCIFileNoUntrimPossible": "XCI File cannot be untrimmed. Check logs for further details",
|
||||
"TrimXCIFileReadOnlyFileCannotFix": "XCI File is Read Only and could not be made writable. Check logs for further details",
|
||||
"TrimXCIFileFileSizeChanged": "XCI File has changed in size since it was scanned. Please check the file is not being written to and try again.",
|
||||
"TrimXCIFileFreeSpaceCheckFailed": "XCI File has data in the free space area, it is not safe to trim",
|
||||
"TrimXCIFileInvalidXCIFile": "XCI File contains invalid data. Check logs for further details",
|
||||
"TrimXCIFileFileIOWriteError": "XCI File could not be opened for writing. Check logs for further details",
|
||||
"TrimXCIFileFailedPrimaryText": "Trimming of the XCI file failed",
|
||||
"TrimXCIFileCancelled": "The operation was cancelled",
|
||||
"TrimXCIFileFileUndertermined": "No operation was performed",
|
||||
"TrimXCIFileDialogTitle": "Verificar y recortar archivo XCI",
|
||||
"TrimXCIFileDialogPrimaryText": "Esta función verificará el espacio vacío y después recortará el archivo XCI para ahorrar espacio en disco",
|
||||
"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": "El archivo XCI no necesita ser recortado. Verifica los logs para más detalles.",
|
||||
"TrimXCIFileNoUntrimPossible": "El recorte del archivo XCI no puede ser deshecho. Verifica los registros para más detalles.",
|
||||
"TrimXCIFileReadOnlyFileCannotFix": "El archivo XCI es de solo Lectura y no se le puede escribir. Lee el registro para más información.",
|
||||
"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": "El archivo XCI tiene datos en el área de espacio libre, no es seguro recortar.",
|
||||
"TrimXCIFileInvalidXCIFile": "El archivo XCI contiene datos inválidos. Lee el registro para más información.",
|
||||
"TrimXCIFileFileIOWriteError": "El archivo XCI no se puede abrir para escribirlo. Lee el registro para más información.",
|
||||
"TrimXCIFileFailedPrimaryText": "El recorte del archivo XCI falló",
|
||||
"TrimXCIFileCancelled": "La operación fue cancelada",
|
||||
"TrimXCIFileFileUndertermined": "No se realizó ninguna operación",
|
||||
"UserProfileWindowTitle": "Administrar perfiles de usuario",
|
||||
"CheatWindowTitle": "Administrar cheats",
|
||||
"DlcWindowTitle": "Administrar contenido descargable",
|
||||
"ModWindowTitle": "Administrar Mods para {0} ({1})",
|
||||
"UpdateWindowTitle": "Administrar actualizaciones",
|
||||
"XCITrimmerWindowTitle": "XCI File Trimmer",
|
||||
"XCITrimmerTitleStatusCount": "{0} of {1} Title(s) Selected",
|
||||
"XCITrimmerTitleStatusCountWithFilter": "{0} of {1} Title(s) Selected ({2} displayed)",
|
||||
"XCITrimmerTitleStatusTrimming": "Trimming {0} Title(s)...",
|
||||
"XCITrimmerTitleStatusUntrimming": "Untrimming {0} Title(s)...",
|
||||
"XCITrimmerTitleStatusFailed": "Failed",
|
||||
"XCITrimmerPotentialSavings": "Potential Savings",
|
||||
"XCITrimmerActualSavings": "Actual Savings",
|
||||
"XCITrimmerWindowTitle": "Recortador de archivos XCI",
|
||||
"XCITrimmerTitleStatusCount": "{0} de {1} Título(s) seleccionado(s)",
|
||||
"XCITrimmerTitleStatusCountWithFilter": "{0} de {1} Título(s) seleccionado(s) ({2} mostrado(s))",
|
||||
"XCITrimmerTitleStatusTrimming": "Recortando {0} Título(s)...",
|
||||
"XCITrimmerTitleStatusUntrimming": "Deshaciendo recorte de {0} Título(s)...",
|
||||
"XCITrimmerTitleStatusFailed": "Fallido",
|
||||
"XCITrimmerPotentialSavings": "Ahorro potencial",
|
||||
"XCITrimmerActualSavings": "Ahorro real",
|
||||
"XCITrimmerSavingsMb": "{0:n0} Mb",
|
||||
"XCITrimmerSelectDisplayed": "Select Shown",
|
||||
"XCITrimmerDeselectDisplayed": "Deselect Shown",
|
||||
"XCITrimmerSortName": "Title",
|
||||
"XCITrimmerSortSaved": "Space Savings",
|
||||
"XCITrimmerTrim": "Trim",
|
||||
"XCITrimmerUntrim": "Untrim",
|
||||
"XCITrimmerSelectDisplayed": "Seleccionar mostrado(s)",
|
||||
"XCITrimmerDeselectDisplayed": "Deseleccionar mostrado(s)",
|
||||
"XCITrimmerSortName": "Título",
|
||||
"XCITrimmerSortSaved": "Ahorro de espacio",
|
||||
"XCITrimmerTrim": "Recortar",
|
||||
"XCITrimmerUntrim": "Deshacer recorte",
|
||||
"UpdateWindowUpdateAddedMessage": "{0} nueva(s) actualización(es) agregada(s)",
|
||||
"UpdateWindowBundledContentNotice": "Las actualizaciones agrupadas no pueden ser eliminadas, solamente deshabilitadas.",
|
||||
"CheatWindowHeading": "Cheats disponibles para {0} [{1}]",
|
||||
"BuildId": "Id de compilación:",
|
||||
"DlcWindowHeading": "Contenido descargable disponible para {0} [{1}]",
|
||||
"DlcWindowHeading": "{0} DLC(s) available",
|
||||
"DlcWindowDlcAddedMessage": "Se agregaron {0} nuevo(s) contenido(s) descargable(s)",
|
||||
"AutoloadDlcAddedMessage": "Se agregaron {0} nuevo(s) contenido(s) descargable(s)",
|
||||
"AutoloadDlcRemovedMessage": "Se eliminaron {0} contenido(s) descargable(s) faltantes",
|
||||
@@ -793,7 +793,7 @@
|
||||
"AutoloadUpdateRemovedMessage": "Se eliminaron {0} actualización(es) faltantes",
|
||||
"ModWindowHeading": "{0} Mod(s)",
|
||||
"UserProfilesEditProfile": "Editar selección",
|
||||
"Continue": "Continue",
|
||||
"Continue": "Continuar",
|
||||
"Cancel": "Cancelar",
|
||||
"Save": "Guardar",
|
||||
"Discard": "Descartar",
|
||||
|
@@ -552,15 +552,13 @@
|
||||
"AboutUrlTooltipMessage": "Cliquez pour ouvrir le site de Ryujinx dans votre navigateur par défaut.",
|
||||
"AboutDisclaimerMessage": "Ryujinx n'est pas affilié à Nintendo™,\nou à aucun de ses partenaires, de quelque manière que ce soit.",
|
||||
"AboutAmiiboDisclaimerMessage": "AmiiboAPI (www.amiiboapi.com) est utilisé\ndans notre émulation Amiibo.",
|
||||
"AboutPatreonUrlTooltipMessage": "Cliquez pour ouvrir la page Patreon de Ryujinx dans votre navigateur par défaut.",
|
||||
"AboutGithubUrlTooltipMessage": "Cliquez pour ouvrir la page GitHub de Ryujinx dans votre navigateur par défaut.",
|
||||
"AboutDiscordUrlTooltipMessage": "Cliquez pour ouvrir une invitation au serveur Discord de Ryujinx dans votre navigateur par défaut.",
|
||||
"AboutTwitterUrlTooltipMessage": "Cliquez pour ouvrir la page Twitter de Ryujinx dans votre navigateur par défaut.",
|
||||
"AboutRyujinxAboutTitle": "À propos :",
|
||||
"AboutRyujinxAboutContent": "Ryujinx est un émulateur pour la Nintendo Switch™.\nMerci de nous soutenir sur Patreon.\nObtenez toutes les dernières actualités sur notre Twitter ou notre Discord.\nLes développeurs intéressés à contribuer peuvent en savoir plus sur notre GitHub ou notre Discord.",
|
||||
"AboutRyujinxAboutContent": "Ryujinx is an emulator for the Nintendo Switch™.\nGet all the latest news in our Discord.\nDevelopers interested in contributing can find out more on our GitHub or Discord.",
|
||||
"AboutRyujinxMaintainersTitle": "Maintenu par :",
|
||||
"AboutRyujinxFormerMaintainersTitle": "Formerly Maintained By:",
|
||||
"AboutRyujinxMaintainersContentTooltipMessage": "Cliquez pour ouvrir la page Contributeurs dans votre navigateur par défaut.",
|
||||
"AboutRyujinxSupprtersTitle": "Supporté sur Patreon par :",
|
||||
"AmiiboSeriesLabel": "Séries Amiibo",
|
||||
"AmiiboCharacterLabel": "Personnage",
|
||||
"AmiiboScanButtonLabel": "Scanner",
|
||||
@@ -702,6 +700,9 @@
|
||||
"Never": "Jamais",
|
||||
"SwkbdMinCharacters": "Doit comporter au moins {0} 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",
|
||||
"SoftwareKeyboardModeNumeric": "Doit être 0-9 ou '.' uniquement",
|
||||
"SoftwareKeyboardModeAlphabet": "Doit être uniquement des caractères non CJK",
|
||||
@@ -715,7 +716,6 @@
|
||||
"UpdaterAddingFiles": "Ajout des nouveaux fichiers...",
|
||||
"UpdaterExtracting": "Extraction de la mise à jour…",
|
||||
"UpdaterDownloading": "Téléchargement de la mise à jour...",
|
||||
"Game": "Jeu",
|
||||
"Docked": "Mode station d'accueil",
|
||||
"Handheld": "Mode Portable",
|
||||
"ConnectionError": "Erreur de connexion.",
|
||||
@@ -786,7 +786,7 @@
|
||||
"CheatWindowHeading": "Cheats disponibles pour {0} [{1}]",
|
||||
"BuildId": "BuildId :",
|
||||
"DlcWindowBundledContentNotice": "Les DLC inclus avec le jeu ne peuvent pas être supprimés mais peuvent être désactivés.",
|
||||
"DlcWindowHeading": "{0} Contenu(s) téléchargeable(s)",
|
||||
"DlcWindowHeading": "{0} DLC(s) available",
|
||||
"DlcWindowDlcAddedMessage": "{0} nouveau(x) contenu(s) téléchargeable(s) ajouté(s)",
|
||||
"AutoloadDlcAddedMessage": "{0} nouveau(x) contenu(s) téléchargeable(s) ajouté(s)",
|
||||
"AutoloadDlcRemovedMessage": "{0} contenu(s) téléchargeable(s) manquant(s) supprimé(s)",
|
||||
|
@@ -552,15 +552,13 @@
|
||||
"AboutUrlTooltipMessage": "לחץ כדי לפתוח את אתר ריוג'ינקס בדפדפן ברירת המחדל שלך.",
|
||||
"AboutDisclaimerMessage": "ריוג'ינקס אינה מזוהת עם נינטנדו,\nאו שוטפייה בכל דרך שהיא.",
|
||||
"AboutAmiiboDisclaimerMessage": "ממשק אמיבו (www.amiiboapi.com) משומש בהדמיית האמיבו שלנו.",
|
||||
"AboutPatreonUrlTooltipMessage": "לחץ כדי לפתוח את דף הפטראון של ריוג'ינקס בדפדפן ברירת המחדל שלך.",
|
||||
"AboutGithubUrlTooltipMessage": "לחץ כדי לפתוח את דף הגיטהב של ריוג'ינקס בדפדפן ברירת המחדל שלך.",
|
||||
"AboutDiscordUrlTooltipMessage": "לחץ כדי לפתוח הזמנה לשרת הדיסקורד של ריוג'ינקס בדפדפן ברירת המחדל שלך.",
|
||||
"AboutTwitterUrlTooltipMessage": "לחץ כדי לפתוח את דף הטוויטר של Ryujinx בדפדפן ברירת המחדל שלך.",
|
||||
"AboutRyujinxAboutTitle": "אודות:",
|
||||
"AboutRyujinxAboutContent": "ריוג'ינקס הוא אמולטור עבור הנינטנדו סוויץ' (כל הזכויות שמורות).\nבבקשה תתמכו בנו בפטראון.\nקבל את כל החדשות האחרונות בטוויטר או בדיסקורד שלנו.\nמפתחים המעוניינים לתרום יכולים לקבל מידע נוסף ב-גיטהאב או ב-דיסקורד שלנו.",
|
||||
"AboutRyujinxAboutContent": "Ryujinx is an emulator for the Nintendo Switch™.\nGet all the latest news in our Discord.\nDevelopers interested in contributing can find out more on our GitHub or Discord.",
|
||||
"AboutRyujinxMaintainersTitle": "מתוחזק על ידי:",
|
||||
"AboutRyujinxFormerMaintainersTitle": "Formerly Maintained By:",
|
||||
"AboutRyujinxMaintainersContentTooltipMessage": "לחץ כדי לפתוח את דף התורמים בדפדפן ברירת המחדל שלך.",
|
||||
"AboutRyujinxSupprtersTitle": "תמוך באמצעות Patreon",
|
||||
"AmiiboSeriesLabel": "סדרת אמיבו",
|
||||
"AmiiboCharacterLabel": "דמות",
|
||||
"AmiiboScanButtonLabel": "סרוק את זה",
|
||||
@@ -702,6 +700,9 @@
|
||||
"Never": "אף פעם",
|
||||
"SwkbdMinCharacters": "לפחות {0} תווים",
|
||||
"SwkbdMinRangeCharacters": "באורך {0}-{1} תווים",
|
||||
"CabinetTitle": "Cabinet Dialog",
|
||||
"CabinetDialog": "Enter your Amiibo's new name",
|
||||
"CabinetScanDialog": "Please scan your Amiibo now.",
|
||||
"SoftwareKeyboard": "מקלדת וירטואלית",
|
||||
"SoftwareKeyboardModeNumeric": "חייב להיות בין 0-9 או '.' בלבד",
|
||||
"SoftwareKeyboardModeAlphabet": "מחויב להיות ללא אותיות CJK",
|
||||
@@ -715,7 +716,6 @@
|
||||
"UpdaterAddingFiles": "מוסיף קבצים חדשים...",
|
||||
"UpdaterExtracting": "מחלץ עדכון...",
|
||||
"UpdaterDownloading": "מוריד עדכון...",
|
||||
"Game": "משחק",
|
||||
"Docked": "בתחנת עגינה",
|
||||
"Handheld": "נייד",
|
||||
"ConnectionError": "שגיאת חיבור",
|
||||
|
@@ -552,15 +552,13 @@
|
||||
"AboutUrlTooltipMessage": "Clicca per aprire il sito web di Ryujinx nel tuo browser predefinito.",
|
||||
"AboutDisclaimerMessage": "Ryujinx non è affiliato con Nintendo™,\no i suoi partner, in alcun modo.",
|
||||
"AboutAmiiboDisclaimerMessage": "AmiiboAPI (www.amiiboapi.com) è usata\nnella nostra emulazione Amiibo.",
|
||||
"AboutPatreonUrlTooltipMessage": "Clicca per aprire la pagina Patreon di Ryujinx nel tuo browser predefinito.",
|
||||
"AboutGithubUrlTooltipMessage": "Clicca per aprire la pagina GitHub di Ryujinx nel tuo browser predefinito.",
|
||||
"AboutDiscordUrlTooltipMessage": "Clicca per aprire un invito al server Discord di Ryujinx nel tuo browser predefinito.",
|
||||
"AboutTwitterUrlTooltipMessage": "Clicca per aprire la pagina Twitter di Ryujinx nel tuo browser predefinito.",
|
||||
"AboutRyujinxAboutTitle": "Informazioni:",
|
||||
"AboutRyujinxAboutContent": "Ryujinx è un emulatore per la console Nintendo Switch™.\nSostienici su Patreon.\nRicevi tutte le ultime notizie sul nostro Twitter o su Discord.\nGli sviluppatori interessati a contribuire possono trovare più informazioni sul nostro GitHub o Discord.",
|
||||
"AboutRyujinxAboutContent": "Ryujinx is an emulator for the Nintendo Switch™.\nGet all the latest news in our Discord.\nDevelopers interested in contributing can find out more on our GitHub or Discord.",
|
||||
"AboutRyujinxMaintainersTitle": "Mantenuto da:",
|
||||
"AboutRyujinxFormerMaintainersTitle": "Formerly Maintained By:",
|
||||
"AboutRyujinxMaintainersContentTooltipMessage": "Clicca per aprire la pagina dei contributori nel tuo browser predefinito.",
|
||||
"AboutRyujinxSupprtersTitle": "Supportato su Patreon da:",
|
||||
"AmiiboSeriesLabel": "Serie Amiibo",
|
||||
"AmiiboCharacterLabel": "Personaggio",
|
||||
"AmiiboScanButtonLabel": "Scansiona",
|
||||
@@ -702,6 +700,9 @@
|
||||
"Never": "Mai",
|
||||
"SwkbdMinCharacters": "Non può avere meno di {0} 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",
|
||||
"SoftwareKeyboardModeNumeric": "Deve essere solo 0-9 o '.'",
|
||||
"SoftwareKeyboardModeAlphabet": "Deve essere solo caratteri non CJK",
|
||||
@@ -715,7 +716,6 @@
|
||||
"UpdaterAddingFiles": "Aggiunta dei nuovi file...",
|
||||
"UpdaterExtracting": "Estrazione dell'aggiornamento...",
|
||||
"UpdaterDownloading": "Download dell'aggiornamento...",
|
||||
"Game": "Gioco",
|
||||
"Docked": "TV",
|
||||
"Handheld": "Portatile",
|
||||
"ConnectionError": "Errore di connessione.",
|
||||
@@ -786,7 +786,7 @@
|
||||
"CheatWindowHeading": "Trucchi disponibili per {0} [{1}]",
|
||||
"BuildId": "ID Build",
|
||||
"DlcWindowBundledContentNotice": "i DLC \"impacchettati\" non possono essere rimossi, ma solo disabilitati.",
|
||||
"DlcWindowHeading": "DLC disponibili per {0} [{1}]",
|
||||
"DlcWindowHeading": "{0} DLC(s) available",
|
||||
"DlcWindowDlcAddedMessage": "{0} nuovo/i contenuto/i scaricabile/i aggiunto/i",
|
||||
"AutoloadDlcAddedMessage": "{0} contenuto/i scaricabile/i aggiunto/i",
|
||||
"AutoloadDlcRemovedMessage": "{0} contenuto/i scaricabile/i mancante/i rimosso/i",
|
||||
|
@@ -552,15 +552,13 @@
|
||||
"AboutUrlTooltipMessage": "クリックするとデフォルトのブラウザで Ryujinx のウェブサイトを開きます.",
|
||||
"AboutDisclaimerMessage": "Ryujinx は Nintendo™ および\nそのパートナー企業とは一切関係ありません.",
|
||||
"AboutAmiiboDisclaimerMessage": "AmiiboAPI (www.amiiboapi.com) は\nAmiibo エミュレーションに使用されています.",
|
||||
"AboutPatreonUrlTooltipMessage": "クリックするとデフォルトのブラウザで Ryujinx の Patreon ページを開きます.",
|
||||
"AboutGithubUrlTooltipMessage": "クリックするとデフォルトのブラウザで Ryujinx の Github ページを開きます.",
|
||||
"AboutDiscordUrlTooltipMessage": "クリックするとデフォルトのブラウザで Ryujinx の Discord サーバを開きます.",
|
||||
"AboutTwitterUrlTooltipMessage": "クリックするとデフォルトのブラウザで Ryujinx の Twitter ページを開きます.",
|
||||
"AboutRyujinxAboutTitle": "Ryujinx について:",
|
||||
"AboutRyujinxAboutContent": "Ryujinx は Nintendo Switch™ のエミュレータです.\nPatreon で私達の活動を支援してください.\n最新の情報は Twitter または Discord から取得できます.\n貢献したい開発者の方は GitHub または Discord で詳細をご確認ください.",
|
||||
"AboutRyujinxAboutContent": "Ryujinx is an emulator for the Nintendo Switch™.\nGet all the latest news in our Discord.\nDevelopers interested in contributing can find out more on our GitHub or Discord.",
|
||||
"AboutRyujinxMaintainersTitle": "開発者:",
|
||||
"AboutRyujinxFormerMaintainersTitle": "Formerly Maintained By:",
|
||||
"AboutRyujinxMaintainersContentTooltipMessage": "クリックするとデフォルトのブラウザで 貢献者のページを開きます.",
|
||||
"AboutRyujinxSupprtersTitle": "Patreon での支援者:",
|
||||
"AmiiboSeriesLabel": "Amiibo シリーズ",
|
||||
"AmiiboCharacterLabel": "キャラクタ",
|
||||
"AmiiboScanButtonLabel": "スキャン",
|
||||
@@ -702,6 +700,9 @@
|
||||
"Never": "決して",
|
||||
"SwkbdMinCharacters": "最低 {0} 文字必要です",
|
||||
"SwkbdMinRangeCharacters": "{0}-{1} 文字にしてください",
|
||||
"CabinetTitle": "Cabinet Dialog",
|
||||
"CabinetDialog": "Enter your Amiibo's new name",
|
||||
"CabinetScanDialog": "Please scan your Amiibo now.",
|
||||
"SoftwareKeyboard": "ソフトウェアキーボード",
|
||||
"SoftwareKeyboardModeNumeric": "0-9 または '.' のみでなければなりません",
|
||||
"SoftwareKeyboardModeAlphabet": "CJK文字以外のみ",
|
||||
@@ -715,7 +716,6 @@
|
||||
"UpdaterAddingFiles": "新規ファイルを追加中...",
|
||||
"UpdaterExtracting": "アップデートを展開中...",
|
||||
"UpdaterDownloading": "アップデートをダウンロード中...",
|
||||
"Game": "ゲーム",
|
||||
"Docked": "ドッキング",
|
||||
"Handheld": "携帯",
|
||||
"ConnectionError": "接続エラー.",
|
||||
@@ -785,7 +785,7 @@
|
||||
"UpdateWindowBundledContentNotice": "Bundled updates cannot be removed, only disabled.",
|
||||
"CheatWindowHeading": "利用可能なチート {0} [{1}]",
|
||||
"BuildId": "ビルドID:",
|
||||
"DlcWindowHeading": "利用可能な DLC {0} [{1}]",
|
||||
"DlcWindowHeading": "{0} DLC(s) available",
|
||||
"DlcWindowDlcAddedMessage": "{0} new downloadable content(s) added",
|
||||
"AutoloadDlcAddedMessage": "{0} new downloadable content(s) added",
|
||||
"AutoloadDlcRemovedMessage": "{0} missing downloadable content(s) removed",
|
||||
|
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"Language": "한국어",
|
||||
"MenuBarFileOpenApplet": "애플릿 열기",
|
||||
"MenuBarFileOpenAppletOpenMiiApplet": "Mii Edit Applet",
|
||||
"MenuBarFileOpenAppletOpenMiiApplet": "Mii 편집 애플릿",
|
||||
"MenuBarFileOpenAppletOpenMiiAppletToolTip": "독립 실행형 모드로 Mii 편집기 애플릿 열기",
|
||||
"SettingsTabInputDirectMouseAccess": "마우스 직접 접근",
|
||||
"SettingsTabSystemMemoryManagerMode": "메모리 관리자 모드 :",
|
||||
@@ -484,7 +484,7 @@
|
||||
"DialogControllerAppletTitle": "컨트롤러 애플릿",
|
||||
"DialogMessageDialogErrorExceptionMessage": "메시지 대화 상자 표시 오류 : {0}",
|
||||
"DialogSoftwareKeyboardErrorExceptionMessage": "소프트웨어 키보드 표시 오류 : {0}",
|
||||
"DialogErrorAppletErrorExceptionMessage": "ErrorApplet 대화 상자 표시 오류 : {0}",
|
||||
"DialogErrorAppletErrorExceptionMessage": "애플릿 오류류 대화 상자 표시 오류 : {0}",
|
||||
"DialogUserErrorDialogMessage": "{0}: {1}",
|
||||
"DialogUserErrorDialogInfoMessage": "\n이 오류를 해결하는 방법에 대한 자세한 내용은 설정 가이드를 참조하세요.",
|
||||
"DialogUserErrorDialogTitle": "Ryujinx 오류 ({0})",
|
||||
@@ -552,15 +552,13 @@
|
||||
"AboutUrlTooltipMessage": "클릭하면 기본 브라우저에서 Ryujinx 웹사이트가 열립니다.",
|
||||
"AboutDisclaimerMessage": "Ryujinx는 Nintendo™\n또는 그 파트너와 제휴한 바가 없습니다.",
|
||||
"AboutAmiiboDisclaimerMessage": "AmiiboAPI(www.amiiboapi.com)는\nAmiibo 에뮬레이션에 사용됩니다.",
|
||||
"AboutPatreonUrlTooltipMessage": "클릭하면 기본 브라우저에서 Ryujinx Patreon 페이지가 열립니다.",
|
||||
"AboutGithubUrlTooltipMessage": "클릭하면 기본 브라우저에서 Ryujinx GitHub 페이지가 열립니다.",
|
||||
"AboutDiscordUrlTooltipMessage": "클릭하면 기본 브라우저에서 Ryujinx 디스코드 서버 초대장이 열립니다.",
|
||||
"AboutTwitterUrlTooltipMessage": "클릭하면 기본 브라우저에서 Ryujinx 트위터 페이지가 열립니다.",
|
||||
"AboutRyujinxAboutTitle": "정보 :",
|
||||
"AboutRyujinxAboutContent": "Ryujinx는 Nintendo Switch™용 에뮬레이터입니다.\nPatreon에서 저희를 후원해 주세요.\nTwitter나 Discord에서 최신 뉴스를 모두 받아보세요.\n기여에 관심이 있는 개발자는 GitHub이나 Discord에서 자세한 내용을 알아볼 수 있습니다.",
|
||||
"AboutRyujinxAboutContent": "Ryujinx는 Nintendo Switch™용 에뮬레이터입니다.\n모든 최신 소식을 Discord에서 확인하세요.\n기여에 관심이 있는 개발자는 GitHub 또는 Discord에서 자세한 내용을 확인할 수 있습니다.",
|
||||
"AboutRyujinxMaintainersTitle": "유지 관리 :",
|
||||
"AboutRyujinxFormerMaintainersTitle": "이전 관리자 :",
|
||||
"AboutRyujinxMaintainersContentTooltipMessage": "클릭하면 기본 브라우저에서 기여자 페이지가 열립니다.",
|
||||
"AboutRyujinxSupprtersTitle": "Patreon에서 후원 :",
|
||||
"AmiiboSeriesLabel": "Amiibo 시리즈",
|
||||
"AmiiboCharacterLabel": "캐릭터",
|
||||
"AmiiboScanButtonLabel": "스캔하기",
|
||||
@@ -702,6 +700,9 @@
|
||||
"Never": "절대 안 함",
|
||||
"SwkbdMinCharacters": "{0}자 이상이어야 함",
|
||||
"SwkbdMinRangeCharacters": "{0}-{1}자 길이여야 함",
|
||||
"CabinetTitle": "캐비닛 대화 상자",
|
||||
"CabinetDialog": "Amiibo의 새 이름 입력하기",
|
||||
"CabinetScanDialog": "지금 Amiibo를 스캔하세요.",
|
||||
"SoftwareKeyboard": "소프트웨어 키보드",
|
||||
"SoftwareKeyboardModeNumeric": "0-9 또는 '.'만 가능",
|
||||
"SoftwareKeyboardModeAlphabet": "CJK 문자가 아닌 문자만 가능",
|
||||
@@ -715,7 +716,6 @@
|
||||
"UpdaterAddingFiles": "새 파일 추가...",
|
||||
"UpdaterExtracting": "업데이트 추출...",
|
||||
"UpdaterDownloading": "업데이트 내려받기 중...",
|
||||
"Game": "게임",
|
||||
"Docked": "도킹",
|
||||
"Handheld": "휴대",
|
||||
"ConnectionError": "연결 오류가 발생했습니다.",
|
||||
@@ -779,14 +779,14 @@
|
||||
"XCITrimmerDeselectDisplayed": "표시됨 선택 취소",
|
||||
"XCITrimmerSortName": "타이틀",
|
||||
"XCITrimmerSortSaved": "공간 절약s",
|
||||
"XCITrimmerTrim": "Trim",
|
||||
"XCITrimmerUntrim": "Untrim",
|
||||
"XCITrimmerTrim": "트림",
|
||||
"XCITrimmerUntrim": "언트림",
|
||||
"UpdateWindowUpdateAddedMessage": "{0}개의 새 업데이트가 추가됨",
|
||||
"UpdateWindowBundledContentNotice": "번들 업데이트는 제거할 수 없으며, 비활성화만 가능합니다.",
|
||||
"CheatWindowHeading": "{0} [{1}]에 사용 가능한 치트",
|
||||
"BuildId": "빌드ID:",
|
||||
"DlcWindowBundledContentNotice": "번들 DLC는 제거할 수 없으며 비활성화만 가능합니다.",
|
||||
"DlcWindowHeading": "{1} ({2})에 내려받기 가능한 콘텐츠 {0}개 사용 가능",
|
||||
"DlcWindowHeading": "{0} DLC(s) available",
|
||||
"DlcWindowDlcAddedMessage": "{0}개의 새로운 내려받기 가능한 콘텐츠가 추가됨",
|
||||
"AutoloadDlcAddedMessage": "{0}개의 새로운 내려받기 가능한 콘텐츠가 추가됨",
|
||||
"AutoloadDlcRemovedMessage": "{0}개의 내려받기 가능한 콘텐츠가 제거됨",
|
||||
|
@@ -552,15 +552,13 @@
|
||||
"AboutUrlTooltipMessage": "Kliknij, aby otworzyć stronę Ryujinx w domyślnej przeglądarce.",
|
||||
"AboutDisclaimerMessage": "Ryujinx nie jest w żaden sposób powiązany z Nintendo™,\nani z żadnym z jej partnerów.",
|
||||
"AboutAmiiboDisclaimerMessage": "AmiiboAPI (www.amiiboapi.com) jest używane\nw naszej emulacji Amiibo.",
|
||||
"AboutPatreonUrlTooltipMessage": "Kliknij, aby otworzyć stronę Patreon Ryujinx w domyślnej przeglądarce.",
|
||||
"AboutGithubUrlTooltipMessage": "Kliknij, aby otworzyć stronę GitHub Ryujinx w domyślnej przeglądarce.",
|
||||
"AboutDiscordUrlTooltipMessage": "Kliknij, aby otworzyć zaproszenie na serwer Discord Ryujinx w domyślnej przeglądarce.",
|
||||
"AboutTwitterUrlTooltipMessage": "Kliknij, aby otworzyć stronę Twitter Ryujinx w domyślnej przeglądarce.",
|
||||
"AboutRyujinxAboutTitle": "O Aplikacji:",
|
||||
"AboutRyujinxAboutContent": "Ryujinx to emulator Nintendo Switch™.\nWspieraj nas na Patreonie.\nOtrzymuj najnowsze wiadomości na naszym Twitterze lub Discordzie.\nDeweloperzy zainteresowani współpracą mogą dowiedzieć się więcej na naszym GitHubie lub Discordzie.",
|
||||
"AboutRyujinxAboutContent": "Ryujinx is an emulator for the Nintendo Switch™.\nGet all the latest news in our Discord.\nDevelopers interested in contributing can find out more on our GitHub or Discord.",
|
||||
"AboutRyujinxMaintainersTitle": "Utrzymywany Przez:",
|
||||
"AboutRyujinxFormerMaintainersTitle": "Formerly Maintained By:",
|
||||
"AboutRyujinxMaintainersContentTooltipMessage": "Kliknij, aby otworzyć stronę Współtwórcy w domyślnej przeglądarce.",
|
||||
"AboutRyujinxSupprtersTitle": "Wspierani na Patreonie Przez:",
|
||||
"AmiiboSeriesLabel": "Seria Amiibo",
|
||||
"AmiiboCharacterLabel": "Postać",
|
||||
"AmiiboScanButtonLabel": "Zeskanuj",
|
||||
@@ -702,6 +700,9 @@
|
||||
"Never": "Nigdy",
|
||||
"SwkbdMinCharacters": "Musi mieć co najmniej {0} 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",
|
||||
"SoftwareKeyboardModeNumeric": "Może składać się jedynie z 0-9 lub '.'",
|
||||
"SoftwareKeyboardModeAlphabet": "Nie może zawierać znaków CJK",
|
||||
@@ -715,7 +716,6 @@
|
||||
"UpdaterAddingFiles": "Dodawanie Nowych Plików...",
|
||||
"UpdaterExtracting": "Wypakowywanie Aktualizacji...",
|
||||
"UpdaterDownloading": "Pobieranie Aktualizacji...",
|
||||
"Game": "Gra",
|
||||
"Docked": "Zadokowany",
|
||||
"Handheld": "Przenośny",
|
||||
"ConnectionError": "Błąd Połączenia.",
|
||||
@@ -786,7 +786,7 @@
|
||||
"CheatWindowHeading": "Kody Dostępne dla {0} [{1}]",
|
||||
"BuildId": "Identyfikator wersji:",
|
||||
"DlcWindowBundledContentNotice": "Bundled DLC cannot be removed, only disabled.",
|
||||
"DlcWindowHeading": "{0} Zawartości do Pobrania dostępna dla {1} ({2})",
|
||||
"DlcWindowHeading": "{0} DLC(s) available",
|
||||
"DlcWindowDlcAddedMessage": "{0} new downloadable content(s) added",
|
||||
"AutoloadDlcAddedMessage": "{0} new downloadable content(s) added",
|
||||
"AutoloadDlcRemovedMessage": "{0} missing downloadable content(s) removed",
|
||||
|
@@ -552,15 +552,13 @@
|
||||
"AboutUrlTooltipMessage": "Clique para abrir o site do Ryujinx no seu navegador padrão.",
|
||||
"AboutDisclaimerMessage": "Ryujinx não é afiliado com a Nintendo™,\nou qualquer um de seus parceiros, de nenhum modo.",
|
||||
"AboutAmiiboDisclaimerMessage": "AmiiboAPI (www.amiiboapi.com) é usado\nem nossa emulação de Amiibo.",
|
||||
"AboutPatreonUrlTooltipMessage": "Clique para abrir a página do Patreon do Ryujinx no seu navegador padrão.",
|
||||
"AboutGithubUrlTooltipMessage": "Clique para abrir a página do GitHub do Ryujinx no seu navegador padrão.",
|
||||
"AboutDiscordUrlTooltipMessage": "Clique para abrir um convite ao servidor do Discord do Ryujinx no seu navegador padrão.",
|
||||
"AboutTwitterUrlTooltipMessage": "Clique para abrir a página do Twitter do Ryujinx no seu navegador padrão.",
|
||||
"AboutRyujinxAboutTitle": "Sobre:",
|
||||
"AboutRyujinxAboutContent": "Ryujinx é um emulador de Nintendo Switch™.\nPor favor, nos dê apoio no Patreon.\nFique por dentro de todas as novidades no Twitter ou Discord.\nDesenvolvedores com interesse em contribuir podem conseguir mais informações no GitHub ou Discord.",
|
||||
"AboutRyujinxAboutContent": "Ryujinx is an emulator for the Nintendo Switch™.\nGet all the latest news in our Discord.\nDevelopers interested in contributing can find out more on our GitHub or Discord.",
|
||||
"AboutRyujinxMaintainersTitle": "Mantido por:",
|
||||
"AboutRyujinxFormerMaintainersTitle": "Formerly Maintained By:",
|
||||
"AboutRyujinxMaintainersContentTooltipMessage": "Clique para abrir a página de contribuidores no seu navegador padrão.",
|
||||
"AboutRyujinxSupprtersTitle": "Apoiado no Patreon por:",
|
||||
"AmiiboSeriesLabel": "Franquia Amiibo",
|
||||
"AmiiboCharacterLabel": "Personagem",
|
||||
"AmiiboScanButtonLabel": "Escanear",
|
||||
@@ -701,6 +699,9 @@
|
||||
"Never": "Nunca",
|
||||
"SwkbdMinCharacters": "Deve ter pelo menos {0} 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",
|
||||
"SoftwareKeyboardModeNumeric": "Deve ser somente 0-9 ou '.'",
|
||||
"SoftwareKeyboardModeAlphabet": "Apenas devem ser caracteres não CJK.",
|
||||
@@ -714,7 +715,6 @@
|
||||
"UpdaterAddingFiles": "Adicionando novos arquivos...",
|
||||
"UpdaterExtracting": "Extraíndo atualização...",
|
||||
"UpdaterDownloading": "Baixando atualização...",
|
||||
"Game": "Jogo",
|
||||
"Docked": "TV",
|
||||
"Handheld": "Portátil",
|
||||
"ConnectionError": "Erro de conexão.",
|
||||
@@ -785,7 +785,7 @@
|
||||
"CheatWindowHeading": "Cheats disponíveis para {0} [{1}]",
|
||||
"BuildId": "ID da Build:",
|
||||
"DlcWindowBundledContentNotice": "DLCs incorporadas não podem ser removidas, apenas desativadas.",
|
||||
"DlcWindowHeading": "{0} DLCs disponíveis para {1} ({2})",
|
||||
"DlcWindowHeading": "{0} DLC(s) available",
|
||||
"DlcWindowDlcAddedMessage": "{0} novo(s) conteúdo(s) para download adicionado(s)",
|
||||
"AutoloadDlcAddedMessage": "{0} novo(s) conteúdo(s) para download adicionado(s)",
|
||||
"AutoloadDlcRemovedMessage": "{0} conteúdo(s) para download ausente(s) removido(s)",
|
||||
|
@@ -552,15 +552,13 @@
|
||||
"AboutUrlTooltipMessage": "Нажмите, чтобы открыть веб-сайт Ryujinx",
|
||||
"AboutDisclaimerMessage": "Ryujinx никоим образом не связан ни с Nintendo™, ни с кем-либо из ее партнеров.",
|
||||
"AboutAmiiboDisclaimerMessage": "Amiibo API (www.amiiboapi.com) используется для эмуляции Amiibo.",
|
||||
"AboutPatreonUrlTooltipMessage": "Нажмите, чтобы открыть страницу Ryujinx на Patreon",
|
||||
"AboutGithubUrlTooltipMessage": "Нажмите, чтобы открыть страницу Ryujinx на GitHub",
|
||||
"AboutDiscordUrlTooltipMessage": "Нажмите, чтобы открыть приглашение на сервер Ryujinx в Discord",
|
||||
"AboutTwitterUrlTooltipMessage": "Нажмите, чтобы открыть страницу Ryujinx в X (бывший Twitter)",
|
||||
"AboutRyujinxAboutTitle": "О программе:",
|
||||
"AboutRyujinxAboutContent": "Ryujinx — это эмулятор Nintendo Switch™.\nПожалуйста, поддержите нас на Patreon.\nЧитайте последние новости в наших X (Twitter) или Discord.\nРазработчики, заинтересованные в участии, могут ознакомиться с проектом на GitHub или в Discord.",
|
||||
"AboutRyujinxAboutContent": "Ryujinx is an emulator for the Nintendo Switch™.\nGet all the latest news in our Discord.\nDevelopers interested in contributing can find out more on our GitHub or Discord.",
|
||||
"AboutRyujinxMaintainersTitle": "Разработка:",
|
||||
"AboutRyujinxFormerMaintainersTitle": "Formerly Maintained By:",
|
||||
"AboutRyujinxMaintainersContentTooltipMessage": "Нажмите, чтобы открыть страницу с участниками",
|
||||
"AboutRyujinxSupprtersTitle": "Поддержка на Patreon:",
|
||||
"AmiiboSeriesLabel": "Серия Amiibo",
|
||||
"AmiiboCharacterLabel": "Персонаж",
|
||||
"AmiiboScanButtonLabel": "Сканировать",
|
||||
@@ -702,6 +700,9 @@
|
||||
"Never": "Никогда",
|
||||
"SwkbdMinCharacters": "Должно быть не менее {0} символов.",
|
||||
"SwkbdMinRangeCharacters": "Должно быть {0}-{1} символов",
|
||||
"CabinetTitle": "Cabinet Dialog",
|
||||
"CabinetDialog": "Enter your Amiibo's new name",
|
||||
"CabinetScanDialog": "Please scan your Amiibo now.",
|
||||
"SoftwareKeyboard": "Программная клавиатура",
|
||||
"SoftwareKeyboardModeNumeric": "Должно быть в диапазоне 0-9 или '.'",
|
||||
"SoftwareKeyboardModeAlphabet": "Не должно быть CJK-символов",
|
||||
@@ -715,7 +716,6 @@
|
||||
"UpdaterAddingFiles": "Добавление новых файлов...",
|
||||
"UpdaterExtracting": "Извлечение обновления...",
|
||||
"UpdaterDownloading": "Загрузка обновления...",
|
||||
"Game": "Игра",
|
||||
"Docked": "Стационарный режим",
|
||||
"Handheld": "Портативный режим",
|
||||
"ConnectionError": "Ошибка соединения",
|
||||
@@ -786,7 +786,7 @@
|
||||
"CheatWindowHeading": "Доступные читы для {0} [{1}]",
|
||||
"BuildId": "ID версии:",
|
||||
"DlcWindowBundledContentNotice": "Bundled DLC cannot be removed, only disabled.",
|
||||
"DlcWindowHeading": "{0} DLC",
|
||||
"DlcWindowHeading": "{0} DLC(s) available",
|
||||
"DlcWindowDlcAddedMessage": "{0} new downloadable content(s) added",
|
||||
"AutoloadDlcAddedMessage": "{0} new downloadable content(s) added",
|
||||
"AutoloadDlcRemovedMessage": "{0} missing downloadable content(s) removed",
|
||||
|
@@ -552,15 +552,13 @@
|
||||
"AboutUrlTooltipMessage": "คลิกเพื่อเปิดเว็บไซต์ Ryujinx บนเบราว์เซอร์เริ่มต้นของคุณ",
|
||||
"AboutDisclaimerMessage": "ทางผู้พัฒนาโปรแกรม Ryujinx ไม่มีส่วนเกี่ยวข้องกับทางบริษัท Nintendo™\nหรือพันธมิตรใดๆ ทั้งสิ้น!",
|
||||
"AboutAmiiboDisclaimerMessage": "AmiiboAPI (www.amiiboapi.com) ถูกใช้\nในการจำลอง อะมิโบ ของเรา",
|
||||
"AboutPatreonUrlTooltipMessage": "คลิกเพื่อเปิดหน้า Patreon ของ Ryujinx บนเบราว์เซอร์เริ่มต้นของคุณ",
|
||||
"AboutGithubUrlTooltipMessage": "คลิกเพื่อเปิดหน้า Github ของ Ryujinx บนเบราว์เซอร์เริ่มต้นของคุณ",
|
||||
"AboutDiscordUrlTooltipMessage": "คลิกเพื่อเปิดคำเชิญเข้าสู่เซิร์ฟเวอร์ Discord ของ Ryujinx บนเบราว์เซอร์เริ่มต้นของคุณ",
|
||||
"AboutTwitterUrlTooltipMessage": "คลิกเพื่อเปิดหน้าเพจ Twitter ของ Ryujinx บนเบราว์เซอร์เริ่มต้นของคุณ",
|
||||
"AboutRyujinxAboutTitle": "เกี่ยวกับ:",
|
||||
"AboutRyujinxAboutContent": "Ryujinx เป็นอีมูเลเตอร์สำหรับ Nintendo Switch™\nโปรดสนับสนุนเราบน Patreon\nรับข่าวสารล่าสุดทั้งหมดบน Twitter หรือ Discord ของเรา\nนักพัฒนาที่สนใจจะมีส่วนร่วมสามารถดูข้อมูลเพิ่มเติมได้ที่ GitHub หรือ Discord ของเรา",
|
||||
"AboutRyujinxAboutContent": "Ryujinx is an emulator for the Nintendo Switch™.\nGet all the latest news in our Discord.\nDevelopers interested in contributing can find out more on our GitHub or Discord.",
|
||||
"AboutRyujinxMaintainersTitle": "ได้รับการดูแลโดย:",
|
||||
"AboutRyujinxFormerMaintainersTitle": "Formerly Maintained By:",
|
||||
"AboutRyujinxMaintainersContentTooltipMessage": "คลิกเพื่อเปิดหน้าผู้มีส่วนร่วมบนเบราว์เซอร์เริ่มต้นของคุณ",
|
||||
"AboutRyujinxSupprtersTitle": "ผู้สนับสนุนบน Patreon:",
|
||||
"AmiiboSeriesLabel": "Amiibo Series",
|
||||
"AmiiboCharacterLabel": "ตัวละคร",
|
||||
"AmiiboScanButtonLabel": "สแกนเลย",
|
||||
@@ -702,6 +700,9 @@
|
||||
"Never": "ไม่ต้อง",
|
||||
"SwkbdMinCharacters": "ต้องมีความยาวของตัวอักษรอย่างน้อย {0} ตัว",
|
||||
"SwkbdMinRangeCharacters": "ต้องมีความยาวของตัวอักษร {0}-{1} ตัว",
|
||||
"CabinetTitle": "Cabinet Dialog",
|
||||
"CabinetDialog": "Enter your Amiibo's new name",
|
||||
"CabinetScanDialog": "Please scan your Amiibo now.",
|
||||
"SoftwareKeyboard": "ซอฟต์แวร์คีย์บอร์ด",
|
||||
"SoftwareKeyboardModeNumeric": "ต้องเป็น 0-9 หรือ '.' เท่านั้น",
|
||||
"SoftwareKeyboardModeAlphabet": "ต้องเป็นตัวอักษรที่ไม่ใช่ประเภท CJK เท่านั้น",
|
||||
@@ -715,7 +716,6 @@
|
||||
"UpdaterAddingFiles": "กำลังเพิ่มไฟล์ใหม่...",
|
||||
"UpdaterExtracting": "กำลังแยกการอัปเดต...",
|
||||
"UpdaterDownloading": "กำลังดาวน์โหลดอัปเดต...",
|
||||
"Game": "เกมส์",
|
||||
"Docked": "ด็อก",
|
||||
"Handheld": "แฮนด์เฮลด์",
|
||||
"ConnectionError": "การเชื่อมต่อล้มเหลว",
|
||||
@@ -786,7 +786,7 @@
|
||||
"CheatWindowHeading": "สูตรโกงมีให้สำหรับ {0} [{1}]",
|
||||
"BuildId": "รหัสการสร้าง:",
|
||||
"DlcWindowBundledContentNotice": "แพ็ค DLC ไม่สามารถลบทิ้งได้ สามารถปิดใช้งานได้เท่านั้น",
|
||||
"DlcWindowHeading": "{0} DLC ที่สามารถดาวน์โหลดได้",
|
||||
"DlcWindowHeading": "{0} DLC(s) available",
|
||||
"DlcWindowDlcAddedMessage": "{0} DLC ใหม่ที่เพิ่มเข้ามา",
|
||||
"AutoloadDlcAddedMessage": "{0} ใหม่ที่เพิ่มเข้ามา",
|
||||
"AutoloadDlcRemovedMessage": "{0} missing downloadable content(s) removed",
|
||||
|
@@ -552,15 +552,13 @@
|
||||
"AboutUrlTooltipMessage": "Ryujinx'in websitesini varsayılan tarayıcınızda açmak için tıklayın.",
|
||||
"AboutDisclaimerMessage": "Ryujinx, Nintendo™ veya ortaklarıyla herhangi bir şekilde bağlantılı değildir.",
|
||||
"AboutAmiiboDisclaimerMessage": "Amiibo emülasyonumuzda \nAmiiboAPI (www.amiiboapi.com) kullanılmaktadır.",
|
||||
"AboutPatreonUrlTooltipMessage": "Ryujinx'in Patreon sayfasını varsayılan tarayıcınızda açmak için tıklayın.",
|
||||
"AboutGithubUrlTooltipMessage": "Ryujinx'in GitHub sayfasını varsayılan tarayıcınızda açmak için tıklayın.",
|
||||
"AboutDiscordUrlTooltipMessage": "Varsayılan tarayıcınızda Ryujinx'in Discord'una bir davet açmak için tıklayın.",
|
||||
"AboutTwitterUrlTooltipMessage": "Ryujinx'in Twitter sayfasını varsayılan tarayıcınızda açmak için tıklayın.",
|
||||
"AboutRyujinxAboutTitle": "Hakkında:",
|
||||
"AboutRyujinxAboutContent": "Ryujinx bir Nintendo Switch™ emülatörüdür.\nLütfen bizi Patreon'da destekleyin.\nEn son haberleri Twitter veya Discord'umuzdan alın.\nKatkıda bulunmak isteyen geliştiriciler GitHub veya Discord üzerinden daha fazla bilgi edinebilir.",
|
||||
"AboutRyujinxAboutContent": "Ryujinx is an emulator for the Nintendo Switch™.\nGet all the latest news in our Discord.\nDevelopers interested in contributing can find out more on our GitHub or Discord.",
|
||||
"AboutRyujinxMaintainersTitle": "Geliştiriciler:",
|
||||
"AboutRyujinxFormerMaintainersTitle": "Formerly Maintained By:",
|
||||
"AboutRyujinxMaintainersContentTooltipMessage": "Katkıda bulunanlar sayfasını varsayılan tarayıcınızda açmak için tıklayın.",
|
||||
"AboutRyujinxSupprtersTitle": "Patreon Destekleyicileri:",
|
||||
"AmiiboSeriesLabel": "Amiibo Serisi",
|
||||
"AmiiboCharacterLabel": "Karakter",
|
||||
"AmiiboScanButtonLabel": "Tarat",
|
||||
@@ -702,6 +700,9 @@
|
||||
"Never": "Hiçbir Zaman",
|
||||
"SwkbdMinCharacters": "En az {0} 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",
|
||||
"SoftwareKeyboardModeNumeric": "Sadece 0-9 veya '.' olabilir",
|
||||
"SoftwareKeyboardModeAlphabet": "Sadece CJK-characters olmayan karakterler olabilir",
|
||||
@@ -715,7 +716,6 @@
|
||||
"UpdaterAddingFiles": "Yeni Dosyalar Ekleniyor...",
|
||||
"UpdaterExtracting": "Güncelleme Ayrıştırılıyor...",
|
||||
"UpdaterDownloading": "Güncelleme İndiriliyor...",
|
||||
"Game": "Oyun",
|
||||
"Docked": "Docked",
|
||||
"Handheld": "El tipi",
|
||||
"ConnectionError": "Bağlantı Hatası.",
|
||||
@@ -786,7 +786,7 @@
|
||||
"CheatWindowHeading": "{0} için Hile mevcut [{1}]",
|
||||
"BuildId": "BuildId:",
|
||||
"DlcWindowBundledContentNotice": "Bundled DLC cannot be removed, only disabled.",
|
||||
"DlcWindowHeading": "{0} Downloadable Content(s) available for {1} ({2})",
|
||||
"DlcWindowHeading": "{0} DLC(s) available",
|
||||
"DlcWindowDlcAddedMessage": "{0} new downloadable content(s) added",
|
||||
"AutoloadDlcAddedMessage": "{0} new downloadable content(s) added",
|
||||
"AutoloadDlcRemovedMessage": "{0} missing downloadable content(s) removed",
|
||||
|
File diff suppressed because it is too large
Load Diff
@@ -552,15 +552,13 @@
|
||||
"AboutUrlTooltipMessage": "在浏览器中打开 Ryujinx 模拟器官网。",
|
||||
"AboutDisclaimerMessage": "Ryujinx 与 Nintendo™ 以及其合作伙伴没有任何关联。",
|
||||
"AboutAmiiboDisclaimerMessage": "我们的 Amiibo 模拟使用了\nAmiiboAPI (www.amiiboapi.com)。",
|
||||
"AboutPatreonUrlTooltipMessage": "在浏览器中打开 Ryujinx 的 Patreon 赞助页。",
|
||||
"AboutGithubUrlTooltipMessage": "在浏览器中打开 Ryujinx 的 GitHub 代码库。",
|
||||
"AboutDiscordUrlTooltipMessage": "在浏览器中打开 Ryujinx 的 Discord 邀请链接。",
|
||||
"AboutTwitterUrlTooltipMessage": "在浏览器中打开 Ryujinx 的 Twitter 主页。",
|
||||
"AboutRyujinxAboutTitle": "关于:",
|
||||
"AboutRyujinxAboutContent": "Ryujinx 是一款 Nintendo Switch™ 模拟器。\n您可以在 Patreon 上赞助 Ryujinx。\n关注 Twitter 或 Discord 可以获取模拟器最新动态。\n如果您对开发感兴趣,欢迎来 GitHub 或 Discord 加入我们!",
|
||||
"AboutRyujinxAboutContent": "Ryujinx is an emulator for the Nintendo Switch™.\nGet all the latest news in our Discord.\nDevelopers interested in contributing can find out more on our GitHub or Discord.",
|
||||
"AboutRyujinxMaintainersTitle": "开发维护人员名单:",
|
||||
"AboutRyujinxFormerMaintainersTitle": "Formerly Maintained By:",
|
||||
"AboutRyujinxMaintainersContentTooltipMessage": "在浏览器中打开贡献者页面",
|
||||
"AboutRyujinxSupprtersTitle": "感谢 Patreon 上的赞助者:",
|
||||
"AmiiboSeriesLabel": "Amiibo 系列",
|
||||
"AmiiboCharacterLabel": "角色",
|
||||
"AmiiboScanButtonLabel": "扫描",
|
||||
@@ -702,6 +700,9 @@
|
||||
"Never": "从不",
|
||||
"SwkbdMinCharacters": "不少于 {0} 个字符",
|
||||
"SwkbdMinRangeCharacters": "必须为 {0}-{1} 个字符",
|
||||
"CabinetTitle": "Cabinet Dialog",
|
||||
"CabinetDialog": "Enter your Amiibo's new name",
|
||||
"CabinetScanDialog": "Please scan your Amiibo now.",
|
||||
"SoftwareKeyboard": "软键盘",
|
||||
"SoftwareKeyboardModeNumeric": "只能输入 0-9 或 \".\"",
|
||||
"SoftwareKeyboardModeAlphabet": "仅支持非中文字符",
|
||||
@@ -715,7 +716,6 @@
|
||||
"UpdaterAddingFiles": "安装更新中...",
|
||||
"UpdaterExtracting": "正在提取更新...",
|
||||
"UpdaterDownloading": "下载更新中...",
|
||||
"Game": "游戏",
|
||||
"Docked": "主机模式",
|
||||
"Handheld": "掌机模式",
|
||||
"ConnectionError": "连接错误。",
|
||||
|
@@ -552,15 +552,13 @@
|
||||
"AboutUrlTooltipMessage": "在預設瀏覽器中開啟 Ryujinx 網站。",
|
||||
"AboutDisclaimerMessage": "Ryujinx 和 Nintendo™\n或其任何合作夥伴完全沒有關聯。",
|
||||
"AboutAmiiboDisclaimerMessage": "我們在 Amiibo 模擬中\n使用了 AmiiboAPI (www.amiiboapi.com)。",
|
||||
"AboutPatreonUrlTooltipMessage": "在預設瀏覽器中開啟 Ryujinx 的 Patreon 網頁。",
|
||||
"AboutGithubUrlTooltipMessage": "在預設瀏覽器中開啟 Ryujinx 的 GitHub 網頁。",
|
||||
"AboutDiscordUrlTooltipMessage": "在預設瀏覽器中開啟 Ryujinx 的 Discord 邀請連結。",
|
||||
"AboutTwitterUrlTooltipMessage": "在預設瀏覽器中開啟 Ryujinx 的 Twitter 網頁。",
|
||||
"AboutRyujinxAboutTitle": "關於:",
|
||||
"AboutRyujinxAboutContent": "Ryujinx 是一款 Nintendo Switch™ 模擬器。\n請在 Patreon 上支持我們。\n關注我們的 Twitter 或 Discord 取得所有最新消息。\n對於有興趣貢獻的開發者,可以在我們的 GitHub 或 Discord 上了解更多資訊。",
|
||||
"AboutRyujinxAboutContent": "Ryujinx is an emulator for the Nintendo Switch™.\nGet all the latest news in our Discord.\nDevelopers interested in contributing can find out more on our GitHub or Discord.",
|
||||
"AboutRyujinxMaintainersTitle": "維護者:",
|
||||
"AboutRyujinxFormerMaintainersTitle": "Formerly Maintained By:",
|
||||
"AboutRyujinxMaintainersContentTooltipMessage": "在預設瀏覽器中開啟貢獻者的網頁",
|
||||
"AboutRyujinxSupprtersTitle": "Patreon 支持者:",
|
||||
"AmiiboSeriesLabel": "Amiibo 系列",
|
||||
"AmiiboCharacterLabel": "角色",
|
||||
"AmiiboScanButtonLabel": "掃描",
|
||||
@@ -702,6 +700,9 @@
|
||||
"Never": "從不",
|
||||
"SwkbdMinCharacters": "長度必須至少為 {0} 個字元",
|
||||
"SwkbdMinRangeCharacters": "長度必須為 {0} 到 {1} 個字元",
|
||||
"CabinetTitle": "Cabinet Dialog",
|
||||
"CabinetDialog": "Enter your Amiibo's new name",
|
||||
"CabinetScanDialog": "Please scan your Amiibo now.",
|
||||
"SoftwareKeyboard": "軟體鍵盤",
|
||||
"SoftwareKeyboardModeNumeric": "必須是 0 到 9 或「.」",
|
||||
"SoftwareKeyboardModeAlphabet": "必須是「非中日韓字元」 (non CJK)",
|
||||
@@ -715,7 +716,6 @@
|
||||
"UpdaterAddingFiles": "正在加入新檔案...",
|
||||
"UpdaterExtracting": "正在提取更新...",
|
||||
"UpdaterDownloading": "正在下載更新...",
|
||||
"Game": "遊戲",
|
||||
"Docked": "底座模式",
|
||||
"Handheld": "手提模式",
|
||||
"ConnectionError": "連線錯誤。",
|
||||
@@ -786,7 +786,7 @@
|
||||
"CheatWindowHeading": "可用於 {0} [{1}] 的密技",
|
||||
"BuildId": "組建識別碼:",
|
||||
"DlcWindowBundledContentNotice": "附帶的 DLC 只能被停用而無法被刪除。",
|
||||
"DlcWindowHeading": "{0} 個可下載內容",
|
||||
"DlcWindowHeading": "{0} DLC(s) available",
|
||||
"DlcWindowDlcAddedMessage": "已加入 {0} 個 DLC",
|
||||
"AutoloadDlcAddedMessage": "已加入 {0} 個 DLC",
|
||||
"AutoloadDlcRemovedMessage": "已刪除 {0} 個遺失的 DLC",
|
||||
|
@@ -4,18 +4,6 @@
|
||||
<ResourceDictionary x:Key="Default">
|
||||
<SolidColorBrush x:Key="DataGridSelectionBackgroundBrush"
|
||||
Color="{DynamicResource DataGridSelectionColor}" />
|
||||
<SolidColorBrush x:Key="ThemeAccentColorBrush"
|
||||
Color="{DynamicResource SystemAccentColor}" />
|
||||
<SolidColorBrush x:Key="ThemeAccentBrush4"
|
||||
Color="{DynamicResource ThemeAccentColor4}" />
|
||||
<Color x:Key="SystemAccentColor">#FF00C3E3</Color>
|
||||
<Color x:Key="SystemAccentColorDark1">#FF00C3E3</Color>
|
||||
<Color x:Key="SystemAccentColorDark2">#FF00C3E3</Color>
|
||||
<Color x:Key="SystemAccentColorDark3">#FF00C3E3</Color>
|
||||
<Color x:Key="SystemAccentColorLight1">#FF00C3E3</Color>
|
||||
<Color x:Key="SystemAccentColorLight2">#FF00C3E3</Color>
|
||||
<Color x:Key="SystemAccentColorLight3">#FF00C3E3</Color>
|
||||
<Color x:Key="ThemeAccentColor4">#FFe8e8e8</Color>
|
||||
<Color x:Key="DataGridSelectionColor">#FF00FABB</Color>
|
||||
<Color x:Key="ThemeContentBackgroundColor">#FFF0F0F0</Color>
|
||||
<Color x:Key="ThemeControlBorderColor">#FFd6d6d6</Color>
|
||||
@@ -26,6 +14,7 @@
|
||||
<Color x:Key="AppListBackgroundColor">#b3ffffff</Color>
|
||||
<Color x:Key="AppListHoverBackgroundColor">#80cccccc</Color>
|
||||
<Color x:Key="SecondaryTextColor">#A0000000</Color>
|
||||
<Color x:Key="FavoriteApplicationIconColor">#fffcd12a</Color>
|
||||
<Color x:Key="Switch">#FF2EEAC9</Color>
|
||||
<Color x:Key="Unbounded">#FFFF4554</Color>
|
||||
<Color x:Key="Custom">#6483F5</Color>
|
||||
@@ -33,18 +22,6 @@
|
||||
<ResourceDictionary x:Key="Light">
|
||||
<SolidColorBrush x:Key="DataGridSelectionBackgroundBrush"
|
||||
Color="{DynamicResource DataGridSelectionColor}" />
|
||||
<SolidColorBrush x:Key="ThemeAccentColorBrush"
|
||||
Color="{DynamicResource SystemAccentColor}" />
|
||||
<SolidColorBrush x:Key="ThemeAccentBrush4"
|
||||
Color="{DynamicResource ThemeAccentColor4}" />
|
||||
<Color x:Key="SystemAccentColor">#FF00C3E3</Color>
|
||||
<Color x:Key="SystemAccentColorDark1">#FF00C3E3</Color>
|
||||
<Color x:Key="SystemAccentColorDark2">#FF00C3E3</Color>
|
||||
<Color x:Key="SystemAccentColorDark3">#FF00C3E3</Color>
|
||||
<Color x:Key="SystemAccentColorLight1">#FF00C3E3</Color>
|
||||
<Color x:Key="SystemAccentColorLight2">#FF00C3E3</Color>
|
||||
<Color x:Key="SystemAccentColorLight3">#FF00C3E3</Color>
|
||||
<Color x:Key="ThemeAccentColor4">#FFe8e8e8</Color>
|
||||
<Color x:Key="DataGridSelectionColor">#FF00FABB</Color>
|
||||
<Color x:Key="ThemeContentBackgroundColor">#FFF0F0F0</Color>
|
||||
<Color x:Key="ThemeControlBorderColor">#FFd6d6d6</Color>
|
||||
@@ -59,18 +36,7 @@
|
||||
<ResourceDictionary x:Key="Dark">
|
||||
<SolidColorBrush x:Key="DataGridSelectionBackgroundBrush"
|
||||
Color="{DynamicResource DataGridSelectionColor}" />
|
||||
<SolidColorBrush x:Key="ThemeAccentColorBrush"
|
||||
Color="{DynamicResource SystemAccentColor}" />
|
||||
<SolidColorBrush x:Key="ThemeAccentBrush4"
|
||||
Color="{DynamicResource ThemeAccentColor4}" />
|
||||
<Color x:Key="ControlFillColorSecondary">#008AA8</Color>
|
||||
<Color x:Key="SystemAccentColor">#FF00C3E3</Color>
|
||||
<Color x:Key="SystemAccentColorDark1">#FF99b000</Color>
|
||||
<Color x:Key="SystemAccentColorDark2">#FF006d7d</Color>
|
||||
<Color x:Key="SystemAccentColorDark3">#FF00525E</Color>
|
||||
<Color x:Key="SystemAccentColorLight1">#FF00dbff</Color>
|
||||
<Color x:Key="SystemAccentColorLight2">#FF19dfff</Color>
|
||||
<Color x:Key="SystemAccentColorLight3">#FF33e3ff</Color>
|
||||
<Color x:Key="DataGridSelectionColor">#FF00FABB</Color>
|
||||
<Color x:Key="ThemeContentBackgroundColor">#FF2D2D2D</Color>
|
||||
<Color x:Key="ThemeControlBorderColor">#FF505050</Color>
|
||||
|
@@ -17,13 +17,13 @@ namespace Ryujinx.Ava.Common.Markup
|
||||
public virtual string Name => "Item";
|
||||
public virtual Action<object, T?>? Setter => null;
|
||||
|
||||
protected abstract T? GetValue();
|
||||
protected abstract T? Value { get; }
|
||||
|
||||
protected virtual void ConfigureBindingExtension(CompiledBindingExtension _) { }
|
||||
|
||||
private ClrPropertyInfo PropertyInfo =>
|
||||
new(Name,
|
||||
_ => GetValue(),
|
||||
_ => Value,
|
||||
Setter as Action<object, object?>,
|
||||
typeof(T));
|
||||
|
||||
|
@@ -6,17 +6,17 @@ namespace Ryujinx.Ava.Common.Markup
|
||||
{
|
||||
internal class IconExtension(string iconString) : BasicMarkupExtension<Icon>
|
||||
{
|
||||
protected override Icon GetValue() => new() { Value = iconString };
|
||||
protected override Icon Value => new() { Value = iconString };
|
||||
}
|
||||
|
||||
internal class SpinningIconExtension(string iconString) : BasicMarkupExtension<Icon>
|
||||
{
|
||||
protected override Icon GetValue() => new() { Value = iconString, Animation = IconAnimation.Spin };
|
||||
protected override Icon Value => new() { Value = iconString, Animation = IconAnimation.Spin };
|
||||
}
|
||||
|
||||
internal class LocaleExtension(LocaleKeys key) : BasicMarkupExtension<string>
|
||||
{
|
||||
protected override string GetValue() => LocaleManager.Instance[key];
|
||||
protected override string Value => LocaleManager.Instance[key];
|
||||
|
||||
protected override void ConfigureBindingExtension(CompiledBindingExtension bindingExtension)
|
||||
=> bindingExtension.Source = LocaleManager.Instance;
|
||||
|
@@ -1,24 +0,0 @@
|
||||
using Avalonia.Threading;
|
||||
using Ryujinx.Ava.UI.ViewModels;
|
||||
|
||||
namespace Ryujinx.Ava.Common
|
||||
{
|
||||
internal class XCIFileTrimmerMainWindowLog : Ryujinx.Common.Logging.XCIFileTrimmerLog
|
||||
{
|
||||
private readonly MainWindowViewModel _viewModel;
|
||||
|
||||
public XCIFileTrimmerMainWindowLog(MainWindowViewModel viewModel)
|
||||
{
|
||||
_viewModel = viewModel;
|
||||
}
|
||||
|
||||
public override void Progress(long current, long total, string text, bool complete)
|
||||
{
|
||||
Dispatcher.UIThread.Post(() =>
|
||||
{
|
||||
_viewModel.StatusBarProgressMaximum = (int)(total);
|
||||
_viewModel.StatusBarProgressValue = (int)(current);
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
@@ -1,23 +0,0 @@
|
||||
using Avalonia.Threading;
|
||||
using Ryujinx.Ava.UI.ViewModels;
|
||||
|
||||
namespace Ryujinx.Ava.Common
|
||||
{
|
||||
internal class XCIFileTrimmerWindowLog : Ryujinx.Common.Logging.XCIFileTrimmerLog
|
||||
{
|
||||
private readonly XCITrimmerViewModel _viewModel;
|
||||
|
||||
public XCIFileTrimmerWindowLog(XCITrimmerViewModel viewModel)
|
||||
{
|
||||
_viewModel = viewModel;
|
||||
}
|
||||
|
||||
public override void Progress(long current, long total, string text, bool complete)
|
||||
{
|
||||
Dispatcher.UIThread.Post(() =>
|
||||
{
|
||||
_viewModel.SetProgress((int)(current), (int)(total));
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
45
src/Ryujinx/Common/XCITrimmerLog.cs
Normal file
45
src/Ryujinx/Common/XCITrimmerLog.cs
Normal file
@@ -0,0 +1,45 @@
|
||||
using Avalonia.Threading;
|
||||
using Ryujinx.Ava.UI.ViewModels;
|
||||
|
||||
namespace Ryujinx.Ava.Common
|
||||
{
|
||||
public static class XCITrimmerLog
|
||||
{
|
||||
internal class MainWindow : Ryujinx.Common.Logging.XCIFileTrimmerLog
|
||||
{
|
||||
private readonly MainWindowViewModel _viewModel;
|
||||
|
||||
public MainWindow(MainWindowViewModel viewModel)
|
||||
{
|
||||
_viewModel = viewModel;
|
||||
}
|
||||
|
||||
public override void Progress(long current, long total, string text, bool complete)
|
||||
{
|
||||
Dispatcher.UIThread.Post(() =>
|
||||
{
|
||||
_viewModel.StatusBarProgressMaximum = (int)(total);
|
||||
_viewModel.StatusBarProgressValue = (int)(current);
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
internal class TrimmerWindow : Ryujinx.Common.Logging.XCIFileTrimmerLog
|
||||
{
|
||||
private readonly XCITrimmerViewModel _viewModel;
|
||||
|
||||
public TrimmerWindow(XCITrimmerViewModel viewModel)
|
||||
{
|
||||
_viewModel = viewModel;
|
||||
}
|
||||
|
||||
public override void Progress(long current, long total, string text, bool complete)
|
||||
{
|
||||
Dispatcher.UIThread.Post(() =>
|
||||
{
|
||||
_viewModel.SetProgress((int)(current), (int)(total));
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
@@ -7,6 +7,7 @@ using Ryujinx.Ava.UI.Helpers;
|
||||
using Ryujinx.Ava.UI.Windows;
|
||||
using Ryujinx.HLE;
|
||||
using Ryujinx.HLE.HOS.Applets;
|
||||
using Ryujinx.HLE.HOS.Applets.SoftwareKeyboard;
|
||||
using Ryujinx.HLE.HOS.Services.Am.AppletOE.ApplicationProxyService.ApplicationProxy.Types;
|
||||
using Ryujinx.HLE.UI;
|
||||
using Ryujinx.UI.Common.Configuration;
|
||||
@@ -155,6 +156,55 @@ namespace Ryujinx.Ava.UI.Applet
|
||||
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)
|
||||
{
|
||||
device.Configuration.UserChannelPersistence.ExecuteProgram(kind, value);
|
||||
|
@@ -91,7 +91,7 @@
|
||||
HorizontalAlignment="Left"
|
||||
VerticalAlignment="Top"
|
||||
FontSize="16"
|
||||
Foreground="{DynamicResource SystemAccentColor}"
|
||||
Foreground="{DynamicResource FavoriteApplicationIconColor}"
|
||||
IsVisible="{Binding Favorite}"
|
||||
Symbol="StarFilled" />
|
||||
</Grid>
|
||||
|
@@ -146,7 +146,7 @@
|
||||
HorizontalAlignment="Left"
|
||||
VerticalAlignment="Top"
|
||||
FontSize="16"
|
||||
Foreground="{DynamicResource SystemAccentColor}"
|
||||
Foreground="{DynamicResource FavoriteApplicationIconColor}"
|
||||
IsVisible="{Binding Favorite}"
|
||||
Symbol="StarFilled" />
|
||||
</Grid>
|
||||
|
@@ -45,7 +45,9 @@ namespace Ryujinx.Ava.UI.ViewModels
|
||||
}
|
||||
}
|
||||
|
||||
public string Developers => LocaleManager.Instance.UpdateAndGetDynamicValue(LocaleKeys.AboutPageDeveloperListMore, "gdkchan, Ac_K, marysaka, rip in peri peri, LDj3SNuD, emmaus, Thealexbarney, GoffyDude, TSRBerry, IsaacMarovitz, GreemDev");
|
||||
public string Developers => "GreemDev";
|
||||
|
||||
public string FormerDevelopers => LocaleManager.Instance.UpdateAndGetDynamicValue(LocaleKeys.AboutPageDeveloperListMore, "gdkchan, Ac_K, marysaka, rip in peri peri, LDj3SNuD, emmaus, Thealexbarney, GoffyDude, TSRBerry, IsaacMarovitz");
|
||||
|
||||
public AboutWindowViewModel()
|
||||
{
|
||||
|
@@ -10,6 +10,7 @@ using DynamicData;
|
||||
using DynamicData.Binding;
|
||||
using FluentAvalonia.UI.Controls;
|
||||
using LibHac.Common;
|
||||
using LibHac.Ns;
|
||||
using Ryujinx.Ava.Common;
|
||||
using Ryujinx.Ava.Common.Locale;
|
||||
using Ryujinx.Ava.Input;
|
||||
@@ -70,7 +71,7 @@ namespace Ryujinx.Ava.UI.ViewModels
|
||||
private string _gpuStatusText;
|
||||
private string _shaderCountText;
|
||||
private bool _isAmiiboRequested;
|
||||
private bool _showRightmostSeparator;
|
||||
private bool _showShaderCompilationHint;
|
||||
private bool _isGameRunning;
|
||||
private bool _isFullScreen;
|
||||
private int _progressMaximum;
|
||||
@@ -275,12 +276,12 @@ namespace Ryujinx.Ava.UI.ViewModels
|
||||
|
||||
public bool ShowFirmwareStatus => !ShowLoadProgress;
|
||||
|
||||
public bool ShowRightmostSeparator
|
||||
public bool ShowShaderCompilationHint
|
||||
{
|
||||
get => _showRightmostSeparator;
|
||||
get => _showShaderCompilationHint;
|
||||
set
|
||||
{
|
||||
_showRightmostSeparator = value;
|
||||
_showShaderCompilationHint = value;
|
||||
|
||||
OnPropertyChanged();
|
||||
}
|
||||
@@ -401,7 +402,7 @@ namespace Ryujinx.Ava.UI.ViewModels
|
||||
|
||||
public bool OpenDeviceSaveDirectoryEnabled => !SelectedApplication.ControlHolder.ByteSpan.IsZeros() && SelectedApplication.ControlHolder.Value.DeviceSaveDataSize > 0;
|
||||
|
||||
public bool TrimXCIEnabled => Ryujinx.Common.Utilities.XCIFileTrimmer.CanTrim(SelectedApplication.Path, new Common.XCIFileTrimmerMainWindowLog(this));
|
||||
public bool TrimXCIEnabled => XCIFileTrimmer.CanTrim(SelectedApplication.Path, new XCITrimmerLog.MainWindow(this));
|
||||
|
||||
public bool OpenBcatSaveDirectoryEnabled => !SelectedApplication.ControlHolder.ByteSpan.IsZeros() && SelectedApplication.ControlHolder.Value.BcatDeliveryCacheStorageSize > 0;
|
||||
|
||||
@@ -1497,7 +1498,7 @@ namespace Ryujinx.Ava.UI.ViewModels
|
||||
VolumeStatusText = args.VolumeStatus;
|
||||
FifoStatusText = args.FifoStatus;
|
||||
|
||||
ShaderCountText = (ShowRightmostSeparator = args.ShaderCount > 0)
|
||||
ShaderCountText = (ShowShaderCompilationHint = args.ShaderCount > 0)
|
||||
? $"{LocaleManager.Instance[LocaleKeys.CompilingShaders]}: {args.ShaderCount}"
|
||||
: string.Empty;
|
||||
|
||||
@@ -1897,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)
|
||||
{
|
||||
@@ -1935,7 +1936,7 @@ namespace Ryujinx.Ava.UI.ViewModels
|
||||
this,
|
||||
TopLevel);
|
||||
|
||||
if (!await AppHost.LoadGuestApplication())
|
||||
if (!await AppHost.LoadGuestApplication(customNacpData))
|
||||
{
|
||||
AppHost.DisposeContext();
|
||||
AppHost = null;
|
||||
@@ -2164,7 +2165,7 @@ namespace Ryujinx.Ava.UI.ViewModels
|
||||
return;
|
||||
}
|
||||
|
||||
var trimmer = new XCIFileTrimmer(filename, new Common.XCIFileTrimmerMainWindowLog(this));
|
||||
var trimmer = new XCIFileTrimmer(filename, new XCITrimmerLog.MainWindow(this));
|
||||
|
||||
if (trimmer.CanBeTrimmed)
|
||||
{
|
||||
|
@@ -33,7 +33,7 @@ namespace Ryujinx.Ava.UI.ViewModels
|
||||
private const string _FileExtXCI = "XCI";
|
||||
|
||||
private readonly Ryujinx.Common.Logging.XCIFileTrimmerLog _logger;
|
||||
private readonly ApplicationLibrary _applicationLibrary;
|
||||
private ApplicationLibrary ApplicationLibrary => _mainWindowViewModel.ApplicationLibrary;
|
||||
private Optional<XCITrimmerFileModel> _processingApplication = null;
|
||||
private AvaloniaList<XCITrimmerFileModel> _allXCIFiles = new();
|
||||
private AvaloniaList<XCITrimmerFileModel> _selectedXCIFiles = new();
|
||||
@@ -47,15 +47,14 @@ namespace Ryujinx.Ava.UI.ViewModels
|
||||
|
||||
public XCITrimmerViewModel(MainWindowViewModel mainWindowViewModel)
|
||||
{
|
||||
_logger = new XCIFileTrimmerWindowLog(this);
|
||||
_logger = new XCITrimmerLog.TrimmerWindow(this);
|
||||
_mainWindowViewModel = mainWindowViewModel;
|
||||
_applicationLibrary = _mainWindowViewModel.ApplicationLibrary;
|
||||
LoadXCIApplications();
|
||||
}
|
||||
|
||||
private void LoadXCIApplications()
|
||||
{
|
||||
var apps = _applicationLibrary.Applications.Items
|
||||
var apps = ApplicationLibrary.Applications.Items
|
||||
.Where(app => app.FileExtension == _FileExtXCI);
|
||||
|
||||
foreach (var xciApp in apps)
|
||||
@@ -68,7 +67,7 @@ namespace Ryujinx.Ava.UI.ViewModels
|
||||
string path,
|
||||
OperationOutcome operationOutcome = OperationOutcome.Undetermined)
|
||||
{
|
||||
var xciApp = _applicationLibrary.Applications.Items.First(app => app.FileExtension == _FileExtXCI && app.Path == path);
|
||||
var xciApp = ApplicationLibrary.Applications.Items.First(app => app.FileExtension == _FileExtXCI && app.Path == path);
|
||||
return XCITrimmerFileModel.FromApplicationData(xciApp, _logger) with { ProcessingOutcome = operationOutcome };
|
||||
}
|
||||
|
||||
@@ -538,4 +537,4 @@ namespace Ryujinx.Ava.UI.ViewModels
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@@ -3,7 +3,9 @@ using Avalonia.Controls;
|
||||
using Avalonia.Interactivity;
|
||||
using Avalonia.Threading;
|
||||
using Gommon;
|
||||
using LibHac.Common;
|
||||
using LibHac.Ncm;
|
||||
using LibHac.Ns;
|
||||
using LibHac.Tools.FsSystem.NcaUtils;
|
||||
using Ryujinx.Ava.Common.Locale;
|
||||
using Ryujinx.Ava.UI.Helpers;
|
||||
@@ -11,6 +13,7 @@ using Ryujinx.Ava.UI.ViewModels;
|
||||
using Ryujinx.Ava.UI.Windows;
|
||||
using Ryujinx.Common;
|
||||
using Ryujinx.Common.Utilities;
|
||||
using Ryujinx.HLE;
|
||||
using Ryujinx.UI.App.Common;
|
||||
using Ryujinx.UI.Common;
|
||||
using Ryujinx.UI.Common.Configuration;
|
||||
@@ -19,6 +22,7 @@ using System;
|
||||
using System.Collections.Generic;
|
||||
using System.IO;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
|
||||
namespace Ryujinx.Ava.UI.Views.Main
|
||||
{
|
||||
@@ -123,18 +127,24 @@ namespace Ryujinx.Ava.UI.Views.Main
|
||||
|
||||
public async void OpenMiiApplet(object sender, RoutedEventArgs e)
|
||||
{
|
||||
string contentPath = ViewModel.ContentManager.GetInstalledContentPath(0x0100000000001009, StorageId.BuiltInSystem, NcaContentType.Program);
|
||||
const string AppletName = "miiEdit";
|
||||
const ulong AppletProgramId = 0x0100000000001009;
|
||||
const string AppletVersion = "1.0.0";
|
||||
|
||||
string contentPath = ViewModel.ContentManager.GetInstalledContentPath(AppletProgramId, StorageId.BuiltInSystem, NcaContentType.Program);
|
||||
|
||||
if (!string.IsNullOrEmpty(contentPath))
|
||||
{
|
||||
ApplicationData applicationData = new()
|
||||
{
|
||||
Name = "miiEdit",
|
||||
Id = 0x0100000000001009,
|
||||
Path = contentPath,
|
||||
Name = AppletName,
|
||||
Id = AppletProgramId,
|
||||
Path = contentPath
|
||||
};
|
||||
|
||||
var nacpData = StructHelpers.CreateCustomNacpData(AppletName, AppletVersion);
|
||||
|
||||
await ViewModel.LoadApplication(applicationData, ViewModel.IsFullScreen || ViewModel.StartGamesInFullscreen);
|
||||
await ViewModel.LoadApplication(applicationData, ViewModel.IsFullScreen || ViewModel.StartGamesInFullscreen, nacpData);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -200,7 +210,6 @@ namespace Ryujinx.Ava.UI.Views.Main
|
||||
|
||||
await Dispatcher.UIThread.InvokeAsync(() =>
|
||||
{
|
||||
|
||||
ViewModel.WindowState = WindowState.Normal;
|
||||
|
||||
Window.Arrange(new Rect(Window.Position.X, Window.Position.Y, windowWidthScaled, windowHeightScaled));
|
||||
@@ -210,7 +219,7 @@ namespace Ryujinx.Ava.UI.Views.Main
|
||||
public async void CheckForUpdates(object sender, RoutedEventArgs e)
|
||||
{
|
||||
if (Updater.CanUpdate(true))
|
||||
await Window.BeginUpdateAsync(true);
|
||||
await Updater.BeginUpdateAsync(true);
|
||||
}
|
||||
|
||||
public async void OpenXCITrimmerWindow(object sender, RoutedEventArgs e) => await XCITrimmerWindow.Show(ViewModel);
|
||||
|
@@ -23,7 +23,7 @@
|
||||
Background="{DynamicResource ThemeContentBackgroundColor}"
|
||||
DockPanel.Dock="Bottom"
|
||||
IsVisible="{Binding ShowMenuAndStatusBar}"
|
||||
ColumnDefinitions="Auto,Auto,*,Auto">
|
||||
ColumnDefinitions="Auto,Auto,*,Auto,Auto">
|
||||
<StackPanel
|
||||
Grid.Column="0"
|
||||
Margin="5"
|
||||
@@ -284,14 +284,27 @@
|
||||
IsVisible="{Binding !ShowLoadProgress}"
|
||||
Text="{Binding FifoStatusText}"
|
||||
TextAlignment="Start" />
|
||||
</StackPanel>
|
||||
<StackPanel
|
||||
Grid.Column="3"
|
||||
Margin="0, 0, 5, 0"
|
||||
IsVisible="{Binding IsGameRunning}"
|
||||
VerticalAlignment="Center"
|
||||
Orientation="Horizontal">
|
||||
<TextBlock
|
||||
Name="ShaderCount"
|
||||
Margin="5,0,5,0"
|
||||
HorizontalAlignment="Left"
|
||||
VerticalAlignment="Center"
|
||||
IsVisible="{Binding ShowShaderCompilationHint}"
|
||||
Text="{Binding ShaderCountText}" />
|
||||
<Border
|
||||
Width="2"
|
||||
Height="12"
|
||||
Margin="0"
|
||||
BorderBrush="Gray"
|
||||
Background="Gray"
|
||||
BorderThickness="1"
|
||||
IsVisible="{Binding !ShowLoadProgress}" />
|
||||
IsVisible="{Binding ShowShaderCompilationHint}" />
|
||||
<TextBlock
|
||||
Margin="5,0,5,0"
|
||||
HorizontalAlignment="Left"
|
||||
@@ -308,35 +321,29 @@
|
||||
BorderThickness="1"
|
||||
IsVisible="{Binding !ShowLoadProgress}" />
|
||||
<TextBlock
|
||||
Margin="5,0,5,0"
|
||||
Margin="5,0,0,0"
|
||||
HorizontalAlignment="Left"
|
||||
VerticalAlignment="Center"
|
||||
IsVisible="{Binding !ShowLoadProgress}"
|
||||
Text="{Binding GpuNameText}"
|
||||
TextAlignment="Start" />
|
||||
</StackPanel>
|
||||
<StackPanel
|
||||
Grid.Column="4"
|
||||
Margin="0,0,5,0"
|
||||
VerticalAlignment="Center"
|
||||
IsVisible="{Binding ShowFirmwareStatus}"
|
||||
Orientation="Horizontal">
|
||||
<Border
|
||||
Width="2"
|
||||
Height="12"
|
||||
Margin="0"
|
||||
BorderBrush="Gray"
|
||||
BorderThickness="1"
|
||||
IsVisible="{Binding ShowRightmostSeparator}" />
|
||||
<TextBlock
|
||||
Name="ShaderCount"
|
||||
Margin="5,0,5,0"
|
||||
HorizontalAlignment="Left"
|
||||
VerticalAlignment="Center"
|
||||
Text="{Binding ShaderCountText}" />
|
||||
</StackPanel>
|
||||
<StackPanel
|
||||
Grid.Column="3"
|
||||
Margin="0,0,5,0"
|
||||
VerticalAlignment="Center"
|
||||
IsVisible="{Binding ShowFirmwareStatus}"
|
||||
Orientation="Horizontal">
|
||||
IsVisible="{Binding IsGameRunning}" />
|
||||
<TextBlock
|
||||
Name="FirmwareStatus"
|
||||
Margin="0"
|
||||
Margin="5, 0, 0, 0"
|
||||
HorizontalAlignment="Right"
|
||||
VerticalAlignment="Center"
|
||||
Text="{ext:Locale StatusBarSystemVersion}" />
|
||||
|
@@ -165,7 +165,16 @@
|
||||
Text="{ext:Locale AboutRyujinxMaintainersTitle}" />
|
||||
<TextBlock
|
||||
FontSize="10"
|
||||
Text="{Binding Developers}"
|
||||
Margin="0, 0, 0, 5"
|
||||
TextWrapping="Wrap"
|
||||
Text="{Binding Developers}"/>
|
||||
<TextBlock
|
||||
FontSize="15"
|
||||
FontWeight="Bold"
|
||||
Text="{ext:Locale AboutRyujinxFormerMaintainersTitle}" />
|
||||
<TextBlock
|
||||
FontSize="10"
|
||||
Text="{Binding FormerDevelopers}"
|
||||
TextWrapping="Wrap" />
|
||||
<Button
|
||||
Padding="5"
|
||||
|
@@ -33,7 +33,7 @@ namespace Ryujinx.Ava.UI.Windows
|
||||
PrimaryButtonText = string.Empty,
|
||||
SecondaryButtonText = string.Empty,
|
||||
CloseButtonText = LocaleManager.Instance[LocaleKeys.UserProfilesClose],
|
||||
Content = new AboutWindow(),
|
||||
Content = new AboutWindow()
|
||||
};
|
||||
|
||||
Style closeButton = new(x => x.Name("CloseButton"));
|
||||
|
@@ -61,23 +61,17 @@ namespace Ryujinx.Ava.UI.Windows
|
||||
|
||||
private void RemoveDLC(object sender, RoutedEventArgs e)
|
||||
{
|
||||
if (sender is Button button)
|
||||
if (sender is Button { DataContext: DownloadableContentModel dlc })
|
||||
{
|
||||
if (button.DataContext is DownloadableContentModel model)
|
||||
{
|
||||
ViewModel.Remove(model);
|
||||
}
|
||||
ViewModel.Remove(dlc);
|
||||
}
|
||||
}
|
||||
|
||||
private void OpenLocation(object sender, RoutedEventArgs e)
|
||||
{
|
||||
if (sender is Button button)
|
||||
if (sender is Button { DataContext: DownloadableContentModel dlc })
|
||||
{
|
||||
if (button.DataContext is DownloadableContentModel model)
|
||||
{
|
||||
OpenHelper.LocateFile(model.ContainerPath);
|
||||
}
|
||||
OpenHelper.LocateFile(dlc.ContainerPath);
|
||||
}
|
||||
}
|
||||
|
||||
|
@@ -7,6 +7,7 @@ using Avalonia.Threading;
|
||||
using DynamicData;
|
||||
using FluentAvalonia.UI.Controls;
|
||||
using FluentAvalonia.UI.Windowing;
|
||||
using Gommon;
|
||||
using LibHac.Tools.FsSystem;
|
||||
using Ryujinx.Ava.Common;
|
||||
using Ryujinx.Ava.Common.Locale;
|
||||
@@ -387,10 +388,8 @@ namespace Ryujinx.Ava.UI.Windows
|
||||
|
||||
if (ConfigurationState.Instance.CheckUpdatesOnStart && !CommandLineState.HideAvailableUpdates && Updater.CanUpdate())
|
||||
{
|
||||
await this.BeginUpdateAsync()
|
||||
.ContinueWith(
|
||||
task => Logger.Error?.Print(LogClass.Application, $"Updater Error: {task.Exception}"),
|
||||
TaskContinuationOptions.OnlyOnFaulted);
|
||||
await Updater.BeginUpdateAsync()
|
||||
.Catch(task => Logger.Error?.Print(LogClass.Application, $"Updater Error: {task.Exception}"));
|
||||
}
|
||||
}
|
||||
|
||||
|
@@ -1,4 +1,3 @@
|
||||
using Avalonia.Controls;
|
||||
using Avalonia.Threading;
|
||||
using FluentAvalonia.UI.Controls;
|
||||
using Gommon;
|
||||
@@ -51,7 +50,7 @@ namespace Ryujinx.Ava
|
||||
|
||||
private static readonly string[] _windowsDependencyDirs = [];
|
||||
|
||||
public static async Task BeginUpdateAsync(this Window mainWindow, bool showVersionUpToDate = false)
|
||||
public static async Task BeginUpdateAsync(bool showVersionUpToDate = false)
|
||||
{
|
||||
if (_running)
|
||||
{
|
||||
@@ -75,14 +74,7 @@ namespace Ryujinx.Ava
|
||||
_platformExt = $"linux_{arch}.tar.gz";
|
||||
}
|
||||
|
||||
Version newVersion;
|
||||
Version currentVersion;
|
||||
|
||||
try
|
||||
{
|
||||
currentVersion = Version.Parse(Program.Version);
|
||||
}
|
||||
catch
|
||||
if (!Version.TryParse(Program.Version, out Version currentVersion))
|
||||
{
|
||||
Logger.Error?.Print(LogClass.Application, $"Failed to convert the current {App.FullAppName} version!");
|
||||
|
||||
@@ -165,11 +157,7 @@ namespace Ryujinx.Ava
|
||||
return;
|
||||
}
|
||||
|
||||
try
|
||||
{
|
||||
newVersion = Version.Parse(_buildVer);
|
||||
}
|
||||
catch
|
||||
if (!Version.TryParse(_buildVer, out Version newVersion))
|
||||
{
|
||||
Logger.Error?.Print(LogClass.Application, $"Failed to convert the received {App.FullAppName} version from GitHub!");
|
||||
|
||||
@@ -225,7 +213,7 @@ namespace Ryujinx.Ava
|
||||
? $"Canary {currentVersion} -> Canary {newVersion}"
|
||||
: $"{currentVersion} -> {newVersion}";
|
||||
|
||||
RequestUserToUpdate:
|
||||
RequestUserToUpdate:
|
||||
// Show a message asking the user if they want to update
|
||||
UserResult shouldUpdate = await ContentDialogHelper.CreateUpdaterChoiceDialog(
|
||||
LocaleManager.Instance[LocaleKeys.RyujinxUpdater],
|
||||
@@ -235,7 +223,7 @@ namespace Ryujinx.Ava
|
||||
switch (shouldUpdate)
|
||||
{
|
||||
case UserResult.Yes:
|
||||
await UpdateRyujinx(mainWindow, _buildUrl);
|
||||
await UpdateRyujinx(_buildUrl);
|
||||
break;
|
||||
// Secondary button maps to no, which in this case is the show changelog button.
|
||||
case UserResult.No:
|
||||
@@ -258,7 +246,7 @@ namespace Ryujinx.Ava
|
||||
return result;
|
||||
}
|
||||
|
||||
private static async Task UpdateRyujinx(Window parent, string downloadUrl)
|
||||
private static async Task UpdateRyujinx(string downloadUrl)
|
||||
{
|
||||
_updateSuccessful = false;
|
||||
|
||||
@@ -278,7 +266,7 @@ namespace Ryujinx.Ava
|
||||
SubHeader = LocaleManager.Instance[LocaleKeys.UpdaterDownloading],
|
||||
IconSource = new SymbolIconSource { Symbol = Symbol.Download },
|
||||
ShowProgressBar = true,
|
||||
XamlRoot = parent,
|
||||
XamlRoot = App.MainWindow,
|
||||
};
|
||||
|
||||
taskDialog.Opened += (s, e) =>
|
||||
|
Reference in New Issue
Block a user