Compare commits

..

61 Commits

Author SHA1 Message Date
Evan Husted
f07a9737db UI: Fix logo aliasing 2024-12-19 00:26:45 -06:00
GabCoolGuy
73638582c5 UI: Add faq, setup and multiplayer guides to the Help dropdown (#383) 2024-12-19 00:26:45 -06:00
Evan Husted
246b4bd555 Revamp README header 2024-12-19 00:26:45 -06:00
Evan Husted
c77dced809 Remove icon padding 2024-12-19 00:26:45 -06:00
Evan Husted
1e8235414f Logo from PR #381 everywhere 2024-12-19 00:26:45 -06:00
Matteo Forlani
fc41960fd3 New macOS icon (#381) 2024-12-19 00:26:45 -06:00
Evan Husted
26319ba487 fix changelogs in canary release 2024-12-19 00:26:45 -06:00
Daenorth
aeeeaca37c Norwegian Translation (#338) 2024-12-19 00:26:45 -06:00
Hack茶ん
8b3fa0011b Korean Former Maintainers & About description translations (#371) 2024-12-19 00:26:45 -06:00
rrondo
c4bfe7ec21 Some changes to Ukrainian localization (uk_UA.json) (#356)
I made some small corrections and translated the lines that didn’t have
translations.
2024-12-19 00:26:45 -06:00
GabCoolGuy
5b6449d916 infra: Add a table to the releases (#363)
This adds a table making it clearer what artifacts are needed for what
platform.

Nogui builds are not provided in the table as per Greem's request.

MAINTAINER EDIT: reasoning for above is due to the Headless in Avalonia
PR; nogui builds are going away.

Tested for both canary and release builds and everything works fine:


[Canary](https://github.com/GabCoolDude/Ryujinx-Canary/releases/tag/1.2.6)
[Release](https://github.com/GabCoolDude/Ryujinx/releases/tag/1.2.2)

For release, the damn appimage messed everything up, but thanks to
macOS, you can still test if it works.
2024-12-19 00:26:45 -06:00
Evan Husted
71646c3757 misc: chore: Simplify Updater version parsing. 2024-12-19 00:26:45 -06:00
Evan Husted
966ca60847 misc: chore: Collapse XCIFileTrimmerLog implementations into a single class. 2024-12-19 00:26:45 -06:00
Evan Husted
f1a222bb9a UI: Update About window with the current status of the project. 2024-12-19 00:26:45 -06:00
Evan Husted
8f789dd04c i18n: Clean out old translations and reset outdated ones 2024-12-19 00:26:45 -06:00
bangfire
f239ca2de0 Fix Windows Terminal hide/show functions (#342)
https://stackoverflow.com/a/78577080
2024-12-19 00:26:45 -06:00
Evan Husted
ac577e76a1 UI: Adapt accent color to the user's system.
https://amwx.github.io/FluentAvaloniaDocs/pages/FATheme/Accents#using-the-systems-accent-color
2024-12-19 00:26:45 -06:00
Evan Husted
04e6d44607 UI: Fix missing total DLC count.
Fixes #347.
2024-12-19 00:26:45 -06:00
Evan Husted
4f9cf2be6b Attempt #2 2024-12-19 00:26:45 -06:00
Evan Husted
44fcb4f5cd Try and fix nullref 2024-12-19 00:26:45 -06:00
Evan Husted
f838f00c04 HLE: extract custom NACP data functionality into a static helper for generic reuse elsewhere, and clarify magic numbers. 2024-12-19 00:26:45 -06:00
Evan Husted
0d369fc1da headless: Actually log the command line errors 2024-12-19 00:26:45 -06:00
Evan Husted
7c3e89c4f4 misc: chore: Cleanups & unused parameter removal 2024-12-19 00:26:45 -06:00
WilliamWsyHK
87394b8d4d Add Firmware keyword in log if it is indeed firmware (#343)
Co-authored-by: LotP1 <rasmus.stilling.pedersen1@gmail.com>
2024-12-19 00:26:45 -06:00
maxdlpee
b59d8f9e4e Update Spanish translation (#332)
- Added translations for XCI trimmer
- Added translations for Cabinet applet
- Added translations for Keys installer
- Other miscellaneous translations added
2024-12-19 00:26:45 -06:00
Luke Warner
468f6f782d Stub Ldn.Lp2p.ISfService: 776 (DestroyGroup) (#353)
This prevents a crash in Mario Kart Live: Home Circuit that would occur
after exiting the kart pairing screen.
2024-12-19 00:26:45 -06:00
Hack茶ん
aae92bbf15 Update Korean translation (#352) 2024-12-19 00:26:45 -06:00
Evan Husted
f23547d911 direct errored updates to ryujinx.app 2024-12-19 00:26:45 -06:00
Evan Husted
9573476db6 version 1.2 in Info.plist 2024-12-19 00:26:45 -06:00
Evan Husted
7f279cd4ed UI: Move Shader Compilation hint, graphics backend, and GPU manufacturer to the right side of the status bar, next to firmware version.
Removed the "Game:" prefix in front of FPS.
2024-12-19 00:26:45 -06:00
Evan Husted
cde38fb1c5 chore: applets: Cleanup redundant ReadStruct implementations & provide a default implementation for IApplet#GetResult. 2024-12-19 00:26:45 -06:00
Jacobwasbeast
164cf7ea7f Add the Cabinet Applet (#340)
This adds the missing Cabinet Applet, which allows for formatting
Amiibos and changing their names.
2024-12-19 00:26:45 -06:00
Luke Warner
29c4435791 ARMeilleure: Allow TPIDR2_EL0 to be set properly (#339) 2024-12-19 00:26:45 -06:00
Luke Warner
84cc3559f0 Implement and stub services required for Mario Kart Live: Home Circuit (#331)
These changes allow Mario Kart Live: Home Circuit (v2.0.0) to boot into
menus. Kart functionality has not been implemented and will not work.

Version 1.0.0 is currently unsupported due to unimplemented ARM
registers. I plan on addressing this issue at a later date.


### Here is a list of the implemented and stubbed services in this PR:
#### Implemented:
Ldn.Lp2p.IServiceCreator: 0 (CreateNetworkService)
Ldn.Lp2p.IServiceCreator: 8 (CreateNetworkServiceMonitor)
Ldn.Lp2p.ISfService: 0 (Initialize)
Ldn.Lp2p.ISfServiceMonitor: 0 (Initialize)
Ldn.Lp2p.ISfServiceMonitor: 256 (AttachNetworkInterfaceStateChangeEvent)
Ldn.Lp2p.ISfServiceMonitor: 328 (AttachJoinEvent)
#### Stubbed:
Ldn.Lp2p.ISfService: 768 (CreateGroup)
Ldn.Lp2p.ISfService: 1536 (SendToOtherGroup)
Ldn.Lp2p.ISfService: 1544 (RecvFromOtherGroup)
Ldn.Lp2p.ISfServiceMonitor: 288 (GetGroupInfo)
Ldn.Lp2p.ISfServiceMonitor: 296 (GetGroupInfo2)
Ldn.Lp2p.ISfServiceMonitor: 312 (GetIpConfig)
2024-12-19 00:26:45 -06:00
Piplup
1963cda121 Fix for missing text with specific system locale encoding (#330) 2024-12-19 00:26:45 -06:00
LotP1
b59b8ac943 JIT Sparse Function Table random crash fix (#319)
A couple of games have random crashing with the JIT Sparse Ftable changes, and it seems to have been caused by an insufficient int size returned by `AddressTableLevel#GetValue(ulong address)`.
It was 32 bits (Int32), but the GiantBlock (which is the current address table impl) uses potentially 36 bits for the first level.
2024-12-19 00:26:45 -06:00
Hack茶ん
b40cf692c8 Korean translation for key install tool (#329) 2024-12-19 00:26:45 -06:00
Nicola
fd2972ec84 Added Tool for installing keys (#233)
#232 

![image](https://github.com/user-attachments/assets/5ae6118d-3857-4005-8392-5398c8fa91d5)
2024-12-19 00:26:45 -06:00
Jonas Henriksson
9190796c62 Fix logic surrounding PushDescriptors in Vulkan (#257) 2024-12-19 00:26:45 -06:00
TheToid
08d2929ea0 ignore macos attribute files (#302) 2024-12-19 00:26:45 -06:00
Evan Husted
df6798cf7a UI: RPC: Add Diablo III 2024-12-19 00:26:45 -06:00
Luke Warner
484dc13314 Remove 'Enter' hotkey in settings menu (#95)
This allows the Enter key to be bound to a button when using the
Avalonia UI.
2024-12-19 00:26:45 -06:00
GabCoolGuy
bada08258e UI: Add Mii Edit Applet Locale (#311)
This allows the "Mii Edit Applet" dropdown to be localized ( I already
went ahead and localized French )
2024-12-19 00:26:45 -06:00
Hack茶ん
dc4ac64faf Korean "Show Changelog" translation (#313) 2024-12-19 00:26:45 -06:00
Keaton
67bb3dc2d9 Add custom refresh rate mode to VSync option (#238)
Rebased @jcm93's refreshinterval branch:
https://github.com/jcm93/Ryujinx/tree/refreshinterval

The option is placed under System/Hacks. Disabled, it's the default
Ryujinx behavior. Enabled, the behavior is shown in the attached
screenshots. If a framerate is too high or low, you can adjust the value
where you normally toggle VSync on and off. It will also cycle through
the default on/off toggles.

Also, in order to reduce clutter, I made an adjustment to remove the
target FPS and only show the percentage.

---------

Co-authored-by: jcm <6864788+jcm93@users.noreply.github.com>
2024-12-19 00:26:45 -06:00
GabCoolGuy
5e5b3aeaf1 UI: Fix icons getting cutoff in the About window (#310)
Before:


![image](https://github.com/user-attachments/assets/c8d6b7d5-487b-4ab9-83e3-9489eaa0a076)

After:


![image](https://github.com/user-attachments/assets/18ea6360-f6ee-48e6-9a0a-cd8d88a0cf51)
2024-12-19 00:26:45 -06:00
Daniel Zauner
84d340b4fb Fix window decorations being too wide (#309) 2024-12-19 00:26:45 -06:00
Evan Husted
ef7ce19867 UI: RPC: TSUKIHIME -A piece of blue glass moon- asset image 2024-12-19 00:26:45 -06:00
Evan Husted
394fabb8cc infra: Undo packing native libraries into executable. 2024-12-19 00:26:45 -06:00
LotP1
68525ab7f1 JIT Sparse Function Table (#250)
More up to date build of the JIT Sparse PR for continued development.
JIT Sparse Function Table was originally developed by riperiperi for the
original Ryujinx project, and decreased the amount of layers in the
Function Table structure, to decrease lookup times at the cost of
slightly higher RAM usage.
This PR rebalances the JIT Sparse Function Table to be a bit more RAM
intensive, but faster in workloads where the JIT Function Table is a
bottleneck. Faster RAM will see a bigger impact and slower RAM (DDR3 and
potentially slow DDR4) will see a slight performance decrease.
This PR also implements a base for a PPTC profile system that could
allow for PPTC with ExeFS mods enabled in the future.
This PR also potentially fixes a strange issue where Avalonia would time
out in some rare instances, e.g. when running ExeFS mods with TotK and a
strange controller configuration.

---------

Co-authored-by: Evan Husted <gr33m11@gmail.com>
2024-12-19 00:26:45 -06:00
Evan Husted
904d249dad UI: Always save screenshots to the Ryujinx data directory. 2024-12-19 00:26:45 -06:00
Evan Husted
413eb755cb UI: It's called "live testing." 2024-12-19 00:26:45 -06:00
Evan Husted
2ed3836093 UI: I may be stupid. Primary button result is Ok, not Yes. 2024-12-19 00:26:45 -06:00
Evan Husted
b5d5256c61 UI: Add a show changelog button in the Updater, for new updates & when you're on the latest version. 2024-12-19 00:26:45 -06:00
GabCoolGuy
32bfa06024 Add all the missing locales from XCI Trimmer and LDN merge (#281)
Hello any fellow developers that may be reading this. Whenever you add
any new locales to `en_US.json`, please make sure to add them to the
rest of the locale files. I will not always be there to add them myself.
2024-12-19 00:26:45 -06:00
GabCoolGuy
b31a8946ae Add more mentions of canary (#258)
This should hopefully make it clearer whether or not you're using
canary.

Changelog:
- Changed github workflows to have "canary" in the zip files
- Added `App.FullAppName` in the about section, so that it's clear in
there too
- Changed log name for canary builds to
`Ryujinx_Canary_{version}_{DateTime.Now:yyyy-MM-dd_HH-mm-ss}.log`
(normal builds should still be
"Ryujinx_{version}_{DateTime.Now:yyyy-MM-dd_HH-mm-ss}.log)
2024-12-19 00:26:45 -06:00
Evan Husted
0f85cadf28 Fix really obvious typo, lol 2024-12-19 00:26:45 -06:00
GabCoolGuy
4892e72907 Change headless to nogui in the release artifacts (#285)
This makes it so that instead of the files you download being
`sdl2-ryujinx-headless` they are now `nogui-ryujinx`in the release (and
canary) artifacts
2024-12-19 00:26:45 -06:00
GabCoolGuy
c565da03c5 Add documentation and ldn labels to labeler.yml (#282)
This should make it so that any changes made to ldn and documentation
related files should be auto-labeled
2024-12-19 00:26:45 -06:00
Luke Warner
0cf125a4d9 ARMeilleure: Implement TPIDR2_EL0 (#280)
This is an implementation of the TPIDR2_EL0 register. There may be more
potential use-cases for this register not included in this PR, but this
implements the use-case seen in SuperTuxKart.
2024-12-19 00:26:45 -06:00
Evan Husted
f8c53f03fd Try and fix weird nullref 2024-11-19 10:32:51 -06:00
55 changed files with 2482 additions and 1565 deletions

View File

@@ -64,9 +64,14 @@ jobs:
run: dotnet publish -c "${{ matrix.configuration }}" -r "${{ matrix.platform.name }}" -o ./publish -p:Version="${{ env.RYUJINX_BASE_VERSION }}" -p:DebugType=embedded -p:SourceRevisionId="${{ steps.git_short_hash.outputs.result }}" -p:ExtraDefineConstants=DISABLE_UPDATER src/Ryujinx --self-contained
if: github.event_name == 'pull_request' && matrix.platform.os != 'macos-13'
- name: Publish Ryujinx.Headless.SDL2
run: dotnet publish -c "${{ matrix.configuration }}" -r "${{ matrix.platform.name }}" -o ./publish_sdl2_headless -p:Version="${{ env.RYUJINX_BASE_VERSION }}" -p:DebugType=embedded -p:SourceRevisionId="${{ steps.git_short_hash.outputs.result }}" -p:ExtraDefineConstants=DISABLE_UPDATER src/Ryujinx.Headless.SDL2 --self-contained
if: github.event_name == 'pull_request' && matrix.platform.os != 'macos-13'
- name: Set executable bit
run: |
chmod +x ./publish/Ryujinx ./publish/Ryujinx.sh
chmod +x ./publish_sdl2_headless/Ryujinx.Headless.SDL2 ./publish_sdl2_headless/Ryujinx.sh
if: github.event_name == 'pull_request' && matrix.platform.os == 'ubuntu-latest'
- name: Build AppImage
@@ -114,6 +119,13 @@ jobs:
name: ryujinx-${{ matrix.configuration }}-${{ env.RYUJINX_BASE_VERSION }}+${{ steps.git_short_hash.outputs.result }}-${{ matrix.platform.zip_os_name }}-AppImage
path: publish_appimage
- name: Upload Ryujinx.Headless.SDL2 artifact
uses: actions/upload-artifact@v4
with:
name: nogui-ryujinx-${{ matrix.configuration }}-${{ env.RYUJINX_BASE_VERSION }}+${{ steps.git_short_hash.outputs.result }}-${{ matrix.platform.zip_os_name }}
path: publish_sdl2_headless
if: github.event_name == 'pull_request' && matrix.platform.os != 'macos-13'
build_macos:
name: macOS Universal (${{ matrix.configuration }})
runs-on: ubuntu-latest
@@ -159,9 +171,20 @@ jobs:
run: |
./distribution/macos/create_macos_build_ava.sh . publish_tmp publish ./distribution/macos/entitlements.xml "${{ env.RYUJINX_BASE_VERSION }}" "${{ steps.git_short_hash.outputs.result }}" "${{ matrix.configuration }}" "-p:ExtraDefineConstants=DISABLE_UPDATER"
- name: Publish macOS Ryujinx.Headless.SDL2
run: |
./distribution/macos/create_macos_build_headless.sh . publish_tmp_headless publish_headless ./distribution/macos/entitlements.xml "${{ env.RYUJINX_BASE_VERSION }}" "${{ steps.git_short_hash.outputs.result }}" "${{ matrix.configuration }}" "-p:ExtraDefineConstants=DISABLE_UPDATER"
- name: Upload Ryujinx artifact
uses: actions/upload-artifact@v4
with:
name: ryujinx-${{ matrix.configuration }}-${{ env.RYUJINX_BASE_VERSION }}+${{ steps.git_short_hash.outputs.result }}-macos_universal
path: "publish/*.tar.gz"
if: github.event_name == 'pull_request'
- name: Upload Ryujinx.Headless.SDL2 artifact
uses: actions/upload-artifact@v4
with:
name: nogui-ryujinx-${{ matrix.configuration }}-${{ env.RYUJINX_BASE_VERSION }}+${{ steps.git_short_hash.outputs.result }}-macos_universal
path: "publish_headless/*.tar.gz"
if: github.event_name == 'pull_request'

View File

@@ -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_SOURCE_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 }}
@@ -104,6 +116,7 @@ jobs:
- name: Publish
run: |
dotnet publish -c Release -r "${{ matrix.platform.name }}" -o ./publish_ava/publish -p:Version="${{ steps.version_info.outputs.build_version }}" -p:SourceRevisionId="${{ steps.version_info.outputs.git_short_hash }}" -p:DebugType=embedded src/Ryujinx --self-contained
dotnet publish -c Release -r "${{ matrix.platform.name }}" -o ./publish_sdl2_headless/publish -p:Version="${{ steps.version_info.outputs.build_version }}" -p:SourceRevisionId="${{ steps.version_info.outputs.git_short_hash }}" -p:DebugType=embedded src/Ryujinx.Headless.SDL2 --self-contained
- name: Packing Windows builds
if: matrix.platform.os == 'windows-latest'
@@ -112,6 +125,11 @@ jobs:
rm publish/libarmeilleure-jitsupport.dylib
7z a ../release_output/ryujinx-canary-${{ steps.version_info.outputs.build_version }}-${{ matrix.platform.zip_os_name }}.zip publish
popd
pushd publish_sdl2_headless
rm publish/libarmeilleure-jitsupport.dylib
7z a ../release_output/nogui-ryujinx-canary-${{ steps.version_info.outputs.build_version }}-${{ matrix.platform.zip_os_name }}.zip publish
popd
shell: bash
- name: Packing Linux builds
@@ -122,6 +140,12 @@ jobs:
chmod +x publish/Ryujinx.sh publish/Ryujinx
tar -czvf ../release_output/ryujinx-canary-${{ steps.version_info.outputs.build_version }}-${{ matrix.platform.zip_os_name }}.tar.gz publish
popd
pushd publish_sdl2_headless
rm publish/libarmeilleure-jitsupport.dylib
chmod +x publish/Ryujinx.sh publish/Ryujinx.Headless.SDL2
tar -czvf ../release_output/nogui-ryujinx-canary-${{ steps.version_info.outputs.build_version }}-${{ matrix.platform.zip_os_name }}.tar.gz publish
popd
shell: bash
#- name: Build AppImage (Linux)
@@ -167,9 +191,21 @@ jobs:
with:
name: ${{ steps.version_info.outputs.build_version }}
artifacts: "release_output/*.tar.gz,release_output/*.zip"
#artifacts: "release_output/*.tar.gz,release_output/*.zip,release_output/*AppImage*"
#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/${{ env.RYUJINX_TARGET_RELEASE_CHANNEL_OWNER }}/${{ env.RYUJINX_TARGET_RELEASE_CHANNEL_SOURCE_REPO }}/compare/Canary-${{ steps.version_info.outputs.prev_build_version }}...Canary-${{ steps.version_info.outputs.build_version }}"
omitBodyDuringUpdate: true
allowUpdates: true
replacesArtifacts: true
@@ -226,13 +262,29 @@ jobs:
run: |
./distribution/macos/create_macos_build_ava.sh . publish_tmp_ava publish_ava ./distribution/macos/entitlements.xml "${{ steps.version_info.outputs.build_version }}" "${{ steps.version_info.outputs.git_short_hash }}" Release 1
- name: Publish macOS Ryujinx.Headless.SDL2
run: |
./distribution/macos/create_macos_build_headless.sh . publish_tmp_headless publish_headless ./distribution/macos/entitlements.xml "${{ steps.version_info.outputs.build_version }}" "${{ steps.version_info.outputs.git_short_hash }}" Release 1
- name: Pushing new release
uses: ncipollo/release-action@v1
with:
name: "Canary ${{ steps.version_info.outputs.build_version }}"
artifacts: "publish_ava/*.tar.gz"
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

View File

@@ -38,15 +38,20 @@ jobs:
return core.error(`No artifacts found`);
}
let body = `Download the artifacts for this pull request:\n`;
let hidden_headless_artifacts = `\n\n <details><summary>GUI-less</summary>\n`;
let hidden_debug_artifacts = `\n\n <details><summary>Only for Developers</summary>\n`;
for (const art of artifacts) {
if(art.name.includes('Debug')) {
hidden_debug_artifacts += `\n* [${art.name}](https://nightly.link/${owner}/${repo}/actions/artifacts/${art.id}.zip)`;
} else if(art.name.includes('nogui-ryujinx')) {
hidden_headless_artifacts += `\n* [${art.name}](https://nightly.link/${owner}/${repo}/actions/artifacts/${art.id}.zip)`;
} else {
body += `\n* [${art.name}](https://nightly.link/${owner}/${repo}/actions/artifacts/${art.id}.zip)`;
}
}
hidden_headless_artifacts += `\n</details>`;
hidden_debug_artifacts += `\n</details>`;
body += hidden_headless_artifacts;
body += hidden_debug_artifacts;
const {data: comments} = await github.rest.issues.listComments({repo, owner, issue_number});

View File

@@ -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 }}
@@ -103,6 +112,7 @@ jobs:
- name: Publish
run: |
dotnet publish -c Release -r "${{ matrix.platform.name }}" -o ./publish -p:Version="${{ steps.version_info.outputs.build_version }}" -p:SourceRevisionId="${{ steps.version_info.outputs.git_short_hash }}" -p:DebugType=embedded src/Ryujinx --self-contained
dotnet publish -c Release -r "${{ matrix.platform.name }}" -o ./publish_sdl2_headless -p:Version="${{ steps.version_info.outputs.build_version }}" -p:SourceRevisionId="${{ steps.version_info.outputs.git_short_hash }}" -p:DebugType=embedded src/Ryujinx.Headless.SDL2 --self-contained
- name: Packing Windows builds
if: matrix.platform.os == 'windows-latest'
@@ -111,6 +121,11 @@ jobs:
rm libarmeilleure-jitsupport.dylib
7z a ../release_output/ryujinx-${{ steps.version_info.outputs.build_version }}-${{ matrix.platform.zip_os_name }}.zip ../publish
popd
pushd publish_sdl2_headless
rm libarmeilleure-jitsupport.dylib
7z a ../release_output/nogui-ryujinx-${{ steps.version_info.outputs.build_version }}-${{ matrix.platform.zip_os_name }}.zip ../publish
popd
shell: bash
- name: Build AppImage (Linux)
@@ -157,6 +172,11 @@ jobs:
chmod +x Ryujinx.sh Ryujinx
tar -czvf ../release_output/ryujinx-${{ steps.version_info.outputs.build_version }}-${{ matrix.platform.zip_os_name }}.tar.gz ../publish
popd
pushd publish_sdl2_headless
chmod +x Ryujinx.sh Ryujinx.Headless.SDL2
tar -czvf ../release_output/nogui-ryujinx-${{ steps.version_info.outputs.build_version }}-${{ matrix.platform.zip_os_name }}.tar.gz ../publish
popd
shell: bash
- name: Pushing new release
@@ -165,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
@@ -222,13 +251,26 @@ jobs:
run: |
./distribution/macos/create_macos_build_ava.sh . publish_tmp_ava publish ./distribution/macos/entitlements.xml "${{ steps.version_info.outputs.build_version }}" "${{ steps.version_info.outputs.git_short_hash }}" Release 0
- name: Publish macOS Ryujinx.Headless.SDL2
run: |
./distribution/macos/create_macos_build_headless.sh . publish_tmp_headless publish_headless ./distribution/macos/entitlements.xml "${{ steps.version_info.outputs.build_version }}" "${{ steps.version_info.outputs.git_short_hash }}" Release 0
- name: Pushing new release
uses: ncipollo/release-action@v1
with:
name: ${{ steps.version_info.outputs.build_version }}
artifacts: "publish/*.tar.gz"
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

View File

@@ -1,35 +1,26 @@
<h1 align="center">
<table align="center">
<tr>
<td align="center" width="25%">
<img src="https://raw.githubusercontent.com/GreemDev/ryuassets/refs/heads/main/RyujinxApp_1024.png" alt="Ryujinx" >
</td>
<td align="center" width="75%">
# Ryujinx
[![Release workflow](https://github.com/GreemDev/Ryujinx/actions/workflows/release.yml/badge.svg)](https://github.com/GreemDev/Ryujinx/actions/workflows/release.yml)
[![Latest release](https://img.shields.io/github/v/release/GreemDev/Ryujinx)](https://github.com/GreemDev/Ryujinx/releases/latest)
<br>
<img src="https://raw.githubusercontent.com/GreemDev/Ryujinx/master/distribution/misc/Logo.svg" alt="Ryujinx" width="150"></a>
<br>
<b>Ryujinx</b>
<br>
<sub><sup><b>(REE-YOU-JINX)</b></sup></sub>
<br>
<a href="https://github.com/GreemDev/Ryujinx/actions/workflows/release.yml">
<img src="https://github.com/GreemDev/Ryujinx/actions/workflows/release.yml/badge.svg"
alt="">
</a>
<a href="https://github.com/GreemDev/Ryujinx/releases/latest">
<img src="https://img.shields.io/github/v/release/GreemDev/Ryujinx"
alt="Latest Release">
</a>
<br>
<a href="https://github.com/GreemDev/Ryujinx/actions/workflows/canary.yml">
<img src="https://github.com/GreemDev/Ryujinx/actions/workflows/canary.yml/badge.svg"
alt="">
</a>
<a href="https://github.com/GreemDev/Ryujinx-Canary/releases/latest">
<img src="https://img.shields.io/github/v/release/GreemDev/Ryujinx-Canary?label=canary"
alt="Latest Canary Release">
</a>
</h1>
[![Canary workflow](https://github.com/GreemDev/Ryujinx/actions/workflows/canary.yml/badge.svg)](https://github.com/GreemDev/Ryujinx/actions/workflows/canary.yml)
[![Latest canary release](https://img.shields.io/github/v/release/GreemDev/Ryujinx-Canary?label=canary)](https://github.com/GreemDev/Ryujinx-Canary/releases/latest)
</td>
</tr>
</table>
<p align="center">
Ryujinx is an open-source Nintendo Switch emulator, originally created by gdkchan, written in C#.
This emulator aims at providing excellent accuracy and performance, a user-friendly interface and consistent builds.
It was written from scratch and development on the project began in September 2017.
Ryujinx is available on Github under the <a href="https://github.com/GreemDev/Ryujinx/blob/master/LICENSE.txt" target="_blank">MIT license</a>.
Ryujinx is available on GitHub under the <a href="https://github.com/GreemDev/Ryujinx/blob/master/LICENSE.txt" target="_blank">MIT license</a>.
<br />
</p>
<p align="center">

View File

@@ -57,6 +57,8 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Ryujinx.SDL2.Common", "src\
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Ryujinx.Audio.Backends.SDL2", "src\Ryujinx.Audio.Backends.SDL2\Ryujinx.Audio.Backends.SDL2.csproj", "{D99A395A-8569-4DB0-B336-900647890052}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Ryujinx.Headless.SDL2", "src\Ryujinx.Headless.SDL2\Ryujinx.Headless.SDL2.csproj", "{390DC343-5CB4-4C79-A5DD-E3ED235E4C49}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Ryujinx.Graphics.Nvdec.FFmpeg", "src\Ryujinx.Graphics.Nvdec.FFmpeg\Ryujinx.Graphics.Nvdec.FFmpeg.csproj", "{BEE1C184-C9A4-410B-8DFC-FB74D5C93AEB}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Ryujinx", "src\Ryujinx\Ryujinx.csproj", "{7C1B2721-13DA-4B62-B046-C626605ECCE6}"
@@ -202,6 +204,10 @@ Global
{D99A395A-8569-4DB0-B336-900647890052}.Debug|Any CPU.Build.0 = Debug|Any CPU
{D99A395A-8569-4DB0-B336-900647890052}.Release|Any CPU.ActiveCfg = Release|Any CPU
{D99A395A-8569-4DB0-B336-900647890052}.Release|Any CPU.Build.0 = Release|Any CPU
{390DC343-5CB4-4C79-A5DD-E3ED235E4C49}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{390DC343-5CB4-4C79-A5DD-E3ED235E4C49}.Debug|Any CPU.Build.0 = Debug|Any CPU
{390DC343-5CB4-4C79-A5DD-E3ED235E4C49}.Release|Any CPU.ActiveCfg = Release|Any CPU
{390DC343-5CB4-4C79-A5DD-E3ED235E4C49}.Release|Any CPU.Build.0 = Release|Any CPU
{BEE1C184-C9A4-410B-8DFC-FB74D5C93AEB}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{BEE1C184-C9A4-410B-8DFC-FB74D5C93AEB}.Debug|Any CPU.Build.0 = Debug|Any CPU
{BEE1C184-C9A4-410B-8DFC-FB74D5C93AEB}.Release|Any CPU.ActiveCfg = Release|Any CPU

Binary file not shown.

File diff suppressed because one or more lines are too long

Before

Width:  |  Height:  |  Size: 1.5 KiB

After

Width:  |  Height:  |  Size: 1.2 MiB

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 48 KiB

View File

@@ -4,7 +4,6 @@ using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Runtime.CompilerServices;
using System.Threading;
@@ -159,15 +158,20 @@ namespace Ryujinx.Common.Logging
}
private static ILogTarget GetTarget(string targetName)
=> _logTargets.FirstOrDefault(target => target.Name.Equals(targetName));
{
foreach (var target in _logTargets)
{
if (target.Name.Equals(targetName))
{
return target;
}
}
return null;
}
public static void AddTarget(ILogTarget target)
{
if (_logTargets.Any(t => t.Name == target.Name))
{
return;
}
_logTargets.Add(target);
Updated += target.Log;

View File

@@ -27,7 +27,11 @@ namespace Ryujinx.Common.Logging.Targets
private readonly int _overflowTimeout;
string ILogTarget.Name => _target.Name;
string ILogTarget.Name { get => _target.Name; }
public AsyncLogTargetWrapper(ILogTarget target)
: this(target, -1)
{ }
public AsyncLogTargetWrapper(ILogTarget target, int queueLimit = -1, AsyncLogTargetOverflowAction overflowAction = AsyncLogTargetOverflowAction.Block)
{

View File

@@ -1,4 +1,3 @@
using Gommon;
using Ryujinx.Common.Configuration;
using Ryujinx.Common.Logging;
using Ryujinx.Common.Utilities;
@@ -7,13 +6,12 @@ using System;
using System.Collections.Concurrent;
using System.Collections.Generic;
using System.IO;
using System.Linq;
namespace Ryujinx.HLE.HOS.Services.Account.Acc
{
public class AccountSaveDataManager
class AccountSaveDataManager
{
private static readonly string _profilesJsonPath = Path.Join(AppDataManager.BaseDirPath, "system", "Profiles.json");
private readonly string _profilesJsonPath = Path.Join(AppDataManager.BaseDirPath, "system", "Profiles.json");
private static readonly ProfilesJsonSerializerContext _serializerContext = new(JsonHelper.GetDefaultSerializerOptions());
@@ -51,16 +49,6 @@ namespace Ryujinx.HLE.HOS.Services.Account.Acc
}
}
public static Optional<UserProfile> GetLastUsedUser()
{
ProfilesJson profilesJson = JsonHelper.DeserializeFromFile(_profilesJsonPath, _serializerContext.ProfilesJson);
return profilesJson.Profiles
.FindFirst(profile => profile.AccountState == AccountState.Open)
.Convert(profileJson => new UserProfile(new UserId(profileJson.UserId), profileJson.Name,
profileJson.Image, profileJson.LastModifiedTimestamp));
}
public void Save(ConcurrentDictionary<string, UserProfile> profiles)
{
ProfilesJson profilesJson = new()

View File

@@ -2,7 +2,7 @@ using Ryujinx.HLE.UI;
using System.Threading;
using System.Threading.Tasks;
namespace Ryujinx.Headless
namespace Ryujinx.Headless.SDL2
{
/// <summary>
/// Headless text processing class, right now there is no way to forward the input to it.

View File

@@ -1,6 +1,6 @@
using Ryujinx.HLE.UI;
namespace Ryujinx.Headless
namespace Ryujinx.Headless.SDL2
{
internal class HeadlessHostUiTheme : IHostUITheme
{

View File

@@ -7,7 +7,7 @@ using Ryujinx.Input.HLE;
using System;
using static SDL2.SDL;
namespace Ryujinx.Headless
namespace Ryujinx.Headless.SDL2.OpenGL
{
class OpenGLWindow : WindowBase
{

View File

@@ -1,169 +1,14 @@
using CommandLine;
using Gommon;
using Ryujinx.Common.Configuration;
using Ryujinx.Common.Configuration.Hid;
using Ryujinx.HLE;
using Ryujinx.HLE.HOS.Services.Account.Acc;
using Ryujinx.HLE.HOS.SystemState;
using Ryujinx.UI.Common.Configuration;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
namespace Ryujinx.Headless
namespace Ryujinx.Headless.SDL2
{
public class Options
{
public void InheritMainConfig(string[] originalArgs, ConfigurationState configurationState, out bool needsProfileSet)
{
needsProfileSet = NeedsOverride(nameof(UserProfile));
if (NeedsOverride(nameof(IsFullscreen)))
IsFullscreen = configurationState.UI.StartFullscreen;
if (NeedsOverride(nameof(EnableKeyboard)))
EnableKeyboard = configurationState.Hid.EnableKeyboard;
if (NeedsOverride(nameof(EnableMouse)))
EnableMouse = configurationState.Hid.EnableMouse;
if (NeedsOverride(nameof(HideCursorMode)))
HideCursorMode = configurationState.HideCursor;
if (NeedsOverride(nameof(DisablePTC)))
DisablePTC = !configurationState.System.EnablePtc;
if (NeedsOverride(nameof(EnableInternetAccess)))
EnableInternetAccess = configurationState.System.EnableInternetAccess;
if (NeedsOverride(nameof(DisableFsIntegrityChecks)))
DisableFsIntegrityChecks = configurationState.System.EnableFsIntegrityChecks;
if (NeedsOverride(nameof(FsGlobalAccessLogMode)))
FsGlobalAccessLogMode = configurationState.System.FsGlobalAccessLogMode;
if (NeedsOverride(nameof(VSyncMode)))
VSyncMode = configurationState.Graphics.VSyncMode;
if (NeedsOverride(nameof(CustomVSyncInterval)))
CustomVSyncInterval = configurationState.Graphics.CustomVSyncInterval;
if (NeedsOverride(nameof(DisableShaderCache)))
DisableShaderCache = !configurationState.Graphics.EnableShaderCache;
if (NeedsOverride(nameof(EnableTextureRecompression)))
EnableTextureRecompression = configurationState.Graphics.EnableTextureRecompression;
if (NeedsOverride(nameof(DisableDockedMode)))
DisableDockedMode = !configurationState.System.EnableDockedMode;
if (NeedsOverride(nameof(SystemLanguage)))
SystemLanguage = (SystemLanguage)(int)configurationState.System.Language.Value;
if (NeedsOverride(nameof(SystemRegion)))
SystemRegion = (RegionCode)(int)configurationState.System.Region.Value;
if (NeedsOverride(nameof(SystemTimeZone)))
SystemTimeZone = configurationState.System.TimeZone;
if (NeedsOverride(nameof(SystemTimeOffset)))
SystemTimeOffset = configurationState.System.SystemTimeOffset;
if (NeedsOverride(nameof(MemoryManagerMode)))
MemoryManagerMode = configurationState.System.MemoryManagerMode;
if (NeedsOverride(nameof(AudioVolume)))
AudioVolume = configurationState.System.AudioVolume;
if (NeedsOverride(nameof(UseHypervisor)) && OperatingSystem.IsMacOS())
UseHypervisor = configurationState.System.UseHypervisor;
if (NeedsOverride(nameof(MultiplayerLanInterfaceId)))
MultiplayerLanInterfaceId = configurationState.Multiplayer.LanInterfaceId;
if (NeedsOverride(nameof(DisableFileLog)))
DisableFileLog = !configurationState.Logger.EnableFileLog;
if (NeedsOverride(nameof(LoggingEnableDebug)))
LoggingEnableDebug = configurationState.Logger.EnableDebug;
if (NeedsOverride(nameof(LoggingDisableStub)))
LoggingDisableStub = !configurationState.Logger.EnableStub;
if (NeedsOverride(nameof(LoggingDisableInfo)))
LoggingDisableInfo = !configurationState.Logger.EnableInfo;
if (NeedsOverride(nameof(LoggingDisableWarning)))
LoggingDisableWarning = !configurationState.Logger.EnableWarn;
if (NeedsOverride(nameof(LoggingDisableError)))
LoggingDisableError = !configurationState.Logger.EnableError;
if (NeedsOverride(nameof(LoggingEnableTrace)))
LoggingEnableTrace = configurationState.Logger.EnableTrace;
if (NeedsOverride(nameof(LoggingDisableGuest)))
LoggingDisableGuest = !configurationState.Logger.EnableGuest;
if (NeedsOverride(nameof(LoggingEnableFsAccessLog)))
LoggingEnableFsAccessLog = configurationState.Logger.EnableFsAccessLog;
if (NeedsOverride(nameof(LoggingGraphicsDebugLevel)))
LoggingGraphicsDebugLevel = configurationState.Logger.GraphicsDebugLevel;
if (NeedsOverride(nameof(ResScale)))
ResScale = configurationState.Graphics.ResScale;
if (NeedsOverride(nameof(MaxAnisotropy)))
MaxAnisotropy = configurationState.Graphics.MaxAnisotropy;
if (NeedsOverride(nameof(AspectRatio)))
AspectRatio = configurationState.Graphics.AspectRatio;
if (NeedsOverride(nameof(BackendThreading)))
BackendThreading = configurationState.Graphics.BackendThreading;
if (NeedsOverride(nameof(DisableMacroHLE)))
DisableMacroHLE = !configurationState.Graphics.EnableMacroHLE;
if (NeedsOverride(nameof(GraphicsShadersDumpPath)))
GraphicsShadersDumpPath = configurationState.Graphics.ShadersDumpPath;
if (NeedsOverride(nameof(GraphicsBackend)))
GraphicsBackend = configurationState.Graphics.GraphicsBackend;
if (NeedsOverride(nameof(AntiAliasing)))
AntiAliasing = configurationState.Graphics.AntiAliasing;
if (NeedsOverride(nameof(ScalingFilter)))
ScalingFilter = configurationState.Graphics.ScalingFilter;
if (NeedsOverride(nameof(ScalingFilterLevel)))
ScalingFilterLevel = configurationState.Graphics.ScalingFilterLevel;
if (NeedsOverride(nameof(DramSize)))
DramSize = configurationState.System.DramSize;
if (NeedsOverride(nameof(IgnoreMissingServices)))
IgnoreMissingServices = configurationState.System.IgnoreMissingServices;
if (NeedsOverride(nameof(IgnoreControllerApplet)))
IgnoreControllerApplet = configurationState.IgnoreApplet;
return;
bool NeedsOverride(string argKey) => originalArgs.None(arg => arg.TrimStart('-').EqualsIgnoreCase(OptionName(argKey)));
string OptionName(string propertyName) =>
typeof(Options)!.GetProperty(propertyName)!.GetCustomAttribute<OptionAttribute>()!.LongName;
}
// General
[Option("use-main-config", Required = false, Default = false, HelpText = "Use the settings from what was configured via the UI.")]
public bool InheritConfig { get; set; }
[Option("root-data-dir", Required = false, HelpText = "Set the custom folder path for Ryujinx data.")]
public string BaseDataDir { get; set; }
@@ -327,7 +172,7 @@ namespace Ryujinx.Headless
public bool LoggingDisableWarning { get; set; }
[Option("disable-error-logs", Required = false, HelpText = "Disables printing error log messages.")]
public bool LoggingDisableError { get; set; }
public bool LoggingEnableError { get; set; }
[Option("enable-trace-logs", Required = false, Default = false, HelpText = "Enables printing trace log messages.")]
public bool LoggingEnableTrace { get; set; }

View File

@@ -1,9 +1,13 @@
using CommandLine;
using Gommon;
using Ryujinx.Ava;
using LibHac.Tools.FsSystem;
using Ryujinx.Audio.Backends.SDL2;
using Ryujinx.Common;
using Ryujinx.Common.Configuration;
using Ryujinx.Common.Configuration.Hid;
using Ryujinx.Common.Configuration.Hid.Controller;
using Ryujinx.Common.Configuration.Hid.Controller.Motion;
using Ryujinx.Common.Configuration.Hid.Keyboard;
using Ryujinx.Common.GraphicsDriver;
using Ryujinx.Common.Logging;
using Ryujinx.Common.Logging.Targets;
@@ -11,9 +15,14 @@ using Ryujinx.Common.SystemInterop;
using Ryujinx.Common.Utilities;
using Ryujinx.Cpu;
using Ryujinx.Graphics.GAL;
using Ryujinx.Graphics.GAL.Multithreading;
using Ryujinx.Graphics.Gpu;
using Ryujinx.Graphics.Gpu.Shader;
using Ryujinx.Graphics.OpenGL;
using Ryujinx.Graphics.Vulkan;
using Ryujinx.Graphics.Vulkan.MoltenVK;
using Ryujinx.Headless.SDL2.OpenGL;
using Ryujinx.Headless.SDL2.Vulkan;
using Ryujinx.HLE;
using Ryujinx.HLE.FileSystem;
using Ryujinx.HLE.HOS;
@@ -22,16 +31,22 @@ using Ryujinx.Input;
using Ryujinx.Input.HLE;
using Ryujinx.Input.SDL2;
using Ryujinx.SDL2.Common;
using Ryujinx.UI.Common.Configuration;
using Silk.NET.Vulkan;
using System;
using System.Collections.Generic;
using System.IO;
using System.Text.Json;
using System.Threading;
using ConfigGamepadInputId = Ryujinx.Common.Configuration.Hid.Controller.GamepadInputId;
using ConfigStickInputId = Ryujinx.Common.Configuration.Hid.Controller.StickInputId;
using Key = Ryujinx.Common.Configuration.Hid.Key;
namespace Ryujinx.Headless
namespace Ryujinx.Headless.SDL2
{
public partial class HeadlessRyujinx
class Program
{
public static string Version { get; private set; }
private static VirtualFileSystem _virtualFileSystem;
private static ContentManager _contentManager;
private static AccountManager _accountManager;
@@ -41,18 +56,20 @@ namespace Ryujinx.Headless
private static Switch _emulationContext;
private static WindowBase _window;
private static WindowsMultimediaTimerResolution _windowsMultimediaTimerResolution;
private static List<InputConfig> _inputConfiguration = [];
private static List<InputConfig> _inputConfiguration;
private static bool _enableKeyboard;
private static bool _enableMouse;
private static readonly InputConfigJsonSerializerContext _serializerContext = new(JsonHelper.GetDefaultSerializerOptions());
public static void Entrypoint(string[] args)
static void Main(string[] args)
{
Version = ReleaseInformation.Version;
// Make process DPI aware for proper window sizing on high-res screens.
ForceDpiAware.Windows();
Console.Title = $"Ryujinx Console {Program.Version} (Headless)";
Console.Title = $"Ryujinx Console {Version} (Headless SDL2)";
if (OperatingSystem.IsMacOS() || OperatingSystem.IsLinux())
{
@@ -80,7 +97,7 @@ namespace Ryujinx.Headless
}
Parser.Default.ParseArguments<Options>(args)
.WithParsed(options => Load(args, options))
.WithParsed(Load)
.WithNotParsed(errors =>
{
Logger.Error?.PrintMsg(LogClass.Application, "Error parsing command-line arguments:");
@@ -89,80 +106,238 @@ namespace Ryujinx.Headless
});
}
public static void ReloadConfig(string customConfigPath = null)
private static InputConfig HandlePlayerConfiguration(string inputProfileName, string inputId, PlayerIndex index)
{
string localConfigurationPath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, ReleaseInformation.ConfigName);
string appDataConfigurationPath = Path.Combine(AppDataManager.BaseDirPath, ReleaseInformation.ConfigName);
if (inputId == null)
{
if (index == PlayerIndex.Player1)
{
Logger.Info?.Print(LogClass.Application, $"{index} not configured, defaulting to default keyboard.");
string configurationPath = null;
// Now load the configuration as the other subsystems are now registered
if (customConfigPath != null && File.Exists(customConfigPath))
{
configurationPath = customConfigPath;
}
else if (File.Exists(localConfigurationPath))
{
configurationPath = localConfigurationPath;
}
else if (File.Exists(appDataConfigurationPath))
{
configurationPath = appDataConfigurationPath;
}
if (configurationPath == null)
{
// No configuration, we load the default values and save it to disk
configurationPath = appDataConfigurationPath;
Logger.Notice.Print(LogClass.Application, $"No configuration file found. Saving default configuration to: {configurationPath}");
ConfigurationState.Instance.LoadDefault();
ConfigurationState.Instance.ToFileFormat().SaveConfig(configurationPath);
// Default to keyboard
inputId = "0";
}
else
{
Logger.Notice.Print(LogClass.Application, $"Loading configuration from: {configurationPath}");
Logger.Info?.Print(LogClass.Application, $"{index} not configured");
if (ConfigurationFileFormat.TryLoad(configurationPath, out ConfigurationFileFormat configurationFileFormat))
return null;
}
}
IGamepad gamepad = _inputManager.KeyboardDriver.GetGamepad(inputId);
bool isKeyboard = true;
if (gamepad == null)
{
ConfigurationState.Instance.Load(configurationFileFormat, configurationPath);
gamepad = _inputManager.GamepadDriver.GetGamepad(inputId);
isKeyboard = false;
if (gamepad == null)
{
Logger.Error?.Print(LogClass.Application, $"{index} gamepad not found (\"{inputId}\")");
return null;
}
}
string gamepadName = gamepad.Name;
gamepad.Dispose();
InputConfig config;
if (inputProfileName == null || inputProfileName.Equals("default"))
{
if (isKeyboard)
{
config = new StandardKeyboardInputConfig
{
Version = InputConfig.CurrentVersion,
Backend = InputBackendType.WindowKeyboard,
Id = null,
ControllerType = ControllerType.JoyconPair,
LeftJoycon = new LeftJoyconCommonConfig<Key>
{
DpadUp = Key.Up,
DpadDown = Key.Down,
DpadLeft = Key.Left,
DpadRight = Key.Right,
ButtonMinus = Key.Minus,
ButtonL = Key.E,
ButtonZl = Key.Q,
ButtonSl = Key.Unbound,
ButtonSr = Key.Unbound,
},
LeftJoyconStick = new JoyconConfigKeyboardStick<Key>
{
StickUp = Key.W,
StickDown = Key.S,
StickLeft = Key.A,
StickRight = Key.D,
StickButton = Key.F,
},
RightJoycon = new RightJoyconCommonConfig<Key>
{
ButtonA = Key.Z,
ButtonB = Key.X,
ButtonX = Key.C,
ButtonY = Key.V,
ButtonPlus = Key.Plus,
ButtonR = Key.U,
ButtonZr = Key.O,
ButtonSl = Key.Unbound,
ButtonSr = Key.Unbound,
},
RightJoyconStick = new JoyconConfigKeyboardStick<Key>
{
StickUp = Key.I,
StickDown = Key.K,
StickLeft = Key.J,
StickRight = Key.L,
StickButton = Key.H,
},
};
}
else
{
Logger.Warning?.PrintMsg(LogClass.Application, $"Failed to load config! Loading the default config instead.\nFailed config location: {configurationPath}");
bool isNintendoStyle = gamepadName.Contains("Nintendo");
ConfigurationState.Instance.LoadDefault();
}
}
}
static void Load(string[] originalArgs, Options option)
config = new StandardControllerInputConfig
{
Initialize();
bool useLastUsedProfile = false;
if (option.InheritConfig)
Version = InputConfig.CurrentVersion,
Backend = InputBackendType.GamepadSDL2,
Id = null,
ControllerType = ControllerType.JoyconPair,
DeadzoneLeft = 0.1f,
DeadzoneRight = 0.1f,
RangeLeft = 1.0f,
RangeRight = 1.0f,
TriggerThreshold = 0.5f,
LeftJoycon = new LeftJoyconCommonConfig<ConfigGamepadInputId>
{
option.InheritMainConfig(originalArgs, ConfigurationState.Instance, out useLastUsedProfile);
DpadUp = ConfigGamepadInputId.DpadUp,
DpadDown = ConfigGamepadInputId.DpadDown,
DpadLeft = ConfigGamepadInputId.DpadLeft,
DpadRight = ConfigGamepadInputId.DpadRight,
ButtonMinus = ConfigGamepadInputId.Minus,
ButtonL = ConfigGamepadInputId.LeftShoulder,
ButtonZl = ConfigGamepadInputId.LeftTrigger,
ButtonSl = ConfigGamepadInputId.Unbound,
ButtonSr = ConfigGamepadInputId.Unbound,
},
LeftJoyconStick = new JoyconConfigControllerStick<ConfigGamepadInputId, ConfigStickInputId>
{
Joystick = ConfigStickInputId.Left,
StickButton = ConfigGamepadInputId.LeftStick,
InvertStickX = false,
InvertStickY = false,
Rotate90CW = false,
},
RightJoycon = new RightJoyconCommonConfig<ConfigGamepadInputId>
{
ButtonA = isNintendoStyle ? ConfigGamepadInputId.A : ConfigGamepadInputId.B,
ButtonB = isNintendoStyle ? ConfigGamepadInputId.B : ConfigGamepadInputId.A,
ButtonX = isNintendoStyle ? ConfigGamepadInputId.X : ConfigGamepadInputId.Y,
ButtonY = isNintendoStyle ? ConfigGamepadInputId.Y : ConfigGamepadInputId.X,
ButtonPlus = ConfigGamepadInputId.Plus,
ButtonR = ConfigGamepadInputId.RightShoulder,
ButtonZr = ConfigGamepadInputId.RightTrigger,
ButtonSl = ConfigGamepadInputId.Unbound,
ButtonSr = ConfigGamepadInputId.Unbound,
},
RightJoyconStick = new JoyconConfigControllerStick<ConfigGamepadInputId, ConfigStickInputId>
{
Joystick = ConfigStickInputId.Right,
StickButton = ConfigGamepadInputId.RightStick,
InvertStickX = false,
InvertStickY = false,
Rotate90CW = false,
},
Motion = new StandardMotionConfigController
{
MotionBackend = MotionInputBackendType.GamepadDriver,
EnableMotion = true,
Sensitivity = 100,
GyroDeadzone = 1,
},
Rumble = new RumbleConfigController
{
StrongRumble = 1f,
WeakRumble = 1f,
EnableRumble = false,
},
};
}
}
else
{
string profileBasePath;
if (isKeyboard)
{
profileBasePath = Path.Combine(AppDataManager.ProfilesDirPath, "keyboard");
}
else
{
profileBasePath = Path.Combine(AppDataManager.ProfilesDirPath, "controller");
}
string path = Path.Combine(profileBasePath, inputProfileName + ".json");
if (!File.Exists(path))
{
Logger.Error?.Print(LogClass.Application, $"Input profile \"{inputProfileName}\" not found for \"{inputId}\"");
return null;
}
try
{
config = JsonHelper.DeserializeFromFile(path, _serializerContext.InputConfig);
}
catch (JsonException)
{
Logger.Error?.Print(LogClass.Application, $"Input profile \"{inputProfileName}\" parsing failed for \"{inputId}\"");
return null;
}
}
config.Id = inputId;
config.PlayerIndex = index;
string inputTypeName = isKeyboard ? "Keyboard" : "Gamepad";
Logger.Info?.Print(LogClass.Application, $"{config.PlayerIndex} configured with {inputTypeName} \"{config.Id}\"");
// If both stick ranges are 0 (usually indicative of an outdated profile load) then both sticks will be set to 1.0.
if (config is StandardControllerInputConfig controllerConfig)
{
if (controllerConfig.RangeLeft <= 0.0f && controllerConfig.RangeRight <= 0.0f)
{
controllerConfig.RangeLeft = 1.0f;
controllerConfig.RangeRight = 1.0f;
Logger.Info?.Print(LogClass.Application, $"{config.PlayerIndex} stick range reset. Save the profile now to update your configuration");
}
}
return config;
}
static void Load(Options option)
{
AppDataManager.Initialize(option.BaseDataDir);
if (useLastUsedProfile && AccountSaveDataManager.GetLastUsedUser().TryGet(out var profile))
option.UserProfile = profile.Name;
// Check if keys exists.
if (!File.Exists(Path.Combine(AppDataManager.KeysDirPath, "prod.keys")))
{
if (!(AppDataManager.Mode == AppDataManager.LaunchMode.UserProfile && File.Exists(Path.Combine(AppDataManager.KeysDirPathUser, "prod.keys"))))
{
Logger.Error?.Print(LogClass.Application, "Keys not found");
}
}
ReloadConfig();
_virtualFileSystem = VirtualFileSystem.CreateInstance();
_libHacHorizonManager = new LibHacHorizonManager();
@@ -177,7 +352,7 @@ namespace Ryujinx.Headless
_inputManager = new InputManager(new SDL2KeyboardDriver(), new SDL2GamepadDriver());
GraphicsConfig.EnableShaderCache = !option.DisableShaderCache;
GraphicsConfig.EnableShaderCache = true;
if (OperatingSystem.IsMacOS())
{
@@ -188,13 +363,15 @@ namespace Ryujinx.Headless
}
}
IGamepad gamepad;
if (option.ListInputIds)
{
Logger.Info?.Print(LogClass.Application, "Input Ids:");
foreach (string id in _inputManager.KeyboardDriver.GamepadsIds)
{
IGamepad gamepad = _inputManager.KeyboardDriver.GetGamepad(id);
gamepad = _inputManager.KeyboardDriver.GetGamepad(id);
Logger.Info?.Print(LogClass.Application, $"- {id} (\"{gamepad.Name}\")");
@@ -203,7 +380,7 @@ namespace Ryujinx.Headless
foreach (string id in _inputManager.GamepadDriver.GamepadsIds)
{
IGamepad gamepad = _inputManager.GamepadDriver.GetGamepad(id);
gamepad = _inputManager.GamepadDriver.GetGamepad(id);
Logger.Info?.Print(LogClass.Application, $"- {id} (\"{gamepad.Name}\")");
@@ -220,7 +397,7 @@ namespace Ryujinx.Headless
return;
}
_inputConfiguration ??= [];
_inputConfiguration = new List<InputConfig>();
_enableKeyboard = option.EnableKeyboard;
_enableMouse = option.EnableMouse;
@@ -244,7 +421,6 @@ namespace Ryujinx.Headless
LoadPlayerConfiguration(option.InputProfile8Name, option.InputId8, PlayerIndex.Player8);
LoadPlayerConfiguration(option.InputProfileHandheldName, option.InputIdHandheld, PlayerIndex.Handheld);
if (_inputConfiguration.Count == 0)
{
return;
@@ -255,7 +431,7 @@ namespace Ryujinx.Headless
Logger.SetEnable(LogLevel.Stub, !option.LoggingDisableStub);
Logger.SetEnable(LogLevel.Info, !option.LoggingDisableInfo);
Logger.SetEnable(LogLevel.Warning, !option.LoggingDisableWarning);
Logger.SetEnable(LogLevel.Error, !option.LoggingDisableError);
Logger.SetEnable(LogLevel.Error, option.LoggingEnableError);
Logger.SetEnable(LogLevel.Trace, option.LoggingEnableTrace);
Logger.SetEnable(LogLevel.Guest, !option.LoggingDisableGuest);
Logger.SetEnable(LogLevel.AccessLog, option.LoggingEnableFsAccessLog);
@@ -339,6 +515,83 @@ namespace Ryujinx.Headless
: new OpenGLWindow(_inputManager, options.LoggingGraphicsDebugLevel, options.AspectRatio, options.EnableMouse, options.HideCursorMode, options.IgnoreControllerApplet);
}
private static IRenderer CreateRenderer(Options options, WindowBase window)
{
if (options.GraphicsBackend == GraphicsBackend.Vulkan && window is VulkanWindow vulkanWindow)
{
string preferredGpuId = string.Empty;
Vk api = Vk.GetApi();
if (!string.IsNullOrEmpty(options.PreferredGPUVendor))
{
string preferredGpuVendor = options.PreferredGPUVendor.ToLowerInvariant();
var devices = VulkanRenderer.GetPhysicalDevices(api);
foreach (var device in devices)
{
if (device.Vendor.ToLowerInvariant() == preferredGpuVendor)
{
preferredGpuId = device.Id;
break;
}
}
}
return new VulkanRenderer(
api,
(instance, vk) => new SurfaceKHR((ulong)(vulkanWindow.CreateWindowSurface(instance.Handle))),
vulkanWindow.GetRequiredInstanceExtensions,
preferredGpuId);
}
return new OpenGLRenderer();
}
private static Switch InitializeEmulationContext(WindowBase window, IRenderer renderer, Options options)
{
BackendThreading threadingMode = options.BackendThreading;
bool threadedGAL = threadingMode == BackendThreading.On || (threadingMode == BackendThreading.Auto && renderer.PreferThreading);
if (threadedGAL)
{
renderer = new ThreadedRenderer(renderer);
}
HLEConfiguration configuration = new(_virtualFileSystem,
_libHacHorizonManager,
_contentManager,
_accountManager,
_userChannelPersistence,
renderer,
new SDL2HardwareDeviceDriver(),
options.DramSize,
window,
options.SystemLanguage,
options.SystemRegion,
options.VSyncMode,
!options.DisableDockedMode,
!options.DisablePTC,
options.EnableInternetAccess,
!options.DisableFsIntegrityChecks ? IntegrityCheckLevel.ErrorOnInvalid : IntegrityCheckLevel.None,
options.FsGlobalAccessLogMode,
options.SystemTimeOffset,
options.SystemTimeZone,
options.MemoryManagerMode,
options.IgnoreMissingServices,
options.AspectRatio,
options.AudioVolume,
options.UseHypervisor ?? true,
options.MultiplayerLanInterfaceId,
Common.Configuration.Multiplayer.MultiplayerMode.Disabled,
false,
string.Empty,
string.Empty,
options.CustomVSyncInterval);
return new Switch(configuration);
}
private static void ExecutionEntrypoint()
{
if (OperatingSystem.IsWindows())

View File

@@ -0,0 +1,73 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>net8.0</TargetFramework>
<RuntimeIdentifiers>win-x64;osx-x64;linux-x64</RuntimeIdentifiers>
<OutputType>Exe</OutputType>
<AllowUnsafeBlocks>true</AllowUnsafeBlocks>
<Version>1.0.0-dirty</Version>
<DefineConstants Condition=" '$(ExtraDefineConstants)' != '' ">$(DefineConstants);$(ExtraDefineConstants)</DefineConstants>
<SigningCertificate Condition=" '$(SigningCertificate)' == '' ">-</SigningCertificate>
<TieredPGO>true</TieredPGO>
<DefaultItemExcludes>$(DefaultItemExcludes);._*</DefaultItemExcludes>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="OpenTK.Core" />
<PackageReference Include="Ryujinx.Graphics.Nvdec.Dependencies" />
</ItemGroup>
<Target Name="PostBuild" AfterTargets="PostBuildEvent" Condition="$([MSBuild]::IsOSPlatform('OSX'))">
<Exec Command="codesign --entitlements '$(ProjectDir)..\..\distribution\macos\entitlements.xml' -f -s $(SigningCertificate) '$(TargetDir)$(TargetName)'" />
</Target>
<ItemGroup>
<ProjectReference Include="..\Ryujinx.Graphics.Vulkan\Ryujinx.Graphics.Vulkan.csproj" />
<ProjectReference Include="..\Ryujinx.Input\Ryujinx.Input.csproj" />
<ProjectReference Include="..\Ryujinx.Input.SDL2\Ryujinx.Input.SDL2.csproj" />
<ProjectReference Include="..\Ryujinx.Audio.Backends.SDL2\Ryujinx.Audio.Backends.SDL2.csproj" />
<ProjectReference Include="..\Ryujinx.Common\Ryujinx.Common.csproj" />
<ProjectReference Include="..\Ryujinx.HLE\Ryujinx.HLE.csproj" />
<ProjectReference Include="..\ARMeilleure\ARMeilleure.csproj" />
<ProjectReference Include="..\Ryujinx.Graphics.OpenGL\Ryujinx.Graphics.OpenGL.csproj" />
<ProjectReference Include="..\Ryujinx.Graphics.Gpu\Ryujinx.Graphics.Gpu.csproj" />
</ItemGroup>
<ItemGroup>
<PackageReference Include="CommandLineParser" />
<PackageReference Include="Ryujinx.Graphics.Vulkan.Dependencies.MoltenVK" Condition="'$(RuntimeIdentifier)' != 'linux-x64' AND '$(RuntimeIdentifier)' != 'linux-arm64' AND '$(RuntimeIdentifier)' != 'win-x64'" />
</ItemGroup>
<ItemGroup>
<Content Include="..\..\distribution\legal\THIRDPARTY.md">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
<TargetPath>THIRDPARTY.md</TargetPath>
</Content>
<Content Include="..\..\LICENSE.txt">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
<TargetPath>LICENSE.txt</TargetPath>
</Content>
</ItemGroup>
<ItemGroup Condition="'$(RuntimeIdentifier)' == 'linux-x64' OR '$(RuntimeIdentifier)' == 'linux-arm64' OR ('$(RuntimeIdentifier)' == '' AND $([MSBuild]::IsOSPlatform('Linux')))">
<Content Include="..\..\distribution\linux\Ryujinx.sh">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</Content>
</ItemGroup>
<ItemGroup>
<EmbeddedResource Include="Ryujinx.bmp" />
</ItemGroup>
<!-- Due to .net core 3.1 embedded resource loading -->
<PropertyGroup>
<EmbeddedResourceUseDependentUponConvention>false</EmbeddedResourceUseDependentUponConvention>
<ApplicationIcon>..\Ryujinx\Ryujinx.ico</ApplicationIcon>
</PropertyGroup>
<PropertyGroup Condition="'$(RuntimeIdentifier)' != ''">
<PublishSingleFile>true</PublishSingleFile>
<PublishTrimmed>true</PublishTrimmed>
<TrimMode>partial</TrimMode>
</PropertyGroup>
</Project>

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.1 KiB

View File

@@ -1,6 +1,6 @@
using System;
namespace Ryujinx.Headless
namespace Ryujinx.Headless.SDL2
{
class StatusUpdatedEventArgs(
string vSyncMode,

View File

@@ -6,7 +6,7 @@ using System;
using System.Runtime.InteropServices;
using static SDL2.SDL;
namespace Ryujinx.Headless
namespace Ryujinx.Headless.SDL2.Vulkan
{
class VulkanWindow : WindowBase
{

View File

@@ -1,6 +1,5 @@
using Humanizer;
using LibHac.Tools.Fs;
using Ryujinx.Ava;
using Ryujinx.Common.Configuration;
using Ryujinx.Common.Configuration.Hid;
using Ryujinx.Common.Logging;
@@ -27,7 +26,7 @@ using AntiAliasing = Ryujinx.Common.Configuration.AntiAliasing;
using ScalingFilter = Ryujinx.Common.Configuration.ScalingFilter;
using Switch = Ryujinx.HLE.Switch;
namespace Ryujinx.Headless
namespace Ryujinx.Headless.SDL2
{
abstract partial class WindowBase : IHostUIHandler, IDisposable
{
@@ -137,7 +136,7 @@ namespace Ryujinx.Headless
private void SetWindowIcon()
{
Stream iconStream = typeof(Program).Assembly.GetManifestResourceStream("HeadlessLogo");
Stream iconStream = typeof(WindowBase).Assembly.GetManifestResourceStream("Ryujinx.Headless.SDL2.Ryujinx.bmp");
byte[] iconBytes = new byte[iconStream!.Length];
if (iconStream.Read(iconBytes, 0, iconBytes.Length) != iconBytes.Length)
@@ -319,7 +318,7 @@ namespace Ryujinx.Headless
Device.VSyncMode.ToString(),
dockedMode,
Device.Configuration.AspectRatio.ToText(),
$"{Device.Statistics.GetGameFrameRate():00.00} FPS ({Device.Statistics.GetGameFrameTime():00.00} ms)",
$"Game: {Device.Statistics.GetGameFrameRate():00.00} FPS ({Device.Statistics.GetGameFrameTime():00.00} ms)",
$"FIFO: {Device.Statistics.GetFifoPercent():0.00} %",
$"GPU: {_gpuDriverName}"));

View File

@@ -1,5 +1,4 @@
using Ryujinx.Common.Utilities;
using Ryujinx.HLE.HOS.SystemState;
using System.Text.Json.Serialization;
namespace Ryujinx.UI.Common.Configuration.System

View File

@@ -132,7 +132,7 @@ namespace Ryujinx.UI.Common.Helper
if (uninstall)
{
// If the types don't already exist, there's nothing to do, and we can call this operation successful.
// If the types don't already exist, there's nothing to do and we can call this operation successful.
if (!AreMimeTypesRegisteredWindows())
{
return true;

Binary file not shown.

Before

Width:  |  Height:  |  Size: 93 KiB

After

Width:  |  Height:  |  Size: 253 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 609 KiB

View File

@@ -34,6 +34,7 @@
<EmbeddedResource Include="Resources\Icon_XCI.png" />
<EmbeddedResource Include="Resources\Logo_Amiibo.png" />
<EmbeddedResource Include="Resources\Logo_Ryujinx.png" />
<EmbeddedResource Include="Resources\Logo_Thiccjinx.png" />
<EmbeddedResource Include="Resources\Logo_Discord_Dark.png" />
<EmbeddedResource Include="Resources\Logo_Discord_Light.png" />
<EmbeddedResource Include="Resources\Logo_GitHub_Dark.png" />

View File

@@ -44,6 +44,12 @@
"MenuBarViewWindow1080": "1080p",
"MenuBarHelp": "_مساعدة",
"MenuBarHelpCheckForUpdates": "تحقق من التحديثات",
"MenuBarHelpFaq": "FAQ & Troubleshooting Page",
"MenuBarHelpFaqTooltip": "Opens the FAQ and Troubleshooting page on the official Ryujinx wiki",
"MenuBarHelpSetup": "Setup & Configuration Guide",
"MenuBarHelpSetupTooltip": "Opens the Setup & Configuration guide on the official Ryujinx wiki",
"MenuBarHelpMultiplayer": "Multiplayer (LDN/LAN) Guide",
"MenuBarHelpMultiplayerTooltip": "Opens the Multiplayer guide on the official Ryujinx wiki",
"MenuBarHelpAbout": "حول",
"MenuSearch": "بحث...",
"GameListHeaderFavorite": "مفضلة",

View File

@@ -44,6 +44,12 @@
"MenuBarViewWindow1080": "1080p",
"MenuBarHelp": "_Hilfe",
"MenuBarHelpCheckForUpdates": "Nach Updates suchen",
"MenuBarHelpFaq": "FAQ & Troubleshooting Page",
"MenuBarHelpFaqTooltip": "Opens the FAQ and Troubleshooting page on the official Ryujinx wiki",
"MenuBarHelpSetup": "Setup & Configuration Guide",
"MenuBarHelpSetupTooltip": "Opens the Setup & Configuration guide on the official Ryujinx wiki",
"MenuBarHelpMultiplayer": "Multiplayer (LDN/LAN) Guide",
"MenuBarHelpMultiplayerTooltip": "Opens the Multiplayer guide on the official Ryujinx wiki",
"MenuBarHelpAbout": "Über Ryujinx",
"MenuSearch": "Suchen...",
"GameListHeaderFavorite": "Favorit",

View File

@@ -44,6 +44,12 @@
"MenuBarViewWindow1080": "1080p",
"MenuBarHelp": "_Βοήθεια",
"MenuBarHelpCheckForUpdates": "Έλεγχος για Ενημερώσεις",
"MenuBarHelpFaq": "FAQ & Troubleshooting Page",
"MenuBarHelpFaqTooltip": "Opens the FAQ and Troubleshooting page on the official Ryujinx wiki",
"MenuBarHelpSetup": "Setup & Configuration Guide",
"MenuBarHelpSetupTooltip": "Opens the Setup & Configuration guide on the official Ryujinx wiki",
"MenuBarHelpMultiplayer": "Multiplayer (LDN/LAN) Guide",
"MenuBarHelpMultiplayerTooltip": "Opens the Multiplayer guide on the official Ryujinx wiki",
"MenuBarHelpAbout": "Σχετικά με",
"MenuSearch": "Αναζήτηση...",
"GameListHeaderFavorite": "Αγαπημένο",

View File

@@ -44,6 +44,12 @@
"MenuBarViewWindow1080": "1080p",
"MenuBarHelp": "_Help",
"MenuBarHelpCheckForUpdates": "Check for Updates",
"MenuBarHelpFaq": "FAQ & Troubleshooting Page",
"MenuBarHelpFaqTooltip": "Opens the FAQ and Troubleshooting page on the official Ryujinx wiki",
"MenuBarHelpSetup": "Setup & Configuration Guide",
"MenuBarHelpSetupTooltip": "Opens the Setup & Configuration guide on the official Ryujinx wiki",
"MenuBarHelpMultiplayer": "Multiplayer (LDN/LAN) Guide",
"MenuBarHelpMultiplayerTooltip": "Opens the Multiplayer guide on the official Ryujinx wiki",
"MenuBarHelpAbout": "About",
"MenuSearch": "Search...",
"GameListHeaderFavorite": "Fav",

View File

@@ -44,6 +44,12 @@
"MenuBarViewWindow1080": "1080p",
"MenuBarHelp": "_Ayuda",
"MenuBarHelpCheckForUpdates": "Buscar actualizaciones",
"MenuBarHelpFaq": "FAQ & Troubleshooting Page",
"MenuBarHelpFaqTooltip": "Opens the FAQ and Troubleshooting page on the official Ryujinx wiki",
"MenuBarHelpSetup": "Setup & Configuration Guide",
"MenuBarHelpSetupTooltip": "Opens the Setup & Configuration guide on the official Ryujinx wiki",
"MenuBarHelpMultiplayer": "Multiplayer (LDN/LAN) Guide",
"MenuBarHelpMultiplayerTooltip": "Opens the Multiplayer guide on the official Ryujinx wiki",
"MenuBarHelpAbout": "Acerca de",
"MenuSearch": "Buscar...",
"GameListHeaderFavorite": "Favoritos",

View File

@@ -44,6 +44,12 @@
"MenuBarViewWindow1080": "1080p",
"MenuBarHelp": "_Aide",
"MenuBarHelpCheckForUpdates": "Vérifier les mises à jour",
"MenuBarHelpFaq": "Page de FAQ et de dépannage",
"MenuBarHelpFaqTooltip": "Ouvre la page de FAQ et de dépannage sur le wiki officiel de Ryujinx",
"MenuBarHelpSetup": "Guide d'Installation et de Configuration",
"MenuBarHelpSetupTooltip": "Ouvre le guide d'installation et de configuration sur le wiki officiel de Ryujinx",
"MenuBarHelpMultiplayer": "Guide Multijoueur (LDN/LAN)",
"MenuBarHelpMultiplayerTooltip": "Ouvre le guide de Multijoueur sur le wiki officiel de Ryujinx",
"MenuBarHelpAbout": "À propos",
"MenuSearch": "Rechercher...",
"GameListHeaderFavorite": "Favoris",

View File

@@ -44,6 +44,12 @@
"MenuBarViewWindow1080": "1080p",
"MenuBarHelp": "_עזרה",
"MenuBarHelpCheckForUpdates": "חפש עדכונים",
"MenuBarHelpFaq": "FAQ & Troubleshooting Page",
"MenuBarHelpFaqTooltip": "Opens the FAQ and Troubleshooting page on the official Ryujinx wiki",
"MenuBarHelpSetup": "Setup & Configuration Guide",
"MenuBarHelpSetupTooltip": "Opens the Setup & Configuration guide on the official Ryujinx wiki",
"MenuBarHelpMultiplayer": "Multiplayer (LDN/LAN) Guide",
"MenuBarHelpMultiplayerTooltip": "Opens the Multiplayer guide on the official Ryujinx wiki",
"MenuBarHelpAbout": "אודות",
"MenuSearch": "חפש...",
"GameListHeaderFavorite": "אהוב",

View File

@@ -44,6 +44,12 @@
"MenuBarViewWindow1080": "1080p",
"MenuBarHelp": "_Aiuto",
"MenuBarHelpCheckForUpdates": "Controlla aggiornamenti",
"MenuBarHelpFaq": "FAQ & Troubleshooting Page",
"MenuBarHelpFaqTooltip": "Opens the FAQ and Troubleshooting page on the official Ryujinx wiki",
"MenuBarHelpSetup": "Setup & Configuration Guide",
"MenuBarHelpSetupTooltip": "Opens the Setup & Configuration guide on the official Ryujinx wiki",
"MenuBarHelpMultiplayer": "Multiplayer (LDN/LAN) Guide",
"MenuBarHelpMultiplayerTooltip": "Opens the Multiplayer guide on the official Ryujinx wiki",
"MenuBarHelpAbout": "Informazioni",
"MenuSearch": "Cerca...",
"GameListHeaderFavorite": "Preferito",

View File

@@ -44,6 +44,12 @@
"MenuBarViewWindow1080": "1080p",
"MenuBarHelp": "ヘルプ(_H)",
"MenuBarHelpCheckForUpdates": "アップデートを確認",
"MenuBarHelpFaq": "FAQ & Troubleshooting Page",
"MenuBarHelpFaqTooltip": "Opens the FAQ and Troubleshooting page on the official Ryujinx wiki",
"MenuBarHelpSetup": "Setup & Configuration Guide",
"MenuBarHelpSetupTooltip": "Opens the Setup & Configuration guide on the official Ryujinx wiki",
"MenuBarHelpMultiplayer": "Multiplayer (LDN/LAN) Guide",
"MenuBarHelpMultiplayerTooltip": "Opens the Multiplayer guide on the official Ryujinx wiki",
"MenuBarHelpAbout": "Ryujinx について",
"MenuSearch": "検索...",
"GameListHeaderFavorite": "お気に入り",

View File

@@ -44,6 +44,12 @@
"MenuBarViewWindow1080": "1080p",
"MenuBarHelp": "도움말(_H)",
"MenuBarHelpCheckForUpdates": "업데이트 확인",
"MenuBarHelpFaq": "FAQ & Troubleshooting Page",
"MenuBarHelpFaqTooltip": "Opens the FAQ and Troubleshooting page on the official Ryujinx wiki",
"MenuBarHelpSetup": "Setup & Configuration Guide",
"MenuBarHelpSetupTooltip": "Opens the Setup & Configuration guide on the official Ryujinx wiki",
"MenuBarHelpMultiplayer": "Multiplayer (LDN/LAN) Guide",
"MenuBarHelpMultiplayerTooltip": "Opens the Multiplayer guide on the official Ryujinx wiki",
"MenuBarHelpAbout": "정보",
"MenuSearch": "찾기...",
"GameListHeaderFavorite": "즐겨찾기",
@@ -555,9 +561,9 @@
"AboutGithubUrlTooltipMessage": "클릭하면 기본 브라우저에서 Ryujinx GitHub 페이지가 열립니다.",
"AboutDiscordUrlTooltipMessage": "클릭하면 기본 브라우저에서 Ryujinx 디스코드 서버 초대장이 열립니다.",
"AboutRyujinxAboutTitle": "정보 :",
"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.",
"AboutRyujinxAboutContent": "Ryujinx는 Nintendo Switch™용 에뮬레이터입니다.\n모든 최신 소식을 Discord에서 확인하세요.\n기여에 관심이 있는 개발자는 GitHub 또는 Discord에서 자세한 내용을 확인할 수 있습니다.",
"AboutRyujinxMaintainersTitle": "유지 관리 :",
"AboutRyujinxFormerMaintainersTitle": "Formerly Maintained By:",
"AboutRyujinxFormerMaintainersTitle": "이전 관리자 :",
"AboutRyujinxMaintainersContentTooltipMessage": "클릭하면 기본 브라우저에서 기여자 페이지가 열립니다.",
"AmiiboSeriesLabel": "Amiibo 시리즈",
"AmiiboCharacterLabel": "캐릭터",

View File

@@ -0,0 +1,791 @@
{
"Language": "Norsk",
"MenuBarFileOpenApplet": "Åpne Program",
"MenuBarFileOpenAppletOpenMiiAppletToolTip": "Åpne Mii Redigerings program i eget vindu",
"SettingsTabInputDirectMouseAccess": "Direkte tilgang med Mus",
"SettingsTabSystemMemoryManagerMode": "Memory Manager-modus",
"SettingsTabSystemMemoryManagerModeSoftware": "Programvare",
"SettingsTabSystemMemoryManagerModeHost": "Vert (rask)",
"SettingsTabSystemMemoryManagerModeHostUnchecked": "Vert Ukontrollert (raskets, utrygt)",
"SettingsTabSystemUseHypervisor": "Bruk Hypervisor",
"MenuBarFile": "_Fil",
"MenuBarFileOpenFromFile": "_Last inn program fra fil",
"MenuBarFileOpenFromFileError": "Ingen apper ble funnet i valgt fil.",
"MenuBarFileOpenUnpacked": "Last inn _Upakket spill",
"MenuBarFileOpenEmuFolder": "Åpne Ryujinx mappe",
"MenuBarFileOpenLogsFolder": "Åpne Logg mappen",
"MenuBarFileExit": "_Avslutt",
"MenuBarOptions": "_Alternativer",
"MenuBarOptionsToggleFullscreen": "Fullskjermsvisning av/på",
"MenuBarOptionsStartGamesInFullscreen": "Start spill i Fullskjermmodus",
"MenuBarOptionsStopEmulation": "Stopp Emulering",
"MenuBarOptionsSettings": "_Innstillinger",
"MenuBarOptionsManageUserProfiles": "_Administrere Brukerprofiler",
"MenuBarActions": "_Handlinger",
"MenuBarOptionsSimulateWakeUpMessage": "Simuler oppvåknings-melding",
"MenuBarActionsScanAmiibo": "Skann en Amiibo",
"MenuBarTools": "_Verktøy",
"MenuBarToolsInstallFirmware": "Installer fastvare",
"MenuBarFileToolsInstallFirmwareFromFile": "Installer en fastvare fra XCI eller ZIP",
"MenuBarFileToolsInstallFirmwareFromDirectory": "Installer en fastvare fra en mappe",
"MenuBarToolsManageFileTypes": "Behandle filtyper",
"MenuBarToolsInstallFileTypes": "Installer filtyper",
"MenuBarToolsUninstallFileTypes": "Avinstaller filtyper",
"MenuBarView": "_Vis",
"MenuBarViewWindow": "Vindu størrelse",
"MenuBarViewWindow720": "720p",
"MenuBarViewWindow1080": "1080p",
"MenuBarHelp": "_Hjelp",
"MenuBarHelpCheckForUpdates": "Se etter oppdateringer",
"MenuBarHelpFaq": "FAQ & Troubleshooting Page",
"MenuBarHelpFaqTooltip": "Opens the FAQ and Troubleshooting page on the official Ryujinx wiki",
"MenuBarHelpSetup": "Setup & Configuration Guide",
"MenuBarHelpSetupTooltip": "Opens the Setup & Configuration guide on the official Ryujinx wiki",
"MenuBarHelpMultiplayer": "Multiplayer (LDN/LAN) Guide",
"MenuBarHelpMultiplayerTooltip": "Opens the Multiplayer guide on the official Ryujinx wiki",
"MenuBarHelpAbout": "Om",
"MenuSearch": "Søk ...",
"GameListHeaderFavorite": "Fav",
"GameListHeaderIcon": "Ikon",
"GameListHeaderApplication": "Navn",
"GameListHeaderDeveloper": "Utvikler",
"GameListHeaderVersion": "Versjon",
"GameListHeaderTimePlayed": "Spilletid",
"GameListHeaderLastPlayed": "Sist Spilt",
"GameListHeaderFileExtension": "Fil Eks.",
"GameListHeaderFileSize": "Fil Størrelse",
"GameListHeaderPath": "Bane",
"GameListContextMenuOpenUserSaveDirectory": "Åpne bruker lagrings mappe",
"GameListContextMenuOpenUserSaveDirectoryToolTip": "Åpner mappen som inneholder programmets bruker lagring",
"GameListContextMenuOpenDeviceSaveDirectory": "Åpne lagringsmappe for enheten",
"GameListContextMenuOpenDeviceSaveDirectoryToolTip": "Åpner mappen som inneholder programmets lagringsenhet",
"GameListContextMenuOpenBcatSaveDirectory": "Åpne BCAT lagringsmappe",
"GameListContextMenuOpenBcatSaveDirectoryToolTip": "Åpner mappen som inneholder programmets BCAT-lagring",
"GameListContextMenuManageTitleUpdates": "Administrer titteloppdateringer",
"GameListContextMenuManageTitleUpdatesToolTip": "Åpner vinduet Tittel - Oppdateringskontroll",
"GameListContextMenuManageDlc": "Administrer DLC",
"GameListContextMenuManageDlcToolTip": "Åpner DLC håndteringsvinduet",
"GameListContextMenuCacheManagement": "Cache administrasjon",
"GameListContextMenuCacheManagementPurgePptc": "Start PPTC gjenoppbygging",
"GameListContextMenuCacheManagementPurgePptcToolTip": "Utløs PPTC for å gjenoppbygge ved oppstart av neste spill-start",
"GameListContextMenuCacheManagementPurgeShaderCache": "Tøm shader cache",
"GameListContextMenuCacheManagementPurgeShaderCacheToolTip": "Sletter applikasjonens shader cache",
"GameListContextMenuCacheManagementOpenPptcDirectory": "Åpne PPTC mappe",
"GameListContextMenuCacheManagementOpenPptcDirectoryToolTip": "Åpner mappen som inneholder programmets PPTC cache",
"GameListContextMenuCacheManagementOpenShaderCacheDirectory": "Åpne Shader Cache-mappen",
"GameListContextMenuCacheManagementOpenShaderCacheDirectoryToolTip": "Åpner mappen som inneholder Programmets shader cache",
"GameListContextMenuExtractData": "Hent ut data",
"GameListContextMenuExtractDataExeFS": "ExeFS",
"GameListContextMenuExtractDataExeFSToolTip": "Pakk ut ExeFS seksjonen fra Programmets gjeldende konfigurasjon (inkludert oppdateringer)",
"GameListContextMenuExtractDataRomFS": "RomFS",
"GameListContextMenuExtractDataRomFSToolTip": "Pakk ut RomFS seksjonen fra applikasjonens gjeldende konfigurasjon (inkludert oppdateringer)",
"GameListContextMenuExtractDataLogo": "Logo",
"GameListContextMenuExtractDataLogoToolTip": "Pakk ut Logo-seksjonen fra applikasjonens gjeldende konfigurasjon (inkludert oppdateringer)",
"GameListContextMenuCreateShortcut": "Lag programsnarvei",
"GameListContextMenuCreateShortcutToolTip": "Lag en snarvei på skrivebordet som starter den valgte Applikasjonen",
"GameListContextMenuCreateShortcutToolTipMacOS": "Lag snarvei i macOSs Program-mappen som starter det valgte programmet",
"GameListContextMenuOpenModsDirectory": "Åpne Modifikasjonsmappen",
"GameListContextMenuOpenModsDirectoryToolTip": "Åpner mappen som inneholder programmets modifikasjoner",
"GameListContextMenuOpenSdModsDirectory": "Åpne Atmosfære modifikasjons mappen",
"GameListContextMenuOpenSdModsDirectoryToolTip": "Åpner den alternative SD-kortets Atmosfære-mappe som inneholder programmoduser. Nyttig for modifikasjoner som er pakket for ekte maskinvare.",
"StatusBarGamesLoaded": "{0}/{1} Spill Lastet",
"StatusBarSystemVersion": "System versjon: {0}",
"LinuxVmMaxMapCountDialogTitle": "Lav grense for minnetildelinger oppdaget",
"LinuxVmMaxMapCountDialogTextPrimary": "Ønsker du å øke verdien av vm.max_map_count til {0}",
"LinuxVmMaxMapCountDialogTextSecondary": "Noen spill kan prøve å lage flere minnekartlegging enn det som er tillatt. Ryujinx vil krasjes så snart denne grensen overskrides.",
"LinuxVmMaxMapCountDialogButtonUntilRestart": "Ja, frem til neste omstart",
"LinuxVmMaxMapCountDialogButtonPersistent": "Ja, permanent",
"LinuxVmMaxMapCountWarningTextPrimary": "Den maksimale mengden Minnetilordninger er lavere enn anbefalt.",
"LinuxVmMaxMapCountWarningTextSecondary": "Gjeldende verdi av vm.max_map_count ({0}) er lavere enn {1}. Noen spill kan prøve å lage flere minnedelinger enn det som er tillatt. Ryujinx vil kræsje så snart denne grensen overskrides.\n\nDet kan hende du ønsker å enten øke grensen eller installere pkexec manuelt, slik at Ryujinx kan hjelpe til med det.",
"Settings": "Innstillinger",
"SettingsTabGeneral": "Brukergrensesnitt",
"SettingsTabGeneralGeneral": "Generelt",
"SettingsTabGeneralEnableDiscordRichPresence": "Aktiver Discord Rik Tilstedeværelse",
"SettingsTabGeneralCheckUpdatesOnLaunch": "Se etter oppdateringer ved oppstart",
"SettingsTabGeneralShowConfirmExitDialog": "Vis \"Bekreft Avslutt\" vinduet",
"SettingsTabGeneralRememberWindowState": "Husk vinduets størrelse/posisjon",
"SettingsTabGeneralHideCursor": "Skjul musepeker:",
"SettingsTabGeneralHideCursorNever": "Aldri",
"SettingsTabGeneralHideCursorOnIdle": "Når inaktiv",
"SettingsTabGeneralHideCursorAlways": "Alltid",
"SettingsTabGeneralGameDirectories": "Spillmapper",
"SettingsTabGeneralAdd": "Legg til",
"SettingsTabGeneralRemove": "Fjern",
"SettingsTabSystem": "System",
"SettingsTabSystemCore": "Kjerne",
"SettingsTabSystemSystemRegion": "System region:",
"SettingsTabSystemSystemRegionJapan": "Japan",
"SettingsTabSystemSystemRegionUSA": "USA",
"SettingsTabSystemSystemRegionEurope": "Europa",
"SettingsTabSystemSystemRegionAustralia": "Australia",
"SettingsTabSystemSystemRegionChina": "Kina",
"SettingsTabSystemSystemRegionKorea": "Korea",
"SettingsTabSystemSystemRegionTaiwan": "Taiwan",
"SettingsTabSystemSystemLanguage": "Systemspråk",
"SettingsTabSystemSystemLanguageJapanese": "Japansk",
"SettingsTabSystemSystemLanguageAmericanEnglish": "Amerikansk engelsk",
"SettingsTabSystemSystemLanguageFrench": "Fransk",
"SettingsTabSystemSystemLanguageGerman": "Tysk",
"SettingsTabSystemSystemLanguageItalian": "Italiensk",
"SettingsTabSystemSystemLanguageSpanish": "Spansk",
"SettingsTabSystemSystemLanguageChinese": "Kinesisk",
"SettingsTabSystemSystemLanguageKorean": "Koreansk",
"SettingsTabSystemSystemLanguageDutch": "Nederlandsk",
"SettingsTabSystemSystemLanguagePortuguese": "Portugisisk",
"SettingsTabSystemSystemLanguageRussian": "Russisk",
"SettingsTabSystemSystemLanguageTaiwanese": "Taiwansk",
"SettingsTabSystemSystemLanguageBritishEnglish": "Britisk engelsk",
"SettingsTabSystemSystemLanguageCanadianFrench": "Canadisk Fransk",
"SettingsTabSystemSystemLanguageLatinAmericanSpanish": "Latinamerikansk spansk",
"SettingsTabSystemSystemLanguageSimplifiedChinese": "Forenklet kinesisk",
"SettingsTabSystemSystemLanguageTraditionalChinese": "Tradisjonell Kinesisk",
"SettingsTabSystemSystemTimeZone": "System Tidssone:",
"SettingsTabSystemSystemTime": "System tid:",
"SettingsTabSystemEnableVsync": "VSynk",
"SettingsTabSystemEnablePptc": "PPTC (Profilert Vedvarende Oversettelseshurtigbuffer)",
"SettingsTabSystemEnableFsIntegrityChecks": "FS Integritetssjekk",
"SettingsTabSystemAudioBackend": "Lyd Backend:",
"SettingsTabSystemAudioBackendDummy": "Dummy",
"SettingsTabSystemAudioBackendOpenAL": "OpenAL",
"SettingsTabSystemAudioBackendSoundIO": "Lyd Inn/Ut",
"SettingsTabSystemAudioBackendSDL2": "SDL2",
"SettingsTabSystemHacks": "Hacks",
"SettingsTabSystemHacksNote": "Kan forårsake ustabilitet",
"SettingsTabSystemExpandDramSize": "Utvid DRAM til 8GiB",
"SettingsTabSystemIgnoreMissingServices": "Ignorer manglende tjenester",
"SettingsTabGraphics": "Grafikk",
"SettingsTabGraphicsAPI": "Grafikk API",
"SettingsTabGraphicsEnableShaderCache": "Aktiver Shader Cachen",
"SettingsTabGraphicsAnisotropicFiltering": "Anisotropisk filtrering:",
"SettingsTabGraphicsAnisotropicFilteringAuto": "Automatisk",
"SettingsTabGraphicsAnisotropicFiltering2x": "2x",
"SettingsTabGraphicsAnisotropicFiltering4x": "4x",
"SettingsTabGraphicsAnisotropicFiltering8x": "8x",
"SettingsTabGraphicsAnisotropicFiltering16x": "16x",
"SettingsTabGraphicsResolutionScale": "Oppløsnings skala:",
"SettingsTabGraphicsResolutionScaleCustom": "Egendefinert (anbefales ikke)",
"SettingsTabGraphicsResolutionScaleNative": "Naturlig (720p/1080p)",
"SettingsTabGraphicsResolutionScale2x": "2 x (1440p/2160p)",
"SettingsTabGraphicsResolutionScale3x": "3x (2160p/3240p)",
"SettingsTabGraphicsResolutionScale4x": "4x (2880p/4320p) (anbefales ikke)",
"SettingsTabGraphicsAspectRatio": "Bildeformat",
"SettingsTabGraphicsAspectRatio4x3": "4:3",
"SettingsTabGraphicsAspectRatio16x9": "16:9",
"SettingsTabGraphicsAspectRatio16x10": "16:10",
"SettingsTabGraphicsAspectRatio21x9": "21:9",
"SettingsTabGraphicsAspectRatio32x9": "32:9",
"SettingsTabGraphicsAspectRatioStretch": "Strekk for og Tilpasse vindu",
"SettingsTabGraphicsDeveloperOptions": "Utvikleralternativer",
"SettingsTabGraphicsShaderDumpPath": "Grafikk Shader Dump bane:",
"SettingsTabLogging": "Logging",
"SettingsTabLoggingLogging": "Logging",
"SettingsTabLoggingEnableLoggingToFile": "Aktiver logging til fil",
"SettingsTabLoggingEnableStubLogs": "Aktiver Stub-logger",
"SettingsTabLoggingEnableInfoLogs": "Aktiver informasjonslogger",
"SettingsTabLoggingEnableWarningLogs": "Aktiver varsellogger",
"SettingsTabLoggingEnableErrorLogs": "Aktiver feillogger",
"SettingsTabLoggingEnableTraceLogs": "Aktiver spor logger",
"SettingsTabLoggingEnableGuestLogs": "Aktiver gjestelogger",
"SettingsTabLoggingEnableFsAccessLogs": "Aktiver Fs tilgangslogger",
"SettingsTabLoggingFsGlobalAccessLogMode": "Fs Global Access-logg-modus:",
"SettingsTabLoggingDeveloperOptions": "Utvikleralternativer",
"SettingsTabLoggingDeveloperOptionsNote": "Advarsel: Vil redusere ytelsen",
"SettingsTabLoggingGraphicsBackendLogLevel": "Grafikk Backend-loggnivå:",
"SettingsTabLoggingGraphicsBackendLogLevelNone": "Ingen",
"SettingsTabLoggingGraphicsBackendLogLevelError": "Feil",
"SettingsTabLoggingGraphicsBackendLogLevelPerformance": "Tregere",
"SettingsTabLoggingGraphicsBackendLogLevelAll": "Alle",
"SettingsTabLoggingEnableDebugLogs": "Aktiver feilsøkingslogger",
"SettingsTabInput": "Inndata",
"SettingsTabInputEnableDockedMode": "Forankret modus",
"SettingsTabInputDirectKeyboardAccess": "Direkte tastaturtilgang",
"SettingsButtonSave": "Lagre",
"SettingsButtonClose": "Lukk",
"SettingsButtonOk": "OK",
"SettingsButtonCancel": "Avbryt",
"SettingsButtonApply": "Bruk",
"ControllerSettingsPlayer": "Spiller",
"ControllerSettingsPlayer1": "Spiller 1",
"ControllerSettingsPlayer2": "Spiller 2",
"ControllerSettingsPlayer3": "Spiller 3",
"ControllerSettingsPlayer4": "Spiller 4",
"ControllerSettingsPlayer5": "Spiller 5",
"ControllerSettingsPlayer6": "Spiller 6",
"ControllerSettingsPlayer7": "Spiller 7",
"ControllerSettingsPlayer8": "Spiller 8",
"ControllerSettingsHandheld": "Håndholdt",
"ControllerSettingsInputDevice": "Inndataenhet",
"ControllerSettingsRefresh": "Oppdater",
"ControllerSettingsDeviceDisabled": "Deaktivert",
"ControllerSettingsControllerType": "Kontrollertype",
"ControllerSettingsControllerTypeHandheld": "Håndholdt",
"ControllerSettingsControllerTypeProController": "Pro Controller",
"ControllerSettingsControllerTypeJoyConPair": "JoyCon Par",
"ControllerSettingsControllerTypeJoyConLeft": "JoyCon venstre",
"ControllerSettingsControllerTypeJoyConRight": "JoyCon høyre",
"ControllerSettingsProfile": "Profil",
"ControllerSettingsProfileDefault": "Standard",
"ControllerSettingsLoad": "Last",
"ControllerSettingsAdd": "Legg til",
"ControllerSettingsRemove": "Fjern",
"ControllerSettingsButtons": "Knapper",
"ControllerSettingsButtonA": "A",
"ControllerSettingsButtonB": "B",
"ControllerSettingsButtonX": "X",
"ControllerSettingsButtonY": "Y",
"ControllerSettingsButtonPlus": "+",
"ControllerSettingsButtonMinus": "-",
"ControllerSettingsDPad": "Retningsfelt",
"ControllerSettingsDPadUp": "Opp",
"ControllerSettingsDPadDown": "Ned",
"ControllerSettingsDPadLeft": "Venstre",
"ControllerSettingsDPadRight": "Høyre",
"ControllerSettingsStickButton": "Knapp",
"ControllerSettingsStickUp": "Opp",
"ControllerSettingsStickDown": "Ned",
"ControllerSettingsStickLeft": "Venstre",
"ControllerSettingsStickRight": "Høyre",
"ControllerSettingsStickStick": "Styrespak",
"ControllerSettingsStickInvertXAxis": "Inverter Styrespak X",
"ControllerSettingsStickInvertYAxis": "Inverter Styrespak Y",
"ControllerSettingsStickDeadzone": "Død sone:",
"ControllerSettingsLStick": "Venstre styrespak",
"ControllerSettingsRStick": "Høyre styrespak",
"ControllerSettingsTriggersLeft": "Utløsere venstre",
"ControllerSettingsTriggersRight": "Utløsere høyre",
"ControllerSettingsTriggersButtonsLeft": "Utløserknapper Venstre",
"ControllerSettingsTriggersButtonsRight": "Utløserknapper høyre",
"ControllerSettingsTriggers": "Utløsere",
"ControllerSettingsTriggerL": "L",
"ControllerSettingsTriggerR": "R",
"ControllerSettingsTriggerZL": "ZL",
"ControllerSettingsTriggerZR": "ZR",
"ControllerSettingsLeftSL": "SL",
"ControllerSettingsLeftSR": "SR",
"ControllerSettingsRightSL": "SL",
"ControllerSettingsRightSR": "SR",
"ControllerSettingsExtraButtonsLeft": "Knapper til venstre",
"ControllerSettingsExtraButtonsRight": "Knapper til høyre",
"ControllerSettingsMisc": "Diverse",
"ControllerSettingsTriggerThreshold": "Utløser terskel:",
"ControllerSettingsMotion": "Bevegelse",
"ControllerSettingsMotionUseCemuhookCompatibleMotion": "Bruk CemuHook kompatibel bevegelse",
"ControllerSettingsMotionControllerSlot": "Kontrollertype:",
"ControllerSettingsMotionMirrorInput": "Speilvend",
"ControllerSettingsMotionRightJoyConSlot": "Høyre JoyCon set:",
"ControllerSettingsMotionServerHost": "Server Vert:",
"ControllerSettingsMotionGyroSensitivity": "Gyro følsomhet:",
"ControllerSettingsMotionGyroDeadzone": "Gyro Dødsone:",
"ControllerSettingsSave": "Lagre",
"ControllerSettingsClose": "Lukk",
"KeyUnknown": "Ukjent",
"KeyShiftLeft": "Skift venstre",
"KeyShiftRight": "Skift høyre",
"KeyControlLeft": "Ctrl venstre",
"KeyMacControlLeft": "⌃ Venstre",
"KeyControlRight": "Ctrl høyre",
"KeyMacControlRight": "⌃ Høyre",
"KeyAltLeft": "Alt Venstre",
"KeyMacAltLeft": "⌥ Venstre",
"KeyAltRight": "Alt høyre",
"KeyMacAltRight": "⌥ Høyre",
"KeyWinLeft": "⊞ Venstre",
"KeyMacWinLeft": "⌘ Venstre",
"KeyWinRight": "⊞ Høyre",
"KeyMacWinRight": "⌘ Høyre",
"KeyMenu": "Meny",
"KeyUp": "Opp",
"KeyDown": "Ned",
"KeyLeft": "Venstre",
"KeyRight": "Høyre",
"KeyEnter": "Enter",
"KeyEscape": "Esc-tast",
"KeySpace": "Mellomrom",
"KeyTab": "Tab",
"KeyBackSpace": "Tilbaketast",
"KeyInsert": "Sett inn",
"KeyDelete": "Slett",
"KeyPageUp": "Side opp",
"KeyPageDown": "Side ned",
"KeyHome": "Hjem",
"KeyEnd": "Avslutt",
"KeyCapsLock": "Skiftelås",
"KeyScrollLock": "Rullelås",
"KeyPrintScreen": "Skjermbilde",
"KeyPause": "Stans midlertidig",
"KeyNumLock": "Numerisk Lås",
"KeyClear": "Tøm",
"KeyKeypad0": "Numerisk 0",
"KeyKeypad1": "Numerisk 1",
"KeyKeypad2": "Numerisk 2",
"KeyKeypad3": "Numerisk 3",
"KeyKeypad4": "Numerisk 4",
"KeyKeypad5": "Numerisk 5",
"KeyKeypad6": "Numerisk 6",
"KeyKeypad7": "Numerisk 7",
"KeyKeypad8": "Numerisk 8",
"KeyKeypad9": "Numerisk 9",
"KeyKeypadDivide": "Numerisk Dele",
"KeyKeypadMultiply": "Numerisk Multiplisere",
"KeyKeypadSubtract": "Numerisk Subtrakt",
"KeyKeypadAdd": "Numerisk Legg til",
"KeyKeypadDecimal": "Numerisk Desimal",
"KeyKeypadEnter": "Numerisk Enter",
"KeyNumber0": "0",
"KeyNumber1": "1",
"KeyNumber2": "2",
"KeyNumber3": "3",
"KeyNumber4": "4",
"KeyNumber5": "5",
"KeyNumber6": "6",
"KeyNumber7": "7",
"KeyNumber8": "8",
"KeyNumber9": "9",
"KeyTilde": "~",
"KeyGrave": "`",
"KeyMinus": "-",
"KeyPlus": "+",
"KeyBracketLeft": "[",
"KeyBracketRight": "]",
"KeySemicolon": ";",
"KeyQuote": "\"",
"KeyComma": ",",
"KeyPeriod": ".",
"KeySlash": "/",
"KeyBackSlash": "\\",
"KeyUnbound": "Ikke bundet",
"GamepadLeftStick": "Venstre Styrespak Trykk",
"GamepadRightStick": "R Styrespak Trykk",
"GamepadLeftShoulder": "Venstre Skulder",
"GamepadRightShoulder": "Høyre Skulder",
"GamepadLeftTrigger": "Venstre utløser",
"GamepadRightTrigger": "Høyre utløser",
"GamepadDpadUp": "Opp",
"GamepadDpadDown": "Ned",
"GamepadDpadLeft": "Venstre",
"GamepadDpadRight": "Høyre",
"GamepadMinus": "-",
"GamepadPlus": "+",
"GamepadGuide": "Veiledning",
"GamepadMisc1": "Diverse",
"GamepadPaddle1": "Paddle 1",
"GamepadPaddle2": "Paddle 2",
"GamepadPaddle3": "Paddle 3",
"GamepadPaddle4": "Paddle 4",
"GamepadTouchpad": "Berøringsplate",
"GamepadSingleLeftTrigger0": "Venstre utløser 0",
"GamepadSingleRightTrigger0": "Høyre utløser 0",
"GamepadSingleLeftTrigger1": "Venstre utløser 1",
"GamepadSingleRightTrigger1": "Høyre utløser 1",
"StickLeft": "Venstre styrespak",
"StickRight": "Høyre styrespak",
"UserProfilesSelectedUserProfile": "Valgt brukerprofil:",
"UserProfilesSaveProfileName": "Lagre profilnavnet",
"UserProfilesChangeProfileImage": "Endre profilbilde",
"UserProfilesAvailableUserProfiles": "Tilgjengelige brukerprofiler:",
"UserProfilesAddNewProfile": "Opprett Profil",
"UserProfilesDelete": "Slett",
"UserProfilesClose": "Lukk",
"ProfileNameSelectionWatermark": "Velg ett kallenavn",
"ProfileImageSelectionTitle": "Valg av profilbilde",
"ProfileImageSelectionHeader": "Velg et profilbilde",
"ProfileImageSelectionNote": "Du kan importere et tilpasset profilbilde, eller velge en avatar fra system fastvare",
"ProfileImageSelectionImportImage": "Importer bildefil",
"ProfileImageSelectionSelectAvatar": "Velg fastvare profilbilde",
"InputDialogTitle": "Input Dialog",
"InputDialogOk": "OK",
"InputDialogCancel": "Avbryt",
"InputDialogAddNewProfileTitle": "Velg profilnavnet",
"InputDialogAddNewProfileHeader": "Vennligst skriv inn et profilnavn",
"InputDialogAddNewProfileSubtext": "(Maks lengde: {0})",
"AvatarChoose": "Velg profilbilde",
"AvatarSetBackgroundColor": "Angi bakgrunnsfarge",
"AvatarClose": "Lukk",
"ControllerSettingsLoadProfileToolTip": "Last inn profil",
"ControllerSettingsAddProfileToolTip": "Legg til profil",
"ControllerSettingsRemoveProfileToolTip": "Fjern profil",
"ControllerSettingsSaveProfileToolTip": "Lagre Profil",
"MenuBarFileToolsTakeScreenshot": "Ta skjermbilde",
"MenuBarFileToolsHideUi": "Skjul brukergrensesnitt",
"GameListContextMenuRunApplication": "Kjør programmet",
"GameListContextMenuToggleFavorite": "Vis/Skjul favoritter",
"GameListContextMenuToggleFavoriteToolTip": "Vis/Skjul favorittstatus for spillet",
"SettingsTabGeneralTheme": "Tema:",
"SettingsTabGeneralThemeAuto": "Automatisk",
"SettingsTabGeneralThemeDark": "Mørk",
"SettingsTabGeneralThemeLight": "Lys",
"ControllerSettingsConfigureGeneral": "Konfigurer",
"ControllerSettingsRumble": "Vibrasjon",
"ControllerSettingsRumbleStrongMultiplier": "Sterk Vibrasjon multiplikator",
"ControllerSettingsRumbleWeakMultiplier": "Svak Vibrasjon multiplikator",
"DialogMessageSaveNotAvailableMessage": "Det er ingen lagrede data for {0} [{1:x16}]",
"DialogMessageSaveNotAvailableCreateSaveMessage": "Vil du lage lagrede data for dette spillet",
"DialogConfirmationTitle": "Ryujinx - Bekreftelse",
"DialogUpdaterTitle": "Ryujinx Oppdaterer",
"DialogErrorTitle": "Ryujinx - Feil",
"DialogWarningTitle": "Ryujinx - Advarsel",
"DialogExitTitle": "Ryujinx - Avslutt",
"DialogErrorMessage": "Ryujinx har støtt på ett problem",
"DialogExitMessage": "Er du sikker på at du ønsker å lukke Ryujinx?",
"DialogExitSubMessage": "Alle ulagrede data vil gå tapt!",
"DialogMessageCreateSaveErrorMessage": "Det oppstod en feil under oppretting av den angitte lagredata: {0}",
"DialogMessageFindSaveErrorMessage": "Det oppstod en feil under oppretting av den angitte lagredata: {0}",
"FolderDialogExtractTitle": "Velg mappen å pakke ut i",
"DialogNcaExtractionMessage": "Trekker ut {0} seksjonen fra {1}...",
"DialogNcaExtractionTitle": "Ryujinx - NCA Seksjon Ekstraktor",
"DialogNcaExtractionMainNcaNotFoundErrorMessage": "Uttrekksfeil. Hoveddelen av NCA var ikke tilstede i valgt fil.",
"DialogNcaExtractionCheckLogErrorMessage": "Uttrekkingsfeil. Les loggfilen for mer informasjon.",
"DialogNcaExtractionSuccessMessage": "Utvinningen er fullført.",
"DialogUpdaterConvertFailedMessage": "Kunne ikke konvertere gjeldende Ryujinx-versjon.",
"DialogUpdaterCancelUpdateMessage": "Avbryter oppdatering!",
"DialogUpdaterAlreadyOnLatestVersionMessage": "Du bruker allerede den nyeste versjonen av Ryujinx!",
"DialogUpdaterFailedToGetVersionMessage": "En feil oppstod ved forsøk på å få utgivelsesinformasjon fra GitHub Utgivelse. Dette kan forårsakes hvis en ny utgave blir samlet av GitHub Handlinger. Prøv igjen om noen minutter.",
"DialogUpdaterConvertFailedGithubMessage": "Kan ikke konvertere mottatt Ryujinx-versjon fra Github Utgivelse.",
"DialogUpdaterDownloadingMessage": "Laster ned oppdatering...",
"DialogUpdaterExtractionMessage": "Pakker ut oppdatering...",
"DialogUpdaterRenamingMessage": "Endrer navn på oppdatering...",
"DialogUpdaterAddingFilesMessage": "Legger til ny oppdatering...",
"DialogUpdaterCompleteMessage": "Oppdateringen er fullført!",
"DialogUpdaterRestartMessage": "Vil du starte Ryujinx på nytt nå?",
"DialogUpdaterNoInternetMessage": "Du er ikke tilkoblet internett",
"DialogUpdaterNoInternetSubMessage": "Kontroller at du har en fungerende Internett-tilkobling!",
"DialogUpdaterDirtyBuildMessage": "Du kan ikke oppdatere en skitten versjon av Ryujinx!",
"DialogUpdaterDirtyBuildSubMessage": "Vennligst last ned Ryujinx på https://ryujinx.org/ hvis du ser etter en støttet versjon.",
"DialogRestartRequiredMessage": "Omstart Kreves",
"DialogThemeRestartMessage": "Temaet har blitt lagret. En omstart kreves for å bruke temaet.",
"DialogThemeRestartSubMessage": "Vil du starte på nytt",
"DialogFirmwareInstallEmbeddedMessage": "Ønsker du å installere fastvaren innebygd i dette spillet? (Firmware {0})",
"DialogFirmwareInstallEmbeddedSuccessMessage": "Det ble ikke funnet noen installert fastvare, men Ryujinx kunne installere fastvare {0} fra det oppgitte spillet.\nemulatoren vil nå starte.",
"DialogFirmwareNoFirmwareInstalledMessage": "Ingen fastvare installert",
"DialogFirmwareInstalledMessage": "fastvare {0} ble installert",
"DialogInstallFileTypesSuccessMessage": "Filtyper ble installert!",
"DialogInstallFileTypesErrorMessage": "Kunne ikke installere filtyper.",
"DialogUninstallFileTypesSuccessMessage": "Filtyper ble avinstallert!",
"DialogUninstallFileTypesErrorMessage": "Kunne ikke avinstallere filtyper.",
"DialogOpenSettingsWindowLabel": "Åpne innstillinger-vinduet",
"DialogControllerAppletTitle": "Kontroller Applet",
"DialogMessageDialogErrorExceptionMessage": "Feil ved visning av meldings-dialog: {0}",
"DialogSoftwareKeyboardErrorExceptionMessage": "Feil ved visning av programvaretastatur: {0}",
"DialogErrorAppletErrorExceptionMessage": "Feil ved visning av Feilmeldingsdialog: {0}",
"DialogUserErrorDialogMessage": "{0}: {1}",
"DialogUserErrorDialogInfoMessage": "\nFor mer informasjon om hvordan du fikser denne feilen, følg vår oppsettsveiledning.",
"DialogUserErrorDialogTitle": "Ryujinx Feilmelding ({0})",
"DialogAmiiboApiTitle": "Amiibo API",
"DialogAmiiboApiFailFetchMessage": "En feil oppstod under henting av informasjon fra API.",
"DialogAmiiboApiConnectErrorMessage": "Kan ikke koble til Amiibo API server. Tjenesten kan være nede, eller du må kanskje verifisere at din internettforbindelse er tilkoblet.",
"DialogProfileInvalidProfileErrorMessage": "Profil {0} er ikke kompatibel med den gjeldende inndata konfigurasjonen",
"DialogProfileDefaultProfileOverwriteErrorMessage": "Standard profil kan ikke overskrives",
"DialogProfileDeleteProfileTitle": "Sletter profil",
"DialogProfileDeleteProfileMessage": "Denne handlingen er irreversibel, er du sikker på at du vil fortsette?",
"DialogWarning": "Advarsel",
"DialogPPTCDeletionMessage": "Du er i ferd med å bygge en PPTC i køen ved neste oppstart av:\n\n{0}\n\nEr du sikker på at du vil fortsette?",
"DialogPPTCDeletionErrorMessage": "Feil under rensing av PPTC cache ved {0}: {1}",
"DialogShaderDeletionMessage": "Du er i ferd med å slette Shader cachen for :\n\n{0}\n\nEr du sikker på at du vil fortsette?",
"DialogShaderDeletionErrorMessage": "Feil under tømming av Shader cache ved {0}: {1}",
"DialogRyujinxErrorMessage": "Ryujinx har støtt på ett problem",
"DialogInvalidTitleIdErrorMessage": "UI-feil: Det valgte spillet har ikke en gyldig tittel-ID",
"DialogFirmwareInstallerFirmwareNotFoundErrorMessage": "En gyldig systemfastvare ble ikke funnet i {0}.",
"DialogFirmwareInstallerFirmwareInstallTitle": "Installer fastvare {0}",
"DialogFirmwareInstallerFirmwareInstallMessage": "Systemversjon {0} vil bli installert.",
"DialogFirmwareInstallerFirmwareInstallSubMessage": "\n\nDette erstatter den gjeldende systemversjonen {0}.",
"DialogFirmwareInstallerFirmwareInstallConfirmMessage": "Vil du fortsette?",
"DialogFirmwareInstallerFirmwareInstallWaitMessage": "Installerer fastvare...",
"DialogFirmwareInstallerFirmwareInstallSuccessMessage": "Systemversjon {0} ble installert.",
"DialogUserProfileDeletionWarningMessage": "Det vil ikke være noen profiler å åpnes hvis valgt profil blir slettet",
"DialogUserProfileDeletionConfirmMessage": "Vil du slette den valgte profilen",
"DialogUserProfileUnsavedChangesTitle": "Advarsel - Ulagrede endringer",
"DialogUserProfileUnsavedChangesMessage": "Du har gjort endringer i denne brukerprofilen som ikke er lagret.",
"DialogUserProfileUnsavedChangesSubMessage": "Vil du forkaste endringene dine?",
"DialogControllerSettingsModifiedConfirmMessage": "Innstillinger for gjeldende kontroller har blitt oppdatert.",
"DialogControllerSettingsModifiedConfirmSubMessage": "Vil du lagre?",
"DialogLoadFileErrorMessage": "{0}. Feilet fil: {1}",
"DialogModAlreadyExistsMessage": "Modifikasjon eksisterer allerede",
"DialogModInvalidMessage": "Den angitte mappen inneholder ikke en modifikasjon!",
"DialogModDeleteNoParentMessage": "Kunne ikke slette: Fant ikke overordnet mappe for mod \"{0}\"!",
"DialogDlcNoDlcErrorMessage": "Den angitte filen inneholder ikke en DLC for den valgte tittelen!",
"DialogPerformanceCheckLoggingEnabledMessage": "Du har sporing aktivert, noe som er designet til å bli brukt av utviklere.",
"DialogPerformanceCheckLoggingEnabledConfirmMessage": "For optimal ytelse er det anbefalt å deaktivere spor-logging. Ønsker du å deaktivere spor-logging nå?",
"DialogPerformanceCheckShaderDumpEnabledMessage": "Du har aktiv dumping av shader, som bare er laget for å brukes av utviklere.",
"DialogPerformanceCheckShaderDumpEnabledConfirmMessage": "For optimal ytelse er det anbefalt å deaktivere dumping. Ønsker du å deaktivere shader dumping nå?",
"DialogLoadAppGameAlreadyLoadedMessage": "Et spill er allerede lastet inn",
"DialogLoadAppGameAlreadyLoadedSubMessage": "Slutt å emulere eller lukk emulatoren før du starter et annet spill.",
"DialogUpdateAddUpdateErrorMessage": "Den angitte filen inneholder ikke en oppdatering for den valgte tittelen!",
"DialogSettingsBackendThreadingWarningTitle": "Advarsel - Backend Tråd",
"DialogSettingsBackendThreadingWarningMessage": "Ryujinx må startes på nytt etter at dette alternativet er endret slik at det tas i bruk helt. Avhengig av plattformen din, må du kanskje manuelt skru av driveren's egen flertråder når du bruker Ryujinx's.",
"DialogModManagerDeletionWarningMessage": "Du er i ferd med å slette modifikasjonen: {0}\n\ner du sikker på at du vil fortsette?",
"DialogModManagerDeletionAllWarningMessage": "Du er i ferd med å slette alle modifikasjonene for denne tittelen: {0}\n\ner du sikker på at du vil fortsette?",
"SettingsTabGraphicsFeaturesOptions": "Funksjoner",
"SettingsTabGraphicsBackendMultithreading": "Grafikk Backend Fleroppgavekjøring",
"CommonAuto": "Automatisk",
"CommonOff": "Av",
"CommonOn": "På",
"InputDialogYes": "Ja",
"InputDialogNo": "Nei",
"DialogProfileInvalidProfileNameErrorMessage": "Filnavnet inneholder ugyldige tegn. Prøv på nytt.",
"MenuBarOptionsPauseEmulation": "Stans midlertidig",
"MenuBarOptionsResumeEmulation": "Gjenoppta",
"AboutUrlTooltipMessage": "Klikk for å åpne Ryujinx nettsiden i din standardnettleser.",
"AboutDisclaimerMessage": "Ryujinx er ikke knyttet til NintendoTM,\neller noen av samarbeidspartnerne sine, på noen som helst måte.",
"AboutAmiiboDisclaimerMessage": "AmiiboAPI (www.amiiboapi.com) brukes sammen med\ni vår Amiibo-emulsjon.",
"AboutPatreonUrlTooltipMessage": "Klikk for å åpne Ryujinx Patreon-siden i din standardnettleser.",
"AboutGithubUrlTooltipMessage": "Klikk for å åpne Ryujinx GitHub siden i din standardnettleser.",
"AboutDiscordUrlTooltipMessage": "Klikk for å åpne en invitasjon til Ryujinx Discord-serveren i nettleseren din.",
"AboutTwitterUrlTooltipMessage": "Klikk for å åpne Ryujinx Twitter-siden i din standardnettleser.",
"AboutRyujinxAboutTitle": "Om:",
"AboutRyujinxAboutContent": "Ryujinx er en emulator for Nintendo SwitchTM.\nVennligst støtt oss på Patreon.\nFå alle de siste nyhetene på vår Twitter eller Discord.\nUtviklere som er interessert i å bidra kan finne ut mer på GitHub eller Discord.",
"AboutRyujinxMaintainersTitle": "Vedlikeholdt av:",
"AboutRyujinxMaintainersContentTooltipMessage": "Klikk for å åpne Bidragsyter-siden i standardleseren din.",
"AboutRyujinxSupprtersTitle": "Støttet på Patreon av:",
"AmiiboSeriesLabel": "Amibo Serie",
"AmiiboCharacterLabel": "Karakter",
"AmiiboScanButtonLabel": "Skanne det",
"AmiiboOptionsShowAllLabel": "Vis alle Amiibo",
"AmiiboOptionsUsRandomTagLabel": "Hack: Bruk tilfeldig tag-Uuid",
"DlcManagerTableHeadingEnabledLabel": "Aktivert",
"DlcManagerTableHeadingTitleIdLabel": "Tittel ID",
"DlcManagerTableHeadingContainerPathLabel": "Beholder bane",
"DlcManagerTableHeadingFullPathLabel": "Fullstendig bane",
"DlcManagerRemoveAllButton": "Fjern alle",
"DlcManagerEnableAllButton": "Aktiver alle",
"DlcManagerDisableAllButton": "Deaktiver alle",
"ModManagerDeleteAllButton": "Slett alt",
"MenuBarOptionsChangeLanguage": "Endre språk",
"MenuBarShowFileTypes": "Vis Filtyper",
"CommonSort": "Sorter",
"CommonShowNames": "Vis navn",
"CommonFavorite": "Favoritt",
"OrderAscending": "Stigende",
"OrderDescending": "Synkende",
"SettingsTabGraphicsFeatures": "Funksjoner & forbedringer",
"ErrorWindowTitle": "Feilvindu",
"ToggleDiscordTooltip": "Velg om Ryujinx skal vises på din \"spillende\" Discord aktivitet eller ikke",
"AddGameDirBoxTooltip": "Angi en spillmappe for å legge til i listen",
"AddGameDirTooltip": "Legg til en spillmappe i listen",
"RemoveGameDirTooltip": "Fjern valgt spillmappe",
"CustomThemeCheckTooltip": "Bruk et egendefinert Avalonia tema for GUI for å endre utseende til emulatormenyene",
"CustomThemePathTooltip": "Bane til egendefinert GUI-tema",
"CustomThemeBrowseTooltip": "Søk etter et egendefinert GUI-tema",
"DockModeToggleTooltip": "Forankret modus gjør at systemet oppføre seg som en forankret Nintendo Switch. Dette forbedrer grafikkkvaliteten i de fleste spill. Motsatt vil deaktivering av dette gjøre at systemet oppføre seg som en håndholdt Nintendo Switch, noe som reduserer grafikkkvaliteten.\n\nKonfigurer spiller 1 kontroller hvis du planlegger å bruke forankret modus; konfigurer håndholdte kontroller hvis du planlegger å bruke håndholdte modus.\n\nLa PÅ hvis du er usikker.",
"DirectKeyboardTooltip": "Direkte tastaturtilgang (HID) støtte. Gir deg spill-tilgang til tastaturet som en tekstinnlegg-enhet.\n\nfungerer kun med spill som lokalt støtter tastaturbruk på Ninteno SwitchTM maskinvare.\n\nLa være AV hvis du er usikker.",
"DirectMouseTooltip": "Direkte musepeker (HID) støtte. Gir deg spill-tilgang til musepeker.\n\nfungerer kun med spill som lokalt støtter musepekere på Ninteno SwitchTM maskinvare.\n\nNår aktivert, kan det hende touch funksjoner ikke fungerer\n\nLa være AV hvis du er usikker.",
"RegionTooltip": "Endre systemregion",
"LanguageTooltip": "Endre systemspråk",
"TimezoneTooltip": "Endre systemtidssone",
"TimeTooltip": "Endre systemtid",
"VSyncToggleTooltip": "Emuler konsollens loddrett synkronisering. på ett vis en bildefrekvens begrensning for de fleste spill; deaktivering kan få spill til å kjøre med høyere hastighet, eller til å laste skjermene tar lengre tid eller sitter fast.\n\nkan byttes inn i spillet med en hurtigtast for preferansen (F1 som standard). Vi anbefaler å gjøre dette hvis du planlegger å deaktivere dette.\n\nLa være PÅ hvis du er usikker.",
"PptcToggleTooltip": "Lagrer oversatte JIT funksjoner så de ikke trenger og bli oversatt hver gang spillet laster.\n\nKan redusere hakkete spilling og gjør at spillet starter opp raskere ved første oppstart.\n\nLa være PÅ om usikker.",
"FsIntegrityToggleTooltip": "Sjekker for korrupte filer ved oppstart av et spill, og dersom korrupte filer oppdages, viser en hashfeil i loggen.\n\nhar ingen innvirkning på ytelsen og er ment å hjelpe med feilsøking.\n\nLa være PÅ hvis usikker.",
"AudioBackendTooltip": "Endrer backend brukt til å gjengi lyd.\n\nSDL2 er foretrukket, mens OpenAL og SoundIO brukes som reserveløsning. Dummy kommer ikke til å ha lyd.\n\nSett til SDL2 hvis usikker.",
"MemoryManagerTooltip": "Endre hvordan gjesteminne tilordnes og åpnes. Påvirker emulator CPU-ytelsen veldig mye.\n\nSett til HOST UNCHECKED hvis usikker.",
"MemoryManagerSoftwareTooltip": "Bruk en programvareside tabell for adresseoversettelse. Høyeste nøyaktighet, men tregeste ytelse.",
"MemoryManagerHostTooltip": "Direkte kartminne i vertens adresseområde. Mye raskere JIT kompilering og utførelse.",
"MemoryManagerUnsafeTooltip": "Direkte kartminne, men ikke masker adressen i gjesteadressen før du har tilgang. raskere, men på bekostning av sikkerhet. gjeste-programmet kan få tilgang til minne fra hvor som helst i Ryujinx, så bare kjøre programmer du stoler på med denne modusen.",
"UseHypervisorTooltip": "Bruk Hypervisor i stedet for JIT. Det øker ytelsen mye hvis det er tilgjengelig, men det kan være ustabilt i den nåværende tilstanden.",
"DRamTooltip": "Bruker en alternativ minnemodus med 8GiB i DRAM for og etterligne Switch utvikler modeller.\n\nDette er bare nyttig for teksturpakker eller 4k oppløsningsmoduler. Forbedrer IKKE ytelsen.\n\nLa AV hvis usikker.",
"IgnoreMissingServicesTooltip": "Ignorerer ikke implementerte Horisont OS-tjenester. Dette kan hjelpe med å omgå krasj ved oppstart av enkelte spill.\n\nLa AV hvis du er usikker.",
"GraphicsBackendThreadingTooltip": "Utfører grafikkbackend kommandoer på en annen tråd.\n\nØker hastigheten for shaderkomprimering, reduserer hakking og forbedrer ytelsen til GPU-drivere uten å spre støtten fra sine egne. Litt bedre ytelse på drivere med flertråd.\n\nSett for å AUTO hvis usikker.",
"GalThreadingTooltip": "Utfører grafikkbackend kommandoer på en annen tråd.\n\nØker hastigheten for shaderkomprimering, reduserer hakking og forbedrer ytelsen til GPU-drivere uten flertråd støtte. Litt bedre ytelse på drivere med flertråd.\n\nSett for å AUTO hvis usikker.",
"ShaderCacheToggleTooltip": "Lagrer en disk shader cache som reduserer hakking jo flere ganger du spiller.\n\nLa være PÅ om usikker.",
"ResolutionScaleTooltip": "Dobler spillets gjengivelse.\n\nNoen få spill fungerer kanskje ikke med dette aktivert og kan se veldig pikselert ut selv når gjengivelsen er økt; for de spillene, så kan det hende du må bruke modifikasjoner som fjerner anti-aliasing eller som øker den interne gjengivelsen. For og bruke sistnenvte, så vil du helst bruke \"Native\".\n\nHa til tanke at 4x er unødig for virituelt alle maskiner.",
"ResolutionScaleEntryTooltip": "Det er mer sannsynlig at flytende punktoppløsning skalaer som 1.5. Ikke-integrerte skalaer forårsaker problemer eller krasj.",
"AnisotropyTooltip": "Nivå av Anisotropisk filtrering. Sett til Auto for å bruke verdien som kreves av spillet.",
"AspectRatioTooltip": "Sideforhold angitt til gjengitt vindu.\n\nBare bytt dette om du bruker en modifikasjon som forandrer Sideforholdet på spillet ditt, ellers vil grafikken bli strukket.\n\nLa være på 16:9 om usikker.",
"ShaderDumpPathTooltip": "Grafikk Shader Dump bane",
"FileLogTooltip": "Lagrer konsoll-logging til en loggfil på harddisken. Påvirker ikke ytelsen.",
"StubLogTooltip": "Skriver ut log meldinger i konsollen. Påvirker ikke ytelsen.",
"InfoLogTooltip": "Skriver ut info loggmeldinger i konsollen. Påvirker ikke ytelse.",
"WarnLogTooltip": "Skriver ut varselloggmeldinger i konsollen. påvirker ikke ytelsen.",
"ErrorLogTooltip": "Skriver ut feilloggmeldinger i konsollen. Påvirker ikke ytelse.",
"TraceLogTooltip": "Skriver ut sporbare loggmeldinger i konsollen. påvirker ikke ytelsen.",
"GuestLogTooltip": "Skriver ut gjesteloggmeldinger i konsollen. påvirker ikke ytelsen.",
"FileAccessLogTooltip": "Skriver ut filtilgang til loggmeldinger i konsollen.",
"FSAccessLogModeTooltip": "Aktiverer FS tilgang loggutgang til konsollen. Mulige moduser er 0-3",
"DeveloperOptionTooltip": "Bruk med forsiktighet",
"OpenGlLogLevel": "Krever riktige loggnivåer aktivert",
"DebugLogTooltip": "Skriver ut loggmeldinger i konsollen.\n\nBruk bare dette hvis et medlem har gitt spesifikke instruksjoner, siden det vil gjøre loggene vanskelig å lese og forverre emulatorytelse.",
"LoadApplicationFileTooltip": "Åpne filutforsker for å velge en Switch kompatibel fil å laste",
"LoadApplicationFolderTooltip": "Åpne en filutforsker for å velge en Switch kompatibel, upakket applikasjon for å laste",
"OpenRyujinxFolderTooltip": "Åpne Ryujinx filsystem-mappen",
"OpenRyujinxLogsTooltip": "Åpner mappen hvor logger er lagret",
"ExitTooltip": "Avslutt Ryujinx",
"OpenSettingsTooltip": "Åpne innstillinger-vinduet",
"OpenProfileManagerTooltip": "Åpne vindu for brukerprofiler",
"StopEmulationTooltip": "Stopp emuleringen av dette spillet og gå tilbake til spill valg",
"CheckUpdatesTooltip": "Se etter oppdateringer til Ryujinx",
"OpenAboutTooltip": "Åpne Om Vindu",
"GridSize": "Rutenett størrelse",
"GridSizeTooltip": "Endre størrelsen på rutenettet elementer",
"SettingsTabSystemSystemLanguageBrazilianPortuguese": "Brasiliansk portugisisk",
"AboutRyujinxContributorsButtonHeader": "Se alle bidragsytere",
"SettingsTabSystemAudioVolume": "Lydnivå: ",
"AudioVolumeTooltip": "Endre lydenivå",
"SettingsTabSystemEnableInternetAccess": "Internett-tilgang for gjeste/LAN-modus",
"EnableInternetAccessTooltip": "Tillater emulert applikasjon å koble til Internett.\n\nSpill med en LAN-modus kan koble til hverandre når dette er aktivert og systemene er koblet til det samme tilgangspunktet. Dette inkluderer ekte konsoller også.\n\ntillater IKKE tilkobling til Nintendo servere. Kan forårsake krasjing i enkelte spill som prøver å koble til Internett.\n\nLa stå AV hvis du er usikker.",
"GameListContextMenuManageCheatToolTip": "Administrer juksemoduser",
"GameListContextMenuManageCheat": "Administrer juksemoduser",
"GameListContextMenuManageModToolTip": "Administrer modifikasjoner",
"GameListContextMenuManageMod": "Administrer modifikasjoner",
"ControllerSettingsStickRange": "Omfang:",
"DialogStopEmulationTitle": "Ryujinx - Stopp emulasjon",
"DialogStopEmulationMessage": "Er du sikker på at du vil stoppe emulasjonen?",
"SettingsTabCpu": "Prosessor",
"SettingsTabAudio": "Lyd",
"SettingsTabNetwork": "Nettverk",
"SettingsTabNetworkConnection": "Nettverk tilkobling",
"SettingsTabCpuCache": "CPU-buffer",
"SettingsTabCpuMemory": "Prosessor modus",
"DialogUpdaterFlatpakNotSupportedMessage": "Vennligst oppdater Ryujinx via FlatHub.",
"UpdaterDisabledWarningTitle": "Oppdatering Deaktivert!",
"ControllerSettingsRotate90": "Roter 90° med klokken",
"IconSize": "Ikon størrelse",
"IconSizeTooltip": "Endre størrelsen på spillikonene",
"MenuBarOptionsShowConsole": "Vis konsoll",
"ShaderCachePurgeError": "Feil under tømming av shader cache ved {0}: {1}",
"UserErrorNoKeys": "Finner ikke nøkler",
"UserErrorNoFirmware": "Fastvare ikke funnet",
"UserErrorFirmwareParsingFailed": "Fastvare analysefeil",
"UserErrorApplicationNotFound": "Applikasjon ikke funnet",
"UserErrorUnknown": "Ukjent feil",
"UserErrorUndefined": "Udefinert feil",
"UserErrorNoKeysDescription": "Ryujinx kunne ikke finne 'prod.keys' filen din",
"UserErrorNoFirmwareDescription": "Ryujinx kunne ikke finne noen fastvare installert",
"UserErrorFirmwareParsingFailedDescription": "Ryujinx klarte ikke å analysere levert fastvare. Dette er vanligvis forårsaket av utdaterte nøkler.",
"UserErrorApplicationNotFoundDescription": "Ryujinx kunne ikke finne en gyldig applikasjon på den gitte banen.",
"UserErrorUnknownDescription": "En ukjent feil oppstod!",
"UserErrorUndefinedDescription": "En udefinert feil oppstod! Dette burde ikke skje, vennligst kontakt en utvikler!",
"OpenSetupGuideMessage": "Åpne oppsettsveiledningen",
"NoUpdate": "Ingen oppdatering",
"TitleUpdateVersionLabel": "Versjon {0}",
"TitleBundledUpdateVersionLabel": "Pakket: Versjon {0}",
"TitleBundledDlcLabel": "Pakket:",
"RyujinxInfo": "Ryujinx - Informasjon",
"RyujinxConfirm": "Ryujinx - Bekreftelse",
"FileDialogAllTypes": "Alle typer",
"Never": "Aldri",
"SwkbdMinCharacters": "Må være minimum {0} tegn lang",
"SwkbdMinRangeCharacters": "Må være {0}-{1} tegn",
"SoftwareKeyboard": "Programvare Tastatur",
"SoftwareKeyboardModeNumeric": "Må kun være 0-9 eller '.'",
"SoftwareKeyboardModeAlphabet": "Må kun være uten CJK-tegn",
"SoftwareKeyboardModeASCII": "Må være kun ASCII-tekst",
"ControllerAppletControllers": "Støttede kontrollere:",
"ControllerAppletPlayers": "Spillere:",
"ControllerAppletDescription": "Din nåværende konfigurasjon er ugyldig. Åpne innstillinger og konfigurer inndata.",
"ControllerAppletDocked": "Docked modus. Håndholdt kontroll skal være deaktivert.",
"UpdaterRenaming": "Omdøper gamle filer...",
"UpdaterRenameFailed": "Oppdateringen kunne ikke gi filen nytt navn: {0}",
"UpdaterAddingFiles": "Legger til nye filer...",
"UpdaterExtracting": "Pakker ut oppdatering...",
"UpdaterDownloading": "Laster ned oppdatering...",
"Game": "Spill",
"Docked": "Forankret",
"Handheld": "Håndholdt",
"ConnectionError": "Tilkoblingsfeil",
"AboutPageDeveloperListMore": "{0} og mer...",
"ApiError": "API feil.",
"LoadingHeading": "Laster {0}",
"CompilingPPTC": "Sammensetter PTC",
"CompilingShaders": "Samler Shaders",
"AllKeyboards": "Alle tastaturer",
"OpenFileDialogTitle": "Velg en støttet fil for å åpne",
"OpenFolderDialogTitle": "Velg en mappe med et pakket ut spill",
"AllSupportedFormats": "Alle støttede formater",
"RyujinxUpdater": "Ryujinx Oppgradering",
"SettingsTabHotkeys": "Hurtigtaster for tastatur",
"SettingsTabHotkeysHotkeys": "Hurtigtaster for tastatur",
"SettingsTabHotkeysToggleVsyncHotkey": "Aktiver/deaktiver VSync:",
"SettingsTabHotkeysScreenshotHotkey": "Skjermbilde",
"SettingsTabHotkeysShowUiHotkey": "Vis UI:",
"SettingsTabHotkeysPauseHotkey": "Stans midlertidig:",
"SettingsTabHotkeysToggleMuteHotkey": "Demp:",
"ControllerMotionTitle": "Innstillinger for bevegelses kontroll",
"ControllerRumbleTitle": "Innstillinger for Vibrasjon",
"SettingsSelectThemeFileDialogTitle": "Velg tema fil",
"SettingsXamlThemeFile": "Xaml tema-fil",
"AvatarWindowTitle": "Administrer kontoer - Profilbilde",
"Amiibo": "Amiibo",
"Unknown": "Ukjent",
"Usage": "Forbruk",
"Writable": "Skrivbart",
"SelectDlcDialogTitle": "Velg DLC-filer",
"SelectUpdateDialogTitle": "Velg oppdateringsfiler",
"SelectModDialogTitle": "Velg modifikasjons mappe",
"UserProfileWindowTitle": "Bruker Profiler Behandler",
"CheatWindowTitle": "Juksing behandler",
"DlcWindowTitle": "Behandle nedlastbart innhold for {0} ({1})",
"ModWindowTitle": "Administrere Modifikasjoner for {0} ({1})",
"UpdateWindowTitle": "Tittel oppdatering behandler",
"CheatWindowHeading": "Juks tilgjengelig for {0} [{1}]",
"BuildId": "VersjonsId:",
"DlcWindowHeading": "{0} Nedlastbare innhold(er)",
"ModWindowHeading": "{0} Modifikasjoner(s)",
"UserProfilesEditProfile": "Rediger Valgte",
"Cancel": "Avbryt",
"Save": "Lagre",
"Discard": "Forkast",
"Paused": "Satt på pause",
"UserProfilesSetProfileImage": "Angi profilbilde",
"UserProfileEmptyNameError": "Navn er påkrevd",
"UserProfileNoImageError": "Profilbilde må være angitt",
"GameUpdateWindowHeading": "Administrer oppdateringer for {0} ({1})",
"SettingsTabHotkeysResScaleUpHotkey": "Øke oppløsning:",
"SettingsTabHotkeysResScaleDownHotkey": "Reduser oppløsning:",
"UserProfilesName": "Navn:",
"UserProfilesUserId": "Bruker ID:",
"SettingsTabGraphicsBackend": "Grafikk Backend",
"SettingsTabGraphicsBackendTooltip": "Velg grafikkbackend som skal brukes i emulatoren.\n\nVulkan er generelt bedre for alle moderne grafikkort, så lenge driverne er oppdatert. Vulkan har også en raskere sammenstilling av Shader (mindre hakkete) på alle GPU-leverandører.\n\nOpenGL kan oppnå bedre resultater for eldre Nvidia GPU-er, på eldre AMD GPU-er på Linux, eller på GPU-er med lavere VRAM, selv om skyggekompileringsutløser vil være større.\n\nSett til Vulkan hvis du er usikker. Sett til OpenGL hvis ikke GPU-en støtter Vulkan selv med de nyeste grafikkdriverne.",
"SettingsEnableTextureRecompression": "Aktiver teksturkomprimering",
"SettingsEnableTextureRecompressionTooltip": "Kompresser ASTC-teksturer for å redusere VRAM-bruk.\n\nSpill som bruker dette teksturformatet, inkluderer Astral Chain, Bayonetta 3, Fire Emblem Engage, Metroid Prime Remastered, Super Mario Bros. Wonder and The Legend of Zelda: Tears of the Kingdom.\n\nGrafikkkort med 4GiB VRAM eller mindre, vil sannsynligvis krasje på et tidspunkt når spillene kjører.\n\nAktiver bare hvis du går tom for VRAM på nevnte spill. La AV om du er usikker.",
"SettingsTabGraphicsPreferredGpu": "Foretrukket GPU",
"SettingsTabGraphicsPreferredGpuTooltip": "Velg grafikkkortet som skal brukes sammen med Vulkan grafikkbackenden\n\nPåvirker ikke GPU-er som OpenGL skal bruke.\n\nSett til GPU-merket som \"dGPU\" hvis usikker. Hvis det ikke det er en, la være uberørt.",
"SettingsAppRequiredRestartMessage": "Ryujinx Omstart nødvendig",
"SettingsGpuBackendRestartMessage": "Grafikk Backend eller GPU-innstillinger er endret. Dette krever en omstart for å aktiveres",
"SettingsGpuBackendRestartSubMessage": "Vil du starte på nytt nå?",
"RyujinxUpdaterMessage": "Ønsker du å oppdatere Ryujinx til den nyeste versjonen?",
"SettingsTabHotkeysVolumeUpHotkey": "Øk Volum:",
"SettingsTabHotkeysVolumeDownHotkey": "Reduser Volum:",
"SettingsEnableMacroHLE": "Aktiver Makro HLE",
"SettingsEnableMacroHLETooltip": "High-level emulering av GPU makrokode.\n\nForbedrer ytelse, men kan forårsake grafiske glitches i noen spill.\n\nForlat PÅ hvis usikker.",
"SettingsEnableColorSpacePassthrough": "Fargeromsgjennomgang",
"SettingsEnableColorSpacePassthroughTooltip": "Dirigerer Vulkan backenden til å gå gjennom farge informasjonen uten og spesifisere en fargeromsgjennomgang. For brukere med en bred spillvisning kan dette resultere i mer vibrerende farger og få riktig farge.",
"VolumeShort": "Vol",
"UserProfilesManageSaves": "Administrer lagring",
"DeleteUserSave": "Vil du slette bruker data for dette spillet?",
"IrreversibleActionNote": "Denne handlingen er ikke reverserbar.",
"SaveManagerHeading": "Administrer lagring for {0} ({1})",
"SaveManagerTitle": "Lagre behandler",
"Name": "Navn",
"Size": "Størrelse",
"Search": "Søk",
"UserProfilesRecoverLostAccounts": "Gjenopprett tapte kontoer",
"Recover": "Gjenopprett",
"UserProfilesRecoverHeading": "Lagring ble funnet for følgende kontoer",
"UserProfilesRecoverEmptyList": "Ingen profiler å gjenopprette",
"GraphicsAATooltip": "Aktiverer anti-aliasing til spill render.\n\nFXAA vil gjøre det meste av bildet, mens SMAA vil forsøke å finne berørte kanter og glatte dem ut.\n\nAnbefales ikke til bruk i forbindelse med FSR-skaleringsfilteret.\n\nDette valget kan endres mens et spill kjører ved å klikke \"Apply\" nedenfor; du kan bare flytte innstillingsvinduet til du finner det foretrukne utseendet til et spill.\n\nForlat på NONE hvis usikker.",
"GraphicsAALabel": "Kantutjevning:",
"GraphicsScalingFilterLabel": "Skaleringsfilter:",
"GraphicsScalingFilterTooltip": "Velg det skaleringsfilteret som skal brukes når du bruker oppløsningsskalaen.\n\nBilinear fungerer godt for 3D-spill og er et trygt standardalternativ.\n\nNærmeste anbefales for pixel kunst-spill.\n\nFSR 1.0 er bare et skarpere filter, ikke anbefalt for bruk med FXAA eller SMAA.\n\nOmrådeskalering anbefales når nedskalering er større enn utgangsvinduet. Den kan brukes til å oppnå en superprøvetaket anti-aliasingseffekt når en nedskalerer med mer enn 2x.\n\nDette valget kan endres mens et spill kjører ved å klikke \"Apply\" nedenfor; du kan bare flytte innstillingsvinduet til du finner det foretrukne utseendet til et spill.\n\nLa være på BILINEAR hvis usikker.",
"GraphicsScalingFilterBilinear": "Bilinear",
"GraphicsScalingFilterNearest": "Nærmeste",
"GraphicsScalingFilterFsr": "FSR",
"GraphicsScalingFilterArea": "Område",
"GraphicsScalingFilterLevelLabel": "Nivå",
"GraphicsScalingFilterLevelTooltip": "Definer FSR 1,0 skarpere nivå. Høyere er skarpere.",
"SmaaLow": "SMAA lav",
"SmaaMedium": "SMAA Middels",
"SmaaHigh": "SMAA høy",
"SmaaUltra": "SMAA Ultra",
"UserEditorTitle": "Rediger bruker",
"UserEditorTitleCreate": "Opprett bruker",
"SettingsTabNetworkInterface": "Nettverksgrensesnitt",
"NetworkInterfaceTooltip": "Nettverksgrensesnittets grensesnitt brukt for LAN/LDN funksjoner.\n\ni konjuksjon med en VPN eller XLink Kai og ett spill med LAN støtte, kan bli brukt til og spoofe ett \"samme-nettverk\" tilkobling over nettet.\n\nLa være på DEFAULT om usikker.",
"NetworkInterfaceDefault": "Standard",
"PackagingShaders": "Pakker Shaders",
"AboutChangelogButton": "Vis endringslogg på GitHub",
"AboutChangelogButtonTooltipMessage": "Klikk for å åpne endringsloggen for denne versjonen i din nettleser.",
"SettingsTabNetworkMultiplayer": "Flerspiller",
"MultiplayerMode": "Modus:",
"MultiplayerModeTooltip": "Endre LDN flerspillermodus.\n\nLdnMitm vil endre lokal trådløst/lokal spillfunksjonalitet i spill som skal fungere som om den var LAN, noe som tillater lokal, samme nettverk forbindelser med andre Ryujinx instanser og hacket Nintendo Switch konsoller som har installert ldn_mitm-modulen.\n\nFlerspiller krever at alle spillerne er på samme versjon (dvs. Super Smash Bros. Ultimat v13.0.1 kan ikke koble til v13.0.0).\n\nForlat DEAKTIVERT hvis usikker.",
"MultiplayerModeDisabled": "Deaktivert",
"MultiplayerModeLdnMitm": "ldn_mitm"
}

View File

@@ -44,6 +44,12 @@
"MenuBarViewWindow1080": "1080p",
"MenuBarHelp": "_Pomoc",
"MenuBarHelpCheckForUpdates": "Sprawdź aktualizacje",
"MenuBarHelpFaq": "FAQ & Troubleshooting Page",
"MenuBarHelpFaqTooltip": "Opens the FAQ and Troubleshooting page on the official Ryujinx wiki",
"MenuBarHelpSetup": "Setup & Configuration Guide",
"MenuBarHelpSetupTooltip": "Opens the Setup & Configuration guide on the official Ryujinx wiki",
"MenuBarHelpMultiplayer": "Multiplayer (LDN/LAN) Guide",
"MenuBarHelpMultiplayerTooltip": "Opens the Multiplayer guide on the official Ryujinx wiki",
"MenuBarHelpAbout": "O programie",
"MenuSearch": "Wyszukaj...",
"GameListHeaderFavorite": "Ulubione",

View File

@@ -44,6 +44,12 @@
"MenuBarViewWindow1080": "1080p",
"MenuBarHelp": "_Ajuda",
"MenuBarHelpCheckForUpdates": "_Verificar se há atualizações",
"MenuBarHelpFaq": "FAQ & Troubleshooting Page",
"MenuBarHelpFaqTooltip": "Opens the FAQ and Troubleshooting page on the official Ryujinx wiki",
"MenuBarHelpSetup": "Setup & Configuration Guide",
"MenuBarHelpSetupTooltip": "Opens the Setup & Configuration guide on the official Ryujinx wiki",
"MenuBarHelpMultiplayer": "Multiplayer (LDN/LAN) Guide",
"MenuBarHelpMultiplayerTooltip": "Opens the Multiplayer guide on the official Ryujinx wiki",
"MenuBarHelpAbout": "_Sobre",
"MenuSearch": "Buscar...",
"GameListHeaderFavorite": "Favorito",

View File

@@ -44,6 +44,12 @@
"MenuBarViewWindow1080": "1080p",
"MenuBarHelp": "_Помощь",
"MenuBarHelpCheckForUpdates": "Проверить наличие обновлений",
"MenuBarHelpFaq": "FAQ & Troubleshooting Page",
"MenuBarHelpFaqTooltip": "Opens the FAQ and Troubleshooting page on the official Ryujinx wiki",
"MenuBarHelpSetup": "Setup & Configuration Guide",
"MenuBarHelpSetupTooltip": "Opens the Setup & Configuration guide on the official Ryujinx wiki",
"MenuBarHelpMultiplayer": "Multiplayer (LDN/LAN) Guide",
"MenuBarHelpMultiplayerTooltip": "Opens the Multiplayer guide on the official Ryujinx wiki",
"MenuBarHelpAbout": "О программе",
"MenuSearch": "Поиск...",
"GameListHeaderFavorite": "Избранное",

View File

@@ -44,6 +44,12 @@
"MenuBarViewWindow1080": "1080p",
"MenuBarHelp": "_ช่วยเหลือ",
"MenuBarHelpCheckForUpdates": "ตรวจสอบอัปเดต",
"MenuBarHelpFaq": "FAQ & Troubleshooting Page",
"MenuBarHelpFaqTooltip": "Opens the FAQ and Troubleshooting page on the official Ryujinx wiki",
"MenuBarHelpSetup": "Setup & Configuration Guide",
"MenuBarHelpSetupTooltip": "Opens the Setup & Configuration guide on the official Ryujinx wiki",
"MenuBarHelpMultiplayer": "Multiplayer (LDN/LAN) Guide",
"MenuBarHelpMultiplayerTooltip": "Opens the Multiplayer guide on the official Ryujinx wiki",
"MenuBarHelpAbout": "เกี่ยวกับ",
"MenuSearch": "กำลังค้นหา...",
"GameListHeaderFavorite": "ชื่นชอบ",

View File

@@ -44,6 +44,12 @@
"MenuBarViewWindow1080": "1080p",
"MenuBarHelp": "_Yardım",
"MenuBarHelpCheckForUpdates": "Güncellemeleri Denetle",
"MenuBarHelpFaq": "FAQ & Troubleshooting Page",
"MenuBarHelpFaqTooltip": "Opens the FAQ and Troubleshooting page on the official Ryujinx wiki",
"MenuBarHelpSetup": "Setup & Configuration Guide",
"MenuBarHelpSetupTooltip": "Opens the Setup & Configuration guide on the official Ryujinx wiki",
"MenuBarHelpMultiplayer": "Multiplayer (LDN/LAN) Guide",
"MenuBarHelpMultiplayerTooltip": "Opens the Multiplayer guide on the official Ryujinx wiki",
"MenuBarHelpAbout": "Hakkında",
"MenuSearch": "Ara...",
"GameListHeaderFavorite": "Favori",

View File

@@ -1,7 +1,7 @@
{
"Language": "Українська",
"MenuBarFileOpenApplet": "Відкрити аплет",
"MenuBarFileOpenAppletOpenMiiApplet": "Mii Edit Applet",
"MenuBarFileOpenAppletOpenMiiApplet": "Аплет для редагування Mii",
"MenuBarFileOpenAppletOpenMiiAppletToolTip": "Відкрити аплет Mii Editor в автономному режимі",
"SettingsTabInputDirectMouseAccess": "Прямий доступ мишею",
"SettingsTabSystemMemoryManagerMode": "Режим диспетчера пам’яті:",
@@ -11,10 +11,10 @@
"SettingsTabSystemUseHypervisor": "Використовувати гіпервізор",
"MenuBarFile": "_Файл",
"MenuBarFileOpenFromFile": "_Завантажити програму з файлу",
"MenuBarFileOpenFromFileError": "No applications found in selected file.",
"MenuBarFileOpenFromFileError": "У вибраному файлі не знайдено жодних додатків.",
"MenuBarFileOpenUnpacked": "Завантажити _розпаковану гру",
"MenuBarFileLoadDlcFromFolder": "Load DLC From Folder",
"MenuBarFileLoadTitleUpdatesFromFolder": "Load Title Updates From Folder",
"MenuBarFileLoadDlcFromFolder": "Завантажити DLC з теки",
"MenuBarFileLoadTitleUpdatesFromFolder": "Завантажити оновлення заголовків з теки",
"MenuBarFileOpenEmuFolder": "Відкрити теку Ryujinx",
"MenuBarFileOpenLogsFolder": "Відкрити теку журналів змін",
"MenuBarFileExit": "_Вихід",
@@ -37,13 +37,19 @@
"MenuBarToolsManageFileTypes": "Керувати типами файлів",
"MenuBarToolsInstallFileTypes": "Установити типи файлів",
"MenuBarToolsUninstallFileTypes": "Видалити типи файлів",
"MenuBarToolsXCITrimmer": "Trim XCI Files",
"MenuBarView": "_View",
"MenuBarViewWindow": "Window Size",
"MenuBarToolsXCITrimmer": "Обрізати XCI файли",
"MenuBarView": "_Вид",
"MenuBarViewWindow": "Розмір вікна",
"MenuBarViewWindow720": "720p",
"MenuBarViewWindow1080": "1080p",
"MenuBarHelp": "_Допомога",
"MenuBarHelpCheckForUpdates": "Перевірити оновлення",
"MenuBarHelpFaq": "FAQ & Troubleshooting Page",
"MenuBarHelpFaqTooltip": "Opens the FAQ and Troubleshooting page on the official Ryujinx wiki",
"MenuBarHelpSetup": "Setup & Configuration Guide",
"MenuBarHelpSetupTooltip": "Opens the Setup & Configuration guide on the official Ryujinx wiki",
"MenuBarHelpMultiplayer": "Multiplayer (LDN/LAN) Guide",
"MenuBarHelpMultiplayerTooltip": "Opens the Multiplayer guide on the official Ryujinx wiki",
"MenuBarHelpAbout": "Про застосунок",
"MenuSearch": "Пошук...",
"GameListHeaderFavorite": "Обране",
@@ -89,11 +95,11 @@
"GameListContextMenuOpenModsDirectoryToolTip": "Відкриває каталог, який містить модифікації Додатків",
"GameListContextMenuOpenSdModsDirectory": "Відкрити каталог модифікацій Atmosphere",
"GameListContextMenuOpenSdModsDirectoryToolTip": "Відкриває альтернативний каталог SD-карти Atmosphere, що містить модифікації Додатків. Корисно для модифікацій, зроблених для реального обладнання.",
"GameListContextMenuTrimXCI": "Check and Trim XCI File",
"GameListContextMenuTrimXCIToolTip": "Check and Trim XCI File to Save Disk Space",
"GameListContextMenuTrimXCI": "Перевірка та Нарізка XCI Файлів",
"GameListContextMenuTrimXCIToolTip": "Перевірка та Нарізка XCI Файлів для збереження місця на диску",
"StatusBarGamesLoaded": "{0}/{1} ігор завантажено",
"StatusBarSystemVersion": "Версія системи: {0}",
"StatusBarXCIFileTrimming": "Trimming XCI File '{0}'",
"StatusBarXCIFileTrimming": "Обрізано XCI Файлів '{0}'",
"LinuxVmMaxMapCountDialogTitle": "Виявлено низьку межу для відображення памʼяті",
"LinuxVmMaxMapCountDialogTextPrimary": "Бажаєте збільшити значення vm.max_map_count на {0}",
"LinuxVmMaxMapCountDialogTextSecondary": "Деякі ігри можуть спробувати створити більше відображень памʼяті, ніж дозволено наразі. Ryujinx завершить роботу, щойно цей ліміт буде перевищено.",
@@ -107,15 +113,15 @@
"SettingsTabGeneralEnableDiscordRichPresence": "Увімкнути розширену присутність Discord",
"SettingsTabGeneralCheckUpdatesOnLaunch": "Перевіряти наявність оновлень під час запуску",
"SettingsTabGeneralShowConfirmExitDialog": "Показати діалогове вікно «Підтвердити вихід».",
"SettingsTabGeneralRememberWindowState": "Remember Window Size/Position",
"SettingsTabGeneralShowTitleBar": "Show Title Bar (Requires restart)",
"SettingsTabGeneralRememberWindowState": "Запам'ятати Розмір/Позицію вікна",
"SettingsTabGeneralShowTitleBar": "Показувати рядок заголовка (Потрібен перезапуск)",
"SettingsTabGeneralHideCursor": "Сховати вказівник:",
"SettingsTabGeneralHideCursorNever": "Ніколи",
"SettingsTabGeneralHideCursorOnIdle": "Сховати у режимі очікування",
"SettingsTabGeneralHideCursorAlways": "Завжди",
"SettingsTabGeneralGameDirectories": "Тека ігор",
"SettingsTabGeneralAutoloadDirectories": "Autoload DLC/Updates Directories",
"SettingsTabGeneralAutoloadNote": "DLC and Updates which refer to missing files will be unloaded automatically",
"SettingsTabGeneralAutoloadDirectories": "Автозавантаження каталогів DLC/Оновлень",
"SettingsTabGeneralAutoloadNote": "DLC та Оновлення, які посилаються на відсутні файли, будуть автоматично вимкнуті.",
"SettingsTabGeneralAdd": "Додати",
"SettingsTabGeneralRemove": "Видалити",
"SettingsTabSystem": "Система",
@@ -148,7 +154,18 @@
"SettingsTabSystemSystemLanguageTraditionalChinese": "Традиційна китайська",
"SettingsTabSystemSystemTimeZone": "Часовий пояс системи:",
"SettingsTabSystemSystemTime": "Час системи:",
"SettingsTabSystemEnableVsync": "Вертикальна синхронізація",
"SettingsTabSystemVSyncMode": "Вертикальна синхронізація (VSync):",
"SettingsTabSystemEnableCustomVSyncInterval": "Увімкнути користувацьку частоту оновлення (Експериментально)",
"SettingsTabSystemVSyncModeSwitch": "Switch",
"SettingsTabSystemVSyncModeUnbounded": "Безмежна",
"SettingsTabSystemVSyncModeCustom": "Користувацька",
"SettingsTabSystemVSyncModeTooltip": "Емульована вертикальна синхронізація. 'Switch' емулює частоту оновлення Switch 60 Гц. 'Безмежна' — частота оновлення не матиме обмежень.",
"SettingsTabSystemVSyncModeTooltipCustom": "Емульована вертикальна синхронізація. 'Switch' емулює частоту оновлення Switch 60 Гц. 'Безмежна' — частота оновлення не матиме обмежень. 'Користувацька' емулює вказану користувацьку частоту оновлення.",
"SettingsTabSystemEnableCustomVSyncIntervalTooltip": "Дозволяє користувачу вказати емульовану частоту оновлення. У деяких іграх це може прискорити або сповільнити логіку гри. У інших іграх це може дозволити обмежити FPS на певні кратні частоти оновлення або призвести до непередбачуваної поведінки. Це експериментальна функція, без гарантій того, як це вплине на ігровий процес. \n\nЗалиште ВИМКНЕНИМ, якщо не впевнені.",
"SettingsTabSystemCustomVSyncIntervalValueTooltip": "Цільове значення користувацької частоти оновлення.",
"SettingsTabSystemCustomVSyncIntervalSliderTooltip": "Користувацька частота оновлення, як відсоток від стандартної частоти оновлення Switch.",
"SettingsTabSystemCustomVSyncIntervalPercentage": "Користувацька частота оновлення %:",
"SettingsTabSystemCustomVSyncIntervalValue": "Значення користувацька частота оновлення:",
"SettingsTabSystemEnablePptc": "PPTC (профільований постійний кеш перекладу)",
"SettingsTabSystemEnableLowPowerPptc": "Low-power PPTC",
"SettingsTabSystemEnableFsIntegrityChecks": "Перевірка цілісності FS",
@@ -159,11 +176,11 @@
"SettingsTabSystemAudioBackendSDL2": "SDL2",
"SettingsTabSystemHacks": "Хитрощі",
"SettingsTabSystemHacksNote": " (може викликати нестабільність)",
"SettingsTabSystemDramSize": "Використовувати альтернативне розташування пам'яті (розробники)",
"SettingsTabSystemDramSize4GiB": "4GiB",
"SettingsTabSystemDramSize6GiB": "6GiB",
"SettingsTabSystemDramSize8GiB": "8GiB",
"SettingsTabSystemDramSize12GiB": "12GiB",
"SettingsTabSystemDramSize": "Використовувати альтернативне розташування пам'яті (для розробників)",
"SettingsTabSystemDramSize4GiB": "4Гб",
"SettingsTabSystemDramSize6GiB": "6Гб",
"SettingsTabSystemDramSize8GiB": "8Гб",
"SettingsTabSystemDramSize12GiB": "12Гб",
"SettingsTabSystemIgnoreMissingServices": "Ігнорувати відсутні служби",
"SettingsTabSystemIgnoreApplet": "Ігнорувати Аплет",
"SettingsTabGraphics": "Графіка",
@@ -201,8 +218,8 @@
"SettingsTabLoggingEnableGuestLogs": "Увімкнути журнали гостей",
"SettingsTabLoggingEnableFsAccessLogs": "Увімкнути журнали доступу Fs",
"SettingsTabLoggingFsGlobalAccessLogMode": "Режим журналу глобального доступу Fs:",
"SettingsTabLoggingDeveloperOptions": "Параметри розробника (УВАГА: знизиться продуктивність)",
"SettingsTabLoggingDeveloperOptionsNote": "УВАГА: Знижує продуктивність",
"SettingsTabLoggingDeveloperOptions": "Параметри розробника (УВАГА: шкодить продуктивності!)",
"SettingsTabLoggingDeveloperOptionsNote": "УВАГА: Зміна параметрів нижче негативно впливає на продуктивність",
"SettingsTabLoggingGraphicsBackendLogLevel": "Рівень журналу графічного сервера:",
"SettingsTabLoggingGraphicsBackendLogLevelNone": "Немає",
"SettingsTabLoggingGraphicsBackendLogLevelError": "Помилка",
@@ -291,29 +308,29 @@
"ControllerSettingsMotionGyroDeadzone": "Мертва зона гіроскопа:",
"ControllerSettingsSave": "Зберегти",
"ControllerSettingsClose": "Закрити",
"KeyUnknown": "Unknown",
"KeyShiftLeft": "Shift Left",
"KeyShiftRight": "Shift Right",
"KeyControlLeft": "Ctrl Left",
"KeyMacControlLeft": "⌃ Left",
"KeyControlRight": "Ctrl Right",
"KeyMacControlRight": "⌃ Right",
"KeyAltLeft": "Alt Left",
"KeyMacAltLeft": "⌥ Left",
"KeyAltRight": "Alt Right",
"KeyMacAltRight": "⌥ Right",
"KeyWinLeft": "⊞ Left",
"KeyMacWinLeft": "⌘ Left",
"KeyWinRight": "⊞ Right",
"KeyMacWinRight": "⌘ Right",
"KeyUnknown": "Невідома",
"KeyShiftLeft": "Shift Лівий",
"KeyShiftRight": "Shift Правий",
"KeyControlLeft": "Ctrl Лівий",
"KeyMacControlLeft": "⌃ Лівий",
"KeyControlRight": "Ctrl Правий",
"KeyMacControlRight": "⌃ Правий",
"KeyAltLeft": "Alt Лівий",
"KeyMacAltLeft": "⌥ Лівий",
"KeyAltRight": "Alt Правий",
"KeyMacAltRight": "⌥ Правий",
"KeyWinLeft": "⊞ Лівий",
"KeyMacWinLeft": "⌘ Лівий",
"KeyWinRight": "⊞ Правий",
"KeyMacWinRight": "⌘ Правий",
"KeyMenu": "Menu",
"KeyUp": "Up",
"KeyDown": "Down",
"KeyLeft": "Left",
"KeyRight": "Right",
"KeyLeft": "Вліво",
"KeyRight": "Вправо",
"KeyEnter": "Enter",
"KeyEscape": "Escape",
"KeySpace": "Space",
"KeySpace": "Пробіл",
"KeyTab": "Tab",
"KeyBackSpace": "Backspace",
"KeyInsert": "Insert",
@@ -327,7 +344,7 @@
"KeyPrintScreen": "Print Screen",
"KeyPause": "Pause",
"KeyNumLock": "Num Lock",
"KeyClear": "Clear",
"KeyClear": "Очистити",
"KeyKeypad0": "Keypad 0",
"KeyKeypad1": "Keypad 1",
"KeyKeypad2": "Keypad 2",
@@ -366,17 +383,17 @@
"KeyPeriod": ".",
"KeySlash": "/",
"KeyBackSlash": "\\",
"KeyUnbound": "Unbound",
"GamepadLeftStick": "L Stick Button",
"GamepadRightStick": "R Stick Button",
"GamepadLeftShoulder": "Left Shoulder",
"GamepadRightShoulder": "Right Shoulder",
"GamepadLeftTrigger": "Left Trigger",
"GamepadRightTrigger": "Right Trigger",
"GamepadDpadUp": "Up",
"GamepadDpadDown": "Down",
"GamepadDpadLeft": "Left",
"GamepadDpadRight": "Right",
"KeyUnbound": "Відв'язати",
"GamepadLeftStick": "L Кнопка Стіку",
"GamepadRightStick": "R Кнопка Стіку",
"GamepadLeftShoulder": "Лівий Бампер",
"GamepadRightShoulder": "Правий Бампер",
"GamepadLeftTrigger": "Лівий Тригер",
"GamepadRightTrigger": "Правий Тригер",
"GamepadDpadUp": "Вверх",
"GamepadDpadDown": "Вниз",
"GamepadDpadLeft": "Вліво",
"GamepadDpadRight": "Вправо",
"GamepadMinus": "-",
"GamepadPlus": "+",
"GamepadGuide": "Guide",
@@ -386,12 +403,12 @@
"GamepadPaddle3": "Paddle 3",
"GamepadPaddle4": "Paddle 4",
"GamepadTouchpad": "Touchpad",
"GamepadSingleLeftTrigger0": "Left Trigger 0",
"GamepadSingleRightTrigger0": "Right Trigger 0",
"GamepadSingleLeftTrigger1": "Left Trigger 1",
"GamepadSingleRightTrigger1": "Right Trigger 1",
"StickLeft": "Left Stick",
"StickRight": "Right Stick",
"GamepadSingleLeftTrigger0": "Лівий Тригер 0",
"GamepadSingleRightTrigger0": "Правий Тригер 0",
"GamepadSingleLeftTrigger1": "Лівий Тригер 1",
"GamepadSingleRightTrigger1": "Правий Тригер 1",
"StickLeft": "Лівий Стік",
"StickRight": "Правий Стік",
"UserProfilesSelectedUserProfile": "Вибраний профіль користувача:",
"UserProfilesSaveProfileName": "Зберегти ім'я профілю",
"UserProfilesChangeProfileImage": "Змінити зображення профілю",
@@ -408,8 +425,8 @@
"InputDialogTitle": "Діалог введення",
"InputDialogOk": "Гаразд",
"InputDialogCancel": "Скасувати",
"InputDialogCancelling": "Cancelling",
"InputDialogClose": "Close",
"InputDialogCancelling": "Скасування",
"InputDialogClose": "Закрити",
"InputDialogAddNewProfileTitle": "Виберіть ім'я профілю",
"InputDialogAddNewProfileHeader": "Будь ласка, введіть ім'я профілю",
"InputDialogAddNewProfileSubtext": "(Макс. довжина: {0})",
@@ -417,7 +434,7 @@
"AvatarSetBackgroundColor": "Встановити колір фону",
"AvatarClose": "Закрити",
"ControllerSettingsLoadProfileToolTip": "Завантажити профіль",
"ControllerSettingsViewProfileToolTip": "View Profile",
"ControllerSettingsViewProfileToolTip": "Показати профіль",
"ControllerSettingsAddProfileToolTip": "Додати профіль",
"ControllerSettingsRemoveProfileToolTip": "Видалити профіль",
"ControllerSettingsSaveProfileToolTip": "Зберегти профіль",
@@ -427,7 +444,7 @@
"GameListContextMenuToggleFavorite": "Перемкнути вибране",
"GameListContextMenuToggleFavoriteToolTip": "Перемкнути улюблений статус гри",
"SettingsTabGeneralTheme": "Тема:",
"SettingsTabGeneralThemeAuto": "Auto",
"SettingsTabGeneralThemeAuto": "Авто.",
"SettingsTabGeneralThemeDark": "Темна",
"SettingsTabGeneralThemeLight": "Світла",
"ControllerSettingsConfigureGeneral": "Налаштування",
@@ -446,7 +463,7 @@
"DialogExitSubMessage": "Усі незбережені дані буде втрачено!",
"DialogMessageCreateSaveErrorMessage": "Під час створення вказаних даних збереження сталася помилка: {0}",
"DialogMessageFindSaveErrorMessage": "Під час пошуку вказаних даних збереження сталася помилка: {0}",
"FolderDialogExtractTitle": "Виберіть папку для видобування",
"FolderDialogExtractTitle": "Виберіть теку для видобування",
"DialogNcaExtractionMessage": "Видобування розділу {0} з {1}...",
"DialogNcaExtractionTitle": "Екстрактор розділів NCA",
"DialogNcaExtractionMainNcaNotFoundErrorMessage": "Помилка видобування. Основний NCA не був присутній у вибраному файлі.",
@@ -461,7 +478,7 @@
"DialogUpdaterExtractionMessage": "Видобування оновлення...",
"DialogUpdaterRenamingMessage": "Перейменування оновлення...",
"DialogUpdaterAddingFilesMessage": "Додавання нового оновлення...",
"DialogUpdaterShowChangelogMessage": "Show Changelog",
"DialogUpdaterShowChangelogMessage": "Показати список змін",
"DialogUpdaterCompleteMessage": "Оновлення завершено!",
"DialogUpdaterRestartMessage": "Перезапустити Ryujinx зараз?",
"DialogUpdaterNoInternetMessage": "Ви не підключені до Інтернету!",
@@ -510,12 +527,12 @@
"DialogFirmwareInstallerFirmwareInstallWaitMessage": "Встановлення прошивки...",
"DialogFirmwareInstallerFirmwareInstallSuccessMessage": "Версію системи {0} успішно встановлено.",
"DialogKeysInstallerKeysNotFoundErrorMessage": "An invalid Keys file was found in {0}",
"DialogKeysInstallerKeysInstallTitle": "Install Keys",
"DialogKeysInstallerKeysInstallMessage": "New Keys file will be installed.",
"DialogKeysInstallerKeysInstallSubMessage": "\n\nThis may replace some of the current installed Keys.",
"DialogKeysInstallerKeysInstallConfirmMessage": "\n\nDo you want to continue?",
"DialogKeysInstallerKeysInstallWaitMessage": "Installing Keys...",
"DialogKeysInstallerKeysInstallSuccessMessage": "New Keys file successfully installed.",
"DialogKeysInstallerKeysInstallTitle": "Встановлення Ключів",
"DialogKeysInstallerKeysInstallMessage": "Новий файл Ключів буде встановлено",
"DialogKeysInstallerKeysInstallSubMessage": "\n\nЦе замінить собою поточні файли Ключів.",
"DialogKeysInstallerKeysInstallConfirmMessage": "\n\nВи хочете продовжити?",
"DialogKeysInstallerKeysInstallWaitMessage": "Встановлення Ключів...",
"DialogKeysInstallerKeysInstallSuccessMessage": "Нові ключі встановлено.",
"DialogUserProfileDeletionWarningMessage": "Якщо вибраний профіль буде видалено, інші профілі не відкриватимуться",
"DialogUserProfileDeletionConfirmMessage": "Ви хочете видалити вибраний профіль",
"DialogUserProfileUnsavedChangesTitle": "Увага — Незбережені зміни",
@@ -550,14 +567,14 @@
"MenuBarOptionsPauseEmulation": "Пауза",
"MenuBarOptionsResumeEmulation": "Продовжити",
"AboutUrlTooltipMessage": "Натисніть, щоб відкрити сайт Ryujinx у браузері за замовчування.",
"AboutDisclaimerMessage": "Ryujinx жодним чином не пов’язано з Nintendo™,\nчи будь-яким із їхніх партнерів.",
"AboutDisclaimerMessage": "Ryujinx жодним чином не пов’язаний з Nintendo™,\nчи будь-яким із їхніх партнерів.",
"AboutAmiiboDisclaimerMessage": "AmiiboAPI (www.amiiboapi.com) використовується в нашій емуляції Amiibo.",
"AboutGithubUrlTooltipMessage": "Натисніть, щоб відкрити сторінку GitHub Ryujinx у браузері за замовчуванням.",
"AboutDiscordUrlTooltipMessage": "Натисніть, щоб відкрити запрошення на сервер Discord Ryujinx у браузері за замовчуванням.",
"AboutRyujinxAboutTitle": "Про програму:",
"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.",
"AboutRyujinxAboutContent": "Ryujinx — це емулятор для Nintendo Switch™.\nОтримуйте всі останні новини в нашому Discord.\nРозробники, які хочуть зробити внесок, можуть дізнатися більше на нашому GitHub або в Discord.",
"AboutRyujinxMaintainersTitle": "Підтримується:",
"AboutRyujinxFormerMaintainersTitle": "Formerly Maintained By:",
"AboutRyujinxFormerMaintainersTitle": "Минулі розробники:",
"AboutRyujinxMaintainersContentTooltipMessage": "Натисніть, щоб відкрити сторінку співавторів у вашому браузері за замовчування.",
"AmiiboSeriesLabel": "Серія Amiibo",
"AmiiboCharacterLabel": "Персонаж",
@@ -585,9 +602,9 @@
"AddGameDirBoxTooltip": "Введіть каталог ігор, щоб додати до списку",
"AddGameDirTooltip": "Додати каталог гри до списку",
"RemoveGameDirTooltip": "Видалити вибраний каталог гри",
"AddAutoloadDirBoxTooltip": "Enter an autoload directory to add to the list",
"AddAutoloadDirTooltip": "Add an autoload directory to the list",
"RemoveAutoloadDirTooltip": "Remove selected autoload directory",
"AddAutoloadDirBoxTooltip": "Введіть шлях автозавантаження для додавання до списку",
"AddAutoloadDirTooltip": "Додайте шлях автозавантаження для додавання до списку",
"RemoveAutoloadDirTooltip": "Видалити вибраний каталог автозавантаження",
"CustomThemeCheckTooltip": "Використовуйте користувацьку тему Avalonia для графічного інтерфейсу, щоб змінити вигляд меню емулятора",
"CustomThemePathTooltip": "Шлях до користувацької теми графічного інтерфейсу",
"CustomThemeBrowseTooltip": "Огляд користувацької теми графічного інтерфейсу",
@@ -600,7 +617,7 @@
"TimeTooltip": "Змінити час системи",
"VSyncToggleTooltip": "Емульована вертикальна синхронізація консолі. По суті, обмежувач кадрів для більшості ігор; його вимкнення може призвести до того, що ігри працюватимуть на вищій швидкості, екрани завантаження триватимуть довше чи зупинятимуться.\n\nМожна перемикати в грі гарячою клавішею (За умовчанням F1). Якщо ви плануєте вимкнути функцію, рекомендуємо зробити це через гарячу клавішу.\n\nЗалиште увімкненим, якщо не впевнені.",
"PptcToggleTooltip": "Зберігає перекладені функції JIT, щоб їх не потрібно було перекладати кожного разу, коли гра завантажується.\n\nЗменшує заїкання та значно прискорює час завантаження після першого завантаження гри.\n\nЗалиште увімкненим, якщо не впевнені.",
"LowPowerPptcToggleTooltip": "Load the PPTC using a third of the amount of cores.",
"LowPowerPptcToggleTooltip": "Завантажувати PPTC використовуючи третину від кількості ядер.",
"FsIntegrityToggleTooltip": "Перевіряє наявність пошкоджених файлів під час завантаження гри, і якщо виявлено пошкоджені файли, показує помилку хешу в журналі.\n\nНе впливає на продуктивність і призначений для усунення несправностей.\n\nЗалиште увімкненим, якщо не впевнені.",
"AudioBackendTooltip": "Змінює серверну частину, яка використовується для відтворення аудіо.\n\nSDL2 є кращим, тоді як OpenAL і SoundIO використовуються як резервні варіанти. Dummy не матиме звуку.\n\nВстановіть SDL2, якщо не впевнені.",
"MemoryManagerTooltip": "Змінює спосіб відображення та доступу до гостьової пам’яті. Значно впливає на продуктивність емульованого ЦП.\n\nВстановіть «Неперевірений хост», якщо не впевнені.",
@@ -633,10 +650,10 @@
"DebugLogTooltip": "Друкує повідомлення журналу налагодження на консолі.\n\nВикористовуйте це лише за спеціальною вказівкою співробітника, оскільки це ускладнить читання журналів і погіршить роботу емулятора.",
"LoadApplicationFileTooltip": "Відкриває файловий провідник, щоб вибрати для завантаження сумісний файл Switch",
"LoadApplicationFolderTooltip": "Відкриває файловий провідник, щоб вибрати сумісну з комутатором розпаковану програму для завантаження",
"LoadDlcFromFolderTooltip": "Open a file explorer to choose one or more folders to bulk load DLC from",
"LoadTitleUpdatesFromFolderTooltip": "Open a file explorer to choose one or more folders to bulk load title updates from",
"OpenRyujinxFolderTooltip": "Відкриває папку файлової системи Ryujinx",
"OpenRyujinxLogsTooltip": "Відкриває папку, куди записуються журнали",
"LoadDlcFromFolderTooltip": "Відкрийте провідник файлів, щоб вибрати одну або кілька папок для масового завантаження DLC",
"LoadTitleUpdatesFromFolderTooltip": "Відкрийте провідник файлів, щоб вибрати одну або кілька папок для масового завантаження оновлень заголовків",
"OpenRyujinxFolderTooltip": "Відкриває теку файлової системи Ryujinx",
"OpenRyujinxLogsTooltip": "Відкриває теку, куди записуються журнали",
"ExitTooltip": "Виходить з Ryujinx",
"OpenSettingsTooltip": "Відкриває вікно налаштувань",
"OpenProfileManagerTooltip": "Відкриває вікно диспетчера профілів користувачів",
@@ -664,7 +681,6 @@
"SettingsTabNetworkConnection": "Підключення до мережі",
"SettingsTabCpuCache": "Кеш ЦП",
"SettingsTabCpuMemory": "Пам'ять ЦП",
"DialogUpdaterFlatpakNotSupportedMessage": "Будь ласка, оновіть Ryujinx через FlatHub.",
"UpdaterDisabledWarningTitle": "Програму оновлення вимкнено!",
"ControllerSettingsRotate90": "Повернути на 90° за годинниковою стрілкою",
"IconSize": "Розмір значка",
@@ -686,14 +702,14 @@
"OpenSetupGuideMessage": "Відкрити посібник із налаштування",
"NoUpdate": "Немає оновлень",
"TitleUpdateVersionLabel": "Версія {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": "Комплектні: Версія {0}",
"TitleBundledDlcLabel": "Комплектні:",
"TitleXCIStatusPartialLabel": "Часткові",
"TitleXCIStatusTrimmableLabel": "Необрізані",
"TitleXCIStatusUntrimmableLabel": "Обрізані",
"TitleXCIStatusFailedLabel": "(Невдача)",
"TitleXCICanSaveLabel": "Зберегти {0:n0} Мб",
"TitleXCISavingLabel": "Збережено {0:n0} Мб",
"RyujinxInfo": "Ryujin x - Інформація",
"RyujinxConfirm": "Ryujinx - Підтвердження",
"FileDialogAllTypes": "Всі типи",
@@ -701,8 +717,8 @@
"SwkbdMinCharacters": "Мінімальна кількість символів: {0}",
"SwkbdMinRangeCharacters": "Має бути {0}-{1} символів",
"CabinetTitle": "Cabinet Dialog",
"CabinetDialog": "Enter your Amiibo's new name",
"CabinetScanDialog": "Please scan your Amiibo now.",
"CabinetDialog": "Вкажіть Ваше нове ім'я Amiibo",
"CabinetScanDialog": "Будь ласка, проскануйте Ваш Amiibo.",
"SoftwareKeyboard": "Програмна клавіатура",
"SoftwareKeyboardModeNumeric": "Повинно бути лише 0-9 або “.”",
"SoftwareKeyboardModeAlphabet": "Повинно бути лише не CJK-символи",
@@ -730,12 +746,15 @@
"AllSupportedFormats": "Усі підтримувані формати",
"RyujinxUpdater": "Програма оновлення Ryujinx",
"SettingsTabHotkeys": "Гарячі клавіші клавіатури",
"SettingsTabHotkeysToggleVSyncModeHotkey": "Перемкнути VSync режим:",
"SettingsTabHotkeysHotkeys": "Гарячі клавіші клавіатури",
"SettingsTabHotkeysToggleVsyncHotkey": "Увімк/вимк вертикальну синхронізацію:",
"SettingsTabHotkeysScreenshotHotkey": "Знімок екрана:",
"SettingsTabHotkeysShowUiHotkey": "Показати інтерфейс:",
"SettingsTabHotkeysPauseHotkey": "Пауза:",
"SettingsTabHotkeysToggleMuteHotkey": "Вимкнути звук:",
"SettingsTabHotkeysIncrementCustomVSyncIntervalHotkey": "Підвищити користувацьку частоту оновлення",
"SettingsTabHotkeysDecrementCustomVSyncIntervalHotkey": "Понизити користувацьку частоту оновлення",
"ControllerMotionTitle": "Налаштування керування рухом",
"ControllerRumbleTitle": "Налаштування вібрації",
"SettingsSelectThemeFileDialogTitle": "Виберіть файл теми",
@@ -748,53 +767,53 @@
"SelectDlcDialogTitle": "Виберіть файли DLC",
"SelectUpdateDialogTitle": "Виберіть файли оновлення",
"SelectModDialogTitle": "Виберіть теку з модами",
"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": "Перевірити та Обрізати XCI файл",
"TrimXCIFileDialogPrimaryText": "Ця функція спочатку перевірить вільний простір, а потім обрізатиме файл XCI для економії місця на диску.",
"TrimXCIFileDialogSecondaryText": "Поточний розмір файла: {0:n} MB\nРозмір файлів гри: {1:n} MB\nЕкономія місця: {2:n} MB",
"TrimXCIFileNoTrimNecessary": "XCI файл не потребує обрізання. Перевірте журнали для додаткової інформації",
"TrimXCIFileNoUntrimPossible": "XCI файл не може бути обрізаний. Перевірте журнали для додаткової інформації",
"TrimXCIFileReadOnlyFileCannotFix": "XCI файл Тільки для Читання і не може бути прочитаним. Перевірте журнали додаткової інформації",
"TrimXCIFileFileSizeChanged": "Розмір файлу XCI змінився з моменту сканування. Перевірте, чи не записується файл, та спробуйте знову",
"TrimXCIFileFreeSpaceCheckFailed": "Файл XCI містить дані в зоні вільного простору, тому обрізка небезпечна",
"TrimXCIFileInvalidXCIFile": "XCI Файл містить недійсні дані. Перевірте журнали для додаткової інформації",
"TrimXCIFileFileIOWriteError": "XCI Файл файл не вдалося відкрити для запису. Перевірте журнали для додаткової інформації",
"TrimXCIFileFailedPrimaryText": "Не вдалося обрізати файл XCI",
"TrimXCIFileCancelled": "Операція перервана",
"TrimXCIFileFileUndertermined": "Операція не проводилася",
"UserProfileWindowTitle": "Менеджер профілів користувачів",
"CheatWindowTitle": "Менеджер читів",
"DlcWindowTitle": "Менеджер вмісту для завантаження",
"ModWindowTitle": "Керувати модами для {0} ({1})",
"UpdateWindowTitle": "Менеджер оновлення назв",
"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",
"XCITrimmerSavingsMb": "{0:n0} Mb",
"XCITrimmerSelectDisplayed": "Select Shown",
"XCITrimmerDeselectDisplayed": "Deselect Shown",
"XCITrimmerSortName": "Title",
"XCITrimmerSortSaved": "Space Savings",
"XCITrimmerTrim": "Trim",
"XCITrimmerUntrim": "Untrim",
"UpdateWindowUpdateAddedMessage": "{0} new update(s) added",
"UpdateWindowBundledContentNotice": "Bundled updates cannot be removed, only disabled.",
"XCITrimmerWindowTitle": "Обрізка XCI Файлів",
"XCITrimmerTitleStatusCount": "{0} з {1} тайтл(ів) обрано",
"XCITrimmerTitleStatusCountWithFilter": "{0} з {1} тайтл(ів) обрано ({2} відображається)",
"XCITrimmerTitleStatusTrimming": "Обрізка {0} тайтл(ів)...",
"XCITrimmerTitleStatusUntrimming": "Необрізаних {0} тайтл(ів)...",
"XCITrimmerTitleStatusFailed": "Невдача",
"XCITrimmerPotentialSavings": "Потенційна економія",
"XCITrimmerActualSavings": "Зекономлено",
"XCITrimmerSavingsMb": "{0:n0} Мб",
"XCITrimmerSelectDisplayed": "Вибрати показане",
"XCITrimmerDeselectDisplayed": "Скасувати вибір показаного",
"XCITrimmerSortName": "Заголовок",
"XCITrimmerSortSaved": "Економія місця",
"XCITrimmerTrim": "Обрізка",
"XCITrimmerUntrim": "Зшивання",
"UpdateWindowUpdateAddedMessage": "{0} нове оновлення додано",
"UpdateWindowBundledContentNotice": "Вбудовані оновлення не можуть бути видалені, лише вимкнені.",
"CheatWindowHeading": "Коди доступні для {0} [{1}]",
"BuildId": "ID збірки:",
"DlcWindowBundledContentNotice": "Bundled DLC cannot be removed, only disabled.",
"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",
"AutoloadUpdateAddedMessage": "{0} new update(s) added",
"AutoloadUpdateRemovedMessage": "{0} missing update(s) removed",
"DlcWindowBundledContentNotice": "Вбудований DLC не може бути видаленим, лише вимкненим.",
"DlcWindowHeading": "{0} DLC доступно",
"DlcWindowDlcAddedMessage": "{0} нового завантажувального вмісту додано",
"AutoloadDlcAddedMessage": "{0} нового завантажувального вмісту додано",
"AutoloadDlcRemovedMessage": "{0} відсутнього завантажувального вмісту видалено",
"AutoloadUpdateAddedMessage": "{0} нових оновлень додано",
"AutoloadUpdateRemovedMessage": "{0} відсутніх оновлень видалено",
"ModWindowHeading": "{0} мод(ів)",
"UserProfilesEditProfile": "Редагувати вибране",
"Continue": "Continue",
"Continue": "Продовжити",
"Cancel": "Скасувати",
"Save": "Зберегти",
"Discard": "Скасувати",
@@ -832,7 +851,7 @@
"Name": "Назва",
"Size": "Розмір",
"Search": "Пошук",
"UserProfilesRecoverLostAccounts": "Відновлення втрачених облікових записів",
"UserProfilesRecoverLostAccounts": "Відновлення профілів",
"Recover": "Відновити",
"UserProfilesRecoverHeading": "Знайдено збереження для наступних облікових записів",
"UserProfilesRecoverEmptyList": "Немає профілів для відновлення",
@@ -864,15 +883,15 @@
"MultiplayerModeDisabled": "Вимкнено",
"MultiplayerModeLdnMitm": "ldn_mitm",
"MultiplayerModeLdnRyu": "RyuLDN",
"MultiplayerDisableP2P": "Disable P2P Network Hosting (may increase latency)",
"MultiplayerDisableP2PTooltip": "Disable P2P network hosting, peers will proxy through the master server instead of connecting to you directly.",
"LdnPassphrase": "Network Passphrase:",
"LdnPassphraseTooltip": "You will only be able to see hosted games with the same passphrase as you.",
"LdnPassphraseInputTooltip": "Enter a passphrase in the format Ryujinx-<8 hex chars>. You will only be able to see hosted games with the same passphrase as you.",
"LdnPassphraseInputPublic": "(public)",
"GenLdnPass": "Generate Random",
"GenLdnPassTooltip": "Generates a new passphrase, which can be shared with other players.",
"ClearLdnPass": "Clear",
"ClearLdnPassTooltip": "Clears the current passphrase, returning to the public network.",
"InvalidLdnPassphrase": "Invalid Passphrase! Must be in the format \"Ryujinx-<8 hex chars>\""
"MultiplayerDisableP2P": "Вимкнути хостинг P2P мережі (може збільшити затримку)",
"MultiplayerDisableP2PTooltip": "Вимкнути хостинг P2P мережі, піри будуть підключатися через майстер-сервер замість прямого з'єднання з вами.",
"LdnPassphrase": "Мережевий пароль:",
"LdnPassphraseTooltip": "Ви зможете бачити лише ті ігри, які мають такий самий пароль, як і у вас.",
"LdnPassphraseInputTooltip": "Введіть пароль у форматі Ryujinx-<8 символів>. Ви зможете бачити лише ті ігри, які мають такий самий пароль, як і у вас.",
"LdnPassphraseInputPublic": "(публічний)",
"GenLdnPass": "Згенерувати випадкову",
"GenLdnPassTooltip": "Генерує новий пароль, яким можна поділитися з іншими гравцями.",
"ClearLdnPass": "Очистити",
"ClearLdnPassTooltip": "Очищає поточну пароль, повертаючись до публічної мережі.",
"InvalidLdnPassphrase": "Невірний пароль! Має бути в форматі \"Ryujinx-<8 символів>\""
}

View File

@@ -44,6 +44,12 @@
"MenuBarViewWindow1080": "1080p",
"MenuBarHelp": "帮助(_H)",
"MenuBarHelpCheckForUpdates": "检查更新",
"MenuBarHelpFaq": "FAQ & Troubleshooting Page",
"MenuBarHelpFaqTooltip": "Opens the FAQ and Troubleshooting page on the official Ryujinx wiki",
"MenuBarHelpSetup": "Setup & Configuration Guide",
"MenuBarHelpSetupTooltip": "Opens the Setup & Configuration guide on the official Ryujinx wiki",
"MenuBarHelpMultiplayer": "Multiplayer (LDN/LAN) Guide",
"MenuBarHelpMultiplayerTooltip": "Opens the Multiplayer guide on the official Ryujinx wiki",
"MenuBarHelpAbout": "关于",
"MenuSearch": "搜索…",
"GameListHeaderFavorite": "收藏",

View File

@@ -44,6 +44,12 @@
"MenuBarViewWindow1080": "1080p",
"MenuBarHelp": "說明(_H)",
"MenuBarHelpCheckForUpdates": "檢查更新",
"MenuBarHelpFaq": "FAQ & Troubleshooting Page",
"MenuBarHelpFaqTooltip": "Opens the FAQ and Troubleshooting page on the official Ryujinx wiki",
"MenuBarHelpSetup": "Setup & Configuration Guide",
"MenuBarHelpSetupTooltip": "Opens the Setup & Configuration guide on the official Ryujinx wiki",
"MenuBarHelpMultiplayer": "Multiplayer (LDN/LAN) Guide",
"MenuBarHelpMultiplayerTooltip": "Opens the Multiplayer guide on the official Ryujinx wiki",
"MenuBarHelpAbout": "關於",
"MenuSearch": "搜尋...",
"GameListHeaderFavorite": "我的最愛",

View File

@@ -1,361 +0,0 @@
using DiscordRPC;
using LibHac.Tools.FsSystem;
using Ryujinx.Audio.Backends.SDL2;
using Ryujinx.Ava;
using Ryujinx.Common.Configuration;
using Ryujinx.Common.Configuration.Hid;
using Ryujinx.Common.Configuration.Hid.Controller;
using Ryujinx.Common.Configuration.Hid.Controller.Motion;
using Ryujinx.Common.Configuration.Hid.Keyboard;
using Ryujinx.Common.Logging;
using Ryujinx.Common.Utilities;
using Ryujinx.Graphics.GAL;
using Ryujinx.Graphics.GAL.Multithreading;
using Ryujinx.Graphics.OpenGL;
using Ryujinx.Graphics.Vulkan;
using Ryujinx.HLE;
using Ryujinx.Input;
using Ryujinx.UI.Common;
using Ryujinx.UI.Common.Configuration;
using Silk.NET.Vulkan;
using System;
using System.IO;
using System.Text.Json;
using System.Threading.Tasks;
using ConfigGamepadInputId = Ryujinx.Common.Configuration.Hid.Controller.GamepadInputId;
using ConfigStickInputId = Ryujinx.Common.Configuration.Hid.Controller.StickInputId;
using Key = Ryujinx.Common.Configuration.Hid.Key;
namespace Ryujinx.Headless
{
public partial class HeadlessRyujinx
{
public static void Initialize()
{
// Ensure Discord presence timestamp begins at the absolute start of when Ryujinx is launched
DiscordIntegrationModule.StartedAt = Timestamps.Now;
// Delete backup files after updating.
Task.Run(Updater.CleanupUpdate);
// Hook unhandled exception and process exit events.
AppDomain.CurrentDomain.UnhandledException += (sender, e)
=> Program.ProcessUnhandledException(sender, e.ExceptionObject as Exception, e.IsTerminating);
AppDomain.CurrentDomain.ProcessExit += (_, _) => Program.Exit();
// Initialize the configuration.
ConfigurationState.Initialize();
// Initialize Discord integration.
DiscordIntegrationModule.Initialize();
// Logging system information.
Program.PrintSystemInfo();
}
private static InputConfig HandlePlayerConfiguration(string inputProfileName, string inputId, PlayerIndex index)
{
if (inputId == null)
{
if (index == PlayerIndex.Player1)
{
Logger.Info?.Print(LogClass.Application, $"{index} not configured, defaulting to default keyboard.");
// Default to keyboard
inputId = "0";
}
else
{
Logger.Info?.Print(LogClass.Application, $"{index} not configured");
return null;
}
}
IGamepad gamepad = _inputManager.KeyboardDriver.GetGamepad(inputId);
bool isKeyboard = true;
if (gamepad == null)
{
gamepad = _inputManager.GamepadDriver.GetGamepad(inputId);
isKeyboard = false;
if (gamepad == null)
{
Logger.Error?.Print(LogClass.Application, $"{index} gamepad not found (\"{inputId}\")");
return null;
}
}
string gamepadName = gamepad.Name;
gamepad.Dispose();
InputConfig config;
if (inputProfileName == null || inputProfileName.Equals("default"))
{
if (isKeyboard)
{
config = new StandardKeyboardInputConfig
{
Version = InputConfig.CurrentVersion,
Backend = InputBackendType.WindowKeyboard,
Id = null,
ControllerType = ControllerType.JoyconPair,
LeftJoycon = new LeftJoyconCommonConfig<Key>
{
DpadUp = Key.Up,
DpadDown = Key.Down,
DpadLeft = Key.Left,
DpadRight = Key.Right,
ButtonMinus = Key.Minus,
ButtonL = Key.E,
ButtonZl = Key.Q,
ButtonSl = Key.Unbound,
ButtonSr = Key.Unbound,
},
LeftJoyconStick = new JoyconConfigKeyboardStick<Key>
{
StickUp = Key.W,
StickDown = Key.S,
StickLeft = Key.A,
StickRight = Key.D,
StickButton = Key.F,
},
RightJoycon = new RightJoyconCommonConfig<Key>
{
ButtonA = Key.Z,
ButtonB = Key.X,
ButtonX = Key.C,
ButtonY = Key.V,
ButtonPlus = Key.Plus,
ButtonR = Key.U,
ButtonZr = Key.O,
ButtonSl = Key.Unbound,
ButtonSr = Key.Unbound,
},
RightJoyconStick = new JoyconConfigKeyboardStick<Key>
{
StickUp = Key.I,
StickDown = Key.K,
StickLeft = Key.J,
StickRight = Key.L,
StickButton = Key.H,
},
};
}
else
{
bool isNintendoStyle = gamepadName.Contains("Nintendo");
config = new StandardControllerInputConfig
{
Version = InputConfig.CurrentVersion,
Backend = InputBackendType.GamepadSDL2,
Id = null,
ControllerType = ControllerType.JoyconPair,
DeadzoneLeft = 0.1f,
DeadzoneRight = 0.1f,
RangeLeft = 1.0f,
RangeRight = 1.0f,
TriggerThreshold = 0.5f,
LeftJoycon = new LeftJoyconCommonConfig<ConfigGamepadInputId>
{
DpadUp = ConfigGamepadInputId.DpadUp,
DpadDown = ConfigGamepadInputId.DpadDown,
DpadLeft = ConfigGamepadInputId.DpadLeft,
DpadRight = ConfigGamepadInputId.DpadRight,
ButtonMinus = ConfigGamepadInputId.Minus,
ButtonL = ConfigGamepadInputId.LeftShoulder,
ButtonZl = ConfigGamepadInputId.LeftTrigger,
ButtonSl = ConfigGamepadInputId.Unbound,
ButtonSr = ConfigGamepadInputId.Unbound,
},
LeftJoyconStick = new JoyconConfigControllerStick<ConfigGamepadInputId, ConfigStickInputId>
{
Joystick = ConfigStickInputId.Left,
StickButton = ConfigGamepadInputId.LeftStick,
InvertStickX = false,
InvertStickY = false,
Rotate90CW = false,
},
RightJoycon = new RightJoyconCommonConfig<ConfigGamepadInputId>
{
ButtonA = isNintendoStyle ? ConfigGamepadInputId.A : ConfigGamepadInputId.B,
ButtonB = isNintendoStyle ? ConfigGamepadInputId.B : ConfigGamepadInputId.A,
ButtonX = isNintendoStyle ? ConfigGamepadInputId.X : ConfigGamepadInputId.Y,
ButtonY = isNintendoStyle ? ConfigGamepadInputId.Y : ConfigGamepadInputId.X,
ButtonPlus = ConfigGamepadInputId.Plus,
ButtonR = ConfigGamepadInputId.RightShoulder,
ButtonZr = ConfigGamepadInputId.RightTrigger,
ButtonSl = ConfigGamepadInputId.Unbound,
ButtonSr = ConfigGamepadInputId.Unbound,
},
RightJoyconStick = new JoyconConfigControllerStick<ConfigGamepadInputId, ConfigStickInputId>
{
Joystick = ConfigStickInputId.Right,
StickButton = ConfigGamepadInputId.RightStick,
InvertStickX = false,
InvertStickY = false,
Rotate90CW = false,
},
Motion = new StandardMotionConfigController
{
MotionBackend = MotionInputBackendType.GamepadDriver,
EnableMotion = true,
Sensitivity = 100,
GyroDeadzone = 1,
},
Rumble = new RumbleConfigController
{
StrongRumble = 1f,
WeakRumble = 1f,
EnableRumble = false,
},
};
}
}
else
{
string profileBasePath;
if (isKeyboard)
{
profileBasePath = Path.Combine(AppDataManager.ProfilesDirPath, "keyboard");
}
else
{
profileBasePath = Path.Combine(AppDataManager.ProfilesDirPath, "controller");
}
string path = Path.Combine(profileBasePath, inputProfileName + ".json");
if (!File.Exists(path))
{
Logger.Error?.Print(LogClass.Application, $"Input profile \"{inputProfileName}\" not found for \"{inputId}\"");
return null;
}
try
{
config = JsonHelper.DeserializeFromFile(path, _serializerContext.InputConfig);
}
catch (JsonException)
{
Logger.Error?.Print(LogClass.Application, $"Input profile \"{inputProfileName}\" parsing failed for \"{inputId}\"");
return null;
}
}
config.Id = inputId;
config.PlayerIndex = index;
string inputTypeName = isKeyboard ? "Keyboard" : "Gamepad";
Logger.Info?.Print(LogClass.Application, $"{config.PlayerIndex} configured with {inputTypeName} \"{config.Id}\"");
// If both stick ranges are 0 (usually indicative of an outdated profile load) then both sticks will be set to 1.0.
if (config is StandardControllerInputConfig controllerConfig)
{
if (controllerConfig.RangeLeft <= 0.0f && controllerConfig.RangeRight <= 0.0f)
{
controllerConfig.RangeLeft = 1.0f;
controllerConfig.RangeRight = 1.0f;
Logger.Info?.Print(LogClass.Application, $"{config.PlayerIndex} stick range reset. Save the profile now to update your configuration");
}
}
return config;
}
private static IRenderer CreateRenderer(Options options, WindowBase window)
{
if (options.GraphicsBackend == GraphicsBackend.Vulkan && window is VulkanWindow vulkanWindow)
{
string preferredGpuId = string.Empty;
Vk api = Vk.GetApi();
if (!string.IsNullOrEmpty(options.PreferredGPUVendor))
{
string preferredGpuVendor = options.PreferredGPUVendor.ToLowerInvariant();
var devices = VulkanRenderer.GetPhysicalDevices(api);
foreach (var device in devices)
{
if (device.Vendor.ToLowerInvariant() == preferredGpuVendor)
{
preferredGpuId = device.Id;
break;
}
}
}
return new VulkanRenderer(
api,
(instance, vk) => new SurfaceKHR((ulong)(vulkanWindow.CreateWindowSurface(instance.Handle))),
vulkanWindow.GetRequiredInstanceExtensions,
preferredGpuId);
}
return new OpenGLRenderer();
}
private static Switch InitializeEmulationContext(WindowBase window, IRenderer renderer, Options options)
{
BackendThreading threadingMode = options.BackendThreading;
bool threadedGAL = threadingMode == BackendThreading.On || (threadingMode == BackendThreading.Auto && renderer.PreferThreading);
if (threadedGAL)
{
renderer = new ThreadedRenderer(renderer);
}
HLEConfiguration configuration = new(_virtualFileSystem,
_libHacHorizonManager,
_contentManager,
_accountManager,
_userChannelPersistence,
renderer,
new SDL2HardwareDeviceDriver(),
options.DramSize,
window,
options.SystemLanguage,
options.SystemRegion,
options.VSyncMode,
!options.DisableDockedMode,
!options.DisablePTC,
options.EnableInternetAccess,
!options.DisableFsIntegrityChecks ? IntegrityCheckLevel.ErrorOnInvalid : IntegrityCheckLevel.None,
options.FsGlobalAccessLogMode,
options.SystemTimeOffset,
options.SystemTimeZone,
options.MemoryManagerMode,
options.IgnoreMissingServices,
options.AspectRatio,
options.AudioVolume,
options.UseHypervisor ?? true,
options.MultiplayerLanInterfaceId,
Common.Configuration.Multiplayer.MultiplayerMode.Disabled,
false,
string.Empty,
string.Empty,
options.CustomVSyncInterval);
return new Switch(configuration);
}
}
}

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.9 KiB

View File

@@ -14,7 +14,6 @@ using Ryujinx.Common.GraphicsDriver;
using Ryujinx.Common.Logging;
using Ryujinx.Common.SystemInterop;
using Ryujinx.Graphics.Vulkan.MoltenVK;
using Ryujinx.Headless;
using Ryujinx.SDL2.Common;
using Ryujinx.UI.App.Common;
using Ryujinx.UI.Common;
@@ -54,12 +53,6 @@ namespace Ryujinx.Ava
PreviewerDetached = true;
if (args.Length > 0 && args[0] is "--no-gui" or "nogui")
{
HeadlessRyujinx.Entrypoint(args[1..]);
return 0;
}
Initialize(args);
LoggerAdapter.Register();
@@ -229,7 +222,7 @@ namespace Ryujinx.Ava
UseHardwareAcceleration = CommandLineState.OverrideHardwareAcceleration.Value;
}
internal static void PrintSystemInfo()
private static void PrintSystemInfo()
{
Logger.Notice.Print(LogClass.Application, $"{App.FullAppName} Version: {Version}");
SystemInfo.Gather().Print();
@@ -246,7 +239,7 @@ namespace Ryujinx.Ava
: $"Launch Mode: {AppDataManager.Mode}");
}
internal static void ProcessUnhandledException(object sender, Exception ex, bool isTerminating)
private static void ProcessUnhandledException(object sender, Exception ex, bool isTerminating)
{
Logger.Log log = Logger.Error ?? Logger.Notice;
string message = $"Unhandled exception caught: {ex}";
@@ -261,7 +254,7 @@ namespace Ryujinx.Ava
Exit();
}
internal static void Exit()
public static void Exit()
{
DiscordIntegrationModule.Exit();

View File

@@ -43,7 +43,6 @@
<PackageReference Include="Avalonia.Markup.Xaml.Loader" />
<PackageReference Include="Avalonia.Svg" />
<PackageReference Include="Avalonia.Svg.Skia" />
<PackageReference Include="CommandLineParser" />
<PackageReference Include="DynamicData" />
<PackageReference Include="FluentAvaloniaUI" />
<PackageReference Include="Projektanker.Icons.Avalonia" />
@@ -163,7 +162,6 @@
<EmbeddedResource Include="Assets\Icons\Controller_JoyConPair.svg" />
<EmbeddedResource Include="Assets\Icons\Controller_JoyConRight.svg" />
<EmbeddedResource Include="Assets\Icons\Controller_ProCon.svg" />
<EmbeddedResource Include="Headless\Ryujinx.bmp" LogicalName="HeadlessLogo" />
</ItemGroup>
<ItemGroup>
<AdditionalFiles Include="Assets\Locales\en_US.json" />

Binary file not shown.

Before

Width:  |  Height:  |  Size: 177 KiB

After

Width:  |  Height:  |  Size: 189 KiB

View File

@@ -125,7 +125,7 @@ namespace Ryujinx.Ava.UI.ViewModels
public IEnumerable<LdnGameData> LastLdnGameData;
public static readonly Bitmap IconBitmap =
new(Assembly.GetAssembly(typeof(ConfigurationState))!.GetManifestResourceStream("Ryujinx.UI.Common.Resources.Logo_Ryujinx.png")!);
new(Assembly.GetAssembly(typeof(ConfigurationState))!.GetManifestResourceStream("Ryujinx.UI.Common.Resources.Logo_Thiccjinx.png")!);
public MainWindow Window { get; init; }

View File

@@ -14,14 +14,14 @@
<DockPanel HorizontalAlignment="Stretch">
<Image
Name="RyuLogo"
Margin="7,0"
Margin="7, 0"
Height="25"
Width="25"
ToolTip.Tip="{Binding Title}"
Source="resm:Ryujinx.UI.Common.Resources.Logo_Ryujinx.png?assembly=Ryujinx.UI.Common" />
Source="resm:Ryujinx.UI.Common.Resources.Logo_Thiccjinx.png?assembly=Ryujinx.UI.Common" />
<Menu
Name="Menu"
Height="35"
Height="32"
Margin="0"
HorizontalAlignment="Left"
IsOpen="{Binding IsSubMenuOpen, Mode=OneWayToSource}">
@@ -290,6 +290,25 @@
Icon="{ext:Icon mdi-update}"
ToolTip.Tip="{ext:Locale CheckUpdatesTooltip}" />
<Separator />
<MenuItem
Click="MenuItem_OnClick"
Header="{ext:Locale MenuBarHelpFaq}"
Icon="{ext:Icon fa-github}"
Tag="https://github.com/GreemDev/Ryujinx/wiki/FAQ-and-Troubleshooting"
ToolTip.Tip="{ext:Locale MenuBarHelpFaqTooltip}" />
<MenuItem
Click="MenuItem_OnClick"
Header="{ext:Locale MenuBarHelpSetup}"
Icon="{ext:Icon fa-github}"
Tag="https://github.com/GreemDev/Ryujinx/wiki/Ryujinx-Setup-&amp;-Configuration-Guide"
ToolTip.Tip="{ext:Locale MenuBarHelpSetupTooltip}" />
<MenuItem
Click="MenuItem_OnClick"
Header="{ext:Locale MenuBarHelpMultiplayer}"
Icon="{ext:Icon fa-github}"
Tag="https://github.com/GreemDev/Ryujinx/wiki/Multiplayer%E2%80%90(LDN%E2%80%90Local%E2%80%90Wireless)%E2%80%90Guide"
ToolTip.Tip="{ext:Locale MenuBarHelpMultiplayerTooltip}" />
<Separator />
<MenuItem
Click="OpenAboutWindow"
Header="{ext:Locale MenuBarHelpAbout}"

View File

@@ -222,6 +222,12 @@ namespace Ryujinx.Ava.UI.Views.Main
await Updater.BeginUpdateAsync(true);
}
private void MenuItem_OnClick(object sender, RoutedEventArgs e)
{
if (sender is MenuItem { Tag: string url })
OpenHelper.OpenUrl(url);
}
public async void OpenXCITrimmerWindow(object sender, RoutedEventArgs e) => await XCITrimmerWindow.Show(ViewModel);
public async void OpenAboutWindow(object sender, RoutedEventArgs e) => await AboutWindow.Show();

View File

@@ -36,7 +36,8 @@
HorizontalAlignment="Center"
Spacing="10">
<Image
Height="80"
Height="90"
Width="90"
Source="resm:Ryujinx.UI.Common.Resources.Logo_Ryujinx.png?assembly=Ryujinx.UI.Common"
HorizontalAlignment="Center"
IsHitTestVisible="True" />