Compare commits

..

8 Commits

Author SHA1 Message Date
Evan Husted
2cd54d0da0 Remove icon padding 2024-12-14 08:03:17 -06:00
Evan Husted
b97b8ca8f5 Logo from PR #381 everywhere 2024-12-14 07:27:07 -06:00
Matteo Forlani
d7d4225e0d New macOS icon (#381) 2024-12-14 07:23:47 -06:00
Evan Husted
a9e0fac9dc fix changelogs in canary release 2024-12-13 19:28:34 -06:00
Daenorth
1b9656e960 Norwegian Translation (#338) 2024-12-13 03:56:20 -06:00
Hack茶ん
8994e7476c Korean Former Maintainers & About description translations (#371) 2024-12-13 03:54:07 -06:00
rrondo
b3944a18b7 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-10 11:58:53 -06:00
GabCoolGuy
18c957f90b 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-10 11:02:18 -06:00
35 changed files with 2325 additions and 1539 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

@@ -29,7 +29,7 @@
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;
@@ -158,16 +157,21 @@ namespace Ryujinx.Common.Logging
_time.Restart();
}
private static ILogTarget GetTarget(string targetName)
=> _logTargets.FirstOrDefault(target => target.Name.Equals(targetName));
private static ILogTarget GetTarget(string 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,168 +1,13 @@
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:");
@@ -88,81 +105,239 @@ namespace Ryujinx.Headless
errors.ForEach(err => Logger.Error?.PrintMsg(LogClass.Application, $" - {err.Tag}"));
});
}
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);
string configurationPath = null;
// Now load the configuration as the other subsystems are now registered
if (customConfigPath != null && File.Exists(customConfigPath))
if (inputId == null)
{
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);
}
else
{
Logger.Notice.Print(LogClass.Application, $"Loading configuration from: {configurationPath}");
if (ConfigurationFileFormat.TryLoad(configurationPath, out ConfigurationFileFormat configurationFileFormat))
if (index == PlayerIndex.Player1)
{
ConfigurationState.Instance.Load(configurationFileFormat, configurationPath);
Logger.Info?.Print(LogClass.Application, $"{index} not configured, defaulting to default keyboard.");
// Default to keyboard
inputId = "0";
}
else
{
Logger.Warning?.PrintMsg(LogClass.Application, $"Failed to load config! Loading the default config instead.\nFailed config location: {configurationPath}");
Logger.Info?.Print(LogClass.Application, $"{index} not configured");
ConfigurationState.Instance.LoadDefault();
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;
}
static void Load(string[] originalArgs, Options option)
static void Load(Options option)
{
Initialize();
bool useLastUsedProfile = false;
if (option.InheritConfig)
{
option.InheritMainConfig(originalArgs, ConfigurationState.Instance, out useLastUsedProfile);
}
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;
@@ -233,9 +410,9 @@ namespace Ryujinx.Headless
_inputConfiguration.Add(inputConfig);
}
}
LoadPlayerConfiguration(option.InputProfile1Name, option.InputId1, PlayerIndex.Player1);
LoadPlayerConfiguration(option.InputProfile2Name, option.InputId2, PlayerIndex.Player2);
LoadPlayerConfiguration(option.InputProfile2Name, option.InputId2, PlayerIndex.Player2);
LoadPlayerConfiguration(option.InputProfile3Name, option.InputId3, PlayerIndex.Player3);
LoadPlayerConfiguration(option.InputProfile4Name, option.InputId4, PlayerIndex.Player4);
LoadPlayerConfiguration(option.InputProfile5Name, option.InputId5, PlayerIndex.Player5);
@@ -243,7 +420,6 @@ namespace Ryujinx.Headless
LoadPlayerConfiguration(option.InputProfile7Name, option.InputId7, PlayerIndex.Player7);
LoadPlayerConfiguration(option.InputProfile8Name, option.InputId8, PlayerIndex.Player8);
LoadPlayerConfiguration(option.InputProfileHandheldName, option.InputIdHandheld, PlayerIndex.Handheld);
if (_inputConfiguration.Count == 0)
{
@@ -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

View File

@@ -555,9 +555,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,785 @@
{
"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",
"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"
}

File diff suppressed because it is too large Load Diff

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;
@@ -53,15 +52,9 @@ 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();
IconProvider.Current
@@ -113,7 +106,7 @@ namespace Ryujinx.Ava
AppDomain.CurrentDomain.UnhandledException += (sender, e)
=> ProcessUnhandledException(sender, e.ExceptionObject as Exception, e.IsTerminating);
AppDomain.CurrentDomain.ProcessExit += (_, _) => Exit();
// Setup base data directory.
AppDataManager.Initialize(CommandLineState.BaseDirPathArg);
@@ -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

@@ -14,9 +14,9 @@
<DockPanel HorizontalAlignment="Stretch">
<Image
Name="RyuLogo"
Margin="7,0"
Height="25"
Width="25"
Margin="2, 1,-1, 0"
Height="36"
Width="36"
ToolTip.Tip="{Binding Title}"
Source="resm:Ryujinx.UI.Common.Resources.Logo_Ryujinx.png?assembly=Ryujinx.UI.Common" />
<Menu

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" />