Compare commits

..

16 Commits

Author SHA1 Message Date
AllieNeedsSleep
e7a3c94b9c Discord RPC grammatical changes (#139)
Adjusted wording used in Discord RPC for clarity.

Co-authored-by: Allie <barstaxjolster@gmail.com>
Co-authored-by: sh0inx <randomgirlisweird@gmail.com>
Reviewed-on: https://git.ryujinx.app/projects/Ryubing/pulls/139
2026-06-14 22:13:59 +00:00
_Neo_
223f20868a UI: File Menu → General Improvements (#127)
Ayyyy, welcome to the UI: File Menu → General Improvements PR!

Wooo, we progressing smoothly!

This PR introduces small visual and "feature" improvements to the `File` menu.

### LOCALISATION:
* **Fractured:** More locales:
    * `Dialog_ContentLoading.json` - content loading dialogs (Updates/DLC)
    * `Dialog_FileTypeAssociations` - file association dialogs
    * `Dialog_FileMenu` - File menu dialog strings (complements `MenuBar_File.json`)
* **Added:** Additional entires to `Error.json`
* **Populated:** `MenuBar_File.json`

### FILE MENU:
* **Added:** Keyboard shortcuts to `Load Application` and `Load Unpacked Game`
    * Cmd + O/Ctrl + O and Cmd + Shift + O/Ctrl + Shift + O for macOS and other OS, respectively.
    * While many users rely on autoloaded game directories, manually opening content remains a common workflow (for those that don't rely on autoload directories).
* **Merged:** `Load Title Updates` and `Load DLC` → `Load Updates/DLC`
    * Both actions follow the same workflow: selecting one or more directories and allowing Ryujinx to load the content.
    * To reduce redundancy, they have been consolidated into a single menu item that loads both Updates and DLC simultaneously, mirroring the behavior of the existing autoload functionality.
    * As part of this change, Title Updates has been simplified to Updates for consistency with the rest of the UI. The remaining reference in the Game List context menu has also been updated from `Manage Title Updates` to `Manage Updates`.
* **Added/Updated:** File picker titles for content loading actions
    * `Load Application`: Select a Switch application file to load
    * `Load Unpacked Game`: Select a folder containing an unpacked Switch application to load
    * `Load Updates/DLC`: Select one or more folders to bulk load updates and DLC from
* **Improved:** `Associate File Types` and `Remove File Type Associations` (initially moved to the `File` menu in #42)
    * These options were previously nested under `Manage File Types` and exposed as `Install File Types` and `Uninstall File Types`. The submenu added unnecessary navigation, while the action names did not clearly communicate their purpose.
    * The two actions have been replaced with a single dynamic menu item, whose displayed and performed action updates based on the current association state. The respective icons have been added as well (imported namespace Projektanker.Icons to allow for dynamic switching):
        * Link → `Associate File Types`
        * Link-Slash →`Remove File Type Associations`
    * A tooltip has also been added to clarify the action being performed.
    * This option is only usable when a game is not running (why associate file types when running a game? Play the game!)
    * **Note:** These options are only available on Windows and Linux. macOS already provides robust per‑file “Open With” handling, so a custom association system isn’t necessary. Support can be added later if needed, but current macOS limitations in Ryujinx prevent certain behaviors; these will be addressed in future PRs.
* **Updated:** Menu Icons
    * Several icons have been updated to better reflect their associated actions and improve consistency throughout the menu:
        * `Load Updates/DLC...` now uses a single Inbox Tray icon instead of separate Update and DLC icons.
        * `Open Ryujinx Folder`, `Open Logs Folder`, and `Open Screenshots Folder` now share the same folder icon, as all three actions ultimately open a folder/directory.
        * `Exit` is now an Exit icon (arrow-right-from-bracket) instead of a Power button.

### OTHER:
* **Improved:** `Load Updates/DLC` dialog messages
    * Existing dialog messages were longer than necessary and included terms such as "missing" updates and "new" DLC.
    * These messages have been simplified and standardized:
        * Updates Added: {0} or Updates Removed: {0}
        * DLC Added: {0} or DLC Removed: {0}

_If there are any features or changes that you wish to be implemented, please comment down below and I'll be happy to accommodate!_

A GIGANTIC, ENORMOUSE HUUUUUUGEE thank you to @Babib3l for testing this and ensuring the commands work! WOOOOO!!!

Reviewed-on: https://git.ryujinx.app/projects/Ryubing/pulls/127
2026-06-14 19:47:20 +00:00
_Neo_
8fe1a9c672 UI: Options Menu (Part 1 of 2) → General Improvements (#133)
Ayyyy, welcome to the UI: Options Menu → General Improvements PR!

We cruisin'!

This is the first PR of a small series aimed at improving the `Options` menu and related submenus.

This initial PR focuses on smaller visual and navigational improvements to the main `Options` menu. As this is part of a progressive series (two PRs _for now_), further bug fixes and refinements may be present in Part 2. Additionally, as the `View` menu is related to some of the changes presents in this PR, it has also received minor adjustments (see details below).

### LOCALISATION
* **Fractured:**
    * `MenuBar_Options.json` - `Options` menu locales
    * `MenuBar_View.json` - `View` menu locales
    * `Settings_Interface.json` - Interface `Settings` tab locales (UI-only)
* **Added:** Missing "e" in Italian translation of `User Profiles` (thank you BOBBIJDJ for pointing it out!)

**NOTE:** `MenuBar_View.json` and `Settings_Interface.json` were not populated in this PR.

### OPTIONS MENU
* **Moved:** `Toggle Fullscreen` to the `View` menu.
    * This option affects the current window/view state, so it belongs under `View` rather than `Options`.
* **Moved:** `Show Console` checkbox to the `View` menu.
    * Even though it was previously under `Options`, this is a real-time visibility toggle. It affects Ryujinx "immediately" (shows/hides the console window, and as immediately as you can get with our current implementation), so it fits better alongside other current view controls like `Toggle Fullscreen` and the `Window Size` presets.
* **Moved:** `Start Games in Fullscreen` and `Start Games Without UI` (renamed to "Hide UI on Game Start" for better flow) from the `Options` menu to the `Interface` tab in `Settings`.
    * These are persistent launch preferences rather than actions that can affect just the current session. Settings is the semantically correct location for them. They now sit alongside other launch-related options such as `Confirm Game Shutdown`.
    * Their respective locales were transferred to the newly created `Settings_Interface.json`.
* **Renamed:** `Change Language` → `Language`
    * Made consistent with the shorter style used by other items in this menu in previous cleanups.
* **Modified:** Menu item order (see images below).

### VIEW MENU
The `View` menu received only light adjustments in this PR (mainly padding/margins to better fit the newly added `Show Console` checkbox ). A dedicated _View Menu_ follow-up PR is planned to reorganise it further and add new options. Furthermore, _Options Menu (Part 2 of 2)_ will follow shortly as well.

_If there are any features or changes that you wish to be implemented, please comment down below and I'll be happy to accommodate!_

Reviewed-on: https://git.ryujinx.app/projects/Ryubing/pulls/133
2026-06-14 19:21:25 +00:00
Renovate Bot
aad1a71f68 Update dependency Sep to 0.15.0 (#137)
This PR contains the following updates:

| Package | Change | [Age](https://docs.renovatebot.com/merge-confidence/) | [Confidence](https://docs.renovatebot.com/merge-confidence/) |
|---|---|---|---|
| [Sep](https://github.com/nietras/Sep) | `0.14.1` → `0.15.0` | ![age](https://developer.mend.io/api/mc/badges/age/nuget/Sep/0.15.0?slim=true) | ![confidence](https://developer.mend.io/api/mc/badges/confidence/nuget/Sep/0.14.1/0.15.0?slim=true) |

---

### Release Notes

<details>
<summary>nietras/Sep (Sep)</summary>

### [`v0.15.0`](https://github.com/nietras/Sep/releases/tag/v0.15.0): 0.15.0

#### What's Changed

Minor breaking changes to API parameter names.

- Bump actions/setup-dotnet from 5.2.0 to 5.3.0 by [@&#8203;dependabot](https://github.com/dependabot)\[bot] in [#&#8203;545](https://github.com/nietras/Sep/pull/545)
- Bump github/codeql-action from 4.35.3 to 4.36.0 by [@&#8203;dependabot](https://github.com/dependabot)\[bot] in [#&#8203;544](https://github.com/nietras/Sep/pull/544)
- Bump codecov/codecov-action from 6.0.0 to 6.0.1 by [@&#8203;dependabot](https://github.com/dependabot)\[bot] in [#&#8203;547](https://github.com/nietras/Sep/pull/547)
- Bump coverlet.collector from 10.0.0 to 10.0.1 by [@&#8203;dependabot](https://github.com/dependabot)\[bot] in [#&#8203;549](https://github.com/nietras/Sep/pull/549)
- Bump actions/dependency-review-action from 4.9.0 to 5.0.0 by [@&#8203;dependabot](https://github.com/dependabot)\[bot] in [#&#8203;548](https://github.com/nietras/Sep/pull/548)
- Bump step-security/harden-runner from 2.19.1 to 2.19.4 by [@&#8203;dependabot](https://github.com/dependabot)\[bot] in [#&#8203;546](https://github.com/nietras/Sep/pull/546)
- Bump MSTest from 4.2.2 to 4.2.3 by [@&#8203;dependabot](https://github.com/dependabot)\[bot] in [#&#8203;550](https://github.com/nietras/Sep/pull/550)
- Fix typos: `degreeOfParallism` parameter name and missing quote in exception message by [@&#8203;Copilot](https://github.com/Copilot) in [#&#8203;551](https://github.com/nietras/Sep/pull/551)
- Remove unnessary `unsafe` usage by [@&#8203;nietras](https://github.com/nietras) in [#&#8203;552](https://github.com/nietras/Sep/pull/552)
- Address and remove TODOs by [@&#8203;nietras](https://github.com/nietras) in [#&#8203;554](https://github.com/nietras/Sep/pull/554)
- Fix Reader Spec forwarding, SepWriter dispose and README nits, expand tests by [@&#8203;nietras](https://github.com/nietras) in [#&#8203;555](https://github.com/nietras/Sep/pull/555)
- Bump github/codeql-action from 4.36.0 to 4.36.2 by [@&#8203;dependabot](https://github.com/dependabot)\[bot] in [#&#8203;558](https://github.com/nietras/Sep/pull/558)
- Bump actions/checkout from 6.0.2 to 6.0.3 by [@&#8203;dependabot](https://github.com/dependabot)\[bot] in [#&#8203;556](https://github.com/nietras/Sep/pull/556)
- Bump codecov/codecov-action from 6.0.1 to 7.0.0 by [@&#8203;dependabot](https://github.com/dependabot)\[bot] in [#&#8203;557](https://github.com/nietras/Sep/pull/557)

**Full Changelog**: <https://github.com/nietras/Sep/compare/v0.14.1...v0.15.0>

</details>

---

### Configuration

📅 **Schedule**: (UTC)

- Branch creation
  - At any time (no schedule defined)
- Automerge
  - At any time (no schedule defined)

🚦 **Automerge**: Disabled by config. Please merge this manually once you are satisfied.

♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about this update again.

---

 - [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check this box

---

This PR has been generated by [Mend Renovate](https://github.com/renovatebot/renovate).
<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0My4xNzguMCIsInVwZGF0ZWRJblZlciI6IjQzLjE3OC4wIiwidGFyZ2V0QnJhbmNoIjoibWFzdGVyIiwibGFiZWxzIjpbXX0=-->

Reviewed-on: https://git.ryujinx.app/projects/Ryubing/pulls/137
2026-06-14 18:59:33 +00:00
Renovate Bot
25120667f1 Update dependency Microsoft.IdentityModel.JsonWebTokens to 8.19.1 (#136)
This PR contains the following updates:

| Package | Change | [Age](https://docs.renovatebot.com/merge-confidence/) | [Confidence](https://docs.renovatebot.com/merge-confidence/) |
|---|---|---|---|
| [Microsoft.IdentityModel.JsonWebTokens](https://github.com/AzureAD/azure-activedirectory-identitymodel-extensions-for-dotnet) | `8.18.0` → `8.19.1` | ![age](https://developer.mend.io/api/mc/badges/age/nuget/Microsoft.IdentityModel.JsonWebTokens/8.19.1?slim=true) | ![confidence](https://developer.mend.io/api/mc/badges/confidence/nuget/Microsoft.IdentityModel.JsonWebTokens/8.18.0/8.19.1?slim=true) |

---

### Release Notes

<details>
<summary>AzureAD/azure-activedirectory-identitymodel-extensions-for-dotnet (Microsoft.IdentityModel.JsonWebTokens)</summary>

### [`v8.19.1`](https://github.com/AzureAD/azure-activedirectory-identitymodel-extensions-for-dotnet/blob/HEAD/CHANGELOG.md#8191)

[Compare Source](https://github.com/AzureAD/azure-activedirectory-identitymodel-extensions-for-dotnet/compare/8.19.0...8.19.1)

\====

#### Bug Fixes

- Update `JwtSecurityTokenHandler` for `IssuerSigningKeyResolverUsingConfiguration` to take priority over `IssuerSigningKeyResolver`, matching the documented contract and the correct behavior already present in `JsonWebTokenHandler`. See [PR #&#8203;3519](https://github.com/AzureAD/azure-activedirectory-identitymodel-extensions-for-dotnet/pull/3519).

### [`v8.19.0`](https://github.com/AzureAD/azure-activedirectory-identitymodel-extensions-for-dotnet/blob/HEAD/CHANGELOG.md#8190)

[Compare Source](https://github.com/AzureAD/azure-activedirectory-identitymodel-extensions-for-dotnet/compare/8.18.0...8.19.0)

\====

#### New Features

- Add ML-DSA (FIPS 204) post-quantum signature support. See [PR #&#8203;3479](https://github.com/AzureAD/azure-activedirectory-identitymodel-extensions-for-dotnet/pull/3479).
- Cache custom crypto providers in CryptoProviderFactory. See [PR #&#8203;3489](https://github.com/AzureAD/azure-activedirectory-identitymodel-extensions-for-dotnet/pull/3489).

#### Bug Fixes

- Disable automatic redirects on default HttpClient for JKU retrieval. See [PR #&#8203;3494](https://github.com/AzureAD/azure-activedirectory-identitymodel-extensions-for-dotnet/pull/3494).
- Adjust rented buffer handling in claim set parsing. See [PR #&#8203;3493](https://github.com/AzureAD/azure-activedirectory-identitymodel-extensions-for-dotnet/pull/3493).
- Tidy null handling in SAML conditions validation. See [PR #&#8203;3491](https://github.com/AzureAD/azure-activedirectory-identitymodel-extensions-for-dotnet/pull/3491).
- Improve validation of `jku` claim. See [PR #&#8203;3481](https://github.com/AzureAD/azure-activedirectory-identitymodel-extensions-for-dotnet/pull/3481).
- Limit telemetry algorithm dimension cardinality. See [PR #&#8203;3490](https://github.com/AzureAD/azure-activedirectory-identitymodel-extensions-for-dotnet/pull/3490).
- Add defensive copy of collections in ValidationParameters. See [PR #&#8203;3492](https://github.com/AzureAD/azure-activedirectory-identitymodel-extensions-for-dotnet/pull/3492).
- Update TokenValidationParameter copy constructor to make a deep copy. See [PR #&#8203;3488](https://github.com/AzureAD/azure-activedirectory-identitymodel-extensions-for-dotnet/pull/3488).
- Update to fail-closed when replay protection isn't configured and other DPoP hardening. See [PR #&#8203;3505](https://github.com/AzureAD/azure-activedirectory-identitymodel-extensions-for-dotnet/pull/3505).
- Apply RFC 3986 section 6.2.2 normalization to DPoP `htu` comparison. See [PR #&#8203;3509](https://github.com/AzureAD/azure-activedirectory-identitymodel-extensions-for-dotnet/pull/3509).

</details>

---

### Configuration

📅 **Schedule**: (UTC)

- Branch creation
  - At any time (no schedule defined)
- Automerge
  - At any time (no schedule defined)

🚦 **Automerge**: Disabled by config. Please merge this manually once you are satisfied.

♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about this update again.

---

 - [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check this box

---

This PR has been generated by [Mend Renovate](https://github.com/renovatebot/renovate).
<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0My4xNzguMCIsInVwZGF0ZWRJblZlciI6IjQzLjE3OC4wIiwidGFyZ2V0QnJhbmNoIjoibWFzdGVyIiwibGFiZWxzIjpbXX0=-->

Reviewed-on: https://git.ryujinx.app/projects/Ryubing/pulls/136
2026-06-14 18:53:00 +00:00
Renovate Bot
9061c3a2b3 Update dependency Ryujinx.Audio.OpenAL to 1.25.2 (#135)
This PR contains the following updates:

| Package | Change | [Age](https://docs.renovatebot.com/merge-confidence/) | [Confidence](https://docs.renovatebot.com/merge-confidence/) |
|---|---|---|---|
| Ryujinx.Audio.OpenAL | `1.25.1` → `1.25.2` | ![age](https://developer.mend.io/api/mc/badges/age/nuget/Ryujinx.Audio.OpenAL/1.25.2?slim=true) | ![confidence](https://developer.mend.io/api/mc/badges/confidence/nuget/Ryujinx.Audio.OpenAL/1.25.1/1.25.2?slim=true) |

---

### Configuration

📅 **Schedule**: (UTC)

- Branch creation
  - At any time (no schedule defined)
- Automerge
  - At any time (no schedule defined)

🚦 **Automerge**: Disabled by config. Please merge this manually once you are satisfied.

♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about this update again.

---

 - [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check this box

---

This PR has been generated by [Mend Renovate](https://github.com/renovatebot/renovate).
<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0My4xNzguMCIsInVwZGF0ZWRJblZlciI6IjQzLjE3OC4wIiwidGFyZ2V0QnJhbmNoIjoibWFzdGVyIiwibGFiZWxzIjpbXX0=-->

Reviewed-on: https://git.ryujinx.app/projects/Ryubing/pulls/135
2026-06-14 18:52:21 +00:00
awesomeangotti
963f024838 Discord Rich Presence: Miitopia (#129)
Hello and welcome to my PR that adds discord rich presence stuff from play reports generated by Miitopia.

The following items are tracked and displayed:
Main menu (for booting game)
MII Selector (from main menu)
Region (Game stage based)
Gold (Only updates at start of game play due to lack of play reports generated after loading into world)

As a bonus, I will be exporting the title icon for discord rich presence images and providing the title ID so it can be added to rich presence images. (See bottom of my message)

Examples of current rich presence messages:

At Greenhorne (Starting area)
![image](/attachments/663acf62-2149-4e69-a68d-94c107876182)

After defeating final boss
![image](/attachments/52363124-742b-4214-8b69-f8043ae382bc)

Rich presence image and titleID:

titleID: 01003da010e8a000

![01003da010e8a000](/attachments/952d9218-9b99-4d55-929e-d3c48dcf87a4)

Co-authored-by: Awesomeangotti <143439211+Awesomeangotti@users.noreply.github.com>
Reviewed-on: https://git.ryujinx.app/projects/Ryubing/pulls/129
2026-06-14 17:32:12 +00:00
shinyoyo
c263c211bd Updated Simplified Chinese Translation (#134)
Reviewed-on: https://git.ryujinx.app/projects/Ryubing/pulls/134
2026-06-14 02:02:21 +00:00
sh0inx
77c9a50f59 Update README.md 2026-06-04 09:04:55 +00:00
Renovate Bot
a9ce288632 Update dependency SharpCompress to 0.49.1 (#123)
This PR contains the following updates:

| Package | Change | [Age](https://docs.renovatebot.com/merge-confidence/) | [Confidence](https://docs.renovatebot.com/merge-confidence/) |
|---|---|---|---|
| [SharpCompress](https://github.com/adamhathcock/sharpcompress) | `0.48.1` → `0.49.1` | ![age](https://developer.mend.io/api/mc/badges/age/nuget/SharpCompress/0.49.1?slim=true) | ![confidence](https://developer.mend.io/api/mc/badges/confidence/nuget/SharpCompress/0.48.1/0.49.1?slim=true) |

---

### Release Notes

<details>
<summary>adamhathcock/sharpcompress (SharpCompress)</summary>

### [`v0.49.1`](https://github.com/adamhathcock/sharpcompress/releases/tag/0.49.1): - More fixes

[Compare Source](https://github.com/adamhathcock/sharpcompress/compare/0.49.0...0.49.1)

#### What's Changed

- Close writable entry streams during async archive disposal by [@&#8203;Copilot](https://github.com/Copilot) in [#&#8203;1338](https://github.com/adamhathcock/sharpcompress/pull/1338)
- Restore `WriteToDirectoryAsync` progress callbacks for solid 7z archives by [@&#8203;Copilot](https://github.com/Copilot) in [#&#8203;1340](https://github.com/adamhathcock/sharpcompress/pull/1340)
- Try to fix global.json to avoid churn in locks by [@&#8203;adamhathcock](https://github.com/adamhathcock) in [#&#8203;1341](https://github.com/adamhathcock/sharpcompress/pull/1341)
- Fix tar archive enumeration after fully reading entry streams by [@&#8203;adamhathcock](https://github.com/adamhathcock) in [#&#8203;1342](https://github.com/adamhathcock/sharpcompress/pull/1342)

**Full Changelog**: <https://github.com/adamhathcock/sharpcompress/compare/0.49.0...0.49.1>

### [`v0.49.0`](https://github.com/adamhathcock/sharpcompress/releases/tag/0.49.0): - Write Async fixes and more.

[Compare Source](https://github.com/adamhathcock/sharpcompress/compare/0.48.1...0.49.0)

This should contain a lot of write async fixes and some breaking API changes that fix previous broke `net48` usage

#### What's Changed

- Rename IWriteableArchiveFactory.cs to IWritableArchiveFactory.cs by [@&#8203;Copilot](https://github.com/Copilot) in [#&#8203;1244](https://github.com/adamhathcock/sharpcompress/pull/1244)
- Some API clean up from GPT 5.4 by [@&#8203;adamhathcock](https://github.com/adamhathcock) in [#&#8203;1243](https://github.com/adamhathcock/sharpcompress/pull/1243)
- Release to master by [@&#8203;adamhathcock](https://github.com/adamhathcock) in [#&#8203;1267](https://github.com/adamhathcock/sharpcompress/pull/1267)
- Fix three BLAKE2sp correctness bugs and eliminate allocations in hot path by [@&#8203;coderb](https://github.com/coderb) in [#&#8203;1266](https://github.com/adamhathcock/sharpcompress/pull/1266)
- Corrected async examples. by [@&#8203;dlemstra](https://github.com/dlemstra) in [#&#8203;1277](https://github.com/adamhathcock/sharpcompress/pull/1277)
- Fix setting invalid access time fails extraction by [@&#8203;aromaa](https://github.com/aromaa) in [#&#8203;1279](https://github.com/adamhathcock/sharpcompress/pull/1279)
- Fix incorrect code examples in docs for sync/async usage by [@&#8203;Copilot](https://github.com/Copilot) in [#&#8203;1280](https://github.com/adamhathcock/sharpcompress/pull/1280)
- Replace APPNOTE.TXT contents with reference link note by [@&#8203;puk06](https://github.com/puk06) in [#&#8203;1286](https://github.com/adamhathcock/sharpcompress/pull/1286)
- Release to Master by [@&#8203;adamhathcock](https://github.com/adamhathcock) in [#&#8203;1274](https://github.com/adamhathcock/sharpcompress/pull/1274)
- update docs for tar gap analysis and XZ usage by [@&#8203;adamhathcock](https://github.com/adamhathcock) in [#&#8203;1288](https://github.com/adamhathcock/sharpcompress/pull/1288)
- Add a PooledMemoryStream to avoid allocating by [@&#8203;adamhathcock](https://github.com/adamhathcock) in [#&#8203;1275](https://github.com/adamhathcock/sharpcompress/pull/1275)
- fix: Change LeaveStreamOpen default from true to false by [@&#8203;puk06](https://github.com/puk06) in [#&#8203;1293](https://github.com/adamhathcock/sharpcompress/pull/1293)
- Fix usage of ReaderOptions and pre-defined values by [@&#8203;adamhathcock](https://github.com/adamhathcock) in [#&#8203;1295](https://github.com/adamhathcock/sharpcompress/pull/1295)
- Enforce seekable, readable and writable on streams by [@&#8203;adamhathcock](https://github.com/adamhathcock) in [#&#8203;1297](https://github.com/adamhathcock/sharpcompress/pull/1297)
- Add ArchiveInformation record for consolidated archive detection and capability inspection by [@&#8203;Copilot](https://github.com/Copilot) in [#&#8203;1299](https://github.com/adamhathcock/sharpcompress/pull/1299)
- merge release to master by [@&#8203;adamhathcock](https://github.com/adamhathcock) in [#&#8203;1314](https://github.com/adamhathcock/sharpcompress/pull/1314)
- Some clean up and test clean up by [@&#8203;adamhathcock](https://github.com/adamhathcock) in [#&#8203;1321](https://github.com/adamhathcock/sharpcompress/pull/1321)
- Finish Write Async by [@&#8203;adamhathcock](https://github.com/adamhathcock) in [#&#8203;1323](https://github.com/adamhathcock/sharpcompress/pull/1323)
- More complete Tar implementation: USTAR, PAX, etc. by [@&#8203;adamhathcock](https://github.com/adamhathcock) in [#&#8203;1289](https://github.com/adamhathcock/sharpcompress/pull/1289)
- Add Polysharp and adjustments that do not break legacy frameworks by [@&#8203;adamhathcock](https://github.com/adamhathcock) in [#&#8203;1330](https://github.com/adamhathcock/sharpcompress/pull/1330)
- Fix null `IVolume.FileName` for single-volume file-based archives by [@&#8203;Copilot](https://github.com/Copilot) in [#&#8203;1333](https://github.com/adamhathcock/sharpcompress/pull/1333)
- Add skills by [@&#8203;adamhathcock](https://github.com/adamhathcock) in [#&#8203;1332](https://github.com/adamhathcock/sharpcompress/pull/1332)
- add AOT smoke and missing tests by [@&#8203;adamhathcock](https://github.com/adamhathcock) in [#&#8203;1334](https://github.com/adamhathcock/sharpcompress/pull/1334)

#### New Contributors

- [@&#8203;dlemstra](https://github.com/dlemstra) made their first contribution in [#&#8203;1277](https://github.com/adamhathcock/sharpcompress/pull/1277)
- [@&#8203;aromaa](https://github.com/aromaa) made their first contribution in [#&#8203;1279](https://github.com/adamhathcock/sharpcompress/pull/1279)
- [@&#8203;puk06](https://github.com/puk06) made their first contribution in [#&#8203;1286](https://github.com/adamhathcock/sharpcompress/pull/1286)

**Full Changelog**: <https://github.com/adamhathcock/sharpcompress/compare/0.48.1...0.49.0>

</details>

---

### Configuration

📅 **Schedule**: (UTC)

- Branch creation
  - At any time (no schedule defined)
- Automerge
  - At any time (no schedule defined)

🚦 **Automerge**: Disabled by config. Please merge this manually once you are satisfied.

♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about this update again.

---

 - [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check this box

---

This PR has been generated by [Mend Renovate](https://github.com/renovatebot/renovate).
<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0My4xNzguMCIsInVwZGF0ZWRJblZlciI6IjQzLjE3OC4wIiwidGFyZ2V0QnJhbmNoIjoibWFzdGVyIiwibGFiZWxzIjpbXX0=-->

Reviewed-on: https://git.ryujinx.app/projects/Ryubing/pulls/123
2026-05-31 10:51:01 +00:00
Renovate Bot
9b88fee78f Update avalonia monorepo to 11.3.17 (#122)
This PR contains the following updates:

| Package | Change | [Age](https://docs.renovatebot.com/merge-confidence/) | [Confidence](https://docs.renovatebot.com/merge-confidence/) |
|---|---|---|---|
| [Avalonia](https://avaloniaui.net/?utm_source=nuget&utm_medium=referral&utm_content=project_homepage_link) ([source](https://github.com/AvaloniaUI/Avalonia)) | `11.3.15` → `11.3.17` | ![age](https://developer.mend.io/api/mc/badges/age/nuget/Avalonia/11.3.17?slim=true) | ![confidence](https://developer.mend.io/api/mc/badges/confidence/nuget/Avalonia/11.3.15/11.3.17?slim=true) |
| [Avalonia.Desktop](https://avaloniaui.net/?utm_source=nuget&utm_medium=referral&utm_content=project_homepage_link) ([source](https://github.com/AvaloniaUI/Avalonia)) | `11.3.15` → `11.3.17` | ![age](https://developer.mend.io/api/mc/badges/age/nuget/Avalonia.Desktop/11.3.17?slim=true) | ![confidence](https://developer.mend.io/api/mc/badges/confidence/nuget/Avalonia.Desktop/11.3.15/11.3.17?slim=true) |
| [Avalonia.Diagnostics](https://avaloniaui.net/?utm_source=nuget&utm_medium=referral&utm_content=project_homepage_link) ([source](https://github.com/AvaloniaUI/Avalonia)) | `11.3.15` → `11.3.17` | ![age](https://developer.mend.io/api/mc/badges/age/nuget/Avalonia.Diagnostics/11.3.17?slim=true) | ![confidence](https://developer.mend.io/api/mc/badges/confidence/nuget/Avalonia.Diagnostics/11.3.15/11.3.17?slim=true) |
| [Avalonia.Markup.Xaml.Loader](https://avaloniaui.net/?utm_source=nuget&utm_medium=referral&utm_content=project_homepage_link) ([source](https://github.com/AvaloniaUI/Avalonia)) | `11.3.15` → `11.3.17` | ![age](https://developer.mend.io/api/mc/badges/age/nuget/Avalonia.Markup.Xaml.Loader/11.3.17?slim=true) | ![confidence](https://developer.mend.io/api/mc/badges/confidence/nuget/Avalonia.Markup.Xaml.Loader/11.3.15/11.3.17?slim=true) |

---

### Release Notes

<details>
<summary>AvaloniaUI/Avalonia (Avalonia)</summary>

### [`v11.3.17`](https://github.com/AvaloniaUI/Avalonia/releases/tag/11.3.17)

[Compare Source](https://github.com/AvaloniaUI/Avalonia/compare/11.3.16...11.3.17)

##### What's Changed

##### Performance

- XAML – Improve type caching in the XAML compiler by [@&#8203;MrJul](https://github.com/MrJul) in [#&#8203;21408](https://github.com/AvaloniaUI/Avalonia/pull/21408)

**Full Changelog**: <https://github.com/AvaloniaUI/Avalonia/compare/11.3.16...11.3.17>

### [`v11.3.16`](https://github.com/AvaloniaUI/Avalonia/releases/tag/11.3.16)

[Compare Source](https://github.com/AvaloniaUI/Avalonia/compare/11.3.15...11.3.16)

##### What's Changed

- Core – Align Touch/Pen capture semantics with Mouse by [@&#8203;miloush](https://github.com/miloush) in [#&#8203;21363](https://github.com/AvaloniaUI/Avalonia/pull/21363)

**Full Changelog**: <https://github.com/AvaloniaUI/Avalonia/compare/11.3.15...11.3.16>

</details>

---

### Configuration

📅 **Schedule**: (UTC)

- Branch creation
  - At any time (no schedule defined)
- Automerge
  - At any time (no schedule defined)

🚦 **Automerge**: Disabled by config. Please merge this manually once you are satisfied.

♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about these updates again.

---

 - [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check this box

---

This PR has been generated by [Mend Renovate](https://github.com/renovatebot/renovate).
<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0My4xNzguMCIsInVwZGF0ZWRJblZlciI6IjQzLjE3OC4wIiwidGFyZ2V0QnJhbmNoIjoibWFzdGVyIiwibGFiZWxzIjpbXX0=-->

Reviewed-on: https://git.ryujinx.app/projects/Ryubing/pulls/122
2026-05-31 10:17:09 +00:00
KeatonTheBot
04574103cf Replace shaderc.net with Silk.NET.Shaderc (#124)
Unpublished branch from gdkchan. Replaces the outdated `shaderc.net` package with `Silk.NET.Shaderc`, which is continually updated with the Silk.NET package suite.

Co-authored-by: gdkchan <gab.dark.100@gmail.com>
Reviewed-on: https://git.ryujinx.app/projects/Ryubing/pulls/124
2026-05-31 10:16:47 +00:00
ranidspace
153d632ee2 Fix the canary CI breaking caused by #110 (#121)
whoops

Reviewed-on: https://git.ryujinx.app/projects/Ryubing/pulls/121
2026-05-30 21:02:30 +00:00
Babib3l
824643e143 Fix : Fix controller Stick visualizer perfomance (#119)
This PR aims to fix a bug inside the settings window that caused the Controller Stick visualizer to run at extremely degraded performance when the selected profile had a rainbow LED configuration:
Old behaviour : <video src="/attachments/1915ab74-6e1b-4e2f-9182-820cbed5359b" title="Screen Recording 2026-05-30 105859" controls></video>
New / updated behaviour : <video src="/attachments/dd293402-19e7-439e-8aa6-114d4ee22404" title="Screen Recording 2026-05-30 110338" controls></video>

The issue was that the input settings page automatically subscribed controllers to rainbow LED updates when a saved profile with rainbow LEDs enabled was loaded.
Reopening input settings on a non-default controller profile could immediately start the rainbow LED update loop from the settings UI, which caused the stick visualizer to become sluggish or jittery on affected controllers. The preview handler is now only registered when the rainbow LED option is changed in the settings UI, and it uses a stable handler so duplicate callbacks are not stacked.

Reviewed-on: https://git.ryujinx.app/projects/Ryubing/pulls/119
2026-05-30 20:33:50 +00:00
ranidspace
7be1708146 AppImage fixes and improvements (#110)
Currently the appimages work fine, however I realized there's some room to improve on following the standards and a bit of cleaning.

AppImages now follow the linux FHS and a `.DirIcon` to follow the Spec closer, along with changing the icon and desktop file names (the resulting AppImage will have the same name, it's only used internally)

Metadata has been added, it helps with applications meant to manage appimages, as well as a future possible auto-updater.

The icon has been replaced temporarily as we wait for the updated one, just taken from the windows .ico. The `.DirIcon` needs to be a PNG, however `app.ryujinx.Ryujinx.png` can be an svg as well for some reason.

The launcher script may not need to exist (gamemode and envvars), but as to not break anything the important things have been kept.

The commits messages of this PR contain information as to why each change was made.

Reviewed-on: https://git.ryujinx.app/projects/Ryubing/pulls/110
2026-05-30 20:31:49 +00:00
Babib3l
279c4cf3b4 Fix hotkey labels (#118)
Fixes the hotkeys settings page after https://git.ryujinx.app/projects/Ryubing/pulls/13 broke it

Reviewed-on: https://git.ryujinx.app/projects/Ryubing/pulls/118
2026-05-30 20:27:44 +00:00
39 changed files with 1267 additions and 1009 deletions

View File

@@ -68,7 +68,7 @@ jobs:
sed -r --in-place 's/\%\%RYUJINX_BUILD_GIT_HASH\%\%/${{ steps.version_info.outputs.git_short_hash }}/g;' src/Ryujinx.Common/ReleaseInformation.cs
sed -r --in-place 's/\%\%RYUJINX_TARGET_RELEASE_CHANNEL_NAME\%\%/${{ env.RYUJINX_TARGET_RELEASE_CHANNEL_NAME }}/g;' src/Ryujinx.Common/ReleaseInformation.cs
sed -r --in-place 's/\%\%RYUJINX_CONFIG_FILE_NAME\%\%/Config\.json/g;' src/Ryujinx.Common/ReleaseInformation.cs
sed -r --in-place '/^Name=Ryujinx$/s/Name=Ryujinx/Name=Ryujinx-Canary/' distribution/linux/Ryujinx.desktop
sed -r --in-place '/^Name=Ryujinx$/s/Name=Ryujinx/Name=Ryujinx-Canary/' distribution/linux/app.ryujinx.Ryujinx.desktop
shell: bash
- name: Create output dir

View File

@@ -3,12 +3,12 @@
<ManagePackageVersionsCentrally>true</ManagePackageVersionsCentrally>
</PropertyGroup>
<ItemGroup>
<PackageVersion Include="Avalonia" Version="11.3.15" />
<PackageVersion Include="Avalonia" Version="11.3.17" />
<PackageVersion Include="Avalonia.Controls.DataGrid" Version="11.3.13" />
<PackageVersion Include="Avalonia.Desktop" Version="11.3.15" />
<PackageVersion Include="Avalonia.Diagnostics" Version="11.3.15" />
<PackageVersion Include="Avalonia.Markup.Xaml.Loader" Version="11.3.15" />
<PackageVersion Include="SharpCompress" Version="0.48.1" />
<PackageVersion Include="Avalonia.Desktop" Version="11.3.17" />
<PackageVersion Include="Avalonia.Diagnostics" Version="11.3.17" />
<PackageVersion Include="Avalonia.Markup.Xaml.Loader" Version="11.3.17" />
<PackageVersion Include="SharpCompress" Version="0.49.1" />
<PackageVersion Include="Svg.Controls.Avalonia" Version="11.3.9.5" />
<PackageVersion Include="Svg.Controls.Skia.Avalonia" Version="11.3.9.5" />
<PackageVersion Include="Microsoft.Build.Framework" Version="17.11.4" />
@@ -27,7 +27,7 @@
<PackageVersion Include="Humanizer" Version="2.14.1" />
<PackageVersion Include="Microsoft.CodeAnalysis.Analyzers" Version="3.3.4" />
<PackageVersion Include="Microsoft.CodeAnalysis.CSharp" Version="4.9.2" />
<PackageVersion Include="Microsoft.IdentityModel.JsonWebTokens" Version="8.18.0" />
<PackageVersion Include="Microsoft.IdentityModel.JsonWebTokens" Version="8.19.1" />
<PackageVersion Include="Microsoft.NET.Test.Sdk" Version="17.14.1" />
<PackageVersion Include="Microsoft.IO.RecyclableMemoryStream" Version="3.0.1" />
<PackageVersion Include="MsgPack.Cli" Version="1.0.1" />
@@ -43,7 +43,7 @@
<PackageVersion Include="Open.NAT.Core" Version="2.1.0.5" />
<!-- Ryujinx.Audio.OpenAL.Dependencies is from the original project, last updated 12/30/20 -->
<!--<PackageVersion Include="Ryujinx.Audio.OpenAL.Dependencies" Version="1.21.0.1" />-->
<PackageVersion Include="Ryujinx.Audio.OpenAL" Version="1.25.1" />
<PackageVersion Include="Ryujinx.Audio.OpenAL" Version="1.25.2" />
<PackageVersion Include="Ryujinx.Graphics.Nvdec.Dependencies.AllArch" Version="6.1.4-build6" />
<PackageVersion Include="Ryujinx.Graphics.Vulkan.MoltenVK" Version="1.4.2-ryujinx.3" />
<PackageVersion Include="Ryujinx.LibHac" Version="0.21.0-alpha.133" />
@@ -51,9 +51,9 @@
<PackageVersion Include="Ryujinx.Systems.Update.Common" Version="2.0.6" />
<PackageVersion Include="Gommon" Version="2.8.1.2" />
<PackageVersion Include="securifybv.ShellLink" Version="0.1.0" />
<PackageVersion Include="Sep" Version="0.14.1" />
<PackageVersion Include="shaderc.net" Version="0.1.0" />
<PackageVersion Include="Sep" Version="0.15.0" />
<PackageVersion Include="SharpZipLib" Version="1.4.2" />
<PackageVersion Include="Silk.NET.Shaderc" Version="2.23.0" />
<PackageVersion Include="Silk.NET.Vulkan" Version="2.23.0" />
<PackageVersion Include="Silk.NET.Vulkan.Extensions.EXT" Version="2.23.0" />
<PackageVersion Include="Silk.NET.Vulkan.Extensions.KHR" Version="2.23.0" />

View File

@@ -40,8 +40,14 @@
## Usage
To run this emulator, your PC must be equipped with at least 8GiB of RAM;
failing to meet this requirement may result in a poor gameplay experience or unexpected crashes.
To run this emulator, your PC must be equipped with at least:
- 8GiB of RAM
- 6 cores
- A GPU released within the last 10 years.
- OpenGL 4.6 | Vulkan 1.4
- Windows 10 version 20H1 | macOS Big Sur (Apple Silicon)
Failing to meet these requirements may result in a poor gameplay experience or unexpected crashes.
## Latest build

View File

@@ -0,0 +1,104 @@
{
"Locales": [
{
"ID": "UpdatesAddedMessage",
"Translations": {
"ar_SA": "",
"de_DE": "",
"el_GR": "",
"en_US": "Updates Added: {0}",
"es_ES": "Actualizaciones Añadidas: {0}",
"fr_FR": "Mises à Jour Ajoutées : {0}",
"he_IL": "",
"it_IT": "Aggiornamenti aggiunti: {0}",
"ja_JP": "",
"ko_KR": "추가된 업데이트: {0}",
"no_NO": "Oppdateringer lagt til: {0}",
"pl_PL": "",
"pt_BR": "Atualizações adicionadas: {0}",
"ru_RU": "Добавлено обновлений: {0}",
"sv_SE": "Tillagda uppdateringar: {0}",
"th_TH": "การอัปเดตที่เพิ่มเข้ามา: {0}",
"tr_TR": "",
"uk_UA": "Додані оновлення: {0}",
"zh_CN": "已添加更新:{0}",
"zh_TW": "已新增更新:{0}"
}
},
{
"ID": "UpdatesRemovedMessage",
"Translations": {
"ar_SA": "",
"de_DE": "",
"el_GR": "",
"en_US": "Updates Removed: {0}",
"es_ES": "Actualizaciones Eliminadas: {0}",
"fr_FR": "Mises à Jour Supprimées : {0}",
"he_IL": "",
"it_IT": "Aggiornamenti rimossi: {0}",
"ja_JP": "",
"ko_KR": "제거된 업데이트: {0}",
"no_NO": "Fjernede oppdateringer: {0}",
"pl_PL": "",
"pt_BR": "Atualizações removidas: {0}",
"ru_RU": "Удалено обновлений: {0}",
"sv_SE": "Borttagna uppdateringar: {0}",
"th_TH": "การอัปเดตที่ถูกลบ: {0}",
"tr_TR": "",
"uk_UA": "Видалені оновлення: {0}",
"zh_CN": "已移除更新:{0}",
"zh_TW": "已移除更新:{0}"
}
},
{
"ID": "DLCAddedMessage",
"Translations": {
"ar_SA": "",
"de_DE": "",
"el_GR": "",
"en_US": "DLC Added: {0}",
"es_ES": "DLC Añadidos: {0}",
"fr_FR": "DLC Ajoutés : {0}",
"he_IL": "",
"it_IT": "DLC aggiunti: {0}",
"ja_JP": "",
"ko_KR": "추가된 DLC: {0}",
"no_NO": "DLC lagt til: {0}",
"pl_PL": "",
"pt_BR": "DLC adicionados: {0}",
"ru_RU": "Добавлено DLC: {0}",
"sv_SE": "Tillagda DLC: {0}",
"th_TH": "DLC ที่เพิ่มเข้ามา: {0}",
"tr_TR": "",
"uk_UA": "Додані DLC: {0}",
"zh_CN": "已添加 DLC{0}",
"zh_TW": "已新增 DLC{0}"
}
},
{
"ID": "DLCRemovedMessage",
"Translations": {
"ar_SA": "",
"de_DE": "",
"el_GR": "",
"en_US": "DLC Removed: {0}",
"es_ES": "DLC Eliminados: {0}",
"fr_FR": "DLC Supprimés : {0}",
"he_IL": "",
"it_IT": "DLC rimossi: {0}",
"ja_JP": "",
"ko_KR": "제거된 DLC: {0}",
"no_NO": "DLC fjernet: {0}",
"pl_PL": "",
"pt_BR": "DLC removidos: {0}",
"ru_RU": "Удалено DLC: {0}",
"sv_SE": "DLC borttaget: {0}",
"th_TH": "ลบ DLC: {0}",
"tr_TR": "",
"uk_UA": "Видалено DLC: {0}",
"zh_CN": "已移除 DLC{0}",
"zh_TW": "已移除 DLC{0}"
}
}
]
}

View File

@@ -0,0 +1,79 @@
{
"Locales": [
{
"ID": "LoadApplicationFromFileFilePickerTitle",
"Translations": {
"ar_SA": "",
"de_DE": "",
"el_GR": "",
"en_US": "Select a Switch application file to load",
"es_ES": "Selecciona un archivo de aplicación de Switch para cargar",
"fr_FR": "Sélectionnez un fichier dapplication Switch à charger",
"he_IL": "",
"it_IT": "Seleziona un file applicazione Switch da caricare",
"ja_JP": "",
"ko_KR": "로드할 Switch 애플리케이션 파일을 선택하세요",
"no_NO": "",
"pl_PL": "",
"pt_BR": "Selecione um arquivo de aplicativo Switch para carregar",
"ru_RU": "Выберите файл приложения Switch для загрузки",
"sv_SE": "Välj en Switch-applikationsfil att läsa in",
"th_TH": "",
"tr_TR": "",
"uk_UA": "Виберіть файл застосунку Switch для завантаження",
"zh_CN": "请选择要加载的 Switch 应用程序文件",
"zh_TW": "請選擇要載入的 Switch 應用程式檔案"
}
},
{
"ID": "LoadUnpackedApplicationFromFolderFilePickerTitle",
"Translations": {
"ar_SA": "",
"de_DE": "",
"el_GR": "",
"en_US": "Select a folder containing an unpacked Switch application to load",
"es_ES": "Selecciona una carpeta que contenga una aplicación de Switch descomprimida para cargar",
"fr_FR": "Sélectionnez un dossier contenant une application Switch décompressée à charger",
"he_IL": "",
"it_IT": "Seleziona una cartella contenente unapplicazione Switch non compressa da caricare",
"ja_JP": "",
"ko_KR": "압축 해제된 Switch 애플리케이션이 포함된 폴더를 선택하여 로드하세요",
"no_NO": "",
"pl_PL": "",
"pt_BR": "Selecione uma pasta que contenha um aplicativo Switch descompactado para carregar",
"ru_RU": "Выберите папку, содержащую распакованное приложение Switch, для загрузки",
"sv_SE": "Välj en mapp som innehåller en uppackad Switch-applikation att läsa in",
"th_TH": "",
"tr_TR": "",
"uk_UA": "Виберіть папку, що містить розпакований застосунок Switch, для завантаження",
"zh_CN": "请选择包含未打包 Switch 应用程序的文件夹以加载",
"zh_TW": "請選擇包含未解壓縮 Switch 應用程式的資料夾以載入"
}
},
{
"ID": "LoadUpdatesAndDLCFromFolderFilePickerTitle",
"Translations": {
"ar_SA": "",
"de_DE": "",
"el_GR": "",
"en_US": "Select one or more folders to bulk load updates and DLC from",
"es_ES": "Selecciona una o más carpetas para cargar de forma masiva actualizaciones y DLC",
"fr_FR": "Sélectionnez un ou plusieurs dossiers pour charger en masse des mises à jour et des DLC",
"he_IL": "",
"it_IT": "Seleziona una o più cartelle da cui caricare in blocco aggiornamenti e DLC",
"ja_JP": "",
"ko_KR": "업데이트 및 DLC를 대량으로 로드할 폴더를 하나 이상 선택하세요",
"no_NO": "",
"pl_PL": "",
"pt_BR": "Selecione uma ou mais pastas para carregar em massa atualizações e DLC",
"ru_RU": "Выберите одну или несколько папок для массовой загрузки обновлений и DLC",
"sv_SE": "Välj en eller flera mappar för att massinläsa uppdateringar och DLC",
"th_TH": "",
"tr_TR": "",
"uk_UA": "Виберіть одну або кілька папок для масового завантаження оновлень і DLC",
"zh_CN": "请选择一个或多个文件夹以批量加载更新和 DLC",
"zh_TW": "請選擇一個或多個資料夾以批次載入更新與 DLC"
}
}
]
}

View File

@@ -0,0 +1,104 @@
{
"Locales": [
{
"ID": "AssociationSuccessMessage",
"Translations": {
"ar_SA": "تم ربط أنواع الملفات بنجاح.",
"de_DE": "Dateitypen erfolgreich zugeordnet.",
"el_GR": "Οι τύποι αρχείων συσχετίστηκαν με επιτυχία.",
"en_US": "Successfully associated file types.",
"es_ES": "¡Tipos de archivo asociados con éxito.",
"fr_FR": "Types de fichiers associés avec succès.",
"he_IL": "שיוך סוגי הקבצים בוצע בהצלחה.",
"it_IT": "Tipi di file associati con successo.",
"ja_JP": "ファイルの種類の関連付けに成功しました。",
"ko_KR": "파일 형식 연결에 성공했습니다.",
"no_NO": "Filtyper ble tilknyttet.",
"pl_PL": "Pomyślnie powiązano typy plików.",
"pt_BR": "Tipos de arquivo associados com sucesso.",
"ru_RU": "Типы файлов успешно связаны.",
"sv_SE": "Filtyper har kopplats.",
"th_TH": "เชื่อมโยงประเภทไฟล์สำเร็จแล้ว",
"tr_TR": "Dosya türleri başarıyla ilişkilendirildi.",
"uk_UA": "Типи файлів успішно пов’язані.",
"zh_CN": "文件类型关联成功。",
"zh_TW": "檔案類型關聯成功。"
}
},
{
"ID": "RemoveAssociationSuccessMessage",
"Translations": {
"ar_SA": "تمت إزالة ارتباطات أنواع الملفات بنجاح.",
"de_DE": "Dateitypzuordnungen erfolgreich entfernt.",
"el_GR": "Οι συσχετίσεις τύπων αρχείων αφαιρέθηκαν με επιτυχία.",
"en_US": "Successfully removed file type associations.",
"es_ES": "Asociaciones de tipos de archivo eliminadas con éxito.",
"fr_FR": "Associations de types de fichiers supprimées avec succès.",
"he_IL": "שיוכי סוגי הקבצים הוסרו בהצלחה.",
"it_IT": "Associazioni dei tipi di file rimosse con successo.",
"ja_JP": "ファイルの種類の関連付けの削除に成功しました。",
"ko_KR": "파일 형식 연결이 성공적으로 제거되었습니다.",
"no_NO": "Filtype-tilknytninger ble fjernet.",
"pl_PL": "Pomyślnie usunięto skojarzenia typów plików.",
"pt_BR": "Associações de tipos de arquivo removidas com sucesso.",
"ru_RU": "Связи типов файлов успешно удалены.",
"sv_SE": "Filtypsassociationer har tagits bort.",
"th_TH": "ลบการเชื่อมโยงประเภทไฟล์สำเร็จแล้ว",
"tr_TR": "Dosya türü ilişkilendirmeleri başarıyla kaldırıldı.",
"uk_UA": "Прив’язки типів файлів успішно видалено.",
"zh_CN": "文件类型关联已成功移除。",
"zh_TW": "檔案類型關聯已成功移除。"
}
},
{
"ID": "AssociationFailedMessage",
"Translations": {
"ar_SA": "فشل ربط أنواع الملفات.",
"de_DE": "Fehler beim Zuordnen der Dateitypen.",
"el_GR": "Απέτυχε η συσχέτιση των τύπων αρχείων.",
"en_US": "Failed to associate file types.",
"es_ES": "No se pudieron asociar los tipos de archivo.",
"fr_FR": "Échec de lassociation des types de fichiers.",
"he_IL": "שיוך סוגי הקבצים נכשל.",
"it_IT": "Associazione dei tipi di file non riuscita.",
"ja_JP": "ファイルの種類の関連付けに失敗しました。",
"ko_KR": "파일 형식 연결에 실패했습니다.",
"no_NO": "Klarte ikke å tilknytte filtyper.",
"pl_PL": "Nie udało się powiązać typów plików.",
"pt_BR": "Falha ao associar tipos de arquivo.",
"ru_RU": "Не удалось связать типы файлов.",
"sv_SE": "Det gick inte att koppla filtyper.",
"th_TH": "เชื่อมโยงประเภทไฟล์ไม่สำเร็จ",
"tr_TR": "Dosya türleri ilişkilendirilemedi.",
"uk_UA": "Не вдалося пов’язати типи файлів.",
"zh_CN": "文件类型关联失败。",
"zh_TW": "檔案類型關聯失敗。"
}
},
{
"ID": "RemoveAssociationFailedMessage",
"Translations": {
"ar_SA": "فشلت إزالة ارتباطات أنواع الملفات.",
"de_DE": "Das Entfernen der Dateitypzuordnungen ist fehlgeschlagen.",
"el_GR": "Η αφαίρεση των συσχετίσεων τύπων αρχείων απέτυχε.",
"en_US": "Failed to remove file type associations.",
"es_ES": "No se pudieron eliminar las asociaciones de tipos de archivo.",
"fr_FR": "Échec de la suppression des associations de types de fichiers.",
"he_IL": "הסרת שיוכי סוגי הקבצים נכשלה.",
"it_IT": "Rimozione delle associazioni dei tipi di file non riuscita.",
"ja_JP": "ファイルの種類の関連付けの削除に失敗しました。",
"ko_KR": "파일 형식 연결 제거에 실패했습니다.",
"no_NO": "Fjerning av filtype-tilknytninger mislyktes.",
"pl_PL": "Nie udało się usunąć skojarzeń typów plików.",
"pt_BR": "Falha ao remover associações de tipos de arquivo.",
"ru_RU": "Не удалось удалить связи типов файлов.",
"sv_SE": "Det gick inte att ta bort filtypsassociationer.",
"th_TH": "ไม่สามารถลบการเชื่อมโยงประเภทไฟล์ได้",
"tr_TR": "Dosya türü ilişkilendirmeleri kaldırılamadı.",
"uk_UA": "Не вдалося видалити прив’язки типів файлів.",
"zh_CN": "文件类型关联移除失败。",
"zh_TW": "無法移除檔案類型關聯。"
}
}
]
}

View File

@@ -1,5 +1,55 @@
{
"Locales": [
{
"ID": "NoApplicationFoundInFile",
"Translations": {
"ar_SA": "",
"de_DE": "Keine Anwendungen in ausgewählter Datei gefunden.",
"el_GR": "",
"en_US": "No applications found in selected file.",
"es_ES": "No se encontraron aplicaciones en el archivo seleccionado.",
"fr_FR": "Aucune application trouvée dans le fichier sélectionné.",
"he_IL": "",
"it_IT": "Nessuna applicazione trovata nel file selezionato.",
"ja_JP": "",
"ko_KR": "선택한 파일에서 앱을 찾을 수 없습니다.",
"no_NO": "Ingen apper ble funnet i valgt fil.",
"pl_PL": "",
"pt_BR": "Nenhum aplicativo encontrado no arquivo selecionado.",
"ru_RU": "Приложений в выбранном файле не найдены",
"sv_SE": "Inga applikationer hittades i vald fil.",
"th_TH": "ไม่พบแอปพลิเคชั่นจากไฟล์ที่เลือก",
"tr_TR": "",
"uk_UA": "У вибраному файлі не знайдено жодних додатків.",
"zh_CN": "未发现应用",
"zh_TW": "未能從已選擇的檔案中找到應用程式。"
}
},
{
"ID": "NoUnpackedApplicationFoundInFolder",
"Translations": {
"ar_SA": "",
"de_DE": "",
"el_GR": "",
"en_US": "Please select an unpacked application folder with a valid ExeFS or NSO/NRO.",
"es_ES": "",
"fr_FR": "Veuillez sélectionner un répertoire dapplication décompressée contenant un ExeFS valide ou NSO/NRO.",
"he_IL": "",
"it_IT": "",
"ja_JP": "",
"ko_KR": "",
"no_NO": "",
"pl_PL": "",
"pt_BR": "",
"ru_RU": "Пожалуйста, выберите папку распакованного приложения с корректным ExeFS или NSO/NRO",
"sv_SE": "",
"th_TH": "",
"tr_TR": "",
"uk_UA": "",
"zh_CN": "",
"zh_TW": ""
}
},
{
"ID": "NoKeysFound",
"Translations": {

View File

@@ -1,78 +1,278 @@
{
"Locales": [
{
"ID": "ManageFileTypes",
"ID": "FileLabel",
"Translations": {
"ar_SA": "إدارة أنواع الملفات",
"de_DE": "Dateitypen verwalten",
"el_GR": "Διαχείριση τύπων αρχείων",
"en_US": "Manage File Types",
"es_ES": "Administrar Tipos de Archivo",
"fr_FR": "Gérer les Types de Fichiers",
"he_IL": "ניהול סוגי קבצים",
"it_IT": "Gestisci i tipi di file",
"ja_JP": "ファイル形式を管理",
"ko_KR": "파일 형식 관리",
"no_NO": "Behandle filtyper",
"pl_PL": "Zarządzaj rodzajami plików",
"pt_BR": "Gerenciar Tipos de Arquivos",
"ru_RU": "Управление типами файлов",
"sv_SE": "Hantera filtyper",
"th_TH": "จัดการประเภทไฟล์",
"tr_TR": "Dosya uzantılarını yönet",
"uk_UA": "Керувати типами файлів",
"zh_CN": "管理文件扩展名",
"zh_TW": "管理檔案類型"
"ar_SA": "_ملف",
"de_DE": "_Datei",
"el_GR": "_Αρχείο",
"en_US": "_File",
"es_ES": "_Archivo",
"fr_FR": "_Fichier",
"he_IL": "ובץ",
"it_IT": "_Archivio",
"ja_JP": "ファイル(_F)",
"ko_KR": "파일(_F)",
"no_NO": "_Fil",
"pl_PL": "_Plik",
"pt_BR": "_Arquivo",
"ru_RU": "айл",
"sv_SE": "_Arkiv",
"th_TH": "ไฟล์",
"tr_TR": "_Dosya",
"uk_UA": "айл",
"zh_CN": "文件(_F)",
"zh_TW": "檔案(_F)"
}
},
{
"ID": "InstallFileTypes",
"ID": "LoadApplicationFromFileButton",
"Translations": {
"ar_SA": "تثبيت أنواع الملفات",
"de_DE": "Dateitypen installieren",
"el_GR": "Εγκαταστήσετε τύπους αρχείων.",
"en_US": "Install File Types",
"es_ES": "Instalar Tipos de Archivo",
"fr_FR": "Installer des Types de Fichiers",
"he_IL": "סוגי קבצי התקנה",
"it_IT": "Installa i tipi di file",
"ja_JP": "ファイル形式をインストール",
"ko_KR": "파일 형식 설치",
"no_NO": "Installer filtyper",
"pl_PL": "Typy plików instalacyjnych",
"pt_BR": "Instalar tipos de arquivos",
"ru_RU": "Установить типы файлов",
"sv_SE": "Installera filtyper",
"th_TH": "ติดตั้งประเภทไฟล์",
"tr_TR": "Dosya uzantılarını yükle",
"uk_UA": "Встановити типи файлів",
"zh_CN": "关联文件扩展名",
"zh_TW": "安裝檔案類型"
"ar_SA": "_تحميل التطبيق...",
"de_DE": "_Anwendung laden...",
"el_GR": "_Φόρτωση εφαρμογής...",
"en_US": "_Load Application...",
"es_ES": "_Cargar Aplicación...",
"fr_FR": "_Charger lApplication...",
"he_IL": "_טען יישום...",
"it_IT": "_Carica applicazione...",
"ja_JP": "アプリケーションをロード(_L)...",
"ko_KR": "앱 불러오기(_L)...",
"no_NO": "_Last inn program...",
"pl_PL": "_Załaduj aplikację...",
"pt_BR": "_Carregar aplicativo...",
"ru_RU": "_Загрузить приложение...",
"sv_SE": "_Läs in applikation...",
"th_TH": "_โหลดแอปพลิเคชัน...",
"tr_TR": "_Uygulamayı yükle...",
"uk_UA": "_Завантажити застосунок...",
"zh_CN": "加载应用程序(_L)...",
"zh_TW": "載入應用程式(_L)..."
}
},
{
"ID": "UninstallFileTypes",
"ID": "LoadUnpackedGameFromFolderButton",
"Translations": {
"ar_SA": "إزالة أنواع الملفات",
"de_DE": "Dateitypen deinstallieren",
"el_GR": "Απεγκαταστήσετε τύπους αρχείων",
"en_US": "Uninstall File Types",
"es_ES": "Desinstalar Tipos de Archivo",
"fr_FR": "Désinstaller des Types de Fichiers",
"he_IL": "סוגי קבצי הסרה",
"it_IT": "Disinstalla i tipi di file",
"ja_JP": "ファイル形式をアンインストール",
"ko_KR": "파일 형식 제거",
"no_NO": "Avinstaller filtyper",
"pl_PL": "Typy plików dezinstalacyjnych",
"pt_BR": "Desinstalar tipos de arquivos",
"ru_RU": "Удалить типы файлов",
"sv_SE": "Avinstallera filtyper",
"th_TH": "ถอนการติดตั้งประเภทไฟล์",
"tr_TR": "Dosya uzantılarını kaldır",
"uk_UA": "Видалити типи файлів",
"zh_CN": "取消关联扩展名",
"zh_TW": "移除檔案類型"
"ar_SA": "تحميل لُعْبَة غير محزومة...",
"de_DE": "_Entpacktes Spiel laden...",
"el_GR": "_Φόρτωση Απακετάριστου Παιχνιδιού...",
"en_US": "Load _Unpacked Game...",
"es_ES": "Cargar Juego _Desempaquetado...",
"fr_FR": "Charger un Jeu Décompressé...",
"he_IL": "טען משחק _שאינו ארוז...",
"it_IT": "Carica gioco _estratto...",
"ja_JP": "_展開されたゲームをロード...",
"ko_KR": "압축 푼 게임 불러오기(_U)...",
"no_NO": "Last inn _upakket spill...",
"pl_PL": "Załaduj _rozpakowaną grę...",
"pt_BR": "Abrir Jogo _Extraído...",
"ru_RU": "Загрузить _распакованную игру...",
"sv_SE": "Läs in _uppackat spel...",
"th_TH": "โหลดเกมที่แตกไฟล์แล้ว...",
"tr_TR": "_Sıkıştırılmamış Oyun Yükle...",
"uk_UA": "Завантажити _розпаковану гру...",
"zh_CN": "加载解包后的游戏(_U)...",
"zh_TW": "載入未封裝的遊戲(_U)..."
}
},
{
"ID": "LoadTitleUpdatesAndDLCFromFolderButton",
"Translations": {
"ar_SA": "",
"de_DE": "Updates/DLC laden...",
"el_GR": "",
"en_US": "Load Updates/DLC...",
"es_ES": "Cargar Actualizaciones/DLC...",
"fr_FR": "Charger les Mises à Jour/DLC...",
"he_IL": "",
"it_IT": "Carica aggiornamenti/DLC...",
"ja_JP": "",
"ko_KR": "업데이트/DLC 불러오기...",
"no_NO": "Last inn oppdateringer/DLC...",
"pl_PL": "",
"pt_BR": "Carregar atualizações/DLC...",
"ru_RU": "Загрузить обновления/DLC...",
"sv_SE": "Läs in uppdateringar/DLC...",
"th_TH": "โหลดอัปเดต/DLC...",
"tr_TR": "",
"uk_UA": "Завантажити оновлення/DLC...",
"zh_CN": "加载更新/DLC...",
"zh_TW": "載入更新/DLC..."
}
},
{
"ID": "OpenRyuijnxFolderButton",
"Translations": {
"ar_SA": "‫فتح مجلد Ryujinx",
"de_DE": "Ryujinx-Ordner öffnen",
"el_GR": "Άνοιγμα Φακέλου Ryujinx",
"en_US": "Open Ryujinx Folder",
"es_ES": "Abrir Carpeta de Ryujinx",
"fr_FR": "Ouvrir le Dossier Ryujinx",
"he_IL": "פתח את תיקיית ריוג'ינקס",
"it_IT": "Apri la cartella di Ryujinx",
"ja_JP": "Ryujinx フォルダを開く",
"ko_KR": "Ryujinx 폴더 열기",
"no_NO": "Åpne Ryujinx mappe",
"pl_PL": "Otwórz folder Ryujinx",
"pt_BR": "Abrir Pasta do Ryujinx",
"ru_RU": "Открыть папку Ryujinx",
"sv_SE": "Öppna Ryujinx-mapp",
"th_TH": "เปิดโฟลเดอร์ Ryujinx",
"tr_TR": "Ryujinx Klasörünü aç",
"uk_UA": "Відкрити теку Ryujinx",
"zh_CN": "打开 Ryujinx 系统目录",
"zh_TW": "開啟 Ryujinx 資料夾"
}
},
{
"ID": "OpenLogsFolderButton",
"Translations": {
"ar_SA": "فتح مجلد السجلات",
"de_DE": "Logs-Ordner öffnen",
"el_GR": "Άνοιγμα Φακέλου Καταγραφής",
"en_US": "Open Logs Folder",
"es_ES": "Abrir Carpeta de Registros",
"fr_FR": "Ouvrir le Dossier des Journaux",
"he_IL": "פתח את תיקיית קבצי הלוג",
"it_IT": "Apri la cartella dei log",
"ja_JP": "ログフォルダを開く",
"ko_KR": "로그 폴더 열기",
"no_NO": "Åpne Logg mappen",
"pl_PL": "Otwórz folder plików dziennika zdarzeń",
"pt_BR": "Abrir Pasta de _Logs",
"ru_RU": "Открыть папку журналов",
"sv_SE": "Öppna loggmapp",
"th_TH": "เปิดโฟลเดอร์ Logs",
"tr_TR": "Logs Klasörünü aç",
"uk_UA": "Відкрити теку журналів змін",
"zh_CN": "打开日志目录",
"zh_TW": "開啟日誌資料夾"
}
},
{
"ID": "OpenScreenshotsFolderButton",
"Translations": {
"ar_SA": "",
"de_DE": "Screenshots-Ordner öffnen",
"el_GR": "",
"en_US": "Open Screenshots Folder",
"es_ES": "Abrir Carpeta de Capturas de Pantalla",
"fr_FR": "Ouvrir le Dossier des Captures dÉcran",
"he_IL": "",
"it_IT": "Apri la cartella degli screenshots",
"ja_JP": "",
"ko_KR": "스크린샷 폴더 열기",
"no_NO": "Åpne Skjermbilde Mappen",
"pl_PL": "",
"pt_BR": "Abrir Pasta de Capturas de Tela",
"ru_RU": "Открыть папку снимков экрана",
"sv_SE": "Öppna skärmbildsmappen",
"th_TH": "เปิดโฟลเดอร์ที่เก็บภาพหน้าจอ",
"tr_TR": "",
"uk_UA": "Відкрити теку скріншотів",
"zh_CN": "打开截图文件夹",
"zh_TW": "開啟螢幕擷取畫面資料夾"
}
},
{
"ID": "AssociateFileTypesButton",
"Translations": {
"ar_SA": "",
"de_DE": "",
"el_GR": "",
"en_US": "Associate File Types",
"es_ES": "",
"fr_FR": "Associer Les Types de Fichiers",
"he_IL": "",
"it_IT": "",
"ja_JP": "",
"ko_KR": "",
"no_NO": "",
"pl_PL": "",
"pt_BR": "",
"ru_RU": "Связать файлы с приложением",
"sv_SE": "",
"th_TH": "",
"tr_TR": "",
"uk_UA": "",
"zh_CN": "",
"zh_TW": ""
}
},
{
"ID": "RemoveFileTypeAssociationsButton",
"Translations": {
"ar_SA": "",
"de_DE": "",
"el_GR": "",
"en_US": "Remove File Type Associations",
"es_ES": "",
"fr_FR": "Dissocier Les Types de Fichiers",
"he_IL": "",
"it_IT": "",
"ja_JP": "",
"ko_KR": "",
"no_NO": "",
"pl_PL": "",
"pt_BR": "",
"ru_RU": "Удалить ассоциации файлов",
"sv_SE": "",
"th_TH": "",
"tr_TR": "",
"uk_UA": "",
"zh_CN": "",
"zh_TW": ""
}
},
{
"ID": "FileTypeAssociationsToolTip",
"Translations": {
"ar_SA": "",
"de_DE": "",
"el_GR": "",
"en_US": "Associates supported file types (NSP, XCI, NCA, NRO, NSO) with Ryujinx so they open automatically when double-clicked in your file manager. Removing file type associations stops this behavior.",
"es_ES": "",
"fr_FR": "Associe les types de fichiers pris en charge (NSP, XCI, NCA, NRO, NSO) à Ryujinx afin quils souvrent automatiquement par double-clic dans votre gestionnaire de fichiers. Les dissocier désactive ce comportement",
"he_IL": "",
"it_IT": "",
"ja_JP": "",
"ko_KR": "",
"no_NO": "",
"pl_PL": "",
"pt_BR": "",
"ru_RU": "Связывает поддерживаемые типы файлов (NSP, XCI, NCA, NRO, NSO) с Ryujinx, чтобы они автоматически открывались при двойном щелчке в файловом менеджере. Удаление ассоциаций файлов отключает это поведение.",
"sv_SE": "",
"th_TH": "",
"tr_TR": "",
"uk_UA": "",
"zh_CN": "",
"zh_TW": ""
}
},
{
"ID": "ExitButton",
"Translations": {
"ar_SA": "_خروج",
"de_DE": "_Beenden",
"el_GR": "_Έξοδος",
"en_US": "_Exit",
"es_ES": "_Salir",
"fr_FR": "_Quitter",
"he_IL": "_יציאה",
"it_IT": "_Esci",
"ja_JP": "終了(_E)",
"ko_KR": "종료(_E)",
"no_NO": "_Avslutt",
"pl_PL": "_Wyjdź",
"pt_BR": "_Sair",
"ru_RU": "_Выйти",
"sv_SE": "_Avsluta",
"th_TH": "_ออก",
"tr_TR": "_Çıkış",
"uk_UA": "_Вихід",
"zh_CN": "退出(_E)",
"zh_TW": "結束(_E)"
}
}
]

View File

@@ -0,0 +1,104 @@
{
"Locales": [
{
"ID": "OptionsLabel",
"Translations": {
"ar_SA": "_خيارات",
"de_DE": "_Optionen",
"el_GR": "_Επιλογές",
"en_US": "_Options",
"es_ES": "_Opciones",
"fr_FR": null,
"he_IL": "_אפשרויות",
"it_IT": "_Opzioni",
"ja_JP": "オプション(_O)",
"ko_KR": "옵션(_O)",
"no_NO": "_Alternativer",
"pl_PL": "_Opcje",
"pt_BR": "_Opções",
"ru_RU": "_Настройки",
"sv_SE": "_Inställningar",
"th_TH": "_ตัวเลือก",
"tr_TR": "_Seçenekler",
"uk_UA": "_Параметри",
"zh_CN": "选项(_O)",
"zh_TW": "選項(_O)"
}
},
{
"ID": "LanguageButton",
"Translations": {
"ar_SA": "اللغة",
"de_DE": "Sprache",
"el_GR": "Γλώσσα",
"en_US": "Language",
"es_ES": "Idioma",
"fr_FR": "Langue",
"he_IL": "שפה",
"it_IT": "Lingua",
"ja_JP": "言語",
"ko_KR": "언어",
"no_NO": "Språk",
"pl_PL": "Język",
"pt_BR": "Idioma",
"ru_RU": "Язык",
"sv_SE": "Språk",
"th_TH": "ภาษา",
"tr_TR": "Dil",
"uk_UA": "Мова",
"zh_CN": "语言",
"zh_TW": "語言"
}
},
{
"ID": "UserProfilesButton",
"Translations": {
"ar_SA": "_ملفات المستخدمين",
"de_DE": "_Benutzerprofile",
"el_GR": "_Προφίλ Χρηστών",
"en_US": "_User Profiles",
"es_ES": "_Perfiles de Usuario",
"fr_FR": "_Profils d'Utilisateurs",
"he_IL": "_פרופילי משתמש",
"it_IT": "_Profili utente",
"ja_JP": "ユーザプロファイル(_M)",
"ko_KR": "사용자 프로필(_M)",
"no_NO": "_Brukerprofiler",
"pl_PL": "_Profile użytkowników",
"pt_BR": "_Perfis de usuário",
"ru_RU": "_Профили пользователей",
"sv_SE": "_Användarprofiler",
"th_TH": "_โปรไฟล์ผู้ใช้งาน",
"tr_TR": "_Kullanıcı Profilleri",
"uk_UA": "_Профілі користувачів",
"zh_CN": "用户配置文件(_M)",
"zh_TW": "使用者設定檔(_M)"
}
},
{
"ID": "SettingsButton",
"Translations": {
"ar_SA": "_الإعدادات",
"de_DE": "_Einstellungen",
"el_GR": "_Ρυθμίσεις",
"en_US": "_Settings",
"es_ES": "_Configuración",
"fr_FR": "_Paramètres",
"he_IL": "_הגדרות",
"it_IT": "_Impostazioni",
"ja_JP": "設定(_S)",
"ko_KR": "설정(_S)",
"no_NO": "_Innstillinger",
"pl_PL": "_Ustawienia",
"pt_BR": "_Configurações",
"ru_RU": "_Параметры",
"sv_SE": "_Inställningar",
"th_TH": "_ตั้งค่า",
"tr_TR": "_Seçenekler",
"uk_UA": "_Налаштування",
"zh_CN": "设置(_S)",
"zh_TW": "設定(_S)"
}
}
]
}

View File

@@ -0,0 +1,54 @@
{
"Locales": [
{
"ID": "ToggleFullscreenButton",
"Translations": {
"ar_SA": "التبديل إلى وضع ملء الشاشة",
"de_DE": "Vollbild",
"el_GR": "Λειτουργία Πλήρους Οθόνης",
"en_US": "Toggle Fullscreen",
"es_ES": "Cambiar a Pantalla Completa.",
"fr_FR": "Basculer en Plein Écran",
"he_IL": "שנה מצב- מסך מלא",
"it_IT": "Schermo intero",
"ja_JP": "全画面切り替え",
"ko_KR": "전체 화면 전환",
"no_NO": "Fullskjermsvisning av/på",
"pl_PL": "Przełącz na tryb pełnoekranowy",
"pt_BR": "Mudar para Tela Cheia",
"ru_RU": "Переключить полноэкранный режим",
"sv_SE": "Växla helskärm",
"th_TH": "สลับเป็นโหมดเต็มหน้าจอ",
"tr_TR": "Tam Ekran Modunu Aç",
"uk_UA": "На весь екран",
"zh_CN": "切换全屏",
"zh_TW": "切換全螢幕模式"
}
},
{
"ID": "ShowConsoleButton",
"Translations": {
"ar_SA": "عرض وحدة التحكم",
"de_DE": "Zeige Konsole",
"el_GR": "Εμφάνιση Κονσόλας",
"en_US": "Show Console",
"es_ES": "Mostrar Consola",
"fr_FR": "Afficher la Console",
"he_IL": "הצג שורת פקודות",
"it_IT": "Mostra console",
"ja_JP": "コンソールを表示",
"ko_KR": "콘솔 표시",
"no_NO": "Vis konsoll",
"pl_PL": "Pokaż Konsolę",
"pt_BR": "Exibir Console",
"ru_RU": "Показать консоль",
"sv_SE": "Visa konsoll",
"th_TH": "แสดง คอนโซล",
"tr_TR": "Konsol'u Göster",
"uk_UA": "Показати консоль",
"zh_CN": "显示控制台",
"zh_TW": "顯示控制台"
}
}
]
}

View File

@@ -1,4 +1,4 @@
{
{
"Locales": [
{
"ID": "SettingsTabInputDirectMouseAccess",
@@ -171,260 +171,10 @@
"th_TH": "",
"tr_TR": "",
"uk_UA": "",
"zh_CN": "",
"zh_CN": "使用低延迟垃圾回收器",
"zh_TW": ""
}
},
{
"ID": "MenuBarFile",
"Translations": {
"ar_SA": "_ملف",
"de_DE": "_Datei",
"el_GR": "_Αρχείο",
"en_US": "_File",
"es_ES": "_Archivo",
"fr_FR": "_Fichier",
"he_IL": "_קובץ",
"it_IT": "_Archivio",
"ja_JP": "ファイル(_F)",
"ko_KR": "파일(_F)",
"no_NO": "_Fil",
"pl_PL": "_Plik",
"pt_BR": "_Arquivo",
"ru_RU": "_Файл",
"sv_SE": "_Arkiv",
"th_TH": "ไฟล์",
"tr_TR": "_Dosya",
"uk_UA": "_Файл",
"zh_CN": "文件(_F)",
"zh_TW": "檔案(_F)"
}
},
{
"ID": "MenuBarFileOpenFromFile",
"Translations": {
"ar_SA": "_تحميل التطبيق...",
"de_DE": "_Anwendung laden...",
"el_GR": "_Φόρτωση εφαρμογής...",
"en_US": "_Load Application...",
"es_ES": "_Cargar Aplicación...",
"fr_FR": "_Charger lApplication...",
"he_IL": "_טען יישום...",
"it_IT": "_Carica applicazione...",
"ja_JP": "アプリケーションをロード(_L)...",
"ko_KR": "앱 불러오기(_L)...",
"no_NO": "_Last inn program...",
"pl_PL": "_Załaduj aplikację...",
"pt_BR": "_Carregar aplicativo...",
"ru_RU": "_Загрузить приложение...",
"sv_SE": "_Läs in applikation...",
"th_TH": "_โหลดแอปพลิเคชัน...",
"tr_TR": "_Uygulamayı yükle...",
"uk_UA": "_Завантажити застосунок...",
"zh_CN": "加载应用程序(_L)...",
"zh_TW": "載入應用程式(_L)..."
}
},
{
"ID": "MenuBarFileOpenFromFileError",
"Translations": {
"ar_SA": "",
"de_DE": "Keine Anwendungen in ausgewählter Datei gefunden.",
"el_GR": "",
"en_US": "No applications found in selected file.",
"es_ES": "No se encontraron aplicaciones en el archivo seleccionado.",
"fr_FR": "Aucune application trouvée dans le fichier sélectionné.",
"he_IL": "",
"it_IT": "Nessuna applicazione trovata nel file selezionato.",
"ja_JP": "",
"ko_KR": "선택한 파일에서 앱을 찾을 수 없습니다.",
"no_NO": "Ingen apper ble funnet i valgt fil.",
"pl_PL": "",
"pt_BR": "Nenhum aplicativo encontrado no arquivo selecionado.",
"ru_RU": "Приложений в выбранном файле не найдены",
"sv_SE": "Inga applikationer hittades i vald fil.",
"th_TH": "ไม่พบแอปพลิเคชั่นจากไฟล์ที่เลือก",
"tr_TR": "",
"uk_UA": "У вибраному файлі не знайдено жодних додатків.",
"zh_CN": "未发现应用",
"zh_TW": "未能從已選擇的檔案中找到應用程式。"
}
},
{
"ID": "MenuBarFileOpenUnpacked",
"Translations": {
"ar_SA": "تحميل لُعْبَة غير محزومة...",
"de_DE": "_Entpacktes Spiel laden...",
"el_GR": "_Φόρτωση Απακετάριστου Παιχνιδιού...",
"en_US": "Load _Unpacked Game...",
"es_ES": "Cargar Juego _Desempaquetado...",
"fr_FR": "Charger un Jeu Décompressé...",
"he_IL": "טען משחק _שאינו ארוז...",
"it_IT": "Carica gioco _estratto...",
"ja_JP": "_展開されたゲームをロード...",
"ko_KR": "압축 푼 게임 불러오기(_U)...",
"no_NO": "Last inn _upakket spill...",
"pl_PL": "Załaduj _rozpakowaną grę...",
"pt_BR": "Abrir Jogo _Extraído...",
"ru_RU": "Загрузить _распакованную игру...",
"sv_SE": "Läs in _uppackat spel...",
"th_TH": "โหลดเกมที่แตกไฟล์แล้ว...",
"tr_TR": "_Sıkıştırılmamış Oyun Yükle...",
"uk_UA": "Завантажити _розпаковану гру...",
"zh_CN": "加载解包后的游戏(_U)...",
"zh_TW": "載入未封裝的遊戲(_U)..."
}
},
{
"ID": "MenuBarFileLoadDlcFromFolder",
"Translations": {
"ar_SA": "",
"de_DE": "DLC aus Ordner laden...",
"el_GR": "",
"en_US": "Load DLC...",
"es_ES": "Cargar DLC...",
"fr_FR": "Charger des DLC...",
"he_IL": "",
"it_IT": "Carica DLC...",
"ja_JP": "",
"ko_KR": "DLC 폴더에서 불러오기...",
"no_NO": "Last inn DLC...",
"pl_PL": "",
"pt_BR": "Carregar DLC...",
"ru_RU": "Загрузить DLC...",
"sv_SE": "Läs in DLC...",
"th_TH": "โหลด DLC...",
"tr_TR": "",
"uk_UA": "Завантажити DLC...",
"zh_CN": "加载 DLC...",
"zh_TW": "載入 DLC..."
}
},
{
"ID": "MenuBarFileLoadTitleUpdatesFromFolder",
"Translations": {
"ar_SA": "",
"de_DE": "Titel-Updates aus Ordner laden...",
"el_GR": "",
"en_US": "Load Title Updates...",
"es_ES": "Cargar Actualizaciones de Títulos...",
"fr_FR": "Charger des Mises à Jour de Titres...",
"he_IL": "",
"it_IT": "Carica aggiornamenti...",
"ja_JP": "",
"ko_KR": "타이틀 업데이트 불러오기...",
"no_NO": "Last inn titteloppdateringer...",
"pl_PL": "",
"pt_BR": "Carregar Atualizações de Jogo...",
"ru_RU": "Загрузить обновления...",
"sv_SE": "Läs in titeluppdateringar...",
"th_TH": "โหลดไฟล์อัพเดต...",
"tr_TR": "",
"uk_UA": "Завантажити оновлення...",
"zh_CN": "加载游戏更新...",
"zh_TW": "載入遊戲更新..."
}
},
{
"ID": "MenuBarFileOpenEmuFolder",
"Translations": {
"ar_SA": "‫فتح مجلد Ryujinx",
"de_DE": "Ryujinx-Ordner öffnen",
"el_GR": "Άνοιγμα Φακέλου Ryujinx",
"en_US": "Open Ryujinx Folder",
"es_ES": "Abrir Carpeta de Ryujinx",
"fr_FR": "Ouvrir le Dossier Ryujinx",
"he_IL": "פתח את תיקיית ריוג'ינקס",
"it_IT": "Apri la cartella di Ryujinx",
"ja_JP": "Ryujinx フォルダを開く",
"ko_KR": "Ryujinx 폴더 열기",
"no_NO": "Åpne Ryujinx mappe",
"pl_PL": "Otwórz folder Ryujinx",
"pt_BR": "Abrir Pasta do Ryujinx",
"ru_RU": "Открыть папку Ryujinx",
"sv_SE": "Öppna Ryujinx-mapp",
"th_TH": "เปิดโฟลเดอร์ Ryujinx",
"tr_TR": "Ryujinx Klasörünü aç",
"uk_UA": "Відкрити теку Ryujinx",
"zh_CN": "打开 Ryujinx 系统目录",
"zh_TW": "開啟 Ryujinx 資料夾"
}
},
{
"ID": "MenuBarFileOpenScreenshotsFolder",
"Translations": {
"ar_SA": "",
"de_DE": "Screenshots-Ordner öffnen",
"el_GR": "",
"en_US": "Open Screenshots Folder",
"es_ES": "Abrir Carpeta de Capturas de Pantalla",
"fr_FR": "Ouvrir le Dossier des Captures dÉcran",
"he_IL": "",
"it_IT": "Apri la cartella degli screenshots",
"ja_JP": "",
"ko_KR": "스크린샷 폴더 열기",
"no_NO": "Åpne Skjermbilde Mappen",
"pl_PL": "",
"pt_BR": "Abrir Pasta de Capturas de Tela",
"ru_RU": "Открыть папку снимков экрана",
"sv_SE": "Öppna skärmbildsmappen",
"th_TH": "เปิดโฟลเดอร์ที่เก็บภาพหน้าจอ",
"tr_TR": "",
"uk_UA": "Відкрити теку скріншотів",
"zh_CN": "打开截图文件夹",
"zh_TW": "開啟螢幕擷取畫面資料夾"
}
},
{
"ID": "MenuBarFileOpenLogsFolder",
"Translations": {
"ar_SA": "فتح مجلد السجلات",
"de_DE": "Logs-Ordner öffnen",
"el_GR": "Άνοιγμα Φακέλου Καταγραφής",
"en_US": "Open Logs Folder",
"es_ES": "Abrir Carpeta de Registros",
"fr_FR": "Ouvrir le Dossier des Journaux",
"he_IL": "פתח את תיקיית קבצי הלוג",
"it_IT": "Apri la cartella dei log",
"ja_JP": "ログフォルダを開く",
"ko_KR": "로그 폴더 열기",
"no_NO": "Åpne Logg mappen",
"pl_PL": "Otwórz folder plików dziennika zdarzeń",
"pt_BR": "Abrir Pasta de _Logs",
"ru_RU": "Открыть папку журналов",
"sv_SE": "Öppna loggmapp",
"th_TH": "เปิดโฟลเดอร์ Logs",
"tr_TR": "Logs Klasörünü aç",
"uk_UA": "Відкрити теку журналів змін",
"zh_CN": "打开日志目录",
"zh_TW": "開啟日誌資料夾"
}
},
{
"ID": "MenuBarFileExit",
"Translations": {
"ar_SA": "_خروج",
"de_DE": "_Beenden",
"el_GR": "_Έξοδος",
"en_US": "_Exit",
"es_ES": "_Salir",
"fr_FR": "_Quitter",
"he_IL": "_יציאה",
"it_IT": "_Esci",
"ja_JP": "終了(_E)",
"ko_KR": "종료(_E)",
"no_NO": "_Avslutt",
"pl_PL": "_Wyjdź",
"pt_BR": "_Sair",
"ru_RU": "_Выйти",
"sv_SE": "_Avsluta",
"th_TH": "_ออก",
"tr_TR": "_Çıkış",
"uk_UA": "_Вихід",
"zh_CN": "退出(_E)",
"zh_TW": "結束(_E)"
}
},
{
"ID": "MenuBarOptions",
"Translations": {
@@ -1653,26 +1403,26 @@
{
"ID": "GameListContextMenuManageTitleUpdates",
"Translations": {
"ar_SA": "إدارة تحديثات اللُعبة",
"de_DE": "Verwalte Spiel-Updates",
"el_GR": "Διαχείριση Ενημερώσεων Παιχνιδιού",
"en_US": "Manage Title Updates",
"es_ES": "Gestionar Actualizaciones del Juego",
"fr_FR": "Gérer les Mises à Jour du Titre",
"he_IL": "מנהל עדכוני משחקים",
"it_IT": "Gestisci aggiornamenti del gioco",
"ar_SA": "إدارة التحديثات",
"de_DE": "Updates verwalten",
"el_GR": "Διαχείριση ενημερώσεων",
"en_US": "Manage Updates",
"es_ES": "Gestionar Actualizaciones",
"fr_FR": "Gérer les Mises à Jour",
"he_IL": "ניהול עדכונים",
"it_IT": "Gestisci aggiornamenti",
"ja_JP": "アップデートを管理",
"ko_KR": "타이틀 업데이트 관리",
"no_NO": "Administrer titteloppdateringer",
"ko_KR": "업데이트 관리",
"no_NO": "Administrer oppdateringer",
"pl_PL": "Zarządzaj aktualizacjami",
"pt_BR": "Gerenciar Atualizações do Jogo",
"pt_BR": "Gerenciar atualizações",
"ru_RU": "Управление обновлениями",
"sv_SE": "Hantera speluppdateringar",
"th_TH": "จัดการเวอร์ชั่นอัปเดต",
"tr_TR": "Oyun Güncellemelerini Yönet",
"sv_SE": "Hantera uppdateringar",
"th_TH": "จัดการการอัปเดต",
"tr_TR": "Güncellemeleri Yönet",
"uk_UA": "Керування оновленнями",
"zh_CN": "管理游戏更新",
"zh_TW": "管理遊戲更新"
"zh_CN": "管理更新",
"zh_TW": "管理更新"
}
},
{
@@ -6446,7 +6196,7 @@
"th_TH": "",
"tr_TR": "",
"uk_UA": "",
"zh_CN": "",
"zh_CN": "将按键绑定重置为默认",
"zh_TW": ""
}
},
@@ -9846,7 +9596,7 @@
"th_TH": "",
"tr_TR": "",
"uk_UA": "",
"zh_CN": "",
"zh_CN": "开启 HD 震动",
"zh_TW": ""
}
},
@@ -9871,7 +9621,7 @@
"th_TH": "",
"tr_TR": "",
"uk_UA": "",
"zh_CN": "",
"zh_CN": "向控制器发送更多数据以获得更好的震动效果。\n\n目前仅支持任天堂官方的 Switch 控制器。\n\n如果你在使用 JoyCon 或 Pro 手柄,请保持开启状态。",
"zh_TW": ""
}
},
@@ -10800,106 +10550,6 @@
"zh_TW": "您要重新啟動嗎"
}
},
{
"ID": "DialogInstallFileTypesSuccessMessage",
"Translations": {
"ar_SA": "تم تثبيت أنواع الملفات بنجاح!",
"de_DE": "Dateitypen erfolgreich installiert!",
"el_GR": "Επιτυχής εγκατάσταση τύπων αρχείων!",
"en_US": "Successfully installed file types!",
"es_ES": "¡Tipos de archivos instalados con éxito!",
"fr_FR": "Types de fichiers installés avec succès !",
"he_IL": "סוגי קבצים הותקנו בהצלחה!",
"it_IT": "Tipi di file installati con successo!",
"ja_JP": "ファイル形式のインストールに成功しました!",
"ko_KR": "파일 형식을 성공적으로 설치했습니다!",
"no_NO": "Filtyper ble installert!",
"pl_PL": "Pomyślnie zainstalowano typy plików!",
"pt_BR": "Tipos de arquivo instalados com sucesso!",
"ru_RU": "Типы файлов успешно установлены!",
"sv_SE": "Filtyper har installerats!",
"th_TH": "ติดตั้งตามประเภทของไฟล์สำเร็จแล้ว!",
"tr_TR": "Dosya uzantıları başarıyla yüklendi!",
"uk_UA": "Успішно встановлено типи файлів!",
"zh_CN": "关联文件类型成功!",
"zh_TW": "成功安裝檔案類型!"
}
},
{
"ID": "DialogInstallFileTypesErrorMessage",
"Translations": {
"ar_SA": "فشل تثبيت أنواع الملفات.",
"de_DE": "Dateitypen konnten nicht installiert werden.",
"el_GR": "Απέτυχε η εγκατάσταση τύπων αρχείων.",
"en_US": "Failed to install file types.",
"es_ES": "No se pudo desinstalar los tipos de archivo.",
"fr_FR": "Échec de l'installation des types de fichiers.",
"he_IL": "נכשל בהתקנת סוגי קבצים.",
"it_IT": "Impossibile installare i tipi di file.",
"ja_JP": "ファイル形式のインストールに失敗しました.",
"ko_KR": "파일 형식을 설치하지 못했습니다.",
"no_NO": "Kunne ikke installere filtyper.",
"pl_PL": "Nie udało się zainstalować typów plików.",
"pt_BR": "Falha ao instalar tipos de arquivo.",
"ru_RU": "Не удалось установить типы файлов.",
"sv_SE": "Misslyckades med att installera filtyper.",
"th_TH": "ติดตั้งตามประเภทของไฟล์ไม่สำเร็จ",
"tr_TR": "Dosya uzantıları yükleme işlemi başarısız oldu.",
"uk_UA": "Не вдалося встановити типи файлів.",
"zh_CN": "关联文件类型失败!",
"zh_TW": "無法安裝檔案類型。"
}
},
{
"ID": "DialogUninstallFileTypesSuccessMessage",
"Translations": {
"ar_SA": "تم إلغاء تثبيت أنواع الملفات بنجاح!",
"de_DE": "Dateitypen erfolgreich deinstalliert!",
"el_GR": "Επιτυχής απεγκατάσταση τύπων αρχείων!",
"en_US": "Successfully uninstalled file types!",
"es_ES": "¡Tipos de archivos desinstalados con éxito!",
"fr_FR": "Types de fichiers désinstallés avec succès !",
"he_IL": "סוגי קבצים הוסרו בהצלחה!",
"it_IT": "Tipi di file disinstallati con successo!",
"ja_JP": "ファイル形式のアンインストールに成功しました!",
"ko_KR": "파일 형식이 성공적으로 제거되었습니다!",
"no_NO": "Filtyper ble avinstallert!",
"pl_PL": "Pomyślnie odinstalowano typy plików!",
"pt_BR": "Tipos de arquivo desinstalados com sucesso!",
"ru_RU": "Типы файлов успешно удалены!",
"sv_SE": "Filtyper avinstallerades!",
"th_TH": "ถอนการติดตั้งตามประเภทของไฟล์สำเร็จแล้ว!",
"tr_TR": "Dosya uzantıları başarıyla kaldırıldı!",
"uk_UA": "Успішно видалено типи файлів!",
"zh_CN": "成功解除文件类型关联!",
"zh_TW": "成功移除檔案類型!"
}
},
{
"ID": "DialogUninstallFileTypesErrorMessage",
"Translations": {
"ar_SA": "فشل إلغاء تثبيت أنواع الملفات.",
"de_DE": "Deinstallation der Dateitypen fehlgeschlagen.",
"el_GR": "Αποτυχία απεγκατάστασης τύπων αρχείων.",
"en_US": "Failed to uninstall file types.",
"es_ES": "No se pudo desinstalar los tipos de archivo.",
"fr_FR": "Échec de la désinstallation des types de fichiers.",
"he_IL": "נכשל בהסרת סוגי קבצים.",
"it_IT": "Disinstallazione dei tipi di file non riuscita.",
"ja_JP": "ファイル形式のアンインストールに失敗しました.",
"ko_KR": "파일 형식을 제거하지 못했습니다.",
"no_NO": "Kunne ikke avinstallere filtyper.",
"pl_PL": "Nie udało się odinstalować typów plików.",
"pt_BR": "Falha ao desinstalar tipos de arquivo.",
"ru_RU": "Не удалось удалить типы файлов.",
"sv_SE": "Misslyckades med att avinstallera filtyper.",
"th_TH": "ไม่สามารถถอนการติดตั้งตามประเภทของไฟล์ได้",
"tr_TR": "Dosya uzantıları kaldırma işlemi başarısız oldu.",
"uk_UA": "Не вдалося видалити типи файлів.",
"zh_CN": "解除文件类型关联失败!",
"zh_TW": "無法移除檔案類型。"
}
},
{
"ID": "DialogOpenSettingsWindowLabel",
"Translations": {
@@ -11696,7 +11346,7 @@
"th_TH": "",
"tr_TR": "",
"uk_UA": "",
"zh_CN": "",
"zh_CN": "要将选定设备的按键绑定重置为默认值吗?",
"zh_TW": ""
}
},
@@ -11721,7 +11371,7 @@
"th_TH": "",
"tr_TR": "",
"uk_UA": "",
"zh_CN": "",
"zh_CN": "这是一个破坏性的操作,会覆盖此设备当前的绑定。",
"zh_TW": ""
}
},
@@ -13050,31 +12700,6 @@
"zh_TW": "全部刪除"
}
},
{
"ID": "MenuBarOptionsChangeLanguage",
"Translations": {
"ar_SA": "تغيير اللغة",
"de_DE": "Sprache ändern",
"el_GR": "Αλλαξε γλώσσα",
"en_US": "Change Language",
"es_ES": "Cambiar Idioma",
"fr_FR": "Changer la Langue",
"he_IL": "החלף שפה",
"it_IT": "Cambia lingua",
"ja_JP": "言語を変更",
"ko_KR": "언어 변경",
"no_NO": "Endre språk",
"pl_PL": "Zmień język",
"pt_BR": "Mudar Idioma",
"ru_RU": "Сменить язык",
"sv_SE": "Byt språk",
"th_TH": "เปลี่ยนภาษา",
"tr_TR": "Dili Değiştir",
"uk_UA": "Змінити мову",
"zh_CN": "更改界面语言",
"zh_TW": "變更語言"
}
},
{
"ID": "MenuBarShowFileTypes",
"Translations": {
@@ -13696,7 +13321,7 @@
"th_TH": "",
"tr_TR": "",
"uk_UA": "",
"zh_CN": "",
"zh_CN": "将 CLR 的垃圾回收器设置为低延迟模式。\n\n这可能会减少卡顿,但会以性能为代价。\n\n不确定的话就保持关闭。",
"zh_TW": ""
}
},
@@ -14975,31 +14600,6 @@
"zh_TW": "順時針旋轉 90°"
}
},
{
"ID": "MenuBarOptionsShowConsole",
"Translations": {
"ar_SA": "عرض وحدة التحكم",
"de_DE": "Zeige Konsole",
"el_GR": "Εμφάνιση Κονσόλας",
"en_US": "Show Console",
"es_ES": "Mostrar Consola",
"fr_FR": "Afficher la Console",
"he_IL": "הצג שורת פקודות",
"it_IT": "Mostra console",
"ja_JP": "コンソールを表示",
"ko_KR": "콘솔 표시",
"no_NO": "Vis konsoll",
"pl_PL": "Pokaż Konsolę",
"pt_BR": "Exibir Console",
"ru_RU": "Показать консоль",
"sv_SE": "Visa konsoll",
"th_TH": "แสดง คอนโซล",
"tr_TR": "Konsol'u Göster",
"uk_UA": "Показати консоль",
"zh_CN": "显示控制台",
"zh_TW": "顯示控制台"
}
},
{
"ID": "ShaderCachePurgeError",
"Translations": {
@@ -16225,106 +15825,6 @@
"zh_TW": "選取支援的檔案格式"
}
},
{
"ID": "LoadApplicationFromFileDialogTitle",
"Translations": {
"ar_SA": "",
"de_DE": "",
"el_GR": "",
"en_US": "Choose a Switch compatible FILE to load",
"es_ES": "Elige un ARCHIVO compatible con Switch para cargar",
"fr_FR": "Choisissez un FICHIER compatible Switch à charger",
"he_IL": "",
"it_IT": "Scegli un FILE compatibile con Switch da caricare",
"ja_JP": "",
"ko_KR": "불러올 Switch 호환 파일을 선택",
"no_NO": "",
"pl_PL": "",
"pt_BR": "Escolha um ARQUIVO compatível com Switch para carregar",
"ru_RU": "Выберите ФАЙЛ, совместимый с Switch, для загрузки",
"sv_SE": "Välj en Switch-kompatibel FIL att läsa in",
"th_TH": "",
"tr_TR": "",
"uk_UA": "Виберіть ФАЙЛ, сумісний із Switch, для завантаження",
"zh_CN": "请选择要加载的 Switch 兼容文件",
"zh_TW": "請選擇要載入的 Switch 相容檔案"
}
},
{
"ID": "LoadUnpackedGameFromFolderDialogTitle",
"Translations": {
"ar_SA": "",
"de_DE": "",
"el_GR": "",
"en_US": "Choose an UNPACKED Switch compatible application to load",
"es_ES": "Elige una aplicación DESEMPAQUETADA compatible con Switch para cargar",
"fr_FR": "Choisissez une application DÉCOMPRESSEÉE compatible avec Switch à charger",
"he_IL": "",
"it_IT": "Scegli unapplicazione DECOMPRESSA compatibile con Switch da caricare",
"ja_JP": "",
"ko_KR": "불러올 언팩된 Switch 호환 앱을 선택",
"no_NO": "",
"pl_PL": "",
"pt_BR": "Escolha um aplicativo DESCOMPACTADO compatível com Switch para carregar",
"ru_RU": "Выберите РАСПАКОВАННОЕ, совместимое с Switch, приложение для загрузки",
"sv_SE": "Välj en UPPACKAD Switch-kompatibel applikation att läsa in",
"th_TH": "",
"tr_TR": "",
"uk_UA": "Виберіть РОЗПАКОВАНИЙ сумісний із Switch додаток для завантаження",
"zh_CN": "请选择要加载的已解包的 Switch 兼容应用程序",
"zh_TW": "請選擇要載入的已解壓縮 Switch 相容應用程式"
}
},
{
"ID": "LoadTitleUpdatesFromFolderDialogTitle",
"Translations": {
"ar_SA": "",
"de_DE": "",
"el_GR": "",
"en_US": "Choose one or more FOLDERS to bulk load title updates from",
"es_ES": "Elige una o más CARPETAS para cargar actualizaciones de título de forma masiva",
"fr_FR": "Choisissez un ou plusieurs DOSSIERS pour charger en masse des mises à jour de titres",
"he_IL": "",
"it_IT": "Scegli una o più CARTELLE da cui caricare in blocco gli aggiornamenti del titolo",
"ja_JP": "",
"ko_KR": "타이틀 업데이트를 대량으로 불러올 폴더를 하나 이상 선택",
"no_NO": "",
"pl_PL": "",
"pt_BR": "Escolha uma ou mais PASTAS para carregar atualizações de título em massa",
"ru_RU": "Выберите одну или несколько ПАПОК для массовой загрузки обновлений заголовков",
"sv_SE": "Välj en eller flera MAPPAR för att läsa in alla titeluppdateringar från",
"th_TH": "",
"tr_TR": "",
"uk_UA": "Виберіть одну або кілька ПАПОК для масового завантаження оновлень титулів",
"zh_CN": "请选择一个或多个文件夹来批量加载游戏更新",
"zh_TW": "請選擇一個或多個資料夾以批次載入遊戲更新"
}
},
{
"ID": "LoadDLCFromFolderDialogTitle",
"Translations": {
"ar_SA": "",
"de_DE": "",
"el_GR": "",
"en_US": "Choose one or more FOLDERS to bulk load DLC from",
"es_ES": "Elige una o más CARPETAS para cargar DLC de forma masiva",
"fr_FR": "Choisissez un ou plusieurs DOSSIERS pour charger en masse des DLC",
"he_IL": "",
"it_IT": "Scegli una o più CARTELLE da cui caricare DLC in blocco",
"ja_JP": "",
"ko_KR": "DLC를 대량으로 불러올 폴더를 하나 이상 선택",
"no_NO": "",
"pl_PL": "",
"pt_BR": "Escolha uma ou mais PASTAS para carregar DLC em massa",
"ru_RU": "Выберите одну или несколько ПАПОК для массовой загрузки DLC",
"sv_SE": "Välj en eller flera MAPPAR för att läsa in alla DLC från",
"th_TH": "",
"tr_TR": "",
"uk_UA": "Виберіть одну або кілька ПАПОК для масового завантаження DLC",
"zh_CN": "请选择一个或多个文件夹来批量加载 DLC",
"zh_TW": "請選擇一個或多個資料夾以批次載入 DLC"
}
},
{
"ID": "AllSupportedFormats",
"Translations": {
@@ -17675,31 +17175,6 @@
"zh_TW": "反修剪"
}
},
{
"ID": "UpdateWindowUpdateAddedMessage",
"Translations": {
"ar_SA": "",
"de_DE": "",
"el_GR": "",
"en_US": "{0} new update(s) added",
"es_ES": "{0} nueva(s) actualización(es) agregada(s)",
"fr_FR": "{0} nouvelle(s) mise(s) à jour ajoutée(s)",
"he_IL": "",
"it_IT": "{0} nuovo/i aggiornamento/i aggiunto/i",
"ja_JP": "",
"ko_KR": "{0}개의 신규 업데이트가 추가됨",
"no_NO": "{0} ny(e) oppdatering(er) lagt til",
"pl_PL": "",
"pt_BR": "{0} nova(s) atualização(ões) adicionada(s)",
"ru_RU": "Добавлено {0} новых обновлений",
"sv_SE": "{0} nya uppdatering(ar) lades till",
"th_TH": "มีอัปเดตใหม่เข้ามา {0} รายการ",
"tr_TR": "",
"uk_UA": "{0} нових оновлень додано",
"zh_CN": "{0} 个更新被添加",
"zh_TW": "已加入 {0} 個遊戲更新"
}
},
{
"ID": "UpdateWindowBundledContentNotice",
"Translations": {
@@ -17825,131 +17300,6 @@
"zh_TW": "{0} 個可下載內容"
}
},
{
"ID": "DlcWindowDlcAddedMessage",
"Translations": {
"ar_SA": "",
"de_DE": "",
"el_GR": "",
"en_US": "{0} New Downloadable Content(s) Added",
"es_ES": "Se agregó/aron {0} nuevo(s) contenido(s) descargable(s)",
"fr_FR": "{0} nouveau(x) contenu(s) téléchargeable(s) ajouté(s)",
"he_IL": "",
"it_IT": "{0} nuovo/i DLC aggiunto/i",
"ja_JP": "",
"ko_KR": "{0}개의 새로운 내려받기 가능한 콘텐츠가 추가됨",
"no_NO": "{0} nytt nedlastbart innhold lagt til",
"pl_PL": "",
"pt_BR": "{0} novo(s) conteúdo(s) para download adicionado(s)",
"ru_RU": "Добавлено {0} новое/ых DLC",
"sv_SE": "{0} nya hämtningsbara innehåll lades till",
"th_TH": "มีเนื้อหาเสริมใหม่ {0} รายการ",
"tr_TR": "",
"uk_UA": "{0} нового завантажувального вмісту додано",
"zh_CN": "{0} 个 DLC 被添加",
"zh_TW": "已加入 {0} 個 DLC"
}
},
{
"ID": "AutoloadDlcAddedMessage",
"Translations": {
"ar_SA": "",
"de_DE": "",
"el_GR": "",
"en_US": "{0} New Downloadable Content(s) Added",
"es_ES": "Se agregó/aron {0} nuevo(s) contenido(s) descargable(s)",
"fr_FR": "{0} nouveau(x) contenu(s) téléchargeable(s) ajouté(s)",
"he_IL": "",
"it_IT": "{0} nuovo/i DLC aggiunto/i",
"ja_JP": "",
"ko_KR": "{0}개의 새로운 DLC가 추가됨",
"no_NO": "{0} nytt nedlastbart innhold lagt til",
"pl_PL": "",
"pt_BR": "{0} novo(s) conteúdo(s) para download adicionado(s)",
"ru_RU": "Добавлено {0} новое/ых DLC",
"sv_SE": "{0} nya hämtningsbara innehåll lades till",
"th_TH": "เพิ่มเนื้อหาเสริมดาวน์โหลดใหม่ {0} รายการ",
"tr_TR": "",
"uk_UA": "{0} нового завантажувального вмісту додано",
"zh_CN": "{0} 个 DLC 被添加",
"zh_TW": "已加入 {0} 個 DLC"
}
},
{
"ID": "AutoloadDlcRemovedMessage",
"Translations": {
"ar_SA": "",
"de_DE": "",
"el_GR": "",
"en_US": "{0} Missing Downloadable Content(s) Removed",
"es_ES": "Se eliminó/aron {0} contenido(s) descargable(s) faltante(s)",
"fr_FR": "{0} contenu(s) téléchargeable(s) manquant(s) supprimé(s)",
"he_IL": "",
"it_IT": "{0} DLC mancante/i rimosso/i",
"ja_JP": "",
"ko_KR": "{0}개의 내려받기 가능한 콘텐츠가 제거됨",
"no_NO": "{0} manglende nedlastbart innhold fjernet",
"pl_PL": "",
"pt_BR": "{0} conteúdo(s) para download ausente(s) removido(s)",
"ru_RU": "Убрано {0} отсутствующие/х DLC",
"sv_SE": "{0} saknade hämtningsbara innehåll togs bort",
"th_TH": "ลบเนื้อหาเสริมที่หายไปจำนวน {0} รายการ",
"tr_TR": "",
"uk_UA": "{0} відсутнього завантажувального вмісту видалено",
"zh_CN": "{0} 个失效的 DLC 已移除",
"zh_TW": "已刪除 {0} 個遺失的 DLC"
}
},
{
"ID": "AutoloadUpdateAddedMessage",
"Translations": {
"ar_SA": "",
"de_DE": "",
"el_GR": "",
"en_US": "{0} New Update(s) Added",
"es_ES": "Se agregó/aron {0} nueva(s) actualización(es)",
"fr_FR": "{0} nouvelle(s) mise(s) à jour ajoutée(s)",
"he_IL": "",
"it_IT": "{0} nuovo/i aggiornamento/i aggiunto/i",
"ja_JP": "",
"ko_KR": "{0}개의 신규 업데이트가 추가됨",
"no_NO": "{0} ny(e) oppdatering(er) lagt til",
"pl_PL": "",
"pt_BR": "{0} nova(s) atualização(ões) adicionada(s)",
"ru_RU": "Добавлено {0} новое/ых обновление/й",
"sv_SE": "{0} nya uppdatering(ar) lades till",
"th_TH": "เพิ่มการอัปเดตใหม่ {0} รายการ",
"tr_TR": "",
"uk_UA": "{0} нових оновлень додано",
"zh_CN": "{0} 个游戏更新被添加",
"zh_TW": "已加入 {0} 個遊戲更新"
}
},
{
"ID": "AutoloadUpdateRemovedMessage",
"Translations": {
"ar_SA": "",
"de_DE": "",
"el_GR": "",
"en_US": "{0} Missing Update(s) Removed",
"es_ES": "Se eliminó/aron {0} actualización(es) faltante(s)",
"fr_FR": "{0} mise(s) à jour manquante(s) supprimée(s)",
"he_IL": "",
"it_IT": "{0} aggiornamento/i mancante/i rimosso/i",
"ja_JP": "",
"ko_KR": "누락된 업데이트 {0}개 삭제",
"no_NO": "{0} manglende oppdatering(er) fjernet",
"pl_PL": "",
"pt_BR": "{0} atualização(ões) ausente(s) removida(s)",
"ru_RU": "Убрано {0} отсутствующие/х обновление/й",
"sv_SE": "{0} saknade uppdatering(ar) togs bort",
"th_TH": "ลบการอัปเดตที่หายไปจำนวน {0} รายการ",
"tr_TR": "",
"uk_UA": "{0} відсутніх оновлень видалено",
"zh_CN": "{0} 个失效的游戏更新已移除",
"zh_TW": "已刪除 {0} 個遺失的遊戲更新"
}
},
{
"ID": "ModWindowHeading",
"Translations": {

View File

@@ -0,0 +1,79 @@
{
"Locales": [
{
"ID": "StartGamesInFullscreenCheckboxLabel",
"Translations": {
"ar_SA": "ابدأ الألعاب بملء الشاشة",
"de_DE": "Spiele im Vollbild starten",
"el_GR": "Εκκίνηση Παιχνιδιών σε Πλήρη Οθόνη",
"en_US": "Start Games in Fullscreen",
"es_ES": "Iniciar Juegos en Pantalla Completa",
"fr_FR": "Démarrer les Jeux en Plein Écran",
"he_IL": "התחל משחקים במסך מלא",
"it_IT": "Avvia i giochi a schermo intero",
"ja_JP": "全画面でゲームを開始",
"ko_KR": "전체 화면으로 게임 시작",
"no_NO": "Start spill i fullskjerm",
"pl_PL": "Uruchamiaj gry na pełnym ekranie",
"pt_BR": "Iniciar Jogos em Tela Cheia",
"ru_RU": "Запускать игры в полноэкранном режиме",
"sv_SE": "Starta spel i helskärm",
"th_TH": "เริ่มเกมแบบเต็มหน้าจอ",
"tr_TR": "Oyunları Tam Ekranda Başlat",
"uk_UA": "Запускати ігри в повноекранному режимі",
"zh_CN": "全屏启动游戏",
"zh_TW": "以全螢幕啟動遊戲"
}
},
{
"ID": "StartGamesWithoutUICheckboxLabel",
"Translations": {
"ar_SA": "",
"de_DE": "Benutzeroberfläche beim Spielstart ausblenden",
"el_GR": "",
"en_US": "Hide UI on Game Start",
"es_ES": "Ocultar la Interfaz al Iniciar el Juego",
"fr_FR": "Masquer lInterface au Lancement du Jeu",
"he_IL": "",
"it_IT": "Nascondi linterfaccia allavvio del gioco",
"ja_JP": "",
"ko_KR": "게임 시작 시 UI 숨기기",
"no_NO": "Skjul brukergrensesnitt ved spillstart",
"pl_PL": "",
"pt_BR": "Ocultar a interface ao iniciar o jogo",
"ru_RU": "Скрывать интерфейс при запуске игры",
"sv_SE": "Dölj användargränssnitt vid spelstart",
"th_TH": "ซ่อน UI เมื่อเริ่มเกม",
"tr_TR": "",
"uk_UA": "Приховувати інтерфейс під час запуску гри",
"zh_CN": "启动游戏时隐藏界面",
"zh_TW": "啟動遊戲時隱藏介面"
}
},
{
"ID": "StartGamesWithoutUICheckboxLabelToolTip",
"Translations": {
"ar_SA": "",
"de_DE": "",
"el_GR": "",
"en_US": "Automatically hides Ryujinx's UI whenever a game launches. While in-game, press F4 to show the UI.",
"es_ES": "",
"fr_FR": "Masque automatiquement l'interface de Ryujinx au lancement d'un jeu. En jeu, appuyez sur F4 pour afficher l'interface.",
"he_IL": "",
"it_IT": "",
"ja_JP": "",
"ko_KR": "",
"no_NO": "",
"pl_PL": "",
"pt_BR": "",
"ru_RU": "Автоматически скрывает интерфейс Ryujinx при запуске игры. Во время игры нажмите F4, чтобы показать интерфейс.",
"sv_SE": "",
"th_TH": "",
"tr_TR": "",
"uk_UA": "",
"zh_CN": "",
"zh_TW": ""
}
}
]
}

View File

@@ -1,23 +1,11 @@
#!/bin/sh
#!/usr/bin/env sh
SCRIPT_DIR=$(dirname "$(realpath "$0")")
if [ -f "$SCRIPT_DIR/Ryujinx.Headless.SDL3" ]; then
RYUJINX_BIN="Ryujinx.Headless.SDL3"
fi
if [ -f "$SCRIPT_DIR/Ryujinx" ]; then
RYUJINX_BIN="Ryujinx"
fi
if [ -z "$RYUJINX_BIN" ]; then
exit 1
fi
COMMAND="env LANG=C.UTF-8 DOTNET_EnableAlternateStackCheck=1"
if command -v gamemoderun > /dev/null 2>&1; then
COMMAND="$COMMAND gamemoderun"
fi
exec $COMMAND "$SCRIPT_DIR/$RYUJINX_BIN" "$@"
exec $COMMAND "$SCRIPT_DIR/Ryujinx" "$@"

View File

@@ -1,14 +1,12 @@
[Desktop Entry]
Version=1.0
Version=1.5
Name=Ryujinx
Type=Application
Icon=Ryujinx
Icon=app.ryujinx.Ryujinx
Exec=Ryujinx.sh %f
Comment=A Nintendo Switch Emulator
GenericName=Nintendo Switch Emulator
Terminal=false
Categories=Game;Emulator;
MimeType=application/x-nx-nca;application/x-nx-nro;application/x-nx-nso;application/x-nx-nsp;application/x-nx-xci;
Keywords=Switch;Nintendo;Emulator;
StartupWMClass=Ryujinx
PrefersNonDefaultGPU=true

View File

@@ -1,3 +0,0 @@
#!/bin/sh
CURRENTDIR="$(readlink -f "$(dirname "$0")")"
exec "$CURRENTDIR"/usr/bin/Ryujinx.sh "$@"

View File

@@ -0,0 +1,25 @@
<?xml version="1.0" encoding="UTF-8"?>
<component type="desktop-application">
<id>app.ryujinx.Ryujinx</id>
<metadata_license>MIT</metadata_license>
<project_license>MIT</project_license>
<name>Ryujinx</name>
<summary>Nintendo Switch 1 emulator written in C#</summary>
<description>
<p>Ryujinx is an open-source Nintendo Switch emulator, originally created by gdkchan, written in C#.</p>
</description>
<launchable type="desktop-id">app.ryujinx.Ryujinx.desktop</launchable>
<url type="homepage">https://ryujinx.app/</url>
<developer id="app.ryujinx">
<name>Ryubing</name>
</developer>
<screenshots>
<screenshot type="default">
<image>https://git.ryujinx.app/projects/Ryubing/raw/branch/master/docs/shell.png</image>
</screenshot>
</screenshots>
<provides>
<id>app.ryujinx.Ryujinx.desktop</id>
</provides>
<content_rating type="oars-1.1" />
</component>

View File

@@ -1,4 +1,4 @@
#!/bin/sh
#!/usr/bin/env sh
set -eu
ROOTDIR="$(readlink -f "$(dirname "$0")")"/../../../
@@ -7,20 +7,33 @@ cd "$ROOTDIR"
BUILDDIR=${BUILDDIR:-publish}
OUTDIR=${OUTDIR:-publish_appimage}
# AppStream
rm -rf AppDir
mkdir -p AppDir/usr/bin
mkdir -p AppDir/usr/lib AppDir/usr/bin
mkdir -p AppDir/usr/share/metainfo AppDir/usr/share/applications
mkdir -p AppDir/usr/share/icons/hicolor/256x256/apps/
cp distribution/linux/Ryujinx.desktop AppDir/Ryujinx.desktop
cp distribution/linux/appimage/AppRun AppDir/AppRun
cp distribution/misc/Logo.svg AppDir/Ryujinx.svg
cp -r "$BUILDDIR"/* AppDir/usr/lib/
cp distribution/linux/appimage/app.ryujinx.Ryujinx.appdata.xml AppDir/usr/share/metainfo/app.ryujinx.Ryujinx.appdata.xml
cp distribution/linux/app.ryujinx.Ryujinx.desktop AppDir/usr/share/applications/app.ryujinx.Ryujinx.desktop
cp distribution/misc/Logo.png AppDir/usr/share/icons/hicolor/256x256/apps/app.ryujinx.Ryujinx.png
ln -s ../lib/Ryujinx AppDir/usr/bin/Ryujinx
cp -r "$BUILDDIR"/* AppDir/usr/bin/
# AppImage Root
ln -s ./usr/share/applications/app.ryujinx.Ryujinx.desktop AppDir/app.ryujinx.Ryujinx.desktop
ln -s ./usr/share/icons/hicolor/256x256/apps/app.ryujinx.Ryujinx.png AppDir/.DirIcon
ln -s ./usr/share/icons/hicolor/256x256/apps/app.ryujinx.Ryujinx.png AppDir/app.ryujinx.Ryujinx.png
ln -s ./usr/lib/Ryujinx.sh AppDir/AppRun
# Ensure necessary bins are set as executable
chmod +x AppDir/AppRun AppDir/usr/bin/Ryujinx*
mkdir -p "$OUTDIR"
# The "-n" flag removes the appstream checks during build, in case the main website is down.
# Run "appstreamcli validate --explain AppDir/usr/share/metainfo/app.ryujinx.Ryujinx.appdata.xml" to check manually
appimagetool --appimage-extract-and-run -n --comp zstd --mksquashfs-opt -Xcompression-level --mksquashfs-opt 21 \
AppDir "$OUTDIR"/Ryujinx.AppImage
AppDir "$OUTDIR"/Ryujinx.AppImage

BIN
distribution/misc/Logo.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 28 KiB

File diff suppressed because one or more lines are too long

Before

Width:  |  Height:  |  Size: 1.2 MiB

View File

@@ -24,6 +24,9 @@ namespace Ryujinx.Common.Helper
public static bool IsTypeAssociationSupported => (OperatingSystem.IsLinux() || OperatingSystem.IsWindows());
// NOTE: On macOS, users have a more robust file association system (via Right-Click > Get Info > "Open with:" > Ryujinx > "Change All...)
// Custom file association isn't strictly necessary and will not provide any additional benefit to macOS users.
public static bool AreMimeTypesRegistered
{
get
@@ -38,8 +41,6 @@ namespace Ryujinx.Common.Helper
return AreMimeTypesRegisteredWindows();
}
// TODO: Add macOS support.
return false;
}
}
@@ -173,8 +174,6 @@ namespace Ryujinx.Common.Helper
return InstallWindowsMimeTypes();
}
// TODO: Add macOS support.
return false;
}
@@ -190,8 +189,6 @@ namespace Ryujinx.Common.Helper
return InstallWindowsMimeTypes(true);
}
// TODO: Add macOS support.
return false;
}
}

View File

@@ -147,6 +147,7 @@ namespace Ryujinx.Common
"0100c1f0051b6000", // Donkey Kong Country: Tropical Freeze
"0100ed000d390000", // Dr. Kawashima's Brain Training
"010067b017588000", // Endless Ocean Luminous
"01003da010e8a000", // Miitopia
"01006b5012b32000", // Part Time UFO
"0100704000B3A000", // Snipperclips
"01006a800016e000", // Super Smash Bros. Ultimate

View File

@@ -52,7 +52,7 @@
<ItemGroup>
<PackageReference Include="OpenTK.Windowing.GraphicsLibraryFramework" />
<PackageReference Include="shaderc.net" />
<PackageReference Include="Silk.NET.Shaderc" ExcludeAssets="native" />
<PackageReference Include="Silk.NET.Vulkan" />
<PackageReference Include="Silk.NET.Vulkan.Extensions.EXT" />
<PackageReference Include="Silk.NET.Vulkan.Extensions.KHR" />

View File

@@ -1,22 +1,17 @@
using Ryujinx.Common.Logging;
using Ryujinx.Graphics.GAL;
using Ryujinx.Graphics.Shader;
using shaderc;
using Silk.NET.Shaderc;
using Silk.NET.Vulkan;
using System;
using System.Runtime.InteropServices;
using System.Threading;
using System.Threading.Tasks;
using Result = shaderc.Result;
namespace Ryujinx.Graphics.Vulkan
{
class Shader : IDisposable
{
// The shaderc.net dependency's Options constructor and dispose are not thread safe.
// Take this lock when using them.
private static readonly Lock _shaderOptionsLock = new();
private static readonly nint _ptrMainEntryPointName = Marshal.StringToHGlobalAnsi("main");
private readonly Vk _api;
@@ -75,38 +70,33 @@ namespace Ryujinx.Graphics.Vulkan
private unsafe static byte[] GlslToSpirv(string glsl, ShaderStage stage)
{
Options options;
Shaderc api = Shaderc.GetApi();
Compiler* compiler = api.CompilerInitialize();
CompileOptions* options = api.CompileOptionsInitialize();
lock (_shaderOptionsLock)
api.CompileOptionsSetSourceLanguage(options, SourceLanguage.Glsl);
api.CompileOptionsSetTargetSpirv(options, SpirvVersion.Shaderc15);
api.CompileOptionsSetTargetEnv(options, TargetEnv.Vulkan, Vk.Version12);
CompilationResult* scr = api.CompileIntoSpv(compiler, glsl, (nuint)glsl.Length, GetShaderCShaderStage(stage), "Ryu", "main", options);
CompilationStatus status = api.ResultGetCompilationStatus(scr);
if (status != CompilationStatus.Success)
{
options = new Options(false)
{
SourceLanguage = SourceLanguage.Glsl,
TargetSpirVVersion = new SpirVVersion(1, 5),
};
}
options.SetTargetEnvironment(TargetEnvironment.Vulkan, EnvironmentVersion.Vulkan_1_2);
Compiler compiler = new(options);
Result scr = compiler.Compile(glsl, "Ryu", GetShaderCShaderStage(stage));
lock (_shaderOptionsLock)
{
options.Dispose();
}
if (scr.Status != Status.Success)
{
Logger.Error?.Print(LogClass.Gpu, $"Shader compilation error: {scr.Status} {scr.ErrorMessage}");
Logger.Error?.Print(LogClass.Gpu, $"Shader compilation error: {status} {api.ResultGetErrorMessageS(scr)}");
return null;
}
Span<byte> spirvBytes = new((void*)scr.CodePointer, (int)scr.CodeLength);
Span<byte> spirvBytes = new(api.ResultGetBytes(scr), (int)api.ResultGetLength(scr));
byte[] code = new byte[(scr.CodeLength + 3) & ~3];
byte[] code = new byte[(spirvBytes.Length + 3) & ~3];
spirvBytes.CopyTo(code.AsSpan()[..(int)scr.CodeLength]);
spirvBytes.CopyTo(code.AsSpan()[..spirvBytes.Length]);
api.CompilerRelease(compiler);
api.CompileOptionsRelease(options);
return code;
}

View File

@@ -818,8 +818,7 @@ namespace Ryujinx.Ava.Systems
if (!Device.LoadCart(ApplicationPath, romFsFiles[0]))
{
await ContentDialogHelper.CreateErrorDialog(
"Please specify an unpacked game directory with a valid exefs or NSO/NRO.");
await ContentDialogHelper.CreateErrorDialog(LocaleManager.Instance.UpdateAndGetDynamicValue(LocaleKeys.Error_NoUnpackedApplicationFoundInFolder));
Device.Dispose();
cts.Cancel();
@@ -831,8 +830,7 @@ namespace Ryujinx.Ava.Systems
Logger.Info?.Print(LogClass.Application, "Loading as cart WITHOUT RomFS.");
if (!Device.LoadCart(ApplicationPath))
{
await ContentDialogHelper.CreateErrorDialog(
"Please specify an unpacked game directory with a valid exefs or NSO/NRO.");
await ContentDialogHelper.CreateErrorDialog(LocaleManager.Instance.UpdateAndGetDynamicValue(LocaleKeys.Error_NoUnpackedApplicationFoundInFolder));
Device.Dispose();
cts.Cancel();
throw new OperationCanceledException(cts.Token);

View File

@@ -46,7 +46,7 @@ namespace Ryujinx.Ava.Systems
LargeImageText = TruncateToByteLength(_description)
},
Details = "Main Menu",
State = "Idling",
State = "Waiting",
Timestamps = EmulatorStartedAt
};

View File

@@ -1069,7 +1069,6 @@ namespace Ryujinx.Ava.Systems.PlayReport
_ => FormattedValue.ForceReset
};
private static FormattedValue TomodachiLifeLTD_Status(SingleValue value)
{
MessagePackObject messagePackObject = value.Matched.PackedValue;
@@ -1077,8 +1076,9 @@ namespace Ryujinx.Ava.Systems.PlayReport
int miiCount = messagePackObjectDictionary["MiiNum"].AsInt32();
int fountainLevel = messagePackObjectDictionary["FountainLevel"].AsInt32();
return $"Looking after {"Mii".ToQuantity(miiCount)}, with an island level of {fountainLevel}";
// Fountain Level should be kept consistent throughout code, so I basically made sure of it
return $"Looking after {"Mii".ToQuantity(miiCount)}, with a fountain level of {fountainLevel}";
}
private static FormattedValue AnimalCrossingNewHorizons_AppCommon(SingleValue value)
@@ -1088,5 +1088,33 @@ namespace Ryujinx.Ava.Systems.PlayReport
return $"Living on {messagePackObjectDictionary["LandName"].AsString()} Island";
}
private static FormattedValue MiitopiaRPC(SparseMultiValue values)
{
if (values.Matched.TryGetValue("gold", out Value gold) && values.Matched.TryGetValue("stage", out Value location))
{
return $"{LocFinal(location.ToString())} with {gold} gold";
}
if (values.Matched.TryGetValue("secret", out Value secret)) // Yes "secret" is unused, but it only appears in the MII selector.
{
return $"In the MII selector";
}
return $"At the main menu";
static string LocFinal(string? location) => location switch
{
"0" => "Somewhere in Miitopia",
"1" => "Wandering around Greenhorne",
"2" => "Trodding through Neksdor",
"3" => "Exploring The Realm of the Fey",
"4" => "Burning their feet at Karkaton",
"5" => "Soaring in the skies of Miitopia",
"6" => "Fighting up The Sky Scraper",
"7" => "Traveling Miitopia",
_ => "Wandering"
};
}
}
}

View File

@@ -132,6 +132,12 @@ namespace Ryujinx.Ava.Systems.PlayReport
.WithDescription("based on your island name.")
.AddValueFormatter("AppCmn", AnimalCrossingNewHorizons_AppCommon)
)
.AddSpec(
"01003da010e8a000", // Miitopia 01003da010e8a000
spec => spec
.WithDescription("based on gold count, report info only in the mii selector, and gamestage (progression)")
.AddSparseMultiValueFormatter(["gold", "secret", "stage"], MiitopiaRPC)
)
);
private static string Playing(string game) => $"Playing {game}";

View File

@@ -6,6 +6,7 @@ using System;
using System.Collections.Generic;
using System.Globalization;
using Key = Ryujinx.Input.Key;
using HidKey = Ryujinx.Common.Configuration.Hid.Key;
namespace Ryujinx.Ava.UI.Helpers
{
@@ -55,6 +56,9 @@ namespace Ryujinx.Ava.UI.Helpers
Key key => KeyboardLayoutLocaleHelper.TryGetSemanticLabel(key, out string localizedKeyLabel)
? localizedKeyLabel
: key.ToString(),
HidKey key => KeyboardLayoutLocaleHelper.TryGetSemanticLabel((Key)(int)key, out string localizedHidKeyLabel)
? localizedHidKeyLabel
: key.ToString(),
PhysicalKey physicalKey => PhysicalKeyLabelHelper.GetDisplayString(physicalKey),
GamepadInputId gamepadInputId => GetLocalizedMappedValue(gamepadInputId, _gamepadInputIdMap),
StickInputId stickInputId => GetLocalizedMappedValue(stickInputId, _stickInputIdMap),

View File

@@ -250,7 +250,7 @@ namespace Ryujinx.Ava.UI.ViewModels
private Task ShowNewDlcAddedDialog(int numAdded)
{
string msg = string.Format(LocaleManager.Instance[LocaleKeys.DlcWindowDlcAddedMessage], numAdded);
string msg = string.Format(LocaleManager.Instance[LocaleKeys.Dialog_ContentLoading_DLCAddedMessage], numAdded);
return Dispatcher.UIThread.InvokeAsync(async () =>
{
await ContentDialogHelper.ShowTextDialog(

View File

@@ -2,6 +2,7 @@ using Avalonia.Svg.Skia;
using CommunityToolkit.Mvvm.ComponentModel;
using Ryujinx.Ava.UI.Models.Input;
using Ryujinx.Ava.UI.Views.Input;
using Ryujinx.Common.Helper;
using Ryujinx.Common.Utilities;
using Ryujinx.UI.Views.Input;
@@ -59,32 +60,46 @@ namespace Ryujinx.Ava.UI.ViewModels.Input
public partial SvgImage Image { get; set; }
public InputViewModel ParentModel { get; }
private readonly RefEvent<System.Drawing.Color>.Handler _rainbowLedHandler;
public ControllerInputViewModel(InputViewModel model, GamepadInputConfig config, StickVisualizer visualizer)
{
ParentModel = model;
Visualizer = visualizer;
_rainbowLedHandler = SetRainbowLed;
model.NotifyChangesEvent += OnParentModelChanged;
OnParentModelChanged();
config.PropertyChanged += (_, args) =>
{
if (args.PropertyName is nameof(Config.UseRainbowLed))
{
if (Config is { UseRainbowLed: true, TurnOffLed: false, EnableLedChanging: true })
Rainbow.Updated += (ref color) => ParentModel.SelectedGamepad.SetLed((uint)color.ToArgb());
else
{
Rainbow.Reset();
if (Config.TurnOffLed)
ParentModel.SelectedGamepad.ClearLed();
else
ParentModel.SelectedGamepad.SetLed(Config.LedColor.ToUInt32());
}
}
};
config.PropertyChanged += OnConfigPropertyChanged;
Config = config;
}
private void OnConfigPropertyChanged(object sender, System.ComponentModel.PropertyChangedEventArgs args)
{
if (args.PropertyName is nameof(Config.UseRainbowLed))
{
if (Config is { UseRainbowLed: true, TurnOffLed: false, EnableLedChanging: true })
{
Rainbow.Updated -= _rainbowLedHandler;
Rainbow.Updated += _rainbowLedHandler;
}
else
{
Rainbow.Reset();
if (Config.TurnOffLed)
ParentModel.SelectedGamepad.ClearLed();
else
ParentModel.SelectedGamepad.SetLed(Config.LedColor.ToUInt32());
}
}
}
private void SetRainbowLed(ref System.Drawing.Color color)
{
ParentModel.SelectedGamepad.SetLed((uint)color.ToArgb());
}
public async void ShowMotionConfig()
{
await MotionInputView.Show(this);

View File

@@ -23,7 +23,6 @@ using Ryujinx.Input.SDL3;
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Drawing;
using System.IO;
using System.Linq;
using System.Text.Json;
@@ -81,10 +80,6 @@ namespace Ryujinx.Ava.UI.ViewModels.Input
field = value;
if ((field?.Features & GamepadFeaturesFlag.Led) != 0 &&
ConfigViewModel is ControllerInputViewModel { Config.UseRainbowLed: true })
Rainbow.Updated += (ref Color color) => field.SetLed((uint)color.ToArgb());
OnPropertiesChanged(nameof(HasLed), nameof(CanClearLed));
}
}

View File

@@ -136,9 +136,6 @@ namespace Ryujinx.Ava.UI.ViewModels
[ObservableProperty] public partial float VolumeBeforeMute { get; set; }
[ObservableProperty]
public partial bool AreMimeTypesRegistered { get; set; } = FileAssociationHelper.AreMimeTypesRegistered;
[ObservableProperty] public partial Cursor Cursor { get; set; }
[ObservableProperty] public partial string Title { get; set; }
@@ -219,6 +216,11 @@ namespace Ryujinx.Ava.UI.ViewModels
_rendererWaitEvent = new AutoResetEvent(false);
LocaleManager.Instance.PropertyChanged += (sender, args) =>
{
RefreshFileTypeAssociationToggle();
};
if (Program.PreviewerDetached)
{
LoadConfigurableHotKeys();
@@ -679,11 +681,6 @@ namespace Ryujinx.Ava.UI.ViewModels
get => ConsoleHelper.SetConsoleWindowStateSupported;
}
public bool ManageFileTypesVisible
{
get => FileAssociationHelper.IsTypeAssociationSupported;
}
public Glyph Glyph
{
get => (Glyph)ConfigurationState.Instance.UI.GameListViewMode.Value;
@@ -941,6 +938,71 @@ namespace Ryujinx.Ava.UI.ViewModels
return false;
}
public bool FileTypeAssociationsVisible
{
get => FileAssociationHelper.IsTypeAssociationSupported;
}
private void RefreshFileTypeAssociationToggle()
{
OnPropertyChanged(nameof(FileTypeAssociationsMenuHeader));
OnPropertyChanged(nameof(FileTypeAssociationsIcon));
}
private bool _areMimeTypesRegistered = FileAssociationHelper.AreMimeTypesRegistered;
public bool AreMimeTypesRegistered
{
get => _areMimeTypesRegistered;
set
{
if (_areMimeTypesRegistered != value)
{
_areMimeTypesRegistered = value;
RefreshFileTypeAssociationToggle();
}
}
}
public string FileTypeAssociationsMenuHeader =>
AreMimeTypesRegistered
? LocaleManager.Instance[LocaleKeys.MenuBar_File_RemoveFileTypeAssociationsButton]
: LocaleManager.Instance[LocaleKeys.MenuBar_File_AssociateFileTypesButton];
public string FileTypeAssociationsIcon =>
AreMimeTypesRegistered
? "fa-solid fa-link-slash"
: "fa-solid fa-link";
[RelayCommand]
private async Task ToggleFileTypeAssociations()
{
if (AreMimeTypesRegistered)
await RemoveFileTypeAssociations();
else
await AssociateFileTypes();
}
[RelayCommand]
private async Task AssociateFileTypes()
{
AreMimeTypesRegistered = FileAssociationHelper.Install();
if (AreMimeTypesRegistered)
await ContentDialogHelper.CreateInfoDialog(LocaleManager.Instance[LocaleKeys.Dialog_FileTypeAssociations_AssociationSuccessMessage], string.Empty, LocaleManager.Instance[LocaleKeys.InputDialogOk], string.Empty, string.Empty);
else
await ContentDialogHelper.CreateErrorDialog(LocaleManager.Instance[LocaleKeys.Dialog_FileTypeAssociations_AssociationFailedMessage]);
}
[RelayCommand]
private async Task RemoveFileTypeAssociations()
{
AreMimeTypesRegistered = !FileAssociationHelper.Uninstall();
if (!AreMimeTypesRegistered)
await ContentDialogHelper.CreateInfoDialog(LocaleManager.Instance[LocaleKeys.Dialog_FileTypeAssociations_RemoveAssociationSuccessMessage], string.Empty, LocaleManager.Instance[LocaleKeys.InputDialogOk], string.Empty, string.Empty);
else
await ContentDialogHelper.CreateErrorDialog(LocaleManager.Instance[LocaleKeys.Dialog_FileTypeAssociations_RemoveAssociationFailedMessage]);
}
public async Task HandleFirmwareInstallation(string filename)
{
try
@@ -1407,10 +1469,6 @@ namespace Ryujinx.Ava.UI.ViewModels
public void HideUi() => ShowMenuAndStatusBar = false;
public void ToggleStartGamesInFullscreen() => StartGamesInFullscreen = !StartGamesInFullscreen;
public void ToggleStartGamesWithoutUi() => StartGamesWithoutUi = !StartGamesWithoutUi;
public void ToggleShowConsole() => ShowConsole = !ShowConsole;
public void SetListMode() => Glyph = Glyph.List;
@@ -1601,11 +1659,14 @@ namespace Ryujinx.Ava.UI.ViewModels
AppHost.Device.System.SimulateWakeUpMessage();
}
public async Task OpenFile()
public KeyGesture LoadApplicationFromFileGesture => KeyGesture.Parse(OperatingSystem.IsMacOS() ? "Cmd+O" : "Ctrl+O");
public KeyGesture LoadUnpackedGameFromFolderFileGesture => KeyGesture.Parse(OperatingSystem.IsMacOS() ? "Cmd+Shift+O" : "Ctrl+Shift+O");
public async Task LoadApplicationFromFile()
{
Optional<IStorageFile> result = await StorageProvider.OpenSingleFilePickerAsync(new FilePickerOpenOptions
{
Title = LocaleManager.Instance[LocaleKeys.LoadApplicationFromFileDialogTitle],
Title = LocaleManager.Instance[LocaleKeys.Dialog_FileMenu_LoadApplicationFromFileFilePickerTitle],
FileTypeFilter = new List<FilePickerFileType>
{
new(LocaleManager.Instance[LocaleKeys.AllSupportedFormats])
@@ -1671,35 +1732,17 @@ namespace Ryujinx.Ava.UI.ViewModels
else
{
await ContentDialogHelper.CreateErrorDialog(
LocaleManager.Instance[LocaleKeys.MenuBarFileOpenFromFileError]);
LocaleManager.Instance[LocaleKeys.Error_NoApplicationFoundInFile]);
}
}
}
public async Task LoadDlcFromFolder()
{
await LoadContentFromFolder(
LocaleKeys.AutoloadDlcAddedMessage,
LocaleKeys.AutoloadDlcRemovedMessage,
ApplicationLibrary.AutoLoadDownloadableContents,
LocaleKeys.LoadDLCFromFolderDialogTitle);
}
public async Task LoadTitleUpdatesFromFolder()
{
await LoadContentFromFolder(
LocaleKeys.AutoloadUpdateAddedMessage,
LocaleKeys.AutoloadUpdateRemovedMessage,
ApplicationLibrary.AutoLoadTitleUpdates,
LocaleKeys.LoadTitleUpdatesFromFolderDialogTitle);
}
public async Task OpenFolder()
public async Task LoadUnpackedGameFromFolder()
{
Optional<IStorageFolder> result = await StorageProvider.OpenSingleFolderPickerAsync(
new FolderPickerOpenOptions
{
Title = LocaleManager.Instance[LocaleKeys.LoadUnpackedGameFromFolderDialogTitle]
Title = LocaleManager.Instance[LocaleKeys.Dialog_FileMenu_LoadUnpackedApplicationFromFolderFilePickerTitle]
});
if (result.TryGet(out IStorageFolder value))
@@ -1713,6 +1756,36 @@ namespace Ryujinx.Ava.UI.ViewModels
}
}
private async Task<IReadOnlyList<string>?> PickFolders(LocaleKeys titleKey)
{
return (await StorageProvider.OpenMultiFolderPickerAsync(new FolderPickerOpenOptions
{
Title = LocaleManager.Instance[titleKey]
})).TryGet(out IReadOnlyList<IStorageFolder> folders)
? folders.Select(f => f.Path.LocalPath).ToList()
: null;
}
public async Task LoadTitleUpdatesAndDLCFromFolder()
{
if (await PickFolders(LocaleKeys.Dialog_FileMenu_LoadUpdatesAndDLCFromFolderFilePickerTitle) is not { } dirs)
return;
int updAdded = ApplicationLibrary.AutoLoadTitleUpdates(dirs.ToList(), out _);
int dlcAdded = ApplicationLibrary.AutoLoadDownloadableContents(dirs.ToList(), out _);
await Dispatcher.UIThread.InvokeAsync(async () =>
{
await ContentDialogHelper.ShowTextDialog(
LocaleManager.Instance[LocaleKeys.RyujinxConfirm],
string.Format(LocaleManager.Instance[LocaleKeys.Dialog_ContentLoading_UpdatesAddedMessage], updAdded) + "\n\n" +
string.Format(LocaleManager.Instance[LocaleKeys.Dialog_ContentLoading_DLCAddedMessage], dlcAdded),
string.Empty, string.Empty, string.Empty,
LocaleManager.Instance[LocaleKeys.InputDialogOk],
(int)Symbol.Checkmark);
});
}
public static bool InitializeUserConfig(ApplicationData application)
{
// Code where conditions will be met before loading the user configuration (Global Config)

View File

@@ -109,6 +109,31 @@ namespace Ryujinx.Ava.UI.ViewModels
}
}
public bool StartGamesInFullscreen
{
get => ConfigurationState.Instance.UI.StartFullscreen;
set
{
if (ConfigurationState.Instance.UI.StartFullscreen.Value != value)
{
ConfigurationState.Instance.UI.StartFullscreen.Value = value;
OnPropertyChanged();
}
}
}
public bool StartGamesWithoutUi
{
get => ConfigurationState.Instance.UI.StartNoUI;
set
{
if (ConfigurationState.Instance.UI.StartNoUI.Value != value)
{
ConfigurationState.Instance.UI.StartNoUI.Value = value;
OnPropertyChanged();
}
}
}
public int GraphicsBackendMultithreadingIndex
{
get;
@@ -638,6 +663,8 @@ namespace Ryujinx.Ava.UI.ViewModels
HideCursor = (int)config.HideCursor.Value;
UpdateCheckerType = (int)config.UpdateCheckerType.Value;
FocusLostActionType = (int)config.FocusLostActionType.Value;
StartGamesInFullscreen = config.UI.StartFullscreen;
StartGamesWithoutUi = config.UI.StartNoUI;
GameDirectories.Clear();
GameDirectories.AddRange(config.UI.GameDirs.Value);
@@ -758,6 +785,8 @@ namespace Ryujinx.Ava.UI.ViewModels
config.FocusLostActionType.Value = (FocusLostType)FocusLostActionType;
config.UI.GameDirs.Value = [.. GameDirectories];
config.UI.AutoloadDirs.Value = [.. AutoloadDirectories];
config.UI.StartFullscreen.Value = StartGamesInFullscreen;
config.UI.StartNoUI.Value = StartGamesWithoutUi;
config.UI.BaseStyle.Value = BaseStyleIndex switch
{

View File

@@ -187,7 +187,7 @@ namespace Ryujinx.Ava.UI.ViewModels
private Task<UserResult> ShowNewUpdatesAddedDialog(int numAdded)
{
string msg = string.Format(LocaleManager.Instance[LocaleKeys.UpdateWindowUpdateAddedMessage], numAdded);
string msg = string.Format(LocaleManager.Instance[LocaleKeys.Dialog_ContentLoading_UpdatesAddedMessage], numAdded);
return Dispatcher.UIThread.InvokeAsync(async () =>
await ContentDialogHelper.ShowTextDialog(
LocaleManager.Instance[LocaleKeys.DialogConfirmationTitle],

View File

@@ -7,6 +7,7 @@
mc:Ignorable="d"
xmlns:viewModels="clr-namespace:Ryujinx.Ava.UI.ViewModels"
xmlns:controls="clr-namespace:Ryujinx.Ava.UI.Controls"
xmlns:i="clr-namespace:Projektanker.Icons.Avalonia;assembly=Projektanker.Icons.Avalonia"
xmlns:common="clr-namespace:Ryujinx.Common;assembly=Ryujinx.Common"
xmlns:renderDocApi="clr-namespace:Ryujinx.Graphics.RenderDocApi;assembly=Ryujinx.Graphics.RenderDocApi"
x:DataType="viewModels:MainWindowViewModel"
@@ -29,122 +30,71 @@
<DockPanel Margin="0" HorizontalAlignment="Stretch" />
</ItemsPanelTemplate>
</Menu.ItemsPanel>
<MenuItem VerticalAlignment="Center" Header="{ext:Locale MenuBarFile}">
<MenuItem VerticalAlignment="Center" Header="{ext:Locale MenuBar_File_FileLabel}">
<MenuItem
Command="{Binding OpenFile}"
Header="{ext:Locale MenuBarFileOpenFromFile}"
Command="{Binding LoadApplicationFromFile}"
Header="{ext:Locale MenuBar_File_LoadApplicationFromFileButton}"
Icon="{ext:Icon fa-solid fa-file}"
IsEnabled="{Binding EnableNonGameRunningControls}" />
IsEnabled="{Binding EnableNonGameRunningControls}"
InputGesture="{Binding LoadApplicationFromFileGesture}" />
<MenuItem
Command="{Binding OpenFolder}"
Header="{ext:Locale MenuBarFileOpenUnpacked}"
Command="{Binding LoadUnpackedGameFromFolder}"
Header="{ext:Locale MenuBar_File_LoadUnpackedGameFromFolderButton}"
Icon="{ext:Icon fa-solid fa-folder-open}"
IsEnabled="{Binding EnableNonGameRunningControls}" />
IsEnabled="{Binding EnableNonGameRunningControls}"
InputGesture="{Binding LoadUnpackedGameFromFolderFileGesture}" />
<MenuItem
Command="{Binding LoadTitleUpdatesFromFolder}"
Header="{ext:Locale MenuBarFileLoadTitleUpdatesFromFolder}"
Icon="{ext:Icon fa-solid fa-diagram-predecessor}"
IsEnabled="{Binding EnableNonGameRunningControls}" />
<MenuItem
Command="{Binding LoadDlcFromFolder}"
Header="{ext:Locale MenuBarFileLoadDlcFromFolder}"
Icon="{ext:Icon fa-solid fa-puzzle-piece}"
Command="{Binding LoadTitleUpdatesAndDLCFromFolder}"
Header="{ext:Locale MenuBar_File_LoadTitleUpdatesAndDLCFromFolderButton}"
Icon="{ext:Icon fa-solid fa-inbox}"
IsEnabled="{Binding EnableNonGameRunningControls}" />
<Separator />
<MenuItem
Command="{Binding OpenRyujinxFolder}"
Header="{ext:Locale MenuBarFileOpenEmuFolder}"
Header="{ext:Locale MenuBar_File_OpenRyuijnxFolderButton}"
Icon="{ext:Icon fa-solid fa-folder-closed}" />
<MenuItem
Command="{Binding OpenLogsFolder}"
Header="{ext:Locale MenuBarFileOpenLogsFolder}"
Icon="{ext:Icon fa-solid fa-terminal}" />
Header="{ext:Locale MenuBar_File_OpenLogsFolderButton}"
Icon="{ext:Icon fa-solid fa-folder-closed}" />
<MenuItem
Command="{Binding OpenScreenshotsFolder}"
Header="{ext:Locale MenuBarFileOpenScreenshotsFolder}"
Icon="{ext:Icon fa-solid fa-image}" />
<Separator IsVisible="{Binding ManageFileTypesVisible}" />
<MenuItem Header="{ext:Locale MenuBar_File_ManageFileTypes}" IsVisible="{Binding ManageFileTypesVisible}" Icon="{ext:Icon fa-solid fa-clipboard}">
<MenuItem Name="InstallFileTypesMenuItem" Header="{ext:Locale MenuBar_File_InstallFileTypes}" IsEnabled="{Binding AreMimeTypesRegistered, Converter={x:Static BoolConverters.Not}}" Icon="{ext:Icon fa-solid fa-square-plus}" />
<MenuItem Name="UninstallFileTypesMenuItem" Header="{ext:Locale MenuBar_File_UninstallFileTypes}" IsEnabled="{Binding AreMimeTypesRegistered}" Icon="{ext:Icon fa-solid fa-square-minus}" />
Header="{ext:Locale MenuBar_File_OpenScreenshotsFolderButton}"
Icon="{ext:Icon fa-solid fa-folder-closed}" />
<Separator IsVisible="{Binding FileTypeAssociationsVisible}" />
<MenuItem
Command="{Binding ToggleFileTypeAssociationsCommand}"
Header="{Binding FileTypeAssociationsMenuHeader}"
IsVisible="{Binding FileTypeAssociationsVisible}"
IsEnabled="{Binding EnableNonGameRunningControls}"
ToolTip.Tip="{ext:Locale MenuBar_File_FileTypeAssociationsToolTip}">
<MenuItem.Icon>
<i:Icon Value="{Binding FileTypeAssociationsIcon}" />
</MenuItem.Icon>
</MenuItem>
<Separator />
<MenuItem
Name="CloseRyujinxMenuItem"
Header="{ext:Locale MenuBarFileExit}"
Icon="{ext:Icon fa-solid fa-power-off}" />
Header="{ext:Locale MenuBar_File_ExitButton}"
Icon="{ext:Icon fa-solid fa-arrow-right-from-bracket}" />
</MenuItem>
<MenuItem VerticalAlignment="Center" Header="{ext:Locale MenuBarOptions}">
<MenuItem
Command="{Binding ToggleFullscreen}"
Header="{ext:Locale MenuBarOptionsToggleFullscreen}"
Classes="withCheckbox"
Padding="0"
Icon="{ext:Icon fa-solid fa-expand}"
InputGesture="F11">
</MenuItem>
<MenuItem
Padding="0"
Command="{Binding ToggleStartGamesInFullscreen}"
Header="{ext:Locale MenuBarOptionsStartGamesInFullscreen}"
Classes="withCheckbox">
<MenuItem.Icon>
<CheckBox
MinWidth="{DynamicResource CheckBoxSize}"
MinHeight="{DynamicResource CheckBoxSize}"
IsChecked="{Binding StartGamesInFullscreen, Mode=TwoWay}"
Padding="0" />
</MenuItem.Icon>
</MenuItem>
<MenuItem
Padding="0"
Command="{Binding ToggleStartGamesWithoutUi}"
Header="{ext:Locale MenuBarOptionsStartGamesWithoutUI}"
Classes="withCheckbox">
<MenuItem.Icon>
<CheckBox
MinWidth="{DynamicResource CheckBoxSize}"
MinHeight="{DynamicResource CheckBoxSize}"
IsChecked="{Binding StartGamesWithoutUi, Mode=TwoWay}"
Padding="0" />
</MenuItem.Icon>
</MenuItem>
<MenuItem
Padding="0"
IsVisible="{Binding ShowConsoleVisible}"
Command="{Binding ToggleShowConsole}"
Header="{ext:Locale MenuBarOptionsShowConsole}"
Classes="withCheckbox">
<MenuItem.Icon>
<CheckBox
MinWidth="{DynamicResource CheckBoxSize}"
MinHeight="{DynamicResource CheckBoxSize}"
IsChecked="{Binding ShowConsole, Mode=TwoWay}"
Padding="0" />
</MenuItem.Icon>
</MenuItem>
<Separator/>
<MenuItem VerticalAlignment="Center" Header="{ext:Locale MenuBar_Options_OptionsLabel}">
<MenuItem
Name="ChangeLanguageMenuItem"
Padding="0"
Header="{ext:Locale MenuBarOptionsChangeLanguage}"
Icon="{ext:Icon fa-solid fa-globe}"
Classes="withCheckbox">
</MenuItem>
<MenuItem
Name="OpenSettingsMenuItem"
Padding="0"
Header="{ext:Locale MenuBarOptionsSettings}"
Icon="{ext:Icon fa-solid fa-gear}"
Classes="withCheckbox">
Header="{ext:Locale MenuBar_Options_LanguageButton}"
Icon="{ext:Icon fa-solid fa-globe}">
</MenuItem>
<MenuItem
Command="{Binding ManageProfiles}"
Padding="0"
Header="{ext:Locale MenuBarOptionsManageUserProfiles}"
Header="{ext:Locale MenuBar_Options_UserProfilesButton}"
Icon="{ext:Icon fa-solid fa-user}"
IsEnabled="{Binding EnableNonGameRunningControls}"
Classes="withCheckbox">
IsEnabled="{Binding EnableNonGameRunningControls}">
</MenuItem>
<Separator/>
<MenuItem
Name="OpenSettingsMenuItem"
Header="{ext:Locale MenuBar_Options_SettingsButton}"
Icon="{ext:Icon fa-solid fa-gear}">
</MenuItem>
</MenuItem>
<MenuItem
@@ -270,13 +220,36 @@
</MenuItem>
</MenuItem>
<MenuItem VerticalAlignment="Center" Header="{ext:Locale MenuBarView}">
<MenuItem VerticalAlignment="Center" Header="{ext:Locale MenuBarViewWindow}" Icon="{ext:Icon fa-solid fa-window-restore}">
<MenuItem Name="WindowSize720PMenuItem" Header="{ext:Locale MenuBarViewWindow720}" CommandParameter="1280 720" />
<MenuItem Name="WindowSize1080PMenuItem" Header="{ext:Locale MenuBarViewWindow1080}" CommandParameter="1920 1080" />
<MenuItem Name="WindowSize1440PMenuItem" Header="{ext:Locale MenuBarViewWindow1440}" CommandParameter="2560 1440" />
<MenuItem Name="WindowSize2160PMenuItem" Header="{ext:Locale MenuBarViewWindow2160}" CommandParameter="3840 2160" />
<MenuItem
Command="{Binding ToggleShowConsole}"
IsVisible="{Binding ShowConsoleVisible}"
Header="{ext:Locale MenuBar_View_ShowConsoleButton}"
Classes="withCheckbox"
Padding="0">
<MenuItem.Icon>
<CheckBox
MinWidth="{DynamicResource CheckBoxSize}"
MinHeight="{DynamicResource CheckBoxSize}"
IsChecked="{Binding ShowConsole, Mode=TwoWay}"
Padding="0" />
</MenuItem.Icon>
</MenuItem>
<MenuItem Name="ToggleFileTypesMenuItem" Header="{ext:Locale MenuBarShowFileTypes}" Icon="{ext:Icon fa-solid fa-tags}" />
<MenuItem
Command="{Binding ToggleFullscreen}"
Padding="0"
Header="{ext:Locale MenuBar_View_ToggleFullscreenButton}"
Icon="{ext:Icon fa-solid fa-expand}"
InputGesture="F11"
Classes="withCheckbox">
</MenuItem>
<MenuItem VerticalAlignment="Center" Padding="0" Header="{ext:Locale MenuBarViewWindow}" Icon="{ext:Icon fa-solid fa-window-restore}" Classes="withCheckbox">
<MenuItem Name="WindowSize720PMenuItem" Padding = "15,0,0,0" Header="{ext:Locale MenuBarViewWindow720}" CommandParameter="1280 720" />
<MenuItem Name="WindowSize1080PMenuItem" Padding = "15,0,0,0" Header="{ext:Locale MenuBarViewWindow1080}" CommandParameter="1920 1080" />
<MenuItem Name="WindowSize1440PMenuItem" Padding = "15,0,0,0" Header="{ext:Locale MenuBarViewWindow1440}" CommandParameter="2560 1440" />
<MenuItem Name="WindowSize2160PMenuItem" Padding = "15,0,0,0" Header="{ext:Locale MenuBarViewWindow2160}" CommandParameter="3840 2160" />
</MenuItem>
<Separator />
<MenuItem Name="ToggleFileTypesMenuItem" Padding="0" Header="{ext:Locale MenuBarShowFileTypes}" Icon="{ext:Icon fa-solid fa-tags}" Classes="withCheckbox" />
</MenuItem>
<MenuItem VerticalAlignment="Center" Header="{ext:Locale MenuBarHelp}">
<MenuItem

View File

@@ -36,7 +36,6 @@ namespace Ryujinx.Ava.UI.Views.Main
ToggleFileTypesMenuItem.ItemsSource = GenerateToggleFileTypeItems();
ChangeLanguageMenuItem.ItemsSource = GenerateLanguageMenuItems();
MiiAppletMenuItem.Command = Commands.Create(OpenMiiApplet);
CloseRyujinxMenuItem.Command = Commands.Create(() => Window?.Close());
OpenSettingsMenuItem.Command = Commands.Create(OpenSettings);
@@ -44,8 +43,6 @@ namespace Ryujinx.Ava.UI.Views.Main
ResumeEmulationMenuItem.Command = Commands.Create(() => ViewModel.AppHost?.Resume());
StopEmulationMenuItem.Command = Commands.Create(() => ViewModel.AppHost?.ShowExitPrompt().OrCompleted());
RestartEmulationMenuItem.Command = Commands.Create(() => ViewModel.RestartEmulation());
InstallFileTypesMenuItem.Command = Commands.Create(InstallFileTypes);
UninstallFileTypesMenuItem.Command = Commands.Create(UninstallFileTypes);
XciTrimmerMenuItem.Command = Commands.Create(XciTrimmerView.Show);
AboutWindowMenuItem.Command = Commands.Create(AboutView.Show);
CompatibilityListMenuItem.Command = Commands.Create(() => CompatibilityListWindow.Show());
@@ -77,6 +74,7 @@ namespace Ryujinx.Ava.UI.Views.Main
.Select(it =>
new CheckBox
{
Margin = new Thickness(10, 0, 0, 0),
Content = $".{it.FileName}",
IsChecked = it.FileType.GetConfigValue(ConfigurationState.Instance.UI.ShownFileTypes),
Command = Commands.Create(() => Window.ToggleFileType(it.FileName))
@@ -98,8 +96,7 @@ namespace Ryujinx.Ava.UI.Views.Main
MenuItem menuItem = new()
{
Padding = new Thickness(15, 0, 0, 0),
Margin = new Thickness(3, 0, 3, 0),
Padding = new Thickness(10, 0, 0, 0),
HorizontalAlignment = HorizontalAlignment.Stretch,
Header = code == currentLanguageCode ? $"{languageName} ✔" : languageName,
Command = Commands.Create(() => MainWindowViewModel.ChangeLanguage(code))
@@ -189,24 +186,6 @@ namespace Ryujinx.Ava.UI.Views.Main
ViewModel.ShowSkylanderActions = string.Equals(ViewModel.AppHost.Device.Processes.ActiveApplication.ProgramIdText.ToUpper(), "0100CCC0002E6000");
}
private async Task InstallFileTypes()
{
ViewModel.AreMimeTypesRegistered = FileAssociationHelper.Install();
if (ViewModel.AreMimeTypesRegistered)
await ContentDialogHelper.CreateInfoDialog(LocaleManager.Instance[LocaleKeys.DialogInstallFileTypesSuccessMessage], string.Empty, LocaleManager.Instance[LocaleKeys.InputDialogOk], string.Empty, string.Empty);
else
await ContentDialogHelper.CreateErrorDialog(LocaleManager.Instance[LocaleKeys.DialogInstallFileTypesErrorMessage]);
}
private async Task UninstallFileTypes()
{
ViewModel.AreMimeTypesRegistered = !FileAssociationHelper.Uninstall();
if (!ViewModel.AreMimeTypesRegistered)
await ContentDialogHelper.CreateInfoDialog(LocaleManager.Instance[LocaleKeys.DialogUninstallFileTypesSuccessMessage], string.Empty, LocaleManager.Instance[LocaleKeys.InputDialogOk], string.Empty, string.Empty);
else
await ContentDialogHelper.CreateErrorDialog(LocaleManager.Instance[LocaleKeys.DialogUninstallFileTypesErrorMessage]);
}
private void ChangeWindowSize(string resolution)
{
(int resolutionWidth, int resolutionHeight) = resolution.Split(' ', 2)

View File

@@ -36,6 +36,25 @@
<TextBlock Classes="globalConfigMarker" IsVisible="{Binding IsGameTitleNotNull}" />
</StackPanel>
</CheckBox>
<CheckBox
IsEnabled="{Binding !IsGameTitleNotNull}"
Opacity="{Binding PanelOpacity}"
IsChecked="{Binding StartGamesInFullscreen, Mode=TwoWay}">
<StackPanel Orientation="Horizontal">
<TextBlock Text="{ext:Locale Settings_Interface_StartGamesInFullscreenCheckboxLabel}" />
<TextBlock Classes="globalConfigMarker" IsVisible="{Binding IsGameTitleNotNull}" />
</StackPanel>
</CheckBox>
<CheckBox
IsEnabled="{Binding !IsGameTitleNotNull}"
Opacity="{Binding PanelOpacity}"
IsChecked="{Binding StartGamesWithoutUi, Mode=TwoWay}"
ToolTip.Tip="{ext:Locale Settings_Interface_StartGamesWithoutUICheckboxLabelToolTip}">
<StackPanel Orientation="Horizontal">
<TextBlock Text="{ext:Locale Settings_Interface_StartGamesWithoutUICheckboxLabel}" />
<TextBlock Classes="globalConfigMarker" IsVisible="{Binding IsGameTitleNotNull}" />
</StackPanel>
</CheckBox>
<CheckBox
IsEnabled="{Binding !IsGameTitleNotNull}"
Opacity="{Binding PanelOpacity}"

View File

@@ -45,6 +45,10 @@
<KeyBinding Gesture="Ctrl+Shift+R" Command="{Binding ReloadRenderDocApi}" />
<KeyBinding Gesture="Ctrl+Shift+C" Command="{Binding ToggleCapture}" />
<KeyBinding Gesture="Ctrl+M" Command="{Binding SimulateWakeUpMessage}" />
<KeyBinding Gesture="Cmd+O" Command="{Binding LoadApplicationFromFile}" />
<KeyBinding Gesture="Ctrl+O" Command="{Binding LoadApplicationFromFile}" />
<KeyBinding Gesture="Cmd+Shift+O" Command="{Binding LoadUnpackedGameFromFolder}" />
<KeyBinding Gesture="Ctrl+Shift+O" Command="{Binding LoadUnpackedGameFromFolder}" />
</Window.KeyBindings>
<Grid HorizontalAlignment="Stretch" VerticalAlignment="Stretch" RowDefinitions="*">
<helpers:OffscreenTextBox IsEnabled="False" Opacity="0" Name="HiddenTextBox" IsHitTestVisible="False" IsTabStop="False" />

View File

@@ -741,10 +741,10 @@ namespace Ryujinx.Ava.UI.Windows
{
string[] messages =
[
numDlcRemoved > 0 ? string.Format(LocaleManager.Instance[LocaleKeys.AutoloadDlcRemovedMessage], numDlcRemoved): null,
numDlcAdded > 0 ? string.Format(LocaleManager.Instance[LocaleKeys.AutoloadDlcAddedMessage], numDlcAdded): null,
numUpdatesRemoved > 0 ? string.Format(LocaleManager.Instance[LocaleKeys.AutoloadUpdateRemovedMessage], numUpdatesRemoved): null,
numUpdatesAdded > 0 ? string.Format(LocaleManager.Instance[LocaleKeys.AutoloadUpdateAddedMessage], numUpdatesAdded) : null
numDlcRemoved > 0 ? string.Format(LocaleManager.Instance[LocaleKeys.Dialog_ContentLoading_DLCRemovedMessage], numDlcRemoved): null,
numDlcAdded > 0 ? string.Format(LocaleManager.Instance[LocaleKeys.Dialog_ContentLoading_DLCAddedMessage], numDlcAdded): null,
numUpdatesRemoved > 0 ? string.Format(LocaleManager.Instance[LocaleKeys.Dialog_ContentLoading_UpdatesRemovedMessage], numUpdatesRemoved): null,
numUpdatesAdded > 0 ? string.Format(LocaleManager.Instance[LocaleKeys.Dialog_ContentLoading_UpdatesAddedMessage], numUpdatesAdded) : null
];
string msg = String.Join("\r\n", messages);