Merge branch 'GreemDev:master' into nuget-update

This commit is contained in:
Keaton 2024-11-04 18:11:51 -06:00 committed by GitHub
commit f25cfa8841
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
148 changed files with 2752 additions and 2549 deletions

View File

@ -61,11 +61,11 @@ jobs:
if: matrix.platform.name != 'linux-arm64' if: matrix.platform.name != 'linux-arm64'
- name: Publish Ryujinx - name: Publish Ryujinx
run: dotnet publish -c "${{ matrix.configuration }}" -r "${{ matrix.platform.name }}" -o ./publish -p:Version="${{ env.RYUJINX_BASE_VERSION }}" -p:DebugType=embedded -p:SourceRevisionId="${{ steps.git_short_hash.outputs.result }}" -p:ExtraDefineConstants=DISABLE_UPDATER src/Ryujinx --self-contained true run: dotnet publish -c "${{ matrix.configuration }}" -r "${{ matrix.platform.name }}" -o ./publish -p:Version="${{ env.RYUJINX_BASE_VERSION }}" -p:DebugType=embedded -p:SourceRevisionId="${{ steps.git_short_hash.outputs.result }}" -p:ExtraDefineConstants=DISABLE_UPDATER src/Ryujinx --self-contained
if: github.event_name == 'pull_request' && matrix.platform.os != 'macos-13' if: github.event_name == 'pull_request' && matrix.platform.os != 'macos-13'
- name: Publish Ryujinx.Headless.SDL2 - name: Publish Ryujinx.Headless.SDL2
run: dotnet publish -c "${{ matrix.configuration }}" -r "${{ matrix.platform.name }}" -o ./publish_sdl2_headless -p:Version="${{ env.RYUJINX_BASE_VERSION }}" -p:DebugType=embedded -p:SourceRevisionId="${{ steps.git_short_hash.outputs.result }}" -p:ExtraDefineConstants=DISABLE_UPDATER src/Ryujinx.Headless.SDL2 --self-contained true run: dotnet publish -c "${{ matrix.configuration }}" -r "${{ matrix.platform.name }}" -o ./publish_sdl2_headless -p:Version="${{ env.RYUJINX_BASE_VERSION }}" -p:DebugType=embedded -p:SourceRevisionId="${{ steps.git_short_hash.outputs.result }}" -p:ExtraDefineConstants=DISABLE_UPDATER src/Ryujinx.Headless.SDL2 --self-contained
if: github.event_name == 'pull_request' && matrix.platform.os != 'macos-13' if: github.event_name == 'pull_request' && matrix.platform.os != 'macos-13'
- name: Set executable bit - name: Set executable bit

View File

@ -101,17 +101,19 @@ jobs:
- name: Publish - name: Publish
run: | run: |
dotnet publish -c Release -r "${{ matrix.platform.name }}" -o ./publish_ava/publish -p:Version="${{ steps.version_info.outputs.build_version }}" -p:SourceRevisionId="${{ steps.version_info.outputs.git_short_hash }}" -p:DebugType=embedded src/Ryujinx --self-contained true dotnet publish -c Release -r "${{ matrix.platform.name }}" -o ./publish_ava/publish -p:Version="${{ steps.version_info.outputs.build_version }}" -p:SourceRevisionId="${{ steps.version_info.outputs.git_short_hash }}" -p:DebugType=embedded src/Ryujinx --self-contained -p:IncludeNativeLibrariesForSelfExtract=true
dotnet publish -c Release -r "${{ matrix.platform.name }}" -o ./publish_sdl2_headless/publish -p:Version="${{ steps.version_info.outputs.build_version }}" -p:SourceRevisionId="${{ steps.version_info.outputs.git_short_hash }}" -p:DebugType=embedded src/Ryujinx.Headless.SDL2 --self-contained true dotnet publish -c Release -r "${{ matrix.platform.name }}" -o ./publish_sdl2_headless/publish -p:Version="${{ steps.version_info.outputs.build_version }}" -p:SourceRevisionId="${{ steps.version_info.outputs.git_short_hash }}" -p:DebugType=embedded src/Ryujinx.Headless.SDL2 --self-contained -p:IncludeNativeLibrariesForSelfExtract=true
- name: Packing Windows builds - name: Packing Windows builds
if: matrix.platform.os == 'windows-latest' if: matrix.platform.os == 'windows-latest'
run: | run: |
pushd publish_ava pushd publish_ava
rm publish/libarmeilleure-jitsupport.dylib
7z a ../release_output/ryujinx-${{ steps.version_info.outputs.build_version }}-${{ matrix.platform.zip_os_name }}.zip publish 7z a ../release_output/ryujinx-${{ steps.version_info.outputs.build_version }}-${{ matrix.platform.zip_os_name }}.zip publish
popd popd
pushd publish_sdl2_headless pushd publish_sdl2_headless
rm publish/libarmeilleure-jitsupport.dylib
7z a ../release_output/sdl2-ryujinx-headless-${{ steps.version_info.outputs.build_version }}-${{ matrix.platform.zip_os_name }}.zip publish 7z a ../release_output/sdl2-ryujinx-headless-${{ steps.version_info.outputs.build_version }}-${{ matrix.platform.zip_os_name }}.zip publish
popd popd
shell: bash shell: bash
@ -120,11 +122,13 @@ jobs:
if: matrix.platform.os == 'ubuntu-latest' if: matrix.platform.os == 'ubuntu-latest'
run: | run: |
pushd publish_ava pushd publish_ava
rm publish/libarmeilleure-jitsupport.dylib
chmod +x publish/Ryujinx.sh publish/Ryujinx chmod +x publish/Ryujinx.sh publish/Ryujinx
tar -czvf ../release_output/ryujinx-${{ steps.version_info.outputs.build_version }}-${{ matrix.platform.zip_os_name }}.tar.gz publish tar -czvf ../release_output/ryujinx-${{ steps.version_info.outputs.build_version }}-${{ matrix.platform.zip_os_name }}.tar.gz publish
popd popd
pushd publish_sdl2_headless pushd publish_sdl2_headless
rm publish/libarmeilleure-jitsupport.dylib
chmod +x publish/Ryujinx.sh publish/Ryujinx.Headless.SDL2 chmod +x publish/Ryujinx.sh publish/Ryujinx.Headless.SDL2
tar -czvf ../release_output/sdl2-ryujinx-headless-${{ steps.version_info.outputs.build_version }}-${{ matrix.platform.zip_os_name }}.tar.gz publish tar -czvf ../release_output/sdl2-ryujinx-headless-${{ steps.version_info.outputs.build_version }}-${{ matrix.platform.zip_os_name }}.tar.gz publish
popd popd

View File

@ -12,24 +12,15 @@ Please read the entire document before continuing as it can potentially save eve
We always welcome bug reports, feature proposals and overall feedback. Here are a few tips on how you can make reporting your issue as effective as possible. We always welcome bug reports, feature proposals and overall feedback. Here are a few tips on how you can make reporting your issue as effective as possible.
### Identify Where to Report
The Ryujinx codebase is distributed across multiple repositories in the [Ryujinx organization](https://github.com/Ryujinx). Depending on the feedback you might want to file the issue on a different repo. Here are a few common repos:
* [Ryujinx/Ryujinx](https://github.com/Ryujinx/Ryujinx) Ryujinx core project files.
* [Ryujinx/Ryujinx-Games-List](https://github.com/Ryujinx/Ryujinx-Games-List) Ryujinx game compatibility list.
* [Ryujinx/Ryujinx-Website](https://github.com/Ryujinx/Ryujinx-Website) Ryujinx website source code.
* [Ryujinx/Ryujinx-Ldn-Website](https://github.com/Ryujinx/Ryujinx-Ldn-Website) Ryujinx LDN website source code.
### Finding Existing Issues ### Finding Existing Issues
Before filing a new issue, please search our [open issues](https://github.com/Ryujinx/Ryujinx/issues) to check if it already exists. Before filing a new issue, please search our [open issues](https://github.com/GreemDev/Ryujinx/issues) to check if it already exists.
If you do find an existing issue, please include your own feedback in the discussion. Do consider upvoting (👍 reaction) the original post, as this helps us prioritize popular issues in our backlog. If you do find an existing issue, please include your own feedback in the discussion. Do consider upvoting (👍 reaction) the original post, as this helps us prioritize popular issues in our backlog.
### Writing a Good Feature Request ### Writing a Good Feature Request
Please review any feature requests already opened to both check it has not already been suggested, and to familiarize yourself with the format. When ready to submit a proposal, please use the [Feature Request issue template](https://github.com/Ryujinx/Ryujinx/issues/new?assignees=&labels=&projects=&template=feature_request.yml&title=%5BFeature+Request%5D). Please review any feature requests already opened to both check it has not already been suggested, and to familiarize yourself with the format. When ready to submit a proposal, please use the [Feature Request issue template](https://github.com/GreemDev/Ryujinx/issues/new?assignees=&labels=&projects=&template=feature_request.yml&title=%5BFeature+Request%5D).
### Writing a Good Bug Report ### Writing a Good Bug Report
@ -43,13 +34,13 @@ Ideally, a bug report should contain the following information:
* A Ryujinx log file of the run instance where the issue occurred. Log files can be found in `[Executable Folder]/Logs` and are named chronologically. * A Ryujinx log file of the run instance where the issue occurred. Log files can be found in `[Executable Folder]/Logs` and are named chronologically.
* Additional information, e.g. is it a regression from previous versions? Are there any known workarounds? * Additional information, e.g. is it a regression from previous versions? Are there any known workarounds?
When ready to submit a bug report, please use the [Bug Report issue template](https://github.com/Ryujinx/Ryujinx/issues/new?assignees=&labels=bug&projects=&template=bug_report.yml&title=%5BBug%5D). When ready to submit a bug report, please use the [Bug Report issue template](https://github.com/GreemDev/Ryujinx/issues/new?assignees=&labels=bug&projects=&template=bug_report.yml&title=%5BBug%5D).
## Contributing Changes ## Contributing Changes
Project maintainers will merge changes that both improve the project and meet our standards for code quality. Project maintainers will merge changes that both improve the project and meet our standards for code quality.
The [Pull Request Guide](docs/workflow/pr-guide.md) and [License](https://github.com/Ryujinx/Ryujinx/blob/master/LICENSE.txt) docs define additional guidance. The [Pull Request Guide](docs/workflow/pr-guide.md) and [License](https://github.com/GreemDev/Ryujinx/blob/master/LICENSE.txt) docs define additional guidance.
### DOs and DON'Ts ### DOs and DON'Ts
@ -83,15 +74,15 @@ We use and recommend the following workflow:
3. In your fork, create a branch off of main (`git checkout -b mybranch`). 3. In your fork, create a branch off of main (`git checkout -b mybranch`).
- Branches are useful since they isolate your changes from incoming changes from upstream. They also enable you to create multiple PRs from the same fork. - Branches are useful since they isolate your changes from incoming changes from upstream. They also enable you to create multiple PRs from the same fork.
4. Make and commit your changes to your branch. 4. Make and commit your changes to your branch.
- [Build Instructions](https://github.com/Ryujinx/Ryujinx#building) explains how to build and test. - [Build Instructions](https://github.com/GreemDev/Ryujinx#building) explains how to build and test.
- Commit messages should be clear statements of action and intent. - Commit messages should be clear statements of action and intent.
6. Build the repository with your changes. 6. Build the repository with your changes.
- Make sure that the builds are clean. - Make sure that the builds are clean.
- Make sure that `dotnet format` has been run and any corrections tested and committed. - Make sure that `dotnet format` has been run and any corrections tested and committed.
7. Create a pull request (PR) against the Ryujinx/Ryujinx repository's **main** branch. 7. Create a pull request (PR) against the Ryujinx/Ryujinx repository's **main** branch.
- State in the description what issue or improvement your change is addressing. - State in the description what issue or improvement your change is addressing.
- Check if all the Continuous Integration checks are passing. Refer to [Actions](https://github.com/Ryujinx/Ryujinx/actions) to check for outstanding errors. - Check if all the Continuous Integration checks are passing. Refer to [Actions](https://github.com/GreemDev/Ryujinx/actions) to check for outstanding errors.
8. Wait for feedback or approval of your changes from the [core development team](https://github.com/orgs/Ryujinx/teams/developers) 8. Wait for feedback or approval of your changes from the core development team
- Details about the pull request [review procedure](docs/workflow/ci/pr-guide.md). - Details about the pull request [review procedure](docs/workflow/ci/pr-guide.md).
9. When the team members have signed off, and all checks are green, your PR will be merged. 9. When the team members have signed off, and all checks are green, your PR will be merged.
- The next official build will automatically include your change. - The next official build will automatically include your change.
@ -99,7 +90,7 @@ We use and recommend the following workflow:
### Good First Issues ### Good First Issues
The team marks the most straightforward issues as [good first issues](https://github.com/Ryujinx/Ryujinx/issues?q=is%3Aopen+is%3Aissue+label%3A%22good+first+issue%22). This set of issues is the place to start if you are interested in contributing but new to the codebase. The team marks the most straightforward issues as [good first issues](https://github.com/GreemDev/Ryujinx/issues?q=is%3Aopen+is%3Aissue+label%3A%22good+first+issue%22). This set of issues is the place to start if you are interested in contributing but new to the codebase.
### Commit Messages ### Commit Messages
@ -122,7 +113,7 @@ Also do your best to factor commits appropriately, not too large with unrelated
### PR - CI Process ### PR - CI Process
The [Ryujinx continuous integration](https://github.com/Ryujinx/Ryujinx/actions) (CI) system will automatically perform the required builds and run tests (including the ones you are expected to run) for PRs. Builds and test runs must be clean or have bugs properly filed against flaky/unexpected failures that are unrelated to your change. The [Ryujinx continuous integration](https://github.com/GreemDev/Ryujinx/actions) (CI) system will automatically perform the required builds and run tests (including the ones you are expected to run) for PRs. Builds and test runs must be clean or have bugs properly filed against flaky/unexpected failures that are unrelated to your change.
If the CI build fails for any reason, the PR actions tab should be consulted for further information on the failure. There are a few usual suspects for such a failure: If the CI build fails for any reason, the PR actions tab should be consulted for further information on the failure. There are a few usual suspects for such a failure:
* `dotnet format` has not been run on the PR and has outstanding stylistic issues. * `dotnet format` has not been run on the PR and has outstanding stylistic issues.
@ -143,5 +134,5 @@ Ryujinx uses some implementations and frameworks from other projects. The follow
- The license of the file is [permissive](https://en.wikipedia.org/wiki/Permissive_free_software_licence). - The license of the file is [permissive](https://en.wikipedia.org/wiki/Permissive_free_software_licence).
- The license of the file is left in-tact. - The license of the file is left in-tact.
- The contribution is correctly attributed in the [3rd party notices](https://github.com/Ryujinx/Ryujinx/blob/master/distribution/legal/THIRDPARTY.md) file in the repository, as needed. - The contribution is correctly attributed in the [3rd party notices](https://github.com/GreemDev/Ryujinx/blob/master/distribution/legal/THIRDPARTY.md) file in the repository, as needed.

View File

@ -6,6 +6,14 @@
<br> <br>
<sub><sup><b>(REE-YOU-JINX)</b></sup></sub> <sub><sup><b>(REE-YOU-JINX)</b></sup></sub>
<br> <br>
<a href="https://github.com/GreemDev/Ryujinx/actions/workflows/release.yml">
<img src="https://github.com/GreemDev/Ryujinx/actions/workflows/release.yml/badge.svg"
alt="">
</a>
<a href="https://github.com/GreemDev/Ryujinx/releases/latest">
<img src="https://img.shields.io/github/v/release/GreemDev/Ryujinx"
alt="Latest Release">
</a>
</h1> </h1>
<p align="center"> <p align="center">
@ -17,25 +25,22 @@
</p> </p>
<p align="center"> <p align="center">
On October 1st 2024, Ryujinx was discontinued as the creator was forced to abandon the project. On October 1st 2024, Ryujinx was discontinued as the creator was forced to abandon the project.
This fork is intended to be a direct continuation for existing Ryujinx users. <br>
Guides and documentation will not be provided at this time, though you can find the old ones on the Internet Archive. This fork is intended to be a QoL uplift for existing Ryujinx users.
<br>
This is not a Ryujinx revival project. This is not a Phoenix project.
<br>
Guides and documentation can be found on the <a href="https://github.com/GreemDev/Ryujinx/wiki">Wiki tab</a>.
</p> </p>
<p align="center"> <p align="center">
If you would like a version more true to original Ryujinx, check out <a href="https://github.com/ryujinx-mirror/ryujinx">ryujinx-mirror</a>. If you would like a version more preservative fork of Ryujinx, check out <a href="https://github.com/ryujinx-mirror/ryujinx">ryujinx-mirror</a>.
</p> </p>
<p align="center"> <p align="center">
<a href="https://github.com/GreemDev/Ryujinx/actions/workflows/release.yml"> Click below to join the Discord:
<img src="https://github.com/GreemDev/Ryujinx/actions/workflows/release.yml/badge.svg" <br>
alt="">
</a>
<a href="https://crwd.in/ryujinx">
<img src="https://badges.crowdin.net/ryujinx/localized.svg"
alt="">
</a>
<a href="https://discord.gg/dHPrkBkkyA"> <a href="https://discord.gg/dHPrkBkkyA">
<img src="https://img.shields.io/discord/1294443224030511104?color=5865F2&label=Ryujinx&logo=discord&logoColor=white" <img src="https://img.shields.io/discord/1294443224030511104?color=5865F2&label=Ryubing&logo=discord&logoColor=white" alt="Discord">
alt="Discord">
</a> </a>
<br> <br>
<br> <br>
@ -61,6 +66,8 @@ failing to meet this requirement may result in a poor gameplay experience or une
These builds are compiled automatically for each commit on the master branch. These builds are compiled automatically for each commit on the master branch.
While we strive to ensure optimal stability and performance prior to pushing an update, our automated builds **may be unstable or completely broken**. While we strive to ensure optimal stability and performance prior to pushing an update, our automated builds **may be unstable or completely broken**.
You can find the latest release [here](https://github.com/GreemDev/Ryujinx/releases/latest).
## Documentation ## Documentation
If you are planning to contribute or just want to learn more about this project please read through our [documentation](docs/README.md). If you are planning to contribute or just want to learn more about this project please read through our [documentation](docs/README.md).

View File

@ -33,6 +33,8 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution
ProjectSection(SolutionItems) = preProject ProjectSection(SolutionItems) = preProject
.editorconfig = .editorconfig .editorconfig = .editorconfig
Directory.Packages.props = Directory.Packages.props Directory.Packages.props = Directory.Packages.props
Release Script = .github/workflows/release.yml
Build Script = .github/workflows/build.yml
EndProjectSection EndProjectSection
EndProject EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Ryujinx.Memory", "src\Ryujinx.Memory\Ryujinx.Memory.csproj", "{A5E6C691-9E22-4263-8F40-42F002CE66BE}" Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Ryujinx.Memory", "src\Ryujinx.Memory\Ryujinx.Memory.csproj", "{A5E6C691-9E22-4263-8F40-42F002CE66BE}"

Binary file not shown.

View File

@ -1 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 255.76 255.76"><defs><style>.cls-1{fill:#02c5e5;}.cls-2{fill:#ff5f55;}.cls-3{fill:none;}</style></defs><g id="Ebene_2" data-name="Ebene 2"><g id="Ebene_1-2" data-name="Ebene 1"><g id="Ebene_2-2" data-name="Ebene 2"><g id="Ebene_1-2-2" data-name="Ebene 1-2"><path class="cls-1" d="M80.63,0V220.39H44.37c-14,0-35.74-20.74-35.74-39.13V40.13C8.63,19.19,31.36,0,49.06,0Z"/><path class="cls-2" d="M175.13,35.37V255.76h36.26c14,0,35.74-20.74,35.74-39.13V75.5c0-20.94-22.73-40.13-40.43-40.13Z"/><polygon class="cls-1" points="124.34 137.96 122.58 145.57 90.64 145.57 92.89 137.96 124.34 137.96"/><polygon class="cls-2" points="160.29 137.96 157.84 145.57 122.58 145.57 124.34 137.96 160.29 137.96"/><polygon class="cls-1" points="130.39 111.86 128.62 119.47 95.14 119.47 97.39 111.86 130.39 111.86"/><polygon class="cls-2" points="164.79 111.86 162.34 119.47 128.62 119.47 130.39 111.86 164.79 111.86"/><polygon class="cls-1" points="104.24 167.99 122.83 87.77 129.78 87.77 111.19 167.99 104.24 167.99"/><polygon class="cls-2" points="128.18 167.99 146.77 87.77 153.89 87.77 135.3 167.99 128.18 167.99"/></g><rect class="cls-3" width="255.76" height="255.76"/></g></g></g></svg> <svg viewBox="0 0 256 256" xmlns="http://www.w3.org/2000/svg"><path d="M80.63 0V220.39H44.37C30.37 220.39 8.63 199.65 8.63 181.26V40.13C8.63 19.19 31.36 0 49.06 0H80.63Z" fill="url(#g)"/><path d="M175.13 35.37V255.76H211.39C225.39 255.76 247.13 235.02 247.13 216.63V75.5C247.13 54.56 224.4 35.37 206.7 35.37H175.13Z" fill="url(#g)"/><path fill-rule="evenodd" clip-rule="evenodd" d="M109.436 145.57L104.24 167.99H111.19L116.386 145.57H133.376L128.18 167.99H135.3L140.496 145.57H157.84L160.29 137.96H142.259L146.544 119.47H162.34L164.79 111.86H148.307L153.89 87.77H146.77L141.187 111.86H124.197L129.78 87.77H122.83L117.247 111.86H97.39L95.14 119.47H115.484L111.199 137.96H92.89L90.64 145.57H109.436ZM139.424 119.47L135.139 137.96H118.149L122.434 119.47H139.424Z" fill="url(#g)"/><defs><linearGradient id="g" x1="223.76" y1="32" x2="27" y2="228.76" gradientUnits="userSpaceOnUse"><stop offset="0" stop-color="#686868"/><stop offset="0.14" stop-color="#686868"/><stop offset="0.14" stop-color="#AE9675"/><stop offset="0.28" stop-color="#AE9675"/><stop offset="0.28" stop-color="#FF635E"/><stop offset="0.42" stop-color="#FF635E"/><stop offset="0.42" stop-color="#FE8F63"/><stop offset="0.56" stop-color="#FE8F63"/><stop offset="0.56" stop-color="#FDEF68"/><stop offset="0.7" stop-color="#FDEF68"/><stop offset="0.7" stop-color="#71C56D"/><stop offset="0.84" stop-color="#71C56D"/><stop offset="0.84" stop-color="#32ADDD"/><stop offset="1" stop-color="#32ADDD"/></linearGradient></defs></svg>

Before

Width:  |  Height:  |  Size: 1.2 KiB

After

Width:  |  Height:  |  Size: 1.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 905 KiB

After

Width:  |  Height:  |  Size: 1.4 MiB

View File

@ -2,7 +2,7 @@
## Contributing Rules ## Contributing Rules
All contributions to Ryujinx/Ryujinx repository are made via pull requests (PRs) rather than through direct commits. The pull requests are reviewed and merged by the maintainers after a review and at least two approvals from the core development team. All contributions to GreemDev/Ryujinx repository are made via pull requests (PRs) rather than through direct commits. The pull requests are reviewed and merged by the maintainers after a review and at least two approvals from the core development team.
To merge pull requests, you must have write permissions in the repository. To merge pull requests, you must have write permissions in the repository.
@ -24,7 +24,7 @@ If during the code review process a merge conflict occurs, the PR author is resp
## Pull Request Builds ## Pull Request Builds
When submitting a PR to the `Ryujinx/Ryujinx` repository, various builds will run validating many areas to ensure we keep developer productivity and product quality high. These various workflows can be tracked in the [Actions](https://github.com/Ryujinx/Ryujinx/actions) tab of the repository. If the job continues to completion, the build artifacts will be uploaded and posted as a comment in the PR discussion. When submitting a PR to the `GreemDev/Ryujinx` repository, various builds will run validating many areas to ensure we keep developer productivity and product quality high. These various workflows can be tracked in the [Actions](https://github.com/GreemDev/Ryujinx/actions) tab of the repository. If the job continues to completion, the build artifacts will be uploaded and posted as a comment in the PR discussion.
## Review Turnaround Times ## Review Turnaround Times
@ -42,7 +42,7 @@ Anyone with write access can merge a pull request manually when the following co
* The PR has been approved by two reviewers and any other objections are addressed. * The PR has been approved by two reviewers and any other objections are addressed.
* You can request follow up reviews from the original reviewers if they requested changes. * You can request follow up reviews from the original reviewers if they requested changes.
* The PR successfully builds and passes all tests in the Continuous Integration (CI) system. In case of failures, refer to the [Actions](https://github.com/Ryujinx/Ryujinx/actions) tab of your PR. * The PR successfully builds and passes all tests in the Continuous Integration (CI) system. In case of failures, refer to the [Actions](https://github.com/GreemDev/Ryujinx/actions) tab of your PR.
Typically, PRs are merged as one commit (squash merges). It creates a simpler history than a Merge Commit. "Special circumstances" are rare, and typically mean that there are a series of cleanly separated changes that will be too hard to understand if squashed together, or for some reason we want to preserve the ability to dissect them. Typically, PRs are merged as one commit (squash merges). It creates a simpler history than a Merge Commit. "Special circumstances" are rare, and typically mean that there are a series of cleanly separated changes that will be too hard to understand if squashed together, or for some reason we want to preserve the ability to dissect them.

View File

@ -855,6 +855,7 @@ namespace ARMeilleure.Translation.PTC
Thread thread = new(TranslateFuncs) Thread thread = new(TranslateFuncs)
{ {
IsBackground = true, IsBackground = true,
Name = "Ptc.TranslateThread." + i
}; };
threads.Add(thread); threads.Add(thread);
@ -885,6 +886,7 @@ namespace ARMeilleure.Translation.PTC
Thread preSaveThread = new(PreSave) Thread preSaveThread = new(PreSave)
{ {
IsBackground = true, IsBackground = true,
Name = "Ptc.DiskWriter"
}; };
preSaveThread.Start(); preSaveThread.Start();
} }

View File

@ -41,7 +41,7 @@ namespace Ryujinx.Audio.Backends.OpenAL
public OpenALHardwareDeviceDriver() public OpenALHardwareDeviceDriver()
{ {
_device = ALC.OpenDevice(""); _device = ALC.OpenDevice(string.Empty);
_context = ALC.CreateContext(_device, new ALContextAttributes()); _context = ALC.CreateContext(_device, new ALContextAttributes());
_updateRequiredEvent = new ManualResetEvent(false); _updateRequiredEvent = new ManualResetEvent(false);
_pauseEvent = new ManualResetEvent(true); _pauseEvent = new ManualResetEvent(true);

View File

@ -81,7 +81,7 @@ namespace Ryujinx.Audio.Renderer.Dsp
[MethodImpl(MethodImplOptions.AggressiveInlining)] [MethodImpl(MethodImplOptions.AggressiveInlining)]
private static short GetCoefficientAtIndex(ReadOnlySpan<short> coefficients, int index) private static short GetCoefficientAtIndex(ReadOnlySpan<short> coefficients, int index)
{ {
if ((uint)index > (uint)coefficients.Length) if ((uint)index >= (uint)coefficients.Length)
{ {
Logger.Error?.Print(LogClass.AudioRenderer, $"Out of bound read for coefficient at index {index}"); Logger.Error?.Print(LogClass.AudioRenderer, $"Out of bound read for coefficient at index {index}");

View File

@ -119,7 +119,7 @@ namespace Ryujinx.Common.Configuration
private static string SetUpLogsDir() private static string SetUpLogsDir()
{ {
string logDir = ""; string logDir = string.Empty;
if (Mode == LaunchMode.Portable) if (Mode == LaunchMode.Portable)
{ {
@ -148,7 +148,7 @@ namespace Ryujinx.Common.Configuration
catch catch
{ {
Logger.Warning?.Print(LogClass.Application, $"Logging directory could not be created '{logDir}'"); Logger.Warning?.Print(LogClass.Application, $"Logging directory could not be created '{logDir}'");
logDir = ""; logDir = string.Empty;
} }
if (string.IsNullOrEmpty(logDir)) if (string.IsNullOrEmpty(logDir))
@ -179,7 +179,7 @@ namespace Ryujinx.Common.Configuration
catch catch
{ {
Logger.Warning?.Print(LogClass.Application, $"Logging directory could not be created '{logDir}'"); Logger.Warning?.Print(LogClass.Application, $"Logging directory could not be created '{logDir}'");
logDir = ""; logDir = string.Empty;
} }
if (string.IsNullOrEmpty(logDir)) if (string.IsNullOrEmpty(logDir))

View File

@ -121,8 +121,8 @@ namespace Ryujinx.Common.GraphicsDriver
}; };
application.AppName.Set("Ryujinx.exe"); application.AppName.Set("Ryujinx.exe");
application.UserFriendlyName.Set("Ryujinx"); application.UserFriendlyName.Set("Ryujinx");
application.Launcher.Set(""); application.Launcher.Set(string.Empty);
application.FileInFolder.Set(""); application.FileInFolder.Set(string.Empty);
Check(NvAPI_DRS_CreateApplication(handle, profileHandle, ref application)); Check(NvAPI_DRS_CreateApplication(handle, profileHandle, ref application));
} }

View File

@ -38,7 +38,7 @@ namespace Ryujinx.Common.Logging
{ {
if (_enabledClasses[(int)logClass]) if (_enabledClasses[(int)logClass])
{ {
Updated?.Invoke(null, new LogEventArgs(Level, _time.Elapsed, Thread.CurrentThread.Name, FormatMessage(logClass, "", message))); Updated?.Invoke(null, new LogEventArgs(Level, _time.Elapsed, Thread.CurrentThread.Name, FormatMessage(logClass, string.Empty, message)));
} }
} }

View File

@ -10,6 +10,7 @@
<PackageReference Include="Microsoft.IO.RecyclableMemoryStream" /> <PackageReference Include="Microsoft.IO.RecyclableMemoryStream" />
<PackageReference Include="MsgPack.Cli" /> <PackageReference Include="MsgPack.Cli" />
<PackageReference Include="System.Management" /> <PackageReference Include="System.Management" />
<PackageReference Include="Humanizer" />
<PackageReference Include="Gommon" /> <PackageReference Include="Gommon" />
</ItemGroup> </ItemGroup>

View File

@ -17,29 +17,19 @@ namespace Ryujinx.Common.Utilities
/// It is REQUIRED for you to save returned options statically or as a part of static serializer context /// It is REQUIRED for you to save returned options statically or as a part of static serializer context
/// in order to avoid performance issues. You can safely modify returned options for your case before storing. /// in order to avoid performance issues. You can safely modify returned options for your case before storing.
/// </remarks> /// </remarks>
public static JsonSerializerOptions GetDefaultSerializerOptions(bool indented = true) public static JsonSerializerOptions GetDefaultSerializerOptions(bool indented = true) =>
{ new()
JsonSerializerOptions options = new()
{ {
DictionaryKeyPolicy = _snakeCasePolicy, DictionaryKeyPolicy = _snakeCasePolicy,
PropertyNamingPolicy = _snakeCasePolicy, PropertyNamingPolicy = _snakeCasePolicy,
WriteIndented = indented, WriteIndented = indented,
AllowTrailingCommas = true, AllowTrailingCommas = true,
ReadCommentHandling = JsonCommentHandling.Skip, ReadCommentHandling = JsonCommentHandling.Skip
}; };
return options; public static string Serialize<T>(T value, JsonTypeInfo<T> typeInfo) => JsonSerializer.Serialize(value, typeInfo);
}
public static string Serialize<T>(T value, JsonTypeInfo<T> typeInfo) public static T Deserialize<T>(string value, JsonTypeInfo<T> typeInfo) => JsonSerializer.Deserialize(value, typeInfo);
{
return JsonSerializer.Serialize(value, typeInfo);
}
public static T Deserialize<T>(string value, JsonTypeInfo<T> typeInfo)
{
return JsonSerializer.Deserialize(value, typeInfo);
}
public static void SerializeToFile<T>(string filePath, T value, JsonTypeInfo<T> typeInfo) public static void SerializeToFile<T>(string filePath, T value, JsonTypeInfo<T> typeInfo)
{ {
@ -53,10 +43,7 @@ namespace Ryujinx.Common.Utilities
return JsonSerializer.Deserialize(file, typeInfo); return JsonSerializer.Deserialize(file, typeInfo);
} }
public static void SerializeToStream<T>(Stream stream, T value, JsonTypeInfo<T> typeInfo) public static void SerializeToStream<T>(Stream stream, T value, JsonTypeInfo<T> typeInfo) => JsonSerializer.Serialize(stream, value, typeInfo);
{
JsonSerializer.Serialize(stream, value, typeInfo);
}
private class SnakeCaseNamingPolicy : JsonNamingPolicy private class SnakeCaseNamingPolicy : JsonNamingPolicy
{ {

View File

@ -152,16 +152,17 @@ namespace Ryujinx.Graphics.Gpu
/// Creates a new GPU memory manager. /// Creates a new GPU memory manager.
/// </summary> /// </summary>
/// <param name="pid">ID of the process that owns the memory manager</param> /// <param name="pid">ID of the process that owns the memory manager</param>
/// <param name="cpuMemorySize">The amount of physical CPU Memory Avaiable on the device.</param>
/// <returns>The memory manager</returns> /// <returns>The memory manager</returns>
/// <exception cref="ArgumentException">Thrown when <paramref name="pid"/> is invalid</exception> /// <exception cref="ArgumentException">Thrown when <paramref name="pid"/> is invalid</exception>
public MemoryManager CreateMemoryManager(ulong pid) public MemoryManager CreateMemoryManager(ulong pid, ulong cpuMemorySize)
{ {
if (!PhysicalMemoryRegistry.TryGetValue(pid, out var physicalMemory)) if (!PhysicalMemoryRegistry.TryGetValue(pid, out var physicalMemory))
{ {
throw new ArgumentException("The PID is invalid or the process was not registered", nameof(pid)); throw new ArgumentException("The PID is invalid or the process was not registered", nameof(pid));
} }
return new MemoryManager(physicalMemory); return new MemoryManager(physicalMemory, cpuMemorySize);
} }
/// <summary> /// <summary>

View File

@ -1,3 +1,4 @@
using Ryujinx.Common.Logging;
using System; using System;
using System.Collections; using System.Collections;
using System.Collections.Generic; using System.Collections.Generic;
@ -47,11 +48,17 @@ namespace Ryujinx.Graphics.Gpu.Image
{ {
private const int MinCountForDeletion = 32; private const int MinCountForDeletion = 32;
private const int MaxCapacity = 2048; private const int MaxCapacity = 2048;
private const ulong GiB = 1024 * 1024 * 1024;
private ulong MaxTextureSizeCapacity = 4UL * GiB;
private const ulong MinTextureSizeCapacity = 512 * 1024 * 1024; private const ulong MinTextureSizeCapacity = 512 * 1024 * 1024;
private const ulong MaxTextureSizeCapacity = 4UL * 1024 * 1024 * 1024; private const ulong DefaultTextureSizeCapacity = 1 * GiB;
private const ulong DefaultTextureSizeCapacity = 1UL * 1024 * 1024 * 1024; private const ulong TextureSizeCapacity6GiB = 4 * GiB;
private const ulong TextureSizeCapacity8GiB = 6 * GiB;
private const ulong TextureSizeCapacity12GiB = 12 * GiB;
private const float MemoryScaleFactor = 0.50f; private const float MemoryScaleFactor = 0.50f;
private ulong _maxCacheMemoryUsage = 0; private ulong _maxCacheMemoryUsage = DefaultTextureSizeCapacity;
private readonly LinkedList<Texture> _textures; private readonly LinkedList<Texture> _textures;
private ulong _totalSize; private ulong _totalSize;
@ -66,18 +73,38 @@ namespace Ryujinx.Graphics.Gpu.Image
/// </summary> /// </summary>
/// <remarks> /// <remarks>
/// If the backend GPU has 0 memory capacity, the cache size defaults to `DefaultTextureSizeCapacity`. /// If the backend GPU has 0 memory capacity, the cache size defaults to `DefaultTextureSizeCapacity`.
///
/// Reads the current Device total CPU Memory, to determine the maximum amount of Vram available. Capped to 50% of Current GPU Memory.
/// </remarks> /// </remarks>
/// <param name="context">The GPU context that the cache belongs to</param> /// <param name="context">The GPU context that the cache belongs to</param>
public void Initialize(GpuContext context) /// <param name="cpuMemorySize">The amount of physical CPU Memory Avaiable on the device.</param>
public void Initialize(GpuContext context, ulong cpuMemorySize)
{ {
var cpuMemorySizeGiB = cpuMemorySize / GiB;
if (cpuMemorySizeGiB < 6 || context.Capabilities.MaximumGpuMemory == 0)
{
_maxCacheMemoryUsage = DefaultTextureSizeCapacity;
return;
}
else if (cpuMemorySizeGiB == 6)
{
MaxTextureSizeCapacity = TextureSizeCapacity6GiB;
}
else if (cpuMemorySizeGiB == 8)
{
MaxTextureSizeCapacity = TextureSizeCapacity8GiB;
}
else
{
MaxTextureSizeCapacity = TextureSizeCapacity12GiB;
}
var cacheMemory = (ulong)(context.Capabilities.MaximumGpuMemory * MemoryScaleFactor); var cacheMemory = (ulong)(context.Capabilities.MaximumGpuMemory * MemoryScaleFactor);
_maxCacheMemoryUsage = Math.Clamp(cacheMemory, MinTextureSizeCapacity, MaxTextureSizeCapacity); _maxCacheMemoryUsage = Math.Clamp(cacheMemory, MinTextureSizeCapacity, MaxTextureSizeCapacity);
if (context.Capabilities.MaximumGpuMemory == 0) Logger.Info?.Print(LogClass.Gpu, $"AutoDelete Cache Allocated VRAM : {_maxCacheMemoryUsage / GiB} GiB");
{
_maxCacheMemoryUsage = DefaultTextureSizeCapacity;
}
} }
/// <summary> /// <summary>

View File

@ -71,9 +71,10 @@ namespace Ryujinx.Graphics.Gpu.Image
/// <summary> /// <summary>
/// Initializes the cache, setting the maximum texture capacity for the specified GPU context. /// Initializes the cache, setting the maximum texture capacity for the specified GPU context.
/// </summary> /// </summary>
public void Initialize() /// <param name="cpuMemorySize">The amount of physical CPU Memory Avaiable on the device.</param>
public void Initialize(ulong cpuMemorySize)
{ {
_cache.Initialize(_context); _cache.Initialize(_context, cpuMemorySize);
} }
/// <summary> /// <summary>

View File

@ -55,7 +55,8 @@ namespace Ryujinx.Graphics.Gpu.Memory
/// Creates a new instance of the GPU memory manager. /// Creates a new instance of the GPU memory manager.
/// </summary> /// </summary>
/// <param name="physicalMemory">Physical memory that this memory manager will map into</param> /// <param name="physicalMemory">Physical memory that this memory manager will map into</param>
internal MemoryManager(PhysicalMemory physicalMemory) /// <param name="cpuMemorySize">The amount of physical CPU Memory Avaiable on the device.</param>
internal MemoryManager(PhysicalMemory physicalMemory, ulong cpuMemorySize)
{ {
Physical = physicalMemory; Physical = physicalMemory;
VirtualRangeCache = new VirtualRangeCache(this); VirtualRangeCache = new VirtualRangeCache(this);
@ -65,7 +66,7 @@ namespace Ryujinx.Graphics.Gpu.Memory
MemoryUnmapped += Physical.BufferCache.MemoryUnmappedHandler; MemoryUnmapped += Physical.BufferCache.MemoryUnmappedHandler;
MemoryUnmapped += VirtualRangeCache.MemoryUnmappedHandler; MemoryUnmapped += VirtualRangeCache.MemoryUnmappedHandler;
MemoryUnmapped += CounterCache.MemoryUnmappedHandler; MemoryUnmapped += CounterCache.MemoryUnmappedHandler;
Physical.TextureCache.Initialize(); Physical.TextureCache.Initialize(cpuMemorySize);
} }
/// <summary> /// <summary>

View File

@ -432,7 +432,7 @@ namespace Ryujinx.Graphics.Shader.CodeGen.Glsl.Instructions
bool colorIsVector = isGather || !isShadow; bool colorIsVector = isGather || !isShadow;
texCall += ")" + (colorIsVector ? GetMaskMultiDest(texOp.Index) : ""); texCall += ")" + (colorIsVector ? GetMaskMultiDest(texOp.Index) : string.Empty);
return texCall; return texCall;
} }

View File

@ -830,12 +830,12 @@ namespace Ryujinx.Graphics.Shader.Translation
if (use.Node != null) if (use.Node != null)
{ {
Console.Write($"{indentation} {separator}- ({(use.Inverted ? "INV " : "")}{use.Index})"); Console.Write($"{indentation} {separator}- ({(use.Inverted ? "INV " : string.Empty)}{use.Index})");
PrintTreeNode(use.Node, indentation + (last ? " " : " | ")); PrintTreeNode(use.Node, indentation + (last ? " " : " | "));
} }
else else
{ {
Console.WriteLine($"{indentation} {separator}- ({(use.Inverted ? "INV " : "")}{use.Index}) NULL"); Console.WriteLine($"{indentation} {separator}- ({(use.Inverted ? "INV " : string.Empty)}{use.Index}) NULL");
} }
} }
} }
@ -852,12 +852,12 @@ namespace Ryujinx.Graphics.Shader.Translation
if (use.Node != null) if (use.Node != null)
{ {
Console.Write($"{indentation} {separator}- ({(use.Inverted ? "INV " : "")}{use.Index})"); Console.Write($"{indentation} {separator}- ({(use.Inverted ? "INV " : string.Empty)}{use.Index})");
PrintTreeNode(use.Node, indentation + (last ? " " : " | ")); PrintTreeNode(use.Node, indentation + (last ? " " : " | "));
} }
else else
{ {
Console.WriteLine($"{indentation} {separator}- ({(use.Inverted ? "INV " : "")}{use.Index}) NULL"); Console.WriteLine($"{indentation} {separator}- ({(use.Inverted ? "INV " : string.Empty)}{use.Index}) NULL");
} }
} }
} }

View File

@ -104,25 +104,27 @@ namespace Ryujinx.Graphics.Vulkan
public event EventHandler<ScreenCaptureImageInfo> ScreenCaptured; public event EventHandler<ScreenCaptureImageInfo> ScreenCaptured;
public VulkanRenderer(Vk api, Func<Instance, Vk, SurfaceKHR> surfaceFunc, Func<string[]> requiredExtensionsFunc, string preferredGpuId) public VulkanRenderer(Vk api, Func<Instance, Vk, SurfaceKHR> getSurface, Func<string[]> requiredExtensionsFunc, string preferredGpuId)
{ {
_getSurface = surfaceFunc; _getSurface = getSurface;
_getRequiredExtensions = requiredExtensionsFunc; _getRequiredExtensions = requiredExtensionsFunc;
_preferredGpuId = preferredGpuId; _preferredGpuId = preferredGpuId;
Api = api; Api = api;
Shaders = new HashSet<ShaderCollection>(); Shaders = [];
Textures = new HashSet<ITexture>(); Textures = [];
Samplers = new HashSet<SamplerHolder>(); Samplers = [];
if (OperatingSystem.IsMacOS())
{
MVKInitialization.Initialize();
// Any device running on MacOS is using MoltenVK, even Intel and AMD vendors. // Any device running on MacOS is using MoltenVK, even Intel and AMD vendors.
IsMoltenVk = true; if (IsMoltenVk = OperatingSystem.IsMacOS())
} MVKInitialization.Initialize();
} }
public static VulkanRenderer Create(
string preferredGpuId,
Func<Instance, Vk, SurfaceKHR> getSurface,
Func<string[]> getRequiredExtensions
) => new(Vk.GetApi(), getSurface, getRequiredExtensions, preferredGpuId);
private unsafe void LoadFeatures(uint maxQueueCount, uint queueFamilyIndex) private unsafe void LoadFeatures(uint maxQueueCount, uint queueFamilyIndex)
{ {
FormatCapabilities = new FormatCapabilities(Api, _physicalDevice.PhysicalDevice); FormatCapabilities = new FormatCapabilities(Api, _physicalDevice.PhysicalDevice);

View File

@ -22,7 +22,7 @@ namespace Ryujinx.HLE.Generators
{ {
if (className.Modifiers.Any(SyntaxKind.AbstractKeyword) || className.Modifiers.Any(SyntaxKind.PrivateKeyword) || !className.AttributeLists.Any(x => x.Attributes.Any(y => y.ToString().StartsWith("Service")))) if (className.Modifiers.Any(SyntaxKind.AbstractKeyword) || className.Modifiers.Any(SyntaxKind.PrivateKeyword) || !className.AttributeLists.Any(x => x.Attributes.Any(y => y.ToString().StartsWith("Service"))))
continue; continue;
var name = GetFullName(className, context).Replace("global::", ""); var name = GetFullName(className, context).Replace("global::", string.Empty);
if (!name.StartsWith("Ryujinx.HLE.HOS.Services")) if (!name.StartsWith("Ryujinx.HLE.HOS.Services"))
continue; continue;
var constructors = className.ChildNodes().Where(x => x.IsKind(SyntaxKind.ConstructorDeclaration)).Select(y => y as ConstructorDeclarationSyntax).ToArray(); var constructors = className.ChildNodes().Where(x => x.IsKind(SyntaxKind.ConstructorDeclaration)).Select(y => y as ConstructorDeclarationSyntax).ToArray();

View File

@ -523,7 +523,7 @@ namespace Ryujinx.HLE.FileSystem
{ {
// Clean up the name and get the NcaId // Clean up the name and get the NcaId
string[] pathComponents = entry.FullName.Replace(".cnmt", "").Split('/'); string[] pathComponents = entry.FullName.Replace(".cnmt", string.Empty).Split('/');
string ncaId = pathComponents[^1]; string ncaId = pathComponents[^1];

View File

@ -132,7 +132,7 @@ namespace Ryujinx.HLE.FileSystem
if (systemPath.StartsWith(baseSystemPath)) if (systemPath.StartsWith(baseSystemPath))
{ {
string rawPath = systemPath.Replace(baseSystemPath, ""); string rawPath = systemPath.Replace(baseSystemPath, string.Empty);
int firstSeparatorOffset = rawPath.IndexOf(Path.DirectorySeparatorChar); int firstSeparatorOffset = rawPath.IndexOf(Path.DirectorySeparatorChar);
if (firstSeparatorOffset == -1) if (firstSeparatorOffset == -1)

View File

@ -107,7 +107,7 @@ namespace Ryujinx.HLE.HOS.Applets.Error
private static string CleanText(string value) private static string CleanText(string value)
{ {
return CleanTextRegex().Replace(value, "").Replace("\0", ""); return CleanTextRegex().Replace(value, string.Empty).Replace("\0", string.Empty);
} }
private string GetMessageText(uint module, uint description, string key) private string GetMessageText(uint module, uint description, string key)
@ -129,17 +129,15 @@ namespace Ryujinx.HLE.HOS.Applets.Error
return CleanText(reader.ReadToEnd()); return CleanText(reader.ReadToEnd());
} }
else
{ return string.Empty;
return "";
}
} }
private string[] GetButtonsText(uint module, uint description, string key) private string[] GetButtonsText(uint module, uint description, string key)
{ {
string buttonsText = GetMessageText(module, description, key); string buttonsText = GetMessageText(module, description, key);
return (buttonsText == "") ? null : buttonsText.Split(new[] { "\r\n", "\r", "\n" }, StringSplitOptions.None); return (buttonsText == string.Empty) ? null : buttonsText.Split(["\r\n", "\r", "\n"], StringSplitOptions.None);
} }
private void ParseErrorCommonArg() private void ParseErrorCommonArg()
@ -156,7 +154,7 @@ namespace Ryujinx.HLE.HOS.Applets.Error
string message = GetMessageText(module, description, "DlgMsg"); string message = GetMessageText(module, description, "DlgMsg");
if (message == "") if (message == string.Empty)
{ {
message = "An error has occured.\n\nPlease try again later."; message = "An error has occured.\n\nPlease try again later.";
} }
@ -190,7 +188,7 @@ namespace Ryujinx.HLE.HOS.Applets.Error
// TODO: Handle the LanguageCode to return the translated "OK" and "Details". // TODO: Handle the LanguageCode to return the translated "OK" and "Details".
if (detailsText.Trim() != "") if (detailsText.Trim() != string.Empty)
{ {
buttons.Add("Details"); buttons.Add("Details");
} }

View File

@ -51,7 +51,7 @@ namespace Ryujinx.HLE.HOS.Applets
private byte[] _transferMemory; private byte[] _transferMemory;
private string _textValue = ""; private string _textValue = string.Empty;
private int _cursorBegin = 0; private int _cursorBegin = 0;
private Encoding _encoding = Encoding.Unicode; private Encoding _encoding = Encoding.Unicode;
private KeyboardResult _lastResult = KeyboardResult.NotSet; private KeyboardResult _lastResult = KeyboardResult.NotSet;

View File

@ -305,7 +305,7 @@ namespace Ryujinx.HLE.HOS.Applets.SoftwareKeyboard
{ {
SKRect bounds = SKRect.Empty; SKRect bounds = SKRect.Empty;
if (text == "") if (text == string.Empty)
{ {
paint.MeasureText(" ", ref bounds); paint.MeasureText(" ", ref bounds);
} }
@ -321,7 +321,7 @@ namespace Ryujinx.HLE.HOS.Applets.SoftwareKeyboard
{ {
SKRect bounds = SKRect.Empty; SKRect bounds = SKRect.Empty;
if (text == "") if (text == string.Empty)
{ {
paint.MeasureText(" ", ref bounds); paint.MeasureText(" ", ref bounds);
} }

View File

@ -7,7 +7,7 @@ namespace Ryujinx.HLE.HOS.Applets.SoftwareKeyboard
/// </summary> /// </summary>
internal class SoftwareKeyboardUIState internal class SoftwareKeyboardUIState
{ {
public string InputText = ""; public string InputText = string.Empty;
public int CursorBegin = 0; public int CursorBegin = 0;
public int CursorEnd = 0; public int CursorEnd = 0;
public bool AcceptPressed = false; public bool AcceptPressed = false;

View File

@ -238,7 +238,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Process
} }
else else
{ {
info.SubName = ""; info.SubName = string.Empty;
} }
info.ImageName = GetGuessedNsoNameFromIndex(imageIndex); info.ImageName = GetGuessedNsoNameFromIndex(imageIndex);

View File

@ -64,7 +64,7 @@ namespace Ryujinx.HLE.HOS.Services.Account.Acc
{ {
if (userId.IsNull) if (userId.IsNull)
{ {
userId = new UserId(Guid.NewGuid().ToString().Replace("-", "")); userId = new UserId(Guid.NewGuid().ToString().Replace("-", string.Empty));
} }
UserProfile profile = new(userId, name, image); UserProfile profile = new(userId, name, image);

View File

@ -5,6 +5,7 @@ using Ryujinx.HLE.Exceptions;
using Ryujinx.HLE.HOS.Kernel.Memory; using Ryujinx.HLE.HOS.Kernel.Memory;
using Ryujinx.HLE.HOS.Services.Hid.Types.SharedMemory; using Ryujinx.HLE.HOS.Services.Hid.Types.SharedMemory;
using Ryujinx.HLE.HOS.Services.Hid.Types.SharedMemory.Common; using Ryujinx.HLE.HOS.Services.Hid.Types.SharedMemory.Common;
using Ryujinx.HLE.HOS.Services.Hid.Types.SharedMemory.DebugMouse;
using Ryujinx.HLE.HOS.Services.Hid.Types.SharedMemory.DebugPad; using Ryujinx.HLE.HOS.Services.Hid.Types.SharedMemory.DebugPad;
using Ryujinx.HLE.HOS.Services.Hid.Types.SharedMemory.Keyboard; using Ryujinx.HLE.HOS.Services.Hid.Types.SharedMemory.Keyboard;
using Ryujinx.HLE.HOS.Services.Hid.Types.SharedMemory.Mouse; using Ryujinx.HLE.HOS.Services.Hid.Types.SharedMemory.Mouse;
@ -28,6 +29,7 @@ namespace Ryujinx.HLE.HOS.Services.Hid
public DebugPadDevice DebugPad; public DebugPadDevice DebugPad;
public TouchDevice Touchscreen; public TouchDevice Touchscreen;
public MouseDevice Mouse; public MouseDevice Mouse;
public DebugMouseDevice DebugMouse;
public KeyboardDevice Keyboard; public KeyboardDevice Keyboard;
public NpadDevices Npads; public NpadDevices Npads;
@ -44,6 +46,7 @@ namespace Ryujinx.HLE.HOS.Services.Hid
CheckTypeSizeOrThrow<RingLifo<DebugPadState>>(0x2c8); CheckTypeSizeOrThrow<RingLifo<DebugPadState>>(0x2c8);
CheckTypeSizeOrThrow<RingLifo<TouchScreenState>>(0x2C38); CheckTypeSizeOrThrow<RingLifo<TouchScreenState>>(0x2C38);
CheckTypeSizeOrThrow<RingLifo<MouseState>>(0x350); CheckTypeSizeOrThrow<RingLifo<MouseState>>(0x350);
CheckTypeSizeOrThrow<RingLifo<DebugMouseState>>(0x350);
CheckTypeSizeOrThrow<RingLifo<KeyboardState>>(0x3D8); CheckTypeSizeOrThrow<RingLifo<KeyboardState>>(0x3D8);
CheckTypeSizeOrThrow<Array10<NpadState>>(0x32000); CheckTypeSizeOrThrow<Array10<NpadState>>(0x32000);
CheckTypeSizeOrThrow<SharedMemory>(Horizon.HidSize); CheckTypeSizeOrThrow<SharedMemory>(Horizon.HidSize);
@ -64,6 +67,7 @@ namespace Ryujinx.HLE.HOS.Services.Hid
DebugPad = new DebugPadDevice(_device, true); DebugPad = new DebugPadDevice(_device, true);
Touchscreen = new TouchDevice(_device, true); Touchscreen = new TouchDevice(_device, true);
Mouse = new MouseDevice(_device, false); Mouse = new MouseDevice(_device, false);
DebugMouse = new DebugMouseDevice(_device, false);
Keyboard = new KeyboardDevice(_device, false); Keyboard = new KeyboardDevice(_device, false);
Npads = new NpadDevices(_device, true); Npads = new NpadDevices(_device, true);
} }

View File

@ -0,0 +1,29 @@
using Ryujinx.HLE.HOS.Services.Hid.Types.SharedMemory.Common;
using Ryujinx.HLE.HOS.Services.Hid.Types.SharedMemory.DebugMouse;
namespace Ryujinx.HLE.HOS.Services.Hid
{
public class DebugMouseDevice : BaseDevice
{
public DebugMouseDevice(Switch device, bool active) : base(device, active) { }
public void Update()
{
ref RingLifo<DebugMouseState> lifo = ref _device.Hid.SharedMemory.DebugMouse;
ref DebugMouseState previousEntry = ref lifo.GetCurrentEntryRef();
DebugMouseState newState = new()
{
SamplingNumber = previousEntry.SamplingNumber + 1,
};
if (Active)
{
// TODO: This is a debug device only present in dev environment, do we want to support it?
}
lifo.Write(ref newState);
}
}
}

View File

@ -131,6 +131,26 @@ namespace Ryujinx.HLE.HOS.Services.Hid
return ResultCode.Success; return ResultCode.Success;
} }
[CommandCmif(26)]
// ActivateDebugMouse(nn::applet::AppletResourceUserId)
public ResultCode ActivateDebugMouse(ServiceCtx context)
{
long appletResourceUserId = context.RequestData.ReadInt64();
context.Device.Hid.DebugMouse.Active = true;
// Initialize entries to avoid issues with some games.
for (int entry = 0; entry < Hid.SharedMemEntryCount; entry++)
{
context.Device.Hid.DebugMouse.Update();
}
Logger.Stub?.PrintStub(LogClass.ServiceHid, new { appletResourceUserId });
return ResultCode.Success;
}
[CommandCmif(31)] [CommandCmif(31)]
// ActivateKeyboard(nn::applet::AppletResourceUserId) // ActivateKeyboard(nn::applet::AppletResourceUserId)
public ResultCode ActivateKeyboard(ServiceCtx context) public ResultCode ActivateKeyboard(ServiceCtx context)

View File

@ -0,0 +1,12 @@
using System;
namespace Ryujinx.HLE.HOS.Services.Hid.Types.SharedMemory.DebugMouse
{
[Flags]
enum DebugMouseAttribute : uint
{
None = 0,
Transferable = 1 << 0,
IsConnected = 1 << 1,
}
}

View File

@ -0,0 +1,15 @@
using System;
namespace Ryujinx.HLE.HOS.Services.Hid.Types.SharedMemory.DebugMouse
{
[Flags]
enum DebugMouseButton : uint
{
None = 0,
Left = 1 << 0,
Right = 1 << 1,
Middle = 1 << 2,
Forward = 1 << 3,
Back = 1 << 4,
}
}

View File

@ -0,0 +1,19 @@
using Ryujinx.HLE.HOS.Services.Hid.Types.SharedMemory.Common;
using System.Runtime.InteropServices;
namespace Ryujinx.HLE.HOS.Services.Hid.Types.SharedMemory.DebugMouse
{
[StructLayout(LayoutKind.Sequential, Pack = 1)]
struct DebugMouseState : ISampledDataStruct
{
public ulong SamplingNumber;
public int X;
public int Y;
public int DeltaX;
public int DeltaY;
public int WheelDeltaX;
public int WheelDeltaY;
public DebugMouseButton Buttons;
public DebugMouseAttribute Attributes;
}
}

View File

@ -1,5 +1,6 @@
using Ryujinx.Common.Memory; using Ryujinx.Common.Memory;
using Ryujinx.HLE.HOS.Services.Hid.Types.SharedMemory.Common; using Ryujinx.HLE.HOS.Services.Hid.Types.SharedMemory.Common;
using Ryujinx.HLE.HOS.Services.Hid.Types.SharedMemory.DebugMouse;
using Ryujinx.HLE.HOS.Services.Hid.Types.SharedMemory.DebugPad; using Ryujinx.HLE.HOS.Services.Hid.Types.SharedMemory.DebugPad;
using Ryujinx.HLE.HOS.Services.Hid.Types.SharedMemory.Keyboard; using Ryujinx.HLE.HOS.Services.Hid.Types.SharedMemory.Keyboard;
using Ryujinx.HLE.HOS.Services.Hid.Types.SharedMemory.Mouse; using Ryujinx.HLE.HOS.Services.Hid.Types.SharedMemory.Mouse;
@ -45,6 +46,12 @@ namespace Ryujinx.HLE.HOS.Services.Hid.Types.SharedMemory
[FieldOffset(0x9A00)] [FieldOffset(0x9A00)]
public Array10<NpadState> Npads; public Array10<NpadState> Npads;
/// <summary>
/// Debug mouse.
/// </summary>
[FieldOffset(0x3DC00)]
public RingLifo<DebugMouseState> DebugMouse;
public static SharedMemory Create() public static SharedMemory Create()
{ {
SharedMemory result = new() SharedMemory result = new()

View File

@ -1,3 +1,4 @@
using Gommon;
using Ryujinx.Common.Logging; using Ryujinx.Common.Logging;
using Ryujinx.Common.Memory; using Ryujinx.Common.Memory;
using Ryujinx.Common.Utilities; using Ryujinx.Common.Utilities;
@ -143,7 +144,7 @@ namespace Ryujinx.HLE.HOS.Services.Ldn.UserServiceCreator.LdnMitm
if (decompressedLdnData.Length != header.DecompressLength) if (decompressedLdnData.Length != header.DecompressLength)
{ {
Logger.Error?.PrintMsg(LogClass.ServiceLdn, $"Decompress error: length does not match. ({decompressedLdnData.Length} != {header.DecompressLength})"); Logger.Error?.PrintMsg(LogClass.ServiceLdn, $"Decompress error: length does not match. ({decompressedLdnData.Length} != {header.DecompressLength})");
Logger.Error?.PrintMsg(LogClass.ServiceLdn, $"Decompress error data: '{string.Join("", decompressedLdnData.Select(x => (int)x).ToArray())}'"); Logger.Error?.PrintMsg(LogClass.ServiceLdn, $"Decompress error data: '{decompressedLdnData.Select(x => (int)x).JoinToString(string.Empty)}'");
return; return;
} }

View File

@ -15,7 +15,7 @@ namespace Ryujinx.HLE.HOS.Services.Ngct
ulong bufferSize = context.Request.PtrBuff[0].Size; ulong bufferSize = context.Request.PtrBuff[0].Size;
bool isMatch = false; bool isMatch = false;
string text = ""; string text = string.Empty;
if (bufferSize != 0) if (bufferSize != 0)
{ {
@ -57,8 +57,8 @@ namespace Ryujinx.HLE.HOS.Services.Ngct
ulong bufferFilteredPosition = context.Request.RecvListBuff[0].Position; ulong bufferFilteredPosition = context.Request.RecvListBuff[0].Position;
string text = ""; string text = string.Empty;
string textFiltered = ""; string textFiltered = string.Empty;
if (bufferSize != 0) if (bufferSize != 0)
{ {

View File

@ -42,7 +42,7 @@ namespace Ryujinx.HLE.HOS.Services.Nv.NvDrvServices.NvHostAsGpu
public NvHostAsGpuDeviceFile(ServiceCtx context, IVirtualMemoryManager memory, ulong owner) : base(context, owner) public NvHostAsGpuDeviceFile(ServiceCtx context, IVirtualMemoryManager memory, ulong owner) : base(context, owner)
{ {
_asContext = new AddressSpaceContext(context.Device.Gpu.CreateMemoryManager(owner)); _asContext = new AddressSpaceContext(context.Device.Gpu.CreateMemoryManager(owner, context.Device.Memory.Size));
_memoryAllocator = new NvMemoryAllocator(); _memoryAllocator = new NvMemoryAllocator();
} }

File diff suppressed because it is too large Load Diff

View File

@ -36,7 +36,7 @@ namespace Ryujinx.HLE.HOS.Services.Sockets.Nsd.Manager
// TODO: Load Environment from the savedata. // TODO: Load Environment from the savedata.
address = address.Replace("%", IManager.NsdSettings.Environment); address = address.Replace("%", IManager.NsdSettings.Environment);
resolvedAddress = ""; resolvedAddress = string.Empty;
if (IManager.NsdSettings == null) if (IManager.NsdSettings == null)
{ {

View File

@ -63,7 +63,7 @@ namespace Ryujinx.HLE.HOS.Services.SurfaceFlinger
if (size < 0) if (size < 0)
{ {
return ""; return string.Empty;
} }
ReadOnlySpan<byte> data = ReadInPlace((size + 1) * 2); ReadOnlySpan<byte> data = ReadInPlace((size + 1) * 2);

View File

@ -166,7 +166,7 @@ namespace Ryujinx.HLE.HOS.Services.Vi.RootService
private ResultCode OpenDisplayImpl(ServiceCtx context, string name) private ResultCode OpenDisplayImpl(ServiceCtx context, string name)
{ {
if (name == "") if (name == string.Empty)
{ {
return ResultCode.InvalidValue; return ResultCode.InvalidValue;
} }

View File

@ -102,7 +102,7 @@ namespace Ryujinx.HLE.Loaders.Executables
Match fsSdkMatch = FsSdkRegex().Match(rawTextBuffer); Match fsSdkMatch = FsSdkRegex().Match(rawTextBuffer);
if (fsSdkMatch.Success) if (fsSdkMatch.Success)
{ {
stringBuilder.AppendLine($" FS SDK Version: {fsSdkMatch.Value.Replace("sdk_version: ", "")}"); stringBuilder.AppendLine($" FS SDK Version: {fsSdkMatch.Value.Replace("sdk_version: ", string.Empty)}");
} }
MatchCollection sdkMwMatches = SdkMwRegex().Matches(rawTextBuffer); MatchCollection sdkMwMatches = SdkMwRegex().Matches(rawTextBuffer);

View File

@ -89,7 +89,7 @@ namespace Ryujinx.HLE.Loaders.Processes.Extensions
Logger.Warning?.Print(LogClass.Ptc, "Detected unsupported ExeFs modifications. PTC disabled."); Logger.Warning?.Print(LogClass.Ptc, "Detected unsupported ExeFs modifications. PTC disabled.");
} }
string programName = ""; string programName = string.Empty;
if (!isHomebrew && programId > 0x010000000000FFFF) if (!isHomebrew && programId > 0x010000000000FFFF)
{ {

View File

@ -15,7 +15,7 @@ namespace Ryujinx.HLE.Loaders.Processes
var nacpData = new BlitStruct<ApplicationControlProperty>(1); var nacpData = new BlitStruct<ApplicationControlProperty>(1);
ulong programId = metaLoader.GetProgramId(); ulong programId = metaLoader.GetProgramId();
device.Configuration.VirtualFileSystem.ModLoader.CollectMods(new[] { programId }); device.Configuration.VirtualFileSystem.ModLoader.CollectMods([programId]);
if (programId != 0) if (programId != 0)
{ {

View File

@ -145,7 +145,7 @@ namespace Ryujinx.HLE.Loaders.Processes
IFileSystem dummyExeFs = null; IFileSystem dummyExeFs = null;
Stream romfsStream = null; Stream romfsStream = null;
string programName = ""; string programName = string.Empty;
ulong programId = 0000000000000000; ulong programId = 0000000000000000;
// Load executable. // Load executable.

View File

@ -255,7 +255,7 @@ namespace Ryujinx.HLE.Loaders.Processes
{ {
NsoExecutable nso => Convert.ToHexString(nso.BuildId.ItemsRo.ToArray()), NsoExecutable nso => Convert.ToHexString(nso.BuildId.ItemsRo.ToArray()),
NroExecutable nro => Convert.ToHexString(nro.Header.BuildId), NroExecutable nro => Convert.ToHexString(nro.Header.BuildId),
_ => "", _ => string.Empty
}).ToUpper()); }).ToUpper());
ulong[] nsoBase = new ulong[executables.Length]; ulong[] nsoBase = new ulong[executables.Length];

View File

@ -1,3 +1,4 @@
using Humanizer;
using Ryujinx.Common.Configuration; using Ryujinx.Common.Configuration;
using Ryujinx.Common.Configuration.Hid; using Ryujinx.Common.Configuration.Hid;
using Ryujinx.Common.Logging; using Ryujinx.Common.Logging;
@ -485,10 +486,10 @@ namespace Ryujinx.Headless.SDL2
{ {
string playerCount = args.PlayerCountMin == args.PlayerCountMax ? $"exactly {args.PlayerCountMin}" : $"{args.PlayerCountMin}-{args.PlayerCountMax}"; string playerCount = args.PlayerCountMin == args.PlayerCountMax ? $"exactly {args.PlayerCountMin}" : $"{args.PlayerCountMin}-{args.PlayerCountMax}";
string message = $"Application requests {playerCount} player(s) with:\n\n" string message = $"Application requests {playerCount} {"player".ToQuantity(args.PlayerCountMin + args.PlayerCountMax, ShowQuantityAs.None)} with:\n\n"
+ $"TYPES: {args.SupportedStyles}\n\n" + $"TYPES: {args.SupportedStyles}\n\n"
+ $"PLAYERS: {string.Join(", ", args.SupportedPlayers)}\n\n" + $"PLAYERS: {string.Join(", ", args.SupportedPlayers)}\n\n"
+ (args.IsDocked ? "Docked mode set. Handheld is also invalid.\n\n" : "") + (args.IsDocked ? "Docked mode set. Handheld is also invalid.\n\n" : string.Empty)
+ "Please reconfigure Input now and then press OK."; + "Please reconfigure Input now and then press OK.";
return DisplayMessageDialog("Controller Applet", message); return DisplayMessageDialog("Controller Applet", message);

View File

@ -1235,14 +1235,14 @@ namespace Ryujinx.Horizon.Common
{ 0x412, "NotFound" }, { 0x412, "NotFound" },
{ 0x612, "NotEnoughBuffer" }, { 0x612, "NotEnoughBuffer" },
{ 0xCA12, "Cancelled" }, { 0xCA12, "Cancelled" },
{ 0x7FE12, "" }, { 0x7FE12, string.Empty },
{ 0xFA212, "" }, { 0xFA212, string.Empty },
{ 0xFA612, "InvalidTaskId" }, { 0xFA612, "InvalidTaskId" },
{ 0xFB612, "InvalidSize" }, { 0xFB612, "InvalidSize" },
{ 0xFCA12, "TaskCancelled" }, { 0xFCA12, "TaskCancelled" },
{ 0xFCC12, "TaskNotCompleted" }, { 0xFCC12, "TaskNotCompleted" },
{ 0xFCE12, "TaskQueueNotAvailable" }, { 0xFCE12, "TaskQueueNotAvailable" },
{ 0x106A12, "" }, { 0x106A12, string.Empty },
{ 0x106C12, "OutOfRpcTask" }, { 0x106C12, "OutOfRpcTask" },
{ 0x109612, "InvalidCategory" }, { 0x109612, "InvalidCategory" },
{ 0x214, "OutOfKeyResource" }, { 0x214, "OutOfKeyResource" },

View File

@ -221,7 +221,7 @@ namespace Ryujinx.Horizon.Sdk.Ngc.Detail
if (includeMultiWord) if (includeMultiWord)
{ {
int lastMultiWordIndex = 0; int lastMultiWordIndex = 0;
string multiWord = ""; string multiWord = string.Empty;
while (_multiWordMap.Has(nodePlainIndex)) while (_multiWordMap.Has(nodePlainIndex))
{ {

View File

@ -162,7 +162,7 @@ namespace Ryujinx.UI.App.Common
NsoReader reader = new(); NsoReader reader = new();
reader.Initialize(nsoFile.Release().AsStorage().AsFile(OpenMode.Read)).ThrowIfFailure(); reader.Initialize(nsoFile.Release().AsStorage().AsFile(OpenMode.Read)).ThrowIfFailure();
return BitConverter.ToString(reader.Header.ModuleId.ItemsRo.ToArray()).Replace("-", "").ToUpper()[..16]; return BitConverter.ToString(reader.Header.ModuleId.ItemsRo.ToArray()).Replace("-", string.Empty).ToUpper()[..16];
} }
} }
} }

View File

@ -16,7 +16,7 @@ namespace Ryujinx.UI.Common.Configuration
/// <summary> /// <summary>
/// The current version of the file format /// The current version of the file format
/// </summary> /// </summary>
public const int CurrentVersion = 55; public const int CurrentVersion = 56;
/// <summary> /// <summary>
/// Version of the configuration file format /// Version of the configuration file format
@ -173,6 +173,11 @@ namespace Ryujinx.UI.Common.Configuration
/// </summary> /// </summary>
public bool RememberWindowState { get; set; } public bool RememberWindowState { get; set; }
/// <summary>
/// Enables or disables the redesigned title bar
/// </summary>
public bool ShowTitleBar { get; set; }
/// <summary> /// <summary>
/// Enables hardware-accelerated rendering for Avalonia /// Enables hardware-accelerated rendering for Avalonia
/// </summary> /// </summary>
@ -293,16 +298,6 @@ namespace Ryujinx.UI.Common.Configuration
/// </summary> /// </summary>
public string LanguageCode { get; set; } public string LanguageCode { get; set; }
/// <summary>
/// Enable or disable custom themes in the GUI
/// </summary>
public bool EnableCustomTheme { get; set; }
/// <summary>
/// Path to custom GUI theme
/// </summary>
public string CustomThemePath { get; set; }
/// <summary> /// <summary>
/// Chooses the base style // Not Used /// Chooses the base style // Not Used
/// </summary> /// </summary>

View File

@ -144,16 +144,6 @@ namespace Ryujinx.UI.Common.Configuration
/// </summary> /// </summary>
public ReactiveObject<string> LanguageCode { get; private set; } public ReactiveObject<string> LanguageCode { get; private set; }
/// <summary>
/// Enable or disable custom themes in the GUI
/// </summary>
public ReactiveObject<bool> EnableCustomTheme { get; private set; }
/// <summary>
/// Path to custom GUI theme
/// </summary>
public ReactiveObject<string> CustomThemePath { get; private set; }
/// <summary> /// <summary>
/// Selects the base style /// Selects the base style
/// </summary> /// </summary>
@ -202,8 +192,6 @@ namespace Ryujinx.UI.Common.Configuration
AutoloadDirs = new ReactiveObject<List<string>>(); AutoloadDirs = new ReactiveObject<List<string>>();
ShownFileTypes = new ShownFileTypeSettings(); ShownFileTypes = new ShownFileTypeSettings();
WindowStartup = new WindowStartupSettings(); WindowStartup = new WindowStartupSettings();
EnableCustomTheme = new ReactiveObject<bool>();
CustomThemePath = new ReactiveObject<string>();
BaseStyle = new ReactiveObject<string>(); BaseStyle = new ReactiveObject<string>();
StartFullscreen = new ReactiveObject<bool>(); StartFullscreen = new ReactiveObject<bool>();
GameListViewMode = new ReactiveObject<int>(); GameListViewMode = new ReactiveObject<int>();
@ -652,6 +640,11 @@ namespace Ryujinx.UI.Common.Configuration
/// </summary> /// </summary>
public ReactiveObject<bool> RememberWindowState { get; private set; } public ReactiveObject<bool> RememberWindowState { get; private set; }
/// <summary>
/// Enables or disables the redesigned title bar
/// </summary>
public ReactiveObject<bool> ShowTitleBar { get; private set; }
/// <summary> /// <summary>
/// Enables hardware-accelerated rendering for Avalonia /// Enables hardware-accelerated rendering for Avalonia
/// </summary> /// </summary>
@ -675,6 +668,7 @@ namespace Ryujinx.UI.Common.Configuration
ShowConfirmExit = new ReactiveObject<bool>(); ShowConfirmExit = new ReactiveObject<bool>();
IgnoreApplet = new ReactiveObject<bool>(); IgnoreApplet = new ReactiveObject<bool>();
RememberWindowState = new ReactiveObject<bool>(); RememberWindowState = new ReactiveObject<bool>();
ShowTitleBar = new ReactiveObject<bool>();
EnableHardwareAcceleration = new ReactiveObject<bool>(); EnableHardwareAcceleration = new ReactiveObject<bool>();
HideCursor = new ReactiveObject<HideCursorMode>(); HideCursor = new ReactiveObject<HideCursorMode>();
} }
@ -714,6 +708,7 @@ namespace Ryujinx.UI.Common.Configuration
ShowConfirmExit = ShowConfirmExit, ShowConfirmExit = ShowConfirmExit,
IgnoreApplet = IgnoreApplet, IgnoreApplet = IgnoreApplet,
RememberWindowState = RememberWindowState, RememberWindowState = RememberWindowState,
ShowTitleBar = ShowTitleBar,
EnableHardwareAcceleration = EnableHardwareAcceleration, EnableHardwareAcceleration = EnableHardwareAcceleration,
HideCursor = HideCursor, HideCursor = HideCursor,
EnableVsync = Graphics.EnableVsync, EnableVsync = Graphics.EnableVsync,
@ -770,8 +765,6 @@ namespace Ryujinx.UI.Common.Configuration
WindowMaximized = UI.WindowStartup.WindowMaximized, WindowMaximized = UI.WindowStartup.WindowMaximized,
}, },
LanguageCode = UI.LanguageCode, LanguageCode = UI.LanguageCode,
EnableCustomTheme = UI.EnableCustomTheme,
CustomThemePath = UI.CustomThemePath,
BaseStyle = UI.BaseStyle, BaseStyle = UI.BaseStyle,
GameListViewMode = UI.GameListViewMode, GameListViewMode = UI.GameListViewMode,
ShowNames = UI.ShowNames, ShowNames = UI.ShowNames,
@ -804,8 +797,8 @@ namespace Ryujinx.UI.Common.Configuration
Graphics.MaxAnisotropy.Value = -1.0f; Graphics.MaxAnisotropy.Value = -1.0f;
Graphics.AspectRatio.Value = AspectRatio.Fixed16x9; Graphics.AspectRatio.Value = AspectRatio.Fixed16x9;
Graphics.GraphicsBackend.Value = DefaultGraphicsBackend(); Graphics.GraphicsBackend.Value = DefaultGraphicsBackend();
Graphics.PreferredGpu.Value = ""; Graphics.PreferredGpu.Value = string.Empty;
Graphics.ShadersDumpPath.Value = ""; Graphics.ShadersDumpPath.Value = string.Empty;
Logger.EnableDebug.Value = false; Logger.EnableDebug.Value = false;
Logger.EnableStub.Value = true; Logger.EnableStub.Value = true;
Logger.EnableInfo.Value = true; Logger.EnableInfo.Value = true;
@ -814,7 +807,7 @@ namespace Ryujinx.UI.Common.Configuration
Logger.EnableTrace.Value = false; Logger.EnableTrace.Value = false;
Logger.EnableGuest.Value = true; Logger.EnableGuest.Value = true;
Logger.EnableFsAccessLog.Value = false; Logger.EnableFsAccessLog.Value = false;
Logger.FilteredClasses.Value = Array.Empty<LogClass>(); Logger.FilteredClasses.Value = [];
Logger.GraphicsDebugLevel.Value = GraphicsDebugLevel.None; Logger.GraphicsDebugLevel.Value = GraphicsDebugLevel.None;
System.Language.Value = Language.AmericanEnglish; System.Language.Value = Language.AmericanEnglish;
System.Region.Value = Region.USA; System.Region.Value = Region.USA;
@ -826,6 +819,7 @@ namespace Ryujinx.UI.Common.Configuration
ShowConfirmExit.Value = true; ShowConfirmExit.Value = true;
IgnoreApplet.Value = false; IgnoreApplet.Value = false;
RememberWindowState.Value = true; RememberWindowState.Value = true;
ShowTitleBar.Value = !OperatingSystem.IsWindows();
EnableHardwareAcceleration.Value = true; EnableHardwareAcceleration.Value = true;
HideCursor.Value = HideCursorMode.OnIdle; HideCursor.Value = HideCursorMode.OnIdle;
Graphics.EnableVsync.Value = true; Graphics.EnableVsync.Value = true;
@ -860,17 +854,15 @@ namespace Ryujinx.UI.Common.Configuration
UI.GuiColumns.PathColumn.Value = true; UI.GuiColumns.PathColumn.Value = true;
UI.ColumnSort.SortColumnId.Value = 0; UI.ColumnSort.SortColumnId.Value = 0;
UI.ColumnSort.SortAscending.Value = false; UI.ColumnSort.SortAscending.Value = false;
UI.GameDirs.Value = new List<string>(); UI.GameDirs.Value = [];
UI.AutoloadDirs.Value = new List<string>(); UI.AutoloadDirs.Value = [];
UI.ShownFileTypes.NSP.Value = true; UI.ShownFileTypes.NSP.Value = true;
UI.ShownFileTypes.PFS0.Value = true; UI.ShownFileTypes.PFS0.Value = true;
UI.ShownFileTypes.XCI.Value = true; UI.ShownFileTypes.XCI.Value = true;
UI.ShownFileTypes.NCA.Value = true; UI.ShownFileTypes.NCA.Value = true;
UI.ShownFileTypes.NRO.Value = true; UI.ShownFileTypes.NRO.Value = true;
UI.ShownFileTypes.NSO.Value = true; UI.ShownFileTypes.NSO.Value = true;
UI.EnableCustomTheme.Value = true;
UI.LanguageCode.Value = "en_US"; UI.LanguageCode.Value = "en_US";
UI.CustomThemePath.Value = "";
UI.BaseStyle.Value = "Dark"; UI.BaseStyle.Value = "Dark";
UI.GameListViewMode.Value = 0; UI.GameListViewMode.Value = 0;
UI.ShowNames.Value = true; UI.ShowNames.Value = true;
@ -1540,6 +1532,15 @@ namespace Ryujinx.UI.Common.Configuration
configurationFileUpdated = true; configurationFileUpdated = true;
} }
if (configurationFileFormat.Version < 56)
{
Ryujinx.Common.Logging.Logger.Warning?.Print(LogClass.Application, $"Outdated configuration version {configurationFileFormat.Version}, migrating to version 56.");
configurationFileFormat.ShowTitleBar = !OperatingSystem.IsWindows();
configurationFileUpdated = true;
}
Logger.EnableFileLog.Value = configurationFileFormat.EnableFileLog; Logger.EnableFileLog.Value = configurationFileFormat.EnableFileLog;
Graphics.ResScale.Value = configurationFileFormat.ResScale; Graphics.ResScale.Value = configurationFileFormat.ResScale;
Graphics.ResScaleCustom.Value = configurationFileFormat.ResScaleCustom; Graphics.ResScaleCustom.Value = configurationFileFormat.ResScaleCustom;
@ -1572,6 +1573,7 @@ namespace Ryujinx.UI.Common.Configuration
ShowConfirmExit.Value = configurationFileFormat.ShowConfirmExit; ShowConfirmExit.Value = configurationFileFormat.ShowConfirmExit;
IgnoreApplet.Value = configurationFileFormat.IgnoreApplet; IgnoreApplet.Value = configurationFileFormat.IgnoreApplet;
RememberWindowState.Value = configurationFileFormat.RememberWindowState; RememberWindowState.Value = configurationFileFormat.RememberWindowState;
ShowTitleBar.Value = configurationFileFormat.ShowTitleBar;
EnableHardwareAcceleration.Value = configurationFileFormat.EnableHardwareAcceleration; EnableHardwareAcceleration.Value = configurationFileFormat.EnableHardwareAcceleration;
HideCursor.Value = configurationFileFormat.HideCursor; HideCursor.Value = configurationFileFormat.HideCursor;
Graphics.EnableVsync.Value = configurationFileFormat.EnableVsync; Graphics.EnableVsync.Value = configurationFileFormat.EnableVsync;
@ -1610,9 +1612,7 @@ namespace Ryujinx.UI.Common.Configuration
UI.ShownFileTypes.NCA.Value = configurationFileFormat.ShownFileTypes.NCA; UI.ShownFileTypes.NCA.Value = configurationFileFormat.ShownFileTypes.NCA;
UI.ShownFileTypes.NRO.Value = configurationFileFormat.ShownFileTypes.NRO; UI.ShownFileTypes.NRO.Value = configurationFileFormat.ShownFileTypes.NRO;
UI.ShownFileTypes.NSO.Value = configurationFileFormat.ShownFileTypes.NSO; UI.ShownFileTypes.NSO.Value = configurationFileFormat.ShownFileTypes.NSO;
UI.EnableCustomTheme.Value = configurationFileFormat.EnableCustomTheme;
UI.LanguageCode.Value = configurationFileFormat.LanguageCode; UI.LanguageCode.Value = configurationFileFormat.LanguageCode;
UI.CustomThemePath.Value = configurationFileFormat.CustomThemePath;
UI.BaseStyle.Value = configurationFileFormat.BaseStyle; UI.BaseStyle.Value = configurationFileFormat.BaseStyle;
UI.GameListViewMode.Value = configurationFileFormat.GameListViewMode; UI.GameListViewMode.Value = configurationFileFormat.GameListViewMode;
UI.ShowNames.Value = configurationFileFormat.ShowNames; UI.ShowNames.Value = configurationFileFormat.ShowNames;

View File

@ -35,7 +35,7 @@ namespace Ryujinx.UI.Common.Helper
if ((uninstall && AreMimeTypesRegisteredLinux()) || (!uninstall && !AreMimeTypesRegisteredLinux())) if ((uninstall && AreMimeTypesRegisteredLinux()) || (!uninstall && !AreMimeTypesRegisteredLinux()))
{ {
string mimeTypesFile = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "mime", "Ryujinx.xml"); string mimeTypesFile = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "mime", "Ryujinx.xml");
string additionalArgs = !uninstall ? "--novendor" : ""; string additionalArgs = !uninstall ? "--novendor" : string.Empty;
using Process mimeProcess = new(); using Process mimeProcess = new();
@ -83,7 +83,7 @@ namespace Ryujinx.UI.Common.Helper
var openCmd = key.OpenSubKey(@"shell\open\command"); var openCmd = key.OpenSubKey(@"shell\open\command");
string keyValue = (string)openCmd.GetValue(""); string keyValue = (string)openCmd.GetValue(string.Empty);
return keyValue is not null && (keyValue.Contains("Ryujinx") || keyValue.Contains(AppDomain.CurrentDomain.FriendlyName)); return keyValue is not null && (keyValue.Contains("Ryujinx") || keyValue.Contains(AppDomain.CurrentDomain.FriendlyName));
} }

View File

@ -12,18 +12,11 @@ namespace Ryujinx.UI.Common.Helper
{ {
public static bool IsFirmwareValid(ContentManager contentManager, out UserError error) public static bool IsFirmwareValid(ContentManager contentManager, out UserError error)
{ {
bool hasFirmware = contentManager.GetCurrentFirmwareVersion() != null; error = contentManager.GetCurrentFirmwareVersion() != null
? UserError.Success
: UserError.NoFirmware;
if (hasFirmware) return error is UserError.Success;
{
error = UserError.Success;
return true;
}
error = UserError.NoFirmware;
return false;
} }
public static bool CanFixStartApplication(ContentManager contentManager, string baseApplicationPath, UserError error, out SystemVersion firmwareVersion) public static bool CanFixStartApplication(ContentManager contentManager, string baseApplicationPath, UserError error, out SystemVersion firmwareVersion)
@ -95,14 +88,18 @@ namespace Ryujinx.UI.Common.Helper
string baseApplicationExtension = Path.GetExtension(baseApplicationPath).ToLowerInvariant(); string baseApplicationExtension = Path.GetExtension(baseApplicationPath).ToLowerInvariant();
// NOTE: We don't force homebrew developers to install a system firmware. // NOTE: We don't force homebrew developers to install a system firmware.
if (baseApplicationExtension is not (".nro" or ".nso")) if (baseApplicationExtension is ".nro" or ".nso")
return IsFirmwareValid(contentManager, out error); {
error = UserError.Success;
return true;
}
return IsFirmwareValid(contentManager, out error);
} }
error = UserError.ApplicationNotFound; error = UserError.ApplicationNotFound;
return error is UserError.Success; return false;
} }
} }
} }

View File

@ -53,7 +53,7 @@ namespace Ryujinx.UI.Common.Helper
{ {
var titleUpdateWindowData = new TitleUpdateMetadata var titleUpdateWindowData = new TitleUpdateMetadata
{ {
Selected = "", Selected = string.Empty,
Paths = [], Paths = [],
}; };

Binary file not shown.

Before

Width:  |  Height:  |  Size: 24 KiB

After

Width:  |  Height:  |  Size: 93 KiB

View File

@ -51,7 +51,6 @@
<ItemGroup> <ItemGroup>
<PackageReference Include="DiscordRichPresence" /> <PackageReference Include="DiscordRichPresence" />
<PackageReference Include="DynamicData" /> <PackageReference Include="DynamicData" />
<PackageReference Include="Humanizer" />
<PackageReference Include="securifybv.ShellLink" /> <PackageReference Include="securifybv.ShellLink" />
</ItemGroup> </ItemGroup>

View File

@ -15,7 +15,7 @@ namespace Ryujinx.UI.LocaleGenerator
context.RegisterSourceOutput(contents, (spc, content) => context.RegisterSourceOutput(contents, (spc, content) =>
{ {
var lines = content.Split('\n').Where(x => x.Trim().StartsWith("\"")).Select(x => x.Split(':')[0].Trim().Replace("\"", "")); var lines = content.Split('\n').Where(x => x.Trim().StartsWith("\"")).Select(x => x.Split(':')[0].Trim().Replace("\"", string.Empty));
StringBuilder enumSourceBuilder = new(); StringBuilder enumSourceBuilder = new();
enumSourceBuilder.AppendLine("namespace Ryujinx.Ava.Common.Locale;"); enumSourceBuilder.AppendLine("namespace Ryujinx.Ava.Common.Locale;");
enumSourceBuilder.AppendLine("internal enum LocaleKeys"); enumSourceBuilder.AppendLine("internal enum LocaleKeys");

View File

@ -58,11 +58,9 @@ namespace Ryujinx.Ava
if (Program.PreviewerDetached) if (Program.PreviewerDetached)
{ {
ApplyConfiguredTheme(); ApplyConfiguredTheme(ConfigurationState.Instance.UI.BaseStyle);
ConfigurationState.Instance.UI.BaseStyle.Event += ThemeChanged_Event; ConfigurationState.Instance.UI.BaseStyle.Event += ThemeChanged_Event;
ConfigurationState.Instance.UI.CustomThemePath.Event += ThemeChanged_Event;
ConfigurationState.Instance.UI.EnableCustomTheme.Event += CustomThemeChanged_Event;
} }
} }
@ -89,16 +87,12 @@ namespace Ryujinx.Ava
}); });
} }
private void CustomThemeChanged_Event(object _, ReactiveEventArgs<bool> __) => ApplyConfiguredTheme(); private void ThemeChanged_Event(object _, ReactiveEventArgs<string> rArgs) => ApplyConfiguredTheme(rArgs.NewValue);
private void ThemeChanged_Event(object _, ReactiveEventArgs<string> __) => ApplyConfiguredTheme(); public void ApplyConfiguredTheme(string baseStyle)
public void ApplyConfiguredTheme()
{ {
try try
{ {
string baseStyle = ConfigurationState.Instance.UI.BaseStyle;
if (string.IsNullOrWhiteSpace(baseStyle)) if (string.IsNullOrWhiteSpace(baseStyle))
{ {
ConfigurationState.Instance.UI.BaseStyle.Value = "Auto"; ConfigurationState.Instance.UI.BaseStyle.Value = "Auto";

View File

@ -604,21 +604,20 @@ namespace Ryujinx.Ava
SystemVersion firmwareVersion = ContentManager.GetCurrentFirmwareVersion(); SystemVersion firmwareVersion = ContentManager.GetCurrentFirmwareVersion();
if (Application.Current.ApplicationLifetime is IClassicDesktopStyleApplicationLifetime desktop) if (Application.Current?.ApplicationLifetime is IClassicDesktopStyleApplicationLifetime)
{ {
if (!SetupValidator.CanStartApplication(ContentManager, ApplicationPath, out UserError userError)) if (!SetupValidator.CanStartApplication(ContentManager, ApplicationPath, out UserError userError))
{
{ {
if (SetupValidator.CanFixStartApplication(ContentManager, ApplicationPath, userError, out firmwareVersion)) if (SetupValidator.CanFixStartApplication(ContentManager, ApplicationPath, userError, out firmwareVersion))
{ {
if (userError == UserError.NoFirmware) if (userError is UserError.NoFirmware)
{ {
UserResult result = await ContentDialogHelper.CreateConfirmationDialog( UserResult result = await ContentDialogHelper.CreateConfirmationDialog(
LocaleManager.Instance[LocaleKeys.DialogFirmwareNoFirmwareInstalledMessage], LocaleManager.Instance[LocaleKeys.DialogFirmwareNoFirmwareInstalledMessage],
LocaleManager.Instance.UpdateAndGetDynamicValue(LocaleKeys.DialogFirmwareInstallEmbeddedMessage, firmwareVersion.VersionString), LocaleManager.Instance.UpdateAndGetDynamicValue(LocaleKeys.DialogFirmwareInstallEmbeddedMessage, firmwareVersion.VersionString),
LocaleManager.Instance[LocaleKeys.InputDialogYes], LocaleManager.Instance[LocaleKeys.InputDialogYes],
LocaleManager.Instance[LocaleKeys.InputDialogNo], LocaleManager.Instance[LocaleKeys.InputDialogNo],
""); string.Empty);
if (result != UserResult.Yes) if (result != UserResult.Yes)
{ {
@ -638,7 +637,7 @@ namespace Ryujinx.Ava
} }
// Tell the user that we installed a firmware for them. // Tell the user that we installed a firmware for them.
if (userError == UserError.NoFirmware) if (userError is UserError.NoFirmware)
{ {
firmwareVersion = ContentManager.GetCurrentFirmwareVersion(); firmwareVersion = ContentManager.GetCurrentFirmwareVersion();
@ -648,7 +647,7 @@ namespace Ryujinx.Ava
LocaleManager.Instance.UpdateAndGetDynamicValue(LocaleKeys.DialogFirmwareInstalledMessage, firmwareVersion.VersionString), LocaleManager.Instance.UpdateAndGetDynamicValue(LocaleKeys.DialogFirmwareInstalledMessage, firmwareVersion.VersionString),
LocaleManager.Instance.UpdateAndGetDynamicValue(LocaleKeys.DialogFirmwareInstallEmbeddedSuccessMessage, firmwareVersion.VersionString), LocaleManager.Instance.UpdateAndGetDynamicValue(LocaleKeys.DialogFirmwareInstallEmbeddedSuccessMessage, firmwareVersion.VersionString),
LocaleManager.Instance[LocaleKeys.InputDialogOk], LocaleManager.Instance[LocaleKeys.InputDialogOk],
"", string.Empty,
LocaleManager.Instance[LocaleKeys.RyujinxInfo]); LocaleManager.Instance[LocaleKeys.RyujinxInfo]);
} }
} }
@ -661,7 +660,6 @@ namespace Ryujinx.Ava
} }
} }
} }
}
Logger.Notice.Print(LogClass.Application, $"Using Firmware Version: {firmwareVersion?.VersionString}"); Logger.Notice.Print(LogClass.Application, $"Using Firmware Version: {firmwareVersion?.VersionString}");
@ -820,20 +818,12 @@ namespace Ryujinx.Ava
VirtualFileSystem.ReloadKeySet(); VirtualFileSystem.ReloadKeySet();
// Initialize Renderer. // Initialize Renderer.
IRenderer renderer; IRenderer renderer = ConfigurationState.Instance.Graphics.GraphicsBackend.Value == GraphicsBackend.OpenGl
? new OpenGLRenderer()
if (ConfigurationState.Instance.Graphics.GraphicsBackend.Value == GraphicsBackend.Vulkan) : VulkanRenderer.Create(
{ ConfigurationState.Instance.Graphics.PreferredGpu,
renderer = new VulkanRenderer(
Vk.GetApi(),
(RendererHost.EmbeddedWindow as EmbeddedWindowVulkan)!.CreateSurface, (RendererHost.EmbeddedWindow as EmbeddedWindowVulkan)!.CreateSurface,
VulkanHelper.GetRequiredInstanceExtensions, VulkanHelper.GetRequiredInstanceExtensions);
ConfigurationState.Instance.Graphics.PreferredGpu.Value);
}
else
{
renderer = new OpenGLRenderer();
}
BackendThreading threadingMode = ConfigurationState.Instance.Graphics.BackendThreading; BackendThreading threadingMode = ConfigurationState.Instance.Graphics.BackendThreading;

View File

@ -97,6 +97,7 @@
"SettingsTabGeneralCheckUpdatesOnLaunch": "التحقق من وجود تحديثات عند التشغيل", "SettingsTabGeneralCheckUpdatesOnLaunch": "التحقق من وجود تحديثات عند التشغيل",
"SettingsTabGeneralShowConfirmExitDialog": "إظهار مربع حوار \"تأكيد الخروج\"", "SettingsTabGeneralShowConfirmExitDialog": "إظهار مربع حوار \"تأكيد الخروج\"",
"SettingsTabGeneralRememberWindowState": "تذكر حجم/موضع النافذة", "SettingsTabGeneralRememberWindowState": "تذكر حجم/موضع النافذة",
"SettingsTabGeneralShowTitleBar": "Show Title Bar (Requires restart)",
"SettingsTabGeneralHideCursor": "إخفاء المؤشر:", "SettingsTabGeneralHideCursor": "إخفاء المؤشر:",
"SettingsTabGeneralHideCursorNever": "مطلقا", "SettingsTabGeneralHideCursorNever": "مطلقا",
"SettingsTabGeneralHideCursorOnIdle": "عند الخمول", "SettingsTabGeneralHideCursorOnIdle": "عند الخمول",

View File

@ -97,6 +97,7 @@
"SettingsTabGeneralCheckUpdatesOnLaunch": "Beim Start nach Updates suchen", "SettingsTabGeneralCheckUpdatesOnLaunch": "Beim Start nach Updates suchen",
"SettingsTabGeneralShowConfirmExitDialog": "Zeige den \"Beenden bestätigen\"-Dialog", "SettingsTabGeneralShowConfirmExitDialog": "Zeige den \"Beenden bestätigen\"-Dialog",
"SettingsTabGeneralRememberWindowState": "Fenstergröße/-position merken", "SettingsTabGeneralRememberWindowState": "Fenstergröße/-position merken",
"SettingsTabGeneralShowTitleBar": "Show Title Bar (Requires restart)",
"SettingsTabGeneralHideCursor": "Mauszeiger ausblenden", "SettingsTabGeneralHideCursor": "Mauszeiger ausblenden",
"SettingsTabGeneralHideCursorNever": "Niemals", "SettingsTabGeneralHideCursorNever": "Niemals",
"SettingsTabGeneralHideCursorOnIdle": "Mauszeiger bei Inaktivität ausblenden", "SettingsTabGeneralHideCursorOnIdle": "Mauszeiger bei Inaktivität ausblenden",

View File

@ -97,6 +97,7 @@
"SettingsTabGeneralCheckUpdatesOnLaunch": "Έλεγχος για Ενημερώσεις στην Εκκίνηση", "SettingsTabGeneralCheckUpdatesOnLaunch": "Έλεγχος για Ενημερώσεις στην Εκκίνηση",
"SettingsTabGeneralShowConfirmExitDialog": "Εμφάνιση διαλόγου \"Επιβεβαίωση Εξόδου\".", "SettingsTabGeneralShowConfirmExitDialog": "Εμφάνιση διαλόγου \"Επιβεβαίωση Εξόδου\".",
"SettingsTabGeneralRememberWindowState": "Remember Window Size/Position", "SettingsTabGeneralRememberWindowState": "Remember Window Size/Position",
"SettingsTabGeneralShowTitleBar": "Show Title Bar (Requires restart)",
"SettingsTabGeneralHideCursor": "Απόκρυψη Κέρσορα:", "SettingsTabGeneralHideCursor": "Απόκρυψη Κέρσορα:",
"SettingsTabGeneralHideCursorNever": "Ποτέ", "SettingsTabGeneralHideCursorNever": "Ποτέ",
"SettingsTabGeneralHideCursorOnIdle": "Απόκρυψη Δρομέα στην Αδράνεια", "SettingsTabGeneralHideCursorOnIdle": "Απόκρυψη Δρομέα στην Αδράνεια",

View File

@ -100,6 +100,7 @@
"SettingsTabGeneralCheckUpdatesOnLaunch": "Check for Updates on Launch", "SettingsTabGeneralCheckUpdatesOnLaunch": "Check for Updates on Launch",
"SettingsTabGeneralShowConfirmExitDialog": "Show \"Confirm Exit\" Dialog", "SettingsTabGeneralShowConfirmExitDialog": "Show \"Confirm Exit\" Dialog",
"SettingsTabGeneralRememberWindowState": "Remember Window Size/Position", "SettingsTabGeneralRememberWindowState": "Remember Window Size/Position",
"SettingsTabGeneralShowTitleBar": "Show Title Bar (Requires restart)",
"SettingsTabGeneralHideCursor": "Hide Cursor:", "SettingsTabGeneralHideCursor": "Hide Cursor:",
"SettingsTabGeneralHideCursorNever": "Never", "SettingsTabGeneralHideCursorNever": "Never",
"SettingsTabGeneralHideCursorOnIdle": "On Idle", "SettingsTabGeneralHideCursorOnIdle": "On Idle",

View File

@ -97,6 +97,7 @@
"SettingsTabGeneralCheckUpdatesOnLaunch": "Buscar actualizaciones al iniciar", "SettingsTabGeneralCheckUpdatesOnLaunch": "Buscar actualizaciones al iniciar",
"SettingsTabGeneralShowConfirmExitDialog": "Mostrar diálogo de confirmación al cerrar", "SettingsTabGeneralShowConfirmExitDialog": "Mostrar diálogo de confirmación al cerrar",
"SettingsTabGeneralRememberWindowState": "Remember Window Size/Position", "SettingsTabGeneralRememberWindowState": "Remember Window Size/Position",
"SettingsTabGeneralShowTitleBar": "Show Title Bar (Requires restart)",
"SettingsTabGeneralHideCursor": "Esconder el cursor:", "SettingsTabGeneralHideCursor": "Esconder el cursor:",
"SettingsTabGeneralHideCursorNever": "Nunca", "SettingsTabGeneralHideCursorNever": "Nunca",
"SettingsTabGeneralHideCursorOnIdle": "Ocultar cursor cuando esté inactivo", "SettingsTabGeneralHideCursorOnIdle": "Ocultar cursor cuando esté inactivo",

View File

@ -100,6 +100,7 @@
"SettingsTabGeneralCheckUpdatesOnLaunch": "Vérifier les mises à jour au démarrage", "SettingsTabGeneralCheckUpdatesOnLaunch": "Vérifier les mises à jour au démarrage",
"SettingsTabGeneralShowConfirmExitDialog": "Afficher le message de \"Confirmation de sortie\"", "SettingsTabGeneralShowConfirmExitDialog": "Afficher le message de \"Confirmation de sortie\"",
"SettingsTabGeneralRememberWindowState": "Mémoriser la taille/position de la fenêtre", "SettingsTabGeneralRememberWindowState": "Mémoriser la taille/position de la fenêtre",
"SettingsTabGeneralShowTitleBar": "Show Title Bar (Requires restart)",
"SettingsTabGeneralHideCursor": "Masquer le Curseur :", "SettingsTabGeneralHideCursor": "Masquer le Curseur :",
"SettingsTabGeneralHideCursorNever": "Jamais", "SettingsTabGeneralHideCursorNever": "Jamais",
"SettingsTabGeneralHideCursorOnIdle": "Masquer le curseur si inactif", "SettingsTabGeneralHideCursorOnIdle": "Masquer le curseur si inactif",
@ -111,7 +112,7 @@
"SettingsTabGeneralRemove": "Retirer", "SettingsTabGeneralRemove": "Retirer",
"SettingsTabSystem": "Système", "SettingsTabSystem": "Système",
"SettingsTabSystemCore": "Cœur", "SettingsTabSystemCore": "Cœur",
"SettingsTabSystemSystemRegion": "Région du système:", "SettingsTabSystemSystemRegion": "Région du système :",
"SettingsTabSystemSystemRegionJapan": "Japon", "SettingsTabSystemSystemRegionJapan": "Japon",
"SettingsTabSystemSystemRegionUSA": "USA", "SettingsTabSystemSystemRegionUSA": "USA",
"SettingsTabSystemSystemRegionEurope": "Europe", "SettingsTabSystemSystemRegionEurope": "Europe",
@ -119,7 +120,7 @@
"SettingsTabSystemSystemRegionChina": "Chine", "SettingsTabSystemSystemRegionChina": "Chine",
"SettingsTabSystemSystemRegionKorea": "Corée", "SettingsTabSystemSystemRegionKorea": "Corée",
"SettingsTabSystemSystemRegionTaiwan": "Taïwan", "SettingsTabSystemSystemRegionTaiwan": "Taïwan",
"SettingsTabSystemSystemLanguage": "Langue du système:", "SettingsTabSystemSystemLanguage": "Langue du système :",
"SettingsTabSystemSystemLanguageJapanese": "Japonais", "SettingsTabSystemSystemLanguageJapanese": "Japonais",
"SettingsTabSystemSystemLanguageAmericanEnglish": "Anglais Américain", "SettingsTabSystemSystemLanguageAmericanEnglish": "Anglais Américain",
"SettingsTabSystemSystemLanguageFrench": "Français", "SettingsTabSystemSystemLanguageFrench": "Français",
@ -138,7 +139,7 @@
"SettingsTabSystemSystemLanguageSimplifiedChinese": "Chinois simplifié", "SettingsTabSystemSystemLanguageSimplifiedChinese": "Chinois simplifié",
"SettingsTabSystemSystemLanguageTraditionalChinese": "Chinois traditionnel", "SettingsTabSystemSystemLanguageTraditionalChinese": "Chinois traditionnel",
"SettingsTabSystemSystemTimeZone": "Fuseau horaire du système :", "SettingsTabSystemSystemTimeZone": "Fuseau horaire du système :",
"SettingsTabSystemSystemTime": "Heure du système:", "SettingsTabSystemSystemTime": "Heure du système :",
"SettingsTabSystemEnableVsync": "Synchronisation verticale (VSync)", "SettingsTabSystemEnableVsync": "Synchronisation verticale (VSync)",
"SettingsTabSystemEnablePptc": "Activer le PPTC (Profiled Persistent Translation Cache)", "SettingsTabSystemEnablePptc": "Activer le PPTC (Profiled Persistent Translation Cache)",
"SettingsTabSystemEnableLowPowerPptc": "PPTC à faible puissance", "SettingsTabSystemEnableLowPowerPptc": "PPTC à faible puissance",
@ -160,13 +161,13 @@
"SettingsTabGraphics": "Graphismes", "SettingsTabGraphics": "Graphismes",
"SettingsTabGraphicsAPI": "API Graphique", "SettingsTabGraphicsAPI": "API Graphique",
"SettingsTabGraphicsEnableShaderCache": "Activer le cache des shaders", "SettingsTabGraphicsEnableShaderCache": "Activer le cache des shaders",
"SettingsTabGraphicsAnisotropicFiltering": "Filtrage anisotrope:", "SettingsTabGraphicsAnisotropicFiltering": "Filtrage anisotrope :",
"SettingsTabGraphicsAnisotropicFilteringAuto": "Auto", "SettingsTabGraphicsAnisotropicFilteringAuto": "Auto",
"SettingsTabGraphicsAnisotropicFiltering2x": "x2", "SettingsTabGraphicsAnisotropicFiltering2x": "x2",
"SettingsTabGraphicsAnisotropicFiltering4x": "x4", "SettingsTabGraphicsAnisotropicFiltering4x": "x4",
"SettingsTabGraphicsAnisotropicFiltering8x": "x8", "SettingsTabGraphicsAnisotropicFiltering8x": "x8",
"SettingsTabGraphicsAnisotropicFiltering16x": "x16", "SettingsTabGraphicsAnisotropicFiltering16x": "x16",
"SettingsTabGraphicsResolutionScale": "Échelle de résolution:", "SettingsTabGraphicsResolutionScale": "Échelle de résolution :",
"SettingsTabGraphicsResolutionScaleCustom": "Personnalisée (Non recommandée)", "SettingsTabGraphicsResolutionScaleCustom": "Personnalisée (Non recommandée)",
"SettingsTabGraphicsResolutionScaleNative": "Natif (720p/1080p)", "SettingsTabGraphicsResolutionScaleNative": "Natif (720p/1080p)",
"SettingsTabGraphicsResolutionScale2x": "x2 (1440p/2160p)", "SettingsTabGraphicsResolutionScale2x": "x2 (1440p/2160p)",
@ -188,10 +189,10 @@
"SettingsTabLoggingEnableInfoLogs": "Activer les journaux d'informations", "SettingsTabLoggingEnableInfoLogs": "Activer les journaux d'informations",
"SettingsTabLoggingEnableWarningLogs": "Activer les journaux d'avertissements", "SettingsTabLoggingEnableWarningLogs": "Activer les journaux d'avertissements",
"SettingsTabLoggingEnableErrorLogs": "Activer les journaux d'erreurs", "SettingsTabLoggingEnableErrorLogs": "Activer les journaux d'erreurs",
"SettingsTabLoggingEnableTraceLogs": "Activer journaux d'erreurs Trace", "SettingsTabLoggingEnableTraceLogs": "Activer les journaux d'erreurs Trace",
"SettingsTabLoggingEnableGuestLogs": "Activer les journaux du programme simulé", "SettingsTabLoggingEnableGuestLogs": "Activer les journaux du programme simulé",
"SettingsTabLoggingEnableFsAccessLogs": "Activer les journaux d'accès au système de fichiers", "SettingsTabLoggingEnableFsAccessLogs": "Activer les journaux d'accès au système de fichiers",
"SettingsTabLoggingFsGlobalAccessLogMode": "Niveau des journaux d'accès au système de fichiers:", "SettingsTabLoggingFsGlobalAccessLogMode": "Niveau des journaux d'accès au système de fichiers :",
"SettingsTabLoggingDeveloperOptions": "Options développeur", "SettingsTabLoggingDeveloperOptions": "Options développeur",
"SettingsTabLoggingDeveloperOptionsNote": "ATTENTION : Réduira les performances", "SettingsTabLoggingDeveloperOptionsNote": "ATTENTION : Réduira les performances",
"SettingsTabLoggingGraphicsBackendLogLevel": "Niveau du journal du backend graphique :", "SettingsTabLoggingGraphicsBackendLogLevel": "Niveau du journal du backend graphique :",
@ -223,7 +224,7 @@
"ControllerSettingsDeviceDisabled": "Désactivé", "ControllerSettingsDeviceDisabled": "Désactivé",
"ControllerSettingsControllerType": "Type de manette", "ControllerSettingsControllerType": "Type de manette",
"ControllerSettingsControllerTypeHandheld": "Portable", "ControllerSettingsControllerTypeHandheld": "Portable",
"ControllerSettingsControllerTypeProController": "Manette Pro", "ControllerSettingsControllerTypeProController": "Manette Switch Pro",
"ControllerSettingsControllerTypeJoyConPair": "JoyCon Joints", "ControllerSettingsControllerTypeJoyConPair": "JoyCon Joints",
"ControllerSettingsControllerTypeJoyConLeft": "JoyCon Gauche", "ControllerSettingsControllerTypeJoyConLeft": "JoyCon Gauche",
"ControllerSettingsControllerTypeJoyConRight": "JoyCon Droite", "ControllerSettingsControllerTypeJoyConRight": "JoyCon Droite",
@ -271,15 +272,15 @@
"ControllerSettingsExtraButtonsLeft": "Boutons Gauche", "ControllerSettingsExtraButtonsLeft": "Boutons Gauche",
"ControllerSettingsExtraButtonsRight": "Boutons Droite", "ControllerSettingsExtraButtonsRight": "Boutons Droite",
"ControllerSettingsMisc": "Divers", "ControllerSettingsMisc": "Divers",
"ControllerSettingsTriggerThreshold": "Seuil de gachettes:", "ControllerSettingsTriggerThreshold": "Seuil de gachettes :",
"ControllerSettingsMotion": "Mouvements", "ControllerSettingsMotion": "Mouvements",
"ControllerSettingsMotionUseCemuhookCompatibleMotion": "Utiliser un capteur de mouvements CemuHook", "ControllerSettingsMotionUseCemuhookCompatibleMotion": "Utiliser un capteur de mouvements CemuHook",
"ControllerSettingsMotionControllerSlot": "Contrôleur ID:", "ControllerSettingsMotionControllerSlot": "Contrôleur ID :",
"ControllerSettingsMotionMirrorInput": "Inverser les contrôles", "ControllerSettingsMotionMirrorInput": "Inverser les contrôles",
"ControllerSettingsMotionRightJoyConSlot": "JoyCon Droit ID:", "ControllerSettingsMotionRightJoyConSlot": "JoyCon Droit ID :",
"ControllerSettingsMotionServerHost": "Serveur d'hébergement :", "ControllerSettingsMotionServerHost": "Serveur d'hébergement :",
"ControllerSettingsMotionGyroSensitivity": "Sensibilitée du gyroscope:", "ControllerSettingsMotionGyroSensitivity": "Sensibilitée du gyroscope :",
"ControllerSettingsMotionGyroDeadzone": "Zone morte du gyroscope:", "ControllerSettingsMotionGyroDeadzone": "Zone morte du gyroscope :",
"ControllerSettingsSave": "Enregistrer", "ControllerSettingsSave": "Enregistrer",
"ControllerSettingsClose": "Fermer", "ControllerSettingsClose": "Fermer",
"KeyUnknown": "Touche inconnue", "KeyUnknown": "Touche inconnue",
@ -519,7 +520,7 @@
"DialogModManagerDeletionWarningMessage": "Vous êtes sur le point de supprimer le mod : {0}\n\nÊtes-vous sûr de vouloir continuer ?", "DialogModManagerDeletionWarningMessage": "Vous êtes sur le point de supprimer le mod : {0}\n\nÊtes-vous sûr de vouloir continuer ?",
"DialogModManagerDeletionAllWarningMessage": "Vous êtes sur le point de supprimer tous les mods pour ce titre.\n\nÊtes-vous sûr de vouloir continuer ?", "DialogModManagerDeletionAllWarningMessage": "Vous êtes sur le point de supprimer tous les mods pour ce titre.\n\nÊtes-vous sûr de vouloir continuer ?",
"SettingsTabGraphicsFeaturesOptions": "Fonctionnalités", "SettingsTabGraphicsFeaturesOptions": "Fonctionnalités",
"SettingsTabGraphicsBackendMultithreading": "Interface graphique multithread", "SettingsTabGraphicsBackendMultithreading": "Interface graphique multithread :",
"CommonAuto": "Auto", "CommonAuto": "Auto",
"CommonOff": "Désactivé", "CommonOff": "Désactivé",
"CommonOn": "Activé", "CommonOn": "Activé",
@ -589,7 +590,7 @@
"MemoryManagerHostTooltip": "Mappez directement la mémoire dans l'espace d'adresses de l'hôte. Compilation et exécution JIT beaucoup plus rapides.", "MemoryManagerHostTooltip": "Mappez directement la mémoire dans l'espace d'adresses de l'hôte. Compilation et exécution JIT beaucoup plus rapides.",
"MemoryManagerUnsafeTooltip": "Mapper directement la mémoire dans la carte, mais ne pas masquer l'adresse dans l'espace d'adressage du client avant l'accès. Plus rapide, mais la sécurité sera négligée. L'application peut accéder à la mémoire depuis n'importe où dans Ryujinx, donc exécutez uniquement les programmes en qui vous avez confiance avec ce mode.", "MemoryManagerUnsafeTooltip": "Mapper directement la mémoire dans la carte, mais ne pas masquer l'adresse dans l'espace d'adressage du client avant l'accès. Plus rapide, mais la sécurité sera négligée. L'application peut accéder à la mémoire depuis n'importe où dans Ryujinx, donc exécutez uniquement les programmes en qui vous avez confiance avec ce mode.",
"UseHypervisorTooltip": "Utiliser l'Hyperviseur au lieu du JIT. Améliore considérablement les performances lorsqu'il est disponible, mais peut être instable dans son état actuel.", "UseHypervisorTooltip": "Utiliser l'Hyperviseur au lieu du JIT. Améliore considérablement les performances lorsqu'il est disponible, mais peut être instable dans son état actuel.",
"DRamTooltip": "Utilise une disposition alternative de la mémoire avec 8GiO de DRAM pour imiter le kit de développeur de la Switch.\n\nActivez cette option pour les packs de textures 4k ou les mods à résolution 4k.\nN'améliore pas les performances.\n\nLaissez désactivé en cas d'incertitude.", "DRamTooltip": "Change le montant de DRAM qui est alloué.\n\nActivez cette option pour les packs de textures 4k ou les mods à résolution 4k.\nN'améliore pas les performances.\n\nLaissez à 4GiO en cas de doute.",
"IgnoreMissingServicesTooltip": "Ignore les services Horizon OS non-intégrés. Cela peut aider à contourner les plantages lors du démarrage de certains jeux.\n\nLaissez désactivé en cas d'incertitude.", "IgnoreMissingServicesTooltip": "Ignore les services Horizon OS non-intégrés. Cela peut aider à contourner les plantages lors du démarrage de certains jeux.\n\nLaissez désactivé en cas d'incertitude.",
"IgnoreAppletTooltip": "La boîte de dialogue externe \"Programme Manette\" n'apparaîtra pas si la manette est déconnectée en jeu. Il n'y aura aucune boîte de dialogue ouverte pour configurer une nouvelle manette. Une fois que la manette précédemment déconnectée est reconnectée, le jeu reprendra automatiquement. \n\nLaissez désactivé en cas d'incertitude.", "IgnoreAppletTooltip": "La boîte de dialogue externe \"Programme Manette\" n'apparaîtra pas si la manette est déconnectée en jeu. Il n'y aura aucune boîte de dialogue ouverte pour configurer une nouvelle manette. Une fois que la manette précédemment déconnectée est reconnectée, le jeu reprendra automatiquement. \n\nLaissez désactivé en cas d'incertitude.",
"GraphicsBackendThreadingTooltip": "Exécute des commandes du backend graphiques sur un second thread.\n\nAccélère la compilation des shaders, réduit les crashs et les lags, améliore les performances sur les pilotes GPU sans support de multithreading. Légère augementation des performances sur les pilotes avec multithreading intégrer.\n\nRéglez sur Auto en cas d'incertitude.", "GraphicsBackendThreadingTooltip": "Exécute des commandes du backend graphiques sur un second thread.\n\nAccélère la compilation des shaders, réduit les crashs et les lags, améliore les performances sur les pilotes GPU sans support de multithreading. Légère augementation des performances sur les pilotes avec multithreading intégrer.\n\nRéglez sur Auto en cas d'incertitude.",
@ -599,14 +600,14 @@
"ResolutionScaleEntryTooltip": "Échelle de résolution à virgule, telle que : 1.5. Les échelles non intégrales sont plus susceptibles de causer des problèmes ou des crashs.", "ResolutionScaleEntryTooltip": "Échelle de résolution à virgule, telle que : 1.5. Les échelles non intégrales sont plus susceptibles de causer des problèmes ou des crashs.",
"AnisotropyTooltip": "Niveau de filtrage anisotrope. Réglez sur Auto pour utiliser la valeur demandée par le jeu.", "AnisotropyTooltip": "Niveau de filtrage anisotrope. Réglez sur Auto pour utiliser la valeur demandée par le jeu.",
"AspectRatioTooltip": "Format d'affichage appliqué à la fenêtre du moteur de rendu.\n\nChangez cela uniquement si vous utilisez un mod changeant le format d'affichage pour votre jeu, sinon les graphismes seront étirés.\n\nLaissez sur 16:9 si vous n'êtes pas sûr.", "AspectRatioTooltip": "Format d'affichage appliqué à la fenêtre du moteur de rendu.\n\nChangez cela uniquement si vous utilisez un mod changeant le format d'affichage pour votre jeu, sinon les graphismes seront étirés.\n\nLaissez sur 16:9 si vous n'êtes pas sûr.",
"ShaderDumpPathTooltip": "Chemin de copie des Shaders", "ShaderDumpPathTooltip": "Chemin de copie des Shaders :",
"FileLogTooltip": "Sauvegarde le journal de la console dans un fichier journal sur le disque. Cela n'affecte pas la performance.", "FileLogTooltip": "Sauvegarde le journal de la console dans un fichier journal sur le disque. Cela n'affecte pas les performances.",
"StubLogTooltip": "Affiche les messages de journaux dans la console. N'affecte pas la performance.", "StubLogTooltip": "Affiche les messages de journaux dans la console. N'affecte pas les performances.",
"InfoLogTooltip": "Affiche les messages de journaux d'informations dans la console. N'affecte pas la performance.", "InfoLogTooltip": "Affiche les messages de journaux d'informations dans la console. N'affecte pas les performances.",
"WarnLogTooltip": "Affiche les messages d'avertissement dans la console. N'affecte pas la performancs.", "WarnLogTooltip": "Affiche les messages d'avertissement dans la console. N'affecte pas les performances.",
"ErrorLogTooltip": "Affiche les messages de journaux d'erreur dans la console. N'affecte pas la performance.", "ErrorLogTooltip": "Affiche les messages de journaux d'erreur dans la console. N'affecte pas les performances.",
"TraceLogTooltip": "Affiche la trace des messages de journaux dans la console. N'affecte pas la performance.", "TraceLogTooltip": "Affiche la trace des messages de journaux dans la console. N'affecte pas les performances.",
"GuestLogTooltip": "Affiche les messages de journaux des invités dans la console. N'affecte pas la performance.", "GuestLogTooltip": "Affiche les messages de journaux des invités dans la console. N'affecte pas les performances.",
"FileAccessLogTooltip": "Affiche les messages de journaux d'accès aux fichiers dans la console.", "FileAccessLogTooltip": "Affiche les messages de journaux d'accès aux fichiers dans la console.",
"FSAccessLogModeTooltip": "Active la sortie du journal d'accès FS de la console. Les modes possibles sont 0-3", "FSAccessLogModeTooltip": "Active la sortie du journal d'accès FS de la console. Les modes possibles sont 0-3",
"DeveloperOptionTooltip": "À utiliser avec précaution", "DeveloperOptionTooltip": "À utiliser avec précaution",
@ -680,7 +681,7 @@
"SoftwareKeyboardModeAlphabet": "Doit être uniquement des caractères non CJK", "SoftwareKeyboardModeAlphabet": "Doit être uniquement des caractères non CJK",
"SoftwareKeyboardModeASCII": "Doit être uniquement du texte ASCII", "SoftwareKeyboardModeASCII": "Doit être uniquement du texte ASCII",
"ControllerAppletControllers": "Contrôleurs pris en charge :", "ControllerAppletControllers": "Contrôleurs pris en charge :",
"ControllerAppletPlayers": "Joueurs :", "ControllerAppletPlayers": "Joueurs :",
"ControllerAppletDescription": "Votre configuration actuelle n'est pas valide. Ouvrez les paramètres et reconfigurez vos contrôles.", "ControllerAppletDescription": "Votre configuration actuelle n'est pas valide. Ouvrez les paramètres et reconfigurez vos contrôles.",
"ControllerAppletDocked": "Mode station d'accueil défini. Le mode contrôle portable doit être désactivé.", "ControllerAppletDocked": "Mode station d'accueil défini. Le mode contrôle portable doit être désactivé.",
"UpdaterRenaming": "Renommage des anciens fichiers...", "UpdaterRenaming": "Renommage des anciens fichiers...",
@ -729,7 +730,7 @@
"UpdateWindowUpdateAddedMessage": "{0} nouvelle(s) mise(s) à jour ajoutée(s)", "UpdateWindowUpdateAddedMessage": "{0} nouvelle(s) mise(s) à jour ajoutée(s)",
"UpdateWindowBundledContentNotice": "Les mises à jour incluses avec le jeu ne peuvent pas être supprimées mais peuvent être désactivées.", "UpdateWindowBundledContentNotice": "Les mises à jour incluses avec le jeu ne peuvent pas être supprimées mais peuvent être désactivées.",
"CheatWindowHeading": "Cheats disponibles pour {0} [{1}]", "CheatWindowHeading": "Cheats disponibles pour {0} [{1}]",
"BuildId": "BuildId:", "BuildId": "BuildId :",
"DlcWindowBundledContentNotice": "Les DLC inclus avec le jeu ne peuvent pas être supprimés mais peuvent être désactivés.", "DlcWindowBundledContentNotice": "Les DLC inclus avec le jeu ne peuvent pas être supprimés mais peuvent être désactivés.",
"DlcWindowHeading": "{0} Contenu(s) téléchargeable(s)", "DlcWindowHeading": "{0} Contenu(s) téléchargeable(s)",
"DlcWindowDlcAddedMessage": "{0} nouveau(x) contenu(s) téléchargeable(s) ajouté(s)", "DlcWindowDlcAddedMessage": "{0} nouveau(x) contenu(s) téléchargeable(s) ajouté(s)",

View File

@ -97,6 +97,7 @@
"SettingsTabGeneralCheckUpdatesOnLaunch": "בדוק אם קיימים עדכונים בהפעלה", "SettingsTabGeneralCheckUpdatesOnLaunch": "בדוק אם קיימים עדכונים בהפעלה",
"SettingsTabGeneralShowConfirmExitDialog": "הראה דיאלוג \"אשר יציאה\"", "SettingsTabGeneralShowConfirmExitDialog": "הראה דיאלוג \"אשר יציאה\"",
"SettingsTabGeneralRememberWindowState": "Remember Window Size/Position", "SettingsTabGeneralRememberWindowState": "Remember Window Size/Position",
"SettingsTabGeneralShowTitleBar": "Show Title Bar (Requires restart)",
"SettingsTabGeneralHideCursor": "הסתר את הסמן", "SettingsTabGeneralHideCursor": "הסתר את הסמן",
"SettingsTabGeneralHideCursorNever": "אף פעם", "SettingsTabGeneralHideCursorNever": "אף פעם",
"SettingsTabGeneralHideCursorOnIdle": "במצב סרק", "SettingsTabGeneralHideCursorOnIdle": "במצב סרק",

View File

@ -30,6 +30,9 @@
"MenuBarToolsManageFileTypes": "Gestisci i tipi di file", "MenuBarToolsManageFileTypes": "Gestisci i tipi di file",
"MenuBarToolsInstallFileTypes": "Installa i tipi di file", "MenuBarToolsInstallFileTypes": "Installa i tipi di file",
"MenuBarToolsUninstallFileTypes": "Disinstalla i tipi di file", "MenuBarToolsUninstallFileTypes": "Disinstalla i tipi di file",
"MenuBarFileLoadDlcFromFolder": "Carica DLC Da una Cartella",
"MenuBarFileLoadTitleUpdatesFromFolder": "Carica Aggiornamenti Da una Cartella",
"MenuBarFileOpenFromFileError": "Nessuna applicazione trovata nel file selezionato",
"MenuBarView": "_View", "MenuBarView": "_View",
"MenuBarViewWindow": "Window Size", "MenuBarViewWindow": "Window Size",
"MenuBarViewWindow720": "720p", "MenuBarViewWindow720": "720p",
@ -97,6 +100,7 @@
"SettingsTabGeneralCheckUpdatesOnLaunch": "Controlla aggiornamenti all'avvio", "SettingsTabGeneralCheckUpdatesOnLaunch": "Controlla aggiornamenti all'avvio",
"SettingsTabGeneralShowConfirmExitDialog": "Mostra dialogo \"Conferma Uscita\"", "SettingsTabGeneralShowConfirmExitDialog": "Mostra dialogo \"Conferma Uscita\"",
"SettingsTabGeneralRememberWindowState": "Remember Window Size/Position", "SettingsTabGeneralRememberWindowState": "Remember Window Size/Position",
"SettingsTabGeneralShowTitleBar": "Show Title Bar (Requires restart)",
"SettingsTabGeneralHideCursor": "Nascondi il cursore:", "SettingsTabGeneralHideCursor": "Nascondi il cursore:",
"SettingsTabGeneralHideCursorNever": "Mai", "SettingsTabGeneralHideCursorNever": "Mai",
"SettingsTabGeneralHideCursorOnIdle": "Quando è inattivo", "SettingsTabGeneralHideCursorOnIdle": "Quando è inattivo",
@ -110,6 +114,8 @@
"SettingsTabSystemSystemRegionJapan": "Giappone", "SettingsTabSystemSystemRegionJapan": "Giappone",
"SettingsTabSystemSystemRegionUSA": "Stati Uniti d'America", "SettingsTabSystemSystemRegionUSA": "Stati Uniti d'America",
"SettingsTabSystemSystemRegionEurope": "Europa", "SettingsTabSystemSystemRegionEurope": "Europa",
"SettingsTabGeneralAutoloadDirectories": "Directory di Caricamento Automatico per DLC/Aggiornamenti",
"SettingsTabGeneralAutoloadNote": "Aggiornamenti e DLC che collegano a file mancanti verranno disabilitati automaticamente",
"SettingsTabSystemSystemRegionAustralia": "Australia", "SettingsTabSystemSystemRegionAustralia": "Australia",
"SettingsTabSystemSystemRegionChina": "Cina", "SettingsTabSystemSystemRegionChina": "Cina",
"SettingsTabSystemSystemRegionKorea": "Corea", "SettingsTabSystemSystemRegionKorea": "Corea",
@ -410,6 +416,7 @@
"GameListContextMenuToggleFavorite": "Preferito", "GameListContextMenuToggleFavorite": "Preferito",
"GameListContextMenuToggleFavoriteToolTip": "Segna il gioco come preferito", "GameListContextMenuToggleFavoriteToolTip": "Segna il gioco come preferito",
"SettingsTabGeneralTheme": "Tema:", "SettingsTabGeneralTheme": "Tema:",
"SettingsTabGeneralThemeAuto": "Auto",
"SettingsTabGeneralThemeDark": "Scuro", "SettingsTabGeneralThemeDark": "Scuro",
"SettingsTabGeneralThemeLight": "Chiaro", "SettingsTabGeneralThemeLight": "Chiaro",
"ControllerSettingsConfigureGeneral": "Configura", "ControllerSettingsConfigureGeneral": "Configura",
@ -563,6 +570,7 @@
"CustomThemeCheckTooltip": "Attiva o disattiva temi personalizzati nella GUI", "CustomThemeCheckTooltip": "Attiva o disattiva temi personalizzati nella GUI",
"CustomThemePathTooltip": "Percorso al tema GUI personalizzato", "CustomThemePathTooltip": "Percorso al tema GUI personalizzato",
"CustomThemeBrowseTooltip": "Sfoglia per cercare un tema GUI personalizzato", "CustomThemeBrowseTooltip": "Sfoglia per cercare un tema GUI personalizzato",
"RemoveAutoloadDirTooltip": "Rimuovi la directory di autoload selezionata",
"DockModeToggleTooltip": "La modalità TV fa sì che il sistema emulato si comporti come una Nintendo Switch posizionata nella sua base. Ciò migliora la qualità grafica nella maggior parte dei giochi. Al contrario, disabilitandola il sistema emulato si comporterà come una Nintendo Switch in modalità portatile, riducendo la qualità grafica.\n\nConfigura i controlli del giocatore 1 se intendi usare la modalità TV; configura i controlli della modalità portatile se intendi usare quest'ultima.\n\nNel dubbio, lascia l'opzione attiva.", "DockModeToggleTooltip": "La modalità TV fa sì che il sistema emulato si comporti come una Nintendo Switch posizionata nella sua base. Ciò migliora la qualità grafica nella maggior parte dei giochi. Al contrario, disabilitandola il sistema emulato si comporterà come una Nintendo Switch in modalità portatile, riducendo la qualità grafica.\n\nConfigura i controlli del giocatore 1 se intendi usare la modalità TV; configura i controlli della modalità portatile se intendi usare quest'ultima.\n\nNel dubbio, lascia l'opzione attiva.",
"DirectKeyboardTooltip": "Supporto per l'accesso diretto alla tastiera (HID). Fornisce ai giochi l'accesso alla tastiera come dispositivo di inserimento del testo.\n\nFunziona solo con i giochi che supportano nativamente l'utilizzo della tastiera su hardware Switch.\n\nNel dubbio, lascia l'opzione disattivata.", "DirectKeyboardTooltip": "Supporto per l'accesso diretto alla tastiera (HID). Fornisce ai giochi l'accesso alla tastiera come dispositivo di inserimento del testo.\n\nFunziona solo con i giochi che supportano nativamente l'utilizzo della tastiera su hardware Switch.\n\nNel dubbio, lascia l'opzione disattivata.",
"DirectMouseTooltip": "Supporto per l'accesso diretto al mouse (HID). Fornisce ai giochi l'accesso al mouse come dispositivo di puntamento.\n\nFunziona solo con i rari giochi che supportano nativamente l'utilizzo del mouse su hardware Switch.\n\nQuando questa opzione è attivata, il touchscreen potrebbe non funzionare.\n\nNel dubbio, lascia l'opzione disattivata.", "DirectMouseTooltip": "Supporto per l'accesso diretto al mouse (HID). Fornisce ai giochi l'accesso al mouse come dispositivo di puntamento.\n\nFunziona solo con i rari giochi che supportano nativamente l'utilizzo del mouse su hardware Switch.\n\nQuando questa opzione è attivata, il touchscreen potrebbe non funzionare.\n\nNel dubbio, lascia l'opzione disattivata.",
@ -572,7 +580,9 @@
"TimeTooltip": "Cambia data e ora di sistema", "TimeTooltip": "Cambia data e ora di sistema",
"VSyncToggleTooltip": "Sincronizzazione verticale della console Emulata. Essenzialmente un limitatore di frame per la maggior parte dei giochi; disabilitarlo può far girare giochi a velocità più alta, allungare le schermate di caricamento o farle bloccare.\n\nPuò essere attivata in gioco con un tasto di scelta rapida (F1 per impostazione predefinita). Ti consigliamo di farlo se hai intenzione di disabilitarlo.\n\nLascia ON se non sei sicuro.", "VSyncToggleTooltip": "Sincronizzazione verticale della console Emulata. Essenzialmente un limitatore di frame per la maggior parte dei giochi; disabilitarlo può far girare giochi a velocità più alta, allungare le schermate di caricamento o farle bloccare.\n\nPuò essere attivata in gioco con un tasto di scelta rapida (F1 per impostazione predefinita). Ti consigliamo di farlo se hai intenzione di disabilitarlo.\n\nLascia ON se non sei sicuro.",
"PptcToggleTooltip": "Salva le funzioni JIT tradotte in modo che non debbano essere tradotte tutte le volte che si avvia un determinato gioco.\n\nRiduce i fenomeni di stuttering e velocizza sensibilmente gli avvii successivi del gioco.\n\nNel dubbio, lascia l'opzione attiva.", "PptcToggleTooltip": "Salva le funzioni JIT tradotte in modo che non debbano essere tradotte tutte le volte che si avvia un determinato gioco.\n\nRiduce i fenomeni di stuttering e velocizza sensibilmente gli avvii successivi del gioco.\n\nNel dubbio, lascia l'opzione attiva.",
"LowPowerPptcToggleTooltip": "Load the PPTC using a third of the amount of cores.", "AddAutoloadDirBoxTooltip": "Inserisci una directory di \"autoload\" da aggiungere alla lista",
"AddAutoloadDirTooltip": "Aggiungi una directory di \"autoload\" alla lista",
"LowPowerPptcToggleTooltip": "Carica il PPTC usando un terzo dei core.",
"FsIntegrityToggleTooltip": "Controlla la presenza di file corrotti quando si avvia un gioco. Se vengono rilevati dei file corrotti, verrà mostrato un errore di hash nel log.\n\nQuesta opzione non influisce sulle prestazioni ed è pensata per facilitare la risoluzione dei problemi.\n\nNel dubbio, lascia l'opzione attiva.", "FsIntegrityToggleTooltip": "Controlla la presenza di file corrotti quando si avvia un gioco. Se vengono rilevati dei file corrotti, verrà mostrato un errore di hash nel log.\n\nQuesta opzione non influisce sulle prestazioni ed è pensata per facilitare la risoluzione dei problemi.\n\nNel dubbio, lascia l'opzione attiva.",
"AudioBackendTooltip": "Cambia il backend usato per riprodurre l'audio.\n\nSDL2 è quello preferito, mentre OpenAL e SoundIO sono usati come ripiego. Dummy non riprodurrà alcun suono.\n\nNel dubbio, imposta l'opzione su SDL2.", "AudioBackendTooltip": "Cambia il backend usato per riprodurre l'audio.\n\nSDL2 è quello preferito, mentre OpenAL e SoundIO sono usati come ripiego. Dummy non riprodurrà alcun suono.\n\nNel dubbio, imposta l'opzione su SDL2.",
"MemoryManagerTooltip": "Cambia il modo in cui la memoria guest è mappata e vi si accede. Influisce notevolmente sulle prestazioni della CPU emulata.\n\nNel dubbio, imposta l'opzione su Host Unchecked.", "MemoryManagerTooltip": "Cambia il modo in cui la memoria guest è mappata e vi si accede. Influisce notevolmente sulle prestazioni della CPU emulata.\n\nNel dubbio, imposta l'opzione su Host Unchecked.",
@ -617,6 +627,8 @@
"GridSizeTooltip": "Cambia la dimensione dei riquadri della griglia", "GridSizeTooltip": "Cambia la dimensione dei riquadri della griglia",
"SettingsTabSystemSystemLanguageBrazilianPortuguese": "Portoghese brasiliano", "SettingsTabSystemSystemLanguageBrazilianPortuguese": "Portoghese brasiliano",
"AboutRyujinxContributorsButtonHeader": "Mostra tutti i contributori", "AboutRyujinxContributorsButtonHeader": "Mostra tutti i contributori",
"LoadDlcFromFolderTooltip": "Apri un esploratore file per scegliere una o più cartelle dalle quali caricare DLC in massa",
"LoadTitleUpdatesFromFolderTooltip": "Apri un esploratore file per scegliere una o più cartelle dalle quali caricare aggiornamenti in massa",
"SettingsTabSystemAudioVolume": "Volume: ", "SettingsTabSystemAudioVolume": "Volume: ",
"AudioVolumeTooltip": "Cambia volume audio", "AudioVolumeTooltip": "Cambia volume audio",
"SettingsTabSystemEnableInternetAccess": "Attiva l'accesso a Internet da parte del guest/Modalità LAN", "SettingsTabSystemEnableInternetAccess": "Attiva l'accesso a Internet da parte del guest/Modalità LAN",
@ -656,6 +668,8 @@
"OpenSetupGuideMessage": "Apri la guida all'installazione", "OpenSetupGuideMessage": "Apri la guida all'installazione",
"NoUpdate": "Nessun aggiornamento", "NoUpdate": "Nessun aggiornamento",
"TitleUpdateVersionLabel": "Versione {0}", "TitleUpdateVersionLabel": "Versione {0}",
"TitleBundledUpdateVersionLabel": "Incluso: Version {0}",
"TitleBundledDlcLabel": "Incluso:",
"RyujinxInfo": "Ryujinx - Info", "RyujinxInfo": "Ryujinx - Info",
"RyujinxConfirm": "Ryujinx - Conferma", "RyujinxConfirm": "Ryujinx - Conferma",
"FileDialogAllTypes": "Tutti i tipi", "FileDialogAllTypes": "Tutti i tipi",
@ -721,6 +735,14 @@
"Cancel": "Annulla", "Cancel": "Annulla",
"Save": "Salva", "Save": "Salva",
"Discard": "Scarta", "Discard": "Scarta",
"UpdateWindowBundledContentNotice": "Gli aggiornamenti inclusi non possono essere eliminati, ma solo disattivati",
"AutoloadDlcAddedMessage": "{0} contenuto/i scaricabile/i aggiunto/i",
"AutoloadDlcRemovedMessage": "{0} contenuto/i scaricabile/i mancante/i rimosso/i",
"AutoloadUpdateAddedMessage": "{0} aggiornamento/i aggiunto/i",
"AutoloadUpdateRemovedMessage": "{0} aggiornamento/i mancante/i rimosso/i",
"DlcWindowBundledContentNotice": "i DLC \"impacchettati\" non possono essere rimossi, ma solo disabilitati.",
"DlcWindowDlcAddedMessage": "{0} nuovo/i contenuto/i scaricabile/i aggiunto/i",
"UpdateWindowUpdateAddedMessage": "{0} aggiornamento/i aggiunto/i",
"Paused": "In pausa", "Paused": "In pausa",
"UserProfilesSetProfileImage": "Imposta immagine profilo", "UserProfilesSetProfileImage": "Imposta immagine profilo",
"UserProfileEmptyNameError": "Il nome è obbligatorio", "UserProfileEmptyNameError": "Il nome è obbligatorio",
@ -771,6 +793,7 @@
"SmaaLow": "SMAA Basso", "SmaaLow": "SMAA Basso",
"SmaaMedium": "SMAA Medio", "SmaaMedium": "SMAA Medio",
"SmaaHigh": "SMAA Alto", "SmaaHigh": "SMAA Alto",
"GraphicsScalingFilterArea": "Area",
"SmaaUltra": "SMAA Ultra", "SmaaUltra": "SMAA Ultra",
"UserEditorTitle": "Modificare L'Utente", "UserEditorTitle": "Modificare L'Utente",
"UserEditorTitleCreate": "Crea Un Utente", "UserEditorTitleCreate": "Crea Un Utente",

View File

@ -97,6 +97,7 @@
"SettingsTabGeneralCheckUpdatesOnLaunch": "起動時にアップデートを確認する", "SettingsTabGeneralCheckUpdatesOnLaunch": "起動時にアップデートを確認する",
"SettingsTabGeneralShowConfirmExitDialog": "\"終了を確認\" ダイアログを表示する", "SettingsTabGeneralShowConfirmExitDialog": "\"終了を確認\" ダイアログを表示する",
"SettingsTabGeneralRememberWindowState": "Remember Window Size/Position", "SettingsTabGeneralRememberWindowState": "Remember Window Size/Position",
"SettingsTabGeneralShowTitleBar": "Show Title Bar (Requires restart)",
"SettingsTabGeneralHideCursor": "マウスカーソルを非表示", "SettingsTabGeneralHideCursor": "マウスカーソルを非表示",
"SettingsTabGeneralHideCursorNever": "決して", "SettingsTabGeneralHideCursorNever": "決して",
"SettingsTabGeneralHideCursorOnIdle": "アイドル時", "SettingsTabGeneralHideCursorOnIdle": "アイドル時",

View File

@ -97,6 +97,7 @@
"SettingsTabGeneralCheckUpdatesOnLaunch": "시작 시, 업데이트 확인", "SettingsTabGeneralCheckUpdatesOnLaunch": "시작 시, 업데이트 확인",
"SettingsTabGeneralShowConfirmExitDialog": "\"종료 확인\" 대화 상자 표시", "SettingsTabGeneralShowConfirmExitDialog": "\"종료 확인\" 대화 상자 표시",
"SettingsTabGeneralRememberWindowState": "창 크기/위치 기억", "SettingsTabGeneralRememberWindowState": "창 크기/위치 기억",
"SettingsTabGeneralShowTitleBar": "Show Title Bar (Requires restart)",
"SettingsTabGeneralHideCursor": "마우스 커서 숨기기", "SettingsTabGeneralHideCursor": "마우스 커서 숨기기",
"SettingsTabGeneralHideCursorNever": "절대 안 함", "SettingsTabGeneralHideCursorNever": "절대 안 함",
"SettingsTabGeneralHideCursorOnIdle": "유휴 상태", "SettingsTabGeneralHideCursorOnIdle": "유휴 상태",

View File

@ -97,6 +97,7 @@
"SettingsTabGeneralCheckUpdatesOnLaunch": "Sprawdzaj aktualizacje przy uruchomieniu", "SettingsTabGeneralCheckUpdatesOnLaunch": "Sprawdzaj aktualizacje przy uruchomieniu",
"SettingsTabGeneralShowConfirmExitDialog": "Pokazuj okno dialogowe \"Potwierdź wyjście\"", "SettingsTabGeneralShowConfirmExitDialog": "Pokazuj okno dialogowe \"Potwierdź wyjście\"",
"SettingsTabGeneralRememberWindowState": "Remember Window Size/Position", "SettingsTabGeneralRememberWindowState": "Remember Window Size/Position",
"SettingsTabGeneralShowTitleBar": "Show Title Bar (Requires restart)",
"SettingsTabGeneralHideCursor": "Ukryj kursor:", "SettingsTabGeneralHideCursor": "Ukryj kursor:",
"SettingsTabGeneralHideCursorNever": "Nigdy", "SettingsTabGeneralHideCursorNever": "Nigdy",
"SettingsTabGeneralHideCursorOnIdle": "Gdy bezczynny", "SettingsTabGeneralHideCursorOnIdle": "Gdy bezczynny",

View File

@ -10,7 +10,10 @@
"SettingsTabSystemUseHypervisor": "Usar Hipervisor", "SettingsTabSystemUseHypervisor": "Usar Hipervisor",
"MenuBarFile": "_Arquivo", "MenuBarFile": "_Arquivo",
"MenuBarFileOpenFromFile": "_Abrir ROM do jogo...", "MenuBarFileOpenFromFile": "_Abrir ROM do jogo...",
"MenuBarFileOpenFromFileError": "Nenhum aplicativo encontrado no arquivo selecionado.",
"MenuBarFileOpenUnpacked": "Abrir jogo _extraído...", "MenuBarFileOpenUnpacked": "Abrir jogo _extraído...",
"MenuBarFileLoadDlcFromFolder": "Carregar DLC da Pasta",
"MenuBarFileLoadTitleUpdatesFromFolder": "Carregar Atualizações de Jogo da Pasta",
"MenuBarFileOpenEmuFolder": "Abrir diretório do e_mulador...", "MenuBarFileOpenEmuFolder": "Abrir diretório do e_mulador...",
"MenuBarFileOpenLogsFolder": "Abrir diretório de _logs...", "MenuBarFileOpenLogsFolder": "Abrir diretório de _logs...",
"MenuBarFileExit": "_Sair", "MenuBarFileExit": "_Sair",
@ -97,11 +100,14 @@
"SettingsTabGeneralCheckUpdatesOnLaunch": "Verificar se há atualizações ao iniciar", "SettingsTabGeneralCheckUpdatesOnLaunch": "Verificar se há atualizações ao iniciar",
"SettingsTabGeneralShowConfirmExitDialog": "Exibir diálogo de confirmação ao sair", "SettingsTabGeneralShowConfirmExitDialog": "Exibir diálogo de confirmação ao sair",
"SettingsTabGeneralRememberWindowState": "Lembrar tamanho/posição da Janela", "SettingsTabGeneralRememberWindowState": "Lembrar tamanho/posição da Janela",
"SettingsTabGeneralShowTitleBar": "Show Title Bar (Requires restart)",
"SettingsTabGeneralHideCursor": "Esconder o cursor do mouse:", "SettingsTabGeneralHideCursor": "Esconder o cursor do mouse:",
"SettingsTabGeneralHideCursorNever": "Nunca", "SettingsTabGeneralHideCursorNever": "Nunca",
"SettingsTabGeneralHideCursorOnIdle": "Esconder o cursor quando ocioso", "SettingsTabGeneralHideCursorOnIdle": "Esconder o cursor quando ocioso",
"SettingsTabGeneralHideCursorAlways": "Sempre", "SettingsTabGeneralHideCursorAlways": "Sempre",
"SettingsTabGeneralGameDirectories": "Diretórios de jogo", "SettingsTabGeneralGameDirectories": "Diretórios de jogo",
"SettingsTabGeneralAutoloadDirectories": "Carregar Automaticamente Diretórios de DLC/Atualizações",
"SettingsTabGeneralAutoloadNote": "DLCs e Atualizações que se referem a arquivos ausentes serão descarregadas automaticamente",
"SettingsTabGeneralAdd": "Adicionar", "SettingsTabGeneralAdd": "Adicionar",
"SettingsTabGeneralRemove": "Remover", "SettingsTabGeneralRemove": "Remover",
"SettingsTabSystem": "Sistema", "SettingsTabSystem": "Sistema",
@ -411,6 +417,7 @@
"GameListContextMenuToggleFavoriteToolTip": "Marca ou desmarca jogo como favorito", "GameListContextMenuToggleFavoriteToolTip": "Marca ou desmarca jogo como favorito",
"SettingsTabGeneralTheme": "Tema:", "SettingsTabGeneralTheme": "Tema:",
"SettingsTabGeneralThemeDark": "Escuro", "SettingsTabGeneralThemeDark": "Escuro",
"SettingsTabGeneralThemeAuto": "Automático",
"SettingsTabGeneralThemeLight": "Claro", "SettingsTabGeneralThemeLight": "Claro",
"ControllerSettingsConfigureGeneral": "Configurar", "ControllerSettingsConfigureGeneral": "Configurar",
"ControllerSettingsRumble": "Vibração", "ControllerSettingsRumble": "Vibração",
@ -453,7 +460,7 @@
"DialogThemeRestartMessage": "O tema foi salvo. Uma reinicialização é necessária para aplicar o tema.", "DialogThemeRestartMessage": "O tema foi salvo. Uma reinicialização é necessária para aplicar o tema.",
"DialogThemeRestartSubMessage": "Deseja reiniciar?", "DialogThemeRestartSubMessage": "Deseja reiniciar?",
"DialogFirmwareInstallEmbeddedMessage": "Gostaria de instalar o firmware incluso neste jogo? (Firmware {0})", "DialogFirmwareInstallEmbeddedMessage": "Gostaria de instalar o firmware incluso neste jogo? (Firmware {0})",
"DialogFirmwareInstallEmbeddedSuccessMessage": "No installed firmware was found but Ryujinx was able to install firmware {0} from the provided game.\nThe emulator will now start.", "DialogFirmwareInstallEmbeddedSuccessMessage": "Nenhum firmware instalado foi encontrado, mas o Ryujinx conseguiu instalar o firmware {0} a partir do jogo fornecido.\nO emulador será iniciado agora.",
"DialogFirmwareNoFirmwareInstalledMessage": "Firmware não foi instalado", "DialogFirmwareNoFirmwareInstalledMessage": "Firmware não foi instalado",
"DialogFirmwareInstalledMessage": "Firmware {0} foi instalado", "DialogFirmwareInstalledMessage": "Firmware {0} foi instalado",
"DialogInstallFileTypesSuccessMessage": "Tipos de arquivo instalados com sucesso!", "DialogInstallFileTypesSuccessMessage": "Tipos de arquivo instalados com sucesso!",
@ -496,10 +503,10 @@
"DialogUserProfileUnsavedChangesSubMessage": "Deseja descartar as alterações?", "DialogUserProfileUnsavedChangesSubMessage": "Deseja descartar as alterações?",
"DialogControllerSettingsModifiedConfirmMessage": "As configurações de controle atuais foram atualizadas.", "DialogControllerSettingsModifiedConfirmMessage": "As configurações de controle atuais foram atualizadas.",
"DialogControllerSettingsModifiedConfirmSubMessage": "Deseja salvar?", "DialogControllerSettingsModifiedConfirmSubMessage": "Deseja salvar?",
"DialogLoadFileErrorMessage": "{0}. Errored File: {1}", "DialogLoadFileErrorMessage": "{0}. Arquivo com erro: {1}",
"DialogModAlreadyExistsMessage": "Mod already exists", "DialogModAlreadyExistsMessage": "O mod já existe",
"DialogModInvalidMessage": "The specified directory does not contain a mod!", "DialogModInvalidMessage": "O diretório especificado não contém um mod!",
"DialogModDeleteNoParentMessage": "Failed to Delete: Could not find the parent directory for mod \"{0}\"!", "DialogModDeleteNoParentMessage": "Falha ao excluir: Não foi possível encontrar o diretório pai do mod \"{0}\"!",
"DialogDlcNoDlcErrorMessage": "O arquivo especificado não contém DLCs para o título selecionado!", "DialogDlcNoDlcErrorMessage": "O arquivo especificado não contém DLCs para o título selecionado!",
"DialogPerformanceCheckLoggingEnabledMessage": "Os logs de depuração estão ativos, esse recurso é feito para ser usado apenas por desenvolvedores.", "DialogPerformanceCheckLoggingEnabledMessage": "Os logs de depuração estão ativos, esse recurso é feito para ser usado apenas por desenvolvedores.",
"DialogPerformanceCheckLoggingEnabledConfirmMessage": "Para melhor performance, é recomendável desabilitar os logs de depuração. Gostaria de desabilitar os logs de depuração agora?", "DialogPerformanceCheckLoggingEnabledConfirmMessage": "Para melhor performance, é recomendável desabilitar os logs de depuração. Gostaria de desabilitar os logs de depuração agora?",
@ -510,8 +517,8 @@
"DialogUpdateAddUpdateErrorMessage": "O arquivo especificado não contém atualizações para o título selecionado!", "DialogUpdateAddUpdateErrorMessage": "O arquivo especificado não contém atualizações para o título selecionado!",
"DialogSettingsBackendThreadingWarningTitle": "Alerta - Threading da API gráfica", "DialogSettingsBackendThreadingWarningTitle": "Alerta - Threading da API gráfica",
"DialogSettingsBackendThreadingWarningMessage": "Ryujinx precisa ser reiniciado após mudar essa opção para que ela tenha efeito. Dependendo da sua plataforma, pode ser preciso desabilitar o multithreading do driver de vídeo quando usar o Ryujinx.", "DialogSettingsBackendThreadingWarningMessage": "Ryujinx precisa ser reiniciado após mudar essa opção para que ela tenha efeito. Dependendo da sua plataforma, pode ser preciso desabilitar o multithreading do driver de vídeo quando usar o Ryujinx.",
"DialogModManagerDeletionWarningMessage": "You are about to delete the mod: {0}\n\nAre you sure you want to proceed?", "DialogModManagerDeletionWarningMessage": "Você está prestes a excluir o mod: {0}\n\nTem certeza de que deseja continuar?",
"DialogModManagerDeletionAllWarningMessage": "You are about to delete all mods for this title.\n\nAre you sure you want to proceed?", "DialogModManagerDeletionAllWarningMessage": "Você está prestes a excluir todos os mods para este jogo.\n\nTem certeza de que deseja continuar?",
"SettingsTabGraphicsFeaturesOptions": "Recursos", "SettingsTabGraphicsFeaturesOptions": "Recursos",
"SettingsTabGraphicsBackendMultithreading": "Multithreading da API gráfica:", "SettingsTabGraphicsBackendMultithreading": "Multithreading da API gráfica:",
"CommonAuto": "Automático", "CommonAuto": "Automático",
@ -546,7 +553,7 @@
"DlcManagerRemoveAllButton": "Remover todos", "DlcManagerRemoveAllButton": "Remover todos",
"DlcManagerEnableAllButton": "Habilitar todos", "DlcManagerEnableAllButton": "Habilitar todos",
"DlcManagerDisableAllButton": "Desabilitar todos", "DlcManagerDisableAllButton": "Desabilitar todos",
"ModManagerDeleteAllButton": "Delete All", "ModManagerDeleteAllButton": "Apagar Tudo",
"MenuBarOptionsChangeLanguage": "Mudar idioma", "MenuBarOptionsChangeLanguage": "Mudar idioma",
"MenuBarShowFileTypes": "Mostrar tipos de arquivo", "MenuBarShowFileTypes": "Mostrar tipos de arquivo",
"CommonSort": "Ordenar", "CommonSort": "Ordenar",
@ -560,19 +567,22 @@
"AddGameDirBoxTooltip": "Escreva um diretório de jogo para adicionar à lista", "AddGameDirBoxTooltip": "Escreva um diretório de jogo para adicionar à lista",
"AddGameDirTooltip": "Adicionar um diretório de jogo à lista", "AddGameDirTooltip": "Adicionar um diretório de jogo à lista",
"RemoveGameDirTooltip": "Remover diretório de jogo selecionado", "RemoveGameDirTooltip": "Remover diretório de jogo selecionado",
"AddAutoloadDirBoxTooltip": "Insira um diretório de carregamento automático para adicionar à lista",
"AddAutoloadDirTooltip": "Adicionar um diretório de carregamento automático à lista",
"RemoveAutoloadDirTooltip": "Remover o diretório de carregamento automático selecionado",
"CustomThemeCheckTooltip": "Habilita ou desabilita temas customizados na interface gráfica", "CustomThemeCheckTooltip": "Habilita ou desabilita temas customizados na interface gráfica",
"CustomThemePathTooltip": "Diretório do tema customizado", "CustomThemePathTooltip": "Diretório do tema customizado",
"CustomThemeBrowseTooltip": "Navegar até um tema customizado", "CustomThemeBrowseTooltip": "Navegar até um tema customizado",
"DockModeToggleTooltip": "Habilita ou desabilita modo TV", "DockModeToggleTooltip": "O modo TV faz o sistema emulado se comportar como um Nintendo Switch na TV, o que melhora a fidelidade gráfica na maioria dos jogos. Por outro lado, desativar essa opção fará o sistema emulado se comportar como um Nintendo Switch portátil, reduzindo a qualidade gráfica.\n\nConfigure os controles do jogador 1 se planeja usar o modo TV; configure os controles de portátil se planeja usar o modo Portátil.\n\nMantenha ativado se estiver em dúvida.",
"DirectKeyboardTooltip": "Direct keyboard access (HID) support. Provides games access to your keyboard as a text entry device.\n\nOnly works with games that natively support keyboard usage on Switch hardware.\n\nLeave OFF if unsure.", "DirectKeyboardTooltip": "Suporte para acesso direto ao teclado (HID). Permite que os jogos acessem seu teclado como um dispositivo de entrada de texto.\n\nFunciona apenas com jogos que suportam o uso de teclado nativamente no hardware do Switch.\n\nDeixe desativado se estiver em dúvida.",
"DirectMouseTooltip": "Direct mouse access (HID) support. Provides games access to your mouse as a pointing device.\n\nOnly works with games that natively support mouse controls on Switch hardware, which are few and far between.\n\nWhen enabled, touch screen functionality may not work.\n\nLeave OFF if unsure.", "DirectMouseTooltip": "Suporte para acesso direto ao mouse (HID). Permite que os jogos acessem seu mouse como um dispositivo de apontamento.\n\nFunciona apenas com jogos que suportam controles de mouse nativamente no hardware do Switch, o que é raro.\n\nQuando ativado, a funcionalidade de tela sensível ao toque pode não funcionar.\n\nDeixe desativado se estiver em dúvida.",
"RegionTooltip": "Mudar a região do sistema", "RegionTooltip": "Mudar a região do sistema",
"LanguageTooltip": "Mudar o idioma do sistema", "LanguageTooltip": "Mudar o idioma do sistema",
"TimezoneTooltip": "Mudar o fuso-horário do sistema", "TimezoneTooltip": "Mudar o fuso-horário do sistema",
"TimeTooltip": "Mudar a hora do sistema", "TimeTooltip": "Mudar a hora do sistema",
"VSyncToggleTooltip": "Emulated console's Vertical Sync. Essentially a frame-limiter for the majority of games; disabling it may cause games to run at higher speed or make loading screens take longer or get stuck.\n\nCan be toggled in-game with a hotkey of your preference (F1 by default). We recommend doing this if you plan on disabling it.\n\nLeave ON if unsure.", "VSyncToggleTooltip": "V-Sync do console emulado. Funciona essencialmente como um limitador de quadros para a maioria dos jogos; desativá-lo pode fazer com que os jogos rodem em uma velocidade mais alta ou que telas de carregamento demorem mais ou travem.\n\nPode ser alternado durante o jogo com uma tecla de atalho de sua preferência (F1 por padrão). Recomendamos isso caso planeje desativá-lo.\n\nMantenha ligado se estiver em dúvida.",
"PptcToggleTooltip": "Habilita ou desabilita PPTC", "PptcToggleTooltip": "Habilita ou desabilita PPTC",
"LowPowerPptcToggleTooltip": "Load the PPTC using a third of the amount of cores.", "LowPowerPptcToggleTooltip": "Carregar o PPTC usando um terço da quantidade de núcleos.",
"FsIntegrityToggleTooltip": "Habilita ou desabilita verificação de integridade dos arquivos do jogo", "FsIntegrityToggleTooltip": "Habilita ou desabilita verificação de integridade dos arquivos do jogo",
"AudioBackendTooltip": "Mudar biblioteca de áudio", "AudioBackendTooltip": "Mudar biblioteca de áudio",
"MemoryManagerTooltip": "Muda como a memória do sistema convidado é acessada. Tem um grande impacto na performance da CPU emulada.", "MemoryManagerTooltip": "Muda como a memória do sistema convidado é acessada. Tem um grande impacto na performance da CPU emulada.",
@ -586,10 +596,10 @@
"GraphicsBackendThreadingTooltip": "Habilita multithreading do backend gráfico", "GraphicsBackendThreadingTooltip": "Habilita multithreading do backend gráfico",
"GalThreadingTooltip": "Executa comandos do backend gráfico em uma segunda thread. Permite multithreading em tempo de execução da compilação de shader, diminui os travamentos, e melhora performance em drivers sem suporte embutido a multithreading. Pequena variação na performance máxima em drivers com suporte a multithreading. Ryujinx pode precisar ser reiniciado para desabilitar adequadamente o multithreading embutido do driver, ou você pode precisar fazer isso manualmente para ter a melhor performance.", "GalThreadingTooltip": "Executa comandos do backend gráfico em uma segunda thread. Permite multithreading em tempo de execução da compilação de shader, diminui os travamentos, e melhora performance em drivers sem suporte embutido a multithreading. Pequena variação na performance máxima em drivers com suporte a multithreading. Ryujinx pode precisar ser reiniciado para desabilitar adequadamente o multithreading embutido do driver, ou você pode precisar fazer isso manualmente para ter a melhor performance.",
"ShaderCacheToggleTooltip": "Habilita ou desabilita o cache de shader", "ShaderCacheToggleTooltip": "Habilita ou desabilita o cache de shader",
"ResolutionScaleTooltip": "Multiplies the game's rendering resolution.\n\nA few games may not work with this and look pixelated even when the resolution is increased; for those games, you may need to find mods that remove anti-aliasing or that increase their internal rendering resolution. For using the latter, you'll likely want to select Native.\n\nThis option can be changed while a game is running by clicking \"Apply\" below; you can simply move the settings window aside and experiment until you find your preferred look for a game.\n\nKeep in mind 4x is overkill for virtually any setup.", "ResolutionScaleTooltip": "Multiplica a resolução de renderização do jogo.\n\nAlguns jogos podem não funcionar bem com essa opção e apresentar uma aparência pixelada, mesmo com o aumento da resolução; para esses jogos, talvez seja necessário encontrar mods que removam o anti-aliasing ou aumentem a resolução de renderização interna. Ao usar a segunda opção, provavelmente desejará selecionar Nativa.\n\nEssa opção pode ser alterada enquanto um jogo está em execução, clicando em \"Aplicar\" abaixo; basta mover a janela de configurações para o lado e experimentar até encontrar o visual preferido para o jogo.\n\nLembre-se de que 4x é exagerado para praticamente qualquer configuração.",
"ResolutionScaleEntryTooltip": "Escala de resolução de ponto flutuante, como 1.5. Valores não inteiros tem probabilidade maior de causar problemas ou quebras.", "ResolutionScaleEntryTooltip": "Escala de resolução de ponto flutuante, como 1.5. Valores não inteiros tem probabilidade maior de causar problemas ou quebras.",
"AnisotropyTooltip": "Level of Anisotropic Filtering. Set to Auto to use the value requested by the game.", "AnisotropyTooltip": "Nível de Filtragem Anisotrópica. Defina como Automático para usar o valor solicitado pelo jogo.",
"AspectRatioTooltip": "Aspect Ratio applied to the renderer window.\n\nOnly change this if you're using an aspect ratio mod for your game, otherwise the graphics will be stretched.\n\nLeave on 16:9 if unsure.", "AspectRatioTooltip": "Proporção de Tela aplicada à janela do renderizador.\n\nAltere isso apenas se estiver usando um mod de proporção para o seu jogo; caso contrário, os gráficos ficarão esticados.\n\nMantenha em 16:9 se estiver em dúvida.",
"ShaderDumpPathTooltip": "Diretòrio de despejo de shaders", "ShaderDumpPathTooltip": "Diretòrio de despejo de shaders",
"FileLogTooltip": "Habilita ou desabilita log para um arquivo no disco", "FileLogTooltip": "Habilita ou desabilita log para um arquivo no disco",
"StubLogTooltip": "Habilita ou desabilita exibição de mensagens de stub", "StubLogTooltip": "Habilita ou desabilita exibição de mensagens de stub",
@ -606,6 +616,8 @@
"LoadApplicationFileTooltip": "Abre o navegador de arquivos para seleção de um arquivo do Switch compatível a ser carregado", "LoadApplicationFileTooltip": "Abre o navegador de arquivos para seleção de um arquivo do Switch compatível a ser carregado",
"LoadApplicationFolderTooltip": "Abre o navegador de pastas para seleção de pasta extraída do Switch compatível a ser carregada", "LoadApplicationFolderTooltip": "Abre o navegador de pastas para seleção de pasta extraída do Switch compatível a ser carregada",
"OpenRyujinxFolderTooltip": "Abre o diretório do sistema de arquivos do Ryujinx", "OpenRyujinxFolderTooltip": "Abre o diretório do sistema de arquivos do Ryujinx",
"LoadTitleUpdatesFromFolderTooltip": "Abra o explorador de arquivos para selecionar uma ou mais pastas e carregar atualizações de jogo em massa.",
"OpenRyujinxFolderTooltip": "Abrir diretório do sistema de arquivos do Ryujinx",
"OpenRyujinxLogsTooltip": "Abre o diretório onde os logs são salvos", "OpenRyujinxLogsTooltip": "Abre o diretório onde os logs são salvos",
"ExitTooltip": "Sair do Ryujinx", "ExitTooltip": "Sair do Ryujinx",
"OpenSettingsTooltip": "Abrir janela de configurações", "OpenSettingsTooltip": "Abrir janela de configurações",
@ -623,8 +635,8 @@
"EnableInternetAccessTooltip": "Habilita acesso à internet do programa convidado. Se habilitado, o aplicativo vai se comportar como se o sistema Switch emulado estivesse conectado a Internet. Note que em alguns casos, aplicativos podem acessar a Internet mesmo com essa opção desabilitada", "EnableInternetAccessTooltip": "Habilita acesso à internet do programa convidado. Se habilitado, o aplicativo vai se comportar como se o sistema Switch emulado estivesse conectado a Internet. Note que em alguns casos, aplicativos podem acessar a Internet mesmo com essa opção desabilitada",
"GameListContextMenuManageCheatToolTip": "Gerenciar Cheats", "GameListContextMenuManageCheatToolTip": "Gerenciar Cheats",
"GameListContextMenuManageCheat": "Gerenciar Cheats", "GameListContextMenuManageCheat": "Gerenciar Cheats",
"GameListContextMenuManageModToolTip": "Manage Mods", "GameListContextMenuManageModToolTip": "Gerenciar Mods",
"GameListContextMenuManageMod": "Manage Mods", "GameListContextMenuManageMod": "Gerenciar Mods",
"ControllerSettingsStickRange": "Intervalo:", "ControllerSettingsStickRange": "Intervalo:",
"DialogStopEmulationTitle": "Ryujinx - Parar emulação", "DialogStopEmulationTitle": "Ryujinx - Parar emulação",
"DialogStopEmulationMessage": "Tem certeza que deseja parar a emulação?", "DialogStopEmulationMessage": "Tem certeza que deseja parar a emulação?",
@ -655,7 +667,9 @@
"UserErrorUndefinedDescription": "Um erro indefinido occoreu! Isso não deveria acontecer, por favor contate um desenvolvedor!", "UserErrorUndefinedDescription": "Um erro indefinido occoreu! Isso não deveria acontecer, por favor contate um desenvolvedor!",
"OpenSetupGuideMessage": "Abrir o guia de configuração", "OpenSetupGuideMessage": "Abrir o guia de configuração",
"NoUpdate": "Sem atualizações", "NoUpdate": "Sem atualizações",
"TitleUpdateVersionLabel": "Versão {0} - {1}", "TitleUpdateVersionLabel": "Versão {0}",
"TitleBundledUpdateVersionLabel": "Empacotado: Versão {0}",
"TitleBundledDlcLabel": "Empacotado:",
"RyujinxInfo": "Ryujinx - Informação", "RyujinxInfo": "Ryujinx - Informação",
"RyujinxConfirm": "Ryujinx - Confirmação", "RyujinxConfirm": "Ryujinx - Confirmação",
"FileDialogAllTypes": "Todos os tipos", "FileDialogAllTypes": "Todos os tipos",
@ -667,7 +681,7 @@
"SoftwareKeyboardModeAlphabet": "Apenas devem ser caracteres não CJK.", "SoftwareKeyboardModeAlphabet": "Apenas devem ser caracteres não CJK.",
"SoftwareKeyboardModeASCII": "Deve ser apenas texto ASCII", "SoftwareKeyboardModeASCII": "Deve ser apenas texto ASCII",
"ControllerAppletControllers": "Supported Controllers:", "ControllerAppletControllers": "Supported Controllers:",
"ControllerAppletPlayers": "Players:", "ControllerAppletPlayers": "Jogadores:",
"ControllerAppletDescription": "Your current configuration is invalid. Open settings and reconfigure your inputs.", "ControllerAppletDescription": "Your current configuration is invalid. Open settings and reconfigure your inputs.",
"ControllerAppletDocked": "Docked mode set. Handheld control should be disabled.", "ControllerAppletDocked": "Docked mode set. Handheld control should be disabled.",
"UpdaterRenaming": "Renomeando arquivos antigos...", "UpdaterRenaming": "Renomeando arquivos antigos...",
@ -711,11 +725,19 @@
"UserProfileWindowTitle": "Gerenciador de perfis de usuário", "UserProfileWindowTitle": "Gerenciador de perfis de usuário",
"CheatWindowTitle": "Gerenciador de Cheats", "CheatWindowTitle": "Gerenciador de Cheats",
"DlcWindowTitle": "Gerenciador de DLC", "DlcWindowTitle": "Gerenciador de DLC",
"ModWindowTitle": "Manage Mods for {0} ({1})", "ModWindowTitle": "Gerenciar Mods para {0} ({1})",
"UpdateWindowTitle": "Gerenciador de atualizações", "UpdateWindowTitle": "Gerenciador de atualizações",
"UpdateWindowUpdateAddedMessage": "{0} nova(s) atualização(ões) adicionada(s)",
"UpdateWindowBundledContentNotice": "Atualizações incorporadas não podem ser removidas, apenas desativadas.",
"CheatWindowHeading": "Cheats disponíveis para {0} [{1}]", "CheatWindowHeading": "Cheats disponíveis para {0} [{1}]",
"BuildId": "ID da Build", "BuildId": "ID da Build:",
"DlcWindowBundledContentNotice": "DLCs incorporadas não podem ser removidas, apenas desativadas.",
"DlcWindowHeading": "{0} DLCs disponíveis para {1} ({2})", "DlcWindowHeading": "{0} DLCs disponíveis para {1} ({2})",
"DlcWindowDlcAddedMessage": "{0} novo(s) conteúdo(s) para download adicionado(s)",
"AutoloadDlcAddedMessage": "{0} novo(s) conteúdo(s) para download adicionado(s)",
"AutoloadDlcRemovedMessage": "{0} conteúdo(s) para download ausente(s) removido(s)",
"AutoloadUpdateAddedMessage": "{0} nova(s) atualização(ões) adicionada(s)",
"AutoloadUpdateRemovedMessage": "{0} atualização(ões) ausente(s) removida(s)",
"ModWindowHeading": "{0} Mod(s)", "ModWindowHeading": "{0} Mod(s)",
"UserProfilesEditProfile": "Editar selecionado", "UserProfilesEditProfile": "Editar selecionado",
"Cancel": "Cancelar", "Cancel": "Cancelar",
@ -759,15 +781,16 @@
"Recover": "Recuperar", "Recover": "Recuperar",
"UserProfilesRecoverHeading": "Jogos salvos foram encontrados para as seguintes contas", "UserProfilesRecoverHeading": "Jogos salvos foram encontrados para as seguintes contas",
"UserProfilesRecoverEmptyList": "Nenhum perfil para recuperar", "UserProfilesRecoverEmptyList": "Nenhum perfil para recuperar",
"GraphicsAATooltip": "Applies anti-aliasing to the game render.\n\nFXAA will blur most of the image, while SMAA will attempt to find jagged edges and smooth them out.\n\nNot recommended to use in conjunction with the FSR scaling filter.\n\nThis option can be changed while a game is running by clicking \"Apply\" below; you can simply move the settings window aside and experiment until you find your preferred look for a game.\n\nLeave on NONE if unsure.", "GraphicsAATooltip": "Aplica anti-aliasing à renderização do jogo.\n\nFXAA borrará a maior parte da imagem, enquanto SMAA tentará identificar e suavizar bordas serrilhadas.\n\nNão é recomendado usar em conjunto com o filtro de escala FSR.\n\nEssa opção pode ser alterada enquanto o jogo está em execução clicando em \"Aplicar\" abaixo; basta mover a janela de configurações para o lado e experimentar até encontrar o visual preferido para o jogo.\n\nDeixe em NENHUM se estiver em dúvida.",
"GraphicsAALabel": "Anti-serrilhado:", "GraphicsAALabel": "Anti-serrilhado:",
"GraphicsScalingFilterLabel": "Filtro de escala:", "GraphicsScalingFilterLabel": "Filtro de escala:",
"GraphicsScalingFilterTooltip": "Choose the scaling filter that will be applied when using resolution scale.\n\nBilinear works well for 3D games and is a safe default option.\n\nNearest is recommended for pixel art games.\n\nFSR 1.0 is merely a sharpening filter, not recommended for use with FXAA or SMAA.\n\nThis option can be changed while a game is running by clicking \"Apply\" below; you can simply move the settings window aside and experiment until you find your preferred look for a game.\n\nLeave on BILINEAR if unsure.", "GraphicsScalingFilterTooltip": "Escolha o filtro de escala que será aplicado ao usar a escala de resolução.\n\nBilinear funciona bem para jogos 3D e é uma opção padrão segura.\n\nNearest é recomendado para jogos em pixel art.\n\nFSR 1.0 é apenas um filtro de nitidez, não recomendado para uso com FXAA ou SMAA.\n\nEssa opção pode ser alterada enquanto o jogo está em execução, clicando em \"Aplicar\" abaixo; basta mover a janela de configurações para o lado e experimentar até encontrar o visual preferido para o jogo.\n\nMantenha em BILINEAR se estiver em dúvida.",
"GraphicsScalingFilterBilinear": "Bilinear", "GraphicsScalingFilterBilinear": "Bilinear",
"GraphicsScalingFilterNearest": "Nearest", "GraphicsScalingFilterNearest": "Nearest",
"GraphicsScalingFilterFsr": "FSR", "GraphicsScalingFilterFsr": "FSR",
"GraphicsScalingFilterArea": "Area",
"GraphicsScalingFilterLevelLabel": "Nível", "GraphicsScalingFilterLevelLabel": "Nível",
"GraphicsScalingFilterLevelTooltip": "Set FSR 1.0 sharpening level. Higher is sharper.", "GraphicsScalingFilterLevelTooltip": "Defina o nível de nitidez do FSR 1.0. Quanto maior, mais nítido.",
"SmaaLow": "SMAA Baixo", "SmaaLow": "SMAA Baixo",
"SmaaMedium": "SMAA Médio", "SmaaMedium": "SMAA Médio",
"SmaaHigh": "SMAA Alto", "SmaaHigh": "SMAA Alto",
@ -775,14 +798,14 @@
"UserEditorTitle": "Editar usuário", "UserEditorTitle": "Editar usuário",
"UserEditorTitleCreate": "Criar usuário", "UserEditorTitleCreate": "Criar usuário",
"SettingsTabNetworkInterface": "Interface de rede:", "SettingsTabNetworkInterface": "Interface de rede:",
"NetworkInterfaceTooltip": "The network interface used for LAN/LDN features.\n\nIn conjunction with a VPN or XLink Kai and a game with LAN support, can be used to spoof a same-network connection over the Internet.\n\nLeave on DEFAULT if unsure.", "NetworkInterfaceTooltip": "A interface de rede usada para recursos de LAN/LDN.\n\nEm conjunto com uma VPN ou XLink Kai e um jogo com suporte a LAN, pode ser usada para simular uma conexão na mesma rede pela Internet.\n\nMantenha em PADRÃO se estiver em dúvida.",
"NetworkInterfaceDefault": "Padrão", "NetworkInterfaceDefault": "Padrão",
"PackagingShaders": "Empacotamento de Shaders", "PackagingShaders": "Empacotamento de Shaders",
"AboutChangelogButton": "Ver mudanças no GitHub", "AboutChangelogButton": "Ver mudanças no GitHub",
"AboutChangelogButtonTooltipMessage": "Clique para abrir o relatório de alterações para esta versão no seu navegador padrão.", "AboutChangelogButtonTooltipMessage": "Clique para abrir o relatório de alterações para esta versão no seu navegador padrão.",
"SettingsTabNetworkMultiplayer": "Multiplayer", "SettingsTabNetworkMultiplayer": "Multiplayer",
"MultiplayerMode": "Modo:", "MultiplayerMode": "Modo:",
"MultiplayerModeTooltip": "Change LDN multiplayer mode.\n\nLdnMitm will modify local wireless/local play functionality in games to function as if it were LAN, allowing for local, same-network connections with other Ryujinx instances and hacked Nintendo Switch consoles that have the ldn_mitm module installed.\n\nMultiplayer requires all players to be on the same game version (i.e. Super Smash Bros. Ultimate v13.0.1 can't connect to v13.0.0).\n\nLeave DISABLED if unsure.", "MultiplayerModeTooltip": "Alterar o modo multiplayer LDN.\n\nLdnMitm modificará a funcionalidade de jogo sem fio/local nos jogos para funcionar como se fosse LAN, permitindo conexões locais, na mesma rede, com outras instâncias do Ryujinx e consoles Nintendo Switch hackeados que possuem o módulo ldn_mitm instalado.\n\nO multiplayer exige que todos os jogadores estejam na mesma versão do jogo (ex.: Super Smash Bros. Ultimate v13.0.1 não consegue se conectar à v13.0.0).\n\nDeixe DESATIVADO se estiver em dúvida.",
"MultiplayerModeDisabled": "Disabled", "MultiplayerModeDisabled": "Desativado",
"MultiplayerModeLdnMitm": "ldn_mitm" "MultiplayerModeLdnMitm": "ldn_mitm"
} }

View File

@ -97,6 +97,7 @@
"SettingsTabGeneralCheckUpdatesOnLaunch": "Проверять наличие обновлений при запуске", "SettingsTabGeneralCheckUpdatesOnLaunch": "Проверять наличие обновлений при запуске",
"SettingsTabGeneralShowConfirmExitDialog": "Подтверждать выход из приложения", "SettingsTabGeneralShowConfirmExitDialog": "Подтверждать выход из приложения",
"SettingsTabGeneralRememberWindowState": "Запомнить размер/положение окна", "SettingsTabGeneralRememberWindowState": "Запомнить размер/положение окна",
"SettingsTabGeneralShowTitleBar": "Show Title Bar (Requires restart)",
"SettingsTabGeneralHideCursor": "Скрывать курсор", "SettingsTabGeneralHideCursor": "Скрывать курсор",
"SettingsTabGeneralHideCursorNever": "Никогда", "SettingsTabGeneralHideCursorNever": "Никогда",
"SettingsTabGeneralHideCursorOnIdle": "В простое", "SettingsTabGeneralHideCursorOnIdle": "В простое",

View File

@ -100,6 +100,7 @@
"SettingsTabGeneralCheckUpdatesOnLaunch": "ตรวจหาการอัปเดตเมื่อเปิดโปรแกรม", "SettingsTabGeneralCheckUpdatesOnLaunch": "ตรวจหาการอัปเดตเมื่อเปิดโปรแกรม",
"SettingsTabGeneralShowConfirmExitDialog": "แสดง \"ปุ่มยืนยันการออก\" เมื่อออกเกม", "SettingsTabGeneralShowConfirmExitDialog": "แสดง \"ปุ่มยืนยันการออก\" เมื่อออกเกม",
"SettingsTabGeneralRememberWindowState": "จดจำ ขนาดหน้าต่างแอพพลิเคชั่น/คำแหน่ง", "SettingsTabGeneralRememberWindowState": "จดจำ ขนาดหน้าต่างแอพพลิเคชั่น/คำแหน่ง",
"SettingsTabGeneralShowTitleBar": "Show Title Bar (Requires restart)",
"SettingsTabGeneralHideCursor": "ซ่อน เคอร์เซอร์:", "SettingsTabGeneralHideCursor": "ซ่อน เคอร์เซอร์:",
"SettingsTabGeneralHideCursorNever": "ไม่ต้อง", "SettingsTabGeneralHideCursorNever": "ไม่ต้อง",
"SettingsTabGeneralHideCursorOnIdle": "เมื่อไม่ได้ใช้งาน", "SettingsTabGeneralHideCursorOnIdle": "เมื่อไม่ได้ใช้งาน",

View File

@ -97,6 +97,7 @@
"SettingsTabGeneralCheckUpdatesOnLaunch": "Her Açılışta Güncellemeleri Denetle", "SettingsTabGeneralCheckUpdatesOnLaunch": "Her Açılışta Güncellemeleri Denetle",
"SettingsTabGeneralShowConfirmExitDialog": "\"Çıkışı Onayla\" Diyaloğunu Göster", "SettingsTabGeneralShowConfirmExitDialog": "\"Çıkışı Onayla\" Diyaloğunu Göster",
"SettingsTabGeneralRememberWindowState": "Remember Window Size/Position", "SettingsTabGeneralRememberWindowState": "Remember Window Size/Position",
"SettingsTabGeneralShowTitleBar": "Show Title Bar (Requires restart)",
"SettingsTabGeneralHideCursor": "İşaretçiyi Gizle:", "SettingsTabGeneralHideCursor": "İşaretçiyi Gizle:",
"SettingsTabGeneralHideCursorNever": "Hiçbir Zaman", "SettingsTabGeneralHideCursorNever": "Hiçbir Zaman",
"SettingsTabGeneralHideCursorOnIdle": "Hareketsiz Durumda", "SettingsTabGeneralHideCursorOnIdle": "Hareketsiz Durumda",

View File

@ -97,6 +97,7 @@
"SettingsTabGeneralCheckUpdatesOnLaunch": "Перевіряти наявність оновлень під час запуску", "SettingsTabGeneralCheckUpdatesOnLaunch": "Перевіряти наявність оновлень під час запуску",
"SettingsTabGeneralShowConfirmExitDialog": "Показати діалогове вікно «Підтвердити вихід».", "SettingsTabGeneralShowConfirmExitDialog": "Показати діалогове вікно «Підтвердити вихід».",
"SettingsTabGeneralRememberWindowState": "Remember Window Size/Position", "SettingsTabGeneralRememberWindowState": "Remember Window Size/Position",
"SettingsTabGeneralShowTitleBar": "Show Title Bar (Requires restart)",
"SettingsTabGeneralHideCursor": "Сховати вказівник:", "SettingsTabGeneralHideCursor": "Сховати вказівник:",
"SettingsTabGeneralHideCursorNever": "Ніколи", "SettingsTabGeneralHideCursorNever": "Ніколи",
"SettingsTabGeneralHideCursorOnIdle": "Сховати у режимі очікування", "SettingsTabGeneralHideCursorOnIdle": "Сховати у режимі очікування",

View File

@ -100,6 +100,7 @@
"SettingsTabGeneralCheckUpdatesOnLaunch": "启动时检查更新", "SettingsTabGeneralCheckUpdatesOnLaunch": "启动时检查更新",
"SettingsTabGeneralShowConfirmExitDialog": "退出游戏时需要确认", "SettingsTabGeneralShowConfirmExitDialog": "退出游戏时需要确认",
"SettingsTabGeneralRememberWindowState": "记住窗口大小和位置", "SettingsTabGeneralRememberWindowState": "记住窗口大小和位置",
"SettingsTabGeneralShowTitleBar": "Show Title Bar (Requires restart)",
"SettingsTabGeneralHideCursor": "隐藏鼠标指针:", "SettingsTabGeneralHideCursor": "隐藏鼠标指针:",
"SettingsTabGeneralHideCursorNever": "从不隐藏", "SettingsTabGeneralHideCursorNever": "从不隐藏",
"SettingsTabGeneralHideCursorOnIdle": "自动隐藏", "SettingsTabGeneralHideCursorOnIdle": "自动隐藏",

View File

@ -97,6 +97,7 @@
"SettingsTabGeneralCheckUpdatesOnLaunch": "啟動時檢查更新", "SettingsTabGeneralCheckUpdatesOnLaunch": "啟動時檢查更新",
"SettingsTabGeneralShowConfirmExitDialog": "顯示「確認結束」對話方塊", "SettingsTabGeneralShowConfirmExitDialog": "顯示「確認結束」對話方塊",
"SettingsTabGeneralRememberWindowState": "記住視窗大小/位置", "SettingsTabGeneralRememberWindowState": "記住視窗大小/位置",
"SettingsTabGeneralShowTitleBar": "Show Title Bar (Requires restart)",
"SettingsTabGeneralHideCursor": "隱藏滑鼠游標:", "SettingsTabGeneralHideCursor": "隱藏滑鼠游標:",
"SettingsTabGeneralHideCursorNever": "從不", "SettingsTabGeneralHideCursorNever": "從不",
"SettingsTabGeneralHideCursorOnIdle": "閒置時", "SettingsTabGeneralHideCursorOnIdle": "閒置時",

View File

@ -1,28 +0,0 @@
using Avalonia.Data.Core;
using Avalonia.Markup.Xaml;
using Avalonia.Markup.Xaml.MarkupExtensions;
using Avalonia.Markup.Xaml.MarkupExtensions.CompiledBindings;
using System;
namespace Ryujinx.Ava.Common.Locale
{
internal class LocaleExtension(LocaleKeys key) : MarkupExtension
{
private ClrPropertyInfo PropertyInfo
=> new(
"Item",
_ => LocaleManager.Instance[key],
null,
typeof(string)
);
public override object ProvideValue(IServiceProvider serviceProvider) =>
new CompiledBindingExtension(
new CompiledBindingPathBuilder()
.Property(PropertyInfo, PropertyInfoAccessorFactory.CreateInpcPropertyAccessor)
.Build()
)
{ Source = LocaleManager.Instance }
.ProvideValue(serviceProvider);
}
}

View File

@ -1,20 +1,14 @@
using Avalonia.Data.Core; using Avalonia.Data.Core;
using Avalonia.Markup.Xaml; using Avalonia.Markup.Xaml;
using Avalonia.Markup.Xaml.MarkupExtensions; using Avalonia.Markup.Xaml.MarkupExtensions;
using Avalonia.Markup.Xaml.MarkupExtensions.CompiledBindings; using Avalonia.Markup.Xaml.MarkupExtensions.CompiledBindings;
using System; using System;
namespace Ryujinx.Ava.Common.Icon namespace Ryujinx.Ava.Common.Markup
{ {
internal class IconExtension(string iconString) : MarkupExtension internal abstract class BasicMarkupExtension : MarkupExtension
{ {
private ClrPropertyInfo PropertyInfo protected abstract ClrPropertyInfo PropertyInfo { get; }
=> new(
"Item",
_ => new Projektanker.Icons.Avalonia.Icon { Value = iconString },
null,
typeof(Projektanker.Icons.Avalonia.Icon)
);
public override object ProvideValue(IServiceProvider serviceProvider) => public override object ProvideValue(IServiceProvider serviceProvider) =>
new CompiledBindingExtension( new CompiledBindingExtension(

View File

@ -0,0 +1,51 @@
using Avalonia.Data.Core;
using Avalonia.Markup.Xaml;
using Avalonia.Markup.Xaml.MarkupExtensions;
using Avalonia.Markup.Xaml.MarkupExtensions.CompiledBindings;
using Projektanker.Icons.Avalonia;
using Ryujinx.Ava.Common.Locale;
using System;
namespace Ryujinx.Ava.Common.Markup
{
internal class IconExtension(string iconString) : BasicMarkupExtension
{
protected override ClrPropertyInfo PropertyInfo
=> new(
"Item",
_ => new Icon { Value = iconString },
null,
typeof(Icon)
);
}
internal class SpinningIconExtension(string iconString) : BasicMarkupExtension
{
protected override ClrPropertyInfo PropertyInfo
=> new(
"Item",
_ => new Icon { Value = iconString, Animation = IconAnimation.Spin },
null,
typeof(Icon)
);
}
internal class LocaleExtension(LocaleKeys key) : MarkupExtension
{
private ClrPropertyInfo PropertyInfo
=> new(
"Item",
_ => LocaleManager.Instance[key],
null,
typeof(string)
);
public override object ProvideValue(IServiceProvider serviceProvider) =>
new CompiledBindingExtension(
new CompiledBindingPathBuilder()
.Property(PropertyInfo, PropertyInfoAccessorFactory.CreateInpcPropertyAccessor)
.Build()
) { Source = LocaleManager.Instance }
.ProvideValue(serviceProvider);
}
}

View File

@ -14,7 +14,6 @@ using Ryujinx.Common.GraphicsDriver;
using Ryujinx.Common.Logging; using Ryujinx.Common.Logging;
using Ryujinx.Common.SystemInterop; using Ryujinx.Common.SystemInterop;
using Ryujinx.Graphics.Vulkan.MoltenVK; using Ryujinx.Graphics.Vulkan.MoltenVK;
using Ryujinx.Modules;
using Ryujinx.SDL2.Common; using Ryujinx.SDL2.Common;
using Ryujinx.UI.App.Common; using Ryujinx.UI.App.Common;
using Ryujinx.UI.Common; using Ryujinx.UI.Common;
@ -47,7 +46,6 @@ namespace Ryujinx.Ava
{ {
Version = ReleaseInformation.Version; Version = ReleaseInformation.Version;
if (OperatingSystem.IsWindows() && !OperatingSystem.IsWindowsVersionAtLeast(10, 0, 17134)) if (OperatingSystem.IsWindows() && !OperatingSystem.IsWindowsVersionAtLeast(10, 0, 17134))
{ {
_ = MessageBoxA(nint.Zero, "You are running an outdated version of Windows.\n\nRyujinx supports Windows 10 version 1803 and newer.\n", $"Ryujinx {Version}", MbIconwarning); _ = MessageBoxA(nint.Zero, "You are running an outdated version of Windows.\n\nRyujinx supports Windows 10 version 1803 and newer.\n", $"Ryujinx {Version}", MbIconwarning);

Binary file not shown.

Before

Width:  |  Height:  |  Size: 193 KiB

After

Width:  |  Height:  |  Size: 177 KiB

View File

@ -120,7 +120,7 @@ namespace Ryujinx.Ava.UI.Applet
bool okPressed = false; bool okPressed = false;
bool error = false; bool error = false;
string inputText = args.InitialText ?? ""; string inputText = args.InitialText ?? string.Empty;
Dispatcher.UIThread.InvokeAsync(async () => Dispatcher.UIThread.InvokeAsync(async () =>
{ {

View File

@ -4,7 +4,7 @@
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:locale="clr-namespace:Ryujinx.Ava.Common.Locale" xmlns:ext="clr-namespace:Ryujinx.Ava.Common.Markup"
xmlns:applet="using:Ryujinx.Ava.UI.Applet" xmlns:applet="using:Ryujinx.Ava.UI.Applet"
mc:Ignorable="d" mc:Ignorable="d"
Width="400" Width="400"
@ -25,11 +25,11 @@
Spacing="10" Spacing="10"
Margin="10"> Margin="10">
<TextBlock <TextBlock
Text="{locale:Locale ControllerAppletDescription}" /> Text="{ext:Locale ControllerAppletDescription}" />
<TextBlock <TextBlock
IsVisible="{Binding IsDocked}" IsVisible="{Binding IsDocked}"
FontWeight="Bold" FontWeight="Bold"
Text="{locale:Locale ControllerAppletDocked}" /> Text="{ext:Locale ControllerAppletDocked}" />
</StackPanel> </StackPanel>
</Border> </Border>
<Border <Border
@ -48,7 +48,7 @@
VerticalAlignment="Center" VerticalAlignment="Center"
TextAlignment="Center" TextAlignment="Center"
FontWeight="Bold" FontWeight="Bold"
Text="{locale:Locale ControllerAppletControllers}" /> Text="{ext:Locale ControllerAppletControllers}" />
<StackPanel <StackPanel
Spacing="10" Spacing="10"
HorizontalAlignment="Center" HorizontalAlignment="Center"
@ -96,7 +96,7 @@
VerticalAlignment="Center" VerticalAlignment="Center"
TextAlignment="Center" TextAlignment="Center"
FontWeight="Bold" FontWeight="Bold"
Text="{locale:Locale ControllerAppletPlayers}" /> Text="{ext:Locale ControllerAppletPlayers}" />
<Border Height="50"> <Border Height="50">
<TextBlock <TextBlock
HorizontalAlignment="Center" HorizontalAlignment="Center"
@ -121,13 +121,13 @@
Name="SaveButton" Name="SaveButton"
MinWidth="90" MinWidth="90"
Command="{Binding OpenSettingsWindow}"> Command="{Binding OpenSettingsWindow}">
<TextBlock Text="{locale:Locale DialogOpenSettingsWindowLabel}" /> <TextBlock Text="{ext:Locale DialogOpenSettingsWindowLabel}" />
</Button> </Button>
<Button <Button
Name="CancelButton" Name="CancelButton"
MinWidth="90" MinWidth="90"
Command="{Binding Close}"> Command="{Binding Close}">
<TextBlock Text="{locale:Locale SettingsButtonClose}" /> <TextBlock Text="{ext:Locale SettingsButtonClose}" />
</Button> </Button>
</StackPanel> </StackPanel>
</Panel> </Panel>

View File

@ -26,7 +26,7 @@ namespace Ryujinx.Ava.UI.Applet
public static SvgImage JoyconLeftImage => GetResource(JoyConLeftResource); public static SvgImage JoyconLeftImage => GetResource(JoyConLeftResource);
public static SvgImage JoyconRightImage => GetResource(JoyConRightResource); public static SvgImage JoyconRightImage => GetResource(JoyConRightResource);
public string PlayerCount { get; set; } = ""; public string PlayerCount { get; set; } = string.Empty;
public bool SupportsProController { get; set; } public bool SupportsProController { get; set; }
public bool SupportsLeftJoycon { get; set; } public bool SupportsLeftJoycon { get; set; }
public bool SupportsRightJoycon { get; set; } public bool SupportsRightJoycon { get; set; }

View File

@ -3,9 +3,9 @@
xmlns="https://github.com/avaloniaui" xmlns="https://github.com/avaloniaui"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:locale="clr-namespace:Ryujinx.Ava.Common.Locale" xmlns:ext="clr-namespace:Ryujinx.Ava.Common.Markup"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
Title="{locale:Locale ErrorWindowTitle}" Title="{ext:Locale ErrorWindowTitle}"
xmlns:views="using:Ryujinx.Ava.UI.Applet" xmlns:views="using:Ryujinx.Ava.UI.Applet"
Width="450" Width="450"
Height="340" Height="340"

View File

@ -27,13 +27,18 @@ namespace Ryujinx.Ava.UI.Controls
{ {
MainText = mainText; MainText = mainText;
SecondaryText = secondaryText; SecondaryText = secondaryText;
Message = message ?? ""; Message = message ?? string.Empty;
DataContext = this; DataContext = this;
_placeholder = placeholder; _placeholder = placeholder;
InitializeComponent(); InitializeComponent();
Input.Watermark = _placeholder; Input.Watermark = _placeholder;
if (string.IsNullOrWhiteSpace(Input.Watermark))
{
Input.UseFloatingWatermark = false;
}
Input.AddHandler(TextInputEvent, Message_TextInput, RoutingStrategies.Tunnel, true); Input.AddHandler(TextInputEvent, Message_TextInput, RoutingStrategies.Tunnel, true);
} }
@ -50,9 +55,9 @@ namespace Ryujinx.Ava.UI.Controls
Input.Focus(); Input.Focus();
} }
public string Message { get; set; } = ""; public string Message { get; set; } = string.Empty;
public string MainText { get; set; } = ""; public string MainText { get; set; } = string.Empty;
public string SecondaryText { get; set; } = ""; public string SecondaryText { get; set; } = string.Empty;
public static async Task<(UserResult Result, string Input)> ShowInputDialog(string title, SoftwareKeyboardUIArgs args) public static async Task<(UserResult Result, string Input)> ShowInputDialog(string title, SoftwareKeyboardUIArgs args)
{ {
@ -71,7 +76,7 @@ namespace Ryujinx.Ava.UI.Controls
contentDialog.Title = title; contentDialog.Title = title;
contentDialog.PrimaryButtonText = args.SubmitText; contentDialog.PrimaryButtonText = args.SubmitText;
contentDialog.IsPrimaryButtonEnabled = content._checkLength(content.Message.Length); contentDialog.IsPrimaryButtonEnabled = content._checkLength(content.Message.Length);
contentDialog.SecondaryButtonText = ""; contentDialog.SecondaryButtonText = string.Empty;
contentDialog.CloseButtonText = LocaleManager.Instance[LocaleKeys.InputDialogCancel]; contentDialog.CloseButtonText = LocaleManager.Instance[LocaleKeys.InputDialogCancel];
contentDialog.Content = content; contentDialog.Content = content;
@ -105,13 +110,13 @@ namespace Ryujinx.Ava.UI.Controls
Error.IsVisible = false; Error.IsVisible = false;
Error.FontStyle = FontStyle.Italic; Error.FontStyle = FontStyle.Italic;
string validationInfoText = ""; string validationInfoText = string.Empty;
if (_inputMin <= 0 && _inputMax == int.MaxValue) // Disable. if (_inputMin <= 0 && _inputMax == int.MaxValue) // Disable.
{ {
Error.IsVisible = false; Error.IsVisible = false;
_checkLength = length => true; _checkLength = _ => true;
} }
else if (_inputMin > 0 && _inputMax == int.MaxValue) else if (_inputMin > 0 && _inputMax == int.MaxValue)
{ {

View File

@ -2,109 +2,108 @@
x:Class="Ryujinx.Ava.UI.Controls.ApplicationContextMenu" x:Class="Ryujinx.Ava.UI.Controls.ApplicationContextMenu"
xmlns="https://github.com/avaloniaui" xmlns="https://github.com/avaloniaui"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:locale="clr-namespace:Ryujinx.Ava.Common.Locale" xmlns:ext="clr-namespace:Ryujinx.Ava.Common.Markup"
xmlns:icon="clr-namespace:Ryujinx.Ava.Common.Icon"
xmlns:viewModels="clr-namespace:Ryujinx.Ava.UI.ViewModels" xmlns:viewModels="clr-namespace:Ryujinx.Ava.UI.ViewModels"
x:DataType="viewModels:MainWindowViewModel"> x:DataType="viewModels:MainWindowViewModel">
<MenuItem <MenuItem
Click="RunApplication_Click" Click="RunApplication_Click"
Header="{locale:Locale GameListContextMenuRunApplication}" Header="{ext:Locale GameListContextMenuRunApplication}"
Icon="{icon:Icon fa-solid fa-play}"/> Icon="{ext:Icon fa-solid fa-play}"/>
<MenuItem <MenuItem
Click="ToggleFavorite_Click" Click="ToggleFavorite_Click"
Header="{locale:Locale GameListContextMenuToggleFavorite}" Header="{ext:Locale GameListContextMenuToggleFavorite}"
Icon="{icon:Icon fa-solid fa-star}" Icon="{ext:Icon fa-solid fa-star}"
ToolTip.Tip="{locale:Locale GameListContextMenuToggleFavoriteToolTip}" /> ToolTip.Tip="{ext:Locale GameListContextMenuToggleFavoriteToolTip}" />
<MenuItem <MenuItem
Click="CreateApplicationShortcut_Click" Click="CreateApplicationShortcut_Click"
Header="{locale:Locale GameListContextMenuCreateShortcut}" Header="{ext:Locale GameListContextMenuCreateShortcut}"
IsEnabled="{Binding CreateShortcutEnabled}" IsEnabled="{Binding CreateShortcutEnabled}"
Icon="{icon:Icon fa-solid fa-bookmark}" Icon="{ext:Icon fa-solid fa-bookmark}"
ToolTip.Tip="{OnPlatform Default={locale:Locale GameListContextMenuCreateShortcutToolTip}, macOS={locale:Locale GameListContextMenuCreateShortcutToolTipMacOS}}" /> ToolTip.Tip="{OnPlatform Default={ext:Locale GameListContextMenuCreateShortcutToolTip}, macOS={ext:Locale GameListContextMenuCreateShortcutToolTipMacOS}}" />
<Separator /> <Separator />
<MenuItem <MenuItem
Click="OpenUserSaveDirectory_Click" Click="OpenUserSaveDirectory_Click"
Header="{locale:Locale GameListContextMenuOpenUserSaveDirectory}" Header="{ext:Locale GameListContextMenuOpenUserSaveDirectory}"
Icon="{icon:Icon mdi-folder-account}" Icon="{ext:Icon mdi-folder-account}"
IsEnabled="{Binding OpenUserSaveDirectoryEnabled}" IsEnabled="{Binding OpenUserSaveDirectoryEnabled}"
ToolTip.Tip="{locale:Locale GameListContextMenuOpenUserSaveDirectoryToolTip}" /> ToolTip.Tip="{ext:Locale GameListContextMenuOpenUserSaveDirectoryToolTip}" />
<MenuItem <MenuItem
Click="OpenDeviceSaveDirectory_Click" Click="OpenDeviceSaveDirectory_Click"
Header="{locale:Locale GameListContextMenuOpenDeviceSaveDirectory}" Header="{ext:Locale GameListContextMenuOpenDeviceSaveDirectory}"
IsEnabled="{Binding OpenDeviceSaveDirectoryEnabled}" IsEnabled="{Binding OpenDeviceSaveDirectoryEnabled}"
ToolTip.Tip="{locale:Locale GameListContextMenuOpenDeviceSaveDirectoryToolTip}" /> ToolTip.Tip="{ext:Locale GameListContextMenuOpenDeviceSaveDirectoryToolTip}" />
<MenuItem <MenuItem
Click="OpenBcatSaveDirectory_Click" Click="OpenBcatSaveDirectory_Click"
Header="{locale:Locale GameListContextMenuOpenBcatSaveDirectory}" Header="{ext:Locale GameListContextMenuOpenBcatSaveDirectory}"
IsEnabled="{Binding OpenBcatSaveDirectoryEnabled}" IsEnabled="{Binding OpenBcatSaveDirectoryEnabled}"
ToolTip.Tip="{locale:Locale GameListContextMenuOpenBcatSaveDirectoryToolTip}" /> ToolTip.Tip="{ext:Locale GameListContextMenuOpenBcatSaveDirectoryToolTip}" />
<Separator /> <Separator />
<MenuItem <MenuItem
Click="OpenTitleUpdateManager_Click" Click="OpenTitleUpdateManager_Click"
Header="{locale:Locale GameListContextMenuManageTitleUpdates}" Header="{ext:Locale GameListContextMenuManageTitleUpdates}"
Icon="{icon:Icon fa-solid fa-code-compare}" Icon="{ext:Icon fa-solid fa-code-compare}"
ToolTip.Tip="{locale:Locale GameListContextMenuManageTitleUpdatesToolTip}" /> ToolTip.Tip="{ext:Locale GameListContextMenuManageTitleUpdatesToolTip}" />
<MenuItem <MenuItem
Click="OpenDownloadableContentManager_Click" Click="OpenDownloadableContentManager_Click"
Header="{locale:Locale GameListContextMenuManageDlc}" Header="{ext:Locale GameListContextMenuManageDlc}"
Icon="{icon:Icon fa-solid fa-download}" Icon="{ext:Icon fa-solid fa-download}"
ToolTip.Tip="{locale:Locale GameListContextMenuManageDlcToolTip}" /> ToolTip.Tip="{ext:Locale GameListContextMenuManageDlcToolTip}" />
<MenuItem <MenuItem
Click="OpenCheatManager_Click" Click="OpenCheatManager_Click"
Header="{locale:Locale GameListContextMenuManageCheat}" Header="{ext:Locale GameListContextMenuManageCheat}"
Icon="{icon:Icon fa-solid fa-code}" Icon="{ext:Icon fa-solid fa-code}"
ToolTip.Tip="{locale:Locale GameListContextMenuManageCheatToolTip}" /> ToolTip.Tip="{ext:Locale GameListContextMenuManageCheatToolTip}" />
<MenuItem <MenuItem
Click="OpenModManager_Click" Click="OpenModManager_Click"
Header="{locale:Locale GameListContextMenuManageMod}" Header="{ext:Locale GameListContextMenuManageMod}"
Icon="{icon:Icon mdi-view-module}" Icon="{ext:Icon mdi-view-module}"
ToolTip.Tip="{locale:Locale GameListContextMenuManageModToolTip}" /> ToolTip.Tip="{ext:Locale GameListContextMenuManageModToolTip}" />
<Separator /> <Separator />
<MenuItem <MenuItem
Click="OpenModsDirectory_Click" Click="OpenModsDirectory_Click"
Header="{locale:Locale GameListContextMenuOpenModsDirectory}" Header="{ext:Locale GameListContextMenuOpenModsDirectory}"
Icon="{icon:Icon mdi-folder-file}" Icon="{ext:Icon mdi-folder-file}"
ToolTip.Tip="{locale:Locale GameListContextMenuOpenModsDirectoryToolTip}" /> ToolTip.Tip="{ext:Locale GameListContextMenuOpenModsDirectoryToolTip}" />
<MenuItem <MenuItem
Click="OpenSdModsDirectory_Click" Click="OpenSdModsDirectory_Click"
Header="{locale:Locale GameListContextMenuOpenSdModsDirectory}" Header="{ext:Locale GameListContextMenuOpenSdModsDirectory}"
Icon="{icon:Icon mdi-folder-file}" Icon="{ext:Icon mdi-folder-file}"
ToolTip.Tip="{locale:Locale GameListContextMenuOpenSdModsDirectoryToolTip}" /> ToolTip.Tip="{ext:Locale GameListContextMenuOpenSdModsDirectoryToolTip}" />
<Separator /> <Separator />
<MenuItem Header="{locale:Locale GameListContextMenuCacheManagement}" Icon="{icon:Icon mdi-cached}"> <MenuItem Header="{ext:Locale GameListContextMenuCacheManagement}" Icon="{ext:Icon mdi-cached}">
<MenuItem <MenuItem
Click="PurgePtcCache_Click" Click="PurgePtcCache_Click"
Header="{locale:Locale GameListContextMenuCacheManagementPurgePptc}" Header="{ext:Locale GameListContextMenuCacheManagementPurgePptc}"
Icon="{icon:Icon mdi-refresh}" Icon="{ext:Icon mdi-refresh}"
ToolTip.Tip="{locale:Locale GameListContextMenuCacheManagementPurgePptcToolTip}" /> ToolTip.Tip="{ext:Locale GameListContextMenuCacheManagementPurgePptcToolTip}" />
<MenuItem <MenuItem
Click="PurgeShaderCache_Click" Click="PurgeShaderCache_Click"
Header="{locale:Locale GameListContextMenuCacheManagementPurgeShaderCache}" Header="{ext:Locale GameListContextMenuCacheManagementPurgeShaderCache}"
Icon="{icon:Icon mdi-delete-alert}" Icon="{ext:Icon mdi-delete-alert}"
ToolTip.Tip="{locale:Locale GameListContextMenuCacheManagementPurgeShaderCacheToolTip}" /> ToolTip.Tip="{ext:Locale GameListContextMenuCacheManagementPurgeShaderCacheToolTip}" />
<MenuItem <MenuItem
Click="OpenPtcDirectory_Click" Click="OpenPtcDirectory_Click"
Header="{locale:Locale GameListContextMenuCacheManagementOpenPptcDirectory}" Header="{ext:Locale GameListContextMenuCacheManagementOpenPptcDirectory}"
Icon="{icon:Icon mdi-folder-arrow-up-down}" Icon="{ext:Icon mdi-folder-arrow-up-down}"
ToolTip.Tip="{locale:Locale GameListContextMenuCacheManagementOpenPptcDirectoryToolTip}" /> ToolTip.Tip="{ext:Locale GameListContextMenuCacheManagementOpenPptcDirectoryToolTip}" />
<MenuItem <MenuItem
Click="OpenShaderCacheDirectory_Click" Click="OpenShaderCacheDirectory_Click"
Header="{locale:Locale GameListContextMenuCacheManagementOpenShaderCacheDirectory}" Header="{ext:Locale GameListContextMenuCacheManagementOpenShaderCacheDirectory}"
Icon="{icon:Icon mdi-folder-arrow-up-down}" Icon="{ext:Icon mdi-folder-arrow-up-down}"
ToolTip.Tip="{locale:Locale GameListContextMenuCacheManagementOpenShaderCacheDirectoryToolTip}" /> ToolTip.Tip="{ext:Locale GameListContextMenuCacheManagementOpenShaderCacheDirectoryToolTip}" />
</MenuItem> </MenuItem>
<MenuItem Header="{locale:Locale GameListContextMenuExtractData}"> <MenuItem Header="{ext:Locale GameListContextMenuExtractData}">
<MenuItem <MenuItem
Click="ExtractApplicationExeFs_Click" Click="ExtractApplicationExeFs_Click"
Header="{locale:Locale GameListContextMenuExtractDataExeFS}" Header="{ext:Locale GameListContextMenuExtractDataExeFS}"
ToolTip.Tip="{locale:Locale GameListContextMenuExtractDataExeFSToolTip}" /> ToolTip.Tip="{ext:Locale GameListContextMenuExtractDataExeFSToolTip}" />
<MenuItem <MenuItem
Click="ExtractApplicationRomFs_Click" Click="ExtractApplicationRomFs_Click"
Header="{locale:Locale GameListContextMenuExtractDataRomFS}" Header="{ext:Locale GameListContextMenuExtractDataRomFS}"
ToolTip.Tip="{locale:Locale GameListContextMenuExtractDataRomFSToolTip}" /> ToolTip.Tip="{ext:Locale GameListContextMenuExtractDataRomFSToolTip}" />
<MenuItem <MenuItem
Click="ExtractApplicationLogo_Click" Click="ExtractApplicationLogo_Click"
Header="{locale:Locale GameListContextMenuExtractDataLogo}" Header="{ext:Locale GameListContextMenuExtractDataLogo}"
ToolTip.Tip="{locale:Locale GameListContextMenuExtractDataLogoToolTip}" /> ToolTip.Tip="{ext:Locale GameListContextMenuExtractDataLogoToolTip}" />
</MenuItem> </MenuItem>
</MenuFlyout> </MenuFlyout>

View File

@ -55,14 +55,7 @@
VerticalAlignment="Stretch" VerticalAlignment="Stretch"
ClipToBounds="True" ClipToBounds="True"
CornerRadius="5"> CornerRadius="5">
<Grid> <Grid ColumnDefinitions="Auto,10,*,150,100">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto" />
<ColumnDefinition Width="10" />
<ColumnDefinition Width="*" />
<ColumnDefinition Width="150" />
<ColumnDefinition Width="100" />
</Grid.ColumnDefinitions>
<Image <Image
Grid.RowSpan="3" Grid.RowSpan="3"
Grid.Column="0" Grid.Column="0"

View File

@ -138,7 +138,7 @@ namespace Ryujinx.Ava.UI.Controls
foreach (var account in lostAccounts) foreach (var account in lostAccounts)
{ {
ViewModel.LostProfiles.Add(new UserProfile(new HLE.HOS.Services.Account.Acc.UserProfile(account, "", null), this)); ViewModel.LostProfiles.Add(new UserProfile(new HLE.HOS.Services.Account.Acc.UserProfile(account, string.Empty, null), this));
} }
ViewModel.Profiles.Add(new BaseModel()); ViewModel.Profiles.Add(new BaseModel());
@ -155,14 +155,11 @@ namespace Ryujinx.Ava.UI.Controls
if (profile == null) if (profile == null)
{ {
Dispatcher.UIThread.Post(Action); _ = Dispatcher.UIThread.InvokeAsync(async ()
=> await ContentDialogHelper.CreateErrorDialog(
LocaleManager.Instance[LocaleKeys.DialogUserProfileDeletionWarningMessage]));
return; return;
static async void Action()
{
await ContentDialogHelper.CreateErrorDialog(LocaleManager.Instance[LocaleKeys.DialogUserProfileDeletionWarningMessage]);
}
} }
AccountManager.OpenUser(profile.UserId); AccountManager.OpenUser(profile.UserId);
@ -170,10 +167,10 @@ namespace Ryujinx.Ava.UI.Controls
var result = await ContentDialogHelper.CreateConfirmationDialog( var result = await ContentDialogHelper.CreateConfirmationDialog(
LocaleManager.Instance[LocaleKeys.DialogUserProfileDeletionConfirmMessage], LocaleManager.Instance[LocaleKeys.DialogUserProfileDeletionConfirmMessage],
"", string.Empty,
LocaleManager.Instance[LocaleKeys.InputDialogYes], LocaleManager.Instance[LocaleKeys.InputDialogYes],
LocaleManager.Instance[LocaleKeys.InputDialogNo], LocaleManager.Instance[LocaleKeys.InputDialogNo],
""); string.Empty);
if (result == UserResult.Yes) if (result == UserResult.Yes)
{ {

View File

@ -205,7 +205,7 @@ namespace Ryujinx.Ava.UI.Helpers
primary, primary,
secondaryText, secondaryText,
acceptButton, acceptButton,
"", string.Empty,
closeButton, closeButton,
(int)Symbol.Important); (int)Symbol.Important);
@ -221,7 +221,7 @@ namespace Ryujinx.Ava.UI.Helpers
primaryText, primaryText,
secondaryText, secondaryText,
acceptButtonText, acceptButtonText,
"", string.Empty,
cancelButtonText, cancelButtonText,
(int)Symbol.Help, (int)Symbol.Help,
primaryButtonResult); primaryButtonResult);
@ -239,8 +239,8 @@ namespace Ryujinx.Ava.UI.Helpers
LocaleManager.Instance[LocaleKeys.DialogUpdaterTitle], LocaleManager.Instance[LocaleKeys.DialogUpdaterTitle],
primary, primary,
secondaryText, secondaryText,
"", string.Empty,
"", string.Empty,
LocaleManager.Instance[LocaleKeys.InputDialogOk], LocaleManager.Instance[LocaleKeys.InputDialogOk],
(int)Symbol.Important); (int)Symbol.Important);
@ -249,8 +249,8 @@ namespace Ryujinx.Ava.UI.Helpers
LocaleManager.Instance[LocaleKeys.DialogWarningTitle], LocaleManager.Instance[LocaleKeys.DialogWarningTitle],
primary, primary,
secondaryText, secondaryText,
"", string.Empty,
"", string.Empty,
LocaleManager.Instance[LocaleKeys.InputDialogOk], LocaleManager.Instance[LocaleKeys.InputDialogOk],
(int)Symbol.Important); (int)Symbol.Important);
@ -263,7 +263,7 @@ namespace Ryujinx.Ava.UI.Helpers
LocaleManager.Instance[LocaleKeys.DialogErrorMessage], LocaleManager.Instance[LocaleKeys.DialogErrorMessage],
errorMessage, errorMessage,
secondaryErrorMessage, secondaryErrorMessage,
"", string.Empty,
LocaleManager.Instance[LocaleKeys.InputDialogOk], LocaleManager.Instance[LocaleKeys.InputDialogOk],
(int)Symbol.Dismiss); (int)Symbol.Dismiss);
} }
@ -282,7 +282,7 @@ namespace Ryujinx.Ava.UI.Helpers
primary, primary,
secondaryText, secondaryText,
LocaleManager.Instance[LocaleKeys.InputDialogYes], LocaleManager.Instance[LocaleKeys.InputDialogYes],
"", string.Empty,
LocaleManager.Instance[LocaleKeys.InputDialogNo], LocaleManager.Instance[LocaleKeys.InputDialogNo],
(int)Symbol.Help, (int)Symbol.Help,
UserResult.Yes); UserResult.Yes);

View File

@ -122,7 +122,7 @@ namespace Ryujinx.Ava.UI.Helpers
public object Convert(object value, Type targetType, object parameter, CultureInfo culture) public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{ {
string keyString = ""; string keyString = string.Empty;
LocaleKeys localeKey; LocaleKeys localeKey;
switch (value) switch (value)

Some files were not shown because too many files have changed in this diff Show More