diff --git a/.ci/android.sh b/.ci/android.sh index db3dac419..fc945e243 100755 --- a/.ci/android.sh +++ b/.ci/android.sh @@ -9,8 +9,14 @@ fi cd src/android chmod +x ./gradlew -./gradlew assembleRelease -./gradlew bundleRelease + +if [[ "$TARGET" == "googleplay" ]]; then + ./gradlew assembleGooglePlayRelease + ./gradlew bundleGooglePlayRelease +else + ./gradlew assembleVanillaRelease + ./gradlew bundleVanillaRelease +fi ccache -s -v diff --git a/.ci/docker.sh b/.ci/docker.sh new file mode 100755 index 000000000..d4df835c4 --- /dev/null +++ b/.ci/docker.sh @@ -0,0 +1,17 @@ +#!/bin/bash -ex + +GITREV="`git show -s --format='%h'`" || true + +if [ "$GITHUB_REF_TYPE" = "tag" ]; then + TAG_NAME=$GITHUB_REF_NAME +elif [[ -n $GITREV ]]; then + TAG_NAME=$GITREV +else + TAG_NAME=unknown +fi + +echo "Tag name is: $TAG_NAME" + +docker build -f docker/azahar-room/Dockerfile -t azahar-room:$TAG_NAME . +mkdir -p build +docker save azahar-room:$TAG_NAME > build/azahar-room-$TAG_NAME.dockerimage diff --git a/.ci/linux.sh b/.ci/linux.sh index 5b3521681..8cdf33abf 100755 --- a/.ci/linux.sh +++ b/.ci/linux.sh @@ -1,14 +1,16 @@ #!/bin/bash -ex -if [ "$TARGET" = "appimage" ]; then +if [[ "$TARGET" == "appimage"* ]]; then # Compile the AppImage we distribute with Clang. export EXTRA_CMAKE_FLAGS=(-DCMAKE_CXX_COMPILER=clang++ -DCMAKE_C_COMPILER=clang -DCMAKE_LINKER=/etc/bin/ld.lld -DENABLE_ROOM_STANDALONE=OFF) - # Bundle required QT wayland libraries - export EXTRA_QT_PLUGINS="waylandcompositor" - export EXTRA_PLATFORM_PLUGINS="libqwayland-egl.so;libqwayland-generic.so" + if [ "$TARGET" = "appimage-wayland" ]; then + # Bundle required QT wayland libraries + export EXTRA_QT_PLUGINS="waylandcompositor" + export EXTRA_PLATFORM_PLUGINS="libqwayland-egl.so;libqwayland-generic.so" + fi else # For the linux-fresh verification target, verify compilation without PCH as well. export EXTRA_CMAKE_FLAGS=(-DCITRA_USE_PRECOMPILED_HEADERS=OFF) @@ -30,7 +32,7 @@ cmake .. -G Ninja \ ninja strip -s bin/Release/* -if [ "$TARGET" = "appimage" ]; then +if [[ "$TARGET" == "appimage"* ]]; then ninja bundle # TODO: Our AppImage environment currently uses an older ccache version without the verbose flag. ccache -s diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 0d02dd2f0..7963badca 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -22,12 +22,13 @@ jobs: with: name: source path: artifacts/ + linux: runs-on: ubuntu-latest strategy: fail-fast: false matrix: - target: ["appimage", "fresh"] + target: ["appimage", "appimage-wayland", "fresh"] container: image: opensauce04/azahar-build-environment:latest options: -u 1001 @@ -51,16 +52,21 @@ jobs: - name: Build run: ./.ci/linux.sh - name: Move AppImage to artifacts directory - if: ${{ matrix.target == 'appimage' }} + if: ${{ contains(matrix.target, 'appimage') }} run: | mkdir -p artifacts mv build/bundle/*.AppImage artifacts/ + - name: Rename AppImage + if: ${{ matrix.target == 'appimage-wayland' }} + run: | + mv artifacts/azahar.AppImage artifacts/azahar-wayland.AppImage - name: Upload - if: ${{ matrix.target == 'appimage' }} + if: ${{ contains(matrix.target, 'appimage') }} uses: actions/upload-artifact@v4 with: name: ${{ env.OS }}-${{ env.TARGET }} path: artifacts/ + macos: runs-on: ${{ (matrix.target == 'x86_64' && 'macos-15-intel') || 'macos-26' }} strategy: @@ -102,6 +108,7 @@ jobs: with: name: ${{ env.OS }}-${{ env.TARGET }} path: artifacts/ + macos-universal: runs-on: macos-26 needs: macos @@ -133,6 +140,7 @@ jobs: with: name: ${{ env.OS }}-${{ env.TARGET }} path: artifacts/ + windows: runs-on: windows-latest strategy: @@ -210,54 +218,92 @@ jobs: with: name: ${{ env.OS }}-${{ env.TARGET }} path: artifacts/ + android: runs-on: ubuntu-latest + strategy: + fail-fast: false + matrix: + target: ["vanilla", "googleplay"] env: CCACHE_DIR: ${{ github.workspace }}/.ccache CCACHE_COMPILERCHECK: content CCACHE_SLOPPINESS: time_macros OS: android - TARGET: universal + TARGET: ${{ matrix.target }} + SHOULD_RUN: ${{ (matrix.target == 'vanilla' || github.ref_type == 'tag') }} steps: - uses: actions/checkout@v4 + if: ${{ env.SHOULD_RUN == 'true' }} with: submodules: recursive - name: Set up cache + if: ${{ env.SHOULD_RUN == 'true' }} uses: actions/cache@v4 with: path: | ~/.gradle/caches ~/.gradle/wrapper ${{ env.CCACHE_DIR }} - key: ${{ runner.os }}-android-${{ github.sha }} + key: ${{ runner.os }}-${{ env.OS }}-${{ matrix.target }}-${{ github.sha }} restore-keys: | - ${{ runner.os }}-android- + ${{ runner.os }}-${{ env.OS }}-${{ matrix.target }}- - name: Set tag name + if: ${{ env.SHOULD_RUN == 'true' }} run: | if [[ "$GITHUB_REF_TYPE" == "tag" ]]; then echo "GIT_TAG_NAME=$GITHUB_REF_NAME" >> $GITHUB_ENV fi echo $GIT_TAG_NAME - - name: Deps + - name: Install tools + if: ${{ env.SHOULD_RUN == 'true' }} run: | sudo apt-get update -y sudo apt-get install ccache apksigner -y - name: Update Android SDK CMake version + if: ${{ env.SHOULD_RUN == 'true' }} run: | echo "y" | ${ANDROID_SDK_ROOT}/cmdline-tools/latest/bin/sdkmanager "cmake;3.30.3" - name: Build + if: ${{ env.SHOULD_RUN == 'true' }} run: JAVA_HOME=$JAVA_HOME_17_X64 ./.ci/android.sh env: ANDROID_KEYSTORE_B64: ${{ secrets.ANDROID_KEYSTORE_B64 }} ANDROID_KEY_ALIAS: ${{ secrets.ANDROID_KEY_ALIAS }} ANDROID_KEYSTORE_PASS: ${{ secrets.ANDROID_KEYSTORE_PASS }} - name: Pack + if: ${{ env.SHOULD_RUN == 'true' }} run: ../../../.ci/pack.sh working-directory: src/android/app env: UNPACKED: 1 - name: Upload + if: ${{ env.SHOULD_RUN == 'true' }} uses: actions/upload-artifact@v4 with: name: ${{ env.OS }}-${{ env.TARGET }} path: src/android/app/artifacts/ + + docker: + runs-on: ubuntu-latest + container: + image: docker:dind + steps: + - uses: actions/checkout@v4 + with: + submodules: recursive + - name: Install tools + run: apk add bash + - name: Fix git ownership + run: git config --global --add safe.directory . + - name: Build Docker image + run: ./.ci/docker.sh + - name: Move Docker image to artifacts directory + run: | + mkdir -p artifacts + mv build/*.dockerimage artifacts/ + - name: Upload + uses: actions/upload-artifact@v4 + with: + name: docker + path: artifacts/ \ No newline at end of file diff --git a/.gitignore b/.gitignore index 3651c93be..6000a682d 100644 --- a/.gitignore +++ b/.gitignore @@ -10,6 +10,9 @@ src/installer/*.exe src/common/scm_rev.cpp .travis.descriptor.json +# Docker image files +*.dockerimage + # Project/editor files *.swp *.kdev4 diff --git a/.gitmodules b/.gitmodules index ed5d9f0f9..cb600a64c 100644 --- a/.gitmodules +++ b/.gitmodules @@ -100,3 +100,6 @@ [submodule "spirv-headers"] path = externals/spirv-headers url = https://github.com/KhronosGroup/SPIRV-Headers +[submodule "externals/xxHash"] + path = externals/xxHash + url = https://github.com/Cyan4973/xxHash.git diff --git a/README.md b/README.md index db4aa84f4..35616e343 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,9 @@ ![Azahar Emulator](https://azahar-emu.org/resources/images/logo/azahar-name-and-logo.svg) ![GitHub Release](https://img.shields.io/github/v/release/azahar-emu/azahar?label=Current%20Release) -![GitHub Downloads](https://img.shields.io/github/downloads/azahar-emu/azahar/total?logo=github&label=GitHub%20Downloads) +![GitHub Downloads](https://img.shields.io/github/downloads/azahar-emu/azahar/total?logo=github&label=GitHub%20Downloads) +![Google Play Downloads](https://playbadges.pavi2410.com/badge/downloads?id=io.github.lime3ds.android&pretty&label=Play%20Store%20Downloads) +![Flathub Downloads](https://img.shields.io/flathub/downloads/org.azahar_emu.Azahar?logo=flathub&label=Flathub%20Downloads) ![CI Build Status](https://github.com/azahar-emu/azahar/actions/workflows/build.yml/badge.svg) Azahar is an open-source 3DS emulator project based on Citra. @@ -14,9 +16,11 @@ The goal of this project is to be the de-facto platform for future development. ### Windows -Download the latest release from [Releases](https://github.com/azahar-emu/azahar/releases). +Azahar is available as both an installer and a zip archive. -If you are unsure of whether you want to use MSYS2 or MSVC, use MSYS2. +Download the latest release in your preferred format from the [Releases](https://github.com/azahar-emu/azahar/releases) page. + +If you are unsure of whether you want to use MSVC or MSYS2, use MSYS2. --- @@ -30,23 +34,30 @@ Alternatively, if you wish to download a build specifically for your Mac, you ca - `macos-x86_64` for Intel Macs --- + ### Android -The recommended method of downloading Azahar on Android is via the Google Play store: + +There are two variants of Azahar available on Android, those being the Vanilla and Google Play builds. + +The Vanilla build is technically superior, as it uses an alternative method of file management which is faster, but isn't permitted on the Google Play store. + +For most users, we currently recommended downloading Azahar on Android via the Google Play Store for ease of accessibility: Get it on Google Play -Alternatively, you can install the app using Obtainium: +Alternatively, you can install the app using Obtainium, allowing you to use the Vanilla variant: 1. Download and install Obtainium from [here](https://github.com/ImranR98/Obtainium/releases) (use the file named `app-release.apk`) 2. Open Obtainium and click 'Add App' 3. Type `https://github.com/azahar-emu/azahar` into the 'App Source URL' section 4. Click 'Add' -5. Click 'Install' +5. Click 'Install', and select the preferred variant If you wish, you can also simply install the latest APK from the [Releases](https://github.com/azahar-emu/azahar/releases) page. Keep in mind that you will not recieve automatic updates when installing via the APK. --- + ### Linux The recommended format for using Azahar on Linux is the Flatpak available on Flathub: @@ -55,6 +66,13 @@ The recommended format for using Azahar on Linux is the Flatpak available on Fla Azahar is also available as an AppImage on the [Releases](https://github.com/azahar-emu/azahar/releases) page. +There are two variants of the AppImage available, those being `azahar.AppImage` and `azahar-wayland.AppImage`. + +If you are unsure of which variant to use, we recommend using the default `azahar.AppImage`. This is because of upstream issues in the Wayland ecosystem which may cause problems when running the emulator (e.g. [#1162](https://github.com/azahar-emu/azahar/issues/1162)). + +Unless you explicitly require native Wayland support (e.g. you are running a system with no Xwayland), the non-Wayland variant is recommended. + +The Flatpak build of Azahar also has native Wayland support disabled by default. If you require native Wayland support, it can be enabled using [Flatseal](https://flathub.org/en/apps/com.github.tchx84.Flatseal). # Build instructions @@ -86,18 +104,23 @@ To do so, simply read https://github.com/azahar-emu/compatibility-list/blob/mast Contributing compatibility data helps more accurately reflect the current capabilities of the emulator, so it would be highly appreciated if you could go through the reporting process after completing a game. # Minimum requirements + Below are the minimum requirements to run Azahar: ### Desktop + ``` Operating System: Windows 10 (64-bit), MacOS 13.4 (Ventura), or modern 64-bit Linux -CPU: x86-64/ARM64 CPU (Windows for ARM not supported). Single core performance higher than 1,800 on Passmark +CPU: x86-64/ARM64 CPU (Windows for ARM not supported). + Single core performance higher than 1,800 on Passmark. + SSE4.2 required on x86_64. GPU: OpenGL 4.3 or Vulkan 1.1 support Memory: 2GB of RAM. 4GB is recommended ``` ### Android + ``` -Operating System: Android 9.0+ (64-bit) +Operating System: Android 10.0+ (64-bit) CPU: Snapdragon 835 SoC or better GPU: OpenGL ES 3.2 or Vulkan 1.1 support Memory: 2GB of RAM. 4GB is recommended @@ -110,6 +133,7 @@ We share public roadmaps for upcoming releases in the form of GitHub milestones. You can find these at https://github.com/azahar-emu/azahar/milestones. # Join the conversation + We have a community Discord server where you can chat about the project, keep up to date with the latest announcements, or coordinate emulator development. -[![](https://dcbadge.vercel.app/api/server/4ZjMpAp3M6)](https://discord.gg/4ZjMpAp3M6) +Join at https://discord.gg/4ZjMpAp3M6 diff --git a/dist/compatibility_list b/dist/compatibility_list index a36decbe4..eadcdfb84 160000 --- a/dist/compatibility_list +++ b/dist/compatibility_list @@ -1 +1 @@ -Subproject commit a36decbe43d0e5a570ac3d3ba9a0b226dc832a17 +Subproject commit eadcdfb84b6f3b95734e867d99fe16a9e8db717f diff --git a/dist/languages/ca_ES_valencia.ts b/dist/languages/ca_ES_valencia.ts index bc138e02f..84a0b2b2c 100644 --- a/dist/languages/ca_ES_valencia.ts +++ b/dist/languages/ca_ES_valencia.ts @@ -296,8 +296,8 @@ Aixó banejarà el seu nom d'usuari de fòrum i la seua adreça IP. - Emulation: - Emulació: + Emulation + @@ -401,6 +401,7 @@ Aixó banejarà el seu nom d'usuari de fòrum i la seua adreça IP. + Camera Càmera @@ -412,8 +413,8 @@ Aixó banejarà el seu nom d'usuari de fòrum i la seua adreça IP. - Camera to configure: - Configurar la càmera: + Camera to Configure + @@ -433,8 +434,8 @@ Aixó banejarà el seu nom d'usuari de fòrum i la seua adreça IP. - Camera mode: - Mode de càmera: + Camera mode + @@ -454,8 +455,8 @@ Aixó banejarà el seu nom d'usuari de fòrum i la seua adreça IP. - Camera position: - Posició de càmera: + Camera position + @@ -480,8 +481,8 @@ Aixó banejarà el seu nom d'usuari de fòrum i la seua adreça IP. - Camera Image Source: - Font de la imatge de la càmera: + Camera Image Source + @@ -500,8 +501,8 @@ Aixó banejarà el seu nom d'usuari de fòrum i la seua adreça IP. - File: - Fitxer: + File + @@ -514,11 +515,6 @@ Aixó banejarà el seu nom d'usuari de fòrum i la seua adreça IP.Select the system camera to use Seleccione la cambra del sistema que serà usada - - - Camera: - Càmera: - <Default> @@ -532,8 +528,8 @@ Aixó banejarà el seu nom d'usuari de fòrum i la seua adreça IP. - Flip: - Rotació: + Flip + @@ -1022,7 +1018,7 @@ Desitja ignorar l'error i continuar? Enable Linear Filtering - Activar filtre linear + @@ -1086,8 +1082,8 @@ Desitja ignorar l'error i continuar? - Reverse Side by Side - De costat a costat invers + Side by Side Full Width + @@ -1137,7 +1133,7 @@ Desitja ignorar l'error i continuar? Disable Right Eye Rendering - Desactivar Renderitzat d'Ull Dret + @@ -1145,49 +1141,54 @@ Desitja ignorar l'error i continuar? <html><head/><body><p>Desactivar Dibuixat d'Ull Dret</p><p>Desactiva el dibuixat de la imatge de l'ull dret quan no s'utilitza el mode estereoscòpic. Millora significativament el rendiment en alguns jocs, però pot causar parpelleig en uns altres.</p></body></html> - + + Swap Eyes + + + + Utility Utilitat - + <html><head/><body><p>Replace textures with PNG files.</p><p>Textures are loaded from load/textures/[Title ID]/.</p></body></html> <html><head/><body><p>Canvia les textures per fitxers PNG.</p><p>Les textures són carregades des de load/textures/[Title ID]/.</p></body></html> - - Use Custom Textures - Usar textures personalitzades + + Use custom textures + - + <html><head/><body><p>Dump textures to PNG files.</p><p>Textures are dumped to dump/textures/[Title ID]/.</p></body></html> <html><head/><body><p>Bolca les textures a fitxers PNG.</p><p>Les textures són bolcades a load/textures/[Title ID]/.</p></body></html> - - Dump Textures - Bolcar Textures + + Dump textures + - + <html><head/><body><p>Load all custom textures into memory on boot, instead of loading them when the application requires them.</p></body></html> <html><head/><body><p>Càrrega totes les textures personalitzades en memòria en iniciar, en comptes de carregar-les quan l'aplicació les necessite.</p></body></html> - - Preload Custom Textures - Precarregar Textures Personalitzades + + Preload custom textures + - + <html><head/><body><p>Load custom textures asynchronously with background threads to reduce loading stutter</p></body></html> <html><head/><body><p>Càrrega les textures personalitzades de manera asíncrona amb els fils de fons per a reduir les aturades de càrrega</p></body></html> - - Async Custom Texture Loading - Càrrega de Textures Personalitzades Asíncrona + + Async custom texture loading + @@ -1244,13 +1245,13 @@ Desitja ignorar l'error i continuar? - Set emulation speed: - Establir la velocitat d'emulació: + Set emulation speed + - Emulation Speed: - Velocitat d'Emulació: + Emulation Speed + @@ -1361,13 +1362,13 @@ Desitja ignorar l'error i continuar? - SPIR-V Shader Generation - Generació de Ombrejats SPIR-V + SPIR-V shader generation + - Disable GLSL -> SPIR-V Optimizer - Desativar optimitzador GLSL -> SPIR-V + Disable GLSL -> SPIR-V optimizer + @@ -1386,8 +1387,8 @@ Desitja ignorar l'error i continuar? - Enable Hardware Shader - Activar Ombrejador de Hardware + Enable hardware shader + @@ -1396,8 +1397,8 @@ Desitja ignorar l'error i continuar? - Accurate Multiplication - Multiplicació Precisa + Accurate multiplication + @@ -1406,8 +1407,8 @@ Desitja ignorar l'error i continuar? - Enable Shader JIT - Activar Ombreig JIT + Enable shader JIT + @@ -1416,8 +1417,8 @@ Desitja ignorar l'error i continuar? - Enable Async Shader Compilation - Activar compilació de ombrejadors asíncrona + Enable async shader compilation + @@ -1426,8 +1427,8 @@ Desitja ignorar l'error i continuar? - Enable Async Presentation - Activar Presentació Asíncrona + Enable async presentation + @@ -1466,8 +1467,8 @@ Desitja ignorar l'error i continuar? - Use Disk Shader Cache - Usar Caché Emmagatzemada d'Ombrejadors + Use disk shader cache + @@ -1491,8 +1492,8 @@ Desitja ignorar l'error i continuar? - Delay application render thread: - Endarrerir fil de renderitzat: + Delay Application Render Thread + @@ -1980,13 +1981,13 @@ Desitja ignorar l'error i continuar? - Swap Screens - Intercanviar Pantalles + Swap screens + - Rotate Screens Upright - Girar pantalles en vertical + Rotate screens upright + @@ -2102,8 +2103,8 @@ Desitja ignorar l'error i continuar? - <html><head/><body><p>Bottom Screen Opacity % (OpenGL Only)</p></body></html> - <html><head/><body><p>Percentatge d'Opacitat de la Pantalla Inferior (només OpenGL)</p></body></html> + <html><head/><body><p>Bottom Screen Opacity %</p></body></html> + @@ -2450,8 +2451,8 @@ Desitja ignorar l'error i continuar? - Use Virtual SD - Usar SD Virtual + Use virtual SD card + @@ -2460,8 +2461,8 @@ Desitja ignorar l'error i continuar? - Use Custom Storage - Usar emmagatzematge personalitzat + Use custom storage location + @@ -2548,8 +2549,8 @@ les funcions en línia (si estan instal·lats) - Region: - Regió: + Region + @@ -2557,326 +2558,337 @@ les funcions en línia (si estan instal·lats) Auto-elegir - + + Apply region free patch to +installed applications. + + + + + Patches the region of installed applications to be region free, so that they always appear on the home menu. + + + + Username Nom d'usuari/a - + Birthday Aniversari - + January Gener - + February Febrer - + March Març - + April Abril - + May Maig - + June Juny - + July Juliol - + August Agost - + September Setembre - + October Octubre - + November Novembre - + December Decembre - + Language Idioma - + Note: this can be overridden when region setting is auto-select Nota: pot ser sobreescrit quan la regió és seleccionada automàticament - + Japanese (日本語) Japonés (日本語) - + English Anglés (English) - + French (français) Francés (Français) - + German (Deutsch) Alemany (Deutsch) - + Italian (italiano) Italià (Italiano) - + Spanish (español) Espanyol (Español) - + Simplified Chinese (简体中文) Xinés Simplificat (简体中文) - + Korean (한국어) Coreà (한국어) - + Dutch (Nederlands) Neerlandés (Nederlands) - + Portuguese (português) Portugués (Português) - + Russian (Русский) Rus (Русский) - + Traditional Chinese (正體中文) Xinés Tradicional (正體中文) - + Sound output mode Mode d'eixida de l'àudio - + Mono Mono - + Stereo Estéreo - + Surround Envolvent - + Country País - + Clock Rellotge - + System Clock Rellotge del Sistema - + Fixed Time Temps Fixat - + Startup time Temps de l'Inici - + yyyy-MM-ddTHH:mm:ss aaaa-mm-ddTHH:mm:ss - + Offset time Temps de compensació - + days dies - + HH:mm:ss HH:mm:ss - + Initial System Ticks Ticks de Sistema Inicials - + Random Aleatoris - + Fixed Fixades - + Initial System Ticks Override Sobreescriure Ticks de Sistema Inicials - + Play Coins Monedes de Joc - + <html><head/><body><p>Number of steps per hour reported by the pedometer. Range from 0 to 65,535.</p></body></html> <html><head/><body><p>Nombre de passos per hora reportats pel podòmetro. Rang de 0 a 65.535.</p></body></html> - + Pedometer Steps per Hour Passos per hora del podòmetre - + Run System Setup when Home Menu is launched Executar la Configuració de la consola quan s'execute el Menú HOME - + Console ID: ID de Consola - - + + Regenerate Regenerar - + MAC: MAC: - - 3GX Plugin Loader: - Carregador de complements 3GX: + + 3GX Plugin Loader + - + Enable 3GX plugin loader Habilitar el carregador de complements 3GX - + Allow applications to change plugin loader state Permetre que les aplicacions canvien l'estat del carregador de plugins - + Real Console Unique Data Dades úniques de la consola real - + Your real console is linked to Azahar. La teua consola real està enllaçada a Azahar. - + Unlink Desenllaçar - + OTP OTP - - - - + + + + Choose Triar - + SecureInfo_A/B SecureInfo_A/B - + LocalFriendCodeSeed_A/B LocalFriendCodeSeed_A/B - + movable.sed movable.sed - + System settings are available only when applications is not running. La configuració del sistema només està disponible quan l'aplicació no s'està executant. @@ -3586,76 +3598,76 @@ les funcions en línia (si estan instal·lats) Fitxer Sed (*.sed);;Tots els fitxers (*.*) - - + + Console ID: 0x%1 ID de Consola: 0x%1 - - + + MAC: %1 MAC: %1 - + This will replace your current virtual 3DS console ID with a new one. Your current virtual 3DS console ID will not be recoverable. This might have unexpected effects in applications. This might fail if you use an outdated config save. Continue? Substituirà la teua ID de consola 3DS actual per una nova. La teua ID actual no es podrà recuperar. Pot tenir efectes inesperats dins de les aplicacions. Podria fallar si utilitzes un fitxer de configuració obsolet. Continuar? - - - + + + Warning Advertència - + This will replace your current MAC address with a new one. It is not recommended to do this if you got the MAC address from your real console using the setup tool. Continue? Això reemplaçarà la teua adreça MAC actual per una nova. No es recomana fer-ho si vas obtindre la direcció MAC de la teua consola real amb la ferramenta de configuració. Continuar? - + This action will unlink your real console from Azahar, with the following consequences:<br><ul><li>Your OTP, SecureInfo and LocalFriendCodeSeed will be removed from Azahar.</li><li>Your friend list will reset and you will be logged out of your NNID/PNID account.</li><li>System files and eshop titles obtained through Azahar will become inaccessible until the same console is linked again (save data will not be lost).</li></ul><br>Continue? Esta acció desvincularà la teua consola real d'Azahar, amb les següents conseqüències:<ul><li>OTP, SecureInfo i LocalFriendCodeSeed seran eliminats de Azahar.</li><li>La teua llista d'amics es restablirà i es tancarà la sessió del teu compte NNID/PNID.</li><li>Els fitxers del sistema i els títols de la eshop obtinguts a través d'Azahar es tornaran inaccessibles fins que la mateixa consola es vincule novament mitjançant la ferramenta de configuració (les dades guardades no es perdran).</li></ul><br>Continuar? - + Invalid country for configured region País incorrecte per a la regió configurada - + Invalid country for console unique data País incorrecte per a les dades de consola únics - + Status: Loaded Estat: Carregat - + Status: Loaded (Invalid Signature) Estat: Carregat (Firma Invàlida) - + Status: Loaded (Region Changed) Estat: Carregat (Canviat de Regió) - + Status: Not Found Estat: No Trobat - + Status: Invalid Estat: Invàlid - + Status: IO Error Estat: Error Entrada/Eixida @@ -3771,13 +3783,13 @@ Mou els punts per a canviar la posició, o fes doble clic en les cel·les de la - Interface language: - Idioma de la Interfície + Interface Language + - Theme: - Tema: + Theme + @@ -3786,8 +3798,8 @@ Mou els punts per a canviar la posició, o fes doble clic en les cel·les de la - Icon Size: - Grandària d'Icona: + Icon Size + @@ -3807,8 +3819,8 @@ Mou els punts per a canviar la posició, o fes doble clic en les cel·les de la - Row 1 Text: - Text de Fila 1: + Row 1 Text + @@ -3842,18 +3854,18 @@ Mou els punts per a canviar la posició, o fes doble clic en les cel·les de la - Row 2 Text: - Text de Fila 2: + Row 2 Text + - Hide Titles without Icon - Ocultar Títols sense Icona + Hide titles without icon + - Single Line Mode - Mode Una Línia + Single line mode + @@ -3862,8 +3874,8 @@ Mou els punts per a canviar la posició, o fes doble clic en les cel·les de la - Show Advanced Frame Time Info - Mostrar informació de fotogrames avançada + Show advanced frame time info + @@ -3945,12 +3957,12 @@ Mou els punts per a canviar la posició, o fes doble clic en les cel·les de la DirectConnectWindow - + Connecting Connectant - + Connect Connectar @@ -4070,497 +4082,511 @@ Per favor, comprove la instal·lació de FFmpeg usada per a la compilació. GMainWindow - + No Suitable Vulkan Devices Detected Dispositius compatibles amb Vulkan no trobats. - + Vulkan initialization failed during boot.<br/>Your GPU may not support Vulkan 1.1, or you do not have the latest graphics driver. L'inici de Vulkan va fallar durant l'inici.<br/>El teu GPU, o no suporta Vulkan 1.1, o no té els últims drivers gràfics. - + Current Artic traffic speed. Higher values indicate bigger transfer loads. Velocitat actual del trànsit Artic. Valors més alts indiquen major càrrega de transferència. - - + + Current emulation speed. Values higher or lower than 100% indicate emulation is running faster or slower than a 3DS. La velocitat d'emulació actual. Valors majors o menors de 100% indiquen que la velocitat d'emulació funciona més ràpida o lentament que en una 3DS. - - + + How many frames per second the app is currently displaying. This will vary from app to app and scene to scene. Els fotogrames per segon que està mostrant el joc. Variaran d'aplicació en aplicació i d'escena a escena. - - + + Time taken to emulate a 3DS frame, not counting framelimiting or v-sync. For full-speed emulation this should be at most 16.67 ms. El temps que porta emular un fotograma de 3DS, sense tindre en compte el limitador de fotogrames, ni la sincronització vertical. Per a una emulació òptima, este valor no ha de superar els 16.67 ms. - + MicroProfile (unavailable) MicroProfile (no disponible) - + Clear Recent Files Netejar Fitxers Recents - + &Continue &Continuar - + &Pause &Pausar - + Azahar is running an application TRANSLATORS: This string is shown to the user to explain why Citra needs to prevent the computer from sleeping Azahar està executant una aplicació - - + + Invalid App Format Format d'aplicació invàlid - - + + Your app format is not supported.<br/>Please follow the guides to redump your <a href='https://web.archive.org/web/20240304210021/https://citra-emu.org/wiki/dumping-game-cartridges/'>game cartridges</a> or <a href='https://web.archive.org/web/20240304210011/https://citra-emu.org/wiki/dumping-installed-titles/'>installed titles</a>. El teu format d'aplicació no és vàlid.<br/>Per favor, seguix les instruccions per a tornar a bolcar les teues <a href='https://web.archive.org/web/20240304210021/https://citra-emu.org/wiki/dumping-game-cartridges/'>cartutxos de joc</a> i/o <a href='https://web.archive.org/web/20240304210011/https://citra-emu.org/wiki/dumping-installed-titles/'>títols instal·lats</a>. - + App Corrupted Aplicació corrupta - + Your app is corrupted. <br/>Please follow the guides to redump your <a href='https://web.archive.org/web/20240304210021/https://citra-emu.org/wiki/dumping-game-cartridges/'>game cartridges</a> or <a href='https://web.archive.org/web/20240304210011/https://citra-emu.org/wiki/dumping-installed-titles/'>installed titles</a>. La teua aplicació està corrupta. <br/>Per favor, seguix les instruccions per a tornar a bolcar les teues <a href='https://web.archive.org/web/20240304210021/https://citra-emu.org/wiki/dumping-game-cartridges/'>cartutxos de joc</a> i/o <a href='https://web.archive.org/web/20240304210011/https://citra-emu.org/wiki/dumping-installed-titles/'>títols instal·lats</a>. - + App Encrypted Aplicació encriptada - + Your app is encrypted. <br/><a href='https://azahar-emu.org/blog/game-loading-changes/'>Please check our blog for more info.</a> La teua aplicació està encriptada. <br/><a href='https://azahar-emu.org/blog/game-loading-changes/'>Per favor visita el nostre blog per a més informació.</a> - + Unsupported App Aplicació no suportada - + GBA Virtual Console is not supported by Azahar. Consola Virtual de GBA no està suportada per Azahar. - - + + Artic Server Artic Server - + + Invalid system mode + + + + + New 3DS exclusive applications cannot be loaded without enabling the New 3DS mode. + + + + Error while loading App! Error en carregar l'aplicació! - + An unknown error occurred. Please see the log for more details. Un error desconegut ha ocorregut. Per favor, mira el log per a més detalls. - + CIA must be installed before usage El CIA ha d'estar instal·lat abans d'usar-se - + Before using this CIA, you must install it. Do you want to install it now? Abans d'usar este CIA, has d'instal·lar-ho. Vols instal·lar-ho ara? - + Quick Load Càrrega Ràpida - + Quick Save Guardat Ràpid - - + + Slot %1 Ranura %1 - + %2 %3 %2 %3 - + Quick Save - %1 Guardat Ràpid - %1 - + Quick Load - %1 Càrrega Ràpida - %1 - + Slot %1 - %2 %3 Ranura %1 - %2 %3 - + Error Opening %1 Folder Error en obrir la carpeta %1 - - + + Folder does not exist! La carpeta no existix! - + Remove Play Time Data Llevar Dades de Temps de Joc - + Reset play time? Reiniciar temps de joc? - - - - + + + + Create Shortcut Crear drecera - + Do you want to launch the application in fullscreen? Desitja llançar esta aplicació en pantalla completa? - + Successfully created a shortcut to %1 Drecera a %1 creat amb èxit - + This will create a shortcut to the current AppImage. This may not work well if you update. Continue? Aixó crearà una drecera a la AppImage actual. Pot no funcionar bé si actualitzes. Continuar? - + Failed to create a shortcut to %1 Fallada en crear una drecera a %1 - + Create Icon Crear icona - + Cannot create icon file. Path "%1" does not exist and cannot be created. No es va poder crear un arxiu d'icona. La ruta "%1" no existix i no pot ser creada. - + Dumping... Bolcant... - - + + Cancel Cancel·lar - - - - - - - - - + + + + + + + + + Azahar Azahar - + Could not dump base RomFS. Refer to the log for details. No es va poder bolcar el RomFS base. Comprove el registre per a més detalls. - + Error Opening %1 Error en obrir %1 - + Select Directory Seleccionar directori - + Properties Propietats - + The application properties could not be loaded. Les propietats de l'aplicació no han pogut ser carregades. - + 3DS Executable (%1);;All Files (*.*) %1 is an identifier for the 3DS executable file extensions. Executable 3DS(%1);;Tots els arxius(*.*) - + Load File Carregar Fitxer - - + + Set Up System Files Configurar Fitxers del Sistema - + <p>Azahar needs console unique data and firmware files from a real console to be able to use some of its features.<br>Such files and data can be set up with the <a href=https://github.com/azahar-emu/ArticSetupTool>Azahar Artic Setup Tool</a><br>Notes:<ul><li><b>This operation will install console unique data to Azahar, do not share your user or nand folders<br>after performing the setup process!</b></li><li>While doing the setup process, Azahar will link to the console running the setup tool. You can unlink the<br>console later from the System tab in the emulator configuration menu.</li><li>Do not go online with both Azahar and your 3DS console at the same time after setting up system files,<br>as it could cause issues.</li><li>Old 3DS setup is needed for the New 3DS setup to work (doing both setup modes is recommended).</li><li>Both setup modes will work regardless of the model of the console running the setup tool.</li></ul><hr></p> <p>Azahar necessita fitxers d'una consola real per poder utilitzar algunes de les seues funcions.<br>Pots obtindre els fitxers amb la <a href=https://github.com/azahar-emu/ArticSetupTool>ferramenta de configuració Azahar</a><br>Notes:<ul><li><b>Aquesta operació instal·larà fitxers únics de la consola a Azahar, no compartisques les teues carpetes d'usuari o nand<br>després de completar el procés de configuració!</b></li><li>Després de la configuració, Azahar s'enllaçarà a la consola que ha executat la ferramenta de configuració. Pots desvincular la<br>consola més tard des de la pestanya "Fitxers de sistema" del menú d'opcions de l'emulador.</li><li>No et connectes en línia amb Azahar i la consola 3DS al mateix temps després de configurar els arxius del sistema,<br>ja que això podria causar problemes.</li><li>La configuració de Old 3DS és necessària perquè funcione la configuració de New 3DS (configurar els dos modes és recomanat).</li><li>Els dos modes de configuració funcionaran independentment del model de la consola que execute la ferramenta de configuració.</li></ul><hr></p> - + Enter Azahar Artic Setup Tool address: Introduïx la direcció de la ferramenta de configuració: - + <br>Choose setup mode: <br>Tria mode de configuració: - + (ℹ️) Old 3DS setup (ℹ️) Configuració Old 3DS - - + + Setup is possible. La configuració és possible. - + (⚠) New 3DS setup (⚠) Configuració New 3DS - + Old 3DS setup is required first. La configuració Old 3DS es neccessaria abans. - + (✅) Old 3DS setup (✅) Configuració Old 3DS - - + + Setup completed. Configuració completada. - + (ℹ️) New 3DS setup (ℹ️) Configuració New 3DS - + (✅) New 3DS setup (✅) Configuració New 3DS - + The system files for the selected mode are already set up. Reinstall the files anyway? Els fitxers de sistema per al mode seleccionat ja estan configurats. Vols reinstal·lar els arxius de totes maneres? - + Load Files Carregar Fitxers - + 3DS Installation File (*.cia *.zcia) Fitxers d'Instalació de 3DS (*.cia *.zcia) - - - + + + All Files (*.*) Tots els fitxers (*.*) - + Connect to Artic Base Connectar amb Artic Base - + Enter Artic Base server address: Introduïx la direcció del servidor Artic Base - + %1 has been installed successfully. %1 s'ha instal·lat amb èxit. - + Unable to open File No es va poder obrir el Fitxer - + Could not open %1 No es va poder obrir %1 - + Installation aborted Instal·lació interrompuda - + The installation of %1 was aborted. Please see the log for more details La instal·lació de %1 ha sigut avortada.\n Per favor, mira el log per a més informació. - + Invalid File Fitxer no vàlid - + %1 is not a valid CIA %1 no és un CIA vàlid. - + CIA Encrypted CIA encriptat - + Your CIA file is encrypted.<br/><a href='https://azahar-emu.org/blog/game-loading-changes/'>Please check our blog for more info.</a> El teu fitxer CIA està encriptat. <br/><a href='https://azahar-emu.org/blog/game-loading-changes/'>Per favor visita el nostre blog per a més informació.</a> - + Unable to find File No es pot trobar el Fitxer - + Could not find %1 No es va poder trobar %1 - - - - Error compressing file - Error al comprimir el fitxer + + + + + Z3DS Compression + - - File compress operation failed, check log for details. - Operació de compressió fallida, mira el registre per a més detalls. + + Failed to compress some files, check log for details. + - - - - Error decompressing file - Error de descompressió del fitxer + + Failed to decompress some files, check log for details. + - - File decompress operation failed, check log for details. - Operació de descompressió fallida, mira el registre per a més detalls. + + All files have been compressed successfully. + - + + All files have been decompressed successfully. + + + + Uninstalling '%1'... Desinstal·lant '%1'... - + Failed to uninstall '%1'. Va fallar la desinstal·lació de '%1'. - + Successfully uninstalled '%1'. '%1' desinstal·lat amb èxit. - + File not found Fitxer no trobat - + File "%1" not found Fitxer "%1" no trobat - + Savestates Estats - + Warning: Savestates are NOT a replacement for in-application saves, and are not meant to be reliable. Use at your own risk! @@ -4569,86 +4595,86 @@ Use at your own risk! Usa'ls sota el teu propi risc! - - - + + + Error opening amiibo data file Error en obrir els fitxers de dades de l'Amiibo - + A tag is already in use. Ja està en ús una etiqueta. - + Application is not looking for amiibos. L'aplicació no està buscant amiibos. - + Amiibo File (%1);; All Files (*.*) Fitxer d'Amiibo (%1);; Tots els arxius (*.*) - + Load Amiibo Carregar Amiibo - + Unable to open amiibo file "%1" for reading. No es va poder obrir el fitxer amiibo "%1" per a la seua lectura. - + Record Movie Gravar Pel·lícula - + Movie recording cancelled. Gravació de pel·lícula cancel·lada. - - + + Movie Saved Pel·lícula Guardada - - + + The movie is successfully saved. Pel·lícula guardada amb èxit. - + Application will unpause L'aplicació es resumirà - + The application will be unpaused, and the next frame will be captured. Is this okay? L'aplicació es resumirà, i el següent fotograma serà capturat. Estàs d'acord? - + Invalid Screenshot Directory Directori de captures de pantalla no vàlid - + Cannot create specified screenshot directory. Screenshot path is set back to its default value. No es pot crear el directori de captures de pantalla. La ruta de captures de pantalla torna al seu valor per omissió. - + Could not load video dumper No es va poder carregar el bolcador de vídeo - + FFmpeg could not be loaded. Make sure you have a compatible version installed. To install FFmpeg to Azahar, press Open and select your FFmpeg directory. @@ -4661,275 +4687,265 @@ Per a instal·lar FFmpeg en Azahar, polsa Obrir i tria el directori de FFmpeg. Per a veure una guia sobre com instal·lar FFmpeg, polsa Ajuda. - - Load 3DS ROM File - Carregar ROM de 3DS + + Load 3DS ROM Files + - - 3DS ROM Files (*.cia *cci *3dsx *cxi) - Fitxers ROM 3DS (*.cia *cci *3dsx *cxi) + + 3DS ROM Files (*.cia *.cci *.3dsx *.cxi) + - - The selected file is not a compatible 3DS ROM format. Make sure you have chosen the right file, and that it is not encrypted. - El fitxer seleccionat no és un ROM de 3DS compatible. Assegura't que has triat el fitxer correcte i que no estiga xifrat. - - - - The selected file is already compressed. - El fitxer seleccionat ja està comprimit. - - - + 3DS Compressed ROM File (*.%1) Fitxer ROM 3DS comprimit (*.%1) - + Save 3DS Compressed ROM File Desar fitxer 3DS comprimit - - Load 3DS Compressed ROM File - Carregar fitxer 3DS comprimit + + Select Output 3DS Compressed ROM Folder + - + + Load 3DS Compressed ROM Files + + + + 3DS Compressed ROM Files (*.zcia *zcci *z3dsx *zcxi) Fitxer ROM 3DS comprimit (*.zcia *zcci *z3dsx *zcxi) - - The selected file is not a compatible compressed 3DS ROM format. Make sure you have chosen the right file. - El fitxer seleccionat no és un format de ROM 3DS comprimit compatible. Assegura't d'haver triat l'arxiu correcte. - - - - The selected file is already decompressed. - El fitxer seleccionat ja està descomprimit. - - - + 3DS ROM File (*.%1) Fitxer ROM 3DS (*.%1) - + Save 3DS ROM File Desar fitxer ROM 3DS - + + Select Output 3DS ROM Folder + + + + Select FFmpeg Directory Seleccionar Directori FFmpeg - + The provided FFmpeg directory is missing %1. Please make sure the correct directory was selected. Al directori de FFmpeg indicat li falta %1. Per favor, assegura't d'haver seleccionat el directori correcte. - + FFmpeg has been sucessfully installed. FFmpeg ha sigut instal·lat amb èxit. - + Installation of FFmpeg failed. Check the log file for details. La instal·lació de FFmpeg ha fallat. Comprova l'arxiu del registre per a més detalls. - + Could not start video dumping.<br>Please ensure that the video encoder is configured correctly.<br>Refer to the log for details. No es va poder començar a gravar vídeo.<br>Assegura't que el codificador de vídeo està configurat correctament.<br>Per a més detalls, observa el registre. - + Recording %1 Gravant %1 - + Playing %1 / %2 Reproduint %1 / %2 - + Movie Finished Pel·lícula acabada - + (Accessing SharedExtData) (Accedint al SharedExtData) - + (Accessing SystemSaveData) (Accedint al SystemSaveData) - + (Accessing BossExtData) (Accedint al BossExtData) - + (Accessing ExtData) (Accedint al ExtData) - + (Accessing SaveData) (Accedint al SaveData) - + MB/s MB/s - + KB/s KB/s - + Artic Traffic: %1 %2%3 Tràfic Artic: %1 %2%3 - + Speed: %1% Velocitat: %1% - + Speed: %1% / %2% Velocitat: %1% / %2% - + App: %1 FPS App: %1 FPS - + Frame: %1 ms (GPU: [CMD: %2 ms, SWP: %3 ms], IPC: %4 ms, SVC: %5 ms, Rem: %6 ms) Frame: %1 ms (GPU: [CMD: %2 ms, SWP: %3 ms], IPC: %4 ms, SVC: %5 ms, Rem: %6 ms) - + Frame: %1 ms Frame: %1 ms - + VOLUME: MUTE VOLUM: SILENCI - + VOLUME: %1% Volume percentage (e.g. 50%) VOLUM: %1% - + %1 is missing. Please <a href='https://web.archive.org/web/20240304201103/https://citra-emu.org/wiki/dumping-system-archives-and-the-shared-fonts-from-a-3ds-console/'>dump your system archives</a>.<br/>Continuing emulation may result in crashes and bugs. Falta %1 . Per favor,<a href='https://web.archive.org/web/20240304201103/https://citra-emu.org/wiki/dumping-system-archives-and-the-shared-fonts-from-a-3ds-console/'>bolca els teus arxius de sistema</a>.<br/>Continuar l'emulació pot resultar en penges i errors. - + A system archive Un fitxer del sistema - + System Archive Not Found El fitxer del sistema no s'ha trobat - + System Archive Missing Falta un Fitxer de Sistema - + Save/load Error Error de guardat/càrrega - + Fatal Error Error Fatal - + A fatal error occurred. <a href='https://web.archive.org/web/20240228001712/https://community.citra-emu.org/t/how-to-upload-the-log-file/296'>Check the log</a> for details.<br/>Continuing emulation may result in crashes and bugs. Error fatal.<a href='https://web.archive.org/web/20240228001712/https://community.citra-emu.org/t/how-to-upload-the-log-file/296'>Mira el log</a>per a més detalls.<br/>Continuar l'emulació pot resultar en penges i errors. - + Fatal Error encountered Error Fatal trobat - + Continue Continuar - + Quit Application Tancar aplicació - + OK Aceptar - + Would you like to exit now? Vols eixir ara? - + The application is still running. Would you like to stop emulation? L'aplicació seguix en execució. Vols parar l'emulació? - + Playback Completed Reproducció Completada - + Movie playback completed. Reproducció de pel·lícula completada. - + Update Available Actualització disponible - + Update %1 for Azahar is available. Would you like to download it? L'actualització %1 d'Azahar ja està disponible. Vols descarregar-la? - + Primary Window Finestra Primària - + Secondary Window Finestra Secundària @@ -5035,175 +5051,190 @@ Vols descarregar-la? GameList - + IMPORTANT: Encrypted files and .3ds files are no longer supported. Decrypting and/or renaming to .cci may be necessary. <a href='https://azahar-emu.org/blog/game-loading-changes/'>Learn more.</a> IMPORTANT: Els fitxers encriptats .3ds ja no són compatibles. Pot ser que siga necessari desencriptar-los o canviar-los de nom a .cci. <a href='https://azahar-emu.org/blog/game-loading-changes/'>Més Informació.</a> - + Don't show again No tornar a mostrar - - + + Compatibility Compatibilitad - - + + Region Regió - - + + File type Tipus de Fitxer - - + + Size Grandària - - + + Play time Temps de joc - + Favorite Favorit - + + Eject Cartridge + + + + + Insert Cartridge + + + + Open Obrir - + Application Location Localització d'aplicacions - + Save Data Location Localització de dades de guardat - + Extra Data Location Localització de Dades Extra - + Update Data Location Localització de dades d'actualització - + DLC Data Location Localització de dades de DLC - + Texture Dump Location Localització del bolcat de textures - + Custom Texture Location Localització de les textures personalitzades - + Mods Location Localització dels mods - + Dump RomFS Bolcar RomFS - + Disk Shader Cache Caché de ombrejador de disc - + Open Shader Cache Location Obrir ubicació de cache de ombrejador - + Delete OpenGL Shader Cache Eliminar cache d'ombreig de OpenGL - + Uninstall Desinstal·lar - + Everything Tot - + Application Aplicació - + Update Actualitzar - + DLC DLC - + Remove Play Time Data Llevar Dades de Temps de Joc - + Create Shortcut Crear drecera - + Add to Desktop Afegir a l'escriptori - + Add to Applications Menu Afegir al Menú d'Aplicacions - + + Stress Test: App Launch + + + + Properties Propietats - - - - + + + + Azahar Azahar - + Are you sure you want to completely uninstall '%1'? This will delete the application if installed, as well as any installed updates or DLC. @@ -5212,64 +5243,64 @@ This will delete the application if installed, as well as any installed updates Aixó eliminarà l'aplicació si està instal·lada, així com també les actualitzacions i DLC instal·lades. - - + + %1 (Update) %1 (Actualització) - - + + %1 (DLC) %1 (DLC) - + Are you sure you want to uninstall '%1'? Estàs segur de voler desinstal·lar '%1'? - + Are you sure you want to uninstall the update for '%1'? Estàs segur de voler desinstal·lar l'actualització de '%1'? - + Are you sure you want to uninstall all DLC for '%1'? Estàs segur de voler desinstal·lar tot el DLC de '%1'? - + Scan Subfolders Escanejar subdirectoris - + Remove Application Directory Eliminar directori d'aplicacions - + Move Up Moure a dalt - + Move Down Moure avall - + Open Directory Location Obrir ubicació del directori - + Clear Reiniciar - + Name Nom @@ -5277,77 +5308,77 @@ Aixó eliminarà l'aplicació si està instal·lada, així com també les a GameListItemCompat - + Perfect Perfecte - + App functions flawless with no audio or graphical glitches, all tested functionality works as intended without any workarounds needed. L'aplicació funciona impecablement, sense falles d'àudio ni gràfiques; totes les funcions provades funcionen com s'espera, sense necessitat de solucions alternatives. - + Great Excel·lent - + App functions with minor graphical or audio glitches and is playable from start to finish. May require some workarounds. L'aplicació funciona amb xicotetes fallades gràfiques o d'àudio i es pot jugar de principi a fi. Pot requerir algunes solucions alternatives. - + Okay - + App functions with major graphical or audio glitches, but app is playable from start to finish with workarounds. L'aplicació funciona amb importants fallades gràfiques o d'àudio, però es pot jugar de principi a fi amb solucions alternatives. - + Bad Mal - + App functions, but with major graphical or audio glitches. Unable to progress in specific areas due to glitches even with workarounds. L'aplicació funciona, però presenta importants fallades gràfiques o d'àudio. No es pot avançar en unes certes àrees a causa de fallades, fins i tot amb solucions alternatives. - + Intro/Menu Intro/Menú - + App is completely unplayable due to major graphical or audio glitches. Unable to progress past the Start Screen. L'aplicació no es pot jugar per complet a causa d'importants fallades gràfiques o d'àudio. No es pot avançar més enllà de la pantalla d'inici. - + Won't Boot No inicia - + The app crashes when attempting to startup. L'aplicació es bloqueja en intentar iniciar-se. - + Not Tested Sense provar - + The app has not yet been tested. L'aplicació no s'ha provat encara. @@ -5355,7 +5386,7 @@ Screen. GameListPlaceholder - + Double-click to add a new folder to the application list Faça doble clic per a agregar una nova carpeta a la llista d'aplicacions @@ -5363,27 +5394,27 @@ Screen. GameListSearchField - + of de - + result resultat - + results resultats - + Filter: Filtre: - + Enter pattern to filter Introduïx un patró per a filtrar @@ -5711,87 +5742,87 @@ Screen. Índex de Cicle: - + SRC1: %1, %2, %3, %4 SRC1: %1, %2, %3, %4 - + SRC2: %1, %2, %3, %4 SRC2: %1, %2, %3, %4 - + SRC3: %1, %2, %3, %4 SRC3: %1, %2, %3, %4 - + DEST_IN: %1, %2, %3, %4 DEST_IN: %1, %2, %3, %4 - + DEST_OUT: %1, %2, %3, %4 DEST_OUT: %1, %2, %3, %4 - + Address Registers: %1, %2 Registres d'Adreça: %1, %2 - + Compare Result: %1, %2 Comparar Resultats: %1, %2 - + Static Condition: %1 Condició Estàtica: %1 - + Dynamic Conditions: %1, %2 Condicions Dinàmiques: %1, %2 - + Loop Parameters: %1 (repeats), %2 (initializer), %3 (increment), %4 Paràmetres de Bucle: %1 (repeticions), %2 (inicialitzador), %3 (incremental), %4 - + Instruction offset: 0x%1 Instrucció offset: 0x%1 - + -> 0x%2 -> 0x%2 - + (last instruction) (última instrucció) @@ -6092,32 +6123,32 @@ Missatge de depuració: Contrasenya: - + Room Name Nom de la Sala - + Preferred Application Aplicació preferida - + Host Host - + Players Jugadors - + Refreshing Actualitzant - + Refresh List Actualitzar Llista @@ -7119,32 +7150,32 @@ Pot ser que haja deixat la sala. %1 (0x%2) - + Unsupported encrypted application Aplicació cifrada no suportada - + Invalid region Regió no vàlida - + Installed Titles Títols Instal·lats - + System Titles Títols de Sistema - + Add New Application Directory Agregar nova carpeta d'aplicacions - + Favorites Favorits diff --git a/dist/languages/da_DK.ts b/dist/languages/da_DK.ts index 60b8aba1e..fb88846ab 100644 --- a/dist/languages/da_DK.ts +++ b/dist/languages/da_DK.ts @@ -29,7 +29,7 @@ <html><head/><body><p><img src=":/icons/default/256x256/azahar.png"/></p></body></html> - + <html><head/><body><p><img src=":/icons/default/256x256/azahar.png"/></p></body></html> @@ -298,8 +298,8 @@ Dette vil udelukke både deres forum-brugernavn og IP-adresse. - Emulation: - Emulering: + Emulation + Emulering @@ -403,6 +403,7 @@ Dette vil udelukke både deres forum-brugernavn og IP-adresse. + Camera Kamera @@ -414,8 +415,8 @@ Dette vil udelukke både deres forum-brugernavn og IP-adresse. - Camera to configure: - Konfigurer kamera: + Camera to Configure + Konfigurer kamera @@ -435,8 +436,8 @@ Dette vil udelukke både deres forum-brugernavn og IP-adresse. - Camera mode: - Kameratilstand: + Camera mode + Kameratilstand @@ -456,8 +457,8 @@ Dette vil udelukke både deres forum-brugernavn og IP-adresse. - Camera position: - Kameraposition: + Camera position + Kameraposition @@ -482,8 +483,8 @@ Dette vil udelukke både deres forum-brugernavn og IP-adresse. - Camera Image Source: - Kilde til kameraets billede + Camera Image Source + @@ -502,8 +503,8 @@ Dette vil udelukke både deres forum-brugernavn og IP-adresse. - File: - Fil: + File + @@ -516,11 +517,6 @@ Dette vil udelukke både deres forum-brugernavn og IP-adresse. Select the system camera to use Vælg kamera fra systemet, der skal bruges - - - Camera: - Kamera: - <Default> @@ -534,8 +530,8 @@ Dette vil udelukke både deres forum-brugernavn og IP-adresse. - Flip: - Vending: + Flip + @@ -1024,7 +1020,7 @@ Vil du ignorere fejlen og fortsætte? Enable Linear Filtering - Aktiverer lineær filtrering + @@ -1088,8 +1084,8 @@ Vil du ignorere fejlen og fortsætte? - Reverse Side by Side - Omvendt side om side + Side by Side Full Width + @@ -1139,7 +1135,7 @@ Vil du ignorere fejlen og fortsætte? Disable Right Eye Rendering - Deaktiver højre øje-gengivelse + @@ -1147,48 +1143,53 @@ Vil du ignorere fejlen og fortsætte? <html><head/><body><p>Deaktiver højre øje-gengivelse</p><p>Deaktiverer gengivelse af højre øje billede, når der ikke bruges stereoskopisk tilstand. Forbedrer ydeevnen betydeligt i nogle applikationer, men kan forårsage flimren i andre.</p></body></html> - + + Swap Eyes + + + + Utility Værktøj - + <html><head/><body><p>Replace textures with PNG files.</p><p>Textures are loaded from load/textures/[Title ID]/.</p></body></html> <html><head/><body><p>Erstat teksturer med PNG-filer.</p><p>Teksturer indlæses fra load/textures/[Titel ID]/.</p></body></html> - - Use Custom Textures - Brug brugerdefinerede teksturer + + Use custom textures + - + <html><head/><body><p>Dump textures to PNG files.</p><p>Textures are dumped to dump/textures/[Title ID]/.</p></body></html> - - Dump Textures + + Dump textures - + <html><head/><body><p>Load all custom textures into memory on boot, instead of loading them when the application requires them.</p></body></html> - - Preload Custom Textures + + Preload custom textures - + <html><head/><body><p>Load custom textures asynchronously with background threads to reduce loading stutter</p></body></html> - - Async Custom Texture Loading + + Async custom texture loading @@ -1246,12 +1247,12 @@ Vil du ignorere fejlen og fortsætte? - Set emulation speed: + Set emulation speed - Emulation Speed: + Emulation Speed @@ -1363,12 +1364,12 @@ Vil du ignorere fejlen og fortsætte? - SPIR-V Shader Generation + SPIR-V shader generation - Disable GLSL -> SPIR-V Optimizer + Disable GLSL -> SPIR-V optimizer @@ -1388,8 +1389,8 @@ Vil du ignorere fejlen og fortsætte? - Enable Hardware Shader - Aktiver hardware-shader + Enable hardware shader + @@ -1398,8 +1399,8 @@ Vil du ignorere fejlen og fortsætte? - Accurate Multiplication - Akkurat multiplikation + Accurate multiplication + @@ -1408,8 +1409,8 @@ Vil du ignorere fejlen og fortsætte? - Enable Shader JIT - Aktiver shader-JIT + Enable shader JIT + @@ -1418,7 +1419,7 @@ Vil du ignorere fejlen og fortsætte? - Enable Async Shader Compilation + Enable async shader compilation @@ -1428,7 +1429,7 @@ Vil du ignorere fejlen og fortsætte? - Enable Async Presentation + Enable async presentation @@ -1468,7 +1469,7 @@ Vil du ignorere fejlen og fortsætte? - Use Disk Shader Cache + Use disk shader cache @@ -1493,7 +1494,7 @@ Vil du ignorere fejlen og fortsætte? - Delay application render thread: + Delay Application Render Thread @@ -1982,12 +1983,12 @@ Vil du ignorere fejlen og fortsætte? - Swap Screens - Byt om på skærme + Swap screens + - Rotate Screens Upright + Rotate screens upright @@ -2104,7 +2105,7 @@ Vil du ignorere fejlen og fortsætte? - <html><head/><body><p>Bottom Screen Opacity % (OpenGL Only)</p></body></html> + <html><head/><body><p>Bottom Screen Opacity %</p></body></html> @@ -2452,7 +2453,7 @@ Vil du ignorere fejlen og fortsætte? - Use Virtual SD + Use virtual SD card @@ -2462,7 +2463,7 @@ Vil du ignorere fejlen og fortsætte? - Use Custom Storage + Use custom storage location @@ -2549,8 +2550,8 @@ online features (if installed) - Region: - + Region + Region @@ -2558,326 +2559,337 @@ online features (if installed) - + + Apply region free patch to +installed applications. + + + + + Patches the region of installed applications to be region free, so that they always appear on the home menu. + + + + Username Brugernavn - + Birthday Fødselsdag - + January Januar - + February Februar - + March Marts - + April April - + May Maj - + June Juni - + July Juli - + August August - + September September - + October Oktober - + November November - + December December - + Language Sprog - + Note: this can be overridden when region setting is auto-select Bemærk: Dette kan bliver overstyret når regionsindstillingen er sat til automatisk at vælge - + Japanese (日本語) Japansk (日本語) - + English Engelsk - + French (français) Fransk (français) - + German (Deutsch) Tysk (Deutsch) - + Italian (italiano) Italiensk (italiano) - + Spanish (español) Spansk (español) - + Simplified Chinese (简体中文) Forenklet kinesisk (简体中文) - + Korean (한국어) Koreansk (한국어) - + Dutch (Nederlands) Hollandsk (Nederlands) - + Portuguese (português) Portugisisk (português) - + Russian (Русский) Russisk (Русский) - + Traditional Chinese (正體中文) Traditionel kinesisk (正體中文) - + Sound output mode Tilstand til lydoutput - + Mono Mono - + Stereo Stereo - + Surround Surround - + Country Land - + Clock Tid - + System Clock Systemtid - + Fixed Time Fast tid - + Startup time Opstartstid - + yyyy-MM-ddTHH:mm:ss yyyy-MM-ddTHH:mm:ss - + Offset time - + days - + HH:mm:ss - + Initial System Ticks - + Random - + Fixed - + Initial System Ticks Override - + Play Coins - + <html><head/><body><p>Number of steps per hour reported by the pedometer. Range from 0 to 65,535.</p></body></html> - + Pedometer Steps per Hour - + Run System Setup when Home Menu is launched - + Console ID: Konsol-id: - - + + Regenerate Generer nyt - + MAC: - - 3GX Plugin Loader: + + 3GX Plugin Loader - + Enable 3GX plugin loader - + Allow applications to change plugin loader state - + Real Console Unique Data - + Your real console is linked to Azahar. - + Unlink - + OTP - - - - + + + + Choose - + SecureInfo_A/B - + LocalFriendCodeSeed_A/B - + movable.sed - + System settings are available only when applications is not running. @@ -3587,76 +3599,76 @@ online features (if installed) - - + + Console ID: 0x%1 Konsol-id: 0x%1 - - + + MAC: %1 - + This will replace your current virtual 3DS console ID with a new one. Your current virtual 3DS console ID will not be recoverable. This might have unexpected effects in applications. This might fail if you use an outdated config save. Continue? - - - + + + Warning Advarsel - + This will replace your current MAC address with a new one. It is not recommended to do this if you got the MAC address from your real console using the setup tool. Continue? - + This action will unlink your real console from Azahar, with the following consequences:<br><ul><li>Your OTP, SecureInfo and LocalFriendCodeSeed will be removed from Azahar.</li><li>Your friend list will reset and you will be logged out of your NNID/PNID account.</li><li>System files and eshop titles obtained through Azahar will become inaccessible until the same console is linked again (save data will not be lost).</li></ul><br>Continue? - + Invalid country for configured region - + Invalid country for console unique data - + Status: Loaded - + Status: Loaded (Invalid Signature) - + Status: Loaded (Region Changed) - + Status: Not Found - + Status: Invalid - + Status: IO Error @@ -3771,13 +3783,13 @@ Drag points to change position, or double-click table cells to edit values. - Interface language: - Grænsefladesprog: + Interface Language + - Theme: - Tema: + Theme + @@ -3786,8 +3798,8 @@ Drag points to change position, or double-click table cells to edit values. - Icon Size: - Ikonstørrelse + Icon Size + @@ -3807,8 +3819,8 @@ Drag points to change position, or double-click table cells to edit values. - Row 1 Text: - Tekst på række 1: + Row 1 Text + @@ -3842,17 +3854,17 @@ Drag points to change position, or double-click table cells to edit values. - Row 2 Text: - Tekst på række 2: + Row 2 Text + - Hide Titles without Icon - Skjul titler uden ikon + Hide titles without icon + - Single Line Mode + Single line mode @@ -3862,7 +3874,7 @@ Drag points to change position, or double-click table cells to edit values. - Show Advanced Frame Time Info + Show advanced frame time info @@ -3945,12 +3957,12 @@ Drag points to change position, or double-click table cells to edit values. DirectConnectWindow - + Connecting Forbinder - + Connect Forbind @@ -4069,581 +4081,595 @@ Please check your FFmpeg installation used for compilation. GMainWindow - + No Suitable Vulkan Devices Detected - + Vulkan initialization failed during boot.<br/>Your GPU may not support Vulkan 1.1, or you do not have the latest graphics driver. - + Current Artic traffic speed. Higher values indicate bigger transfer loads. - - + + Current emulation speed. Values higher or lower than 100% indicate emulation is running faster or slower than a 3DS. Nuværende emuleringshastighed. Værdier højere eller lavere end 100% indikerer at emuleringen kører hurtigere eller langsommere end en 3DS. - - + + How many frames per second the app is currently displaying. This will vary from app to app and scene to scene. - - + + Time taken to emulate a 3DS frame, not counting framelimiting or v-sync. For full-speed emulation this should be at most 16.67 ms. Tid det tog at emulere en 3DS-skærmbillede, hastighedsbegrænsning og v-sync er tille talt med. For emulering med fuld hastighed skal dette højest være 16,67ms. - + MicroProfile (unavailable) - + Clear Recent Files Ryd seneste filer - + &Continue - + &Pause - + Azahar is running an application TRANSLATORS: This string is shown to the user to explain why Citra needs to prevent the computer from sleeping - - + + Invalid App Format - - + + Your app format is not supported.<br/>Please follow the guides to redump your <a href='https://web.archive.org/web/20240304210021/https://citra-emu.org/wiki/dumping-game-cartridges/'>game cartridges</a> or <a href='https://web.archive.org/web/20240304210011/https://citra-emu.org/wiki/dumping-installed-titles/'>installed titles</a>. - + App Corrupted - + Your app is corrupted. <br/>Please follow the guides to redump your <a href='https://web.archive.org/web/20240304210021/https://citra-emu.org/wiki/dumping-game-cartridges/'>game cartridges</a> or <a href='https://web.archive.org/web/20240304210011/https://citra-emu.org/wiki/dumping-installed-titles/'>installed titles</a>. - + App Encrypted - + Your app is encrypted. <br/><a href='https://azahar-emu.org/blog/game-loading-changes/'>Please check our blog for more info.</a> - + Unsupported App - + GBA Virtual Console is not supported by Azahar. - - + + Artic Server - + + Invalid system mode + + + + + New 3DS exclusive applications cannot be loaded without enabling the New 3DS mode. + + + + Error while loading App! - + An unknown error occurred. Please see the log for more details. - + CIA must be installed before usage CIA skal installeres før brug - + Before using this CIA, you must install it. Do you want to install it now? Før du kan bruge denne CIA, skal den være installeret. Vil du installere den nu? - + Quick Load - + Quick Save - - + + Slot %1 - + %2 %3 - + Quick Save - %1 - + Quick Load - %1 - + Slot %1 - %2 %3 - + Error Opening %1 Folder Fejl ved åbning af %1-mappen - - + + Folder does not exist! Mappen findes ikke! - + Remove Play Time Data - + Reset play time? - - - - + + + + Create Shortcut - + Do you want to launch the application in fullscreen? - + Successfully created a shortcut to %1 - + This will create a shortcut to the current AppImage. This may not work well if you update. Continue? - + Failed to create a shortcut to %1 - + Create Icon - + Cannot create icon file. Path "%1" does not exist and cannot be created. - + Dumping... - - + + Cancel Annuller - - - - - - - - - + + + + + + + + + Azahar - + Could not dump base RomFS. Refer to the log for details. - + Error Opening %1 Fejl ved åbning af %1 - + Select Directory Vælg mappe - + Properties - + The application properties could not be loaded. - + 3DS Executable (%1);;All Files (*.*) %1 is an identifier for the 3DS executable file extensions. 3DS-program (%1);;Alle filer (*.*) - + Load File Indlæs fil - - + + Set Up System Files - + <p>Azahar needs console unique data and firmware files from a real console to be able to use some of its features.<br>Such files and data can be set up with the <a href=https://github.com/azahar-emu/ArticSetupTool>Azahar Artic Setup Tool</a><br>Notes:<ul><li><b>This operation will install console unique data to Azahar, do not share your user or nand folders<br>after performing the setup process!</b></li><li>While doing the setup process, Azahar will link to the console running the setup tool. You can unlink the<br>console later from the System tab in the emulator configuration menu.</li><li>Do not go online with both Azahar and your 3DS console at the same time after setting up system files,<br>as it could cause issues.</li><li>Old 3DS setup is needed for the New 3DS setup to work (doing both setup modes is recommended).</li><li>Both setup modes will work regardless of the model of the console running the setup tool.</li></ul><hr></p> - + Enter Azahar Artic Setup Tool address: - + <br>Choose setup mode: - + (ℹ️) Old 3DS setup - - + + Setup is possible. - + (⚠) New 3DS setup - + Old 3DS setup is required first. - + (✅) Old 3DS setup - - + + Setup completed. - + (ℹ️) New 3DS setup - + (✅) New 3DS setup - + The system files for the selected mode are already set up. Reinstall the files anyway? - + Load Files Indlæs filer - + 3DS Installation File (*.cia *.zcia) - - - + + + All Files (*.*) Alle filer (*.*) - + Connect to Artic Base - + Enter Artic Base server address: - + %1 has been installed successfully. %1 blev succesfuldt installeret. - + Unable to open File Kunne ikke åbne filen - + Could not open %1 Kunne ikke åbne %1 - + Installation aborted Installation afbrudt - + The installation of %1 was aborted. Please see the log for more details Installationen af %1 blev afbrudt. Se logfilen for flere detaljer. - + Invalid File Ugyldig fil - + %1 is not a valid CIA %1 er ikke en gyldig CIA - + CIA Encrypted - + Your CIA file is encrypted.<br/><a href='https://azahar-emu.org/blog/game-loading-changes/'>Please check our blog for more info.</a> - + Unable to find File - + Could not find %1 - - - - Error compressing file + + + + + Z3DS Compression - - File compress operation failed, check log for details. + + Failed to compress some files, check log for details. - - - - Error decompressing file + + Failed to decompress some files, check log for details. - - File decompress operation failed, check log for details. + + All files have been compressed successfully. - + + All files have been decompressed successfully. + + + + Uninstalling '%1'... - + Failed to uninstall '%1'. - + Successfully uninstalled '%1'. - + File not found Filen blev ikke fundet - + File "%1" not found Filen "%1" blev ikke fundet - + Savestates - + Warning: Savestates are NOT a replacement for in-application saves, and are not meant to be reliable. Use at your own risk! - - - + + + Error opening amiibo data file - + A tag is already in use. - + Application is not looking for amiibos. - + Amiibo File (%1);; All Files (*.*) Amiibo-fil (%1);;Alle filer (*.*) - + Load Amiibo Indlæs Amiibo - + Unable to open amiibo file "%1" for reading. - + Record Movie Optag film - + Movie recording cancelled. Filmoptagelse afbrudt - - + + Movie Saved Film gemt - - + + The movie is successfully saved. Filmen er succesfuldt blevet gemt. - + Application will unpause - + The application will be unpaused, and the next frame will be captured. Is this okay? - + Invalid Screenshot Directory - + Cannot create specified screenshot directory. Screenshot path is set back to its default value. - + Could not load video dumper - + FFmpeg could not be loaded. Make sure you have a compatible version installed. To install FFmpeg to Azahar, press Open and select your FFmpeg directory. @@ -4652,274 +4678,264 @@ To view a guide on how to install FFmpeg, press Help. - - Load 3DS ROM File + + Load 3DS ROM Files - - 3DS ROM Files (*.cia *cci *3dsx *cxi) + + 3DS ROM Files (*.cia *.cci *.3dsx *.cxi) - - The selected file is not a compatible 3DS ROM format. Make sure you have chosen the right file, and that it is not encrypted. - - - - - The selected file is already compressed. - - - - + 3DS Compressed ROM File (*.%1) - + Save 3DS Compressed ROM File - - Load 3DS Compressed ROM File + + Select Output 3DS Compressed ROM Folder - + + Load 3DS Compressed ROM Files + + + + 3DS Compressed ROM Files (*.zcia *zcci *z3dsx *zcxi) - - The selected file is not a compatible compressed 3DS ROM format. Make sure you have chosen the right file. - - - - - The selected file is already decompressed. - - - - + 3DS ROM File (*.%1) - + Save 3DS ROM File - + + Select Output 3DS ROM Folder + + + + Select FFmpeg Directory - + The provided FFmpeg directory is missing %1. Please make sure the correct directory was selected. - + FFmpeg has been sucessfully installed. - + Installation of FFmpeg failed. Check the log file for details. - + Could not start video dumping.<br>Please ensure that the video encoder is configured correctly.<br>Refer to the log for details. - + Recording %1 - + Playing %1 / %2 - + Movie Finished - + (Accessing SharedExtData) - + (Accessing SystemSaveData) - + (Accessing BossExtData) - + (Accessing ExtData) - + (Accessing SaveData) - + MB/s - + KB/s - + Artic Traffic: %1 %2%3 - + Speed: %1% Hastighed: %1% - + Speed: %1% / %2% Hastighed: %1%/%2% - + App: %1 FPS - + Frame: %1 ms (GPU: [CMD: %2 ms, SWP: %3 ms], IPC: %4 ms, SVC: %5 ms, Rem: %6 ms) - + Frame: %1 ms Billede: %1ms - + VOLUME: MUTE - + VOLUME: %1% Volume percentage (e.g. 50%) - + %1 is missing. Please <a href='https://web.archive.org/web/20240304201103/https://citra-emu.org/wiki/dumping-system-archives-and-the-shared-fonts-from-a-3ds-console/'>dump your system archives</a>.<br/>Continuing emulation may result in crashes and bugs. - + A system archive - + System Archive Not Found Systemarkiver blev ikke fundet - + System Archive Missing - + Save/load Error - + Fatal Error Alvorlig fejl - + A fatal error occurred. <a href='https://web.archive.org/web/20240228001712/https://community.citra-emu.org/t/how-to-upload-the-log-file/296'>Check the log</a> for details.<br/>Continuing emulation may result in crashes and bugs. - + Fatal Error encountered - + Continue Fortsæt - + Quit Application - + OK OK - + Would you like to exit now? Vil du afslutte nu? - + The application is still running. Would you like to stop emulation? - + Playback Completed Afspilning færdig - + Movie playback completed. Afspilning af filmen er færdig. - + Update Available - + Update %1 for Azahar is available. Would you like to download it? - + Primary Window - + Secondary Window @@ -5025,239 +5041,254 @@ Would you like to download it? GameList - + IMPORTANT: Encrypted files and .3ds files are no longer supported. Decrypting and/or renaming to .cci may be necessary. <a href='https://azahar-emu.org/blog/game-loading-changes/'>Learn more.</a> - + Don't show again - - + + Compatibility Kompatibilitet - - + + Region Region - - + + File type Filtype - - + + Size Størrelse - - + + Play time - + Favorite - + + Eject Cartridge + + + + + Insert Cartridge + + + + Open - + Application Location - + Save Data Location - + Extra Data Location - + Update Data Location - + DLC Data Location - + Texture Dump Location - + Custom Texture Location - + Mods Location - + Dump RomFS - + Disk Shader Cache - + Open Shader Cache Location - + Delete OpenGL Shader Cache - + Uninstall - + Everything - + Application - + Update - + DLC - + Remove Play Time Data - + Create Shortcut - + Add to Desktop - + Add to Applications Menu - + + Stress Test: App Launch + + + + Properties - - - - + + + + Azahar - + Are you sure you want to completely uninstall '%1'? This will delete the application if installed, as well as any installed updates or DLC. - - + + %1 (Update) - - + + %1 (DLC) - + Are you sure you want to uninstall '%1'? - + Are you sure you want to uninstall the update for '%1'? - + Are you sure you want to uninstall all DLC for '%1'? - + Scan Subfolders Skan undermapper - + Remove Application Directory - + Move Up - + Move Down - + Open Directory Location Åbn mappens placering - + Clear Ryd - + Name Navn @@ -5265,77 +5296,77 @@ This will delete the application if installed, as well as any installed updates GameListItemCompat - + Perfect Perfekt - + App functions flawless with no audio or graphical glitches, all tested functionality works as intended without any workarounds needed. - + Great God - + App functions with minor graphical or audio glitches and is playable from start to finish. May require some workarounds. - + Okay Okay - + App functions with major graphical or audio glitches, but app is playable from start to finish with workarounds. - + Bad Dårlig - + App functions, but with major graphical or audio glitches. Unable to progress in specific areas due to glitches even with workarounds. - + Intro/Menu Intro/menu - + App is completely unplayable due to major graphical or audio glitches. Unable to progress past the Start Screen. - + Won't Boot Kører ikke - + The app crashes when attempting to startup. - + Not Tested Ikke testet - + The app has not yet been tested. @@ -5343,7 +5374,7 @@ Screen. GameListPlaceholder - + Double-click to add a new folder to the application list @@ -5351,27 +5382,27 @@ Screen. GameListSearchField - + of af - + result resultat - + results resultater - + Filter: Filter: - + Enter pattern to filter Indtast mønster til filtrering @@ -5699,87 +5730,87 @@ Screen. Cycle-indeks: - + SRC1: %1, %2, %3, %4 SRC1: %1, %2, %3, %4 - + SRC2: %1, %2, %3, %4 SRC2: %1, %2, %3, %4 - + SRC3: %1, %2, %3, %4 SRC3: %1, %2, %3, %4 - + DEST_IN: %1, %2, %3, %4 DEST_IN: %1, %2, %3, %4 - + DEST_OUT: %1, %2, %3, %4 DEST_OUT: %1, %2, %3, %4 - + Address Registers: %1, %2 Adresseregistre: %1, %2 - + Compare Result: %1, %2 Sammenlign resultat: %1, %2 - + Static Condition: %1 Statisk betingelse: %1 - + Dynamic Conditions: %1, %2 Dynamisk betingelse: %1, %2 - + Loop Parameters: %1 (repeats), %2 (initializer), %3 (increment), %4 Loopparametre: %1 (gentager), %2 (initialisering), %3 (interval), %4 - + Instruction offset: 0x%1 Instruktionsoffset: 0x%1 - + -> 0x%2 -> 0x%2 - + (last instruction) (sidste instruktion) @@ -6078,32 +6109,32 @@ Debug Message: Adgangskode: - + Room Name Rumnavn - + Preferred Application - + Host Vært - + Players Spillere - + Refreshing Genopfrisker - + Refresh List Genopfrisk liste @@ -6604,7 +6635,7 @@ Debug Message: File: - Fil: + @@ -6696,7 +6727,7 @@ Debug Message: File: - Fil: + @@ -7102,32 +7133,32 @@ They may have left the room. - + Unsupported encrypted application - + Invalid region Ugyldig region - + Installed Titles - + System Titles - + Add New Application Directory - + Favorites diff --git a/dist/languages/de.ts b/dist/languages/de.ts index 56ec17464..b579092ef 100644 --- a/dist/languages/de.ts +++ b/dist/languages/de.ts @@ -298,8 +298,8 @@ Dies bannt sowohl den Forum-Nutzernamen, als auch die IP-Adresse. - Emulation: - Emulation: + Emulation + Emulation @@ -403,6 +403,7 @@ Dies bannt sowohl den Forum-Nutzernamen, als auch die IP-Adresse. + Camera Kamera @@ -414,8 +415,8 @@ Dies bannt sowohl den Forum-Nutzernamen, als auch die IP-Adresse. - Camera to configure: - Zu konfigurierende Kamera: + Camera to Configure + @@ -435,8 +436,8 @@ Dies bannt sowohl den Forum-Nutzernamen, als auch die IP-Adresse. - Camera mode: - Kameramodus: + Camera mode + @@ -456,8 +457,8 @@ Dies bannt sowohl den Forum-Nutzernamen, als auch die IP-Adresse. - Camera position: - Kameraposition: + Camera position + @@ -482,8 +483,8 @@ Dies bannt sowohl den Forum-Nutzernamen, als auch die IP-Adresse. - Camera Image Source: - Kamera-Bildquelle: + Camera Image Source + @@ -502,8 +503,8 @@ Dies bannt sowohl den Forum-Nutzernamen, als auch die IP-Adresse. - File: - Datei: + File + Datei @@ -516,11 +517,6 @@ Dies bannt sowohl den Forum-Nutzernamen, als auch die IP-Adresse. Select the system camera to use Wähle die zu nutzende Systemkamera aus - - - Camera: - Kamera: - <Default> @@ -534,8 +530,8 @@ Dies bannt sowohl den Forum-Nutzernamen, als auch die IP-Adresse. - Flip: - Spiegelung: + Flip + @@ -1024,7 +1020,7 @@ Möchtest du den Fehler ignorieren und fortfahren? Enable Linear Filtering - Aktiviere lineare Filterung + @@ -1088,8 +1084,8 @@ Möchtest du den Fehler ignorieren und fortfahren? - Reverse Side by Side - Invers Nebeneinander + Side by Side Full Width + @@ -1139,7 +1135,7 @@ Möchtest du den Fehler ignorieren und fortfahren? Disable Right Eye Rendering - Rendering für das rechte Auge deaktivieren + @@ -1147,49 +1143,54 @@ Möchtest du den Fehler ignorieren und fortfahren? <html><head/><body><p>Deaktiviert die Darstellung des Bildes für das rechte Auge</p><p>Deaktiviert die Darstellung des Bildes für das rechte Auge, wenn der stereoskopische Modus nicht verwendet wird. Verbessert die Leistung in einigen Anwendungen erheblich, kann aber bei anderen Flackern verursachen. </p></body></html> - + + Swap Eyes + + + + Utility Dienstprogramm - + <html><head/><body><p>Replace textures with PNG files.</p><p>Textures are loaded from load/textures/[Title ID]/.</p></body></html> <html><head/><body><p>Ersetze Texturen mit PNG-Dateien.</p><p>Texturen werden von „load/textures/[Title-ID]/“ geladen.</p></body></html> - - Use Custom Textures - Benutzerdefinierte Texturen nutzen + + Use custom textures + - + <html><head/><body><p>Dump textures to PNG files.</p><p>Textures are dumped to dump/textures/[Title ID]/.</p></body></html> <html><head/><body><p>Dumpe Texturen als PNG-Datei.</p><p>Texturen werden unter „dump/textures/[Title-ID]/“ gedumpt.</p></body></html> - - Dump Textures - Texturen dumpen + + Dump textures + - + <html><head/><body><p>Load all custom textures into memory on boot, instead of loading them when the application requires them.</p></body></html> <html><head/><body><p>Lädt alle benutzerdefinierten Texturen beim Start in den Speicher, anstatt sie erst zu laden wenn die Anwendung sie benötigt.</p></body></html> - - Preload Custom Textures - Benutzerdefinierte Texturen im Voraus laden + + Preload custom textures + - + <html><head/><body><p>Load custom textures asynchronously with background threads to reduce loading stutter</p></body></html> <html><head/><body><p>Lädt alle benutzerdefinierten Texturen asynchron mit Hintergrund-Threads, um das Stottern beim Laden zu reduzieren</p></body></html> - - Async Custom Texture Loading - Benutzerdefinierte Texturen asynchron laden + + Async custom texture loading + @@ -1246,13 +1247,13 @@ Möchtest du den Fehler ignorieren und fortfahren? - Set emulation speed: - Emulationsgeschwindigkeit festlegen: + Set emulation speed + - Emulation Speed: - Emulationsgeschwindigkeit: + Emulation Speed + @@ -1363,13 +1364,13 @@ Möchtest du den Fehler ignorieren und fortfahren? - SPIR-V Shader Generation - SPIR-V-Shader-Erzeugung + SPIR-V shader generation + - Disable GLSL -> SPIR-V Optimizer - Deaktiviere GLSL -> SPIR-V Optimierer + Disable GLSL -> SPIR-V optimizer + @@ -1388,8 +1389,8 @@ Möchtest du den Fehler ignorieren und fortfahren? - Enable Hardware Shader - Hardware-Shader aktivieren + Enable hardware shader + @@ -1398,8 +1399,8 @@ Möchtest du den Fehler ignorieren und fortfahren? - Accurate Multiplication - Genaue Multiplikation + Accurate multiplication + @@ -1408,8 +1409,8 @@ Möchtest du den Fehler ignorieren und fortfahren? - Enable Shader JIT - JIT-Shader aktivieren + Enable shader JIT + @@ -1418,8 +1419,8 @@ Möchtest du den Fehler ignorieren und fortfahren? - Enable Async Shader Compilation - Aktiviere asynchrone Shader-Kompilierung + Enable async shader compilation + @@ -1428,8 +1429,8 @@ Möchtest du den Fehler ignorieren und fortfahren? - Enable Async Presentation - Aktiviere asynchrone Präsentation + Enable async presentation + @@ -1468,8 +1469,8 @@ Möchtest du den Fehler ignorieren und fortfahren? - Use Disk Shader Cache - Shader-Cache nutzen + Use disk shader cache + @@ -1493,8 +1494,8 @@ Möchtest du den Fehler ignorieren und fortfahren? - Delay application render thread: - Verzögere Anwendungsrender-Thread: + Delay Application Render Thread + @@ -1982,13 +1983,13 @@ Möchtest du den Fehler ignorieren und fortfahren? - Swap Screens - Bildschirme tauschen + Swap screens + - Rotate Screens Upright - Bildschirme aufrecht rotieren + Rotate screens upright + @@ -2104,8 +2105,8 @@ Möchtest du den Fehler ignorieren und fortfahren? - <html><head/><body><p>Bottom Screen Opacity % (OpenGL Only)</p></body></html> - <html><head/><body><p>Untere Bildschirmdeckkraft % (Nur OpenGL)</p></body></html> + <html><head/><body><p>Bottom Screen Opacity %</p></body></html> + @@ -2452,8 +2453,8 @@ Möchtest du den Fehler ignorieren und fortfahren? - Use Virtual SD - Virtuelle SD-Karte benutzen + Use virtual SD card + @@ -2462,8 +2463,8 @@ Möchtest du den Fehler ignorieren und fortfahren? - Use Custom Storage - Benutzerdefinierten Speicher nutzen + Use custom storage location + @@ -2550,8 +2551,8 @@ Online-Funktionen (sofern installiert) - Region: - Region: + Region + Region @@ -2559,326 +2560,337 @@ Online-Funktionen (sofern installiert) Automatisch auswählen - + + Apply region free patch to +installed applications. + + + + + Patches the region of installed applications to be region free, so that they always appear on the home menu. + + + + Username Nutzername - + Birthday Geburtstag - + January Januar - + February Februar - + March März - + April April - + May Mai - + June Juni - + July Juli - + August August - + September September - + October Oktober - + November November - + December Dezember - + Language Sprache - + Note: this can be overridden when region setting is auto-select Hinweis: Dies kann überschrieben werden, wenn als Region „Automatisch auswählen“ eingestellt wurde. - + Japanese (日本語) Japanisch (日本語) - + English Englisch - + French (français) Französisch (français) - + German (Deutsch) Deutsch (German) - + Italian (italiano) Italienisch (italiano) - + Spanish (español) Spanisch (español) - + Simplified Chinese (简体中文) Vereinfachtes Chinesisch (简体中文) - + Korean (한국어) Koreanisch (한국어) - + Dutch (Nederlands) Niederländisch (Nederlands) - + Portuguese (português) Portugiesisch (português) - + Russian (Русский) Russisch (Русский) - + Traditional Chinese (正體中文) Traditionelles Chinesisch (正體中文) - + Sound output mode Tonausgabemodus - + Mono Mono - + Stereo Stereo - + Surround Surround - + Country Land - + Clock Uhr - + System Clock Systemuhr - + Fixed Time Feste Zeit - + Startup time Zum Start benötigte Zeit - + yyyy-MM-ddTHH:mm:ss yyyy-MM-ddTHH:mm:ss - + Offset time Versetzte Zeit - + days Tage - + HH:mm:ss HH:mm:ss - + Initial System Ticks Anfängliche System-Ticks - + Random Zufall - + Fixed Festgelegt - + Initial System Ticks Override Anfängliche System-Ticks überschreiben - + Play Coins Spielemünzen - + <html><head/><body><p>Number of steps per hour reported by the pedometer. Range from 0 to 65,535.</p></body></html> <html><head/><body><p>Die Anzahl der Schritte pro Stunde, die vom Schrittzähler gemeldet wird, liegt im Bereich von 0 bis 65.535</p></body></html> - + Pedometer Steps per Hour Schrittzähler-Schritte pro Stunde - + Run System Setup when Home Menu is launched Systemeinrichtung ausführen, wenn das HOME-Menü gestartet wird - + Console ID: Konsolen-ID: - - + + Regenerate Wiederherstellen - + MAC: MAC: - - 3GX Plugin Loader: - 3GX-Plugin-Lader: + + 3GX Plugin Loader + - + Enable 3GX plugin loader 3GX-Plugin-Loader aktivieren - + Allow applications to change plugin loader state Erlaube Anwendungen, den Status des Plug-In-Loaders zu ändern - + Real Console Unique Data Einzigartige, echte Konsolendaten - + Your real console is linked to Azahar. Deine echte Konsole ist mit Azahar verknüpft. - + Unlink Verknüpfung aufheben - + OTP OTP - - - - + + + + Choose Auswählen - + SecureInfo_A/B SecureInfo_A/B - + LocalFriendCodeSeed_A/B LocalFriendCodeSeed_A/B - + movable.sed movable.sed - + System settings are available only when applications is not running. Systemeinstellungen sind nur verfügbar, wenn Anwendungen nicht ausgeführt werden. @@ -3588,76 +3600,76 @@ Online-Funktionen (sofern installiert) Sed-Datei (*.sed)::Alle Dateien (*.*) - - + + Console ID: 0x%1 Konsolen-ID: 0x%1 - - + + MAC: %1 MAC: %1 - + This will replace your current virtual 3DS console ID with a new one. Your current virtual 3DS console ID will not be recoverable. This might have unexpected effects in applications. This might fail if you use an outdated config save. Continue? Dadurch wird deine aktuelle virtuelle 3DS-Konsolen-ID durch eine neue ersetzt. Deine aktuelle virtuelle 3DS-Konsolen-ID kann nicht wiederhergestellt werden. Dies kann unerwartete Auswirkungen auf Anwendungen haben. Dies kann fehlschlagen, wenn du eine veraltete Konfigurationsspeicherung verwendest. Fortfahren? - - - + + + Warning Warnung - + This will replace your current MAC address with a new one. It is not recommended to do this if you got the MAC address from your real console using the setup tool. Continue? Dadurch wird deine aktuelle MAC-Adresse durch eine neue ersetzt. Dies wird nicht empfohlen, wenn du die MAC-Adresse mithilfe des Setup-Tools von deiner echten Konsole erhalten hast. Fortfahren? - + This action will unlink your real console from Azahar, with the following consequences:<br><ul><li>Your OTP, SecureInfo and LocalFriendCodeSeed will be removed from Azahar.</li><li>Your friend list will reset and you will be logged out of your NNID/PNID account.</li><li>System files and eshop titles obtained through Azahar will become inaccessible until the same console is linked again (save data will not be lost).</li></ul><br>Continue? Dadurch wird die Verknüpfung zwischen Azahar und deiner echten Konsole getrennt, was folgendes bedeutet:<br><ul><li>Dein OTP, SecureInfo und LocalFriendCodeSeed werden von Azahar entfernt.</li><li>Deine Freundesliste wird zurückgesetzt und du wirst aus deinem NNID/PNID Account abgemeldet.</li><li>Systemdateien und eShop-Titel, die durch Azahar erhalten wurden, werden unzugänglich, bis die Konsole wieder verknüpft wird (Speicherdaten gehen nicht verloren).</li></ul><br>Forfahren? - + Invalid country for configured region Ungültiges Land für die eingestellte Region - + Invalid country for console unique data - Ungültiges Land für die einzigartigen Konsolendaten + Ungültiges Land für die konsolenspezifischen Daten - + Status: Loaded Status: Geladen - + Status: Loaded (Invalid Signature) Status: Geladen (Ungültige Signatur) - + Status: Loaded (Region Changed) Status: Geladen (Region geändert) - + Status: Not Found Status: Nicht gefunden - + Status: Invalid Status: Ungültig - + Status: IO Error Status: I/O-Fehler @@ -3773,13 +3785,13 @@ Ziehe Punkte, um ihre Position zu verändern, oder doppelklicke auf Zellen in de - Interface language: - Oberflächensprache + Interface Language + - Theme: - Design: + Theme + @@ -3788,8 +3800,8 @@ Ziehe Punkte, um ihre Position zu verändern, oder doppelklicke auf Zellen in de - Icon Size: - Icongröße: + Icon Size + @@ -3809,8 +3821,8 @@ Ziehe Punkte, um ihre Position zu verändern, oder doppelklicke auf Zellen in de - Row 1 Text: - Zeile 1-Text: + Row 1 Text + @@ -3844,18 +3856,18 @@ Ziehe Punkte, um ihre Position zu verändern, oder doppelklicke auf Zellen in de - Row 2 Text: - Zeile 2-Text: + Row 2 Text + - Hide Titles without Icon - Titel ohne Icon verbergen + Hide titles without icon + - Single Line Mode - Einzeiliger Modus + Single line mode + @@ -3864,8 +3876,8 @@ Ziehe Punkte, um ihre Position zu verändern, oder doppelklicke auf Zellen in de - Show Advanced Frame Time Info - Zeige detaillierte Frame-Zeit Info + Show advanced frame time info + @@ -3947,12 +3959,12 @@ Ziehe Punkte, um ihre Position zu verändern, oder doppelklicke auf Zellen in de DirectConnectWindow - + Connecting Verbindevorgang... - + Connect Verbunden @@ -4072,497 +4084,511 @@ Bitte überprüfe deine FFmpeg-Installation, die für die Kompilierung verwendet GMainWindow - + No Suitable Vulkan Devices Detected Keine geeigneten Vulkan-Geräte gefunden - + Vulkan initialization failed during boot.<br/>Your GPU may not support Vulkan 1.1, or you do not have the latest graphics driver. Vulkan-Initialisierung beim Starten fehlgeschlagen.<br/>Deine Grafikkarte unterstützt möglicherweise „Vulkan 1.1“ nicht, oder ist nicht auf dem aktuellsten Stand. - + Current Artic traffic speed. Higher values indicate bigger transfer loads. Aktuelle Artic Daten-Verkehrsgeschwindigkeit. Höhere Werte weisen auf größere Übertragungslasten hin. - - + + Current emulation speed. Values higher or lower than 100% indicate emulation is running faster or slower than a 3DS. Derzeitige Emulationsgeschwindigkeit. Werte höher oder niedriger als 100% zeigen, dass die Emulation schneller oder langsamer läuft als auf einem 3DS. - - + + How many frames per second the app is currently displaying. This will vary from app to app and scene to scene. Wie viele Bilder pro Sekunde die App aktuell anzeigt. Dies ist von App zu App und von Szene zu Szene unterschiedlich. - - + + Time taken to emulate a 3DS frame, not counting framelimiting or v-sync. For full-speed emulation this should be at most 16.67 ms. Die benötigte Zeit um ein 3DS-Einzelbild zu emulieren (V-Sync oder Bildratenbegrenzung nicht mitgezählt). Bei Echtzeitemulation sollte dieser Wert höchstens 16,67ms betragen. - + MicroProfile (unavailable) MicroProfile (Nicht verfügbar) - + Clear Recent Files Zuletzt verwendete Dateien zurücksetzen - + &Continue &Fortsetzen - + &Pause &Pause - + Azahar is running an application TRANSLATORS: This string is shown to the user to explain why Citra needs to prevent the computer from sleeping Azahar führt eine Anwendung aus - - + + Invalid App Format Falsches App Format - - + + Your app format is not supported.<br/>Please follow the guides to redump your <a href='https://web.archive.org/web/20240304210021/https://citra-emu.org/wiki/dumping-game-cartridges/'>game cartridges</a> or <a href='https://web.archive.org/web/20240304210011/https://citra-emu.org/wiki/dumping-installed-titles/'>installed titles</a>. Dein App-Format wird nicht unterstützt. <br/>Bitte folge den Anleitungen um deine <a href='https://web.archive.org/web/20240304210021/https://citra-emu.org/wiki/dumping-game-cartridges/'>Spielkarten</a> oder <a href='https://web.archive.org/web/20240304210011/https://citra-emu.org/wiki/dumping-installed-titles/'>installierten Titel</a> erneut zu dumpen. - + App Corrupted Anwendung beschädigt - + Your app is corrupted. <br/>Please follow the guides to redump your <a href='https://web.archive.org/web/20240304210021/https://citra-emu.org/wiki/dumping-game-cartridges/'>game cartridges</a> or <a href='https://web.archive.org/web/20240304210011/https://citra-emu.org/wiki/dumping-installed-titles/'>installed titles</a>. Deine App ist beschädigt. <br/>Folge bitte den Anleitungen um deine <a href='https://web.archive.org/web/20240304210021/https://citra-emu.org/wiki/dumping-game-cartridges/'>Spielkarten</a> oder <a href='https://web.archive.org/web/20240304210011/https://citra-emu.org/wiki/dumping-installed-titles/'>installierten Titel</a> erneut zu dumpen. - + App Encrypted Anwendung verschlüsselt - + Your app is encrypted. <br/><a href='https://azahar-emu.org/blog/game-loading-changes/'>Please check our blog for more info.</a> Deine App ist verschlüsselt. <br/><a href='https://azahar-emu.org/blog/game-loading-changes/'>Bitte lies unseren Blog für weitere Informationen.</a> - + Unsupported App Nicht unterstützte Anwendung - + GBA Virtual Console is not supported by Azahar. GBA Virtual Console wird nicht von Azahar unterstützt - - + + Artic Server Artic Server - + + Invalid system mode + + + + + New 3DS exclusive applications cannot be loaded without enabling the New 3DS mode. + + + + Error while loading App! Fehler beim Laden der Anwendung! - + An unknown error occurred. Please see the log for more details. Ein unbekannter Fehler ist aufgetreten. Mehr Details im Protokoll. - + CIA must be installed before usage CIA muss vor der Benutzung installiert sein - + Before using this CIA, you must install it. Do you want to install it now? Vor dem Nutzen dieser CIA muss sie installiert werden. Soll dies jetzt getan werden? - + Quick Load Schnellladen - + Quick Save Schnellspeichern - - + + Slot %1 Speicherplatz %1 - + %2 %3 %2 %3 - + Quick Save - %1 Schnellspeichern - %1 - + Quick Load - %1 Schnellladen - %1 - + Slot %1 - %2 %3 Speicherplatz %1 - %2 %3 - + Error Opening %1 Folder Fehler beim Öffnen des Ordners %1 - - + + Folder does not exist! Ordner existiert nicht! - + Remove Play Time Data Spielzeitdaten löschen - + Reset play time? Spielzeit zurücksetzen - - - - + + + + Create Shortcut Verknüpfung erstellen - + Do you want to launch the application in fullscreen? Möchtest du die Anwendung in Vollbild starten? - + Successfully created a shortcut to %1 Es wurde erfolgreich eine Verknüpfung für %1 erstellt - + This will create a shortcut to the current AppImage. This may not work well if you update. Continue? Dadurch wird eine Verknüpfung zum aktuellen AppImage erstellt. Dies funktioniert möglicherweise nicht mehr richtig, wenn du aktualisierst. Möchtest du fortfahren? - + Failed to create a shortcut to %1 Es konnte keine Verknüpfung für %1 erstellt werden - + Create Icon Icon erstellen - + Cannot create icon file. Path "%1" does not exist and cannot be created. Es konnte kein Icon-Pfad erstellt werden. „%1“ existiert nicht, oder kann nicht erstellt werden. - + Dumping... Dumpvorgang... - - + + Cancel Abbrechen - - - - - - - - - + + + + + + + + + Azahar Azahar - + Could not dump base RomFS. Refer to the log for details. Konnte Base-RomFS nicht dumpen. Schau im Protokoll für weitere Informationen nach. - + Error Opening %1 Fehler beim Öffnen von %1 - + Select Directory Verzeichnis auswählen - + Properties Eigenschaften - + The application properties could not be loaded. Die Anwendungseigenschaften konnten nicht geladen werden. - + 3DS Executable (%1);;All Files (*.*) %1 is an identifier for the 3DS executable file extensions. 3DS Programmdatei (%1);;Alle Dateien (*.*) - + Load File Datei laden - - + + Set Up System Files Systemdateien einrichten - + <p>Azahar needs console unique data and firmware files from a real console to be able to use some of its features.<br>Such files and data can be set up with the <a href=https://github.com/azahar-emu/ArticSetupTool>Azahar Artic Setup Tool</a><br>Notes:<ul><li><b>This operation will install console unique data to Azahar, do not share your user or nand folders<br>after performing the setup process!</b></li><li>While doing the setup process, Azahar will link to the console running the setup tool. You can unlink the<br>console later from the System tab in the emulator configuration menu.</li><li>Do not go online with both Azahar and your 3DS console at the same time after setting up system files,<br>as it could cause issues.</li><li>Old 3DS setup is needed for the New 3DS setup to work (doing both setup modes is recommended).</li><li>Both setup modes will work regardless of the model of the console running the setup tool.</li></ul><hr></p> <p>Azahar benötigt Konsolendaten und Firmware-Dateien von einer echten Konsole, um einige Funktionen nutzen zu können. <br>Du kannst solche Dateien mit dem <a href=https://github.com/azahar-emu/ArticSetupTool>Azahar Artic Einrichtungs-Tool</a> einrichten.<br>Hinweise:<ul><li><b>Bei diesem Vorgang werden konsolenspezifische Dateien in Azahar installiert. Gib deine Benutzer- oder NAND-Ordner nicht frei, <br>nachdem der Einrichtungsvorgang durchgeführt wurde!</b></li><li>Während des Einrichtungsvorgangs verknüpft Azahar deine Konsole mit dem Einrichtungstool. Du kannst die Verknüpfung <br>jederzeit im „Systemdateien“-Reiter in den Emulatoreinstellungen trennen.</li><li>Gehe nicht zeitgleich mit deinem eigenen 3DS und Azahar online, <br>da dies sonst zu Problemen führen könnte.</li><li>Damit die New 3DS-Einrichtung funktioniert, ist zuerst eine Old 3DS-Einrichtung erforderlich (Es wird empfohlen, beides einzurichten).</li><li>Beide Setup-Modi funktionieren unabhängig vom Modell der Konsole, auf dem das Setup-Tool ausgeführt wird.</li></ul><hr></p> - + Enter Azahar Artic Setup Tool address: Gib die Adresse des Azahar Artic Einrichtung-Tools ein: - + <br>Choose setup mode: <br>Wähle den Einrichtungsmodus: - + (ℹ️) Old 3DS setup (ℹ️) Old 3DS-Einrichtung - - + + Setup is possible. Einrichtung ist möglich. - + (⚠) New 3DS setup (⚠) New 3DS-Einrichtung - + Old 3DS setup is required first. Du musst zuerst die Old 3DS-Einrichtung abschließen. - + (✅) Old 3DS setup (✅) Old 3DS-Einrichtung - - + + Setup completed. Einrichtung abgeschlossen - + (ℹ️) New 3DS setup (ℹ️) New 3DS-Einrichtung - + (✅) New 3DS setup (✅) New 3DS-Einrichtung - + The system files for the selected mode are already set up. Reinstall the files anyway? Die Systemdateien für den ausgewählten Modus sind bereits eingerichtet. Die Dateien trotzdem neu installieren? - + Load Files Dateien laden - + 3DS Installation File (*.cia *.zcia) - - - + + + All Files (*.*) Alle Dateien (*.*) - + Connect to Artic Base Verbinde dich mit Artic-Base - + Enter Artic Base server address: Gib die Artic-Base-Serveradresse ein - + %1 has been installed successfully. %1 wurde erfolgreich installiert. - + Unable to open File Datei konnte nicht geöffnet werden - + Could not open %1 Konnte %1 nicht öffnen - + Installation aborted Installation abgebrochen - + The installation of %1 was aborted. Please see the log for more details Die Installation von %1 wurde abgebrochen. Schaue im Protokoll für weitere Informationen nach - + Invalid File Ungültige Datei - + %1 is not a valid CIA %1 ist keine gültige CIA - + CIA Encrypted CIA verschlüsselt - + Your CIA file is encrypted.<br/><a href='https://azahar-emu.org/blog/game-loading-changes/'>Please check our blog for more info.</a> Deine CIA Datei ist verschlüsselt. <br/><a href='https://azahar-emu.org/blog/game-loading-changes/'>Bitte lese unseren Blog für mehr Info.</a> - + Unable to find File Datei konnte nicht gefunden werden - + Could not find %1 %1 konnte nicht gefunden werden - - - - Error compressing file + + + + + Z3DS Compression - - File compress operation failed, check log for details. + + Failed to compress some files, check log for details. - - - - Error decompressing file + + Failed to decompress some files, check log for details. - - File decompress operation failed, check log for details. + + All files have been compressed successfully. - + + All files have been decompressed successfully. + + + + Uninstalling '%1'... '%1' wird deinstalliert… - + Failed to uninstall '%1'. Deinstallation von '%1' fehlgeschlagen. - + Successfully uninstalled '%1'. '%1' erfolgreich deinstalliert. - + File not found Datei nicht gefunden - + File "%1" not found Datei "%1" nicht gefunden - + Savestates Speicherstände - + Warning: Savestates are NOT a replacement for in-application saves, and are not meant to be reliable. Use at your own risk! @@ -4571,86 +4597,86 @@ Use at your own risk! Nutzung auf eigene Gefahr! - - - + + + Error opening amiibo data file Fehler beim Öffnen der Amiibo-Datei - + A tag is already in use. Eine Markierung wird schon genutzt. - + Application is not looking for amiibos. Die Anwendung sucht keine Amiibos. - + Amiibo File (%1);; All Files (*.*) Amiibo-Datei (%1);; Alle Dateien (*.*) - + Load Amiibo Amiibo wird geladen - + Unable to open amiibo file "%1" for reading. Die Amiibo-Datei "%1" konnte nicht zum Lesen geöffnet werden. - + Record Movie Aufnahme starten - + Movie recording cancelled. Aufnahme abgebrochen. - - + + Movie Saved Aufnahme gespeichert - - + + The movie is successfully saved. Die Aufnahme wurde erfolgreich gespeichert. - + Application will unpause Die Anwendung wird fortgesetzt - + The application will be unpaused, and the next frame will be captured. Is this okay? Die Anwendung wird fortgesetzt und das nächste Bild wird aufgenommen. Ist das okay? - + Invalid Screenshot Directory Ungültiges Bildschirmfoto-Verzeichnis - + Cannot create specified screenshot directory. Screenshot path is set back to its default value. Das angegebene Bildschirmfoto-Verzeichnis kann nicht erstellt werden. Der Bildschirmfotopfad wurde auf die Voreinstellung zurückgesetzt. - + Could not load video dumper Konnte Video-Dumper nicht laden - + FFmpeg could not be loaded. Make sure you have a compatible version installed. To install FFmpeg to Azahar, press Open and select your FFmpeg directory. @@ -4663,275 +4689,265 @@ Um FFmpeg in Azahar zu installieren, klicke auf „Offnen“ und wähle dein FFm Um eine Anleitung zur Installation von FFmpeg anzuzeigen, klicke auf „Hilfe“. - - Load 3DS ROM File + + Load 3DS ROM Files - - 3DS ROM Files (*.cia *cci *3dsx *cxi) + + 3DS ROM Files (*.cia *.cci *.3dsx *.cxi) - - The selected file is not a compatible 3DS ROM format. Make sure you have chosen the right file, and that it is not encrypted. - - - - - The selected file is already compressed. - - - - + 3DS Compressed ROM File (*.%1) - + Save 3DS Compressed ROM File - - Load 3DS Compressed ROM File + + Select Output 3DS Compressed ROM Folder - + + Load 3DS Compressed ROM Files + + + + 3DS Compressed ROM Files (*.zcia *zcci *z3dsx *zcxi) - - The selected file is not a compatible compressed 3DS ROM format. Make sure you have chosen the right file. - - - - - The selected file is already decompressed. - - - - + 3DS ROM File (*.%1) - + Save 3DS ROM File - + + Select Output 3DS ROM Folder + + + + Select FFmpeg Directory Wähle FFmpeg-Verzeichnis - + The provided FFmpeg directory is missing %1. Please make sure the correct directory was selected. Das angegebene FFmpeg-Verzeichnis fehlt %1. Bitte stelle sicher, dass du das richtige Verzeichnis ausgewählt hast. - + FFmpeg has been sucessfully installed. FFmpeg wurde erfolgreich installiert. - + Installation of FFmpeg failed. Check the log file for details. Installation von FFmpeg fehlgeschlagen. Prüfe die Protokolldatei für Details. - + Could not start video dumping.<br>Please ensure that the video encoder is configured correctly.<br>Refer to the log for details. Video-Dump konnte nicht gestartet werden.<br>Bitte überprüfe, ob der Video-Encoder richtig eingestellt ist.<br>Schau im Protokoll für weitere Informationen nach. - + Recording %1 %1 wird aufgenommen - + Playing %1 / %2 %1 / %2 wird abgespielt - + Movie Finished Aufnahme beendet - + (Accessing SharedExtData) (Zugriff auf SharedExtData) - + (Accessing SystemSaveData) (Zugriff auf SystemSaveData) - + (Accessing BossExtData) (Zugriff auf BossExtData) - + (Accessing ExtData) (Zugriff auf ExtData) - + (Accessing SaveData) (Zugriff auf SaveData) - + MB/s MB/s - + KB/s KB/s - + Artic Traffic: %1 %2%3 Artic Traffic: %1 %2%3 - + Speed: %1% Geschwindigkeit: %1% - + Speed: %1% / %2% Geschwindigkeit: %1% / %2% - + App: %1 FPS App: %1 FPS - + Frame: %1 ms (GPU: [CMD: %2 ms, SWP: %3 ms], IPC: %4 ms, SVC: %5 ms, Rem: %6 ms) Frame: %1 ms (GPU: [CMD: %2 ms, SWP: %3 ms], IPC: %4 ms, SVC: %5 ms, Rem: %6 ms) - + Frame: %1 ms Einzelbild: %1 ms - + VOLUME: MUTE LAUTSTÄRKE: STUMM - + VOLUME: %1% Volume percentage (e.g. 50%) LAUTSTÄRKE: %1% - + %1 is missing. Please <a href='https://web.archive.org/web/20240304201103/https://citra-emu.org/wiki/dumping-system-archives-and-the-shared-fonts-from-a-3ds-console/'>dump your system archives</a>.<br/>Continuing emulation may result in crashes and bugs. - + A system archive Ein Systemarchiv - + System Archive Not Found Systemarchiv nicht gefunden - + System Archive Missing Systemarchiv fehlt - + Save/load Error Speichern/Laden Fehler - + Fatal Error Schwerwiegender Fehler - + A fatal error occurred. <a href='https://web.archive.org/web/20240228001712/https://community.citra-emu.org/t/how-to-upload-the-log-file/296'>Check the log</a> for details.<br/>Continuing emulation may result in crashes and bugs. - + Fatal Error encountered Auf schwerwiegenden Fehler gestoßen - + Continue Fortsetzen - + Quit Application Beende die Anwendung - + OK O.K. - + Would you like to exit now? Möchtest du die Anwendung jetzt verlassen? - + The application is still running. Would you like to stop emulation? Die Anwendung läuft noch. Möchtest du die Emulation stoppen? - + Playback Completed Wiedergabe abgeschlossen - + Movie playback completed. Wiedergabe der Aufnahme abgeschlossen. - + Update Available Aktualisierung verfügbar - + Update %1 for Azahar is available. Would you like to download it? Für Azahar ist die Aktualisierung %1 verfügbar. Soll es heruntergeladen werden? - + Primary Window Hauptfenster - + Secondary Window Zweifenster @@ -5037,175 +5053,190 @@ Soll es heruntergeladen werden? GameList - + IMPORTANT: Encrypted files and .3ds files are no longer supported. Decrypting and/or renaming to .cci may be necessary. <a href='https://azahar-emu.org/blog/game-loading-changes/'>Learn more.</a> WICHTIG: Verschlüsselte Dateien und .3ds-Dateien werden nicht mehr unterstützt. Eine Entschlüsselung und/oder Umbenennung in .cci kann erforderlich sein. <a href='https://azahar-emu.org/blog/game-loading-changes/'>Erfahre mehr</a> - + Don't show again Nicht nochmal anzeigen - - + + Compatibility Kompatibilität - - + + Region Region - - + + File type Dateiart - - + + Size Größe - - + + Play time Spielzeit - + Favorite Favorit - + + Eject Cartridge + + + + + Insert Cartridge + + + + Open Öffnen - + Application Location Anwendungsspeicherort - + Save Data Location Speicherdatenstandort - + Extra Data Location Extradatenstandort - + Update Data Location Updatedaten-Verzeichnis - + DLC Data Location DLC-Verzeichnis - + Texture Dump Location Textur-Dump-Pfad - + Custom Texture Location Benutzerdefinierte-Texturen-Verzeichnis - + Mods Location Mod-Verzeichnis - + Dump RomFS RomFS dumpen - + Disk Shader Cache Shader-Cache - + Open Shader Cache Location Shader-Cache-Standort öffnen - + Delete OpenGL Shader Cache OpenGL-Shader-Cache löschen - + Uninstall Deinstallieren - + Everything Alles - + Application Anwendung - + Update Update - + DLC Zusatzinhalte - + Remove Play Time Data Spielzeitdaten entfernen - + Create Shortcut Verknüpfung erstellen - + Add to Desktop Zum Desktop hinzufügen - + Add to Applications Menu Zum Anwendungsmenü hinzufügen - + + Stress Test: App Launch + + + + Properties Eigenschaften - - - - + + + + Azahar Azahar - + Are you sure you want to completely uninstall '%1'? This will delete the application if installed, as well as any installed updates or DLC. @@ -5214,64 +5245,64 @@ This will delete the application if installed, as well as any installed updates Dadurch werden die Anwendung, sofern installiert, sowie alle installierten Updates oder DLCs gelöscht. - - + + %1 (Update) %1 (Update) - - + + %1 (DLC) %1 (Zusatzinhalt) - + Are you sure you want to uninstall '%1'? Bist du sicher, dass du '%1' deinstallieren möchtest? - + Are you sure you want to uninstall the update for '%1'? Bist du sicher, dass du das Update für '%1' deinstallieren möchtest? - + Are you sure you want to uninstall all DLC for '%1'? Bist du sicher, dass du die Zusatzinhalte für '%1' deinstallieren möchtest? - + Scan Subfolders Unterordner scannen - + Remove Application Directory Anwendungsverzeichnis entfernen - + Move Up Hoch bewegen - + Move Down Runter bewegen - + Open Directory Location Verzeichnispfad öffnen - + Clear Leeren - + Name Name @@ -5279,79 +5310,79 @@ Dadurch werden die Anwendung, sofern installiert, sowie alle installierten Updat GameListItemCompat - + Perfect Perfekt - + App functions flawless with no audio or graphical glitches, all tested functionality works as intended without any workarounds needed. Die App funktioniert einwandfrei, ohne Audio- oder Grafikfehler, alle getesteten Funktionen funktionieren wie vorgesehen, ohne jegliche Problemumgehungen. - + Great Gut - + App functions with minor graphical or audio glitches and is playable from start to finish. May require some workarounds. Die App funktioniert mit kleineren Grafik- oder Audiofehlern und ist von Anfang bis Ende spielbar. Möglicherweise sind Problemumgehungen erforderlich. - + Okay Okay - + App functions with major graphical or audio glitches, but app is playable from start to finish with workarounds. Die App funktioniert mit erheblichen Grafik- oder Audiofehlern, ist jedoch mit Problemumgehungen von Anfang bis Ende spielbar - + Bad Schlecht - + App functions, but with major graphical or audio glitches. Unable to progress in specific areas due to glitches even with workarounds. Die App funktioniert, weist jedoch erhebliche Grafik- oder Audiofehler auf. Aufgrund von Störungen ist es nicht möglich, in bestimmten Bereichen Fortschritte zu machen auch mit Workarounds. - + Intro/Menu Intro/Menü - + App is completely unplayable due to major graphical or audio glitches. Unable to progress past the Start Screen. Die App ist aufgrund erheblicher Grafik- oder Audiofehler völlig unspielbar. Es ist nicht möglich, über den Startbildschirm hinauszugehen. - + Won't Boot Startet nicht - + The app crashes when attempting to startup. Die Anwendung stürtzt beim Versuch zu starten ab - + Not Tested Nicht getestet - + The app has not yet been tested. Die Anwendung wurde noch nicht getestet @@ -5359,7 +5390,7 @@ Screen. GameListPlaceholder - + Double-click to add a new folder to the application list Klicke doppelt, um einen neuen Ordner zur Anwendungsliste hinzuzufügen @@ -5367,27 +5398,27 @@ Screen. GameListSearchField - + of von - + result Ergebnis - + results Ergebnisse - + Filter: Filter: - + Enter pattern to filter Gib Wörter zum Filtern ein @@ -5716,87 +5747,87 @@ Wenn nein, werden die aufgenommenen Daten verworfen. Cycle-Index: - + SRC1: %1, %2, %3, %4 SRC1: %1, %2, %3, %4 - + SRC2: %1, %2, %3, %4 SRC2: %1, %2, %3, %4 - + SRC3: %1, %2, %3, %4 SRC3: %1, %2, %3, %4 - + DEST_IN: %1, %2, %3, %4 DEST_IN: %1, %2, %3, %4 - + DEST_OUT: %1, %2, %3, %4 DEST_OUT: %1, %2, %3, %4 - + Address Registers: %1, %2 Adressenregister: %1, %2 - + Compare Result: %1, %2 Ergebnis vergleichen: %1, %2 - + Static Condition: %1 Statische Bedingung: %1 - + Dynamic Conditions: %1, %2 Dynamische Konditionen: %1, %2 - + Loop Parameters: %1 (repeats), %2 (initializer), %3 (increment), %4 Schleifenparameter: %1 (repeats), %2 (initializer), %3 (increment), %4 - + Instruction offset: 0x%1 Instruktionsverschiebung: 0x%1 - + -> 0x%2 -> 0x%2 - + (last instruction) (letzte Instruktion) @@ -6097,32 +6128,32 @@ Debug-Meldung: Passwort: - + Room Name Raumname - + Preferred Application Bevorzugte Anwendung - + Host Host - + Players Spieler - + Refreshing Neu Laden - + Refresh List Liste aktualisieren @@ -7125,32 +7156,32 @@ Vielleicht hat dieser Nutzer bereits den Raum verlassen. %1 (0x%2) - + Unsupported encrypted application Nicht unterstützte verschlüsselte Anwendung - + Invalid region Ungültige Region - + Installed Titles Installierte Titel - + System Titles System-Titel - + Add New Application Directory Füge ein neues Anwendungsverzeichnis hinzu - + Favorites Favoriten diff --git a/dist/languages/el.ts b/dist/languages/el.ts index 535612b86..a654c1e47 100644 --- a/dist/languages/el.ts +++ b/dist/languages/el.ts @@ -292,8 +292,8 @@ This would ban both their forum username and their IP address. - Emulation: - Εξομοίωση: + Emulation + Εξομοίωση @@ -397,6 +397,7 @@ This would ban both their forum username and their IP address. + Camera Κάμερα @@ -408,8 +409,8 @@ This would ban both their forum username and their IP address. - Camera to configure: - Κάμερα για διαμόρφωση: + Camera to Configure + @@ -429,8 +430,8 @@ This would ban both their forum username and their IP address. - Camera mode: - Τύπος κάμερας: + Camera mode + @@ -450,8 +451,8 @@ This would ban both their forum username and their IP address. - Camera position: - Θέση κάμερας: + Camera position + @@ -476,8 +477,8 @@ This would ban both their forum username and their IP address. - Camera Image Source: - Πηγή εικόνας κάμερας: + Camera Image Source + @@ -496,8 +497,8 @@ This would ban both their forum username and their IP address. - File: - Αρχείο: + File + @@ -510,11 +511,6 @@ This would ban both their forum username and their IP address. Select the system camera to use Επιλέξτε την κάμερα συστήματος προς χρήση - - - Camera: - Κάμερα: - <Default> @@ -528,8 +524,8 @@ This would ban both their forum username and their IP address. - Flip: - Αναστροφή: + Flip + @@ -1082,7 +1078,7 @@ Would you like to ignore the error and continue? - Reverse Side by Side + Side by Side Full Width @@ -1141,48 +1137,53 @@ Would you like to ignore the error and continue? - + + Swap Eyes + + + + Utility - + <html><head/><body><p>Replace textures with PNG files.</p><p>Textures are loaded from load/textures/[Title ID]/.</p></body></html> - - Use Custom Textures + + Use custom textures - + <html><head/><body><p>Dump textures to PNG files.</p><p>Textures are dumped to dump/textures/[Title ID]/.</p></body></html> - - Dump Textures + + Dump textures - + <html><head/><body><p>Load all custom textures into memory on boot, instead of loading them when the application requires them.</p></body></html> - - Preload Custom Textures + + Preload custom textures - + <html><head/><body><p>Load custom textures asynchronously with background threads to reduce loading stutter</p></body></html> - - Async Custom Texture Loading + + Async custom texture loading @@ -1240,13 +1241,13 @@ Would you like to ignore the error and continue? - Set emulation speed: + Set emulation speed - Emulation Speed: - Ταχύτητα εξομοίωσης: + Emulation Speed + @@ -1357,12 +1358,12 @@ Would you like to ignore the error and continue? - SPIR-V Shader Generation + SPIR-V shader generation - Disable GLSL -> SPIR-V Optimizer + Disable GLSL -> SPIR-V optimizer @@ -1382,8 +1383,8 @@ Would you like to ignore the error and continue? - Enable Hardware Shader - Ενεργοποίηση shader υλικού + Enable hardware shader + @@ -1392,8 +1393,8 @@ Would you like to ignore the error and continue? - Accurate Multiplication - Ακριβής πολλαπλασιασμός + Accurate multiplication + @@ -1402,8 +1403,8 @@ Would you like to ignore the error and continue? - Enable Shader JIT - Ενεργοποίηση Shader JIT + Enable shader JIT + @@ -1412,7 +1413,7 @@ Would you like to ignore the error and continue? - Enable Async Shader Compilation + Enable async shader compilation @@ -1422,7 +1423,7 @@ Would you like to ignore the error and continue? - Enable Async Presentation + Enable async presentation @@ -1462,8 +1463,8 @@ Would you like to ignore the error and continue? - Use Disk Shader Cache - Χρήση προσωρινής μνήμης shader δίσκου + Use disk shader cache + @@ -1487,7 +1488,7 @@ Would you like to ignore the error and continue? - Delay application render thread: + Delay Application Render Thread @@ -1976,12 +1977,12 @@ Would you like to ignore the error and continue? - Swap Screens - Εναλλαγή οθονών + Swap screens + - Rotate Screens Upright + Rotate screens upright @@ -2098,7 +2099,7 @@ Would you like to ignore the error and continue? - <html><head/><body><p>Bottom Screen Opacity % (OpenGL Only)</p></body></html> + <html><head/><body><p>Bottom Screen Opacity %</p></body></html> @@ -2446,8 +2447,8 @@ Would you like to ignore the error and continue? - Use Virtual SD - Χρήση εικονικής SD + Use virtual SD card + @@ -2456,7 +2457,7 @@ Would you like to ignore the error and continue? - Use Custom Storage + Use custom storage location @@ -2543,8 +2544,8 @@ online features (if installed) - Region: - + Region + Περιοχή @@ -2552,326 +2553,337 @@ online features (if installed) - + + Apply region free patch to +installed applications. + + + + + Patches the region of installed applications to be region free, so that they always appear on the home menu. + + + + Username Όνομα χρήστη - + Birthday Γενέθλια - + January Ιανουάριος - + February Φεβρουάριος - + March Μάρτιος - + April Απρίλιος - + May Μάιος - + June Ιούνιος - + July Ιούλιος - + August Αύγουστος - + September Σεπτέμβριος - + October Οκτώβριος - + November Νοέμβριος - + December Δεκέμβριος - + Language Γλώσσα - + Note: this can be overridden when region setting is auto-select Σημείωση: αυτό μπορεί να παρακαμφθεί όταν επιλέγεται αυτόματα η περιοχή - + Japanese (日本語) Ιαπωνικά (日本語) - + English Αγγλικά (English) - + French (français) Γαλλικά (français) - + German (Deutsch) Γερμανικά (Deutsch) - + Italian (italiano) Ιταλικά (italiano) - + Spanish (español) Ισπανικά (español) - + Simplified Chinese (简体中文) Απλοποιημένα Κινεζικά (简体中文) - + Korean (한국어) Κορεατικά (한국어) - + Dutch (Nederlands) Ολλανδικά (Nederlands) - + Portuguese (português) Πορτογαλικά (português) - + Russian (Русский) Ρωσικά (Русский) - + Traditional Chinese (正體中文) Παραδοσιακά Κινεζικά (正體中文) - + Sound output mode Λειτουργία εξόδου ήχου - + Mono Μονοφωνικό - + Stereo Στερεοφωνικό - + Surround Πολυκάναλο - + Country Χώρα - + Clock Ρολόι - + System Clock Ρολόι συστήματος - + Fixed Time Καθορισμένη ώρα - + Startup time Χρόνος εκκίνησης - + yyyy-MM-ddTHH:mm:ss yyyy-MM-ddTHH:mm:ss - + Offset time - + days - + HH:mm:ss - + Initial System Ticks - + Random - + Fixed - + Initial System Ticks Override - + Play Coins - + <html><head/><body><p>Number of steps per hour reported by the pedometer. Range from 0 to 65,535.</p></body></html> - + Pedometer Steps per Hour - + Run System Setup when Home Menu is launched - + Console ID: ID κονσόλας: - - + + Regenerate Επαναδημιουργία - + MAC: - - 3GX Plugin Loader: + + 3GX Plugin Loader - + Enable 3GX plugin loader - + Allow applications to change plugin loader state - + Real Console Unique Data - + Your real console is linked to Azahar. - + Unlink - + OTP - - - - + + + + Choose - + SecureInfo_A/B - + LocalFriendCodeSeed_A/B - + movable.sed - + System settings are available only when applications is not running. @@ -3581,76 +3593,76 @@ online features (if installed) - - + + Console ID: 0x%1 ID κονσόλας: 0x%1 - - + + MAC: %1 - + This will replace your current virtual 3DS console ID with a new one. Your current virtual 3DS console ID will not be recoverable. This might have unexpected effects in applications. This might fail if you use an outdated config save. Continue? - - - + + + Warning Προειδοποίηση - + This will replace your current MAC address with a new one. It is not recommended to do this if you got the MAC address from your real console using the setup tool. Continue? - + This action will unlink your real console from Azahar, with the following consequences:<br><ul><li>Your OTP, SecureInfo and LocalFriendCodeSeed will be removed from Azahar.</li><li>Your friend list will reset and you will be logged out of your NNID/PNID account.</li><li>System files and eshop titles obtained through Azahar will become inaccessible until the same console is linked again (save data will not be lost).</li></ul><br>Continue? - + Invalid country for configured region - + Invalid country for console unique data - + Status: Loaded - + Status: Loaded (Invalid Signature) - + Status: Loaded (Region Changed) - + Status: Not Found - + Status: Invalid - + Status: IO Error @@ -3766,13 +3778,13 @@ Drag points to change position, or double-click table cells to edit values. - Interface language: - Γλώσσα περιβάλλοντος: + Interface Language + - Theme: - Θέμα: + Theme + @@ -3781,8 +3793,8 @@ Drag points to change position, or double-click table cells to edit values. - Icon Size: - Μέγεθος εικονιδίων: + Icon Size + @@ -3802,8 +3814,8 @@ Drag points to change position, or double-click table cells to edit values. - Row 1 Text: - Κείμενο σειράς 1: + Row 1 Text + @@ -3837,18 +3849,18 @@ Drag points to change position, or double-click table cells to edit values. - Row 2 Text: - Κείμενο σειράς 2: + Row 2 Text + - Hide Titles without Icon - Απόκρυψη τίτλων χωρίς εικονίδιο + Hide titles without icon + - Single Line Mode - Λειτουργία ενιαίας γραμμής + Single line mode + @@ -3857,7 +3869,7 @@ Drag points to change position, or double-click table cells to edit values. - Show Advanced Frame Time Info + Show advanced frame time info @@ -3940,12 +3952,12 @@ Drag points to change position, or double-click table cells to edit values. DirectConnectWindow - + Connecting Σύνδεση - + Connect Σύνδεση @@ -4064,582 +4076,596 @@ Please check your FFmpeg installation used for compilation. GMainWindow - + No Suitable Vulkan Devices Detected - + Vulkan initialization failed during boot.<br/>Your GPU may not support Vulkan 1.1, or you do not have the latest graphics driver. - + Current Artic traffic speed. Higher values indicate bigger transfer loads. - - + + Current emulation speed. Values higher or lower than 100% indicate emulation is running faster or slower than a 3DS. Η ταχύτητα της προσομοίωσης. Ταχύτητες μεγαλύτερες ή μικρότερες από 100% δείχνουν ότι η προσομοίωση λειτουργεί γρηγορότερα ή πιο αργά από ένα 3DS αντίστοιχα. - - + + How many frames per second the app is currently displaying. This will vary from app to app and scene to scene. - - + + Time taken to emulate a 3DS frame, not counting framelimiting or v-sync. For full-speed emulation this should be at most 16.67 ms. Ο χρόνος που χρειάζεται για την εξομοίωση ενός καρέ 3DS, χωρίς να υπολογίζεται ο περιορισμός καρέ ή το v-sync. Για εξομοίωση σε πλήρη ταχύτητα, αυτό θα πρέπει να είναι το πολύ 16.67 ms. - + MicroProfile (unavailable) - + Clear Recent Files Απαλοιφή πρόσφατων αρχείων - + &Continue - + &Pause - + Azahar is running an application TRANSLATORS: This string is shown to the user to explain why Citra needs to prevent the computer from sleeping - - + + Invalid App Format - - + + Your app format is not supported.<br/>Please follow the guides to redump your <a href='https://web.archive.org/web/20240304210021/https://citra-emu.org/wiki/dumping-game-cartridges/'>game cartridges</a> or <a href='https://web.archive.org/web/20240304210011/https://citra-emu.org/wiki/dumping-installed-titles/'>installed titles</a>. - + App Corrupted - + Your app is corrupted. <br/>Please follow the guides to redump your <a href='https://web.archive.org/web/20240304210021/https://citra-emu.org/wiki/dumping-game-cartridges/'>game cartridges</a> or <a href='https://web.archive.org/web/20240304210011/https://citra-emu.org/wiki/dumping-installed-titles/'>installed titles</a>. - + App Encrypted - + Your app is encrypted. <br/><a href='https://azahar-emu.org/blog/game-loading-changes/'>Please check our blog for more info.</a> - + Unsupported App - + GBA Virtual Console is not supported by Azahar. - - + + Artic Server - + + Invalid system mode + + + + + New 3DS exclusive applications cannot be loaded without enabling the New 3DS mode. + + + + Error while loading App! - + An unknown error occurred. Please see the log for more details. Προέκυψε άγνωστο σφάλμα. Παρακαλώ δείτε το αρχείο καταγραφής για περισσότερες λεπτομέρειες. - + CIA must be installed before usage Το CIA πρέπει να εγκατασταθεί πριν από τη χρήση - + Before using this CIA, you must install it. Do you want to install it now? Πριν από τη χρήση αυτού του CIA, πρέπει να το εγκαταστήσετε. Θέλετε να το εγκαταστήσετε τώρα; - + Quick Load - + Quick Save Γρήγορη Αποθήκευση - - + + Slot %1 Θέση %1 - + %2 %3 - + Quick Save - %1 - + Quick Load - %1 - + Slot %1 - %2 %3 - + Error Opening %1 Folder Σφάλμα ανοίγματος %1 φακέλου - - + + Folder does not exist! Ο φάκελος δεν υπάρχει! - + Remove Play Time Data - + Reset play time? - - - - + + + + Create Shortcut - + Do you want to launch the application in fullscreen? - + Successfully created a shortcut to %1 - + This will create a shortcut to the current AppImage. This may not work well if you update. Continue? - + Failed to create a shortcut to %1 - + Create Icon Δημηουργία Εικονιδίου - + Cannot create icon file. Path "%1" does not exist and cannot be created. - + Dumping... Αποτύπωση... - - + + Cancel Ακύρωση - - - - - - - - - + + + + + + + + + Azahar - + Could not dump base RomFS. Refer to the log for details. Δεν ήταν δυνατή η αποτύπωση του βασικού RomFS. Ανατρέξτε στο αρχείο καταγραφής για λεπτομέρειες. - + Error Opening %1 Σφάλμα ανοίγματος του «%1» - + Select Directory Επιλογή καταλόγου - + Properties Ιδιότητες - + The application properties could not be loaded. - + 3DS Executable (%1);;All Files (*.*) %1 is an identifier for the 3DS executable file extensions. Εκτελέσιμο 3DS (%1);;Όλα τα αρχεία (*.*) - + Load File Φόρτωση αρχείου - - + + Set Up System Files - + <p>Azahar needs console unique data and firmware files from a real console to be able to use some of its features.<br>Such files and data can be set up with the <a href=https://github.com/azahar-emu/ArticSetupTool>Azahar Artic Setup Tool</a><br>Notes:<ul><li><b>This operation will install console unique data to Azahar, do not share your user or nand folders<br>after performing the setup process!</b></li><li>While doing the setup process, Azahar will link to the console running the setup tool. You can unlink the<br>console later from the System tab in the emulator configuration menu.</li><li>Do not go online with both Azahar and your 3DS console at the same time after setting up system files,<br>as it could cause issues.</li><li>Old 3DS setup is needed for the New 3DS setup to work (doing both setup modes is recommended).</li><li>Both setup modes will work regardless of the model of the console running the setup tool.</li></ul><hr></p> - + Enter Azahar Artic Setup Tool address: - + <br>Choose setup mode: - + (ℹ️) Old 3DS setup - - + + Setup is possible. - + (⚠) New 3DS setup - + Old 3DS setup is required first. - + (✅) Old 3DS setup - - + + Setup completed. - + (ℹ️) New 3DS setup - + (✅) New 3DS setup - + The system files for the selected mode are already set up. Reinstall the files anyway? - + Load Files Φόρτωση αρχείων - + 3DS Installation File (*.cia *.zcia) - - - + + + All Files (*.*) Όλα τα αρχεία (*.*) - + Connect to Artic Base - + Enter Artic Base server address: - + %1 has been installed successfully. Το «%1» εγκαταστάθηκε επιτυχώς. - + Unable to open File Δεν είναι δυνατό το άνοιγμα του αρχείου - + Could not open %1 Δεν ήταν δυνατό το άνοιγμα του «%1» - + Installation aborted Η εγκατάσταση ακυρώθηκε - + The installation of %1 was aborted. Please see the log for more details Η εγκατάσταση του «%1» ακυρώθηκε. Παρακαλώ δείτε το αρχείο καταγραφής για περισσότερες λεπτομέρειες - + Invalid File Μη έγκυρο αρχείο - + %1 is not a valid CIA Το «%1» δεν είναι έγκυρο CIA - + CIA Encrypted - + Your CIA file is encrypted.<br/><a href='https://azahar-emu.org/blog/game-loading-changes/'>Please check our blog for more info.</a> - + Unable to find File - + Could not find %1 - - - - Error compressing file + + + + + Z3DS Compression - - File compress operation failed, check log for details. + + Failed to compress some files, check log for details. - - - - Error decompressing file + + Failed to decompress some files, check log for details. - - File decompress operation failed, check log for details. + + All files have been compressed successfully. - + + All files have been decompressed successfully. + + + + Uninstalling '%1'... - + Failed to uninstall '%1'. - + Successfully uninstalled '%1'. - + File not found Το αρχείο δεν βρέθηκε - + File "%1" not found Το αρχείο «%1» δεν βρέθηκε - + Savestates - + Warning: Savestates are NOT a replacement for in-application saves, and are not meant to be reliable. Use at your own risk! - - - + + + Error opening amiibo data file - + A tag is already in use. - + Application is not looking for amiibos. - + Amiibo File (%1);; All Files (*.*) Αρχείο Amiibo (%1);; Όλα τα αρχεία (*.*) - + Load Amiibo Φόρτωση Amiibo - + Unable to open amiibo file "%1" for reading. - + Record Movie Εγγραφή βίντεο - + Movie recording cancelled. Η εγγραφή βίντεο ακυρώθηκε. - - + + Movie Saved Το βίντεο αποθηκεύτηκε - - + + The movie is successfully saved. Το βίντεο αποθηκεύτηκε επιτυχώς. - + Application will unpause - + The application will be unpaused, and the next frame will be captured. Is this okay? - + Invalid Screenshot Directory - + Cannot create specified screenshot directory. Screenshot path is set back to its default value. - + Could not load video dumper - + FFmpeg could not be loaded. Make sure you have a compatible version installed. To install FFmpeg to Azahar, press Open and select your FFmpeg directory. @@ -4648,274 +4674,264 @@ To view a guide on how to install FFmpeg, press Help. - - Load 3DS ROM File + + Load 3DS ROM Files - - 3DS ROM Files (*.cia *cci *3dsx *cxi) + + 3DS ROM Files (*.cia *.cci *.3dsx *.cxi) - - The selected file is not a compatible 3DS ROM format. Make sure you have chosen the right file, and that it is not encrypted. - - - - - The selected file is already compressed. - - - - + 3DS Compressed ROM File (*.%1) - + Save 3DS Compressed ROM File - - Load 3DS Compressed ROM File + + Select Output 3DS Compressed ROM Folder - + + Load 3DS Compressed ROM Files + + + + 3DS Compressed ROM Files (*.zcia *zcci *z3dsx *zcxi) - - The selected file is not a compatible compressed 3DS ROM format. Make sure you have chosen the right file. - - - - - The selected file is already decompressed. - - - - + 3DS ROM File (*.%1) - + Save 3DS ROM File - + + Select Output 3DS ROM Folder + + + + Select FFmpeg Directory - + The provided FFmpeg directory is missing %1. Please make sure the correct directory was selected. - + FFmpeg has been sucessfully installed. - + Installation of FFmpeg failed. Check the log file for details. - + Could not start video dumping.<br>Please ensure that the video encoder is configured correctly.<br>Refer to the log for details. - + Recording %1 Εγγραφή %1 - + Playing %1 / %2 Αναπαραγωγή %1 / %2 - + Movie Finished Το βίντεο τελείωσε - + (Accessing SharedExtData) - + (Accessing SystemSaveData) - + (Accessing BossExtData) - + (Accessing ExtData) - + (Accessing SaveData) - + MB/s - + KB/s - + Artic Traffic: %1 %2%3 - + Speed: %1% Ταχύτητα: %1% - + Speed: %1% / %2% Ταχύτητα: %1% / %2% - + App: %1 FPS - + Frame: %1 ms (GPU: [CMD: %2 ms, SWP: %3 ms], IPC: %4 ms, SVC: %5 ms, Rem: %6 ms) - + Frame: %1 ms Καρέ: %1 ms - + VOLUME: MUTE - + VOLUME: %1% Volume percentage (e.g. 50%) - + %1 is missing. Please <a href='https://web.archive.org/web/20240304201103/https://citra-emu.org/wiki/dumping-system-archives-and-the-shared-fonts-from-a-3ds-console/'>dump your system archives</a>.<br/>Continuing emulation may result in crashes and bugs. - + A system archive Ένα αρχείο συστήματος - + System Archive Not Found Δεν βρέθηκε αρχείο συστήματος - + System Archive Missing Απουσία αρχείου συστήματος - + Save/load Error Σφάλμα αποθήκευσης/φόρτωσης - + Fatal Error Κρίσιμο σφάλμα - + A fatal error occurred. <a href='https://web.archive.org/web/20240228001712/https://community.citra-emu.org/t/how-to-upload-the-log-file/296'>Check the log</a> for details.<br/>Continuing emulation may result in crashes and bugs. - + Fatal Error encountered Προέκυψε κρίσιμο σφάλμα - + Continue Συνέχεια - + Quit Application - + OK OK - + Would you like to exit now? Θέλετε να κλείσετε το πρόγραμμα τώρα; - + The application is still running. Would you like to stop emulation? - + Playback Completed Η αναπαραγωγή ολοκληρώθηκε - + Movie playback completed. Η αναπαραγωγή βίντεο ολοκληρώθηκε. - + Update Available - + Update %1 for Azahar is available. Would you like to download it? - + Primary Window - + Secondary Window @@ -5021,239 +5037,254 @@ Would you like to download it? GameList - + IMPORTANT: Encrypted files and .3ds files are no longer supported. Decrypting and/or renaming to .cci may be necessary. <a href='https://azahar-emu.org/blog/game-loading-changes/'>Learn more.</a> - + Don't show again - - + + Compatibility Συμβατότητα - - + + Region Περιοχή - - + + File type Τύπος αρχείου - - + + Size Μέγεθος - - + + Play time - + Favorite - + + Eject Cartridge + + + + + Insert Cartridge + + + + Open Άνοιγμα - + Application Location - + Save Data Location - + Extra Data Location - + Update Data Location - + DLC Data Location - + Texture Dump Location - + Custom Texture Location - + Mods Location - + Dump RomFS Αποτύπωση RomFS - + Disk Shader Cache - + Open Shader Cache Location - + Delete OpenGL Shader Cache - + Uninstall - + Everything - + Application - + Update - + DLC - + Remove Play Time Data - + Create Shortcut - + Add to Desktop - + Add to Applications Menu - + + Stress Test: App Launch + + + + Properties Ιδιότητες - - - - + + + + Azahar - + Are you sure you want to completely uninstall '%1'? This will delete the application if installed, as well as any installed updates or DLC. - - + + %1 (Update) - - + + %1 (DLC) - + Are you sure you want to uninstall '%1'? - + Are you sure you want to uninstall the update for '%1'? - + Are you sure you want to uninstall all DLC for '%1'? - + Scan Subfolders Σάρωση υποφακέλων - + Remove Application Directory - + Move Up - + Move Down - + Open Directory Location Άνοιγμα τοποθεσίας καταλόγου - + Clear Απαλοιφή - + Name Όνομα @@ -5261,77 +5292,77 @@ This will delete the application if installed, as well as any installed updates GameListItemCompat - + Perfect Τέλειο - + App functions flawless with no audio or graphical glitches, all tested functionality works as intended without any workarounds needed. - + Great Πολύ καλή - + App functions with minor graphical or audio glitches and is playable from start to finish. May require some workarounds. - + Okay Εντάξει - + App functions with major graphical or audio glitches, but app is playable from start to finish with workarounds. - + Bad Κακή - + App functions, but with major graphical or audio glitches. Unable to progress in specific areas due to glitches even with workarounds. - + Intro/Menu Εκκίνηση/Μενού - + App is completely unplayable due to major graphical or audio glitches. Unable to progress past the Start Screen. - + Won't Boot Δεν εκκινείται - + The app crashes when attempting to startup. - + Not Tested Δεν έχει δοκιμαστεί - + The app has not yet been tested. @@ -5339,7 +5370,7 @@ Screen. GameListPlaceholder - + Double-click to add a new folder to the application list @@ -5347,27 +5378,27 @@ Screen. GameListSearchField - + of από - + result αποτέλεσμα - + results αποτελέσματα - + Filter: Φίλτρο: - + Enter pattern to filter Εισαγάγετε μοτίβο για φιλτράρισμα @@ -5695,87 +5726,87 @@ Screen. Ευρετήριο κύκλου: - + SRC1: %1, %2, %3, %4 SRC1: %1, %2, %3, %4 - + SRC2: %1, %2, %3, %4 SRC2: %1, %2, %3, %4 - + SRC3: %1, %2, %3, %4 SRC3: %1, %2, %3, %4 - + DEST_IN: %1, %2, %3, %4 DEST_IN: %1, %2, %3, %4 - + DEST_OUT: %1, %2, %3, %4 DEST_OUT: %1, %2, %3, %4 - + Address Registers: %1, %2 Καταχωρητές διευθύνσεων: %1, %2 - + Compare Result: %1, %2 Σύγκριση αποτελέσματος: %1, %2 - + Static Condition: %1 Στατική συνθήκη: %1 - + Dynamic Conditions: %1, %2 Δυναμικές συνθήκες: %1, %2 - + Loop Parameters: %1 (repeats), %2 (initializer), %3 (increment), %4 Παράμετροι βρόχου: %1 (επαναλήψεις), %2 (αρχικοποίηση), %3 (αύξηση), %4 - + Instruction offset: 0x%1 Μετατόπιση οδηγιών: 0x%1 - + -> 0x%2 -> 0x%2 - + (last instruction) (τελευταία οδηγία) @@ -6075,32 +6106,32 @@ Debug Message: Κωδικός πρόσβασης: - + Room Name Όνομα δωματίου - + Preferred Application - + Host Διαχειριστής - + Players Παίκτες - + Refreshing Ανανέωση - + Refresh List Ανανέωση λίστας @@ -7099,32 +7130,32 @@ They may have left the room. - + Unsupported encrypted application - + Invalid region Μη έγκυρη περιοχή - + Installed Titles Εγκατεστημένοι τίτλοι - + System Titles Τίτλοι συστήματος - + Add New Application Directory - + Favorites diff --git a/dist/languages/es_ES.ts b/dist/languages/es_ES.ts index a8126d7c9..58c79ebbc 100644 --- a/dist/languages/es_ES.ts +++ b/dist/languages/es_ES.ts @@ -298,8 +298,8 @@ This would ban both their forum username and their IP address. - Emulation: - Emulación: + Emulation + Emulación @@ -403,6 +403,7 @@ This would ban both their forum username and their IP address. + Camera Cámara @@ -414,8 +415,8 @@ This would ban both their forum username and their IP address. - Camera to configure: - Configurar la cámara: + Camera to Configure + Configurar la cámara @@ -435,8 +436,8 @@ This would ban both their forum username and their IP address. - Camera mode: - Modo de cámara: + Camera mode + Modo de cámara @@ -456,8 +457,8 @@ This would ban both their forum username and their IP address. - Camera position: - Posición de cámara: + Camera position + Posición de cámara @@ -482,8 +483,8 @@ This would ban both their forum username and their IP address. - Camera Image Source: - Fuente de la Imagen de la Cámara: + Camera Image Source + Fuente de la Imagen de la Cámara @@ -502,8 +503,8 @@ This would ban both their forum username and their IP address. - File: - Archivo: + File + Archivo @@ -516,11 +517,6 @@ This would ban both their forum username and their IP address. Select the system camera to use Seleccione la cámara del sistema que será usada - - - Camera: - Cámara: - <Default> @@ -534,8 +530,8 @@ This would ban both their forum username and their IP address. - Flip: - Rotación: + Flip + Rotación @@ -1088,8 +1084,8 @@ Would you like to ignore the error and continue? - Reverse Side by Side - De lado a lado inverso + Side by Side Full Width + De lado a lado ancho completo @@ -1147,48 +1143,53 @@ Would you like to ignore the error and continue? <html><head/><body><p>Desactivar Dibujado de Ojo Derecho</p><p>Desactiva el dibujado de la imagen del ojo derecho cuando no se utiliza el modo estereoscópico. Mejora significativamente el rendimiento en algunos juegos, pero puede causar parpadeo en otros.</p></body></html> - + + Swap Eyes + Intercambiar Ojos + + + Utility Utilidad - + <html><head/><body><p>Replace textures with PNG files.</p><p>Textures are loaded from load/textures/[Title ID]/.</p></body></html> <html><head/><body><p>Cambia las texturas por archivos PNG.</p><p>Las texturas son cargadas desde load/textures/[Title ID]/.</p></body></html> - - Use Custom Textures + + Use custom textures Usar texturas personalizadas - + <html><head/><body><p>Dump textures to PNG files.</p><p>Textures are dumped to dump/textures/[Title ID]/.</p></body></html> <html><head/><body><p>Vuelca las texturas a archivos PNG.</p><p>Las texturas son volcadas a dump/textures/[Title ID]/.</p></body></html> - - Dump Textures + + Dump textures Volcar texturas - + <html><head/><body><p>Load all custom textures into memory on boot, instead of loading them when the application requires them.</p></body></html> <html><head/><body><p>Carga todas las texturas personalizadas en memoria al iniciar, en vez de cargarlas cuando la aplicación las necesite.</p></body></html> - - Preload Custom Textures + + Preload custom textures Precargar texturas personalizadas - + <html><head/><body><p>Load custom textures asynchronously with background threads to reduce loading stutter</p></body></html> <html><head/><body><p>Carga las texturas personalizadas de manera asíncrona con los hilos de fondo para reducir los parones de carga</p></body></html> - - Async Custom Texture Loading + + Async custom texture loading Carga de Texturas Personalizadas Asíncrona @@ -1246,13 +1247,13 @@ Would you like to ignore the error and continue? - Set emulation speed: - Establecer la velocidad de emulación: + Set emulation speed + Establecer la velocidad de emulación - Emulation Speed: - Velocidad de Emulación: + Emulation Speed + Velocidad de Emulación @@ -1363,13 +1364,13 @@ Would you like to ignore the error and continue? - SPIR-V Shader Generation + SPIR-V shader generation Generación de Sombreados SPIR-V - Disable GLSL -> SPIR-V Optimizer - Desactivar optimizador GLSL -> SPIR-V + Disable GLSL -> SPIR-V optimizer + Desactivar GLSL -> SPIR-V optimizador @@ -1388,7 +1389,7 @@ Would you like to ignore the error and continue? - Enable Hardware Shader + Enable hardware shader Activar Sombreador de Hardware @@ -1398,7 +1399,7 @@ Would you like to ignore the error and continue? - Accurate Multiplication + Accurate multiplication Multiplicación Precisa @@ -1408,7 +1409,7 @@ Would you like to ignore the error and continue? - Enable Shader JIT + Enable shader JIT Activar Sombreado JIT @@ -1418,7 +1419,7 @@ Would you like to ignore the error and continue? - Enable Async Shader Compilation + Enable async shader compilation Activar Compilación de Sombreados Asíncrona @@ -1428,7 +1429,7 @@ Would you like to ignore the error and continue? - Enable Async Presentation + Enable async presentation Activar Presentación Asíncrona @@ -1468,7 +1469,7 @@ Would you like to ignore the error and continue? - Use Disk Shader Cache + Use disk shader cache Usar Caché Almacenada de Sombreadores @@ -1493,7 +1494,7 @@ Would you like to ignore the error and continue? - Delay application render thread: + Delay Application Render Thread Demorar el hilo de ejecución de renderizado: @@ -1982,12 +1983,12 @@ Would you like to ignore the error and continue? - Swap Screens + Swap screens Intercambiar pantallas - Rotate Screens Upright + Rotate screens upright Rotar pantallas en vertical @@ -2104,8 +2105,8 @@ Would you like to ignore the error and continue? - <html><head/><body><p>Bottom Screen Opacity % (OpenGL Only)</p></body></html> - <html><head/><body><p>Porcentaje de Opacidad de la Pantalla Inferior (sólo OpenGL)</p></body></html> + <html><head/><body><p>Bottom Screen Opacity %</p></body></html> + <html><head/><body><p>Porcentaje de Opacidad de la Pantalla Inferior %</p></body></html> @@ -2452,8 +2453,8 @@ Would you like to ignore the error and continue? - Use Virtual SD - Usar SD Virtual + Use virtual SD card + Usar tarjeta SD Virtual @@ -2462,7 +2463,7 @@ Would you like to ignore the error and continue? - Use Custom Storage + Use custom storage location Usar almacenamiento personalizado @@ -2550,8 +2551,8 @@ las funciones en línea (si están instalados) - Region: - Región: + Region + Región @@ -2559,326 +2560,337 @@ las funciones en línea (si están instalados) Auto-elegir - + + Apply region free patch to +installed applications. + + + + + Patches the region of installed applications to be region free, so that they always appear on the home menu. + + + + Username Nombre - + Birthday Cumpleaños - + January Enero - + February Febrero - + March Marzo - + April Abril - + May Mayo - + June Junio - + July Julio - + August Agosto - + September Septiembre - + October Octubre - + November Noviembre - + December Diciembre - + Language Idioma - + Note: this can be overridden when region setting is auto-select Nota: puede ser sobreescrito cuando la región es auto-seleccionada - + Japanese (日本語) Japonés (日本語) - + English Inglés (English) - + French (français) Francés (français) - + German (Deutsch) Alemán (Deutsch) - + Italian (italiano) Italiano (italiano) - + Spanish (español) Español - + Simplified Chinese (简体中文) Chino Simplificado (简体中文) - + Korean (한국어) Coreano (한국어) - + Dutch (Nederlands) Neerlandés (Nederlands) - + Portuguese (português) Portugués (português) - + Russian (Русский) Ruso (Русский) - + Traditional Chinese (正體中文) Chino Tradicional (正體中文) - + Sound output mode Modo de salida del audio - + Mono Mono - + Stereo Estéreo - + Surround Envolvente - + Country País - + Clock Reloj - + System Clock Reloj del Sistema - + Fixed Time Tiempo Fijado - + Startup time Tiempo del Inicio - + yyyy-MM-ddTHH:mm:ss aaaa-mm-ddTHH:mm:ss - + Offset time Tiempo de compensación - + days días - + HH:mm:ss HH:mm:ss - + Initial System Ticks Ticks de Sistema Iniciales - + Random Aleatorias - + Fixed Fijadas - + Initial System Ticks Override Sobreescribir Ticks de Sistema Iniciales - + Play Coins Monedas de Juego - + <html><head/><body><p>Number of steps per hour reported by the pedometer. Range from 0 to 65,535.</p></body></html> <html><head/><body><p>Cantidad de pasos por hora determinadas por el podómetro. Van desde 0 a 65,535.</p></body></html> - + Pedometer Steps per Hour Pasos por hora del Podómetro - + Run System Setup when Home Menu is launched Ejecutar la Configuración de la consola cuando se ejecute el Menú Home - + Console ID: ID de Consola: - - + + Regenerate Regenerar - + MAC: Dirección MAC: - - 3GX Plugin Loader: - Cargador de complementos 3GX: + + 3GX Plugin Loader + Cargador de complementos 3GX - + Enable 3GX plugin loader Habilitar el cargador de complementos 3GX - + Allow applications to change plugin loader state Permitir que los juegos cambien el estado del cargador de plugins. - + Real Console Unique Data Datos únicos de la consola real - + Your real console is linked to Azahar. Tu consola real está enlazada a Azahar. - + Unlink Desenlazar - + OTP OTP - - - - + + + + Choose Elegir - + SecureInfo_A/B SecureInfo_A/B - + LocalFriendCodeSeed_A/B LocalFriendCodeSeed_A/B - + movable.sed movable.sed - + System settings are available only when applications is not running. La configuración del sistema solo está disponible cuando la aplicación no se está ejecutando. @@ -3588,76 +3600,76 @@ las funciones en línea (si están instalados) Archivo Sed (*.sed);;Todos los archivos (*.*) - - + + Console ID: 0x%1 ID de Consola: 0x%1 - - + + MAC: %1 Dirección MAC: %1 - + This will replace your current virtual 3DS console ID with a new one. Your current virtual 3DS console ID will not be recoverable. This might have unexpected effects in applications. This might fail if you use an outdated config save. Continue? Esto reemplazará tu ID de consola de 3DS virtual por una nueva. Tu ID actual será irrecuperable. Esto puede tener efectos inesperados en determinadas aplicaciones. Si usas un archivo de configuración obsoleto, esto podría fallar. ¿Desea continuar? - - - + + + Warning Advertencia - + This will replace your current MAC address with a new one. It is not recommended to do this if you got the MAC address from your real console using the setup tool. Continue? Esto reemplazará tu dirección MAC actual por una nueva. No se recomienda hacerlo si obtuviste la dirección MAC de tu consola real con la herramienta de configuración. ¿Continuar? - + This action will unlink your real console from Azahar, with the following consequences:<br><ul><li>Your OTP, SecureInfo and LocalFriendCodeSeed will be removed from Azahar.</li><li>Your friend list will reset and you will be logged out of your NNID/PNID account.</li><li>System files and eshop titles obtained through Azahar will become inaccessible until the same console is linked again (save data will not be lost).</li></ul><br>Continue? Esta acción desvinculará tu consola real de Azahar, con las siguientes consecuencias:<ul><li>OTP, SecureInfo y LocalFriendCodeSeed serán eliminados de Azahar.</li><li>Tu lista de amigos se restablecerá y se cerrará la sesión de tu cuenta NNID/PNID.</li><li>Los archivos del sistema y los títulos de la eshop obtenidos a través de Azahar se volverán inaccesibles hasta que la misma consola se vincule nuevamente mediante la herramienta de configuración (los datos guardados no se perderán).</li></ul><br>¿Continuar? - + Invalid country for configured region País incorrecto para la región configurada - + Invalid country for console unique data País incorrecto para los datos de consola únicos - + Status: Loaded Estado: Cargado - + Status: Loaded (Invalid Signature) Estado: Cargado (Firma Inválida) - + Status: Loaded (Region Changed) Estado: Cargado (Cambiado de Región) - + Status: Not Found Estado: No Encontrado - + Status: Invalid Estado: Inválido - + Status: IO Error Estado: Error E/S @@ -3773,13 +3785,13 @@ Mueve los puntos para cambiar la posición, o haz doble click en las celdas de l - Interface language: + Interface Language Idioma de la Interfaz - Theme: - Tema: + Theme + Tema @@ -3788,8 +3800,8 @@ Mueve los puntos para cambiar la posición, o haz doble click en las celdas de l - Icon Size: - Tamaño de Icono: + Icon Size + Tamaño de Icono @@ -3809,8 +3821,8 @@ Mueve los puntos para cambiar la posición, o haz doble click en las celdas de l - Row 1 Text: - Texto de Fila 1: + Row 1 Text + Texto de Fila 1 @@ -3844,17 +3856,17 @@ Mueve los puntos para cambiar la posición, o haz doble click en las celdas de l - Row 2 Text: - Texto de Fila 2: + Row 2 Text + Texto de Fila 2 - Hide Titles without Icon + Hide titles without icon Ocultar Títulos sin Icono - Single Line Mode + Single line mode Modo Una Línea @@ -3864,7 +3876,7 @@ Mueve los puntos para cambiar la posición, o haz doble click en las celdas de l - Show Advanced Frame Time Info + Show advanced frame time info Mostrar información de fotogramas avanzada @@ -3947,12 +3959,12 @@ Mueve los puntos para cambiar la posición, o haz doble click en las celdas de l DirectConnectWindow - + Connecting Conectando - + Connect Conectar @@ -4072,497 +4084,511 @@ Por favor, compruebe la instalación de FFmpeg usada para la compilación. GMainWindow - + No Suitable Vulkan Devices Detected Dispositivos compatibles con Vulkan no encontrados. - + Vulkan initialization failed during boot.<br/>Your GPU may not support Vulkan 1.1, or you do not have the latest graphics driver. El inicio de Vulkan falló durante el inicio.<br/>Tu GPU, o no soporta Vulkan 1.1, o no tiene los últimos drivers gráficos. - + Current Artic traffic speed. Higher values indicate bigger transfer loads. La velocidad de tráfico actual de Artic. Los valores altos indican una carga mayor de transferencia. - - + + Current emulation speed. Values higher or lower than 100% indicate emulation is running faster or slower than a 3DS. La velocidad de emulación actual. Valores mayores o menores de 100% indican que la velocidad de emulación funciona más rápida o lentamente que en una 3DS. - - + + How many frames per second the app is currently displaying. This will vary from app to app and scene to scene. Los fotogramas por segundo que está mostrando el juego. Variarán de aplicación en aplicación y de escena a escena. - - + + Time taken to emulate a 3DS frame, not counting framelimiting or v-sync. For full-speed emulation this should be at most 16.67 ms. El tiempo que lleva emular un fotograma de 3DS, sin tener en cuenta el limitador de fotogramas, ni la sincronización vertical. Para una emulación óptima, este valor no debe superar los 16.67 ms. - + MicroProfile (unavailable) MicroProfile (no disponible) - + Clear Recent Files Limpiar Archivos Recientes - + &Continue &Continuar - + &Pause &Pausar - + Azahar is running an application TRANSLATORS: This string is shown to the user to explain why Citra needs to prevent the computer from sleeping Azahar está ejecutando una aplicación - - + + Invalid App Format Formato de aplicación inválido - - + + Your app format is not supported.<br/>Please follow the guides to redump your <a href='https://web.archive.org/web/20240304210021/https://citra-emu.org/wiki/dumping-game-cartridges/'>game cartridges</a> or <a href='https://web.archive.org/web/20240304210011/https://citra-emu.org/wiki/dumping-installed-titles/'>installed titles</a>. Tu formato de aplicación no es válido.<br/>Por favor, sigue las instrucciones para volver a volcar tus <a href='https://web.archive.org/web/20240304210021/https://citra-emu.org/wiki/dumping-game-cartridges/'>cartucho de juego</a> y/o <a href='https://web.archive.org/web/20240304210011/https://citra-emu.org/wiki/dumping-installed-titles/'>títulos instalados</a>. - + App Corrupted Aplicación corrupta - + Your app is corrupted. <br/>Please follow the guides to redump your <a href='https://web.archive.org/web/20240304210021/https://citra-emu.org/wiki/dumping-game-cartridges/'>game cartridges</a> or <a href='https://web.archive.org/web/20240304210011/https://citra-emu.org/wiki/dumping-installed-titles/'>installed titles</a>. Tu aplicación está corrupta. <br/>Por favor, sigue las instrucciones para volver a volcar tus <a href='https://web.archive.org/web/20240304210021/https://citra-emu.org/wiki/dumping-game-cartridges/'>cartuchos de juego</a> y/o <a href='https://web.archive.org/web/20240304210011/https://citra-emu.org/wiki/dumping-installed-titles/'>títulos instalados</a>. - + App Encrypted Aplicación encriptada - + Your app is encrypted. <br/><a href='https://azahar-emu.org/blog/game-loading-changes/'>Please check our blog for more info.</a> Tu aplicación está encriptada. <br/><a href='https://azahar-emu.org/blog/game-loading-changes/'>Por favor visita nuestro blog para más información.</a> - + Unsupported App Aplicación no soportada - + GBA Virtual Console is not supported by Azahar. Consola Virtual de GBA no está soportada por Azahar. - - + + Artic Server Servidor Artic - + + Invalid system mode + Modo de sistema no válido + + + + New 3DS exclusive applications cannot be loaded without enabling the New 3DS mode. + + + + Error while loading App! ¡Error al cargar la aplicación! - + An unknown error occurred. Please see the log for more details. Un error desconocido ha ocurrido. Por favor, mira el log para más detalles. - + CIA must be installed before usage El CIA debe estar instalado antes de usarse - + Before using this CIA, you must install it. Do you want to install it now? Antes de usar este CIA, debes instalarlo. ¿Quieres instalarlo ahora? - + Quick Load Carga Rápida - + Quick Save Guardado Rápido - - + + Slot %1 Ranura %1 - + %2 %3 %2 %3 - + Quick Save - %1 Guardado Rápido - %1 - + Quick Load - %1 Carga Rápida - %1 - + Slot %1 - %2 %3 Ranura %1 - %2 %3 - + Error Opening %1 Folder Error al abrir la carpeta %1 - - + + Folder does not exist! ¡La carpeta no existe! - + Remove Play Time Data Quitar Datos de Tiempo de Juego - + Reset play time? ¿Reiniciar tiempo de juego? - - - - + + + + Create Shortcut Crear atajo - + Do you want to launch the application in fullscreen? ¿Desea lanzar esta aplicación en pantalla completa? - + Successfully created a shortcut to %1 Atajo a %1 creado con éxito - + This will create a shortcut to the current AppImage. This may not work well if you update. Continue? Ésto creará un atajo a la AppImage actual. Puede no funcionar bien si actualizas. ¿Continuar? - + Failed to create a shortcut to %1 Fallo al crear un atajo a %1 - + Create Icon Crear icono - + Cannot create icon file. Path "%1" does not exist and cannot be created. No se pudo crear un archivo de icono. La ruta "%1" no existe y no puede ser creada. - + Dumping... Volcando... - - + + Cancel Cancelar - - - - - - - - - + + + + + + + + + Azahar Azahar - + Could not dump base RomFS. Refer to the log for details. No se pudo volcar el RomFS base. Compruebe el registro para más detalles. - + Error Opening %1 Error al abrir %1 - + Select Directory Seleccionar directorio - + Properties Propiedades - + The application properties could not be loaded. No se pudieron cargar las propiedades de la aplicación. - + 3DS Executable (%1);;All Files (*.*) %1 is an identifier for the 3DS executable file extensions. Ejecutable 3DS(%1);;Todos los archivos(*.*) - + Load File Cargar Archivo - - + + Set Up System Files Configurar Archivos de Sistema - + <p>Azahar needs console unique data and firmware files from a real console to be able to use some of its features.<br>Such files and data can be set up with the <a href=https://github.com/azahar-emu/ArticSetupTool>Azahar Artic Setup Tool</a><br>Notes:<ul><li><b>This operation will install console unique data to Azahar, do not share your user or nand folders<br>after performing the setup process!</b></li><li>While doing the setup process, Azahar will link to the console running the setup tool. You can unlink the<br>console later from the System tab in the emulator configuration menu.</li><li>Do not go online with both Azahar and your 3DS console at the same time after setting up system files,<br>as it could cause issues.</li><li>Old 3DS setup is needed for the New 3DS setup to work (doing both setup modes is recommended).</li><li>Both setup modes will work regardless of the model of the console running the setup tool.</li></ul><hr></p> <p>Azahar necesita archivos de una consola real para poder utilizar algunas de sus funciones.<br>Puedes obtener los archivos con la <a href=https://github.com/azahar-emu/ArticSetupTool>herramienta de configuración Artic</a><br>Notas:<ul><li><b>Esta operación instalará archivos únicos de la consola en Azahar, ¡no compartas las carpetas de usuario ni nand<br>después de realizar el proceso de configuración!</b></li><li>Tras la configuración, Azahar se enlazará a la consola que ha ejecutado la herramienta de configuración. Puedes desvincular la<br>consola más tarde desde la pestaña "Archivos de sistema" del menú de opciones del emulador.</li><li>No te conectes en línea con Azahar y la consola 3DS al mismo tiempo después de configurar los archivos del sistema,<br>ya que esto podría causar problemas.</li><li>Se necesita la configuración de Old 3DS para que funcione la configuración de New 3DS (configurar ambos modos es recomendado).</li><li>Ambos modos de configuración funcionarán independientemente del modelo de la consola que ejecute la herramienta de configuración.</li></ul><hr></p> - + Enter Azahar Artic Setup Tool address: Introduce la dirección de la herramienta de configuración Artic - + <br>Choose setup mode: <br>Elige el modo de configuración: - + (ℹ️) Old 3DS setup (ℹ️) Configuración Old 3DS - - + + Setup is possible. La configuración es posible. - + (⚠) New 3DS setup (⚠) Configuración New 3DS - + Old 3DS setup is required first. La configuración Old 3DS es necesaria primero. - + (✅) Old 3DS setup (✅) Configuración Old 3DS - - + + Setup completed. Configuración completa. - + (ℹ️) New 3DS setup (ℹ️) Configuración New 3DS - + (✅) New 3DS setup (✅) Configuración New 3DS - + The system files for the selected mode are already set up. Reinstall the files anyway? Los archivos de sistema para el modo seleccionado ya están configurados. ¿Desea reinstalar los archivos de todas formas? - + Load Files Cargar archivos - + 3DS Installation File (*.cia *.zcia) Archivo de Instalación de 3DS (*.cia *.zcia) - - - + + + All Files (*.*) Todos los archivos (*.*) - + Connect to Artic Base Conectar a Artic Base - + Enter Artic Base server address: Introduce la dirección del servidor Artic Base - + %1 has been installed successfully. %1 ha sido instalado con éxito. - + Unable to open File No se pudo abrir el Archivo - + Could not open %1 No se pudo abrir %1 - + Installation aborted Instalación interrumpida - + The installation of %1 was aborted. Please see the log for more details La instalación de %1 ha sido cancelada. Por favor, consulte los registros para más información. - + Invalid File Archivo no válido - + %1 is not a valid CIA %1 no es un archivo CIA válido - + CIA Encrypted CIA encriptado - + Your CIA file is encrypted.<br/><a href='https://azahar-emu.org/blog/game-loading-changes/'>Please check our blog for more info.</a> Tu archivo CIA está encriptado. <br/><a href='https://azahar-emu.org/blog/game-loading-changes/'>Por favor visita nuestro blog para más información.</a> - + Unable to find File No puede encontrar el archivo - + Could not find %1 No se pudo encontrar %1 - - - - Error compressing file - Error al comprimir el archivo + + + + + Z3DS Compression + Compresión Z3DS - - File compress operation failed, check log for details. - Operación de compresión fallida, mira el registro para más detalles. + + Failed to compress some files, check log for details. + No se pudieron comprimir algunos archivos, mira el registro para más detalles. - - - - Error decompressing file - Error de descompresión de archivo + + Failed to decompress some files, check log for details. + No se pudieron descomprimir algunos archivos, mira el registro para más detalles. - - File decompress operation failed, check log for details. - Operación de descompresión fallida, mira el registro para más detalles. + + All files have been compressed successfully. + Todos los archivos ya comprimido con éxtio. - + + All files have been decompressed successfully. + Todos los archivos ya descompresión con éxtio. + + + Uninstalling '%1'... Desinstalando '%1'... - + Failed to uninstall '%1'. Falló la desinstalación de '%1'. - + Successfully uninstalled '%1'. '%1' desinstalado con éxito. - + File not found Archivo no encontrado - + File "%1" not found Archivo "%1" no encontrado - + Savestates Estados - + Warning: Savestates are NOT a replacement for in-application saves, and are not meant to be reliable. Use at your own risk! @@ -4571,86 +4597,86 @@ Use at your own risk! ¡Úsalos bajo tu propio riesgo! - - - + + + Error opening amiibo data file Error al abrir los archivos de datos del Amiibo - + A tag is already in use. Ya está en uso una etiqueta. - + Application is not looking for amiibos. La aplicación no está buscando amiibos. - + Amiibo File (%1);; All Files (*.*) Archivo de Amiibo(%1);; Todos los archivos (*.*) - + Load Amiibo Cargar Amiibo - + Unable to open amiibo file "%1" for reading. No se pudo abrir el archivo del amiibo "%1" para su lectura. - + Record Movie Grabar Película - + Movie recording cancelled. Grabación de película cancelada. - - + + Movie Saved Película Guardada - - + + The movie is successfully saved. Película guardada con éxito. - + Application will unpause La aplicación se despausará - + The application will be unpaused, and the next frame will be captured. Is this okay? La aplicación se despausará, y el siguiente fotograma será capturado. ¿Estás de acuerdo? - + Invalid Screenshot Directory Directorio de capturas de pantalla no válido - + Cannot create specified screenshot directory. Screenshot path is set back to its default value. No se puede crear el directorio de capturas de pantalla. La ruta de capturas de pantalla vuelve a su valor por defecto. - + Could not load video dumper No se pudo cargar el volcador de vídeo - + FFmpeg could not be loaded. Make sure you have a compatible version installed. To install FFmpeg to Azahar, press Open and select your FFmpeg directory. @@ -4663,275 +4689,265 @@ Para instalar FFmpeg en Azahar, pulsa Abrir y elige el directorio de FFmpeg. Para ver una guía sobre cómo instalar FFmpeg, pulsa Ayuda. - - Load 3DS ROM File + + Load 3DS ROM Files Cargar ROM de 3DS - - 3DS ROM Files (*.cia *cci *3dsx *cxi) - Archivos ROM 3DS (*.cia *cci *3dsx *cxi) + + 3DS ROM Files (*.cia *.cci *.3dsx *.cxi) + Archivos ROM 3DS (*.cia *.cci *.3dsx *.cxi) - - The selected file is not a compatible 3DS ROM format. Make sure you have chosen the right file, and that it is not encrypted. - El archivo seleccionado no es un ROM de 3DS compatible. Asegúrate de que has elegido el archivo correcto y que no esté cifrado. - - - - The selected file is already compressed. - El archivo seleccionado ya está comprimido. - - - + 3DS Compressed ROM File (*.%1) Archivo ROM 3DS comprimido (*.%1) - + Save 3DS Compressed ROM File Guardar archivo 3DS comprimido - - Load 3DS Compressed ROM File + + Select Output 3DS Compressed ROM Folder + Seleccione la carpeta de salida comprimida del ROM 3DS + + + + Load 3DS Compressed ROM Files Cargar archivo 3DS comprimido - + 3DS Compressed ROM Files (*.zcia *zcci *z3dsx *zcxi) Archivo ROM 3DS comprimido (*.zcia *zcci *z3dsx *zcxi) - - The selected file is not a compatible compressed 3DS ROM format. Make sure you have chosen the right file. - El archivo seleccionado no es un formato de ROM 3DS comprimido compatible. Asegúrese de haber elegido el archivo correcto. - - - - The selected file is already decompressed. - El archivo seleccionado ya está descomprimido. - - - + 3DS ROM File (*.%1) Archivo ROM 3DS (*.%1) - + Save 3DS ROM File Guardar archivo ROM 3DS - + + Select Output 3DS ROM Folder + Seleccione la carpeta de salida del ROM 3DS + + + Select FFmpeg Directory Seleccionar Directorio FFmpeg - + The provided FFmpeg directory is missing %1. Please make sure the correct directory was selected. Al directorio de FFmpeg indicado le falta %1. Por favor, asegúrese de haber seleccionado el directorio correcto. - + FFmpeg has been sucessfully installed. FFmpeg ha sido instalado con éxito. - + Installation of FFmpeg failed. Check the log file for details. La instalación de FFmpeg ha fallado. Compruebe el archivo del registro para más detalles. - + Could not start video dumping.<br>Please ensure that the video encoder is configured correctly.<br>Refer to the log for details. No se pudo empezar a grabar vídeo.<br>Asegúrese de que el encodeador de vídeo está configurado correctamente.<br>Para más detalles, observe el registro. - + Recording %1 Grabando %1 - + Playing %1 / %2 Reproduciendo %1 / %2 - + Movie Finished Película terminada - + (Accessing SharedExtData) (Accediendo al SharedExtData) - + (Accessing SystemSaveData) (Accediendo al SystemSaveData) - + (Accessing BossExtData) (Accediendo al BossExtData) - + (Accessing ExtData) (Accediendo al ExtData) - + (Accessing SaveData) (Accediendo al SaveData) - + MB/s MB/s - + KB/s KB/s - + Artic Traffic: %1 %2%3 Tráfico Artic: %1 %2%3 - + Speed: %1% Velocidad: %1% - + Speed: %1% / %2% Velocidad: %1% / %2% - + App: %1 FPS App: %1 FPS - + Frame: %1 ms (GPU: [CMD: %2 ms, SWP: %3 ms], IPC: %4 ms, SVC: %5 ms, Rem: %6 ms) Frame: %1 ms (GPU: [CMD: %2 ms, SWP: %3 ms], IPC: %4 ms, SVC: %5 ms, Rem: %6 ms) - + Frame: %1 ms Frame: %1 ms - + VOLUME: MUTE VOLUMEN: SILENCIO - + VOLUME: %1% Volume percentage (e.g. 50%) VOLUMEN: %1% - + %1 is missing. Please <a href='https://web.archive.org/web/20240304201103/https://citra-emu.org/wiki/dumping-system-archives-and-the-shared-fonts-from-a-3ds-console/'>dump your system archives</a>.<br/>Continuing emulation may result in crashes and bugs. Falta %1. Por favor,<a href='https://web.archive.org/web/20240304201103/https://citra-emu.org/wiki/dumping-system-archives-and-the-shared-fonts-from-a-3ds-console/'>vuelca tus archivos de sistema</a>.<br/>Continuar la emulación puede resultar en cuelgues y errores. - + A system archive Un archivo de sistema - + System Archive Not Found Archivo de Sistema no encontrado - + System Archive Missing Falta un Archivo de Sistema - + Save/load Error Error de guardado/carga - + Fatal Error Error Fatal - + A fatal error occurred. <a href='https://web.archive.org/web/20240228001712/https://community.citra-emu.org/t/how-to-upload-the-log-file/296'>Check the log</a> for details.<br/>Continuing emulation may result in crashes and bugs. Ha ocurrido un error fatal.<a href='https://web.archive.org/web/20240228001712/https://community.citra-emu.org/t/how-to-upload-the-log-file/296'>Mira el log</a>para más detalles.<br/>Continuar la emulación puede resultar en cuelgues y errores. - + Fatal Error encountered Error Fatal encontrado - + Continue Continuar - + Quit Application Cerrar aplicación - + OK Aceptar - + Would you like to exit now? ¿Quiere salir ahora? - + The application is still running. Would you like to stop emulation? La aplicación sigue en ejecución. ¿Quiere parar la emulación? - + Playback Completed Reproducción Completada - + Movie playback completed. Reproducción de película completada. - + Update Available Actualización disponible - + Update %1 for Azahar is available. Would you like to download it? La actualización %1 de Azahar está disponible. ¿Quieres descargarla? - + Primary Window Ventana Primaria - + Secondary Window Ventana Secundaria @@ -5037,175 +5053,190 @@ Would you like to download it? GameList - + IMPORTANT: Encrypted files and .3ds files are no longer supported. Decrypting and/or renaming to .cci may be necessary. <a href='https://azahar-emu.org/blog/game-loading-changes/'>Learn more.</a> IMPORTANTE: Los archivos cifrados y .3ds ya no son compatibles. Puede que sea necesario descifrarlos o renombrarlos a .cci. <a href='https://azahar-emu.org/blog/game-loading-changes/'>Más Información</a> - + Don't show again No volver a mostrar - - + + Compatibility Compatibilidad - - + + Region Región - - + + File type Tipo de Archivo - - + + Size Tamaño - - + + Play time Tiempo de juego - + Favorite Favorito - + + Eject Cartridge + Expulsar Cartucho + + + + Insert Cartridge + Insertar Cartucho + + + Open Abrir - + Application Location Localización de aplicaciones - + Save Data Location Localización de datos de guardado - + Extra Data Location Localización de Datos Extra - + Update Data Location Localización de datos de actualización - + DLC Data Location Localización de datos de DLC - + Texture Dump Location Localización del volcado de texturas - + Custom Texture Location Localización de las texturas personalizadas - + Mods Location Localización de los mods - + Dump RomFS Volcar RomFS - + Disk Shader Cache Caché de sombreador de disco - + Open Shader Cache Location Abrir ubicación de caché de sombreador - + Delete OpenGL Shader Cache Eliminar caché de sombreado de OpenGL - + Uninstall Desinstalar - + Everything Todo - + Application Aplicación - + Update Actualización - + DLC DLC - + Remove Play Time Data Quitar Datos de Tiempo de Juego - + Create Shortcut Crear atajo - + Add to Desktop Añadir al Escritorio - + Add to Applications Menu Añadir al Menú Aplicación - + + Stress Test: App Launch + Prueba de estrés: lanzamiento de la aplicación + + + Properties Propiedades - - - - + + + + Azahar Azahar - + Are you sure you want to completely uninstall '%1'? This will delete the application if installed, as well as any installed updates or DLC. @@ -5214,64 +5245,64 @@ This will delete the application if installed, as well as any installed updates Ésto eliminará la aplicación si está instalada, así como también las actualizaciones y DLC instaladas. - - + + %1 (Update) %1 (Actualización) - - + + %1 (DLC) %1 (DLC) - + Are you sure you want to uninstall '%1'? ¿Estás seguro de querer desinstalar '%1'? - + Are you sure you want to uninstall the update for '%1'? ¿Estás seguro de querer desinstalar la actualización de '%1'? - + Are you sure you want to uninstall all DLC for '%1'? ¿Estás seguro de querer desinstalar todo el DLC de '%1'? - + Scan Subfolders Escanear subdirectorios - + Remove Application Directory Quitar carpeta de aplicaciones - + Move Up Mover arriba - + Move Down Mover abajo - + Open Directory Location Abrir ubicación del directorio - + Clear Reiniciar - + Name Nombre @@ -5279,77 +5310,77 @@ This will delete the application if installed, as well as any installed updates GameListItemCompat - + Perfect Perfecto - + App functions flawless with no audio or graphical glitches, all tested functionality works as intended without any workarounds needed. La aplicación funciona sin errores gráficos o de audio. Todas las funciones probadas funcionan según lo previso sin necesidad de soluciones alternativas. - + Great Excelente - + App functions with minor graphical or audio glitches and is playable from start to finish. May require some workarounds. La aplicación funciona con pequeños errores gráficos o de audio y es jugable de principio a fin. Puede necesitar soluciones alternativas. - + Okay Bien - + App functions with major graphical or audio glitches, but app is playable from start to finish with workarounds. La aplicación funciona con grandes errores gráficos o de audio, pero es jugable de principio a fin con soluciones alternativas. - + Bad Mal - + App functions, but with major graphical or audio glitches. Unable to progress in specific areas due to glitches even with workarounds. La aplicación funciona, pero con grandes errores gráficos o de audio. No es posible continuar tras ciertos puntos debido a errores, incluso con soluciones alternativas. - + Intro/Menu Intro/Menú - + App is completely unplayable due to major graphical or audio glitches. Unable to progress past the Start Screen. La aplicación es completamente inutilizable debido a grandes errores gráficos o de audio. No es posible continuar tras la pantalla de título. - + Won't Boot No inicia - + The app crashes when attempting to startup. La aplicación se cae cuando se intenta iniciar. - + Not Tested Sin probar - + The app has not yet been tested. La aplicación no ha sido probada. @@ -5357,7 +5388,7 @@ Screen. GameListPlaceholder - + Double-click to add a new folder to the application list Haz doble click para añadir una nueva carpeta a la lista de aplicaciones @@ -5365,27 +5396,27 @@ Screen. GameListSearchField - + of de - + result resultado - + results resultados - + Filter: Filtro: - + Enter pattern to filter Introduzca un patrón para filtrar @@ -5713,87 +5744,87 @@ Screen. Índice de Ciclo: - + SRC1: %1, %2, %3, %4 SRC1: %1, %2, %3, %4 - + SRC2: %1, %2, %3, %4 SRC2: %1, %2, %3, %4 - + SRC3: %1, %2, %3, %4 SRC3: %1, %2, %3, %4 - + DEST_IN: %1, %2, %3, %4 DEST_IN: %1, %2, %3, %4 - + DEST_OUT: %1, %2, %3, %4 DEST_OUT: %1, %2, %3, %4 - + Address Registers: %1, %2 Registros de Dirección: %1, %2 - + Compare Result: %1, %2 Comparar Resultados: %1, %2 - + Static Condition: %1 Condición Estática: %1 - + Dynamic Conditions: %1, %2 Condiciones Dinámicas: %1, %2 - + Loop Parameters: %1 (repeats), %2 (initializer), %3 (increment), %4 Parámetros de Bucle: %1 (repeticiones), %2 (inicializador), %3 (incremental), %4 - + Instruction offset: 0x%1 Instrucción offset: 0x%1 - + -> 0x%2 -> 0x%2 - + (last instruction) (última instrucción) @@ -6094,32 +6125,32 @@ Mensaje de depuración: Contraseña: - + Room Name Nombre de Sala - + Preferred Application Aplicación preferida - + Host Host - + Players Jugadores - + Refreshing Actualizando - + Refresh List Actualizar Lista @@ -7121,32 +7152,32 @@ Puede que haya dejado la sala. %1 (0x%2) - + Unsupported encrypted application Aplicación encriptada no soportada - + Invalid region Región no válida - + Installed Titles Títulos Instalados - + System Titles Títulos de Sistema - + Add New Application Directory Agregar nueva carpeta de aplicaciones - + Favorites Favoritos diff --git a/dist/languages/fi.ts b/dist/languages/fi.ts index bfb6784e1..dcb76676e 100644 --- a/dist/languages/fi.ts +++ b/dist/languages/fi.ts @@ -292,8 +292,8 @@ Tämä antaa porttikiellon heidän käyttäjänimelleen ja IP-osoitteelleen. - Emulation: - Emulaatio: + Emulation + Emulaatio @@ -397,6 +397,7 @@ Tämä antaa porttikiellon heidän käyttäjänimelleen ja IP-osoitteelleen. + Camera Kamera @@ -408,8 +409,8 @@ Tämä antaa porttikiellon heidän käyttäjänimelleen ja IP-osoitteelleen. - Camera to configure: - Kamera jota määritellään: + Camera to Configure + @@ -429,8 +430,8 @@ Tämä antaa porttikiellon heidän käyttäjänimelleen ja IP-osoitteelleen. - Camera mode: - Kameratila: + Camera mode + @@ -450,8 +451,8 @@ Tämä antaa porttikiellon heidän käyttäjänimelleen ja IP-osoitteelleen. - Camera position: - Kameran sijainti: + Camera position + @@ -476,8 +477,8 @@ Tämä antaa porttikiellon heidän käyttäjänimelleen ja IP-osoitteelleen. - Camera Image Source: - Kameran kuvalähde: + Camera Image Source + @@ -496,8 +497,8 @@ Tämä antaa porttikiellon heidän käyttäjänimelleen ja IP-osoitteelleen. - File: - Tiedosto: + File + @@ -510,11 +511,6 @@ Tämä antaa porttikiellon heidän käyttäjänimelleen ja IP-osoitteelleen.Select the system camera to use Valitse laitteen kamera, jota käytetään - - - Camera: - Kamera: - <Default> @@ -528,8 +524,8 @@ Tämä antaa porttikiellon heidän käyttäjänimelleen ja IP-osoitteelleen. - Flip: - Kääntö: + Flip + @@ -1081,7 +1077,7 @@ Would you like to ignore the error and continue? - Reverse Side by Side + Side by Side Full Width @@ -1140,48 +1136,53 @@ Would you like to ignore the error and continue? - + + Swap Eyes + + + + Utility - + <html><head/><body><p>Replace textures with PNG files.</p><p>Textures are loaded from load/textures/[Title ID]/.</p></body></html> - - Use Custom Textures + + Use custom textures - + <html><head/><body><p>Dump textures to PNG files.</p><p>Textures are dumped to dump/textures/[Title ID]/.</p></body></html> - - Dump Textures + + Dump textures - + <html><head/><body><p>Load all custom textures into memory on boot, instead of loading them when the application requires them.</p></body></html> - - Preload Custom Textures + + Preload custom textures - + <html><head/><body><p>Load custom textures asynchronously with background threads to reduce loading stutter</p></body></html> - - Async Custom Texture Loading + + Async custom texture loading @@ -1239,12 +1240,12 @@ Would you like to ignore the error and continue? - Set emulation speed: + Set emulation speed - Emulation Speed: + Emulation Speed @@ -1356,12 +1357,12 @@ Would you like to ignore the error and continue? - SPIR-V Shader Generation + SPIR-V shader generation - Disable GLSL -> SPIR-V Optimizer + Disable GLSL -> SPIR-V optimizer @@ -1381,8 +1382,8 @@ Would you like to ignore the error and continue? - Enable Hardware Shader - Aktivoi Laitteistovarjostin + Enable hardware shader + @@ -1391,8 +1392,8 @@ Would you like to ignore the error and continue? - Accurate Multiplication - Tarkka Kertominen + Accurate multiplication + @@ -1401,8 +1402,8 @@ Would you like to ignore the error and continue? - Enable Shader JIT - Aktivoi JIT-Varjostin + Enable shader JIT + @@ -1411,7 +1412,7 @@ Would you like to ignore the error and continue? - Enable Async Shader Compilation + Enable async shader compilation @@ -1421,7 +1422,7 @@ Would you like to ignore the error and continue? - Enable Async Presentation + Enable async presentation @@ -1461,7 +1462,7 @@ Would you like to ignore the error and continue? - Use Disk Shader Cache + Use disk shader cache @@ -1486,7 +1487,7 @@ Would you like to ignore the error and continue? - Delay application render thread: + Delay Application Render Thread @@ -1975,12 +1976,12 @@ Would you like to ignore the error and continue? - Swap Screens - Vaihda näytöt + Swap screens + - Rotate Screens Upright + Rotate screens upright @@ -2097,7 +2098,7 @@ Would you like to ignore the error and continue? - <html><head/><body><p>Bottom Screen Opacity % (OpenGL Only)</p></body></html> + <html><head/><body><p>Bottom Screen Opacity %</p></body></html> @@ -2445,7 +2446,7 @@ Would you like to ignore the error and continue? - Use Virtual SD + Use virtual SD card @@ -2455,7 +2456,7 @@ Would you like to ignore the error and continue? - Use Custom Storage + Use custom storage location @@ -2542,8 +2543,8 @@ online features (if installed) - Region: - + Region + Alue @@ -2551,326 +2552,337 @@ online features (if installed) - + + Apply region free patch to +installed applications. + + + + + Patches the region of installed applications to be region free, so that they always appear on the home menu. + + + + Username Käyttäjänimi - + Birthday Syntymäpäivä - + January Tammikuu - + February Helmikuu - + March Maaliskuu - + April Huhtikuu - + May Toukokuu - + June Kesäkuu - + July Heinäkuu - + August Elokuu - + September Syyskuu - + October Lokakuu - + November Marraskuu - + December Joulukuu - + Language Kieli - + Note: this can be overridden when region setting is auto-select Huom: tämä voidaan korvata jos alueasetukset ovat automaattiset - + Japanese (日本語) Japani (日本語) - + English Englanti - + French (français) Ranska (français) - + German (Deutsch) Saksa (Deutsch) - + Italian (italiano) Italia (italiano) - + Spanish (español) Espanja (español) - + Simplified Chinese (简体中文) Yksinkertaistettu Kiina (简体中文) - + Korean (한국어) Korea (한국어) - + Dutch (Nederlands) Hollanti (Nederlands) - + Portuguese (português) Portugali (português) - + Russian (Русский) Venäjä (Русский) - + Traditional Chinese (正體中文) Tavallinen Kiina (正體中文) - + Sound output mode Äänen ulostulotila - + Mono Mono - + Stereo Stereo - + Surround Surround - + Country Maa - + Clock Kello - + System Clock Järjestelmän Kello - + Fixed Time Yksittäinen Aika - + Startup time Aloitusaika - + yyyy-MM-ddTHH:mm:ss vvvv-KK-ppATT:mm:ss - + Offset time - + days - + HH:mm:ss - + Initial System Ticks - + Random - + Fixed - + Initial System Ticks Override - + Play Coins - + <html><head/><body><p>Number of steps per hour reported by the pedometer. Range from 0 to 65,535.</p></body></html> - + Pedometer Steps per Hour - + Run System Setup when Home Menu is launched - + Console ID: Konsolin Tunnus: - - + + Regenerate Uudista - + MAC: - - 3GX Plugin Loader: + + 3GX Plugin Loader - + Enable 3GX plugin loader - + Allow applications to change plugin loader state - + Real Console Unique Data - + Your real console is linked to Azahar. - + Unlink - + OTP - - - - + + + + Choose - + SecureInfo_A/B - + LocalFriendCodeSeed_A/B - + movable.sed - + System settings are available only when applications is not running. @@ -3580,76 +3592,76 @@ online features (if installed) - - + + Console ID: 0x%1 Konsolin Tunnus: 0x%1 - - + + MAC: %1 - + This will replace your current virtual 3DS console ID with a new one. Your current virtual 3DS console ID will not be recoverable. This might have unexpected effects in applications. This might fail if you use an outdated config save. Continue? - - - + + + Warning Varoitus - + This will replace your current MAC address with a new one. It is not recommended to do this if you got the MAC address from your real console using the setup tool. Continue? - + This action will unlink your real console from Azahar, with the following consequences:<br><ul><li>Your OTP, SecureInfo and LocalFriendCodeSeed will be removed from Azahar.</li><li>Your friend list will reset and you will be logged out of your NNID/PNID account.</li><li>System files and eshop titles obtained through Azahar will become inaccessible until the same console is linked again (save data will not be lost).</li></ul><br>Continue? - + Invalid country for configured region - + Invalid country for console unique data - + Status: Loaded - + Status: Loaded (Invalid Signature) - + Status: Loaded (Region Changed) - + Status: Not Found - + Status: Invalid - + Status: IO Error @@ -3764,13 +3776,13 @@ Drag points to change position, or double-click table cells to edit values. - Interface language: - Käyttöliittymän kieli: + Interface Language + - Theme: - Teema: + Theme + @@ -3779,8 +3791,8 @@ Drag points to change position, or double-click table cells to edit values. - Icon Size: - Kuvakkeen koko: + Icon Size + @@ -3800,8 +3812,8 @@ Drag points to change position, or double-click table cells to edit values. - Row 1 Text: - Rivin 1 Teksti: + Row 1 Text + @@ -3835,17 +3847,17 @@ Drag points to change position, or double-click table cells to edit values. - Row 2 Text: - Rivin 2 Teksti: + Row 2 Text + - Hide Titles without Icon - Piilota pelit ilman kuvakkeita + Hide titles without icon + - Single Line Mode + Single line mode @@ -3855,7 +3867,7 @@ Drag points to change position, or double-click table cells to edit values. - Show Advanced Frame Time Info + Show advanced frame time info @@ -3938,12 +3950,12 @@ Drag points to change position, or double-click table cells to edit values. DirectConnectWindow - + Connecting Yhdistetään - + Connect Yhdistä @@ -4062,581 +4074,595 @@ Please check your FFmpeg installation used for compilation. GMainWindow - + No Suitable Vulkan Devices Detected - + Vulkan initialization failed during boot.<br/>Your GPU may not support Vulkan 1.1, or you do not have the latest graphics driver. - + Current Artic traffic speed. Higher values indicate bigger transfer loads. - - + + Current emulation speed. Values higher or lower than 100% indicate emulation is running faster or slower than a 3DS. Nykyinen emulaationopeus. Arvot yli tai ali 100% osoittavat, että emulaatio on nopeampi tai hitaampi kuin 3DS:än nopeus. - - + + How many frames per second the app is currently displaying. This will vary from app to app and scene to scene. - - + + Time taken to emulate a 3DS frame, not counting framelimiting or v-sync. For full-speed emulation this should be at most 16.67 ms. - + MicroProfile (unavailable) - + Clear Recent Files - + &Continue - + &Pause - + Azahar is running an application TRANSLATORS: This string is shown to the user to explain why Citra needs to prevent the computer from sleeping - - + + Invalid App Format - - + + Your app format is not supported.<br/>Please follow the guides to redump your <a href='https://web.archive.org/web/20240304210021/https://citra-emu.org/wiki/dumping-game-cartridges/'>game cartridges</a> or <a href='https://web.archive.org/web/20240304210011/https://citra-emu.org/wiki/dumping-installed-titles/'>installed titles</a>. - + App Corrupted - + Your app is corrupted. <br/>Please follow the guides to redump your <a href='https://web.archive.org/web/20240304210021/https://citra-emu.org/wiki/dumping-game-cartridges/'>game cartridges</a> or <a href='https://web.archive.org/web/20240304210011/https://citra-emu.org/wiki/dumping-installed-titles/'>installed titles</a>. - + App Encrypted - + Your app is encrypted. <br/><a href='https://azahar-emu.org/blog/game-loading-changes/'>Please check our blog for more info.</a> - + Unsupported App - + GBA Virtual Console is not supported by Azahar. - - + + Artic Server - + + Invalid system mode + + + + + New 3DS exclusive applications cannot be loaded without enabling the New 3DS mode. + + + + Error while loading App! - + An unknown error occurred. Please see the log for more details. - + CIA must be installed before usage CIA pitää asenaa ennen käyttöä - + Before using this CIA, you must install it. Do you want to install it now? Ennen, kun voit käyttää tätä CIA:aa, sinun täytyy asentaa se. Haluatko asentaa sen nyt? - + Quick Load - + Quick Save - - + + Slot %1 - + %2 %3 - + Quick Save - %1 - + Quick Load - %1 - + Slot %1 - %2 %3 - + Error Opening %1 Folder Virhe Avatessa %1 Kansio - - + + Folder does not exist! Kansio ei ole olemassa! - + Remove Play Time Data - + Reset play time? - - - - + + + + Create Shortcut - + Do you want to launch the application in fullscreen? - + Successfully created a shortcut to %1 - + This will create a shortcut to the current AppImage. This may not work well if you update. Continue? - + Failed to create a shortcut to %1 - + Create Icon - + Cannot create icon file. Path "%1" does not exist and cannot be created. - + Dumping... - - + + Cancel Peruuta - - - - - - - - - + + + + + + + + + Azahar - + Could not dump base RomFS. Refer to the log for details. - + Error Opening %1 Virhe avatessa %1 - + Select Directory Valitse hakemisto - + Properties - + The application properties could not be loaded. - + 3DS Executable (%1);;All Files (*.*) %1 is an identifier for the 3DS executable file extensions. - + Load File Lataa tiedosto - - + + Set Up System Files - + <p>Azahar needs console unique data and firmware files from a real console to be able to use some of its features.<br>Such files and data can be set up with the <a href=https://github.com/azahar-emu/ArticSetupTool>Azahar Artic Setup Tool</a><br>Notes:<ul><li><b>This operation will install console unique data to Azahar, do not share your user or nand folders<br>after performing the setup process!</b></li><li>While doing the setup process, Azahar will link to the console running the setup tool. You can unlink the<br>console later from the System tab in the emulator configuration menu.</li><li>Do not go online with both Azahar and your 3DS console at the same time after setting up system files,<br>as it could cause issues.</li><li>Old 3DS setup is needed for the New 3DS setup to work (doing both setup modes is recommended).</li><li>Both setup modes will work regardless of the model of the console running the setup tool.</li></ul><hr></p> - + Enter Azahar Artic Setup Tool address: - + <br>Choose setup mode: - + (ℹ️) Old 3DS setup - - + + Setup is possible. - + (⚠) New 3DS setup - + Old 3DS setup is required first. - + (✅) Old 3DS setup - - + + Setup completed. - + (ℹ️) New 3DS setup - + (✅) New 3DS setup - + The system files for the selected mode are already set up. Reinstall the files anyway? - + Load Files Lataa tiedostoja - + 3DS Installation File (*.cia *.zcia) - - - + + + All Files (*.*) Kaikki tiedostot (*.*) - + Connect to Artic Base - + Enter Artic Base server address: - + %1 has been installed successfully. %1 asennettiin onnistuneesti. - + Unable to open File Tiedostoa ei voitu avata - + Could not open %1 Ei voitu avata %1 - + Installation aborted Asennus keskeytetty - + The installation of %1 was aborted. Please see the log for more details - + Invalid File Sopimaton Tiedosto - + %1 is not a valid CIA %1 ei ole sopiva CIA-tiedosto - + CIA Encrypted - + Your CIA file is encrypted.<br/><a href='https://azahar-emu.org/blog/game-loading-changes/'>Please check our blog for more info.</a> - + Unable to find File - + Could not find %1 - - - - Error compressing file + + + + + Z3DS Compression - - File compress operation failed, check log for details. + + Failed to compress some files, check log for details. - - - - Error decompressing file + + Failed to decompress some files, check log for details. - - File decompress operation failed, check log for details. + + All files have been compressed successfully. - + + All files have been decompressed successfully. + + + + Uninstalling '%1'... - + Failed to uninstall '%1'. - + Successfully uninstalled '%1'. - + File not found Tiedostoa ei löytynyt - + File "%1" not found Tiedosto "%1" ei löytynyt. - + Savestates - + Warning: Savestates are NOT a replacement for in-application saves, and are not meant to be reliable. Use at your own risk! - - - + + + Error opening amiibo data file - + A tag is already in use. - + Application is not looking for amiibos. - + Amiibo File (%1);; All Files (*.*) Amiibo tiedosto (%1);; Kaikki tiedostot (*.*) - + Load Amiibo Lataa Amiibo - + Unable to open amiibo file "%1" for reading. - + Record Movie Tallenna Video - + Movie recording cancelled. - - + + Movie Saved - - + + The movie is successfully saved. - + Application will unpause - + The application will be unpaused, and the next frame will be captured. Is this okay? - + Invalid Screenshot Directory - + Cannot create specified screenshot directory. Screenshot path is set back to its default value. - + Could not load video dumper - + FFmpeg could not be loaded. Make sure you have a compatible version installed. To install FFmpeg to Azahar, press Open and select your FFmpeg directory. @@ -4645,274 +4671,264 @@ To view a guide on how to install FFmpeg, press Help. - - Load 3DS ROM File + + Load 3DS ROM Files - - 3DS ROM Files (*.cia *cci *3dsx *cxi) + + 3DS ROM Files (*.cia *.cci *.3dsx *.cxi) - - The selected file is not a compatible 3DS ROM format. Make sure you have chosen the right file, and that it is not encrypted. - - - - - The selected file is already compressed. - - - - + 3DS Compressed ROM File (*.%1) - + Save 3DS Compressed ROM File - - Load 3DS Compressed ROM File + + Select Output 3DS Compressed ROM Folder - + + Load 3DS Compressed ROM Files + + + + 3DS Compressed ROM Files (*.zcia *zcci *z3dsx *zcxi) - - The selected file is not a compatible compressed 3DS ROM format. Make sure you have chosen the right file. - - - - - The selected file is already decompressed. - - - - + 3DS ROM File (*.%1) - + Save 3DS ROM File - + + Select Output 3DS ROM Folder + + + + Select FFmpeg Directory - + The provided FFmpeg directory is missing %1. Please make sure the correct directory was selected. - + FFmpeg has been sucessfully installed. - + Installation of FFmpeg failed. Check the log file for details. - + Could not start video dumping.<br>Please ensure that the video encoder is configured correctly.<br>Refer to the log for details. - + Recording %1 - + Playing %1 / %2 - + Movie Finished - + (Accessing SharedExtData) - + (Accessing SystemSaveData) - + (Accessing BossExtData) - + (Accessing ExtData) - + (Accessing SaveData) - + MB/s - + KB/s - + Artic Traffic: %1 %2%3 - + Speed: %1% Nopeus: %1% - + Speed: %1% / %2% Nopeus %1% / %2% - + App: %1 FPS - + Frame: %1 ms (GPU: [CMD: %2 ms, SWP: %3 ms], IPC: %4 ms, SVC: %5 ms, Rem: %6 ms) - + Frame: %1 ms Kuvaruutu: %1 ms - + VOLUME: MUTE - + VOLUME: %1% Volume percentage (e.g. 50%) - + %1 is missing. Please <a href='https://web.archive.org/web/20240304201103/https://citra-emu.org/wiki/dumping-system-archives-and-the-shared-fonts-from-a-3ds-console/'>dump your system archives</a>.<br/>Continuing emulation may result in crashes and bugs. - + A system archive - + System Archive Not Found - + System Archive Missing - + Save/load Error - + Fatal Error - + A fatal error occurred. <a href='https://web.archive.org/web/20240228001712/https://community.citra-emu.org/t/how-to-upload-the-log-file/296'>Check the log</a> for details.<br/>Continuing emulation may result in crashes and bugs. - + Fatal Error encountered - + Continue Jatka - + Quit Application - + OK OK - + Would you like to exit now? Haluatko poistua nyt? - + The application is still running. Would you like to stop emulation? - + Playback Completed - + Movie playback completed. - + Update Available - + Update %1 for Azahar is available. Would you like to download it? - + Primary Window - + Secondary Window @@ -5018,239 +5034,254 @@ Would you like to download it? GameList - + IMPORTANT: Encrypted files and .3ds files are no longer supported. Decrypting and/or renaming to .cci may be necessary. <a href='https://azahar-emu.org/blog/game-loading-changes/'>Learn more.</a> - + Don't show again - - + + Compatibility Yhteensopivuus - - + + Region Alue - - + + File type Tiedoston tyyppi - - + + Size Koko - - + + Play time - + Favorite - + + Eject Cartridge + + + + + Insert Cartridge + + + + Open - + Application Location - + Save Data Location - + Extra Data Location - + Update Data Location - + DLC Data Location - + Texture Dump Location - + Custom Texture Location - + Mods Location - + Dump RomFS - + Disk Shader Cache - + Open Shader Cache Location - + Delete OpenGL Shader Cache - + Uninstall - + Everything - + Application - + Update - + DLC - + Remove Play Time Data - + Create Shortcut - + Add to Desktop - + Add to Applications Menu - + + Stress Test: App Launch + + + + Properties - - - - + + + + Azahar - + Are you sure you want to completely uninstall '%1'? This will delete the application if installed, as well as any installed updates or DLC. - - + + %1 (Update) - - + + %1 (DLC) - + Are you sure you want to uninstall '%1'? - + Are you sure you want to uninstall the update for '%1'? - + Are you sure you want to uninstall all DLC for '%1'? - + Scan Subfolders - + Remove Application Directory - + Move Up - + Move Down - + Open Directory Location Avaa hakemiston sijainti - + Clear Tyhjennä - + Name Nimi @@ -5258,77 +5289,77 @@ This will delete the application if installed, as well as any installed updates GameListItemCompat - + Perfect Täydellinen - + App functions flawless with no audio or graphical glitches, all tested functionality works as intended without any workarounds needed. - + Great Mahtava - + App functions with minor graphical or audio glitches and is playable from start to finish. May require some workarounds. - + Okay Hyvä - + App functions with major graphical or audio glitches, but app is playable from start to finish with workarounds. - + Bad Huono - + App functions, but with major graphical or audio glitches. Unable to progress in specific areas due to glitches even with workarounds. - + Intro/Menu Intro/Menu - + App is completely unplayable due to major graphical or audio glitches. Unable to progress past the Start Screen. - + Won't Boot Ei Käynnisty - + The app crashes when attempting to startup. - + Not Tested Ei Testattu - + The app has not yet been tested. @@ -5336,7 +5367,7 @@ Screen. GameListPlaceholder - + Double-click to add a new folder to the application list @@ -5344,27 +5375,27 @@ Screen. GameListSearchField - + of - + result - + results - + Filter: Suodatin: - + Enter pattern to filter @@ -5692,77 +5723,77 @@ Screen. - + SRC1: %1, %2, %3, %4 - + SRC2: %1, %2, %3, %4 - + SRC3: %1, %2, %3, %4 - + DEST_IN: %1, %2, %3, %4 - + DEST_OUT: %1, %2, %3, %4 - + Address Registers: %1, %2 - + Compare Result: %1, %2 - + Static Condition: %1 - + Dynamic Conditions: %1, %2 - + Loop Parameters: %1 (repeats), %2 (initializer), %3 (increment), %4 - + Instruction offset: 0x%1 - + -> 0x%2 - + (last instruction) @@ -6061,32 +6092,32 @@ Debug Message: Salasana: - + Room Name Huoneen nimi - + Preferred Application - + Host Isäntä - + Players Pelaajia - + Refreshing Päivitetään - + Refresh List Päivitä lista @@ -6587,7 +6618,7 @@ Debug Message: File: - Tiedosto: + @@ -6679,7 +6710,7 @@ Debug Message: File: - Tiedosto: + @@ -7084,32 +7115,32 @@ They may have left the room. - + Unsupported encrypted application - + Invalid region Virheellinen alue - + Installed Titles Asennetut pelit - + System Titles - + Add New Application Directory - + Favorites diff --git a/dist/languages/fr.ts b/dist/languages/fr.ts index 04532a45d..976c6e984 100644 --- a/dist/languages/fr.ts +++ b/dist/languages/fr.ts @@ -298,8 +298,8 @@ Cela bannira à la fois son nom du forum et son adresse IP. - Emulation: - Émulation : + Emulation + Émulation @@ -403,6 +403,7 @@ Cela bannira à la fois son nom du forum et son adresse IP. + Camera Caméra @@ -414,8 +415,8 @@ Cela bannira à la fois son nom du forum et son adresse IP. - Camera to configure: - Caméra à configurer : + Camera to Configure + @@ -435,8 +436,8 @@ Cela bannira à la fois son nom du forum et son adresse IP. - Camera mode: - Mode de la caméra : + Camera mode + @@ -456,8 +457,8 @@ Cela bannira à la fois son nom du forum et son adresse IP. - Camera position: - Position de la caméra : + Camera position + @@ -482,8 +483,8 @@ Cela bannira à la fois son nom du forum et son adresse IP. - Camera Image Source: - Source de l'image de la caméra : + Camera Image Source + @@ -502,8 +503,8 @@ Cela bannira à la fois son nom du forum et son adresse IP. - File: - Fichier : + File + Fichier @@ -516,11 +517,6 @@ Cela bannira à la fois son nom du forum et son adresse IP. Select the system camera to use Choisissez la caméra système à utiliser - - - Camera: - Caméra : - <Default> @@ -534,8 +530,8 @@ Cela bannira à la fois son nom du forum et son adresse IP. - Flip: - Basculement : + Flip + @@ -1024,7 +1020,7 @@ Souhaitez vous ignorer l'erreur et poursuivre ? Enable Linear Filtering - Activer le filtrage linéaire + @@ -1088,8 +1084,8 @@ Souhaitez vous ignorer l'erreur et poursuivre ? - Reverse Side by Side - Côte à côte inversé + Side by Side Full Width + @@ -1139,7 +1135,7 @@ Souhaitez vous ignorer l'erreur et poursuivre ? Disable Right Eye Rendering - Désactiver le rendu de l'œil droit + @@ -1147,49 +1143,54 @@ Souhaitez vous ignorer l'erreur et poursuivre ? <html><head/><body><p>Désactiver le rendu de l'œil droit</p><p>Désactive le rendu de l'œil droit lorsque le mode stéréoscopique n'est pas utilisé. Améliore considérablement les performances dans certaines applications, mais peut provoquer un scintillement dans d'autres.</p></body></html> - + + Swap Eyes + + + + Utility Utilitaires - + <html><head/><body><p>Replace textures with PNG files.</p><p>Textures are loaded from load/textures/[Title ID]/.</p></body></html> <html><head/><body><p>Remplace les textures par des fichiers PNG.</p><p>Les textures sont chargées depuis load/textures/[Title ID]/.</p></body></html> - - Use Custom Textures - Utiliser des textures personnalisées + + Use custom textures + - + <html><head/><body><p>Dump textures to PNG files.</p><p>Textures are dumped to dump/textures/[Title ID]/.</p></body></html> <html><head/><body><p>Extrait les textures en fichiers PNG.</p><p>Les textures sont extraites vers dump/textures/[Title ID]/.</p></body></html> - - Dump Textures - Exporter les textures + + Dump textures + - + <html><head/><body><p>Load all custom textures into memory on boot, instead of loading them when the application requires them.</p></body></html> <html><head/><body><p>Charge toutes les textures personnalisées en mémoire au démarrage, au lieu de les charger lorsque l'application en a besoin.</p></body></html> - - Preload Custom Textures - Précharger des textures personnalisées + + Preload custom textures + - + <html><head/><body><p>Load custom textures asynchronously with background threads to reduce loading stutter</p></body></html> <html><head><body><p>Chargez les textures personnalisées de manière asynchrone avec des threads d’arrière-plan pour réduire le retard de chargement </p></body></head></html> - - Async Custom Texture Loading - Chargement asynchrone des textures personnalisées + + Async custom texture loading + @@ -1246,13 +1247,13 @@ Souhaitez vous ignorer l'erreur et poursuivre ? - Set emulation speed: - Définir la vitesse d'émulation : + Set emulation speed + - Emulation Speed: - Vitesse d'émulation : + Emulation Speed + @@ -1363,13 +1364,13 @@ Souhaitez vous ignorer l'erreur et poursuivre ? - SPIR-V Shader Generation - Génération de shaders SPIR-V + SPIR-V shader generation + - Disable GLSL -> SPIR-V Optimizer - Désactiver l'optimiseur GLSL -> SPIR-V + Disable GLSL -> SPIR-V optimizer + @@ -1388,8 +1389,8 @@ Souhaitez vous ignorer l'erreur et poursuivre ? - Enable Hardware Shader - Activer le nuanceur matériel + Enable hardware shader + @@ -1398,8 +1399,8 @@ Souhaitez vous ignorer l'erreur et poursuivre ? - Accurate Multiplication - Multiplication précise + Accurate multiplication + @@ -1408,8 +1409,8 @@ Souhaitez vous ignorer l'erreur et poursuivre ? - Enable Shader JIT - Activer le nuanceur JIT + Enable shader JIT + @@ -1418,8 +1419,8 @@ Souhaitez vous ignorer l'erreur et poursuivre ? - Enable Async Shader Compilation - Activer la compilation asynchrone des shaders + Enable async shader compilation + @@ -1428,8 +1429,8 @@ Souhaitez vous ignorer l'erreur et poursuivre ? - Enable Async Presentation - Activer la présentation asynchrone + Enable async presentation + @@ -1468,8 +1469,8 @@ Souhaitez vous ignorer l'erreur et poursuivre ? - Use Disk Shader Cache - Utiliser le cache de shaders sur disque + Use disk shader cache + @@ -1493,8 +1494,8 @@ Souhaitez vous ignorer l'erreur et poursuivre ? - Delay application render thread: - Délai du thread de rendu de l'application : + Delay Application Render Thread + @@ -1982,13 +1983,13 @@ Souhaitez vous ignorer l'erreur et poursuivre ? - Swap Screens - Permuter les écrans + Swap screens + - Rotate Screens Upright - Rotation des écrans vers le haut + Rotate screens upright + @@ -2104,8 +2105,8 @@ Souhaitez vous ignorer l'erreur et poursuivre ? - <html><head/><body><p>Bottom Screen Opacity % (OpenGL Only)</p></body></html> - <html><head/><body><p>% d'opacité de l'écran inférieur (OpenGL uniquement)</p></body></html> + <html><head/><body><p>Bottom Screen Opacity %</p></body></html> + @@ -2452,8 +2453,8 @@ Souhaitez vous ignorer l'erreur et poursuivre ? - Use Virtual SD - Utiliser une carte SD virtuelle + Use virtual SD card + @@ -2462,8 +2463,8 @@ Souhaitez vous ignorer l'erreur et poursuivre ? - Use Custom Storage - Utiliser le stockage personnalisé + Use custom storage location + @@ -2550,8 +2551,8 @@ les fonctionnalités en ligne (si installés) - Region: - Région : + Region + Région @@ -2559,326 +2560,337 @@ les fonctionnalités en ligne (si installés) Sélection automatique - + + Apply region free patch to +installed applications. + + + + + Patches the region of installed applications to be region free, so that they always appear on the home menu. + + + + Username Nom d'utilisateur - + Birthday Date de naissance - + January Janvier - + February Février - + March Mars - + April Avril - + May Mai - + June Juin - + July Juillet - + August Août - + September Septembre - + October Octobre - + November Novembre - + December Décembre - + Language Langue - + Note: this can be overridden when region setting is auto-select Note : ceci peut être remplacé quand le paramètre de région est défini sur Automatique - + Japanese (日本語) Japonais (日本語) - + English Anglais (English) - + French (français) Français - + German (Deutsch) Allemand (Deutsch) - + Italian (italiano) Italien (italiano) - + Spanish (español) Espagnol (español) - + Simplified Chinese (简体中文) Chinois simplifié (简体中文) - + Korean (한국어) Coréen (한국어) - + Dutch (Nederlands) Néerlandais (Nederlands) - + Portuguese (português) Portugais (português) - + Russian (Русский) Russe (Русский) - + Traditional Chinese (正體中文) Chinois traditionnel (正體中文) - + Sound output mode Mode de sortie audio - + Mono Mono - + Stereo Stéréo - + Surround Surround - + Country Pays - + Clock Horloge - + System Clock Horloge système - + Fixed Time Temps fixe - + Startup time Heure au démarrage - + yyyy-MM-ddTHH:mm:ss yyyy-MM-ddTHH:mm:ss - + Offset time Décalage horaire - + days jours - + HH:mm:ss HH:mm:ss - + Initial System Ticks Ticks systèmes initiaux - + Random Aléatoire - + Fixed Fixe - + Initial System Ticks Override Remplacement des ticks systèmes initiaux - + Play Coins Pièces de jeu - + <html><head/><body><p>Number of steps per hour reported by the pedometer. Range from 0 to 65,535.</p></body></html> <html><head/><body></p>Nombre de pas par heure reporté par le podomètre. Sur une échelle de 0 à 65 535.</p></body></html> - + Pedometer Steps per Hour Pas de podomètre par heure - + Run System Setup when Home Menu is launched Exécuter la configuration du système lorsque le menu home est lancé - + Console ID: ID de la console : - - + + Regenerate Regénérer - + MAC: MAC : - - 3GX Plugin Loader: - 3GX Plugin Loader : + + 3GX Plugin Loader + - + Enable 3GX plugin loader Activer le 3GX Plugin Loader - + Allow applications to change plugin loader state Permettre aux applications de modifier l'état du Plugin Loader - + Real Console Unique Data Données uniques d'une vraie console - + Your real console is linked to Azahar. Votre console réelle est liée à Azahar. - + Unlink Dissocier - + OTP OTP - - - - + + + + Choose Choisir - + SecureInfo_A/B SecureInfo_A/B - + LocalFriendCodeSeed_A/B LocalFriendCodeSeed_A/B - + movable.sed movable.sed - + System settings are available only when applications is not running. Les paramètres du système ne sont disponibles que lorsque les applications ne sont pas en cours d'exécution. @@ -3588,76 +3600,76 @@ les fonctionnalités en ligne (si installés) Fichier Sed (*.sed);;Tous les fichiers (*.*) - - + + Console ID: 0x%1 Console ID : 0x%1 - - + + MAC: %1 MAC : %1 - + This will replace your current virtual 3DS console ID with a new one. Your current virtual 3DS console ID will not be recoverable. This might have unexpected effects in applications. This might fail if you use an outdated config save. Continue? Cela remplacera l'ID actuel de votre console virtuelle 3DS par un nouveau. L'ID actuel de votre console virtuelle 3DS ne pourra pas être récupéré. Cela pourrait avoir des effets inattendus sur certaines applications. L'opération peut échouer si vous utilisez une sauvegarde de configuration obsolète. Continuer ? - - - + + + Warning Avertissement - + This will replace your current MAC address with a new one. It is not recommended to do this if you got the MAC address from your real console using the setup tool. Continue? Cela remplacera votre adresse MAC actuelle par une nouvelle. Il n'est pas recommandé de faire cela si vous avez récupéré l'adresse MAC depuis votre console réelle à l'aide de l'outil de configuration. Continuer ? - + This action will unlink your real console from Azahar, with the following consequences:<br><ul><li>Your OTP, SecureInfo and LocalFriendCodeSeed will be removed from Azahar.</li><li>Your friend list will reset and you will be logged out of your NNID/PNID account.</li><li>System files and eshop titles obtained through Azahar will become inaccessible until the same console is linked again (save data will not be lost).</li></ul><br>Continue? Cette action désassociera votre console réelle d'Azahar, avec les conséquences suivantes :<br><ul><li>Votre OTP, SecureInfo et LocalFriendCodeSeed seront supprimés d'Azahar.</li><li>Votre liste d'amis sera réinitialisée et vous serez déconnecté de votre compte NNID/PNID.</li><li>Les fichiers système et les titres de l'eShop obtenus via Azahar deviendront inaccessibles jusqu'à ce que la même console soit à nouveau connectée (les données sauvegardées ne seront pas perdues).</li></ul><br>Continuer ? - + Invalid country for configured region Pays invalide pour la région configurée - + Invalid country for console unique data Pays invalide pour les données uniques de la console - + Status: Loaded Statut : Chargé - + Status: Loaded (Invalid Signature) Statut : Chargé (signature invalide) - + Status: Loaded (Region Changed) Statut : Chargé (région modifiée) - + Status: Not Found Statut : Introuvable - + Status: Invalid Statut : invalide - + Status: IO Error Statut : Erreur d'E/S @@ -3773,13 +3785,13 @@ Glissez les points pour modifier la position, ou double-cliquez les cellules pou - Interface language: - Langue de l'interface : + Interface Language + - Theme: - Thème : + Theme + @@ -3788,8 +3800,8 @@ Glissez les points pour modifier la position, ou double-cliquez les cellules pou - Icon Size: - Talle de l'icône : + Icon Size + @@ -3809,8 +3821,8 @@ Glissez les points pour modifier la position, ou double-cliquez les cellules pou - Row 1 Text: - Texte de la ligne 1 : + Row 1 Text + @@ -3844,18 +3856,18 @@ Glissez les points pour modifier la position, ou double-cliquez les cellules pou - Row 2 Text: - Texte de la ligne 2 : + Row 2 Text + - Hide Titles without Icon - Masquer les titres sans icône + Hide titles without icon + - Single Line Mode - Mode simple ligne + Single line mode + @@ -3864,8 +3876,8 @@ Glissez les points pour modifier la position, ou double-cliquez les cellules pou - Show Advanced Frame Time Info - Afficher les informations avancées sur le temps d'image + Show advanced frame time info + @@ -3947,12 +3959,12 @@ Glissez les points pour modifier la position, ou double-cliquez les cellules pou DirectConnectWindow - + Connecting Connexion en cours - + Connect Connecter @@ -4072,497 +4084,511 @@ Veuillez vérifier votre installation FFmpeg utilisée pour la compilation. GMainWindow - + No Suitable Vulkan Devices Detected Aucun périphérique Vulkan adapté détecté - + Vulkan initialization failed during boot.<br/>Your GPU may not support Vulkan 1.1, or you do not have the latest graphics driver. L'initialisation de Vulkan a échoué au démarrage.<br/>Votre GPU pourrait ne pas prendre en charge Vulkan 1.1, ou vous pourriez ne pas avoir le pilote graphique le plus récent. - + Current Artic traffic speed. Higher values indicate bigger transfer loads. Vitesse actuelle du trafic Artic. Des valeurs plus élevées indiquent des charges de transfert plus importantes. - - + + Current emulation speed. Values higher or lower than 100% indicate emulation is running faster or slower than a 3DS. Vitesse actuelle d'émulation. Les valeurs supérieures ou inférieures à 100% indiquent que l'émulation est plus rapide ou plus lente qu'une 3DS. - - + + How many frames per second the app is currently displaying. This will vary from app to app and scene to scene. Nombre d'images par seconde affichées par l'application. Cela varie d'une application à l'autre et d'une scène à l'autre. - - + + Time taken to emulate a 3DS frame, not counting framelimiting or v-sync. For full-speed emulation this should be at most 16.67 ms. Temps nécessaire pour émuler une trame 3DS, sans compter la limitation de trame ou la synchronisation verticale V-Sync. Pour une émulation à pleine vitesse, cela ne devrait pas dépasser 16,67 ms. - + MicroProfile (unavailable) MicroProfile (indisponible) - + Clear Recent Files Effacer les fichiers récents - + &Continue &Continuer - + &Pause &Pause - + Azahar is running an application TRANSLATORS: This string is shown to the user to explain why Citra needs to prevent the computer from sleeping Azahar exécute une application - - + + Invalid App Format Format d'application invalide - - + + Your app format is not supported.<br/>Please follow the guides to redump your <a href='https://web.archive.org/web/20240304210021/https://citra-emu.org/wiki/dumping-game-cartridges/'>game cartridges</a> or <a href='https://web.archive.org/web/20240304210011/https://citra-emu.org/wiki/dumping-installed-titles/'>installed titles</a>. Le format de votre application n'est pas pris en charge.<br/> Veuillez suivre les guides pour extraire à nouveau vos <a href='https://web.archive.org/web/20240304210021/https://citra-emu.org/wiki/dumping-game-cartridges/'>cartouches de jeu</a> ou les <a href='https://web.archive.org/web/20240304210011/https://citra-emu.org/wiki/dumping-installed-titles/'>titres installés</a>. - + App Corrupted Application corrompue - + Your app is corrupted. <br/>Please follow the guides to redump your <a href='https://web.archive.org/web/20240304210021/https://citra-emu.org/wiki/dumping-game-cartridges/'>game cartridges</a> or <a href='https://web.archive.org/web/20240304210011/https://citra-emu.org/wiki/dumping-installed-titles/'>installed titles</a>. Votre application est corrompue. <br/>Veuillez suivre les guides pour récupérer vos <a href='https://web.archive.org/web/20240304210021/https://citra-emu.org/wiki/dumping-game-cartridges/'>cartouches de jeux</a> ou les <a href='https://web.archive.org/web/20240304210011/https://citra-emu.org/wiki/dumping-installed-titles/'>titres installés</a>. - + App Encrypted Application encryptée - + Your app is encrypted. <br/><a href='https://azahar-emu.org/blog/game-loading-changes/'>Please check our blog for more info.</a> Votre application est encryptée. <br/><a href='https://azahar-emu.org/blog/game-loading-changes/'>Consultez notre blog pour plus d'informations.</a> - + Unsupported App Application non supportée - + GBA Virtual Console is not supported by Azahar. La console virtuelle de la GBA n'est pas prise en charge par Azahar. - - + + Artic Server Serveur Artic - + + Invalid system mode + + + + + New 3DS exclusive applications cannot be loaded without enabling the New 3DS mode. + + + + Error while loading App! Erreur lors du chargement de l'application ! - + An unknown error occurred. Please see the log for more details. Une erreur inconnue s'est produite. Veuillez consulter le journal pour plus de détails. - + CIA must be installed before usage CIA doit être installé avant utilisation - + Before using this CIA, you must install it. Do you want to install it now? Avant d'utiliser ce CIA, vous devez l'installer. Voulez-vous l'installer maintenant ? - + Quick Load Chargement rapide - + Quick Save Sauvegarde rapide - - + + Slot %1 Emplacement %1 - + %2 %3 %2 %3 - + Quick Save - %1 Sauvegarde rapide - %1 - + Quick Load - %1 Chargement rapide - %1 - + Slot %1 - %2 %3 Emplacement %1 - %2 %3 - + Error Opening %1 Folder Erreur lors de l'ouverture du dossier %1 - - + + Folder does not exist! Le répertoire n'existe pas ! - + Remove Play Time Data Retirer les données de temps de jeu ? - + Reset play time? Réinitialiser le temps de jeu ? - - - - + + + + Create Shortcut Créer un raccourci - + Do you want to launch the application in fullscreen? Voulez-vous lancer l'application en plein écran ? - + Successfully created a shortcut to %1 Création réussie d'un raccourci vers %1 - + This will create a shortcut to the current AppImage. This may not work well if you update. Continue? Cela créera un raccourci vers l'AppImage actuelle. Il se peut que cela ne fonctionne pas bien si vous effectuez une mise à jour. Poursuivre ? - + Failed to create a shortcut to %1 Échec de la création d'un raccourci vers %1 - + Create Icon Créer icône - + Cannot create icon file. Path "%1" does not exist and cannot be created. Impossible de créer le fichier icône. Le chemin "%1" n'existe pas et ne peut pas être créé. - + Dumping... Extraction... - - + + Cancel Annuler - - - - - - - - - + + + + + + + + + Azahar Azahar - + Could not dump base RomFS. Refer to the log for details. Impossible d'extraire les RomFS de base. Référez-vous aux logs pour plus de détails. - + Error Opening %1 Erreur lors de l'ouverture de %1 - + Select Directory Sélectionner un répertoire - + Properties Propriétés - + The application properties could not be loaded. Les propriétés de l'application n'ont pas pu être chargées. - + 3DS Executable (%1);;All Files (*.*) %1 is an identifier for the 3DS executable file extensions. Exécutable 3DS (%1);;Tous les fichiers (*.*) - + Load File Charger un fichier - - + + Set Up System Files Configurer les fichiers système - + <p>Azahar needs console unique data and firmware files from a real console to be able to use some of its features.<br>Such files and data can be set up with the <a href=https://github.com/azahar-emu/ArticSetupTool>Azahar Artic Setup Tool</a><br>Notes:<ul><li><b>This operation will install console unique data to Azahar, do not share your user or nand folders<br>after performing the setup process!</b></li><li>While doing the setup process, Azahar will link to the console running the setup tool. You can unlink the<br>console later from the System tab in the emulator configuration menu.</li><li>Do not go online with both Azahar and your 3DS console at the same time after setting up system files,<br>as it could cause issues.</li><li>Old 3DS setup is needed for the New 3DS setup to work (doing both setup modes is recommended).</li><li>Both setup modes will work regardless of the model of the console running the setup tool.</li></ul><hr></p> <p>Azahar a besoin des données et des fichiers de firmware propres à une console réelle pour pouvoir utiliser certaines de ses fonctionnalités.<br>Ces fichiers et données peuvent être configurés à l'aide de l'outil <a href=https://github.com/azahar-emu/ArticSetupTool>Azahar Artic Setup Tool.</a><br>Notes :<ul><li><b>Cette opération installera des données uniques à la console Azahar. Ne partagez pas vos dossiers utilisateur ou nand <br>après avoir effectué le processus d'installation !</b></li><li>Pendant le processus d'installation, Azahar se connectera à la console exécutant l'outil d'installation. Vous pourrez ensuite déconnecter la <br>console à partir de l'onglet Système dans le menu de configuration de l'émulateur.</li><li>Ne vous connectez pas à Internet avec Azahar et votre console 3DS en même temps après avoir configuré les fichiers système,<br> car cela pourrait causer des problèmes.</li><li>La configuration de l'ancienne 3DS est nécessaire pour que la configuration de la nouvelle 3DS fonctionne (il est recommandé d'effectuer les deux modes de configuration).</li><li>Les deux modes de configuration fonctionnent quel que soit le modèle de console sur lequel l'outil de configuration est exécuté.</li></ul><hr></p> - + Enter Azahar Artic Setup Tool address: Entrer l'adresse de l'outil de configuration Artic d'Azahar : - + <br>Choose setup mode: <br>Choisissez le mode de configuration : - + (ℹ️) Old 3DS setup (ℹ️) Configuration Old 3DS - - + + Setup is possible. La configuration est possible. - + (⚠) New 3DS setup (⚠) Configuration New 3DS - + Old 3DS setup is required first. La configuration Old 3DS est requise d'abord. - + (✅) Old 3DS setup (✅) Configuration Old 3DS - - + + Setup completed. Configuration terminée. - + (ℹ️) New 3DS setup (ℹ️) Configuration New 3DS - + (✅) New 3DS setup (✅) Configuration New 3DS - + The system files for the selected mode are already set up. Reinstall the files anyway? Les fichiers système pour le mode sélectionné sont déjà configurés. Voulez-vous les réinstaller quand même ? - + Load Files Charger des fichiers - + 3DS Installation File (*.cia *.zcia) Fichier d'installation 3DS (*.cia *.zcia) - - - + + + All Files (*.*) Tous les fichiers (*.*) - + Connect to Artic Base Se connecter à Artic Base - + Enter Artic Base server address: Entrez l'adresse du serveur Artic Base : - + %1 has been installed successfully. %1 a été installé avec succès. - + Unable to open File Impossible d'ouvrir le fichier - + Could not open %1 Impossible d'ouvrir %1 - + Installation aborted Installation annulée - + The installation of %1 was aborted. Please see the log for more details L'installation de %1 a été interrompue. Veuillez consulter les logs pour plus de détails. - + Invalid File Fichier invalide - + %1 is not a valid CIA %1 n'est pas un CIA valide - + CIA Encrypted CIA chiffré - + Your CIA file is encrypted.<br/><a href='https://azahar-emu.org/blog/game-loading-changes/'>Please check our blog for more info.</a> Votre fichier CIA est chiffré.<br/><a href='https://azahar-emu.org/blog/game-loading-changes/'>Consultez notre blog pour plus d'informations.</a> - + Unable to find File Impossible de trouver le fichier - + Could not find %1 Impossible de trouver %1 - - - - Error compressing file - Erreur lors de la compression du fichier + + + + + Z3DS Compression + - - File compress operation failed, check log for details. - L'opération de compression du fichier a échoué, consultez le journal pour plus de détails. + + Failed to compress some files, check log for details. + - - - - Error decompressing file - Erreur lors de la décompression du fichier + + Failed to decompress some files, check log for details. + - - File decompress operation failed, check log for details. - L'opération de décompression du fichier a échoué, consultez le journal pour plus de détails. + + All files have been compressed successfully. + - + + All files have been decompressed successfully. + + + + Uninstalling '%1'... Désinstallation de '%1'... - + Failed to uninstall '%1'. Échec de la désinstallation de '%1'. - + Successfully uninstalled '%1'. Désinstallation de '%1' réussie. - + File not found Fichier non trouvé - + File "%1" not found Le fichier "%1" n'a pas été trouvé - + Savestates Points de récupération - + Warning: Savestates are NOT a replacement for in-application saves, and are not meant to be reliable. Use at your own risk! @@ -4571,86 +4597,86 @@ Use at your own risk! À utiliser à vos risques et périls ! - - - + + + Error opening amiibo data file Erreur d'ouverture du fichier de données amiibo - + A tag is already in use. Un tag est déjà en cours d'utilisation. - + Application is not looking for amiibos. L'application ne recherche pas d'amiibos. - + Amiibo File (%1);; All Files (*.*) Fichier Amiibo (%1);; Tous les fichiers (*.*) - + Load Amiibo Charger un Amiibo - + Unable to open amiibo file "%1" for reading. Impossible d'ouvrir le fichier amiibo "%1" pour le lire. - + Record Movie Enregistrer une vidéo - + Movie recording cancelled. Enregistrement de la vidéo annulé. - - + + Movie Saved Vidéo enregistrée - - + + The movie is successfully saved. La vidéo a été enregistrée avec succès. - + Application will unpause L'application sera rétablie. - + The application will be unpaused, and the next frame will be captured. Is this okay? L'application sera rétablie et l'image suivante sera capturée. Cela vous convient-il ? - + Invalid Screenshot Directory Répertoire des captures d'écran invalide - + Cannot create specified screenshot directory. Screenshot path is set back to its default value. Création du répertoire des captures d'écran spécifié impossible. Le chemin d'accès vers les captures d'écran est réinitialisé à sa valeur par défaut. - + Could not load video dumper Impossible de charger le module de capture vidéo. - + FFmpeg could not be loaded. Make sure you have a compatible version installed. To install FFmpeg to Azahar, press Open and select your FFmpeg directory. @@ -4663,275 +4689,265 @@ Pour installer FFmpeg sur Azahar, appuyez sur Ouvrir et sélectionnez votre rép Pour afficher un guide sur l'installation de FFmpeg, appuyez sur Aide. - - Load 3DS ROM File - Charger le fichier ROM 3DS + + Load 3DS ROM Files + - - 3DS ROM Files (*.cia *cci *3dsx *cxi) - Fichiers ROM 3DS (*.cia *cci *3dsx *cxi) + + 3DS ROM Files (*.cia *.cci *.3dsx *.cxi) + - - The selected file is not a compatible 3DS ROM format. Make sure you have chosen the right file, and that it is not encrypted. - Le fichier sélectionné n'est pas au format ROM 3DS compatible. Assurez-vous d'avoir choisi le bon fichier et qu'il n'est pas crypté. - - - - The selected file is already compressed. - Le fichier sélectionné est déjà compressé. - - - + 3DS Compressed ROM File (*.%1) Fichier ROM compressé 3DS (*.%1) - + Save 3DS Compressed ROM File Enregistrer le fichier ROM compressé 3DS - - Load 3DS Compressed ROM File - Charger le fichier ROM compressé 3DS + + Select Output 3DS Compressed ROM Folder + - + + Load 3DS Compressed ROM Files + + + + 3DS Compressed ROM Files (*.zcia *zcci *z3dsx *zcxi) Fichiers ROM compressés 3DS (*.zcia *zcci *z3dsx *zcxi) - - The selected file is not a compatible compressed 3DS ROM format. Make sure you have chosen the right file. - Le fichier sélectionné n'est pas au format ROM 3DS compressé compatible. Assurez-vous d'avoir choisi le bon fichier. - - - - The selected file is already decompressed. - Le fichier sélectionné est déjà décompressé. - - - + 3DS ROM File (*.%1) Fichier ROM 3DS (*.%1) - + Save 3DS ROM File Enregistrer le fichier ROM 3DS - + + Select Output 3DS ROM Folder + + + + Select FFmpeg Directory Sélectionnez le répertoire FFmpeg. - + The provided FFmpeg directory is missing %1. Please make sure the correct directory was selected. Le répertoire FFmpeg fourni manque %1. Assurez-vous d'avoir sélectionné le répertoire correct. - + FFmpeg has been sucessfully installed. FFmpeg a été installé avec succès. - + Installation of FFmpeg failed. Check the log file for details. L'installation de FFmpeg a échoué. Consultez le fichier journal pour plus de détails. - + Could not start video dumping.<br>Please ensure that the video encoder is configured correctly.<br>Refer to the log for details. Impossible de lancer le dump vidéo.<br>Veuillez vous assurer que l'encodeur vidéo est configuré correctement.<br>Reportez-vous au logs pour plus de détails. - + Recording %1 Enregistrement %1 - + Playing %1 / %2 Lecture de %1 / %2 - + Movie Finished Vidéo terminée - + (Accessing SharedExtData) (Accès à SharedExtData) - + (Accessing SystemSaveData) (Accès à SystemSaveData) - + (Accessing BossExtData) (Accès à BossExtData) - + (Accessing ExtData) (Accès à ExtData) - + (Accessing SaveData) (Accès à SaveData) - + MB/s Mo/s - + KB/s Ko/s - + Artic Traffic: %1 %2%3 Trafic Artic : %1 %2%3 - + Speed: %1% Vitesse : %1% - + Speed: %1% / %2% Vitesse : %1% / %2% - + App: %1 FPS App: %1 FPS - + Frame: %1 ms (GPU: [CMD: %2 ms, SWP: %3 ms], IPC: %4 ms, SVC: %5 ms, Rem: %6 ms) Frame: %1 ms (CPU: [CMD: %2 ms, SWP: %3 ms], IPC: %4 ms, SVC: %5 ms, Rem: %6 ms) - + Frame: %1 ms Trame : %1 ms - + VOLUME: MUTE VOLUME : MUET - + VOLUME: %1% Volume percentage (e.g. 50%) VOLUME : %1% - + %1 is missing. Please <a href='https://web.archive.org/web/20240304201103/https://citra-emu.org/wiki/dumping-system-archives-and-the-shared-fonts-from-a-3ds-console/'>dump your system archives</a>.<br/>Continuing emulation may result in crashes and bugs. %1 est manquant. Veuillez <a href='https://web.archive.org/web/20240304201103/https://citra-emu.org/wiki/dumping-system-archives-and-the-shared-fonts-from-a-3ds-console/'>vider les archives de votre système</a>. <br/>La poursuite de l'émulation peut entraîner des plantages et des bogues. - + A system archive Une archive système - + System Archive Not Found Archive système non trouvée - + System Archive Missing Archive système absente - + Save/load Error Erreur de sauvegarde/chargement - + Fatal Error Erreur fatale - + A fatal error occurred. <a href='https://web.archive.org/web/20240228001712/https://community.citra-emu.org/t/how-to-upload-the-log-file/296'>Check the log</a> for details.<br/>Continuing emulation may result in crashes and bugs. Une erreur fatale s'est produite. <a href='https://web.archive.org/web/20240228001712/https://community.citra-emu.org/t/how-to-upload-the-log-file/296'>Consultez le journal</a> pour plus de détails.<br/> La poursuite de l'émulation peut entraîner des plantages et des bogues. - + Fatal Error encountered Une erreur fatale s'est produite - + Continue Continuer - + Quit Application Quitter l'application - + OK OK - + Would you like to exit now? Voulez-vous quitter maintenant ? - + The application is still running. Would you like to stop emulation? L'application est toujours en cours d'exécution. Voulez-vous arrêter l'émulation ? - + Playback Completed Lecture terminée - + Movie playback completed. Lecture de la vidéo terminée. - + Update Available Mise à jour disponible - + Update %1 for Azahar is available. Would you like to download it? La mise à jour %1 pour Azahar est disponible. Souhaitez-vous la télécharger ? - + Primary Window Fenêtre principale - + Secondary Window Fenêtre secondaire @@ -5037,175 +5053,190 @@ Souhaitez-vous la télécharger ? GameList - + IMPORTANT: Encrypted files and .3ds files are no longer supported. Decrypting and/or renaming to .cci may be necessary. <a href='https://azahar-emu.org/blog/game-loading-changes/'>Learn more.</a> IMPORTANT : Les fichiers encryptés et les fichiers .3ds ne sont plus pris en charge. Il peut être nécessaire de les décrypter et/ou de les renommer en .cci. <a href='https://azahar-emu.org/blog/game-loading-changes/'>En savoir plus.</a> - + Don't show again Ne pas montrer à nouveau - - + + Compatibility Compatibilité - - + + Region Région - - + + File type Type de fichier - - + + Size Taille - - + + Play time Temps de jeu - + Favorite Favori - + + Eject Cartridge + + + + + Insert Cartridge + + + + Open Ouvrir - + Application Location Chemin de l'application - + Save Data Location Chemin des données de sauvegarde - + Extra Data Location Chemin des données additionnelles - + Update Data Location Chemin des données de mise à jour - + DLC Data Location Chemin des données de DLC - + Texture Dump Location Chemin d'extraction de textures - + Custom Texture Location Chemin des textures personnalisées - + Mods Location Emplacement des Mods - + Dump RomFS Extraire RomFS - + Disk Shader Cache Cache de shader de disque - + Open Shader Cache Location Ouvrir l'emplacement du cache de shader - + Delete OpenGL Shader Cache Supprimer le cache de shader OpenGL - + Uninstall Désinstaller - + Everything Tout - + Application Application - + Update Mise à jour - + DLC DLC - + Remove Play Time Data Retirer les données de temps de jeu - + Create Shortcut Créer un raccourci - + Add to Desktop Ajouter au bureau - + Add to Applications Menu Ajouter au menu d'applications - + + Stress Test: App Launch + + + + Properties Propriétés - - - - + + + + Azahar Azahar - + Are you sure you want to completely uninstall '%1'? This will delete the application if installed, as well as any installed updates or DLC. @@ -5214,64 +5245,64 @@ This will delete the application if installed, as well as any installed updates Cela supprimera l'application si elle est installée, ainsi que toutes ses mises à jour et DLCs. - - + + %1 (Update) %1 (Mise à jour) - - + + %1 (DLC) %1 (DLC) - + Are you sure you want to uninstall '%1'? Êtes-vous sûr de vouloir désinstaller '%1' ? - + Are you sure you want to uninstall the update for '%1'? Êtes-vous sûr de vouloir désinstaller la mise à jour de '%1' ? - + Are you sure you want to uninstall all DLC for '%1'? Êtes-vous sûr de vouloir désinstaller le DLC de '%1' ? - + Scan Subfolders Scanner les sous-dossiers - + Remove Application Directory Supprimer le répertoire d'applications - + Move Up Déplacer en haut - + Move Down Déplacer en bas - + Open Directory Location Ouvrir l'emplacement de ce répertoire - + Clear Effacer - + Name Nom @@ -5279,82 +5310,82 @@ Cela supprimera l'application si elle est installée, ainsi que toutes ses GameListItemCompat - + Perfect Parfait - + App functions flawless with no audio or graphical glitches, all tested functionality works as intended without any workarounds needed. L'application fonctionne parfaitement, sans problème audio ou graphique, et toutes les fonctionnalités testées fonctionnent comme prévu sans qu'aucune solution. de contournement ne soit nécessaire. - + Great Bien - + App functions with minor graphical or audio glitches and is playable from start to finish. May require some workarounds. L'application fonctionne avec quelques glitches graphiques et/ou audios et est jouable du début à la fin. Peut demander quelques contournements. - + Okay Ok - + App functions with major graphical or audio glitches, but app is playable from start to finish with workarounds. L'application fonctionne avec des glitches graphiques et/ou audios majeurs, mais l'appli est jouable du début à la fin avec des contournements. - + Bad Mauvais - + App functions, but with major graphical or audio glitches. Unable to progress in specific areas due to glitches even with workarounds. L'appli fonctionne, mais avec des glitches graphiques et/ou audios majeurs. Difficile de progresser dans des endroits spécifiques à cause des glitches même avec des contournements. - + Intro/Menu Intro/Menu - + App is completely unplayable due to major graphical or audio glitches. Unable to progress past the Start Screen. L'appli est complètement injouable à cause des glitches audios et graphiques majeurs. Difficile de progresser après l'écran de démarrage. - + Won't Boot Ne se lance pas - + The app crashes when attempting to startup. L'application plante au démarrage. - + Not Tested Non testé - + The app has not yet been tested. L'appli n'a pas été testée. Référez-vous aux versions américaines pour voir les potentiels tests effectués ! @@ -5362,7 +5393,7 @@ de démarrage. GameListPlaceholder - + Double-click to add a new folder to the application list Double-cliquez pour ajouter un nouveau dossier à la liste des applications. @@ -5370,27 +5401,27 @@ de démarrage. GameListSearchField - + of sur - + result résultat - + results résultats - + Filter: Filtre : - + Enter pattern to filter Entrer le motif de filtrage @@ -5718,87 +5749,87 @@ de démarrage. Index du cycle : - + SRC1: %1, %2, %3, %4 SRC1 : %1, %2, %3, %4 - + SRC2: %1, %2, %3, %4 SRC2 : %1, %2, %3, %4 - + SRC3: %1, %2, %3, %4 SRC3 : %1, %2, %3, %4 - + DEST_IN: %1, %2, %3, %4 DEST_IN : %1, %2, %3, %4 - + DEST_OUT: %1, %2, %3, %4 DEST_OUT : %1, %2, %3, %4 - + Address Registers: %1, %2 Adresse des Registres : %1, %2 - + Compare Result: %1, %2 Comparer le résultat : %1, %2 - + Static Condition: %1 Condition Statique : %1 - + Dynamic Conditions: %1, %2 Conditions Dynamiques : %1, %2 - + Loop Parameters: %1 (repeats), %2 (initializer), %3 (increment), %4 Paramètres de la boucle : %1 (répétitions), %2 (initialisation), %3 (incrémentation), %4 - + Instruction offset: 0x%1 Instruction offset : 0x%1 - + -> 0x%2 -> 0x%2 - + (last instruction) (instruction précédente) @@ -6099,32 +6130,32 @@ Message de débogage : Mot de passe : - + Room Name Nom du salon - + Preferred Application Application favorite - + Host Hôte - + Players Joueurs - + Refreshing Actualisation - + Refresh List Actualiser la liste @@ -7126,32 +7157,32 @@ Il a peut-être quitté la salon. %1 (0x%2) - + Unsupported encrypted application Application chiffrée non supportée - + Invalid region Région Invalide - + Installed Titles Titres installés - + System Titles Titres système - + Add New Application Directory Ajouter un nouvel emplacement d'applications - + Favorites Favorites diff --git a/dist/languages/hu_HU.ts b/dist/languages/hu_HU.ts index 0d18a05a7..498f826c8 100644 --- a/dist/languages/hu_HU.ts +++ b/dist/languages/hu_HU.ts @@ -290,8 +290,8 @@ This would ban both their forum username and their IP address. - Emulation: - Emuláció: + Emulation + Emuláció @@ -395,6 +395,7 @@ This would ban both their forum username and their IP address. + Camera Kamera @@ -406,8 +407,8 @@ This would ban both their forum username and their IP address. - Camera to configure: - Konfigurálandó kamera: + Camera to Configure + @@ -427,8 +428,8 @@ This would ban both their forum username and their IP address. - Camera mode: - Kamera mód: + Camera mode + @@ -448,8 +449,8 @@ This would ban both their forum username and their IP address. - Camera position: - Kamera pozíció: + Camera position + @@ -474,8 +475,8 @@ This would ban both their forum username and their IP address. - Camera Image Source: - Kamera Kép Forrása: + Camera Image Source + @@ -494,8 +495,8 @@ This would ban both their forum username and their IP address. - File: - Fájl: + File + @@ -508,11 +509,6 @@ This would ban both their forum username and their IP address. Select the system camera to use Válaszd ki a használandó rendszerkamerát - - - Camera: - Kamera: - <Default> @@ -526,8 +522,8 @@ This would ban both their forum username and their IP address. - Flip: - Forgatás: + Flip + @@ -1080,7 +1076,7 @@ Szeretnéd figyelmen kívül hagyni a hibát, és folytatod? - Reverse Side by Side + Side by Side Full Width @@ -1139,48 +1135,53 @@ Szeretnéd figyelmen kívül hagyni a hibát, és folytatod? - + + Swap Eyes + + + + Utility Segédprogramok - + <html><head/><body><p>Replace textures with PNG files.</p><p>Textures are loaded from load/textures/[Title ID]/.</p></body></html> - - Use Custom Textures - Egyéni textúrák használata + + Use custom textures + - + <html><head/><body><p>Dump textures to PNG files.</p><p>Textures are dumped to dump/textures/[Title ID]/.</p></body></html> - - Dump Textures - Textúrák kimentése + + Dump textures + - + <html><head/><body><p>Load all custom textures into memory on boot, instead of loading them when the application requires them.</p></body></html> - - Preload Custom Textures - Egyéni textúrák előtöltése + + Preload custom textures + - + <html><head/><body><p>Load custom textures asynchronously with background threads to reduce loading stutter</p></body></html> - - Async Custom Texture Loading + + Async custom texture loading @@ -1238,13 +1239,13 @@ Szeretnéd figyelmen kívül hagyni a hibát, és folytatod? - Set emulation speed: - Emuláció sebességének beállítása: + Set emulation speed + - Emulation Speed: - Emuláció sebessége: + Emulation Speed + @@ -1355,12 +1356,12 @@ Szeretnéd figyelmen kívül hagyni a hibát, és folytatod? - SPIR-V Shader Generation + SPIR-V shader generation - Disable GLSL -> SPIR-V Optimizer + Disable GLSL -> SPIR-V optimizer @@ -1380,8 +1381,8 @@ Szeretnéd figyelmen kívül hagyni a hibát, és folytatod? - Enable Hardware Shader - Hardver Shader Bekapcsolása + Enable hardware shader + @@ -1390,8 +1391,8 @@ Szeretnéd figyelmen kívül hagyni a hibát, és folytatod? - Accurate Multiplication - Pontos Szorzás + Accurate multiplication + @@ -1400,8 +1401,8 @@ Szeretnéd figyelmen kívül hagyni a hibát, és folytatod? - Enable Shader JIT - Shader JIT Bekapcsolása + Enable shader JIT + @@ -1410,7 +1411,7 @@ Szeretnéd figyelmen kívül hagyni a hibát, és folytatod? - Enable Async Shader Compilation + Enable async shader compilation @@ -1420,8 +1421,8 @@ Szeretnéd figyelmen kívül hagyni a hibát, és folytatod? - Enable Async Presentation - Aszinkron prezentálás engedélyezése + Enable async presentation + @@ -1460,7 +1461,7 @@ Szeretnéd figyelmen kívül hagyni a hibát, és folytatod? - Use Disk Shader Cache + Use disk shader cache @@ -1485,7 +1486,7 @@ Szeretnéd figyelmen kívül hagyni a hibát, és folytatod? - Delay application render thread: + Delay Application Render Thread @@ -1974,12 +1975,12 @@ Szeretnéd figyelmen kívül hagyni a hibát, és folytatod? - Swap Screens - Képernyők Cseréje + Swap screens + - Rotate Screens Upright + Rotate screens upright @@ -2096,7 +2097,7 @@ Szeretnéd figyelmen kívül hagyni a hibát, és folytatod? - <html><head/><body><p>Bottom Screen Opacity % (OpenGL Only)</p></body></html> + <html><head/><body><p>Bottom Screen Opacity %</p></body></html> @@ -2444,8 +2445,8 @@ Szeretnéd figyelmen kívül hagyni a hibát, és folytatod? - Use Virtual SD - Virtuális SD használata + Use virtual SD card + @@ -2454,8 +2455,8 @@ Szeretnéd figyelmen kívül hagyni a hibát, és folytatod? - Use Custom Storage - Egyéni tárhely használata + Use custom storage location + @@ -2541,8 +2542,8 @@ online features (if installed) - Region: - + Region + Régió @@ -2550,326 +2551,337 @@ online features (if installed) - + + Apply region free patch to +installed applications. + + + + + Patches the region of installed applications to be region free, so that they always appear on the home menu. + + + + Username Felhasználónév - + Birthday Születésnap - + January Január - + February Február - + March Március - + April Április - + May Május - + June Június - + July Július - + August Augusztus - + September Szeptember - + October Október - + November November - + December December - + Language Nyelv - + Note: this can be overridden when region setting is auto-select Megjegyzés: Ez felülírható ha a régió auto-kiválasztásra van beállítva - + Japanese (日本語) Japán (日本語) - + English English - + French (français) Francia (français) - + German (Deutsch) Német (Deutsch) - + Italian (italiano) Italian (Italiano) - + Spanish (español) Spanyol (español) - + Simplified Chinese (简体中文) Egyszerűsített Kínai (简体中文) - + Korean (한국어) Koreai (한국어) - + Dutch (Nederlands) Holland (Nederlands) - + Portuguese (português) Portugál (português) - + Russian (Русский) Russian (Русский) - + Traditional Chinese (正體中文) Hagyományos Kínai (正體中文) - + Sound output mode Hang kimeneteli mód - + Mono Monó - + Stereo Sztereó - + Surround Surround - + Country Ország - + Clock Óra - + System Clock Rendszeróra - + Fixed Time Fix idő - + Startup time - + yyyy-MM-ddTHH:mm:ss - + Offset time - + days - + HH:mm:ss - + Initial System Ticks - + Random Véletlenszerű - + Fixed Fix - + Initial System Ticks Override - + Play Coins - + <html><head/><body><p>Number of steps per hour reported by the pedometer. Range from 0 to 65,535.</p></body></html> - + Pedometer Steps per Hour - + Run System Setup when Home Menu is launched - + Console ID: Konzol ID: - - + + Regenerate Regenerálás - + MAC: - - 3GX Plugin Loader: + + 3GX Plugin Loader - + Enable 3GX plugin loader - + Allow applications to change plugin loader state - + Real Console Unique Data - + Your real console is linked to Azahar. - + Unlink - + OTP - - - - + + + + Choose - + SecureInfo_A/B - + LocalFriendCodeSeed_A/B - + movable.sed - + System settings are available only when applications is not running. @@ -3579,76 +3591,76 @@ online features (if installed) - - + + Console ID: 0x%1 Konzol ID: 0x%1 - - + + MAC: %1 - + This will replace your current virtual 3DS console ID with a new one. Your current virtual 3DS console ID will not be recoverable. This might have unexpected effects in applications. This might fail if you use an outdated config save. Continue? - - - + + + Warning Figyelem - + This will replace your current MAC address with a new one. It is not recommended to do this if you got the MAC address from your real console using the setup tool. Continue? - + This action will unlink your real console from Azahar, with the following consequences:<br><ul><li>Your OTP, SecureInfo and LocalFriendCodeSeed will be removed from Azahar.</li><li>Your friend list will reset and you will be logged out of your NNID/PNID account.</li><li>System files and eshop titles obtained through Azahar will become inaccessible until the same console is linked again (save data will not be lost).</li></ul><br>Continue? - + Invalid country for configured region - + Invalid country for console unique data - + Status: Loaded - + Status: Loaded (Invalid Signature) - + Status: Loaded (Region Changed) - + Status: Not Found - + Status: Invalid - + Status: IO Error @@ -3763,13 +3775,13 @@ Drag points to change position, or double-click table cells to edit values. - Interface language: - Kezelőfelület nyelve: + Interface Language + - Theme: - Téma: + Theme + @@ -3778,8 +3790,8 @@ Drag points to change position, or double-click table cells to edit values. - Icon Size: - Ikonméret: + Icon Size + @@ -3799,8 +3811,8 @@ Drag points to change position, or double-click table cells to edit values. - Row 1 Text: - 1. sor szövege: + Row 1 Text + @@ -3834,17 +3846,17 @@ Drag points to change position, or double-click table cells to edit values. - Row 2 Text: - 2. sor szövege: + Row 2 Text + - Hide Titles without Icon - Ikon nélküli játékok elrejtése + Hide titles without icon + - Single Line Mode + Single line mode @@ -3854,7 +3866,7 @@ Drag points to change position, or double-click table cells to edit values. - Show Advanced Frame Time Info + Show advanced frame time info @@ -3937,12 +3949,12 @@ Drag points to change position, or double-click table cells to edit values. DirectConnectWindow - + Connecting Kapcsolódás - + Connect Kapcsolás @@ -4061,581 +4073,595 @@ Please check your FFmpeg installation used for compilation. GMainWindow - + No Suitable Vulkan Devices Detected - + Vulkan initialization failed during boot.<br/>Your GPU may not support Vulkan 1.1, or you do not have the latest graphics driver. - + Current Artic traffic speed. Higher values indicate bigger transfer loads. - - + + Current emulation speed. Values higher or lower than 100% indicate emulation is running faster or slower than a 3DS. Jelenlegi emulációs sebesség. A 100%-nál nagyobb vagy kisebb értékek azt mutatják, hogy az emuláció egy 3DS-nél gyorsabban vagy lassabban fut. - - + + How many frames per second the app is currently displaying. This will vary from app to app and scene to scene. - - + + Time taken to emulate a 3DS frame, not counting framelimiting or v-sync. For full-speed emulation this should be at most 16.67 ms. Mennyi idő szükséges egy 3DS képkocka emulálásához, képkocka-limit vagy V-Syncet leszámítva. Teljes sebességű emulációnál ez maximum 16.67 ms-nek kéne lennie. - + MicroProfile (unavailable) - + Clear Recent Files Legutóbbi fájlok törlése - + &Continue &Folytatás - + &Pause &Szünet - + Azahar is running an application TRANSLATORS: This string is shown to the user to explain why Citra needs to prevent the computer from sleeping - - + + Invalid App Format - - + + Your app format is not supported.<br/>Please follow the guides to redump your <a href='https://web.archive.org/web/20240304210021/https://citra-emu.org/wiki/dumping-game-cartridges/'>game cartridges</a> or <a href='https://web.archive.org/web/20240304210011/https://citra-emu.org/wiki/dumping-installed-titles/'>installed titles</a>. - + App Corrupted - + Your app is corrupted. <br/>Please follow the guides to redump your <a href='https://web.archive.org/web/20240304210021/https://citra-emu.org/wiki/dumping-game-cartridges/'>game cartridges</a> or <a href='https://web.archive.org/web/20240304210011/https://citra-emu.org/wiki/dumping-installed-titles/'>installed titles</a>. - + App Encrypted - + Your app is encrypted. <br/><a href='https://azahar-emu.org/blog/game-loading-changes/'>Please check our blog for more info.</a> - + Unsupported App - + GBA Virtual Console is not supported by Azahar. - - + + Artic Server - + + Invalid system mode + + + + + New 3DS exclusive applications cannot be loaded without enabling the New 3DS mode. + + + + Error while loading App! - + An unknown error occurred. Please see the log for more details. - + CIA must be installed before usage - + Before using this CIA, you must install it. Do you want to install it now? - + Quick Load - + Quick Save - - + + Slot %1 Foglalat %1 - + %2 %3 - + Quick Save - %1 - + Quick Load - %1 - + Slot %1 - %2 %3 Foglalat %1 - %2 %3 - + Error Opening %1 Folder Hiba %1 Mappa Megnyitásában - - + + Folder does not exist! A mappa nem létezik! - + Remove Play Time Data - + Reset play time? - - - - + + + + Create Shortcut - + Do you want to launch the application in fullscreen? - + Successfully created a shortcut to %1 - + This will create a shortcut to the current AppImage. This may not work well if you update. Continue? - + Failed to create a shortcut to %1 - + Create Icon - + Cannot create icon file. Path "%1" does not exist and cannot be created. - + Dumping... Kimentés... - - + + Cancel Mégse - - - - - - - - - + + + + + + + + + Azahar - + Could not dump base RomFS. Refer to the log for details. - + Error Opening %1 Hiba Indulás %1 - + Select Directory Könyvtár Kiválasztása - + Properties Tulajdonságok - + The application properties could not be loaded. - + 3DS Executable (%1);;All Files (*.*) %1 is an identifier for the 3DS executable file extensions. 3DS állományok (%1);;Minden fájl (*.*) - + Load File Fájl Betöltése - - + + Set Up System Files - + <p>Azahar needs console unique data and firmware files from a real console to be able to use some of its features.<br>Such files and data can be set up with the <a href=https://github.com/azahar-emu/ArticSetupTool>Azahar Artic Setup Tool</a><br>Notes:<ul><li><b>This operation will install console unique data to Azahar, do not share your user or nand folders<br>after performing the setup process!</b></li><li>While doing the setup process, Azahar will link to the console running the setup tool. You can unlink the<br>console later from the System tab in the emulator configuration menu.</li><li>Do not go online with both Azahar and your 3DS console at the same time after setting up system files,<br>as it could cause issues.</li><li>Old 3DS setup is needed for the New 3DS setup to work (doing both setup modes is recommended).</li><li>Both setup modes will work regardless of the model of the console running the setup tool.</li></ul><hr></p> - + Enter Azahar Artic Setup Tool address: - + <br>Choose setup mode: - + (ℹ️) Old 3DS setup - - + + Setup is possible. - + (⚠) New 3DS setup - + Old 3DS setup is required first. - + (✅) Old 3DS setup - - + + Setup completed. - + (ℹ️) New 3DS setup - + (✅) New 3DS setup - + The system files for the selected mode are already set up. Reinstall the files anyway? - + Load Files Fájlok Betöltése - + 3DS Installation File (*.cia *.zcia) - - - + + + All Files (*.*) Minden fájl (*.*) - + Connect to Artic Base - + Enter Artic Base server address: - + %1 has been installed successfully. %1 sikeresen fel lett telepítve. - + Unable to open File A fájl megnyitása sikertelen - + Could not open %1 Nem lehet megnyitni: %1 - + Installation aborted Telepítés megszakítva - + The installation of %1 was aborted. Please see the log for more details %1 telepítése meg lett szakítva. Kérjük olvasd el a naplót több részletért. - + Invalid File Ismeretlen Fájl - + %1 is not a valid CIA %1 nem érvényes CIA - + CIA Encrypted - + Your CIA file is encrypted.<br/><a href='https://azahar-emu.org/blog/game-loading-changes/'>Please check our blog for more info.</a> - + Unable to find File A fájl nem található - + Could not find %1 %1 nem található - - - - Error compressing file + + + + + Z3DS Compression - - File compress operation failed, check log for details. + + Failed to compress some files, check log for details. - - - - Error decompressing file + + Failed to decompress some files, check log for details. - - File decompress operation failed, check log for details. + + All files have been compressed successfully. - + + All files have been decompressed successfully. + + + + Uninstalling '%1'... '%1' eltávolítása... - + Failed to uninstall '%1'. '%1' eltávolítása sikertelen. - + Successfully uninstalled '%1'. '%1' sikeresen eltávolítva. - + File not found A fájl nem található - + File "%1" not found Fájl "%1" nem található - + Savestates - + Warning: Savestates are NOT a replacement for in-application saves, and are not meant to be reliable. Use at your own risk! - - - + + + Error opening amiibo data file - + A tag is already in use. - + Application is not looking for amiibos. - + Amiibo File (%1);; All Files (*.*) Amiibo fájl (%1);; Minden fájl (*.*) - + Load Amiibo Amiibo betöltése - + Unable to open amiibo file "%1" for reading. - + Record Movie Film felvétele - + Movie recording cancelled. Filmfelvétel megszakítva. - - + + Movie Saved Film mentve - - + + The movie is successfully saved. A film sikeresen mentve. - + Application will unpause - + The application will be unpaused, and the next frame will be captured. Is this okay? - + Invalid Screenshot Directory - + Cannot create specified screenshot directory. Screenshot path is set back to its default value. - + Could not load video dumper - + FFmpeg could not be loaded. Make sure you have a compatible version installed. To install FFmpeg to Azahar, press Open and select your FFmpeg directory. @@ -4644,274 +4670,264 @@ To view a guide on how to install FFmpeg, press Help. - - Load 3DS ROM File + + Load 3DS ROM Files - - 3DS ROM Files (*.cia *cci *3dsx *cxi) + + 3DS ROM Files (*.cia *.cci *.3dsx *.cxi) - - The selected file is not a compatible 3DS ROM format. Make sure you have chosen the right file, and that it is not encrypted. - - - - - The selected file is already compressed. - - - - + 3DS Compressed ROM File (*.%1) - + Save 3DS Compressed ROM File - - Load 3DS Compressed ROM File + + Select Output 3DS Compressed ROM Folder - + + Load 3DS Compressed ROM Files + + + + 3DS Compressed ROM Files (*.zcia *zcci *z3dsx *zcxi) - - The selected file is not a compatible compressed 3DS ROM format. Make sure you have chosen the right file. - - - - - The selected file is already decompressed. - - - - + 3DS ROM File (*.%1) - + Save 3DS ROM File - + + Select Output 3DS ROM Folder + + + + Select FFmpeg Directory FFmpeg könyvtár kiválasztása - + The provided FFmpeg directory is missing %1. Please make sure the correct directory was selected. - + FFmpeg has been sucessfully installed. FFmpeg sikeresen telepítve. - + Installation of FFmpeg failed. Check the log file for details. - + Could not start video dumping.<br>Please ensure that the video encoder is configured correctly.<br>Refer to the log for details. - + Recording %1 Felvétel %1 - + Playing %1 / %2 Lejátszás %1 / %2 - + Movie Finished Film befejezve - + (Accessing SharedExtData) - + (Accessing SystemSaveData) - + (Accessing BossExtData) - + (Accessing ExtData) - + (Accessing SaveData) - + MB/s - + KB/s - + Artic Traffic: %1 %2%3 - + Speed: %1% Sebesség: %1% - + Speed: %1% / %2% Sebesség: %1% / %2% - + App: %1 FPS - + Frame: %1 ms (GPU: [CMD: %2 ms, SWP: %3 ms], IPC: %4 ms, SVC: %5 ms, Rem: %6 ms) - + Frame: %1 ms Képkocka: %1 ms - + VOLUME: MUTE HANGERŐ: NÉMÍTVA - + VOLUME: %1% Volume percentage (e.g. 50%) HANGERŐ: %1% - + %1 is missing. Please <a href='https://web.archive.org/web/20240304201103/https://citra-emu.org/wiki/dumping-system-archives-and-the-shared-fonts-from-a-3ds-console/'>dump your system archives</a>.<br/>Continuing emulation may result in crashes and bugs. - + A system archive Egy rendszerarchívum - + System Archive Not Found Rendszerarchívum Nem Található - + System Archive Missing - + Save/load Error Mentési/betöltési hiba - + Fatal Error Kritikus Hiba - + A fatal error occurred. <a href='https://web.archive.org/web/20240228001712/https://community.citra-emu.org/t/how-to-upload-the-log-file/296'>Check the log</a> for details.<br/>Continuing emulation may result in crashes and bugs. - + Fatal Error encountered Végzetes hiba lépett fel - + Continue Folytatás - + Quit Application - + OK OK - + Would you like to exit now? Szeretnél most kilépni? - + The application is still running. Would you like to stop emulation? - + Playback Completed - + Movie playback completed. - + Update Available - + Update %1 for Azahar is available. Would you like to download it? - + Primary Window Elsődleges ablak - + Secondary Window Másodlagos ablak @@ -5017,239 +5033,254 @@ Would you like to download it? GameList - + IMPORTANT: Encrypted files and .3ds files are no longer supported. Decrypting and/or renaming to .cci may be necessary. <a href='https://azahar-emu.org/blog/game-loading-changes/'>Learn more.</a> - + Don't show again - - + + Compatibility Kompatibilitás - - + + Region Régió - - + + File type Fájltípus - - + + Size Méret - - + + Play time - + Favorite - + + Eject Cartridge + + + + + Insert Cartridge + + + + Open Megnyitás - + Application Location - + Save Data Location - + Extra Data Location - + Update Data Location - + DLC Data Location - + Texture Dump Location - + Custom Texture Location - + Mods Location - + Dump RomFS RomFS kimentése - + Disk Shader Cache Lemez árnyékoló-gyorsítótár - + Open Shader Cache Location - + Delete OpenGL Shader Cache OpenGL árnyékoló gyorsítótár törlése - + Uninstall Eltávolítás - + Everything Minden - + Application - + Update Frissítés - + DLC DLC - + Remove Play Time Data - + Create Shortcut - + Add to Desktop - + Add to Applications Menu - + + Stress Test: App Launch + + + + Properties Tulajdonságok - - - - + + + + Azahar - + Are you sure you want to completely uninstall '%1'? This will delete the application if installed, as well as any installed updates or DLC. - - + + %1 (Update) %1 (frissítés) - - + + %1 (DLC) %1 (DLC) - + Are you sure you want to uninstall '%1'? Biztosan törölni szeretnéd: '%1'? - + Are you sure you want to uninstall the update for '%1'? Biztosan törölni szeretnéd a(z) '%1' frissítését? - + Are you sure you want to uninstall all DLC for '%1'? Biztosan törölni szeretnéd a(z) '%1' összes DLC-jét? - + Scan Subfolders Almappák szkennelése - + Remove Application Directory - + Move Up Feljebb mozgatás - + Move Down Lejjebb mozgatás - + Open Directory Location - + Clear Törlés - + Name Név @@ -5257,77 +5288,77 @@ This will delete the application if installed, as well as any installed updates GameListItemCompat - + Perfect Tökéletes - + App functions flawless with no audio or graphical glitches, all tested functionality works as intended without any workarounds needed. - + Great - + App functions with minor graphical or audio glitches and is playable from start to finish. May require some workarounds. - + Okay Rendben - + App functions with major graphical or audio glitches, but app is playable from start to finish with workarounds. - + Bad Rossz - + App functions, but with major graphical or audio glitches. Unable to progress in specific areas due to glitches even with workarounds. - + Intro/Menu Intro/Menü - + App is completely unplayable due to major graphical or audio glitches. Unable to progress past the Start Screen. - + Won't Boot Nem indul - + The app crashes when attempting to startup. - + Not Tested Nem tesztelt - + The app has not yet been tested. @@ -5335,7 +5366,7 @@ Screen. GameListPlaceholder - + Double-click to add a new folder to the application list @@ -5343,27 +5374,27 @@ Screen. GameListSearchField - + of - + result eredmény - + results eredmény - + Filter: Szürő: - + Enter pattern to filter Adj meg egy mintát a szűréshez @@ -5691,87 +5722,87 @@ Screen. Ciklus Index: - + SRC1: %1, %2, %3, %4 SRC1: %1, %2, %3, %4 - + SRC2: %1, %2, %3, %4 SRC2: %1, %2, %3, %4 - + SRC3: %1, %2, %3, %4 SRC3: %1, %2, %3, %4 - + DEST_IN: %1, %2, %3, %4 DEST_IN: %1, %2, %3, %4 - + DEST_OUT: %1, %2, %3, %4 DEST_OUT: %1, %2, %3, %4 - + Address Registers: %1, %2 Címregisztrációk: %1, %2 - + Compare Result: %1, %2 Eredmény Összehasonlítása: %1, %2 - + Static Condition: %1 Statikus Állapot: %1 - + Dynamic Conditions: %1, %2 Dinamikus Állapotok: %1, %2 - + Loop Parameters: %1 (repeats), %2 (initializer), %3 (increment), %4 Loop Paraméterek: %1 (ismétlések), %2 (inicializáló), %3 (lépés), %4 - + Instruction offset: 0x%1 Instrukció eltolás: 0x%1 - + -> 0x%2 -> 0x%2 - + (last instruction) (utolsó instrukció) @@ -6071,32 +6102,32 @@ Debug Message: Jelszó: - + Room Name Szoba Neve - + Preferred Application - + Host Gazda - + Players Játékosok - + Refreshing Frissítés - + Refresh List Lista Frissítése @@ -7094,32 +7125,32 @@ They may have left the room. %1 (0x%2) - + Unsupported encrypted application - + Invalid region Érvénytelen régió - + Installed Titles Telepített játékok - + System Titles Rendszercímek - + Add New Application Directory - + Favorites diff --git a/dist/languages/id.ts b/dist/languages/id.ts index 525b71684..9eea441bb 100644 --- a/dist/languages/id.ts +++ b/dist/languages/id.ts @@ -292,8 +292,8 @@ Ini akan mem-banned nama pengguna dan alamat IP mereka - Emulation: - Emulasi: + Emulation + Emulasi @@ -397,6 +397,7 @@ Ini akan mem-banned nama pengguna dan alamat IP mereka + Camera Kamera @@ -408,8 +409,8 @@ Ini akan mem-banned nama pengguna dan alamat IP mereka - Camera to configure: - Kamera yang diatur: + Camera to Configure + @@ -429,8 +430,8 @@ Ini akan mem-banned nama pengguna dan alamat IP mereka - Camera mode: - Mode kamera: + Camera mode + @@ -450,8 +451,8 @@ Ini akan mem-banned nama pengguna dan alamat IP mereka - Camera position: - Posisi kamera: + Camera position + @@ -476,8 +477,8 @@ Ini akan mem-banned nama pengguna dan alamat IP mereka - Camera Image Source: - Sumber Gambar Kamera: + Camera Image Source + @@ -496,8 +497,8 @@ Ini akan mem-banned nama pengguna dan alamat IP mereka - File: - File: + File + @@ -510,11 +511,6 @@ Ini akan mem-banned nama pengguna dan alamat IP mereka Select the system camera to use Pilih kamera sistem untuk digunakan - - - Camera: - Kamera: - <Default> @@ -528,8 +524,8 @@ Ini akan mem-banned nama pengguna dan alamat IP mereka - Flip: - Balik: + Flip + @@ -1082,7 +1078,7 @@ Apakah Anda ingin mengabaikan kesalahan dan melanjutkan? - Reverse Side by Side + Side by Side Full Width @@ -1141,48 +1137,53 @@ Apakah Anda ingin mengabaikan kesalahan dan melanjutkan? - + + Swap Eyes + + + + Utility - + <html><head/><body><p>Replace textures with PNG files.</p><p>Textures are loaded from load/textures/[Title ID]/.</p></body></html> - - Use Custom Textures + + Use custom textures - + <html><head/><body><p>Dump textures to PNG files.</p><p>Textures are dumped to dump/textures/[Title ID]/.</p></body></html> - - Dump Textures + + Dump textures - + <html><head/><body><p>Load all custom textures into memory on boot, instead of loading them when the application requires them.</p></body></html> - - Preload Custom Textures + + Preload custom textures - + <html><head/><body><p>Load custom textures asynchronously with background threads to reduce loading stutter</p></body></html> - - Async Custom Texture Loading + + Async custom texture loading @@ -1240,13 +1241,13 @@ Apakah Anda ingin mengabaikan kesalahan dan melanjutkan? - Set emulation speed: + Set emulation speed - Emulation Speed: - Kecepatan Emulasi: + Emulation Speed + @@ -1357,12 +1358,12 @@ Apakah Anda ingin mengabaikan kesalahan dan melanjutkan? - SPIR-V Shader Generation + SPIR-V shader generation - Disable GLSL -> SPIR-V Optimizer + Disable GLSL -> SPIR-V optimizer @@ -1382,8 +1383,8 @@ Apakah Anda ingin mengabaikan kesalahan dan melanjutkan? - Enable Hardware Shader - Gunakan Hardware Shader + Enable hardware shader + @@ -1392,8 +1393,8 @@ Apakah Anda ingin mengabaikan kesalahan dan melanjutkan? - Accurate Multiplication - Penggandaan Akurat + Accurate multiplication + @@ -1402,8 +1403,8 @@ Apakah Anda ingin mengabaikan kesalahan dan melanjutkan? - Enable Shader JIT - Aktifkan Shader JIT + Enable shader JIT + @@ -1412,7 +1413,7 @@ Apakah Anda ingin mengabaikan kesalahan dan melanjutkan? - Enable Async Shader Compilation + Enable async shader compilation @@ -1422,7 +1423,7 @@ Apakah Anda ingin mengabaikan kesalahan dan melanjutkan? - Enable Async Presentation + Enable async presentation @@ -1462,8 +1463,8 @@ Apakah Anda ingin mengabaikan kesalahan dan melanjutkan? - Use Disk Shader Cache - Gunakan Disk Shader Cache + Use disk shader cache + @@ -1487,7 +1488,7 @@ Apakah Anda ingin mengabaikan kesalahan dan melanjutkan? - Delay application render thread: + Delay Application Render Thread @@ -1976,12 +1977,12 @@ Apakah Anda ingin mengabaikan kesalahan dan melanjutkan? - Swap Screens - Layar Swap + Swap screens + - Rotate Screens Upright + Rotate screens upright @@ -2098,7 +2099,7 @@ Apakah Anda ingin mengabaikan kesalahan dan melanjutkan? - <html><head/><body><p>Bottom Screen Opacity % (OpenGL Only)</p></body></html> + <html><head/><body><p>Bottom Screen Opacity %</p></body></html> @@ -2446,8 +2447,8 @@ Apakah Anda ingin mengabaikan kesalahan dan melanjutkan? - Use Virtual SD - Gunakan Kartu SD virtual + Use virtual SD card + @@ -2456,7 +2457,7 @@ Apakah Anda ingin mengabaikan kesalahan dan melanjutkan? - Use Custom Storage + Use custom storage location @@ -2543,7 +2544,7 @@ online features (if installed) - Region: + Region @@ -2552,326 +2553,337 @@ online features (if installed) - + + Apply region free patch to +installed applications. + + + + + Patches the region of installed applications to be region free, so that they always appear on the home menu. + + + + Username Nama User - + Birthday Ulang tahun - + January Januari - + February Februari - + March Maret - + April April - + May Mei - + June Juni - + July Juli - + August Agustus - + September September - + October Oktober - + November November - + December Desember - + Language Bahasa - + Note: this can be overridden when region setting is auto-select Catatan: ini bisa di lewati bila pengaturan region-nya otomatis di pilih - + Japanese (日本語) Jepang (日本語) - + English Inggris - + French (français) Prancis (français) - + German (Deutsch) Jerman (Deutsch) - + Italian (italiano) Itali (italiano) - + Spanish (español) Spanyol (español) - + Simplified Chinese (简体中文) Cina Yang Di Sederhanakan (简体中文) - + Korean (한국어) Korea (한국어) - + Dutch (Nederlands) Belanda (Nederlands) - + Portuguese (português) Portugis (português) - + Russian (Русский) Rusia (Русский) - + Traditional Chinese (正體中文) Cina Tradisional (正體中文) - + Sound output mode Mode output suara - + Mono Mono - + Stereo Stereo - + Surround Surround - + Country Negara - + Clock Jam - + System Clock Jam Sistem - + Fixed Time Waktu Tetap - + Startup time Waktu Mulai - + yyyy-MM-ddTHH:mm:ss yyyy-MM-ddTHH:mm:ss - + Offset time - + days - + HH:mm:ss - + Initial System Ticks - + Random - + Fixed - + Initial System Ticks Override - + Play Coins - + <html><head/><body><p>Number of steps per hour reported by the pedometer. Range from 0 to 65,535.</p></body></html> - + Pedometer Steps per Hour - + Run System Setup when Home Menu is launched - + Console ID: ID Konsol: - - + + Regenerate Perbaharui - + MAC: - - 3GX Plugin Loader: + + 3GX Plugin Loader - + Enable 3GX plugin loader - + Allow applications to change plugin loader state - + Real Console Unique Data - + Your real console is linked to Azahar. - + Unlink - + OTP - - - - + + + + Choose - + SecureInfo_A/B - + LocalFriendCodeSeed_A/B - + movable.sed - + System settings are available only when applications is not running. @@ -3581,76 +3593,76 @@ online features (if installed) - - + + Console ID: 0x%1 ID Konsol: 0x%1 - - + + MAC: %1 - + This will replace your current virtual 3DS console ID with a new one. Your current virtual 3DS console ID will not be recoverable. This might have unexpected effects in applications. This might fail if you use an outdated config save. Continue? - - - + + + Warning Peringatan - + This will replace your current MAC address with a new one. It is not recommended to do this if you got the MAC address from your real console using the setup tool. Continue? - + This action will unlink your real console from Azahar, with the following consequences:<br><ul><li>Your OTP, SecureInfo and LocalFriendCodeSeed will be removed from Azahar.</li><li>Your friend list will reset and you will be logged out of your NNID/PNID account.</li><li>System files and eshop titles obtained through Azahar will become inaccessible until the same console is linked again (save data will not be lost).</li></ul><br>Continue? - + Invalid country for configured region - + Invalid country for console unique data - + Status: Loaded - + Status: Loaded (Invalid Signature) - + Status: Loaded (Region Changed) - + Status: Not Found - + Status: Invalid - + Status: IO Error @@ -3765,13 +3777,13 @@ Drag points to change position, or double-click table cells to edit values. - Interface language: - Bahasa Antarmuka: + Interface Language + - Theme: - Tema: + Theme + @@ -3780,8 +3792,8 @@ Drag points to change position, or double-click table cells to edit values. - Icon Size: - Ukuran Ikon: + Icon Size + @@ -3801,8 +3813,8 @@ Drag points to change position, or double-click table cells to edit values. - Row 1 Text: - Teks Barisan 1: + Row 1 Text + @@ -3836,18 +3848,18 @@ Drag points to change position, or double-click table cells to edit values. - Row 2 Text: - Teks Barisan 2: + Row 2 Text + - Hide Titles without Icon - Sembunyikan Judul tanpa Ikon + Hide titles without icon + - Single Line Mode - Mode Satu Baris + Single line mode + @@ -3856,7 +3868,7 @@ Drag points to change position, or double-click table cells to edit values. - Show Advanced Frame Time Info + Show advanced frame time info @@ -3939,12 +3951,12 @@ Drag points to change position, or double-click table cells to edit values. DirectConnectWindow - + Connecting Menghubungkan - + Connect Hubungkan @@ -4063,581 +4075,595 @@ Please check your FFmpeg installation used for compilation. GMainWindow - + No Suitable Vulkan Devices Detected - + Vulkan initialization failed during boot.<br/>Your GPU may not support Vulkan 1.1, or you do not have the latest graphics driver. - + Current Artic traffic speed. Higher values indicate bigger transfer loads. - - + + Current emulation speed. Values higher or lower than 100% indicate emulation is running faster or slower than a 3DS. Kecepatan emulasi saat ini. Nilai yang lebih tinggi atau lebih rendah dari 100% menunjukan emulasi berjalan lebih cepat atau lebih lambat dari 3DS. - - + + How many frames per second the app is currently displaying. This will vary from app to app and scene to scene. - - + + Time taken to emulate a 3DS frame, not counting framelimiting or v-sync. For full-speed emulation this should be at most 16.67 ms. Waktu yang dibutuhkan untuk mengemulasi frame 3DS, tidak menghitung pembatasan frame atau v-sync. setidaknya emulasi yang tergolong kecepatan penuh harus berada setidaknya pada 16.67 ms. - + MicroProfile (unavailable) - + Clear Recent Files Bersihkan Berkas File Terbaru - + &Continue - + &Pause - + Azahar is running an application TRANSLATORS: This string is shown to the user to explain why Citra needs to prevent the computer from sleeping - - + + Invalid App Format - - + + Your app format is not supported.<br/>Please follow the guides to redump your <a href='https://web.archive.org/web/20240304210021/https://citra-emu.org/wiki/dumping-game-cartridges/'>game cartridges</a> or <a href='https://web.archive.org/web/20240304210011/https://citra-emu.org/wiki/dumping-installed-titles/'>installed titles</a>. - + App Corrupted - + Your app is corrupted. <br/>Please follow the guides to redump your <a href='https://web.archive.org/web/20240304210021/https://citra-emu.org/wiki/dumping-game-cartridges/'>game cartridges</a> or <a href='https://web.archive.org/web/20240304210011/https://citra-emu.org/wiki/dumping-installed-titles/'>installed titles</a>. - + App Encrypted - + Your app is encrypted. <br/><a href='https://azahar-emu.org/blog/game-loading-changes/'>Please check our blog for more info.</a> - + Unsupported App - + GBA Virtual Console is not supported by Azahar. - - + + Artic Server - + + Invalid system mode + + + + + New 3DS exclusive applications cannot be loaded without enabling the New 3DS mode. + + + + Error while loading App! - + An unknown error occurred. Please see the log for more details. - + CIA must be installed before usage CIA harus di install terlebih dahulu sebelum bisa di gunakan - + Before using this CIA, you must install it. Do you want to install it now? Sebelum memakai CIA ini kau harus memasangnya terlebih dahulu. Apa anda ingin menginstallnya sekarang? - + Quick Load - + Quick Save - - + + Slot %1 - + %2 %3 - + Quick Save - %1 - + Quick Load - %1 - + Slot %1 - %2 %3 - + Error Opening %1 Folder Kesalahan Dalam Membuka Folder %1 - - + + Folder does not exist! Folder tidak ada! - + Remove Play Time Data - + Reset play time? - - - - + + + + Create Shortcut - + Do you want to launch the application in fullscreen? - + Successfully created a shortcut to %1 - + This will create a shortcut to the current AppImage. This may not work well if you update. Continue? - + Failed to create a shortcut to %1 - + Create Icon - + Cannot create icon file. Path "%1" does not exist and cannot be created. - + Dumping... - - + + Cancel Batal - - - - - - - - - + + + + + + + + + Azahar - + Could not dump base RomFS. Refer to the log for details. - + Error Opening %1 Kesalahan Dalam Membuka %1 - + Select Directory Pilih Direktori - + Properties Properti - + The application properties could not be loaded. - + 3DS Executable (%1);;All Files (*.*) %1 is an identifier for the 3DS executable file extensions. - + Load File Muat File - - + + Set Up System Files - + <p>Azahar needs console unique data and firmware files from a real console to be able to use some of its features.<br>Such files and data can be set up with the <a href=https://github.com/azahar-emu/ArticSetupTool>Azahar Artic Setup Tool</a><br>Notes:<ul><li><b>This operation will install console unique data to Azahar, do not share your user or nand folders<br>after performing the setup process!</b></li><li>While doing the setup process, Azahar will link to the console running the setup tool. You can unlink the<br>console later from the System tab in the emulator configuration menu.</li><li>Do not go online with both Azahar and your 3DS console at the same time after setting up system files,<br>as it could cause issues.</li><li>Old 3DS setup is needed for the New 3DS setup to work (doing both setup modes is recommended).</li><li>Both setup modes will work regardless of the model of the console running the setup tool.</li></ul><hr></p> - + Enter Azahar Artic Setup Tool address: - + <br>Choose setup mode: - + (ℹ️) Old 3DS setup - - + + Setup is possible. - + (⚠) New 3DS setup - + Old 3DS setup is required first. - + (✅) Old 3DS setup - - + + Setup completed. - + (ℹ️) New 3DS setup - + (✅) New 3DS setup - + The system files for the selected mode are already set up. Reinstall the files anyway? - + Load Files Muat berkas - + 3DS Installation File (*.cia *.zcia) - - - + + + All Files (*.*) Semua File (*.*) - + Connect to Artic Base - + Enter Artic Base server address: - + %1 has been installed successfully. %1 telah terinstall. - + Unable to open File Tidak dapat membuka File - + Could not open %1 Tidak dapat membuka %1 - + Installation aborted Instalasi dibatalkan - + The installation of %1 was aborted. Please see the log for more details Instalasi %1 dibatalkan. Silahkan lihat file log untuk info lebih lanjut. - + Invalid File File yang tidak valid - + %1 is not a valid CIA %1 bukan CIA yang valid - + CIA Encrypted - + Your CIA file is encrypted.<br/><a href='https://azahar-emu.org/blog/game-loading-changes/'>Please check our blog for more info.</a> - + Unable to find File - + Could not find %1 - - - - Error compressing file + + + + + Z3DS Compression - - File compress operation failed, check log for details. + + Failed to compress some files, check log for details. - - - - Error decompressing file + + Failed to decompress some files, check log for details. - - File decompress operation failed, check log for details. + + All files have been compressed successfully. - + + All files have been decompressed successfully. + + + + Uninstalling '%1'... Mencopot Pemasangan '%1'... - + Failed to uninstall '%1'. Gagal untuk mencopot pemasangan '%1%. - + Successfully uninstalled '%1'. - + File not found File tidak ditemukan - + File "%1" not found File "%1" tidak ditemukan - + Savestates - + Warning: Savestates are NOT a replacement for in-application saves, and are not meant to be reliable. Use at your own risk! - - - + + + Error opening amiibo data file - + A tag is already in use. - + Application is not looking for amiibos. - + Amiibo File (%1);; All Files (*.*) - + Load Amiibo Muat Amiibo - + Unable to open amiibo file "%1" for reading. - + Record Movie Rekam Video - + Movie recording cancelled. Perekaman Video Di Batalkan. - - + + Movie Saved Video Di Simpan - - + + The movie is successfully saved. Video telah berhasil di simpan. - + Application will unpause - + The application will be unpaused, and the next frame will be captured. Is this okay? - + Invalid Screenshot Directory - + Cannot create specified screenshot directory. Screenshot path is set back to its default value. - + Could not load video dumper - + FFmpeg could not be loaded. Make sure you have a compatible version installed. To install FFmpeg to Azahar, press Open and select your FFmpeg directory. @@ -4646,274 +4672,264 @@ To view a guide on how to install FFmpeg, press Help. - - Load 3DS ROM File + + Load 3DS ROM Files - - 3DS ROM Files (*.cia *cci *3dsx *cxi) + + 3DS ROM Files (*.cia *.cci *.3dsx *.cxi) - - The selected file is not a compatible 3DS ROM format. Make sure you have chosen the right file, and that it is not encrypted. - - - - - The selected file is already compressed. - - - - + 3DS Compressed ROM File (*.%1) - + Save 3DS Compressed ROM File - - Load 3DS Compressed ROM File + + Select Output 3DS Compressed ROM Folder - + + Load 3DS Compressed ROM Files + + + + 3DS Compressed ROM Files (*.zcia *zcci *z3dsx *zcxi) - - The selected file is not a compatible compressed 3DS ROM format. Make sure you have chosen the right file. - - - - - The selected file is already decompressed. - - - - + 3DS ROM File (*.%1) - + Save 3DS ROM File - + + Select Output 3DS ROM Folder + + + + Select FFmpeg Directory - + The provided FFmpeg directory is missing %1. Please make sure the correct directory was selected. - + FFmpeg has been sucessfully installed. - + Installation of FFmpeg failed. Check the log file for details. - + Could not start video dumping.<br>Please ensure that the video encoder is configured correctly.<br>Refer to the log for details. - + Recording %1 - + Playing %1 / %2 - + Movie Finished - + (Accessing SharedExtData) - + (Accessing SystemSaveData) - + (Accessing BossExtData) - + (Accessing ExtData) - + (Accessing SaveData) - + MB/s - + KB/s - + Artic Traffic: %1 %2%3 - + Speed: %1% Kecepatan: %1% - + Speed: %1% / %2% Kelajuan: %1% / %2% - + App: %1 FPS - + Frame: %1 ms (GPU: [CMD: %2 ms, SWP: %3 ms], IPC: %4 ms, SVC: %5 ms, Rem: %6 ms) - + Frame: %1 ms Frame: %1 ms - + VOLUME: MUTE - + VOLUME: %1% Volume percentage (e.g. 50%) - + %1 is missing. Please <a href='https://web.archive.org/web/20240304201103/https://citra-emu.org/wiki/dumping-system-archives-and-the-shared-fonts-from-a-3ds-console/'>dump your system archives</a>.<br/>Continuing emulation may result in crashes and bugs. - + A system archive Sebuah arsip sistem - + System Archive Not Found Arsip Sistem Tidak Ditemukan - + System Archive Missing Arsip sistem tidak ada - + Save/load Error - + Fatal Error Fatal Error - + A fatal error occurred. <a href='https://web.archive.org/web/20240228001712/https://community.citra-emu.org/t/how-to-upload-the-log-file/296'>Check the log</a> for details.<br/>Continuing emulation may result in crashes and bugs. - + Fatal Error encountered Galat fatal terjadi - + Continue Lanjut - + Quit Application - + OK OK - + Would you like to exit now? Apakah anda ingin keluar sekarang? - + The application is still running. Would you like to stop emulation? - + Playback Completed Pemutaran Kembali Telah Selesai - + Movie playback completed. Pemutaran kembali video telah selesai. - + Update Available - + Update %1 for Azahar is available. Would you like to download it? - + Primary Window - + Secondary Window @@ -5019,239 +5035,254 @@ Would you like to download it? GameList - + IMPORTANT: Encrypted files and .3ds files are no longer supported. Decrypting and/or renaming to .cci may be necessary. <a href='https://azahar-emu.org/blog/game-loading-changes/'>Learn more.</a> - + Don't show again - - + + Compatibility - - + + Region - - + + File type - - + + Size - - + + Play time - + Favorite - + + Eject Cartridge + + + + + Insert Cartridge + + + + Open Buka - + Application Location - + Save Data Location - + Extra Data Location - + Update Data Location - + DLC Data Location - + Texture Dump Location - + Custom Texture Location - + Mods Location - + Dump RomFS - + Disk Shader Cache - + Open Shader Cache Location - + Delete OpenGL Shader Cache - + Uninstall - + Everything - + Application - + Update - + DLC - + Remove Play Time Data - + Create Shortcut - + Add to Desktop - + Add to Applications Menu - + + Stress Test: App Launch + + + + Properties Properti - - - - + + + + Azahar - + Are you sure you want to completely uninstall '%1'? This will delete the application if installed, as well as any installed updates or DLC. - - + + %1 (Update) - - + + %1 (DLC) - + Are you sure you want to uninstall '%1'? - + Are you sure you want to uninstall the update for '%1'? - + Are you sure you want to uninstall all DLC for '%1'? - + Scan Subfolders Pindai Subfolder - + Remove Application Directory - + Move Up - + Move Down - + Open Directory Location Buka Lokasi Penyimpanan - + Clear Bersihkan - + Name Nama @@ -5259,77 +5290,77 @@ This will delete the application if installed, as well as any installed updates GameListItemCompat - + Perfect Sempurna - + App functions flawless with no audio or graphical glitches, all tested functionality works as intended without any workarounds needed. - + Great Hebat - + App functions with minor graphical or audio glitches and is playable from start to finish. May require some workarounds. - + Okay Setuju - + App functions with major graphical or audio glitches, but app is playable from start to finish with workarounds. - + Bad Buruk - + App functions, but with major graphical or audio glitches. Unable to progress in specific areas due to glitches even with workarounds. - + Intro/Menu Intro/Menu - + App is completely unplayable due to major graphical or audio glitches. Unable to progress past the Start Screen. - + Won't Boot Tidak Mau Memulai - + The app crashes when attempting to startup. - + Not Tested Belum Di Uji - + The app has not yet been tested. @@ -5337,7 +5368,7 @@ Screen. GameListPlaceholder - + Double-click to add a new folder to the application list @@ -5345,27 +5376,27 @@ Screen. GameListSearchField - + of dari - + result hasil - + results hasil - + Filter: Saringan: - + Enter pattern to filter Masukkan pola untuk menyaring @@ -5693,87 +5724,87 @@ Screen. Indeks Siklus: - + SRC1: %1, %2, %3, %4 SRC1: %1, %2, %3, %4 - + SRC2: %1, %2, %3, %4 SRC2: %1, %2, %3, %4 - + SRC3: %1, %2, %3, %4 SRC3: %1, %2, %3, %4 - + DEST_IN: %1, %2, %3, %4 DEST_IN: %1, %2, %3, %4 - + DEST_OUT: %1, %2, %3, %4 DEST_OUT: %1, %2, %3, %4 - + Address Registers: %1, %2 Register Alamat: %1, %2 - + Compare Result: %1, %2 Bandingkan Hasil: %1, %2 - + Static Condition: %1 Kondisi Statis: %1 - + Dynamic Conditions: %1, %2 Kondisi Dinamis: %1, %2 - + Loop Parameters: %1 (repeats), %2 (initializer), %3 (increment), %4 Parameter Pengulangan: %1 (pengulangan), %2 (penginisialisasi), %3 (tambahan), %4 - + Instruction offset: 0x%1 Instruksi offset: 0x%1 - + -> 0x%2 -> 0x%2 - + (last instruction) (instruksi terakhir) @@ -6072,32 +6103,32 @@ Debug Message: Kata Sandi: - + Room Name Nama Ruangan - + Preferred Application - + Host Host - + Players Pemain - + Refreshing Menyegarkan - + Refresh List Segarkan Daftar @@ -6598,7 +6629,7 @@ Debug Message: File: - File: + @@ -6690,7 +6721,7 @@ Debug Message: File: - File: + @@ -7095,32 +7126,32 @@ They may have left the room. - + Unsupported encrypted application - + Invalid region Region Tidak Valid - + Installed Titles - + System Titles - + Add New Application Directory - + Favorites diff --git a/dist/languages/it.ts b/dist/languages/it.ts index dd5648fad..dae104c79 100644 --- a/dist/languages/it.ts +++ b/dist/languages/it.ts @@ -298,8 +298,8 @@ Questo bannerà sia il suo nome utente del forum che il suo indirizzo IP. - Emulation: - Emulazione: + Emulation + Emulazione @@ -329,7 +329,7 @@ Questo bannerà sia il suo nome utente del forum che il suo indirizzo IP. This post-processing effect adjusts audio speed to match emulation speed and helps prevent audio stutter. This however increases audio latency. - Questo effetto di post-processing permette di far combaciare la velocità dell'emulazione con quella dell'audio per prevenire lo stutter. Questo però aumenta la latenza dell'audio. + Questo effetto di post-processing permette di far combaciare la velocità dell'emulazione con quella dell'audio per prevenire scatti. Tuttavia, ciò aumenta la latenza dell'audio. @@ -403,6 +403,7 @@ Questo bannerà sia il suo nome utente del forum che il suo indirizzo IP. + Camera Fotocamera @@ -414,8 +415,8 @@ Questo bannerà sia il suo nome utente del forum che il suo indirizzo IP. - Camera to configure: - Fotocamera da configurare: + Camera to Configure + Fotocamera da configurare @@ -435,8 +436,8 @@ Questo bannerà sia il suo nome utente del forum che il suo indirizzo IP. - Camera mode: - Modalità della fotocamera: + Camera mode + Modalità fotocamera @@ -456,8 +457,8 @@ Questo bannerà sia il suo nome utente del forum che il suo indirizzo IP. - Camera position: - Posizione della fotocamera: + Camera position + Posizione fotocamera @@ -482,8 +483,8 @@ Questo bannerà sia il suo nome utente del forum che il suo indirizzo IP. - Camera Image Source: - Fonte dell'immagine della fotocamera: + Camera Image Source + Sorgente fotocamera @@ -502,8 +503,8 @@ Questo bannerà sia il suo nome utente del forum che il suo indirizzo IP. - File: - File: + File + File @@ -516,11 +517,6 @@ Questo bannerà sia il suo nome utente del forum che il suo indirizzo IP.Select the system camera to use Seleziona la fotocamera di sistema da utilizzare - - - Camera: - Fotocamera: - <Default> @@ -534,8 +530,8 @@ Questo bannerà sia il suo nome utente del forum che il suo indirizzo IP. - Flip: - Rotazione: + Flip + Capovolgi @@ -737,7 +733,7 @@ Desideri ignorare l'errore e continuare? Flush log output on every message - Pulisci l'output del log ad ogni messaggio + Svuota l'output del log ad ogni messaggio @@ -1088,8 +1084,8 @@ Desideri ignorare l'errore e continuare? - Reverse Side by Side - Affiancato invertito + Side by Side Full Width + Affiancato a larghezza intera @@ -1147,48 +1143,53 @@ Desideri ignorare l'errore e continuare? <html><head/><body><p>Disabilita il rendering dell'occhio destro</p><p>Disabilita il rendering dell'immagine dell'occhio destro quando la modalità steroscopica non è attiva. Migliora enormemente le prestazioni in alcune applicazioni, ma può causare flickering in altre.</p></body></html> - + + Swap Eyes + Inverti occhi + + + Utility Utilità - + <html><head/><body><p>Replace textures with PNG files.</p><p>Textures are loaded from load/textures/[Title ID]/.</p></body></html> <html><head/><body><p>Sostituisci le texture con file PNG.</p><p>Le texture verranno caricate dalla cartella load/textures/[ID titolo]/.</p></body></html> - - Use Custom Textures + + Use custom textures Usa texture personalizzate - + <html><head/><body><p>Dump textures to PNG files.</p><p>Textures are dumped to dump/textures/[Title ID]/.</p></body></html> <html><head/><body><p>Estrai le texture su file PNG.</p><p>Le texture verranno estratte nella cartella dump/textures/[ID titolo]/.</p></body></html> - - Dump Textures + + Dump textures Estrai texture - + <html><head/><body><p>Load all custom textures into memory on boot, instead of loading them when the application requires them.</p></body></html> <html><head/><body><p>Carica tutte le texture personalizzate in memoria all'avvio, invece di caricarle quando l'applicazione ne ha bisogno.</p></body></html> - - Preload Custom Textures + + Preload custom textures Precarica texture personalizzate - + <html><head/><body><p>Load custom textures asynchronously with background threads to reduce loading stutter</p></body></html> <html><head/><body><p>Carica le texture personalizzate in maniera asincrona usando dei thread in background per ridurre gli scatti causati dal loro caricamento.</p></body></html> - - Async Custom Texture Loading + + Async custom texture loading Caricamento asincrono delle texture personalizzate @@ -1222,7 +1223,7 @@ Desideri ignorare l'errore e continuare? Hide mouse on inactivity - Nascondi il puntatore quando inattivo + Nascondi il mouse in caso di inattività @@ -1246,13 +1247,13 @@ Desideri ignorare l'errore e continuare? - Set emulation speed: - Imposta la velocità di emulazione: + Set emulation speed + Imposta la velocità di emulazione - Emulation Speed: - Velocità di emulazione: + Emulation Speed + Velocità di emulazione @@ -1363,18 +1364,18 @@ Desideri ignorare l'errore e continuare? - SPIR-V Shader Generation + SPIR-V shader generation Generazione shader SPIR-V - Disable GLSL -> SPIR-V Optimizer - Disabilita GLSL -> Ottimizzatore SPIR-V + Disable GLSL -> SPIR-V optimizer + Disabilita ottimizzazione GLSL -> SPIR-V <html><head/><body><p>Disables the SPIR-V optimization pass, reducing stuttering considerably while barely affecting performance.</p></body></html> - <html><head/><body><p>Disabilita il passaggio di ottimizzazione SPIR-V, riducendo considerevolmente lo strutter influenzando minimamente le prestazioni.</p></body></html> + <html><head/><body><p>Disabilita il passaggio di ottimizzazione SPIR-V, riducendo considerevolmente gli scatti con un impatto minimo sulle prestazioni.</p></body></html> @@ -1388,7 +1389,7 @@ Desideri ignorare l'errore e continuare? - Enable Hardware Shader + Enable hardware shader Abilita shader hardware @@ -1398,7 +1399,7 @@ Desideri ignorare l'errore e continuare? - Accurate Multiplication + Accurate multiplication Moltiplicazione accurata @@ -1408,7 +1409,7 @@ Desideri ignorare l'errore e continuare? - Enable Shader JIT + Enable shader JIT Abilita shader JIT @@ -1418,7 +1419,7 @@ Desideri ignorare l'errore e continuare? - Enable Async Shader Compilation + Enable async shader compilation Abilita la compilazione asincrona degli shader @@ -1428,7 +1429,7 @@ Desideri ignorare l'errore e continuare? - Enable Async Presentation + Enable async presentation Abilita la presentazione asincrona @@ -1468,7 +1469,7 @@ Desideri ignorare l'errore e continuare? - Use Disk Shader Cache + Use disk shader cache Utilizza la cache degli shader su disco @@ -1493,8 +1494,8 @@ Desideri ignorare l'errore e continuare? - Delay application render thread: - Ritarda il thread di render dell'applicazione: + Delay Application Render Thread + Ritarda il thread di render dell'applicazione @@ -1982,12 +1983,12 @@ Desideri ignorare l'errore e continuare? - Swap Screens + Swap screens Inverti schermi - Rotate Screens Upright + Rotate screens upright Ruota schermi in verticale @@ -2104,8 +2105,8 @@ Desideri ignorare l'errore e continuare? - <html><head/><body><p>Bottom Screen Opacity % (OpenGL Only)</p></body></html> - <html><head/><body><p>Opacità dello schermo inferiore in % (solo OpenGL)</p></body></html> + <html><head/><body><p>Bottom Screen Opacity %</p></body></html> + <html><head/><body><p>Opacità dello schermo inferiore %</p></body></html> @@ -2277,7 +2278,7 @@ Desideri ignorare l'errore e continuare? <a href='https://web.archive.org/web/20240301211230/https://citra-emu.org/wiki/using-a-controller-or-android-phone-for-motion-or-touch-input'><span style="text-decoration: underline; color:#039be5;">Learn More</span></a> - <a href='https://web.archive.org/web/20240301211230/https://citra-emu.org/wiki/using-a-controller-or-android-phone-for-motion-or-touch-input'><span style="text-decoration: underline; color:#039be5;">Ulteriori Informazioni</span></a> + <a href='https://web.archive.org/web/20240301211230/https://citra-emu.org/wiki/using-a-controller-or-android-phone-for-motion-or-touch-input'><span style="text-decoration: underline; color:#039be5;">Ulteriori informazioni</span></a> @@ -2452,8 +2453,8 @@ Desideri ignorare l'errore e continuare? - Use Virtual SD - Usa la SD virtuale + Use virtual SD card + Usa la scheda SD virtuale @@ -2462,8 +2463,8 @@ Desideri ignorare l'errore e continuare? - Use Custom Storage - Usa l'archiviazione personalizzata + Use custom storage location + Usa percorso personalizzato @@ -2549,8 +2550,8 @@ online features (if installed) - Region: - Regione: + Region + Regione @@ -2558,326 +2559,337 @@ online features (if installed) Seleziona automaticamente - + + Apply region free patch to +installed applications. + Applica la patch region-free alle applicazioni installate. + + + + Patches the region of installed applications to be region free, so that they always appear on the home menu. + Corregge la regione delle applicazioni installate per renderle region-free, in modo che vengano sempre visualizzate nel menù Home. + + + Username Nome utente - + Birthday Compleanno - + January Gennaio - + February Febbraio - + March Marzo - + April Aprile - + May Maggio - + June Giugno - + July Luglio - + August Agosto - + September Settembre - + October Ottobre - + November Novembre - + December Dicembre - + Language Lingua - + Note: this can be overridden when region setting is auto-select Nota: questa impostazione può essere sovrascritta quando le impostazioni regionali sono su Selezione automatica - + Japanese (日本語) Giapponese (日本語) - + English English - + French (français) Francese (Français) - + German (Deutsch) Tedesco (Deutsch) - + Italian (italiano) Italiano - + Spanish (español) Spagnolo (Español) - + Simplified Chinese (简体中文) Cinese semplificato (简体中文) - + Korean (한국어) Coreano (한국어) - + Dutch (Nederlands) Olandese (Nederlands) - + Portuguese (português) Portoghese (Português) - + Russian (Русский) Russo (Русский) - + Traditional Chinese (正體中文) Cinese tradizionale (正體中文) - + Sound output mode Modalità di output del suono - + Mono Mono - + Stereo Stereo - + Surround Surround - + Country - Nazione + Stato - + Clock Orario - + System Clock Orario del sistema - + Fixed Time Orario fisso - + Startup time Ora di avvio - + yyyy-MM-ddTHH:mm:ss yyyy-MM-ddTHH:mm:ss - + Offset time Offset Orario - + days giorni - + HH:mm:ss HH:mm:ss - + Initial System Ticks Tick ​​di sistema iniziali - + Random Casuale - + Fixed - Fissato + Fisso - + Initial System Ticks Override Sovrascrittura dei Tick ​​di sistema iniziali - + Play Coins Monete di gioco - + <html><head/><body><p>Number of steps per hour reported by the pedometer. Range from 0 to 65,535.</p></body></html> - <html><head/><body><p>Numero di passi per ogni ora contati dal contapassi. Range da 0 a 65.535.</p></body></html> + <html><head/><body><p>Numero di passi per ogni ora contati dal contapassi. Intervallo da 0 a 65.535.</p></body></html> - + Pedometer Steps per Hour Passi contapassi per ogni ora - + Run System Setup when Home Menu is launched - Esegui il Setup del Sistema quando l'Home Menu viene avviato. + Esegui la configurazione del sistema quando il menù Home viene avviato - + Console ID: ID Console: - - + + Regenerate Rigenera - + MAC: MAC: - - 3GX Plugin Loader: - Caricamento plugin 3GX: + + 3GX Plugin Loader + Caricamento dei plugin 3GX - + Enable 3GX plugin loader Abilita il caricamento dei plugin 3GX - + Allow applications to change plugin loader state Permetti alle applicazioni di cambiare lo stato del plugin loader - + Real Console Unique Data Dati univoci della console fisica - + Your real console is linked to Azahar. La tua console fisica è collegata con Azahar. - + Unlink Scollega - + OTP OTP - - - - + + + + Choose Scegli - + SecureInfo_A/B SecureInfo_A/B - + LocalFriendCodeSeed_A/B LocalFriendCodeSeed_A/B - + movable.sed movable.sed - + System settings are available only when applications is not running. Le impostazioni di sistema sono disponibili solo quando non ci sono applicazioni in esecuzione. @@ -3587,76 +3599,76 @@ online features (if installed) File sed (*.sed);;Tutti i file (*.*) - - + + Console ID: 0x%1 ID console: 0x%1 - - + + MAC: %1 MAC: %1 - + This will replace your current virtual 3DS console ID with a new one. Your current virtual 3DS console ID will not be recoverable. This might have unexpected effects in applications. This might fail if you use an outdated config save. Continue? L'attuale ID della console 3DS virtuale verrà sostituito con uno nuovo e non potrà più essere recuperato. Ciò potrebbe avere degli effetti inaspettati in alcune applicazioni. Questo processo potrebbe fallire se usi un salvataggio della configurazione obsoleto. Vuoi continuare? - - - + + + Warning Attenzione - + This will replace your current MAC address with a new one. It is not recommended to do this if you got the MAC address from your real console using the setup tool. Continue? Il tuo indirizzo MAC attuale verrà sostituito con uno nuovo. È sconsigliato procedere se hai ottenuto l'indirizzo MAC dalla tua console fisica usando lo strumento di configurazione. Vuoi continuare? - + This action will unlink your real console from Azahar, with the following consequences:<br><ul><li>Your OTP, SecureInfo and LocalFriendCodeSeed will be removed from Azahar.</li><li>Your friend list will reset and you will be logged out of your NNID/PNID account.</li><li>System files and eshop titles obtained through Azahar will become inaccessible until the same console is linked again (save data will not be lost).</li></ul><br>Continue? Questa azione scollegherà la tua console reale da Azahar, con le seguenti conseguenze:<br><ul><li>il tuo OTP, SecureInfo e LocalFriendCodeSeed verranno rimossi da Azahar.</li><li>La tua lista amici verrà reimpostata e verrai disconnesso dal tuo account NNID/PNID.</li><li>I file di sistema e i titoli eshop ottenuti tramite Azahar diventeranno inaccessibili finché la stessa console non verrà nuovamente collegata (i dati di salvataggio non andranno persi).</ul><br>Continuare? - + Invalid country for configured region Nazione non valida per la regione configurata - + Invalid country for console unique data Nazione non valida per i dati univoci della console - + Status: Loaded Stato: Caricato - + Status: Loaded (Invalid Signature) Stato: Caricato (firma non valida) - + Status: Loaded (Region Changed) Stato: Caricato (regione modificata) - + Status: Not Found Stato: Non trovato - + Status: Invalid Stato: Non valido - + Status: IO Error Stato: Errore di I/O @@ -3772,13 +3784,13 @@ Trascina i punti per cambiarne la posizione, o fai doppio clic sulla tabella per - Interface language: - Lingua dell'interfaccia: + Interface Language + Lingua dell'interfaccia - Theme: - Tema: + Theme + Tema @@ -3787,8 +3799,8 @@ Trascina i punti per cambiarne la posizione, o fai doppio clic sulla tabella per - Icon Size: - Dimensione dell'icona: + Icon Size + Dimensione icona @@ -3808,8 +3820,8 @@ Trascina i punti per cambiarne la posizione, o fai doppio clic sulla tabella per - Row 1 Text: - Testo riga 1: + Row 1 Text + Testo riga 1 @@ -3843,17 +3855,17 @@ Trascina i punti per cambiarne la posizione, o fai doppio clic sulla tabella per - Row 2 Text: - Testo riga 2: + Row 2 Text + Testo riga 2 - Hide Titles without Icon - Nascondi giochi senza icona + Hide titles without icon + Nascondi titoli senza icona - Single Line Mode + Single line mode Modalità riga singola @@ -3863,8 +3875,8 @@ Trascina i punti per cambiarne la posizione, o fai doppio clic sulla tabella per - Show Advanced Frame Time Info - Mostra informazioni avanzate sul frame time + Show advanced frame time info + Mostra dettagli avanzati sul frame time @@ -3946,12 +3958,12 @@ Trascina i punti per cambiarne la posizione, o fai doppio clic sulla tabella per DirectConnectWindow - + Connecting Connessione in corso - + Connect Connetti @@ -4071,497 +4083,511 @@ Verifica l'installazione di FFmpeg usata per la compilazione. GMainWindow - + No Suitable Vulkan Devices Detected Impossibile trovare un dispositivo compatibile con Vulkan. - + Vulkan initialization failed during boot.<br/>Your GPU may not support Vulkan 1.1, or you do not have the latest graphics driver. L'inizializzazione di Vulkan ha fallito durante il boot. <br/>La tua GPU potrebbe non supportare Vulkan 1.1, oppure non hai i driver più recenti. - + Current Artic traffic speed. Higher values indicate bigger transfer loads. Attuale velocità del traffico di Artic. Valori alti indicano carichi di trasferimento più grandi. - - + + Current emulation speed. Values higher or lower than 100% indicate emulation is running faster or slower than a 3DS. Velocità di emulazione corrente. Valori più alti o più bassi di 100% indicano che l'emulazione sta funzionando più velocemente o lentamente di un 3DS. - - + + How many frames per second the app is currently displaying. This will vary from app to app and scene to scene. Quanti frame al secondo l'app sta attualmente mostrando. Varierà da app ad app e da scena a scena. - - + + Time taken to emulate a 3DS frame, not counting framelimiting or v-sync. For full-speed emulation this should be at most 16.67 ms. Tempo necessario per emulare un fotogramma del 3DS, senza tenere conto del limite al framerate o del V-Sync. Per un'emulazione alla massima velocità, il valore non dovrebbe essere superiore a 16.67 ms. - + MicroProfile (unavailable) MicroProfile (Non disponibile) - + Clear Recent Files Elimina file recenti - + &Continue &Continua - + &Pause &Pausa - + Azahar is running an application TRANSLATORS: This string is shown to the user to explain why Citra needs to prevent the computer from sleeping Azahar sta eseguendo un'applicazione - - + + Invalid App Format Formato App non valido - - + + Your app format is not supported.<br/>Please follow the guides to redump your <a href='https://web.archive.org/web/20240304210021/https://citra-emu.org/wiki/dumping-game-cartridges/'>game cartridges</a> or <a href='https://web.archive.org/web/20240304210011/https://citra-emu.org/wiki/dumping-installed-titles/'>installed titles</a>. Il formato dell'applicazione non è supportato. <br/>Segui la guida per effettuare il dump delle tue <a href='https://web.archive.org/web/20240304210021/https://citra-emu.org/wiki/dumping-game-cartridges/'>schedine di gioco</a> o dei <a href='https://web.archive.org/web/20240304210011/https://citra-emu.org/wiki/dumping-installed-titles/'>titoli installati</a>. - + App Corrupted App corrotta - + Your app is corrupted. <br/>Please follow the guides to redump your <a href='https://web.archive.org/web/20240304210021/https://citra-emu.org/wiki/dumping-game-cartridges/'>game cartridges</a> or <a href='https://web.archive.org/web/20240304210011/https://citra-emu.org/wiki/dumping-installed-titles/'>installed titles</a>. L'applicazione è corrotta. <br/>Segui la guida per effettuare il dump delle tue <a href='https://web.archive.org/web/20240304210021/https://citra-emu.org/wiki/dumping-game-cartridges/'>schedine di gioco</a> o dei <a href='https://web.archive.org/web/20240304210011/https://citra-emu.org/wiki/dumping-installed-titles/'>titoli installati</a>. - + App Encrypted App criptata - + Your app is encrypted. <br/><a href='https://azahar-emu.org/blog/game-loading-changes/'>Please check our blog for more info.</a> L'applicazione è criptata. <br/><a href='https://azahar-emu.org/blog/game-loading-changes/'>Consulta il nostro blog per maggiori informazioni.</a> - + Unsupported App App non supportata - + GBA Virtual Console is not supported by Azahar. La GBA Virtual Console non è supportata da Azahar. - - + + Artic Server Artic Server - + + Invalid system mode + Modalità di sistema non valida + + + + New 3DS exclusive applications cannot be loaded without enabling the New 3DS mode. + Le applicazioni esclusive del New 3DS non possono essere caricate senza abilitare la modalità New 3DS. + + + Error while loading App! Errore nel caricamento dell'app! - + An unknown error occurred. Please see the log for more details. Si è verificato un errore sconosciuto. Consulta il log per maggiori dettagli. - + CIA must be installed before usage Il CIA deve essere installato prima dell'uso - + Before using this CIA, you must install it. Do you want to install it now? Devi installare questo CIA prima di poterlo usare. Desideri farlo ora? - + Quick Load Carica salvataggio rapido - + Quick Save Salvataggio rapido - - + + Slot %1 Slot %1 - + %2 %3 %2 %3 - + Quick Save - %1 Salvataggio rapido (%1) - + Quick Load - %1 Carica salvataggio rapido (%1) - + Slot %1 - %2 %3 Slot %1 - %2 %3 - + Error Opening %1 Folder Errore nell'apertura della cartella %1 - - + + Folder does not exist! La cartella non esiste! - + Remove Play Time Data Rimuovi dati sul tempo di gioco - + Reset play time? Reimpostare il tempo di gioco? - - - - + + + + Create Shortcut Crea scorciatoia - + Do you want to launch the application in fullscreen? Vuoi avviare l'applicazione a schermo intero? - + Successfully created a shortcut to %1 Scorciatoia creata con successo in %1 - + This will create a shortcut to the current AppImage. This may not work well if you update. Continue? Verrà creata una scorciatoia all'attuale AppImage, che potrebbe non funzionare correttamente in caso di aggiornamento. Vuoi continuare? - + Failed to create a shortcut to %1 Impossibile creare scorciatoia in %1 - + Create Icon Crea icona - + Cannot create icon file. Path "%1" does not exist and cannot be created. Impossibile creare file icona. La cartella "%1" non esiste e non può essere creato. - + Dumping... Estrazione in corso... - - + + Cancel Annulla - - - - - - - - - + + + + + + + + + Azahar Azahar - + Could not dump base RomFS. Refer to the log for details. Impossibile estrarre la RomFS base. Consulta il log per i dettagli. - + Error Opening %1 Errore nell'apertura di %1 - + Select Directory Seleziona cartella - + Properties Proprietà - + The application properties could not be loaded. Impossibile caricare le proprietà dell'applicazione. - + 3DS Executable (%1);;All Files (*.*) %1 is an identifier for the 3DS executable file extensions. Eseguibile 3DS (%1);;Tutti i file (*.*) - + Load File Carica file - - + + Set Up System Files Configura i file di sistema - + <p>Azahar needs console unique data and firmware files from a real console to be able to use some of its features.<br>Such files and data can be set up with the <a href=https://github.com/azahar-emu/ArticSetupTool>Azahar Artic Setup Tool</a><br>Notes:<ul><li><b>This operation will install console unique data to Azahar, do not share your user or nand folders<br>after performing the setup process!</b></li><li>While doing the setup process, Azahar will link to the console running the setup tool. You can unlink the<br>console later from the System tab in the emulator configuration menu.</li><li>Do not go online with both Azahar and your 3DS console at the same time after setting up system files,<br>as it could cause issues.</li><li>Old 3DS setup is needed for the New 3DS setup to work (doing both setup modes is recommended).</li><li>Both setup modes will work regardless of the model of the console running the setup tool.</li></ul><hr></p> <p>Azahar necessita di dati univoci della console e di file firmware da una console reale per poter utilizzare alcune delle sue funzionalità.<br>Tali file e dati possono essere configurati con <a href=https://github.com/azahar-emu/ArticSetupTool>Azahar Artic Setup Tool</a><br>Note:<ul><li><b>questa operazione installerà dati univoci della console su Azahar, non condividere le cartelle utente o nand<br>dopo aver eseguito il processo di configurazione!</b></li><li>Durante il processo di configurazione, Azahar si collegherà alla console che esegue lo strumento di configurazione. È possibile scollegare la console in un secondo momento dalla scheda Sistema nel menu di configurazione dell'emulatore.</li><li>Non andare online con Azahar e con la console 3DS contemporaneamente dopo aver configurato i file di sistema,<br>poiché potrebbe causare problemi.</li><li>La vecchia configurazione 3DS è necessaria affinché la nuova configurazione 3DS funzioni (si consiglia di eseguire entrambe le modalità di configurazione).</li><li>Entrambe le modalità di configurazione funzioneranno indipendentemente dal modello della console che esegue lo strumento di configurazione.</li></ul><hr></p> - + Enter Azahar Artic Setup Tool address: Inserisci l'indirizzo di Artic Setup Tool: - + <br>Choose setup mode: <br>Scegli la modalità di configurazione: - + (ℹ️) Old 3DS setup (ℹ️) Configurazione Old 3DS - - + + Setup is possible. La configurazione è possibile. - + (⚠) New 3DS setup (⚠) Configurazione New 3DS - + Old 3DS setup is required first. È necessario eseguire prima la configurazione Old 3DS. - + (✅) Old 3DS setup - (✅) Confiurazione Old 3DS + (✅) Configurazione Old 3DS - - + + Setup completed. Configurazione completata. - + (ℹ️) New 3DS setup (ℹ️) Configurazione New 3DS - + (✅) New 3DS setup (✅) Configurazione New 3DS - + The system files for the selected mode are already set up. Reinstall the files anyway? I file di sistema per la modalità selezionata sono già stati configurati. Vuoi comunque reinstallarli? - + Load Files Carica file - + 3DS Installation File (*.cia *.zcia) File di installazione 3DS (*.cia *.zcia) - - - + + + All Files (*.*) Tutti i file (*.*) - + Connect to Artic Base Connettiti ad Artic Base - + Enter Artic Base server address: Inserisci l'indirizzo del server Artic Base: - + %1 has been installed successfully. %1 è stato installato con successo. - + Unable to open File Impossibile aprire il file - + Could not open %1 Impossibile aprire %1 - + Installation aborted Installazione annullata - + The installation of %1 was aborted. Please see the log for more details L'installazione di %1 è stata annullata. Visualizza il log per maggiori dettagli. - + Invalid File File non valido - + %1 is not a valid CIA %1 non è un CIA valido - + CIA Encrypted File CIA criptato - + Your CIA file is encrypted.<br/><a href='https://azahar-emu.org/blog/game-loading-changes/'>Please check our blog for more info.</a> Il file CIA è criptato. <br/><a href='https://azahar-emu.org/blog/game-loading-changes/'>Consulta il nostro blog per maggiori informazioni.</a> - + Unable to find File Impossibile trovare il file - + Could not find %1 Impossibile trovare %1 - - - - Error compressing file - Errore durante la compressione del file + + + + + Z3DS Compression + Compressione Z3DS - - File compress operation failed, check log for details. - Compressione del file fallita, controlla i log per i dettagli. + + Failed to compress some files, check log for details. + Impossibile comprimere alcuni file, controllare il log per i dettagli. - - - - Error decompressing file - Errore durante la decompressione del file + + Failed to decompress some files, check log for details. + Impossibile decomprimere alcuni file, controllare il log per i dettagli. - - File decompress operation failed, check log for details. - Decompressione del file fallita, controlla i log per i dettagli. + + All files have been compressed successfully. + Tutti i file sono stati compressi con successo. - + + All files have been decompressed successfully. + Tutti i file sono stati decompressi con successo. + + + Uninstalling '%1'... Disinstallazione di "%1" in corso... - + Failed to uninstall '%1'. Errore nella disinstallazione di "%1". - + Successfully uninstalled '%1'. "%1" è stato disinstallato con successo. - + File not found File non trovato - + File "%1" not found File "%1" non trovato - + Savestates Stati salvati - + Warning: Savestates are NOT a replacement for in-application saves, and are not meant to be reliable. Use at your own risk! @@ -4570,86 +4596,86 @@ Use at your own risk! Usali a tuo rischio e pericolo. - - - + + + Error opening amiibo data file Errore durante l'apertura dell'amiibo. - + A tag is already in use. Un tag è già in uso. - + Application is not looking for amiibos. L'applicazione non sta cercando alcun amiibo. - + Amiibo File (%1);; All Files (*.*) File Amiibo (%1);; Tutti i file (*.*) - + Load Amiibo Carica Amiibo - + Unable to open amiibo file "%1" for reading. Impossibile leggere il file amiibo "%1". - + Record Movie Registra filmato - + Movie recording cancelled. Registrazione del filmato annullata. - - + + Movie Saved Filmato salvato - - + + The movie is successfully saved. Il filmato è stato salvato con successo. - + Application will unpause L'applicazione riprenderà - + The application will be unpaused, and the next frame will be captured. Is this okay? L'applicazione riprenderà, e il prossimo frame verrà catturato. Va bene? - + Invalid Screenshot Directory Cartella degli screenshot non valida - + Cannot create specified screenshot directory. Screenshot path is set back to its default value. Non è stato possibile creare la cartella degli screenshot specificata. Il percorso a tale cartella è stato ripristinato al suo valore predefinito. - + Could not load video dumper Impossibile caricare l'estrattore del video - + FFmpeg could not be loaded. Make sure you have a compatible version installed. To install FFmpeg to Azahar, press Open and select your FFmpeg directory. @@ -4662,275 +4688,265 @@ Per installare FFmpeg su Azahar, clicca su Apri e seleziona la cartella di FFmpe Per istruzioni su come installare FFmpeg, clicca su Aiuto. - - Load 3DS ROM File + + Load 3DS ROM Files Carica file ROM 3DS - - 3DS ROM Files (*.cia *cci *3dsx *cxi) + + 3DS ROM Files (*.cia *.cci *.3dsx *.cxi) File ROM 3DS (*.cia *.cci *.3dsx *.cxi) - - The selected file is not a compatible 3DS ROM format. Make sure you have chosen the right file, and that it is not encrypted. - Il file selezionato non è un formato ROM 3DS compatibile. Assicurati di aver scelto il file giusto e che non sia crittografato. - - - - The selected file is already compressed. - Il file selezionato è già compresso. - - - + 3DS Compressed ROM File (*.%1) - File ROM 3DS Compresso (*.%1) + File ROM 3DS compresso (*.%1) - + Save 3DS Compressed ROM File Salva file ROM 3DS compresso - - Load 3DS Compressed ROM File - Carica file ROM 3DS compresso + + Select Output 3DS Compressed ROM Folder + Seleziona la cartella di destinazione delle ROM 3DS compresse - + + Load 3DS Compressed ROM Files + Carica file ROM 3DS compressi + + + 3DS Compressed ROM Files (*.zcia *zcci *z3dsx *zcxi) - File ROM 3DS Compresso (*.zcia *zcci *z3dsx *zcxi) + File ROM 3DS compresso (*.zcia *zcci *z3dsx *zcxi) - - The selected file is not a compatible compressed 3DS ROM format. Make sure you have chosen the right file. - Il file selezionato non è un formato ROM 3DS compresso compatibile. Assicurati di aver scelto il file giusto. - - - - The selected file is already decompressed. - Il file selezionato è già compresso. - - - + 3DS ROM File (*.%1) File ROM 3DS (*.%1) - + Save 3DS ROM File Salva file ROM 3DS - + + Select Output 3DS ROM Folder + Seleziona la cartella di destinazione delle ROM 3DS + + + Select FFmpeg Directory Seleziona la cartella di installazione di FFmpeg. - + The provided FFmpeg directory is missing %1. Please make sure the correct directory was selected. La cartella di FFmpeg selezionata non contiene %1. Assicurati di aver selezionato la cartella corretta. - + FFmpeg has been sucessfully installed. FFmpeg è stato installato con successo. - + Installation of FFmpeg failed. Check the log file for details. Installazione di FFmpeg fallita. Consulta i file di log per maggiori dettagli. - + Could not start video dumping.<br>Please ensure that the video encoder is configured correctly.<br>Refer to the log for details. Impossibile iniziare il dumping video.<br> Assicurati che l'encoder video sia configurato correttamente. <br>Controlla il log per ulteriori dettagli. - + Recording %1 Registrazione in corso (%1) - + Playing %1 / %2 Riproduzione in corso (%1 / %2) - + Movie Finished Filmato terminato - + (Accessing SharedExtData) (Accessing SharedExtData) - + (Accessing SystemSaveData) (Accessing SystemSaveData) - + (Accessing BossExtData) (Accessing BossExtData) - + (Accessing ExtData) (Accessing ExtData) - + (Accessing SaveData) (Accessing SaveData) - + MB/s MB/s - + KB/s KB/s - + Artic Traffic: %1 %2%3 Traffico Artic: %1 %2%3 - + Speed: %1% Velocità: %1% - + Speed: %1% / %2% Velocità: %1% / %2% - + App: %1 FPS App: %1 FPS - + Frame: %1 ms (GPU: [CMD: %2 ms, SWP: %3 ms], IPC: %4 ms, SVC: %5 ms, Rem: %6 ms) Frame: %1 ms (GPU: [CMD: %2 ms, SWP: %3 ms], IPC: %4 ms, SVC: %5 ms, Rem: %6 ms) - + Frame: %1 ms Frame: %1 ms - + VOLUME: MUTE VOLUME: MUTO - + VOLUME: %1% Volume percentage (e.g. 50%) VOLUME: %1% - + %1 is missing. Please <a href='https://web.archive.org/web/20240304201103/https://citra-emu.org/wiki/dumping-system-archives-and-the-shared-fonts-from-a-3ds-console/'>dump your system archives</a>.<br/>Continuing emulation may result in crashes and bugs. %1 non trovato. <a href='https://web.archive.org/web/20240304201103/https://citra-emu.org/wiki/dumping-system-archives-and-the-shared-fonts-from-a-3ds-console/'>Estrai i tuoi archivi di sistema</a>.<br/>Proseguendo l'emulazione si potrebbero verificare arresti anomali e bug. - + A system archive Un archivio di sistema - + System Archive Not Found Archivio di sistema non trovato - + System Archive Missing Archivio di sistema mancante - + Save/load Error Errore di salvataggio/caricamento - + Fatal Error Errore irreversibile - + A fatal error occurred. <a href='https://web.archive.org/web/20240228001712/https://community.citra-emu.org/t/how-to-upload-the-log-file/296'>Check the log</a> for details.<br/>Continuing emulation may result in crashes and bugs. Si è verificato un errore fatale. <a href='https://web.archive.org/web/20240228001712/https://community.citra-emu.org/t/how-to-upload-the-log-file/296'>Controlla il log</a> per i dettagli.<br/>Continuare l'emulazione potrebbe causare arresti anomali e bug. - + Fatal Error encountered Errore irreversibile riscontrato - + Continue Continua - + Quit Application Chiudi applicazione - + OK OK - + Would you like to exit now? Desideri uscire ora? - + The application is still running. Would you like to stop emulation? L'applicazione è ancora in esecuzione. Vuoi arrestare l'emulazione? - + Playback Completed Riproduzione completata - + Movie playback completed. Riproduzione del filmato completata. - + Update Available Aggiornamento disponibile - + Update %1 for Azahar is available. Would you like to download it? L'aggiornamento %1 di Azahar è disponibile. Vuoi installarlo? - + Primary Window Finestra principale - + Secondary Window Finestra secondaria @@ -5036,175 +5052,190 @@ Vuoi installarlo? GameList - + IMPORTANT: Encrypted files and .3ds files are no longer supported. Decrypting and/or renaming to .cci may be necessary. <a href='https://azahar-emu.org/blog/game-loading-changes/'>Learn more.</a> IMPORTANTE: I file criptati e i file .3ds non sono più supportati. Potrebbe essere necessario decriptare o rinominare i file usando l'estensione .cci. <a href='https://azahar-emu.org/blog/game-loading-changes/'>Scopri di più.</a> - + Don't show again Non mostrare più - - + + Compatibility Compatibilità - - + + Region Regione - - + + File type Tipo di file - - + + Size Dimensione - - + + Play time Tempo di gioco - + Favorite Preferito - + + Eject Cartridge + Rimuovi schedina + + + + Insert Cartridge + Inserisci schedina + + + Open Apri - + Application Location Cartella dell'applicazione - + Save Data Location Cartella dei dati di salvataggio - + Extra Data Location Cartella dei dati aggiuntivi - + Update Data Location Cartella dei dati di aggiornamento - + DLC Data Location Cartella dei dati dei DLC - + Texture Dump Location Cartella di estrazione delle texture - + Custom Texture Location Cartella delle texture personalizzate - + Mods Location Cartella delle mod - + Dump RomFS Estrai la RomFS - + Disk Shader Cache Cache degli shader su disco - + Open Shader Cache Location Apri la cartella della cache degli shader - + Delete OpenGL Shader Cache Elimina la cache degli shader OpenGL - + Uninstall Disinstalla - + Everything Tutto - + Application Applicazione - + Update Aggiornamento - + DLC DLC - + Remove Play Time Data Rimuovi dati sul tempo di gioco - + Create Shortcut Crea scorciatoia - + Add to Desktop Aggiungi al desktop - + Add to Applications Menu Aggiungi al menù delle applicazioni - + + Stress Test: App Launch + Stress Test: Avvio dell'app + + + Properties Proprietà - - - - + + + + Azahar Azahar - + Are you sure you want to completely uninstall '%1'? This will delete the application if installed, as well as any installed updates or DLC. @@ -5213,64 +5244,64 @@ This will delete the application if installed, as well as any installed updates Se installata, l'applicazione verrà rimossa assieme ad eventuali aggiornamenti e DLC installati. - - + + %1 (Update) %1 (Aggiornamento) - - + + %1 (DLC) %1 (DLC) - + Are you sure you want to uninstall '%1'? Sei sicuro di voler disinstallare '%1'? - + Are you sure you want to uninstall the update for '%1'? Sei sicuro di voler disinstallare l'aggiornamento di '%1'? - + Are you sure you want to uninstall all DLC for '%1'? Sei sicuro di voler disinstallare tutti i DLC di '%1'? - + Scan Subfolders Scansiona le sottocartelle - + Remove Application Directory Rimuovi cartella delle applicazioni - + Move Up Sposta in alto - + Move Down Sposta in basso - + Open Directory Location Apri cartella - + Clear Ripristina - + Name Nome @@ -5278,82 +5309,82 @@ Se installata, l'applicazione verrà rimossa assieme ad eventuali aggiornam GameListItemCompat - + Perfect Perfetto - + App functions flawless with no audio or graphical glitches, all tested functionality works as intended without any workarounds needed. Il gioco funziona perfettamente senza alcun glitch audio o video, tutte le funzionalità testate funzionano come dovrebbero senza la necessità di utilizzare alcun espediente. - + Great Ottimo - + App functions with minor graphical or audio glitches and is playable from start to finish. May require some workarounds. L'app presenta alcuni glitch audio o video minori ed è possibile giocare dall'inizio alla fine. Potrebbe richiedere l'utilizzo di alcuni espedienti. - + Okay Okay - + App functions with major graphical or audio glitches, but app is playable from start to finish with workarounds. L'app presenta considerevoli glitch audio o video, ma è possibile giocare dall'inizio alla fine utilizzando degli espedienti. - + Bad Scadente - + App functions, but with major graphical or audio glitches. Unable to progress in specific areas due to glitches even with workarounds. L'app funziona, ma presenta glitch audio e video considerevoli. Impossibile progredire in alcune aree a causa di alcuni glitch anche usando espedienti. - + Intro/Menu Intro/Menù - + App is completely unplayable due to major graphical or audio glitches. Unable to progress past the Start Screen. L'app è del tutto ingiocabile a causa di considerevoli glitch audio o video. È impossibile proseguire oltre la schermata iniziale. - + Won't Boot Non si avvia - + The app crashes when attempting to startup. L'app va in crash quando viene avviata. - + Not Tested Non testato - + The app has not yet been tested. L'app non è ancora stata testata. @@ -5361,7 +5392,7 @@ Screen. GameListPlaceholder - + Double-click to add a new folder to the application list Fai doppio clic per aggiungere una nuova cartella alla lista delle applicazioni @@ -5369,27 +5400,27 @@ Screen. GameListSearchField - + of di - + result risultato - + results risultati - + Filter: Filtro: - + Enter pattern to filter Inserisci pattern per filtrare @@ -5439,7 +5470,7 @@ Screen. Region free - Region free + Region-free @@ -5717,87 +5748,87 @@ Screen. Indice Ciclo: - + SRC1: %1, %2, %3, %4 SRC1: %1, %2, %3, %4 - + SRC2: %1, %2, %3, %4 SRC2: %1, %2, %3, %4 - + SRC3: %1, %2, %3, %4 SRC3: %1, %2, %3, %4 - + DEST_IN: %1, %2, %3, %4 DEST_IN: %1, %2, %3, %4 - + DEST_OUT: %1, %2, %3, %4 DEST_OUT: %1, %2, %3, %4 - + Address Registers: %1, %2 Registri dell'indirizzo: %1, %2 - + Compare Result: %1, %2 Risultato del confronto: %1, %2 - + Static Condition: %1 Condizione statica: %1 - + Dynamic Conditions: %1, %2 Condizioni dinamiche: %1, %2 - + Loop Parameters: %1 (repeats), %2 (initializer), %3 (increment), %4 Parametri loop: %1 (ripetute), %2 (inizializzatore), %3 (incremento), %4 - + Instruction offset: 0x%1 Offset istruzione: 0x%1 - + -> 0x%2 -> 0x%2 - + (last instruction) (ultima istruzione) @@ -6098,32 +6129,32 @@ Messaggio di debug: Password: - + Room Name Nome stanza - + Preferred Application Applicazioni preferite - + Host Host - + Players Giocatori - + Refreshing Aggiornamento in corso - + Refresh List Aggiorna lista @@ -6393,12 +6424,12 @@ Messaggio di debug: Compress ROM File... - File ROM compresso... + Comprimi file ROM... Decompress ROM File... - File ROM decompresso... + Decomprimi file ROM... @@ -6832,37 +6863,37 @@ Messaggio di debug: Username is already in use or not valid. Please choose another. - Il nome utente è già in uso, oppure non è valido. Scegline un altro. + Il nome utente è già in uso o non è valido. Scegline un altro. IP is not a valid IPv4 address. - Questo indirizzo IPv4 non è valido. + L'IP non è un indirizzo IPv4 valido. Port must be a number between 0 to 65535. - Il numero della porta dev'essere compreso tra 0 e 65535. + Il numero della porta deve essere compreso tra 0 e 65535. You must choose a Preferred Application to host a room. If you do not have any applications in your Applications list yet, add an applications folder by clicking on the plus icon in the Applications list. - Devi scegliere un'applicazione preferita per poter ospitare una stanza. Se non hai ancora delle applicazioni nella lista delle applicazioni, aggiungi una cartella cliccando sull'icona + nella lista. + Devi scegliere un'applicazione preferita per poter ospitare una stanza. Se non hai ancora delle applicazioni in lista, aggiungi una cartella delle applicazioni cliccando sull'icona + nella lista. Unable to find an internet connection. Check your internet settings. - Impossibile trovare una connessione ad Internet. Ricontrolla le tue impostazioni di rete. + Impossibile trovare una connessione ad Internet. Controlla le tue impostazioni di rete. Unable to connect to the host. Verify that the connection settings are correct. If you still cannot connect, contact the room host and verify that the host is properly configured with the external port forwarded. - Impossibile connettersi all'host. Accertati che le impostazioni di connessione siano corrette. Se ancora non riesci a connetterti, contatta l'host della stanza per verificare che l'host abbia abilitato il forwarding delle porte. + Impossibile connettersi all'host. Assicurati che le impostazioni di connessione siano corrette. Se ancora non riesci a connetterti, contatta l'host della stanza per verificare che abbia abilitato il forwarding delle porte. Unable to connect to the room because it is already full. - La stanza è piena. + Impossibile connettersi: la stanza è piena. @@ -6872,7 +6903,7 @@ Messaggio di debug: The host of the room has banned you. Speak with the host to unban you or try a different room. - L'host della stanza ti ha bannato. Contatta l'host o connettiti ad un altra stanza. + L'host della stanza ti ha bannato. Contatta l'host o prova a connetterti a un altra stanza. @@ -6882,7 +6913,7 @@ Messaggio di debug: Incorrect password. - Password sbagliata + Password errata. @@ -6922,7 +6953,7 @@ Vai in Emulazione > Configura > Sistema per generarne un altro. The user you are trying to kick/ban could not be found. They may have left the room. - L'utente che stai cercando di espellere/bannare non è stato trovato. + L'utente che stai cercando di espellere/bandire non è stato trovato. Potrebbe aver lasciato la stanza. @@ -7125,32 +7156,32 @@ Potrebbe aver lasciato la stanza. %1 (0x%2) - + Unsupported encrypted application Applicazione criptata non supportata - + Invalid region Regione non valida - + Installed Titles Titoli installati - + System Titles Titoli di sistema - + Add New Application Directory Aggiungi una nuova cartella delle applicazioni - + Favorites Preferiti @@ -7453,7 +7484,7 @@ Se vuoi cancellare i file rimasti nella precedente cartella dei dati, puoi farlo free - free + libero @@ -7461,7 +7492,7 @@ Se vuoi cancellare i file rimasti nella precedente cartella dei dati, puoi farlo holding mutexes - holding mutexes + mutex trattenuti @@ -7510,7 +7541,7 @@ Se vuoi cancellare i file rimasti nella precedente cartella dei dati, puoi farlo sleeping - in sleep + in riposo diff --git a/dist/languages/ja_JP.ts b/dist/languages/ja_JP.ts index 6ac68b74f..bc55e1af0 100644 --- a/dist/languages/ja_JP.ts +++ b/dist/languages/ja_JP.ts @@ -298,8 +298,8 @@ This would ban both their forum username and their IP address. - Emulation: - エミュレーション + Emulation + エミュレーション @@ -403,6 +403,7 @@ This would ban both their forum username and their IP address. + Camera カメラ設定 @@ -414,8 +415,8 @@ This would ban both their forum username and their IP address. - Camera to configure: - 設定を行うカメラ + Camera to Configure + @@ -435,8 +436,8 @@ This would ban both their forum username and their IP address. - Camera mode: - カメラモード + Camera mode + @@ -456,8 +457,8 @@ This would ban both their forum username and their IP address. - Camera position: - カメラの位置 + Camera position + @@ -482,8 +483,8 @@ This would ban both their forum username and their IP address. - Camera Image Source: - カメラに表示する画像(映像)選択 + Camera Image Source + @@ -502,8 +503,8 @@ This would ban both their forum username and their IP address. - File: - ファイル + File + @@ -516,11 +517,6 @@ This would ban both their forum username and their IP address. Select the system camera to use 使用するシステムカメラを選択 - - - Camera: - カメラ - <Default> @@ -534,8 +530,8 @@ This would ban both their forum username and their IP address. - Flip: - フリップ効果 + Flip + @@ -716,12 +712,12 @@ Would you like to ignore the error and continue? Global Log Filter - Global Log Filter + グローバルログフィルタ Regex Log Filter - + 正規表現ログフィルタ @@ -1023,7 +1019,7 @@ Would you like to ignore the error and continue? Enable Linear Filtering - 線形フィルタリングを有効化 + @@ -1078,7 +1074,7 @@ Would you like to ignore the error and continue? Off - + OFF @@ -1087,28 +1083,28 @@ Would you like to ignore the error and continue? - Reverse Side by Side + Side by Side Full Width Anaglyph - + アナグリフ Interlaced - + インターレース Reverse Interlaced - + 逆インターレース Depth - + 深度 @@ -1146,49 +1142,54 @@ Would you like to ignore the error and continue? <html><head/><body><p>右目側の描写を無効にする</p><p>立体視モードでないとき、右目側の画像を描写するのを無効にします。いくつかのアプリケーションで大きくパフォーマンスが向上しますが、ちらつきが起こる可能性があります。</p></body></html> - + + Swap Eyes + + + + Utility ユーティリティ - + <html><head/><body><p>Replace textures with PNG files.</p><p>Textures are loaded from load/textures/[Title ID]/.</p></body></html> <html><head/><body><p>テクスチャをPNGファイルで置き換えます。</p><p>テクスチャは/load/textures/[Title ID]/から読み込まれます。</p></body></html> - - Use Custom Textures - カスタムテクスチャを使用 + + Use custom textures + - + <html><head/><body><p>Dump textures to PNG files.</p><p>Textures are dumped to dump/textures/[Title ID]/.</p></body></html> <html><head/><body><p>PNGファイルにテクスチャを出力</p><p>テクスチャは dump/textures/[Title ID]/に出力されます。 - - Dump Textures - テクスチャをダンプ + + Dump textures + - + <html><head/><body><p>Load all custom textures into memory on boot, instead of loading them when the application requires them.</p></body></html> <html><head/><body><p>カスタムテクスチャーをアプリケーションが使用するときでなく、起動時にメモリーにすべて読み込みます。</p></body></html> - - Preload Custom Textures - カスタムテクスチャをプリロードする + + Preload custom textures + - + <html><head/><body><p>Load custom textures asynchronously with background threads to reduce loading stutter</p></body></html> <html><head/><body><p>バックグラウンドスレッドと同期してカスタムテクスチャを読み込み、ロード時のカクつきを軽減します。</p></body></html> - - Async Custom Texture Loading - カスタムテクスチャーを非同期的に読み込む + + Async custom texture loading + @@ -1245,18 +1246,18 @@ Would you like to ignore the error and continue? - Set emulation speed: - エミュレーション速度: + Set emulation speed + - Emulation Speed: - エミュレーション速度 + Emulation Speed + Turbo Speed Limit: - + ターボ制限: @@ -1362,12 +1363,12 @@ Would you like to ignore the error and continue? - SPIR-V Shader Generation - SPIR-V シェーダー生成 + SPIR-V shader generation + - Disable GLSL -> SPIR-V Optimizer + Disable GLSL -> SPIR-V optimizer @@ -1387,8 +1388,8 @@ Would you like to ignore the error and continue? - Enable Hardware Shader - ハードウェアシェーダーを有効化 + Enable hardware shader + @@ -1397,8 +1398,8 @@ Would you like to ignore the error and continue? - Accurate Multiplication - Accurate Multiplication + Accurate multiplication + @@ -1407,8 +1408,8 @@ Would you like to ignore the error and continue? - Enable Shader JIT - シェーダーJITを有効化 + Enable shader JIT + @@ -1417,8 +1418,8 @@ Would you like to ignore the error and continue? - Enable Async Shader Compilation - 非同期シェーダー処理を有効にする + Enable async shader compilation + @@ -1427,7 +1428,7 @@ Would you like to ignore the error and continue? - Enable Async Presentation + Enable async presentation @@ -1467,8 +1468,8 @@ Would you like to ignore the error and continue? - Use Disk Shader Cache - ディスクシェーダーキャッシュを使う + Use disk shader cache + @@ -1483,7 +1484,7 @@ Would you like to ignore the error and continue? Use global - + グローバルを使用します @@ -1492,7 +1493,7 @@ Would you like to ignore the error and continue? - Delay application render thread: + Delay Application Render Thread @@ -1537,7 +1538,7 @@ Would you like to ignore the error and continue? Toggle Turbo Mode - + ターボトグル @@ -1936,12 +1937,12 @@ Would you like to ignore the error and continue? Screens - + 画面 Screen Layout - 画面レイアウト + 画面構成 @@ -1951,12 +1952,12 @@ Would you like to ignore the error and continue? Single Screen - Single Screen + 単一画面 Large Screen - Large Screen + 大画面 @@ -1971,7 +1972,7 @@ Would you like to ignore the error and continue? Hybrid Screen - + ハイブリッド画面 @@ -1981,12 +1982,12 @@ Would you like to ignore the error and continue? - Swap Screens - スクリーンの上下を入れ替える + Swap screens + - Rotate Screens Upright + Rotate screens upright @@ -1997,12 +1998,12 @@ Would you like to ignore the error and continue? Large Screen Proportion - + 大画面比率 Small Screen Position - + 小画面の位置 @@ -2017,7 +2018,7 @@ Would you like to ignore the error and continue? Bottom Right (default) - + 右下(デフォルト) @@ -2032,17 +2033,17 @@ Would you like to ignore the error and continue? Bottom Left - + 左下 Above large screen - + 大画面の上 Below large screen - + 大画面の下 @@ -2053,7 +2054,7 @@ Would you like to ignore the error and continue? Top Screen - + 上画面 @@ -2099,17 +2100,17 @@ Would you like to ignore the error and continue? Bottom Screen - + 下画面 - <html><head/><body><p>Bottom Screen Opacity % (OpenGL Only)</p></body></html> - <html><head/><body><p>下スクリーンの透明度(OpenGLのみ)</p></body></html> + <html><head/><body><p>Bottom Screen Opacity %</p></body></html> + Single Screen Layout - + 単一画面構成 @@ -2451,8 +2452,8 @@ Would you like to ignore the error and continue? - Use Virtual SD - 仮想SDを使う + Use virtual SD card + @@ -2461,7 +2462,7 @@ Would you like to ignore the error and continue? - Use Custom Storage + Use custom storage location @@ -2548,8 +2549,8 @@ online features (if installed) - Region: - + Region + 地域 @@ -2557,326 +2558,337 @@ online features (if installed) - + + Apply region free patch to +installed applications. + + + + + Patches the region of installed applications to be region free, so that they always appear on the home menu. + + + + Username ユーザーネーム - + Birthday 誕生日 - + January 1月 - + February 2月 - + March 3月 - + April 4月 - + May 5月 - + June 6月 - + July 7月 - + August 8月 - + September 9月 - + October 10月 - + November 11月 - + December 12月 - + Language 言語 - + Note: this can be overridden when region setting is auto-select 注:地域設定が自動選択の場合、この設定は無視されます。 - + Japanese (日本語) 日本語 (Japanese) - + English 英語 (English) - + French (français) フランス語 (Français) - + German (Deutsch) ドイツ語 (Deutsch) - + Italian (italiano) イタリア語 (Italiano) - + Spanish (español) スペイン語 (Español) - + Simplified Chinese (简体中文) 簡体字中国語 (简体中文) - + Korean (한국어) 韓国語 (한국어) - + Dutch (Nederlands) オランダ語 (Nederlands) - + Portuguese (português) ポルトガル語 (Português) - + Russian (Русский) ロシア語 (Русский) - + Traditional Chinese (正體中文) 繁体字中国語 (正體中文) - + Sound output mode サウンド - + Mono モノラル - + Stereo ステレオ - + Surround サラウンド - + Country - + Clock 時刻 - + System Clock システムの時刻を使用 - + Fixed Time 固定 - + Startup time 起動時の時刻 - + yyyy-MM-ddTHH:mm:ss yyyy-MM-dd THH:mm:ss - + Offset time - + days - + HH:mm:ss 時時:分分:秒秒 - + Initial System Ticks - + Random - + Fixed - + Initial System Ticks Override - + Play Coins - + <html><head/><body><p>Number of steps per hour reported by the pedometer. Range from 0 to 65,535.</p></body></html> <html><head/><body><p>1時間あたりに歩数計が記録する歩数。0-65535の間で指定してください。</p></body></html> - + Pedometer Steps per Hour 1時間当たりの歩数計の歩数 - + Run System Setup when Home Menu is launched ホームメニューの起動時に初回セットアップを実行する - + Console ID: コンソールID: - - + + Regenerate コンソールの再作成 - + MAC: - - 3GX Plugin Loader: - 3GXプラグインローダー: + + 3GX Plugin Loader + - + Enable 3GX plugin loader 3GXプラグインローダーを有効にする - + Allow applications to change plugin loader state - + Real Console Unique Data 本体に固有のデータ - + Your real console is linked to Azahar. - + Unlink - + OTP - - - - + + + + Choose - + SecureInfo_A/B SecureInfo_A/B - + LocalFriendCodeSeed_A/B LocalFriendCodeSeed_A/B - + movable.sed movable.sed - + System settings are available only when applications is not running. @@ -3586,76 +3598,76 @@ online features (if installed) - - + + Console ID: 0x%1 コンソール ID: 0x%1 - - + + MAC: %1 - + This will replace your current virtual 3DS console ID with a new one. Your current virtual 3DS console ID will not be recoverable. This might have unexpected effects in applications. This might fail if you use an outdated config save. Continue? - - - + + + Warning 警告 - + This will replace your current MAC address with a new one. It is not recommended to do this if you got the MAC address from your real console using the setup tool. Continue? - + This action will unlink your real console from Azahar, with the following consequences:<br><ul><li>Your OTP, SecureInfo and LocalFriendCodeSeed will be removed from Azahar.</li><li>Your friend list will reset and you will be logged out of your NNID/PNID account.</li><li>System files and eshop titles obtained through Azahar will become inaccessible until the same console is linked again (save data will not be lost).</li></ul><br>Continue? - + Invalid country for configured region - + Invalid country for console unique data - + Status: Loaded - + Status: Loaded (Invalid Signature) - + Status: Loaded (Region Changed) - + Status: Not Found - + Status: Invalid - + Status: IO Error @@ -3771,13 +3783,13 @@ Drag points to change position, or double-click table cells to edit values. - Interface language: - UIの言語 + Interface Language + - Theme: - テーマ + Theme + @@ -3786,8 +3798,8 @@ Drag points to change position, or double-click table cells to edit values. - Icon Size: - アイコンサイズ + Icon Size + @@ -3807,8 +3819,8 @@ Drag points to change position, or double-click table cells to edit values. - Row 1 Text: - 1行目の表示項目 + Row 1 Text + @@ -3842,18 +3854,18 @@ Drag points to change position, or double-click table cells to edit values. - Row 2 Text: - 2行目の表示項目 + Row 2 Text + - Hide Titles without Icon - アイコンのないタイトルを非表示 + Hide titles without icon + - Single Line Mode - シングルラインモード + Single line mode + @@ -3862,7 +3874,7 @@ Drag points to change position, or double-click table cells to edit values. - Show Advanced Frame Time Info + Show advanced frame time info @@ -3945,12 +3957,12 @@ Drag points to change position, or double-click table cells to edit values. DirectConnectWindow - + Connecting 接続中... - + Connect 接続 @@ -4069,582 +4081,596 @@ Please check your FFmpeg installation used for compilation. GMainWindow - + No Suitable Vulkan Devices Detected - + Vulkan initialization failed during boot.<br/>Your GPU may not support Vulkan 1.1, or you do not have the latest graphics driver. - + Current Artic traffic speed. Higher values indicate bigger transfer loads. - - + + Current emulation speed. Values higher or lower than 100% indicate emulation is running faster or slower than a 3DS. 現在のエミュレーション速度です。100%以外の値は、エミュレーションが3DS実機より高速または低速で行われていることを表します。 - - + + How many frames per second the app is currently displaying. This will vary from app to app and scene to scene. - - + + Time taken to emulate a 3DS frame, not counting framelimiting or v-sync. For full-speed emulation this should be at most 16.67 ms. 3DSフレームをエミュレートするのにかかった時間です。フレームリミットや垂直同期の有効時にはカウントしません。フルスピードで動作させるには16.67ms以下に保つ必要があります。 - + MicroProfile (unavailable) - + Clear Recent Files 最近のファイルを消去 - + &Continue - + &Pause - + Azahar is running an application TRANSLATORS: This string is shown to the user to explain why Citra needs to prevent the computer from sleeping - - + + Invalid App Format - - + + Your app format is not supported.<br/>Please follow the guides to redump your <a href='https://web.archive.org/web/20240304210021/https://citra-emu.org/wiki/dumping-game-cartridges/'>game cartridges</a> or <a href='https://web.archive.org/web/20240304210011/https://citra-emu.org/wiki/dumping-installed-titles/'>installed titles</a>. - + App Corrupted - + Your app is corrupted. <br/>Please follow the guides to redump your <a href='https://web.archive.org/web/20240304210021/https://citra-emu.org/wiki/dumping-game-cartridges/'>game cartridges</a> or <a href='https://web.archive.org/web/20240304210011/https://citra-emu.org/wiki/dumping-installed-titles/'>installed titles</a>. - + App Encrypted - + Your app is encrypted. <br/><a href='https://azahar-emu.org/blog/game-loading-changes/'>Please check our blog for more info.</a> このアプリは暗号化されています。<br/><a href='https://azahar-emu.org/blog/game-loading-changes/'>ブログで詳細な情報を確認してください。</a> - + Unsupported App - + GBA Virtual Console is not supported by Azahar. GBAバーチャルコンソールはAzaharではサポートされていません。 - - + + Artic Server Artic Base - + + Invalid system mode + + + + + New 3DS exclusive applications cannot be loaded without enabling the New 3DS mode. + + + + Error while loading App! - + An unknown error occurred. Please see the log for more details. 不明なエラーが発生しました. 詳細はログを参照してください. - + CIA must be installed before usage CIAを使用前にインストールする必要有 - + Before using this CIA, you must install it. Do you want to install it now? CIAを使用するには先にインストールを行う必要があります。今すぐインストールしますか? - + Quick Load - + Quick Save - - + + Slot %1 スロット %1 - + %2 %3 - + Quick Save - %1 - + Quick Load - %1 - + Slot %1 - %2 %3 - + Error Opening %1 Folder フォルダ %1 を開く際のエラー - - + + Folder does not exist! フォルダが見つかりません! - + Remove Play Time Data プレイ時間のデータを削除 - + Reset play time? プレイ時間をリセットしますか? - - - - + + + + Create Shortcut ショートカットを作成する - + Do you want to launch the application in fullscreen? - + Successfully created a shortcut to %1 %1にショートカットを作成しました。 - + This will create a shortcut to the current AppImage. This may not work well if you update. Continue? - + Failed to create a shortcut to %1 - + Create Icon - + Cannot create icon file. Path "%1" does not exist and cannot be created. - + Dumping... ダンプ中... - - + + Cancel キャンセル - - - - - - - - - + + + + + + + + + Azahar Azahar - + Could not dump base RomFS. Refer to the log for details. ベースRomFSをダンプできませんでした。 詳細はログを参照してください。 - + Error Opening %1 %1 を開く際のエラー - + Select Directory 3DSのROMがあるフォルダを選択 - + Properties プロパティ - + The application properties could not be loaded. - + 3DS Executable (%1);;All Files (*.*) %1 is an identifier for the 3DS executable file extensions. 3DS実行ファイル (%1);;すべてのファイル (*.*) - + Load File ゲームファイルの読み込み - - + + Set Up System Files - + <p>Azahar needs console unique data and firmware files from a real console to be able to use some of its features.<br>Such files and data can be set up with the <a href=https://github.com/azahar-emu/ArticSetupTool>Azahar Artic Setup Tool</a><br>Notes:<ul><li><b>This operation will install console unique data to Azahar, do not share your user or nand folders<br>after performing the setup process!</b></li><li>While doing the setup process, Azahar will link to the console running the setup tool. You can unlink the<br>console later from the System tab in the emulator configuration menu.</li><li>Do not go online with both Azahar and your 3DS console at the same time after setting up system files,<br>as it could cause issues.</li><li>Old 3DS setup is needed for the New 3DS setup to work (doing both setup modes is recommended).</li><li>Both setup modes will work regardless of the model of the console running the setup tool.</li></ul><hr></p> - + Enter Azahar Artic Setup Tool address: - + <br>Choose setup mode: - + (ℹ️) Old 3DS setup - - + + Setup is possible. - + (⚠) New 3DS setup - + Old 3DS setup is required first. - + (✅) Old 3DS setup - - + + Setup completed. - + (ℹ️) New 3DS setup - + (✅) New 3DS setup - + The system files for the selected mode are already set up. Reinstall the files anyway? - + Load Files ファイルの読み込み - + 3DS Installation File (*.cia *.zcia) - - - + + + All Files (*.*) すべてのファイル (*.*) - + Connect to Artic Base Arctic Baseに接続 - + Enter Artic Base server address: - + %1 has been installed successfully. %1が正常にインストールされました - + Unable to open File ファイルを開けません - + Could not open %1 %1を開くことができませんでした - + Installation aborted インストール中止 - + The installation of %1 was aborted. Please see the log for more details %1のインストールは中断されました。詳細はログを参照してください - + Invalid File 無効なファイル - + %1 is not a valid CIA %1は有効なCIAではありません - + CIA Encrypted - + Your CIA file is encrypted.<br/><a href='https://azahar-emu.org/blog/game-loading-changes/'>Please check our blog for more info.</a> - + Unable to find File ファイルが見つかりません - + Could not find %1 %1を見つけられませんでした - - - - Error compressing file + + + + + Z3DS Compression - - File compress operation failed, check log for details. + + Failed to compress some files, check log for details. - - - - Error decompressing file + + Failed to decompress some files, check log for details. - - File decompress operation failed, check log for details. + + All files have been compressed successfully. - + + All files have been decompressed successfully. + + + + Uninstalling '%1'... '%1'をアンインストールしています - + Failed to uninstall '%1'. '%1' をアンインストールできませんでした - + Successfully uninstalled '%1'. - + File not found ファイルなし - + File "%1" not found ファイル%1が見つかりませんでした - + Savestates ステートセーブ - + Warning: Savestates are NOT a replacement for in-application saves, and are not meant to be reliable. Use at your own risk! - - - + + + Error opening amiibo data file - + A tag is already in use. - + Application is not looking for amiibos. - + Amiibo File (%1);; All Files (*.*) Amiiboファイル (%1);; すべてのファイル (*.*) - + Load Amiibo Amiiboを読込 - + Unable to open amiibo file "%1" for reading. - + Record Movie 操作を記録 - + Movie recording cancelled. 操作の記録がキャンセルされました - - + + Movie Saved 保存成功 - - + + The movie is successfully saved. 操作記録を保存しました - + Application will unpause - + The application will be unpaused, and the next frame will be captured. Is this okay? - + Invalid Screenshot Directory - + Cannot create specified screenshot directory. Screenshot path is set back to its default value. - + Could not load video dumper - + FFmpeg could not be loaded. Make sure you have a compatible version installed. To install FFmpeg to Azahar, press Open and select your FFmpeg directory. @@ -4653,274 +4679,264 @@ To view a guide on how to install FFmpeg, press Help. - - Load 3DS ROM File + + Load 3DS ROM Files - - 3DS ROM Files (*.cia *cci *3dsx *cxi) + + 3DS ROM Files (*.cia *.cci *.3dsx *.cxi) - - The selected file is not a compatible 3DS ROM format. Make sure you have chosen the right file, and that it is not encrypted. - - - - - The selected file is already compressed. - - - - + 3DS Compressed ROM File (*.%1) - + Save 3DS Compressed ROM File - - Load 3DS Compressed ROM File + + Select Output 3DS Compressed ROM Folder - + + Load 3DS Compressed ROM Files + + + + 3DS Compressed ROM Files (*.zcia *zcci *z3dsx *zcxi) - - The selected file is not a compatible compressed 3DS ROM format. Make sure you have chosen the right file. - - - - - The selected file is already decompressed. - - - - + 3DS ROM File (*.%1) - + Save 3DS ROM File - + + Select Output 3DS ROM Folder + + + + Select FFmpeg Directory - + The provided FFmpeg directory is missing %1. Please make sure the correct directory was selected. - + FFmpeg has been sucessfully installed. - + Installation of FFmpeg failed. Check the log file for details. - + Could not start video dumping.<br>Please ensure that the video encoder is configured correctly.<br>Refer to the log for details. - + Recording %1 - + Playing %1 / %2 - + Movie Finished - + (Accessing SharedExtData) - + (Accessing SystemSaveData) - + (Accessing BossExtData) - + (Accessing ExtData) - + (Accessing SaveData) - + MB/s - + KB/s - + Artic Traffic: %1 %2%3 - + Speed: %1% スピード:%1% - + Speed: %1% / %2% スピード:%1% / %2% - + App: %1 FPS - + Frame: %1 ms (GPU: [CMD: %2 ms, SWP: %3 ms], IPC: %4 ms, SVC: %5 ms, Rem: %6 ms) - + Frame: %1 ms フレーム:%1 ms - + VOLUME: MUTE 音量: ミュート - + VOLUME: %1% Volume percentage (e.g. 50%) 音量: %1% - + %1 is missing. Please <a href='https://web.archive.org/web/20240304201103/https://citra-emu.org/wiki/dumping-system-archives-and-the-shared-fonts-from-a-3ds-console/'>dump your system archives</a>.<br/>Continuing emulation may result in crashes and bugs. - + A system archive システムアーカイブ - + System Archive Not Found システムアーカイブなし - + System Archive Missing システムアーカイブが見つかりません - + Save/load Error セーブ/ロード エラー - + Fatal Error 致命的なエラー - + A fatal error occurred. <a href='https://web.archive.org/web/20240228001712/https://community.citra-emu.org/t/how-to-upload-the-log-file/296'>Check the log</a> for details.<br/>Continuing emulation may result in crashes and bugs. - + Fatal Error encountered 致命的なエラーが発生しました - + Continue 続行 - + Quit Application - + OK OK - + Would you like to exit now? 今すぐ終了しますか? - + The application is still running. Would you like to stop emulation? - + Playback Completed 再生完了 - + Movie playback completed. 操作記録の再生が完了しました - + Update Available - + Update %1 for Azahar is available. Would you like to download it? - + Primary Window - + Secondary Window @@ -5026,239 +5042,254 @@ Would you like to download it? GameList - + IMPORTANT: Encrypted files and .3ds files are no longer supported. Decrypting and/or renaming to .cci may be necessary. <a href='https://azahar-emu.org/blog/game-loading-changes/'>Learn more.</a> - + Don't show again - - + + Compatibility 動作状況 - - + + Region 地域 - - + + File type ファイルの種類 - - + + Size サイズ - - + + Play time プレイ時間 - + Favorite お気に入り - + + Eject Cartridge + + + + + Insert Cartridge + + + + Open 開く - + Application Location アプリケーションの場所 - + Save Data Location セーブデータの場所 - + Extra Data Location 追加データの場所 - + Update Data Location アップデートデータの場所 - + DLC Data Location DLCデータの場所 - + Texture Dump Location テクスチャのダンプ場所 - + Custom Texture Location カスタムテクスチャの場所 - + Mods Location モッドの場所 - + Dump RomFS RomFSをダンプ - + Disk Shader Cache ディスクシェーダーキャッシュ - + Open Shader Cache Location シェーダーキャッシュの場所を開く - + Delete OpenGL Shader Cache OpenGLシェーダーキャッシュを削除 - + Uninstall アンインストール - + Everything すべて - + Application - + Update アップデート - + DLC DLC - + Remove Play Time Data プレイ時間のデータを削除 - + Create Shortcut ショートカットを作成する - + Add to Desktop デスクトップ - + Add to Applications Menu スタートメニューに追加 - + + Stress Test: App Launch + + + + Properties プロパティ - - - - + + + + Azahar Azahar - + Are you sure you want to completely uninstall '%1'? This will delete the application if installed, as well as any installed updates or DLC. - - + + %1 (Update) - - + + %1 (DLC) - + Are you sure you want to uninstall '%1'? '%1'をアンインストールしますか? - + Are you sure you want to uninstall the update for '%1'? '%1'のアップデートをアンインストールしますか? - + Are you sure you want to uninstall all DLC for '%1'? '%1'のすべてのDLCを削除しますか? - + Scan Subfolders サブフォルダも検索 - + Remove Application Directory - + Move Up - + Move Down - + Open Directory Location フォルダの場所を開く - + Clear クリア - + Name タイトル @@ -5266,77 +5297,77 @@ This will delete the application if installed, as well as any installed updates GameListItemCompat - + Perfect カンペキ - + App functions flawless with no audio or graphical glitches, all tested functionality works as intended without any workarounds needed. - + Great サクサク - + App functions with minor graphical or audio glitches and is playable from start to finish. May require some workarounds. - + Okay ソコソコ - + App functions with major graphical or audio glitches, but app is playable from start to finish with workarounds. - + Bad ガタガタ - + App functions, but with major graphical or audio glitches. Unable to progress in specific areas due to glitches even with workarounds. - + Intro/Menu イントロ - + App is completely unplayable due to major graphical or audio glitches. Unable to progress past the Start Screen. - + Won't Boot ダメダメ - + The app crashes when attempting to startup. - + Not Tested 未検証 - + The app has not yet been tested. @@ -5344,7 +5375,7 @@ Screen. GameListPlaceholder - + Double-click to add a new folder to the application list @@ -5352,27 +5383,27 @@ Screen. GameListSearchField - + of 件ヒットしました - + result 件中 - + results 件中 - + Filter: タイトル名でフィルタ - + Enter pattern to filter ゲームタイトルを入力 @@ -5700,87 +5731,87 @@ Screen. Cycle Index: - + SRC1: %1, %2, %3, %4 SRC1: %1, %2, %3, %4 - + SRC2: %1, %2, %3, %4 SRC2: %1, %2, %3, %4 - + SRC3: %1, %2, %3, %4 SRC3: %1, %2, %3, %4 - + DEST_IN: %1, %2, %3, %4 DEST_IN: %1, %2, %3, %4 - + DEST_OUT: %1, %2, %3, %4 DEST_OUT: %1, %2, %3, %4 - + Address Registers: %1, %2 Address Registers: %1, %2 - + Compare Result: %1, %2 Compare Result: %1, %2 - + Static Condition: %1 Static Condition: %1 - + Dynamic Conditions: %1, %2 Dynamic Conditions: %1, %2 - + Loop Parameters: %1 (repeats), %2 (initializer), %3 (increment), %4 Loop Parameters: %1 (repeats), %2 (initializer), %3 (increment), %4 - + Instruction offset: 0x%1 Instruction offset: 0x%1 - + -> 0x%2 -> 0x%2 - + (last instruction) (last instruction) @@ -6080,32 +6111,32 @@ Debug Message: パスワードを入力 - + Room Name ルーム名 - + Preferred Application - + Host ホスト - + Players プレイヤー - + Refreshing 更新 - + Refresh List リスト更新 @@ -6170,7 +6201,7 @@ Debug Message: Small Screen Position - + 小画面の位置 @@ -6435,7 +6466,7 @@ Debug Message: Large Screen - Large Screen + 大画面 @@ -6450,7 +6481,7 @@ Debug Message: Hybrid Screen - + ハイブリッド画面 @@ -6485,7 +6516,7 @@ Debug Message: Bottom Left - + 左下 @@ -6606,7 +6637,7 @@ Debug Message: File: - ファイル + @@ -6698,7 +6729,7 @@ Debug Message: File: - ファイル + @@ -7106,32 +7137,32 @@ They may have left the room. - + Unsupported encrypted application - + Invalid region 無効な地域 - + Installed Titles インストールされたタイトル - + System Titles システムタイトル - + Add New Application Directory - + Favorites diff --git a/dist/languages/ko_KR.ts b/dist/languages/ko_KR.ts index c74d5e2f8..5515360a7 100644 --- a/dist/languages/ko_KR.ts +++ b/dist/languages/ko_KR.ts @@ -292,8 +292,8 @@ This would ban both their forum username and their IP address. - Emulation: - 에뮬레이션: + Emulation + 에뮬레이션 @@ -397,6 +397,7 @@ This would ban both their forum username and their IP address. + Camera 카메라 @@ -408,8 +409,8 @@ This would ban both their forum username and their IP address. - Camera to configure: - 설정할 카메라: + Camera to Configure + @@ -429,8 +430,8 @@ This would ban both their forum username and their IP address. - Camera mode: - 카메라모드: + Camera mode + @@ -450,8 +451,8 @@ This would ban both their forum username and their IP address. - Camera position: - 카메라 위치: + Camera position + @@ -476,8 +477,8 @@ This would ban both their forum username and their IP address. - Camera Image Source: - 카메라 이미지 소스: + Camera Image Source + @@ -496,8 +497,8 @@ This would ban both their forum username and their IP address. - File: - 파일: + File + @@ -510,11 +511,6 @@ This would ban both their forum username and their IP address. Select the system camera to use 사용할 시스템 카메라 선택하기 - - - Camera: - 카메라: - <Default> @@ -528,8 +524,8 @@ This would ban both their forum username and their IP address. - Flip: - 뒤집기: + Flip + @@ -1018,7 +1014,7 @@ Would you like to ignore the error and continue? Enable Linear Filtering - 리니어 필터링 활성화 + @@ -1082,7 +1078,7 @@ Would you like to ignore the error and continue? - Reverse Side by Side + Side by Side Full Width @@ -1141,49 +1137,54 @@ Would you like to ignore the error and continue? - + + Swap Eyes + + + + Utility 도구 - + <html><head/><body><p>Replace textures with PNG files.</p><p>Textures are loaded from load/textures/[Title ID]/.</p></body></html> <html><head/><body><p>텍스처를 PNG 파일로 교체합니다.</p><p>텍스처는 load/textures/[Title ID]/에서 로드됩니다.</p></body></html> - - Use Custom Textures - 사용자 정의 텍스처 사용 + + Use custom textures + - + <html><head/><body><p>Dump textures to PNG files.</p><p>Textures are dumped to dump/textures/[Title ID]/.</p></body></html> <html><head/><body><p>텍스처를 PNG 파일로 덤프합니다.</p><p>텍스처를 dump/textures/[Title ID]/에 덤프합니다.</p></body></html> - - Dump Textures - 텍스처 덤프 + + Dump textures + - + <html><head/><body><p>Load all custom textures into memory on boot, instead of loading them when the application requires them.</p></body></html> - - Preload Custom Textures - 사용자 지정 텍스처 미리 불러오기 + + Preload custom textures + - + <html><head/><body><p>Load custom textures asynchronously with background threads to reduce loading stutter</p></body></html> <html><head/><body><p>로딩 끊김을 줄이기 위해 배경 스레드와 비동기식으로 사용자 지정 텍스처를 로드합니다.</p></body></html> - - Async Custom Texture Loading - 비동기 커스텀 텍스처 로딩 + + Async custom texture loading + @@ -1240,13 +1241,13 @@ Would you like to ignore the error and continue? - Set emulation speed: - 에뮬레이션 속도 설정: + Set emulation speed + - Emulation Speed: - 에뮬레이션 속도: + Emulation Speed + @@ -1357,12 +1358,12 @@ Would you like to ignore the error and continue? - SPIR-V Shader Generation + SPIR-V shader generation - Disable GLSL -> SPIR-V Optimizer + Disable GLSL -> SPIR-V optimizer @@ -1382,8 +1383,8 @@ Would you like to ignore the error and continue? - Enable Hardware Shader - 하드웨어 셰이더 활성화 + Enable hardware shader + @@ -1392,8 +1393,8 @@ Would you like to ignore the error and continue? - Accurate Multiplication - 정확한 곱셈연산 + Accurate multiplication + @@ -1402,8 +1403,8 @@ Would you like to ignore the error and continue? - Enable Shader JIT - 셰이더 JIT 활성화 + Enable shader JIT + @@ -1412,7 +1413,7 @@ Would you like to ignore the error and continue? - Enable Async Shader Compilation + Enable async shader compilation @@ -1422,7 +1423,7 @@ Would you like to ignore the error and continue? - Enable Async Presentation + Enable async presentation @@ -1462,8 +1463,8 @@ Would you like to ignore the error and continue? - Use Disk Shader Cache - 디스크 셰이더 캐시 사용 + Use disk shader cache + @@ -1487,7 +1488,7 @@ Would you like to ignore the error and continue? - Delay application render thread: + Delay Application Render Thread @@ -1976,12 +1977,12 @@ Would you like to ignore the error and continue? - Swap Screens - 화면 바꾸기 + Swap screens + - Rotate Screens Upright + Rotate screens upright @@ -2098,7 +2099,7 @@ Would you like to ignore the error and continue? - <html><head/><body><p>Bottom Screen Opacity % (OpenGL Only)</p></body></html> + <html><head/><body><p>Bottom Screen Opacity %</p></body></html> @@ -2446,8 +2447,8 @@ Would you like to ignore the error and continue? - Use Virtual SD - Virtual SD 사용 + Use virtual SD card + @@ -2456,8 +2457,8 @@ Would you like to ignore the error and continue? - Use Custom Storage - 사용자 정의 저장공간 사용 + Use custom storage location + @@ -2543,8 +2544,8 @@ online features (if installed) - Region: - + Region + 지역 @@ -2552,326 +2553,337 @@ online features (if installed) - + + Apply region free patch to +installed applications. + + + + + Patches the region of installed applications to be region free, so that they always appear on the home menu. + + + + Username 사용자 이름 - + Birthday 생일 - + January 1월 - + February 2월 - + March 3월 - + April 4월 - + May 5월 - + June 6월 - + July 7월 - + August 8월 - + September 9월 - + October 10월 - + November 11월 - + December 12월 - + Language 언어 - + Note: this can be overridden when region setting is auto-select Note: 이 설정은 언어설정이 자동일경우 무시될수 있습니다 - + Japanese (日本語) 일본어 (日本語) - + English 영어 (English) - + French (français) 프랑스어 (français) - + German (Deutsch) 독일어 (Deutsch) - + Italian (italiano) 이탈리아어 (italiano) - + Spanish (español) 스페인어 (español) - + Simplified Chinese (简体中文) 간체 (简体中文) - + Korean (한국어) 한국어 - + Dutch (Nederlands) 네덜란드어 (Nederlands) - + Portuguese (português) 포르투갈어 (português) - + Russian (Русский) 러시아어 (Русский) - + Traditional Chinese (正體中文) 번체 (正體中文) - + Sound output mode 사운드 출력모드 - + Mono 모노 - + Stereo 스테레오 - + Surround 서라운드 - + Country 국가 - + Clock 시계 - + System Clock 시스템 시계 - + Fixed Time 수정된 시간 - + Startup time 시작 시간 - + yyyy-MM-ddTHH:mm:ss yyyy-MM-ddTHH:mm:ss - + Offset time 오프셋 시간 - + days - + HH:mm:ss HH:mm:ss - + Initial System Ticks - + Random - + Fixed - + Initial System Ticks Override - + Play Coins - + <html><head/><body><p>Number of steps per hour reported by the pedometer. Range from 0 to 65,535.</p></body></html> - + Pedometer Steps per Hour - + Run System Setup when Home Menu is launched 홈 메뉴가 실행되면 시스템 설정 실행 - + Console ID: 콘솔 ID: - - + + Regenerate 재생성 - + MAC: - - 3GX Plugin Loader: - 3GX 플러그인 로더: + + 3GX Plugin Loader + - + Enable 3GX plugin loader 3GX 플러그인 로더 활성화 - + Allow applications to change plugin loader state - + Real Console Unique Data - + Your real console is linked to Azahar. - + Unlink - + OTP - - - - + + + + Choose - + SecureInfo_A/B - + LocalFriendCodeSeed_A/B - + movable.sed - + System settings are available only when applications is not running. @@ -3581,76 +3593,76 @@ online features (if installed) - - + + Console ID: 0x%1 콘솔 ID: 0x%1 - - + + MAC: %1 - + This will replace your current virtual 3DS console ID with a new one. Your current virtual 3DS console ID will not be recoverable. This might have unexpected effects in applications. This might fail if you use an outdated config save. Continue? - - - + + + Warning 경고 - + This will replace your current MAC address with a new one. It is not recommended to do this if you got the MAC address from your real console using the setup tool. Continue? - + This action will unlink your real console from Azahar, with the following consequences:<br><ul><li>Your OTP, SecureInfo and LocalFriendCodeSeed will be removed from Azahar.</li><li>Your friend list will reset and you will be logged out of your NNID/PNID account.</li><li>System files and eshop titles obtained through Azahar will become inaccessible until the same console is linked again (save data will not be lost).</li></ul><br>Continue? - + Invalid country for configured region - + Invalid country for console unique data - + Status: Loaded - + Status: Loaded (Invalid Signature) - + Status: Loaded (Region Changed) - + Status: Not Found - + Status: Invalid - + Status: IO Error @@ -3766,13 +3778,13 @@ Drag points to change position, or double-click table cells to edit values. - Interface language: - 인터페이스 언어: + Interface Language + - Theme: - 테마: + Theme + @@ -3781,8 +3793,8 @@ Drag points to change position, or double-click table cells to edit values. - Icon Size: - 아이콘 사이즈: + Icon Size + @@ -3802,8 +3814,8 @@ Drag points to change position, or double-click table cells to edit values. - Row 1 Text: - 첫째행 텍스트: + Row 1 Text + @@ -3837,18 +3849,18 @@ Drag points to change position, or double-click table cells to edit values. - Row 2 Text: - 둘째행 텍스트: + Row 2 Text + - Hide Titles without Icon - 아이콘이 없는 제목 숨기기 + Hide titles without icon + - Single Line Mode - 한 줄 모드 + Single line mode + @@ -3857,7 +3869,7 @@ Drag points to change position, or double-click table cells to edit values. - Show Advanced Frame Time Info + Show advanced frame time info @@ -3940,12 +3952,12 @@ Drag points to change position, or double-click table cells to edit values. DirectConnectWindow - + Connecting 연결하는 중 - + Connect 연결하기 @@ -4065,582 +4077,596 @@ Please check your FFmpeg installation used for compilation. GMainWindow - + No Suitable Vulkan Devices Detected - + Vulkan initialization failed during boot.<br/>Your GPU may not support Vulkan 1.1, or you do not have the latest graphics driver. - + Current Artic traffic speed. Higher values indicate bigger transfer loads. - - + + Current emulation speed. Values higher or lower than 100% indicate emulation is running faster or slower than a 3DS. 현재 에뮬레이션 속도. 100%보다 높거나 낮은 값은 에뮬레이션이 3DS보다 빠르거나 느린 것을 나타냅니다. - - + + How many frames per second the app is currently displaying. This will vary from app to app and scene to scene. - - + + Time taken to emulate a 3DS frame, not counting framelimiting or v-sync. For full-speed emulation this should be at most 16.67 ms. 3DS 프레임을 에뮬레이션 하는 데 걸린 시간, 프레임제한 또는 v-동기화를 카운트하지 않음. 최대 속도 에뮬레이션의 경우, 이는 최대 16.67 ms여야 합니다. - + MicroProfile (unavailable) - + Clear Recent Files 최근 파일 삭제 - + &Continue 계속(&C) - + &Pause 일시중지(&P) - + Azahar is running an application TRANSLATORS: This string is shown to the user to explain why Citra needs to prevent the computer from sleeping - - + + Invalid App Format - - + + Your app format is not supported.<br/>Please follow the guides to redump your <a href='https://web.archive.org/web/20240304210021/https://citra-emu.org/wiki/dumping-game-cartridges/'>game cartridges</a> or <a href='https://web.archive.org/web/20240304210011/https://citra-emu.org/wiki/dumping-installed-titles/'>installed titles</a>. - + App Corrupted - + Your app is corrupted. <br/>Please follow the guides to redump your <a href='https://web.archive.org/web/20240304210021/https://citra-emu.org/wiki/dumping-game-cartridges/'>game cartridges</a> or <a href='https://web.archive.org/web/20240304210011/https://citra-emu.org/wiki/dumping-installed-titles/'>installed titles</a>. - + App Encrypted - + Your app is encrypted. <br/><a href='https://azahar-emu.org/blog/game-loading-changes/'>Please check our blog for more info.</a> - + Unsupported App - + GBA Virtual Console is not supported by Azahar. - - + + Artic Server - + + Invalid system mode + + + + + New 3DS exclusive applications cannot be loaded without enabling the New 3DS mode. + + + + Error while loading App! - + An unknown error occurred. Please see the log for more details. 알 수 없는 오류가 발생했습니다. 자세한 내용은 로그를 참조하십시오. - + CIA must be installed before usage CIA를 사용하기 전에 설치되어야 합니다 - + Before using this CIA, you must install it. Do you want to install it now? 이 CIA를 사용하기 전에 설치해야합니다. 지금 설치 하시겠습니까? - + Quick Load - + Quick Save - - + + Slot %1 슬롯 %1 - + %2 %3 - + Quick Save - %1 - + Quick Load - %1 - + Slot %1 - %2 %3 슬롯 %1 - %2 %3 - + Error Opening %1 Folder %1 폴더 열기 오류 - - + + Folder does not exist! 폴더가 존재하지 않습니다! - + Remove Play Time Data - + Reset play time? - - - - + + + + Create Shortcut - + Do you want to launch the application in fullscreen? - + Successfully created a shortcut to %1 - + This will create a shortcut to the current AppImage. This may not work well if you update. Continue? - + Failed to create a shortcut to %1 - + Create Icon - + Cannot create icon file. Path "%1" does not exist and cannot be created. - + Dumping... 덤프중... - - + + Cancel 취소 - - - - - - - - - + + + + + + + + + Azahar - + Could not dump base RomFS. Refer to the log for details. 베이스 RomFS를 덤프 할 수 없습니다. 자세한 내용은 로그를 참조하십시오. - + Error Opening %1 %1 열기 오류 - + Select Directory 디렉터리 선택하기 - + Properties 속성 - + The application properties could not be loaded. - + 3DS Executable (%1);;All Files (*.*) %1 is an identifier for the 3DS executable file extensions. 3DS 실행파일 (%1);;모든파일 (*.*) - + Load File 파일 불러오기 - - + + Set Up System Files - + <p>Azahar needs console unique data and firmware files from a real console to be able to use some of its features.<br>Such files and data can be set up with the <a href=https://github.com/azahar-emu/ArticSetupTool>Azahar Artic Setup Tool</a><br>Notes:<ul><li><b>This operation will install console unique data to Azahar, do not share your user or nand folders<br>after performing the setup process!</b></li><li>While doing the setup process, Azahar will link to the console running the setup tool. You can unlink the<br>console later from the System tab in the emulator configuration menu.</li><li>Do not go online with both Azahar and your 3DS console at the same time after setting up system files,<br>as it could cause issues.</li><li>Old 3DS setup is needed for the New 3DS setup to work (doing both setup modes is recommended).</li><li>Both setup modes will work regardless of the model of the console running the setup tool.</li></ul><hr></p> - + Enter Azahar Artic Setup Tool address: - + <br>Choose setup mode: - + (ℹ️) Old 3DS setup - - + + Setup is possible. - + (⚠) New 3DS setup - + Old 3DS setup is required first. - + (✅) Old 3DS setup - - + + Setup completed. - + (ℹ️) New 3DS setup - + (✅) New 3DS setup - + The system files for the selected mode are already set up. Reinstall the files anyway? - + Load Files 파일 불러오기 - + 3DS Installation File (*.cia *.zcia) - - - + + + All Files (*.*) 모든파일 (*.*) - + Connect to Artic Base - + Enter Artic Base server address: - + %1 has been installed successfully. %1가 성공적으로 설치되었습니다. - + Unable to open File 파일을 열 수 없음 - + Could not open %1 %1을(를) 열 수 없음 - + Installation aborted 설치 중단됨 - + The installation of %1 was aborted. Please see the log for more details %1의 설치가 중단되었습니다. 자세한 내용은 로그를 참조하십시오. - + Invalid File 올바르지 않은 파일 - + %1 is not a valid CIA %1은 올바른 CIA가 아닙니다 - + CIA Encrypted - + Your CIA file is encrypted.<br/><a href='https://azahar-emu.org/blog/game-loading-changes/'>Please check our blog for more info.</a> - + Unable to find File 파일을 찾을 수 없음 - + Could not find %1 1을(를) 찾을 수 없습니다 - - - - Error compressing file + + + + + Z3DS Compression - - File compress operation failed, check log for details. + + Failed to compress some files, check log for details. - - - - Error decompressing file + + Failed to decompress some files, check log for details. - - File decompress operation failed, check log for details. + + All files have been compressed successfully. - + + All files have been decompressed successfully. + + + + Uninstalling '%1'... - + Failed to uninstall '%1'. - + Successfully uninstalled '%1'. - + File not found 파일을 찾을 수 없음 - + File "%1" not found "%1" 파일을 찾을 수 없음 - + Savestates 상태저장(Savestates) - + Warning: Savestates are NOT a replacement for in-application saves, and are not meant to be reliable. Use at your own risk! - - - + + + Error opening amiibo data file Amiibo 데이터 파일 열기 오류 - + A tag is already in use. 태그가 이미 사용중입니다. - + Application is not looking for amiibos. - + Amiibo File (%1);; All Files (*.*) Amiibo 파일 (%1);; 모든파일 (*.*) - + Load Amiibo Amiibo 불러오기 - + Unable to open amiibo file "%1" for reading. Amiibo 파일 "%1"을 읽을 수 없습니다. - + Record Movie 무비 녹화 - + Movie recording cancelled. 무비 레코딩이 취소되었습니다. - - + + Movie Saved 무비 저장됨 - - + + The movie is successfully saved. 무비가 성공적으로 저장되었습니다 - + Application will unpause - + The application will be unpaused, and the next frame will be captured. Is this okay? - + Invalid Screenshot Directory 올바르지 않은 스크린숏 디렉터리 - + Cannot create specified screenshot directory. Screenshot path is set back to its default value. 지정된 스크린숏 디렉터리를 생성할 수 없습니다. 스크린숏 경로가 기본값으로 다시 설정됩니다. - + Could not load video dumper 비디오 덤퍼를 불러올 수 없습니다 - + FFmpeg could not be loaded. Make sure you have a compatible version installed. To install FFmpeg to Azahar, press Open and select your FFmpeg directory. @@ -4649,274 +4675,264 @@ To view a guide on how to install FFmpeg, press Help. - - Load 3DS ROM File + + Load 3DS ROM Files - - 3DS ROM Files (*.cia *cci *3dsx *cxi) + + 3DS ROM Files (*.cia *.cci *.3dsx *.cxi) - - The selected file is not a compatible 3DS ROM format. Make sure you have chosen the right file, and that it is not encrypted. - - - - - The selected file is already compressed. - - - - + 3DS Compressed ROM File (*.%1) - + Save 3DS Compressed ROM File - - Load 3DS Compressed ROM File + + Select Output 3DS Compressed ROM Folder - + + Load 3DS Compressed ROM Files + + + + 3DS Compressed ROM Files (*.zcia *zcci *z3dsx *zcxi) - - The selected file is not a compatible compressed 3DS ROM format. Make sure you have chosen the right file. - - - - - The selected file is already decompressed. - - - - + 3DS ROM File (*.%1) - + Save 3DS ROM File - + + Select Output 3DS ROM Folder + + + + Select FFmpeg Directory FFmpeg 디렉토리 선택 - + The provided FFmpeg directory is missing %1. Please make sure the correct directory was selected. 제공된 FFmpeg 디렉토리에 %1이 없습니다. 올바른 디렉토리가 선택되었는지 확인하십시오. - + FFmpeg has been sucessfully installed. FFmpeg가 성공적으로 설치되었습니다. - + Installation of FFmpeg failed. Check the log file for details. FFmpeg 설치에 실패했습니다. 자세한 내용은 로그 파일을 확인하십시오. - + Could not start video dumping.<br>Please ensure that the video encoder is configured correctly.<br>Refer to the log for details. - + Recording %1 %1 녹화 중 - + Playing %1 / %2 %1 / %2 재생 중 - + Movie Finished 무비 완료됨 - + (Accessing SharedExtData) - + (Accessing SystemSaveData) - + (Accessing BossExtData) - + (Accessing ExtData) - + (Accessing SaveData) - + MB/s - + KB/s - + Artic Traffic: %1 %2%3 - + Speed: %1% 속도: %1% - + Speed: %1% / %2% 속도: %1% / %2% - + App: %1 FPS - + Frame: %1 ms (GPU: [CMD: %2 ms, SWP: %3 ms], IPC: %4 ms, SVC: %5 ms, Rem: %6 ms) - + Frame: %1 ms 프레임: %1 ms - + VOLUME: MUTE - + VOLUME: %1% Volume percentage (e.g. 50%) - + %1 is missing. Please <a href='https://web.archive.org/web/20240304201103/https://citra-emu.org/wiki/dumping-system-archives-and-the-shared-fonts-from-a-3ds-console/'>dump your system archives</a>.<br/>Continuing emulation may result in crashes and bugs. - + A system archive 시스템 아카이브 - + System Archive Not Found 시스템 아카이브를 찾을수 없습니다 - + System Archive Missing 시스템 아카이브가 없습니다 - + Save/load Error 저장하기/불러오기 오류 - + Fatal Error 치명적인 오류 - + A fatal error occurred. <a href='https://web.archive.org/web/20240228001712/https://community.citra-emu.org/t/how-to-upload-the-log-file/296'>Check the log</a> for details.<br/>Continuing emulation may result in crashes and bugs. - + Fatal Error encountered 치명적인 오류가 발생했습니다 - + Continue 계속 - + Quit Application - + OK 확인 - + Would you like to exit now? 지금 종료하시겠습니까? - + The application is still running. Would you like to stop emulation? - + Playback Completed 재생 완료 - + Movie playback completed. 무비 재생 완료 - + Update Available - + Update %1 for Azahar is available. Would you like to download it? - + Primary Window 첫번째 윈도우 - + Secondary Window 두번째 윈도우 @@ -5022,239 +5038,254 @@ Would you like to download it? GameList - + IMPORTANT: Encrypted files and .3ds files are no longer supported. Decrypting and/or renaming to .cci may be necessary. <a href='https://azahar-emu.org/blog/game-loading-changes/'>Learn more.</a> - + Don't show again - - + + Compatibility 호환성 - - + + Region 지역 - - + + File type 파일 타입 - - + + Size 크기 - - + + Play time - + Favorite - + + Eject Cartridge + + + + + Insert Cartridge + + + + Open 열기 - + Application Location - + Save Data Location - + Extra Data Location - + Update Data Location - + DLC Data Location - + Texture Dump Location - + Custom Texture Location - + Mods Location - + Dump RomFS RomFS 덤프 - + Disk Shader Cache 디스크 셰이더 캐시 - + Open Shader Cache Location 셰이더 캐시 위치 열기 - + Delete OpenGL Shader Cache OpenGL 셰이더 캐시 삭제하기 - + Uninstall - + Everything - + Application - + Update - + DLC - + Remove Play Time Data - + Create Shortcut - + Add to Desktop - + Add to Applications Menu - + + Stress Test: App Launch + + + + Properties 속성 - - - - + + + + Azahar - + Are you sure you want to completely uninstall '%1'? This will delete the application if installed, as well as any installed updates or DLC. - - + + %1 (Update) - - + + %1 (DLC) - + Are you sure you want to uninstall '%1'? - + Are you sure you want to uninstall the update for '%1'? - + Are you sure you want to uninstall all DLC for '%1'? - + Scan Subfolders 서브 디렉토리 스캔 - + Remove Application Directory - + Move Up 위로 - + Move Down 아래로 - + Open Directory Location 디렉터리 위치 열기 - + Clear 지우기 - + Name 이름 @@ -5262,77 +5293,77 @@ This will delete the application if installed, as well as any installed updates GameListItemCompat - + Perfect 완벽함 - + App functions flawless with no audio or graphical glitches, all tested functionality works as intended without any workarounds needed. - + Great 좋음 - + App functions with minor graphical or audio glitches and is playable from start to finish. May require some workarounds. - + Okay 양호 - + App functions with major graphical or audio glitches, but app is playable from start to finish with workarounds. - + Bad 나쁨 - + App functions, but with major graphical or audio glitches. Unable to progress in specific areas due to glitches even with workarounds. - + Intro/Menu 인트로/메뉴 - + App is completely unplayable due to major graphical or audio glitches. Unable to progress past the Start Screen. - + Won't Boot 실행불가 - + The app crashes when attempting to startup. - + Not Tested 테스트되지 않음 - + The app has not yet been tested. @@ -5340,7 +5371,7 @@ Screen. GameListPlaceholder - + Double-click to add a new folder to the application list @@ -5348,27 +5379,27 @@ Screen. GameListSearchField - + of 중의 - + result 결과 - + results 결과 - + Filter: 필터: - + Enter pattern to filter 검색 필터 입력 @@ -5696,86 +5727,86 @@ Screen. 사이클 인덱스: - + SRC1: %1, %2, %3, %4 SRC1: %1, %2, %3, %4 - + SRC2: %1, %2, %3, %4 SRC2: %1, %2, %3, %4 - + SRC3: %1, %2, %3, %4 SRC3: %1, %2, %3, %4 - + DEST_IN: %1, %2, %3, %4 DEST_IN: %1, %2, %3, %4 - + DEST_OUT: %1, %2, %3, %4 DEST_OUT: %1, %2, %3, %4 - + Address Registers: %1, %2 주소 레지스터: %1, %2 - + Compare Result: %1, %2 비교 결과: %1, %2 - + Static Condition: %1 정적 조건: %1 - + Dynamic Conditions: %1, %2 동적 조건: %1, %2 - + Loop Parameters: %1 (repeats), %2 (initializer), %3 (increment), %4 루프 매개변수: %1(반복), %2(이니셜라이저), %3(증분), %4 - + Instruction offset: 0x%1 인스트럭션 오프셋: 0x%1 - + -> 0x%2 -> 0x%2 - + (last instruction) (마지막 명령어) @@ -6075,32 +6106,32 @@ Debug Message: 비밀번호: - + Room Name 방 이름 - + Preferred Application - + Host 호스트 - + Players 플레이어 - + Refreshing 새로고침중 - + Refresh List 목록 새로고침 @@ -7099,32 +7130,32 @@ They may have left the room. %1 (0x%2) - + Unsupported encrypted application - + Invalid region 올바르지 않은 지역 - + Installed Titles 설치된 제목 - + System Titles 시스템 제목 - + Add New Application Directory - + Favorites diff --git a/dist/languages/lt_LT.ts b/dist/languages/lt_LT.ts index da7872ccc..9e5e6a55b 100644 --- a/dist/languages/lt_LT.ts +++ b/dist/languages/lt_LT.ts @@ -290,8 +290,8 @@ This would ban both their forum username and their IP address. - Emulation: - Emuliacija: + Emulation + Emuliacija @@ -395,6 +395,7 @@ This would ban both their forum username and their IP address. + Camera Kamera @@ -406,8 +407,8 @@ This would ban both their forum username and their IP address. - Camera to configure: - Kamera, kurią konfigūruosite: + Camera to Configure + @@ -427,8 +428,8 @@ This would ban both their forum username and their IP address. - Camera mode: - Kameros režimas: + Camera mode + @@ -448,8 +449,8 @@ This would ban both their forum username and their IP address. - Camera position: - Kameros pozicija: + Camera position + @@ -474,8 +475,8 @@ This would ban both their forum username and their IP address. - Camera Image Source: - Kameros įvestis: + Camera Image Source + @@ -494,8 +495,8 @@ This would ban both their forum username and their IP address. - File: - Failas: + File + @@ -508,11 +509,6 @@ This would ban both their forum username and their IP address. Select the system camera to use Pasirinkite, kurią sistemos kamerą naudoti - - - Camera: - Kamera: - <Default> @@ -526,8 +522,8 @@ This would ban both their forum username and their IP address. - Flip: - Apvertimas: + Flip + @@ -1079,7 +1075,7 @@ Would you like to ignore the error and continue? - Reverse Side by Side + Side by Side Full Width @@ -1138,48 +1134,53 @@ Would you like to ignore the error and continue? - + + Swap Eyes + + + + Utility - + <html><head/><body><p>Replace textures with PNG files.</p><p>Textures are loaded from load/textures/[Title ID]/.</p></body></html> - - Use Custom Textures + + Use custom textures - + <html><head/><body><p>Dump textures to PNG files.</p><p>Textures are dumped to dump/textures/[Title ID]/.</p></body></html> - - Dump Textures + + Dump textures - + <html><head/><body><p>Load all custom textures into memory on boot, instead of loading them when the application requires them.</p></body></html> - - Preload Custom Textures + + Preload custom textures - + <html><head/><body><p>Load custom textures asynchronously with background threads to reduce loading stutter</p></body></html> - - Async Custom Texture Loading + + Async custom texture loading @@ -1237,12 +1238,12 @@ Would you like to ignore the error and continue? - Set emulation speed: + Set emulation speed - Emulation Speed: + Emulation Speed @@ -1354,12 +1355,12 @@ Would you like to ignore the error and continue? - SPIR-V Shader Generation + SPIR-V shader generation - Disable GLSL -> SPIR-V Optimizer + Disable GLSL -> SPIR-V optimizer @@ -1379,8 +1380,8 @@ Would you like to ignore the error and continue? - Enable Hardware Shader - Įjungti techninės įrangos šešėliuoklę + Enable hardware shader + @@ -1389,8 +1390,8 @@ Would you like to ignore the error and continue? - Accurate Multiplication - Tiksli multiplikacija + Accurate multiplication + @@ -1399,8 +1400,8 @@ Would you like to ignore the error and continue? - Enable Shader JIT - Įjungti šešėliuoklės JIT + Enable shader JIT + @@ -1409,7 +1410,7 @@ Would you like to ignore the error and continue? - Enable Async Shader Compilation + Enable async shader compilation @@ -1419,7 +1420,7 @@ Would you like to ignore the error and continue? - Enable Async Presentation + Enable async presentation @@ -1459,7 +1460,7 @@ Would you like to ignore the error and continue? - Use Disk Shader Cache + Use disk shader cache @@ -1484,7 +1485,7 @@ Would you like to ignore the error and continue? - Delay application render thread: + Delay Application Render Thread @@ -1973,12 +1974,12 @@ Would you like to ignore the error and continue? - Swap Screens - Apkeisti ekranus + Swap screens + - Rotate Screens Upright + Rotate screens upright @@ -2095,7 +2096,7 @@ Would you like to ignore the error and continue? - <html><head/><body><p>Bottom Screen Opacity % (OpenGL Only)</p></body></html> + <html><head/><body><p>Bottom Screen Opacity %</p></body></html> @@ -2443,7 +2444,7 @@ Would you like to ignore the error and continue? - Use Virtual SD + Use virtual SD card @@ -2453,7 +2454,7 @@ Would you like to ignore the error and continue? - Use Custom Storage + Use custom storage location @@ -2540,8 +2541,8 @@ online features (if installed) - Region: - + Region + Regionas @@ -2549,326 +2550,337 @@ online features (if installed) - + + Apply region free patch to +installed applications. + + + + + Patches the region of installed applications to be region free, so that they always appear on the home menu. + + + + Username Vartotojo vardas - + Birthday Gimtadienis - + January Sausio - + February Vasario - + March Kovo - + April Balandžio - + May Gegužės - + June Birželio - + July Liepos - + August Rugpjūčio - + September Rugsėjo - + October Spalio - + November Lapkričio - + December Gruodžio - + Language Kalba - + Note: this can be overridden when region setting is auto-select Pastaba: šis nustatymas bus ignoruojamas jeigu regionas nustatytas į "Automatiškai pasirinkti" - + Japanese (日本語) Japonų (日本語) - + English Anglų (English) - + French (français) Prancūzų (français) - + German (Deutsch) Vokiečių (Deutsch) - + Italian (italiano) Italų (italiano) - + Spanish (español) Ispanų (español) - + Simplified Chinese (简体中文) Supaprastinta kinų (简体中文) - + Korean (한국어) Korėjiečių (한국어) - + Dutch (Nederlands) Olandų (Nederlands) - + Portuguese (português) Portugalų (português) - + Russian (Русский) Rusų (Русский) - + Traditional Chinese (正體中文) Tradicinė kinų (正體中文) - + Sound output mode Garso išvesties režimas - + Mono Mono - + Stereo Stereo - + Surround Erdvinis - + Country Šalis - + Clock Laikrodis - + System Clock Sistemos laikrodis - + Fixed Time Nustatytas laikas - + Startup time Užkrovimo laikas - + yyyy-MM-ddTHH:mm:ss metai-MĖNESIAI-dienaTVALANDA:minutė:sekundė - + Offset time - + days - + HH:mm:ss - + Initial System Ticks - + Random - + Fixed - + Initial System Ticks Override - + Play Coins - + <html><head/><body><p>Number of steps per hour reported by the pedometer. Range from 0 to 65,535.</p></body></html> - + Pedometer Steps per Hour - + Run System Setup when Home Menu is launched - + Console ID: Konsolės ID: - - + + Regenerate Regeneruoti - + MAC: - - 3GX Plugin Loader: + + 3GX Plugin Loader - + Enable 3GX plugin loader - + Allow applications to change plugin loader state - + Real Console Unique Data - + Your real console is linked to Azahar. - + Unlink - + OTP - - - - + + + + Choose - + SecureInfo_A/B - + LocalFriendCodeSeed_A/B - + movable.sed - + System settings are available only when applications is not running. @@ -3578,76 +3590,76 @@ online features (if installed) - - + + Console ID: 0x%1 Konsolės ID: 0x%1 - - + + MAC: %1 - + This will replace your current virtual 3DS console ID with a new one. Your current virtual 3DS console ID will not be recoverable. This might have unexpected effects in applications. This might fail if you use an outdated config save. Continue? - - - + + + Warning Įspėjimas - + This will replace your current MAC address with a new one. It is not recommended to do this if you got the MAC address from your real console using the setup tool. Continue? - + This action will unlink your real console from Azahar, with the following consequences:<br><ul><li>Your OTP, SecureInfo and LocalFriendCodeSeed will be removed from Azahar.</li><li>Your friend list will reset and you will be logged out of your NNID/PNID account.</li><li>System files and eshop titles obtained through Azahar will become inaccessible until the same console is linked again (save data will not be lost).</li></ul><br>Continue? - + Invalid country for configured region - + Invalid country for console unique data - + Status: Loaded - + Status: Loaded (Invalid Signature) - + Status: Loaded (Region Changed) - + Status: Not Found - + Status: Invalid - + Status: IO Error @@ -3762,13 +3774,13 @@ Drag points to change position, or double-click table cells to edit values. - Interface language: - Sąsajos kalba: + Interface Language + - Theme: - Tema: + Theme + @@ -3777,8 +3789,8 @@ Drag points to change position, or double-click table cells to edit values. - Icon Size: - Žaidimo paveikslėlio dydis: + Icon Size + @@ -3798,8 +3810,8 @@ Drag points to change position, or double-click table cells to edit values. - Row 1 Text: - 1 eilutės tekstas: + Row 1 Text + @@ -3833,17 +3845,17 @@ Drag points to change position, or double-click table cells to edit values. - Row 2 Text: - 2 eilutės tekstas: + Row 2 Text + - Hide Titles without Icon - Paslėpti programas be paveikslėlio + Hide titles without icon + - Single Line Mode + Single line mode @@ -3853,7 +3865,7 @@ Drag points to change position, or double-click table cells to edit values. - Show Advanced Frame Time Info + Show advanced frame time info @@ -3936,12 +3948,12 @@ Drag points to change position, or double-click table cells to edit values. DirectConnectWindow - + Connecting Jungiamasi - + Connect Prisijungti @@ -4060,581 +4072,595 @@ Please check your FFmpeg installation used for compilation. GMainWindow - + No Suitable Vulkan Devices Detected - + Vulkan initialization failed during boot.<br/>Your GPU may not support Vulkan 1.1, or you do not have the latest graphics driver. - + Current Artic traffic speed. Higher values indicate bigger transfer loads. - - + + Current emulation speed. Values higher or lower than 100% indicate emulation is running faster or slower than a 3DS. Dabartinės emuliacijos greitis. Reikšmės žemiau ar aukščiau 100% parodo, kad emuliacija veikia greičiau ar lėčiau negu 3DS. - - + + How many frames per second the app is currently displaying. This will vary from app to app and scene to scene. - - + + Time taken to emulate a 3DS frame, not counting framelimiting or v-sync. For full-speed emulation this should be at most 16.67 ms. Laikas, kuris buvo sunaudotas atvaizduoti 1 3DS kadrą, neskaičiuojant FPS ribojimo ar V-Sync. Pilno greičio emuliacijai reikalinga daugiausia 16.67 ms reikšmė. - + MicroProfile (unavailable) - + Clear Recent Files Pravalyti neseniai įkrautus failus - + &Continue - + &Pause - + Azahar is running an application TRANSLATORS: This string is shown to the user to explain why Citra needs to prevent the computer from sleeping - - + + Invalid App Format - - + + Your app format is not supported.<br/>Please follow the guides to redump your <a href='https://web.archive.org/web/20240304210021/https://citra-emu.org/wiki/dumping-game-cartridges/'>game cartridges</a> or <a href='https://web.archive.org/web/20240304210011/https://citra-emu.org/wiki/dumping-installed-titles/'>installed titles</a>. - + App Corrupted - + Your app is corrupted. <br/>Please follow the guides to redump your <a href='https://web.archive.org/web/20240304210021/https://citra-emu.org/wiki/dumping-game-cartridges/'>game cartridges</a> or <a href='https://web.archive.org/web/20240304210011/https://citra-emu.org/wiki/dumping-installed-titles/'>installed titles</a>. - + App Encrypted - + Your app is encrypted. <br/><a href='https://azahar-emu.org/blog/game-loading-changes/'>Please check our blog for more info.</a> - + Unsupported App - + GBA Virtual Console is not supported by Azahar. - - + + Artic Server - + + Invalid system mode + + + + + New 3DS exclusive applications cannot be loaded without enabling the New 3DS mode. + + + + Error while loading App! - + An unknown error occurred. Please see the log for more details. - + CIA must be installed before usage - + Before using this CIA, you must install it. Do you want to install it now? - + Quick Load - + Quick Save - - + + Slot %1 - + %2 %3 - + Quick Save - %1 - + Quick Load - %1 - + Slot %1 - %2 %3 - + Error Opening %1 Folder Klaida atidarant %1 aplanką - - + + Folder does not exist! Aplankas neegzistuoja! - + Remove Play Time Data - + Reset play time? - - - - + + + + Create Shortcut - + Do you want to launch the application in fullscreen? - + Successfully created a shortcut to %1 - + This will create a shortcut to the current AppImage. This may not work well if you update. Continue? - + Failed to create a shortcut to %1 - + Create Icon - + Cannot create icon file. Path "%1" does not exist and cannot be created. - + Dumping... - - + + Cancel Atšaukti - - - - - - - - - + + + + + + + + + Azahar - + Could not dump base RomFS. Refer to the log for details. - + Error Opening %1 Klaida atidarant %1 - + Select Directory Pasirinkti katalogą - + Properties - + The application properties could not be loaded. - + 3DS Executable (%1);;All Files (*.*) %1 is an identifier for the 3DS executable file extensions. 3DS programa (%1);;Visi failai (*.*) - + Load File Įkrauti failą - - + + Set Up System Files - + <p>Azahar needs console unique data and firmware files from a real console to be able to use some of its features.<br>Such files and data can be set up with the <a href=https://github.com/azahar-emu/ArticSetupTool>Azahar Artic Setup Tool</a><br>Notes:<ul><li><b>This operation will install console unique data to Azahar, do not share your user or nand folders<br>after performing the setup process!</b></li><li>While doing the setup process, Azahar will link to the console running the setup tool. You can unlink the<br>console later from the System tab in the emulator configuration menu.</li><li>Do not go online with both Azahar and your 3DS console at the same time after setting up system files,<br>as it could cause issues.</li><li>Old 3DS setup is needed for the New 3DS setup to work (doing both setup modes is recommended).</li><li>Both setup modes will work regardless of the model of the console running the setup tool.</li></ul><hr></p> - + Enter Azahar Artic Setup Tool address: - + <br>Choose setup mode: - + (ℹ️) Old 3DS setup - - + + Setup is possible. - + (⚠) New 3DS setup - + Old 3DS setup is required first. - + (✅) Old 3DS setup - - + + Setup completed. - + (ℹ️) New 3DS setup - + (✅) New 3DS setup - + The system files for the selected mode are already set up. Reinstall the files anyway? - + Load Files Įkrauti failus - + 3DS Installation File (*.cia *.zcia) - - - + + + All Files (*.*) Visi failai (*.*) - + Connect to Artic Base - + Enter Artic Base server address: - + %1 has been installed successfully. %1 buvo įdiegtas sėkmingai. - + Unable to open File Negalima atverti failo - + Could not open %1 Nepavyko atverti %1 - + Installation aborted Instaliacija nutraukta - + The installation of %1 was aborted. Please see the log for more details Failo %1 instaliacija buvo nutraukta. Pasižiūrėkite į žurnalą dėl daugiau informacijos - + Invalid File Klaidingas failas - + %1 is not a valid CIA %1 nėra tinkamas CIA - + CIA Encrypted - + Your CIA file is encrypted.<br/><a href='https://azahar-emu.org/blog/game-loading-changes/'>Please check our blog for more info.</a> - + Unable to find File - + Could not find %1 - - - - Error compressing file + + + + + Z3DS Compression - - File compress operation failed, check log for details. + + Failed to compress some files, check log for details. - - - - Error decompressing file + + Failed to decompress some files, check log for details. - - File decompress operation failed, check log for details. + + All files have been compressed successfully. - + + All files have been decompressed successfully. + + + + Uninstalling '%1'... - + Failed to uninstall '%1'. - + Successfully uninstalled '%1'. - + File not found Failas nerastas - + File "%1" not found Failas "%1" nerastas - + Savestates - + Warning: Savestates are NOT a replacement for in-application saves, and are not meant to be reliable. Use at your own risk! - - - + + + Error opening amiibo data file - + A tag is already in use. - + Application is not looking for amiibos. - + Amiibo File (%1);; All Files (*.*) „Amiibo“ failas (%1);; Visi failai (*.*) - + Load Amiibo Įkrauti „Amiibo“ - + Unable to open amiibo file "%1" for reading. - + Record Movie Įrašyti įvesčių vaizdo įrašą - + Movie recording cancelled. Įrašo įrašymas nutrauktas. - - + + Movie Saved Įrašas išsaugotas - - + + The movie is successfully saved. Filmas sėkmingai išsaugotas. - + Application will unpause - + The application will be unpaused, and the next frame will be captured. Is this okay? - + Invalid Screenshot Directory - + Cannot create specified screenshot directory. Screenshot path is set back to its default value. - + Could not load video dumper - + FFmpeg could not be loaded. Make sure you have a compatible version installed. To install FFmpeg to Azahar, press Open and select your FFmpeg directory. @@ -4643,274 +4669,264 @@ To view a guide on how to install FFmpeg, press Help. - - Load 3DS ROM File + + Load 3DS ROM Files - - 3DS ROM Files (*.cia *cci *3dsx *cxi) + + 3DS ROM Files (*.cia *.cci *.3dsx *.cxi) - - The selected file is not a compatible 3DS ROM format. Make sure you have chosen the right file, and that it is not encrypted. - - - - - The selected file is already compressed. - - - - + 3DS Compressed ROM File (*.%1) - + Save 3DS Compressed ROM File - - Load 3DS Compressed ROM File + + Select Output 3DS Compressed ROM Folder - + + Load 3DS Compressed ROM Files + + + + 3DS Compressed ROM Files (*.zcia *zcci *z3dsx *zcxi) - - The selected file is not a compatible compressed 3DS ROM format. Make sure you have chosen the right file. - - - - - The selected file is already decompressed. - - - - + 3DS ROM File (*.%1) - + Save 3DS ROM File - + + Select Output 3DS ROM Folder + + + + Select FFmpeg Directory - + The provided FFmpeg directory is missing %1. Please make sure the correct directory was selected. - + FFmpeg has been sucessfully installed. - + Installation of FFmpeg failed. Check the log file for details. - + Could not start video dumping.<br>Please ensure that the video encoder is configured correctly.<br>Refer to the log for details. - + Recording %1 - + Playing %1 / %2 - + Movie Finished - + (Accessing SharedExtData) - + (Accessing SystemSaveData) - + (Accessing BossExtData) - + (Accessing ExtData) - + (Accessing SaveData) - + MB/s - + KB/s - + Artic Traffic: %1 %2%3 - + Speed: %1% Greitis: %1% - + Speed: %1% / %2% Greitis: %1% / %2% - + App: %1 FPS - + Frame: %1 ms (GPU: [CMD: %2 ms, SWP: %3 ms], IPC: %4 ms, SVC: %5 ms, Rem: %6 ms) - + Frame: %1 ms Kadras: %1 ms - + VOLUME: MUTE - + VOLUME: %1% Volume percentage (e.g. 50%) - + %1 is missing. Please <a href='https://web.archive.org/web/20240304201103/https://citra-emu.org/wiki/dumping-system-archives-and-the-shared-fonts-from-a-3ds-console/'>dump your system archives</a>.<br/>Continuing emulation may result in crashes and bugs. - + A system archive - + System Archive Not Found Sisteminis archyvas nerastas - + System Archive Missing - + Save/load Error - + Fatal Error Nepataisoma klaida - + A fatal error occurred. <a href='https://web.archive.org/web/20240228001712/https://community.citra-emu.org/t/how-to-upload-the-log-file/296'>Check the log</a> for details.<br/>Continuing emulation may result in crashes and bugs. - + Fatal Error encountered - + Continue Tęsti - + Quit Application - + OK Gerai - + Would you like to exit now? Ar norite išeiti? - + The application is still running. Would you like to stop emulation? - + Playback Completed Atkūrimas užbaigtas - + Movie playback completed. Įrašo atkūrimas užbaigtas. - + Update Available - + Update %1 for Azahar is available. Would you like to download it? - + Primary Window - + Secondary Window @@ -5016,239 +5032,254 @@ Would you like to download it? GameList - + IMPORTANT: Encrypted files and .3ds files are no longer supported. Decrypting and/or renaming to .cci may be necessary. <a href='https://azahar-emu.org/blog/game-loading-changes/'>Learn more.</a> - + Don't show again - - + + Compatibility Suderinamumas - - + + Region Regionas - - + + File type Failo tipas - - + + Size Dydis - - + + Play time - + Favorite - + + Eject Cartridge + + + + + Insert Cartridge + + + + Open - + Application Location - + Save Data Location - + Extra Data Location - + Update Data Location - + DLC Data Location - + Texture Dump Location - + Custom Texture Location - + Mods Location - + Dump RomFS - + Disk Shader Cache - + Open Shader Cache Location - + Delete OpenGL Shader Cache - + Uninstall - + Everything - + Application - + Update - + DLC - + Remove Play Time Data - + Create Shortcut - + Add to Desktop - + Add to Applications Menu - + + Stress Test: App Launch + + + + Properties - - - - + + + + Azahar - + Are you sure you want to completely uninstall '%1'? This will delete the application if installed, as well as any installed updates or DLC. - - + + %1 (Update) - - + + %1 (DLC) - + Are you sure you want to uninstall '%1'? - + Are you sure you want to uninstall the update for '%1'? - + Are you sure you want to uninstall all DLC for '%1'? - + Scan Subfolders Ieškoti poaplankius - + Remove Application Directory - + Move Up - + Move Down - + Open Directory Location Atidaryti katalogo vietą - + Clear Išvalyti - + Name Pavadinimas @@ -5256,77 +5287,77 @@ This will delete the application if installed, as well as any installed updates GameListItemCompat - + Perfect Tobulas - + App functions flawless with no audio or graphical glitches, all tested functionality works as intended without any workarounds needed. - + Great Puikus - + App functions with minor graphical or audio glitches and is playable from start to finish. May require some workarounds. - + Okay Geras - + App functions with major graphical or audio glitches, but app is playable from start to finish with workarounds. - + Bad Blogas - + App functions, but with major graphical or audio glitches. Unable to progress in specific areas due to glitches even with workarounds. - + Intro/Menu Rodo tik pradžios ekraną - + App is completely unplayable due to major graphical or audio glitches. Unable to progress past the Start Screen. - + Won't Boot Nepasileidžia - + The app crashes when attempting to startup. - + Not Tested Netestuota - + The app has not yet been tested. @@ -5334,7 +5365,7 @@ Screen. GameListPlaceholder - + Double-click to add a new folder to the application list @@ -5342,27 +5373,27 @@ Screen. GameListSearchField - + of - + result rezultatų - + results rezultatai - + Filter: Filtras: - + Enter pattern to filter Įveskite raktinius žodžius filtravimui @@ -5690,87 +5721,87 @@ Screen. Rato indeksas: - + SRC1: %1, %2, %3, %4 SRC1: %1, %2, %3, %4 - + SRC2: %1, %2, %3, %4 SRC2: %1, %2, %3, %4 - + SRC3: %1, %2, %3, %4 SRC3: %1, %2, %3, %4 - + DEST_IN: %1, %2, %3, %4 DEST_IN: %1, %2, %3, %4 - + DEST_OUT: %1, %2, %3, %4 DEST_OUT: %1, %2, %3, %4 - + Address Registers: %1, %2 Adreso registrai: %1, %2 - + Compare Result: %1, %2 Palyginti rezultatus: %1, %2 - + Static Condition: %1 Statinė sąlyga %1 - + Dynamic Conditions: %1, %2 Dinaminės sąlygos: %1, %2 - + Loop Parameters: %1 (repeats), %2 (initializer), %3 (increment), %4 Ciklo parametrai: %1 (pasikartoja), %2 (inicijuoja), %3 (didina), %4 - + Instruction offset: 0x%1 Instrukcijos ofsetas: 0x%1 - + -> 0x%2 -> 0x%2 - + (last instruction) (paskutinė instrukcija) @@ -6069,32 +6100,32 @@ Debug Message: Slaptažodis: - + Room Name Serverio pavadinimas - + Preferred Application - + Host Vartotojas - + Players Žaidėjų skaičius - + Refreshing Atnaujinama - + Refresh List Atnaujinti sąrašą @@ -6595,7 +6626,7 @@ Debug Message: File: - Failas: + @@ -6687,7 +6718,7 @@ Debug Message: File: - Failas: + @@ -7092,32 +7123,32 @@ They may have left the room. - + Unsupported encrypted application - + Invalid region Klaidingas regionas - + Installed Titles - + System Titles - + Add New Application Directory - + Favorites diff --git a/dist/languages/nb.ts b/dist/languages/nb.ts index c22a8c7ef..d54ecb936 100644 --- a/dist/languages/nb.ts +++ b/dist/languages/nb.ts @@ -292,8 +292,8 @@ Dette ville forby både deres brukernavn og IP-adressen. - Emulation: - Emulering: + Emulation + Emulering @@ -397,6 +397,7 @@ Dette ville forby både deres brukernavn og IP-adressen. + Camera Kamera @@ -408,8 +409,8 @@ Dette ville forby både deres brukernavn og IP-adressen. - Camera to configure: - Konfigurer kamera: + Camera to Configure + @@ -429,8 +430,8 @@ Dette ville forby både deres brukernavn og IP-adressen. - Camera mode: - Kameramodus: + Camera mode + @@ -450,8 +451,8 @@ Dette ville forby både deres brukernavn og IP-adressen. - Camera position: - Kamera posisjon: + Camera position + @@ -476,8 +477,8 @@ Dette ville forby både deres brukernavn og IP-adressen. - Camera Image Source: - Kamerabildekilde: + Camera Image Source + @@ -496,8 +497,8 @@ Dette ville forby både deres brukernavn og IP-adressen. - File: - Fil: + File + @@ -510,11 +511,6 @@ Dette ville forby både deres brukernavn og IP-adressen. Select the system camera to use Velg systemkameraet som skal brukes - - - Camera: - Kamera: - <Default> @@ -528,8 +524,8 @@ Dette ville forby både deres brukernavn og IP-adressen. - Flip: - Flip: + Flip + @@ -1081,7 +1077,7 @@ Would you like to ignore the error and continue? - Reverse Side by Side + Side by Side Full Width @@ -1140,48 +1136,53 @@ Would you like to ignore the error and continue? - + + Swap Eyes + + + + Utility - + <html><head/><body><p>Replace textures with PNG files.</p><p>Textures are loaded from load/textures/[Title ID]/.</p></body></html> - - Use Custom Textures + + Use custom textures - + <html><head/><body><p>Dump textures to PNG files.</p><p>Textures are dumped to dump/textures/[Title ID]/.</p></body></html> - - Dump Textures + + Dump textures - + <html><head/><body><p>Load all custom textures into memory on boot, instead of loading them when the application requires them.</p></body></html> - - Preload Custom Textures + + Preload custom textures - + <html><head/><body><p>Load custom textures asynchronously with background threads to reduce loading stutter</p></body></html> - - Async Custom Texture Loading + + Async custom texture loading @@ -1239,13 +1240,13 @@ Would you like to ignore the error and continue? - Set emulation speed: + Set emulation speed - Emulation Speed: - Emulator Hastighet: + Emulation Speed + @@ -1356,12 +1357,12 @@ Would you like to ignore the error and continue? - SPIR-V Shader Generation + SPIR-V shader generation - Disable GLSL -> SPIR-V Optimizer + Disable GLSL -> SPIR-V optimizer @@ -1381,8 +1382,8 @@ Would you like to ignore the error and continue? - Enable Hardware Shader - Aktiver Maskinvare Gjengivelse + Enable hardware shader + @@ -1391,8 +1392,8 @@ Would you like to ignore the error and continue? - Accurate Multiplication - Nøyaktig Multiplikasjon + Accurate multiplication + @@ -1401,8 +1402,8 @@ Would you like to ignore the error and continue? - Enable Shader JIT - Aktiver Gjengivelse JIT + Enable shader JIT + @@ -1411,7 +1412,7 @@ Would you like to ignore the error and continue? - Enable Async Shader Compilation + Enable async shader compilation @@ -1421,7 +1422,7 @@ Would you like to ignore the error and continue? - Enable Async Presentation + Enable async presentation @@ -1461,7 +1462,7 @@ Would you like to ignore the error and continue? - Use Disk Shader Cache + Use disk shader cache @@ -1486,7 +1487,7 @@ Would you like to ignore the error and continue? - Delay application render thread: + Delay Application Render Thread @@ -1975,12 +1976,12 @@ Would you like to ignore the error and continue? - Swap Screens - Bytt Skjerm + Swap screens + - Rotate Screens Upright + Rotate screens upright @@ -2097,7 +2098,7 @@ Would you like to ignore the error and continue? - <html><head/><body><p>Bottom Screen Opacity % (OpenGL Only)</p></body></html> + <html><head/><body><p>Bottom Screen Opacity %</p></body></html> @@ -2445,7 +2446,7 @@ Would you like to ignore the error and continue? - Use Virtual SD + Use virtual SD card @@ -2455,7 +2456,7 @@ Would you like to ignore the error and continue? - Use Custom Storage + Use custom storage location @@ -2542,8 +2543,8 @@ online features (if installed) - Region: - + Region + Region @@ -2551,326 +2552,337 @@ online features (if installed) - + + Apply region free patch to +installed applications. + + + + + Patches the region of installed applications to be region free, so that they always appear on the home menu. + + + + Username Brukernavn - + Birthday Fødselsdag - + January Januar - + February Februar - + March Mars - + April April - + May Mai - + June Juni - + July Juli - + August August - + September September - + October Oktober - + November November - + December Desember - + Language Språk - + Note: this can be overridden when region setting is auto-select Merk: dette kan overstyres når regioninnstillingen er automatisk valgt - + Japanese (日本語) Japansk (日本語) - + English Engelsk - + French (français) Fransk (français) - + German (Deutsch) Tysk (Deutsch) - + Italian (italiano) Italiensk (italiano) - + Spanish (español) Spansk (español) - + Simplified Chinese (简体中文) Enkel Kinesisk (简体中文) - + Korean (한국어) Koreansk (한국어) - + Dutch (Nederlands) Nederlandsk (Nederlands) - + Portuguese (português) portugisisk (português) - + Russian (Русский) Russisk (Русский) - + Traditional Chinese (正體中文) Tradisjonell Kinesisk (正體中文) - + Sound output mode Lydutgangsmodus - + Mono Mono - + Stereo Stero - + Surround Surround - + Country Land - + Clock Klokke - + System Clock System Klokke - + Fixed Time Bestemt Tid - + Startup time Oppstartstid - + yyyy-MM-ddTHH:mm:ss yyyy-MM-ddTHH:mm:ss - + Offset time - + days - + HH:mm:ss - + Initial System Ticks - + Random - + Fixed - + Initial System Ticks Override - + Play Coins - + <html><head/><body><p>Number of steps per hour reported by the pedometer. Range from 0 to 65,535.</p></body></html> - + Pedometer Steps per Hour - + Run System Setup when Home Menu is launched - + Console ID: Konsoll ID: - - + + Regenerate Regenerere - + MAC: - - 3GX Plugin Loader: + + 3GX Plugin Loader - + Enable 3GX plugin loader - + Allow applications to change plugin loader state - + Real Console Unique Data - + Your real console is linked to Azahar. - + Unlink - + OTP - - - - + + + + Choose - + SecureInfo_A/B - + LocalFriendCodeSeed_A/B - + movable.sed - + System settings are available only when applications is not running. @@ -3580,76 +3592,76 @@ online features (if installed) - - + + Console ID: 0x%1 Konsoll ID: 0x%1 - - + + MAC: %1 - + This will replace your current virtual 3DS console ID with a new one. Your current virtual 3DS console ID will not be recoverable. This might have unexpected effects in applications. This might fail if you use an outdated config save. Continue? - - - + + + Warning Advarsel - + This will replace your current MAC address with a new one. It is not recommended to do this if you got the MAC address from your real console using the setup tool. Continue? - + This action will unlink your real console from Azahar, with the following consequences:<br><ul><li>Your OTP, SecureInfo and LocalFriendCodeSeed will be removed from Azahar.</li><li>Your friend list will reset and you will be logged out of your NNID/PNID account.</li><li>System files and eshop titles obtained through Azahar will become inaccessible until the same console is linked again (save data will not be lost).</li></ul><br>Continue? - + Invalid country for configured region - + Invalid country for console unique data - + Status: Loaded - + Status: Loaded (Invalid Signature) - + Status: Loaded (Region Changed) - + Status: Not Found - + Status: Invalid - + Status: IO Error @@ -3765,13 +3777,13 @@ Dra punkter for å endre posisjon, eller dobbeltklikk på tabellceller for å re - Interface language: - Grensesnittspråk: + Interface Language + - Theme: - Tema: + Theme + @@ -3780,8 +3792,8 @@ Dra punkter for å endre posisjon, eller dobbeltklikk på tabellceller for å re - Icon Size: - Ikon Størrelse: + Icon Size + @@ -3801,8 +3813,8 @@ Dra punkter for å endre posisjon, eller dobbeltklikk på tabellceller for å re - Row 1 Text: - Rad 1 tekst: + Row 1 Text + @@ -3836,18 +3848,18 @@ Dra punkter for å endre posisjon, eller dobbeltklikk på tabellceller for å re - Row 2 Text: - Rad 2 tekst: + Row 2 Text + - Hide Titles without Icon - Skjul titler uten ikon + Hide titles without icon + - Single Line Mode - Enkeltlinjemodus + Single line mode + @@ -3856,7 +3868,7 @@ Dra punkter for å endre posisjon, eller dobbeltklikk på tabellceller for å re - Show Advanced Frame Time Info + Show advanced frame time info @@ -3939,12 +3951,12 @@ Dra punkter for å endre posisjon, eller dobbeltklikk på tabellceller for å re DirectConnectWindow - + Connecting Kobler til - + Connect Koble til @@ -4063,582 +4075,596 @@ Please check your FFmpeg installation used for compilation. GMainWindow - + No Suitable Vulkan Devices Detected - + Vulkan initialization failed during boot.<br/>Your GPU may not support Vulkan 1.1, or you do not have the latest graphics driver. - + Current Artic traffic speed. Higher values indicate bigger transfer loads. - - + + Current emulation speed. Values higher or lower than 100% indicate emulation is running faster or slower than a 3DS. Nåværende emuleringhastighet. Verdier høyere eller lavere enn 100% indikerer at emuleringen kjører raskere eller langsommere enn en 3DS. - - + + How many frames per second the app is currently displaying. This will vary from app to app and scene to scene. - - + + Time taken to emulate a 3DS frame, not counting framelimiting or v-sync. For full-speed emulation this should be at most 16.67 ms. Tid tatt for å emulere et 3DS bilde, gjelder ikke bildebegrensning eller V-Sync. For raskest emulering bør dette være høyst 16,67 ms. - + MicroProfile (unavailable) - + Clear Recent Files Tøm nylige filer - + &Continue - + &Pause - + Azahar is running an application TRANSLATORS: This string is shown to the user to explain why Citra needs to prevent the computer from sleeping - - + + Invalid App Format - - + + Your app format is not supported.<br/>Please follow the guides to redump your <a href='https://web.archive.org/web/20240304210021/https://citra-emu.org/wiki/dumping-game-cartridges/'>game cartridges</a> or <a href='https://web.archive.org/web/20240304210011/https://citra-emu.org/wiki/dumping-installed-titles/'>installed titles</a>. - + App Corrupted - + Your app is corrupted. <br/>Please follow the guides to redump your <a href='https://web.archive.org/web/20240304210021/https://citra-emu.org/wiki/dumping-game-cartridges/'>game cartridges</a> or <a href='https://web.archive.org/web/20240304210011/https://citra-emu.org/wiki/dumping-installed-titles/'>installed titles</a>. - + App Encrypted - + Your app is encrypted. <br/><a href='https://azahar-emu.org/blog/game-loading-changes/'>Please check our blog for more info.</a> - + Unsupported App - + GBA Virtual Console is not supported by Azahar. - - + + Artic Server - + + Invalid system mode + + + + + New 3DS exclusive applications cannot be loaded without enabling the New 3DS mode. + + + + Error while loading App! - + An unknown error occurred. Please see the log for more details. - + CIA must be installed before usage CIA må installeres før bruk - + Before using this CIA, you must install it. Do you want to install it now? Før du bruker denne CIA, må du installere den. Vil du installere det nå? - + Quick Load - + Quick Save - - + + Slot %1 Spor %1 - + %2 %3 - + Quick Save - %1 - + Quick Load - %1 - + Slot %1 - %2 %3 - + Error Opening %1 Folder Feil ved Åpning av %1 Mappe - - + + Folder does not exist! Mappen eksistere ikke! - + Remove Play Time Data - + Reset play time? - - - - + + + + Create Shortcut - + Do you want to launch the application in fullscreen? - + Successfully created a shortcut to %1 - + This will create a shortcut to the current AppImage. This may not work well if you update. Continue? - + Failed to create a shortcut to %1 - + Create Icon - + Cannot create icon file. Path "%1" does not exist and cannot be created. - + Dumping... Dumper... - - + + Cancel Kanseller - - - - - - - - - + + + + + + + + + Azahar - + Could not dump base RomFS. Refer to the log for details. Kunne ikke dumpe basen RomFS. Se loggen for detaljer. - + Error Opening %1 Feil ved åpning av %1 - + Select Directory Velg Mappe - + Properties - + The application properties could not be loaded. - + 3DS Executable (%1);;All Files (*.*) %1 is an identifier for the 3DS executable file extensions. 3DS Executable (%1);;All Files (*.*) - + Load File Last Fil - - + + Set Up System Files - + <p>Azahar needs console unique data and firmware files from a real console to be able to use some of its features.<br>Such files and data can be set up with the <a href=https://github.com/azahar-emu/ArticSetupTool>Azahar Artic Setup Tool</a><br>Notes:<ul><li><b>This operation will install console unique data to Azahar, do not share your user or nand folders<br>after performing the setup process!</b></li><li>While doing the setup process, Azahar will link to the console running the setup tool. You can unlink the<br>console later from the System tab in the emulator configuration menu.</li><li>Do not go online with both Azahar and your 3DS console at the same time after setting up system files,<br>as it could cause issues.</li><li>Old 3DS setup is needed for the New 3DS setup to work (doing both setup modes is recommended).</li><li>Both setup modes will work regardless of the model of the console running the setup tool.</li></ul><hr></p> - + Enter Azahar Artic Setup Tool address: - + <br>Choose setup mode: - + (ℹ️) Old 3DS setup - - + + Setup is possible. - + (⚠) New 3DS setup - + Old 3DS setup is required first. - + (✅) Old 3DS setup - - + + Setup completed. - + (ℹ️) New 3DS setup - + (✅) New 3DS setup - + The system files for the selected mode are already set up. Reinstall the files anyway? - + Load Files Last Filer - + 3DS Installation File (*.cia *.zcia) - - - + + + All Files (*.*) Alle Filer (*.*) - + Connect to Artic Base - + Enter Artic Base server address: - + %1 has been installed successfully. %1 Ble installert vellykket. - + Unable to open File Kan ikke åpne Fil - + Could not open %1 Kunne ikke åpne %1 - + Installation aborted Installasjon avbrutt - + The installation of %1 was aborted. Please see the log for more details Installeringen av %1 ble avbrutt. Vennligst se logg for detaljer - + Invalid File Ugyldig Fil - + %1 is not a valid CIA %1 er ikke en gyldig CIA - + CIA Encrypted - + Your CIA file is encrypted.<br/><a href='https://azahar-emu.org/blog/game-loading-changes/'>Please check our blog for more info.</a> - + Unable to find File - + Could not find %1 - - - - Error compressing file + + + + + Z3DS Compression - - File compress operation failed, check log for details. + + Failed to compress some files, check log for details. - - - - Error decompressing file + + Failed to decompress some files, check log for details. - - File decompress operation failed, check log for details. + + All files have been compressed successfully. - + + All files have been decompressed successfully. + + + + Uninstalling '%1'... - + Failed to uninstall '%1'. - + Successfully uninstalled '%1'. - + File not found Fil ikke funnet - + File "%1" not found Fil "%1" ble ikke funnet - + Savestates - + Warning: Savestates are NOT a replacement for in-application saves, and are not meant to be reliable. Use at your own risk! - - - + + + Error opening amiibo data file - + A tag is already in use. - + Application is not looking for amiibos. - + Amiibo File (%1);; All Files (*.*) Amiibo File (%1);; All Files (*.*) - + Load Amiibo Last inn Amiibo - + Unable to open amiibo file "%1" for reading. - + Record Movie Ta Opp Video - + Movie recording cancelled. Filmopptak avbrutt. - - + + Movie Saved Film Lagret - - + + The movie is successfully saved. Filmen ble lagret vellykket. - + Application will unpause - + The application will be unpaused, and the next frame will be captured. Is this okay? - + Invalid Screenshot Directory - + Cannot create specified screenshot directory. Screenshot path is set back to its default value. - + Could not load video dumper - + FFmpeg could not be loaded. Make sure you have a compatible version installed. To install FFmpeg to Azahar, press Open and select your FFmpeg directory. @@ -4647,274 +4673,264 @@ To view a guide on how to install FFmpeg, press Help. - - Load 3DS ROM File + + Load 3DS ROM Files - - 3DS ROM Files (*.cia *cci *3dsx *cxi) + + 3DS ROM Files (*.cia *.cci *.3dsx *.cxi) - - The selected file is not a compatible 3DS ROM format. Make sure you have chosen the right file, and that it is not encrypted. - - - - - The selected file is already compressed. - - - - + 3DS Compressed ROM File (*.%1) - + Save 3DS Compressed ROM File - - Load 3DS Compressed ROM File + + Select Output 3DS Compressed ROM Folder - + + Load 3DS Compressed ROM Files + + + + 3DS Compressed ROM Files (*.zcia *zcci *z3dsx *zcxi) - - The selected file is not a compatible compressed 3DS ROM format. Make sure you have chosen the right file. - - - - - The selected file is already decompressed. - - - - + 3DS ROM File (*.%1) - + Save 3DS ROM File - + + Select Output 3DS ROM Folder + + + + Select FFmpeg Directory - + The provided FFmpeg directory is missing %1. Please make sure the correct directory was selected. - + FFmpeg has been sucessfully installed. - + Installation of FFmpeg failed. Check the log file for details. - + Could not start video dumping.<br>Please ensure that the video encoder is configured correctly.<br>Refer to the log for details. - + Recording %1 - + Playing %1 / %2 - + Movie Finished - + (Accessing SharedExtData) - + (Accessing SystemSaveData) - + (Accessing BossExtData) - + (Accessing ExtData) - + (Accessing SaveData) - + MB/s - + KB/s - + Artic Traffic: %1 %2%3 - + Speed: %1% Fart: %1% - + Speed: %1% / %2% Fart: %1% / %2% - + App: %1 FPS - + Frame: %1 ms (GPU: [CMD: %2 ms, SWP: %3 ms], IPC: %4 ms, SVC: %5 ms, Rem: %6 ms) - + Frame: %1 ms Bilde: %1 ms - + VOLUME: MUTE - + VOLUME: %1% Volume percentage (e.g. 50%) - + %1 is missing. Please <a href='https://web.archive.org/web/20240304201103/https://citra-emu.org/wiki/dumping-system-archives-and-the-shared-fonts-from-a-3ds-console/'>dump your system archives</a>.<br/>Continuing emulation may result in crashes and bugs. - + A system archive Et System Arkiv - + System Archive Not Found System Arkiv ikke funnet - + System Archive Missing System Arkiv Mangler - + Save/load Error Lagre/laste inn Feil - + Fatal Error Fatal Feil - + A fatal error occurred. <a href='https://web.archive.org/web/20240228001712/https://community.citra-emu.org/t/how-to-upload-the-log-file/296'>Check the log</a> for details.<br/>Continuing emulation may result in crashes and bugs. - + Fatal Error encountered Fatal Feil Oppstått - + Continue Fortsett - + Quit Application - + OK OK - + Would you like to exit now? Vil du avslutte nå? - + The application is still running. Would you like to stop emulation? - + Playback Completed Avspilling Fullført - + Movie playback completed. Filmavspilling fullført. - + Update Available - + Update %1 for Azahar is available. Would you like to download it? - + Primary Window - + Secondary Window @@ -5020,239 +5036,254 @@ Would you like to download it? GameList - + IMPORTANT: Encrypted files and .3ds files are no longer supported. Decrypting and/or renaming to .cci may be necessary. <a href='https://azahar-emu.org/blog/game-loading-changes/'>Learn more.</a> - + Don't show again - - + + Compatibility Kompatibilitet - - + + Region Region - - + + File type Filtype - - + + Size Størrelse - - + + Play time - + Favorite - + + Eject Cartridge + + + + + Insert Cartridge + + + + Open - + Application Location - + Save Data Location - + Extra Data Location - + Update Data Location - + DLC Data Location - + Texture Dump Location - + Custom Texture Location - + Mods Location - + Dump RomFS Dump RomFS - + Disk Shader Cache - + Open Shader Cache Location - + Delete OpenGL Shader Cache - + Uninstall - + Everything - + Application - + Update - + DLC - + Remove Play Time Data - + Create Shortcut - + Add to Desktop - + Add to Applications Menu - + + Stress Test: App Launch + + + + Properties - - - - + + + + Azahar - + Are you sure you want to completely uninstall '%1'? This will delete the application if installed, as well as any installed updates or DLC. - - + + %1 (Update) - - + + %1 (DLC) - + Are you sure you want to uninstall '%1'? - + Are you sure you want to uninstall the update for '%1'? - + Are you sure you want to uninstall all DLC for '%1'? - + Scan Subfolders Skann Undermapper - + Remove Application Directory - + Move Up - + Move Down - + Open Directory Location Fjern Mappe Plassering - + Clear - + Name Navn @@ -5260,77 +5291,77 @@ This will delete the application if installed, as well as any installed updates GameListItemCompat - + Perfect Perfekt - + App functions flawless with no audio or graphical glitches, all tested functionality works as intended without any workarounds needed. - + Great Bra - + App functions with minor graphical or audio glitches and is playable from start to finish. May require some workarounds. - + Okay Ok - + App functions with major graphical or audio glitches, but app is playable from start to finish with workarounds. - + Bad Dårlig - + App functions, but with major graphical or audio glitches. Unable to progress in specific areas due to glitches even with workarounds. - + Intro/Menu Intro/Meny - + App is completely unplayable due to major graphical or audio glitches. Unable to progress past the Start Screen. - + Won't Boot Vil ikke starte opp - + The app crashes when attempting to startup. - + Not Tested Ikke Testet - + The app has not yet been tested. @@ -5338,7 +5369,7 @@ Screen. GameListPlaceholder - + Double-click to add a new folder to the application list @@ -5346,27 +5377,27 @@ Screen. GameListSearchField - + of av - + result Resultat - + results Resultater - + Filter: Filter: - + Enter pattern to filter Skriv inn mønster for å filtrere @@ -5694,87 +5725,87 @@ Screen. Syklusindeks: - + SRC1: %1, %2, %3, %4 SRC1: %1, %2, %3, %4 - + SRC2: %1, %2, %3, %4 SRC2: %1, %2, %3, %4 - + SRC3: %1, %2, %3, %4 SRC3: %1, %2, %3, %4 - + DEST_IN: %1, %2, %3, %4 DEST_IN: %1, %2, %3, %4 - + DEST_OUT: %1, %2, %3, %4 DEST_OUT: %1, %2, %3, %4 - + Address Registers: %1, %2 Adresse Register: %1, %2 - + Compare Result: %1, %2 Sammenlign Resultater: %1, %2 - + Static Condition: %1 Statisk Tilstand: %1 - + Dynamic Conditions: %1, %2 Dynamiske Betingelser: %1, %2 - + Loop Parameters: %1 (repeats), %2 (initializer), %3 (increment), %4 Loop Parameters: %1 (repeats), %2 (initializer), %3 (increment), %4 - + Instruction offset: 0x%1 Instruksjons forskyvning: 0x%1 - + -> 0x%2 -> 0x%2 - + (last instruction) (siste instruksjon) @@ -6074,32 +6105,32 @@ Debug Message: Passord: - + Room Name Rom Navn - + Preferred Application - + Host Vert - + Players Spillere - + Refreshing Oppdaterer - + Refresh List Oppdaterer Liste @@ -6600,7 +6631,7 @@ Debug Message: File: - Fil: + @@ -6692,7 +6723,7 @@ Debug Message: File: - Fil: + @@ -7098,32 +7129,32 @@ They may have left the room. - + Unsupported encrypted application - + Invalid region Ugyldig region - + Installed Titles Installerte Tittler - + System Titles System Tittler - + Add New Application Directory - + Favorites diff --git a/dist/languages/nl.ts b/dist/languages/nl.ts index 715d75a5f..b1dbff138 100644 --- a/dist/languages/nl.ts +++ b/dist/languages/nl.ts @@ -292,8 +292,8 @@ Dit zal hun Forum gebruikersnaam en IP adres verbannen. - Emulation: - Emulatie: + Emulation + Emulatie @@ -397,6 +397,7 @@ Dit zal hun Forum gebruikersnaam en IP adres verbannen. + Camera Camera @@ -408,8 +409,8 @@ Dit zal hun Forum gebruikersnaam en IP adres verbannen. - Camera to configure: - Camera om te configureren: + Camera to Configure + @@ -429,8 +430,8 @@ Dit zal hun Forum gebruikersnaam en IP adres verbannen. - Camera mode: - Camera modus: + Camera mode + @@ -450,8 +451,8 @@ Dit zal hun Forum gebruikersnaam en IP adres verbannen. - Camera position: - Camera positie: + Camera position + @@ -476,8 +477,8 @@ Dit zal hun Forum gebruikersnaam en IP adres verbannen. - Camera Image Source: - Camera Afbeelding Bron: + Camera Image Source + @@ -496,8 +497,8 @@ Dit zal hun Forum gebruikersnaam en IP adres verbannen. - File: - Bestand: + File + @@ -510,11 +511,6 @@ Dit zal hun Forum gebruikersnaam en IP adres verbannen. Select the system camera to use Selecteer systeem camera om te gebruiken - - - Camera: - Camera: - <Default> @@ -528,8 +524,8 @@ Dit zal hun Forum gebruikersnaam en IP adres verbannen. - Flip: - Omdraaing: + Flip + @@ -1018,7 +1014,7 @@ Wilt u de fout negeren en doorgaan? Enable Linear Filtering - Activeer lineaire filtering + @@ -1082,7 +1078,7 @@ Wilt u de fout negeren en doorgaan? - Reverse Side by Side + Side by Side Full Width @@ -1141,49 +1137,54 @@ Wilt u de fout negeren en doorgaan? - + + Swap Eyes + + + + Utility Utility - + <html><head/><body><p>Replace textures with PNG files.</p><p>Textures are loaded from load/textures/[Title ID]/.</p></body></html> <html><head/><body><p>Vervang texturen met PNG-bestanden.</p><p>Texturen worden geladen vanuit load/textures/[Title ID]/.</p></body></html> - - Use Custom Textures - Gebruik aangepaste texturen + + Use custom textures + - + <html><head/><body><p>Dump textures to PNG files.</p><p>Textures are dumped to dump/textures/[Title ID]/.</p></body></html> <html><head/><body><p>Dump texturen naar PNG-bestanden.</p><p>Texturen worden gedumpt naar dump/textures/[Title ID]/. - - Dump Textures - Dump texturen + + Dump textures + - + <html><head/><body><p>Load all custom textures into memory on boot, instead of loading them when the application requires them.</p></body></html> - - Preload Custom Textures - Aangepaste texturen vooraf laden + + Preload custom textures + - + <html><head/><body><p>Load custom textures asynchronously with background threads to reduce loading stutter</p></body></html> <html><head/><body><p>Aangepaste texturen asynchroon laden met achtergrondthreads om stotteren bij het laden te verminderen</p></body></html> - - Async Custom Texture Loading - Async aangepaste texturen laden + + Async custom texture loading + @@ -1240,13 +1241,13 @@ Wilt u de fout negeren en doorgaan? - Set emulation speed: - Emulatiesnelheid instellen: + Set emulation speed + - Emulation Speed: - Emulatiesnelheid: + Emulation Speed + @@ -1357,12 +1358,12 @@ Wilt u de fout negeren en doorgaan? - SPIR-V Shader Generation - SPIR-V shadergeneratie + SPIR-V shader generation + - Disable GLSL -> SPIR-V Optimizer + Disable GLSL -> SPIR-V optimizer @@ -1382,8 +1383,8 @@ Wilt u de fout negeren en doorgaan? - Enable Hardware Shader - Activeer Hardware Shader + Enable hardware shader + @@ -1392,8 +1393,8 @@ Wilt u de fout negeren en doorgaan? - Accurate Multiplication - Nauwkeurige Vermenigvuldiging + Accurate multiplication + @@ -1402,8 +1403,8 @@ Wilt u de fout negeren en doorgaan? - Enable Shader JIT - Activeer Shader JIT + Enable shader JIT + @@ -1412,8 +1413,8 @@ Wilt u de fout negeren en doorgaan? - Enable Async Shader Compilation - Activeer Async shadercompilatie + Enable async shader compilation + @@ -1422,8 +1423,8 @@ Wilt u de fout negeren en doorgaan? - Enable Async Presentation - Activeer Async-presentatie + Enable async presentation + @@ -1462,8 +1463,8 @@ Wilt u de fout negeren en doorgaan? - Use Disk Shader Cache - Gebruik schijfshadercache + Use disk shader cache + @@ -1487,7 +1488,7 @@ Wilt u de fout negeren en doorgaan? - Delay application render thread: + Delay Application Render Thread @@ -1976,13 +1977,13 @@ Wilt u de fout negeren en doorgaan? - Swap Screens - Wissel Schermen + Swap screens + - Rotate Screens Upright - Draai Schermen Rechtop + Rotate screens upright + @@ -2098,8 +2099,8 @@ Wilt u de fout negeren en doorgaan? - <html><head/><body><p>Bottom Screen Opacity % (OpenGL Only)</p></body></html> - <html><head/><body><p>Onderste Scherm Doorzichtigheid % (alleen OpenGL)</p></body></html> + <html><head/><body><p>Bottom Screen Opacity %</p></body></html> + @@ -2446,8 +2447,8 @@ Wilt u de fout negeren en doorgaan? - Use Virtual SD - Gebruik virtuele SD + Use virtual SD card + @@ -2456,8 +2457,8 @@ Wilt u de fout negeren en doorgaan? - Use Custom Storage - Gebruik aangepaste opslag + Use custom storage location + @@ -2543,8 +2544,8 @@ online features (if installed) - Region: - + Region + Regio @@ -2552,326 +2553,337 @@ online features (if installed) - + + Apply region free patch to +installed applications. + + + + + Patches the region of installed applications to be region free, so that they always appear on the home menu. + + + + Username Gebruikersnaam - + Birthday Geboortedatum - + January januari - + February februari - + March maart - + April april - + May mei - + June juni - + July juli - + August augustus - + September september - + October oktober - + November november - + December december - + Language Taal - + Note: this can be overridden when region setting is auto-select Opmerking: dit kan overschreven worden wanneer regio instelling op automatisch selecteren staat - + Japanese (日本語) Japans (日本語) - + English Engels - + French (français) Frans (français) - + German (Deutsch) Duits (Deutsch) - + Italian (italiano) Italiaans (italiano) - + Spanish (español) Spaans (español) - + Simplified Chinese (简体中文) Versimpeld Chinees (简体中文) - + Korean (한국어) Koreaans (한국어) - + Dutch (Nederlands) Nederlands (Nederlands) - + Portuguese (português) Portugees (português) - + Russian (Русский) Russisch (Русский) - + Traditional Chinese (正體中文) Traditioneel Chinees (正體中文) - + Sound output mode Geluidsuitvoer modus - + Mono Mono - + Stereo Stereo - + Surround Surround - + Country Land - + Clock Klok - + System Clock Systeemklok - + Fixed Time Vaste tijd - + Startup time Opstarttijd - + yyyy-MM-ddTHH:mm:ss yyyy-MM-ddTHH:mm:ss - + Offset time Offset tijd - + days - + HH:mm:ss HH:mm:ss - + Initial System Ticks - + Random Willekeurig - + Fixed - + Initial System Ticks Override - + Play Coins - + <html><head/><body><p>Number of steps per hour reported by the pedometer. Range from 0 to 65,535.</p></body></html> - + Pedometer Steps per Hour - + Run System Setup when Home Menu is launched Systeeminstellingen opstarten wanneer het Home-menu wordt gestart - + Console ID: Console ID: - - + + Regenerate Herstellen - + MAC: - - 3GX Plugin Loader: - 3GX-pluginlader: + + 3GX Plugin Loader + - + Enable 3GX plugin loader Activeer 3GX-pluginlader - + Allow applications to change plugin loader state - + Real Console Unique Data - + Your real console is linked to Azahar. - + Unlink - + OTP - - - - + + + + Choose - + SecureInfo_A/B - + LocalFriendCodeSeed_A/B - + movable.sed - + System settings are available only when applications is not running. @@ -3581,76 +3593,76 @@ online features (if installed) - - + + Console ID: 0x%1 Console ID: 0x%1 - - + + MAC: %1 - + This will replace your current virtual 3DS console ID with a new one. Your current virtual 3DS console ID will not be recoverable. This might have unexpected effects in applications. This might fail if you use an outdated config save. Continue? - - - + + + Warning Waarschuwing - + This will replace your current MAC address with a new one. It is not recommended to do this if you got the MAC address from your real console using the setup tool. Continue? - + This action will unlink your real console from Azahar, with the following consequences:<br><ul><li>Your OTP, SecureInfo and LocalFriendCodeSeed will be removed from Azahar.</li><li>Your friend list will reset and you will be logged out of your NNID/PNID account.</li><li>System files and eshop titles obtained through Azahar will become inaccessible until the same console is linked again (save data will not be lost).</li></ul><br>Continue? - + Invalid country for configured region - + Invalid country for console unique data - + Status: Loaded - + Status: Loaded (Invalid Signature) - + Status: Loaded (Region Changed) - + Status: Not Found - + Status: Invalid - + Status: IO Error @@ -3766,13 +3778,13 @@ Sleep punten om de positie te wijzigen of dubbelklik op tabelcellen om waarden t - Interface language: - Interfacetaal: + Interface Language + - Theme: - Thema: + Theme + @@ -3781,8 +3793,8 @@ Sleep punten om de positie te wijzigen of dubbelklik op tabelcellen om waarden t - Icon Size: - Icoongrootte + Icon Size + @@ -3802,8 +3814,8 @@ Sleep punten om de positie te wijzigen of dubbelklik op tabelcellen om waarden t - Row 1 Text: - Rij 1 Tekst: + Row 1 Text + @@ -3837,18 +3849,18 @@ Sleep punten om de positie te wijzigen of dubbelklik op tabelcellen om waarden t - Row 2 Text: - Rij 2 Tekst: + Row 2 Text + - Hide Titles without Icon - Verberg titels zonder icoon + Hide titles without icon + - Single Line Mode - Enkelvoudige lijnmodus + Single line mode + @@ -3857,7 +3869,7 @@ Sleep punten om de positie te wijzigen of dubbelklik op tabelcellen om waarden t - Show Advanced Frame Time Info + Show advanced frame time info @@ -3940,12 +3952,12 @@ Sleep punten om de positie te wijzigen of dubbelklik op tabelcellen om waarden t DirectConnectWindow - + Connecting Verbinden - + Connect Verbind @@ -4065,582 +4077,596 @@ Controleer de FFmpeg-installatie die wordt gebruikt voor de compilatie. GMainWindow - + No Suitable Vulkan Devices Detected Geen geschikte Vulkan-apparaten gedetecteerd - + Vulkan initialization failed during boot.<br/>Your GPU may not support Vulkan 1.1, or you do not have the latest graphics driver. Vulkan-initialisatie mislukt tijdens het opstarten.<br/>Uw GPU ondersteunt Vulkan 1.1 mogelijk niet of u hebt niet het nieuwste grafische stuurprogramma. - + Current Artic traffic speed. Higher values indicate bigger transfer loads. - - + + Current emulation speed. Values higher or lower than 100% indicate emulation is running faster or slower than a 3DS. Huidige emulatiesnelheid. Waardes hoger of lager dan 100% geven aan dat de emulatie sneller of langzamer gaat dan een 3DS. - - + + How many frames per second the app is currently displaying. This will vary from app to app and scene to scene. - - + + Time taken to emulate a 3DS frame, not counting framelimiting or v-sync. For full-speed emulation this should be at most 16.67 ms. Tijd verstrekt om één 3DS frame te emuleren, zonder framelimitatie of V-Sync te tellen. Voor volledige snelheid emulatie zal dit maximaal 16.67 ms moeten zijn. - + MicroProfile (unavailable) - + Clear Recent Files Wis recente bestanden - + &Continue &Continue - + &Pause &Pause - + Azahar is running an application TRANSLATORS: This string is shown to the user to explain why Citra needs to prevent the computer from sleeping - - + + Invalid App Format - - + + Your app format is not supported.<br/>Please follow the guides to redump your <a href='https://web.archive.org/web/20240304210021/https://citra-emu.org/wiki/dumping-game-cartridges/'>game cartridges</a> or <a href='https://web.archive.org/web/20240304210011/https://citra-emu.org/wiki/dumping-installed-titles/'>installed titles</a>. - + App Corrupted - + Your app is corrupted. <br/>Please follow the guides to redump your <a href='https://web.archive.org/web/20240304210021/https://citra-emu.org/wiki/dumping-game-cartridges/'>game cartridges</a> or <a href='https://web.archive.org/web/20240304210011/https://citra-emu.org/wiki/dumping-installed-titles/'>installed titles</a>. - + App Encrypted - + Your app is encrypted. <br/><a href='https://azahar-emu.org/blog/game-loading-changes/'>Please check our blog for more info.</a> - + Unsupported App - + GBA Virtual Console is not supported by Azahar. - - + + Artic Server - + + Invalid system mode + + + + + New 3DS exclusive applications cannot be loaded without enabling the New 3DS mode. + + + + Error while loading App! - + An unknown error occurred. Please see the log for more details. Er heeft zich een onbekende fout voorgedaan. Raadpleeg het log voor meer informatie. - + CIA must be installed before usage CIA moet worden geïnstalleerd voor gebruik - + Before using this CIA, you must install it. Do you want to install it now? Voordat u deze CIA kunt gebruiken, moet u hem installeren. Wilt u het nu installeren? - + Quick Load - + Quick Save - - + + Slot %1 Slot %1 - + %2 %3 - + Quick Save - %1 - + Quick Load - %1 - + Slot %1 - %2 %3 Slot %1 - %2 %3 - + Error Opening %1 Folder Fout bij het openen van de map %1 - - + + Folder does not exist! Map bestaat niet! - + Remove Play Time Data Verwijder speeltijd gegevens - + Reset play time? Stel speeltijd opnieuw in? - - - - + + + + Create Shortcut Snelkoppeling maken - + Do you want to launch the application in fullscreen? - + Successfully created a shortcut to %1 Het maken van een snelkoppeling naar %1 was succesvol - + This will create a shortcut to the current AppImage. This may not work well if you update. Continue? Dit zal een snelkoppeling naar het huidige AppImage aanmaken. Dit zal mogelijk niet meer werken als u deze software bijwerkt. Wilt u doorgaan? - + Failed to create a shortcut to %1 Kon geen snelkoppeling naar %1 aanmaken - + Create Icon - + Cannot create icon file. Path "%1" does not exist and cannot be created. - + Dumping... Dumping... - - + + Cancel Annuleren - - - - - - - - - + + + + + + + + + Azahar - + Could not dump base RomFS. Refer to the log for details. Kon basis RomFS niet dumpen. Raadpleeg het log voor meer informatie. - + Error Opening %1 Fout bij het openen van %1 - + Select Directory Selecteer Folder - + Properties Eigenschappen - + The application properties could not be loaded. - + 3DS Executable (%1);;All Files (*.*) %1 is an identifier for the 3DS executable file extensions. 3DS Executable (%1);;Alle bestanden (*.*) - + Load File Laad bestand - - + + Set Up System Files - + <p>Azahar needs console unique data and firmware files from a real console to be able to use some of its features.<br>Such files and data can be set up with the <a href=https://github.com/azahar-emu/ArticSetupTool>Azahar Artic Setup Tool</a><br>Notes:<ul><li><b>This operation will install console unique data to Azahar, do not share your user or nand folders<br>after performing the setup process!</b></li><li>While doing the setup process, Azahar will link to the console running the setup tool. You can unlink the<br>console later from the System tab in the emulator configuration menu.</li><li>Do not go online with both Azahar and your 3DS console at the same time after setting up system files,<br>as it could cause issues.</li><li>Old 3DS setup is needed for the New 3DS setup to work (doing both setup modes is recommended).</li><li>Both setup modes will work regardless of the model of the console running the setup tool.</li></ul><hr></p> - + Enter Azahar Artic Setup Tool address: - + <br>Choose setup mode: - + (ℹ️) Old 3DS setup - - + + Setup is possible. - + (⚠) New 3DS setup - + Old 3DS setup is required first. - + (✅) Old 3DS setup - - + + Setup completed. - + (ℹ️) New 3DS setup - + (✅) New 3DS setup - + The system files for the selected mode are already set up. Reinstall the files anyway? - + Load Files Laad Bestanden - + 3DS Installation File (*.cia *.zcia) - - - + + + All Files (*.*) Alle bestanden (*.*) - + Connect to Artic Base Verbind met Artic Base - + Enter Artic Base server address: Voer Artic Base server adres in: - + %1 has been installed successfully. %1 is succesvol geïnstalleerd. - + Unable to open File Kan bestand niet openen - + Could not open %1 Kan %1 niet openen - + Installation aborted Installatie onderbroken - + The installation of %1 was aborted. Please see the log for more details De installatie van %1 is afgebroken. Zie het logboek voor meer details - + Invalid File Ongeldig bestand - + %1 is not a valid CIA %1 is geen geldige CIA - + CIA Encrypted - + Your CIA file is encrypted.<br/><a href='https://azahar-emu.org/blog/game-loading-changes/'>Please check our blog for more info.</a> - + Unable to find File Bestand niet gevonden - + Could not find %1 Kon %1 niet vinden - - - - Error compressing file + + + + + Z3DS Compression - - File compress operation failed, check log for details. + + Failed to compress some files, check log for details. - - - - Error decompressing file + + Failed to decompress some files, check log for details. - - File decompress operation failed, check log for details. + + All files have been compressed successfully. - + + All files have been decompressed successfully. + + + + Uninstalling '%1'... '%1' aan het verwijderen... - + Failed to uninstall '%1'. Kon niet '%1' verwijderen. - + Successfully uninstalled '%1'. '%1' succesvol verwijderd. - + File not found Bestand niet gevonden - + File "%1" not found Bestand "%1" niet gevonden - + Savestates Savestates - + Warning: Savestates are NOT a replacement for in-application saves, and are not meant to be reliable. Use at your own risk! - - - + + + Error opening amiibo data file Fout bij het openen van het amiibo databestand - + A tag is already in use. Er is al een tag in gebruik. - + Application is not looking for amiibos. - + Amiibo File (%1);; All Files (*.*) Amiibo Bestand (%1);; Alle Bestanden (*.*) - + Load Amiibo Laad Amiibo - + Unable to open amiibo file "%1" for reading. Kan amiibo-bestand "%1" niet openen om te worden gelezen. - + Record Movie Film opnemen - + Movie recording cancelled. Filmopname geannuleerd. - - + + Movie Saved Film Opgeslagen - - + + The movie is successfully saved. De film is met succes opgeslagen. - + Application will unpause - + The application will be unpaused, and the next frame will be captured. Is this okay? - + Invalid Screenshot Directory Ongeldige schermafbeeldmap - + Cannot create specified screenshot directory. Screenshot path is set back to its default value. Kan de opgegeven map voor schermafbeeldingen niet maken. Het pad voor schermafbeeldingen wordt teruggezet naar de standaardwaarde. - + Could not load video dumper Kan videodumper niet laden - + FFmpeg could not be loaded. Make sure you have a compatible version installed. To install FFmpeg to Azahar, press Open and select your FFmpeg directory. @@ -4649,274 +4675,264 @@ To view a guide on how to install FFmpeg, press Help. - - Load 3DS ROM File + + Load 3DS ROM Files - - 3DS ROM Files (*.cia *cci *3dsx *cxi) + + 3DS ROM Files (*.cia *.cci *.3dsx *.cxi) - - The selected file is not a compatible 3DS ROM format. Make sure you have chosen the right file, and that it is not encrypted. - - - - - The selected file is already compressed. - - - - + 3DS Compressed ROM File (*.%1) - + Save 3DS Compressed ROM File - - Load 3DS Compressed ROM File + + Select Output 3DS Compressed ROM Folder - + + Load 3DS Compressed ROM Files + + + + 3DS Compressed ROM Files (*.zcia *zcci *z3dsx *zcxi) - - The selected file is not a compatible compressed 3DS ROM format. Make sure you have chosen the right file. - - - - - The selected file is already decompressed. - - - - + 3DS ROM File (*.%1) - + Save 3DS ROM File - + + Select Output 3DS ROM Folder + + + + Select FFmpeg Directory Selecteer FFmpeg map - + The provided FFmpeg directory is missing %1. Please make sure the correct directory was selected. De opgegeven FFmpeg directory ontbreekt %1. Controleer of de juiste map is geselecteerd. - + FFmpeg has been sucessfully installed. FFmpeg is met succes geïnstalleerd. - + Installation of FFmpeg failed. Check the log file for details. Installatie van FFmpeg is mislukt. Controleer het logbestand voor meer informatie. - + Could not start video dumping.<br>Please ensure that the video encoder is configured correctly.<br>Refer to the log for details. - + Recording %1 Opname %1 - + Playing %1 / %2 Afspelen %1 / %2 - + Movie Finished Film Voltooid - + (Accessing SharedExtData) - + (Accessing SystemSaveData) - + (Accessing BossExtData) - + (Accessing ExtData) - + (Accessing SaveData) - + MB/s MB/s - + KB/s KB/s - + Artic Traffic: %1 %2%3 - + Speed: %1% Snelheid: %1% - + Speed: %1% / %2% Snelheid: %1% / %2% - + App: %1 FPS - + Frame: %1 ms (GPU: [CMD: %2 ms, SWP: %3 ms], IPC: %4 ms, SVC: %5 ms, Rem: %6 ms) - + Frame: %1 ms Frame: %1 ms - + VOLUME: MUTE VOLUME: STIL - + VOLUME: %1% Volume percentage (e.g. 50%) VOLUME: %1% - + %1 is missing. Please <a href='https://web.archive.org/web/20240304201103/https://citra-emu.org/wiki/dumping-system-archives-and-the-shared-fonts-from-a-3ds-console/'>dump your system archives</a>.<br/>Continuing emulation may result in crashes and bugs. - + A system archive Een systeemarchief - + System Archive Not Found Systeem archief niet gevonden - + System Archive Missing Systeemarchief ontbreekt - + Save/load Error Opslaan/Laad fout - + Fatal Error Fatale Fout - + A fatal error occurred. <a href='https://web.archive.org/web/20240228001712/https://community.citra-emu.org/t/how-to-upload-the-log-file/296'>Check the log</a> for details.<br/>Continuing emulation may result in crashes and bugs. - + Fatal Error encountered Fatale fout opgetreden - + Continue Doorgaan - + Quit Application - + OK OK - + Would you like to exit now? Wilt u nu afsluiten? - + The application is still running. Would you like to stop emulation? - + Playback Completed Afspelen voltooid - + Movie playback completed. Film afspelen voltooid. - + Update Available - + Update %1 for Azahar is available. Would you like to download it? - + Primary Window Primaire venster - + Secondary Window Secundair venster @@ -5022,239 +5038,254 @@ Would you like to download it? GameList - + IMPORTANT: Encrypted files and .3ds files are no longer supported. Decrypting and/or renaming to .cci may be necessary. <a href='https://azahar-emu.org/blog/game-loading-changes/'>Learn more.</a> - + Don't show again - - + + Compatibility Compatibiliteit - - + + Region Regio - - + + File type Bestandstype - - + + Size Grootte - - + + Play time Gespeelde tijd - + Favorite Favoriet - + + Eject Cartridge + + + + + Insert Cartridge + + + + Open Open - + Application Location Applicatie Locatie - + Save Data Location Opgeslagen Gegevens Locatie - + Extra Data Location Extra Gegevens Locatie - + Update Data Location Updategegevens Locatie - + DLC Data Location DLC Gegevens Locatie - + Texture Dump Location Textures Dump Locatie - + Custom Texture Location Aangepaste Textures Locatie - + Mods Location Mods Locatie - + Dump RomFS Dump RomFS - + Disk Shader Cache Schijf Shader-cache - + Open Shader Cache Location Shader-cache locatie openen - + Delete OpenGL Shader Cache OpenGL Shader-cache verwijderen - + Uninstall Verwijder - + Everything Alles - + Application - + Update Update - + DLC DLC - + Remove Play Time Data Verwijder Speeltijd Gegevens - + Create Shortcut Maak snelkoppeling - + Add to Desktop Voeg toe aan Bureaublad - + Add to Applications Menu Voeg to aan Applicatie Menu - + + Stress Test: App Launch + + + + Properties Eigenschappen - - - - + + + + Azahar - + Are you sure you want to completely uninstall '%1'? This will delete the application if installed, as well as any installed updates or DLC. - - + + %1 (Update) %1 (Update) - - + + %1 (DLC) %1 (DLC) - + Are you sure you want to uninstall '%1'? Weet u zeker dat u '%1' wilt verwijderen? - + Are you sure you want to uninstall the update for '%1'? Weet u zeker dat u de update voor '%1' wilt verwijderen? - + Are you sure you want to uninstall all DLC for '%1'? Weet u zeker dat u alle DLC voor '%1' wilt verwijderen? - + Scan Subfolders Scan Submappen - + Remove Application Directory - + Move Up Omhoog - + Move Down Omlaag - + Open Directory Location Open map Locatie - + Clear Wissen - + Name Naam @@ -5262,77 +5293,77 @@ This will delete the application if installed, as well as any installed updates GameListItemCompat - + Perfect Perfect - + App functions flawless with no audio or graphical glitches, all tested functionality works as intended without any workarounds needed. - + Great Geweldig - + App functions with minor graphical or audio glitches and is playable from start to finish. May require some workarounds. - + Okay Oké - + App functions with major graphical or audio glitches, but app is playable from start to finish with workarounds. - + Bad Slecht - + App functions, but with major graphical or audio glitches. Unable to progress in specific areas due to glitches even with workarounds. - + Intro/Menu Intro/Menu - + App is completely unplayable due to major graphical or audio glitches. Unable to progress past the Start Screen. - + Won't Boot Start Niet - + The app crashes when attempting to startup. - + Not Tested Niet Getest - + The app has not yet been tested. @@ -5340,7 +5371,7 @@ Screen. GameListPlaceholder - + Double-click to add a new folder to the application list @@ -5348,27 +5379,27 @@ Screen. GameListSearchField - + of van de - + result resultaat - + results resultaten - + Filter: Filter: - + Enter pattern to filter Patroon invoeren om te filteren @@ -5696,87 +5727,87 @@ Screen. Cyclus Index: - + SRC1: %1, %2, %3, %4 SRC1: %1, %2, %3, %4 - + SRC2: %1, %2, %3, %4 SRC2: %1, %2, %3, %4 - + SRC3: %1, %2, %3, %4 SRC3: %1, %2, %3, %4 - + DEST_IN: %1, %2, %3, %4 DEST_IN: %1, %2, %3, %4 - + DEST_OUT: %1, %2, %3, %4 DEST_OUT: %1, %2, %3, %4 - + Address Registers: %1, %2 Adres Registers: %1, %2 - + Compare Result: %1, %2 Vergelijkings-resultaten: %1, %2 - + Static Condition: %1 Statische Toestand: %1 - + Dynamic Conditions: %1, %2 Dynamische Toestand: %1, %2 - + Loop Parameters: %1 (repeats), %2 (initializer), %3 (increment), %4 Loop Parameters: %1 (Herhaaldelijk), %2 (Tot stand brengen), %3 (Ophoging), %4 - + Instruction offset: 0x%1 Instructie verspringing: 0x%1 - + -> 0x%2 -> 0x%2 - + (last instruction) (laatste instructie) @@ -6076,32 +6107,32 @@ Debug Message: Wachtwoord: - + Room Name Kamernaam - + Preferred Application - + Host Host - + Players Spelers - + Refreshing Vernieuwen - + Refresh List Lijst vernieuwen @@ -7103,32 +7134,32 @@ Misschien hebben ze de kamer verlaten. %1 (0x%2) - + Unsupported encrypted application - + Invalid region Ongeldige regio - + Installed Titles Geïnstalleerde titels - + System Titles Systeem titels - + Add New Application Directory - + Favorites Favorieten diff --git a/dist/languages/pl_PL.ts b/dist/languages/pl_PL.ts index a865ee2d9..bf065eb52 100644 --- a/dist/languages/pl_PL.ts +++ b/dist/languages/pl_PL.ts @@ -298,8 +298,8 @@ Spowodowałoby to zablokowanie zarówno nazwy użytkownika forum, jak i adresu I - Emulation: - Emulacja: + Emulation + Emulacja @@ -403,6 +403,7 @@ Spowodowałoby to zablokowanie zarówno nazwy użytkownika forum, jak i adresu I + Camera Kamera @@ -414,8 +415,8 @@ Spowodowałoby to zablokowanie zarówno nazwy użytkownika forum, jak i adresu I - Camera to configure: - Kamera do konfiguracji: + Camera to Configure + Konfiguracja Kamery @@ -435,8 +436,8 @@ Spowodowałoby to zablokowanie zarówno nazwy użytkownika forum, jak i adresu I - Camera mode: - Tryb kamery: + Camera mode + Tryb Kamery: @@ -456,8 +457,8 @@ Spowodowałoby to zablokowanie zarówno nazwy użytkownika forum, jak i adresu I - Camera position: - Położenie kamery: + Camera position + Pozycja Kamery @@ -482,8 +483,8 @@ Spowodowałoby to zablokowanie zarówno nazwy użytkownika forum, jak i adresu I - Camera Image Source: - Źródło Obrazu Kamery: + Camera Image Source + Źródło Obrazu Kamery @@ -502,8 +503,8 @@ Spowodowałoby to zablokowanie zarówno nazwy użytkownika forum, jak i adresu I - File: - Plik: + File + Plik @@ -516,11 +517,6 @@ Spowodowałoby to zablokowanie zarówno nazwy użytkownika forum, jak i adresu I Select the system camera to use Wybierz kamerę, której chcesz użyć - - - Camera: - Kamera: - <Default> @@ -534,8 +530,8 @@ Spowodowałoby to zablokowanie zarówno nazwy użytkownika forum, jak i adresu I - Flip: - Obrót: + Flip + Obrót @@ -1088,8 +1084,8 @@ Czy chcesz zignorować błąd i kontynuować? - Reverse Side by Side - Odwróć Obok Siebie + Side by Side Full Width + Obok Siebie na Pełną Szerokość @@ -1139,7 +1135,7 @@ Czy chcesz zignorować błąd i kontynuować? Disable Right Eye Rendering - Wyłącz renderowanie prawego oka + Wyłącz Renderowanie Prawego Oka @@ -1147,49 +1143,54 @@ Czy chcesz zignorować błąd i kontynuować? <html><head/><body><p>Wyłącza renderowanie prawego oka</p><p>Wyłącza renderowanie obrazu dla prawego oka, gdy nie jest używany tryb stereoskopowy. Znacznie poprawia wydajność w niektórych grach, ale w innych grach może powodować migotanie obrazu.</p></body></html> - + + Swap Eyes + Zamiana Oczu + + + Utility Narzędzia - + <html><head/><body><p>Replace textures with PNG files.</p><p>Textures are loaded from load/textures/[Title ID]/.</p></body></html> <html><head/><body><p>Zastępuje tekstury przez pliki PNG.</p><p>Tekstury są ładowane z pliku load/textures/[Title ID]/.</p></body></html> - - Use Custom Textures + + Use custom textures Użyj niestandardowych tekstur - + <html><head/><body><p>Dump textures to PNG files.</p><p>Textures are dumped to dump/textures/[Title ID]/.</p></body></html> <html><head/><body><p>Zrzuca tekstury do plików PNG.</p><p>Tekstury są zrzucane do pliku dump/textures/[Title ID]/.</p></body></html> - - Dump Textures + + Dump textures Zrzuć Tekstury - + <html><head/><body><p>Load all custom textures into memory on boot, instead of loading them when the application requires them.</p></body></html> <html><head/><body><p>Ładowanie wszystkich niestandardowych tekstur do pamięci podczas uruchamiania, zamiast ładowania ich, gdy wymaga tego aplikacja.</p></body></html> - - Preload Custom Textures - Wczytaj niestandardowe tekstury + + Preload custom textures + Wczytaj Customowe Tekstury - + <html><head/><body><p>Load custom textures asynchronously with background threads to reduce loading stutter</p></body></html> <html><head/><body><p>Załaduj niestandardowe tekstury asynchronicznie za pomocą wątków w tle, aby zmniejszyć opóźnienia w ładowaniu.</p></body></html> - - Async Custom Texture Loading - Asynchroniczne ładowanie własnych tekstur + + Async custom texture loading + Asynchroniczne ładowanie customowych tekstur @@ -1246,13 +1247,13 @@ Czy chcesz zignorować błąd i kontynuować? - Set emulation speed: - Ustaw prędkość emulacji: + Set emulation speed + Ustaw prędkość emulacji - Emulation Speed: - Szybkość emulowania: + Emulation Speed + Szybkość Emulacji @@ -1363,12 +1364,12 @@ Czy chcesz zignorować błąd i kontynuować? - SPIR-V Shader Generation + SPIR-V shader generation Generowanie shaderów SPIR-V - Disable GLSL -> SPIR-V Optimizer + Disable GLSL -> SPIR-V optimizer Wyłącz optymalizator GLSL -> SPIR-V @@ -1388,7 +1389,7 @@ Czy chcesz zignorować błąd i kontynuować? - Enable Hardware Shader + Enable hardware shader Aktywuj Shader Sprzętowy @@ -1398,7 +1399,7 @@ Czy chcesz zignorować błąd i kontynuować? - Accurate Multiplication + Accurate multiplication Dokładne Mnożenie @@ -1408,7 +1409,7 @@ Czy chcesz zignorować błąd i kontynuować? - Enable Shader JIT + Enable shader JIT Aktywuj Shader JIT @@ -1418,7 +1419,7 @@ Czy chcesz zignorować błąd i kontynuować? - Enable Async Shader Compilation + Enable async shader compilation Włącz asynchroniczną kompilację shaderów @@ -1428,7 +1429,7 @@ Czy chcesz zignorować błąd i kontynuować? - Enable Async Presentation + Enable async presentation Włącz rejestr asynchroniczną @@ -1468,7 +1469,7 @@ Czy chcesz zignorować błąd i kontynuować? - Use Disk Shader Cache + Use disk shader cache Użyj pamięci podręcznej shaderów na dysku @@ -1493,8 +1494,8 @@ Czy chcesz zignorować błąd i kontynuować? - Delay application render thread: - Opóźnienie renderowania wątku aplikacji: + Delay Application Render Thread + Opóźnij renderowanie wątku aplikacji: @@ -1982,12 +1983,12 @@ Czy chcesz zignorować błąd i kontynuować? - Swap Screens + Swap screens Zamień Ekrany - Rotate Screens Upright + Rotate screens upright Obróć ekrany w pozycji pionowej @@ -2104,8 +2105,8 @@ Czy chcesz zignorować błąd i kontynuować? - <html><head/><body><p>Bottom Screen Opacity % (OpenGL Only)</p></body></html> - <html><head/><body><p>% krycia dolnego ekranu (tylko OpenGL)</p></body></html> + <html><head/><body><p>Bottom Screen Opacity %</p></body></html> + <html><head/><body><p>krycia dolnego ekranu %</p></body></html> @@ -2452,7 +2453,7 @@ Czy chcesz zignorować błąd i kontynuować? - Use Virtual SD + Use virtual SD card Użyj Wirtualnej karty SD @@ -2462,8 +2463,8 @@ Czy chcesz zignorować błąd i kontynuować? - Use Custom Storage - Użyj niestandardowego przechowywania + Use custom storage location + Użyj customowej lokalizacji przechowywania @@ -2550,8 +2551,8 @@ funkcji online (jeśli są zainstalowane) - Region: - Region: + Region + Region @@ -2559,326 +2560,338 @@ funkcji online (jeśli są zainstalowane) Wybór automatyczny - + + Apply region free patch to +installed applications. + Zastosuj łatkę bez regionu +do zainstalowanych aplikacji. + + + + Patches the region of installed applications to be region free, so that they always appear on the home menu. + Naprawia region zainstalowanych aplikacji, aby były one wolne od ograniczeń regionalnych, dzięki czemu zawsze pojawiają się w menu głównym. + + + Username Nazwa Użytkownika - + Birthday Urodziny - + January Styczeń - + February Luty - + March Marzec - + April Kwiecień - + May Maj - + June Czerwiec - + July Lipiec - + August Sierpień - + September Wrzesień - + October Październik - + November Listopad - + December Grudzień - + Language Język - + Note: this can be overridden when region setting is auto-select Uwaga: może zostać nadpisane jeśli region jest ustawiony na "Wybór automatyczny" - + Japanese (日本語) Japoński (日本語) - + English Angielski (English) - + French (français) Francuzki (français) - + German (Deutsch) Niemiecki (Deutsch) - + Italian (italiano) Włoski (italiano) - + Spanish (español) Hiszpański (español) - + Simplified Chinese (简体中文) Chiński Uproszczony (简体中文) - + Korean (한국어) Koreański (한국어) - + Dutch (Nederlands) Niderlandzki (Nederlands) - + Portuguese (português) Portugalski (português) - + Russian (Русский) Rosyjski (Русский) - + Traditional Chinese (正體中文) Chiński Tradycyjny (正體中文) - + Sound output mode Tryb wyjścia dźwięku - + Mono Mono - + Stereo Stereo - + Surround Surround - + Country Kraj - + Clock Zegar - + System Clock Zegar Systemowy - + Fixed Time Stały Czas - + Startup time Czas Uruchomienia - + yyyy-MM-ddTHH:mm:ss yyyy-MM-ddTHH:mm:ss - + Offset time Przesunięcie czasu - + days dni - + HH:mm:ss HH:mm:ss - + Initial System Ticks Startowe tyknięcia systemu - + Random Losowe - + Fixed Naprawione - + Initial System Ticks Override Nadpisanie początkowych tyknięć systemu - + Play Coins Monety gry - + <html><head/><body><p>Number of steps per hour reported by the pedometer. Range from 0 to 65,535.</p></body></html> <html><head/><body><p>Liczba kroków na godzinę podawana przez krokomierz. Wartość może wynosić od 0 do 65,535. - + Pedometer Steps per Hour Liczba kroków krokomierza na godzinę - + Run System Setup when Home Menu is launched Uruchom ustawienia systemu po uruchomieniu Home Menu - + Console ID: ID konsoli: - - + + Regenerate Regeneruj - + MAC: MAC: - - 3GX Plugin Loader: - Moduł ładowania wtyczki 3GX: + + 3GX Plugin Loader + Wtyczka 3GX Loader - + Enable 3GX plugin loader Włącz ładowanie wtyczki 3GX - + Allow applications to change plugin loader state Zezwól aplikacjom na zmianę stanu programu ładującego wtyczki - + Real Console Unique Data Unikalne Dane Rzeczywistej Konsoli - + Your real console is linked to Azahar. Twoja rzeczywista konsola jest połączona z Azahar. - + Unlink Odłącz - + OTP OTP - - - - + + + + Choose Wybierz - + SecureInfo_A/B SecureInfo_A/B - + LocalFriendCodeSeed_A/B LocalFriendCodeSeed_A/B - + movable.sed movable.sed - + System settings are available only when applications is not running. Ustawienia systemowe są dostępne tylko wtedy, gdy aplikacja nie jest uruchomiona @@ -3588,76 +3601,76 @@ funkcji online (jeśli są zainstalowane) Plik sed (*.sed);;Wszystkie pliki (*.*) - - + + Console ID: 0x%1 ID konsoli: 0x%1 - - + + MAC: %1 MAC: %1 - + This will replace your current virtual 3DS console ID with a new one. Your current virtual 3DS console ID will not be recoverable. This might have unexpected effects in applications. This might fail if you use an outdated config save. Continue? To zastąpi twojego obecnego wirtualnego 3DS. Odzyskanie twojego obecnego 3DS będzie niemożliwe. To może spowodować niespodziewane efekty w aplikacjach. Operacja może się nie powieść jeżeli korzystasz z przestarzałej konfiguracji zapisów aplikacji. Kontynuować? - - - + + + Warning Ostrzeżenie - + This will replace your current MAC address with a new one. It is not recommended to do this if you got the MAC address from your real console using the setup tool. Continue? Spowoduje to zastąpienie bieżącego adresu MAC nowym. Nie zaleca się wykonywania tej czynności, jeśli adres MAC został uzyskany z rzeczywistej konsoli za pomocą narzędzia konfiguracyjnego. Kontynuować? - + This action will unlink your real console from Azahar, with the following consequences:<br><ul><li>Your OTP, SecureInfo and LocalFriendCodeSeed will be removed from Azahar.</li><li>Your friend list will reset and you will be logged out of your NNID/PNID account.</li><li>System files and eshop titles obtained through Azahar will become inaccessible until the same console is linked again (save data will not be lost).</li></ul><br>Continue? Ta czynność spowoduje odłączenie twojej rzeczywistej konsoli od Azahar, z następującymi konsekwencjami: <br><ul><li>Twój OTP, SecureInfo i LocalFriendCodeSeed zostaną usunięte z Azahar.</li><li>Lista znajomych zostanie zresetowana, a użytkownik zostanie wylogowany z konta NNID/PNID.</li><li>Pliki systemowe i tytuły z eshopu uzyskane za pośrednictwem Azahar staną się niedostępne do czasu ponownego połączenia z tą samą konsolą (dane zapisu nie zostaną utracone).</li></ul><br>Kontynuować? - + Invalid country for configured region Nieprawidłowy kraj dla skonfigurowanego regionu - + Invalid country for console unique data Nieprawidłowy kraj dla unikalnych danych konsoli - + Status: Loaded Status: Wczytano - + Status: Loaded (Invalid Signature) Status: Wczytano (Nieprawidłowy znak) - + Status: Loaded (Region Changed) Status: Załadowano (Zmieniono region) - + Status: Not Found Status: Nie znaleziono - + Status: Invalid Status: Nieprawidłowy - + Status: IO Error Status: Błąd IO @@ -3773,12 +3786,12 @@ Przeciągnij punkty, aby zmienić ich położenie lub kliknij dwukrotnie pola ta - Interface language: + Interface Language Język Interfejsu - Theme: + Theme Motyw: @@ -3788,7 +3801,7 @@ Przeciągnij punkty, aby zmienić ich położenie lub kliknij dwukrotnie pola ta - Icon Size: + Icon Size Rozmiar Ikony: @@ -3809,7 +3822,7 @@ Przeciągnij punkty, aby zmienić ich położenie lub kliknij dwukrotnie pola ta - Row 1 Text: + Row 1 Text Pierwszy wiersz tekstu: @@ -3844,17 +3857,17 @@ Przeciągnij punkty, aby zmienić ich położenie lub kliknij dwukrotnie pola ta - Row 2 Text: + Row 2 Text Drugi wiersz tekstu: - Hide Titles without Icon + Hide titles without icon Ukryj tytuły bez ikon - Single Line Mode + Single line mode Tryb jednoliniowy @@ -3864,7 +3877,7 @@ Przeciągnij punkty, aby zmienić ich położenie lub kliknij dwukrotnie pola ta - Show Advanced Frame Time Info + Show advanced frame time info Pokaż zaawansowane informacje o liczbie klatek @@ -3947,12 +3960,12 @@ Przeciągnij punkty, aby zmienić ich położenie lub kliknij dwukrotnie pola ta DirectConnectWindow - + Connecting Łączenie - + Connect Połączono @@ -4072,497 +4085,511 @@ Sprawdź instalację FFmpeg używaną do kompilacji. GMainWindow - + No Suitable Vulkan Devices Detected Nie wykryto odpowiednich urządzeń Vulkan - + Vulkan initialization failed during boot.<br/>Your GPU may not support Vulkan 1.1, or you do not have the latest graphics driver. Podczas uruchamiania systemu uruchamianie Vulkan nie powiodło się.<br/>Twój procesor graficzny może nie obsługiwać Vulkan 1.1 lub nie masz najnowszego sterownika graficznego. - + Current Artic traffic speed. Higher values indicate bigger transfer loads. Bieżąca prędkość ruchu Artic Base. Wyższe wartości oznaczają większe obciążenia transferowe. - - + + Current emulation speed. Values higher or lower than 100% indicate emulation is running faster or slower than a 3DS. Obecna szybkość emulacji. Wartości większe lub mniejsze niż 100 % oznaczają, że emulacja jest szybsza lub wolniejsza niż 3DS - - + + How many frames per second the app is currently displaying. This will vary from app to app and scene to scene. Jak wiele klatek na sekundę aplikacja wyświetla w tej chwili. Ta wartość będzie się różniła między aplikacji, jak również między scenami w aplikacji. - - + + Time taken to emulate a 3DS frame, not counting framelimiting or v-sync. For full-speed emulation this should be at most 16.67 ms. Czas potrzebny do emulacji klatki 3DS, nie zawiera limitowania klatek oraz v-sync. Dla pełnej prędkości emulacji, wartość nie powinna przekraczać 16.67 ms. - + MicroProfile (unavailable) MicroProfile (niedostępne) - + Clear Recent Files Wyczyść Ostatnio Używane - + &Continue &Kontynuuj - + &Pause &Wstrzymaj - + Azahar is running an application TRANSLATORS: This string is shown to the user to explain why Citra needs to prevent the computer from sleeping Azahar jest w trakcie uruchamiania aplikację - - + + Invalid App Format Nieprawidłowy format aplikacji - - + + Your app format is not supported.<br/>Please follow the guides to redump your <a href='https://web.archive.org/web/20240304210021/https://citra-emu.org/wiki/dumping-game-cartridges/'>game cartridges</a> or <a href='https://web.archive.org/web/20240304210011/https://citra-emu.org/wiki/dumping-installed-titles/'>installed titles</a>. Twój format aplikacji nie jest obsługiwany.<br/>Postępuj zgodnie z instrukcjami, aby ponownie zrzucić <a href='https://web.archive.org/web/20240304210021/https://citra-emu.org/wiki/dumping-game-cartridges/'>kartridże z grami</a> lub <a href='https://web.archive.org/web/20240304210011/https://citra-emu.org/wiki/dumping-installed-titles/'>zainstalowane tytuły</a>. - + App Corrupted Aplikacja jest uszkodzona - + Your app is corrupted. <br/>Please follow the guides to redump your <a href='https://web.archive.org/web/20240304210021/https://citra-emu.org/wiki/dumping-game-cartridges/'>game cartridges</a> or <a href='https://web.archive.org/web/20240304210011/https://citra-emu.org/wiki/dumping-installed-titles/'>installed titles</a>. Twoja aplikacja jest uszkodzona. <br/>Postępuj zgodnie z instrukcjami, aby ponownie zrzucić <a href='https://web.archive.org/web/20240304210021/https://citra-emu.org/wiki/dumping-game-cartridges/'>kartridże z grami</a> lub <a href='https://web.archive.org/web/20240304210011/https://citra-emu.org/wiki/dumping-installed-titles/'>zainstalowane tytuły</a>. - + App Encrypted Aplikacja jest zaszyfrowana - + Your app is encrypted. <br/><a href='https://azahar-emu.org/blog/game-loading-changes/'>Please check our blog for more info.</a> Twoja aplikacja jest zaszyfrowana. <br/><a href='https://azahar-emu.org/blog/game-loading-changes/'>Więcej informacji można znaleźć na naszym blogu.</a> - + Unsupported App Nieobsługiwana aplikacja - + GBA Virtual Console is not supported by Azahar. Wirtualnej konsola GBA nie są obsługiwana przez Azahar. - - + + Artic Server Serwer Artic - + + Invalid system mode + Nieprawidłowy moduł systemu + + + + New 3DS exclusive applications cannot be loaded without enabling the New 3DS mode. + Aplikacje dostępne wyłącznie na konsoli New 3DS nie mogą być uruchamiane bez włączenia trybu New 3DS. + + + Error while loading App! Błąd podczas ładowania aplikacji! - + An unknown error occurred. Please see the log for more details. Wystąpił nieznany błąd. Więcej informacji można znaleźć w logu. - + CIA must be installed before usage CIA musi być zainstalowana przed użyciem - + Before using this CIA, you must install it. Do you want to install it now? Przed użyciem CIA należy ją zainstalować. Czy chcesz zainstalować ją teraz? - + Quick Load Szybkie wczytywanie - + Quick Save Szybkie zapisywanie - - + + Slot %1 Slot %1 - + %2 %3 %2 %3 - + Quick Save - %1 Szybkie zapisywanie - %1 - + Quick Load - %1 Szybkie wczytywanie - %1 - + Slot %1 - %2 %3 Slot %1 - %2 %3 - + Error Opening %1 Folder Błąd podczas otwierania folderu %1 - - + + Folder does not exist! Folder nie istnieje! - + Remove Play Time Data Usuń dane czasu odtwarzania - + Reset play time? Zresetować czas gry? - - - - + + + + Create Shortcut Utwórz skrót - + Do you want to launch the application in fullscreen? Czy chcesz uruchomić aplikacje na pełnym ekranie? - + Successfully created a shortcut to %1 Pomyślnie utworzono skrót do %1 - + This will create a shortcut to the current AppImage. This may not work well if you update. Continue? Spowoduje to utworzenie skrótu do bieżącego obrazu aplikacji. Może to nie działać dobrze po aktualizacji. Kontynuować? - + Failed to create a shortcut to %1 Nie udało się utworzyć skrótu do %1 - + Create Icon Stwórz ikonę - + Cannot create icon file. Path "%1" does not exist and cannot be created. Nie można utworzyć pliku ikony. Ścieżka "%1" nie istnieje i nie można jej utworzyć. - + Dumping... Zrzucanie... - - + + Cancel Anuluj - - - - - - - - - + + + + + + + + + Azahar Azahar - + Could not dump base RomFS. Refer to the log for details. Nie można zrzucić podstawowego RomFS. Szczegółowe informacje można znaleźć w logu. - + Error Opening %1 Błąd podczas otwierania %1 - + Select Directory Wybierz Folder - + Properties Właściwości - + The application properties could not be loaded. Nie można wczytać właściwości aplikacji. - + 3DS Executable (%1);;All Files (*.*) %1 is an identifier for the 3DS executable file extensions. Pliki wykonywalne 3DS (%1);;Wszystkie pliki (*.*) - + Load File Załaduj Plik - - + + Set Up System Files Konfiguracja plików systemowych - + <p>Azahar needs console unique data and firmware files from a real console to be able to use some of its features.<br>Such files and data can be set up with the <a href=https://github.com/azahar-emu/ArticSetupTool>Azahar Artic Setup Tool</a><br>Notes:<ul><li><b>This operation will install console unique data to Azahar, do not share your user or nand folders<br>after performing the setup process!</b></li><li>While doing the setup process, Azahar will link to the console running the setup tool. You can unlink the<br>console later from the System tab in the emulator configuration menu.</li><li>Do not go online with both Azahar and your 3DS console at the same time after setting up system files,<br>as it could cause issues.</li><li>Old 3DS setup is needed for the New 3DS setup to work (doing both setup modes is recommended).</li><li>Both setup modes will work regardless of the model of the console running the setup tool.</li></ul><hr></p> <p>Azahar potrzebuje plików z rzeczywistej konsoli, aby móc korzystać z niektórych jej funkcji.<br>Możesz uzyskać te pliki za pomocą <a href=https://github.com/azahar-emu/ArticSetupTool>Azahar Artic Setup Tool</a><br>Uwagi:<ul><li><b>Ta operacja zainstaluje unikalne pliki konsoli do Azahar, nie udostępniaj swoich folderów użytkownika lub nand<br>po wykonaniu procesu konfiguracji!</b></li><li>Podczas procesu konfiguracji Azahar połączy się z konsolą, na której uruchomione jest narzędzie instalacyjne.<br>Konsolę można później odłączyć w zakładce System w menu konfiguracji emulatora.</li><li>Nie korzystaj jednocześnie z Azahar i konsoli 3DS po skonfigurowaniu plików systemowych,<br>bo może to spowodować błędy. </li><li>Old 3DS jest wymagany do działania konfiguracji New 3DS (zalecane jest wykonanie obu tych konfiguracji).</li><li>Oba tryby konfiguracji będą działać niezależnie od modelu konsoli, na której uruchomiono narzędzie konfiguracyjne.</li></ul><hr></p> - + Enter Azahar Artic Setup Tool address: Wprowadź adres narzędzia konfiguracyjnego Azahar Artic: - + <br>Choose setup mode: <br>Wybierz tryb konfiguracji: - + (ℹ️) Old 3DS setup (ℹ️) Konfiguracja Old 3DS - - + + Setup is possible. Konfiguracja jest możliwa. - + (⚠) New 3DS setup (⚠) Konfiguracja New 3DS - + Old 3DS setup is required first. Najpierw wymagana jest konfiguracja Old 3DS. - + (✅) Old 3DS setup (✅) Konfiguracja Old 3DS - - + + Setup completed. Konfiguracja została zakończona. - + (ℹ️) New 3DS setup (ℹ️) Konfiguracja New 3DS - + (✅) New 3DS setup (✅) Konfiguracja New 3DS - + The system files for the selected mode are already set up. Reinstall the files anyway? Pliki systemowe dla wybranego trybu są już skonfigurowane. Czy mimo to chcesz ponownie zainstalować pliki? - + Load Files Załaduj Pliki - + 3DS Installation File (*.cia *.zcia) Plik Instalacyjny 3DS (*.cia *.zcia) - - - + + + All Files (*.*) Wszystkie Pliki (*.*) - + Connect to Artic Base Połącz z Artic Base - + Enter Artic Base server address: Wprowadź adres serwera Artic Base: - + %1 has been installed successfully. %1 został poprawnie zainstalowany. - + Unable to open File Nie można otworzyć Pliku - + Could not open %1 Nie można otworzyć %1 - + Installation aborted Instalacja przerwana - + The installation of %1 was aborted. Please see the log for more details Instalacja %1 została przerwana. Sprawdź logi, aby uzyskać więcej informacji. - + Invalid File Niepoprawny Plik - + %1 is not a valid CIA %1 nie jest prawidłowym plikiem CIA - + CIA Encrypted Plik CIA jest zaszyfrowany - + Your CIA file is encrypted.<br/><a href='https://azahar-emu.org/blog/game-loading-changes/'>Please check our blog for more info.</a> Twój plik CIA jest zaszyfrowany.<br/><a href='https://azahar-emu.org/blog/game-loading-changes/'>Więcej informacji można znaleźć na naszym blogu.</a> - + Unable to find File Nie można odnaleźć pliku - + Could not find %1 Nie można odnaleźć %1 - - - - Error compressing file - Błąd podczas kompresowania pliku + + + + + Z3DS Compression + Kompresuj pliki Z3DS - - File compress operation failed, check log for details. - Kompresja pliku nie powiodła się, sprawdź szczegóły w logu. + + Failed to compress some files, check log for details. + Nie udało się skompresować niektórych plików, sprawdź log, aby uzyskać szczegółowe informacje. - - - - Error decompressing file - Błąd podczas dekompresji pliku + + Failed to decompress some files, check log for details. + Nie udało się rozpakować niektórych plików. Szczegółowe informacje można znaleźć w logu. - - File decompress operation failed, check log for details. - Dekompresja pliku nie powiodła się, sprawdź szczegóły w logu. + + All files have been compressed successfully. + Wszystkie pliki zostały pomyślnie skompresowane. - + + All files have been decompressed successfully. + Wszystkie pliki zostały pomyślnie zdekompresowane. + + + Uninstalling '%1'... Odinstalowywanie '%1'... - + Failed to uninstall '%1'. Nie udało się odinstalować '%1'. - + Successfully uninstalled '%1'. Pomyślnie odinstalowano '%1'. - + File not found Nie znaleziono pliku - + File "%1" not found Nie znaleziono pliku "%1" - + Savestates Savestate.y - + Warning: Savestates are NOT a replacement for in-application saves, and are not meant to be reliable. Use at your own risk! @@ -4571,86 +4598,86 @@ Use at your own risk! Używaj na własne ryzyko! - - - + + + Error opening amiibo data file Błąd podczas otwierania pliku danych amiibo - + A tag is already in use. Tag jest już używany. - + Application is not looking for amiibos. Aplikacja nie szuka amiibo. - + Amiibo File (%1);; All Files (*.*) Plik Amiibo (%1);; Wszystkie pliki (*.*) - + Load Amiibo Załaduj Amiibo - + Unable to open amiibo file "%1" for reading. Nie można otworzyć pliku amiibo "%1" do odczytu. - + Record Movie Nagraj Film - + Movie recording cancelled. Nagrywanie zostało przerwane. - - + + Movie Saved Zapisano Film - - + + The movie is successfully saved. Film został poprawnie zapisany. - + Application will unpause Aplikacja zostanie wstrzymana - + The application will be unpaused, and the next frame will be captured. Is this okay? Aplikacja zostanie zatrzymana, a następna klatka zostanie przechwycona. Czy jest to w porządku? - + Invalid Screenshot Directory Nieprawidłowy katalog zrzutów ekranu - + Cannot create specified screenshot directory. Screenshot path is set back to its default value. Nie można utworzyć określonego katalogu zrzutów ekranu. Ścieżka zrzutu ekranu zostanie przywrócona do wartości domyślnej. - + Could not load video dumper Nie można załadować zrzutu filmu - + FFmpeg could not be loaded. Make sure you have a compatible version installed. To install FFmpeg to Azahar, press Open and select your FFmpeg directory. @@ -4663,275 +4690,265 @@ Aby zainstalować FFmpeg do Azahar, naciśnij Otwórz i wybierz katalog FFmpeg. Aby wyświetlić poradnik dotyczący instalacji FFmpeg, naciśnij Pomoc. - - Load 3DS ROM File - Załaduj plik ROMu 3DS + + Load 3DS ROM Files + Załaduj pliki ROMów 3DS - - 3DS ROM Files (*.cia *cci *3dsx *cxi) - Pliki ROMów 3DS (*.cia *cci *3dsx *cxi) + + 3DS ROM Files (*.cia *.cci *.3dsx *.cxi) + Pliki ROMów 3DS (*.cia *.cci *.3dsx *.cxi) - - The selected file is not a compatible 3DS ROM format. Make sure you have chosen the right file, and that it is not encrypted. - Wybrany plik nie jest kompatybilny z formatem ROMu 3DS. Upewnij się, że wybrałeś właściwy plik i że nie jest zaszyfrowany. - - - - The selected file is already compressed. - Wybrany plik jest już skompresowany. - - - + 3DS Compressed ROM File (*.%1) Skompresowany plik ROMu 3DS (*.%1) - + Save 3DS Compressed ROM File Zapisz skompresowany plik ROMu 3DS - - Load 3DS Compressed ROM File - Wczytaj skompresowany plik ROMu 3DS + + Select Output 3DS Compressed ROM Folder + Wybierz folder wyjściowy skompresowanych plików ROMów 3DS - + + Load 3DS Compressed ROM Files + Wczytaj skompresowane pliki ROMów 3DS + + + 3DS Compressed ROM Files (*.zcia *zcci *z3dsx *zcxi) Skompresowane pliki ROMów 3DS (*.zcia *zcci *z3dsx *zcxi) - - The selected file is not a compatible compressed 3DS ROM format. Make sure you have chosen the right file. - Wybrany plik nie jest kompatybilny ze skompresowanym formatem ROMu 3DS. Upewnij się, że wybrałeś właściwy plik. - - - - The selected file is already decompressed. - Wybrany plik jest już zdekompresowany. - - - + 3DS ROM File (*.%1) Plik ROMu 3DS (*.%1) - + Save 3DS ROM File Zapisz plik ROMu 3DS - + + Select Output 3DS ROM Folder + Wybierz folder wyjściowy ROMów 3DS + + + Select FFmpeg Directory Wybierz katalog FFmpeg - + The provided FFmpeg directory is missing %1. Please make sure the correct directory was selected. W podanym katalogu FFmpeg brakuje %1. Upewnij się, że wybrany został poprawny katalog. - + FFmpeg has been sucessfully installed. FFmpeg został pomyślnie zainstalowany. - + Installation of FFmpeg failed. Check the log file for details. Instalacja FFmpeg nie powiodła się. Sprawdź plik dziennika, aby uzyskać szczegółowe informacje. - + Could not start video dumping.<br>Please ensure that the video encoder is configured correctly.<br>Refer to the log for details. Nie można uruchomić zrzutu filmu.<br>Upewnij się, że koder filmu jest poprawnie skonfigurowany.<br>Szczegółowe informacje można znaleźć w logu. - + Recording %1 Nagrywanie %1 - + Playing %1 / %2 Odtwarzanie %1 / %2 - + Movie Finished Film ukończony - + (Accessing SharedExtData) (Uzyskiwanie dostępu do SharedExtData) - + (Accessing SystemSaveData) (Uzyskiwanie dostępu do SystemSaveData) - + (Accessing BossExtData) (Uzyskiwanie dostępu do BossExtData) - + (Accessing ExtData) (Uzyskiwanie dostępu do ExtData) - + (Accessing SaveData) (Uzyskiwanie dostępu do SaveData) - + MB/s MB/s - + KB/s KB/s - + Artic Traffic: %1 %2%3 Ruch Artic: %1 %2%3 - + Speed: %1% Prędkość: %1% - + Speed: %1% / %2% Prędkość: %1% / %2% - + App: %1 FPS Aplikacja: %1 FPS - + Frame: %1 ms (GPU: [CMD: %2 ms, SWP: %3 ms], IPC: %4 ms, SVC: %5 ms, Rem: %6 ms) Klatka: %1 ms (GPU: [CMD: %2 ms, SWP: %3 ms], IPC: %4 ms, SVC: %5 ms, Rem: %6 ms) - + Frame: %1 ms Klatka: %1 ms - + VOLUME: MUTE GŁOŚNOŚĆ: WYCISZONA - + VOLUME: %1% Volume percentage (e.g. 50%) GŁOŚNOŚĆ: %1% - + %1 is missing. Please <a href='https://web.archive.org/web/20240304201103/https://citra-emu.org/wiki/dumping-system-archives-and-the-shared-fonts-from-a-3ds-console/'>dump your system archives</a>.<br/>Continuing emulation may result in crashes and bugs. Brakuje %1. Prosimy o <a href='https://web.archive.org/web/20240304201103/https://citra-emu.org/wiki/dumping-system-archives-and-the-shared-fonts-from-a-3ds-console/'>zrzucenie archiwów systemowych</a>.<br/>Dalsze korzystanie z emulacji może spowodować awarie i błędy. - + A system archive Archiwum systemu - + System Archive Not Found Archiwum Systemowe nie zostało odnalezione - + System Archive Missing Brak archiwum systemu - + Save/load Error Błąd zapisywania/wczytywania - + Fatal Error Krytyczny Błąd - + A fatal error occurred. <a href='https://web.archive.org/web/20240228001712/https://community.citra-emu.org/t/how-to-upload-the-log-file/296'>Check the log</a> for details.<br/>Continuing emulation may result in crashes and bugs. Wystąpił krytyczny błąd. <a href='https://web.archive.org/web/20240228001712/https://community.citra-emu.org/t/how-to-upload-the-log-file/296'>Sprawdź szczegóły w logu</a>.<br/>Dalsze korzystanie z emulacji może spowodować awarie i błędy. - + Fatal Error encountered Wystąpił błąd krytyczny - + Continue Kontynuuj - + Quit Application Wyjdź z aplikacji - + OK OK - + Would you like to exit now? Czy chcesz teraz wyjść? - + The application is still running. Would you like to stop emulation? Aplikacja jest nadal uruchomiona. Czy chcesz przerwać emulację? - + Playback Completed Odtwarzanie Zakończone - + Movie playback completed. Odtwarzanie filmu zostało zakończone. - + Update Available Dostępna jest aktualizacja - + Update %1 for Azahar is available. Would you like to download it? Aktualizacja %1 dla Azahar jest dostępna. Czy chcesz ją pobrać? - + Primary Window Główne okno - + Secondary Window Dodatkowe okno @@ -5037,175 +5054,190 @@ Czy chcesz ją pobrać? GameList - + IMPORTANT: Encrypted files and .3ds files are no longer supported. Decrypting and/or renaming to .cci may be necessary. <a href='https://azahar-emu.org/blog/game-loading-changes/'>Learn more.</a> WAŻNE: Zaszyfrowane pliki i pliki .3ds nie są już obsługiwane. Konieczne może być odszyfrowanie i/lub zmiana nazwy pliku na .cci. <a href='https://azahar-emu.org/blog/game-loading-changes/'>Więcej informacji.</a> - + Don't show again Nie pokazuj tego ponownie - - + + Compatibility Kompatybilność - - + + Region Region - - + + File type Typ pliku - - + + Size Rozmiar - - + + Play time Czas gry - + Favorite Ulubione - + + Eject Cartridge + Wyjmij Kartridż + + + + Insert Cartridge + Włóż Kartridż + + + Open Otwórz - + Application Location Lokalizacja aplikacji - + Save Data Location Lokalizacja zapisywanych danych - + Extra Data Location Lokalizacja dodatkowych danych - + Update Data Location Zaktualizuj lokalizację danych - + DLC Data Location Lokalizacja danych DLC - + Texture Dump Location Lokalizacja zrzutu tekstur - + Custom Texture Location Lokalizacja niestandardowych tekstur - + Mods Location Lokalizacja modów - + Dump RomFS Zrzuć RomFS - + Disk Shader Cache Pamięć podręczna shaderów na dysku - + Open Shader Cache Location Otwórz lokalizację pamięci podręcznej shaderów - + Delete OpenGL Shader Cache Usuń pamięć podręczną shaderów OpenGL - + Uninstall Odinstaluj - + Everything Wszystko - + Application Aplikacja - + Update Aktualizacje - + DLC DLC - + Remove Play Time Data Usuń dane czasu gry - + Create Shortcut Utwórz skrót - + Add to Desktop Dodaj do pulpitu - + Add to Applications Menu Dodaj do menu aplikacji - + + Stress Test: App Launch + Analiza wydajnościowa: uruchomienie aplikacji + + + Properties Właściwości - - - - + + + + Azahar Azahar - + Are you sure you want to completely uninstall '%1'? This will delete the application if installed, as well as any installed updates or DLC. @@ -5214,64 +5246,64 @@ This will delete the application if installed, as well as any installed updates Spowoduje to usunięcie aplikacji, jeśli jest zainstalowana, a także wszelkich zainstalowanych aktualizacji lub DLC. - - + + %1 (Update) %1 (Aktualizacja) - - + + %1 (DLC) %1 (DLC) - + Are you sure you want to uninstall '%1'? Czy na pewno chcesz odinstalować '%1'? - + Are you sure you want to uninstall the update for '%1'? Czy na pewno chcesz odinstalować aktualizacje '%1'? - + Are you sure you want to uninstall all DLC for '%1'? Czy na pewno chcesz odinstalować DLC '%1'? - + Scan Subfolders Przeszukaj Podkatalogi - + Remove Application Directory Usuń Katalog Aplikacji - + Move Up Przesuń w górę - + Move Down Przesuń w dół - + Open Directory Location Otwórz lokalizację katalogu - + Clear Wyczyść - + Name Nazwa @@ -5279,82 +5311,82 @@ Spowoduje to usunięcie aplikacji, jeśli jest zainstalowana, a także wszelkich GameListItemCompat - + Perfect Idealna - + App functions flawless with no audio or graphical glitches, all tested functionality works as intended without any workarounds needed. Aplikacja działa bez zarzutu, bez błędów graficznych lub dźwiękowych. Nie potrzebuje żadnych obejść ani poprawek. - + Great Świetna - + App functions with minor graphical or audio glitches and is playable from start to finish. May require some workarounds. Aplikacja działa z pomniejszymi błędami dźwiękowymi lub graficznymi, jest grywalna od początku do końca. Może wymagać kilku obejść/poprawek. - + Okay W porządku - + App functions with major graphical or audio glitches, but app is playable from start to finish with workarounds. Aplikacja działa z większymi błędami dźwiękowymi lub graficznymi, ale jest grywalna od początku do końca. Może wymagać kilku obejść/poprawek. - + Bad Zła - + App functions, but with major graphical or audio glitches. Unable to progress in specific areas due to glitches even with workarounds. Gra działa z większymi błędami dźwiękowymi lub graficznymi. Niemożliwe jest przejście konkretnych miejsc nawet z obejściami. - + Intro/Menu Intro/Menu - + App is completely unplayable due to major graphical or audio glitches. Unable to progress past the Start Screen. Gra jest całkowicie niegrywalna z uwagi na poważne błędy graficzne lub dźwiękowe. Działa jedynie ekran startowy. - + Won't Boot Nie uruchamia się - + The app crashes when attempting to startup. Aplikacja zawiesza się przy próbie uruchomienia - + Not Tested Nieprzetestowana - + The app has not yet been tested. Aplikacja nie została jeszcze przetestowana. @@ -5362,7 +5394,7 @@ Działa jedynie ekran startowy. GameListPlaceholder - + Double-click to add a new folder to the application list Kliknij dwukrotnie, aby dodać nowy folder do listy aplikacji. @@ -5370,27 +5402,27 @@ Działa jedynie ekran startowy. GameListSearchField - + of z - + result wynik - + results wyniki - + Filter: Filtr: - + Enter pattern to filter Wprowadź wzór filtra @@ -5718,87 +5750,87 @@ Działa jedynie ekran startowy. Indeks Cyklu: - + SRC1: %1, %2, %3, %4 SRC1: %1, %2, %3, %4 - + SRC2: %1, %2, %3, %4 SRC2: %1, %2, %3, %4 - + SRC3: %1, %2, %3, %4 SRC3: %1, %2, %3, %4 - + DEST_IN: %1, %2, %3, %4 DEST_IN: %1, %2, %3, %4 - + DEST_OUT: %1, %2, %3, %4 DEST_OUT: %1, %2, %3, %4 - + Address Registers: %1, %2 Adresy Rejestrów: %1, %2 - + Compare Result: %1, %2 Porównanie Wyników: %1, %2 - + Static Condition: %1 Warunek Statyczny: %1 - + Dynamic Conditions: %1, %2 Warunki Dynamiczne: %1, %2 - + Loop Parameters: %1 (repeats), %2 (initializer), %3 (increment), %4 Parametry Pętli: %1 (powtórzeń), %2 (inicjacji), %3 (inkrementacji), %4 - + Instruction offset: 0x%1 Przesunięcie Instrukcji: 0x%1 - + -> 0x%2 -> 0x%2 - + (last instruction) (ostatnia instrukcja) @@ -6099,32 +6131,32 @@ Komunikat debugowania: Hasło: - + Room Name Nazwa Pokoju - + Preferred Application Preferowana aplikacja - + Host Gospodarz - + Players Graczy - + Refreshing Odświeżanie - + Refresh List Odśwież Listę @@ -7126,32 +7158,32 @@ Możliwe, że opuścił pokój. %1 (0x%2) - + Unsupported encrypted application Nieobsługiwana zaszyfrowana aplikacja - + Invalid region Nieprawidłowy region - + Installed Titles Zainstalowane Gry - + System Titles Tytuły systemowe - + Add New Application Directory Dodaj nowy katalog aplikacji - + Favorites Ulubione diff --git a/dist/languages/pt_BR.ts b/dist/languages/pt_BR.ts index 3f246fee3..be0351091 100644 --- a/dist/languages/pt_BR.ts +++ b/dist/languages/pt_BR.ts @@ -29,7 +29,7 @@ <html><head/><body><p><img src=":/icons/default/256x256/azahar.png"/></p></body></html> - + <html><head/><body><p><img src=":/icons/default/256x256/azahar.png"/></p></body></html> @@ -298,8 +298,8 @@ Esta ação banirá tanto o seu nome de usuário do fórum como o seu endereço - Emulation: - Emulação: + Emulation + Emulação @@ -403,6 +403,7 @@ Esta ação banirá tanto o seu nome de usuário do fórum como o seu endereço + Camera Câmera @@ -414,8 +415,8 @@ Esta ação banirá tanto o seu nome de usuário do fórum como o seu endereço - Camera to configure: - Câmera a configurar: + Camera to Configure + Câmera a configurar @@ -435,8 +436,8 @@ Esta ação banirá tanto o seu nome de usuário do fórum como o seu endereço - Camera mode: - Modo de câmera: + Camera mode + Modo da câmera @@ -456,8 +457,8 @@ Esta ação banirá tanto o seu nome de usuário do fórum como o seu endereço - Camera position: - Posição da câmera: + Camera position + Posição da câmera @@ -482,8 +483,8 @@ Esta ação banirá tanto o seu nome de usuário do fórum como o seu endereço - Camera Image Source: - Origem da imagem da câmera: + Camera Image Source + Origem da imagem da camêra @@ -502,8 +503,8 @@ Esta ação banirá tanto o seu nome de usuário do fórum como o seu endereço - File: - Arquivo: + File + Arquivo @@ -516,11 +517,6 @@ Esta ação banirá tanto o seu nome de usuário do fórum como o seu endereço Select the system camera to use Selecione o tipo de câmera a ser utilizado - - - Camera: - Câmera: - <Default> @@ -534,8 +530,8 @@ Esta ação banirá tanto o seu nome de usuário do fórum como o seu endereço - Flip: - Espelhar imagem: + Flip + Flip @@ -1024,7 +1020,7 @@ Gostaria de ignorar o erro e continuar? Enable Linear Filtering - Ativar filtragem linear + Ativar Filtragem Linear @@ -1088,8 +1084,8 @@ Gostaria de ignorar o erro e continuar? - Reverse Side by Side - Inverter Lado a Lado + Side by Side Full Width + Lado a Lado (Largura Total) @@ -1139,7 +1135,7 @@ Gostaria de ignorar o erro e continuar? Disable Right Eye Rendering - Desativar a renderização do olho direito + Desativar Renderização do Olho Direito @@ -1147,49 +1143,54 @@ Gostaria de ignorar o erro e continuar? <html><head/><body><p>Desativar a Renderização do Olho Direito</p><p>Desativa a renderização da imagem do olho direito quanto não estiver usando o modo. Melhora muito o desempenho em alguns aplicativos, mas pode causar piscadas em outros.</p></body></html> - + + Swap Eyes + Inverter Olhos + + + Utility Utilidade - + <html><head/><body><p>Replace textures with PNG files.</p><p>Textures are loaded from load/textures/[Title ID]/.</p></body></html> <html><head/><body><p>Substitui as texturas por arquivos PNG.</p><p>As texturas são carregadas a partir de load/textures/[ID do título]/.</p></body></html> - - Use Custom Textures + + Use custom textures Usar texturas personalizadas - + <html><head/><body><p>Dump textures to PNG files.</p><p>Textures are dumped to dump/textures/[Title ID]/.</p></body></html> <html><head/><body><p>Extrai as texturas em arquivos PNG.</p><p>As texturas são extraídas para dump/textures/[ID do título]/.</p></body></html> - - Dump Textures + + Dump textures Extrair texturas - + <html><head/><body><p>Load all custom textures into memory on boot, instead of loading them when the application requires them.</p></body></html> <html><head/><body><p>Carregar todas as texturas personalizadas na memória ao iniciar, em vez de carregá-las apenas quando o aplicativo exigir.</p></body></html> - - Preload Custom Textures + + Preload custom textures Pré-carregar texturas personalizadas - + <html><head/><body><p>Load custom textures asynchronously with background threads to reduce loading stutter</p></body></html> <html><head/><body><p>Carregue texturas personalizadas de maneira assíncrona com threads em segundo plano para reduzir o stutter do carregamento</p></body></html> - - Async Custom Texture Loading - Carregamento Assíncrono de Textura Personalizada + + Async custom texture loading + Carregamento assíncrono de texturas personalizadas @@ -1246,13 +1247,13 @@ Gostaria de ignorar o erro e continuar? - Set emulation speed: - Definir velocidade da emulação: + Set emulation speed + Definir velocidade de emulação - Emulation Speed: - Velocidade da emulação: + Emulation Speed + Velocidade de Emulação @@ -1363,13 +1364,13 @@ Gostaria de ignorar o erro e continuar? - SPIR-V Shader Generation - Geração de Sombreadores SPIR-V + SPIR-V shader generation + Geração de shaders SPIR-V - Disable GLSL -> SPIR-V Optimizer - Desativar GLSL -> Otimizador de SPIR-V + Disable GLSL -> SPIR-V optimizer + Desativar o otimizador GLSL → SPIR-V @@ -1388,8 +1389,8 @@ Gostaria de ignorar o erro e continuar? - Enable Hardware Shader - Ativar shaders via hardware + Enable hardware shader + Ativar shader por hardware @@ -1398,7 +1399,7 @@ Gostaria de ignorar o erro e continuar? - Accurate Multiplication + Accurate multiplication Multiplicação precisa @@ -1408,8 +1409,8 @@ Gostaria de ignorar o erro e continuar? - Enable Shader JIT - Ativar JIT para shaders + Enable shader JIT + Ativar compilação assíncrona de shaders @@ -1418,8 +1419,8 @@ Gostaria de ignorar o erro e continuar? - Enable Async Shader Compilation - Ativar a compilação assíncrona de shaders + Enable async shader compilation + Ativar compilação assíncrona de shaders @@ -1428,7 +1429,7 @@ Gostaria de ignorar o erro e continuar? - Enable Async Presentation + Enable async presentation Ativar apresentação assíncrona @@ -1468,7 +1469,7 @@ Gostaria de ignorar o erro e continuar? - Use Disk Shader Cache + Use disk shader cache Usar cache de shaders em disco @@ -1493,8 +1494,8 @@ Gostaria de ignorar o erro e continuar? - Delay application render thread: - Atrasar thread de renderização do aplicativo: + Delay Application Render Thread + Atrasar Thread de Renderização da Aplicação @@ -1982,13 +1983,13 @@ Gostaria de ignorar o erro e continuar? - Swap Screens - Trocar Telas + Swap screens + Trocar telas - Rotate Screens Upright - Girar Verticalmente + Rotate screens upright + Rotacionar telas para a posição vertical @@ -2104,8 +2105,8 @@ Gostaria de ignorar o erro e continuar? - <html><head/><body><p>Bottom Screen Opacity % (OpenGL Only)</p></body></html> - <html><head/><body><p>% de Opacidade da Tela Inferior (Apenas OpenGL)</p></body></html> + <html><head/><body><p>Bottom Screen Opacity %</p></body></html> + <html><head/><body><p>Opacidade da tela inferior %</p></body></html> @@ -2277,7 +2278,7 @@ Gostaria de ignorar o erro e continuar? <a href='https://web.archive.org/web/20240301211230/https://citra-emu.org/wiki/using-a-controller-or-android-phone-for-motion-or-touch-input'><span style="text-decoration: underline; color:#039be5;">Learn More</span></a> - + <a href='https://web.archive.org/web/20240301211230/https://citra-emu.org/wiki/using-a-controller-or-android-phone-for-motion-or-touch-input'><span style="text-decoration: underline; color:#039be5;">Saiba Mais</span></a> @@ -2452,8 +2453,8 @@ Gostaria de ignorar o erro e continuar? - Use Virtual SD - Usar SD virtual + Use virtual SD card + Usar cartão SD virtual @@ -2462,7 +2463,7 @@ Gostaria de ignorar o erro e continuar? - Use Custom Storage + Use custom storage location Usar armazenamento personalizado @@ -2496,12 +2497,12 @@ Gostaria de ignorar o erro e continuar? Compress installed CIA content - + Comprimir conteúdo CIA instalado Compresses the content of CIA files when installed to the emulated SD card. Only affects CIA content which is installed while the setting is enabled. - + Comprime o conteúdo dos arquivos CIA ao serem instalados no cartão SD emulado. Afeta apenas o conteúdo CIA instalado enquanto a opção estiver ativada. @@ -2550,8 +2551,8 @@ os recursos online (se instalado) - Region: - Região: + Region + Região @@ -2559,326 +2560,337 @@ os recursos online (se instalado) Seleção automática - + + Apply region free patch to +installed applications. + Aplicar patch de região livre os apps instalados. + + + + Patches the region of installed applications to be region free, so that they always appear on the home menu. + Aplica um patch de região livre aos aplicativos instalados, para que eles sempre apareçam no menu inicial. + + + Username Nome de usuário - + Birthday Aniversário - + January Janeiro - + February Fevereiro - + March Março - + April Abril - + May Maio - + June Junho - + July Julho - + August Agosto - + September Setembro - + October Outubro - + November Novembro - + December Dezembro - + Language Idioma - + Note: this can be overridden when region setting is auto-select Nota: isso pode ser ignorado quando a configuração de região for seleção automática - + Japanese (日本語) Japonês (日本語) - + English Inglês (English) - + French (français) Francês (français) - + German (Deutsch) Alemão (Deutsch) - + Italian (italiano) Italiano (italiano) - + Spanish (español) Espanhol (español) - + Simplified Chinese (简体中文) Chinês simplificado (简体中文) - + Korean (한국어) Coreano (한국어) - + Dutch (Nederlands) Neerlandês (Nederlands) - + Portuguese (português) Português (Português) - + Russian (Русский) Russo (Русский) - + Traditional Chinese (正體中文) Chinês tradicional (正體中文) - + Sound output mode Modo de saída de som - + Mono Mono - + Stereo Estéreo - + Surround Surround - + Country País - + Clock Relógio - + System Clock Relógio do sistema - + Fixed Time Horário fixo - + Startup time Horário na inicialização - + yyyy-MM-ddTHH:mm:ss yyyy-MM-ddTHH:mm:ss - + Offset time Tempo de deslocamento - + days dias - + HH:mm:ss HH:mm:ss - + Initial System Ticks Ticks Iniciais do Sistema - + Random Aleatório - + Fixed Fixado - + Initial System Ticks Override Substituição Inicial de Ticks do Sistema - + Play Coins Moedas de Jogo - + <html><head/><body><p>Number of steps per hour reported by the pedometer. Range from 0 to 65,535.</p></body></html> <html><head/><body><p>Número de passos por hora relatados pelo pedômetro. Na faixa de 0 a 65.535.</p></body></html> - + Pedometer Steps per Hour Passos do Pedômetro por Hora - + Run System Setup when Home Menu is launched Executar configuração do sistema quando o Menu Inicial for aberto - + Console ID: ID do console: - - + + Regenerate Gerar um novo - + MAC: MAC: - - 3GX Plugin Loader: - Carregador do plug-in 3GX: + + 3GX Plugin Loader + Carregador de Plugins 3GX - + Enable 3GX plugin loader Ativar carregador do plug-in 3GX - + Allow applications to change plugin loader state Permitir que os aplicativos alterem o estado do carregador de plug-ins - + Real Console Unique Data Dados exclusivos do console real - + Your real console is linked to Azahar. Seu console real está vinculado ao Azahar. - + Unlink Desvincular - + OTP OTP - - - - + + + + Choose Escolha - + SecureInfo_A/B SecureInfo_A/B - + LocalFriendCodeSeed_A/B LocalFriendCodeSeed_A/B - + movable.sed movable.sed - + System settings are available only when applications is not running. As configurações do sistema só estarão disponíveis quando nenhum aplicativo estiver em execução. @@ -3588,76 +3600,76 @@ os recursos online (se instalado) Arquivo sed (*.sed);;Todos os arquivos (*.*) - - + + Console ID: 0x%1 ID do console: 0x%1 - - + + MAC: %1 MAC: %1 - + This will replace your current virtual 3DS console ID with a new one. Your current virtual 3DS console ID will not be recoverable. This might have unexpected effects in applications. This might fail if you use an outdated config save. Continue? Isso substituirá seu ID do console 3DS virtual atual por um novo. Seu ID do console 3DS virtual atual não poderá ser recuperado. Isso pode ter efeitos inesperados nos aplicativos. Poderão ocorrer falhas ao usar um arquivo salvo de configuração desatualizado. Deseja continuar? - - - + + + Warning Alerta - + This will replace your current MAC address with a new one. It is not recommended to do this if you got the MAC address from your real console using the setup tool. Continue? Isto substituirá seu endereço MAC atual por um novo. Não é recomendado fazer isso se você possuir o endereço MAC do seu console real usando esta ferramenta de configuração. Deseja continuar? - + This action will unlink your real console from Azahar, with the following consequences:<br><ul><li>Your OTP, SecureInfo and LocalFriendCodeSeed will be removed from Azahar.</li><li>Your friend list will reset and you will be logged out of your NNID/PNID account.</li><li>System files and eshop titles obtained through Azahar will become inaccessible until the same console is linked again (save data will not be lost).</li></ul><br>Continue? Esta ação irá desvincular seu console real do Azahar, com as seguintes consequências:<br><ul><li>Seu OTP, SecureInfo e LocalFriendCodeSeed serão removidos do Azahar.</li><li>Sua lista de amigos será redefinida e sua sessão será finalizada em sua conta NNID/PNID.</li><li>Arquivos do sistema e títulos da eshop obtidos pelo Azahar se tornarão inacessíveis até que o mesmo console seja vinculado de novo (dados salvos não serão perdidos).</li></ul><br>Deseja continuar? - + Invalid country for configured region País inválido para a região selecionada - + Invalid country for console unique data País inválido para os dados exclusivos do console - + Status: Loaded Estado: carregado - + Status: Loaded (Invalid Signature) Estado: carregado (assinatura inválida) - + Status: Loaded (Region Changed) Estado: carregado (região alterada) - + Status: Not Found Estado: não encontrado - + Status: Invalid Estado: inválido - + Status: IO Error Estado: erro de E/S @@ -3731,12 +3743,12 @@ Arraste os pontos para alterar a posição ou clique duas vezes nas células da Delete Profile - Apagar perfil + Excluir Perfil Delete profile %1? - Apagar perfil %1? + Excluir perfil %1? @@ -3773,13 +3785,13 @@ Arraste os pontos para alterar a posição ou clique duas vezes nas células da - Interface language: - Idioma da interface: + Interface Language + Idioma da Interface - Theme: - Tema: + Theme + Tema @@ -3788,8 +3800,8 @@ Arraste os pontos para alterar a posição ou clique duas vezes nas células da - Icon Size: - Tamanho do ícone: + Icon Size + Tamanho do ícone @@ -3809,8 +3821,8 @@ Arraste os pontos para alterar a posição ou clique duas vezes nas células da - Row 1 Text: - Texto da 1ª linha: + Row 1 Text + Texto da linha 1 @@ -3844,17 +3856,17 @@ Arraste os pontos para alterar a posição ou clique duas vezes nas células da - Row 2 Text: - Texto da 2ª linha: + Row 2 Text + Texto da linha 2 - Hide Titles without Icon + Hide titles without icon Ocultar títulos sem ícone - Single Line Mode + Single line mode Modo de linha única @@ -3864,8 +3876,8 @@ Arraste os pontos para alterar a posição ou clique duas vezes nas células da - Show Advanced Frame Time Info - Mostrar informação avançada de tempo de quadro + Show advanced frame time info + Mostrar informações avançadas de tempo de frame @@ -3947,12 +3959,12 @@ Arraste os pontos para alterar a posição ou clique duas vezes nas células da DirectConnectWindow - + Connecting Conectando - + Connect Conectar @@ -4072,497 +4084,511 @@ Por favor, verifique a instalação do FFmpeg usada para compilação. GMainWindow - + No Suitable Vulkan Devices Detected Nenhum Dispositivo Vulkan Adequado Detectado - + Vulkan initialization failed during boot.<br/>Your GPU may not support Vulkan 1.1, or you do not have the latest graphics driver. O Vulkan falhou durante sua inicialização.<br/>Sua GPU pode não suportar o Vulkan 1.1 ou você não possui o driver gráfico mais recente. - + Current Artic traffic speed. Higher values indicate bigger transfer loads. Velocidade atual do tráfego do Artic. Valores mais altos indicam cargas de transferência maiores. - - + + Current emulation speed. Values higher or lower than 100% indicate emulation is running faster or slower than a 3DS. Velocidade atual de emulação. Valores maiores ou menores que 100% indicam que a emulação está funcionando mais rápida ou lentamente que num 3DS. - - + + How many frames per second the app is currently displaying. This will vary from app to app and scene to scene. Quantos quadros por segundo que o app está mostrando atualmente. Pode variar de app para app e cena para cena. - - + + Time taken to emulate a 3DS frame, not counting framelimiting or v-sync. For full-speed emulation this should be at most 16.67 ms. Tempo levado para emular um quadro do 3DS, sem considerar o limitador de taxa de quadros ou a sincronização vertical. Valores menores ou iguais a 16,67 ms indicam que a emulação está em velocidade plena. - + MicroProfile (unavailable) Micro-perfil (indisponível) - + Clear Recent Files Limpar Arquivos Recentes - + &Continue &Continuar - + &Pause &Pausar - + Azahar is running an application TRANSLATORS: This string is shown to the user to explain why Citra needs to prevent the computer from sleeping Azahar está executando um aplicativo - - + + Invalid App Format Formato de App inválido - - + + Your app format is not supported.<br/>Please follow the guides to redump your <a href='https://web.archive.org/web/20240304210021/https://citra-emu.org/wiki/dumping-game-cartridges/'>game cartridges</a> or <a href='https://web.archive.org/web/20240304210011/https://citra-emu.org/wiki/dumping-installed-titles/'>installed titles</a>. O formato do seu app não é suportado.<br/>Siga os guias para reextrair seus <a href='https://web.archive.org/web/20240304210021/https://citra-emu.org/wiki/dumping-game-cartridges/'>cartuchos de jogos</a> ou <a href='https://web.archive.org/web/20240304210011/https://citra-emu.org/wiki/dumping-installed-titles/'>títulos instalados</a>. - + App Corrupted App corrompido - + Your app is corrupted. <br/>Please follow the guides to redump your <a href='https://web.archive.org/web/20240304210021/https://citra-emu.org/wiki/dumping-game-cartridges/'>game cartridges</a> or <a href='https://web.archive.org/web/20240304210011/https://citra-emu.org/wiki/dumping-installed-titles/'>installed titles</a>. Seu app está corrompido. <br/>Siga os guias para reextrair seus <a href='https://web.archive.org/web/20240304210021/https://citra-emu.org/wiki/dumping-game-cartridges/'>cartuchos de jogos</a> ou <a href='https://web.archive.org/web/20240304210011/https://citra-emu.org/wiki/dumping-installed-titles/'>títulos instalados</a>. - + App Encrypted App criptografado - + Your app is encrypted. <br/><a href='https://azahar-emu.org/blog/game-loading-changes/'>Please check our blog for more info.</a> Seu app está criptografado. <br/><a href='https://azahar-emu.org/blog/game-loading-changes/'>Confira nosso blog para mais informações.</a> - + Unsupported App App não suportado - + GBA Virtual Console is not supported by Azahar. O Console Virtual de GBA não é suportado pelo Azahar. - - + + Artic Server Servidor Artic - + + Invalid system mode + Modo de sistema inválido + + + + New 3DS exclusive applications cannot be loaded without enabling the New 3DS mode. + Aplicativos exclusivos do New 3DS não podem ser carregados sem ativar o modo New 3DS. + + + Error while loading App! Erro ao carregar o App! - + An unknown error occurred. Please see the log for more details. Ocorreu um erro desconhecido. Verifique o registro para mais detalhes. - + CIA must be installed before usage É necessário instalar o CIA antes de usar - + Before using this CIA, you must install it. Do you want to install it now? É necessário instalar este CIA antes de poder usá-lo. Deseja instalá-lo agora? - + Quick Load Carregamento rápido - + Quick Save Salvamento rápido - - + + Slot %1 Espaço %1 - + %2 %3 %2 %3 - + Quick Save - %1 Salvamento rápido - %1 - + Quick Load - %1 Carregamento rápido - %1 - + Slot %1 - %2 %3 Espaço %1 - %2 %3 - + Error Opening %1 Folder Erro ao abrir a pasta %1 - - + + Folder does not exist! A pasta não existe! - + Remove Play Time Data Remover Dados de Tempo de Jogo - + Reset play time? Redefinir tempo de jogo? - - - - + + + + Create Shortcut Criar Atalho - + Do you want to launch the application in fullscreen? Você gostaria de iniciar o aplicativo em tela cheia? - + Successfully created a shortcut to %1 Atalho para %1 criado com sucesso - + This will create a shortcut to the current AppImage. This may not work well if you update. Continue? Isso criará um atalho para o AppImage atual. Isso pode não funcionar bem se você atualizar. Deseja continuar? - + Failed to create a shortcut to %1 Não foi possível criar um atalho para %1 - + Create Icon Criar Ícone - + Cannot create icon file. Path "%1" does not exist and cannot be created. Não foi possível criar o arquivo de ícone. O caminho "%1" não existe e não pode ser criado. - + Dumping... Extraindo... - - + + Cancel Cancelar - - - - - - - - - + + + + + + + + + Azahar Azahar - + Could not dump base RomFS. Refer to the log for details. Não foi possível extrair o RomFS base. Consulte o registro para ver os detalhes. - + Error Opening %1 Erro ao abrir %1 - + Select Directory Selecionar pasta - + Properties Propriedades - + The application properties could not be loaded. Não foi possível carregar as propriedades do aplicativo. - + 3DS Executable (%1);;All Files (*.*) %1 is an identifier for the 3DS executable file extensions. Executável do 3DS (%1);;Todos os arquivos (*.*) - + Load File Carregar arquivo - - + + Set Up System Files Configurar arquivos do sistema - + <p>Azahar needs console unique data and firmware files from a real console to be able to use some of its features.<br>Such files and data can be set up with the <a href=https://github.com/azahar-emu/ArticSetupTool>Azahar Artic Setup Tool</a><br>Notes:<ul><li><b>This operation will install console unique data to Azahar, do not share your user or nand folders<br>after performing the setup process!</b></li><li>While doing the setup process, Azahar will link to the console running the setup tool. You can unlink the<br>console later from the System tab in the emulator configuration menu.</li><li>Do not go online with both Azahar and your 3DS console at the same time after setting up system files,<br>as it could cause issues.</li><li>Old 3DS setup is needed for the New 3DS setup to work (doing both setup modes is recommended).</li><li>Both setup modes will work regardless of the model of the console running the setup tool.</li></ul><hr></p> <p>O Azahar precisa dos dados exclusivos do console e arquivos de firmware de um console real para que seja possível usar alguns de seus recursos.<br>Tais arquivos e dados podem ser configurados através da <a href=https://github.com/azahar-emu/ArticSetupTool>Ferramenta de Configuração Artic do Azahar</a><br>Notas:<ul><li><b>Esta operação instalará os dados exclusivos do console para o Azahar, não compartilhe sua pasta de usuário ou nand<br>depois de realizar este processo!</b></li><li>Enquanto estiver realizando o processo de configuração, o Azahar irá vincular-se ao console executando a ferramenta de configuração. Você poderá desvincular<br>o console mais tarde na aba Sistema no menu de configuração do emulador.</li><li>Não entre no online com ambos Azahar e seu console 3DS ao mesmo tempo depois de configurar os arquivos de sistema,<br>já que isso poderá causar problemas.</li><li>A configuração do Antigo 3DS é necessária para a configuração do Novo 3DS funcionar (realizar ambas as configurações é recomendado).</li><li>Ambos os modos de configuração irão funcionar independente do modelo do console executando a ferramenta de configuração.</li></ul><hr></p> - + Enter Azahar Artic Setup Tool address: Digite o endereço da Ferramenta de Configuração Artic do Azahar: - + <br>Choose setup mode: <br>Escolha o modo de configuração: - + (ℹ️) Old 3DS setup (ℹ️) Configuração do Antigo 3DS - - + + Setup is possible. É possível configurar. - + (⚠) New 3DS setup (⚠) Configuração do Novo 3DS - + Old 3DS setup is required first. A configuração do Antigo 3DS é requisitada primeiro. - + (✅) Old 3DS setup (✅) Configuração do Antigo 3DS - - + + Setup completed. Configuração concluída. - + (ℹ️) New 3DS setup (ℹ️) Configuração do Novo 3DS - + (✅) New 3DS setup (✅) Configuração do Novo 3DS - + The system files for the selected mode are already set up. Reinstall the files anyway? Os arquivos do sistema para o modo selecionado já foram configurados. Reinstalar os arquivos mesmo assim? - + Load Files Carregar arquivos - + 3DS Installation File (*.cia *.zcia) - + Arquivo de Instalação 3DS (.cia .zcia) - - - + + + All Files (*.*) Todos os arquivos (*.*) - + Connect to Artic Base Conectar-se ao Artic Base - + Enter Artic Base server address: Digite o endereço do servidor Artic Base: - + %1 has been installed successfully. %1 foi instalado. - + Unable to open File Não foi possível abrir o arquivo - + Could not open %1 Não foi possível abrir %1 - + Installation aborted Instalação cancelada - + The installation of %1 was aborted. Please see the log for more details A instalação de %1 foi interrompida. Consulte o registro para mais detalhes - + Invalid File Arquivo inválido - + %1 is not a valid CIA %1 não é um CIA válido - + CIA Encrypted CIA criptografado - + Your CIA file is encrypted.<br/><a href='https://azahar-emu.org/blog/game-loading-changes/'>Please check our blog for more info.</a> Seu arquivo CIA está criptografado.<br/><a href='https://azahar-emu.org/blog/game-loading-changes/'>Confira nosso blog para mais informações.</a> - + Unable to find File Não foi possível localizar o arquivo - + Could not find %1 Não foi possível localizar %1 - - - - Error compressing file - + + + + + Z3DS Compression + Compressão Z3DS - - File compress operation failed, check log for details. - + + Failed to compress some files, check log for details. + Falha ao comprimir alguns arquivos. Verifique o log para mais detalhes. - - - - Error decompressing file - + + Failed to decompress some files, check log for details. + Falha ao descomprimir alguns arquivos. Verifique o log para mais detalhes. - - File decompress operation failed, check log for details. - + + All files have been compressed successfully. + Todos os arquivos foram comprimidos com sucesso. - + + All files have been decompressed successfully. + Todos os arquivos foram descomprimidos com sucesso. + + + Uninstalling '%1'... Desinstalando '%1'... - + Failed to uninstall '%1'. Erro ao desinstalar '%1'. - + Successfully uninstalled '%1'. '%1' desinstalado com sucesso. - + File not found Arquivo não encontrado - + File "%1" not found Arquivo "%1" não encontrado - + Savestates Estados salvos - + Warning: Savestates are NOT a replacement for in-application saves, and are not meant to be reliable. Use at your own risk! @@ -4571,86 +4597,86 @@ Use at your own risk! Use por sua conta e risco! - - - + + + Error opening amiibo data file Erro ao abrir arquivo de dados do amiibo - + A tag is already in use. Uma tag já está em uso. - + Application is not looking for amiibos. O aplicativo não está procurando por amiibos. - + Amiibo File (%1);; All Files (*.*) Arquivo do Amiibo (%1);; Todos os arquivos (*.*) - + Load Amiibo Carregar Amiibo - + Unable to open amiibo file "%1" for reading. Não foi possível abrir o arquivo amiibo "%1" para realizar a leitura. - + Record Movie Gravar passos - + Movie recording cancelled. Gravação cancelada. - - + + Movie Saved Gravação salva - - + + The movie is successfully saved. A gravação foi salva. - + Application will unpause O aplicativo será retomado - + The application will be unpaused, and the next frame will be captured. Is this okay? O aplicativo será retomado, e o próximo quadro será capturado. Tudo bem? - + Invalid Screenshot Directory Pasta inválida - + Cannot create specified screenshot directory. Screenshot path is set back to its default value. Não é possível criar a pasta especificada. O caminho original foi restabelecido. - + Could not load video dumper Não foi possível carregar o gravador de vídeo - + FFmpeg could not be loaded. Make sure you have a compatible version installed. To install FFmpeg to Azahar, press Open and select your FFmpeg directory. @@ -4663,275 +4689,265 @@ Para instalar o FFmpeg no Azahar, pressione Abrir e selecione seu diretório FFm Para ver um guia sobre como instalar o FFmpeg, pressione Ajuda. - - Load 3DS ROM File - + + Load 3DS ROM Files + Carregar arquivos de ROM do 3DS - - 3DS ROM Files (*.cia *cci *3dsx *cxi) - + + 3DS ROM Files (*.cia *.cci *.3dsx *.cxi) + Arquivos de ROM do 3DS (*.cia *.cci *.3dsx *.cxi) - - The selected file is not a compatible 3DS ROM format. Make sure you have chosen the right file, and that it is not encrypted. - - - - - The selected file is already compressed. - - - - + 3DS Compressed ROM File (*.%1) - - - - - Save 3DS Compressed ROM File - - - - - Load 3DS Compressed ROM File - - - - - 3DS Compressed ROM Files (*.zcia *zcci *z3dsx *zcxi) - - - - - The selected file is not a compatible compressed 3DS ROM format. Make sure you have chosen the right file. - + Arquivo de ROM 3DS Comprimido (*.%1) - The selected file is already decompressed. - + Save 3DS Compressed ROM File + Salvar Arquivo de ROM 3DS Comprimido - + + Select Output 3DS Compressed ROM Folder + Selecionar Pasta de Saída das ROMs 3DS Comprimidas + + + + Load 3DS Compressed ROM Files + Carregar Arquivos de ROM 3DS Comprimidos + + + + 3DS Compressed ROM Files (*.zcia *zcci *z3dsx *zcxi) + Arquivos de ROM 3DS Comprimidos (*.zcia *.zcci .z3dsx .zcxi) + + + 3DS ROM File (*.%1) - + Arquivo de ROM 3DS (*.%1) - + Save 3DS ROM File - + Salvar Arquivo de ROM 3DS - + + Select Output 3DS ROM Folder + Selecionar Pasta de Saída das ROMs 3DS + + + Select FFmpeg Directory Selecione o Diretório FFmpeg - + The provided FFmpeg directory is missing %1. Please make sure the correct directory was selected. O diretório FFmpeg fornecido não foi encontrado %1. Por favor, certifique-se de que o diretório correto foi selecionado. - + FFmpeg has been sucessfully installed. O FFmpeg foi instalado com sucesso. - + Installation of FFmpeg failed. Check the log file for details. A instalação do FFmpeg falhou. Verifique o arquivo de log para obter detalhes. - + Could not start video dumping.<br>Please ensure that the video encoder is configured correctly.<br>Refer to the log for details. Não foi possível começar a gravação do vídeo.<br>Assegure-se que o codificador de vídeo está configurado corretamente.<br>Refira-se ao log para mais detalhes. - + Recording %1 Gravando %1 - + Playing %1 / %2 Reproduzindo %1 / %2 - + Movie Finished Reprodução concluída - + (Accessing SharedExtData) (Acessando SharedExtData) - + (Accessing SystemSaveData) (Acessando SystemSaveData) - + (Accessing BossExtData) (Accessando BossExtData) - + (Accessing ExtData) (Acessando ExtData) - + (Accessing SaveData) (Acessando SaveData) - + MB/s MB/s - + KB/s KB/s - + Artic Traffic: %1 %2%3 Tráfego do Artic: %1 %2%3 - + Speed: %1% Velocidade: %1% - + Speed: %1% / %2% Velocidade: %1% / %2% - + App: %1 FPS App: %1 FPS - + Frame: %1 ms (GPU: [CMD: %2 ms, SWP: %3 ms], IPC: %4 ms, SVC: %5 ms, Rem: %6 ms) - + Frame: %1 ms (GPU: [CMD: %2 ms, SWP: %3 ms], IPC: %4 ms, SVC: %5 ms, Rem: %6 ms) - + Frame: %1 ms Quadro: %1 ms - + VOLUME: MUTE VOLUME: SILENCIADO - + VOLUME: %1% Volume percentage (e.g. 50%) VOLUME: %1% - + %1 is missing. Please <a href='https://web.archive.org/web/20240304201103/https://citra-emu.org/wiki/dumping-system-archives-and-the-shared-fonts-from-a-3ds-console/'>dump your system archives</a>.<br/>Continuing emulation may result in crashes and bugs. - + %1 está ausente. Por favor,<a href='https://web.archive.org/web/20240304201103/https://citra-emu.org/wiki/dumping-system-archives-and-the-shared-fonts-from-a-3ds-console/'>faça a extração dos arquivos do sistema</a>. <br/>Continuar a emulação pode causar falhas e bugs. - + A system archive Um arquivo do sistema - + System Archive Not Found Arquivo de sistema não encontrado - + System Archive Missing Arquivo de sistema em falta - + Save/load Error Erro ao salvar/carregar - + Fatal Error Erro fatal - + A fatal error occurred. <a href='https://web.archive.org/web/20240228001712/https://community.citra-emu.org/t/how-to-upload-the-log-file/296'>Check the log</a> for details.<br/>Continuing emulation may result in crashes and bugs. - + Ocorreu um erro fatal. <a href='https://web.archive.org/web/20240228001712/https://community.citra-emu.org/t/how-to-upload-the-log-file/296'>Verifique o log</a> para mais detalhes.<br/>Continuar a emulação pode causar falhas e bugs. - + Fatal Error encountered Erro fatal encontrado - + Continue Continuar - + Quit Application Sair do Aplicativo - + OK OK - + Would you like to exit now? Deseja sair agora? - + The application is still running. Would you like to stop emulation? O aplicativo ainda está em execução. Deseja parar a emulação? - + Playback Completed Reprodução concluída - + Movie playback completed. Reprodução dos passos concluída. - + Update Available Atualização disponível - + Update %1 for Azahar is available. Would you like to download it? A atualização %1 para o Azahar está disponível. Você gostaria de baixá-la? - + Primary Window Janela Principal - + Secondary Window Janela Secundária @@ -5037,175 +5053,190 @@ Você gostaria de baixá-la? GameList - + IMPORTANT: Encrypted files and .3ds files are no longer supported. Decrypting and/or renaming to .cci may be necessary. <a href='https://azahar-emu.org/blog/game-loading-changes/'>Learn more.</a> IMPORTANTE: Arquivos criptografados e arquivos .3ds não são mais suportados. Talvez seja necessário descriptografá-los e/ou renomeá-los para .cci. <a href='https://azahar-emu.org/blog/game-loading-changes/'>Saiba mais.</a> - + Don't show again - Não mostrar novamente + Não mostrar - - + + Compatibility Compatibilidade - - + + Region Região - - + + File type Tipo de arquivo - - + + Size Tamanho - - + + Play time Tempo de jogo - + Favorite Favorito - + + Eject Cartridge + Ejetar Cartucho + + + + Insert Cartridge + Inserir Cartucho + + + Open Abrir - + Application Location Local do Aplicativo - + Save Data Location Local de Dados Salvos - + Extra Data Location Local de Dados Extras - + Update Data Location Atualizar Local dos Dados - + DLC Data Location Local de Dados de DLC  - + Texture Dump Location Local de Dump de Texturas - + Custom Texture Location Local de Texturas Personalizadas - + Mods Location Diretório de Mods - + Dump RomFS Extrair RomFS - + Disk Shader Cache Cache de shaders em disco - + Open Shader Cache Location Abrir local do cache dos shaders - + Delete OpenGL Shader Cache Apagar cache de shaders do OpenGL - + Uninstall Desinstalar - + Everything Tudo - + Application Aplicativo - + Update Atualização - + DLC DLC - + Remove Play Time Data Remover Dados de Tempo de Jogo - + Create Shortcut Criar Atalho - + Add to Desktop Adicionar à Área de Trabalho - + Add to Applications Menu Adicionar ao Menu Iniciar - + + Stress Test: App Launch + Teste de Estresse: Inicialização de Aplicativos + + + Properties Propriedades - - - - + + + + Azahar Azahar - + Are you sure you want to completely uninstall '%1'? This will delete the application if installed, as well as any installed updates or DLC. @@ -5214,64 +5245,64 @@ This will delete the application if installed, as well as any installed updates Isso irá deletar o aplicativo caso ele esteja instalado, assim como qualquer atualização ou DLC instalada. - - + + %1 (Update) %1 (Atualização) - - + + %1 (DLC) %1 (DLC) - + Are you sure you want to uninstall '%1'? Tem certeza que quer desinstalar '%1'? - + Are you sure you want to uninstall the update for '%1'? Tem certeza que deseja desinstalar a atualização para '%1'? - + Are you sure you want to uninstall all DLC for '%1'? Tem certeza de que deseja desinstalar todas as DLCs de '%1'? - + Scan Subfolders Examinar Subpastas - + Remove Application Directory Remover Diretório de Aplicativos - + Move Up Mover para cima - + Move Down Mover para baixo - + Open Directory Location Abrir local da pasta - + Clear Limpar - + Name Nome @@ -5279,82 +5310,82 @@ Isso irá deletar o aplicativo caso ele esteja instalado, assim como qualquer at GameListItemCompat - + Perfect Perfeito - + App functions flawless with no audio or graphical glitches, all tested functionality works as intended without any workarounds needed. O app funciona impecavelmente, sem nenhum problema de áudio ou nos gráficos. Todas as funcionalidades testadas funcionam como deveriam, sem a necessidade de soluções alternativas. - + Great Ótimo - + App functions with minor graphical or audio glitches and is playable from start to finish. May require some workarounds. O app funciona com leves defeitos gráficos ou de áudio e é jogável do início ao fim. Pode exigir algumas soluções alternativas. - + Okay Bom - + App functions with major graphical or audio glitches, but app is playable from start to finish with workarounds. O aplicativo funciona com graves defeitos gráficos ou de áudio, mas o app é jogável do início ao fim com o uso de soluções alternativas. - + Bad Ruim - + App functions, but with major graphical or audio glitches. Unable to progress in specific areas due to glitches even with workarounds. O app funciona, só que com problemas significativos nos gráficos ou no áudio. Não é possível progredir em certas áreas por conta de tais problemas, mesmo com soluções alternativas. - + Intro/Menu Intro/menu - + App is completely unplayable due to major graphical or audio glitches. Unable to progress past the Start Screen. É impossível executar o aplicativo devido a graves defeitos nos gráficos ou no áudio. Não é possível passar da Tela Inicial. - + Won't Boot Não inicia - + The app crashes when attempting to startup. O app trava ou fecha-se abruptamente ao tentar iniciá-lo. - + Not Tested Não testado - + The app has not yet been tested. O app ainda não foi testado. @@ -5362,7 +5393,7 @@ Tela Inicial. GameListPlaceholder - + Double-click to add a new folder to the application list Clique duas vezes para adicionar uma pasta à lista de aplicativos @@ -5370,27 +5401,27 @@ Tela Inicial. GameListSearchField - + of de - + result resultado - + results resultados - + Filter: Filtro: - + Enter pattern to filter Insira o padrão para filtrar @@ -5718,87 +5749,87 @@ Tela Inicial. Índice cíclico: - + SRC1: %1, %2, %3, %4 SRC1: %1, %2, %3, %4 - + SRC2: %1, %2, %3, %4 SRC2: %1, %2, %3, %4 - + SRC3: %1, %2, %3, %4 SRC3: %1, %2, %3, %4 - + DEST_IN: %1, %2, %3, %4 DEST_IN: %1, %2, %3, %4 - + DEST_OUT: %1, %2, %3, %4 DEST_OUT: %1, %2, %3, %4 - + Address Registers: %1, %2 Registradores de endereço: %1, %2 - + Compare Result: %1, %2 Comparar resultado: %1, %2 - + Static Condition: %1 Condição estática: %1 - + Dynamic Conditions: %1, %2 Condições dinâmicas: %1, %2 - + Loop Parameters: %1 (repeats), %2 (initializer), %3 (increment), %4 Parâmetros do ciclo: %1 (repetições), %2 (inicializador), %3 (incremento), %4 - + Instruction offset: 0x%1 Offset de instrução: 0x%1 - + -> 0x%2 -> 0x%2 - + (last instruction) (última instrução) @@ -6099,32 +6130,32 @@ Mensagem de depuração: Senha: - + Room Name Nome da sala - + Preferred Application Aplicativo preferido - + Host Anfitrião - + Players Jogadores - + Refreshing Atualizando - + Refresh List Atualizar lista @@ -6394,12 +6425,12 @@ Mensagem de depuração: Compress ROM File... - + Comprimindo Arquivo de ROM... Decompress ROM File... - + Descomprimindo Arquivo de ROM... @@ -7126,32 +7157,32 @@ Ele pode ter saído da sala. %1 (0x%2) - + Unsupported encrypted application Aplicativo criptografado não suportado - + Invalid region Região inválida - + Installed Titles Títulos instalados - + System Titles Títulos do sistema - + Add New Application Directory Adicionar nova pasta de aplicativos - + Favorites Favoritos diff --git a/dist/languages/ro_RO.ts b/dist/languages/ro_RO.ts index 5d9a97cbc..0ec712c6d 100644 --- a/dist/languages/ro_RO.ts +++ b/dist/languages/ro_RO.ts @@ -292,8 +292,8 @@ Astfel vor fi banați din forum numele lor de utilizator și adresa IP. - Emulation: - Emulare: + Emulation + Emulare @@ -397,6 +397,7 @@ Astfel vor fi banați din forum numele lor de utilizator și adresa IP. + Camera Cameră @@ -408,8 +409,8 @@ Astfel vor fi banați din forum numele lor de utilizator și adresa IP. - Camera to configure: - Camera pentru configurare: + Camera to Configure + @@ -429,8 +430,8 @@ Astfel vor fi banați din forum numele lor de utilizator și adresa IP. - Camera mode: - Mod cameră: + Camera mode + @@ -450,8 +451,8 @@ Astfel vor fi banați din forum numele lor de utilizator și adresa IP. - Camera position: - Poziție cameră: + Camera position + @@ -476,8 +477,8 @@ Astfel vor fi banați din forum numele lor de utilizator și adresa IP. - Camera Image Source: - Sursă de Imagine de la Cameră: + Camera Image Source + @@ -496,8 +497,8 @@ Astfel vor fi banați din forum numele lor de utilizator și adresa IP. - File: - Fișier: + File + @@ -510,11 +511,6 @@ Astfel vor fi banați din forum numele lor de utilizator și adresa IP.Select the system camera to use Selectați camera de sistem pentru a utiliza - - - Camera: - Cameră: - <Default> @@ -528,8 +524,8 @@ Astfel vor fi banați din forum numele lor de utilizator și adresa IP. - Flip: - Rotație: + Flip + @@ -1018,7 +1014,7 @@ Doriți să ignorați eroarea și să continuați? Enable Linear Filtering - Aprinde Linear Filtering + @@ -1082,8 +1078,8 @@ Doriți să ignorați eroarea și să continuați? - Reverse Side by Side - Inversează Side by Side + Side by Side Full Width + @@ -1133,7 +1129,7 @@ Doriți să ignorați eroarea și să continuați? Disable Right Eye Rendering - Dezactivează randarea ochiului drept + @@ -1141,49 +1137,54 @@ Doriți să ignorați eroarea și să continuați? - + + Swap Eyes + + + + Utility Utilizare - + <html><head/><body><p>Replace textures with PNG files.</p><p>Textures are loaded from load/textures/[Title ID]/.</p></body></html> <html><head/><body><p>Înlocuiește texture cu fișierele PNG.</p><p>Texturele sunt încărcați din load/textures/[Title ID]/.</p></body></html> - - Use Custom Textures - Folosește texturi personalizate + + Use custom textures + - + <html><head/><body><p>Dump textures to PNG files.</p><p>Textures are dumped to dump/textures/[Title ID]/.</p></body></html> <html><head/><body><p>Dump-eaza texturele în fișiere PNG.</p><p>Texturele erau dump-ate în dump/textures/[Title ID]/.</p></body></html> - - Dump Textures - Dump-eaza Texture + + Dump textures + - + <html><head/><body><p>Load all custom textures into memory on boot, instead of loading them when the application requires them.</p></body></html> - - Preload Custom Textures - Preîncarca Texturele Personalizate + + Preload custom textures + - + <html><head/><body><p>Load custom textures asynchronously with background threads to reduce loading stutter</p></body></html> <html><head/><body><p>Încarcă texturele asincron cu background threads pentru a reduce încărcarea lentă</p></body></html> - - Async Custom Texture Loading - Încărcare asincronă a texturelor personalizate + + Async custom texture loading + @@ -1240,13 +1241,13 @@ Doriți să ignorați eroarea și să continuați? - Set emulation speed: - Setează viteza emulației: + Set emulation speed + - Emulation Speed: - Viteza Emulării: + Emulation Speed + @@ -1357,12 +1358,12 @@ Doriți să ignorați eroarea și să continuați? - SPIR-V Shader Generation - SPIR-V Shader Generare + SPIR-V shader generation + - Disable GLSL -> SPIR-V Optimizer + Disable GLSL -> SPIR-V optimizer @@ -1382,8 +1383,8 @@ Doriți să ignorați eroarea și să continuați? - Enable Hardware Shader - Activează Hardware Shader + Enable hardware shader + @@ -1392,8 +1393,8 @@ Doriți să ignorați eroarea și să continuați? - Accurate Multiplication - Înmulțire Precisă + Accurate multiplication + @@ -1402,8 +1403,8 @@ Doriți să ignorați eroarea și să continuați? - Enable Shader JIT - Activează Shader-ul JIT + Enable shader JIT + @@ -1412,8 +1413,8 @@ Doriți să ignorați eroarea și să continuați? - Enable Async Shader Compilation - Activați compilarea Async Shader + Enable async shader compilation + @@ -1422,8 +1423,8 @@ Doriți să ignorați eroarea și să continuați? - Enable Async Presentation - Aprinde Async Presentation + Enable async presentation + @@ -1462,8 +1463,8 @@ Doriți să ignorați eroarea și să continuați? - Use Disk Shader Cache - Folosește Disk Shader Cache + Use disk shader cache + @@ -1487,7 +1488,7 @@ Doriți să ignorați eroarea și să continuați? - Delay application render thread: + Delay Application Render Thread @@ -1976,13 +1977,13 @@ Doriți să ignorați eroarea și să continuați? - Swap Screens - Schimbă Ecranele + Swap screens + - Rotate Screens Upright - Rotește Drept Ecranurile + Rotate screens upright + @@ -2098,8 +2099,8 @@ Doriți să ignorați eroarea și să continuați? - <html><head/><body><p>Bottom Screen Opacity % (OpenGL Only)</p></body></html> - <html><head/><body><p>Opacitatea Ecranului de Jos % (Numai OpenGL)</p></body></html> + <html><head/><body><p>Bottom Screen Opacity %</p></body></html> + @@ -2446,8 +2447,8 @@ Doriți să ignorați eroarea și să continuați? - Use Virtual SD - Folosește SD Virtual + Use virtual SD card + @@ -2456,8 +2457,8 @@ Doriți să ignorați eroarea și să continuați? - Use Custom Storage - Folosește Storage Personalizat + Use custom storage location + @@ -2543,8 +2544,8 @@ online features (if installed) - Region: - + Region + Regiune @@ -2552,326 +2553,337 @@ online features (if installed) - + + Apply region free patch to +installed applications. + + + + + Patches the region of installed applications to be region free, so that they always appear on the home menu. + + + + Username Nume de utilizator - + Birthday Zi de naștere - + January Ianuarie - + February Februarie - + March Martie - + April Aprilie - + May Mai - + June Iunie - + July Iulie - + August August - + September Septembrie - + October Octombrie - + November Noiembrie - + December Decembrie - + Language Limbă - + Note: this can be overridden when region setting is auto-select Atenție: Acestea pot fi suprapuse când regiunea este pe selectare automată - + Japanese (日本語) Japoneză (日本語) - + English Engleză - + French (français) Franceză (français) - + German (Deutsch) Germană (Deutsch) - + Italian (italiano) Italiană (italiano) - + Spanish (español) Spaniolă (español) - + Simplified Chinese (简体中文) Chineză simplificată (简体中文) - + Korean (한국어) Coreană (한국어) - + Dutch (Nederlands) Olandeză (Nederlands) - + Portuguese (português) Portugheză (português) - + Russian (Русский) Rusă (Русский) - + Traditional Chinese (正體中文) Chineză tradițională (正體中文) - + Sound output mode Mod ieșire sunet - + Mono Mono - + Stereo Stereo - + Surround Surround - + Country Țară - + Clock Ceas - + System Clock Ceas de Sistem - + Fixed Time Oră Fixă - + Startup time Timp de Pornire - + yyyy-MM-ddTHH:mm:ss aaaa-LL-zzTOO:mm:ss - + Offset time Offset timp - + days - + HH:mm:ss HH:mm:ss - + Initial System Ticks Bifele Inițiale de Sistem - + Random Aleatoriu - + Fixed Fixed - + Initial System Ticks Override Bifele Inițiale de Sistem Override - + Play Coins - + <html><head/><body><p>Number of steps per hour reported by the pedometer. Range from 0 to 65,535.</p></body></html> - + Pedometer Steps per Hour - + Run System Setup when Home Menu is launched Rulează System Setup când Home Menu este pornit - + Console ID: ID Consolă: - - + + Regenerate Regenerează - + MAC: - - 3GX Plugin Loader: - 3GX Plugin Loader: + + 3GX Plugin Loader + - + Enable 3GX plugin loader Aprinde 3GX plugin loader - + Allow applications to change plugin loader state - + Real Console Unique Data - + Your real console is linked to Azahar. - + Unlink - + OTP - - - - + + + + Choose - + SecureInfo_A/B - + LocalFriendCodeSeed_A/B - + movable.sed - + System settings are available only when applications is not running. @@ -3581,76 +3593,76 @@ online features (if installed) - - + + Console ID: 0x%1 ID Consolă: 0x%1 - - + + MAC: %1 - + This will replace your current virtual 3DS console ID with a new one. Your current virtual 3DS console ID will not be recoverable. This might have unexpected effects in applications. This might fail if you use an outdated config save. Continue? - - - + + + Warning Atenționare - + This will replace your current MAC address with a new one. It is not recommended to do this if you got the MAC address from your real console using the setup tool. Continue? - + This action will unlink your real console from Azahar, with the following consequences:<br><ul><li>Your OTP, SecureInfo and LocalFriendCodeSeed will be removed from Azahar.</li><li>Your friend list will reset and you will be logged out of your NNID/PNID account.</li><li>System files and eshop titles obtained through Azahar will become inaccessible until the same console is linked again (save data will not be lost).</li></ul><br>Continue? - + Invalid country for configured region - + Invalid country for console unique data - + Status: Loaded - + Status: Loaded (Invalid Signature) - + Status: Loaded (Region Changed) - + Status: Not Found - + Status: Invalid - + Status: IO Error @@ -3766,13 +3778,13 @@ Trageți puncte pentru a schimba poziția sau faceți dublu clic pe celulele tab - Interface language: - Limbaj de Interfață: + Interface Language + - Theme: - Temă: + Theme + @@ -3781,8 +3793,8 @@ Trageți puncte pentru a schimba poziția sau faceți dublu clic pe celulele tab - Icon Size: - Mărime de Icoană: + Icon Size + @@ -3802,8 +3814,8 @@ Trageți puncte pentru a schimba poziția sau faceți dublu clic pe celulele tab - Row 1 Text: - Text din Rând 1: + Row 1 Text + @@ -3837,18 +3849,18 @@ Trageți puncte pentru a schimba poziția sau faceți dublu clic pe celulele tab - Row 2 Text: - Text din Rând 2: + Row 2 Text + - Hide Titles without Icon - Ascunde Titluri fără Icoană + Hide titles without icon + - Single Line Mode - Modul Liniei Unice + Single line mode + @@ -3857,7 +3869,7 @@ Trageți puncte pentru a schimba poziția sau faceți dublu clic pe celulele tab - Show Advanced Frame Time Info + Show advanced frame time info @@ -3940,12 +3952,12 @@ Trageți puncte pentru a schimba poziția sau faceți dublu clic pe celulele tab DirectConnectWindow - + Connecting Conectând - + Connect Conectare @@ -4065,582 +4077,596 @@ Vă rugăm să verificați instalarea FFmpeg utilizată pentru compilare. GMainWindow - + No Suitable Vulkan Devices Detected Nu au fost detectate dispozitive Vulkan adecvate Detected - + Vulkan initialization failed during boot.<br/>Your GPU may not support Vulkan 1.1, or you do not have the latest graphics driver. Inițializarea Vulkan a eșuat în timpul pornirii.<br/>Este posibil ca GPU-ul dvs. să nu accepte Vulkan 1.1 sau să nu aveți cel mai recent driver grafic. - + Current Artic traffic speed. Higher values indicate bigger transfer loads. - - + + Current emulation speed. Values higher or lower than 100% indicate emulation is running faster or slower than a 3DS. Viteza actuală de emulare. Valori mai mari sau mai mici de 100% indică cum emularea rulează mai repede sau mai încet decât un 3DS. - - + + How many frames per second the app is currently displaying. This will vary from app to app and scene to scene. - - + + Time taken to emulate a 3DS frame, not counting framelimiting or v-sync. For full-speed emulation this should be at most 16.67 ms. Timp luat pentru a emula un cadru 3DS, fără a pune în calcul limitarea de cadre sau v-sync. Pentru emulare la viteza maximă, această valoare ar trebui să fie maxim 16.67 ms. - + MicroProfile (unavailable) - + Clear Recent Files Curăță Fișiere Recente - + &Continue &Continue - + &Pause &Pause - + Azahar is running an application TRANSLATORS: This string is shown to the user to explain why Citra needs to prevent the computer from sleeping - - + + Invalid App Format - - + + Your app format is not supported.<br/>Please follow the guides to redump your <a href='https://web.archive.org/web/20240304210021/https://citra-emu.org/wiki/dumping-game-cartridges/'>game cartridges</a> or <a href='https://web.archive.org/web/20240304210011/https://citra-emu.org/wiki/dumping-installed-titles/'>installed titles</a>. - + App Corrupted - + Your app is corrupted. <br/>Please follow the guides to redump your <a href='https://web.archive.org/web/20240304210021/https://citra-emu.org/wiki/dumping-game-cartridges/'>game cartridges</a> or <a href='https://web.archive.org/web/20240304210011/https://citra-emu.org/wiki/dumping-installed-titles/'>installed titles</a>. - + App Encrypted - + Your app is encrypted. <br/><a href='https://azahar-emu.org/blog/game-loading-changes/'>Please check our blog for more info.</a> - + Unsupported App - + GBA Virtual Console is not supported by Azahar. - - + + Artic Server - + + Invalid system mode + + + + + New 3DS exclusive applications cannot be loaded without enabling the New 3DS mode. + + + + Error while loading App! - + An unknown error occurred. Please see the log for more details. A apărut o eroare necunoscută. Vă rugăm să consultați jurnalul pentru mai multe detalii. - + CIA must be installed before usage CIA-ul trebuie instalat înainte de uz - + Before using this CIA, you must install it. Do you want to install it now? Înainte de a folosi acest CIA, trebuie să-l instalati. Doriți s-o faceți acum? - + Quick Load - + Quick Save - - + + Slot %1 Slot %1 - + %2 %3 - + Quick Save - %1 - + Quick Load - %1 - + Slot %1 - %2 %3 Slot %1 - %2 %3 - + Error Opening %1 Folder Eroare Deschizând Folderul %1 - - + + Folder does not exist! Folderul nu există! - + Remove Play Time Data Eliminați datele privind timpul petrecut - + Reset play time? Resetați play time? - - - - + + + + Create Shortcut Creează un Shortcut - + Do you want to launch the application in fullscreen? - + Successfully created a shortcut to %1 Shortcut-ul către %1 a fost creat cu succes - + This will create a shortcut to the current AppImage. This may not work well if you update. Continue? Asta va crea un shortcut la AppImage-ul curent. Este posibilitate că nu va lucra normal dacă veți actualiza. Continuă? - + Failed to create a shortcut to %1 Nu s-a putut crea o comandă rapidă către %1 - + Create Icon Creează un Icon - + Cannot create icon file. Path "%1" does not exist and cannot be created. Nu se poate crea fișierul de icon. Calea "%1" nu există și nu poate fi creat. - + Dumping... Dumping... - - + + Cancel Anulare - - - - - - - - - + + + + + + + + + Azahar Azahar - + Could not dump base RomFS. Refer to the log for details. Nu s-a putut să facă dump-ul bazei RomFS. Consultați log-urile pentru detalii. - + Error Opening %1 Eroare Deschizând %1 - + Select Directory Selectează Directorul - + Properties Proprietăți - + The application properties could not be loaded. - + 3DS Executable (%1);;All Files (*.*) %1 is an identifier for the 3DS executable file extensions. Executabilă 3DS (%1);;Toate Fișierele (*.*) - + Load File Încarcă Fișier - - + + Set Up System Files - + <p>Azahar needs console unique data and firmware files from a real console to be able to use some of its features.<br>Such files and data can be set up with the <a href=https://github.com/azahar-emu/ArticSetupTool>Azahar Artic Setup Tool</a><br>Notes:<ul><li><b>This operation will install console unique data to Azahar, do not share your user or nand folders<br>after performing the setup process!</b></li><li>While doing the setup process, Azahar will link to the console running the setup tool. You can unlink the<br>console later from the System tab in the emulator configuration menu.</li><li>Do not go online with both Azahar and your 3DS console at the same time after setting up system files,<br>as it could cause issues.</li><li>Old 3DS setup is needed for the New 3DS setup to work (doing both setup modes is recommended).</li><li>Both setup modes will work regardless of the model of the console running the setup tool.</li></ul><hr></p> - + Enter Azahar Artic Setup Tool address: - + <br>Choose setup mode: - + (ℹ️) Old 3DS setup - - + + Setup is possible. - + (⚠) New 3DS setup - + Old 3DS setup is required first. - + (✅) Old 3DS setup - - + + Setup completed. - + (ℹ️) New 3DS setup - + (✅) New 3DS setup - + The system files for the selected mode are already set up. Reinstall the files anyway? - + Load Files Încarcă Fișiere - + 3DS Installation File (*.cia *.zcia) - - - + + + All Files (*.*) Toate Fișierele (*.*) - + Connect to Artic Base Conectează Arctic Base - + Enter Artic Base server address: Introduceți adresa serverului Arctic Base: - + %1 has been installed successfully. %1 a fost instalat cu succes. - + Unable to open File Nu s-a putut deschide Fișierul - + Could not open %1 Nu s-a putut deschide %1 - + Installation aborted Instalare anulată - + The installation of %1 was aborted. Please see the log for more details Instalarea lui %1 a fost anulată. Vă rugăm să vedeți log-ul pentru mai multe detalii. - + Invalid File Fișier Invalid - + %1 is not a valid CIA %1 nu este un CIA valid - + CIA Encrypted - + Your CIA file is encrypted.<br/><a href='https://azahar-emu.org/blog/game-loading-changes/'>Please check our blog for more info.</a> - + Unable to find File Nu se poate găsi Fișierul - + Could not find %1 %1 n-a fost găsit - - - - Error compressing file + + + + + Z3DS Compression - - File compress operation failed, check log for details. + + Failed to compress some files, check log for details. - - - - Error decompressing file + + Failed to decompress some files, check log for details. - - File decompress operation failed, check log for details. + + All files have been compressed successfully. - + + All files have been decompressed successfully. + + + + Uninstalling '%1'... Dezinstalarea '%1'... - + Failed to uninstall '%1'. Dezinstalarea '%1' a eșuat. - + Successfully uninstalled '%1'. '%1' era dezinstalat cu succes. - + File not found Fișier negăsit - + File "%1" not found Fișierul "%1" nu a fost găsit - + Savestates Savestates - + Warning: Savestates are NOT a replacement for in-application saves, and are not meant to be reliable. Use at your own risk! - - - + + + Error opening amiibo data file Eroare la deschiderea fișierului de date amiibo - + A tag is already in use. Un tag deja este in folosire. - + Application is not looking for amiibos. - + Amiibo File (%1);; All Files (*.*) Fișier Amiibo (%1);; Toate Fișierele (*.*) - + Load Amiibo Încarcă Amiibo - + Unable to open amiibo file "%1" for reading. Nu se poate deschide fișierul amiibo "%1" pentru citire. - + Record Movie Înregistrează Film - + Movie recording cancelled. Înregistrarea filmului a fost anulată. - - + + Movie Saved Film Salvat - - + + The movie is successfully saved. Filmul a fost salvat cu succes. - + Application will unpause - + The application will be unpaused, and the next frame will be captured. Is this okay? - + Invalid Screenshot Directory Directoria Capturii de Ecran este Invalidă - + Cannot create specified screenshot directory. Screenshot path is set back to its default value. Nu se poate crea directoria specificată a capturii de ecran. Calea capturii de ecran a fost setat implicit - + Could not load video dumper Dumperul video nu a putut fi încărcat - + FFmpeg could not be loaded. Make sure you have a compatible version installed. To install FFmpeg to Azahar, press Open and select your FFmpeg directory. @@ -4649,274 +4675,264 @@ To view a guide on how to install FFmpeg, press Help. - - Load 3DS ROM File + + Load 3DS ROM Files - - 3DS ROM Files (*.cia *cci *3dsx *cxi) + + 3DS ROM Files (*.cia *.cci *.3dsx *.cxi) - - The selected file is not a compatible 3DS ROM format. Make sure you have chosen the right file, and that it is not encrypted. - - - - - The selected file is already compressed. - - - - + 3DS Compressed ROM File (*.%1) - + Save 3DS Compressed ROM File - - Load 3DS Compressed ROM File + + Select Output 3DS Compressed ROM Folder - + + Load 3DS Compressed ROM Files + + + + 3DS Compressed ROM Files (*.zcia *zcci *z3dsx *zcxi) - - The selected file is not a compatible compressed 3DS ROM format. Make sure you have chosen the right file. - - - - - The selected file is already decompressed. - - - - + 3DS ROM File (*.%1) - + Save 3DS ROM File - + + Select Output 3DS ROM Folder + + + + Select FFmpeg Directory Selectați Directoria FFmpeg - + The provided FFmpeg directory is missing %1. Please make sure the correct directory was selected. Directoria FFmpeg furnizată nu este prezentă %1. Vă rugăm să vă asigurați că ați selectat directoria corectă. - + FFmpeg has been sucessfully installed. FFmpeg era instalat cu succes. - + Installation of FFmpeg failed. Check the log file for details. Instalația FFmpeg a eșuat. Verificați log-urile pentru detalii. - + Could not start video dumping.<br>Please ensure that the video encoder is configured correctly.<br>Refer to the log for details. - + Recording %1 Înregistrarea %1 - + Playing %1 / %2 Playing %1 / %2 - + Movie Finished Filmul finisat - + (Accessing SharedExtData) (Se accesează SharedExtData) - + (Accessing SystemSaveData) (Se accesează SystemSaveData) - + (Accessing BossExtData) (Se accesează BossExtData) - + (Accessing ExtData) (Se accesează ExtData) - + (Accessing SaveData) (Se accesează SaveData) - + MB/s MB/s - + KB/s KB/s - + Artic Traffic: %1 %2%3 - + Speed: %1% Viteză: %1% - + Speed: %1% / %2% Viteză: %1% / %2% - + App: %1 FPS - + Frame: %1 ms (GPU: [CMD: %2 ms, SWP: %3 ms], IPC: %4 ms, SVC: %5 ms, Rem: %6 ms) - + Frame: %1 ms Cadru: %1 ms - + VOLUME: MUTE VOLUME: MUTE - + VOLUME: %1% Volume percentage (e.g. 50%) VOLUME: %1% - + %1 is missing. Please <a href='https://web.archive.org/web/20240304201103/https://citra-emu.org/wiki/dumping-system-archives-and-the-shared-fonts-from-a-3ds-console/'>dump your system archives</a>.<br/>Continuing emulation may result in crashes and bugs. - + A system archive Arhivul sistemului - + System Archive Not Found Fișier de Sistem Negăsit - + System Archive Missing Arhivul Sistemului nu este Prezent - + Save/load Error Eroare la salvare/încărcare - + Fatal Error Eroare Fatală - + A fatal error occurred. <a href='https://web.archive.org/web/20240228001712/https://community.citra-emu.org/t/how-to-upload-the-log-file/296'>Check the log</a> for details.<br/>Continuing emulation may result in crashes and bugs. - + Fatal Error encountered S-a Produs o Eroare Fatală - + Continue Continuă - + Quit Application - + OK OK - + Would you like to exit now? Doriți să ieșiți acum? - + The application is still running. Would you like to stop emulation? - + Playback Completed Redare Finalizată - + Movie playback completed. Redarea filmului a fost finalizată. - + Update Available - + Update %1 for Azahar is available. Would you like to download it? - + Primary Window Fereastră Primară - + Secondary Window Fereastră Secundară @@ -5022,239 +5038,254 @@ Would you like to download it? GameList - + IMPORTANT: Encrypted files and .3ds files are no longer supported. Decrypting and/or renaming to .cci may be necessary. <a href='https://azahar-emu.org/blog/game-loading-changes/'>Learn more.</a> - + Don't show again - - + + Compatibility Compatibilitate - - + + Region Regiune - - + + File type Tip de Fișier - - + + Size Mărime - - + + Play time Timp de joacă - + Favorite Favorit - + + Eject Cartridge + + + + + Insert Cartridge + + + + Open Deschide - + Application Location Locația Aplicației - + Save Data Location Locația Datelor Salvării - + Extra Data Location Locația Datelor Extra - + Update Data Location Locația Datelor de Actualizare - + DLC Data Location Locația Datelor DLC - + Texture Dump Location Locația Dump-ului de Texturi - + Custom Texture Location Locația Custom a Texturilor - + Mods Location Locația Modurilor - + Dump RomFS Dump RomFS - + Disk Shader Cache Disk Shader Cache - + Open Shader Cache Location Locația Cache-ului de Open Shader - + Delete OpenGL Shader Cache Șterge OpenGL Shader Cache - + Uninstall Dezinstalează - + Everything Totul - + Application - + Update Actualizare - + DLC DLC - + Remove Play Time Data Șterge Datele Timpului de Joacă - + Create Shortcut Creează un Shortcut - + Add to Desktop Adaugă pe desktop - + Add to Applications Menu Adaugă în Meniul de Aplicații - + + Stress Test: App Launch + + + + Properties Proprietăți - - - - + + + + Azahar Azahar - + Are you sure you want to completely uninstall '%1'? This will delete the application if installed, as well as any installed updates or DLC. - - + + %1 (Update) %1 (Actualizare) - - + + %1 (DLC) %1 (DLC) - + Are you sure you want to uninstall '%1'? Sunteți siguri că doriți să dezinstalați '%1'? - + Are you sure you want to uninstall the update for '%1'? Sunteți siguri că doriți să dezinstalați actualizarea pentru '%1'? - + Are you sure you want to uninstall all DLC for '%1'? Sunteți siguri că doriți să dezinstalați toate DLC-urile pentru '%1'? - + Scan Subfolders Scanează Subfolderele - + Remove Application Directory - + Move Up Mută în Sus - + Move Down Mută în Jos - + Open Directory Location Deschide Locația Directorului - + Clear Șterge - + Name Nume @@ -5262,77 +5293,77 @@ This will delete the application if installed, as well as any installed updates GameListItemCompat - + Perfect Perfect - + App functions flawless with no audio or graphical glitches, all tested functionality works as intended without any workarounds needed. - + Great Grozav - + App functions with minor graphical or audio glitches and is playable from start to finish. May require some workarounds. - + Okay Bun - + App functions with major graphical or audio glitches, but app is playable from start to finish with workarounds. - + Bad Rău - + App functions, but with major graphical or audio glitches. Unable to progress in specific areas due to glitches even with workarounds. - + Intro/Menu Introducere/Meniu - + App is completely unplayable due to major graphical or audio glitches. Unable to progress past the Start Screen. - + Won't Boot Nu Pornește - + The app crashes when attempting to startup. - + Not Tested Netestat - + The app has not yet been tested. @@ -5340,7 +5371,7 @@ Screen. GameListPlaceholder - + Double-click to add a new folder to the application list @@ -5348,27 +5379,27 @@ Screen. GameListSearchField - + of de - + result rezultat - + results rezultate - + Filter: Filtru: - + Enter pattern to filter Introduceți un tipar de filtrare @@ -5696,87 +5727,87 @@ Screen. Index de Ciclu: - + SRC1: %1, %2, %3, %4 SRC1: %1, %2, %3, %4 - + SRC2: %1, %2, %3, %4 SRC2: %1, %2, %3, %4 - + SRC3: %1, %2, %3, %4 SRC3: %1, %2, %3, %4 - + DEST_IN: %1, %2, %3, %4 DEST_IN: %1, %2, %3, %4 - + DEST_OUT: %1, %2, %3, %4 DEST_OUT: %1, %2, %3, %4 - + Address Registers: %1, %2 Registre de Adresă: %1, %2 - + Compare Result: %1, %2 Compară Rezultate: %1, %2 - + Static Condition: %1 Condiție Statică: %1 - + Dynamic Conditions: %1, %2 Condiții Dinamice: %1, %2 - + Loop Parameters: %1 (repeats), %2 (initializer), %3 (increment), %4 Parametrii de Buclă: %1 (repetiții), %2 (inițializator), %3 (increment), %4 - + Instruction offset: 0x%1 Offset de instrucțiuni: 0x%1 - + -> 0x%2 -> 0x%2 - + (last instruction) (ultima instrucțiune) @@ -6076,32 +6107,32 @@ Debug Message: Parolă: - + Room Name Nume de Sală - + Preferred Application - + Host Gazdă - + Players Jucători - + Refreshing Actualizând - + Refresh List Actualizează Lista @@ -7100,32 +7131,32 @@ They may have left the room. - + Unsupported encrypted application - + Invalid region Regiune invalidă - + Installed Titles - + System Titles - + Add New Application Directory - + Favorites diff --git a/dist/languages/ru_RU.ts b/dist/languages/ru_RU.ts index 1dcb9ad96..2aa8f7a3e 100644 --- a/dist/languages/ru_RU.ts +++ b/dist/languages/ru_RU.ts @@ -298,8 +298,8 @@ This would ban both their forum username and their IP address. - Emulation: - Эмуляция: + Emulation + Эмуляция @@ -403,6 +403,7 @@ This would ban both their forum username and their IP address. + Camera Камера @@ -414,8 +415,8 @@ This would ban both their forum username and their IP address. - Camera to configure: - Настраиваемая камера: + Camera to Configure + @@ -435,8 +436,8 @@ This would ban both their forum username and their IP address. - Camera mode: - Режим камеры: + Camera mode + @@ -456,8 +457,8 @@ This would ban both their forum username and their IP address. - Camera position: - Позиция камеры: + Camera position + @@ -482,8 +483,8 @@ This would ban both their forum username and their IP address. - Camera Image Source: - Источник отображения для камеры: + Camera Image Source + @@ -502,8 +503,8 @@ This would ban both their forum username and their IP address. - File: - Файл: + File + @@ -516,11 +517,6 @@ This would ban both their forum username and their IP address. Select the system camera to use Выберите использование системной камеры - - - Camera: - Камера: - <Default> @@ -534,8 +530,8 @@ This would ban both their forum username and their IP address. - Flip: - Поворот изображения: + Flip + @@ -1024,7 +1020,7 @@ Would you like to ignore the error and continue? Enable Linear Filtering - Включить линейную фильтрацию + @@ -1088,8 +1084,8 @@ Would you like to ignore the error and continue? - Reverse Side by Side - Рядом (в обратном порядке) + Side by Side Full Width + @@ -1139,7 +1135,7 @@ Would you like to ignore the error and continue? Disable Right Eye Rendering - Отключить отрисовку правого глаза + @@ -1147,49 +1143,54 @@ Would you like to ignore the error and continue? <html><head/><body><p>Выключить отрисовку правого глаза</p><p>Отключает отрисовку изображения для правого глаза, когда не используется стереоскопический режим. В некоторых приложениях сильно повышает производительность, но в других может вызвать мелькание.</p></body></html> - + + Swap Eyes + + + + Utility Инструменты - + <html><head/><body><p>Replace textures with PNG files.</p><p>Textures are loaded from load/textures/[Title ID]/.</p></body></html> <html><head/><body><p>Заменить текстуры файлами PNG.</p><p>Текстуры загружаются из папки load/textures/[Title ID]/.</p></body></html> - - Use Custom Textures - Использовать внешние текстуры + + Use custom textures + - + <html><head/><body><p>Dump textures to PNG files.</p><p>Textures are dumped to dump/textures/[Title ID]/.</p></body></html> <html><head/><body><p>Создать дамп текстур в виде файлов PNG.</p><p>Дамп текстур создаётся в папке dump/textures/[Title ID]/.</p></body></html> - - Dump Textures - Создать дамп текстур + + Dump textures + - + <html><head/><body><p>Load all custom textures into memory on boot, instead of loading them when the application requires them.</p></body></html> <html><head/><body><p>Загружать сразу все внешние текстуры в память при запуске вместо их подгрузки по мере востребованности приложением.</p></body></html> - - Preload Custom Textures - Предзагрузка внешних текстур + + Preload custom textures + - + <html><head/><body><p>Load custom textures asynchronously with background threads to reduce loading stutter</p></body></html> <html><head/><body><p>Загружать внешние текстуры асинхронно в фоновых потоках для снижения подвисаний при загрузке</p></body></html> - - Async Custom Texture Loading - Асинхронная загрузка внешних текстур + + Async custom texture loading + @@ -1246,13 +1247,13 @@ Would you like to ignore the error and continue? - Set emulation speed: - Установить скорость эмуляции: + Set emulation speed + - Emulation Speed: - Скорость эмуляции: + Emulation Speed + @@ -1363,12 +1364,12 @@ Would you like to ignore the error and continue? - SPIR-V Shader Generation - Генерация шейдеров SPIR-V + SPIR-V shader generation + - Disable GLSL -> SPIR-V Optimizer + Disable GLSL -> SPIR-V optimizer @@ -1388,8 +1389,8 @@ Would you like to ignore the error and continue? - Enable Hardware Shader - Включить аппаратный шейдер + Enable hardware shader + @@ -1398,8 +1399,8 @@ Would you like to ignore the error and continue? - Accurate Multiplication - Точное умножение + Accurate multiplication + @@ -1408,8 +1409,8 @@ Would you like to ignore the error and continue? - Enable Shader JIT - Включить JIT-компиляцию шейдеров + Enable shader JIT + @@ -1418,8 +1419,8 @@ Would you like to ignore the error and continue? - Enable Async Shader Compilation - Включить асинхронную компиляцию шейдеров + Enable async shader compilation + @@ -1428,8 +1429,8 @@ Would you like to ignore the error and continue? - Enable Async Presentation - Включить асинхронную презентацию + Enable async presentation + @@ -1468,8 +1469,8 @@ Would you like to ignore the error and continue? - Use Disk Shader Cache - Использовать кеш шейдеров на диске + Use disk shader cache + @@ -1493,8 +1494,8 @@ Would you like to ignore the error and continue? - Delay application render thread: - Задержка потока отрисовки приложения: + Delay Application Render Thread + @@ -1982,13 +1983,13 @@ Would you like to ignore the error and continue? - Swap Screens - Поменять экраны местами + Swap screens + - Rotate Screens Upright - Повернуть экраны вертикально + Rotate screens upright + @@ -2104,8 +2105,8 @@ Would you like to ignore the error and continue? - <html><head/><body><p>Bottom Screen Opacity % (OpenGL Only)</p></body></html> - <html><head/><body><p>Процент прозрачности нижнего экрана (только OpenGL)</p></body></html> + <html><head/><body><p>Bottom Screen Opacity %</p></body></html> + @@ -2452,8 +2453,8 @@ Would you like to ignore the error and continue? - Use Virtual SD - Использовать виртуальную SD-карту + Use virtual SD card + @@ -2462,7 +2463,7 @@ Would you like to ignore the error and continue? - Use Custom Storage + Use custom storage location @@ -2549,8 +2550,8 @@ online features (if installed) - Region: - Регион: + Region + Регион @@ -2558,326 +2559,337 @@ online features (if installed) - + + Apply region free patch to +installed applications. + + + + + Patches the region of installed applications to be region free, so that they always appear on the home menu. + + + + Username Имя пользователя - + Birthday Дата рождения - + January Январь - + February Февраль - + March Март - + April Апрель - + May Май - + June Июнь - + July Июль - + August Август - + September Сентябрь - + October Октябрь - + November Ноябрь - + December Декабрь - + Language Язык - + Note: this can be overridden when region setting is auto-select Примечание: этот параметр может быть переопределён, если включён параметр автовыбора региона - + Japanese (日本語) Японский (日本語) - + English Английский (English) - + French (français) Французский (français) - + German (Deutsch) Немецкий (Deutsch) - + Italian (italiano) Итальянский (italiano) - + Spanish (español) Испанский (español) - + Simplified Chinese (简体中文) Упрощённый китайский (简体中文) - + Korean (한국어) Корейский (한국어) - + Dutch (Nederlands) Голландский (Nederlands) - + Portuguese (português) Португальский (português) - + Russian (Русский) Русский - + Traditional Chinese (正體中文) Традиционный китайский (正體中文) - + Sound output mode Режим вывода звука - + Mono Моно - + Stereo Стерео - + Surround Объёмный - + Country Страна - + Clock Часы - + System Clock Системные часы - + Fixed Time Фиксированное время - + Startup time Время запуска - + yyyy-MM-ddTHH:mm:ss dd-MM-yyyyTHH:mm:ss - + Offset time - + days - + HH:mm:ss - + Initial System Ticks - + Random Случайно - + Fixed Статично - + Initial System Ticks Override - + Play Coins - + <html><head/><body><p>Number of steps per hour reported by the pedometer. Range from 0 to 65,535.</p></body></html> - + Pedometer Steps per Hour - + Run System Setup when Home Menu is launched - + Console ID: ID консоли: - - + + Regenerate Пересоздать - + MAC: - - 3GX Plugin Loader: + + 3GX Plugin Loader - + Enable 3GX plugin loader - + Allow applications to change plugin loader state - + Real Console Unique Data - + Your real console is linked to Azahar. - + Unlink - + OTP - - - - + + + + Choose - + SecureInfo_A/B - + LocalFriendCodeSeed_A/B - + movable.sed - + System settings are available only when applications is not running. @@ -3587,76 +3599,76 @@ online features (if installed) - - + + Console ID: 0x%1 ID консоли: 0x%1 - - + + MAC: %1 - + This will replace your current virtual 3DS console ID with a new one. Your current virtual 3DS console ID will not be recoverable. This might have unexpected effects in applications. This might fail if you use an outdated config save. Continue? - - - + + + Warning Предупреждение - + This will replace your current MAC address with a new one. It is not recommended to do this if you got the MAC address from your real console using the setup tool. Continue? - + This action will unlink your real console from Azahar, with the following consequences:<br><ul><li>Your OTP, SecureInfo and LocalFriendCodeSeed will be removed from Azahar.</li><li>Your friend list will reset and you will be logged out of your NNID/PNID account.</li><li>System files and eshop titles obtained through Azahar will become inaccessible until the same console is linked again (save data will not be lost).</li></ul><br>Continue? - + Invalid country for configured region - + Invalid country for console unique data - + Status: Loaded - + Status: Loaded (Invalid Signature) - + Status: Loaded (Region Changed) - + Status: Not Found - + Status: Invalid - + Status: IO Error @@ -3774,13 +3786,13 @@ Drag points to change position, or double-click table cells to edit values. - Interface language: - Язык интерфейса: + Interface Language + - Theme: - Тема: + Theme + @@ -3789,8 +3801,8 @@ Drag points to change position, or double-click table cells to edit values. - Icon Size: - Размер значков: + Icon Size + @@ -3810,8 +3822,8 @@ Drag points to change position, or double-click table cells to edit values. - Row 1 Text: - Текст на 1-й строке: + Row 1 Text + @@ -3845,18 +3857,18 @@ Drag points to change position, or double-click table cells to edit values. - Row 2 Text: - Текст на 2-й строке: + Row 2 Text + - Hide Titles without Icon - Скрывать названия игр без значков + Hide titles without icon + - Single Line Mode - Однострочный режим + Single line mode + @@ -3865,7 +3877,7 @@ Drag points to change position, or double-click table cells to edit values. - Show Advanced Frame Time Info + Show advanced frame time info @@ -3948,12 +3960,12 @@ Drag points to change position, or double-click table cells to edit values. DirectConnectWindow - + Connecting Подключение - + Connect Подключиться @@ -4072,582 +4084,596 @@ Please check your FFmpeg installation used for compilation. GMainWindow - + No Suitable Vulkan Devices Detected - + Vulkan initialization failed during boot.<br/>Your GPU may not support Vulkan 1.1, or you do not have the latest graphics driver. - + Current Artic traffic speed. Higher values indicate bigger transfer loads. - - + + Current emulation speed. Values higher or lower than 100% indicate emulation is running faster or slower than a 3DS. Текущая скорость эмуляции. Значения выше или ниже 100% указывают на то, что эмуляция работает быстрее или медленнее, чем в 3DS. - - + + How many frames per second the app is currently displaying. This will vary from app to app and scene to scene. - - + + Time taken to emulate a 3DS frame, not counting framelimiting or v-sync. For full-speed emulation this should be at most 16.67 ms. Время, затрачиваемое на эмуляцию кадра 3DS, без учёта ограничения кадров или вертикальной синхронизации. Для полноскоростной эмуляции это значение должно быть не более 16,67 мс. - + MicroProfile (unavailable) - + Clear Recent Files Очистить последние файлы - + &Continue &Продолжить - + &Pause - + Azahar is running an application TRANSLATORS: This string is shown to the user to explain why Citra needs to prevent the computer from sleeping - - + + Invalid App Format - - + + Your app format is not supported.<br/>Please follow the guides to redump your <a href='https://web.archive.org/web/20240304210021/https://citra-emu.org/wiki/dumping-game-cartridges/'>game cartridges</a> or <a href='https://web.archive.org/web/20240304210011/https://citra-emu.org/wiki/dumping-installed-titles/'>installed titles</a>. - + App Corrupted - + Your app is corrupted. <br/>Please follow the guides to redump your <a href='https://web.archive.org/web/20240304210021/https://citra-emu.org/wiki/dumping-game-cartridges/'>game cartridges</a> or <a href='https://web.archive.org/web/20240304210011/https://citra-emu.org/wiki/dumping-installed-titles/'>installed titles</a>. - + App Encrypted - + Your app is encrypted. <br/><a href='https://azahar-emu.org/blog/game-loading-changes/'>Please check our blog for more info.</a> - + Unsupported App - + GBA Virtual Console is not supported by Azahar. Azahar не поддерживает GBA Virtual Console. - - + + Artic Server - + + Invalid system mode + + + + + New 3DS exclusive applications cannot be loaded without enabling the New 3DS mode. + + + + Error while loading App! - + An unknown error occurred. Please see the log for more details. Произошла неизвестная ошибка. Подробную информацию см. в журнале. - + CIA must be installed before usage Перед использованием необходимо установить CIA-файл - + Before using this CIA, you must install it. Do you want to install it now? Перед использованием этого CIA-файла, необходимо его установить. Установить сейчас? - + Quick Load Быстрая загрузка - + Quick Save Быстрое сохранение - - + + Slot %1 Ячейка %1 - + %2 %3 - + Quick Save - %1 - + Quick Load - %1 - + Slot %1 - %2 %3 - + Error Opening %1 Folder Ошибка открытия папки %1 - - + + Folder does not exist! Папка не существует! - + Remove Play Time Data - + Reset play time? Сбросить игровое время? - - - - + + + + Create Shortcut Создать ярлык - + Do you want to launch the application in fullscreen? Запускать приложение в полном экране? - + Successfully created a shortcut to %1 Успешно создан ярлык для %1 - + This will create a shortcut to the current AppImage. This may not work well if you update. Continue? - + Failed to create a shortcut to %1 Не удалось создать ярлык для %1 - + Create Icon Создать иконку - + Cannot create icon file. Path "%1" does not exist and cannot be created. - + Dumping... Создание дампа... - - + + Cancel Отмена - - - - - - - - - + + + + + + + + + Azahar Azahar - + Could not dump base RomFS. Refer to the log for details. Не удалось создать дамп base RomFS. Подробную информацию см. в журнале. - + Error Opening %1 Ошибка при открытии %1 - + Select Directory Выбрать каталог - + Properties Свойства - + The application properties could not be loaded. - + 3DS Executable (%1);;All Files (*.*) %1 is an identifier for the 3DS executable file extensions. Исполняемый файл 3DS (%1);;Все файлы (*.*) - + Load File Загрузка файла - - + + Set Up System Files - + <p>Azahar needs console unique data and firmware files from a real console to be able to use some of its features.<br>Such files and data can be set up with the <a href=https://github.com/azahar-emu/ArticSetupTool>Azahar Artic Setup Tool</a><br>Notes:<ul><li><b>This operation will install console unique data to Azahar, do not share your user or nand folders<br>after performing the setup process!</b></li><li>While doing the setup process, Azahar will link to the console running the setup tool. You can unlink the<br>console later from the System tab in the emulator configuration menu.</li><li>Do not go online with both Azahar and your 3DS console at the same time after setting up system files,<br>as it could cause issues.</li><li>Old 3DS setup is needed for the New 3DS setup to work (doing both setup modes is recommended).</li><li>Both setup modes will work regardless of the model of the console running the setup tool.</li></ul><hr></p> - + Enter Azahar Artic Setup Tool address: - + <br>Choose setup mode: Выберите режим установки: - + (ℹ️) Old 3DS setup (ℹ️) Обычная 3DS - - + + Setup is possible. - + (⚠) New 3DS setup (⚠) New 3DS - + Old 3DS setup is required first. Сначала требуется установка обычной 3DS. - + (✅) Old 3DS setup - - + + Setup completed. - + (ℹ️) New 3DS setup - + (✅) New 3DS setup - + The system files for the selected mode are already set up. Reinstall the files anyway? - + Load Files Загрузка файлов - + 3DS Installation File (*.cia *.zcia) - - - + + + All Files (*.*) Все файлы (*.*) - + Connect to Artic Base Подключиться к Artic Base - + Enter Artic Base server address: - + %1 has been installed successfully. %1 был успешно установлен. - + Unable to open File Не удалось открыть файл - + Could not open %1 Не удалось открыть %1 - + Installation aborted Установка прервана - + The installation of %1 was aborted. Please see the log for more details Установка %1 была прервана. Более подробную информацию см. в журнале. - + Invalid File Недопустимый файл - + %1 is not a valid CIA %1 — недопустимый CIA-файл - + CIA Encrypted CIA файл зашифрован - + Your CIA file is encrypted.<br/><a href='https://azahar-emu.org/blog/game-loading-changes/'>Please check our blog for more info.</a> - + Unable to find File Не удалось найти файл - + Could not find %1 - - - - Error compressing file + + + + + Z3DS Compression - - File compress operation failed, check log for details. + + Failed to compress some files, check log for details. - - - - Error decompressing file - Ошибра при разжатии файла - - - - File decompress operation failed, check log for details. + + Failed to decompress some files, check log for details. - + + All files have been compressed successfully. + + + + + All files have been decompressed successfully. + + + + Uninstalling '%1'... Удаление '%1'... - + Failed to uninstall '%1'. - + Successfully uninstalled '%1'. Успешно удалён '%1'. - + File not found Файл не найден - + File "%1" not found Файл «%1» не найден - + Savestates - + Warning: Savestates are NOT a replacement for in-application saves, and are not meant to be reliable. Use at your own risk! - - - + + + Error opening amiibo data file - + A tag is already in use. - + Application is not looking for amiibos. - + Amiibo File (%1);; All Files (*.*) Файл Amiibo (%1);; Все файлы (*.*) - + Load Amiibo Загрузка Amiibo - + Unable to open amiibo file "%1" for reading. - + Record Movie Запись видеоролика - + Movie recording cancelled. Запись видеоролика отменена. - - + + Movie Saved Сохранение видеоролика - - + + The movie is successfully saved. Видеоролик сохранён успешно. - + Application will unpause - + The application will be unpaused, and the next frame will be captured. Is this okay? - + Invalid Screenshot Directory - + Cannot create specified screenshot directory. Screenshot path is set back to its default value. - + Could not load video dumper - + FFmpeg could not be loaded. Make sure you have a compatible version installed. To install FFmpeg to Azahar, press Open and select your FFmpeg directory. @@ -4656,274 +4682,264 @@ To view a guide on how to install FFmpeg, press Help. - - Load 3DS ROM File + + Load 3DS ROM Files - - 3DS ROM Files (*.cia *cci *3dsx *cxi) + + 3DS ROM Files (*.cia *.cci *.3dsx *.cxi) - - The selected file is not a compatible 3DS ROM format. Make sure you have chosen the right file, and that it is not encrypted. - - - - - The selected file is already compressed. - - - - + 3DS Compressed ROM File (*.%1) - + Save 3DS Compressed ROM File - - Load 3DS Compressed ROM File + + Select Output 3DS Compressed ROM Folder - + + Load 3DS Compressed ROM Files + + + + 3DS Compressed ROM Files (*.zcia *zcci *z3dsx *zcxi) - - The selected file is not a compatible compressed 3DS ROM format. Make sure you have chosen the right file. - - - - - The selected file is already decompressed. - - - - + 3DS ROM File (*.%1) - + Save 3DS ROM File - + + Select Output 3DS ROM Folder + + + + Select FFmpeg Directory Выберите каталог FFmpeg - + The provided FFmpeg directory is missing %1. Please make sure the correct directory was selected. - + FFmpeg has been sucessfully installed. - + Installation of FFmpeg failed. Check the log file for details. - + Could not start video dumping.<br>Please ensure that the video encoder is configured correctly.<br>Refer to the log for details. - + Recording %1 - + Playing %1 / %2 - + Movie Finished - + (Accessing SharedExtData) - + (Accessing SystemSaveData) - + (Accessing BossExtData) - + (Accessing ExtData) - + (Accessing SaveData) - + MB/s - + KB/s - + Artic Traffic: %1 %2%3 - + Speed: %1% Скорость: %1% - + Speed: %1% / %2% Скорость: %1% / %2% - + App: %1 FPS - + Frame: %1 ms (GPU: [CMD: %2 ms, SWP: %3 ms], IPC: %4 ms, SVC: %5 ms, Rem: %6 ms) - + Frame: %1 ms Кадр: %1 мс - + VOLUME: MUTE ГРОМКОСТЬ: ЗАГЛУШЕНО - + VOLUME: %1% Volume percentage (e.g. 50%) ГРОМКОСТЬ: %1% - + %1 is missing. Please <a href='https://web.archive.org/web/20240304201103/https://citra-emu.org/wiki/dumping-system-archives-and-the-shared-fonts-from-a-3ds-console/'>dump your system archives</a>.<br/>Continuing emulation may result in crashes and bugs. - + A system archive Системный архив - + System Archive Not Found Системный архив не найден - + System Archive Missing Не удалось найти системный архив - + Save/load Error Ошибка сохранения/загрузки - + Fatal Error Неустранимая ошибка - + A fatal error occurred. <a href='https://web.archive.org/web/20240228001712/https://community.citra-emu.org/t/how-to-upload-the-log-file/296'>Check the log</a> for details.<br/>Continuing emulation may result in crashes and bugs. - + Fatal Error encountered Произошла неустранимая ошибка - + Continue Продолжить - + Quit Application Закрыть Приложение - + OK OK - + Would you like to exit now? Выйти сейчас? - + The application is still running. Would you like to stop emulation? - + Playback Completed Воспроизведение завершено - + Movie playback completed. Воспроизведение видеоролика завершено. - + Update Available Доступно обновление - + Update %1 for Azahar is available. Would you like to download it? - + Primary Window Основной Экран - + Secondary Window Дополнительный Экран @@ -5029,239 +5045,254 @@ Would you like to download it? GameList - + IMPORTANT: Encrypted files and .3ds files are no longer supported. Decrypting and/or renaming to .cci may be necessary. <a href='https://azahar-emu.org/blog/game-loading-changes/'>Learn more.</a> - + Don't show again Не показывать снова - - + + Compatibility Совместимость - - + + Region Регион - - + + File type Тип файла - - + + Size Размер - - + + Play time Игровое время - + Favorite Избранное - + + Eject Cartridge + + + + + Insert Cartridge + + + + Open Открыть - + Application Location Путь к приложению - + Save Data Location Путь к файлам сохранений - + Extra Data Location - + Update Data Location Путь к файлам обновлений - + DLC Data Location Путь к файлам DLC - + Texture Dump Location Путь к файлам дампа текстур - + Custom Texture Location Путь к пользовательским текстурам - + Mods Location Путь к модификациям - + Dump RomFS Создать дамп RomFS - + Disk Shader Cache - + Open Shader Cache Location - + Delete OpenGL Shader Cache - + Uninstall Удалить - + Everything Всё - + Application Приложение - + Update Обновления - + DLC - + Remove Play Time Data - + Create Shortcut Создать ярлык - + Add to Desktop Добавить на рабочий стол - + Add to Applications Menu - + + Stress Test: App Launch + + + + Properties Свойства - - - - + + + + Azahar Azahar - + Are you sure you want to completely uninstall '%1'? This will delete the application if installed, as well as any installed updates or DLC. - - + + %1 (Update) - - + + %1 (DLC) - + Are you sure you want to uninstall '%1'? - + Are you sure you want to uninstall the update for '%1'? - + Are you sure you want to uninstall all DLC for '%1'? - + Scan Subfolders Сканировать подпапки - + Remove Application Directory - + Move Up - + Move Down - + Open Directory Location Открыть расположение каталога - + Clear Очистить - + Name Имя @@ -5269,77 +5300,77 @@ This will delete the application if installed, as well as any installed updates GameListItemCompat - + Perfect Отлично - + App functions flawless with no audio or graphical glitches, all tested functionality works as intended without any workarounds needed. - + Great Хорошо - + App functions with minor graphical or audio glitches and is playable from start to finish. May require some workarounds. - + Okay Удовлетворительно - + App functions with major graphical or audio glitches, but app is playable from start to finish with workarounds. - + Bad Плохо - + App functions, but with major graphical or audio glitches. Unable to progress in specific areas due to glitches even with workarounds. - + Intro/Menu Вступительный видеоролик/меню - + App is completely unplayable due to major graphical or audio glitches. Unable to progress past the Start Screen. - + Won't Boot Не запускается - + The app crashes when attempting to startup. - + Not Tested Не проверялась - + The app has not yet been tested. @@ -5347,7 +5378,7 @@ Screen. GameListPlaceholder - + Double-click to add a new folder to the application list @@ -5355,27 +5386,27 @@ Screen. GameListSearchField - + of из - + result результат - + results результатов - + Filter: Фильтр: - + Enter pattern to filter Введите шаблон для фильтрации @@ -5703,87 +5734,87 @@ Screen. Индекс цикла: - + SRC1: %1, %2, %3, %4 SRC1: %1, %2, %3, %4 - + SRC2: %1, %2, %3, %4 SRC2: %1, %2, %3, %4 - + SRC3: %1, %2, %3, %4 SRC3: %1, %2, %3, %4 - + DEST_IN: %1, %2, %3, %4 DEST_IN: %1, %2, %3, %4 - + DEST_OUT: %1, %2, %3, %4 DEST_OUT: %1, %2, %3, %4 - + Address Registers: %1, %2 Адресные регистры: %1, %2 - + Compare Result: %1, %2 Сравнить результат: %1, %2 - + Static Condition: %1 Статическое состояние: %1 - + Dynamic Conditions: %1, %2 Динамические состояния: %1, %2 - + Loop Parameters: %1 (repeats), %2 (initializer), %3 (increment), %4 Параметры цикла: %1 (повторов), %2 (инициализатор), %3 (приращение), %4 - + Instruction offset: 0x%1 Смещение инструкции: 0x%1 - + -> 0x%2 -> 0x%2 - + (last instruction) (последняя инструкция) @@ -6083,32 +6114,32 @@ Debug Message: Пароль: - + Room Name Название комнаты - + Preferred Application - + Host Хост - + Players Игроки - + Refreshing Обновление - + Refresh List Обновить список @@ -6609,7 +6640,7 @@ Debug Message: File: - Файл: + @@ -6701,7 +6732,7 @@ Debug Message: File: - Файл: + @@ -7107,32 +7138,32 @@ They may have left the room. - + Unsupported encrypted application - + Invalid region Недопустимый регион - + Installed Titles Названия установленных игр - + System Titles Названия предустановленных игр - + Add New Application Directory - + Favorites diff --git a/dist/languages/sv.ts b/dist/languages/sv.ts index 1270227f5..5579f2aec 100644 --- a/dist/languages/sv.ts +++ b/dist/languages/sv.ts @@ -298,8 +298,8 @@ Detta skulle bannlysa både deras forumanvändarnamn och deras IP-adress. - Emulation: - Emulering: + Emulation + Emulering @@ -403,6 +403,7 @@ Detta skulle bannlysa både deras forumanvändarnamn och deras IP-adress. + Camera Kamera @@ -414,8 +415,8 @@ Detta skulle bannlysa både deras forumanvändarnamn och deras IP-adress. - Camera to configure: - Kamera att konfigurera: + Camera to Configure + Kamera att konfigurera @@ -435,8 +436,8 @@ Detta skulle bannlysa både deras forumanvändarnamn och deras IP-adress. - Camera mode: - Kameraläge: + Camera mode + Kameraläge @@ -456,8 +457,8 @@ Detta skulle bannlysa både deras forumanvändarnamn och deras IP-adress. - Camera position: - Kameraposition: + Camera position + Kameraposition @@ -482,8 +483,8 @@ Detta skulle bannlysa både deras forumanvändarnamn och deras IP-adress. - Camera Image Source: - Inmatningskälla för kamera: + Camera Image Source + Kamerabildskälla @@ -502,8 +503,8 @@ Detta skulle bannlysa både deras forumanvändarnamn och deras IP-adress. - File: - Fil: + File + Fil @@ -516,11 +517,6 @@ Detta skulle bannlysa både deras forumanvändarnamn och deras IP-adress.Select the system camera to use Välj systemkameran att använda - - - Camera: - Kamera: - <Default> @@ -534,8 +530,8 @@ Detta skulle bannlysa både deras forumanvändarnamn och deras IP-adress. - Flip: - Vänd: + Flip + Vänd @@ -1024,7 +1020,7 @@ Vill du ignorera felet och fortsätta? Enable Linear Filtering - Aktivera linjär filtering + Aktivera linjär filtrering @@ -1088,8 +1084,8 @@ Vill du ignorera felet och fortsätta? - Reverse Side by Side - Omvänd sida vid sida + Side by Side Full Width + Sida vid sida full bredd @@ -1139,7 +1135,7 @@ Vill du ignorera felet och fortsätta? Disable Right Eye Rendering - Avaktivera rendering för höger öga + Inaktivera rendering för höger öga @@ -1147,48 +1143,53 @@ Vill du ignorera felet och fortsätta? <html><head/><body><p>Inaktivera rendering av höger öga</p><p>Inaktiverar rendering av högerögats bild när stereoskopiskt läge inte används. Förbättrar prestandan avsevärt i vissa applikationer, men kan orsaka flimmer i andra.</p></body></html> - + + Swap Eyes + Byt ögon + + + Utility Verktyg - + <html><head/><body><p>Replace textures with PNG files.</p><p>Textures are loaded from load/textures/[Title ID]/.</p></body></html> <html><head/><body><p>Ersätt texturer med PNG- filer.</p><p>Texturer läses in från load/textures/[Title ID]/.</p></body></html> - - Use Custom Textures + + Use custom textures Använd anpassade texturer - + <html><head/><body><p>Dump textures to PNG files.</p><p>Textures are dumped to dump/textures/[Title ID]/.</p></body></html> <html><head/><body><p>Dumpa texturer till PNG-filer.</p><p>Texturer dumpas till dump/textures/[Title ID]/.</p></body></html> - - Dump Textures + + Dump textures Dumpa texturer - + <html><head/><body><p>Load all custom textures into memory on boot, instead of loading them when the application requires them.</p></body></html> <html><head/><body><p>Läs in alla anpassade texturer i minnet vid uppstart, istället för att läsa in dem när programmet kräver dem.</p></body></html> - - Preload Custom Textures - Förinläs anpassade texturer + + Preload custom textures + Förladda anpassade texturer - + <html><head/><body><p>Load custom textures asynchronously with background threads to reduce loading stutter</p></body></html> <html><head/><body><p>Läs in anpassade texturer asynkront med bakgrundstrådar för att minska inläsningsskakning</p></body></html> - - Async Custom Texture Loading + + Async custom texture loading Asynkron inläsning av anpassade texturer @@ -1246,13 +1247,13 @@ Vill du ignorera felet och fortsätta? - Set emulation speed: - Ställ in emuleringshastighet: + Set emulation speed + Ställ in emuleringshastighet - Emulation Speed: - Emuleringshastighet: + Emulation Speed + Emuleringshastighet @@ -1363,13 +1364,13 @@ Vill du ignorera felet och fortsätta? - SPIR-V Shader Generation - SPIR-V Shader-generering + SPIR-V shader generation + SPIR-V shader generation - Disable GLSL -> SPIR-V Optimizer - Inaktivera GLSL -> SPIR-V Optimizer + Disable GLSL -> SPIR-V optimizer + Inaktivera GLSL -> SPIR-V-optimerare @@ -1388,7 +1389,7 @@ Vill du ignorera felet och fortsätta? - Enable Hardware Shader + Enable hardware shader Aktivera hårdvaru-shader @@ -1398,7 +1399,7 @@ Vill du ignorera felet och fortsätta? - Accurate Multiplication + Accurate multiplication Exakt multiplikation @@ -1408,8 +1409,8 @@ Vill du ignorera felet och fortsätta? - Enable Shader JIT - Aktivera Shader JIT + Enable shader JIT + Aktivera shader JIT @@ -1418,7 +1419,7 @@ Vill du ignorera felet och fortsätta? - Enable Async Shader Compilation + Enable async shader compilation Aktivera asynkron shader-kompilering @@ -1428,8 +1429,8 @@ Vill du ignorera felet och fortsätta? - Enable Async Presentation - Aktivera asynkron presentation + Enable async presentation + Aktivera async-presentation @@ -1468,8 +1469,8 @@ Vill du ignorera felet och fortsätta? - Use Disk Shader Cache - Använd disk shadercache + Use disk shader cache + Använd diskcache för shader @@ -1493,8 +1494,8 @@ Vill du ignorera felet och fortsätta? - Delay application render thread: - Fördröj applikationens renderingstråd: + Delay Application Render Thread + Fördröj applikationsrenderingstråd @@ -1982,13 +1983,13 @@ Vill du ignorera felet och fortsätta? - Swap Screens + Swap screens Växla skärmar - Rotate Screens Upright - Rotera skärmarna upprätt + Rotate screens upright + Rotera skärmar upprätt @@ -2104,8 +2105,8 @@ Vill du ignorera felet och fortsätta? - <html><head/><body><p>Bottom Screen Opacity % (OpenGL Only)</p></body></html> - <html><head/><body><p>Opacitet för nedre skärmen % (endast OpenGL)</p></body></html> + <html><head/><body><p>Bottom Screen Opacity %</p></body></html> + <html><head/><body><p>Opacitet för nedre skärm %</p></body></html> @@ -2452,8 +2453,8 @@ Vill du ignorera felet och fortsätta? - Use Virtual SD - Använd Virtual SD + Use virtual SD card + Använd virtuellt SD-kort @@ -2462,8 +2463,8 @@ Vill du ignorera felet och fortsätta? - Use Custom Storage - Använd anpassad lagring + Use custom storage location + Använd anpassad lagringsplats @@ -2550,8 +2551,8 @@ onlinefunktioner (om installerade) - Region: - Region: + Region + Region @@ -2559,326 +2560,338 @@ onlinefunktioner (om installerade) Välj automatiskt - + + Apply region free patch to +installed applications. + Tillämpa regionsfri patch till +installerade applikationer. + + + + Patches the region of installed applications to be region free, so that they always appear on the home menu. + Patchar regionen för installerade applikationer till att vara regionsfria så att de alltid visas på hemmenyn. + + + Username Användarnamn - + Birthday Födelsedag - + January Januari - + February Februari - + March Mars - + April April - + May Maj - + June Juni - + July Juli - + August Augusti - + September September - + October Oktober - + November November - + December December - + Language Språk - + Note: this can be overridden when region setting is auto-select Obs: detta kan åsidosättas när regioninställningen är automatiskt vald - + Japanese (日本語) Japanska (日本語) - + English Engelska - + French (français) Franska (français) - + German (Deutsch) Tyska (Deutsch) - + Italian (italiano) Italienska (italiano) - + Spanish (español) Spanska (español) - + Simplified Chinese (简体中文) Förenklad kinesiska (简体中文) - + Korean (한국어) Koreanska (한국어) - + Dutch (Nederlands) Nederländska (Nederlands) - + Portuguese (português) Portugisiska (português) - + Russian (Русский) Ryska (Русский) - + Traditional Chinese (正體中文) Traditionell kinesiska (正體中文) - + Sound output mode Läge för ljudutmatning - + Mono Mono - + Stereo Stereo - + Surround Surround - + Country Land - + Clock Klocka - + System Clock Systemklocka - + Fixed Time Fast tid - + Startup time Uppstartstid - + yyyy-MM-ddTHH:mm:ss yyyy-MM-ddTHH:mm:ss - + Offset time - Offset-tid + Tidsförskjutning - + days dagar - + HH:mm:ss HH:mm:ss - + Initial System Ticks Initiala systemticks - + Random Slumpmässig - + Fixed Fast - + Initial System Ticks Override Åsidosätt Initial System Ticks - + Play Coins Spelmynt - + <html><head/><body><p>Number of steps per hour reported by the pedometer. Range from 0 to 65,535.</p></body></html> <html><head/><body><p>Antal steg per timme som rapporterats av stegmätaren. Intervall från 0 till 65,535.</p></body></html> - + Pedometer Steps per Hour Stegmätare steg per timme - + Run System Setup when Home Menu is launched Kör System Setup när Home Menu startas - + Console ID: Konsol-ID: - - + + Regenerate Generera om - + MAC: MAC: - - 3GX Plugin Loader: - Inläsare för 3GX-insticksmodul: + + 3GX Plugin Loader + 3GX-insticksläsare - + Enable 3GX plugin loader Aktivera inläsare för 3GX-insticksmodul - + Allow applications to change plugin loader state Tillåt applikationer att ändra tillståndet för inläsaren av insticksmoduler - + Real Console Unique Data Unikt data från riktig konsoll - + Your real console is linked to Azahar. Din riktiga konsoll är länkad till Azahar. - + Unlink Koppla bort - + OTP OTP - - - - + + + + Choose Välj - + SecureInfo_A/B SecureInfo_A/B - + LocalFriendCodeSeed_A/B LocalFriendCodeSeed_A/B - + movable.sed movable.sed - + System settings are available only when applications is not running. Systeminställningarna är endast tillgängliga när applikationer inte körs. @@ -3588,76 +3601,76 @@ onlinefunktioner (om installerade) Sed-fil (*.sed);;Alla filer (*.*) - - + + Console ID: 0x%1 Konsol-ID: 0x%1 - - + + MAC: %1 MAC: %1 - + This will replace your current virtual 3DS console ID with a new one. Your current virtual 3DS console ID will not be recoverable. This might have unexpected effects in applications. This might fail if you use an outdated config save. Continue? Detta kommer att ersätta ditt nuvarande virtuella 3DS-konsol-ID med ett nytt. Ditt nuvarande virtuella 3DS-konsol-ID kommer inte att kunna återställas. Detta kan ha oväntade effekter i applikationer. Detta kan misslyckas om du använder en föråldrad konfigurationssparning. Fortsätta? - - - + + + Warning Varning - + This will replace your current MAC address with a new one. It is not recommended to do this if you got the MAC address from your real console using the setup tool. Continue? Detta kommer att ersätta din nuvarande MAC-adress med en ny. Det är inte rekommenderat att göra detta om du fick MAC-adressen från din riktiga konsol med hjälp av installationsverktyget. Fortsätta? - + This action will unlink your real console from Azahar, with the following consequences:<br><ul><li>Your OTP, SecureInfo and LocalFriendCodeSeed will be removed from Azahar.</li><li>Your friend list will reset and you will be logged out of your NNID/PNID account.</li><li>System files and eshop titles obtained through Azahar will become inaccessible until the same console is linked again (save data will not be lost).</li></ul><br>Continue? Denna åtgärd kommer att koppla bort din riktiga konsol från Azahar, med följande konsekvenser: <br><ul><li>Din OTP, SecureInfo och LocalFriendCodeSeed kommer att tas bort från Azahar. </li><li>Din vänlista kommer att återställas och du kommer att loggas ut från ditt NNID/PNID-konto.</li><li> Systemfiler och e-shop-titlar som erhållits via Azahar kommer att bli oåtkomliga tills samma konsol länkas igen (sparade data kommer inte att gå förlorade).</li></ul><br> Fortsätta? - + Invalid country for configured region Ogiltigt land för konfigurerad region - + Invalid country for console unique data Ogiltigt land för konsollunikt data - + Status: Loaded Status: Inläst - + Status: Loaded (Invalid Signature) Status: Inläst (ogiltig signatur) - + Status: Loaded (Region Changed) Status: Inläst (ändrad region) - + Status: Not Found Status: Hittades inte - + Status: Invalid Status: Ogiltig - + Status: IO Error Status: In/ut-fel @@ -3773,13 +3786,13 @@ Dra punkterna för att ändra position, eller dubbelklicka på tabellcellerna f - Interface language: - Gränssnittsspråk: + Interface Language + Gränssnittsspråk - Theme: - Tema: + Theme + Tema @@ -3788,8 +3801,8 @@ Dra punkterna för att ändra position, eller dubbelklicka på tabellcellerna f - Icon Size: - Ikonstorlek: + Icon Size + Ikonstorlek @@ -3809,8 +3822,8 @@ Dra punkterna för att ändra position, eller dubbelklicka på tabellcellerna f - Row 1 Text: - Rad 1-text: + Row 1 Text + Rad 1-text @@ -3844,18 +3857,18 @@ Dra punkterna för att ändra position, eller dubbelklicka på tabellcellerna f - Row 2 Text: - Rad 2-text: + Row 2 Text + Rad 2-text - Hide Titles without Icon + Hide titles without icon Dölj titlar utan ikon - Single Line Mode - Enkel rad-läge + Single line mode + Enradigt läge @@ -3864,8 +3877,8 @@ Dra punkterna för att ändra position, eller dubbelklicka på tabellcellerna f - Show Advanced Frame Time Info - Visa avancerad information om bildrutor + Show advanced frame time info + Visa avancerad bildtidsinformation @@ -3947,12 +3960,12 @@ Dra punkterna för att ändra position, eller dubbelklicka på tabellcellerna f DirectConnectWindow - + Connecting Ansluter - + Connect Anslut @@ -4072,497 +4085,511 @@ Kontrollera din FFmpeg-installation som användes för kompilering. GMainWindow - + No Suitable Vulkan Devices Detected Inga lämpliga Vulkan-enheter upptäcktes - + Vulkan initialization failed during boot.<br/>Your GPU may not support Vulkan 1.1, or you do not have the latest graphics driver. Vulkan-initialiseringen misslyckades under uppstarten.<br/>Din GPU kanske inte stöder Vulkan 1.1, eller så har du inte den senaste grafikdrivrutinen. - + Current Artic traffic speed. Higher values indicate bigger transfer loads. Aktuell hastighet för Artic-trafiken. Högre värden indikerar större överföringslaster. - - + + Current emulation speed. Values higher or lower than 100% indicate emulation is running faster or slower than a 3DS. Aktuell emuleringshastighet. Värden som är högre eller lägre än 100% indikerar att emuleringen körs snabbare eller långsammare än 3DS. - - + + How many frames per second the app is currently displaying. This will vary from app to app and scene to scene. Hur många bilder per sekund som appen visar för närvarande. Detta varierar från app till app och från scen till scen. - - + + Time taken to emulate a 3DS frame, not counting framelimiting or v-sync. For full-speed emulation this should be at most 16.67 ms. Tidsåtgång för att emulera en 3DS-bildruta, utan att räkna med framelimiting eller v-sync. För emulering med full hastighet bör detta vara högst 16,67 ms. - + MicroProfile (unavailable) MicroProfile (inte tillgänglig) - + Clear Recent Files Töm senaste filer - + &Continue &Fortsätt - + &Pause &Paus - + Azahar is running an application TRANSLATORS: This string is shown to the user to explain why Citra needs to prevent the computer from sleeping Azahar kör en applikation - - + + Invalid App Format Ogiltigt appformat - - + + Your app format is not supported.<br/>Please follow the guides to redump your <a href='https://web.archive.org/web/20240304210021/https://citra-emu.org/wiki/dumping-game-cartridges/'>game cartridges</a> or <a href='https://web.archive.org/web/20240304210011/https://citra-emu.org/wiki/dumping-installed-titles/'>installed titles</a>. Ditt appformat stöds inte.<br/>Följ anvisningarna för att återdumpa dina <a href='https://web.archive.org/web/20240304210021/https://citra-emu.org/wiki/dumping-game-cartridges/'>spelkassetter</a> eller <a href='https://web.archive.org/web/20240304210011/https://citra-emu.org/wiki/dumping-installed-titles/'>installerade titlar</a>. - + App Corrupted Appen skadad - + Your app is corrupted. <br/>Please follow the guides to redump your <a href='https://web.archive.org/web/20240304210021/https://citra-emu.org/wiki/dumping-game-cartridges/'>game cartridges</a> or <a href='https://web.archive.org/web/20240304210011/https://citra-emu.org/wiki/dumping-installed-titles/'>installed titles</a>. Din app är skadad. <br/>Följ guiderna för att återdumpa dina <a href='https://web.archive.org/web/20240304210021/https://citra-emu.org/wiki/dumping-game-cartridges/'>spelkassetter</a> eller <a href='https://web.archive.org/web/20240304210011/https://citra-emu.org/wiki/dumping-installed-titles/'>installerade titlar</a>. - + App Encrypted App krypterad - + Your app is encrypted. <br/><a href='https://azahar-emu.org/blog/game-loading-changes/'>Please check our blog for more info.</a> Din app är krypterad. <br/><a href='https://azahar-emu.org/blog/game-loading-changes/'>Mer information finns på vår blogg.</a> - + Unsupported App App som inte stöds - + GBA Virtual Console is not supported by Azahar. GBA Virtual Console stöds inte av Azahar. - - + + Artic Server Artic-server - + + Invalid system mode + Ogiltigt systemläge + + + + New 3DS exclusive applications cannot be loaded without enabling the New 3DS mode. + Nya 3DS-exklusiva applikationer kan inte läsas in utan att aktivera Ny 3DS-läget. + + + Error while loading App! Fel vid inläsning av app! - + An unknown error occurred. Please see the log for more details. Ett okänt fel har inträffat. Se loggen för mer information. - + CIA must be installed before usage CIA måste installeras före användning - + Before using this CIA, you must install it. Do you want to install it now? Innan du använder denna CIA måste du installera den. Vill du installera den nu? - + Quick Load Snabbinläsning - + Quick Save Snabbsparning - - + + Slot %1 Plats %1 - + %2 %3 %2 %3 - + Quick Save - %1 Snabbsparning - %1 - + Quick Load - %1 Snabbinläsning - %1 - + Slot %1 - %2 %3 Plats %1 - %2 %3 - + Error Opening %1 Folder Fel vid öppning av mappen %1 - - + + Folder does not exist! Mappen finns inte! - + Remove Play Time Data Ta bort data om speltid - + Reset play time? Återställ speltid? - - - - + + + + Create Shortcut Skapa genväg - + Do you want to launch the application in fullscreen? Vill du starta applikationen i helskärm? - + Successfully created a shortcut to %1 Skapade framgångsrikt en genväg till %1 - + This will create a shortcut to the current AppImage. This may not work well if you update. Continue? Detta kommer att skapa en genväg till den aktuella AppImage. Detta kanske inte fungerar så bra om du uppdaterar. Fortsätta? - + Failed to create a shortcut to %1 Misslyckades med att skapa en genväg till %1 - + Create Icon Skapa ikon - + Cannot create icon file. Path "%1" does not exist and cannot be created. Det går inte att skapa en ikonfil. Sökvägen "%1" finns inte och kan inte skapas. - + Dumping... Dumpar... - - + + Cancel Avbryt - - - - - - - - - + + + + + + + + + Azahar Azahar - + Could not dump base RomFS. Refer to the log for details. Kunde inte dumpa RomFS-basen. Se loggen för mer information. - + Error Opening %1 Fel vid öppning av %1 - + Select Directory Välj katalog - + Properties Egenskaper - + The application properties could not be loaded. Applikationsegenskaperna kunde inte läsas in. - + 3DS Executable (%1);;All Files (*.*) %1 is an identifier for the 3DS executable file extensions. Körbar 3DS-fil (%1);;Alla filer (*.*) - + Load File Läs in fil - - + + Set Up System Files Konfigurera systemfiler - + <p>Azahar needs console unique data and firmware files from a real console to be able to use some of its features.<br>Such files and data can be set up with the <a href=https://github.com/azahar-emu/ArticSetupTool>Azahar Artic Setup Tool</a><br>Notes:<ul><li><b>This operation will install console unique data to Azahar, do not share your user or nand folders<br>after performing the setup process!</b></li><li>While doing the setup process, Azahar will link to the console running the setup tool. You can unlink the<br>console later from the System tab in the emulator configuration menu.</li><li>Do not go online with both Azahar and your 3DS console at the same time after setting up system files,<br>as it could cause issues.</li><li>Old 3DS setup is needed for the New 3DS setup to work (doing both setup modes is recommended).</li><li>Both setup modes will work regardless of the model of the console running the setup tool.</li></ul><hr></p> <p>Azahar behöver konsolunika data och firmware-filer från en riktig konsol för att kunna använda vissa av dess funktioner. <br>Sådana filer och data kan konfigureras med <a href=https://github.com/azahar-emu/ArticSetupTool>Azahar Artic Setup Tool </a><br>Observera:<ul><li><b> Den här åtgärden installerar konsolunika data till Azahar, dela inte dina användar- eller nand-mappar<br> efter att du har utfört installationsprocessen!</b></li><li> Under installationsprocessen kommer Azahar att länkas till den konsol som kör installationsverktyget. Du kan koppla bort <br>konsolen senare från fliken System i emulatorns konfigurationsmeny. </li><li>Gå inte online med både Azahar och din 3DS-konsol samtidigt efter att du har konfigurerat systemfiler, <br>eftersom det kan orsaka problem.</li><li> En installation av den gamla 3DS:en behövs för att installationen av den nya 3DS:en ska fungera (vi rekommenderar att du gör båda installationslägena).</li><li> Båda installationslägena fungerar oavsett vilken konsolmodell som kör installationsverktyget.</li></ul><hr></p> - + Enter Azahar Artic Setup Tool address: Ange adressen till Azahar Artic Setup Tool: - + <br>Choose setup mode: <br>Välj konfigurationsläge: - + (ℹ️) Old 3DS setup (ℹ️) Gammal 3DS-konfiguration - - + + Setup is possible. Konfiguration är möjlig. - + (⚠) New 3DS setup (⚠) Ny 3DS-konfiguration - + Old 3DS setup is required first. Gammal 3DS-konfiguration krävs först. - + (✅) Old 3DS setup (✅) Gammal 3DS-konfiguration - - + + Setup completed. Konfigurationen är färdig. - + (ℹ️) New 3DS setup (ℹ️) Ny 3DS-konfiguration - + (✅) New 3DS setup (✅) Ny 3DS-konfiguration - + The system files for the selected mode are already set up. Reinstall the files anyway? Systemfilerna för det valda läget är redan konfigurerade. Installera om filerna i alla fall? - + Load Files Läs in filer - + 3DS Installation File (*.cia *.zcia) 3DS-installationsfil (*.cia *.zcia) - - - + + + All Files (*.*) Alla filer (*.*) - + Connect to Artic Base Anslut till Artic Base - + Enter Artic Base server address: Ange Artic Base-serveradress: - + %1 has been installed successfully. %1 har installerats. - + Unable to open File Kunde inte öppna filen - + Could not open %1 Kunde inte öppna %1 - + Installation aborted Installationen avbröts - + The installation of %1 was aborted. Please see the log for more details Installationen av %1 avbröts. Se loggen för mer information - + Invalid File Ogiltig fil - + %1 is not a valid CIA %1 är inte en giltig CIA - + CIA Encrypted CIA-krypterad - + Your CIA file is encrypted.<br/><a href='https://azahar-emu.org/blog/game-loading-changes/'>Please check our blog for more info.</a> Din CIA-fil är krypterad.<br/><a href='https://azahar-emu.org/blog/game-loading-changes/'>Kolla vår blogg för mer info</a> - + Unable to find File Det går inte att hitta filen - + Could not find %1 Kunde inte hitta %1 - - - - Error compressing file - Fel vid komprimering av fil + + + + + Z3DS Compression + Z3DS-komprimering - - File compress operation failed, check log for details. - Komprimeringsåtgärden för filen misslyckades. Kontrollera loggen för detaljer. + + Failed to compress some files, check log for details. + Misslyckades med att komprimera några filer. Kontrollera loggen. - - - - Error decompressing file - Fel vid avkomprimering av fil + + Failed to decompress some files, check log for details. + Misslyckades med att packa upp några filer. Kontrollera loggen. - - File decompress operation failed, check log for details. - Dekomprimeringsåtgärden för filen misslyckades. Kontrollera loggen för detaljer. + + All files have been compressed successfully. + Alla filer har komprimerats utan problem. - + + All files have been decompressed successfully. + Alla filer har packats upp utan problem. + + + Uninstalling '%1'... Avinstallation av "%1"... - + Failed to uninstall '%1'. Misslyckades med att avinstallera "%1". - + Successfully uninstalled '%1'. Avinstallationen av "%1" har lyckats. - + File not found Filen hittades inte - + File "%1" not found Filen "%1" hittades inte - + Savestates Sparade tillstånd - + Warning: Savestates are NOT a replacement for in-application saves, and are not meant to be reliable. Use at your own risk! @@ -4571,86 +4598,86 @@ Use at your own risk! Använd på egen risk! - - - + + + Error opening amiibo data file Fel vid öppning av amiibo datafil - + A tag is already in use. En tagg är redan i bruk. - + Application is not looking for amiibos. Applikationen letar inte efter amiibos. - + Amiibo File (%1);; All Files (*.*) Amiibo-fil (%1);; Alla filer (*.*) - + Load Amiibo Läs in Amiibo - + Unable to open amiibo file "%1" for reading. Det gick inte att öppna amiibo-filen "%1" för läsning. - + Record Movie Spela in film - + Movie recording cancelled. Filminspelning avbruten. - - + + Movie Saved Filmen sparades - - + + The movie is successfully saved. Filmen sparades. - + Application will unpause Applikationen kommer att återupptas - + The application will be unpaused, and the next frame will be captured. Is this okay? Applikationen kommer att återupptas och nästa bildruta kommer att fångas. Är det här okej? - + Invalid Screenshot Directory Ogiltig katalog för skärmbilder - + Cannot create specified screenshot directory. Screenshot path is set back to its default value. Det går inte att skapa angiven skärmbildskatalog. Sökvägen för skärmbilder återställs till sitt standardvärde. - + Could not load video dumper Kunde inte läsa in videodumpern - + FFmpeg could not be loaded. Make sure you have a compatible version installed. To install FFmpeg to Azahar, press Open and select your FFmpeg directory. @@ -4663,275 +4690,265 @@ För att installera FFmpeg till Azahar, tryck på Öppna och välj din FFmpeg-ka Om du vill visa en guide om hur du installerar FFmpeg trycker du på Hjälp. - - Load 3DS ROM File - Läs in 3DS ROM-fil + + Load 3DS ROM Files + Läs in 3DS ROM-filer - - 3DS ROM Files (*.cia *cci *3dsx *cxi) - 3DS ROM-filer (*.cia *cci *3dsx *cxi) + + 3DS ROM Files (*.cia *.cci *.3dsx *.cxi) + 3DS ROM-filer (*.cia *.cci *.3dsx *.cxi) - - The selected file is not a compatible 3DS ROM format. Make sure you have chosen the right file, and that it is not encrypted. - Den valda filen är inte i ett kompatibelt 3DS ROM-format. Försäkra dig om att du har valt rätt fil och att den inte är krypterad. - - - - The selected file is already compressed. - Den valda filen är redan komprimerad. - - - + 3DS Compressed ROM File (*.%1) Komprimerad 3DS ROM-fil (*.%1) - + Save 3DS Compressed ROM File Spara komprimerad 3DS ROM-fil - - Load 3DS Compressed ROM File - Läs in komprimerad 3DS ROM-fil + + Select Output 3DS Compressed ROM Folder + Välj utdatamapp för 3DS-komprimerad ROM - + + Load 3DS Compressed ROM Files + Läs in 3DS-komprimerade ROM-filer + + + 3DS Compressed ROM Files (*.zcia *zcci *z3dsx *zcxi) Komprimerade 3DS ROM-filer (*.zcia *zcci *z3dsx *zcxi) - - The selected file is not a compatible compressed 3DS ROM format. Make sure you have chosen the right file. - Den valda filen är inte i ett kompatibelt komprimerat 3DS ROM-format. Försäkra dig om att du har valt rätt fil. - - - - The selected file is already decompressed. - Den valda filen är redan dekomprimerad. - - - + 3DS ROM File (*.%1) 3DS ROM-fil (*.%1) - + Save 3DS ROM File Spara 3DS ROM-fil - + + Select Output 3DS ROM Folder + Välj utdatamapp för 3DS ROM + + + Select FFmpeg Directory Välj FFmpeg-katalog - + The provided FFmpeg directory is missing %1. Please make sure the correct directory was selected. Den angivna FFmpeg-katalogen saknar %1. Kontrollera att rätt katalog har valts. - + FFmpeg has been sucessfully installed. FFmpeg har installerats. - + Installation of FFmpeg failed. Check the log file for details. Installationen av FFmpeg misslyckades. Kontrollera loggfilen för mer information. - + Could not start video dumping.<br>Please ensure that the video encoder is configured correctly.<br>Refer to the log for details. Det gick inte att starta videodumpningen.<br>Kontrollera att videokodaren är korrekt konfigurerad.<br>Se loggen för mer information. - + Recording %1 Spelar in %1 - + Playing %1 / %2 Spelar %1 / %2 - + Movie Finished Filmen är färdig - + (Accessing SharedExtData) (Åtkomst till SharedExtData) - + (Accessing SystemSaveData) (Åtkomst till SystemSaveData) - + (Accessing BossExtData) (Åtkomst till BossExtData) - + (Accessing ExtData) (Åtkomst till ExtData) - + (Accessing SaveData) (Åtkomst till SaveData) - + MB/s MB/s - + KB/s KB/s - + Artic Traffic: %1 %2%3 Artic-trafik: %1 %2%3 - + Speed: %1% Hastighet: %1% - + Speed: %1% / %2% Hastighet: %1% / %2% - + App: %1 FPS App: %1 bilder/s - + Frame: %1 ms (GPU: [CMD: %2 ms, SWP: %3 ms], IPC: %4 ms, SVC: %5 ms, Rem: %6 ms) Bildruta: %1 ms (GPU: [CMD: %2 ms, SWP: %3 ms], IPC: %4 ms, SVC: %5 ms, Rem: %6 ms) - + Frame: %1 ms Bildruta: %1 ms - + VOLUME: MUTE VOLYM: TYST - + VOLUME: %1% Volume percentage (e.g. 50%) VOLYM: %1% - + %1 is missing. Please <a href='https://web.archive.org/web/20240304201103/https://citra-emu.org/wiki/dumping-system-archives-and-the-shared-fonts-from-a-3ds-console/'>dump your system archives</a>.<br/>Continuing emulation may result in crashes and bugs. %1 saknas. <a href='https://web.archive.org/web/20240304201103/https://citra-emu.org/wiki/dumping-system-archives-and-the-shared-fonts-from-a-3ds-console/'>Dumpa dina systemarkiv</a>.<br/>Fortsatt emulering kan resultera i krascher och buggar. - + A system archive Ett systemarkiv - + System Archive Not Found Systemarkiv hittades inte - + System Archive Missing Systemarkiv saknas - + Save/load Error Fel vid spara/läs in - + Fatal Error Ödesdigert fel - + A fatal error occurred. <a href='https://web.archive.org/web/20240228001712/https://community.citra-emu.org/t/how-to-upload-the-log-file/296'>Check the log</a> for details.<br/>Continuing emulation may result in crashes and bugs. Ett ödesdigert fel inträffade. <a href='https://web.archive.org/web/20240228001712/https://community.citra-emu.org/t/how-to-upload-the-log-file/296'>Kontrollera loggen</a> för detaljer.<br/>Fortsatt emulering kan resultera i krascher och buggar. - + Fatal Error encountered Allvarligt fel uppstod - + Continue Fortsätt - + Quit Application Avsluta applikation - + OK Ok - + Would you like to exit now? Vill du avsluta nu? - + The application is still running. Would you like to stop emulation? Applikationen körs fortfarande. Vill du stoppa emuleringen? - + Playback Completed Uppspelningen är färdig - + Movie playback completed. Uppspelning av film slutförd. - + Update Available Uppdatering tillgänglig - + Update %1 for Azahar is available. Would you like to download it? Uppdatering %1 för Azahar finns tillgänglig. Vill du hämta ner den? - + Primary Window Primärt fönster - + Secondary Window Sekundärt fönster @@ -5037,175 +5054,190 @@ Vill du hämta ner den? GameList - + IMPORTANT: Encrypted files and .3ds files are no longer supported. Decrypting and/or renaming to .cci may be necessary. <a href='https://azahar-emu.org/blog/game-loading-changes/'>Learn more.</a> VIKTIGT: Krypterade filer och .3ds-filer stöds inte längre. Dekryptering och/eller namnändring till .cci kan vara nödvändigt. <a href='https://azahar-emu.org/blog/game-loading-changes/'>Läs mer om hur du gör. - + Don't show again Visa inte igen - - + + Compatibility Kompatibilitet - - + + Region Region - - + + File type Filtyp - - + + Size Storlek - - + + Play time Speltid - + Favorite Favorit - + + Eject Cartridge + Mata ut cartridge + + + + Insert Cartridge + Mata in cartridge + + + Open Öppna - + Application Location Programplats - + Save Data Location Plats för sparat data - + Extra Data Location Plats för extradata - + Update Data Location Plats för uppdateringsdata - + DLC Data Location Plats för DLC-data - + Texture Dump Location Plats för texturdumpar - + Custom Texture Location Plats för anpassade texturer - + Mods Location Plats för mods - + Dump RomFS Dumpa RomFS - + Disk Shader Cache Disk shadercache - + Open Shader Cache Location Öppna plats för shadercache - + Delete OpenGL Shader Cache Ta bort OpenGL-shadercache - + Uninstall Avinstallera - + Everything Allting - + Application Applikation - + Update Uppdatering - + DLC DLC - + Remove Play Time Data Ta bort data för speltid - + Create Shortcut Skapa genväg - + Add to Desktop Lägg till på skrivbordet - + Add to Applications Menu Lägg till i programmenyn - + + Stress Test: App Launch + Stresstest: Appstart + + + Properties Egenskaper - - - - + + + + Azahar Azahar - + Are you sure you want to completely uninstall '%1'? This will delete the application if installed, as well as any installed updates or DLC. @@ -5214,64 +5246,64 @@ This will delete the application if installed, as well as any installed updates Detta kommer att radera programmet om det är installerat, samt alla installerade uppdateringar eller DLC. - - + + %1 (Update) %1 (Uppdatering) - - + + %1 (DLC) %1 (DLC) - + Are you sure you want to uninstall '%1'? Är du säker att du vill avinstallera "%1"? - + Are you sure you want to uninstall the update for '%1'? Är du säker på att du vill avinstallera uppdateringen för "%1"? - + Are you sure you want to uninstall all DLC for '%1'? Är du säker på att du vill avinstallera alla DLC för "%1"? - + Scan Subfolders Sök igenom undermappar - + Remove Application Directory Ta bort applikationskatalog - + Move Up Flytta upp - + Move Down Flytta ner - + Open Directory Location Öppna katalogplats - + Clear Töm - + Name Namn @@ -5279,82 +5311,82 @@ Detta kommer att radera programmet om det är installerat, samt alla installerad GameListItemCompat - + Perfect Perfekt - + App functions flawless with no audio or graphical glitches, all tested functionality works as intended without any workarounds needed. Appen fungerar felfritt utan ljud- eller grafiska problem, all testad funktionalitet fungerar som avsett utan några temporära lösningar behövs. - + Great Bra - + App functions with minor graphical or audio glitches and is playable from start to finish. May require some workarounds. Appen fungerar med mindre grafiska eller ljudmässiga problem och är spelbar från början till slut. Kan kräva vissa temporära lösningar. - + Okay Okej - + App functions with major graphical or audio glitches, but app is playable from start to finish with workarounds. Appen fungerar med större grafiska eller ljudmässiga problem, men appen är spelbar från början till slut med temporära lösningar. - + Bad Dåligt - + App functions, but with major graphical or audio glitches. Unable to progress in specific areas due to glitches even with workarounds. Appen fungerar, men med stora grafiska eller ljudmässiga problem. Det går inte att göra framsteg inom vissa områden på grund av problem även med temporära lösningar. - + Intro/Menu Intro/Meny - + App is completely unplayable due to major graphical or audio glitches. Unable to progress past the Start Screen. Appen är helt ospelbar på grund av stora grafiska eller ljudmässiga fel. Det går inte att ta sig förbi startskärmen. - + Won't Boot Startar inte - + The app crashes when attempting to startup. Appen kraschar när den försöker starta upp. - + Not Tested Inte testat - + The app has not yet been tested. Appen har ännu inte testats. @@ -5362,7 +5394,7 @@ startskärmen. GameListPlaceholder - + Double-click to add a new folder to the application list Dubbelklicka för att lägga till en ny mapp i applikationslistan @@ -5370,27 +5402,27 @@ startskärmen. GameListSearchField - + of av - + result resultat - + results resultat - + Filter: Filtrera: - + Enter pattern to filter Ange mönster att filtrera @@ -5662,7 +5694,7 @@ startskärmen. Offset - Offset + Förskjutning @@ -5718,87 +5750,87 @@ startskärmen. Cykelindex: - + SRC1: %1, %2, %3, %4 SRC1: %1, %2, %3, %4 - + SRC2: %1, %2, %3, %4 SRC2: %1, %2, %3, %4 - + SRC3: %1, %2, %3, %4 SRC3: %1, %2, %3, %4 - + DEST_IN: %1, %2, %3, %4 DEST_IN: %1, %2, %3, %4 - + DEST_OUT: %1, %2, %3, %4 DEST_OUT: %1, %2, %3, %4 - + Address Registers: %1, %2 Adressregister: %1, %2 - + Compare Result: %1, %2 Jämför resultat: %1, %2 - + Static Condition: %1 Statiskt villkor: %1 - + Dynamic Conditions: %1, %2 Dynamiska villkor: %1, %2 - + Loop Parameters: %1 (repeats), %2 (initializer), %3 (increment), %4 Loop-parametrar: %1 (upprepningar), %2 (initiering), %3 (ökning), %4 - + Instruction offset: 0x%1 Instruktionsoffset: 0x%1 - + -> 0x%2 -> 0x%2 - + (last instruction) (sista instruktionen) @@ -6099,32 +6131,32 @@ Felsökningsmeddelande: Lösenord: - + Room Name Rumsnamn - + Preferred Application Föredragen applikation - + Host Värd - + Players Spelare - + Refreshing Uppdaterar - + Refresh List Uppdatera lista @@ -6194,7 +6226,7 @@ Felsökningsmeddelande: Multiplayer - Flerspelare + Flera spelare @@ -6294,7 +6326,7 @@ Felsökningsmeddelande: FAQ - FAQ + Frågor och svar @@ -7126,32 +7158,32 @@ De kan ha lämnat rummet. %1 (0x%2) - + Unsupported encrypted application Krypterad applikation som inte stöds - + Invalid region Ogiltig region - + Installed Titles Installerade titlar - + System Titles Systemtitlar - + Add New Application Directory Lägg till ny applikationskatalog - + Favorites Favoriter diff --git a/dist/languages/tr_TR.ts b/dist/languages/tr_TR.ts index 4cef77759..91d0f42b8 100644 --- a/dist/languages/tr_TR.ts +++ b/dist/languages/tr_TR.ts @@ -16,7 +16,7 @@ Value - Value + Değer @@ -29,7 +29,7 @@ <html><head/><body><p><img src=":/icons/default/256x256/azahar.png"/></p></body></html> - + <html><head/><body><p><img src=":/icons/default/256x256/azahar.png"/></p></body></html> @@ -298,7 +298,7 @@ Bu onun hem forum kullanıcı adını hemde IP adresini yasaklar. - Emulation: + Emulation Emülasyon @@ -403,6 +403,7 @@ Bu onun hem forum kullanıcı adını hemde IP adresini yasaklar. + Camera Kamera @@ -414,8 +415,8 @@ Bu onun hem forum kullanıcı adını hemde IP adresini yasaklar. - Camera to configure: - Yapılandırılacak kamera: + Camera to Configure + Yapılandırılacak Kamera @@ -435,8 +436,8 @@ Bu onun hem forum kullanıcı adını hemde IP adresini yasaklar. - Camera mode: - Kamera modu: + Camera mode + Kamera modu @@ -456,8 +457,8 @@ Bu onun hem forum kullanıcı adını hemde IP adresini yasaklar. - Camera position: - Kamera konumu: + Camera position + Kamera konumu @@ -482,8 +483,8 @@ Bu onun hem forum kullanıcı adını hemde IP adresini yasaklar. - Camera Image Source: - Kamera Görüntü Kaynağı: + Camera Image Source + @@ -502,8 +503,8 @@ Bu onun hem forum kullanıcı adını hemde IP adresini yasaklar. - File: - Dosya: + File + Dosya @@ -516,11 +517,6 @@ Bu onun hem forum kullanıcı adını hemde IP adresini yasaklar. Select the system camera to use Kullanılacak sistem kamerasını seçin - - - Camera: - Kamera: - <Default> @@ -534,8 +530,8 @@ Bu onun hem forum kullanıcı adını hemde IP adresini yasaklar. - Flip: - Çevir: + Flip + Çevir @@ -727,7 +723,7 @@ Hataya aldırmayıp devam etmek ister misiniz? Show log output in console - + Konsolda günlük çıktısını göster @@ -1024,7 +1020,7 @@ Hataya aldırmayıp devam etmek ister misiniz? Enable Linear Filtering - Doğrusal Filtrelemeyi Etkinleştir + @@ -1088,8 +1084,8 @@ Hataya aldırmayıp devam etmek ister misiniz? - Reverse Side by Side - Ters Yan Yana + Side by Side Full Width + @@ -1139,7 +1135,7 @@ Hataya aldırmayıp devam etmek ister misiniz? Disable Right Eye Rendering - Sağ Göz İşlemesini Devre Dışı Bırak + @@ -1147,49 +1143,54 @@ Hataya aldırmayıp devam etmek ister misiniz? - + + Swap Eyes + + + + Utility - + <html><head/><body><p>Replace textures with PNG files.</p><p>Textures are loaded from load/textures/[Title ID]/.</p></body></html> - - Use Custom Textures - Özel Dokuları Kullan + + Use custom textures + Özel dokular kullan - + <html><head/><body><p>Dump textures to PNG files.</p><p>Textures are dumped to dump/textures/[Title ID]/.</p></body></html> - - Dump Textures + + Dump textures - + <html><head/><body><p>Load all custom textures into memory on boot, instead of loading them when the application requires them.</p></body></html> - - Preload Custom Textures - Özel Dokuları Önceden Yükle + + Preload custom textures + - + <html><head/><body><p>Load custom textures asynchronously with background threads to reduce loading stutter</p></body></html> - - Async Custom Texture Loading - Asenkron Özel Doku Yükleme + + Async custom texture loading + @@ -1246,13 +1247,13 @@ Hataya aldırmayıp devam etmek ister misiniz? - Set emulation speed: - Emülasyon hızını ayarla: + Set emulation speed + Emülasyon hızını ayarla - Emulation Speed: - Emülasyon Hızı: + Emulation Speed + Emülasyon Hızı @@ -1363,12 +1364,12 @@ Hataya aldırmayıp devam etmek ister misiniz? - SPIR-V Shader Generation - SPIR-V Gölgelendirici Oluşturma + SPIR-V shader generation + SPIR-V gölgelendirici oluşturma - Disable GLSL -> SPIR-V Optimizer + Disable GLSL -> SPIR-V optimizer @@ -1388,8 +1389,8 @@ Hataya aldırmayıp devam etmek ister misiniz? - Enable Hardware Shader - Donanımsal Shader'ı Etkinleştir + Enable hardware shader + @@ -1398,8 +1399,8 @@ Hataya aldırmayıp devam etmek ister misiniz? - Accurate Multiplication - İsabetli Çoğaltma + Accurate multiplication + @@ -1408,8 +1409,8 @@ Hataya aldırmayıp devam etmek ister misiniz? - Enable Shader JIT - Shader JIT'i etkinleştir + Enable shader JIT + @@ -1418,8 +1419,8 @@ Hataya aldırmayıp devam etmek ister misiniz? - Enable Async Shader Compilation - Asenkron Gölgeleme Derlemesini Etkinleştir + Enable async shader compilation + @@ -1428,8 +1429,8 @@ Hataya aldırmayıp devam etmek ister misiniz? - Enable Async Presentation - Asenkron Sunumu Etkinleştir + Enable async presentation + Asenkron sunumu etkinleştir @@ -1468,7 +1469,7 @@ Hataya aldırmayıp devam etmek ister misiniz? - Use Disk Shader Cache + Use disk shader cache @@ -1493,7 +1494,7 @@ Hataya aldırmayıp devam etmek ister misiniz? - Delay application render thread: + Delay Application Render Thread @@ -1538,7 +1539,7 @@ Hataya aldırmayıp devam etmek ister misiniz? Toggle Turbo Mode - + Turbo Modu Aç/Kapat @@ -1982,13 +1983,13 @@ Hataya aldırmayıp devam etmek ister misiniz? - Swap Screens - Ekranları Değiştir + Swap screens + Ekranları değiştir - Rotate Screens Upright - Ekranları Yukarı Döndür + Rotate screens upright + @@ -2104,8 +2105,8 @@ Hataya aldırmayıp devam etmek ister misiniz? - <html><head/><body><p>Bottom Screen Opacity % (OpenGL Only)</p></body></html> - <html><head/><body><p>Alt Ekran Opaklığı % (Sadece OpenGL İçin</p></body></html>) + <html><head/><body><p>Bottom Screen Opacity %</p></body></html> + @@ -2116,7 +2117,7 @@ Hataya aldırmayıp devam etmek ister misiniz? Stretch - + Gerdir @@ -2365,7 +2366,7 @@ Hataya aldırmayıp devam etmek ister misiniz? Filepath - + Dosya yolu @@ -2452,8 +2453,8 @@ Hataya aldırmayıp devam etmek ister misiniz? - Use Virtual SD - Sanal SD'yi kullan + Use virtual SD card + @@ -2462,8 +2463,8 @@ Hataya aldırmayıp devam etmek ister misiniz? - Use Custom Storage - Özel Depolama Kullan + Use custom storage location + @@ -2549,8 +2550,8 @@ online features (if installed) - Region: - Bölge: + Region + Bölge @@ -2558,326 +2559,337 @@ online features (if installed) Otomatik seç - + + Apply region free patch to +installed applications. + + + + + Patches the region of installed applications to be region free, so that they always appear on the home menu. + + + + Username Kullanıcı Adı - + Birthday Doğum Günü - + January Ocak - + February Şubat - + March Mart - + April Nisan - + May Mayıs - + June Haziran - + July Temmuz - + August Ağustos - + September Eylül - + October Ekim - + November Kasım - + December Aralık - + Language Dil - + Note: this can be overridden when region setting is auto-select Not: Bölge ayarı otomatik seç ise bu geçersiz kılınabilir. - + Japanese (日本語) Japonca (日本語) - + English İngilizce - + French (français) Fransızca (français) - + German (Deutsch) Almanca (Deutsch) - + Italian (italiano) İtalyanca (italiano) - + Spanish (español) İspanyolca (español) - + Simplified Chinese (简体中文) Basitleştirilmiş Çince (简体中文) - + Korean (한국어) Korece (한국어) - + Dutch (Nederlands) Felemenkçe (Nederlands) - + Portuguese (português) Portekizce (português) - + Russian (Русский) Rusça (Русский) - + Traditional Chinese (正體中文) Geleneksel Çince (正體中文) - + Sound output mode Ses Çıkış Modu - + Mono Mono - + Stereo Stereo - + Surround Surround - + Country Ülke - + Clock Saat - + System Clock Sistem Saati - + Fixed Time Sabit Zaman - + Startup time Başlangıç Zamanı - + yyyy-MM-ddTHH:mm:ss yyyy-AA-ggSS:dd:ss - + Offset time - + days günler - + HH:mm:ss - + Initial System Ticks - + Random Rastgele - + Fixed Sabit - + Initial System Ticks Override - + Play Coins Play Coin'leri - + <html><head/><body><p>Number of steps per hour reported by the pedometer. Range from 0 to 65,535.</p></body></html> <html><head/><body><p>Adımsayar tarafından bildirilen saat başına adım sayısı. 0 ile 65,535 arasında değişir.</p></body></html> - + Pedometer Steps per Hour Saat Başına Adımsayar Adımları - + Run System Setup when Home Menu is launched Home menüsü açıldığında sistem kurulumunu başlat - + Console ID: Konsol ID: - - + + Regenerate Yeniden Oluştur - + MAC: MAC: - - 3GX Plugin Loader: - 3GX Rklenti Yükleyici: + + 3GX Plugin Loader + - + Enable 3GX plugin loader 3GX Eklenti Yükleyicisini Etkinleştir - + Allow applications to change plugin loader state Uygulamaların eklenti yükleyici durumunu değiştirmesine izin verin - + Real Console Unique Data - + Your real console is linked to Azahar. Gerçek konsolunuz Azahar'a bağlandı. - + Unlink Bağlantıyı Kes - + OTP OTP - - - - + + + + Choose Seç - + SecureInfo_A/B SecureInfo_A/B - + LocalFriendCodeSeed_A/B LocalFriendCodeSeed_A/B - + movable.sed movable.sed - + System settings are available only when applications is not running. Sistem ayarlarına sadece uygulama çalışmıyorken erişilebilir. @@ -3587,76 +3599,76 @@ online features (if installed) - - + + Console ID: 0x%1 Konsol ID: 0x%1 - - + + MAC: %1 MAC: %1 - + This will replace your current virtual 3DS console ID with a new one. Your current virtual 3DS console ID will not be recoverable. This might have unexpected effects in applications. This might fail if you use an outdated config save. Continue? Bu, mevcut sanal 3DS konsol kimliğinizi yenisiyle değiştirecektir. Mevcut sanal 3DS konsol kimliğiniz kurtarılamayacaktır. Bu, uygulamalarında beklenmedik etkilere neden olabilir. Eski bir konfigürasyon kaydı kullanıyorsanız bu işlem başarısız olabilir. Devam etmek istiyor musunuz? - - - + + + Warning Uyarı - + This will replace your current MAC address with a new one. It is not recommended to do this if you got the MAC address from your real console using the setup tool. Continue? Bu, mevcut MAC adresinizi yenisiyle değiştirecektir. MAC adresini kurulum aracını kullanarak gerçek konsolunuzdan aldıysanız bunu yapmanız önerilmez. Yine de devam etmek ister misiniz? - + This action will unlink your real console from Azahar, with the following consequences:<br><ul><li>Your OTP, SecureInfo and LocalFriendCodeSeed will be removed from Azahar.</li><li>Your friend list will reset and you will be logged out of your NNID/PNID account.</li><li>System files and eshop titles obtained through Azahar will become inaccessible until the same console is linked again (save data will not be lost).</li></ul><br>Continue? - + Invalid country for configured region Yapılandırılmış bölge için geçersiz ülke - + Invalid country for console unique data - + Status: Loaded Durum: Yüklendi - + Status: Loaded (Invalid Signature) Durum: Yüklendi (Geçersiz İmza) - + Status: Loaded (Region Changed) Durum: Yüklendi (Bölge Değiştirildi) - + Status: Not Found Durum: Bulunamadı - + Status: Invalid Durum: Geçersiz - + Status: IO Error Durum: IO Hatası @@ -3771,13 +3783,13 @@ Drag points to change position, or double-click table cells to edit values. - Interface language: - Arayüz dili: + Interface Language + - Theme: - Tema: + Theme + Tema @@ -3786,8 +3798,8 @@ Drag points to change position, or double-click table cells to edit values. - Icon Size: - İkon Boyutu: + Icon Size + @@ -3807,8 +3819,8 @@ Drag points to change position, or double-click table cells to edit values. - Row 1 Text: - Satır 1 Metni: + Row 1 Text + @@ -3842,27 +3854,27 @@ Drag points to change position, or double-click table cells to edit values. - Row 2 Text: - Satır 2 Metni: + Row 2 Text + - Hide Titles without Icon - İkonu Olmayan Oyunları Gizle + Hide titles without icon + - Single Line Mode - Tek Satır Modu + Single line mode + Status Bar - + Durum Çubuğu - Show Advanced Frame Time Info + Show advanced frame time info @@ -3945,12 +3957,12 @@ Drag points to change position, or double-click table cells to edit values. DirectConnectWindow - + Connecting Bağlanılıyor - + Connect Bağlan @@ -4069,495 +4081,509 @@ Please check your FFmpeg installation used for compilation. GMainWindow - + No Suitable Vulkan Devices Detected - + Vulkan initialization failed during boot.<br/>Your GPU may not support Vulkan 1.1, or you do not have the latest graphics driver. - + Current Artic traffic speed. Higher values indicate bigger transfer loads. - - + + Current emulation speed. Values higher or lower than 100% indicate emulation is running faster or slower than a 3DS. Geçerli emülasyon hızı. 100%'den az veya çok olan değerler emülasyonun bir 3DS'den daha yavaş veya daha hızlı çalıştığını gösterir. - - + + How many frames per second the app is currently displaying. This will vary from app to app and scene to scene. - - + + Time taken to emulate a 3DS frame, not counting framelimiting or v-sync. For full-speed emulation this should be at most 16.67 ms. Bir 3DS karesini emüle etmekte geçen zaman, karelimitleme ve v-sync hariç. Tam hız emülasyon için bu en çok 16,67 ms. olmalı. - + MicroProfile (unavailable) MikroProfil (kullanılamaz) - + Clear Recent Files Son Dosyaları Temizle - + &Continue &Devam et - + &Pause &Duraklat - + Azahar is running an application TRANSLATORS: This string is shown to the user to explain why Citra needs to prevent the computer from sleeping Azahar bir uygulama çalıştırıyor - - + + Invalid App Format Geçersiz Uygulama Biçimi - - + + Your app format is not supported.<br/>Please follow the guides to redump your <a href='https://web.archive.org/web/20240304210021/https://citra-emu.org/wiki/dumping-game-cartridges/'>game cartridges</a> or <a href='https://web.archive.org/web/20240304210011/https://citra-emu.org/wiki/dumping-installed-titles/'>installed titles</a>. - + App Corrupted - + Your app is corrupted. <br/>Please follow the guides to redump your <a href='https://web.archive.org/web/20240304210021/https://citra-emu.org/wiki/dumping-game-cartridges/'>game cartridges</a> or <a href='https://web.archive.org/web/20240304210011/https://citra-emu.org/wiki/dumping-installed-titles/'>installed titles</a>. - + App Encrypted Uygulama Şifreli - + Your app is encrypted. <br/><a href='https://azahar-emu.org/blog/game-loading-changes/'>Please check our blog for more info.</a> - + Unsupported App Desteklenmeyen Uygulama - + GBA Virtual Console is not supported by Azahar. GBA Sanal Konsolu Azahar tarafından desteklenmiyor. - - + + Artic Server Artic Sunucusu - + + Invalid system mode + + + + + New 3DS exclusive applications cannot be loaded without enabling the New 3DS mode. + + + + Error while loading App! Uygulama yüklenirken hata oluştu! - + An unknown error occurred. Please see the log for more details. - + CIA must be installed before usage CIA dosyası kullanılmadan önce yüklenmelidir - + Before using this CIA, you must install it. Do you want to install it now? Bu CIA dosyasını kullanmadan önce yüklemeniz gerekir. Şimdi yüklemek ister misiniz? - + Quick Load Hızlı Yükle - + Quick Save Hızlı Kaydet - - + + Slot %1 Slot %1 - + %2 %3 %2 %3 - + Quick Save - %1 Hızlı Kayıt - %1 - + Quick Load - %1 Hızlı Yükleme - %1 - + Slot %1 - %2 %3 - + Error Opening %1 Folder %1 Klasörü Açılırken Hata Oluştu - - + + Folder does not exist! Klasör mevcut değil! - + Remove Play Time Data - + Reset play time? Oynama süresi sıfırlansın mı? - - - - + + + + Create Shortcut Kısayol Oluştur - + Do you want to launch the application in fullscreen? - + Successfully created a shortcut to %1 - + This will create a shortcut to the current AppImage. This may not work well if you update. Continue? - + Failed to create a shortcut to %1 - + Create Icon Simge Oluştur - + Cannot create icon file. Path "%1" does not exist and cannot be created. - + Dumping... Dump ediliyor... - - + + Cancel İptal et - - - - - - - - - + + + + + + + + + Azahar Azahar - + Could not dump base RomFS. Refer to the log for details. Temel RomFS dump edilemedi. Detaylar için kütük dosyasına bakınız. - + Error Opening %1 %1 Açılırken Hata Oluştu - + Select Directory Dizin Seç - + Properties Özellikler - + The application properties could not be loaded. - + 3DS Executable (%1);;All Files (*.*) %1 is an identifier for the 3DS executable file extensions. 3DS Çalıştırılabiliri (%1);; Bütün Dosyalar (*.*) - + Load File Dosya Yükle - - + + Set Up System Files - + <p>Azahar needs console unique data and firmware files from a real console to be able to use some of its features.<br>Such files and data can be set up with the <a href=https://github.com/azahar-emu/ArticSetupTool>Azahar Artic Setup Tool</a><br>Notes:<ul><li><b>This operation will install console unique data to Azahar, do not share your user or nand folders<br>after performing the setup process!</b></li><li>While doing the setup process, Azahar will link to the console running the setup tool. You can unlink the<br>console later from the System tab in the emulator configuration menu.</li><li>Do not go online with both Azahar and your 3DS console at the same time after setting up system files,<br>as it could cause issues.</li><li>Old 3DS setup is needed for the New 3DS setup to work (doing both setup modes is recommended).</li><li>Both setup modes will work regardless of the model of the console running the setup tool.</li></ul><hr></p> - + Enter Azahar Artic Setup Tool address: - + <br>Choose setup mode: - + (ℹ️) Old 3DS setup - - + + Setup is possible. - + (⚠) New 3DS setup - + Old 3DS setup is required first. - + (✅) Old 3DS setup - - + + Setup completed. - + Kurulum tamamlandı. - + (ℹ️) New 3DS setup - + (ℹ️) Yeni 3DS kurulumu - + (✅) New 3DS setup - + (✅) Yeni 3DS kurulumu - + The system files for the selected mode are already set up. Reinstall the files anyway? - + Load Files Dosyaları Yükle - + 3DS Installation File (*.cia *.zcia) - - - + + + All Files (*.*) Tüm Dosyalar (*.*) - + Connect to Artic Base Artic Base'e Bağla - + Enter Artic Base server address: - + %1 has been installed successfully. %1 başarıyla yüklendi. - + Unable to open File Dosya açılamıyor - + Could not open %1 %1 açılamıyor - + Installation aborted Yükleme iptal edildi - + The installation of %1 was aborted. Please see the log for more details %1'in yüklemesi iptal edildi. Daha fazla detay için lütfen kütüğe bakınız. - + Invalid File Geçersiz Dosya - + %1 is not a valid CIA %1 geçerli bir CIA dosyası değil - + CIA Encrypted CİA Şifreli - + Your CIA file is encrypted.<br/><a href='https://azahar-emu.org/blog/game-loading-changes/'>Please check our blog for more info.</a> - + Unable to find File Dosya bulunamadı - + Could not find %1 %1 bulunamadı - - - - Error compressing file + + + + + Z3DS Compression - - File compress operation failed, check log for details. + + Failed to compress some files, check log for details. - - - - Error decompressing file + + Failed to decompress some files, check log for details. - - File decompress operation failed, check log for details. + + All files have been compressed successfully. - + + All files have been decompressed successfully. + + + + Uninstalling '%1'... '%1' siliniyor... - + Failed to uninstall '%1'. '%1' silinemedi. - + Successfully uninstalled '%1'. '%1' başarıyla silindi. - + File not found Dosya bulunamadı - + File "%1" not found "%1" Dosyası bulunamadı - + Savestates Kayıt Durumları - + Warning: Savestates are NOT a replacement for in-application saves, and are not meant to be reliable. Use at your own risk! @@ -4566,86 +4592,86 @@ Use at your own risk! Kullanım riski size aittir! - - - + + + Error opening amiibo data file Amiibo veri dosyasını açarken bir hata oldu - + A tag is already in use. Bir etiket zaten kullanılıyor. - + Application is not looking for amiibos. Uygulama amiibo aramıyor. - + Amiibo File (%1);; All Files (*.*) Amiibo Dosyası (%1);; Tüm Dosyalar (*.*) - + Load Amiibo Amiibo Yükle - + Unable to open amiibo file "%1" for reading. - + Record Movie Klip Kaydet - + Movie recording cancelled. Klip kaydı iptal edildi. - - + + Movie Saved Klip Kaydedildi - - + + The movie is successfully saved. Klip başarıyla kayıt edildi. - + Application will unpause - + The application will be unpaused, and the next frame will be captured. Is this okay? - + Invalid Screenshot Directory Geçersiz Ekran Görüntüsü Dizini - + Cannot create specified screenshot directory. Screenshot path is set back to its default value. - + Could not load video dumper - + FFmpeg could not be loaded. Make sure you have a compatible version installed. To install FFmpeg to Azahar, press Open and select your FFmpeg directory. @@ -4654,274 +4680,264 @@ To view a guide on how to install FFmpeg, press Help. - - Load 3DS ROM File + + Load 3DS ROM Files - - 3DS ROM Files (*.cia *cci *3dsx *cxi) + + 3DS ROM Files (*.cia *.cci *.3dsx *.cxi) - - The selected file is not a compatible 3DS ROM format. Make sure you have chosen the right file, and that it is not encrypted. - - - - - The selected file is already compressed. - - - - + 3DS Compressed ROM File (*.%1) - + Save 3DS Compressed ROM File - - Load 3DS Compressed ROM File + + Select Output 3DS Compressed ROM Folder - + + Load 3DS Compressed ROM Files + + + + 3DS Compressed ROM Files (*.zcia *zcci *z3dsx *zcxi) - - The selected file is not a compatible compressed 3DS ROM format. Make sure you have chosen the right file. - - - - - The selected file is already decompressed. - - - - + 3DS ROM File (*.%1) - + Save 3DS ROM File - + + Select Output 3DS ROM Folder + + + + Select FFmpeg Directory FFmpeg Dizini Seç - + The provided FFmpeg directory is missing %1. Please make sure the correct directory was selected. - + FFmpeg has been sucessfully installed. FFmpeg başarıyla yüklendi. - + Installation of FFmpeg failed. Check the log file for details. FFmpeg yüklemesi başarısız oldu. Detaylar için log dosyasına bakınız. - + Could not start video dumping.<br>Please ensure that the video encoder is configured correctly.<br>Refer to the log for details. - + Recording %1 Ekran Kaydediliyor %1 - + Playing %1 / %2 Oynatılıyor %1 / %2 - + Movie Finished Film Bitti - + (Accessing SharedExtData) (SharedExtData'ya Erişiliyor) - + (Accessing SystemSaveData) (SystemSaveData'ya Erişiliyor) - + (Accessing BossExtData) (BossExtData'ya Erişiliyor) - + (Accessing ExtData) (ExtData'ya Erişiliyor) - + (Accessing SaveData) (SaveData'ya Erişiliyor) - + MB/s MB/sn - + KB/s KB/sn - + Artic Traffic: %1 %2%3 - + Speed: %1% Hız: %1% - + Speed: %1% / %2% Hız: %1% / %2% - + App: %1 FPS Uygulama: %1 FPS - + Frame: %1 ms (GPU: [CMD: %2 ms, SWP: %3 ms], IPC: %4 ms, SVC: %5 ms, Rem: %6 ms) - + Frame: %1 ms Kare: %1 ms - + VOLUME: MUTE - + VOLUME: %1% Volume percentage (e.g. 50%) - + %1 is missing. Please <a href='https://web.archive.org/web/20240304201103/https://citra-emu.org/wiki/dumping-system-archives-and-the-shared-fonts-from-a-3ds-console/'>dump your system archives</a>.<br/>Continuing emulation may result in crashes and bugs. - + A system archive Bir sistem arşivi - + System Archive Not Found Sistem Arşivi Bulunamadı - + System Archive Missing Sistem Arşivi Eksik - + Save/load Error Kaydetme/yükleme Hatası - + Fatal Error Önemli Hata - + A fatal error occurred. <a href='https://web.archive.org/web/20240228001712/https://community.citra-emu.org/t/how-to-upload-the-log-file/296'>Check the log</a> for details.<br/>Continuing emulation may result in crashes and bugs. - + Fatal Error encountered Kritik hatayla karşılaşıldı - + Continue Devam - + Quit Application Uygulamadan Çık - + OK Tamam - + Would you like to exit now? Çıkmak istediğinize emin misiniz? - + The application is still running. Would you like to stop emulation? Uygulama hala çalışıyor. Emülasyonu durdurmak ister misiniz? - + Playback Completed Oynatma Tamamlandı - + Movie playback completed. Klip oynatması tamamlandı. - + Update Available Güncelleme Mevcut - + Update %1 for Azahar is available. Would you like to download it? - + Primary Window Birincil Pencere - + Secondary Window İkincil Pencere @@ -5027,239 +5043,254 @@ Would you like to download it? GameList - + IMPORTANT: Encrypted files and .3ds files are no longer supported. Decrypting and/or renaming to .cci may be necessary. <a href='https://azahar-emu.org/blog/game-loading-changes/'>Learn more.</a> - + Don't show again Tekrar gösterme - - + + Compatibility Uyumluluk - - + + Region Bölge - - + + File type Dosya türü - - + + Size Boyut - - + + Play time Oyun süresi - + Favorite Favori - + + Eject Cartridge + + + + + Insert Cartridge + + + + Open - + Application Location Uygulama Konumu - + Save Data Location Kayıt Verileri Konumu - + Extra Data Location Ekstra Veri Konumu - + Update Data Location - + DLC Data Location - + DLC Veri Konumu - + Texture Dump Location - + Custom Texture Location - + Mods Location - + Dump RomFS RomFS Dump - + Disk Shader Cache - + Open Shader Cache Location - + Delete OpenGL Shader Cache - + Uninstall Sil - + Everything Her şey - + Application Uygulama - + Update Güncelle - + DLC DLC - + Remove Play Time Data - + Create Shortcut Kısayol Oluştur - + Add to Desktop Masaüstüne Ekle - + Add to Applications Menu Uygulamalar Menüsüne Ekle - + + Stress Test: App Launch + + + + Properties Özellikler - - - - + + + + Azahar Azahar - + Are you sure you want to completely uninstall '%1'? This will delete the application if installed, as well as any installed updates or DLC. - - + + %1 (Update) %1 (Güncelleme) - - + + %1 (DLC) %1 (DLC) - + Are you sure you want to uninstall '%1'? '%1'i silmek istediğinizden emin misiniz? - + Are you sure you want to uninstall the update for '%1'? - + Are you sure you want to uninstall all DLC for '%1'? - + Scan Subfolders Alt Dizinleri Tara - + Remove Application Directory Uygulama Dizinini Kaldır - + Move Up Yukarı Taşı - + Move Down Aşağı Taşı - + Open Directory Location Dizinin Bulunduğu Yeri Aç - + Clear Temizle - + Name İsim @@ -5267,77 +5298,77 @@ This will delete the application if installed, as well as any installed updates GameListItemCompat - + Perfect Mükemmel - + App functions flawless with no audio or graphical glitches, all tested functionality works as intended without any workarounds needed. - + Great Çok İyi - + App functions with minor graphical or audio glitches and is playable from start to finish. May require some workarounds. - + Okay Yeterli - + App functions with major graphical or audio glitches, but app is playable from start to finish with workarounds. - + Bad Kötü - + App functions, but with major graphical or audio glitches. Unable to progress in specific areas due to glitches even with workarounds. - + Intro/Menu Giriş/Menü - + App is completely unplayable due to major graphical or audio glitches. Unable to progress past the Start Screen. - + Won't Boot Açılmıyor - + The app crashes when attempting to startup. - + Not Tested Test Edilmedi - + The app has not yet been tested. Bu Uygulama henüz test edilmedi. @@ -5345,7 +5376,7 @@ Screen. GameListPlaceholder - + Double-click to add a new folder to the application list Uygulama listesine yeni bir klasör eklemek için çift tıklayın @@ -5353,27 +5384,27 @@ Screen. GameListSearchField - + of 'nun - + result sonuç - + results sonuçlar - + Filter: Filtre: - + Enter pattern to filter Filtrelenecek düzeni girin @@ -5701,87 +5732,87 @@ Screen. Cycle Index: - + SRC1: %1, %2, %3, %4 SRC1: %1, %2, %3, %4 - + SRC2: %1, %2, %3, %4 SRC2: %1, %2, %3, %4 - + SRC3: %1, %2, %3, %4 SRC3: %1, %2, %3, %4 - + DEST_IN: %1, %2, %3, %4 DEST_IN: %1, %2, %3, %4 - + DEST_OUT: %1, %2, %3, %4 DEST_OUT: %1, %2, %3, %4 - + Address Registers: %1, %2 Address Registers: %1, %2 - + Compare Result: %1, %2 Compare Result: %1, %2 - + Static Condition: %1 Static Condition: %1 - + Dynamic Conditions: %1, %2 Dynamic Conditions: %1, %2 - + Loop Parameters: %1 (repeats), %2 (initializer), %3 (increment), %4 Loop Parameters: %1 (repeats), %2 (initializer), %3 (increment), %4 - + Instruction offset: 0x%1 Instruction offset: 0x%1 - + -> 0x%2 -> 0x%2 - + (last instruction) (last instruction) @@ -6080,32 +6111,32 @@ Debug Message: Şifre: - + Room Name Oda İsmi - + Preferred Application Tercih Edilen Uygulama - + Host Sunucu - + Players Oyuncular - + Refreshing Yenileniyor - + Refresh List Listeyi Yenile @@ -6295,7 +6326,7 @@ Debug Message: Quick Save - Hızlı Kaydet + Hızlı Kaydet @@ -6305,7 +6336,7 @@ Debug Message: Quick Load - Hızlı Yükle + Hızlı Yükle @@ -6340,7 +6371,7 @@ Debug Message: Play... - + Oyna... @@ -6350,12 +6381,12 @@ Debug Message: Save without Closing - + Kapatmadan Kaydet Read-Only Mode - + Salt Okunur Mod @@ -6375,7 +6406,7 @@ Debug Message: Compress ROM File... - + ROM Dosyası Sıkıştır... @@ -6385,7 +6416,7 @@ Debug Message: Browse Public Rooms - + Herkese Açık Odalara Gözat @@ -6684,7 +6715,7 @@ Debug Message: (>1 day) - + (>1 gün) @@ -6926,7 +6957,7 @@ Odayı terk etmiş olabilirler. unknown - + bilinmeyen @@ -7081,7 +7112,7 @@ Odayı terk etmiş olabilirler. auto - + otomatik @@ -7105,32 +7136,32 @@ Odayı terk etmiş olabilirler. - + Unsupported encrypted application Desteklenmeyen şifreli uygulama - + Invalid region Geçersiz Bölge - + Installed Titles Yüklü Başlıklar - + System Titles Sistem Başlıkları - + Add New Application Directory - + Favorites Favoriler diff --git a/dist/languages/vi_VN.ts b/dist/languages/vi_VN.ts index f4dc682c6..6a4cef100 100644 --- a/dist/languages/vi_VN.ts +++ b/dist/languages/vi_VN.ts @@ -121,7 +121,7 @@ p, li { white-space: pre-wrap; } Cancel - Bỏ qua + Hủy bỏ @@ -179,12 +179,12 @@ p, li { white-space: pre-wrap; } %1 has been kicked - %1 đã bị kick. + %1 đã bị đuổi %1 has been banned - %1 đã bị cấm. + %1 đã bị cấm @@ -210,7 +210,7 @@ p, li { white-space: pre-wrap; } Kick - Kick + Đuổi @@ -220,12 +220,12 @@ p, li { white-space: pre-wrap; } Kick Player - Kick người chơi + Đuổi người chơi Are you sure you would like to <b>kick</b> %1? - Bạn có chắc muốn <b>kick</b> %1? + Bạn có chắc muốn <b>đuổi</b> %1? @@ -237,7 +237,7 @@ p, li { white-space: pre-wrap; } Are you sure you would like to <b>kick and ban</b> %1? This would ban both their forum username and their IP address. - Bạn có chắc muốn <b>kick và chặn</b> %1? + Bạn có chắc muốn <b>đuổi và cấm</b> %1? Điều này sẽ chặn cả tài khoản diễn đàn và địa chỉ IP của họ. @@ -292,8 +292,8 @@ This would ban both their forum username and their IP address. - Emulation: - Giả lập: + Emulation + Giả lập @@ -397,6 +397,7 @@ This would ban both their forum username and their IP address. + Camera Máy ảnh @@ -408,8 +409,8 @@ This would ban both their forum username and their IP address. - Camera to configure: - Cấu hình máy ảnh: + Camera to Configure + @@ -429,8 +430,8 @@ This would ban both their forum username and their IP address. - Camera mode: - Chế độ máy ảnh: + Camera mode + @@ -450,8 +451,8 @@ This would ban both their forum username and their IP address. - Camera position: - Vị trí máy ảnh: + Camera position + @@ -476,8 +477,8 @@ This would ban both their forum username and their IP address. - Camera Image Source: - Nguồn máy ảnh: + Camera Image Source + @@ -496,8 +497,8 @@ This would ban both their forum username and their IP address. - File: - Tệp tin: + File + @@ -510,11 +511,6 @@ This would ban both their forum username and their IP address. Select the system camera to use Chọn đầu ra camera để sử dụng - - - Camera: - Máy ảnh - <Default> @@ -528,8 +524,8 @@ This would ban both their forum username and their IP address. - Flip: - Lật ảnh: + Flip + @@ -1081,7 +1077,7 @@ Would you like to ignore the error and continue? - Reverse Side by Side + Side by Side Full Width @@ -1140,48 +1136,53 @@ Would you like to ignore the error and continue? - + + Swap Eyes + + + + Utility - + <html><head/><body><p>Replace textures with PNG files.</p><p>Textures are loaded from load/textures/[Title ID]/.</p></body></html> - - Use Custom Textures + + Use custom textures - + <html><head/><body><p>Dump textures to PNG files.</p><p>Textures are dumped to dump/textures/[Title ID]/.</p></body></html> - - Dump Textures - Trích xuất textures + + Dump textures + - + <html><head/><body><p>Load all custom textures into memory on boot, instead of loading them when the application requires them.</p></body></html> - - Preload Custom Textures + + Preload custom textures - + <html><head/><body><p>Load custom textures asynchronously with background threads to reduce loading stutter</p></body></html> - - Async Custom Texture Loading + + Async custom texture loading @@ -1239,12 +1240,12 @@ Would you like to ignore the error and continue? - Set emulation speed: + Set emulation speed - Emulation Speed: + Emulation Speed @@ -1356,12 +1357,12 @@ Would you like to ignore the error and continue? - SPIR-V Shader Generation + SPIR-V shader generation - Disable GLSL -> SPIR-V Optimizer + Disable GLSL -> SPIR-V optimizer @@ -1381,8 +1382,8 @@ Would you like to ignore the error and continue? - Enable Hardware Shader - Bật Hardware Shader + Enable hardware shader + @@ -1391,8 +1392,8 @@ Would you like to ignore the error and continue? - Accurate Multiplication - Accurate Multiplication + Accurate multiplication + @@ -1401,8 +1402,8 @@ Would you like to ignore the error and continue? - Enable Shader JIT - Bật xử lý đổ bóng bằng JIT + Enable shader JIT + @@ -1411,7 +1412,7 @@ Would you like to ignore the error and continue? - Enable Async Shader Compilation + Enable async shader compilation @@ -1421,7 +1422,7 @@ Would you like to ignore the error and continue? - Enable Async Presentation + Enable async presentation @@ -1461,7 +1462,7 @@ Would you like to ignore the error and continue? - Use Disk Shader Cache + Use disk shader cache @@ -1486,7 +1487,7 @@ Would you like to ignore the error and continue? - Delay application render thread: + Delay Application Render Thread @@ -1975,12 +1976,12 @@ Would you like to ignore the error and continue? - Swap Screens - Đổi vị trí màn hình + Swap screens + - Rotate Screens Upright + Rotate screens upright @@ -2097,7 +2098,7 @@ Would you like to ignore the error and continue? - <html><head/><body><p>Bottom Screen Opacity % (OpenGL Only)</p></body></html> + <html><head/><body><p>Bottom Screen Opacity %</p></body></html> @@ -2445,7 +2446,7 @@ Would you like to ignore the error and continue? - Use Virtual SD + Use virtual SD card @@ -2455,7 +2456,7 @@ Would you like to ignore the error and continue? - Use Custom Storage + Use custom storage location @@ -2542,8 +2543,8 @@ online features (if installed) - Region: - + Region + Khu vực @@ -2551,326 +2552,337 @@ online features (if installed) - + + Apply region free patch to +installed applications. + + + + + Patches the region of installed applications to be region free, so that they always appear on the home menu. + + + + Username Tên người dùng - + Birthday Sinh nhật - + January Tháng 1 - + February Tháng 2 - + March Tháng 3 - + April Tháng 4 - + May Tháng 5 - + June Tháng 6 - + July Tháng 7 - + August Tháng 8 - + September Tháng 9 - + October Tháng 10 - + November Tháng 11 - + December Tháng 12 - + Language Ngôn ngữ - + Note: this can be overridden when region setting is auto-select Lưu ý: tùy chọn này có thể bị thay thế khi thiết lập vùng đặt ở chế độ tự động - + Japanese (日本語) Tiếng Nhật (日本語) - + English Tiếng Anh (English) - + French (français) Tiếng Pháp (Français) - + German (Deutsch) Tiếng Đức (Deutsch) - + Italian (italiano) Tiếng Ý (Italiano) - + Spanish (español) Tiếng Tây Ban Nha (Español) - + Simplified Chinese (简体中文) Tiếng Hoa (Giản Thể) - + Korean (한국어) Tiếng Hàn (한국어) - + Dutch (Nederlands) Tiếng Hà Lan (Dutch) - + Portuguese (português) Tiếng Bồ Đào Nha (Português) - + Russian (Русский) Tiếng Nga (Pу́сский язы́к) - + Traditional Chinese (正體中文) Tiếng Hoa (Phồn Thể) - + Sound output mode Chế độ đầu ra âm thanh - + Mono Đơn âm - + Stereo Đa âm - + Surround Âm thanh vòm - + Country Quốc gia - + Clock Đồng hồ - + System Clock Đồng hồ hệ thống - + Fixed Time Giờ cố định - + Startup time Giờ bắt đầu - + yyyy-MM-ddTHH:mm:ss yyyy-MM-ddTHH:mm:ss - + Offset time - + days - + HH:mm:ss - + Initial System Ticks - + Random - + Fixed - + Initial System Ticks Override - + Play Coins - + <html><head/><body><p>Number of steps per hour reported by the pedometer. Range from 0 to 65,535.</p></body></html> - + Pedometer Steps per Hour - + Run System Setup when Home Menu is launched - + Console ID: ID Máy: - - + + Regenerate Tạo mới - + MAC: - - 3GX Plugin Loader: + + 3GX Plugin Loader - + Enable 3GX plugin loader - + Allow applications to change plugin loader state - + Real Console Unique Data - + Your real console is linked to Azahar. - + Unlink - + OTP - - - - + + + + Choose - + SecureInfo_A/B - + LocalFriendCodeSeed_A/B - + movable.sed - + System settings are available only when applications is not running. @@ -3580,76 +3592,76 @@ online features (if installed) - - + + Console ID: 0x%1 Tên Máy: 0x%1 - - + + MAC: %1 - + This will replace your current virtual 3DS console ID with a new one. Your current virtual 3DS console ID will not be recoverable. This might have unexpected effects in applications. This might fail if you use an outdated config save. Continue? - - - + + + Warning Cảnh báo - + This will replace your current MAC address with a new one. It is not recommended to do this if you got the MAC address from your real console using the setup tool. Continue? - + This action will unlink your real console from Azahar, with the following consequences:<br><ul><li>Your OTP, SecureInfo and LocalFriendCodeSeed will be removed from Azahar.</li><li>Your friend list will reset and you will be logged out of your NNID/PNID account.</li><li>System files and eshop titles obtained through Azahar will become inaccessible until the same console is linked again (save data will not be lost).</li></ul><br>Continue? - + Invalid country for configured region - + Invalid country for console unique data - + Status: Loaded - + Status: Loaded (Invalid Signature) - + Status: Loaded (Region Changed) - + Status: Not Found - + Status: Invalid - + Status: IO Error @@ -3764,13 +3776,13 @@ Drag points to change position, or double-click table cells to edit values. - Interface language: - Ngôn ngữ giao diện: + Interface Language + - Theme: - Giao diện: + Theme + @@ -3779,8 +3791,8 @@ Drag points to change position, or double-click table cells to edit values. - Icon Size: - Kích cỡ Icon: + Icon Size + @@ -3800,8 +3812,8 @@ Drag points to change position, or double-click table cells to edit values. - Row 1 Text: - Nội dung dòng 1: + Row 1 Text + @@ -3835,18 +3847,18 @@ Drag points to change position, or double-click table cells to edit values. - Row 2 Text: - Nội dung dòng 2: + Row 2 Text + - Hide Titles without Icon - Ẩn tiêu đề giữ Icon + Hide titles without icon + - Single Line Mode - Chế độ đơn dòng + Single line mode + @@ -3855,7 +3867,7 @@ Drag points to change position, or double-click table cells to edit values. - Show Advanced Frame Time Info + Show advanced frame time info @@ -3938,12 +3950,12 @@ Drag points to change position, or double-click table cells to edit values. DirectConnectWindow - + Connecting Đang kết nối - + Connect Kết nối @@ -4062,582 +4074,596 @@ Please check your FFmpeg installation used for compilation. GMainWindow - + No Suitable Vulkan Devices Detected - + Vulkan initialization failed during boot.<br/>Your GPU may not support Vulkan 1.1, or you do not have the latest graphics driver. - + Current Artic traffic speed. Higher values indicate bigger transfer loads. - - + + Current emulation speed. Values higher or lower than 100% indicate emulation is running faster or slower than a 3DS. Tốc độ giả lập hiện tại. Giá trị cao hoặc thấp hơn 100% thể hiện giả lập đang chạy nhanh hay chậm hơn một chiếc máy 3DS thực sự. - - + + How many frames per second the app is currently displaying. This will vary from app to app and scene to scene. - - + + Time taken to emulate a 3DS frame, not counting framelimiting or v-sync. For full-speed emulation this should be at most 16.67 ms. Thời gian để giả lập một khung hình của máy 3DS, không gồm giới hạn khung hay v-sync Một giả lập tốt nhất sẽ tiệm cận 16.67 ms. - + MicroProfile (unavailable) - + Clear Recent Files Xóa danh sách tệp gần đây - + &Continue - + &Pause - + Azahar is running an application TRANSLATORS: This string is shown to the user to explain why Citra needs to prevent the computer from sleeping - - + + Invalid App Format - - + + Your app format is not supported.<br/>Please follow the guides to redump your <a href='https://web.archive.org/web/20240304210021/https://citra-emu.org/wiki/dumping-game-cartridges/'>game cartridges</a> or <a href='https://web.archive.org/web/20240304210011/https://citra-emu.org/wiki/dumping-installed-titles/'>installed titles</a>. - + App Corrupted - + Your app is corrupted. <br/>Please follow the guides to redump your <a href='https://web.archive.org/web/20240304210021/https://citra-emu.org/wiki/dumping-game-cartridges/'>game cartridges</a> or <a href='https://web.archive.org/web/20240304210011/https://citra-emu.org/wiki/dumping-installed-titles/'>installed titles</a>. - + App Encrypted - + Your app is encrypted. <br/><a href='https://azahar-emu.org/blog/game-loading-changes/'>Please check our blog for more info.</a> - + Unsupported App - + GBA Virtual Console is not supported by Azahar. - - + + Artic Server - + + Invalid system mode + + + + + New 3DS exclusive applications cannot be loaded without enabling the New 3DS mode. + + + + Error while loading App! - + An unknown error occurred. Please see the log for more details. - + CIA must be installed before usage CIA cần được cài đặt trước khi dùng - + Before using this CIA, you must install it. Do you want to install it now? Trước khi sử dụng CIA, bạn cần cài đặt nó. Bạn có muốn cài đặt nó ngay không? - + Quick Load - + Quick Save - - + + Slot %1 - + %2 %3 - + Quick Save - %1 - + Quick Load - %1 - + Slot %1 - %2 %3 - + Error Opening %1 Folder Lỗi khi mở thư mục %1 - - + + Folder does not exist! Thư mục này không tồn tại! - + Remove Play Time Data - + Reset play time? - - - - + + + + Create Shortcut - + Do you want to launch the application in fullscreen? - + Successfully created a shortcut to %1 - + This will create a shortcut to the current AppImage. This may not work well if you update. Continue? - + Failed to create a shortcut to %1 - + Create Icon - + Cannot create icon file. Path "%1" does not exist and cannot be created. - + Dumping... Đang trích xuất... - - + + Cancel - Bỏ qua + Hủy bỏ - - - - - - - - - + + + + + + + + + Azahar - + Could not dump base RomFS. Refer to the log for details. Không thể trích xuất base RomFS. Kiểm tra log để biết thêm chi tiết. - + Error Opening %1 Lỗi khi mở %1 - + Select Directory Chọn thư mục - + Properties - + The application properties could not be loaded. - + 3DS Executable (%1);;All Files (*.*) %1 is an identifier for the 3DS executable file extensions. - + Load File Mở tệp tin - - + + Set Up System Files - + <p>Azahar needs console unique data and firmware files from a real console to be able to use some of its features.<br>Such files and data can be set up with the <a href=https://github.com/azahar-emu/ArticSetupTool>Azahar Artic Setup Tool</a><br>Notes:<ul><li><b>This operation will install console unique data to Azahar, do not share your user or nand folders<br>after performing the setup process!</b></li><li>While doing the setup process, Azahar will link to the console running the setup tool. You can unlink the<br>console later from the System tab in the emulator configuration menu.</li><li>Do not go online with both Azahar and your 3DS console at the same time after setting up system files,<br>as it could cause issues.</li><li>Old 3DS setup is needed for the New 3DS setup to work (doing both setup modes is recommended).</li><li>Both setup modes will work regardless of the model of the console running the setup tool.</li></ul><hr></p> - + Enter Azahar Artic Setup Tool address: - + <br>Choose setup mode: - + (ℹ️) Old 3DS setup - - + + Setup is possible. - + (⚠) New 3DS setup - + Old 3DS setup is required first. - + (✅) Old 3DS setup - - + + Setup completed. - + (ℹ️) New 3DS setup - + (✅) New 3DS setup - + The system files for the selected mode are already set up. Reinstall the files anyway? - + Load Files Mở các tệp tin - + 3DS Installation File (*.cia *.zcia) - - - + + + All Files (*.*) Tất cả tệp tin (*.*) - + Connect to Artic Base - + Enter Artic Base server address: - + %1 has been installed successfully. %1 đã được cài đặt thành công. - + Unable to open File Không thể mở tệp tin - + Could not open %1 Không thể mở %1 - + Installation aborted Việc cài đặt đã bị hoãn - + The installation of %1 was aborted. Please see the log for more details Việc cài đặt %1 đã bị hoãn. Vui lòng xem bản ghi nhật ký để biết thêm chi tiết. - + Invalid File Tệp tin không hợp lệ - + %1 is not a valid CIA %1 không phải là một tệp CIA hợp lệ - + CIA Encrypted - + Your CIA file is encrypted.<br/><a href='https://azahar-emu.org/blog/game-loading-changes/'>Please check our blog for more info.</a> - + Unable to find File - + Could not find %1 - - - - Error compressing file + + + + + Z3DS Compression - - File compress operation failed, check log for details. + + Failed to compress some files, check log for details. - - - - Error decompressing file + + Failed to decompress some files, check log for details. - - File decompress operation failed, check log for details. + + All files have been compressed successfully. - + + All files have been decompressed successfully. + + + + Uninstalling '%1'... - + Failed to uninstall '%1'. - + Successfully uninstalled '%1'. - + File not found Không tìm thấy tệp - + File "%1" not found Không tìm thấy tệp tin "%1" - + Savestates - + Warning: Savestates are NOT a replacement for in-application saves, and are not meant to be reliable. Use at your own risk! - - - + + + Error opening amiibo data file - + A tag is already in use. - + Application is not looking for amiibos. - + Amiibo File (%1);; All Files (*.*) Tệp Amiibo (%1);; Tất cả tệp (*.*) - + Load Amiibo Tải Amiibo - + Unable to open amiibo file "%1" for reading. - + Record Movie Quay phim - + Movie recording cancelled. Ghi hình đã bị hủy. - - + + Movie Saved Đã lưu phim. - - + + The movie is successfully saved. Phim đã được lưu lại thành công. - + Application will unpause - + The application will be unpaused, and the next frame will be captured. Is this okay? - + Invalid Screenshot Directory - + Cannot create specified screenshot directory. Screenshot path is set back to its default value. - + Could not load video dumper - + FFmpeg could not be loaded. Make sure you have a compatible version installed. To install FFmpeg to Azahar, press Open and select your FFmpeg directory. @@ -4646,274 +4672,264 @@ To view a guide on how to install FFmpeg, press Help. - - Load 3DS ROM File + + Load 3DS ROM Files - - 3DS ROM Files (*.cia *cci *3dsx *cxi) + + 3DS ROM Files (*.cia *.cci *.3dsx *.cxi) - - The selected file is not a compatible 3DS ROM format. Make sure you have chosen the right file, and that it is not encrypted. - - - - - The selected file is already compressed. - - - - + 3DS Compressed ROM File (*.%1) - + Save 3DS Compressed ROM File - - Load 3DS Compressed ROM File + + Select Output 3DS Compressed ROM Folder - + + Load 3DS Compressed ROM Files + + + + 3DS Compressed ROM Files (*.zcia *zcci *z3dsx *zcxi) - - The selected file is not a compatible compressed 3DS ROM format. Make sure you have chosen the right file. - - - - - The selected file is already decompressed. - - - - + 3DS ROM File (*.%1) - + Save 3DS ROM File - + + Select Output 3DS ROM Folder + + + + Select FFmpeg Directory - + The provided FFmpeg directory is missing %1. Please make sure the correct directory was selected. - + FFmpeg has been sucessfully installed. - + Installation of FFmpeg failed. Check the log file for details. - + Could not start video dumping.<br>Please ensure that the video encoder is configured correctly.<br>Refer to the log for details. - + Recording %1 - + Playing %1 / %2 - + Movie Finished - + (Accessing SharedExtData) - + (Accessing SystemSaveData) - + (Accessing BossExtData) - + (Accessing ExtData) - + (Accessing SaveData) - + MB/s - + KB/s - + Artic Traffic: %1 %2%3 - + Speed: %1% Tốc độ: %1% - + Speed: %1% / %2% Tốc độ: %1% / %2% - + App: %1 FPS - + Frame: %1 ms (GPU: [CMD: %2 ms, SWP: %3 ms], IPC: %4 ms, SVC: %5 ms, Rem: %6 ms) - + Frame: %1 ms Khung: %1 ms - + VOLUME: MUTE - + VOLUME: %1% Volume percentage (e.g. 50%) - + %1 is missing. Please <a href='https://web.archive.org/web/20240304201103/https://citra-emu.org/wiki/dumping-system-archives-and-the-shared-fonts-from-a-3ds-console/'>dump your system archives</a>.<br/>Continuing emulation may result in crashes and bugs. - + A system archive Một tập tin hệ thống - + System Archive Not Found Không tìm thấy tập tin hệ thống - + System Archive Missing Thiếu tập tin hệ thống - + Save/load Error - + Fatal Error Lỗi nghiêm trọng - + A fatal error occurred. <a href='https://web.archive.org/web/20240228001712/https://community.citra-emu.org/t/how-to-upload-the-log-file/296'>Check the log</a> for details.<br/>Continuing emulation may result in crashes and bugs. - + Fatal Error encountered - + Continue Tiếp tục - + Quit Application - + OK OK - + Would you like to exit now? Bạn có muốn thoát ngay bây giờ không? - + The application is still running. Would you like to stop emulation? - + Playback Completed Phát lại hoàn tất - + Movie playback completed. Phát lại phim hoàn tất. - + Update Available - + Update %1 for Azahar is available. Would you like to download it? - + Primary Window - + Secondary Window @@ -5019,239 +5035,254 @@ Would you like to download it? GameList - + IMPORTANT: Encrypted files and .3ds files are no longer supported. Decrypting and/or renaming to .cci may be necessary. <a href='https://azahar-emu.org/blog/game-loading-changes/'>Learn more.</a> - + Don't show again - - + + Compatibility Tính tương thích - - + + Region Khu vực - - + + File type Loại tệp tin - - + + Size Kích thước - - + + Play time - + Favorite - + + Eject Cartridge + + + + + Insert Cartridge + + + + Open - + Application Location - + Save Data Location - + Extra Data Location - + Update Data Location - + DLC Data Location - + Texture Dump Location - + Custom Texture Location - + Mods Location - + Dump RomFS Trích xuất RomFS - + Disk Shader Cache - + Open Shader Cache Location - + Delete OpenGL Shader Cache - + Uninstall - + Everything - + Application - + Update - + DLC - + Remove Play Time Data - + Create Shortcut - + Add to Desktop - + Add to Applications Menu - + + Stress Test: App Launch + + + + Properties - - - - + + + + Azahar - + Are you sure you want to completely uninstall '%1'? This will delete the application if installed, as well as any installed updates or DLC. - - + + %1 (Update) - - + + %1 (DLC) - + Are you sure you want to uninstall '%1'? - + Are you sure you want to uninstall the update for '%1'? - + Are you sure you want to uninstall all DLC for '%1'? - + Scan Subfolders Quét thư mục con - + Remove Application Directory - + Move Up - + Move Down - + Open Directory Location Mở thư mục - + Clear - + Name Tên @@ -5259,77 +5290,77 @@ This will delete the application if installed, as well as any installed updates GameListItemCompat - + Perfect Hoàn mỹ - + App functions flawless with no audio or graphical glitches, all tested functionality works as intended without any workarounds needed. - + Great Tuyệt vời - + App functions with minor graphical or audio glitches and is playable from start to finish. May require some workarounds. - + Okay Ổn - + App functions with major graphical or audio glitches, but app is playable from start to finish with workarounds. - + Bad Kém - + App functions, but with major graphical or audio glitches. Unable to progress in specific areas due to glitches even with workarounds. - + Intro/Menu Intro/Menu - + App is completely unplayable due to major graphical or audio glitches. Unable to progress past the Start Screen. - + Won't Boot Không mở được - + The app crashes when attempting to startup. - + Not Tested Chưa thử - + The app has not yet been tested. @@ -5337,7 +5368,7 @@ Screen. GameListPlaceholder - + Double-click to add a new folder to the application list @@ -5345,27 +5376,27 @@ Screen. GameListSearchField - + of của - + result kết quả - + results kết quả - + Filter: Bộ lọc: - + Enter pattern to filter Nhập mẫu ký tự để lọc @@ -5693,87 +5724,87 @@ Screen. Cycle Index: - + SRC1: %1, %2, %3, %4 SRC1: %1, %2, %3, %4 - + SRC2: %1, %2, %3, %4 SRC2: %1, %2, %3, %4 - + SRC3: %1, %2, %3, %4 SRC3: %1, %2, %3, %4 - + DEST_IN: %1, %2, %3, %4 DEST_IN: %1, %2, %3, %4 - + DEST_OUT: %1, %2, %3, %4 DEST_OUT: %1, %2, %3, %4 - + Address Registers: %1, %2 Địa chỉ đăng ký: %1, %2 - + Compare Result: %1, %2 So sánh kết quả: %1, %2 - + Static Condition: %1 Điều kiện cứng: %1 - + Dynamic Conditions: %1, %2 Điều kiện biến: %1, %2 - + Loop Parameters: %1 (repeats), %2 (initializer), %3 (increment), %4 Các tham số lặp: %1 (số lần lặp), %2 (biến khởi tạo), %3 (độ tăng), %4 - + Instruction offset: 0x%1 Instruction offset: 0x%1 - + -> 0x%2 -> 0x%2 - + (last instruction) (chỉ thị cuối cùng) @@ -6072,32 +6103,32 @@ Debug Message: Mật khẩu phòng: - + Room Name Tên phòng - + Preferred Application - + Host Host - + Players Số người - + Refreshing Đang tải - + Refresh List Làm mới @@ -6598,7 +6629,7 @@ Debug Message: File: - Tệp tin: + @@ -6690,7 +6721,7 @@ Debug Message: File: - Tệp tin: + @@ -7096,32 +7127,32 @@ They may have left the room. - + Unsupported encrypted application - + Invalid region Vùng không hợp lệ - + Installed Titles Các tiêu đề đã cài - + System Titles Các tiêu đề hệ thống - + Add New Application Directory - + Favorites diff --git a/dist/languages/zh_CN.ts b/dist/languages/zh_CN.ts index 1051c8ca1..d2a6067cb 100644 --- a/dist/languages/zh_CN.ts +++ b/dist/languages/zh_CN.ts @@ -298,8 +298,8 @@ This would ban both their forum username and their IP address. - Emulation: - 模拟: + Emulation + 模拟 @@ -403,6 +403,7 @@ This would ban both their forum username and their IP address. + Camera 摄像头 @@ -414,8 +415,8 @@ This would ban both their forum username and their IP address. - Camera to configure: - 要配置的摄像头: + Camera to Configure + 要配置的摄像头 @@ -435,8 +436,8 @@ This would ban both their forum username and their IP address. - Camera mode: - 摄像头模式: + Camera mode + 摄像头模式 @@ -456,8 +457,8 @@ This would ban both their forum username and their IP address. - Camera position: - 摄像头位置: + Camera position + 摄像头位置 @@ -482,8 +483,8 @@ This would ban both their forum username and their IP address. - Camera Image Source: - 摄像头图像来源: + Camera Image Source + 摄像头图像来源 @@ -502,8 +503,8 @@ This would ban both their forum username and their IP address. - File: - 图像文件: + File + 文件 @@ -516,11 +517,6 @@ This would ban both their forum username and their IP address. Select the system camera to use 选择要使用的系统摄像头 - - - Camera: - 摄像头: - <Default> @@ -534,8 +530,8 @@ This would ban both their forum username and their IP address. - Flip: - 翻转: + Flip + 翻转 @@ -1024,7 +1020,7 @@ Would you like to ignore the error and continue? Enable Linear Filtering - 启用线性过滤 + @@ -1088,8 +1084,8 @@ Would you like to ignore the error and continue? - Reverse Side by Side - 反向并排 + Side by Side Full Width + @@ -1139,7 +1135,7 @@ Would you like to ignore the error and continue? Disable Right Eye Rendering - 禁用右眼渲染 + @@ -1147,48 +1143,53 @@ Would you like to ignore the error and continue? <html><head/><body><p>禁用右眼渲染</p><p>不使用立体模式时禁用右眼图像渲染。在某些应用中可大大提高性能,但在其他应用中可能会导致闪烁。</p></body></html> - + + Swap Eyes + + + + Utility 工具 - + <html><head/><body><p>Replace textures with PNG files.</p><p>Textures are loaded from load/textures/[Title ID]/.</p></body></html> <html><head/><body><p>使用 PNG 文件进行纹理的替换。</p><p>将加载 load/textures/[Title ID]/ 目录的纹理文件。</p></body></html> - - Use Custom Textures + + Use custom textures 使用自定义纹理 - + <html><head/><body><p>Dump textures to PNG files.</p><p>Textures are dumped to dump/textures/[Title ID]/.</p></body></html> <html><head/><body><p>将纹理转储为 PNG 文件。</p><p>转储的文件保存于 dump/textures/[Title ID]/ 目录下。</p></body></html> - - Dump Textures - 转储纹理文件 + + Dump textures + 转储纹理 - + <html><head/><body><p>Load all custom textures into memory on boot, instead of loading them when the application requires them.</p></body></html> <html><head/><body><p>启动时将所有的自定义纹理加载到内存中,而不是在应用需要时才进行加载。</p></body></html> - - Preload Custom Textures + + Preload custom textures 预加载自定义纹理 - + <html><head/><body><p>Load custom textures asynchronously with background threads to reduce loading stutter</p></body></html> <html><head/><body><p>在后台线程中异步加载自定义纹理,以减少加载带来的卡顿</p></body></html> - - Async Custom Texture Loading + + Async custom texture loading 异步加载自定义纹理 @@ -1246,13 +1247,13 @@ Would you like to ignore the error and continue? - Set emulation speed: - 模拟速度: + Set emulation speed + 设置模拟速度 - Emulation Speed: - 模拟速度: + Emulation Speed + 模拟速度 @@ -1363,12 +1364,12 @@ Would you like to ignore the error and continue? - SPIR-V Shader Generation - SPIR-V 着色器 + SPIR-V shader generation + SPIR-V 着色器生成 - Disable GLSL -> SPIR-V Optimizer + Disable GLSL -> SPIR-V optimizer 禁用 GLSL -> SPIR-V 优化器 @@ -1388,8 +1389,8 @@ Would you like to ignore the error and continue? - Enable Hardware Shader - 开启硬件着色器 + Enable hardware shader + 启用硬件着色器 @@ -1398,7 +1399,7 @@ Would you like to ignore the error and continue? - Accurate Multiplication + Accurate multiplication 精确乘法运算 @@ -1408,8 +1409,8 @@ Would you like to ignore the error and continue? - Enable Shader JIT - 开启着色器 JIT + Enable shader JIT + 启用着色器 JIT @@ -1418,7 +1419,7 @@ Would you like to ignore the error and continue? - Enable Async Shader Compilation + Enable async shader compilation 启用异步着色器编译 @@ -1428,8 +1429,8 @@ Would you like to ignore the error and continue? - Enable Async Presentation - 启用异步着色器提交 + Enable async presentation + 启用异步提交 @@ -1468,7 +1469,7 @@ Would you like to ignore the error and continue? - Use Disk Shader Cache + Use disk shader cache 启用磁盘着色器缓存 @@ -1493,8 +1494,8 @@ Would you like to ignore the error and continue? - Delay application render thread: - 延迟应用渲染线程: + Delay Application Render Thread + 延迟应用渲染线程 @@ -1982,13 +1983,13 @@ Would you like to ignore the error and continue? - Swap Screens + Swap screens 交换屏幕 - Rotate Screens Upright - 顺时针旋转屏幕 + Rotate screens upright + 旋转屏幕为垂直 @@ -2104,8 +2105,8 @@ Would you like to ignore the error and continue? - <html><head/><body><p>Bottom Screen Opacity % (OpenGL Only)</p></body></html> - 下屏幕透明度 %(仅 OpenGL) + <html><head/><body><p>Bottom Screen Opacity %</p></body></html> + <html><head/><body><p>下屏不透明度 %</p></body></html> @@ -2452,8 +2453,8 @@ Would you like to ignore the error and continue? - Use Virtual SD - 启用虚拟 SD 卡 + Use virtual SD card + 使用虚拟 SD 卡 @@ -2462,8 +2463,8 @@ Would you like to ignore the error and continue? - Use Custom Storage - 使用自定义存储目录 + Use custom storage location + 使用自定义存储位置 @@ -2550,8 +2551,8 @@ LLE 模块(如果已安装) - Region: - 地区: + Region + 区域 @@ -2559,326 +2560,337 @@ LLE 模块(如果已安装) 自动选择 - + + Apply region free patch to +installed applications. + + + + + Patches the region of installed applications to be region free, so that they always appear on the home menu. + + + + Username 用户名 - + Birthday 生日 - + January 一月 - + February 二月 - + March 三月 - + April 四月 - + May 五月 - + June 六月 - + July 七月 - + August 八月 - + September 九月 - + October 十月 - + November 十一月 - + December 十二月 - + Language 语言 - + Note: this can be overridden when region setting is auto-select 注意:当“地区”设置是“自动选择”时,此设置可能会被覆盖。 - + Japanese (日本語) 日语(日本語) - + English 英语(English) - + French (français) 法语(Français) - + German (Deutsch) 德语(Deutsch) - + Italian (italiano) 意大利语(Italiano) - + Spanish (español) 西班牙语(Español) - + Simplified Chinese (简体中文) 简体中文 - + Korean (한국어) 朝鲜语(한국어) - + Dutch (Nederlands) 荷兰语(Nederlands) - + Portuguese (português) 葡萄牙语(Português) - + Russian (Русский) 俄语(Русский) - + Traditional Chinese (正體中文) 繁体中文(正體中文) - + Sound output mode 声音输出模式 - + Mono 单声道 - + Stereo 立体声 - + Surround 环绕声 - + Country 国家或地区 - + Clock 时钟 - + System Clock 系统时钟 - + Fixed Time 固定时间 - + Startup time 启动时间 - + yyyy-MM-ddTHH:mm:ss yyyy-MM-ddTHH:mm:ss - + Offset time 偏移时间 - + days - + HH:mm:ss HH:mm:ss - + Initial System Ticks 初始系统定时器 - + Random 随机 - + Fixed 固定值 - + Initial System Ticks Override 覆盖初始系统定时器 - + Play Coins 游戏币 - + <html><head/><body><p>Number of steps per hour reported by the pedometer. Range from 0 to 65,535.</p></body></html> <html><head/><body><p>计步器报告的每小时步数。范围从 0 到 65535。</p></body></html> - + Pedometer Steps per Hour 计步器每小时步数 - + Run System Setup when Home Menu is launched 启动 Home 菜单时运行系统设置 - + Console ID: 设备 ID: - - + + Regenerate 重置 ID - + MAC: MAC: - - 3GX Plugin Loader: - 3GX 插件加载器: + + 3GX Plugin Loader + 3GX 插件加载器 - + Enable 3GX plugin loader 启用 3GX 插件加载器 - + Allow applications to change plugin loader state 允许应用更改插件加载器状态 - + Real Console Unique Data 实机唯一数据 - + Your real console is linked to Azahar. 您的真实掌机已关联到 Azahar。 - + Unlink 解除关联 - + OTP OTP - - - - + + + + Choose 选择 - + SecureInfo_A/B SecureInfo_A/B - + LocalFriendCodeSeed_A/B LocalFriendCodeSeed_A/B - + movable.sed movable.sed - + System settings are available only when applications is not running. 只有当应用不在运行时,系统设置才可用。 @@ -3588,76 +3600,76 @@ LLE 模块(如果已安装) Sed 文件 (*.sed);;所有文件 (*.*) - - + + Console ID: 0x%1 设备 ID:0x%1 - - + + MAC: %1 MAC: %1 - + This will replace your current virtual 3DS console ID with a new one. Your current virtual 3DS console ID will not be recoverable. This might have unexpected effects in applications. This might fail if you use an outdated config save. Continue? 这将使用一个新的虚拟 3DS 掌机 ID 取代您当前的虚拟 3DS 掌机 ID。您当前的虚拟 3DS 掌机 ID 将无法恢复。可能会对应用产生意外影响。如果您使用一个过时的配置存档则可能会失败。是否继续? - - - + + + Warning 警告 - + This will replace your current MAC address with a new one. It is not recommended to do this if you got the MAC address from your real console using the setup tool. Continue? 这将用新 MAC 地址替换您当前的 MAC 地址。如果您使用设置工具从真实掌机获取 MAC 地址,则不建议执行此操作。是否继续? - + This action will unlink your real console from Azahar, with the following consequences:<br><ul><li>Your OTP, SecureInfo and LocalFriendCodeSeed will be removed from Azahar.</li><li>Your friend list will reset and you will be logged out of your NNID/PNID account.</li><li>System files and eshop titles obtained through Azahar will become inaccessible until the same console is linked again (save data will not be lost).</li></ul><br>Continue? 此操作将取消您真实掌机与 Azahar 的关联,并产生以下后果:<br><ul><li>您的 OTP、SecureInfo 和 LocalFriendCodeSeed 文件将从 Azahar 中删除。</li><li>您的好友列表将被重置,并且注销 NNID/PNID 帐户。</li><li>通过 Azahar 获得的系统文件和 eshop 数字版应用将变得无法访问,直到再次关联同一掌机(保存的数据不会丢失)。</li></ul><br>是否继续? - + Invalid country for configured region 已配置区域的国家/地区无效 - + Invalid country for console unique data 掌机独有数据的国家/地区无效 - + Status: Loaded 状态:已载入 - + Status: Loaded (Invalid Signature) 状态:已载入(无效签名) - + Status: Loaded (Region Changed) 状态:已载入(区域已更改) - + Status: Not Found 状态:未找到 - + Status: Invalid 状态:无效 - + Status: IO Error 状态:IO 错误 @@ -3773,13 +3785,13 @@ Drag points to change position, or double-click table cells to edit values. - Interface language: - 界面语言: + Interface Language + 界面语言 - Theme: - 主题: + Theme + 主题 @@ -3788,8 +3800,8 @@ Drag points to change position, or double-click table cells to edit values. - Icon Size: - 图标大小: + Icon Size + 图标大小 @@ -3809,8 +3821,8 @@ Drag points to change position, or double-click table cells to edit values. - Row 1 Text: - 第 1 行: + Row 1 Text + 第 1 行 @@ -3844,17 +3856,17 @@ Drag points to change position, or double-click table cells to edit values. - Row 2 Text: - 第 2 行: + Row 2 Text + 第 2 行 - Hide Titles without Icon + Hide titles without icon 隐藏没有图标的游戏 - Single Line Mode + Single line mode 单行模式 @@ -3864,7 +3876,7 @@ Drag points to change position, or double-click table cells to edit values. - Show Advanced Frame Time Info + Show advanced frame time info 显示高级帧生成时间信息 @@ -3947,12 +3959,12 @@ Drag points to change position, or double-click table cells to edit values. DirectConnectWindow - + Connecting 连接中 - + Connect 连接 @@ -4072,497 +4084,511 @@ Please check your FFmpeg installation used for compilation. GMainWindow - + No Suitable Vulkan Devices Detected 未检测到可用的 Vulkan 设备 - + Vulkan initialization failed during boot.<br/>Your GPU may not support Vulkan 1.1, or you do not have the latest graphics driver. Vulkan 初始化失败。<br/>您的 GPU 可能不支持 Vulkan 1.1,或者您没有安装最新的图形驱动程序。 - + Current Artic traffic speed. Higher values indicate bigger transfer loads. 当前 Artic 连接速度。数值越高,表示传递载荷越大。 - - + + Current emulation speed. Values higher or lower than 100% indicate emulation is running faster or slower than a 3DS. 当前模拟速度。高于或低于 100% 的值表示模拟正在运行得比实际 3DS 更快或更慢。 - - + + How many frames per second the app is currently displaying. This will vary from app to app and scene to scene. 应用当前显示的每秒帧数。这会因应用和场景而异。 - - + + Time taken to emulate a 3DS frame, not counting framelimiting or v-sync. For full-speed emulation this should be at most 16.67 ms. 在不计算速度限制和垂直同步的情况下,模拟一个 3DS 帧的实际时间。若要进行全速模拟,这个数值不应超过 16.67 毫秒。 - + MicroProfile (unavailable) 微档案文件(不可用) - + Clear Recent Files 清除最近文件 - + &Continue 继续(&C) - + &Pause 暂停(&P) - + Azahar is running an application TRANSLATORS: This string is shown to the user to explain why Citra needs to prevent the computer from sleeping Azahar 正在运行应用 - - + + Invalid App Format 无效的应用格式 - - + + Your app format is not supported.<br/>Please follow the guides to redump your <a href='https://web.archive.org/web/20240304210021/https://citra-emu.org/wiki/dumping-game-cartridges/'>game cartridges</a> or <a href='https://web.archive.org/web/20240304210011/https://citra-emu.org/wiki/dumping-installed-titles/'>installed titles</a>. 您的应用格式不受支持。<br/>请遵循以下指引重新转储您的<a href='https://web.archive.org/web/20240304210021/https://citra-emu.org/wiki/dumping-game-cartridges/'>游戏卡带</a>或<a href='https://web.archive.org/web/20240304210011/https://citra-emu.org/wiki/dumping-installed-titles/'>已安装的应用</a>。 - + App Corrupted 应用已损坏 - + Your app is corrupted. <br/>Please follow the guides to redump your <a href='https://web.archive.org/web/20240304210021/https://citra-emu.org/wiki/dumping-game-cartridges/'>game cartridges</a> or <a href='https://web.archive.org/web/20240304210011/https://citra-emu.org/wiki/dumping-installed-titles/'>installed titles</a>. 您的应用已损坏。<br/>请遵循以下指引重新转储您的<a href='https://web.archive.org/web/20240304210021/https://citra-emu.org/wiki/dumping-game-cartridges/'>游戏卡带</a>或<a href='https://web.archive.org/web/20240304210011/https://citra-emu.org/wiki/dumping-installed-titles/'>已安装的应用</a>。 - + App Encrypted 应用已加密 - + Your app is encrypted. <br/><a href='https://azahar-emu.org/blog/game-loading-changes/'>Please check our blog for more info.</a> 您的应用已加密。 <br/><a href='https://azahar-emu.org/blog/game-loading-changes/'>请查看我们的博客以了解更多信息。</a> - + Unsupported App 不支持的应用 - + GBA Virtual Console is not supported by Azahar. GBA 虚拟主机不受 Azahar 支持。 - - + + Artic Server Artic 服务器 - + + Invalid system mode + + + + + New 3DS exclusive applications cannot be loaded without enabling the New 3DS mode. + + + + Error while loading App! 加载应用时出错! - + An unknown error occurred. Please see the log for more details. 发生了一个未知错误。详情请参阅日志。 - + CIA must be installed before usage CIA 文件必须安装后才能使用 - + Before using this CIA, you must install it. Do you want to install it now? 在使用这个 CIA 文件前,您必须先进行安装。您希望现在就安装它吗? - + Quick Load 快速载入 - + Quick Save 快速保存 - - + + Slot %1 插槽 %1 - + %2 %3 %2 %3 - + Quick Save - %1 快速保存 - %1 - + Quick Load - %1 快速载入 - %1 - + Slot %1 - %2 %3 插槽 %1 - %2 %3 - + Error Opening %1 Folder 无法打开 %1 文件夹 - - + + Folder does not exist! 文件夹不存在! - + Remove Play Time Data 删除游戏时间数据 - + Reset play time? 重置游戏时间? - - - - + + + + Create Shortcut 创建快捷方式 - + Do you want to launch the application in fullscreen? 您想以全屏幕运行应用吗? - + Successfully created a shortcut to %1 已经在 %1 上创建了快捷方式。 - + This will create a shortcut to the current AppImage. This may not work well if you update. Continue? 这将会为当前的 AppImage 创建一个快捷方式。如果您更新,此快捷方式可能会无效。继续吗? - + Failed to create a shortcut to %1 在 %1 上创建快捷方式失败。 - + Create Icon 创建图标 - + Cannot create icon file. Path "%1" does not exist and cannot be created. 无法创建图标文件。路径“%1”不存在,且无法创建。 - + Dumping... 转储中... - - + + Cancel 取消 - - - - - - - - - + + + + + + + + + Azahar Azahar - + Could not dump base RomFS. Refer to the log for details. 无法转储 RomFS 。 有关详细信息,请参考日志文件。 - + Error Opening %1 无法打开 %1 - + Select Directory 选择目录 - + Properties 属性 - + The application properties could not be loaded. 无法加载应用属性。 - + 3DS Executable (%1);;All Files (*.*) %1 is an identifier for the 3DS executable file extensions. 3DS 可执行文件 (%1);;所有文件 (*.*) - + Load File 加载文件 - - + + Set Up System Files 设置系统文件 - + <p>Azahar needs console unique data and firmware files from a real console to be able to use some of its features.<br>Such files and data can be set up with the <a href=https://github.com/azahar-emu/ArticSetupTool>Azahar Artic Setup Tool</a><br>Notes:<ul><li><b>This operation will install console unique data to Azahar, do not share your user or nand folders<br>after performing the setup process!</b></li><li>While doing the setup process, Azahar will link to the console running the setup tool. You can unlink the<br>console later from the System tab in the emulator configuration menu.</li><li>Do not go online with both Azahar and your 3DS console at the same time after setting up system files,<br>as it could cause issues.</li><li>Old 3DS setup is needed for the New 3DS setup to work (doing both setup modes is recommended).</li><li>Both setup modes will work regardless of the model of the console running the setup tool.</li></ul><hr></p> <p>Azahar 需要来自真实掌机的独有数据和固件文件才能使用其部分功能。<br>此类文件和数据可通过 <a href=https://github.com/azahar-emu/ArticSetupTool>Azahar Artic 设置工具</a>进行设置<br>注意:<ul><li><b>此操作会将掌机独有数据安装到 Azahar,<br>执行设置过程后请勿共享您的用户或 nand 文件夹!</b></li><li>在执行设置过程时,Azahar 将关联到运行设置工具的掌机。<br>您可以随时从模拟器配置菜单的“系统”选项卡中取消关联掌机。</li><li>设置系统文件后,请勿同时使用 Azahar 和 3DS 掌机联网,<br>因为这可能会导致问题。</li><li>新 3DS 设置需要先进行老 3DS 设置才能运作(建议两种设置模式都执行)。</li><li>无论运行设置工具的掌机型号如何,两种设置模式均可运作。</li></ul><hr></p> - + Enter Azahar Artic Setup Tool address: 输入 Azahar Artic 设置工具地址: - + <br>Choose setup mode: <br>选择设置模式: - + (ℹ️) Old 3DS setup (ℹ️) 老 3DS 设置 - - + + Setup is possible. 可以进行设置。 - + (⚠) New 3DS setup (⚠) 新 3DS 设置 - + Old 3DS setup is required first. 首先需要设置老 3DS。 - + (✅) Old 3DS setup (✅) 老 3DS 设置 - - + + Setup completed. 设置完成。 - + (ℹ️) New 3DS setup (ℹ️) 新 3DS 设置 - + (✅) New 3DS setup (✅) 新 3DS 设置 - + The system files for the selected mode are already set up. Reinstall the files anyway? 所选模式的系统文件已设置。 是否要重新安装文件? - + Load Files 加载多个文件 - + 3DS Installation File (*.cia *.zcia) 3DS 安装文件 (*.cia *.zcia) - - - + + + All Files (*.*) 所有文件 (*.*) - + Connect to Artic Base 连接到 Artic Base - + Enter Artic Base server address: 输入 Artic Base 服务器地址: - + %1 has been installed successfully. %1 已成功安装。 - + Unable to open File 无法打开文件 - + Could not open %1 无法打开 %1 - + Installation aborted 安装失败 - + The installation of %1 was aborted. Please see the log for more details %1 的安装过程失败。请参阅日志以了解细节。 - + Invalid File 文件无效 - + %1 is not a valid CIA %1 不是有效的 CIA 文件 - + CIA Encrypted CIA 已加密 - + Your CIA file is encrypted.<br/><a href='https://azahar-emu.org/blog/game-loading-changes/'>Please check our blog for more info.</a> 您的 CIA 文件已加密。 <br/><a href='https://azahar-emu.org/blog/game-loading-changes/'>请查看我们的博客以了解更多信息。</a> - + Unable to find File 无法找到文件 - + Could not find %1 找不到 %1 - - - - Error compressing file - 压缩文件时出错 + + + + + Z3DS Compression + Z3DS 压缩 - - File compress operation failed, check log for details. - 文件压缩操作失败,请检查日志了解详细信息。 + + Failed to compress some files, check log for details. + 部分文件压缩失败,请查看日志了解详情。 - - - - Error decompressing file - 解压文件时出错 + + Failed to decompress some files, check log for details. + 部分文件解压缩失败,请查看日志了解详情。 - - File decompress operation failed, check log for details. - 文件解压缩操作失败,请检查日志了解详细信息。 + + All files have been compressed successfully. + 所有文件已成功压缩。 - + + All files have been decompressed successfully. + 所有文件已成功解压缩。 + + + Uninstalling '%1'... 正在卸载“%1”... - + Failed to uninstall '%1'. 卸载“%1”失败。 - + Successfully uninstalled '%1'. “%1”卸载成功。 - + File not found 找不到文件 - + File "%1" not found 找不到文件“%1” - + Savestates 保存状态 - + Warning: Savestates are NOT a replacement for in-application saves, and are not meant to be reliable. Use at your own risk! @@ -4571,86 +4597,86 @@ Use at your own risk! 您必须自行承担使用风险! - - - + + + Error opening amiibo data file 打开 Amiibo 数据文件时出错 - + A tag is already in use. 当前已有 Amiibo 标签在使用中。 - + Application is not looking for amiibos. 应用未在寻找 Amiibo。 - + Amiibo File (%1);; All Files (*.*) Amiibo 文件 (%1);;所有文件 (*.*) - + Load Amiibo 加载 Amiibo - + Unable to open amiibo file "%1" for reading. 无法打开 Amiibo 文件 %1 。 - + Record Movie 录制影像 - + Movie recording cancelled. 影像录制已取消。 - - + + Movie Saved 影像已保存 - - + + The movie is successfully saved. 影像已成功保存。 - + Application will unpause 应用将取消暂停 - + The application will be unpaused, and the next frame will be captured. Is this okay? 将取消暂停应用,并捕获下一帧。这样可以吗? - + Invalid Screenshot Directory 无效的截图保存目录 - + Cannot create specified screenshot directory. Screenshot path is set back to its default value. 无法创建指定的截图保存目录。截图保存路径将重设为默认值。 - + Could not load video dumper 无法加载视频转储器 - + FFmpeg could not be loaded. Make sure you have a compatible version installed. To install FFmpeg to Azahar, press Open and select your FFmpeg directory. @@ -4663,275 +4689,265 @@ To view a guide on how to install FFmpeg, press Help. 要查看如何安装 FFmpeg 的指南,请按“帮助”。 - - Load 3DS ROM File + + Load 3DS ROM Files 加载 3DS ROM 文件 - - 3DS ROM Files (*.cia *cci *3dsx *cxi) - 3DS ROM 文件 (*.cia *cci *3dsx *cxi) + + 3DS ROM Files (*.cia *.cci *.3dsx *.cxi) + 3DS ROM 文件 (*.cia *.cci *.3dsx *.cxi) - - The selected file is not a compatible 3DS ROM format. Make sure you have chosen the right file, and that it is not encrypted. - 所选文件不是兼容的 3DS ROM 格式。请确保您选择的文件正确且未加密。 - - - - The selected file is already compressed. - 选定的文件已压缩。 - - - + 3DS Compressed ROM File (*.%1) 3DS 压缩 ROM 文件 (*.%1) - + Save 3DS Compressed ROM File 保存 3DS 压缩 ROM 文件 - - Load 3DS Compressed ROM File + + Select Output 3DS Compressed ROM Folder + 选择输出 3DS 压缩 ROM 的文件夹 + + + + Load 3DS Compressed ROM Files 加载 3DS 压缩 ROM 文件 - + 3DS Compressed ROM Files (*.zcia *zcci *z3dsx *zcxi) 3DS 压缩 ROM 文件 (*.zcia *zcci *z3dsx *zcxi) - - The selected file is not a compatible compressed 3DS ROM format. Make sure you have chosen the right file. - 所选文件不是兼容的压缩 3DS ROM 格式。请确保您选择的是正确文件。 - - - - The selected file is already decompressed. - 选定的文件已解压。 - - - + 3DS ROM File (*.%1) 3DS ROM 文件 (*.%1) - + Save 3DS ROM File 保存 3DS ROM 文件 - + + Select Output 3DS ROM Folder + 选择输出 3DS ROM 的文件夹 + + + Select FFmpeg Directory 选择 FFmpeg 目录 - + The provided FFmpeg directory is missing %1. Please make sure the correct directory was selected. 选择的 FFmpeg 目录中缺少 %1 。请确保选择了正确的目录。 - + FFmpeg has been sucessfully installed. FFmpeg 已成功安装。 - + Installation of FFmpeg failed. Check the log file for details. 安装 FFmpeg 失败。详情请参阅日志文件。 - + Could not start video dumping.<br>Please ensure that the video encoder is configured correctly.<br>Refer to the log for details. 无法开始视频转储。<br>请确保视频编码器配置正确。<br>有关详细信息,请参阅日志。 - + Recording %1 录制中 %1 - + Playing %1 / %2 播放中 %1 / %2 - + Movie Finished 录像播放完毕 - + (Accessing SharedExtData) (正在获取 SharedExtData) - + (Accessing SystemSaveData) (正在获取 SystemSaveData) - + (Accessing BossExtData) (正在获取 BossExtData) - + (Accessing ExtData) (正在获取 ExtData) - + (Accessing SaveData) 正在获取(SaveData) - + MB/s MB/s - + KB/s KB/s - + Artic Traffic: %1 %2%3 Artic 流量:%1 %2%3 - + Speed: %1% 速度:%1% - + Speed: %1% / %2% 速度:%1% / %2% - + App: %1 FPS 应用: %1 帧 - + Frame: %1 ms (GPU: [CMD: %2 ms, SWP: %3 ms], IPC: %4 ms, SVC: %5 ms, Rem: %6 ms) 帧: %1 毫秒 (GPU: [CMD: %2 毫秒, SWP: %3 毫秒], IPC: %4 毫秒, SVC: %5 毫秒, Rem: %6 毫秒) - + Frame: %1 ms 帧延迟:%1 毫秒 - + VOLUME: MUTE 音量:静音 - + VOLUME: %1% Volume percentage (e.g. 50%) 音量:%1% - + %1 is missing. Please <a href='https://web.archive.org/web/20240304201103/https://citra-emu.org/wiki/dumping-system-archives-and-the-shared-fonts-from-a-3ds-console/'>dump your system archives</a>.<br/>Continuing emulation may result in crashes and bugs. %1 缺失。请 <a href='https://web.archive.org/web/20240304201103/https://citra-emu.org/wiki/dumping-system-archives-and-the-shared-fonts-from-a-3ds-console/'>转储您的系统档案</a>。<br/>继续进行模拟可能会导致崩溃和错误。 - + A system archive 系统档案 - + System Archive Not Found 未找到系统档案 - + System Archive Missing 系统档案丢失 - + Save/load Error 保存/读取出现错误 - + Fatal Error 致命错误 - + A fatal error occurred. <a href='https://web.archive.org/web/20240228001712/https://community.citra-emu.org/t/how-to-upload-the-log-file/296'>Check the log</a> for details.<br/>Continuing emulation may result in crashes and bugs. 发生了致命错误。请<a href='https://web.archive.org/web/20240228001712/https://community.citra-emu.org/t/how-to-upload-the-log-file/296'>参阅日志</a>了解详细信息。<br/>继续进行模拟可能会导致崩溃和错误。 - + Fatal Error encountered 发生致命错误 - + Continue 继续 - + Quit Application 退出应用 - + OK 确定 - + Would you like to exit now? 您现在要退出么? - + The application is still running. Would you like to stop emulation? 应用仍在运行。您想停止模拟吗? - + Playback Completed 播放完成 - + Movie playback completed. 影像播放完成。 - + Update Available 有可用更新 - + Update %1 for Azahar is available. Would you like to download it? Azahar 的更新 %1 已发布。 您要下载吗? - + Primary Window 主窗口 - + Secondary Window 次级窗口 @@ -5037,175 +5053,190 @@ Would you like to download it? GameList - + IMPORTANT: Encrypted files and .3ds files are no longer supported. Decrypting and/or renaming to .cci may be necessary. <a href='https://azahar-emu.org/blog/game-loading-changes/'>Learn more.</a> 重要提示:加密文件和 3ds 后缀名文件不再受支持。可能需要解密和/或重命名为 cci 后缀名。<a href='https://azahar-emu.org/blog/game-loading-changes/'>了解详情。</a> - + Don't show again 不再显示 - - + + Compatibility 兼容性 - - + + Region 地区 - - + + File type 文件类型 - - + + Size 大小 - - + + Play time 游戏时间 - + Favorite 收藏 - + + Eject Cartridge + + + + + Insert Cartridge + + + + Open 打开 - + Application Location 应用路径 - + Save Data Location 存档数据路径 - + Extra Data Location 额外数据路径 - + Update Data Location 更新数据路径 - + DLC Data Location DLC 数据路径 - + Texture Dump Location 纹理转储路径 - + Custom Texture Location 自定义纹理路径 - + Mods Location Mods 路径 - + Dump RomFS 转储 RomFS - + Disk Shader Cache 磁盘着色器缓存 - + Open Shader Cache Location 打开着色器缓存位置 - + Delete OpenGL Shader Cache 删除 OpenGL 着色器缓存 - + Uninstall 卸载 - + Everything 所有内容 - + Application 应用 - + Update 更新补丁 - + DLC DLC - + Remove Play Time Data 删除游玩时间 - + Create Shortcut 创建快捷方式 - + Add to Desktop 添加到桌面 - + Add to Applications Menu 添加到应用菜单 - + + Stress Test: App Launch + 压力测试:应用启动 + + + Properties 属性 - - - - + + + + Azahar Azahar - + Are you sure you want to completely uninstall '%1'? This will delete the application if installed, as well as any installed updates or DLC. @@ -5214,64 +5245,64 @@ This will delete the application if installed, as well as any installed updates 这将删除应用、已安装的更新补丁或 DLC。 - - + + %1 (Update) %1(更新补丁) - - + + %1 (DLC) %1(DLC) - + Are you sure you want to uninstall '%1'? 您确定要卸载“%1”吗? - + Are you sure you want to uninstall the update for '%1'? 您确定要卸载“%1”的更新补丁吗? - + Are you sure you want to uninstall all DLC for '%1'? 您确定要卸载“%1”的所有 DLC 吗? - + Scan Subfolders 扫描子文件夹 - + Remove Application Directory 移除应用目录 - + Move Up 向上移动 - + Move Down 向下移动 - + Open Directory Location 打开目录位置 - + Clear 清除 - + Name 名称 @@ -5279,82 +5310,82 @@ This will delete the application if installed, as well as any installed updates GameListItemCompat - + Perfect 完美 - + App functions flawless with no audio or graphical glitches, all tested functionality works as intended without any workarounds needed. 应用运行完美,没有音频或图形问题。所有测试功能均按预期运行。 无需任何另外的解决方法。 - + Great 良好 - + App functions with minor graphical or audio glitches and is playable from start to finish. May require some workarounds. 应用运行时会有非常轻微的图像或音频问题,但是能从头玩到尾。 可能需要一些方法来避免问题。 - + Okay 一般 - + App functions with major graphical or audio glitches, but app is playable from start to finish with workarounds. 应用运行时会有严重的图像或音频错误, 但是在使用一些方法之后能从头到尾地完成流程。 - + Bad 较差 - + App functions, but with major graphical or audio glitches. Unable to progress in specific areas due to glitches even with workarounds. 应用能运行,但是会有严重的图像或音频错误。 即使有解决方法仍无法通过某些特定区域。 - + Intro/Menu 开场 / 菜单 - + App is completely unplayable due to major graphical or audio glitches. Unable to progress past the Start Screen. 应用完全无法运行,图像或音频有重大错误。 无法通过开场菜单。 - + Won't Boot 无法打开 - + The app crashes when attempting to startup. 应用在尝试启动时直接崩溃。 - + Not Tested 未测试 - + The app has not yet been tested. 应用尚未经过测试。 @@ -5362,7 +5393,7 @@ Screen. GameListPlaceholder - + Double-click to add a new folder to the application list 双击将新文件夹添加到应用列表 @@ -5370,27 +5401,27 @@ Screen. GameListSearchField - + of / - + result 结果 - + results 结果 - + Filter: 搜索: - + Enter pattern to filter 搜索游戏 @@ -5718,87 +5749,87 @@ Screen. 循环索引: - + SRC1: %1, %2, %3, %4 SRC1: %1, %2, %3, %4 - + SRC2: %1, %2, %3, %4 SRC2: %1, %2, %3, %4 - + SRC3: %1, %2, %3, %4 SRC3: %1, %2, %3, %4 - + DEST_IN: %1, %2, %3, %4 DEST_IN: %1, %2, %3, %4 - + DEST_OUT: %1, %2, %3, %4 DEST_OUT: %1, %2, %3, %4 - + Address Registers: %1, %2 地址寄存器:%1, %2 - + Compare Result: %1, %2 比较结果:%1, %2 - + Static Condition: %1 静态状态:%1 - + Dynamic Conditions: %1, %2 动态状态:%1, %2 - + Loop Parameters: %1 (repeats), %2 (initializer), %3 (increment), %4 循环参数:%1 (循环), %2(初始值), %3(增量), %4 - + Instruction offset: 0x%1 指令偏移量:0x%1 - + -> 0x%2 -> 0x%2 - + (last instruction) (上一个指令) @@ -6099,32 +6130,32 @@ Debug Message: 密码: - + Room Name 房间名称 - + Preferred Application 首选应用 - + Host 创建者 - + Players 玩家 - + Refreshing 正在刷新 - + Refresh List 刷新列表 @@ -7126,32 +7157,32 @@ They may have left the room. %1 (0x%2) - + Unsupported encrypted application 不支持的加密应用 - + Invalid region 无效的地区 - + Installed Titles 已安装的项目 - + System Titles 系统项目 - + Add New Application Directory 添加新的应用目录 - + Favorites 收藏 diff --git a/dist/languages/zh_TW.ts b/dist/languages/zh_TW.ts index 5ca638f46..d3017b4b1 100644 --- a/dist/languages/zh_TW.ts +++ b/dist/languages/zh_TW.ts @@ -292,8 +292,8 @@ This would ban both their forum username and their IP address. - Emulation: - 模擬 + Emulation + 模擬 @@ -397,6 +397,7 @@ This would ban both their forum username and their IP address. + Camera 相機 @@ -408,8 +409,8 @@ This would ban both their forum username and their IP address. - Camera to configure: - 設定的鏡頭: + Camera to Configure + @@ -429,8 +430,8 @@ This would ban both their forum username and their IP address. - Camera mode: - 相機模式: + Camera mode + @@ -450,8 +451,8 @@ This would ban both their forum username and their IP address. - Camera position: - 鏡頭位置: + Camera position + @@ -476,8 +477,8 @@ This would ban both their forum username and their IP address. - Camera Image Source: - 相機畫面來源: + Camera Image Source + @@ -496,8 +497,8 @@ This would ban both their forum username and their IP address. - File: - 檔案: + File + @@ -510,11 +511,6 @@ This would ban both their forum username and their IP address. Select the system camera to use 選擇電腦相機 - - - Camera: - 相機: - <Default> @@ -528,8 +524,8 @@ This would ban both their forum username and their IP address. - Flip: - 翻轉圖片: + Flip + @@ -1018,7 +1014,7 @@ Would you like to ignore the error and continue? Enable Linear Filtering - 啟用線性過濾 + @@ -1082,7 +1078,7 @@ Would you like to ignore the error and continue? - Reverse Side by Side + Side by Side Full Width @@ -1141,49 +1137,54 @@ Would you like to ignore the error and continue? - + + Swap Eyes + + + + Utility 工具 - + <html><head/><body><p>Replace textures with PNG files.</p><p>Textures are loaded from load/textures/[Title ID]/.</p></body></html> <html><head/><body><p>使用 PNG 文件進行紋理的替換。 </p><p>將於 load/textures/[Title ID]/ 目錄下加載紋理文件。 </p></body></html> - - Use Custom Textures - 使用自定義紋理 + + Use custom textures + - + <html><head/><body><p>Dump textures to PNG files.</p><p>Textures are dumped to dump/textures/[Title ID]/.</p></body></html> <html><head/><body><p>使用 PNG 文件進行紋理的替換。 </p><p>將於 load/textures/[Title ID]/ 目錄下加載紋理文件。 </p></body></html> - - Dump Textures - 轉儲紋理文件 + + Dump textures + - + <html><head/><body><p>Load all custom textures into memory on boot, instead of loading them when the application requires them.</p></body></html> - - Preload Custom Textures - 預加載自定義紋理 + + Preload custom textures + - + <html><head/><body><p>Load custom textures asynchronously with background threads to reduce loading stutter</p></body></html> <html><head/><body><p>在後台線程中異步加載自定義紋理,以減少加載帶來的卡頓</p></body></html> - - Async Custom Texture Loading - 異步加載自定義紋理 + + Async custom texture loading + @@ -1240,13 +1241,13 @@ Would you like to ignore the error and continue? - Set emulation speed: - 設置模擬速度: + Set emulation speed + - Emulation Speed: - 模擬速度: + Emulation Speed + @@ -1357,12 +1358,12 @@ Would you like to ignore the error and continue? - SPIR-V Shader Generation + SPIR-V shader generation - Disable GLSL -> SPIR-V Optimizer + Disable GLSL -> SPIR-V optimizer @@ -1382,8 +1383,8 @@ Would you like to ignore the error and continue? - Enable Hardware Shader - 啟用硬體著色 + Enable hardware shader + @@ -1392,8 +1393,8 @@ Would you like to ignore the error and continue? - Accurate Multiplication - 精準著色增值 + Accurate multiplication + @@ -1402,8 +1403,8 @@ Would you like to ignore the error and continue? - Enable Shader JIT - 啟用 JIT 著色 + Enable shader JIT + @@ -1412,7 +1413,7 @@ Would you like to ignore the error and continue? - Enable Async Shader Compilation + Enable async shader compilation @@ -1422,7 +1423,7 @@ Would you like to ignore the error and continue? - Enable Async Presentation + Enable async presentation @@ -1462,8 +1463,8 @@ Would you like to ignore the error and continue? - Use Disk Shader Cache - 啟用磁盤著色器緩存 + Use disk shader cache + @@ -1487,7 +1488,7 @@ Would you like to ignore the error and continue? - Delay application render thread: + Delay Application Render Thread @@ -1976,12 +1977,12 @@ Would you like to ignore the error and continue? - Swap Screens - 交換上下畫面 + Swap screens + - Rotate Screens Upright + Rotate screens upright @@ -2098,7 +2099,7 @@ Would you like to ignore the error and continue? - <html><head/><body><p>Bottom Screen Opacity % (OpenGL Only)</p></body></html> + <html><head/><body><p>Bottom Screen Opacity %</p></body></html> @@ -2446,7 +2447,7 @@ Would you like to ignore the error and continue? - Use Virtual SD + Use virtual SD card @@ -2456,7 +2457,7 @@ Would you like to ignore the error and continue? - Use Custom Storage + Use custom storage location @@ -2543,8 +2544,8 @@ online features (if installed) - Region: - + Region + 地區 @@ -2552,326 +2553,337 @@ online features (if installed) - + + Apply region free patch to +installed applications. + + + + + Patches the region of installed applications to be region free, so that they always appear on the home menu. + + + + Username 使用者名稱 - + Birthday 生日 - + January 一月 - + February 二月 - + March 三月 - + April 四月 - + May 五月 - + June 六月 - + July 七月 - + August 八月 - + September 九月 - + October 十月 - + November 十一月 - + December 十二月 - + Language 語言 - + Note: this can be overridden when region setting is auto-select 注意:當「地區」設定是自動時,會覆寫這個設定。 - + Japanese (日本語) 日文 (日本語) - + English 英文 (English) - + French (français) 法文 (français) - + German (Deutsch) 德文 (Deutsch) - + Italian (italiano) 義大利文 (Italiano) - + Spanish (español) 西班牙文 (Español) - + Simplified Chinese (简体中文) 簡體中文 (简体中文) - + Korean (한국어) 韓文 (한국어) - + Dutch (Nederlands) 荷蘭文 (Nederlands) - + Portuguese (português) 葡萄牙文 (Português) - + Russian (Русский) 俄文 (Русский) - + Traditional Chinese (正體中文) 正體中文 (正體中文) - + Sound output mode 聲音輸出模式 - + Mono 單聲道 - + Stereo 立體聲 - + Surround 環繞 - + Country 國家 - + Clock 時鐘 - + System Clock 系統時鐘 - + Fixed Time 固定時間 - + Startup time 每次開始的時間 - + yyyy-MM-ddTHH:mm:ss yyyy-MM-ddTHH:mm:ss - + Offset time - + days - + HH:mm:ss - + Initial System Ticks - + Random - + Fixed - + Initial System Ticks Override - + Play Coins - + <html><head/><body><p>Number of steps per hour reported by the pedometer. Range from 0 to 65,535.</p></body></html> - + Pedometer Steps per Hour - + Run System Setup when Home Menu is launched - + Console ID: 裝置 ID: - - + + Regenerate 更換 ID - + MAC: - - 3GX Plugin Loader: + + 3GX Plugin Loader - + Enable 3GX plugin loader - + Allow applications to change plugin loader state - + Real Console Unique Data - + Your real console is linked to Azahar. - + Unlink - + OTP - - - - + + + + Choose - + SecureInfo_A/B - + LocalFriendCodeSeed_A/B - + movable.sed - + System settings are available only when applications is not running. @@ -3581,76 +3593,76 @@ online features (if installed) - - + + Console ID: 0x%1 裝置 ID:0x%1 - - + + MAC: %1 - + This will replace your current virtual 3DS console ID with a new one. Your current virtual 3DS console ID will not be recoverable. This might have unexpected effects in applications. This might fail if you use an outdated config save. Continue? - - - + + + Warning 警告 - + This will replace your current MAC address with a new one. It is not recommended to do this if you got the MAC address from your real console using the setup tool. Continue? - + This action will unlink your real console from Azahar, with the following consequences:<br><ul><li>Your OTP, SecureInfo and LocalFriendCodeSeed will be removed from Azahar.</li><li>Your friend list will reset and you will be logged out of your NNID/PNID account.</li><li>System files and eshop titles obtained through Azahar will become inaccessible until the same console is linked again (save data will not be lost).</li></ul><br>Continue? - + Invalid country for configured region - + Invalid country for console unique data - + Status: Loaded - + Status: Loaded (Invalid Signature) - + Status: Loaded (Region Changed) - + Status: Not Found - + Status: Invalid - + Status: IO Error @@ -3765,13 +3777,13 @@ Drag points to change position, or double-click table cells to edit values. - Interface language: - 介面語言: + Interface Language + - Theme: - 主題: + Theme + @@ -3780,8 +3792,8 @@ Drag points to change position, or double-click table cells to edit values. - Icon Size: - 圖示大小: + Icon Size + @@ -3801,8 +3813,8 @@ Drag points to change position, or double-click table cells to edit values. - Row 1 Text: - 第一行: + Row 1 Text + @@ -3836,17 +3848,17 @@ Drag points to change position, or double-click table cells to edit values. - Row 2 Text: - 第二行: + Row 2 Text + - Hide Titles without Icon - 隱藏不能執行的遊戲 + Hide titles without icon + - Single Line Mode + Single line mode @@ -3856,7 +3868,7 @@ Drag points to change position, or double-click table cells to edit values. - Show Advanced Frame Time Info + Show advanced frame time info @@ -3939,12 +3951,12 @@ Drag points to change position, or double-click table cells to edit values. DirectConnectWindow - + Connecting 連線中 - + Connect 連線 @@ -4063,583 +4075,597 @@ Please check your FFmpeg installation used for compilation. GMainWindow - + No Suitable Vulkan Devices Detected - + Vulkan initialization failed during boot.<br/>Your GPU may not support Vulkan 1.1, or you do not have the latest graphics driver. - + Current Artic traffic speed. Higher values indicate bigger transfer loads. - - + + Current emulation speed. Values higher or lower than 100% indicate emulation is running faster or slower than a 3DS. 目前模擬速度, 「高於/低於」100% 代表模擬速度比 3DS 實機「更快/更慢」。 - - + + How many frames per second the app is currently displaying. This will vary from app to app and scene to scene. - - + + Time taken to emulate a 3DS frame, not counting framelimiting or v-sync. For full-speed emulation this should be at most 16.67 ms. 不計算影格限制或垂直同步時, 模擬一個 3DS 影格所花的時間。全速模擬時,這個數值最多應為 16.67 毫秒。 - + MicroProfile (unavailable) - + Clear Recent Files 清除檔案使用紀錄 - + &Continue - + &Pause - + Azahar is running an application TRANSLATORS: This string is shown to the user to explain why Citra needs to prevent the computer from sleeping - - + + Invalid App Format - - + + Your app format is not supported.<br/>Please follow the guides to redump your <a href='https://web.archive.org/web/20240304210021/https://citra-emu.org/wiki/dumping-game-cartridges/'>game cartridges</a> or <a href='https://web.archive.org/web/20240304210011/https://citra-emu.org/wiki/dumping-installed-titles/'>installed titles</a>. - + App Corrupted - + Your app is corrupted. <br/>Please follow the guides to redump your <a href='https://web.archive.org/web/20240304210021/https://citra-emu.org/wiki/dumping-game-cartridges/'>game cartridges</a> or <a href='https://web.archive.org/web/20240304210011/https://citra-emu.org/wiki/dumping-installed-titles/'>installed titles</a>. - + App Encrypted - + Your app is encrypted. <br/><a href='https://azahar-emu.org/blog/game-loading-changes/'>Please check our blog for more info.</a> - + Unsupported App - + GBA Virtual Console is not supported by Azahar. - - + + Artic Server - + + Invalid system mode + + + + + New 3DS exclusive applications cannot be loaded without enabling the New 3DS mode. + + + + Error while loading App! - + An unknown error occurred. Please see the log for more details. - + CIA must be installed before usage CIA 檔案必須先安裝 - + Before using this CIA, you must install it. Do you want to install it now? CIA 檔案必須先安裝才能夠執行。您現在要安裝這個檔案嗎? - + Quick Load - + Quick Save - - + + Slot %1 - + %2 %3 - + Quick Save - %1 - + Quick Load - %1 - + Slot %1 - %2 %3 - + Error Opening %1 Folder 開啟 %1 資料夾時錯誤 - - + + Folder does not exist! 資料夾不存在! - + Remove Play Time Data - + Reset play time? - - - - + + + + Create Shortcut - + Do you want to launch the application in fullscreen? - + Successfully created a shortcut to %1 - + This will create a shortcut to the current AppImage. This may not work well if you update. Continue? - + Failed to create a shortcut to %1 - + Create Icon - + Cannot create icon file. Path "%1" does not exist and cannot be created. - + Dumping... - - + + Cancel 取消 - - - - - - - - - + + + + + + + + + Azahar - + Could not dump base RomFS. Refer to the log for details. - + Error Opening %1 開啟 %1 時錯誤 - + Select Directory 選擇目錄 - + Properties - + The application properties could not be loaded. - + 3DS Executable (%1);;All Files (*.*) %1 is an identifier for the 3DS executable file extensions. 3DS 可執行檔案 (%1);;所有檔案 (*.*) - + Load File 讀取檔案 - - + + Set Up System Files - + <p>Azahar needs console unique data and firmware files from a real console to be able to use some of its features.<br>Such files and data can be set up with the <a href=https://github.com/azahar-emu/ArticSetupTool>Azahar Artic Setup Tool</a><br>Notes:<ul><li><b>This operation will install console unique data to Azahar, do not share your user or nand folders<br>after performing the setup process!</b></li><li>While doing the setup process, Azahar will link to the console running the setup tool. You can unlink the<br>console later from the System tab in the emulator configuration menu.</li><li>Do not go online with both Azahar and your 3DS console at the same time after setting up system files,<br>as it could cause issues.</li><li>Old 3DS setup is needed for the New 3DS setup to work (doing both setup modes is recommended).</li><li>Both setup modes will work regardless of the model of the console running the setup tool.</li></ul><hr></p> - + Enter Azahar Artic Setup Tool address: - + <br>Choose setup mode: - + (ℹ️) Old 3DS setup - - + + Setup is possible. - + (⚠) New 3DS setup - + Old 3DS setup is required first. - + (✅) Old 3DS setup - - + + Setup completed. - + (ℹ️) New 3DS setup - + (✅) New 3DS setup - + The system files for the selected mode are already set up. Reinstall the files anyway? - + Load Files 讀取多個檔案 - + 3DS Installation File (*.cia *.zcia) - - - + + + All Files (*.*) 所有檔案 (*.*) - + Connect to Artic Base - + Enter Artic Base server address: - + %1 has been installed successfully. 已成功安裝 %1。 - + Unable to open File 無法開啟檔案 - + Could not open %1 無法開啟 %1 - + Installation aborted 安裝中斷 - + The installation of %1 was aborted. Please see the log for more details 安裝 %1 時中斷,請參閱日誌了解細節。 - + Invalid File 無效的檔案 - + %1 is not a valid CIA %1 不是有效的 CIA 檔案 - + CIA Encrypted - + Your CIA file is encrypted.<br/><a href='https://azahar-emu.org/blog/game-loading-changes/'>Please check our blog for more info.</a> - + Unable to find File - + Could not find %1 - - - - Error compressing file + + + + + Z3DS Compression - - File compress operation failed, check log for details. + + Failed to compress some files, check log for details. - - - - Error decompressing file + + Failed to decompress some files, check log for details. - - File decompress operation failed, check log for details. + + All files have been compressed successfully. - + + All files have been decompressed successfully. + + + + Uninstalling '%1'... - + Failed to uninstall '%1'. - + Successfully uninstalled '%1'. - + File not found 找不到檔案 - + File "%1" not found 找不到「%1」 - + Savestates - + Warning: Savestates are NOT a replacement for in-application saves, and are not meant to be reliable. Use at your own risk! - - - + + + Error opening amiibo data file - + A tag is already in use. - + Application is not looking for amiibos. - + Amiibo File (%1);; All Files (*.*) Amiibo 檔案 (%1);;所有檔案 (*.*) - + Load Amiibo 讀取 Amiibo - + Unable to open amiibo file "%1" for reading. - + Record Movie 錄影 - + Movie recording cancelled. 錄影已取消。 - - + + Movie Saved 已儲存影片 - - + + The movie is successfully saved. 影片儲存成功。 - + Application will unpause - + The application will be unpaused, and the next frame will be captured. Is this okay? - + Invalid Screenshot Directory - + Cannot create specified screenshot directory. Screenshot path is set back to its default value. - + Could not load video dumper - + FFmpeg could not be loaded. Make sure you have a compatible version installed. To install FFmpeg to Azahar, press Open and select your FFmpeg directory. @@ -4648,274 +4674,264 @@ To view a guide on how to install FFmpeg, press Help. - - Load 3DS ROM File + + Load 3DS ROM Files - - 3DS ROM Files (*.cia *cci *3dsx *cxi) + + 3DS ROM Files (*.cia *.cci *.3dsx *.cxi) - - The selected file is not a compatible 3DS ROM format. Make sure you have chosen the right file, and that it is not encrypted. - - - - - The selected file is already compressed. - - - - + 3DS Compressed ROM File (*.%1) - + Save 3DS Compressed ROM File - - Load 3DS Compressed ROM File + + Select Output 3DS Compressed ROM Folder - + + Load 3DS Compressed ROM Files + + + + 3DS Compressed ROM Files (*.zcia *zcci *z3dsx *zcxi) - - The selected file is not a compatible compressed 3DS ROM format. Make sure you have chosen the right file. - - - - - The selected file is already decompressed. - - - - + 3DS ROM File (*.%1) - + Save 3DS ROM File - + + Select Output 3DS ROM Folder + + + + Select FFmpeg Directory - + The provided FFmpeg directory is missing %1. Please make sure the correct directory was selected. - + FFmpeg has been sucessfully installed. - + Installation of FFmpeg failed. Check the log file for details. - + Could not start video dumping.<br>Please ensure that the video encoder is configured correctly.<br>Refer to the log for details. - + Recording %1 - + Playing %1 / %2 - + Movie Finished - + (Accessing SharedExtData) - + (Accessing SystemSaveData) - + (Accessing BossExtData) - + (Accessing ExtData) - + (Accessing SaveData) - + MB/s - + KB/s - + Artic Traffic: %1 %2%3 - + Speed: %1% 速度:%1% - + Speed: %1% / %2% 速度:%1% / %2% - + App: %1 FPS - + Frame: %1 ms (GPU: [CMD: %2 ms, SWP: %3 ms], IPC: %4 ms, SVC: %5 ms, Rem: %6 ms) - + Frame: %1 ms 影格:%1 ms - + VOLUME: MUTE - + VOLUME: %1% Volume percentage (e.g. 50%) - + %1 is missing. Please <a href='https://web.archive.org/web/20240304201103/https://citra-emu.org/wiki/dumping-system-archives-and-the-shared-fonts-from-a-3ds-console/'>dump your system archives</a>.<br/>Continuing emulation may result in crashes and bugs. - + A system archive - + System Archive Not Found 找不到系統檔案 - + System Archive Missing - + Save/load Error - + Fatal Error 嚴重錯誤 - + A fatal error occurred. <a href='https://web.archive.org/web/20240228001712/https://community.citra-emu.org/t/how-to-upload-the-log-file/296'>Check the log</a> for details.<br/>Continuing emulation may result in crashes and bugs. - + Fatal Error encountered - + Continue 繼續 - + Quit Application - + OK 確定 - + Would you like to exit now? 您確定要離開嗎? - + The application is still running. Would you like to stop emulation? - + Playback Completed 播放完成 - + Movie playback completed. 影片已結束播放。 - + Update Available - + Update %1 for Azahar is available. Would you like to download it? - + Primary Window - + Secondary Window @@ -5021,239 +5037,254 @@ Would you like to download it? GameList - + IMPORTANT: Encrypted files and .3ds files are no longer supported. Decrypting and/or renaming to .cci may be necessary. <a href='https://azahar-emu.org/blog/game-loading-changes/'>Learn more.</a> - + Don't show again - - + + Compatibility 相容性 - - + + Region 地區 - - + + File type 檔案類型 - - + + Size 大小 - - + + Play time - + Favorite - + + Eject Cartridge + + + + + Insert Cartridge + + + + Open - + Application Location - + Save Data Location - + Extra Data Location - + Update Data Location - + DLC Data Location - + Texture Dump Location - + Custom Texture Location - + Mods Location - + Dump RomFS - + Disk Shader Cache - + Open Shader Cache Location - + Delete OpenGL Shader Cache - + Uninstall - + Everything - + Application - + Update - + DLC - + Remove Play Time Data - + Create Shortcut - + Add to Desktop - + Add to Applications Menu - + + Stress Test: App Launch + + + + Properties - - - - + + + + Azahar - + Are you sure you want to completely uninstall '%1'? This will delete the application if installed, as well as any installed updates or DLC. - - + + %1 (Update) - - + + %1 (DLC) - + Are you sure you want to uninstall '%1'? - + Are you sure you want to uninstall the update for '%1'? - + Are you sure you want to uninstall all DLC for '%1'? - + Scan Subfolders 掃描子資料夾 - + Remove Application Directory - + Move Up - + Move Down - + Open Directory Location 開啟資料夾位置 - + Clear 清除 - + Name 名稱 @@ -5261,77 +5292,77 @@ This will delete the application if installed, as well as any installed updates GameListItemCompat - + Perfect 完美 - + App functions flawless with no audio or graphical glitches, all tested functionality works as intended without any workarounds needed. - + Great 良好 - + App functions with minor graphical or audio glitches and is playable from start to finish. May require some workarounds. - + Okay 普通 - + App functions with major graphical or audio glitches, but app is playable from start to finish with workarounds. - + Bad 不好 - + App functions, but with major graphical or audio glitches. Unable to progress in specific areas due to glitches even with workarounds. - + Intro/Menu 片頭/選單 - + App is completely unplayable due to major graphical or audio glitches. Unable to progress past the Start Screen. - + Won't Boot 無法啟動 - + The app crashes when attempting to startup. - + Not Tested 未測試 - + The app has not yet been tested. @@ -5339,7 +5370,7 @@ Screen. GameListPlaceholder - + Double-click to add a new folder to the application list @@ -5347,27 +5378,27 @@ Screen. GameListSearchField - + of / - + result 項符合 - + results 項符合 - + Filter: 項目篩選 - + Enter pattern to filter 輸入項目關鍵字 @@ -5695,87 +5726,87 @@ Screen. 循環指標: - + SRC1: %1, %2, %3, %4 來源一:%1, %2, %3, %4 - + SRC2: %1, %2, %3, %4 來源二:%1, %2, %3, %4 - + SRC3: %1, %2, %3, %4 來源三:%1, %2, %3, %4 - + DEST_IN: %1, %2, %3, %4 目標在內:%1, %2, %3, %4 - + DEST_OUT: %1, %2, %3, %4 目標在外:%1, %2, %3, %4 - + Address Registers: %1, %2 位址暫存器:%1, %2 - + Compare Result: %1, %2 比較結果:%1, %2 - + Static Condition: %1 靜態:%1 - + Dynamic Conditions: %1, %2 動態:%1, %2 - + Loop Parameters: %1 (repeats), %2 (initializer), %3 (increment), %4 迴圈參數:%1(重複)、%2(初始)、%3(增量)、%4 - + Instruction offset: 0x%1 指令偏置:0x%1 - + -> 0x%2 -> 0x%2 - + (last instruction) (上一個指令) @@ -6074,32 +6105,32 @@ Debug Message: 密碼: - + Room Name 房間名稱 - + Preferred Application - + Host 建立者 - + Players 玩家數 - + Refreshing 正在重新整理 - + Refresh List 重新整理 @@ -6600,7 +6631,7 @@ Debug Message: File: - 檔案: + @@ -6692,7 +6723,7 @@ Debug Message: File: - 檔案: + @@ -7098,32 +7129,32 @@ They may have left the room. - + Unsupported encrypted application - + Invalid region 無效的地區 - + Installed Titles - + System Titles - + Add New Application Directory - + Favorites diff --git a/dist/license.md b/dist/license.md index 207fc638e..801b0a519 100644 --- a/dist/license.md +++ b/dist/license.md @@ -16,6 +16,7 @@ qt_themes/default/icons/48x48/no_avatar.png | CC BY-ND 3.0 | https://icons8.com qt_themes/default/icons/48x48/plus.png | CC0 1.0 | Designed by BreadFish64 from the Citra team qt_themes/default/icons/48x48/sd_card.png | CC BY-ND 3.0 | https://icons8.com qt_themes/default/icons/48x48/star.png | CC BY-ND 3.0 | https://icons8.com +qt_themes/default/icons/128x128/cartridge.png | CC0 1.0 | Designed by PabloMK7 qt_themes/qdarkstyle/icons/16x16/connected.png | CC BY-ND 3.0 | https://icons8.com qt_themes/qdarkstyle/icons/16x16/connected_notification.png | CC BY-ND 3.0 | https://icons8.com qt_themes/qdarkstyle/icons/16x16/disconnected.png | CC BY-ND 3.0 | https://icons8.com diff --git a/dist/qt_themes/default/icons/128x128/cartridge.png b/dist/qt_themes/default/icons/128x128/cartridge.png new file mode 100644 index 000000000..cb669ee29 Binary files /dev/null and b/dist/qt_themes/default/icons/128x128/cartridge.png differ diff --git a/dist/qt_themes/default/icons/index.theme b/dist/qt_themes/default/icons/index.theme index 1edbe6408..a7cfb3306 100644 --- a/dist/qt_themes/default/icons/index.theme +++ b/dist/qt_themes/default/icons/index.theme @@ -1,13 +1,16 @@ [Icon Theme] Name=default Comment=default theme -Directories=16x16,48x48,256x256 +Directories=16x16,48x48,128x128,256x256 [16x16] Size=16 [48x48] Size=48 - + +[128x128] +Size=128 + [256x256] Size=256 \ No newline at end of file diff --git a/dist/qt_themes/default/icons_light/128x128/cartridge.png b/dist/qt_themes/default/icons_light/128x128/cartridge.png new file mode 100644 index 000000000..cb669ee29 Binary files /dev/null and b/dist/qt_themes/default/icons_light/128x128/cartridge.png differ diff --git a/dist/qt_themes/default/icons_light/index.theme b/dist/qt_themes/default/icons_light/index.theme index 1edbe6408..a7cfb3306 100644 --- a/dist/qt_themes/default/icons_light/index.theme +++ b/dist/qt_themes/default/icons_light/index.theme @@ -1,13 +1,16 @@ [Icon Theme] Name=default Comment=default theme -Directories=16x16,48x48,256x256 +Directories=16x16,48x48,128x128,256x256 [16x16] Size=16 [48x48] Size=48 - + +[128x128] +Size=128 + [256x256] Size=256 \ No newline at end of file diff --git a/dist/qt_themes/default/theme_default.qrc b/dist/qt_themes/default/theme_default.qrc index c8339f86d..90ae777aa 100644 --- a/dist/qt_themes/default/theme_default.qrc +++ b/dist/qt_themes/default/theme_default.qrc @@ -13,6 +13,7 @@ icons/48x48/no_avatar.png icons/48x48/plus.png icons/48x48/sd_card.png + icons/128x128/cartridge.png icons/256x256/azahar.png icons/48x48/star.png icons/256x256/plus_folder.png @@ -31,6 +32,7 @@ icons_light/48x48/no_avatar.png icons_light/48x48/plus.png icons_light/48x48/sd_card.png + icons_light/128x128/cartridge.png icons_light/256x256/azahar.png icons_light/48x48/star.png icons_light/256x256/plus_folder.png diff --git a/docker/azahar-room/Dockerfile b/docker/azahar-room/Dockerfile new file mode 100644 index 000000000..c47896dd9 --- /dev/null +++ b/docker/azahar-room/Dockerfile @@ -0,0 +1,31 @@ +# This Dockerfile assumes that it is being built from the project root directory, e.g.: +# $ docker build -f docker/azahar-room/Dockerfile -t azahar-room . + +# --- Builder ---------------- +FROM opensauce04/azahar-build-environment:latest AS builder + +COPY . /var/azahar-src + +RUN mkdir builddir && cd builddir && \ + cmake /var/azahar-src -G Ninja \ + -DENABLE_QT=OFF \ + -DENABLE_TESTS=OFF \ + -DENABLE_ROOM=ON \ + -DENABLE_ROOM_STANDALONE=ON \ + -DENABLE_OPENGL=OFF $( : "TODO: Can we disable these automatically when there's no frontend?") \ + -DENABLE_VULKAN=OFF \ + -DENABLE_SDL2=OFF \ + -DENABLE_LIBUSB=OFF \ + -DENABLE_CUBEB=OFF \ + -DENABLE_OPENAL=OFF && \ + ninja && \ + mv bin/Release/azahar-room /usr/local/bin/ && \ + cd .. && rm -rf builddir + +# --- Final ------------------ +FROM debian:trixie AS final + +RUN apt-get update && apt-get -y full-upgrade +RUN apt-get install -y iputils-ping net-tools + +COPY --from=builder /usr/local/bin/azahar-room /usr/local/bin/azahar-room diff --git a/externals/CMakeLists.txt b/externals/CMakeLists.txt index aa6e6c84b..01e76a095 100644 --- a/externals/CMakeLists.txt +++ b/externals/CMakeLists.txt @@ -243,13 +243,8 @@ else() ) target_link_libraries(zstd_seekable PUBLIC libzstd_static) - target_link_libraries(libzstd_static INTERFACE zstd_seekable) - - add_library(zstd ALIAS libzstd_static) - - install(TARGETS zstd_seekable - EXPORT zstdExports - ) + add_library(zstd INTERFACE) + target_link_libraries(zstd INTERFACE libzstd_static zstd_seekable) endif() # ENet @@ -494,3 +489,17 @@ if (ENABLE_VULKAN) add_subdirectory(libadrenotools) endif() endif() + +set(XXHASH_BUILD_XXHSUM OFF) +add_subdirectory(xxHash/cmake_unofficial EXCLUDE_FROM_ALL) +target_compile_definitions(xxhash PRIVATE XXH_FORCE_MEMORY_ACCESS=2) +if(CMAKE_SYSTEM_PROCESSOR MATCHES "x86_64|AMD64") + target_compile_definitions(xxhash PRIVATE XXH_VECTOR=XXH_SSE2) + message(STATUS "Enabling SSE2 for xxHash") +elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "aarch64|ARM64|armv8") + target_compile_definitions(xxhash PRIVATE XXH_VECTOR=XXH_NEON) + message(STATUS "Enabling NEON for xxHash") +else() + target_compile_definitions(xxhash PRIVATE XXH_VECTOR=XXH_SCALAR) + message(STATUS "Disabling SIMD for xxHash") +endif() \ No newline at end of file diff --git a/externals/boost b/externals/boost index 3c27c785a..2c82bd787 160000 --- a/externals/boost +++ b/externals/boost @@ -1 +1 @@ -Subproject commit 3c27c785ad0f8a742af02e620dc225673f3a12d8 +Subproject commit 2c82bd787302398bcae990e3c9ab2b451284f4ca diff --git a/externals/dynarmic b/externals/dynarmic index 278405bd7..526227eeb 160000 --- a/externals/dynarmic +++ b/externals/dynarmic @@ -1 +1 @@ -Subproject commit 278405bd71999ed3f3c77c5f78344a06fef798b9 +Subproject commit 526227eebe1efff3fb14dbf494b9c5b44c2e9c1f diff --git a/externals/teakra b/externals/teakra index 01db7cdd0..3d697a18d 160000 --- a/externals/teakra +++ b/externals/teakra @@ -1 +1 @@ -Subproject commit 01db7cdd00aabcce559a8dddce8798dabb71949b +Subproject commit 3d697a18df504f4677b65129d9ab14c7c597e3eb diff --git a/externals/xxHash b/externals/xxHash new file mode 160000 index 000000000..e626a72bc --- /dev/null +++ b/externals/xxHash @@ -0,0 +1 @@ +Subproject commit e626a72bc2321cd320e953a0ccf1584cad60f363 diff --git a/license.txt b/license.txt index f94c73f1a..7b0e5ad1b 100644 --- a/license.txt +++ b/license.txt @@ -357,3 +357,4 @@ plus.png (Default, Dark) | CC0 1.0 | Designed by BreadFish64 fro plus.png (Colorful, Colorful Dark) | CC BY-ND 3.0 | https://icons8.com sd_card.png | CC BY-ND 3.0 | https://icons8.com star.png | CC BY-ND 3.0 | https://icons8.com +cartridge.png | CC0 1.0 | Designed by PabloMK7 diff --git a/src/android/app/build.gradle.kts b/src/android/app/build.gradle.kts index 10e766459..0973a34c7 100644 --- a/src/android/app/build.gradle.kts +++ b/src/android/app/build.gradle.kts @@ -125,7 +125,7 @@ android { applicationIdSuffix = ".debug" versionNameSuffix = "-debug" signingConfig = signingConfigs.getByName("debug") - isShrinkResources = true + isShrinkResources = true // TODO: Does this actually do anything when isDebuggable is enabled? -OS isDebuggable = true isJniDebuggable = true proguardFiles( @@ -135,6 +135,22 @@ android { isDefault = true } + // Same as above, but with isDebuggable disabled. + // Primarily exists to allow development on hardened_malloc systems (e.g. GrapheneOS) without constantly tripping over years-old and seemingly harmless memory bugs. + // We should fix those bugs eventually, but for now this exists as a workaround to allow other work to be done. + register("relWithDebInfoLite") { + initWith(getByName("relWithDebInfo")) + signingConfig = signingConfigs.getByName("debug") + isDebuggable = false + installation { + enableBaselineProfile = false // Disabled by default when isDebuggable is true + } + lint { + checkReleaseBuilds = false // Ditto + // The name of this property is misleading, this doesn't actually disable linting for the `release` build. + } + } + // Signed by debug key disallowing distribution on Play Store. // Attaches 'debug' suffix to version and package name, allowing installation alongside the release build. debug { @@ -148,6 +164,18 @@ android { flavorDimensions.add("version") + productFlavors { + register("vanilla") { + isDefault = true + dimension = "version" + versionNameSuffix = "-vanilla" + } + register("googlePlay") { + dimension = "version" + versionNameSuffix = "-googleplay" + } + } + externalNativeBuild { cmake { version = "3.25.0+" diff --git a/src/android/app/src/googlePlay/AndroidManifest.xml b/src/android/app/src/googlePlay/AndroidManifest.xml new file mode 100644 index 000000000..a95b9539c --- /dev/null +++ b/src/android/app/src/googlePlay/AndroidManifest.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/src/android/app/src/main/AndroidManifest.xml b/src/android/app/src/main/AndroidManifest.xml index a7e3581ee..abc14939b 100644 --- a/src/android/app/src/main/AndroidManifest.xml +++ b/src/android/app/src/main/AndroidManifest.xml @@ -29,6 +29,8 @@ + + { + title = emulationActivity.getString(R.string.invalid_system_mode) + message = emulationActivity.getString(R.string.invalid_system_mode_message) + canContinue = false + } + CoreError.ErrorUnknown -> { title = emulationActivity.getString(R.string.fatal_error) message = emulationActivity.getString(R.string.fatal_error_message) @@ -589,6 +608,47 @@ object NativeLibrary { */ external fun logDeviceInfo() + enum class CompressStatus(val value: Int) { + SUCCESS(0), + COMPRESS_UNSUPPORTED(1), + COMPRESS_ALREADY_COMPRESSED(2), + COMPRESS_FAILED(3), + DECOMPRESS_UNSUPPORTED(4), + DECOMPRESS_NOT_COMPRESSED(5), + DECOMPRESS_FAILED(6), + INSTALLED_APPLICATION(7); + + companion object { + fun fromValue(value: Int): CompressStatus = + CompressStatus.entries.first { it.value == value } + } + } + + // Compression / Decompression + private external fun compressFileNative(inputPath: String?, outputPath: String): Int + + fun compressFile(inputPath: String?, outputPath: String): CompressStatus { + return CompressStatus.fromValue( + compressFileNative(inputPath, outputPath) + ) + } + + private external fun decompressFileNative(inputPath: String?, outputPath: String): Int + + fun decompressFile(inputPath: String?, outputPath: String): CompressStatus { + return CompressStatus.fromValue( + decompressFileNative(inputPath, outputPath) + ) + } + + external fun getRecommendedExtension(inputPath: String?, shouldCompress: Boolean): String + + @Keep + @JvmStatic + fun onCompressProgress(total: Long, current: Long) { + CompressProgressDialogViewModel.update(total, current) + } + @Keep @JvmStatic fun createFile(directory: String, filename: String): Boolean = @@ -629,6 +689,38 @@ object NativeLibrary { FileUtil.getFilesName(path) } + @Keep + @JvmStatic + fun getUserDirectory(uriOverride: Uri? = null): String { + BuildUtil.assertNotGooglePlay() + + val preferences: SharedPreferences = + PreferenceManager.getDefaultSharedPreferences(CitraApplication.appContext) + + val dirSep = "/" + val udUri = uriOverride ?: + preferences.getString("CITRA_DIRECTORY", "")!!.toUri() + val udPathSegment = udUri.lastPathSegment!! + val udVirtualPath = udPathSegment.substringAfter(":") + + if (udPathSegment.startsWith("primary:")) { // User directory is located in primary storage + val primaryStoragePath = Environment.getExternalStorageDirectory().absolutePath + return primaryStoragePath + dirSep + udVirtualPath + dirSep + } else { // User directory probably located on a removable storage device + val storageIdString = udPathSegment.substringBefore(":") + val udRemovablePath = RemovableStorageHelper.getRemovableStoragePath(storageIdString) + + if (udRemovablePath == null) { + android.util.Log.e("NativeLibrary", + "Unknown mount location for storage device '$storageIdString' (URI: $udUri)" + ) + return "" + } + return udRemovablePath + dirSep + udVirtualPath + dirSep + } + + } + @Keep @JvmStatic fun getSize(path: String): Long = @@ -638,6 +730,10 @@ object NativeLibrary { FileUtil.getFileSize(path) } + @Keep + @JvmStatic + fun getBuildFlavor(): String = BuildConfig.FLAVOR + @Keep @JvmStatic fun fileExists(path: String): Boolean = @@ -689,6 +785,24 @@ object NativeLibrary { FileUtil.renameFile(path, destinationFilename) } + @Keep + @JvmStatic + fun updateDocumentLocation(sourcePath: String, destinationPath: String): Boolean = + CitraApplication.documentsTree.updateDocumentLocation(sourcePath, destinationPath) + + @Keep + @JvmStatic + fun moveFile(filename: String, sourceDirPath: String, destinationDirPath: String): Boolean = + if (FileUtil.isNativePath(sourceDirPath)) { + try { + CitraApplication.documentsTree.moveFile(filename, sourceDirPath, destinationDirPath) + } catch (e: Exception) { + false + } + } else { + FileUtil.moveFile(filename, sourceDirPath, destinationDirPath) + } + @Keep @JvmStatic fun deleteDocument(path: String): Boolean = @@ -702,6 +816,7 @@ object NativeLibrary { ErrorSystemFiles, ErrorSavestate, ErrorArticDisconnected, + ErrorN3DSApplication, ErrorUnknown } diff --git a/src/android/app/src/main/java/org/citra/citra_emu/activities/EmulationActivity.kt b/src/android/app/src/main/java/org/citra/citra_emu/activities/EmulationActivity.kt index f23147dd8..ca92b308d 100644 --- a/src/android/app/src/main/java/org/citra/citra_emu/activities/EmulationActivity.kt +++ b/src/android/app/src/main/java/org/citra/citra_emu/activities/EmulationActivity.kt @@ -10,6 +10,7 @@ import android.content.Intent import android.content.SharedPreferences import android.content.pm.PackageManager import android.net.Uri +import android.os.Build import android.os.Bundle import android.view.InputDevice import android.view.KeyEvent @@ -47,6 +48,7 @@ import org.citra.citra_emu.utils.FileBrowserHelper import org.citra.citra_emu.utils.EmulationLifecycleUtil import org.citra.citra_emu.utils.EmulationMenuSettings import org.citra.citra_emu.utils.Log +import org.citra.citra_emu.utils.RefreshRateUtil import org.citra.citra_emu.utils.ThemeUtil import org.citra.citra_emu.viewmodel.EmulationViewModel @@ -82,6 +84,8 @@ class EmulationActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { requestWindowFeature(Window.FEATURE_NO_TITLE) + RefreshRateUtil.enforceRefreshRate(this, sixtyHz = true) + ThemeUtil.setTheme(this) settingsViewModel.settings.loadSettings() super.onCreate(savedInstanceState) @@ -338,6 +342,7 @@ class EmulationActivity : AppCompatActivity() { preferences.getInt(InputBindingSetting.getInputAxisButtonKey(axis), -1) val guestOrientation = preferences.getInt(InputBindingSetting.getInputAxisOrientationKey(axis), -1) + val inverted = preferences.getBoolean(InputBindingSetting.getInputAxisInvertedKey(axis),false); if (nextMapping == -1 || guestOrientation == -1) { // Axis is unmapped continue @@ -346,6 +351,8 @@ class EmulationActivity : AppCompatActivity() { // Skip joystick wobble value = 0f } + if (inverted) value = -value; + when (nextMapping) { NativeLibrary.ButtonType.STICK_LEFT -> { axisValuesCirclePad[guestOrientation] = value diff --git a/src/android/app/src/main/java/org/citra/citra_emu/adapters/GameAdapter.kt b/src/android/app/src/main/java/org/citra/citra_emu/adapters/GameAdapter.kt index d03ff2936..dae538d73 100644 --- a/src/android/app/src/main/java/org/citra/citra_emu/adapters/GameAdapter.kt +++ b/src/android/app/src/main/java/org/citra/citra_emu/adapters/GameAdapter.kt @@ -13,6 +13,7 @@ import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import android.content.Context +import android.content.SharedPreferences import android.widget.TextView import android.widget.ImageView import android.widget.Toast @@ -57,13 +58,21 @@ import org.citra.citra_emu.utils.FileUtil import org.citra.citra_emu.utils.GameIconUtils import org.citra.citra_emu.viewmodel.GamesViewModel -class GameAdapter(private val activity: AppCompatActivity, private val inflater: LayoutInflater, private val openImageLauncher: ActivityResultLauncher?) : +class GameAdapter( + private val activity: AppCompatActivity, + private val inflater: LayoutInflater, + private val openImageLauncher: ActivityResultLauncher?, + private val onRequestCompressOrDecompress: ((inputPath: String, suggestedName: String, shouldCompress: Boolean) -> Unit)? = null +) : ListAdapter(AsyncDifferConfig.Builder(DiffCallback()).build()), View.OnClickListener, View.OnLongClickListener { private var lastClickTime = 0L private var imagePath: String? = null private var dialogShortcutBinding: DialogShortcutBinding? = null + private val preferences: SharedPreferences + get() = PreferenceManager.getDefaultSharedPreferences(CitraApplication.appContext) + fun handleShortcutImageResult(uri: Uri?) { val path = uri?.toString() if (path != null) { @@ -191,6 +200,11 @@ class GameAdapter(private val activity: AppCompatActivity, private val inflater: binding.textGameTitle.text = game.title binding.textCompany.text = game.company binding.textGameRegion.text = game.regions + binding.imageCartridge.visibility = if (preferences.getString("insertedCartridge", "") != game.path) { + View.GONE + } else { + View.VISIBLE + } val backgroundColorId = if ( @@ -340,12 +354,29 @@ class GameAdapter(private val activity: AppCompatActivity, private val inflater: val bottomSheetDialog = BottomSheetDialog(context) bottomSheetDialog.setContentView(bottomSheetView) + val insertable = game.isInsertable + val inserted = insertable && (preferences.getString("insertedCartridge", "") == game.path) + bottomSheetView.findViewById(R.id.about_game_title).text = game.title bottomSheetView.findViewById(R.id.about_game_company).text = game.company bottomSheetView.findViewById(R.id.about_game_region).text = game.regions bottomSheetView.findViewById(R.id.about_game_id).text = context.getString(R.string.game_context_id) + " " + String.format("%016X", game.titleId) bottomSheetView.findViewById(R.id.about_game_filename).text = context.getString(R.string.game_context_file) + " " + game.filename bottomSheetView.findViewById(R.id.about_game_filetype).text = context.getString(R.string.game_context_type) + " " + game.fileType + + val insertButton = bottomSheetView.findViewById(R.id.insert_cartridge_button) + insertButton.text = if (inserted) { context.getString(R.string.game_context_eject) } else { context.getString(R.string.game_context_insert) } + insertButton.visibility = if (insertable) View.VISIBLE else View.GONE + insertButton.setOnClickListener { + if (inserted) { + preferences.edit().putString("insertedCartridge", "").apply() + } else { + preferences.edit().putString("insertedCartridge", game.path).apply() + } + bottomSheetDialog.dismiss() + notifyItemRangeChanged(0, currentList.size) + } + GameIconUtils.loadGameIcon(activity, game, bottomSheetView.findViewById(R.id.game_icon)) bottomSheetView.findViewById(R.id.about_game_play).setOnClickListener { @@ -441,6 +472,27 @@ class GameAdapter(private val activity: AppCompatActivity, private val inflater: bottomSheetDialog.dismiss() } + val compressDecompressButton = bottomSheetView.findViewById(R.id.compress_decompress) + if (game.isInstalled) { + compressDecompressButton.setOnClickListener { + Toast.makeText( + context, + context.getString(R.string.compress_decompress_installed_app), + Toast.LENGTH_LONG + ).show() + } + compressDecompressButton.alpha = 0.38f + } else { + compressDecompressButton.setOnClickListener { + val shouldCompress = !game.isCompressed + val recommendedExt = NativeLibrary.getRecommendedExtension(holder.game.path, shouldCompress) + val baseName = holder.game.filename.substringBeforeLast('.') + onRequestCompressOrDecompress?.invoke(holder.game.path, "$baseName.$recommendedExt", shouldCompress) + bottomSheetDialog.dismiss() + } + } + compressDecompressButton.text = context.getString(if (!game.isCompressed) R.string.compress else R.string.decompress) + bottomSheetView.findViewById(R.id.menu_button_open).setOnClickListener { showOpenContextMenu(it, game) } diff --git a/src/android/app/src/main/java/org/citra/citra_emu/display/ScreenLayout.kt b/src/android/app/src/main/java/org/citra/citra_emu/display/ScreenLayout.kt index c3877560c..c46dcadd8 100644 --- a/src/android/app/src/main/java/org/citra/citra_emu/display/ScreenLayout.kt +++ b/src/android/app/src/main/java/org/citra/citra_emu/display/ScreenLayout.kt @@ -63,4 +63,37 @@ enum class SecondaryDisplayLayout(val int: Int) { return entries.firstOrNull { it.int == int } ?: NONE } } +} + +enum class StereoWhichDisplay(val int: Int) { + // These must match what is defined in src/common/settings.h + + NONE(0), // equivalent to StereoRenderOption = Off + BOTH(1), + PRIMARY_ONLY(2), + SECONDARY_ONLY(3); + + companion object { + fun from(int: Int): StereoWhichDisplay { + return entries.firstOrNull { it.int == int } ?: NONE + } + } +} + +enum class StereoMode(val int: Int) { + // These must match what is defined in src/common/settings.h + + OFF(0), + SIDE_BY_SIDE(1), + SIDE_BY_SIDE_FULL(2), + ANAGLYPH(3), + INTERLACED(4), + REVERSE_INTERLACED (5), + CARDBOARD_VR (6); + + companion object { + fun from(int: Int): StereoMode { + return entries.firstOrNull { it.int == int } ?: OFF + } + } } \ No newline at end of file diff --git a/src/android/app/src/main/java/org/citra/citra_emu/display/SecondaryDisplay.kt b/src/android/app/src/main/java/org/citra/citra_emu/display/SecondaryDisplay.kt index b44929c9d..f4d736ced 100644 --- a/src/android/app/src/main/java/org/citra/citra_emu/display/SecondaryDisplay.kt +++ b/src/android/app/src/main/java/org/citra/citra_emu/display/SecondaryDisplay.kt @@ -47,9 +47,18 @@ class SecondaryDisplay(val context: Context) : DisplayManager.DisplayListener { private fun getExternalDisplay(context: Context): Display? { val dm = context.getSystemService(Context.DISPLAY_SERVICE) as DisplayManager - val internalId = context.display.displayId ?: Display.DEFAULT_DISPLAY - val displays = dm.getDisplays(DisplayManager.DISPLAY_CATEGORY_PRESENTATION) - return displays.firstOrNull { it.displayId != internalId && it.name != "HiddenDisplay" } + val currentDisplayId = context.display.displayId + val displays = dm.displays + val presDisplays = dm.getDisplays(DisplayManager.DISPLAY_CATEGORY_PRESENTATION); + return displays.firstOrNull { + val isPresentable = presDisplays.any { pd -> pd.displayId == it.displayId } + val isNotDefaultOrPresentable = it.displayId != Display.DEFAULT_DISPLAY || isPresentable + isNotDefaultOrPresentable && + it.displayId != currentDisplayId && + it.name != "HiddenDisplay" && + it.state != Display.STATE_OFF && + it.isValid + } } fun updateDisplay() { diff --git a/src/android/app/src/main/java/org/citra/citra_emu/features/settings/model/BooleanSetting.kt b/src/android/app/src/main/java/org/citra/citra_emu/features/settings/model/BooleanSetting.kt index 93259c66c..f06324251 100644 --- a/src/android/app/src/main/java/org/citra/citra_emu/features/settings/model/BooleanSetting.kt +++ b/src/android/app/src/main/java/org/citra/citra_emu/features/settings/model/BooleanSetting.kt @@ -19,6 +19,7 @@ enum class BooleanSetting( INSTANT_DEBUG_LOG("instant_debug_log", Settings.SECTION_DEBUG, false), ENABLE_RPC_SERVER("enable_rpc_server", Settings.SECTION_DEBUG, false), CUSTOM_LAYOUT("custom_layout",Settings.SECTION_LAYOUT,false), + SWAP_EYES_3D("swap_eyes_3d",Settings.SECTION_RENDERER,false), PERF_OVERLAY_ENABLE("performance_overlay_enable", Settings.SECTION_LAYOUT, false), PERF_OVERLAY_SHOW_FPS("performance_overlay_show_fps", Settings.SECTION_LAYOUT, true), PERF_OVERLAY_SHOW_FRAMETIME("performance_overlay_show_frame_time", Settings.SECTION_LAYOUT, false), @@ -51,7 +52,8 @@ enum class BooleanSetting( USE_ARTIC_BASE_CONTROLLER("use_artic_base_controller", Settings.SECTION_CONTROLS, false), UPRIGHT_SCREEN("upright_screen", Settings.SECTION_LAYOUT, false), COMPRESS_INSTALLED_CIA_CONTENT("compress_cia_installs", Settings.SECTION_STORAGE, false), - ANDROID_HIDE_IMAGES("android_hide_images", Settings.SECTION_CORE, false); + ANDROID_HIDE_IMAGES("android_hide_images", Settings.SECTION_CORE, false), + APPLY_REGION_FREE_PATCH("apply_region_free_patch", Settings.SECTION_SYSTEM, true); override var boolean: Boolean = defaultValue @@ -86,7 +88,8 @@ enum class BooleanSetting( USE_ARTIC_BASE_CONTROLLER, COMPRESS_INSTALLED_CIA_CONTENT, ANDROID_HIDE_IMAGES, - PERF_OVERLAY_ENABLE // Works in overlay options, but not from the settings menu + PERF_OVERLAY_ENABLE, // Works in overlay options, but not from the settings menu + APPLY_REGION_FREE_PATCH ) fun from(key: String): BooleanSetting? = diff --git a/src/android/app/src/main/java/org/citra/citra_emu/features/settings/model/IntSetting.kt b/src/android/app/src/main/java/org/citra/citra_emu/features/settings/model/IntSetting.kt index 5b2016ac9..e26bcd6c6 100644 --- a/src/android/app/src/main/java/org/citra/citra_emu/features/settings/model/IntSetting.kt +++ b/src/android/app/src/main/java/org/citra/citra_emu/features/settings/model/IntSetting.kt @@ -17,7 +17,7 @@ enum class IntSetting( CAMERA_OUTER_RIGHT_FLIP("camera_outer_right_flip", Settings.SECTION_CAMERA, 0), GRAPHICS_API("graphics_api", Settings.SECTION_RENDERER, 1), RESOLUTION_FACTOR("resolution_factor", Settings.SECTION_RENDERER, 1), - STEREOSCOPIC_3D_MODE("render_3d", Settings.SECTION_RENDERER, 0), + STEREOSCOPIC_3D_MODE("render_3d", Settings.SECTION_RENDERER, 2), STEREOSCOPIC_3D_DEPTH("factor_3d", Settings.SECTION_RENDERER, 0), STEPS_PER_HOUR("steps_per_hour", Settings.SECTION_SYSTEM, 0), CARDBOARD_SCREEN_SIZE("cardboard_screen_size", Settings.SECTION_LAYOUT, 85), @@ -53,6 +53,7 @@ enum class IntSetting( ORIENTATION_OPTION("screen_orientation", Settings.SECTION_LAYOUT, 2), TURBO_LIMIT("turbo_limit", Settings.SECTION_CORE, 200), PERFORMANCE_OVERLAY_POSITION("performance_overlay_position", Settings.SECTION_LAYOUT, 0), + RENDER_3D_WHICH_DISPLAY("render_3d_which_display",Settings.SECTION_RENDERER,0), ASPECT_RATIO("aspect_ratio", Settings.SECTION_LAYOUT, 0); override var int: Int = defaultValue diff --git a/src/android/app/src/main/java/org/citra/citra_emu/features/settings/model/view/InputBindingSetting.kt b/src/android/app/src/main/java/org/citra/citra_emu/features/settings/model/view/InputBindingSetting.kt index 64827d89d..509426537 100644 --- a/src/android/app/src/main/java/org/citra/citra_emu/features/settings/model/view/InputBindingSetting.kt +++ b/src/android/app/src/main/java/org/citra/citra_emu/features/settings/model/view/InputBindingSetting.kt @@ -16,6 +16,7 @@ import org.citra.citra_emu.NativeLibrary import org.citra.citra_emu.R import org.citra.citra_emu.features.hotkeys.Hotkey import org.citra.citra_emu.features.settings.model.AbstractSetting +import org.citra.citra_emu.features.settings.model.AbstractStringSetting import org.citra.citra_emu.features.settings.model.Settings class InputBindingSetting( @@ -161,12 +162,14 @@ class InputBindingSetting( fun removeOldMapping() { // Try remove all possible keys we wrote for this setting val oldKey = preferences.getString(reverseKey, "") + (setting as AbstractStringSetting).string = "" if (oldKey != "") { preferences.edit() .remove(abstractSetting.key) // Used for ui text .remove(oldKey) // Used for button mapping .remove(oldKey + "_GuestOrientation") // Used for axis orientation .remove(oldKey + "_GuestButton") // Used for axis button + .remove(oldKey + "_Inverted") // used for axis inversion .apply() } } @@ -200,7 +203,7 @@ class InputBindingSetting( /** * Helper function to write a gamepad axis mapping for the setting. */ - private fun writeAxisMapping(axis: Int, value: Int) { + private fun writeAxisMapping(axis: Int, value: Int, inverted: Boolean) { // Cleanup old mapping removeOldMapping() @@ -208,6 +211,7 @@ class InputBindingSetting( preferences.edit() .putInt(getInputAxisOrientationKey(axis), if (isHorizontalOrientation()) 0 else 1) .putInt(getInputAxisButtonKey(axis), value) + .putBoolean(getInputAxisInvertedKey(axis),inverted) // Write next reverse mapping for future cleanup .putString(reverseKey, getInputAxisKey(axis)) .apply() @@ -235,7 +239,7 @@ class InputBindingSetting( * * @param device InputDevice from which the input event originated. * @param motionRange MotionRange of the movement - * @param axisDir Either '-' or '+' (currently unused) + * @param axisDir Either '-' or '+' */ fun onMotionInput(device: InputDevice, motionRange: MotionRange, axisDir: Char) { if (!isAxisMappingSupported()) { @@ -251,8 +255,8 @@ class InputBindingSetting( } else { buttonCode } - writeAxisMapping(motionRange.axis, button) - val uiString = "${device.name}: Axis ${motionRange.axis}" + writeAxisMapping(motionRange.axis, button, axisDir == '-') + val uiString = "${device.name}: Axis ${motionRange.axis}" + axisDir value = uiString } @@ -307,6 +311,11 @@ class InputBindingSetting( */ fun getInputAxisButtonKey(axis: Int): String = "${getInputAxisKey(axis)}_GuestButton" + /** + * Helper function to get the settings key for an whether a gamepad axis is inverted. + */ + fun getInputAxisInvertedKey(axis: Int): String = "${getInputAxisKey(axis)}_Inverted" + /** * Helper function to get the settings key for an gamepad axis orientation. */ diff --git a/src/android/app/src/main/java/org/citra/citra_emu/features/settings/ui/SettingsActivity.kt b/src/android/app/src/main/java/org/citra/citra_emu/features/settings/ui/SettingsActivity.kt index 070a8f487..064fa700e 100644 --- a/src/android/app/src/main/java/org/citra/citra_emu/features/settings/ui/SettingsActivity.kt +++ b/src/android/app/src/main/java/org/citra/citra_emu/features/settings/ui/SettingsActivity.kt @@ -7,6 +7,7 @@ package org.citra.citra_emu.features.settings.ui import android.content.Context import android.content.Intent import android.net.Uri +import android.os.Build import android.os.Bundle import android.view.View import android.view.ViewGroup.MarginLayoutParams @@ -37,6 +38,7 @@ import org.citra.citra_emu.features.settings.utils.SettingsFile import org.citra.citra_emu.utils.SystemSaveGame import org.citra.citra_emu.utils.DirectoryInitialization import org.citra.citra_emu.utils.InsetsHelper +import org.citra.citra_emu.utils.RefreshRateUtil import org.citra.citra_emu.utils.ThemeUtil class SettingsActivity : AppCompatActivity(), SettingsActivityView { @@ -49,6 +51,8 @@ class SettingsActivity : AppCompatActivity(), SettingsActivityView { override val settings: Settings get() = settingsViewModel.settings override fun onCreate(savedInstanceState: Bundle?) { + RefreshRateUtil.enforceRefreshRate(this) + ThemeUtil.setTheme(this) super.onCreate(savedInstanceState) diff --git a/src/android/app/src/main/java/org/citra/citra_emu/features/settings/ui/SettingsAdapter.kt b/src/android/app/src/main/java/org/citra/citra_emu/features/settings/ui/SettingsAdapter.kt index bc55bd5d6..4bd5d3b5f 100644 --- a/src/android/app/src/main/java/org/citra/citra_emu/features/settings/ui/SettingsAdapter.kt +++ b/src/android/app/src/main/java/org/citra/citra_emu/features/settings/ui/SettingsAdapter.kt @@ -555,6 +555,21 @@ class SettingsAdapter( return true } + fun onInputBindingLongClick(setting: InputBindingSetting, position: Int): Boolean { + MaterialAlertDialogBuilder(context) + .setMessage(R.string.reset_setting_confirmation) + .setPositiveButton(android.R.string.ok) { _: DialogInterface, _: Int -> + setting.removeOldMapping() + notifyItemChanged(position) + fragmentView.onSettingChanged() + fragmentView.loadSettingsList() + } + .setNegativeButton(android.R.string.cancel, null) + .show() + + return true + } + fun onClickDisabledSetting(isRuntimeDisabled: Boolean) { val titleId = if (isRuntimeDisabled) R.string.setting_not_editable diff --git a/src/android/app/src/main/java/org/citra/citra_emu/features/settings/ui/SettingsFragmentPresenter.kt b/src/android/app/src/main/java/org/citra/citra_emu/features/settings/ui/SettingsFragmentPresenter.kt index d4baf6166..1326401d5 100644 --- a/src/android/app/src/main/java/org/citra/citra_emu/features/settings/ui/SettingsFragmentPresenter.kt +++ b/src/android/app/src/main/java/org/citra/citra_emu/features/settings/ui/SettingsFragmentPresenter.kt @@ -16,6 +16,9 @@ import androidx.preference.PreferenceManager import com.google.android.material.dialog.MaterialAlertDialogBuilder import org.citra.citra_emu.CitraApplication import org.citra.citra_emu.R +import org.citra.citra_emu.display.ScreenLayout +import org.citra.citra_emu.display.StereoMode +import org.citra.citra_emu.display.StereoWhichDisplay import org.citra.citra_emu.features.settings.model.AbstractBooleanSetting import org.citra.citra_emu.features.settings.model.AbstractIntSetting import org.citra.citra_emu.features.settings.model.AbstractSetting @@ -44,7 +47,6 @@ import org.citra.citra_emu.utils.BirthdayMonth import org.citra.citra_emu.utils.Log import org.citra.citra_emu.utils.SystemSaveGame import org.citra.citra_emu.utils.ThemeUtil -import org.citra.citra_emu.utils.EmulationMenuSettings class SettingsFragmentPresenter(private val fragmentView: SettingsFragmentView) { private var menuTag: String? = null @@ -111,20 +113,24 @@ class SettingsFragmentPresenter(private val fragmentView: SettingsFragmentView) } /** Returns the portrait mode width */ - private fun getWidth(): Int { - val dm = Resources.getSystem().displayMetrics; - return if (dm.widthPixels < dm.heightPixels) - dm.widthPixels - else - dm.heightPixels + private fun getDimensions(): IntArray { + val dm = Resources.getSystem().displayMetrics + return if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) { + val wm = settingsActivity.windowManager.maximumWindowMetrics + val height = wm.bounds.height().coerceAtLeast(dm.heightPixels) + val width = wm.bounds.width().coerceAtLeast(dm.widthPixels) + intArrayOf(width, height) + } else { + intArrayOf(dm.widthPixels, dm.heightPixels) + } } - private fun getHeight(): Int { - val dm = Resources.getSystem().displayMetrics; - return if (dm.widthPixels < dm.heightPixels) - dm.heightPixels - else - dm.widthPixels + private fun getSmallerDimension(): Int { + return getDimensions().min() + } + + private fun getLargerDimension(): Int { + return getDimensions().max() } private fun addConfigSettings(sl: ArrayList) { @@ -354,6 +360,15 @@ class SettingsFragmentPresenter(private val fragmentView: SettingsFragmentView) R.array.regionValues, ) ) + add( + SwitchSetting( + BooleanSetting.APPLY_REGION_FREE_PATCH, + R.string.apply_region_free_patch, + R.string.apply_region_free_patch_desc, + BooleanSetting.APPLY_REGION_FREE_PATCH.key, + BooleanSetting.APPLY_REGION_FREE_PATCH.defaultValue + ) + ) val systemCountrySetting = object : AbstractShortSetting { override var short: Short get() { @@ -936,17 +951,30 @@ class SettingsFragmentPresenter(private val fragmentView: SettingsFragmentView) ) add(HeaderSetting(R.string.stereoscopy)) + add( + SingleChoiceSetting( + IntSetting.RENDER_3D_WHICH_DISPLAY, + R.string.render_3d_which_display, + R.string.render_3d_which_display_description, + R.array.render3dWhichDisplay, + R.array.render3dDisplayValues, + IntSetting.RENDER_3D_WHICH_DISPLAY.key, + IntSetting.RENDER_3D_WHICH_DISPLAY.defaultValue + ) + ) add( SingleChoiceSetting( IntSetting.STEREOSCOPIC_3D_MODE, R.string.render3d, - 0, + R.string.render3d_description, R.array.render3dModes, R.array.render3dValues, IntSetting.STEREOSCOPIC_3D_MODE.key, - IntSetting.STEREOSCOPIC_3D_MODE.defaultValue + IntSetting.STEREOSCOPIC_3D_MODE.defaultValue, + isEnabled = IntSetting.RENDER_3D_WHICH_DISPLAY.int != StereoWhichDisplay.NONE.int ) ) + add( SliderSetting( IntSetting.STEREOSCOPIC_3D_DEPTH, @@ -969,6 +997,17 @@ class SettingsFragmentPresenter(private val fragmentView: SettingsFragmentView) ) ) + add( + SwitchSetting( + BooleanSetting.SWAP_EYES_3D, + R.string.swap_eyes_3d, + R.string.swap_eyes_3d_description, + BooleanSetting.SWAP_EYES_3D.key, + BooleanSetting.SWAP_EYES_3D.defaultValue, + isEnabled = IntSetting.RENDER_3D_WHICH_DISPLAY.int != StereoWhichDisplay.NONE.int + ) + ) + add(HeaderSetting(R.string.cardboard_vr)) add( SliderSetting( @@ -979,7 +1018,8 @@ class SettingsFragmentPresenter(private val fragmentView: SettingsFragmentView) 100, "%", IntSetting.CARDBOARD_SCREEN_SIZE.key, - IntSetting.CARDBOARD_SCREEN_SIZE.defaultValue.toFloat() + IntSetting.CARDBOARD_SCREEN_SIZE.defaultValue.toFloat(), + isEnabled = IntSetting.STEREOSCOPIC_3D_MODE.int == StereoMode.CARDBOARD_VR.int ) ) add( @@ -991,7 +1031,8 @@ class SettingsFragmentPresenter(private val fragmentView: SettingsFragmentView) 100, "%", IntSetting.CARDBOARD_X_SHIFT.key, - IntSetting.CARDBOARD_X_SHIFT.defaultValue.toFloat() + IntSetting.CARDBOARD_X_SHIFT.defaultValue.toFloat(), + isEnabled = IntSetting.STEREOSCOPIC_3D_MODE.int == StereoMode.CARDBOARD_VR.int ) ) add( @@ -1003,7 +1044,8 @@ class SettingsFragmentPresenter(private val fragmentView: SettingsFragmentView) 100, "%", IntSetting.CARDBOARD_Y_SHIFT.key, - IntSetting.CARDBOARD_Y_SHIFT.defaultValue.toFloat() + IntSetting.CARDBOARD_Y_SHIFT.defaultValue.toFloat(), + isEnabled = IntSetting.STEREOSCOPIC_3D_MODE.int == StereoMode.CARDBOARD_VR.int ) ) @@ -1137,7 +1179,7 @@ class SettingsFragmentPresenter(private val fragmentView: SettingsFragmentView) R.array.aspectRatioValues, IntSetting.ASPECT_RATIO.key, IntSetting.ASPECT_RATIO.defaultValue, - isEnabled = IntSetting.SCREEN_LAYOUT.int == 1, + isEnabled = IntSetting.SCREEN_LAYOUT.int == ScreenLayout.SINGLE_SCREEN.int, ) ) add( @@ -1185,7 +1227,7 @@ class SettingsFragmentPresenter(private val fragmentView: SettingsFragmentView) "%", FloatSetting.SECOND_SCREEN_OPACITY.key, FloatSetting.SECOND_SCREEN_OPACITY.defaultValue, - isEnabled = IntSetting.SCREEN_LAYOUT.int == 5 + isEnabled = IntSetting.SCREEN_LAYOUT.int == ScreenLayout.CUSTOM_LAYOUT.int ) ) add(HeaderSetting(R.string.bg_color, R.string.bg_color_description)) @@ -1396,7 +1438,7 @@ class SettingsFragmentPresenter(private val fragmentView: SettingsFragmentView) R.string.emulation_custom_layout_x, 0, 0, - getHeight(), + getLargerDimension(), "px", IntSetting.LANDSCAPE_TOP_X.key, IntSetting.LANDSCAPE_TOP_X.defaultValue.toFloat() @@ -1408,7 +1450,7 @@ class SettingsFragmentPresenter(private val fragmentView: SettingsFragmentView) R.string.emulation_custom_layout_y, 0, 0, - getWidth(), + getSmallerDimension(), "px", IntSetting.LANDSCAPE_TOP_Y.key, IntSetting.LANDSCAPE_TOP_Y.defaultValue.toFloat() @@ -1420,7 +1462,7 @@ class SettingsFragmentPresenter(private val fragmentView: SettingsFragmentView) R.string.emulation_custom_layout_width, 0, 0, - getHeight(), + getLargerDimension(), "px", IntSetting.LANDSCAPE_TOP_WIDTH.key, IntSetting.LANDSCAPE_TOP_WIDTH.defaultValue.toFloat() @@ -1432,7 +1474,7 @@ class SettingsFragmentPresenter(private val fragmentView: SettingsFragmentView) R.string.emulation_custom_layout_height, 0, 0, - getWidth(), + getSmallerDimension(), "px", IntSetting.LANDSCAPE_TOP_HEIGHT.key, IntSetting.LANDSCAPE_TOP_HEIGHT.defaultValue.toFloat() @@ -1445,7 +1487,7 @@ class SettingsFragmentPresenter(private val fragmentView: SettingsFragmentView) R.string.emulation_custom_layout_x, 0, 0, - getHeight(), + getLargerDimension(), "px", IntSetting.LANDSCAPE_BOTTOM_X.key, IntSetting.LANDSCAPE_BOTTOM_X.defaultValue.toFloat() @@ -1457,7 +1499,7 @@ class SettingsFragmentPresenter(private val fragmentView: SettingsFragmentView) R.string.emulation_custom_layout_y, 0, 0, - getWidth(), + getSmallerDimension(), "px", IntSetting.LANDSCAPE_BOTTOM_Y.key, IntSetting.LANDSCAPE_BOTTOM_Y.defaultValue.toFloat() @@ -1469,7 +1511,7 @@ class SettingsFragmentPresenter(private val fragmentView: SettingsFragmentView) R.string.emulation_custom_layout_width, 0, 0, - getHeight(), + getLargerDimension(), "px", IntSetting.LANDSCAPE_BOTTOM_WIDTH.key, IntSetting.LANDSCAPE_BOTTOM_WIDTH.defaultValue.toFloat() @@ -1481,7 +1523,7 @@ class SettingsFragmentPresenter(private val fragmentView: SettingsFragmentView) R.string.emulation_custom_layout_height, 0, 0, - getWidth(), + getSmallerDimension(), "px", IntSetting.LANDSCAPE_BOTTOM_HEIGHT.key, IntSetting.LANDSCAPE_BOTTOM_HEIGHT.defaultValue.toFloat() @@ -1501,7 +1543,7 @@ class SettingsFragmentPresenter(private val fragmentView: SettingsFragmentView) R.string.emulation_custom_layout_x, 0, 0, - getWidth(), + getSmallerDimension(), "px", IntSetting.PORTRAIT_TOP_X.key, IntSetting.PORTRAIT_TOP_X.defaultValue.toFloat() @@ -1513,7 +1555,7 @@ class SettingsFragmentPresenter(private val fragmentView: SettingsFragmentView) R.string.emulation_custom_layout_y, 0, 0, - getHeight(), + getLargerDimension(), "px", IntSetting.PORTRAIT_TOP_Y.key, IntSetting.PORTRAIT_TOP_Y.defaultValue.toFloat() @@ -1525,7 +1567,7 @@ class SettingsFragmentPresenter(private val fragmentView: SettingsFragmentView) R.string.emulation_custom_layout_width, 0, 0, - getWidth(), + getSmallerDimension(), "px", IntSetting.PORTRAIT_TOP_WIDTH.key, IntSetting.PORTRAIT_TOP_WIDTH.defaultValue.toFloat() @@ -1537,7 +1579,7 @@ class SettingsFragmentPresenter(private val fragmentView: SettingsFragmentView) R.string.emulation_custom_layout_height, 0, 0, - getHeight(), + getLargerDimension(), "px", IntSetting.PORTRAIT_TOP_HEIGHT.key, IntSetting.PORTRAIT_TOP_HEIGHT.defaultValue.toFloat() @@ -1550,7 +1592,7 @@ class SettingsFragmentPresenter(private val fragmentView: SettingsFragmentView) R.string.emulation_custom_layout_x, 0, 0, - getWidth(), + getSmallerDimension(), "px", IntSetting.PORTRAIT_BOTTOM_X.key, IntSetting.PORTRAIT_BOTTOM_X.defaultValue.toFloat() @@ -1562,7 +1604,7 @@ class SettingsFragmentPresenter(private val fragmentView: SettingsFragmentView) R.string.emulation_custom_layout_y, 0, 0, - getHeight(), + getLargerDimension(), "px", IntSetting.PORTRAIT_BOTTOM_Y.key, IntSetting.PORTRAIT_BOTTOM_Y.defaultValue.toFloat() @@ -1574,7 +1616,7 @@ class SettingsFragmentPresenter(private val fragmentView: SettingsFragmentView) R.string.emulation_custom_layout_width, 0, 0, - getWidth(), + getSmallerDimension(), "px", IntSetting.PORTRAIT_BOTTOM_WIDTH.key, IntSetting.PORTRAIT_BOTTOM_WIDTH.defaultValue.toFloat() @@ -1586,7 +1628,7 @@ class SettingsFragmentPresenter(private val fragmentView: SettingsFragmentView) R.string.emulation_custom_layout_height, 0, 0, - getHeight(), + getLargerDimension(), "px", IntSetting.PORTRAIT_BOTTOM_HEIGHT.key, IntSetting.PORTRAIT_BOTTOM_HEIGHT.defaultValue.toFloat() diff --git a/src/android/app/src/main/java/org/citra/citra_emu/features/settings/ui/viewholder/InputBindingSettingViewHolder.kt b/src/android/app/src/main/java/org/citra/citra_emu/features/settings/ui/viewholder/InputBindingSettingViewHolder.kt index 07dc636cd..5d2a812e0 100644 --- a/src/android/app/src/main/java/org/citra/citra_emu/features/settings/ui/viewholder/InputBindingSettingViewHolder.kt +++ b/src/android/app/src/main/java/org/citra/citra_emu/features/settings/ui/viewholder/InputBindingSettingViewHolder.kt @@ -51,7 +51,7 @@ class InputBindingSettingViewHolder(val binding: ListItemSettingBinding, adapter override fun onLongClick(clicked: View): Boolean { if (setting.isEditable) { - adapter.onLongClick(setting.setting!!, bindingAdapterPosition) + adapter.onInputBindingLongClick(setting, bindingAdapterPosition) } else { adapter.onClickDisabledSetting(!setting.isEditable) } diff --git a/src/android/app/src/main/java/org/citra/citra_emu/fragments/CitraDirectoryDialogFragment.kt b/src/android/app/src/main/java/org/citra/citra_emu/fragments/CitraDirectoryDialogFragment.kt index 43fe1b22a..e663d290b 100644 --- a/src/android/app/src/main/java/org/citra/citra_emu/fragments/CitraDirectoryDialogFragment.kt +++ b/src/android/app/src/main/java/org/citra/citra_emu/fragments/CitraDirectoryDialogFragment.kt @@ -1,4 +1,4 @@ -// Copyright 2023 Citra Emulator Project +// Copyright Citra Emulator Project / Azahar Emulator Project // Licensed under GPLv2 or any later version // Refer to the license.txt file included. @@ -60,7 +60,7 @@ class CitraDirectoryDialogFragment : DialogFragment() { } .setNegativeButton(android.R.string.cancel) { _: DialogInterface?, _: Int -> if (!PermissionsHandler.hasWriteAccess(requireContext())) { - (requireActivity() as MainActivity)?.openCitraDirectory?.launch(null) + PermissionsHandler.compatibleSelectDirectory((requireActivity() as MainActivity).openCitraDirectory) } } .show() diff --git a/src/android/app/src/main/java/org/citra/citra_emu/fragments/CompressProgressDialogFragment.kt b/src/android/app/src/main/java/org/citra/citra_emu/fragments/CompressProgressDialogFragment.kt new file mode 100644 index 000000000..bcd97ae03 --- /dev/null +++ b/src/android/app/src/main/java/org/citra/citra_emu/fragments/CompressProgressDialogFragment.kt @@ -0,0 +1,89 @@ +// Copyright Citra Emulator Project / Azahar Emulator Project +// Licensed under GPLv2 or any later version +// Refer to the license.txt file included. + +package org.citra.citra_emu.fragments + +import android.app.Dialog +import android.os.Bundle +import android.view.View +import android.widget.ProgressBar +import androidx.fragment.app.DialogFragment +import androidx.lifecycle.lifecycleScope +import androidx.lifecycle.repeatOnLifecycle +import androidx.lifecycle.Lifecycle +import com.google.android.material.dialog.MaterialAlertDialogBuilder +import kotlinx.coroutines.flow.collectLatest +import kotlinx.coroutines.flow.combine +import kotlinx.coroutines.launch +import org.citra.citra_emu.R +import org.citra.citra_emu.viewmodel.CompressProgressDialogViewModel +import org.citra.citra_emu.NativeLibrary + +class CompressProgressDialogFragment : DialogFragment() { + private lateinit var progressBar: ProgressBar + private var outputPath: String? = null + private var isCompressing: Boolean = true + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + arguments?.let { + isCompressing = it.getBoolean(ARG_IS_COMPRESSING, true) + outputPath = it.getString(ARG_OUTPUT_PATH) + } + } + + override fun onCreateDialog(savedInstanceState: Bundle?): Dialog { + val view = layoutInflater.inflate(R.layout.dialog_compress_progress, null) + progressBar = view.findViewById(R.id.compress_progress) + val label = view.findViewById(R.id.compress_label) + label.text = if (isCompressing) getString(R.string.compressing) else getString(R.string.decompressing) + + isCancelable = false + progressBar.isIndeterminate = true + + lifecycleScope.launch { + repeatOnLifecycle(Lifecycle.State.STARTED) { + combine(CompressProgressDialogViewModel.total, CompressProgressDialogViewModel.progress) { total, progress -> + total to progress + }.collectLatest { (total, progress) -> + if (total <= 0) { + progressBar.isIndeterminate = true + label.visibility = View.GONE + } else { + progressBar.isIndeterminate = false + label.visibility = View.VISIBLE + progressBar.max = total + progressBar.setProgress(progress, true) + } + } + } + } + + val builder = MaterialAlertDialogBuilder(requireContext()) + .setView(view) + .setCancelable(false) + .setNegativeButton(android.R.string.cancel) { _: android.content.DialogInterface, _: Int -> + outputPath?.let { path -> + NativeLibrary.deleteDocument(path) + } + } + + return builder.show() + } + + companion object { + const val TAG = "CompressProgressDialog" + private const val ARG_IS_COMPRESSING = "isCompressing" + private const val ARG_OUTPUT_PATH = "outputPath" + + fun newInstance(isCompressing: Boolean, outputPath: String?): CompressProgressDialogFragment { + val frag = CompressProgressDialogFragment() + val args = Bundle() + args.putBoolean(ARG_IS_COMPRESSING, isCompressing) + args.putString(ARG_OUTPUT_PATH, outputPath) + frag.arguments = args + return frag + } + } +} diff --git a/src/android/app/src/main/java/org/citra/citra_emu/fragments/EmulationFragment.kt b/src/android/app/src/main/java/org/citra/citra_emu/fragments/EmulationFragment.kt index 419919527..30b22cc64 100644 --- a/src/android/app/src/main/java/org/citra/citra_emu/fragments/EmulationFragment.kt +++ b/src/android/app/src/main/java/org/citra/citra_emu/fragments/EmulationFragment.kt @@ -13,6 +13,7 @@ import android.content.IntentFilter import android.content.SharedPreferences import android.net.Uri import android.os.BatteryManager +import android.os.Build import android.os.Bundle import android.os.Handler import android.os.Looper @@ -144,6 +145,9 @@ class EmulationFragment : Fragment(), SurfaceHolder.Callback, Choreographer.Fram } } + val insertedCartridge = preferences.getString("insertedCartridge", "") + NativeLibrary.setInsertedCartridge(insertedCartridge ?: "") + try { game = args.game ?: intentGame!! } catch (e: NullPointerException) { @@ -1019,12 +1023,13 @@ class EmulationFragment : Fragment(), SurfaceHolder.Callback, Choreographer.Fram // Buttons that are disabled by default var defaultValue = true when (i) { + // TODO: Remove these magic numbers 6, 7, 12, 13, 14, 15 -> defaultValue = false } enabledButtons[i] = preferences.getBoolean("buttonToggle$i", defaultValue) } - MaterialAlertDialogBuilder(requireContext()) + val dialog = MaterialAlertDialogBuilder(requireContext()) .setTitle(R.string.emulation_toggle_controls) .setMultiChoiceItems( R.array.n3dsButtons, enabledButtons @@ -1036,6 +1041,17 @@ class EmulationFragment : Fragment(), SurfaceHolder.Callback, Choreographer.Fram binding.surfaceInputOverlay.refreshControls() } .show() + + // Band-aid fix for strange dialog flickering issue + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) { + val displayMetrics = requireActivity().windowManager.currentWindowMetrics + val displayHeight = displayMetrics.bounds.height() + // The layout visually breaks if we try to set the height directly rather than like this. + // Why? Fuck you, that's why! + val newAttributes = dialog.window?.attributes + newAttributes?.height = (displayHeight * 0.85f).toInt() + dialog.window?.attributes = newAttributes + } } private fun showAdjustScaleDialog(target: String) { diff --git a/src/android/app/src/main/java/org/citra/citra_emu/fragments/GamesFragment.kt b/src/android/app/src/main/java/org/citra/citra_emu/fragments/GamesFragment.kt index b224c5c15..9ade73c83 100644 --- a/src/android/app/src/main/java/org/citra/citra_emu/fragments/GamesFragment.kt +++ b/src/android/app/src/main/java/org/citra/citra_emu/fragments/GamesFragment.kt @@ -30,14 +30,17 @@ import androidx.recyclerview.widget.GridLayoutManager import com.google.android.material.color.MaterialColors import com.google.android.material.dialog.MaterialAlertDialogBuilder import com.google.android.material.transition.MaterialFadeThrough +import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.flow.collectLatest import kotlinx.coroutines.launch import org.citra.citra_emu.CitraApplication +import org.citra.citra_emu.NativeLibrary import org.citra.citra_emu.R import org.citra.citra_emu.adapters.GameAdapter import org.citra.citra_emu.databinding.FragmentGamesBinding import org.citra.citra_emu.features.settings.model.Settings import org.citra.citra_emu.model.Game +import org.citra.citra_emu.viewmodel.CompressProgressDialogViewModel import org.citra.citra_emu.viewmodel.GamesViewModel import org.citra.citra_emu.viewmodel.HomeViewModel @@ -56,6 +59,58 @@ class GamesFragment : Fragment() { gameAdapter.handleShortcutImageResult(uri) } + private var shouldCompress: Boolean = true + private var pendingCompressInvocation: String? = null + + companion object { + fun doCompression(fragment: Fragment, gamesViewModel: GamesViewModel, inputPath: String?, outputUri: Uri?, shouldCompress: Boolean) { + if (outputUri != null) { + CompressProgressDialogViewModel.reset() + val dialog = CompressProgressDialogFragment.newInstance(shouldCompress, outputUri.toString()) + dialog.showNow( + fragment.requireActivity().supportFragmentManager, + CompressProgressDialogFragment.TAG + ) + + fragment.lifecycleScope.launch(Dispatchers.IO) { + val status = if (shouldCompress) { + NativeLibrary.compressFile(inputPath, outputUri.toString()) + } else { + NativeLibrary.decompressFile(inputPath, outputUri.toString()) + } + + fragment.requireActivity().runOnUiThread { + dialog.dismiss() + val resId = when (status) { + NativeLibrary.CompressStatus.SUCCESS -> if (shouldCompress) R.string.compress_success else R.string.decompress_success + NativeLibrary.CompressStatus.COMPRESS_UNSUPPORTED -> R.string.compress_unsupported + NativeLibrary.CompressStatus.COMPRESS_ALREADY_COMPRESSED -> R.string.compress_already + NativeLibrary.CompressStatus.COMPRESS_FAILED -> R.string.compress_failed + NativeLibrary.CompressStatus.DECOMPRESS_UNSUPPORTED -> R.string.decompress_unsupported + NativeLibrary.CompressStatus.DECOMPRESS_NOT_COMPRESSED -> R.string.decompress_not_compressed + NativeLibrary.CompressStatus.DECOMPRESS_FAILED -> R.string.decompress_failed + NativeLibrary.CompressStatus.INSTALLED_APPLICATION -> R.string.compress_decompress_installed_app + } + + MaterialAlertDialogBuilder(fragment.requireContext()) + .setMessage(fragment.getString(resId)) + .setPositiveButton(android.R.string.ok, null) + .show() + + gamesViewModel.reloadGames(false) + } + } + } + } + } + + private val onCompressDecompressLauncher = registerForActivityResult( + ActivityResultContracts.CreateDocument("application/octet-stream") + ) { uri: Uri? -> + doCompression(this, gamesViewModel, pendingCompressInvocation, uri, shouldCompress) + pendingCompressInvocation = null + } + override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) enterTransition = MaterialFadeThrough() @@ -81,7 +136,12 @@ class GamesFragment : Fragment() { gameAdapter = GameAdapter( requireActivity() as AppCompatActivity, inflater, - openImageLauncher + openImageLauncher, + onRequestCompressOrDecompress = { inputPath, suggestedName, shouldCompress -> + pendingCompressInvocation = inputPath + onCompressDecompressLauncher.launch(suggestedName) + this.shouldCompress = shouldCompress + } ) binding.gridGames.apply { diff --git a/src/android/app/src/main/java/org/citra/citra_emu/fragments/GrantMissingFilesystemPermissionFragment.kt b/src/android/app/src/main/java/org/citra/citra_emu/fragments/GrantMissingFilesystemPermissionFragment.kt new file mode 100644 index 000000000..e07787c52 --- /dev/null +++ b/src/android/app/src/main/java/org/citra/citra_emu/fragments/GrantMissingFilesystemPermissionFragment.kt @@ -0,0 +1,81 @@ +// Copyright Citra Emulator Project / Azahar Emulator Project +// Licensed under GPLv2 or any later version +// Refer to the license.txt file included. + +package org.citra.citra_emu.fragments + +import android.Manifest +import android.app.Dialog +import android.content.DialogInterface +import android.content.Intent +import android.net.Uri +import android.os.Build +import android.os.Bundle +import android.os.Environment +import android.provider.Settings +import androidx.activity.result.contract.ActivityResultContracts +import androidx.annotation.RequiresApi +import androidx.fragment.app.DialogFragment +import com.google.android.material.dialog.MaterialAlertDialogBuilder +import org.citra.citra_emu.R +import org.citra.citra_emu.ui.main.MainActivity +import org.citra.citra_emu.utils.BuildUtil + +class GrantMissingFilesystemPermissionFragment : DialogFragment() { + private lateinit var mainActivity: MainActivity + + override fun onCreateDialog(savedInstanceState: Bundle?): Dialog { + BuildUtil.assertNotGooglePlay() + mainActivity = requireActivity() as MainActivity + + isCancelable = false + + val requestPermissionFunction = + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) { + { + manageExternalStoragePermissionLauncher.launch( + Intent( + Settings.ACTION_MANAGE_APP_ALL_FILES_ACCESS_PERMISSION, + Uri.fromParts("package", mainActivity.packageName, null) + ) + ) + } + } else { + { permissionLauncher.launch(Manifest.permission.WRITE_EXTERNAL_STORAGE) } + } + + + + return MaterialAlertDialogBuilder(requireContext()) + .setTitle(R.string.filesystem_permission_warning) + .setMessage(R.string.filesystem_permission_lost) + .setPositiveButton(android.R.string.ok) { _: DialogInterface, _: Int -> + requestPermissionFunction() + } + .show() + } + + @RequiresApi(Build.VERSION_CODES.R) + private val manageExternalStoragePermissionLauncher = + registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { + if (Environment.isExternalStorageManager()) { + return@registerForActivityResult + } + } + + private val permissionLauncher = + registerForActivityResult(ActivityResultContracts.RequestPermission()) { isGranted -> + if (isGranted) { + return@registerForActivityResult + } + } + + companion object { + const val TAG = "GrantMissingFilesystemPermissionFragment" + + fun newInstance(): GrantMissingFilesystemPermissionFragment { + BuildUtil.assertNotGooglePlay() + return GrantMissingFilesystemPermissionFragment() + } + } +} diff --git a/src/android/app/src/main/java/org/citra/citra_emu/fragments/HomeSettingsFragment.kt b/src/android/app/src/main/java/org/citra/citra_emu/fragments/HomeSettingsFragment.kt index 432a06aa0..63c435531 100644 --- a/src/android/app/src/main/java/org/citra/citra_emu/fragments/HomeSettingsFragment.kt +++ b/src/android/app/src/main/java/org/citra/citra_emu/fragments/HomeSettingsFragment.kt @@ -159,7 +159,7 @@ class HomeSettingsFragment : Fragment() { R.string.select_citra_user_folder, R.string.select_citra_user_folder_home_description, R.drawable.ic_home, - { mainActivity?.openCitraDirectory?.launch(null) }, + { PermissionsHandler.compatibleSelectDirectory(mainActivity.openCitraDirectory) }, details = homeViewModel.userDir ), HomeSetting( diff --git a/src/android/app/src/main/java/org/citra/citra_emu/fragments/SearchFragment.kt b/src/android/app/src/main/java/org/citra/citra_emu/fragments/SearchFragment.kt index 94821023f..dab5ea745 100644 --- a/src/android/app/src/main/java/org/citra/citra_emu/fragments/SearchFragment.kt +++ b/src/android/app/src/main/java/org/citra/citra_emu/fragments/SearchFragment.kt @@ -7,11 +7,13 @@ package org.citra.citra_emu.fragments import android.annotation.SuppressLint import android.content.Context import android.content.SharedPreferences +import android.net.Uri import android.os.Bundle import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import android.view.inputmethod.InputMethodManager +import androidx.activity.result.contract.ActivityResultContracts import androidx.appcompat.app.AppCompatActivity import androidx.core.view.ViewCompat import androidx.core.view.WindowInsetsCompat @@ -26,18 +28,19 @@ import androidx.preference.PreferenceManager import androidx.recyclerview.widget.GridLayoutManager import info.debatty.java.stringsimilarity.Jaccard import info.debatty.java.stringsimilarity.JaroWinkler +import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch import org.citra.citra_emu.CitraApplication import org.citra.citra_emu.R +import org.citra.citra_emu.NativeLibrary import org.citra.citra_emu.adapters.GameAdapter import org.citra.citra_emu.databinding.FragmentSearchBinding import org.citra.citra_emu.model.Game +import org.citra.citra_emu.viewmodel.CompressProgressDialogViewModel import org.citra.citra_emu.viewmodel.GamesViewModel import org.citra.citra_emu.viewmodel.HomeViewModel import java.time.temporal.ChronoField import java.util.Locale -import android.net.Uri -import androidx.activity.result.contract.ActivityResultContracts class SearchFragment : Fragment() { private var _binding: FragmentSearchBinding? = null @@ -53,6 +56,15 @@ class SearchFragment : Fragment() { gameAdapter.handleShortcutImageResult(uri) } + private var shouldCompress: Boolean = true + private var pendingCompressInvocation: String? = null + private val onCompressDecompressLauncher = registerForActivityResult( + ActivityResultContracts.CreateDocument("application/octet-stream") + ) { uri: Uri? -> + GamesFragment.doCompression(this, gamesViewModel, pendingCompressInvocation, uri, shouldCompress) + pendingCompressInvocation = null + } + private lateinit var preferences: SharedPreferences companion object { @@ -85,7 +97,13 @@ class SearchFragment : Fragment() { gameAdapter = GameAdapter( requireActivity() as AppCompatActivity, inflater, - openImageLauncher + openImageLauncher, + onRequestCompressOrDecompress = { inputPath, suggestedName, shouldCompress -> + pendingCompressInvocation = inputPath + onCompressDecompressLauncher.launch(suggestedName) + this.shouldCompress = shouldCompress + } + ) binding.gridGamesSearch.apply { diff --git a/src/android/app/src/main/java/org/citra/citra_emu/fragments/SelectUserDirectoryDialogFragment.kt b/src/android/app/src/main/java/org/citra/citra_emu/fragments/SelectUserDirectoryDialogFragment.kt index 988f90ccc..f0f945860 100644 --- a/src/android/app/src/main/java/org/citra/citra_emu/fragments/SelectUserDirectoryDialogFragment.kt +++ b/src/android/app/src/main/java/org/citra/citra_emu/fragments/SelectUserDirectoryDialogFragment.kt @@ -13,21 +13,25 @@ import androidx.lifecycle.ViewModelProvider import com.google.android.material.dialog.MaterialAlertDialogBuilder import org.citra.citra_emu.R import org.citra.citra_emu.ui.main.MainActivity +import org.citra.citra_emu.utils.PermissionsHandler import org.citra.citra_emu.viewmodel.HomeViewModel -class SelectUserDirectoryDialogFragment : DialogFragment() { +class SelectUserDirectoryDialogFragment(titleOverride: Int? = null, descriptionOverride: Int? = null) : DialogFragment() { private lateinit var mainActivity: MainActivity + private val title = titleOverride ?: R.string.select_citra_user_folder + private val description = descriptionOverride ?: R.string.selecting_user_directory_without_write_permissions + override fun onCreateDialog(savedInstanceState: Bundle?): Dialog { mainActivity = requireActivity() as MainActivity isCancelable = false return MaterialAlertDialogBuilder(requireContext()) - .setTitle(R.string.select_citra_user_folder) - .setMessage(R.string.selecting_user_directory_without_write_permissions) + .setTitle(title) + .setMessage(description) .setPositiveButton(android.R.string.ok) { _: DialogInterface, _: Int -> - mainActivity?.openCitraDirectoryLostPermission?.launch(null) + PermissionsHandler.compatibleSelectDirectory(mainActivity.openCitraDirectoryLostPermission) } .show() } @@ -35,9 +39,10 @@ class SelectUserDirectoryDialogFragment : DialogFragment() { companion object { const val TAG = "SelectUserDirectoryDialogFragment" - fun newInstance(activity: FragmentActivity): SelectUserDirectoryDialogFragment { + fun newInstance(activity: FragmentActivity, titleOverride: Int? = null, descriptionOverride: Int? = null): + SelectUserDirectoryDialogFragment { ViewModelProvider(activity)[HomeViewModel::class.java].setPickingUserDir(true) - return SelectUserDirectoryDialogFragment() + return SelectUserDirectoryDialogFragment(titleOverride, descriptionOverride) } } } diff --git a/src/android/app/src/main/java/org/citra/citra_emu/fragments/SetupFragment.kt b/src/android/app/src/main/java/org/citra/citra_emu/fragments/SetupFragment.kt index fa47f99b8..0a25044ea 100644 --- a/src/android/app/src/main/java/org/citra/citra_emu/fragments/SetupFragment.kt +++ b/src/android/app/src/main/java/org/citra/citra_emu/fragments/SetupFragment.kt @@ -11,11 +11,13 @@ import android.content.pm.PackageManager import android.net.Uri import android.os.Build import android.os.Bundle +import android.os.Environment import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import androidx.activity.OnBackPressedCallback import androidx.activity.result.contract.ActivityResultContracts +import androidx.annotation.RequiresApi import androidx.appcompat.app.AppCompatActivity import androidx.core.app.NotificationManagerCompat import androidx.core.content.ContextCompat @@ -30,7 +32,9 @@ import androidx.preference.PreferenceManager import androidx.viewpager2.widget.ViewPager2.OnPageChangeCallback import com.google.android.material.snackbar.Snackbar import com.google.android.material.transition.MaterialFadeThrough +import org.citra.citra_emu.BuildConfig import org.citra.citra_emu.CitraApplication +import org.citra.citra_emu.NativeLibrary import org.citra.citra_emu.R import org.citra.citra_emu.adapters.SetupAdapter import org.citra.citra_emu.databinding.FragmentSetupBinding @@ -41,6 +45,7 @@ import org.citra.citra_emu.model.PageState import org.citra.citra_emu.model.SetupCallback import org.citra.citra_emu.model.SetupPage import org.citra.citra_emu.ui.main.MainActivity +import org.citra.citra_emu.utils.BuildUtil import org.citra.citra_emu.utils.CitraDirectoryHelper import org.citra.citra_emu.utils.GameHelper import org.citra.citra_emu.utils.PermissionsHandler @@ -142,7 +147,56 @@ class SetupFragment : Fragment() { false, 0, pageButtons = mutableListOf().apply { - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { + if (!BuildUtil.isGooglePlayBuild) { + add( + PageButton( + R.drawable.ic_folder, + R.string.filesystem_permission, + R.string.filesystem_permission_description, + buttonAction = { + pageButtonCallback = it + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) { + manageExternalStoragePermissionLauncher.launch( + Intent( + android.provider.Settings.ACTION_MANAGE_APP_ALL_FILES_ACCESS_PERMISSION, + Uri.fromParts( + "package", + requireActivity().packageName, + null + ) + ) + ) + } else { + permissionLauncher.launch(Manifest.permission.WRITE_EXTERNAL_STORAGE) + } + }, + buttonState = { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) { + if (Environment.isExternalStorageManager()) { + ButtonState.BUTTON_ACTION_COMPLETE + } else { + ButtonState.BUTTON_ACTION_INCOMPLETE + } + } else { + if (ContextCompat.checkSelfPermission( + requireContext(), + Manifest.permission.WRITE_EXTERNAL_STORAGE + ) == PackageManager.PERMISSION_GRANTED + ) { + ButtonState.BUTTON_ACTION_COMPLETE + } else { + ButtonState.BUTTON_ACTION_INCOMPLETE + } + } + }, + isUnskippable = true, + hasWarning = true, + R.string.filesystem_permission_warning, + R.string.filesystem_permission_warning_description, + ) + ) + } + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) { add( PageButton( R.drawable.ic_notification, @@ -214,18 +268,35 @@ class SetupFragment : Fragment() { ) }, ) { - if ( + var permissionsComplete = + // Microphone ContextCompat.checkSelfPermission( requireContext(), Manifest.permission.RECORD_AUDIO ) == PackageManager.PERMISSION_GRANTED && + // Camera ContextCompat.checkSelfPermission( requireContext(), Manifest.permission.CAMERA ) == PackageManager.PERMISSION_GRANTED && + // Notifications NotificationManagerCompat.from(requireContext()) .areNotificationsEnabled() - ) { + // External Storage + if (!BuildUtil.isGooglePlayBuild) { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) { + permissionsComplete = + (permissionsComplete && Environment.isExternalStorageManager()) + } else { + permissionsComplete = + (permissionsComplete && ContextCompat.checkSelfPermission( + requireContext(), + Manifest.permission.WRITE_EXTERNAL_STORAGE + ) == PackageManager.PERMISSION_GRANTED) + } + } + + if (permissionsComplete) { PageState.PAGE_STEPS_COMPLETE } else { PageState.PAGE_STEPS_INCOMPLETE @@ -249,7 +320,7 @@ class SetupFragment : Fragment() { R.string.select_citra_user_folder_description, buttonAction = { pageButtonCallback = it - openCitraDirectory.launch(null) + PermissionsHandler.compatibleSelectDirectory(openCitraDirectory) }, buttonState = { if (PermissionsHandler.hasWriteAccess(requireContext())) { @@ -452,6 +523,19 @@ class SetupFragment : Fragment() { } } + private fun showPermissionDeniedSnackbar() { + Snackbar.make(binding.root, R.string.permission_denied, Snackbar.LENGTH_LONG) + .setAnchorView(binding.buttonNext) + .setAction(R.string.grid_menu_core_settings) { + val intent = + Intent(android.provider.Settings.ACTION_APPLICATION_DETAILS_SETTINGS) + val uri = Uri.fromParts("package", requireActivity().packageName, null) + intent.data = uri + startActivity(intent) + } + .show() + } + private val permissionLauncher = registerForActivityResult(ActivityResultContracts.RequestPermission()) { isGranted -> if (isGranted) { @@ -459,16 +543,20 @@ class SetupFragment : Fragment() { return@registerForActivityResult } - Snackbar.make(binding.root, R.string.permission_denied, Snackbar.LENGTH_LONG) - .setAnchorView(binding.buttonNext) - .setAction(R.string.grid_menu_core_settings) { - val intent = - Intent(android.provider.Settings.ACTION_APPLICATION_DETAILS_SETTINGS) - val uri = Uri.fromParts("package", requireActivity().packageName, null) - intent.data = uri - startActivity(intent) - } - .show() + showPermissionDeniedSnackbar() + } + + // We can't use permissionLauncher because MANAGE_EXTERNAL_STORAGE is a special snowflake + @RequiresApi(Build.VERSION_CODES.R) + private val manageExternalStoragePermissionLauncher = + registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { + BuildUtil.assertNotGooglePlay() + if (Environment.isExternalStorageManager()) { + checkForButtonState.invoke() + return@registerForActivityResult + } + + showPermissionDeniedSnackbar() } private val openCitraDirectory = registerForActivityResult( @@ -478,6 +566,17 @@ class SetupFragment : Fragment() { return@registerForActivityResult } + if (!BuildUtil.isGooglePlayBuild) { + if (NativeLibrary.getUserDirectory(result) == "") { + SelectUserDirectoryDialogFragment.newInstance( + mainActivity, + R.string.invalid_selection, + R.string.invalid_user_directory + ).show(mainActivity.supportFragmentManager, SelectUserDirectoryDialogFragment.TAG) + return@registerForActivityResult + } + } + CitraDirectoryHelper(requireActivity(), true).showCitraDirectoryDialog(result, pageButtonCallback, checkForButtonState) } diff --git a/src/android/app/src/main/java/org/citra/citra_emu/model/Game.kt b/src/android/app/src/main/java/org/citra/citra_emu/model/Game.kt index 9ff7600ec..797b7a262 100644 --- a/src/android/app/src/main/java/org/citra/citra_emu/model/Game.kt +++ b/src/android/app/src/main/java/org/citra/citra_emu/model/Game.kt @@ -25,8 +25,10 @@ class Game( val isInstalled: Boolean = false, val isSystemTitle: Boolean = false, val isVisibleSystemTitle: Boolean = false, + val isInsertable: Boolean = false, val icon: IntArray? = null, val fileType: String = "", + val isCompressed: Boolean = false, val filename: String, ) : Parcelable { val keyAddedToLibraryTime get() = "${filename}_AddedToLibraryTime" diff --git a/src/android/app/src/main/java/org/citra/citra_emu/model/GameInfo.kt b/src/android/app/src/main/java/org/citra/citra_emu/model/GameInfo.kt index 817e5fdec..494d7bf75 100644 --- a/src/android/app/src/main/java/org/citra/citra_emu/model/GameInfo.kt +++ b/src/android/app/src/main/java/org/citra/citra_emu/model/GameInfo.kt @@ -37,6 +37,8 @@ class GameInfo(path: String) { external fun getFileType(): String + external fun getIsInsertable(): Boolean + companion object { @JvmStatic private external fun initialize(path: String): Long diff --git a/src/android/app/src/main/java/org/citra/citra_emu/ui/main/MainActivity.kt b/src/android/app/src/main/java/org/citra/citra_emu/ui/main/MainActivity.kt index 37bff3396..e1416bd37 100644 --- a/src/android/app/src/main/java/org/citra/citra_emu/ui/main/MainActivity.kt +++ b/src/android/app/src/main/java/org/citra/citra_emu/ui/main/MainActivity.kt @@ -4,9 +4,13 @@ package org.citra.citra_emu.ui.main +import android.Manifest import android.content.Intent +import android.content.pm.PackageManager import android.net.Uri +import android.os.Build import android.os.Bundle +import android.os.Environment import android.view.View import android.view.ViewGroup.MarginLayoutParams import android.view.WindowManager @@ -36,6 +40,8 @@ import androidx.work.WorkManager import com.google.android.material.color.MaterialColors import com.google.android.material.navigation.NavigationBarView import kotlinx.coroutines.launch +import org.citra.citra_emu.BuildConfig +import org.citra.citra_emu.NativeLibrary import org.citra.citra_emu.R import org.citra.citra_emu.contracts.OpenFileResultContract import org.citra.citra_emu.databinding.ActivityMainBinding @@ -43,14 +49,17 @@ import org.citra.citra_emu.features.settings.model.Settings import org.citra.citra_emu.features.settings.model.SettingsViewModel import org.citra.citra_emu.features.settings.ui.SettingsActivity import org.citra.citra_emu.features.settings.utils.SettingsFile +import org.citra.citra_emu.fragments.GrantMissingFilesystemPermissionFragment import org.citra.citra_emu.fragments.SelectUserDirectoryDialogFragment import org.citra.citra_emu.fragments.UpdateUserDirectoryDialogFragment +import org.citra.citra_emu.utils.BuildUtil import org.citra.citra_emu.utils.CiaInstallWorker import org.citra.citra_emu.utils.CitraDirectoryHelper import org.citra.citra_emu.utils.CitraDirectoryUtils import org.citra.citra_emu.utils.DirectoryInitialization import org.citra.citra_emu.utils.FileBrowserHelper import org.citra.citra_emu.utils.InsetsHelper +import org.citra.citra_emu.utils.RefreshRateUtil import org.citra.citra_emu.utils.PermissionsHandler import org.citra.citra_emu.utils.ThemeUtil import org.citra.citra_emu.viewmodel.GamesViewModel @@ -66,6 +75,8 @@ class MainActivity : AppCompatActivity(), ThemeProvider { override var themeId: Int = 0 override fun onCreate(savedInstanceState: Bundle?) { + RefreshRateUtil.enforceRefreshRate(this) + val splashScreen = installSplashScreen() CitraDirectoryUtils.attemptAutomaticUpdateDirectory() splashScreen.setKeepOnScreenCondition { @@ -185,14 +196,53 @@ class MainActivity : AppCompatActivity(), ThemeProvider { val firstTimeSetup = PreferenceManager.getDefaultSharedPreferences(applicationContext) .getBoolean(Settings.PREF_FIRST_APP_LAUNCH, true) - if (!firstTimeSetup && !PermissionsHandler.hasWriteAccess(this) && - !homeViewModel.isPickingUserDir.value - ) { + if (firstTimeSetup) { + return + } + + if (!BuildUtil.isGooglePlayBuild) { + fun requestMissingFilesystemPermission() = + GrantMissingFilesystemPermissionFragment.newInstance() + .show(supportFragmentManager, GrantMissingFilesystemPermissionFragment.TAG) + + if (supportFragmentManager.findFragmentByTag(GrantMissingFilesystemPermissionFragment.TAG) == null) { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) { + if (!Environment.isExternalStorageManager()) { + requestMissingFilesystemPermission() + } + } else { + if (ContextCompat.checkSelfPermission( + this, + Manifest.permission.WRITE_EXTERNAL_STORAGE + ) != PackageManager.PERMISSION_GRANTED + ) { + requestMissingFilesystemPermission() + } + } + } + } + + if (homeViewModel.isPickingUserDir.value) { + return + } + + if (!PermissionsHandler.hasWriteAccess(this)) { SelectUserDirectoryDialogFragment.newInstance(this) .show(supportFragmentManager, SelectUserDirectoryDialogFragment.TAG) - } else if (!firstTimeSetup && !homeViewModel.isPickingUserDir.value && CitraDirectoryUtils.needToUpdateManually()) { + return + } else if (CitraDirectoryUtils.needToUpdateManually()) { UpdateUserDirectoryDialogFragment.newInstance(this) .show(supportFragmentManager,UpdateUserDirectoryDialogFragment.TAG) + return + } + + if (!BuildUtil.isGooglePlayBuild) { + if (supportFragmentManager.findFragmentByTag(SelectUserDirectoryDialogFragment.TAG) == null) { + if (NativeLibrary.getUserDirectory() == "") { + SelectUserDirectoryDialogFragment.newInstance(this) + .show(supportFragmentManager, SelectUserDirectoryDialogFragment.TAG) + } + } } } @@ -316,6 +366,17 @@ class MainActivity : AppCompatActivity(), ThemeProvider { return@registerForActivityResult } + if (!BuildUtil.isGooglePlayBuild) { + if (NativeLibrary.getUserDirectory(result) == "") { + SelectUserDirectoryDialogFragment.newInstance( + this, + R.string.invalid_selection, + R.string.invalid_user_directory + ).show(supportFragmentManager, SelectUserDirectoryDialogFragment.TAG) + return@registerForActivityResult + } + } + CitraDirectoryHelper(this@MainActivity, permissionsLost) .showCitraDirectoryDialog(result, buttonState = {}) } diff --git a/src/android/app/src/main/java/org/citra/citra_emu/utils/BuildUtil.kt b/src/android/app/src/main/java/org/citra/citra_emu/utils/BuildUtil.kt new file mode 100644 index 000000000..71c2a9b76 --- /dev/null +++ b/src/android/app/src/main/java/org/citra/citra_emu/utils/BuildUtil.kt @@ -0,0 +1,25 @@ +// Copyright Citra Emulator Project / Azahar Emulator Project +// Licensed under GPLv2 or any later version +// Refer to the license.txt file included. + +package org.citra.citra_emu.utils + +import org.citra.citra_emu.BuildConfig + +object BuildUtil { + @Suppress("unused") + object BuildFlavors { + const val GOOGLEPLAY = "googlePlay" + const val VANILLA = "vanilla" + } + + fun assertNotGooglePlay() { + if (isGooglePlayBuild) { + error("Non-GooglePlay code being called in GooglePlay build") + } + } + + @Suppress("SimplifyBooleanWithConstants", "KotlinConstantConditions") + val isGooglePlayBuild = + BuildConfig.FLAVOR == BuildFlavors.GOOGLEPLAY +} diff --git a/src/android/app/src/main/java/org/citra/citra_emu/utils/DirectoryInitialization.kt b/src/android/app/src/main/java/org/citra/citra_emu/utils/DirectoryInitialization.kt index 1365c3722..e41b7c6db 100644 --- a/src/android/app/src/main/java/org/citra/citra_emu/utils/DirectoryInitialization.kt +++ b/src/android/app/src/main/java/org/citra/citra_emu/utils/DirectoryInitialization.kt @@ -1,4 +1,4 @@ -// Copyright 2023 Citra Emulator Project +// Copyright Citra Emulator Project / Azahar Emulator Project // Licensed under GPLv2 or any later version // Refer to the license.txt file included. @@ -28,8 +28,8 @@ object DirectoryInitialization { @Volatile private var directoryState: DirectoryInitializationState? = null var userPath: String? = null - val internalUserPath - get() = CitraApplication.appContext.getExternalFilesDir(null)!!.canonicalPath + val internalUserPath: String + get() = CitraApplication.appContext.filesDir.canonicalPath private val isCitraDirectoryInitializationRunning = AtomicBoolean(false) val context: Context get() = CitraApplication.appContext diff --git a/src/android/app/src/main/java/org/citra/citra_emu/utils/DocumentsTree.kt b/src/android/app/src/main/java/org/citra/citra_emu/utils/DocumentsTree.kt index e2b015d47..d5c4f791d 100644 --- a/src/android/app/src/main/java/org/citra/citra_emu/utils/DocumentsTree.kt +++ b/src/android/app/src/main/java/org/citra/citra_emu/utils/DocumentsTree.kt @@ -6,10 +6,12 @@ package org.citra.citra_emu.utils import android.net.Uri import android.provider.DocumentsContract +import androidx.core.net.toUri import androidx.documentfile.provider.DocumentFile import org.citra.citra_emu.CitraApplication import org.citra.citra_emu.model.CheapDocument import java.net.URLDecoder +import java.nio.file.Paths import java.util.StringTokenizer import java.util.concurrent.ConcurrentHashMap @@ -191,7 +193,7 @@ class DocumentsTree { } @Synchronized - fun renameFile(filepath: String, destinationFilename: String?): Boolean { + fun renameFile(filepath: String, destinationFilename: String): Boolean { val node = resolvePath(filepath) ?: return false try { val filename = URLDecoder.decode(destinationFilename, FileUtil.DECODE_METHOD) @@ -203,6 +205,20 @@ class DocumentsTree { } } + @Synchronized + fun moveFile(filename: String, sourceDirPath: String, destDirPath: String): Boolean { + val sourceFileNode = resolvePath(sourceDirPath + "/" + filename) ?: return false + val sourceDirNode = resolvePath(sourceDirPath) ?: return false + val destDirNode = resolvePath(destDirPath) ?: return false + try { + val newUri = DocumentsContract.moveDocument(context.contentResolver, sourceFileNode.uri!!, sourceDirNode.uri!!, destDirNode.uri!!) + updateDocumentLocation("$sourceDirPath/$filename", "$destDirPath/$filename") + return true + } catch (e: Exception) { + error("[DocumentsTree]: Cannot move file, error: " + e.message) + } + } + @Synchronized fun deleteDocument(filepath: String): Boolean { val node = resolvePath(filepath) ?: return false @@ -219,6 +235,29 @@ class DocumentsTree { } } + @Synchronized + fun updateDocumentLocation(sourcePath: String, destinationPath: String): Boolean { + val sourceNode = resolvePath(sourcePath) + val newName = Paths.get(destinationPath).fileName.toString() + val parentPath = Paths.get(destinationPath).parent.toString() + val newParent = resolvePath(parentPath) + val newUri = (getUri(parentPath).toString() + "%2F$newName").toUri() // <- Is there a better way? + + if (sourceNode == null || newParent == null) { + return false + } + + sourceNode.parent!!.removeChild(sourceNode) + + sourceNode.name = newName + sourceNode.parent = newParent + sourceNode.uri = newUri + + newParent.addChild(sourceNode) + + return true + } + @Synchronized private fun resolvePath(filepath: String): DocumentsNode? { root ?: return null diff --git a/src/android/app/src/main/java/org/citra/citra_emu/utils/FileUtil.kt b/src/android/app/src/main/java/org/citra/citra_emu/utils/FileUtil.kt index 402a23857..9d9063c59 100644 --- a/src/android/app/src/main/java/org/citra/citra_emu/utils/FileUtil.kt +++ b/src/android/app/src/main/java/org/citra/citra_emu/utils/FileUtil.kt @@ -1,4 +1,4 @@ -// Copyright 2023 Citra Emulator Project +// Copyright Citra Emulator Project / Azahar Emulator Project // Licensed under GPLv2 or any later version // Refer to the license.txt file included. @@ -11,6 +11,7 @@ import android.net.Uri import android.provider.DocumentsContract import android.system.Os import android.util.Pair +import androidx.core.net.toUri import androidx.documentfile.provider.DocumentFile import org.citra.citra_emu.CitraApplication import org.citra.citra_emu.model.CheapDocument @@ -434,6 +435,20 @@ object FileUtil { return false } + @JvmStatic + fun moveFile(filename: String, sourceDirUriString: String, destDirUriString: String): Boolean { + try { + val sourceFileUri = ("$sourceDirUriString%2F$filename").toUri() + val sourceDirUri = sourceDirUriString.toUri() + val destDirUri = destDirUriString.toUri() + DocumentsContract.moveDocument(context.contentResolver, sourceFileUri, sourceDirUri, destDirUri) + return true + } catch (e: Exception) { + Log.error("[FileUtil]: Cannot move file, error: " + e.message) + } + return false + } + @JvmStatic fun deleteDocument(path: String): Boolean { try { diff --git a/src/android/app/src/main/java/org/citra/citra_emu/utils/GameHelper.kt b/src/android/app/src/main/java/org/citra/citra_emu/utils/GameHelper.kt index ffbeaf394..90b011114 100644 --- a/src/android/app/src/main/java/org/citra/citra_emu/utils/GameHelper.kt +++ b/src/android/app/src/main/java/org/citra/citra_emu/utils/GameHelper.kt @@ -88,8 +88,10 @@ object GameHelper { isInstalled, gameInfo?.isSystemTitle() ?: false, gameInfo?.getIsVisibleSystemTitle() ?: false, + gameInfo?.getIsInsertable() ?: false, gameInfo?.getIcon(), gameInfo?.getFileType() ?: "", + gameInfo?.getFileType()?.contains("(Z)") ?: false, if (FileUtil.isNativePath(filePath)) { CitraApplication.documentsTree.getFilename(filePath) } else { diff --git a/src/android/app/src/main/java/org/citra/citra_emu/utils/PermissionsHandler.kt b/src/android/app/src/main/java/org/citra/citra_emu/utils/PermissionsHandler.kt index 8f1e9193f..6ea04c779 100644 --- a/src/android/app/src/main/java/org/citra/citra_emu/utils/PermissionsHandler.kt +++ b/src/android/app/src/main/java/org/citra/citra_emu/utils/PermissionsHandler.kt @@ -8,6 +8,9 @@ import android.content.Context import android.content.Intent import android.content.SharedPreferences import android.net.Uri +import android.os.Build +import android.provider.DocumentsContract +import androidx.activity.result.ActivityResultLauncher import androidx.preference.PreferenceManager import androidx.documentfile.provider.DocumentFile import org.citra.citra_emu.CitraApplication @@ -48,4 +51,17 @@ object PermissionsHandler { fun setCitraDirectory(uriString: String?) = preferences.edit().putString(CITRA_DIRECTORY, uriString).apply() + + fun compatibleSelectDirectory(activityLauncher: ActivityResultLauncher) { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) { + activityLauncher.launch(null) + } else { + val initialUri = DocumentsContract.buildRootUri( + "com.android.externalstorage.documents", + "primary" + ) + activityLauncher.launch(initialUri) + } + + } } diff --git a/src/android/app/src/main/java/org/citra/citra_emu/utils/RefreshRateUtil.kt b/src/android/app/src/main/java/org/citra/citra_emu/utils/RefreshRateUtil.kt new file mode 100644 index 000000000..675fe6702 --- /dev/null +++ b/src/android/app/src/main/java/org/citra/citra_emu/utils/RefreshRateUtil.kt @@ -0,0 +1,53 @@ +// Copyright Citra Emulator Project / Azahar Emulator Project +// Licensed under GPLv2 or any later version +// Refer to the license.txt file included. + +package org.citra.citra_emu.utils +import android.app.Activity +import android.os.Build +import androidx.annotation.RequiresApi + +object RefreshRateUtil { + // Since Android 15, the OS automatically runs apps categorized as games with a + // 60hz refresh rate by default, regardless of the refresh rate set by the user. + // + // This function sets the refresh rate to either the maximum allowed refresh rate or + // 60hz depending on the value of the `sixtyHz` parameter. + // + // Note: This isn't always the maximum refresh rate that the display is *capable of*, + // but is instead the refresh rate chosen by the user in the Android system settings. + // For example, if the user selected 120hz in the settings, but the display is capable + // of 144hz, 120hz will be treated as the maximum within this function. + fun enforceRefreshRate(activity: Activity, sixtyHz: Boolean = false) { + if (Build.VERSION.SDK_INT < Build.VERSION_CODES.R) { + return + } + + val display = activity.display + val window = activity.window + + display?.let { + // Get all supported modes and find the one with the highest refresh rate + val supportedModes = it.supportedModes + val maxRefreshRate = supportedModes.maxByOrNull { mode -> mode.refreshRate } + + if (maxRefreshRate == null) { + return + } + + var newModeId: Int? + if (sixtyHz) { + newModeId = supportedModes.firstOrNull { mode -> mode.refreshRate == 60f }?.modeId + } else { + // Set the preferred display mode to the one with the highest refresh rate + newModeId = maxRefreshRate.modeId + } + + if (newModeId == null) { + return + } + + window.attributes.preferredDisplayModeId = newModeId + } + } +} \ No newline at end of file diff --git a/src/android/app/src/main/java/org/citra/citra_emu/utils/RemovableStorageHelper.kt b/src/android/app/src/main/java/org/citra/citra_emu/utils/RemovableStorageHelper.kt new file mode 100644 index 000000000..82c4b9ffd --- /dev/null +++ b/src/android/app/src/main/java/org/citra/citra_emu/utils/RemovableStorageHelper.kt @@ -0,0 +1,31 @@ +// Copyright Citra Emulator Project / Azahar Emulator Project +// Licensed under GPLv2 or any later version +// Refer to the license.txt file included. + +package org.citra.citra_emu.utils + +import org.citra.citra_emu.utils.BuildUtil +import java.io.File + +object RemovableStorageHelper { + // This really shouldn't be necessary, but the Android API seemingly + // doesn't have a way of doing this? + fun getRemovableStoragePath(idString: String): String? { + BuildUtil.assertNotGooglePlay() + + // On certain Android flavours the external storage mount location can + // vary, so add extra cases here if we discover them. + val possibleMountPaths = listOf("/mnt/media_rw/$idString", "/storage/$idString") + + for (mountPath in possibleMountPaths) { + val pathFile = File(mountPath); + if (pathFile.exists()) { + // TODO: Cache which mount location is being used for the remainder of the + // session, as it should never change. -OS + return pathFile.absolutePath + } + } + + return null + } +} diff --git a/src/android/app/src/main/java/org/citra/citra_emu/viewmodel/CompressProgressDialogViewModel.kt b/src/android/app/src/main/java/org/citra/citra_emu/viewmodel/CompressProgressDialogViewModel.kt new file mode 100644 index 000000000..7a6e71e52 --- /dev/null +++ b/src/android/app/src/main/java/org/citra/citra_emu/viewmodel/CompressProgressDialogViewModel.kt @@ -0,0 +1,33 @@ +// Copyright Citra Emulator Project / Azahar Emulator Project +// Licensed under GPLv2 or any later version +// Refer to the license.txt file included. + +package org.citra.citra_emu.viewmodel + +import androidx.lifecycle.ViewModel +import kotlinx.coroutines.flow.MutableStateFlow +import kotlinx.coroutines.flow.asStateFlow + +object CompressProgressDialogViewModel: ViewModel() { + private val _progress = MutableStateFlow(0) + val progress = _progress.asStateFlow() + + private val _total = MutableStateFlow(0) + val total = _total.asStateFlow() + + private val _message = MutableStateFlow("") + val message = _message.asStateFlow() + + fun update(totalBytes: Long, currentBytes: Long) { + val percent = ((currentBytes * 100L) / totalBytes).coerceIn(0L, 100L).toInt() + _total.value = 100 + _progress.value = percent + _message.value = "" + } + + fun reset() { + _progress.value = 0 + _total.value = 0 + _message.value = "" + } +} \ No newline at end of file diff --git a/src/android/app/src/main/jni/config.cpp b/src/android/app/src/main/jni/config.cpp index 1659dc3d6..6d310fea6 100644 --- a/src/android/app/src/main/jni/config.cpp +++ b/src/android/app/src/main/jni/config.cpp @@ -175,7 +175,8 @@ void Config::ReadValues() { ReadSetting("Renderer", Settings::values.custom_second_layer_opacity); ReadSetting("Renderer", Settings::values.delay_game_render_thread_us); ReadSetting("Renderer", Settings::values.disable_right_eye_render); - + ReadSetting("Renderer", Settings::values.swap_eyes_3d); + ReadSetting("Renderer", Settings::values.render_3d_which_display); // Layout // Somewhat inelegant solution to ensure layout value is between 0 and 5 on read // since older config files may have other values @@ -262,6 +263,7 @@ void Config::ReadValues() { ReadSetting("System", Settings::values.plugin_loader_enabled); ReadSetting("System", Settings::values.allow_plugin_loader); ReadSetting("System", Settings::values.steps_per_hour); + ReadSetting("System", Settings::values.apply_region_free_patch); // Camera using namespace Service::CAM; diff --git a/src/android/app/src/main/jni/default_ini.h b/src/android/app/src/main/jni/default_ini.h index 26688a708..08eaf3283 100644 --- a/src/android/app/src/main/jni/default_ini.h +++ b/src/android/app/src/main/jni/default_ini.h @@ -170,13 +170,23 @@ bg_green = custom_second_layer_opacity = # Whether and how Stereoscopic 3D should be rendered -# 0 (default): Off, 1: Side by Side, 2: Reverse Side by Side, 3: Anaglyph, 4: Interlaced, 5: Reverse Interlaced, 6: Cardboard VR +# 0: Off, 1: Half Width Side by Side, 2 (default): Full Width Side by Side, 3: Anaglyph, 4: Interlaced, 5: Reverse Interlaced, 6: Cardboard VR +# 0 is no longer supported in the interface, as using render_3d_which_display = 0 has the same effect, but supported here for backwards compatibility render_3d = # Change 3D Intensity # 0 - 255: Intensity. 0 (default) factor_3d = +# Swap Eyes in 3d +# true: Swap eyes, false (default): Do not swap eyes +swap_eyes_3d = + +# Which Display to render 3d mode to +# 0 (default) - None. Equivalent to render_3d=0 +# 1: Both, 2: Primary Only, 3: Secondary Only +render_3d_which_display = + # The name of the post processing shader to apply. # Loaded from shaders if render_3d is off or side by side. pp_shader_name = @@ -413,6 +423,11 @@ steps_per_hour = plugin_loader = allow_plugin_loader = +# Apply region free patch to installed applications +# Patches the region of installed applications to be region free, so that they always appear on the home menu. +# 0: Disabled, 1 (default): Enabled +apply_region_free_patch = + [Camera] # Which camera engine to use for the right outer camera # blank: a dummy camera that always returns black image diff --git a/src/android/app/src/main/jni/game_info.cpp b/src/android/app/src/main/jni/game_info.cpp index 99ebfd3ae..7ff043fff 100644 --- a/src/android/app/src/main/jni/game_info.cpp +++ b/src/android/app/src/main/jni/game_info.cpp @@ -25,6 +25,7 @@ struct GameInfoData { bool loaded = false; bool is_encrypted = false; std::string file_type = ""; + bool is_insertable = false; }; GameInfoData* GetNewGameInfoData(const std::string& path) { @@ -89,6 +90,7 @@ GameInfoData* GetNewGameInfoData(const std::string& path) { gid->is_encrypted = is_encrypted; gid->title_id = program_id; gid->file_type = Loader::GetFileTypeString(loader->GetFileType(), loader->IsFileCompressed()); + gid->is_insertable = loader->GetFileType() == Loader::FileType::CCI; return gid; } @@ -222,7 +224,7 @@ jboolean Java_org_citra_citra_1emu_model_GameInfo_getIsVisibleSystemTitle(JNIEnv return false; } - return smdh->flags & Loader::SMDH::Flags::Visible; + return smdh->flags.visible; } jstring Java_org_citra_citra_1emu_model_GameInfo_getFileType(JNIEnv* env, jobject obj) { @@ -230,4 +232,7 @@ jstring Java_org_citra_citra_1emu_model_GameInfo_getFileType(JNIEnv* env, jobjec return ToJString(env, file_type); } +jboolean Java_org_citra_citra_1emu_model_GameInfo_getIsInsertable(JNIEnv* env, jobject obj) { + return GetPointer(env, obj)->is_insertable; +} } diff --git a/src/android/app/src/main/jni/id_cache.cpp b/src/android/app/src/main/jni/id_cache.cpp index 8bc0f976e..d7d4a109a 100644 --- a/src/android/app/src/main/jni/id_cache.cpp +++ b/src/android/app/src/main/jni/id_cache.cpp @@ -1,4 +1,4 @@ -// Copyright 2019 Citra Emulator Project +// Copyright Citra Emulator Project / Azahar Emulator Project // Licensed under GPLv2 or any later version // Refer to the license.txt file included. @@ -40,6 +40,7 @@ static jfieldID s_game_info_pointer; static jclass s_disk_cache_progress_class; static jmethodID s_disk_cache_load_progress; +static jmethodID s_compress_progress_method; static std::unordered_map s_java_load_callback_stages; static jclass s_cia_install_helper_class; @@ -131,6 +132,10 @@ jmethodID GetDiskCacheLoadProgress() { return s_disk_cache_load_progress; } +jmethodID GetCompressProgressMethod() { + return s_compress_progress_method; +} + jobject GetJavaLoadCallbackStage(VideoCore::LoadCallbackStage stage) { const auto it = s_java_load_callback_stages.find(stage); ASSERT_MSG(it != s_java_load_callback_stages.end(), "Invalid LoadCallbackStage: {}", stage); @@ -205,6 +210,8 @@ jint JNI_OnLoad(JavaVM* vm, void* reserved) { s_disk_cache_load_progress = env->GetStaticMethodID( s_disk_cache_progress_class, "loadProgress", "(Lorg/citra/citra_emu/utils/DiskShaderCacheProgress$LoadCallbackStage;II)V"); + s_compress_progress_method = + env->GetStaticMethodID(s_native_library_class, "onCompressProgress", "(JJ)V"); // Initialize LoadCallbackStage map const auto to_java_load_callback_stage = [env, load_callback_stage_class](const std::string& stage) { diff --git a/src/android/app/src/main/jni/id_cache.h b/src/android/app/src/main/jni/id_cache.h index 71a1cb67c..d7aeb8074 100644 --- a/src/android/app/src/main/jni/id_cache.h +++ b/src/android/app/src/main/jni/id_cache.h @@ -1,4 +1,4 @@ -// Copyright 2019 Citra Emulator Project +// Copyright Citra Emulator Project / Azahar Emulator Project // Licensed under GPLv2 or any later version // Refer to the license.txt file included. @@ -40,6 +40,7 @@ jfieldID GetGameInfoPointer(); jclass GetDiskCacheProgressClass(); jmethodID GetDiskCacheLoadProgress(); +jmethodID GetCompressProgressMethod(); jobject GetJavaLoadCallbackStage(VideoCore::LoadCallbackStage stage); jclass GetCiaInstallHelperClass(); diff --git a/src/android/app/src/main/jni/native.cpp b/src/android/app/src/main/jni/native.cpp index a2880d6dc..779163cfc 100644 --- a/src/android/app/src/main/jni/native.cpp +++ b/src/android/app/src/main/jni/native.cpp @@ -34,10 +34,12 @@ #include "common/scope_exit.h" #include "common/settings.h" #include "common/string_util.h" +#include "common/zstd_compression.h" #include "core/core.h" #include "core/frontend/applets/default_applets.h" #include "core/frontend/camera/factory.h" #include "core/hle/service/am/am.h" +#include "core/hle/service/fs/archive.h" #include "core/hle/service/nfc/nfc.h" #include "core/hw/unique_data.h" #include "core/loader/loader.h" @@ -74,6 +76,17 @@ namespace { ANativeWindow* s_surface; ANativeWindow* s_secondary_surface; +enum class CompressionStatus : jint { + Success = 0, + Compress_Unsupported = 1, + Compress_AlreadyCompressed = 2, + Compress_Failed = 3, + Decompress_Unsupported = 4, + Decompress_NotCompressed = 5, + Decompress_Failed = 6, + Installed_Application = 7, +}; + std::shared_ptr vulkan_library{}; std::unique_ptr window; std::unique_ptr secondary_window; @@ -88,6 +101,8 @@ std::mutex paused_mutex; std::mutex running_mutex; std::condition_variable running_cv; +std::string inserted_cartridge; + } // Anonymous namespace static jobject ToJavaCoreError(Core::System::ResultStatus result) { @@ -95,6 +110,7 @@ static jobject ToJavaCoreError(Core::System::ResultStatus result) { {Core::System::ResultStatus::ErrorSystemFiles, "ErrorSystemFiles"}, {Core::System::ResultStatus::ErrorSavestate, "ErrorSavestate"}, {Core::System::ResultStatus::ErrorArticDisconnected, "ErrorArticDisconnected"}, + {Core::System::ResultStatus::ErrorN3DSApplication, "ErrorN3DSApplication"}, {Core::System::ResultStatus::ErrorUnknown, "ErrorUnknown"}, }; @@ -134,7 +150,10 @@ static void TryShutdown() { secondary_window->DoneCurrent(); } - Core::System::GetInstance().Shutdown(); + Core::System& system{Core::System::GetInstance()}; + + system.Shutdown(); + system.EjectCartridge(); window.reset(); if (secondary_window) { @@ -165,6 +184,10 @@ static Core::System::ResultStatus RunCitra(const std::string& filepath) { Core::System& system{Core::System::GetInstance()}; + if (!inserted_cartridge.empty()) { + system.InsertCartridge(inserted_cartridge); + } + const auto graphics_api = Settings::values.graphics_api.GetValue(); EGLContext* shared_context; switch (graphics_api) { @@ -463,6 +486,163 @@ jstring Java_org_citra_citra_1emu_NativeLibrary_getHomeMenuPath(JNIEnv* env, return ToJString(env, ""); } +static CompressionStatus GetCompressFileInfo(Loader::AppLoader::CompressFileInfo& out_info, + size_t& out_frame_size, const std::string& filepath, + bool compress) { + + if (Service::FS::IsInstalledApplication(filepath)) { + return CompressionStatus::Installed_Application; + } + + Loader::AppLoader::CompressFileInfo compress_info{}; + compress_info.is_supported = false; + size_t frame_size{}; + auto loader = Loader::GetLoader(filepath); + if (loader) { + compress_info = loader->GetCompressFileInfo(); + frame_size = FileUtil::Z3DSWriteIOFile::DEFAULT_FRAME_SIZE; + } else { + bool is_compressed = false; + if (Service::AM::CheckCIAToInstall(filepath, is_compressed, compress ? true : false) == + Service::AM::InstallStatus::Success) { + compress_info.is_supported = true; + compress_info.is_compressed = is_compressed; + compress_info.recommended_compressed_extension = "zcia"; + compress_info.recommended_uncompressed_extension = "cia"; + compress_info.underlying_magic = std::array({'C', 'I', 'A', '\0'}); + frame_size = FileUtil::Z3DSWriteIOFile::DEFAULT_CIA_FRAME_SIZE; + if (compress) { + auto meta_info = Service::AM::GetCIAInfos(filepath); + if (meta_info.Succeeded()) { + const auto& meta_info_val = meta_info.Unwrap(); + std::vector value(sizeof(Service::AM::TitleInfo)); + memcpy(value.data(), &meta_info_val.first, sizeof(Service::AM::TitleInfo)); + compress_info.default_metadata.emplace("titleinfo", value); + if (meta_info_val.second) { + value.resize(sizeof(Loader::SMDH)); + memcpy(value.data(), meta_info_val.second.get(), sizeof(Loader::SMDH)); + compress_info.default_metadata.emplace("smdh", value); + } + } + } + } + } + + if (!compress_info.is_supported) { + LOG_ERROR(Frontend, + "Error {} file {}, the selected file is not a compatible 3DS ROM format or is " + "encrypted.", + compress ? "compressing" : "decompressing", filepath); + return compress ? CompressionStatus::Compress_Unsupported + : CompressionStatus::Decompress_Unsupported; + } + if (compress_info.is_compressed && compress) { + LOG_ERROR(Frontend, "Error compressing file {}, the selected file is already compressed", + filepath); + return CompressionStatus::Compress_AlreadyCompressed; + } + if (!compress_info.is_compressed && !compress) { + LOG_ERROR(Frontend, + "Error decompressing file {}, the selected file is already decompressed", + filepath); + return CompressionStatus::Decompress_NotCompressed; + } + + out_info = compress_info; + out_frame_size = frame_size; + return CompressionStatus::Success; +} + +jint Java_org_citra_citra_1emu_NativeLibrary_compressFileNative(JNIEnv* env, jobject obj, + jstring j_input_path, + jstring j_output_path) { + const std::string input_path = GetJString(env, j_input_path); + const std::string output_path = GetJString(env, j_output_path); + + Loader::AppLoader::CompressFileInfo compress_info{}; + size_t frame_size{}; + CompressionStatus stat = GetCompressFileInfo(compress_info, frame_size, input_path, true); + if (stat != CompressionStatus::Success) { + return static_cast(stat); + } + + auto progress = [](std::size_t processed, std::size_t total) { + JNIEnv* env = IDCache::GetEnvForThread(); + env->CallStaticVoidMethod(IDCache::GetNativeLibraryClass(), + IDCache::GetCompressProgressMethod(), static_cast(total), + static_cast(processed)); + }; + + bool success = + FileUtil::CompressZ3DSFile(input_path, output_path, compress_info.underlying_magic, + frame_size, progress, compress_info.default_metadata); + if (!success) { + FileUtil::Delete(output_path); + return static_cast(CompressionStatus::Compress_Failed); + } + + return static_cast(CompressionStatus::Success); +} + +jint Java_org_citra_citra_1emu_NativeLibrary_decompressFileNative(JNIEnv* env, jobject obj, + jstring j_input_path, + jstring j_output_path) { + const std::string input_path = GetJString(env, j_input_path); + const std::string output_path = GetJString(env, j_output_path); + + Loader::AppLoader::CompressFileInfo compress_info{}; + size_t frame_size{}; + CompressionStatus stat = GetCompressFileInfo(compress_info, frame_size, input_path, false); + if (stat != CompressionStatus::Success) { + return static_cast(stat); + } + + auto progress = [](std::size_t processed, std::size_t total) { + JNIEnv* env = IDCache::GetEnvForThread(); + env->CallStaticVoidMethod(IDCache::GetNativeLibraryClass(), + IDCache::GetCompressProgressMethod(), static_cast(total), + static_cast(processed)); + }; + + bool success = FileUtil::DeCompressZ3DSFile(input_path, output_path, progress); + if (!success) { + FileUtil::Delete(output_path); + return static_cast(CompressionStatus::Decompress_Failed); + } + + return static_cast(CompressionStatus::Success); +} + +jstring Java_org_citra_citra_1emu_NativeLibrary_getRecommendedExtension( + JNIEnv* env, jobject obj, jstring j_input_path, jboolean j_should_compress) { + const std::string input_path = GetJString(env, j_input_path); + + std::string compressed_ext; + std::string uncompressed_ext; + + auto loader = Loader::GetLoader(input_path); + if (loader) { + auto compress_info = loader->GetCompressFileInfo(); + if (compress_info.is_supported) { + compressed_ext = compress_info.recommended_compressed_extension; + uncompressed_ext = compress_info.recommended_uncompressed_extension; + } + } else { + bool is_compressed = false; + if (Service::AM::CheckCIAToInstall(input_path, is_compressed, true) == + Service::AM::InstallStatus::Success) { + compressed_ext = "zcia"; + uncompressed_ext = "cia"; + } + } + + if (compressed_ext.empty()) { + return env->NewStringUTF(""); + } + + return env->NewStringUTF(j_should_compress ? compressed_ext.c_str() : uncompressed_ext.c_str()); +} + void Java_org_citra_citra_1emu_NativeLibrary_setUserDirectory(JNIEnv* env, [[maybe_unused]] jobject obj, jstring j_directory) { @@ -919,4 +1099,9 @@ jlong Java_org_citra_citra_1emu_NativeLibrary_playTimeManagerGetCurrentTitleId(J return ptm_current_title_id; } +void Java_org_citra_citra_1emu_NativeLibrary_setInsertedCartridge(JNIEnv* env, jobject obj, + jstring path) { + inserted_cartridge = GetJString(env, path); +} + } // extern "C" diff --git a/src/android/app/src/main/res/drawable/cartridge.png b/src/android/app/src/main/res/drawable/cartridge.png new file mode 100644 index 000000000..cb669ee29 Binary files /dev/null and b/src/android/app/src/main/res/drawable/cartridge.png differ diff --git a/src/android/app/src/main/res/layout/card_game.xml b/src/android/app/src/main/res/layout/card_game.xml index 85392a813..5b1d558ea 100644 --- a/src/android/app/src/main/res/layout/card_game.xml +++ b/src/android/app/src/main/res/layout/card_game.xml @@ -28,6 +28,16 @@ app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" /> + + @@ -120,12 +121,13 @@ @@ -179,6 +180,37 @@ android:contentDescription="@string/cheats" android:text="@string/cheats" /> + + + + + + + diff --git a/src/android/app/src/main/res/layout/dialog_compress_progress.xml b/src/android/app/src/main/res/layout/dialog_compress_progress.xml new file mode 100644 index 000000000..bdf8dd669 --- /dev/null +++ b/src/android/app/src/main/res/layout/dialog_compress_progress.xml @@ -0,0 +1,27 @@ + + + + + + + + diff --git a/src/android/app/src/main/res/values-b+ca+ES+valencia/strings.xml b/src/android/app/src/main/res/values-b+ca+ES+valencia/strings.xml index 0f0e3e978..09200b1a6 100644 --- a/src/android/app/src/main/res/values-b+ca+ES+valencia/strings.xml +++ b/src/android/app/src/main/res/values-b+ca+ES+valencia/strings.xml @@ -122,8 +122,6 @@ Pulsa o mou un botó/palanca. Assignació de botons Prem o mou una entrada per enllaçar-la a %1$s. - Mou el joystick amunt o avall. - Mou el joystick a esquerra o dreta. HOME Intercanviar Pantalles Turbo @@ -217,21 +215,18 @@ Usa SPIR-V en vez de GLSL per a emetre el fragment de ombrejador utilitzat per a emular PICA. Desativar l\'optimitzador SPIR-V Desactiva la passada d\'optimització SPIR-V reduint considerablement el quequeig i afectant poc el rendiment. - Activar compilació de ombrejadors asíncrona Compila els ombrejats en segón pla per a reduir les aturades durant la partida. S\'esperen errors gràfics temporals quan estigue activat. Filtre Linear Activa el filtre linear, que fa que els gràfics del joc es vegen més suaus. Filtre de Textures Millora l\'aspecte visual de les aplicacions aplicant un filtre a les textures. Els filtres compatibles són Anime4K, Ultrafast, Bicubic, ScaleForce, xBRZ Freescale i MMPX. - Endarrerir fil de renderitzat del joc Retarda el fil de renderitzat del joc en enviar dades a la GPU. Ajuda a solucionar problemes de rendiment en les (poques) aplicacions amb velocitats de fotogrames dinàmiques. Avançat Mostreig de Textures Sobreescriu el filtre de mostreig usat en jocs. Pot ser útil en uns certs casos de jocs amb baix rendiment en pujar la resolució. Si no estàs segur, possa\'l en Controlat per Joc. Multiplicació Precisa Usa multiplicacions més precises en els ombrejos de Hardware, que podrien arreglar uns certs problemes gràfics. Quan s\'active, el rendiment es reduirà. - Activar Emulació Asíncrona de la GPU Usa un fil separat per a emular la GPU de manera asíncrona. Quan s\'active, el rendiment millorarà. Límit de velocitat Quan s\'active, la velocitat d\'emulació estarà limitada a un percentatge determinat de la velocitat normal. Quan es desactive, la velocitat d\'emulació no tindrà límit i la tecla d\'accés ràpid de velocitat turbo no funcionarà. @@ -286,7 +281,6 @@ S\'esperen errors gràfics temporals quan estigue activat. Volum Extensió d\'Àudio Estén l\'àudio per a reduir les aturades. Quan s\'active, la latència d\'àudio s\'incrementarà i reduirà un poc el rendiment. - Activar àudio en temps real Ajusta la velocitat de reproducció d\'àudio per a compensar les caigudes en la velocitat d\'emulació de quadres. Això significa que l\'àudio es reproduirà a velocitat completa fins i tot quan la velocitat de quadres del joc siga baixa. Pot causar problemes de desincronització d\'àudio. Dispositiu d\'entrada d\'àudio Mode d\'eixida de l\'àudio @@ -298,12 +292,9 @@ S\'esperen errors gràfics temporals quan estigue activat. Usa el hardware per a emular els ombrejadors de 3DS. Quan s\'active, el rendiment millorarà notablement. Velocitat de rellotge de la CPU Activar Sincronització Vertical - Sincronitza els quadres per segon del joc amb la taxa de refresc del teu dispositiu. Renderitzador de depuració Arxiva informació addicional gràfica relacionada amb la depuració. Quan està activada, el rendiment dels jocs serà reduït considerablement - Guardar l\'eixida del registre en cada missatge Envia immediatament el registre de depuració a un arxiu. Usa-ho si Azahar falla i es talla l\'eixida del registre. - Inici diferit amb mòduls LLE Retarda l\'inici de l\'aplicació quan els mòduls LLE estan habilitats. Operacions asíncrones deterministes Fa que les operacions asíncrones siguen deterministes per a la depuració. Habilitar esta opció pot causar bloquejos. @@ -523,7 +514,6 @@ S\'esperen errors gràfics temporals quan estigue activat. Error Fatal Ha ocorregut un error fatal. Mira el registre per a més detalls.\nSeguir amb l\'emulació podria resultar en diversos penges i problemes. Aplicació cifrada no suportada - Preparant ombrejadors Construint ombrejadors @@ -550,35 +540,11 @@ S\'esperen errors gràfics temporals quan estigue activat. ID: Fitxer: Tipus: - Mostrar informació de rendiment Informació de rendiment Activar informació de rendiment Configura la informació de rendiment - Mostrar FPS - Mostra els fotogrames per segon actuals. - Mostrar duració de fotogrames - Mostra la duració actual de cada fotograma. - Mostrar velocitat - Mostra el percentatge de velocitat d\'emulació actual. - Mostrar l\'ús de memòria de l\'aplicació - Mostra la quantitat de memòria RAM que esta usant l\'emulador. - Mostrar memòria disponible - Mostra la quantitat de memòria RAM que esta disponible. - Mostrar la temperatura de la bateria - Mostra la temperatura actual de la bateria en Celsius i Fahrenheit. - Posició de la informació - Tria on la informació de rendiment serà mostrada en la pantalla. - Dalt a l\'esquerra - Dalt a la dreta - Avall a l\'esquerra - Avall a la dreta - Dalt al centre - Avall al centre - Fons de la informació - Agrega un fons darrere de la informació per a fer-la més llegible. - Trucs Afegir trucs @@ -681,7 +647,6 @@ S\'esperen errors gràfics temporals quan estigue activat. De costat a costat - De costat a costat invers Anàglifo Entrellaçat Entrellaçat invers @@ -870,4 +835,4 @@ S\'esperen errors gràfics temporals quan estigue activat. Guardat ràpid - %1$tF %1$tR Guardat ràpid no disponible. - + diff --git a/src/android/app/src/main/res/values-b+da+DK/strings.xml b/src/android/app/src/main/res/values-b+da+DK/strings.xml index 3525cfb62..793f306ad 100644 --- a/src/android/app/src/main/res/values-b+da+DK/strings.xml +++ b/src/android/app/src/main/res/values-b+da+DK/strings.xml @@ -67,10 +67,14 @@ Giv tilladelse Vil du droppe at give tilladelse til meddelelser? Azahar vil ikke være i stand til at give dig meddelelse om vigtige oplysninger. + Manglende tilladelser + Azahar kræver tilladelse til at administrere filer på denne enhed for at kunne gemme og administrere dens data.\n\nGiv venligst tilladelsen \"Filsystem\", før du fortsætter. Kamera Giv kameraet tilladelse nedenfor til at efterligne 3DS-kameraet. Mikrofon Giv mikrofonen tilladelse nedenfor til at efterligne 3DS-mikrofonen. + Filsystem + Giv filsystemet tilladelse nedenfor for at tillade Azahar at gemme filer. Tilladelse nægtet Vil du droppe at vælge applikationsmappen? Software vil ikke blive vist på applikationslisten, hvis en mappe ikke er valgt. @@ -90,6 +94,9 @@ Du kan ikke springe opsætningen af ​​brugermappen over Dette trin er påkrævet for at Azahar kan fungere. Vælg en mappe og så kan du fortsætte. Du har mistet skrivetilladelse i din brugerdata mappe, hvor gemte tilstande og anden information er gemt. Dette kan ske efter en app- eller Android-opdatering. Vælg venligst mappen for at give tilladelse igen, så du kan fortsætte. + Ugyldigt valg + Valget af brugermappe var ugyldigt.\nVælg venligst brugermappen igen, og sørg for at navigere til den fra roden af ​​din enheds lager. + Azahar har mistet tilladelsen til at administrere filer på denne enhed. Dette kan ske efter nogle app- eller Android-opdateringer. Giv venligst denne tilladelse igen på den næste skærm for at fortsætte med at bruge appen. Temaindstillinger Konfigurer dine temaindstillinger for Azahar. Indstil tema @@ -122,8 +129,8 @@ Tryk på eller flyt et input. Inputbinding Tryk på eller flyt et input for at binde det til %1$s. - Bevæg joysticket op eller ned. - Bevæg joysticket til venstre eller højre + Bevæg joysticket ned + Bevæg joysticket til højre HOME Byt skærme Turbo @@ -162,6 +169,8 @@ Brugernavn Ny 3DS tilstand Brug LLE Applets (hvis installeret) + Anvend regionfri programrettelse på installerede programmer + Opdaterer regionen for installerede programmer, så de altid vises i startmenuen. Aktiver nødvendige LLE moduler til onlinefunktioner (hvis installeret) Aktiverer de LLE moduler, der kræves til online multiplayer, eShop-adgang osv. Ur @@ -193,6 +202,10 @@ Advarsel om uoverensstemmelse i region Landeindstillingen er ikke gyldig for det valgte emulerede område. Landeindstillingen er ikke gyldig for den aktuelle forbundne konsol. + Lager + Komprimer installeret CIA-indhold + Komprimerer indholdet af CIA-filer, når de installeres på det emulerede SD-kort. Påvirker kun CIA-indhold, der installeres, når indstillingen er aktiveret. + Indre kamera Ydre venstre kamera @@ -219,7 +232,7 @@ Aktiverer lineær filtrering, hvilket får spillets grafik til at se mere jævnt ud. Teksturfilter Forbedrer det visuelle i applikationer ved at anvende et filter på teksturer. De understøttede filtre er Anime4K Ultrafast, Bicubic, ScaleForce, xBRZ freescale og MMPX. - Forsinket spillets renderingstråd + Forsink spillets renderingstråd Forsink spillets remderingstråd, når den sender data til GPU\'en. Hjælper med ydeevneproblemer i de (meget få) applikationer med dynamiske framerates. Avanceret Tekstur sampling @@ -232,6 +245,8 @@ Når aktiveret, vil emuleringshastigheden være begrænset til en specificeret procentdel af normal hastighed. Hvis deaktiveret, vil emuleringshastigheden være ubegrænset, og genvejstasten for turbohastighed vil ikke fungere. Begræns hastighedsprocent Angiver procentdelen emuleringshastigheden skal begrænses til. Med standardværdien på 100% vil emulering være begrænset til normal hastighed. Værdier højere eller lavere vil øge eller mindske hastighedsgrænsen. + Skjul 3DS-afbildninger fra Android + Forhindre at Android indekserer og viser billeder fra 3DS-kamera, skærmbilleder og brugerdefinerede teksturer i galleriet. Din enhed skal muligvis genstartes, efter at du har ændret denne indstilling, for at den træder i kraft. Turbohastighedsgrænse Grænse for emuleringens hastighed bruges, når turbo-genvejstasten er aktiv. Anvend området ved frontkamera @@ -253,10 +268,18 @@ Advarsel: Ændringer i disse indstillinger vil gøre emuleringen langsommere Stereoskopi Stereoskopisk 3D-tilstand + Vælg den stereoskopiske 3D-tilstand til 3D-gengivelse. Side om side-tilstande er mest almindelige i moderne brug. Anaglyf- og interlaced-tilstande vil altid gælde for alle tilsluttede skærme. Dybde Angiver værdien af ​​3D-skyderen. Denne bør sættes højere end 0 %, når stereoskopisk 3D-tilstand er aktiveret.\nBemærk: Dybdeværdier over 100 % er ikke muligt på rigtig hardware og kan forårsage grafiske problemer Deaktiver rendering af højre øje Forbedrer ydeevnen betydeligt i nogle applikationer, men kan forårsage flimren i andre. + Skift øjne + Bytter om på hvilket øje, der skal se hvilken side. Kombineret med side om side-tilstanden er det muligt at se 3D ved at krydse øjnene! + Gengiv stereoskopisk 3D + Om stereoskopisk 3D skal aktiveres, og på hvilke skærme. Indstillingerne for en enkel skærm er kun relevant, når flere skærme er tilsluttet. + Til (alle skærme) + Til (kun primær skærm) + Til (kun sekundær skærm) Cardboard VR Cardboard skærmstørrelse Skalerer skærmen til en procentdel af dens oprindelige størrelse. @@ -293,12 +316,12 @@ Bruger hardware til at efterligne 3DS shaders. Når det er aktiveret, vil spillets ydeevne blive væsentligt forbedret. CPU Clock hastighed Aktiver V-Sync - Synkroniserer spillets frame rate med opdateringshastigheden på din enhed. + Synkroniserer spillets billedhastighed med din enheds opdateringshastighed. Kan forårsage yderligere inputforsinkelse, men kan reducere tearing i nogle tilfælde. Fejlsøg renderingen Log yderligere grafikrelaterede fejlfindingsoplysninger. Når det er aktiveret, vil spillets ydeevne blive væsentligt reduceret. - Tøm loggen for alle beskeder + Tøm loggen ved hver besked Overfør øjeblikkeligt fejlretningsloggen til fil. Brug dette, hvis Azahar går ned, og logoutputtet afbrydes. - Forsinket start med LLE moduler + Forsink start med LLE moduler Forsinker starten af ​​appen, når LLE moduler er aktiveret. Deterministiske asynkrone operationer Gør asynkrone operationer deterministiske for fejlretning. Aktivering af dette kan forårsage at programmet fryser fast. @@ -396,18 +419,24 @@ Konfigurer kontroller Rediger layout Færdig + Knap flytning + Hold den oprindeligt trykkede knap nede + Hold den aktuelt nede knap nede + Hold den oprindelige og den aktuelt nedtrykkede knap nede Skift kontrol Juster skala Global skala Nulstil alle Juster opacitet Relativt stick centrum - D-Pad glidning + D-Pad flytning Åbn Indstillinger Åbn snydekoder Billedformat Landskab skærmlayout Portræt skærmlayout + Layout af sekundær skærm + Layoutet, der bruges af en tilsluttet sekundær skærm, kablet eller trådløs (Chromecast, Miracast) Stor skærm Portræt Enkelt skærm @@ -415,7 +444,15 @@ Hybrid skærme Original Standard + Systemstandard (spejl) Brugerdefineret layout + Baggrundsfarve + Farven, der vises bag skærmene under emulering, repræsenteret som en RGB-værdi. + Rød + Grøn + Blå + Brugerdefineret layout skærmopacitet for anden skærm + Opaciteten af ​​den anden 3DS-skærm, når der bruges et brugerdefineret skærmlayout. Nyttig, hvis den anden skærm skal placeres oven på den første skærm. Position for lille skærm Hvor skal den lille skærm vises i forhold til den store i storskærmslayout? Øverst til højre @@ -511,6 +548,8 @@ Fatal fejl Der opstod en fatal fejl. Kontroller loggen for detaljer.\nFortsat emulering kan resultere i nedbrud og fejl. Ikke understøttet krypteret applikation + Ugyldig systemtilstand + Nye 3DS-eksklusive applikationer kan ikke indlæses uden at aktivere den nye 3DS-tilstand. Forberedelse af shaders @@ -535,33 +574,39 @@ Opret genvej Genvejsnavnet må ikke være tomt Stræk for at tilpasse billedet + ID: + Fil: + Type: + Indsæt kassette + Udtag kassette + Vis ydelsesoverlejring Ydelsesoverlejring Aktivér ydelsesoverlejring Konfigurer, om ydelsesoverlejringen skal vises, og hvilke oplysninger der vises. - Vis FPS - Vis aktuelle billeder pr. sekund. - Vis billedtid - Vis aktuel billedtid. - Vis hastighed - Vis den aktuelle emuleringshastighed i procent. - Vis hukommelsesforbrug for app - Vis mængden af ​​RAM, der bruges af emulatoren. - Vis tilgængelig hukommelse - Vis mængden af ​​RAM, der er tilgængelig. - Vis batteritemperatur - Viser den aktuelle batteritemperatur i Celsius og Fahrenheit. - Position af overlejring - Vælg, hvor ydelsesoverlejringen skal vises på skærmen. - Øverst til venstre - Øverst til højre - Nederst til venstre - Nederst til højre - Midten øverst - Midten nederst - Overlejret baggrund - Tilføjer en baggrund bag overlejringen for lettere læsning. + Vis FPS + Vis aktuelle billeder pr. sekund. + Vis billedtid + Vis aktuel billedtid. + Vis hastighed + Vis den aktuelle emuleringshastighed i procent. + Vis hukommelsesforbrug for app + Vis mængden af ​​RAM, der bruges af emulatoren. + Vis tilgængelig hukommelse + Vis mængden af ​​RAM, der er tilgængelig. + Vis batteritemperatur + Viser den aktuelle batteritemperatur i Celsius og Fahrenheit. + Overlejret-position + Vælg, hvor performance-overlayet skal vises på skærmen. + Øverst til venstre + Øverst til højre + Nederst til venstre + Nederst til højre + Centreret top + Centreret bund + Overlejret baggrund + Tilføjer en baggrund bag det overlejrede for lettere læsning. Snyd @@ -665,7 +710,7 @@ Side om Side - Omvendt side om side + Side om side i fuld bredde Anaglyph Interlaced Omvendt interlaced @@ -854,4 +899,19 @@ Hurtig lagring - %1$tF %1$tR Ingen hurtig lagring tilgængelig. + + Komprimer + Komprimerer… + Dekomprimer + Dekomprimerer… + Komprimering gennemført. + Komprimering understøttes ikke for denne fil. + Filen er allerede komprimeret. + Komprimeringen mislykkedes. + Dekomprimeringen er gennemført. + Dekomprimering understøttes ikke for denne fil. + Filen er ikke komprimeret. + Dekomprimeringen mislykkedes. + Allerede installerede programmer kan ikke komprimeres eller dekomprimeres. + diff --git a/src/android/app/src/main/res/values-b+es+ES/strings.xml b/src/android/app/src/main/res/values-b+es+ES/strings.xml index f2232f9f9..297c0c39f 100644 --- a/src/android/app/src/main/res/values-b+es+ES/strings.xml +++ b/src/android/app/src/main/res/values-b+es+ES/strings.xml @@ -67,10 +67,13 @@ Conceder permiso ¿Saltarse la concesión del permiso de notificaciones? Azahar no podrá notificarte sobre información importante. + Falta Permisos Cámara Concede el permiso de cámara debajo para emular la cámara de la 3DS. Micrófono Concede el permiso de micrófono debajo para emular el micrófono de la 3DS. + Sistema de archivos + Concede el permiso de sistema de archivos debajo para permitir que Azahar almacene archivos. Permiso denegado ¿Saltarse la selección de la carpeta de aplicaciones? Nada se mostrará en la lista de aplicaciones si no se selecciona una carpeta. @@ -90,6 +93,7 @@ No puedes saltarte el configuración de la carpeta de usuario Este paso es necesario para permitir que Azahar funcione. Por favor, seleccione un directorio y luego puede continuar. Has perdido los permisos de escritura en tu directorio de datos de usuario, donde se guardan las partidas guardadas y otra información. Esto puede ocurrir después de algunas actualizaciones de aplicaciones o de Android. Vuelve a seleccionar el directorio para recuperar los permisos y poder continuar. + Selección no válido Configuración de tema Configura tus preferencias de tema de Azahar. Establecer tema @@ -122,8 +126,8 @@ Pulsa o mueve un botón/palanca. Asignación de botones Pulsa o mueve un botón para asignarlo a %1$s. - Mueve el joystick arriba o abajo. - Mueve el joystick a izquierda o derecha. + Mueve el joystick abajo + Mueve el joystick a la derecha HOME Intercambiar Pantallas Turbo @@ -237,6 +241,7 @@ Se esperan fallos gráficos temporales cuando ésta esté activado. Cuando se active, la velocidad de emulación estará limitada a un porcentaje determinado de la velocidad normal. Cuando se desactive, la velocidad de emulación no tendrá límite y la tecla de acceso rápido de velocidad turbo no funcionará. Limitar porcentaje de velocidad Especifica el valor al que se limita la velocidad de emulación. Con el valor por defecto del 100%, la emulación se limitará a la velocidad normal. Los valores altos o altos incrementarán o reducirán el límite de velocidad. + Ocultar imágenes 3DS de Android Límite de Velocidad Turbo Límite de velocidad de emulación utilizado mientras la tecla de acceso rápido turbo está activa. Expandir al área de recorte @@ -262,6 +267,11 @@ Se esperan fallos gráficos temporales cuando ésta esté activado. Especifica el valor del regulador 3D. Debería estar puesto a más allá del 0% cuando el Modo 3D Estereoscópico está activado.\nNota: Los valores de profundidad superiores al 100 % no son posibles en hardware real y pueden causar problemas gráficos. Desactivar Renderizado de Ojo Derecho Mejora significativamente el rendimiento en algunas aplicaciones, pero puede causar parpadeo en otros. + Intercambiar Ojos + Renderizado 3D Estereoscópico + Activado (todas las pantallas) + Activado (solo pantalla principal) + Activado (solo pantalla secundaria) Cardboard VR Tamaño de la pantalla Cardboard Escala la pantalla a un porcentaje de su tamaño original. @@ -298,7 +308,6 @@ Se esperan fallos gráficos temporales cuando ésta esté activado. Usa el hardware para emular los sombreadores de 3DS. Cuando se active, el rendimiento mejorará notablemente. Velocidad de reloj de la CPU Activar Sincronización Vertical - Sincroniza los cuadros por segundo del juego con la tasa de refresco de tu dispositivo. Renderizador de depuración Archiva información adicional gráfica relacionada con la depuración. Cuando está activada, el rendimiento de los juegos será reducido considerablemente Limpiar la salida del registro en cada mensaje @@ -428,6 +437,12 @@ Se esperan fallos gráficos temporales cuando ésta esté activado. Por defecto Por defecto del sistema (espejo) Estilo personalizado + Color de fondo + Rojo + Verde + Azul + Opacidad personalizado de la segunda pantalla + La opacidad de la segunda pantalla 3DS al usar el pantalla personalizado. Útil si la segunda pantalla ésta posición en la parte superior de la primera pantalla. Posición Pantalla Pequeña ¿Dónde debería aparecer la pantalla pequeña en relación con la grande en Disposicion de Pantalla Grande? Arriba a la Derecha @@ -523,7 +538,7 @@ Se esperan fallos gráficos temporales cuando ésta esté activado. Error Fatal Ha ocurrido un error fatal. Mira el registro para más detalles.\nSeguir con la emulación podría resultar en diversos cuelgues y bugs. Aplicación encriptada no soportada - + Modo de sistema no válido Preparando shaders Construyendo shaders @@ -550,34 +565,36 @@ Se esperan fallos gráficos temporales cuando ésta esté activado. ID: Archivo: Tipo: + Insertar Cartucho + Expulsar Cartucho Mostrar información de rendimiento Información de rendimiento Activar información de rendimiento Configura la información de rendimiento - Mostrar FPS - Muestra los fotogramas por segundo actuales. - Mostrar duración de fotogramas - Muestra la duración actual de cada fotograma. - Mostrar velocidad - Muestra el porcentaje de velocidad de emulación actual. - Mostrar el uso de memoria de la aplicación - Muestra la cantidad de memoria RAM que esta usando el emulador. - Mostrar memoria disponible - Muestra la cantidad de memoria RAM que esta disponible. - Mostrar la temperatura de la batería - Muestra la temperatura actual de la batería en Celsius y Fahrenheit. - Posición de la información - Elige donde la información de rendimiento será mostrada en la pantalla. - Arriba a la izquierda - Arriba a la derecha - Abajo a la izquierda - Abajo a la derecha - Centro superior - Centro inferior - Fondo de la información - Agrega un fondo detrás de la información para hacerla más legible. + Mostrar FPS + Muestra los fotogramas por segundo actuales. + Mostrar duración de fotogramas + Muestra la duración actual de cada fotograma. + Mostrar velocidad + Muestra el porcentaje de velocidad de emulación actual. + Mostrar el uso de memoria de la aplicación + Muestra la cantidad de memoria RAM que esta usando el emulador. + Mostrar memoria disponible + Muestra la cantidad de memoria RAM que esta disponible. + Mostrar la temperatura de la batería + Muestra la temperatura actual de la batería en Celsius y Fahrenheit. + Posición de la información + Elegir donde el superposición de rendimiento esta mostrado en el pantalla + Arriba a la Izquierda + Arriba a la Derecha + Abajo a la Izquierda + Abajo a la Derecha + Centro Superior + Centro Inferior + Fondo de la información + Agrega un fondo detrás de la información para hacerla más legible. Trucos @@ -682,7 +699,7 @@ Se esperan fallos gráficos temporales cuando ésta esté activado. De lado a lado - De lado a lado inverso + De lado a lado ancho completo Anáglifo Entrelazado Entrelazado inverso @@ -871,4 +888,17 @@ Se esperan fallos gráficos temporales cuando ésta esté activado. Guardado rápido - %1$tF %1$tR Guardado rápido no disponible. - + + Comprimir + Compresando... + Descomprimir + Descomprimiendo… + Compresión completada con éxito. + Compresión no está soportado con este archivo. + Este archivo ya está comprimido. + Falló la compresión. + Descompresión completada con éxito. + Descompresión no está soportado con este archivo. + El archivo no está comprimido. + Falló la descompresión. + diff --git a/src/android/app/src/main/res/values-b+ja+JP/strings.xml b/src/android/app/src/main/res/values-b+ja+JP/strings.xml index 879f96568..5b9e3784f 100644 --- a/src/android/app/src/main/res/values-b+ja+JP/strings.xml +++ b/src/android/app/src/main/res/values-b+ja+JP/strings.xml @@ -9,7 +9,6 @@ MACアドレス MACアドレスを再生成 これを行うと、今のMACアドレスを新しいもので置き換えます。セットアップツールで実機からMACアドレスを吸い出した場合、これをするのは推奨しません。続行しますか? - 描写スレッドを遅延する GPUにデータを送信する間、ゲームの描写スレッドを遅延します。動的フレームレートである(ほんの一部の)アプリケーションでのパフォーマンスが向上します。 デバッグログを即座にファイルに書き込みます。Azaharがクラッシュしてログが途切れるときに有効にしてください。 その他 diff --git a/src/android/app/src/main/res/values-b+lt+LT/strings.xml b/src/android/app/src/main/res/values-b+lt+LT/strings.xml index 8a5875389..60aaee82a 100644 --- a/src/android/app/src/main/res/values-b+lt+LT/strings.xml +++ b/src/android/app/src/main/res/values-b+lt+LT/strings.xml @@ -61,7 +61,6 @@ Garsumas Garso ištempimas - Įjungti realaus laiko garsą Automatinis Sužinoti daugiau Uždaryti diff --git a/src/android/app/src/main/res/values-b+pl+PL/strings.xml b/src/android/app/src/main/res/values-b+pl+PL/strings.xml index 17a1fbbca..c8a192c92 100644 --- a/src/android/app/src/main/res/values-b+pl+PL/strings.xml +++ b/src/android/app/src/main/res/values-b+pl+PL/strings.xml @@ -67,10 +67,14 @@ Udzielenie zgody Pominąć udzielanie zgody na powiadomienie? Azahar nie będzie w stanie powiadomić cię o ważnych informacjach. + Brak uprawnień + Azahar wymaga uprawnień do zarządzania plikami na tym urządzeniu w celu przechowywania i zarządzania swoimi danymi. \n\nPrzed kontynuowaniem należy przyznać uprawnienia „System plików”. Kamera Udziel poniższych uprawnień kamery, aby emulować kamerę 3DS. Mikrofon Udziel poniższych uprawnień mikrofonu, aby emulować mikrofon 3DS. + System plików + Przyznaje poniższe uprawnienia systemu plików, aby umożliwić Azahar przechowywanie plików. Odmowa zezwolenia Pominąć wybór folderu z aplikacjami? Oprogramowania nie będą wyświetlane na liście aplikacji, jeśli nie wybrano folderu. @@ -90,6 +94,9 @@ Nie można pominąć konfiguracji folderu użytkownika. Ten krok jest wymagany, aby umożliwić działanie Azahar. Wybierz katalog, a następnie możesz kontynuować. Utraciłeś uprawnienia do zapisu w katalogu danych użytkownika, w którym przechowywane są zapisy i inne informacje. Może się to zdarzyć po niektórych aktualizacjach aplikacji lub systemu Android. Wybierz ponownie katalog, aby odzyskać uprawnienia i móc kontynuować. + Nieprawidłowy wybór + Wybór katalogu użytkownika był nieprawidłowy.\nProszę ponownie wybrać katalog użytkownika, upewniając się, że przechodzisz do niego z katalogu głównego pamięci urządzenia. + Azahar utracił uprawnienia do zarządzania plikami na tym urządzeniu. Może się to zdarzyć po aktualizacji niektórych aplikacji lub systemu Android. Aby kontynuować korzystanie z aplikacji, należy ponownie przyznać te uprawnienia na następnym ekranie. Ustawienia motywu Skonfiguruj ustawienia motywu dla Azahar. Ustaw motyw @@ -122,8 +129,8 @@ Naciśnij lub przenieś wejście. Powiązanie wejścia Naciśnij lub przesuń wejście, aby powiązać je z %1$s. - Przesuń analog w górę lub w dół. - Przesuń analog w lewo lub w prawo. + Przesuń analog w dół. + Przesuń analog w prawo. HOME Zamień ekrany Turbo @@ -162,6 +169,8 @@ Nazwa użytkownika Tryb New 3DS Użyj apletów LLE (jeśli są zainstalowane) + Zastosuj łatkę bez regionu do zainstalowanych aplikacji. + Naprawia region zainstalowanych aplikacji, aby były one wolne od ograniczeń regionalnych, dzięki czemu zawsze pojawiają się w menu głównym. Włącz wymagane moduły LLE dla funkcji online (jeśli są zainstalowane) łącza moduły LLE potrzebne do gry wieloosobowej online, dostępu do eShopu itp. Zegar @@ -217,25 +226,27 @@ Emituje fragment shaderów używany do emulacji PICA przy użyciu SPIR-V zamiast GLSL. Wyłącz optymalizator SPIR-V Wyłącza optymalizację SPIR-V, znacznie zmniejszając zacinanie się obrazu przy minimalnym wpływie na wydajność. - Włącz asynchroniczną kompilację shaderów + Włącz Asynchroniczną Kompilację Shaderów Kompiluje shadery w tle, aby zmniejszyć zacinanie się podczas rozgrywki. Po włączeniu należy spodziewać się tymczasowych błędów graficznych Filtrowanie Linear Włącza filtrowanie liniowe, które sprawia, że grafika w grach jest płynniejsza. Filtr tekstur Ulepsza oprawę wizualną aplikacji poprzez zastosowanie filtrów do tekstur. Obsługiwane filtry to Anime4K Ultrafast, Bicubic, ScaleForce, xBRZ freescale i MMPX. - Opóźnienie renderowania wątku gry + Opóźnienie Renderowania Wątku Gry Opóźnia wątek renderowania aplikacji podczas przesyłania danych do GPU. Pomaga w kwestiach wydajności w (bardzo niewielu) aplikacjach z dynamiczną liczbą klatek na sekundę. Zaawansowane Próbkowanie tekstur Zastępuje filtr próbkowania używany przez gry. Może to być przydatne w niektórych przypadkach, gdy gry źle zachowują się podczas skalowania w górę. Jeśli nie masz pewności, ustaw tę opcję na Kontrolowane przez grę. Dokładne mnożenie Używa dokładniejszego mnożenia w shaderach sprzętu, dzięki czemu może naprawić niektóre błędy graficzne. Po włączeniu tej funkcji wydajność zostanie zmniejszona. - Włącz asynchroniczną emulację GPU + Włącz Asynchroniczną Emulację GPU Używa oddzielnego wątku do asynchronicznej emulacji GPU. Po włączeniu, wydajność zostanie poprawiona. Ogranicz prędkość Po włączeniu prędkość emulacji zostanie ograniczona do określonego procentu normalnej prędkości. Jeśli opcja ta jest wyłączona, prędkość emulacji nie zostanie ograniczona, a klawisz skrótu prędkości turbo nie będzie działał. Ogranicz procent prędkości Określa wartość procentową ograniczenia prędkości emulacji. Przy domyślnej wartości 100% emulacja będzie ograniczona do normalnej prędkości. Wyższe lub niższe wartości zwiększają lub zmniejszają ograniczenie prędkości. + Ukryj obrazy 3DS z systemu Android + Zapobiega indeksowaniu przez system Android zdjęć wykonanych aparatem 3DS, zrzutów ekranu i niestandardowych tekstur oraz wyświetlaniu ich w galerii. Aby zmiany ustawień zaczęły obowiązywać, może być konieczne ponowne uruchomienie urządzenia. Limit prędkości Turbo Limit prędkości emulacji wykorzystywany, gdy aktywny jest klawisz skrótu turbo. Rozszerz do obszaru wycięcia @@ -257,10 +268,18 @@ Ostrzeżenie: Zmiana tych ustawień spowolni emulację Sterowanie stereoskopowe Tryb stereoskopowy 3D + Wybierz tryb stereoskopowego 3D dla renderowania 3D.Tryb ekranów obok siebie jest obecnie najczęściej stosowany. Tryby obrazu Anaglyph i Interlaced będą zawsze stosowane do wyświetlania obrazu na wszystkich podłączonych monitorach. Zasięg Określa wartość suwaka 3D. Powinien być ustawiony na wartość wyższą niż 0%, gdy włączony jest tryb stereoskopowy 3D.\nUwaga: Wartość przekraczająca 100% nie jest możliwa na rzeczywistym sprzęcie i może powodować problemy graficzne. Wyłącz renderowanie prawego oka Znacznie poprawia wydajność w niektórych aplikacjach, ale może powodować migotanie w innych. + Zamiana Oczu + Zamiana oczu jest wyświetlana po obu stronach. W połączeniu z trybem obrazów obok siebie umożliwia oglądanie obrazu 3D poprzez przesunięcie oczu! + Render stereoskopowego 3D + Czy włączyć stereoskopowe 3D i na jakich wyświetlaczach to włączyć? Opcje dotyczące pojedynczego wyświetlacza mają znaczenie tylko wtedy, gdy podłączonych jest wiele wyświetlaczy. + Włącz (Wszystkie Wyświetlacze) + Włącz (Tylko Główny Wyświetlacz) + Włącz (Tylko na Dodatkowym Wyświetlaczu) Cardboard VR Rozmiar ekranu Cardboarda Skaluje ekran do wartości procentowej jego oryginalnego rozmiaru. @@ -285,7 +304,7 @@ Głośność Rozciągnij dźwięk Rozciąga dźwięk, aby zredukować zacinanie się. Po włączeniu tej opcji zwiększa opóźnienie dźwięku i nieznacznie obniża wydajność. - Włącz dźwięk w czasie rzeczywistym + Włącz Dźwięk w Czasie Rzeczywistym Skaluje prędkość odtwarzania dźwięku, aby uwzględnić spadki liczby klatek na sekundę w emulacji. Oznacza to, że dźwięk będzie odtwarzany z pełną prędkością, nawet jeśli liczba klatek na sekundę w grze jest niska. Może powodować problemy z desynchronizacją dźwięku. Urządzenie wejściowe dźwięku Tryb wyjścia dźwięku @@ -297,12 +316,12 @@ Używa sprzętu do emulacji shaderów 3DS. Po włączeniu, wydajność gry zostanie znacznie poprawiona. Prędkość taktowania procesora Włącz V-Sync - Synchronizuje liczbę klatek na sekundę gry z częstotliwością odświeżania urządzenia. + Synchronizuje częstotliwość klatek na sekundę w grze z częstotliwością odświeżania urządzenia. Może powodować dodatkowe opóźnienia wejściowe, ale w niektórych przypadkach może ograniczyć występowanie rozdarć obrazu. Render debugowania Rejestruje dodatkowe informacje debugowania związane z grafiką. Po włączeniu, wydajność gry zostanie znacznie zmniejszona. - Opróżnia log przy każdej wiadomości + Opróżnij Log Przy Każdej Wiadomości Natychmiast zapisuje log debugowania do pliku. Użyj tego, jeśli azahar ulegnie awarii, a dane wyjściowe logu zostaną przerwane. - Opóźnione uruchamianie z modułami LLE + Opóźnij Uruchamianie z Modułami LLE Opóźnia uruchomienie aplikacji, gdy włączone są moduły LLE. Deterministyczne operacje asynchroniczne Sprawia, że operacje asynchroniczne są deterministyczne dla debugowania. Włączenie tej opcji może powodować zawieszanie się gry. @@ -427,6 +446,13 @@ Domyślny Ustawienia domyślne systemu (mirror) Niestandardowy Układ + Kolor tła + Kolor wyświetlany za ekranami podczas emulacji, wyświetlany jako wartość RGB. + Czerwony + Zielony + Niebieski + Niestandardowy wygląd drugiego ekranu przezroczystości + Przezroczystość drugiego ekranu 3DS podczas korzystania z niestandardowego układu ekranu. Przydatne, jeśli drugi ekran ma być umieszczony nad pierwszym ekranem. Pozycja małego ekranu Gdzie powinien być wyświetlany mały ekran względem dużego w układzie dużego ekranu? Prawy górny róg @@ -522,6 +548,8 @@ Krytyczny Błąd Wystąpił błąd krytyczny. Kontynuowanie emulacji może spowodować awarie i błędy. Nieobsługiwana zaszyfrowana aplikacja + Nieprawidłowy moduł systemu + Aplikacje dostępne wyłącznie na konsoli New 3DS nie mogą być uruchamiane bez włączenia trybu New 3DS. Przygotowanie shaderów @@ -549,34 +577,36 @@ ID: Plik: Typ: + Włóż Kartridż + Wyjmij Kartridż Wyświetl nakładkę wydajności Nakładkę wydajności Włącz nakładkę wydajności Konfiguruje, czy wyświetlana jest nakładka wydajności i jakie informacje są wyświetlane. - Wyświetl FPS - Wyświetla aktualną liczbę klatek na sekundę. - Pokaż czas klatek - Wyświetla bieżący czas klatek. - Wyświetl Prędkość - Wyświetla aktualną procentową prędkość emulacji. - Wyświetl użycie pamięci aplikacji - Wyświetla ilość pamięci RAM używanej przez emulator. - Wyświetl dostępną pamięć - Wyświetla ilość dostępnej pamięci RAM. - Wyświetl temperaturę baterii - Wyświetla bieżącą temperaturę baterii w stopniach Celcjusza i Fahrenheita. - Pozycja nakładki - Wybierz miejsce wyświetlania nakładki wydajności na ekranie. - Lewy górny róg - Prawy górny róg - Lewy dolny róg - Prawy dolny róg - Środkowy górny - Środkowy dolny - Tło nakładki - Dodaje tło z tyłu nakładki w celu łatwego odczytu. + Wyświetl FPS + Wyświetla aktualną liczbę klatek na sekundę. + Wyświetl czas klatek + Wyświetla bieżący czas klatek. + Wyświetl Prędkość + Wyświetla aktualną procentową prędkość emulacji. + Wyświetl użycie pamięci aplikacji + Wyświetla ilość pamięci RAM używanej przez emulator. + Wyświetl dostępną pamięć + Wyświetla ilość dostępnej pamięci RAM. + Wyświetl temperaturę baterii + Wyświetla bieżącą temperaturę baterii w stopniach Celcjusza i Fahrenheita. + Pozycja nakładki + Wybierz miejsce wyświetlania nakładki wydajności na ekranie. + Lewy górny róg + Prawy górny róg + Lewy dolny róg + Prawy dolny róg + Środkowy górny + Środkowy dolny + Tło nakładki + Dodaje tło z tyłu nakładki w celu łatwego odczytu. Cheaty @@ -682,7 +712,7 @@ Obok Siebie - Odwróć Obok Siebie + Obok Siebie na Pełną Szerokość Analogiczny Naprzemienny Odwrócony Obraz @@ -871,4 +901,19 @@ Szybkie zapisywanie - %1$tF %1$tR Funkcja szybkiego zapisu nie jest dostępna. + + Kompresuj + Kompresowanie… + Dekompresuj + Dekompresowanie... + Kompresja została zakończona pomyślnie. + Kompresja nie jest obsługiwana dla tego pliku. + Plik jest już skompresowany. + Kompresja nie powiodła się. + Dekompresja została zakończona pomyślnie. + Dekompresja nie jest obsługiwana dla tego pliku. + Plik nie jest skompresowany. + Dekompresja nie powiodła się. + Aplikacje, które są już zainstalowane, nie mogą być kompresowane ani dekompresowane. + diff --git a/src/android/app/src/main/res/values-b+pt+BR/strings.xml b/src/android/app/src/main/res/values-b+pt+BR/strings.xml index 4256bbb67..137fdcc94 100644 --- a/src/android/app/src/main/res/values-b+pt+BR/strings.xml +++ b/src/android/app/src/main/res/values-b+pt+BR/strings.xml @@ -67,10 +67,14 @@ Conceder permissão Ignorar a solicitação de notificação? O Azahar não poderá te notificar de informações importantes. + Permissões Ausentes + O Azahar requer permissão para gerenciar arquivos neste dispositivo a fim de armazenar e gerenciar seus dados.\n\nPor favor, conceda a permissão de \'Sistema de Arquivos\' antes de continuar. Câmera Conceda acesso a câmera abaixo para emular a câmera do 3DS. Microfone Conceda a acesso ao microfone abaixo para emular o microfone do 3DS. + Sistema de Arquivos + Conceda a permissão de arquivos abaixo para permitir que o Azahar armazene arquivos. Permissão negada Pular a seleção da pasta de aplicativos? Os softwares não serão exibidos na lista de Aplicativos se uma pasta não for selecionada. @@ -90,6 +94,9 @@ Você não pode pular a configuração da pasta do usuário. Este passo é necessário para permitir que o Azahar funcione. Selecione um diretório para continuar. Você perdeu suas permissões de escrita no seu diretório de dados de usuário, onde dados salvos e outras informações são guardadas. Isso pode acontecer depois que algum app ou Android atualiza. Re-selecione o diretório para reobter as permissões para que você possa continuar. + Seleção Inválida + A seleção do diretório de usuário é inválida.\nPor favor, selecione novamente o diretório de usuário, certificando-se de navegar até ele a partir da raiz do armazenamento do seu dispositivo. + O Azahar perdeu a permissão para gerenciar arquivos neste dispositivo. Isso pode acontecer após atualizações do aplicativo ou do Android. Por favor, conceda novamente esta permissão na próxima tela para continuar usando o app. Configurações de Tema Configure suas preferências de tema para o Azahar. Definir Tema @@ -122,8 +129,8 @@ Pressione ou mova uma entrada. Mapeamento de controles Pressione ou mova um botão/alavanca para mapear para %1$s. - Mova o seu joystick para cima ou para baixo. - Mova o seu joystick para esquerda ou para direita. + Mova o seu joystick para baixo + Mova o seu joystick para a direita Menu Principal Trocar telas Turbo @@ -162,6 +169,8 @@ Nome de usuário Modo do Novo 3DS Usar miniaplicativos LLE (se instalados) + Aplicar patch de região livre aos aplicativos instalados + Aplica um patch de região livre nos aplicativos instalados, para que eles sempre apareçam no menu inicial. Ativa os módulos LLE necessários para os recursos online (se instalado) Ativa os módulos LLE necessários para o multijogador online, acesso à eShop, etc. Relógio @@ -193,6 +202,10 @@ Aviso de inconsistência de região O país configurado não é válido para a região emulada selecionada. O país configurado não é válido para o console vinculado atual. + Armazenamento + Comprimir conteúdo CIA instalado + Comprime o conteúdo dos arquivos CIA ao serem instalados no cartão SD emulado. Afeta apenas o conteúdo CIA instalado enquanto a opção estiver ativada. + Câmera frontal Câmera traseira esquerda @@ -213,25 +226,27 @@ Emite o fragment shader usado para emular PICA usando SPIR-V em vez de GLSL Desativar otimizador SPIR-V Desativa a etapa de otimização SPIR-V, reduzindo consideravelmente os travamentos, com impacto mínimo no desempenho. - Ativar a compilação assíncrona de shaders + Habilitar Compilação Assíncrona do Shader Compila shaders em segundo plano para reduzir travamentos durante o jogo. Quando ativado, espere falhas gráficas temporárias Filtragem Linear Ativa a filtragem linear, que suaviza o visual do jogo. Filtro de texturas Aprimora o visual dos aplicativos ao aplicar filtros às texturas. Os filtros compatíveis são: Anime4K Ultrafast, Bicúbico, ScaleForce, xBRZ Freescale e MMPX. - Atrasar thread de renderização do aplicativo + Atrasar Thread de Renderização do Aplicativo Atrasar thread de renderização do aplicativo quando for enviado dados para a GPU. Ajuda com problemas de desempenho em (muito poucos) aplicativos com taxa de quadros dinâmica. Avançado Amostragem de Texturas Substitui o filtro de amostragem usado pelos jogos. Isso pode ser útil em certos casos com jogos que se comportem mal durante o upscaling. Em caso de dúvidas, defina como Controlado pelo Jogo. Multiplicação precisa Utiliza uma multiplicação mais precisa de shaders no hardware, o que pode corrigir problemas visuais. Quando ativada, pode haver redução no desempenho. - Ativar emulação de GPU assíncrona + Habilitar Emulação de GPU Assíncrona Usa uma thread separada para emular a GPU de forma assíncrona. Esta opção aprimora o desempenho quando ativada. Limite de velocidade Quando ativo, a velocidade de emulação será limitada à uma porcentagem especificada da velocidade normal. Se desativado, a velocidade de emulação será destravada e a tecla de atalho do turbo não irá funcionar. Limite de velocidade percentual Especifica a porcentagem para limitar a velocidade. Com o padrão de 100% a emulação será limitada a velocidade normal. Valores maiores ou menores vão aumentar ou reduzir o limite de velocidade. + Esconder Imagens do 3DS do Android + Prevenir câmera do 3DS, screenshots e texturas personalizadas de serem indexadas pelo Android e mostradas na galeria. Seu dispositivo pode precisar ser reiniciado após mudar essa configuração para as mudanças serem efetuadas. Limite da Velocidade Turbo: Limite de velocidade da emulação usado enquanto a tecla de atalho turbo está ativa. Expandir para a área recortada @@ -253,10 +268,18 @@ Aviso: modificar estas configurações tornará a emulação mais lenta Estereoscopia Modo 3D Estereoscópico + Escolha o modo 3D estereoscópico para a renderização 3D. Os modos Lado a Lado são os mais comuns atualmente. Os modos Anáglifo e Entrelaçado serão sempre aplicados a todas as telas conectadas. Profundidade Especifica o valor do controle deslizante 3D. Deve ser definido como superior a 0% quando o 3D Estereoscópico estiver ativado.\nNota: Valores de profundidade acima de 100% não são possíveis no hardware real e podem causar problemas gráficos Desativar a renderização do olho direito Melhora muito o desempenho em alguns aplicativos, mas pode causar piscadas em outros. + Inverter Olhos + Inverte qual olho é exibido em cada lado. Combinado com o modo Lado a Lado, torna possível ver em 3D cruzando os olhos! + Renderizar 3D Estereoscópico + Define se o 3D estereoscópico deve ser ativado e em quais telas. As opções de tela única só são relevantes quando várias telas estão conectadas. + Ativado (Todas as Telas) + Ativado (Apenas Tela Principal) + Ativado (Apenas Tela Secundária) VR Cardboard Tamanho da Tela do Cardboard Dimensiona a tela para uma porcentagem de seu tamanho original. @@ -281,7 +304,7 @@ Volume Alongamento de Áudio Estica o áudio para reduzir engasgos. Quando ativado, aumenta a latência do áudio e reduz levemente o desempenho. - Ativar áudio em tempo real + Ativar Áudio em Tempo Real Dimensiona a velocidade de reprodução de áudio para compensar quedas na taxa de quadros da emulação. Isso significa que o áudio será reproduzido em velocidade máxima mesmo quando a taxa de quadros do jogo estiver baixa. Pode causar problemas de dessincronização de áudio. Dispositivo de entrada de áudio Modo de Saída de Som @@ -293,12 +316,12 @@ Utiliza o hardware para emular os shaders do 3DS. Quando ativado, o desempenho do jogo será consideravelmente melhorado. Velocidade do Clock da CPU Ativar sincronização vertical - Sincroniza a taxa de quadros do jogo com a taxa de atualização da tela do seu dispositivo. + Sincroniza a taxa de quadros do jogo com a taxa de atualização do seu dispositivo. Pode causar latência de entrada adicional, mas pode reduzir o \"tearing\" (rasgo de tela) em alguns casos. Renderizador de Depuração Registre informações adicionais de depuração relacionadas a gráficos. Quando ativado, o desempenho do jogo será significativamente reduzido. - Limpar a saída do log a cada mensagem + Limpar a Saída do Log a Cada Mensagem Grava imediatamente o log de depuração no arquivo. Use isto se o Azahar travar e a saída do log estiver sendo cortada. - Atraso na inicialização com módulos LLE + Atraso na Inicialização com Módulos LLE Atrasa a inicialização do aplicativo quando os módulos LLE estão ativados. Operações Assíncronas Determinísticas Torna as operações assíncronas determinísticas para depuração. Ativar essa opção pode causar congelamentos. @@ -396,6 +419,10 @@ Configurar controles Editar Disposição Pronto + Deslizar Botão + Segurar o botão originalmente pressionado + Segurar o botão atualmente pressionado + Segurar o botão original e o atualmente pressionado Alternar controles Ajustar escala Escala Global @@ -408,6 +435,8 @@ Proporção da Tela Disposição de tela em paisagem Disposição da tela em retrato + Layout da Tela de Exibição Secundária + O layout usado por uma tela secundária conectada, com ou sem fio (Chromecast, Miracast) Tela Grande Retrato Tela única @@ -415,7 +444,15 @@ Telas Híbridas Original Padrão + Padrão do Sistema (espelhamento) Disposição Personalizada + Cor de Fundo + A cor que aparece atrás das telas durante a emulação, representada por um valor RGB. + Vermelho + Verde + Azul + Opacidade da Segunda Tela no Layout Personalizado + A opacidade da segunda tela do 3DS ao usar um layout de telas personalizado. Útil caso a segunda tela sobreponha a primeira. Posição da Tela Pequena Onde a tela pequena deverá aparecer relativa à grande na Disposição da Tela Grande? Superior Direita @@ -511,6 +548,8 @@ Erro Fatal Ocorreu um erro fatal. Verifique o registro para obter detalhes.\nContinuar a emulação pode resultar em falhas e bugs. Aplicativo criptografado não suportado + Modo de sistema inválido + Novos aplicativos exclusivos do New 3DS não podem ser carregados sem ativar o modo New 3DS. Preparando Shaders @@ -535,33 +574,39 @@ Criar Atalho O nome do atalho não pode ficar vazio Esticar para ajustar à imagem + ID: + Arquivo: + Tipo: + Inserir Cartucho + Ejetar Cartucho + Mostrar Sobreposição de Desempenho Sobreposição de Desempenho Ativa a Sobreposição de Desempenho Configure se a sobreposição de desempenho será exibida e quais informações serão mostradas. - Mostrar FPS - Exibe a taxa de quadros atual por segundo. - Mostrar Tempo de Quadro - Exibe o tempo de quadro atual. - Mostrar Velocidade - Exibe a porcentagem atual da velocidade da emulação. - Mostrar o Uso de Memória do Aplicativo - Exibe a quantidade de RAM utilizada pelo emulador. - Mostrar Memória Disponível - Exibe a quantidade de RAM disponível. - Mostrar a Temperatura da Bateria - Exibe a temperatura atual da Bateria em Celsius e Fahrenheit. - Posição da Sobreposição - Escolha onde a sobreposição de desempenho será exibida na tela. - Superior Esquerdo - Superior Direito - Inferior Esquerdo - Inferior Direito - Centro Superior - Centro Inferior - Plano de Fundo da Sobreposição - Adiciona um plano de fundo atrás da sobreposição para facilitar a leitura. + Mostrar FPS + Mostrar frames por segundo atuais. + Mostrar tempo de frame + Mostrar tempo de frame atual. + Mostrar velocidade + Mostrar atual porcentagem de velocidade da emulação. + Mostrar Uso da Memória pelo App + Mostrar o consumo de RAM pelo emulador. + Mostrar Memória Disponível + Mostrar a quantidade de RAM livre. + Mostrar Temperatura da Bateria + Mostrar atual temperatura da Bateria em Celsius e Fahrenheit. + Posição do Overlay + Escolha onde o overlay de performance é mostrado na tela. + Canto Superior Esquerdo + Canto Superior Direito + Canto Inferior Esquerdo + Canto Inferior Direito + Superior Central + Inferior Central + Plano de Fundo da Sobreposição + Adiciona um plano de fundo atrás do overlay para uma leitura mais fácil. Truques @@ -666,7 +711,7 @@ Lado a Lado - Inverter Lado a Lado + Lado a Lado (Largura Total) Anáglifo Entrelaçado Entrelaçado Reverso @@ -855,4 +900,19 @@ Salvar rápido - %1$tF %1$tR Nenhum Salvamento Rápido disponível. + + Compactar + Compactando... + Descompactar + Descompactando... + Compactação concluída com sucesso. + Compactação não suportada para este arquivo. + O arquivo já está compactado. + A compactação falhou. + Descompactação concluída com sucesso. + Descompactação não suportada para este arquivo. + O arquivo não está compactado. + A descompactação falhou. + Aplicativos já instalados não podem ser compactados ou descompactados. + diff --git a/src/android/app/src/main/res/values-b+ru+RU/strings.xml b/src/android/app/src/main/res/values-b+ru+RU/strings.xml index b2e79499e..902a573a6 100644 --- a/src/android/app/src/main/res/values-b+ru+RU/strings.xml +++ b/src/android/app/src/main/res/values-b+ru+RU/strings.xml @@ -70,8 +70,6 @@ Нажмите или отклоните элемент управления. Привязки ввода Нажмите или отклоните орган управления для привязки %1$s. - Наклоните джойстик вверх или вниз. - Наклоните джойстик влево или вправо. HOME Данный элемент управления должен быть привязан к аналоговому стику или крестовине геймпада! Данный элемент управления должен быть привязан к кнопке геймпада! @@ -120,14 +118,12 @@ Графический API Вкл. генерацию шейдеров на SPIR-V Запускать фрагментный шейдер, используемый для эмуляции PICA на SPIR-V вместо GLSL. - Вкл. асинхронную компиляцию шейдеров Компилировать шейдеры в фоновом потоке для уменьшения лагов во время игры. При включении возможны временные сбои графики. Линейное сглаживание Вкл. линейное сглаживание для смягчения графики в играх. Сглаживание текстур Точное умножение Исп. более точное умножение для аппаратных шейдеров. Может исправлять некоторые графические баги, но при включении снижает производительность. - Вкл. асинхронную эмуляцию GPU Использовать отдельный поток для асинхронной эмуляции GPU. При включении повышает производительность. Ограничивать скорость Процент ограничения скорости @@ -172,7 +168,6 @@ Эмулировать шейдеры 3DS аппаратными средствами. При включении существенно повышает производительность в играх. Скорость процессора Вкл. V-Sync - Синхронизирует кадровую частоту в играх с частотой обновления устройства. Отладка рендера Логировать расширенную отладочную информацию по графике. При включении существенно снижает производительность. diff --git a/src/android/app/src/main/res/values-b+tr+TR/strings.xml b/src/android/app/src/main/res/values-b+tr+TR/strings.xml index 1376dc76f..312f94b2b 100644 --- a/src/android/app/src/main/res/values-b+tr+TR/strings.xml +++ b/src/android/app/src/main/res/values-b+tr+TR/strings.xml @@ -74,6 +74,9 @@ İzin reddedildi Uygulama dosyasını seçmeyi atla? Eğer bir dosya seçili değilse yazılımlar uygulama listesinde görünmeyecektir. + İzinler + Veri Klasörleri + Emülatörün belirli özelliklerini kullanmak için isteğe bağlı izinler verin Yardım Atla İptal et @@ -83,6 +86,7 @@ Şimdiki Azahar Dizinini Koru Eski Lime3DS Dizinini Kullan Seç + Kullanıcı klasörü ayarlamayı atlayamazsınız Bu adım Azahar\'ın çalışması için gereklidir. Lütfen devam etmek için bir dizin seçin. Kayıtların ve diğer bilgilerin depolandığı kullanıcı verileridizininizdeki yazma izinlerini kaybettiniz. Bu durum bazı uygulama veya Android güncellemelerinden sonra meydana gelebilir. Devam edebilmeniz için lütfen izinleri yeniden kazanmak üzere dizini yeniden seçin. Tema Ayarları @@ -117,8 +121,6 @@ Bir girdiye basın veya hareket ettirin. Girdi Ataması Bir girdiyi %1$s e atamak için basın veya hareket ettirin. - Joystick\'inizi yukarı veya aşağı kaydırın. - Joystick\'inizi sağa veya sola kaydırın. HOME Ekranları değiştir Turbo @@ -185,6 +187,7 @@ Bölge Uyuşmazlık Uyarısı Ülke ayarı emülasyon bölgesi için geçerli değil. Ülke ayarı bağlı olan konsol için geçerli değil. + Depolama   İç Kamera @@ -196,23 +199,24 @@ “Görüntü Kaynağı” ayarı ‘Cihaz Kamerası’ olarak ayarlanmışsa, bu ayar kullanılacak fiziksel kamerayı ayarlar. Ön Geri + Harici + Çevir + İşleyici Grafik API\'ı SPIR-V gölgelendirici oluşturmayı etkinleştir - Asenkron gölgeleme derlemesini etkinleştir Oyun sırasında takılmayı azaltmak için gölgelendiricileri arka planda derler. Etkinleştirildiğinde geçici grafik hataları meydana gelebilir. Doğrusal filtreleme Oyun görsellerinin daha pürüzsüz görünmesini sağlayan doğrusal filtrelemeyi etkinleştirir. Doku Filtresi Dokulara bir filtre uygulayarak uygulamaların görsellerini geliştirir. Desteklenen filtreler Anime4K Ultrafast, Bicubic, ScaleForce, xBRZ freescale ve MMPX\'tir. - Oyun işleme iş parçacığını geciktir GPU\'ya veri gönderirken oyun işleme iş parçacığını geciktirin. Dinamik kare hızlarına sahip (çok az sayıda) uygulamada performans sorunlarına yardımcı olur. + Gelişmiş Doku Örnekleme Uygulamalar tarafından kullanılan örnekleme filtresini geçersiz kılar. Bu, görüntü yükseltme sırasında hatalı davranan uygulamaların olduğu bazı durumlarda faydalı olabilir. Emin değilseniz, bunu Uygulama Kontrollü olarak ayarlayın. İsabetli Çoğaltma Donanım gölgelendiricilerinde daha doğru çarpım kullanır, bu da bazı grafik hatalarını düzeltebilir. Etkinleştirildiğinde performans düşecektir. - Asenkron GPU emülasyonunu etkinleştir GPU emülasyonunu asenkron olarak yapmak için ayrı bir iş parçacığı kullanır. Etkinleştirildiğinde performans artacaktır. Hızı Sınırlandır Etkinleştirildiğinde, emülasyon hızı normal hızın belirli bir yüzdesiyle sınırlandırılır. Devre dışı bırakılırsa, emülasyon hızı sınırlandırılmaz ve turbo hız kısayol tuşu çalışmaz. @@ -220,6 +224,7 @@ Emülasyon hızını sınırlamak için yüzdeyi belirtir. Varsayılan değer olan %100 ile emülasyon normal hız ile sınırlandırılacaktır. Daha yüksek veya daha düşük değerler hız sınırını artıracak veya azaltacaktır Etkinleştirildiğinde, emülasyon hızı normal hızın belirli bir yüzdesiyle sınırlandırılacaktır. Devre dışı bırakılırsa, emülasyon hızı sınırlandırılmaz ve turbo hız kısayol tuşu çalışmaz. Turbo Hız Limiti Turbo kısayolu aktfiken kullanılan emülasyon hız limiti. + Kesme Alanına Genişlet İç Çözünürlük Render için kullanılan çözünürlüğü belirtir. Yüksek çözünürlük görsel kaliteyi çok artıracaktır ancak performans açısından da oldukça ağırdır ve bazı uygulamalarda aksaklıklara neden olabilir. Otomatik (Ekran Boyutu) @@ -259,7 +264,7 @@ Ses düzeyi Ses Gerdirme Takılmayı azaltmak için sesi esnetir. Etkinleştirildiğinde, ses gecikmesini artırır ve performansı biraz düşürür. - Gerçek zamanlı sesi etkinleştir + Gerçek Zamanlı Sesi Etkinleştir Emülasyon kare hızındaki düşüşleri hesaba katmak için ses çalma hızını ölçeklendirir. Bu, oyun kare hızı düşük olsa bile sesin tam hızda çalınacağı anlamına gelir. Ses senkronizasyon sorunlarına neden olabilir. Ses Giriş Cihazı Ses Çıkış Modu @@ -271,15 +276,13 @@ 3DS shader\'larının emülasyonu için donanımı kullanır. Etkinleştirildiğinde oyun performansı önemli ölçüde artacaktır. CPU Saat Hızı V-Sync\'i Etkinleştir - Oyun kare hızını cihazınızın yenileme hızına senkronize eder. Hata Ayıklama İşleyicisi Grafiklerle ilgili ek hata ayıklama bilgilerini günlüğe kaydedin. Etkinleştirildiğinde, oyun performansı önemli ölçüde azalacaktır. - Her mesajda günlük çıktısını temizle Hata ayıklama günlüğünü hemen dosyaya işler. Azahar çöküyor ve günlük çıktısı kesiliyorsa bunu kullanın. - LLE modülleriyle başlamayı geciktir LLE modülleri etkinken uygulamanın başlamasını geciktirir Deterministik Asenkron İşlemler Hata ayıklama için asenkron işlemleri deterministik hale getirir. Bunu etkinleştirmek donmalara neden olabilir. + RPC Sunucusunu Etkinleştir Ekran Yönelimi Otomatik @@ -287,6 +290,13 @@ Ters Yatay Portre Ters Portre + Varsayılan + 16:9 + 4:3 + 21:9 + 16:10 + Gerdir + Temizle Varsayılan @@ -302,6 +312,7 @@ Varsayılanlara Sıfırla oyun kartuşlarınızı veya yüklü başlıklarınızıyeniden yüklemek için kılavuzları izleyin.]]> Varsayılan + Otomatik Kapalı Yükle Sil @@ -320,6 +331,9 @@ İptal ediliyor... Önemli Tekrar gösterme + Görünürlük + Bilgi + Oyun Dosyası Seç @@ -357,12 +371,14 @@ Kontrolleri Yapılandır Düzeni Değiştir Bitti + Buton Kayması Ölçeği Ayarla Tümünü Sıfırla Görünürlüğü Ayarla D-Pad kayması Ayarları Aç Hileleri Aç + En Boy Oranı Yatay Ekran Düzeni Dikey Ekran Düzeni Büyük Ekran @@ -372,7 +388,12 @@ Hibrit Ekranlar Orijinal Varsayılan + Sistem Varsayılanı (ayna) Özel Düzen + Arkaplan Rengi + Kırmızı + Yeşil + Mavi Küçük Ekran Konumu Büyük Ekran Düzeninde küçük ekran büyük ekrana kıyasla nerede olmalı? Sağ Üst @@ -398,6 +419,7 @@ Yükseklik Ekranları Değiştir Yerleşimi Sıfırla + Kontrolcü Yerleşimini Göster Oyunu Kapat Duraklatmayı Aç / Kapat Çeşitli @@ -462,7 +484,6 @@ Ölümcül Hata Ölümcül bir hata oluştu. Ayrıntılar için log\'u kontrol edin.\nEmülasyona devam etmek çökmelere ve hatalara neden olabilir. Desteklenmeyen şifreli uygulama - Gölgelendiriciler Hazırlanıyor Gölgelendiriciler Oluşturuluyor @@ -481,6 +502,22 @@ DLC\'leri Sil Güncellemeleri Sil Kısayol + Kısayol Adı + Simgeyi düzenle + Kısayol Oluştur + ID: + Dosya: + Tür: + FPS\'i Göster + Hızı Göster + Kullanılabilir Belleği Göster + Pil Sıcaklığını Göster + Sol Üst + Sağ Üst + Sol Alt + Sağ Alt + Orta Üst + Orta Alt Hileler Hile Ekle @@ -583,7 +620,6 @@ Yan Yana - Ters Yan Yana Anaglif Geçmeli Ters Geçmeli @@ -601,6 +637,7 @@ Oyun Kontrollü + En Yakın Komşu Lineer @@ -771,4 +808,4 @@ Hızlı Kayıt - %1$tF %1$tR Hiçbir Hızlı Kayıt mevcut değil. - + diff --git a/src/android/app/src/main/res/values-b+zh+CN/strings.xml b/src/android/app/src/main/res/values-b+zh+CN/strings.xml index bde1ba0d8..a47c26b4c 100644 --- a/src/android/app/src/main/res/values-b+zh+CN/strings.xml +++ b/src/android/app/src/main/res/values-b+zh+CN/strings.xml @@ -122,8 +122,6 @@ 按下或移动以进行输入。 绑定输入 按下按键或轻推摇杆,将其绑定到 %1$s。 - 向上或向下轻推您的摇杆。 - 向左或向右轻推您的摇杆。 HOME 交换屏幕 加速 @@ -236,6 +234,8 @@ 启用后,模拟速度将被限制为正常速度的指定百分比。如果禁用,模拟速度则不受限制,并且加速热键将不起作用。 限制运行速度百分比 指定限制运行速度的百分比。默认情况下,100% 将限制为正常运行速度。较高或较低的值将增加或降低运行速度。 + 在安卓设备上隐藏 3DS 图像 + 阻止 Android 索引 3DS 摄像、屏幕截图和自定义纹理图像并将其显示在图库中。更改此设置后,可能需要重启设备才能生效。 加速限制 加速热键激活时使用的模拟速度限制。 扩展到裁剪区域 @@ -262,7 +262,7 @@ 禁用右眼渲染 极大地提高某些应用的性能,但可能会导致其他应用出现闪烁。 Cardboard VR - Cardboard 屏幕尺寸 + 纸板屏幕大小 将屏幕缩放至其原始大小的指定百分比。 水平偏移 指定用于水平移动屏幕的百分比。正值会将左右两个视野移向中间,而负值会将左右两个视野向外侧移动。 @@ -297,10 +297,10 @@ 使用硬件模拟 3DS 着色器。启用后,游戏性能将显著提高。 CPU 时钟频率 启用垂直同步 - 将游戏帧率与设备的屏幕刷新率同步。 + 将游戏帧率与设备的屏幕刷新率同步。可能会增加输入延迟,但在某些情况下可以减少画面撕裂。 调试渲染器 记录更多与图形相关的调试信息。启用后,游戏性能将显著降低。 - 刷新每条消息的日志输出 + 每条消息都刷新日志输出 立即将调试日志提交到文件。如果 Azahar 崩溃并且日志输出被切断,请使用此选项。 使用 LLE 模块延迟启动 当 LLE 模块启用时延迟应用的启动。 @@ -417,7 +417,7 @@ 屏幕布局 纵向屏幕布局 副屏幕布局 - 有线或无线连接的辅助屏幕使用布局(Chromecast, Miracast) + 有线或无线连接的副屏幕使用布局(Chromecast, Miracast) 大屏幕 纵向 单个屏幕 @@ -427,6 +427,13 @@ 默认 系统默认(镜像) 自定义布局 + 背景颜色 + 在模拟运行时屏幕后面出现的颜色,以 RGB 值表示。 + + 绿 + + 自定义布局副屏幕不透明度 + 使用自定义屏幕布局时, 3DS 副屏的不透明度。当副屏位于主屏前面时,此选项很有用。 小屏幕位置 在“大屏幕”布局中,小屏幕相对于大屏幕应该出现的位置? 右上 @@ -524,7 +531,6 @@ 致命错误 发生致命错误。请查阅日志获取相关信息。\n继续模拟可能会导致错误和崩溃。 不支持的加密应用 - 正在准备着色器 正在构建着色器 @@ -551,34 +557,33 @@ ID: 文件: 类型: - 显示性能参数 性能参数覆盖 启用性能参数覆盖 设置是否显示性能参数以及其他覆盖信息。 - 显示帧率 - 显示当前每秒帧数。 - 显示帧生成时间 - 显示当前帧生成时间。 - 显示速度 - 显示当前模拟速度百分比。 - 显示应用内存占用 - 显示模拟器使用的内存容量。 - 显示可用内存 - 显示可用的内存容量。 - 显示电池温度 - 以摄氏度和华氏度显示当前电池温度。 - 覆盖位置 - 选择性能参数覆盖在屏幕上的显示位置。 - 左上 - 右上 - 左下 - 右下 - 中上 - 中下 - 覆盖背景 - 在覆盖层后面添加背景以便于识别。 + 显示帧率 + 显示当前每秒帧数。 + 显示帧生成时间 + 显示当前帧生成时间。 + 显示速度 + 显示当前模拟速度百分比。 + 显示应用内存使用情况 + 显示模拟器占用的内存大小。 + 显示可用内存 + 显示可用的内存大小。 + 显示电池温度 + 以摄氏度和华氏度显示当前电池温度。 + 覆盖位置 + 选择性能参数覆盖在屏幕上的显示位置。 + 左上 + 右上 + 左下 + 右下 + 中上 + 中下 + 覆盖背景 + 在覆盖层后面添加背景以便于识别。 金手指 @@ -683,7 +688,6 @@ 并排屏幕 - 反向并排 立体图形 交错 逆向交错 @@ -872,4 +876,4 @@ 快速保存 - %1$tF %1$tR 没有可用的快速保存。 - + diff --git a/src/android/app/src/main/res/values-de/strings.xml b/src/android/app/src/main/res/values-de/strings.xml index c64865d59..37597b66b 100644 --- a/src/android/app/src/main/res/values-de/strings.xml +++ b/src/android/app/src/main/res/values-de/strings.xml @@ -122,8 +122,6 @@ Drücke eine Taste, oder bewege einen Stick Eingabeverknüpfung Drücke eine Taste, oder bewege einen Stick, um diesen als %1$s einzustellen. - Bewege den Joystick nach oben oder unten. - Bewegen den Joystick nach links oder rechts. HOME Bildschirme tauschen Turbo @@ -193,6 +191,10 @@ Region passt nicht überein Die Ländereinstellung ist für die ausgewählte emulierte Region nicht gültig. Die Ländereinstellung ist für die gekoppelte Konsole ungültig. + Speicher + Komprimiere installierten CIA Kontent + Komprimiert den Inhalt von CIA-Dateien, wenn diese auf der emulierten SD-Karte installiert werden. Betrifft nur CIA-Inhalte, die installiert werden, während die Einstellung aktiviert ist. + Innenkamera Außenkamera Links @@ -213,20 +215,17 @@ Gibt den Fragment-Shader aus, der zur Emulation von PICA unter Verwendung von SPIR-V statt GLSL verwendet wird. SPIR-V Optimierer deaktivieren Deaktiviert den SPIR-V Optimierungsschritt, was stottern reduziert und die Leistung nur geringfügig beeinflusst. - Asynchrone GPU-Emulation aktivieren Kompiliere Shader im Hintergrund, um das Stottern des Spiels zu reduzieren. Dadurch kann es zu temporären grafischen Fehlern während des Spielens kommen. Lineare Filterung Aktiviert lineare Filterung, welche die Spieltexturen glättet. Texturfilter Verbessert die Optik von Anwendungen durch Anwenden eines Filters auf Texturen. Die unterstützten Filter sind Anime4K Ultrafast, Bicubic, ScaleForce, xBRZ freescale und MMPX. - Game-Render-Thread verzögern Verzögert den Render-Thread des Spiels, wenn er Daten an die GPU sendet. Hilft bei Leistungsproblemen in den (sehr wenigen) Anwendungen mit dynamischen Frameraten. Erweitert Textur-Sampling Setzt den von Spielen verwendeten Sampling-Filter außer Kraft. Dies kann in bestimmten Fällen nützlich sein, wenn sich die Spiele beim Hochskalieren schlecht verhalten. Wenn du dir unsicher bist, setze diese Einstellung auf „Spielgesteuert“ Genaue Multiplikation Benutzt genauere Multiplikation in Hardware-Shadern, welche einige Grafikbugs fixen kann. Wenn aktiviert, ist die Leistung reduziert. - Asynchrone GPU-Emulation aktivieren Verwendet einen separaten Thread, um die GPU asynchron zu emulieren. Wenn aktiviert, wird die Leistung verbessert. Höchstgeschwindigkeit Wenn aktiviert, wird die Emulationsgeschwindigkeit auf einen angegebenen Prozentsatz der normalen Geschwindigkeit begrenzt. Wenn diese Option deaktiviert ist, wird die Emulationsgeschwindigkeit nicht begrenzt und der Hotkey für die Turbogeschwindigkeit funktioniert nicht. @@ -281,7 +280,6 @@ Lautstärke Audiodehnung Dehnt Audio, um Stottern zu reduzieren. Wenn aktiviert, wird die Audiolatenz erhöht und die Leistung leicht verschlechtert. - Echtzeitaudio aktivieren Skaliert die Tonabspielgeschwindigkeit, um Einbrüche in der Emulationsframerate zu minimieren. Das bedeutet, dass der Ton in voller Geschwindigkeit abspielt, selbst wenn die Framerate des Spiels niedrig ist. Kann zu Tonverschiebungen führen. Audioeingabegerät Tonausgabemodus @@ -293,12 +291,9 @@ Benutzt Hardware, um die 3DS-Shader zu emulieren. Wenn aktiviert, wird die Spielleistung stark verbessert. CPU-Takt-Rate V-Sync aktivieren - Synchronisiert die Bildrate des Spiels mit der Bildwiederholrate des Geräts. Debug-Renderer Zusätzliche grafisch spezifische Debuginformationen werden protokolliert. Wenn dies aktiviert ist, ist die Leistung des Spiels minimal reduziert. - Protokollausgabe bei jeder Nachricht Überträgt das Debugprotokoll sofort in eine Datei. Verwenden Sie dies, wenn Azahar abstürzt und die Protokollausgabe abgeschnitten wird. - Start mit LLE-Module verzögern Verzögert den Start der App, wenn die LLE-Module aktiviert sind. Deterministische asynchrone Operationen Asynchrone Operationen werden für Debug-Zwecke deterministisch. Die Aktivierung dieser Funktion kann zum Einfrieren führen. @@ -511,7 +506,6 @@ Schwerwiegender Fehler Es ist ein schwerwiegender Fehler aufgetreten. Weitere Informationen findest du in der Protokolldatei.\nDas Fortfahren könnte zu ungewollten Abstürzen oder Problemen führen. Nicht unterstützte verschlüsselte Anwendung - Shader werden vorbereitet Shader werden erstellt @@ -540,29 +534,6 @@ Leistungs-Overlay Leistungsoverlay aktivieren Konfigurieren Sie, ob das Leistungs-Overlay angezeigt wird und welche Informationen angezeigt werden. - FPS anzeigen - Aktuelle Bilder pro Sekunde anzeigen. - Frametime anzeigen - Aktuelle Frametime anzeigen. - Geschwindigkeit anzeigen - Zeigt die aktuelle Emulationsgeschwindigkeit in Prozent an. - App-Speichernutzung anzeigen - Zeigt die vom Emulator verwendete RAM-Menge an. - Verfügbaren Speicher anzeigen - Zeigt die verfügbare RAM-Menge an. - Batterietemperatur anzeigen - Zeigt die aktuelle Batterietemperatur in Celsius und Fahrenheit an. - Overlay-Position - Wählen Sie, wo das Leistungs-Overlay auf dem Bildschirm angezeigt wird - Links Oben - Rechts Oben - Links Unten - Rechts Unten - Oben Mittig - Unten Mittig - Overlay Hintergrund - Fügt einen Hintergrund hinter dem Overlay hinzu für bessere Lesbarkeit. - Cheats Cheat hinzufügen @@ -665,7 +636,6 @@ Nebeneinander - Invers Nebeneinander Anaglyphen Überlappend Invers überlappend @@ -854,4 +824,4 @@ Schnellspeichern - %1$tF %1$tR Kein Schnellspeicher vorhanden. - + diff --git a/src/android/app/src/main/res/values-fi/strings.xml b/src/android/app/src/main/res/values-fi/strings.xml index a44d0d32a..5fbf20a34 100644 --- a/src/android/app/src/main/res/values-fi/strings.xml +++ b/src/android/app/src/main/res/values-fi/strings.xml @@ -8,8 +8,6 @@ D-Pad Ylä/ala-akseli Vasen/oikea akseli - Liikuta tattia ylös tai alas. - Liikuta tattia vasemmalle tai oikealle. Nappulat Järjestelmän kellotyyppi @@ -38,7 +36,6 @@ Aktivoi Laitteistovarjostin Käyttää laitteistoa emuloidakseen 3DS:n varjostimia. Kun tämä on päällä, pelien suorituskyky on huomattavasti parempi. Aktivoi V-Sync - Synkronoi pelin virkistystaajuus laitteesi virkistystaajuuteen. Tyhjennä Oletus diff --git a/src/android/app/src/main/res/values-fr/strings.xml b/src/android/app/src/main/res/values-fr/strings.xml index 15528291a..419f61417 100644 --- a/src/android/app/src/main/res/values-fr/strings.xml +++ b/src/android/app/src/main/res/values-fr/strings.xml @@ -122,8 +122,6 @@ Appuyez ou faites bouger une touche. Liaison de boutons Appuyez ou déplacez pour la rattacher à %1$s. - Déplacez votre joystick vers le haut ou vers le bas. - Déplacez votre joystick à gauche ou à droite. HOME Permuter les écrans Turbo @@ -217,20 +215,17 @@ Émet le shader de fragment utilisé pour émuler PICA en utilisant SPIR-V plutôt que GLSL Désactiver l\'optimiseur SPIR-V Désactive le passage d\'optimisation SPIR-V, ce qui réduit considérablement les ralentissements sans affecter les performances. - Activer la compilation asynchrone des shaders Compile les shaders en arrière-plan pour réduire les saccades pendant le jeu. Lorsqu\'il est activé, prévoyez des problèmes graphiques temporaires. Filtrage linéaire Active le filtrage linéaire, qui améliorera le lissage graphique du jeu. Filtrage des textures Améliore l\'aspect visuel des applications en appliquant un filtre aux textures. Les filtres pris en charge sont Anime4K Ultrafast, Bicubique, ScaleForce, xBRZ freescale et MMPX. - Retarde le rendu de thread du jeu Délai le thread de rendu du jeu lorsqu\'il soumet des données au GPU. Cela permet de résoudre les problèmes de performance dans les (très rares) applications avec des fréquences d\'images dynamiques. Avancé Échantillonnage de texture Remplace le filtre d\'échantillonnage utilisé par les jeux. Cela peut être utile dans certains cas où les jeux se comportent mal lors de la conversion ascendante. En cas de doute, réglez ce paramètre sur « Contrôlé par le jeu ». Multiplication précise Utilise une multiplication plus précise dans les shaders hardware, ce qui peut corriger certains bugs graphiques. Lorsqu\'elle est activée, la performance sera réduite. - Active l\'émulation asynchone du GPU Utilise une unité d’exécution séparée pour émuler le GPU de manière asynchrone. La performance sera améliorée. Limite de vitesse Une fois activée, la vitesse d\'émulation sera limitée à un pourcentage spécifié de la vitesse normale. Si elle est désactivée, la vitesse d\'émulation ne sera pas limitée et le raccourci clavier turbo ne fonctionnera pas. @@ -285,7 +280,6 @@ Volume Étirement audio Étire le son pour réduire les saccades. Lorsqu\'il est activé, la latence est augmentée et les performances sont légèrement réduites. - Activer l\'audio en temps réel Adapte la vitesse de lecture de l\'audio afin de ne pas être perturbé par les pertes de framerate. Ceci veut dire que l\'audio sera joué correctement même si le jeu n\'est pas aussi rapide. Peut provoquer des problèmes de synchronisation audio. Périphérique d\'entrée audio Mode de sortie audio @@ -297,12 +291,9 @@ Utilise le hardware pour émuler les shaders de la 3DS. Lorsqu\'il est activé, la performance des jeux sera améliorée de manière significative. Fréquence d\'horloge du CPU Activer la synchronisation verticale (VSync) - Synchronise la fréquence d\'images du jeu avec la fréquence de rafraîchissement de votre appareil. Rendu de débogage Enregistre des informations de débogage supplémentaires liées aux graphiques. Lorsqu\'il est activé, les performances du jeu seront significativement réduites. - Vider la sortie des logs sur chaque message Enregistre immédiatement le log de débogage dans un fichier. A utiliser si Azahar se plante et que la sortie du journal est coupée. - Démarrage différé avec les modules LLE Retarde le démarrage de l\'application lorsque les modules LLE sont activés. Opérations asynchrones déterministes Rend les opérations asynchrones déterministes pour le débogage. L\'activation de cette fonction peut entraîner des blocages. @@ -519,7 +510,6 @@ Erreur fatale Une erreur fatale s\'est produite. Veuillez consulter les logs pour plus de détails.\nPoursuivre l\'émulation peut entraîner des plantages et des bugs. Application encryptée non supportée - Préparation des shaders Construction des shaders @@ -546,35 +536,11 @@ ID : Fichier : Type : - Afficher l\'overlay des performances Overlay des performances Activer l\'overlay des performances Configurez si l\'overlay des performances doit être affichée et quelles informations doivent être affichées. - Afficher les FPS - Afficher le nombre d\'images par seconde actuel. - Afficher le temps d\'affichage - Afficher le temps d\'affichage actuel. - Afficher la vitesse - Afficher le pourcentage actuel de la vitesse d\'émulation. - Afficher l\'utilisation de la mémoire par l\'application - Affichez la quantité de RAM utilisée par l\'émulateur. - Afficher la mémoire disponible - Afficher la quantité de RAM disponible. - Afficher la température de la batterie - Afficher la température actuelle de la batterie en degrés Celsius et Fahrenheit. - Position de l\'overlay - Choisissez l\'emplacement d\'affichage de l\'overlay des performances à l\'écran. - En haut à gauche - En haut à droite - En bas à gauche - En bas à droite - Au centre en haut - Au centre en bas - Overlay de l\'arrière-plan - Ajoute un arrière-plan derrière l\'overlay pour faciliter la lecture. - Codes de triche Ajouter un code de triche @@ -678,7 +644,6 @@ Côte à côte - Côte à côte inversé Anaglyphe Entrelacé Entrelacement inversé @@ -867,4 +832,4 @@ Sauvegarde rapide - %1$tF %1$tR Aucune sauvegarde rapide disponible. - + diff --git a/src/android/app/src/main/res/values-it/strings.xml b/src/android/app/src/main/res/values-it/strings.xml index 1e144cba9..39f199ab6 100644 --- a/src/android/app/src/main/res/values-it/strings.xml +++ b/src/android/app/src/main/res/values-it/strings.xml @@ -21,7 +21,7 @@ Cos\'è questo: Condividi il file di log di Azahar per il debug di problemi Gestione driver GPU Installa driver GPU - Installa driver alternativi per possibili miglioramenti nelle performance o nell\'accuratezza + Installa driver alternativi per possibili miglioramenti delle prestazioni o dell\'accuratezza Driver già installato Driver personalizzato non supportato Il caricamento di driver personalizzati non è disponibile per questo dispositivo. @@ -72,10 +72,14 @@ Divertiti usando l\'emulatore! Concedi il permesso Vuoi saltare la concessione del permesso di notifica? Azahar non avrà il permesso di notificarti con informazioni importanti. + Permessi mancanti + Azahar richiede l\'autorizzazione per gestire i file su questo dispositivo per archiviare e gestire i propri dati.\n\nDare il permesso \"Filesystem\" prima di continuare. Fotocamera Concedi il permesso alla fotocamera qui sotto per emulare la fotocamera del 3DS Microfono Concedi il permesso all\'utilizzo del microfono per emulare il microfono del 3DS + Filesystem + Dare il permesso del file system qui sotto per consentire ad Azahar di archiviare file. Permesso negato Saltare la selezione della cartella applicazioni? Non verrà mostrato alcun software nella lista applicazioni se non viene selezionata alcuna cartella. @@ -85,7 +89,7 @@ Divertiti usando l\'emulatore! Concedere autorizzazioni opzionali per utilizzare specifiche funzionalità dell\'emulatore Aiuto Salta - Indietro + Annulla Seleziona cartella utente utente usando il bottone sottostante.]]> Sembra che tu abbia impostato la cartella utente sia per Lime3DS che per Azahar. Questo probabilmente è dovuto al fatto che hai eseguito l\'aggiornamento ad Azahar e, al momento della richiesta, hai scelto una directory utente diversa da quella utilizzata per Lime3DS.\n\nQuesto potrebbe averti fatto pensare di aver perso salvataggi o altre impostazioni - ci scusiamo se è successo.\n\nDesideri tornare a utilizzare la tua cartella utente originale di Lime3DS, ripristinando impostazioni e salvataggi da Lime3DS, oppure preferisci mantenere la cartella utente attuale di Azahar?\n\nNessuna delle cartelle verrà eliminata, indipendentemente dalla tua scelta, e potrai passare liberamente da una all\'altra utilizzando l\'opzione \"Seleziona Cartella Utente\". @@ -95,6 +99,9 @@ Divertiti usando l\'emulatore! Non puoi saltare la configurazione della cartella utente Questo passaggio è richiesto per permettere che Azahar funzioni. Quando la cartella verrà selezionata potrai continuare. Hai perso i permessi di scrittura sulla tua cartella dei dati utente, dove sono memorizzati i salvataggi e altre informazioni. Questo può accadere dopo alcuni aggiornamenti app o Android. Ri-seleziona la cartella per recuperare le autorizzazioni in modo da poter continuare. + Selezione non valida + La selezione della directory utente non era valida.\nSeleziona nuovamente la directory utente, assicurandoti di accedervi dalla radice dello spazio di archiviazione del tuo dispositivo. + Azahar ha perso l\'autorizzazione a gestire i file su questo dispositivo. Ciò può accadere dopo alcuni aggiornamenti di app o Android. Si prega di concedere nuovamente questa autorizzazione nella schermata successiva per continuare a utilizzare l\'app. Impostazioni tema Configura le impostazioni del tema di Azahar. Imposta tema @@ -127,8 +134,8 @@ Divertiti usando l\'emulatore! Premi o sposta un comando Assegnazione Input Premi o muovi un comando per assegnarlo a %1$s. - Muovi il joystick in su o in giù. - Muovi il joystick a sinistra o a destra. + Sposta il joystick verso il basso + Sposta il joystick verso destra Home Inverti Schermi Turbo @@ -163,10 +170,12 @@ Divertiti usando l\'emulatore! Pulsante - Impostazioni Emulazione - Nome Utente + Impostazioni emulazione + Nome utente Modalità New 3DS Usa Applet LLE (se installati) + Applica la patch region-free alle applicazioni installate + Corregge la regione delle applicazioni installate per renderle region-free, in modo che vengano sempre visualizzate nel menù Home. Abilitare i moduli LLE richiesti per le funzionalità online (se installati) Abilita i moduli LLE necessari per il multigiocatore online, l\'accesso all\'eShop, ecc. Orologio @@ -209,7 +218,7 @@ Divertiti usando l\'emulatore! Sorgente Fotocamera Imposta l\'immagine sorgente della fotocamera virtuale. Puoi utilizzare un file immagine, oppure la fotocamera del dispositivo quando supportato. Fotocamera - Se \"Immagine Sorgente\" è impostato su \"Fotocamera del Dispositivo\", da qui scegli quale fotocamera utilizzare. + Se l\'impostazione \"Origine immagine\" è impostata su \"Fotocamera dispositivo\", questa imposta la fotocamera fisica da utilizzare. Fronte Retro Esterna @@ -219,35 +228,37 @@ Divertiti usando l\'emulatore! Renderer API grafiche Abilita la generazione di shader SPIR-V - Crea le fragments shader usate per emulare PICA tramite SPIR-V, invece di GLSL - Disabilita SPIR-V Optimizer - Disabilita il passaggio di ottimizzazione SPIR-V, riducendo considerevolmente gli stutter e influendo appena sulle prestazioni. - Abilita la compilazione asincrona delle shader - Compila le shader in background per ridurre lo stuttering durante il gioco. Quando abilitato, potrebbero verificarsi dei glitch grafici. - Filtering Lineare + Crea il fragment shader usato per emulare PICA tramite SPIR-V, invece di GLSL + Disabilita ottimizzazione SPIR-V + Disabilita il passaggio di ottimizzazione SPIR-V, riducendo considerevolmente gli scatti con un impatto minimo sulle prestazioni. + Abilita la compilazione asincrona degli shader + Compila gli shader in background per ridurre gli scatti durante il gioco. Se l\'opzione è abilitata, potrebbero verificarsi dei glitch grafici temporanei. + Filtraggio lineare Abilita il filtraggio lineare, che fa sembrare più smussata la grafica dei giochi. - Filtro Texture + Filtro texture Migliora la grafica delle applicazioni applicando un filtro alle texture. I filtri supportati sono Anime4k Ultrafast, Bicubic, ScaleForce, xBRZ freescale e MMPX. Ritarda il thread di rendering del gioco Ritarda il thread di rendering del gioco quando invia dati alla GPU. Aiuta con i problemi di prestazioni nelle (poche) applicazioni con frame rate dinamici. Avanzato Campionamento texture Sovrascrive il filtro di campionamento utilizzato dai giochi. Questo può essere utile in alcuni casi con giochi che gestiscono male l\'upscaling. Se hai dubbi, imposta questa opzione su \"Gestito dal gioco\". - Moltiplicazione Accurata - Utilizza una moltiplicazione più accurata degli shader hardware, che potrebbe correggere alcuni bug grafici. Se abilitato, le prestazioni saranno ridotte. + Moltiplicazione accurata + Utilizza una moltiplicazione più accurata degli shader hardware, che potrebbe correggere alcuni bug grafici. Se l\'opzione è abilitata, le prestazioni saranno ridotte. Abilita l\'emulazione GPU asincrona Usa un thread separato per l\'emulazione asincrona della GPU. Quando è abilitato le prestazioni saranno migliori. Limita Velocità Quando abilitata, la velocità di emulazione sarà limitata a una percentuale specificata della velocità normale. Se disabilitato, la velocità di emulazione non sarà limitata e tasto di scelta rapida per \"Turbo speed\" non funzionerà. Limita Velocità tramite Percentuale Specifica a quale percentuale limitare la velocità d\'emulazione. Utilizzando l\'impostazione predefinita di 100% l\'emulazione sarà limitata alla velocità normale. Valori superiori o inferiori aumenteranno o diminuiranno il limite di velocità. + Nascondi le immagini 3DS da Android + Impedisci che le immagini della fotocamera 3DS, degli screenshot e delle texture personalizzate vengano indicizzate da Android e visualizzate nella galleria. Potrebbe essere necessario riavviare il dispositivo dopo aver modificato questa impostazione per avere effetto. Limite \"Turbo speed\" Limite di velocità dell\'emulazione usato quando il tasto di scelta rapida del turbo è attivo. Espandi all\'area di ritaglio Espande l\'area di visualizzazione per includere l\'area di ritaglio (o notch). Risoluzione Interna Specifica la risoluzione a cui renderizzare. Una risoluzione alta migliorerà la qualità visiva ma avrà un grande effetto sulle prestazioni e potrebbe causare glitch in alcune applicazioni. - Auto (dimensione dello schermo) + Automatica (dimensione dello schermo) Nativa (400x240) 2x Nativa (800x480) 3x Nativa (1200x720) @@ -262,10 +273,18 @@ Divertiti usando l\'emulatore! Attenzione: Modificare queste impostazioni rallenterà l\'emulazione Stereoscopia Modalità Stereoscopia 3D + Scegli la modalità 3D stereoscopica per il rendering 3D. Le modalità Fianco a Fianco sono le più comuni nell\'uso moderno. Le modalità Anaglifo e Interlacciato si applicheranno sempre a tutti i display collegati. Profondità Specifica il valore del regolatore di profindità 3D. Questo valore deve essere impostato su un valore superiore allo 0% quando è abilitato il \"3D stereoscopico\".\nNote: Valori di profondità superiori al 100% non sono possibili su hardware reale e possono causare problemi grafici Disabilita il rendering dell\'occhio destro Migliora notevolmente le prestazioni in alcune applicazioni, ma può causare flickering in altre. + Inverti occhi + Cambia l\'occhio dal quale lato viene visualizzato. In combinazione con la modalità Fianco a Fianco è possibile vedere il 3D incrociando gli occhi! + Rendering 3D Stereoscopico + Indica se abilitare il 3D stereoscopico e su quali schermi. Le opzioni di visualizzazione singola sono rilevanti solo quando sono collegati più display. + Attivo (tutti gli schermi) + Attivo (solo schermo primario) + Attivo (solo schermo secondario) Cardboard VR Grandezza Cardboard Scala lo schermo ad una percentuale fissata della sua grandezza originale @@ -274,16 +293,16 @@ Divertiti usando l\'emulatore! Spostamento Verticale Specifica la percentuale di spazio vuoto per spostare gli schermi verticalmente. Valori positivi muoveranno alla parte bassa dello schermo, mentre i negativi faranno il contrario. Shader JIT - Shader Cache su Disco - Riduce lo stuttering salvando e caricando le shader generate sul disco principale. Non può essere usato senza aver prima attivato \"Abilita Shader Hardware\" + Cache degli shader su disco + Riduce gli scatti salvando e caricando gli shader generati su disco. Non può essere usata senza aver prima attivato \"Abilita shader hardware\". Utilità - Estrai Textures - Le textures vengono estratte in dump/textures/[ID Gioco]/. - Textures Personalizzate + Estrai texture + Le texture vengono estratte in dump/textures/[ID Gioco]/. + Texture personalizzate Le texture vengono caricate da load/textures/[ID Gioco]/. - Precaricamento delle Textures Personalizzate + Precarica texture personalizzate Carica tutte le texture personalizzate nella RAM del dispositivo. Questa funzionalità può usare molta memoria. - Caricamento asincrono delle Textures + Caricamento asincrono delle texture personalizzate Carica le texture personalizzate in modo asincrono con i thread in background per ridurre lo stutter del caricamento. @@ -298,11 +317,11 @@ Divertiti usando l\'emulatore! CPU JIT Utilizza il compilatore Just-in-Time (JIT) per l\'emulazione della CPU. Se abilitato, le prestazioni di gioco miglioreranno significativamente. - Abilita le Shader Hardware + Abilita shader hardware Utilizza l\'hardware per emulare gli shader del 3DS. Se abilitato, le prestazioni dei giochi miglioreranno significativamente. Velocità Clock CPU Abilita V-Sync - Sincronizza il frame rate dei giochi con il refresh rate del tuo dispositivo. + Sincronizza il frame rate del gioco con la frequenza di aggiornamento del tuo dispositivo. Può causare ulteriore latenza di input ma può ridurre il tearing in alcuni casi. Renderer di Debug Registra ulteriori informazioni di debug relative alla grafica. Quando abilitata, le prestazioni del gioco saranno significativamente ridotte. Svuota l\'output del log ad ogni messaggio @@ -314,7 +333,7 @@ Divertiti usando l\'emulatore! Abilita server RPC Abilita il server RPC sulla porta 45987. Questo permette di leggere e scrivere remotamente la memoria guest. Abilita shader JIT - Usa il motore JIT invece dell\'interprete per l\'emulazione di shader software. + Usa il motore JIT al posto dell\'interprete per l\'emulazione software degli shader. Orientamento schermo @@ -360,9 +379,9 @@ Divertiti usando l\'emulatore! Impostazione disabilitata Questa impostazione è attualmente disattivata a causa di un\'altra impostazione che non è il valore appropriato. Questa opzione non può essere modificata mentre un gioco è in esecuzione. - Auto-seleziona. + Seleziona automaticamente Avvia - Cancellazione... + Annullamento in corso... Importante Non mostrare più Visibilità @@ -388,7 +407,7 @@ Divertiti usando l\'emulatore! Layout - La tua ROM è Criptata + La tua ROM è criptata Formato ROM non valido Il file ROM non esiste Nessun gioco avviabile è presente! @@ -403,7 +422,7 @@ Divertiti usando l\'emulatore! Feedback aptico Impostazioni Overlay Configura Controlli - Modifica Disposizione + Modifica disposizione Fatto Pulsante scorrevole Tieni premuto il pulsante originariamente premuto @@ -432,6 +451,13 @@ Divertiti usando l\'emulatore! Standard Predefinito del sistema (specchio) Layout personalizzato + Colore dello sfondo + Il colore che appare dietro gli schermi durante l\'emulazione, rappresentato come valore RGB. + Rosso + Verde + Blu + Layout personalizzato Opacità della seconda schermata + L\'opacità del secondo schermo 3DS quando si utilizza un layout dello schermo personalizzato. Utile se il secondo schermo deve essere posizionato sopra il primo schermo. Posizione schermo piccolo Dove dovrebbe apparire lo schermo inferiore rispetto a quello superiore nella modalità Schermo Grande? In alto a destra @@ -520,17 +546,19 @@ Divertiti usando l\'emulatore! Annulla Continua Archivio di Sistema Non Trovato - %s è mancante. Fai il dump del tuo archivio di sistema.\nProseguire con l\'emulazione potrebbe causare crash e bugs + %s è mancante. Fai il dump del tuo archivio di sistema.\nProseguire con l\'emulazione potrebbe causare crash e bug. Installazione Fallita. File CIA non trovato Archivio di Sistema Errore nel Salvataggio/Caricamento Errore Fatale Si è verificato un errore fatale. Controllare il log per i dettagli.\nContinuare l\'emulazione può causare crash e bug. Applicazione criptata non supportata + Modalità di sistema non valida + Le applicazioni esclusive del New 3DS non possono essere caricate senza abilitare la modalità New 3DS. - Preparando le Shaders - Costruisco le Shaders + Preparazione degli shader + Compilazione degli shader Riproduci @@ -554,34 +582,36 @@ Divertiti usando l\'emulatore! ID: File: Tipo: + Inserisci schedina + Rimuovi schedina Mostra overlay prestazioni Overlay delle prestazioni Abilita overlay prestazioni Configura se l\'overlay delle prestazioni viene visualizzato e quali informazioni vengono visualizzate. - Mostra FPS - Mostra i fotogrammi al secondo attuali. - Mostra il frametime - Mostra il frametime attuale. - Mostra velocità - Mostra la percentuale di emulazione attuale. - Mostra utilizzo della memoria dell\'app - Mostra la quantità di RAM usata dall\'emulatore. - Mostra memoria disponibile - Mostra la quantità di RAM disponibile. - Mostra temperatura batteria - Mostra la temperatura attuale, in Celsius e Fahrenheit, della batteria. - Posizione overlay - Scegli dove visualizzare l\'overlay delle prestazioni sullo schermo. - In alto a sinistra - In alto a destra - In basso a sinistra - In basso a destra - In alto al centro - In basso al centro - Sfondo dell\'overlay - Aggiunge uno sfondo dietro all\'overlay per una lettura più facile. + Mostra FPS + Visualizza i fotogrammi al secondo attuali. + Mostra frametime + Mostra frametime attuale. + Mostra velocità + Visualizza la percentuale di velocità di emulazione corrente. + Mostra l\'utilizzo della memoria dell\'app + Visualizza la quantità di RAM utilizzata dall\'emulatore. + Mostra memoria disponibile + Visualizza la quantità di RAM disponibile. + Mostra temperatura della batteria + Visualizza la temperatura attuale della batteria in gradi Celsius e Fahrenheit. + Posizione del overlay + Scegli dove visualizzare l\' overlay delle prestazioni sullo schermo. + In alto a sinistra + In alto a destra + In basso a sinistra + In basso a destra + In alto al centro + In basso al centro + Sfondo dell\'overlay + Aggiunge uno sfondo dietro al overlay per una lettura più semplice. Trucchi @@ -600,7 +630,7 @@ Divertiti usando l\'emulatore! Installando %d file. Guarda le notifiche per maggiori dettagli. Installando %dfiles. Guarda le notifiche per maggiori dettagli. - Installando i file di %d. Guarda le notifiche per maggiori dettagli. + Installazione di %d file. Guarda le notifiche per maggiori dettagli. Notifiche di Azahar durante l\'installazione dei CIA Installando il CIA @@ -626,12 +656,12 @@ Divertiti usando l\'emulatore! Tema - Segui sistema - Chiara - Scura + Segui il sistema + Chiaro + Scuro - Material you + Material You Utilizza il colore del tema del sistema operativo all\'interno dell\'app (sovrascrive l\'impostazione \"Colore tema\" quando abilitata) @@ -685,11 +715,11 @@ Divertiti usando l\'emulatore! Dispositivo Reale (OpenAL) - Affiancati - Affiancato Invertito + Affiancato + Affiancato a larghezza intera Anaglifo Interlacciato - Interlacciato Invertito + Interlacciato invertito OpenGLES @@ -763,7 +793,7 @@ Divertiti usando l\'emulatore! Australia Austria Belgio - Bosnia Herzegovina + Bosnia ed Erzegovina Botswana Bulgaria Croazia @@ -793,7 +823,7 @@ Divertiti usando l\'emulatore! Nuova Zelanda Norvegia Polonia - Portogall + Portogallo Romania Russia Serbia @@ -815,7 +845,7 @@ Divertiti usando l\'emulatore! Chad Sudan Eritrea - Djibouti + Gibuti Somalia Andorra Gibilterra @@ -862,7 +892,7 @@ Divertiti usando l\'emulatore! Dicembre - Comunicazione con il server Artic Base fallita. L\'emulazione verrà interrotta + Comunicazione con il server Artic Base fallita. L\'emulazione verrà interrotta. Artic Base Connettiti a una console reale che sta eseguendo il server Artic Base Connetti ad Artic Base @@ -873,6 +903,21 @@ Divertiti usando l\'emulatore! Salvataggio Rapido Caricamento Rapido Salvataggio Rapido - %1$tF %1$tR - Nessun salvataggio rapido disponibile + Nessun salvataggio rapido disponibile. + + + Comprimi + Compressione... + Decomprimi + Decompressione... + Compressione completata con successo. + Compressione non supportata per questo file. + Il file è già compresso. + Compressione fallita. + Decompressione completata con successo. + Decompressione non supportata per questo file. + Il file non è compresso. + Decompressione fallita. + Le applicazioni già installate non possono essere compresse o decompresse. diff --git a/src/android/app/src/main/res/values-nb/strings.xml b/src/android/app/src/main/res/values-nb/strings.xml index 217319f54..e207f7eb0 100644 --- a/src/android/app/src/main/res/values-nb/strings.xml +++ b/src/android/app/src/main/res/values-nb/strings.xml @@ -12,8 +12,6 @@ Venstre/Høyre Akse Inngangsinnbinding Trykk eller flytt en inngang for å binde den til %1$s. - Beveg Joystick opp eller ned - Beveg Joystick venstre eller høyre Denne kontrollen må være bundet til en håndkontroller\'s analog spak eller kontrollpluss akse! Denne kontrollen må være bundet til en håndkontroller knapp! @@ -40,7 +38,6 @@ Tekstur Filter Aktiver nøyaktig shader-multiplikasjon Bruker mer nøyaktig multiplikasjon i maskinvare shaders, som kan fikse noen grafiske feil. Når dette er aktivert, reduseres ytelsen. - Aktiver asynkron GPU-emulering Bruker en egen tråd for å emulere GPU asynkront. Når dette er aktivert, forbedres ytelsen. Aktiver fartsbegrensning Begrens fartsprosent @@ -56,7 +53,6 @@ Aktiver maskinvare shader Bruker maskinvare for å etterligne 3DS shaders. Når dette er aktivert, vil spillytelsen bli betydelig forbedret. Aktiver V-Sync - Synkroniserer spillrammefrekvensen med oppdateringsfrekvensen på enheten din. Tøm Standard diff --git a/src/android/app/src/main/res/values-nl/strings.xml b/src/android/app/src/main/res/values-nl/strings.xml index 40afb28a0..dbc435008 100644 --- a/src/android/app/src/main/res/values-nl/strings.xml +++ b/src/android/app/src/main/res/values-nl/strings.xml @@ -93,8 +93,6 @@ Vink deze optie in de toekomst nogmaals aan om te zien of er ondersteuning is to Druk op of verplaats een invoer. Invoerbinding Druk op of verplaats een invoer waaraan u deze wilt koppelen %1$s - Beweeg je joystick naar boven of beneden. - Beweeg je joystick naar links of rechts. HOME Verwissel Schermen Deze besturing moet worden gekoppeld aan een analoge gamepad-stick of D-pad-as! diff --git a/src/android/app/src/main/res/values-sv/strings.xml b/src/android/app/src/main/res/values-sv/strings.xml index d9ebcffe1..0ad337086 100644 --- a/src/android/app/src/main/res/values-sv/strings.xml +++ b/src/android/app/src/main/res/values-sv/strings.xml @@ -32,6 +32,8 @@ Ändrar de filer som Azahar använder för att ladda applikationer Modifiera utseendet på appen Installera CIA + Läs mer.]]> + Välj GPU-drivrutin Vill du ersätta din nuvarande GPU-drivrutin? @@ -65,20 +67,36 @@ Ge tillstånd Hoppa över att ge tillstånd för avisering? Azahar kommer inte att kunna meddela dig viktig information. + Saknar behörigheter + Azahar behöver behörighet för att hantera filer på den här enheten för att kunna lagra och hantera sina data. \n\nGe behörighet för ”Filsystem” innan du fortsätter. Kamera Ge kameratillståndet nedan för att emulera 3DS-kameran. Mikrofon Ge mikrofonbehörighet nedan för att emulera 3DS-mikrofonen. + Filsystem + Bevilja filsystemsbehörighet nedan för att tillåta Azahar att lagra filer. Tillstånd nekat Hoppa över att välja applikationsmapp? Programvara visas inte i listan Program om en mapp inte är markerad. + Behörigheter + Datamappar + (Användarmapp krävs)]]> + Bevilja valfria behörigheter för att använda specifika funktioner i emulatorn Hjälp Hoppa över Avbryt Välj användarmapp användardatakatalog med knappen nedan.]]> + Du verkar ha användarkataloger inställda för både Lime3DS och Azahar. Detta beror troligen på att du uppgraderade till Azahar och när du blev ombedd att välja en annan användarkatalog än den som användes för Lime3DS. \n\nDetta kan ha lett till att du trodde att du förlorat sparade spel eller andra inställningar – vi ber om ursäkt om så är fallet. Vill du gå tillbaka till att använda din ursprungliga Lime3DS-användarkatalog och återställa inställningar och spara spel från Lime3DS, eller behålla din nuvarande Azahar-användarkatalog? Ingen av katalogerna kommer att raderas, oavsett vilket val du gör, och du kan fritt växla mellan dem med hjälp av alternativet Välj användarkatalog. + Behåll aktuell Azahar-katalog + Använd tidigare Lime3DS-katalog Välj + Du kan inte hoppa över konfiguration av användarmappen Detta steg krävs för att Azahar ska fungera. Välj en katalog och sedan kan du fortsätta. + Du har förlorat skrivbehörighet till katalogen user data, där sparade filer och annan information lagras. Detta kan inträffa efter vissa app- eller Android-uppdateringar. Välj katalogen på nytt för att återfå behörigheten så att du kan fortsätta. + Ogiltigt val + Valet av användarkatalog var ogiltigt. Välj användarkatalogen igen och se till att du navigerar till den från roten av enhetens lagring. + Azahar har förlorat behörigheten att hantera filer på den här enheten. Detta kan inträffa efter vissa app- eller Android-uppdateringar. Bevilja denna behörighet på nästa skärm för att fortsätta använda appen. Temainställningar Konfigurera dina temapreferenser för Azahar. Ställ in tema @@ -111,17 +129,25 @@ Tryck på eller flytta en inmatning. Inmatningsbindning Tryck eller flytta en inmatning för att binda den till %1$s. - Flytta joysticken uppåt eller nedåt. - Flytta joysticken åt vänster eller höger. + Rör din joystick neråt + Rör din joystick åt höger HOME Byt skärm + Turbo Den här kontrollen måste vara bunden till en gamepad-analog spak eller D-pad-axel! Den här kontrollen måste vara bunden till en gamepad-knapp! + Turbohastighet + Turbohastighet aktiverad + Turbohastighet inaktiverad + Systemfiler Utför systemfilsoperationer som att installera systemfiler eller starta upp startmenyn Anslut till Artic Setup Tool + Azahar Artic Setup Tool.
Anmärkningar:
  • Denna åtgärd installerar konsolens unika data på Azahar. Dela inte dina användar- eller nand-mappar efter att du har genomfört konfigurationsprocessen!
  • Under konfigurationsprocessen kommer Azahar att länka till konsolen som kör konfigurationsverktyget. Du kan koppla bort konsolen senare från fliken Systemfiler i emulatorns alternativmeny.
  • Gå inte online med både Azahar och din 3DS-konsol samtidigt efter att du har konfigurerat systemfilerna, eftersom detta kan orsaka problem.
  • Gammal 3DS-konfiguration krävs för att den nya 3DS-konfigurationen ska fungera (det rekommenderas att konfigurera båda).
  • Båda installationslägena fungerar oavsett vilken modell av konsol som kör installationsverktyget.
]]>
Hämtar aktuell status för systemfiler, vänta... + Avlänka konsolens unika data +
  • Din OTP, SecureInfo och LocalFriendCodeSeed kommer att tas bort från Azahar.
  • Din vänlista kommer att återställas och du kommer att loggas ut från ditt NNID/PNID-konto.
  • Systemfiler och e-butikstitlar som erhållits via Azahar kommer att bli otillgängliga tills samma konsol kopplas ihop igen med hjälp av installationsverktyget (spardata kommer inte att gå förlorade).

Fortsätt?]]>
Gammal 3DS-konfiguration Ny 3DS-konfiguration Konfiguration är möjlig. @@ -143,6 +169,8 @@ Användarnamn Nytt 3DS-läge Använd LLE Applets (om installerat) + Tillämpa regionsfri patch till installerade applikationer + Patchar regionen för installerade applikationer till att vara regionsfria så att de alltid visas på hemmenyn. Aktivera nödvändiga LLE-moduler för onlinefunktioner (om de är installerade) Aktiverar de LLE-moduler som krävs för multiplayer online, eShop-åtkomst etc. Klocka @@ -150,6 +178,7 @@ Ställ in den emulerade 3DS-klockan så att den antingen återspeglar den på din enhet eller startar vid ett simulerat datum och klockslag. Enhetsklocka Simulerad klocka + Om klockan är inställd på ”Simulerad klocka” ändras det fasta datumet och klockslaget för start. Profilinställningar Region Språk @@ -170,6 +199,13 @@ Inlästa 3GX-insticksmoduler från det emulerade SD-kortet om de finns tillgängliga. Tillåt applikationer att ändra insticksinläsarens tillstånd Tillåter homebrew-appar att aktivera insticksinläsaren även när den är inaktiverad. + Varning för regionskonflikt + Landsinställningen är inte giltig för den valda emulerade regionen. + Landsinställningen är inte giltig för den aktuella länkade konsolen. + Lagring + Komprimera installerat CIA-innehåll + Komprimerar innehållet i CIA-filer när det installeras på det emulerade SD-kortet. Påverkar endast CIA-innehåll som installeras medan inställningen är aktiverad. + Innerkamera Yttre vänstra kameran @@ -188,23 +224,36 @@ Grafik-API Aktivera generering av SPIR-V shader Skickar ut den fragment shader som används för att emulera PICA med SPIR-V istället för GLSL + Inaktivera SPIR-V Optimizer + Inaktiverar SPIR-V-optimeringspasset, vilket minskar hackandet avsevärt utan att påverka prestandan nämnvärt. Aktivera asynkron shader-kompilering Sammanställer shaders i bakgrunden för att minska stuttering under spelet. När det är aktiverat kan du förvänta dig tillfälliga grafiska glitches Lineär filtrering Aktiverar linjär filtrering, vilket gör att spelets grafik ser jämnare ut. Texturfilter Förbättrar det visuella i applikationer genom att tillämpa ett filter på texturer. De filter som stöds är Anime4K Ultrafast, Bicubic, ScaleForce, xBRZ freescale och MMPX. - Fördröj spelets renderingstråd + Fördröj spelrenderingstråd Fördröj spelets renderingstråd när den skickar data till GPU:n. Hjälper till med prestandaproblem i de (mycket få) applikationer med dynamiska bildfrekvenser. + Avancerat + Textursampling + Åsidosätter det samplingsfilter som används av spel. Detta kan vara användbart i vissa fall med spel som fungerar dåligt vid uppskalning. Om du är osäker, ställ in detta på Spelkontrollerat. Accurate Multiplication Använder mer exakt multiplikation i hårdvaru-shaders, vilket kan åtgärda vissa grafiska buggar. När detta är aktiverat kommer prestandan att minska. Aktivera asynkron GPU-emulering Använder en separat tråd för att emulera GPU:n asynkront. När detta är aktiverat kommer prestandan att förbättras. Begränsa hastighet + När funktionen är aktiverad begränsas emuleringshastigheten till en angiven procentandel av normal hastighet. Om funktionen är inaktiverad är emuleringshastigheten obegränsad och snabbtangenten för turbohastighet fungerar inte. Gränsa hastigheten i procent Anger procentsatsen för att begränsa emuleringshastigheten. Med standardvärdet 100% kommer emuleringen att begränsas till normal hastighet. Värden som är högre eller lägre ökar eller minskar hastighetsgränsen. + Dölj 3DS-bilder från Android + Förhindra att 3DS-kamera, skärmdumpar och anpassade texturbilder indexeras av Android och visas i galleriet. Enheten kan behöva startas om efter att denna inställning har ändrats för att den ska träda i kraft. + Begränsning för turbohastighet + Begränsning för emuleringshastighet som används när turbo-snabbtangenten är aktiv. + Expandera till hela skärmen + Expanderar visningsområdet till att inkludera sorgkanten (eller notch). Intern upplösning Anger den upplösning som används för rendering. En hög upplösning förbättrar den visuella kvaliteten avsevärt men är också ganska prestandakrävande och kan orsaka problem i vissa applikationer. + Automatiskt (Skärmstorlek) Inbyggd (400x240) 2x inbyggd (800x480) 3x inbyggd (1200x720) @@ -219,9 +268,18 @@ Varning: Om du ändrar dessa inställningar kommer emuleringen att bli långsammare Stereoskop Stereoskopiskt 3D-läge + Välj stereoskopiskt 3D-läge för 3D-rendering. Sida-vid-sida-lägen är vanligast i modern användning. Anaglyf- och interlaced-lägen gäller alltid för alla anslutna skärmar. Djup + Anger värdet för 3D-reglaget. Detta bör ställas in på högre än 0% när stereoskopisk 3D är aktiverat.\nObservera: Djupvärden över 100% är inte möjliga på verklig hårdvara och kan orsaka grafiska problem. Inaktivera rendering av höger öga Förbättrar prestandan avsevärt i vissa applikationer, men kan orsaka flimmer i andra. + Byt ögon + Byter vilket öga som visas på vilken sida. I kombination med Sida vid sida-läget kan du se 3D genom att korsa ögonen! + Rendera stereoskopisk 3D + Huruvida stereoskopisk 3D ska aktiveras och på vilka skärmar. Alternativen för en enda skärm är endast relevanta när flera skärmar är anslutna. + På (Alla skärmar) + På (Endast primär skärm) + På (Endast sekundär skärm) Cardboard VR Storlek på kartongskärm Skalar skärmen till en procentandel av dess ursprungliga storlek. @@ -258,28 +316,41 @@ Använder hårdvara för att emulera 3DS-shaders. När detta är aktiverat kommer spelprestanda att förbättras avsevärt. CPU-klockhastighet Aktivera V-Sync - Synkroniserar spelets bildfrekvens till uppdateringsfrekvensen på din enhet. + Synkroniserar spelets bildfrekvens med uppdateringsfrekvensen på din enhet. Kan orsaka ytterligare fördröjning av inmatningen, men kan i vissa fall minska bildfördröjningen. Felsök renderingsprogrammet Loggar ytterligare grafikrelaterad felsökningsinformation. När den är aktiverad kommer spelets prestanda att minska avsevärt. - Töm loggen för varje meddelande + Spola loggutdata vid varje meddelande Överför omedelbart felsökningsloggen till fil. Använd detta om Azahar kraschar och loggutmatningen skärs av. - Försenad start med LLE-moduler + Fördröjd start med LLE-moduler Fördröjer starten av appen när LLE-moduler är aktiverade. Deterministiska asynkrona operationer Gör asynkrona operationer deterministiska för felsökning. Om du aktiverar detta kan det orsaka frysningar. - + Aktivera RPC-server + Aktiverar RPC-servern på port 45987. Detta möjliggör fjärrläsning/skrivning av gästminne. + Aktivera Shader JIT + Använd JIT-motorn istället för tolken för emulering av programvaru-shader. + + Skärmorientering Automatisk Liggande Omvänd liggande Stående Omvänd stående + Standard + 16:9 + 4:3 + 21:9 + 16:10 + Sträck ut + Töm Standard Sparade inställningar Sparade inställningar för %1$s Fel vid sparande av %1$s.ini: %2$s + Sparar... Läser in... Nästa Bakåt @@ -300,10 +371,17 @@ Välj RTC-tid Vill du återställa inställningen till standardvärdet? Du kan inte redigera detta nu + Inställning inaktiverad + Denna inställning är för närvarande inaktiverad på grund av att en annan inställning inte har rätt värde. Det här alternativet kan inte ändras medan ett spel pågår. Autovälj Starta Avbryter... + Viktigt + Visa inte igen + Synlighet + Information + Välj spelmapp @@ -341,6 +419,10 @@ Konfigurera kontroller Redigera layout Klar + Knappglidning + Håll den ursprungligen intryckta knappen intryckt + Håll den aktuella knappen intryckt + Håll ursprungliga och aktuell knapptryckning intryckt Växla kontroller Justera skala Global skala @@ -350,8 +432,11 @@ Glidning för riktningsknappar Öppna inställningar Öppna fusk + Bildförhållande Liggande skärmlayout Stående skärmlayout + Layout för sekundär skärm + Layouten som används av en ansluten sekundär skärm, trådbunden eller trådlös (Chromecast, Miracast) Stor skärm Stående Enkel skärm @@ -359,7 +444,15 @@ Hybridskärmar Original Standard + Systemstandard (spegel) Anpassad layout + Bakgrundsfärg + Den färg som visas bakom skärmarna under emulering, representerad som ett RGB-värde. + Röd + Grön + Blå + Anpassad layout för opacitet på andra skärmen + Opaciteten för den andra 3DS-skärmen när du använder en anpassad skärmlayout. Användbart om den andra skärmen ska placeras ovanpå den första skärmen. Position för liten skärm Var ska den lilla skärmen visas i förhållande till den stora i storskärmslayout? Uppe till höger @@ -370,6 +463,8 @@ Ner till vänster Ovanför Under + Skärmavstånd + Avstånd mellan skärmarna i alla tvåskärmslägen. Mätt i px i förhållande till den större skärmens höjd på 240 px. Storbildsproportion Hur många gånger större är den stora skärmen än den lilla skärmen i storskärmslayout? Justera anpassad layout i inställningarna @@ -383,7 +478,9 @@ Höjd Växla layouter Skärmbyte + Vrid skärmen upprätt Återställ överlägg + Visa kontrolleröverlägg Stäng spelet Växla paus Diverse @@ -450,13 +547,67 @@ Spara/läs in-fel Allvarligt fel Ett allvarligt fel inträffade. Kontrollera loggen för detaljer.\nFortsatt emulering kan leda till krascher och buggar. + Krypterad applikation som inte stöds + Ogiltigt systemläge + Nya 3DS-exklusiva applikationer kan inte läsas in utan att aktivera Ny 3DS-läget. + Förbereder shaders Bygger shaders Spela + Avinstallera applikation + Avinstallerar... + Öppna mapp för sparat data + Öppna applikationsmapp + Öppna mapp för moddar + Öppna texturmapp + Öppna DLC-mapp + Öppna mapp för uppdateringar + Öppna extramapp + Avinstallera DLC + Avinstallera uppdateringar Genväg + Genvägsnamn + Redigera ikon + Skapa genväg + Genvägsnamnet får inte vara tomt + Sträck ut för att passa bild + ID: + Fil: + Typ: + Mata in cartridge + Mata ut cartridge + + + Visa prestandaöverlägg + Prestandaöverlägg + Aktivera prestandaöverlägg + Konfigurera om prestandaöverlägget ska visas och vilken information som ska visas. + Visa bilder/s + Visa aktuella bilder per sekund. + Visa bildrutetider + Visa aktuella bildrutetider. + Visa hastighet + Visa aktuell emuleringshastighet i procent. + Visa användning av programminne + Visa mängden RAM-minne som används av emulatorn. + Visa tillgängligt minne + Visa mängden tillgängligt RAM-minne. + Visa batteritemperatur + Visa aktuell batteritemperatur i Celsius och Fahrenheit. + Överläggsposition + Välj var prestandaöverlägget ska visas på skärmen. + Överst till vänster + Överst till höger + Nederst till vänster + Nederst till höger + Mitten längst upp + Mitten längst ner + Bakgrund för överlägg + Lägger till en bakgrund bakom överlägget för att underlätta läsningen. + Fusk Lägg till fusk @@ -477,6 +628,7 @@ Azahar-meddelanden under CIA-installation Installation av CIA + Installerar %1$s (%2$d/%3$d) Har installerat CIA Installation av CIA misslyckades \"%s\" har installerats framgångsrikt @@ -558,7 +710,7 @@ Sida vid sida - Omvänd sida vid sida + Sida vid sida full bredd Anaglyf Interlaced Omvänd interlaced @@ -574,7 +726,11 @@ xBRZ MMPX + + Spelkontrollerat Närmaste granne + Linjär + Mono Stereo @@ -743,4 +899,19 @@ Snabbspara - %1$tF %1$tR Ingen snabbsparning tillgänglig + + Komprimera + Komprimerar... + Avkomprimera + Avkomprimerar... + Komprimeringen färdigställd. + Komprimering stöds inte för denna fil. + Filen är redan komprimerad. + Komprimering misslyckades. + Avkomprimeringen färdigställd. + Avkomprimering stöds inte för denna fil. + Filen är inte komprimerad. + Avkomprimering misslyckades. + Redan installerade applikationer kan inte komprimeras eller avkomprimeras. + diff --git a/src/android/app/src/main/res/values/arrays.xml b/src/android/app/src/main/res/values/arrays.xml index 17bda5e66..2a08cd546 100644 --- a/src/android/app/src/main/res/values/arrays.xml +++ b/src/android/app/src/main/res/values/arrays.xml @@ -238,9 +238,8 @@ - @string/off @string/side_by_side - @string/reverse_side_by_side + @string/side_by_side_full @string/anaglyph @string/interlaced @string/reverse_interlaced @@ -248,7 +247,6 @@ - 0 1 2 3 @@ -257,6 +255,20 @@ 6 + + @string/off + @string/render_3d_which_display_both + @string/render_3d_which_display_primary + @string/render_3d_which_display_secondary + + + + 0 + 1 + 2 + 3 + + @string/opengles @string/vulkan diff --git a/src/android/app/src/main/res/values/strings.xml b/src/android/app/src/main/res/values/strings.xml index f60fdd0e3..5bbafd999 100644 --- a/src/android/app/src/main/res/values/strings.xml +++ b/src/android/app/src/main/res/values/strings.xml @@ -76,10 +76,14 @@ Grant permission Skip granting the notification permission? Azahar won\'t be able to notify you of important information. + Missing Permissions + Azahar requires permission to manage files on this device in order to store and manage its data.\n\nPlease grant the \"Filesystem\" permission before continuing. Camera Grant the camera permission below to emulate the 3DS camera. Microphone Grant the microphone permission below to emulate the 3DS microphone. + Filesystem + Grant the filesystem permission below to allow Azahar to store files. Permission denied Skip selecting applications folder? Software won\'t be displayed in the Applications list if a folder isn\'t selected. @@ -100,6 +104,9 @@ You can\'t skip setting up the user folder This step is required to allow Azahar to work. Please select a directory and then you can continue. You have lost write permissions on your user data directory, where saves and other information are stored. This can happen after some app or Android updates. Please re-select the directory to regain permissions so you can continue. + Invalid Selection + The user directory selection was invalid.\nPlease re-select the user directory, ensuring that you navigate to it from the root of your device\'s storage. + Azahar has lost permission to manage files on this device. This can happen after some app or Android updates. Please re-grant this permission on the next screen to continue using the app. https://web.archive.org/web/20240304193549/https://github.com/citra-emu/citra/wiki/Citra-Android-user-data-and-storage Theme Settings Configure your theme preferences for Azahar. @@ -133,8 +140,8 @@ Press or move an input. Input Binding Press or move an input to bind it to %1$s. - Move your joystick up or down. - Move your joystick left or right. + Move your joystick down + Move your joystick right A B SELECT @@ -183,6 +190,8 @@ Username New 3DS Mode Use LLE Applets (if installed) + Apply region free patch to installed applications + Patches the region of installed applications to be region free, so that they always appear on the home menu. Enable required LLE modules for online features (if installed) Enables the LLE modules required for online multiplayer, eShop access, etc. Clock @@ -280,10 +289,18 @@ Warning: Modifying these settings will slow emulation Stereoscopy Stereoscopic 3D Mode + Choose the stereoscopic 3D mode for 3D rendering. Side by Side modes are most common in modern use. Anaglyph and Interlaced modes will always apply to all connected displays. Depth Specifies the value of the 3D slider. This should be set to higher than 0% when Stereoscopic 3D is enabled.\nNote: Depth values over 100% are not possible on real hardware and may cause graphical issues Disable Right Eye Render Greatly improves performance in some applications, but can cause flickering in others. + Swap Eyes + Swaps which eye is shown in which side. Combined with Side by Side mode makes it possible to see 3D by crossing your eyes! + Render Stereoscopic 3D + Whether to enable stereoscopic 3D, and on which displays. The single display options are only relevant when multiple displays are connected. + On (All Displays) + On (Primary Display Only) + On (Secondary Display Only) Cardboard VR Cardboard Screen Size Scales the screen to a percentage of its original size. @@ -552,6 +569,8 @@ Fatal Error A fatal error occurred. Check the log for details.\nContinuing emulation may result in crashes and bugs. Unsupported encrypted application + Invalid system mode + New 3DS exclusive applications cannot be loaded without enabling the New 3DS mode. Preparing Shaders @@ -579,6 +598,8 @@ ID: File: Type: + Insert Cartridge + Eject Cartridge Show Performance Overlay @@ -712,7 +733,7 @@ Side by Side - Reverse Side by Side + Side by Side Full Width Anaglyph Interlaced Reverse Interlaced @@ -901,4 +922,19 @@ Quicksave - %1$tF %1$tR No Quicksave available. + + Compress + Compressing… + Decompress + Decompressing… + Compression completed successfully. + Compression not supported for this file. + File is already compressed. + Compression failed. + Decompression completed successfully. + Decompression not supported for this file. + File is not compressed. + Decompression failed. + Already installed applications cannot be compressed or decompressed. + diff --git a/src/android/build.gradle.kts b/src/android/build.gradle.kts index aef05f5be..a0d43cb49 100644 --- a/src/android/build.gradle.kts +++ b/src/android/build.gradle.kts @@ -4,8 +4,8 @@ // Top-level build file where you can add configuration options common to all sub-projects/modules. plugins { - id("com.android.application") version "8.11.1" apply false - id("com.android.library") version "8.11.1" apply false + id("com.android.application") version "8.13.1" apply false + id("com.android.library") version "8.13.1" apply false id("org.jetbrains.kotlin.android") version "2.0.20" apply false id("org.jetbrains.kotlin.plugin.serialization") version "2.0.20" } diff --git a/src/audio_core/cubeb_input.cpp b/src/audio_core/cubeb_input.cpp index 0cd650af6..63f66fd77 100644 --- a/src/audio_core/cubeb_input.cpp +++ b/src/audio_core/cubeb_input.cpp @@ -144,11 +144,6 @@ Samples CubebInput::Read() { while (impl->sample_queue.Pop(queue)) { samples.insert(samples.end(), queue.begin(), queue.end()); } - - if (samples.empty()) { - samples = GenerateSilentSamples(parameters); - } - return samples; } diff --git a/src/audio_core/dsp_interface.cpp b/src/audio_core/dsp_interface.cpp index 5f85b67e4..259459a5b 100644 --- a/src/audio_core/dsp_interface.cpp +++ b/src/audio_core/dsp_interface.cpp @@ -1,4 +1,4 @@ -// Copyright 2017 Citra Emulator Project +// Copyright Citra Emulator Project / Azahar Emulator Project // Licensed under GPLv2 or any later version // Refer to the license.txt file included. diff --git a/src/audio_core/dsp_interface.h b/src/audio_core/dsp_interface.h index e2e76db6d..6e7ded2c1 100644 --- a/src/audio_core/dsp_interface.h +++ b/src/audio_core/dsp_interface.h @@ -1,4 +1,4 @@ -// Copyright 2017 Citra Emulator Project +// Copyright Citra Emulator Project / Azahar Emulator Project // Licensed under GPLv2 or any later version // Refer to the license.txt file included. @@ -86,9 +86,6 @@ public: */ virtual void PipeWrite(DspPipe pipe_number, std::span buffer) = 0; - /// Returns a reference to the array backing DSP memory - virtual std::array& GetDspMemory() = 0; - /// Sets the handler for the interrupts we trigger virtual void SetInterruptHandler( std::function handler) = 0; diff --git a/src/audio_core/hle/aac_decoder.cpp b/src/audio_core/hle/aac_decoder.cpp index aba724978..054674367 100644 --- a/src/audio_core/hle/aac_decoder.cpp +++ b/src/audio_core/hle/aac_decoder.cpp @@ -8,7 +8,7 @@ namespace AudioCore::HLE { AACDecoder::AACDecoder(Memory::MemorySystem& memory) : memory(memory) { - OpenNewDecoder(); + Reset(); } AACDecoder::~AACDecoder() { @@ -63,6 +63,10 @@ BinaryMessage AACDecoder::ProcessRequest(const BinaryMessage& request) { } } +void AACDecoder::Reset() { + OpenNewDecoder(); +} + BinaryMessage AACDecoder::Decode(const BinaryMessage& request) { BinaryMessage response{}; response.header.codec = request.header.codec; diff --git a/src/audio_core/hle/aac_decoder.h b/src/audio_core/hle/aac_decoder.h index eb9d62295..1edbabd0b 100644 --- a/src/audio_core/hle/aac_decoder.h +++ b/src/audio_core/hle/aac_decoder.h @@ -16,6 +16,8 @@ public: ~AACDecoder() override; BinaryMessage ProcessRequest(const BinaryMessage& request) override; + void Reset() override; + private: BinaryMessage Decode(const BinaryMessage& request); bool OpenNewDecoder(); diff --git a/src/audio_core/hle/decoder.h b/src/audio_core/hle/decoder.h index 53365f45c..87bc3ef2c 100644 --- a/src/audio_core/hle/decoder.h +++ b/src/audio_core/hle/decoder.h @@ -1,4 +1,4 @@ -// Copyright 2018 Citra Emulator Project +// Copyright Citra Emulator Project / Azahar Emulator Project // Licensed under GPLv2 or any later version // Refer to the license.txt file included. @@ -137,6 +137,8 @@ class DecoderBase { public: virtual ~DecoderBase() = default; virtual BinaryMessage ProcessRequest(const BinaryMessage& request) = 0; + + virtual void Reset() = 0; }; } // namespace AudioCore::HLE diff --git a/src/audio_core/hle/hle.cpp b/src/audio_core/hle/hle.cpp index 2ad86ca73..f01631c7c 100644 --- a/src/audio_core/hle/hle.cpp +++ b/src/audio_core/hle/hle.cpp @@ -1,4 +1,4 @@ -// Copyright 2017 Citra Emulator Project +// Copyright Citra Emulator Project / Azahar Emulator Project // Licensed under GPLv2 or any later version // Refer to the license.txt file included. @@ -6,6 +6,7 @@ #include #include +#include #include #include #include @@ -60,12 +61,14 @@ public: std::size_t GetPipeReadableSize(DspPipe pipe_number) const; void PipeWrite(DspPipe pipe_number, std::span buffer); - std::array& GetDspMemory(); - void SetInterruptHandler( std::function handler); private: + void Initialize(); + void Sleep(); + void Wakeup(); + void ResetPipes(); void WriteU16(DspPipe pipe_number, u16 value); void AudioPipeWriteStructAddresses(); @@ -81,7 +84,10 @@ private: DspState dsp_state = DspState::Off; std::array, num_dsp_pipe> pipe_data{}; - HLE::DspMemory dsp_memory; +public: + HLE::DspMemory* dsp_memory; + +private: std::array sources{{ HLE::Source(0), HLE::Source(1), HLE::Source(2), HLE::Source(3), HLE::Source(4), HLE::Source(5), HLE::Source(6), HLE::Source(7), HLE::Source(8), HLE::Source(9), @@ -91,6 +97,8 @@ private: }}; HLE::Mixers mixers{}; + HLE::DspMemory backup_dsp_memory; + DspHle& parent; Core::Timing& core_timing; Core::TimingEventType* tick_event{}; @@ -101,9 +109,10 @@ private: template void serialize(Archive& ar, const unsigned int) { + ar& boost::serialization::make_binary_object(backup_dsp_memory.raw_memory.data(), + backup_dsp_memory.raw_memory.size()); ar & dsp_state; ar & pipe_data; - ar & dsp_memory.raw_memory; ar & sources; ar & mixers; // interrupt_handler is reregistered when loading state from DSP_DSP @@ -113,7 +122,8 @@ private: DspHle::Impl::Impl(DspHle& parent_, Memory::MemorySystem& memory, Core::Timing& timing) : parent(parent_), core_timing(timing) { - dsp_memory.raw_memory.fill(0); + dsp_memory = reinterpret_cast(memory.GetDspMemory(0)); + dsp_memory->raw_memory.fill(0); for (auto& source : sources) { source.SetMemory(memory); @@ -216,8 +226,6 @@ void DspHle::Impl::PipeWrite(DspPipe pipe_number, std::span buffer) { Sleep = 3, }; - // The difference between Initialize and Wakeup is that Input state is maintained - // when sleeping but isn't when turning it off and on again. (TODO: Implement this.) // Waking up from sleep garbles some of the structs in the memory region. (TODO: // Implement this.) Applications store away the state of these structs before // sleeping and reset it back after wakeup on behalf of the DSP. @@ -225,7 +233,7 @@ void DspHle::Impl::PipeWrite(DspPipe pipe_number, std::span buffer) { switch (static_cast(buffer[0])) { case StateChange::Initialize: LOG_INFO(Audio_DSP, "Application has requested initialization of DSP hardware"); - ResetPipes(); + Initialize(); AudioPipeWriteStructAddresses(); dsp_state = DspState::On; break; @@ -235,13 +243,13 @@ void DspHle::Impl::PipeWrite(DspPipe pipe_number, std::span buffer) { break; case StateChange::Wakeup: LOG_INFO(Audio_DSP, "Application has requested wakeup of DSP hardware"); - ResetPipes(); + Wakeup(); AudioPipeWriteStructAddresses(); dsp_state = DspState::On; break; case StateChange::Sleep: LOG_INFO(Audio_DSP, "Application has requested sleep of DSP hardware"); - UNIMPLEMENTED(); + Sleep(); AudioPipeWriteStructAddresses(); dsp_state = DspState::Sleeping; break; @@ -284,20 +292,56 @@ void DspHle::Impl::PipeWrite(DspPipe pipe_number, std::span buffer) { } } -std::array& DspHle::Impl::GetDspMemory() { - return dsp_memory.raw_memory; -} - void DspHle::Impl::SetInterruptHandler( std::function handler) { interrupt_handler = handler; } +void DspHle::Impl::Initialize() { + // TODO(PabloMK7): This is NOT the right way to do this, + // but it is close enough. This makes sure the DSP state + // is clean and consistent every time the HW is initialized, + // but what is exactly reset needs to be figured out. + dsp_memory->raw_memory.fill(0); + mixers.Reset(); + for (auto& s : sources) { + s.Reset(); + } + aac_decoder->Reset(); + ResetPipes(); +} + +void DspHle::Impl::Sleep() { + // TODO(PabloMK7): This is NOT the right way to do this, + // but it is close enough. What state is saved on + // real hardware still not figured out. + backup_dsp_memory.raw_memory = dsp_memory->raw_memory; + mixers.Sleep(); + for (auto& s : sources) { + s.Sleep(); + } + // TODO(PabloMK7): Figure out if we need to save the state + // of the AAC decoder, probably not. +} + +void DspHle::Impl::Wakeup() { + // TODO(PabloMK7): This is NOT the right way to do this, + // but it is close enough. What state is restored on + // real hardware still not figured out. + dsp_memory->raw_memory = backup_dsp_memory.raw_memory; + backup_dsp_memory.raw_memory.fill(0); + mixers.Wakeup(); + for (auto& s : sources) { + s.Wakeup(); + } + aac_decoder->Reset(); + ResetPipes(); +} + void DspHle::Impl::ResetPipes() { for (auto& data : pipe_data) { data.clear(); } - dsp_state = DspState::Off; } void DspHle::Impl::WriteU16(DspPipe pipe_number, u16 value) { @@ -343,8 +387,8 @@ void DspHle::Impl::AudioPipeWriteStructAddresses() { size_t DspHle::Impl::CurrentRegionIndex() const { // The region with the higher frame counter is chosen unless there is wraparound. // This function only returns a 0 or 1. - const u16 frame_counter_0 = dsp_memory.region_0.frame_counter; - const u16 frame_counter_1 = dsp_memory.region_1.frame_counter; + const u16 frame_counter_0 = dsp_memory->region_0.frame_counter; + const u16 frame_counter_1 = dsp_memory->region_1.frame_counter; if (frame_counter_0 == 0xFFFFu && frame_counter_1 != 0xFFFEu) { // Wraparound has occurred. @@ -360,11 +404,11 @@ size_t DspHle::Impl::CurrentRegionIndex() const { } HLE::SharedMemory& DspHle::Impl::ReadRegion() { - return CurrentRegionIndex() == 0 ? dsp_memory.region_0 : dsp_memory.region_1; + return CurrentRegionIndex() == 0 ? dsp_memory->region_0 : dsp_memory->region_1; } HLE::SharedMemory& DspHle::Impl::WriteRegion() { - return CurrentRegionIndex() != 0 ? dsp_memory.region_0 : dsp_memory.region_1; + return CurrentRegionIndex() != 0 ? dsp_memory->region_0 : dsp_memory->region_1; } StereoFrame16 DspHle::Impl::GenerateCurrentFrame() { @@ -399,15 +443,19 @@ StereoFrame16 DspHle::Impl::GenerateCurrentFrame() { } bool DspHle::Impl::Tick() { - StereoFrame16 current_frame = {}; + bool is_on = GetDspState() == DspState::On; - // TODO: Check dsp::DSP semaphore (which indicates emulated application has finished writing to - // shared memory region) - current_frame = GenerateCurrentFrame(); + if (is_on) { + StereoFrame16 current_frame = {}; - parent.OutputFrame(std::move(current_frame)); + // TODO: Check dsp::DSP semaphore (which indicates emulated application has finished writing + // to shared memory region) + current_frame = GenerateCurrentFrame(); - return GetDspState() == DspState::On; + parent.OutputFrame(std::move(current_frame)); + } + + return is_on; } void DspHle::Impl::AudioTickCallback(s64 cycles_late) { @@ -454,10 +502,6 @@ void DspHle::PipeWrite(DspPipe pipe_number, std::span buffer) { impl->PipeWrite(pipe_number, buffer); } -std::array& DspHle::GetDspMemory() { - return impl->GetDspMemory(); -} - void DspHle::SetInterruptHandler( std::function handler) { impl->SetInterruptHandler(handler); @@ -466,11 +510,13 @@ void DspHle::SetInterruptHandler( void DspHle::LoadComponent(std::span component_data) { // HLE doesn't need DSP program. Only log some info here LOG_INFO(Service_DSP, "Firmware hash: {:#018x}", - Common::ComputeHash64(component_data.data(), component_data.size())); + Common::ComputeHash64(component_data.data(), + component_data.size())); // Some versions of the firmware have the location of DSP structures listed here. if (component_data.size() > 0x37C) { - LOG_INFO(Service_DSP, "Structures hash: {:#018x}", - Common::ComputeHash64(component_data.data() + 0x340, 60)); + LOG_INFO( + Service_DSP, "Structures hash: {:#018x}", + Common::ComputeHash64(component_data.data() + 0x340, 60)); } } diff --git a/src/audio_core/hle/hle.h b/src/audio_core/hle/hle.h index 2ee4421e7..1dba7450a 100644 --- a/src/audio_core/hle/hle.h +++ b/src/audio_core/hle/hle.h @@ -1,4 +1,4 @@ -// Copyright 2017 Citra Emulator Project +// Copyright Citra Emulator Project / Azahar Emulator Project // Licensed under GPLv2 or any later version // Refer to the license.txt file included. @@ -37,8 +37,6 @@ public: std::size_t GetPipeReadableSize(DspPipe pipe_number) const override; void PipeWrite(DspPipe pipe_number, std::span buffer) override; - std::array& GetDspMemory() override; - void SetInterruptHandler( std::function handler) override; diff --git a/src/audio_core/hle/mixers.cpp b/src/audio_core/hle/mixers.cpp index e3a838886..cfe99244a 100644 --- a/src/audio_core/hle/mixers.cpp +++ b/src/audio_core/hle/mixers.cpp @@ -1,4 +1,4 @@ -// Copyright 2016 Citra Emulator Project +// Copyright Citra Emulator Project / Azahar Emulator Project // Licensed under GPLv2 or any later version // Refer to the license.txt file included. @@ -15,6 +15,18 @@ void Mixers::Reset() { state = {}; } +void Mixers::Sleep() { + backup_state = state; + backup_frame = current_frame; +} + +void Mixers::Wakeup() { + state = backup_state; + current_frame = backup_frame; + backup_state = {}; + backup_frame.fill({}); +} + DspStatus Mixers::Tick(DspConfiguration& config, const IntermediateMixSamples& read_samples, IntermediateMixSamples& write_samples, const std::array& input) { diff --git a/src/audio_core/hle/mixers.h b/src/audio_core/hle/mixers.h index b09654dfc..95d9e86e3 100644 --- a/src/audio_core/hle/mixers.h +++ b/src/audio_core/hle/mixers.h @@ -1,4 +1,4 @@ -// Copyright 2016 Citra Emulator Project +// Copyright Citra Emulator Project / Azahar Emulator Project // Licensed under GPLv2 or any later version // Refer to the license.txt file included. @@ -19,6 +19,9 @@ public: void Reset(); + void Sleep(); + void Wakeup(); + DspStatus Tick(DspConfiguration& config, const IntermediateMixSamples& read_samples, IntermediateMixSamples& write_samples, const std::array& input); @@ -28,10 +31,11 @@ public: private: StereoFrame16 current_frame = {}; + StereoFrame16 backup_frame = {}; // TODO(PabloMK7): Check if we actually need this using OutputFormat = DspConfiguration::OutputFormat; - struct { + struct MixerState { std::array intermediate_mixer_volume = {}; std::array aux_bus_enable = {}; @@ -39,7 +43,17 @@ private: OutputFormat output_format = OutputFormat::Stereo; - } state; + template + void serialize(Archive& ar, const unsigned int) { + ar & intermediate_mixer_volume; + ar & aux_bus_enable; + ar & intermediate_mix_buffer; + ar & output_format; + } + }; + + MixerState state; + MixerState backup_state; /// INTERNAL: Update our internal state based on the current config. void ParseConfig(DspConfiguration& config); @@ -58,10 +72,9 @@ private: template void serialize(Archive& ar, const unsigned int) { ar & current_frame; - ar & state.intermediate_mixer_volume; - ar & state.aux_bus_enable; - ar & state.intermediate_mix_buffer; - ar & state.output_format; + ar & backup_frame; + ar & state; + ar & backup_state; } friend class boost::serialization::access; }; diff --git a/src/audio_core/hle/shared_memory.h b/src/audio_core/hle/shared_memory.h index 41dc4e25c..194f517a9 100644 --- a/src/audio_core/hle/shared_memory.h +++ b/src/audio_core/hle/shared_memory.h @@ -1,4 +1,4 @@ -// Copyright 2016 Citra Emulator Project +// Copyright Citra Emulator Project / Azahar Emulator Project // Licensed under GPLv2 or any later version // Refer to the license.txt file included. @@ -533,6 +533,7 @@ union DspMemory { u8 unused_2[0x8000]; }; }; +static_assert(sizeof(DspMemory) == 0x80000, "Incorrect DSP memory size"); static_assert(offsetof(DspMemory, region_0) == region0_offset, "DSP region 0 is at the wrong offset"); static_assert(offsetof(DspMemory, region_1) == region1_offset, diff --git a/src/audio_core/hle/source.cpp b/src/audio_core/hle/source.cpp index c90201bbd..018368704 100644 --- a/src/audio_core/hle/source.cpp +++ b/src/audio_core/hle/source.cpp @@ -1,4 +1,4 @@ -// Copyright 2016 Citra Emulator Project +// Copyright Citra Emulator Project / Azahar Emulator Project // Licensed under GPLv2 or any later version // Refer to the license.txt file included. @@ -44,6 +44,18 @@ void Source::Reset() { state = {}; } +void Source::Sleep() { + backup_frame = current_frame; + backup_state = state; +} + +void Source::Wakeup() { + current_frame = backup_frame; + state = backup_state; + backup_frame.fill({}); + backup_state = {}; +} + void Source::SetMemory(Memory::MemorySystem& memory) { memory_system = &memory; } diff --git a/src/audio_core/hle/source.h b/src/audio_core/hle/source.h index 2073e9033..c0c1fdc1a 100644 --- a/src/audio_core/hle/source.h +++ b/src/audio_core/hle/source.h @@ -1,4 +1,4 @@ -// Copyright 2016 Citra Emulator Project +// Copyright Citra Emulator Project / Azahar Emulator Project // Licensed under GPLv2 or any later version // Refer to the license.txt file included. @@ -42,6 +42,9 @@ public: /// Resets internal state. void Reset(); + void Sleep(); + void Wakeup(); + /// Sets the memory system to read data from void SetMemory(Memory::MemorySystem& memory); @@ -68,6 +71,7 @@ private: const std::size_t source_id; Memory::MemorySystem* memory_system{}; StereoFrame16 current_frame; + StereoFrame16 backup_frame; // TODO(PabloMK7): Check if we actually need this using Format = SourceConfiguration::Configuration::Format; using InterpolationMode = SourceConfiguration::Configuration::InterpolationMode; @@ -116,7 +120,7 @@ private: } }; - struct { + struct SourceState { // State variables @@ -179,8 +183,10 @@ private: ar & interpolation_mode; } friend class boost::serialization::access; + }; - } state; + SourceState state; + SourceState backup_state; // Internal functions @@ -197,6 +203,9 @@ private: template void serialize(Archive& ar, const unsigned int) { ar & state; + ar & backup_state; + ar & current_frame; + ar & backup_frame; } friend class boost::serialization::access; }; diff --git a/src/audio_core/input.h b/src/audio_core/input.h index e47f5942c..f43764296 100644 --- a/src/audio_core/input.h +++ b/src/audio_core/input.h @@ -53,22 +53,6 @@ public: */ virtual Samples Read() = 0; - /** - * Generates a buffer of silence. - * Takes into account the sample size and signedness of the input. - */ - virtual Samples GenerateSilentSamples(const InputParameters& params) { - u8 silent_value = 0x00; - - if (params.sample_size == 8) { - silent_value = params.sign == Signedness::Unsigned ? 0x80 : 0x00; - return std::vector(32, silent_value); - } else { - silent_value = params.sign == Signedness::Unsigned ? 0x80 : 0x00; - return std::vector(64, silent_value); - } - } - protected: InputParameters parameters; }; diff --git a/src/audio_core/lle/lle.cpp b/src/audio_core/lle/lle.cpp index 91ac5dc73..0e301f72d 100644 --- a/src/audio_core/lle/lle.cpp +++ b/src/audio_core/lle/lle.cpp @@ -1,4 +1,4 @@ -// Copyright 2018 Citra Emulator Project +// Copyright Citra Emulator Project / Azahar Emulator Project // Licensed under GPLv2 or any later version // Refer to the license.txt file included. @@ -121,7 +121,9 @@ static u8 PipeIndexToSlotIndex(u8 pipe_index, PipeDirection direction) { } struct DspLle::Impl final { - Impl(Core::Timing& timing, bool multithread) : core_timing(timing), multithread(multithread) { + Impl(Core::Timing& timing, Memory::MemorySystem& memory, bool multithread) + : teakra(Teakra::UserConfig{.dsp_memory = memory.GetDspMemory(0)}), core_timing(timing), + multithread(multithread) { teakra_slice_event = core_timing.RegisterEvent( "DSP slice", [this](u64, int late) { TeakraSliceEvent(static_cast(late)); }); } @@ -189,12 +191,12 @@ struct DspLle::Impl final { } u8* GetDspDataPointer(u32 baddr) { - auto& memory = teakra.GetDspMemory(); + uint8_t* memory = teakra.GetDspMemory(); return &memory[DspDataOffset + baddr]; } const u8* GetDspDataPointer(u32 baddr) const { - auto& memory = teakra.GetDspMemory(); + const uint8_t* memory = teakra.GetDspMemory(); return &memory[DspDataOffset + baddr]; } @@ -312,9 +314,9 @@ struct DspLle::Impl final { teakra.Reset(); Dsp1 dsp(buffer); - auto& dsp_memory = teakra.GetDspMemory(); - u8* program = dsp_memory.data(); - u8* data = dsp_memory.data() + DspDataOffset; + auto dsp_memory = teakra.GetDspMemory(); + u8* program = dsp_memory; + u8* data = dsp_memory + DspDataOffset; for (const auto& segment : dsp.segments) { if (segment.memory_type == SegmentType::ProgramA || segment.memory_type == SegmentType::ProgramB) { @@ -403,10 +405,6 @@ void DspLle::PipeWrite(DspPipe pipe_number, std::span buffer) { impl->WritePipe(static_cast(pipe_number), buffer); } -std::array& DspLle::GetDspMemory() { - return impl->teakra.GetDspMemory(); -} - void DspLle::SetInterruptHandler( std::function handler) { impl->teakra.SetRecvDataHandler(0, [this, handler]() { @@ -469,7 +467,7 @@ DspLle::DspLle(Core::System& system, bool multithread) DspLle::DspLle(Core::System& system, Memory::MemorySystem& memory, Core::Timing& timing, bool multithread) - : DspInterface(system), impl(std::make_unique(timing, multithread)) { + : DspInterface(system), impl(std::make_unique(timing, memory, multithread)) { Teakra::AHBMCallback ahbm; ahbm.read8 = [&memory](u32 address) -> u8 { return *memory.GetFCRAMPointer(address - Memory::FCRAM_PADDR); diff --git a/src/audio_core/lle/lle.h b/src/audio_core/lle/lle.h index 7ae64575d..7cfd62e29 100644 --- a/src/audio_core/lle/lle.h +++ b/src/audio_core/lle/lle.h @@ -1,4 +1,4 @@ -// Copyright 2018 Citra Emulator Project +// Copyright Citra Emulator Project / Azahar Emulator Project // Licensed under GPLv2 or any later version // Refer to the license.txt file included. @@ -31,8 +31,6 @@ public: std::size_t GetPipeReadableSize(DspPipe pipe_number) const override; void PipeWrite(DspPipe pipe_number, std::span buffer) override; - std::array& GetDspMemory() override; - void SetInterruptHandler( std::function handler) override; diff --git a/src/audio_core/null_input.h b/src/audio_core/null_input.h index 1b0796ea7..448120247 100644 --- a/src/audio_core/null_input.h +++ b/src/audio_core/null_input.h @@ -30,11 +30,10 @@ public: void AdjustSampleRate(u32 sample_rate) override {} Samples Read() override { - return GenerateSilentSamples(parameters); + return {}; } private: - InputParameters parameters; bool is_sampling = false; }; diff --git a/src/audio_core/openal_input.cpp b/src/audio_core/openal_input.cpp index 3d4c55fb0..edf20bb47 100644 --- a/src/audio_core/openal_input.cpp +++ b/src/audio_core/openal_input.cpp @@ -108,10 +108,6 @@ Samples OpenALInput::Read() { return {}; } - if (samples.empty()) { - samples = GenerateSilentSamples(parameters); - } - return samples; } diff --git a/src/citra_qt/CMakeLists.txt b/src/citra_qt/CMakeLists.txt index 7dc2b777b..e6faa88ce 100644 --- a/src/citra_qt/CMakeLists.txt +++ b/src/citra_qt/CMakeLists.txt @@ -287,7 +287,9 @@ if (NOT WIN32) endif() endif() -if (UNIX AND NOT APPLE) +if (APPLE) + target_link_libraries(citra_qt PRIVATE Qt6::QDarwinCameraPermissionPlugin) +elseif (UNIX) target_link_libraries(citra_qt PRIVATE Qt6::DBus gamemode) endif() diff --git a/src/citra_qt/citra_qt.cpp b/src/citra_qt/citra_qt.cpp index ea28f0f2c..d3e25beab 100644 --- a/src/citra_qt/citra_qt.cpp +++ b/src/citra_qt/citra_qt.cpp @@ -115,6 +115,7 @@ #ifdef __APPLE__ #include "common/apple_authorization.h" +Q_IMPORT_PLUGIN(QDarwinCameraPermissionPlugin); #endif #ifdef USE_DISCORD_PRESENCE @@ -1242,6 +1243,10 @@ bool GMainWindow::LoadROM(const QString& filename) { const auto scope = render_window->Acquire(); + if (!UISettings::values.inserted_cartridge.GetValue().empty()) { + system.InsertCartridge(UISettings::values.inserted_cartridge.GetValue()); + } + const Core::System::ResultStatus result{ system.Load(*render_window, filename.toStdString(), secondary_window)}; @@ -1312,6 +1317,11 @@ bool GMainWindow::LoadROM(const QString& filename) { system.GetStatusDetails()) .c_str())); break; + case Core::System::ResultStatus::ErrorN3DSApplication: + QMessageBox::critical(this, tr("Invalid system mode"), + tr("New 3DS exclusive applications cannot be loaded without " + "enabling the New 3DS mode.")); + break; default: QMessageBox::critical( this, tr("Error while loading App!"), @@ -1526,6 +1536,8 @@ void GMainWindow::ShutdownGame() { emu_thread->wait(); emu_thread = nullptr; + system.EjectCartridge(); + OnCloseMovie(); discord_rpc->Update(); @@ -2290,8 +2302,8 @@ void GMainWindow::OnMenuBootHomeMenu(u32 region) { void GMainWindow::InstallCIA(QStringList filepaths) { ui->action_Install_CIA->setEnabled(false); game_list->SetDirectoryWatcherEnabled(false); - progress_bar->show(); - progress_bar->setMaximum(INT_MAX); + + emit UpdateProgress(0, 0); (void)QtConcurrent::run([&, filepaths] { Service::AM::InstallStatus status; @@ -2307,6 +2319,11 @@ void GMainWindow::InstallCIA(QStringList filepaths) { } void GMainWindow::OnUpdateProgress(std::size_t written, std::size_t total) { + if (written == 0 and total == 0) { + progress_bar->show(); + progress_bar->setValue(0); + progress_bar->setMaximum(INT_MAX); + } progress_bar->setValue( static_cast(INT_MAX * (static_cast(written) / static_cast(total)))); } @@ -2350,11 +2367,19 @@ void GMainWindow::OnCompressFinished(bool is_compress, bool success) { if (!success) { if (is_compress) { - QMessageBox::critical(this, tr("Error compressing file"), - tr("File compress operation failed, check log for details.")); + QMessageBox::critical(this, tr("Z3DS Compression"), + tr("Failed to compress some files, check log for details.")); } else { - QMessageBox::critical(this, tr("Error decompressing file"), - tr("File decompress operation failed, check log for details.")); + QMessageBox::critical(this, tr("Z3DS Compression"), + tr("Failed to decompress some files, check log for details.")); + } + } else { + if (is_compress) { + QMessageBox::information(this, tr("Z3DS Compression"), + tr("All files have been compressed successfully.")); + } else { + QMessageBox::information(this, tr("Z3DS Compression"), + tr("All files have been decompressed successfully.")); } } } @@ -3066,43 +3091,27 @@ void GMainWindow::OnDumpVideo() { } } -void GMainWindow::OnCompressFile() { - // NOTE: Encrypted files SHOULD NEVER be compressed, otherwise the resulting - // compressed file will have very poor compression ratios, due to the high - // entropy caused by encryption. This may cause confusion to the user as they - // will see the files do not compress well and blame the emulator. - // - // This is enforced using the loaders as they already return an error on encryption. - - QString filepath = QFileDialog::getOpenFileName( - this, tr("Load 3DS ROM File"), UISettings::values.roms_path, - tr("3DS ROM Files (*.cia *cci *3dsx *cxi)") + QStringLiteral(";;") + tr("All Files (*.*)")); - - if (filepath.isEmpty()) { - return; - } - std::string in_path = filepath.toStdString(); - - // Identify file type +static std::optional> GetCompressFileInfo( + const std::string& filepath, bool compress) { Loader::AppLoader::CompressFileInfo compress_info{}; compress_info.is_supported = false; size_t frame_size{}; - { - auto loader = Loader::GetLoader(in_path); - if (loader) { - compress_info = loader->GetCompressFileInfo(); - frame_size = FileUtil::Z3DSWriteIOFile::DEFAULT_FRAME_SIZE; - } else { - bool is_compressed = false; - if (Service::AM::CheckCIAToInstall(in_path, is_compressed, true) == - Service::AM::InstallStatus::Success) { - auto meta_info = Service::AM::GetCIAInfos(in_path); - compress_info.is_supported = true; - compress_info.is_compressed = is_compressed; - compress_info.recommended_compressed_extension = "zcia"; - compress_info.recommended_uncompressed_extension = "cia"; - compress_info.underlying_magic = std::array({'C', 'I', 'A', '\0'}); - frame_size = FileUtil::Z3DSWriteIOFile::DEFAULT_CIA_FRAME_SIZE; + auto loader = Loader::GetLoader(filepath); + if (loader) { + compress_info = loader->GetCompressFileInfo(); + frame_size = FileUtil::Z3DSWriteIOFile::DEFAULT_FRAME_SIZE; + } else { + bool is_compressed = false; + if (Service::AM::CheckCIAToInstall(filepath, is_compressed, compress ? true : false) == + Service::AM::InstallStatus::Success) { + compress_info.is_supported = true; + compress_info.is_compressed = is_compressed; + compress_info.recommended_compressed_extension = "zcia"; + compress_info.recommended_uncompressed_extension = "cia"; + compress_info.underlying_magic = std::array({'C', 'I', 'A', '\0'}); + frame_size = FileUtil::Z3DSWriteIOFile::DEFAULT_CIA_FRAME_SIZE; + if (compress) { + auto meta_info = Service::AM::GetCIAInfos(filepath); if (meta_info.Succeeded()) { const auto& meta_info_val = meta_info.Unwrap(); std::vector value(sizeof(Service::AM::TitleInfo)); @@ -3117,122 +3126,218 @@ void GMainWindow::OnCompressFile() { } } } + if (!compress_info.is_supported) { - QMessageBox::critical( - this, tr("Error compressing file"), - tr("The selected file is not a compatible 3DS ROM format. Make sure you have " - "chosen the right file, and that it is not encrypted.")); - return; + LOG_ERROR(Frontend, + "Error {} file {}, the selected file is not a compatible 3DS ROM format or is " + "encrypted.", + compress ? "compressing" : "decompressing", filepath); + return {}; } - if (compress_info.is_compressed) { - QMessageBox::warning(this, tr("Error compressing file"), - tr("The selected file is already compressed.")); + if (compress_info.is_compressed && compress) { + LOG_ERROR(Frontend, "Error compressing file {}, the selected file is already compressed", + filepath); + return {}; + } + if (!compress_info.is_compressed && !compress) { + LOG_ERROR(Frontend, + "Error decompressing file {}, the selected file is already decompressed", + filepath); + return {}; + } + + return std::pair(compress_info, frame_size); +} + +void GMainWindow::OnCompressFile() { + // NOTE: Encrypted files SHOULD NEVER be compressed, otherwise the resulting + // compressed file will have very poor compression ratios, due to the high + // entropy caused by encryption. This may cause confusion to the user as they + // will see the files do not compress well and blame the emulator. + // + // This is enforced using the loaders as they already return an error on encryption. + + QStringList filepaths = + QFileDialog::getOpenFileNames(this, tr("Load 3DS ROM Files"), UISettings::values.roms_path, + tr("3DS ROM Files (*.cia *.cci *.3dsx *.cxi)") + + QStringLiteral(";;") + tr("All Files (*.*)")); + + QString out_path; + + if (filepaths.isEmpty()) { return; } - QString out_filter = - tr("3DS Compressed ROM File (*.%1)") - .arg(QString::fromStdString(compress_info.recommended_compressed_extension)); - - QFileInfo fileinfo(filepath); - QString final_path = fileinfo.path() + QStringLiteral(DIR_SEP) + fileinfo.completeBaseName() + - QStringLiteral(".") + - QString::fromStdString(compress_info.recommended_compressed_extension); - - filepath = QFileDialog::getSaveFileName(this, tr("Save 3DS Compressed ROM File"), final_path, - out_filter); - if (filepath.isEmpty()) { - return; - } - std::string out_path = filepath.toStdString(); - - progress_bar->show(); - progress_bar->setMaximum(INT_MAX); - - (void)QtConcurrent::run([&, in_path, out_path, compress_info, frame_size] { - const auto progress = [&](std::size_t written, std::size_t total) { - emit UpdateProgress(written, total); - }; - bool success = - FileUtil::CompressZ3DSFile(in_path, out_path, compress_info.underlying_magic, - frame_size, progress, compress_info.default_metadata); - if (!success) { - FileUtil::Delete(out_path); + bool single_file = filepaths.size() == 1; + if (single_file) { + // If it's a single file, ask the user for the output file. + auto compress_info = GetCompressFileInfo(filepaths[0].toStdString(), true); + if (!compress_info.has_value()) { + emit CompressFinished(true, false); + return; } - emit OnCompressFinished(true, success); + + QFileInfo fileinfo(filepaths[0]); + QString final_path = + fileinfo.path() + QStringLiteral(DIR_SEP) + fileinfo.completeBaseName() + + QStringLiteral(".") + + QString::fromStdString(compress_info.value().first.recommended_compressed_extension); + + QString out_filter = tr("3DS Compressed ROM File (*.%1)") + .arg(QString::fromStdString( + compress_info.value().first.recommended_compressed_extension)); + out_path = QFileDialog::getSaveFileName(this, tr("Save 3DS Compressed ROM File"), + final_path, out_filter); + if (out_path.isEmpty()) { + return; + } + } else { + // Otherwise, ask the user the directory to output the files. + out_path = QFileDialog::getExistingDirectory( + this, tr("Select Output 3DS Compressed ROM Folder"), UISettings::values.roms_path, + QFileDialog::ShowDirsOnly); + if (out_path.isEmpty()) { + return; + } + } + + (void)QtConcurrent::run([&, filepaths, out_path] { + bool single_file = filepaths.size() == 1; + QString out_filepath; + bool total_success = true; + + for (const QString& filepath : filepaths) { + + std::string in_path = filepath.toStdString(); + + // Identify file type + auto compress_info = GetCompressFileInfo(filepath.toStdString(), true); + if (!compress_info.has_value()) { + total_success = false; + continue; + } + + if (single_file) { + out_filepath = out_path; + } else { + QFileInfo fileinfo(filepath); + out_filepath = out_path + QStringLiteral(DIR_SEP) + fileinfo.completeBaseName() + + QStringLiteral(".") + + QString::fromStdString( + compress_info.value().first.recommended_compressed_extension); + } + + std::string out_path = out_filepath.toStdString(); + + emit UpdateProgress(0, 0); + + const auto progress = [&](std::size_t written, std::size_t total) { + emit UpdateProgress(written, total); + }; + bool success = FileUtil::CompressZ3DSFile(in_path, out_path, + compress_info.value().first.underlying_magic, + compress_info.value().second, progress, + compress_info.value().first.default_metadata); + if (!success) { + total_success = false; + FileUtil::Delete(out_path); + } + } + + emit CompressFinished(true, total_success); }); } + void GMainWindow::OnDecompressFile() { - QString filepath = QFileDialog::getOpenFileName( - this, tr("Load 3DS Compressed ROM File"), UISettings::values.roms_path, + + QStringList filepaths = QFileDialog::getOpenFileNames( + this, tr("Load 3DS Compressed ROM Files"), UISettings::values.roms_path, tr("3DS Compressed ROM Files (*.zcia *zcci *z3dsx *zcxi)") + QStringLiteral(";;") + tr("All Files (*.*)")); - if (filepath.isEmpty()) { + QString out_path; + + if (filepaths.isEmpty()) { return; } - std::string in_path = filepath.toStdString(); - // Identify file type - Loader::AppLoader::CompressFileInfo compress_info{}; - compress_info.is_supported = false; - { - auto loader = Loader::GetLoader(in_path); - if (loader) { - compress_info = loader->GetCompressFileInfo(); - } else { - bool is_compressed = false; - if (Service::AM::CheckCIAToInstall(in_path, is_compressed, false) == - Service::AM::InstallStatus::Success) { - compress_info.is_supported = true; - compress_info.is_compressed = is_compressed; - compress_info.recommended_compressed_extension = "zcia"; - compress_info.recommended_uncompressed_extension = "cia"; - compress_info.underlying_magic = std::array({'C', 'I', 'A', '\0'}); + bool single_file = filepaths.size() == 1; + if (single_file) { + // If it's a single file, ask the user for the output file. + auto compress_info = GetCompressFileInfo(filepaths[0].toStdString(), false); + if (!compress_info.has_value()) { + emit CompressFinished(false, false); + return; + } + + QFileInfo fileinfo(filepaths[0]); + QString final_path = + fileinfo.path() + QStringLiteral(DIR_SEP) + fileinfo.completeBaseName() + + QStringLiteral(".") + + QString::fromStdString(compress_info.value().first.recommended_uncompressed_extension); + + QString out_filter = + tr("3DS ROM File (*.%1)") + .arg(QString::fromStdString( + compress_info.value().first.recommended_uncompressed_extension)); + out_path = + QFileDialog::getSaveFileName(this, tr("Save 3DS ROM File"), final_path, out_filter); + if (out_path.isEmpty()) { + return; + } + } else { + // Otherwise, ask the user the directory to output the files. + out_path = QFileDialog::getExistingDirectory(this, tr("Select Output 3DS ROM Folder"), + UISettings::values.roms_path, + QFileDialog::ShowDirsOnly); + if (out_path.isEmpty()) { + return; + } + } + + (void)QtConcurrent::run([&, filepaths, out_path] { + bool single_file = filepaths.size() == 1; + QString out_filepath; + bool total_success = true; + + for (const QString& filepath : filepaths) { + + std::string in_path = filepath.toStdString(); + + // Identify file type + auto compress_info = GetCompressFileInfo(filepath.toStdString(), false); + if (!compress_info.has_value()) { + total_success = false; + continue; + } + + if (single_file) { + out_filepath = out_path; + } else { + QFileInfo fileinfo(filepath); + out_filepath = out_path + QStringLiteral(DIR_SEP) + fileinfo.completeBaseName() + + QStringLiteral(".") + + QString::fromStdString( + compress_info.value().first.recommended_uncompressed_extension); + } + + std::string out_path = out_filepath.toStdString(); + + emit UpdateProgress(0, 0); + + const auto progress = [&](std::size_t written, std::size_t total) { + emit UpdateProgress(written, total); + }; + + // TODO(PabloMK7): What should we do with the metadata? + bool success = FileUtil::DeCompressZ3DSFile(in_path, out_path, progress); + if (!success) { + total_success = false; + FileUtil::Delete(out_path); } } - } - if (!compress_info.is_supported) { - QMessageBox::critical(this, tr("Error decompressing file"), - tr("The selected file is not a compatible compressed 3DS ROM format. " - "Make sure you have " - "chosen the right file.")); - return; - } - if (!compress_info.is_compressed) { - QMessageBox::warning(this, tr("Error decompressing file"), - tr("The selected file is already decompressed.")); - return; - } - QString out_filter = - tr("3DS ROM File (*.%1)") - .arg(QString::fromStdString(compress_info.recommended_uncompressed_extension)); - - QFileInfo fileinfo(filepath); - QString final_path = fileinfo.path() + QStringLiteral(DIR_SEP) + fileinfo.completeBaseName() + - QStringLiteral(".") + - QString::fromStdString(compress_info.recommended_uncompressed_extension); - - filepath = QFileDialog::getSaveFileName(this, tr("Save 3DS ROM File"), final_path, out_filter); - if (filepath.isEmpty()) { - return; - } - std::string out_path = filepath.toStdString(); - - progress_bar->show(); - progress_bar->setMaximum(INT_MAX); - - (void)QtConcurrent::run([&, in_path, out_path, compress_info] { - const auto progress = [&](std::size_t written, std::size_t total) { - emit UpdateProgress(written, total); - }; - // TODO(PabloMK7): What should we do with the metadata? - bool success = FileUtil::DeCompressZ3DSFile(in_path, out_path, progress); - if (!success) { - FileUtil::Delete(out_path); - } - emit OnCompressFinished(false, success); + emit CompressFinished(false, total_success); }); } @@ -3572,6 +3677,12 @@ void GMainWindow::UpdateAPIIndicator(bool update) { if (api_index == static_cast(Settings::GraphicsAPI::Vulkan)) { api_index = (api_index + 1) % graphics_apis.size(); } +#else + if (physical_devices.empty()) { + if (api_index == static_cast(Settings::GraphicsAPI::Vulkan)) { + api_index = (api_index + 1) % graphics_apis.size(); + } + } #endif Settings::values.graphics_api = static_cast(api_index); } @@ -3714,6 +3825,9 @@ void GMainWindow::closeEvent(QCloseEvent* event) { ShutdownGame(); } + // Save settings in case they were changed from outside the configuration menu. + config->Save(); + render_window->close(); secondary_window->close(); multiplayer_state->Close(); diff --git a/src/citra_qt/configuration/config.cpp b/src/citra_qt/configuration/config.cpp index cdb86c4c5..2eb891a75 100644 --- a/src/citra_qt/configuration/config.cpp +++ b/src/citra_qt/configuration/config.cpp @@ -517,6 +517,8 @@ void QtConfig::ReadLayoutValues() { ReadGlobalSetting(Settings::values.render_3d); ReadGlobalSetting(Settings::values.factor_3d); + ReadGlobalSetting(Settings::values.swap_eyes_3d); + ReadGlobalSetting(Settings::values.render_3d_which_display); ReadGlobalSetting(Settings::values.filter_mode); ReadGlobalSetting(Settings::values.pp_shader_name); ReadGlobalSetting(Settings::values.anaglyph_shader_name); @@ -668,6 +670,11 @@ void QtConfig::ReadPathValues() { ReadSetting(QStringLiteral("last_artic_base_addr"), QString{}).toString(); UISettings::values.recent_files = ReadSetting(QStringLiteral("recentFiles")).toStringList(); UISettings::values.language = ReadSetting(QStringLiteral("language"), QString{}).toString(); + + ReadBasicSetting(UISettings::values.inserted_cartridge); + if (!FileUtil::Exists(UISettings::values.inserted_cartridge.GetValue())) { + UISettings::values.inserted_cartridge.SetValue(""); + } } qt_config->endGroup(); @@ -745,6 +752,7 @@ void QtConfig::ReadSystemValues() { ReadBasicSetting(Settings::values.steps_per_hour); ReadBasicSetting(Settings::values.plugin_loader_enabled); ReadBasicSetting(Settings::values.allow_plugin_loader); + ReadBasicSetting(Settings::values.apply_region_free_patch); } qt_config->endGroup(); @@ -1082,6 +1090,8 @@ void QtConfig::SaveLayoutValues() { WriteGlobalSetting(Settings::values.render_3d); WriteGlobalSetting(Settings::values.factor_3d); + WriteGlobalSetting(Settings::values.swap_eyes_3d); + WriteGlobalSetting(Settings::values.render_3d_which_display); WriteGlobalSetting(Settings::values.filter_mode); WriteGlobalSetting(Settings::values.pp_shader_name); WriteGlobalSetting(Settings::values.anaglyph_shader_name); @@ -1199,6 +1209,7 @@ void QtConfig::SavePathValues() { UISettings::values.last_artic_base_addr, QString{}); WriteSetting(QStringLiteral("recentFiles"), UISettings::values.recent_files); WriteSetting(QStringLiteral("language"), UISettings::values.language, QString{}); + WriteBasicSetting(UISettings::values.inserted_cartridge); } qt_config->endGroup(); @@ -1276,6 +1287,7 @@ void QtConfig::SaveSystemValues() { WriteBasicSetting(Settings::values.steps_per_hour); WriteBasicSetting(Settings::values.plugin_loader_enabled); WriteBasicSetting(Settings::values.allow_plugin_loader); + WriteBasicSetting(Settings::values.apply_region_free_patch); } qt_config->endGroup(); diff --git a/src/citra_qt/configuration/configure_enhancements.cpp b/src/citra_qt/configuration/configure_enhancements.cpp index a40654a5d..aba7a7ac8 100644 --- a/src/citra_qt/configuration/configure_enhancements.cpp +++ b/src/citra_qt/configuration/configure_enhancements.cpp @@ -57,6 +57,7 @@ void ConfigureEnhancements::SetConfiguration() { ui->render_3d_combobox->setCurrentIndex( static_cast(Settings::values.render_3d.GetValue())); + ui->swap_eyes_3d->setChecked(Settings::values.swap_eyes_3d.GetValue()); ui->factor_3d->setValue(Settings::values.factor_3d.GetValue()); ui->mono_rendering_eye->setCurrentIndex( static_cast(Settings::values.mono_render_option.GetValue())); @@ -111,6 +112,7 @@ void ConfigureEnhancements::ApplyConfiguration() { ui->resolution_factor_combobox); Settings::values.render_3d = static_cast(ui->render_3d_combobox->currentIndex()); + Settings::values.swap_eyes_3d = ui->swap_eyes_3d->isChecked(); Settings::values.factor_3d = ui->factor_3d->value(); Settings::values.mono_render_option = static_cast(ui->mono_rendering_eye->currentIndex()); diff --git a/src/citra_qt/configuration/configure_enhancements.ui b/src/citra_qt/configuration/configure_enhancements.ui index f26943444..ebf8520c4 100644 --- a/src/citra_qt/configuration/configure_enhancements.ui +++ b/src/citra_qt/configuration/configure_enhancements.ui @@ -113,7 +113,7 @@ - Enable linear filtering + Enable Linear Filtering @@ -236,7 +236,7 @@ - Reverse Side by Side + Side by Side Full Width @@ -318,14 +318,21 @@ - - - Disable right eye rendering - - - <html><head/><body><p>Disable Right Eye Rendering</p><p>Disables rendering the right eye image when not using stereoscopic mode. Greatly improves performance in some applications, but can cause flickering in others.</p></body></html> - - + + + Disable Right Eye Rendering + + + <html><head/><body><p>Disable Right Eye Rendering</p><p>Disables rendering the right eye image when not using stereoscopic mode. Greatly improves performance in some applications, but can cause flickering in others.</p></body></html> + + + + + + + Swap Eyes + + diff --git a/src/citra_qt/configuration/configure_system.cpp b/src/citra_qt/configuration/configure_system.cpp index fb9f6d7bb..9ed8bebfa 100644 --- a/src/citra_qt/configuration/configure_system.cpp +++ b/src/citra_qt/configuration/configure_system.cpp @@ -313,6 +313,8 @@ void ConfigureSystem::SetConfiguration() { ui->region_combobox->setCurrentIndex(Settings::values.region_value.GetValue() + 1); } + ui->apply_region_free_patch->setChecked(Settings::values.apply_region_free_patch.GetValue()); + ui->combo_init_clock->setCurrentIndex(static_cast(Settings::values.init_clock.GetValue())); QDateTime date_time; date_time.setSecsSinceEpoch(Settings::values.init_time.GetValue()); @@ -488,6 +490,7 @@ void ConfigureSystem::ApplyConfiguration() { Settings::values.lle_applets = ui->toggle_lle_applets->isChecked(); Settings::values.enable_required_online_lle_modules = ui->enable_required_online_lle_modules->isChecked(); + Settings::values.apply_region_free_patch.SetValue(ui->apply_region_free_patch->isChecked()); Settings::values.plugin_loader_enabled.SetValue(ui->plugin_loader->isChecked()); Settings::values.allow_plugin_loader.SetValue(ui->allow_plugin_loader->isChecked()); @@ -710,6 +713,7 @@ void ConfigureSystem::SetupPerGameUI() { } // Hide most settings for now, we can implement them later + ui->apply_region_free_patch->setVisible(false); ui->label_username->setVisible(false); ui->label_birthday->setVisible(false); ui->label_init_clock->setVisible(false); diff --git a/src/citra_qt/configuration/configure_system.ui b/src/citra_qt/configuration/configure_system.ui index 080ee139a..7327223d6 100644 --- a/src/citra_qt/configuration/configure_system.ui +++ b/src/citra_qt/configuration/configure_system.ui @@ -140,7 +140,18 @@ online features (if installed) - + + + + Apply region free patch to +installed applications. + + + Patches the region of installed applications to be region free, so that they always appear on the home menu. + + + + @@ -153,21 +164,21 @@ online features (if installed) - + Username - + Birthday - + @@ -238,14 +249,14 @@ online features (if installed) - + Language - + Note: this can be overridden when region setting is auto-select @@ -312,14 +323,14 @@ online features (if installed) - + Sound output mode - + @@ -338,31 +349,31 @@ online features (if installed) - + Country - + - + - + Clock - + @@ -376,28 +387,28 @@ online features (if installed) - + Startup time - + yyyy-MM-ddTHH:mm:ss - + Offset time - + @@ -421,14 +432,14 @@ online features (if installed) - + Initial System Ticks - + @@ -442,14 +453,14 @@ online features (if installed) - + Initial System Ticks Override - + @@ -462,21 +473,21 @@ online features (if installed) - + Play Coins - + 300 - + <html><head/><body><p>Number of steps per hour reported by the pedometer. Range from 0 to 65,535.</p></body></html> @@ -486,28 +497,28 @@ online features (if installed) - + 9999 - + Run System Setup when Home Menu is launched - + Console ID: - + @@ -523,14 +534,14 @@ online features (if installed) - + MAC: - + @@ -546,21 +557,21 @@ online features (if installed) - + 3GX Plugin Loader - + Enable 3GX plugin loader - + Allow applications to change plugin loader state diff --git a/src/citra_qt/debugger/graphics/graphics_tracing.cpp b/src/citra_qt/debugger/graphics/graphics_tracing.cpp index e78acb096..9cf54940e 100644 --- a/src/citra_qt/debugger/graphics/graphics_tracing.cpp +++ b/src/citra_qt/debugger/graphics/graphics_tracing.cpp @@ -1,4 +1,4 @@ -// Copyright 2015 Citra Emulator Project +// Copyright Citra Emulator Project / Azahar Emulator Project // Licensed under GPLv2 or any later version // Refer to the license.txt file included. @@ -63,8 +63,8 @@ void GraphicsTracingWidget::StartRecording() { return; auto& pica = system.GPU().PicaCore(); - auto shader_binary = pica.vs_setup.program_code; - auto swizzle_data = pica.vs_setup.swizzle_data; + const auto& shader_binary = pica.vs_setup.GetProgramCode(); + const auto& swizzle_data = pica.vs_setup.GetSwizzleData(); // Encode floating point numbers to 24-bit values // TODO: Drop this explicit conversion once we store float24 values bit-correctly internally. @@ -86,7 +86,7 @@ void GraphicsTracingWidget::StartRecording() { CiTrace::Recorder::InitialState state; - const auto copy = [&](std::vector& dest, auto& data) { + const auto copy = [&](std::vector& dest, const auto& data) { dest.resize(sizeof(data)); std::memcpy(dest.data(), std::addressof(data), sizeof(data)); }; diff --git a/src/citra_qt/debugger/graphics/graphics_vertex_shader.cpp b/src/citra_qt/debugger/graphics/graphics_vertex_shader.cpp index 46f8ec5cf..e25cf7733 100644 --- a/src/citra_qt/debugger/graphics/graphics_vertex_shader.cpp +++ b/src/citra_qt/debugger/graphics/graphics_vertex_shader.cpp @@ -1,4 +1,4 @@ -// Copyright 2014 Citra Emulator Project +// Copyright Citra Emulator Project / Azahar Emulator Project // Licensed under GPLv2 or any later version // Refer to the license.txt file included. @@ -508,11 +508,13 @@ void GraphicsVertexShaderWidget::Reload(bool replace_vertex_data, const void* ve info.Clear(); auto& pica = system.GPU().PicaCore(); - for (auto instr : pica.vs_setup.program_code) + const auto& program_code = pica.vs_setup.GetProgramCode(); + const auto& swizzle_data = pica.vs_setup.GetSwizzleData(); + for (auto instr : program_code) info.code.push_back({instr}); int num_attributes = pica.regs.internal.vs.max_input_attribute_index + 1; - for (auto pattern : pica.vs_setup.swizzle_data) { + for (auto pattern : swizzle_data) { const nihstro::SwizzleInfo swizzle_info = {.pattern = nihstro::SwizzlePattern{pattern}}; info.swizzle_info.push_back(swizzle_info); } diff --git a/src/citra_qt/game_list.cpp b/src/citra_qt/game_list.cpp index 601bb2349..d6e3efdb5 100644 --- a/src/citra_qt/game_list.cpp +++ b/src/citra_qt/game_list.cpp @@ -19,8 +19,10 @@ #include #include #include +#include #include #include +#include #include #include #include @@ -33,6 +35,7 @@ #include "citra_qt/uisettings.h" #include "common/logging/log.h" #include "common/settings.h" +#include "core/core.h" #include "core/file_sys/archive_extsavedata.h" #include "core/file_sys/archive_source_sd_savedata.h" #include "core/hle/service/am/am.h" @@ -306,6 +309,42 @@ void GameList::OnFilterCloseClicked() { main_window->filterBarSetChecked(false); } +class CartridgeIconDelegate : public QStyledItemDelegate { +public: + using QStyledItemDelegate::QStyledItemDelegate; + + void paint(QPainter* painter, const QStyleOptionViewItem& option, + const QModelIndex& index) const override { + QStyleOptionViewItem opt(option); + initStyleOption(&opt, index); + + QStyle* style = opt.widget ? opt.widget->style() : QApplication::style(); + + // Draw the default item (background, text, selection, etc.) + style->drawControl(QStyle::CE_ItemViewItem, &opt, painter, opt.widget); + + // Draw cartridge inserted icon + quint32 can_insert = index.data(GameListItemPath::CanInsertRole).value(); + QString game_path = index.data(GameListItemPath::FullPathRole).value(); + + bool is_inserted = can_insert && UISettings::values.inserted_cartridge.GetValue() == + game_path.toStdString(); + + if (is_inserted) { + QPixmap pixmap = QIcon::fromTheme(QStringLiteral("cartridge")).pixmap(24); + + const int margin = 12; + QSize pmSize = pixmap.size() / pixmap.devicePixelRatio(); + + QRect pmRect(opt.rect.right() - pmSize.width() - margin, + opt.rect.center().y() - pmSize.height() / 2, pmSize.width(), + pmSize.height()); + + painter->drawPixmap(pmRect, pixmap); + } + } +}; + GameList::GameList(PlayTime::PlayTimeManager& play_time_manager_, GMainWindow* parent) : QWidget{parent}, play_time_manager{play_time_manager_} { watcher = new QFileSystemWatcher(this); @@ -328,6 +367,7 @@ GameList::GameList(PlayTime::PlayTimeManager& play_time_manager_, GMainWindow* p tree_view->setEditTriggers(QHeaderView::NoEditTriggers); tree_view->setContextMenuPolicy(Qt::CustomContextMenu); tree_view->setStyleSheet(QStringLiteral("QTreeView{ border: none; }")); + tree_view->setItemDelegateForColumn(0, new CartridgeIconDelegate(tree_view)); tree_view->header()->setContextMenuPolicy(Qt::CustomContextMenu); UpdateColumnVisibility(); @@ -533,7 +573,8 @@ void GameList::PopupContextMenu(const QPoint& menu_location) { selected.data(GameListItemPath::ProgramIdRole).toULongLong(), selected.data(GameListItemPath::ExtdataIdRole).toULongLong(), static_cast( - selected.data(GameListItemPath::MediaTypeRole).toUInt())); + selected.data(GameListItemPath::MediaTypeRole).toUInt()), + selected.data(GameListItemPath::CanInsertRole).toUInt() != 0); break; case GameListItemType::CustomDir: AddPermDirPopup(context_menu, selected); @@ -603,8 +644,16 @@ void ForEachOpenGLCacheFile(u64 program_id, auto func) { #endif void GameList::AddGamePopup(QMenu& context_menu, const QString& path, const QString& name, - u64 program_id, u64 extdata_id, Service::FS::MediaType media_type) { + u64 program_id, u64 extdata_id, Service::FS::MediaType media_type, + bool can_insert) { QAction* favorite = context_menu.addAction(tr("Favorite")); + bool is_inserted = + can_insert && UISettings::values.inserted_cartridge.GetValue() == path.toStdString(); + QAction* cartridge_insert = nullptr; + if (can_insert) { + cartridge_insert = + context_menu.addAction(is_inserted ? tr("Eject Cartridge") : tr("Insert Cartridge")); + } context_menu.addSeparator(); QMenu* open_menu = context_menu.addMenu(tr("Open")); QAction* open_application_location = open_menu->addAction(tr("Application Location")); @@ -718,6 +767,16 @@ void GameList::AddGamePopup(QMenu& context_menu, const QString& path, const QStr connect(open_extdata_location, &QAction::triggered, this, [this, extdata_id] { emit OpenFolderRequested(extdata_id, GameListOpenTarget::EXT_DATA); }); + if (cartridge_insert) { + connect(cartridge_insert, &QAction::triggered, this, [this, path, is_inserted] { + if (is_inserted) { + UISettings::values.inserted_cartridge.SetValue(""); + } else { + UISettings::values.inserted_cartridge.SetValue(path.toStdString()); + } + tree_view->viewport()->update(); + }); + } connect(open_application_location, &QAction::triggered, this, [this, program_id] { emit OpenFolderRequested(program_id, GameListOpenTarget::APPLICATION); }); @@ -1054,6 +1113,13 @@ const QStringList GameList::supported_file_extensions = { }; void GameList::RefreshGameDirectory() { + + // Do not scan directories when the system is powered on, it will be + // repopulated on shutdown anyways. + if (Core::System::GetInstance().IsPoweredOn()) { + return; + } + if (!UISettings::values.game_dirs.isEmpty() && current_worker != nullptr) { LOG_INFO(Frontend, "Change detected in the applications directory. Reloading game list."); PopulateAsync(UISettings::values.game_dirs); diff --git a/src/citra_qt/game_list.h b/src/citra_qt/game_list.h index d563f74b1..a28cf4290 100644 --- a/src/citra_qt/game_list.h +++ b/src/citra_qt/game_list.h @@ -124,7 +124,7 @@ private: void PopupContextMenu(const QPoint& menu_location); void PopupHeaderContextMenu(const QPoint& menu_location); void AddGamePopup(QMenu& context_menu, const QString& path, const QString& name, u64 program_id, - u64 extdata_id, Service::FS::MediaType media_type); + u64 extdata_id, Service::FS::MediaType media_type, bool can_insert); void AddCustomDirPopup(QMenu& context_menu, QModelIndex selected); void AddPermDirPopup(QMenu& context_menu, QModelIndex selected); void AddFavoritesPopup(QMenu& context_menu); diff --git a/src/citra_qt/game_list_p.h b/src/citra_qt/game_list_p.h index 046ec7267..45df2a483 100644 --- a/src/citra_qt/game_list_p.h +++ b/src/citra_qt/game_list_p.h @@ -159,15 +159,18 @@ public: static constexpr int ExtdataIdRole = SortRole + 4; static constexpr int LongTitleRole = SortRole + 5; static constexpr int MediaTypeRole = SortRole + 6; + static constexpr int CanInsertRole = SortRole + 7; GameListItemPath() = default; GameListItemPath(const QString& game_path, std::span smdh_data, u64 program_id, - u64 extdata_id, Service::FS::MediaType media_type, bool is_encrypted) { + u64 extdata_id, Service::FS::MediaType media_type, bool is_encrypted, + bool can_insert) { setData(type(), TypeRole); setData(game_path, FullPathRole); setData(qulonglong(program_id), ProgramIdRole); setData(qulonglong(extdata_id), ExtdataIdRole); setData(quint32(media_type), MediaTypeRole); + setData(quint32(can_insert), CanInsertRole); if (UISettings::values.game_list_icon_size.GetValue() == UISettings::GameListIconSize::NoIcon) { diff --git a/src/citra_qt/game_list_worker.cpp b/src/citra_qt/game_list_worker.cpp index b6376261f..cc65b5082 100644 --- a/src/citra_qt/game_list_worker.cpp +++ b/src/citra_qt/game_list_worker.cpp @@ -92,7 +92,7 @@ void GameListWorker::AddFstEntriesToGameList(const std::string& dir_path, unsign if (Loader::IsValidSMDH(smdh)) { if (system_title) { auto smdh_struct = reinterpret_cast(smdh.data()); - if (!(smdh_struct->flags & Loader::SMDH::Flags::Visible)) { + if (!smdh_struct->flags.visible) { // Skip system titles without the visible flag. return true; } @@ -113,7 +113,8 @@ void GameListWorker::AddFstEntriesToGameList(const std::string& dir_path, unsign { new GameListItemPath(QString::fromStdString(physical_name), smdh, program_id, extdata_id, media_type, - res == Loader::ResultStatus::ErrorEncrypted), + res == Loader::ResultStatus::ErrorEncrypted, + loader->GetFileType() == Loader::FileType::CCI), new GameListItemCompat(compatibility), new GameListItemRegion(smdh), new GameListItem(QString::fromStdString(Loader::GetFileTypeString( diff --git a/src/citra_qt/uisettings.h b/src/citra_qt/uisettings.h index 393e20dd4..f9f42353a 100644 --- a/src/citra_qt/uisettings.h +++ b/src/citra_qt/uisettings.h @@ -85,6 +85,8 @@ struct Values { Settings::Setting hide_mouse{false, "hideInactiveMouse"}; Settings::Setting check_for_update_on_start{true, "check_for_update_on_start"}; + Settings::Setting inserted_cartridge{"", "inserted_cartridge"}; + // Discord RPC Settings::Setting enable_discord_presence{true, "enable_discord_presence"}; diff --git a/src/citra_sdl/config.cpp b/src/citra_sdl/config.cpp index 58ac46e3c..a504dd3aa 100644 --- a/src/citra_sdl/config.cpp +++ b/src/citra_sdl/config.cpp @@ -253,6 +253,7 @@ void SdlConfig::ReadValues() { ReadSetting("System", Settings::values.plugin_loader_enabled); ReadSetting("System", Settings::values.allow_plugin_loader); ReadSetting("System", Settings::values.steps_per_hour); + ReadSetting("System", Settings::values.apply_region_free_patch); { constexpr const char* default_init_time_offset = "0 00:00:00"; diff --git a/src/citra_sdl/default_ini.h b/src/citra_sdl/default_ini.h index 3fb471449..4c97dbb89 100644 --- a/src/citra_sdl/default_ini.h +++ b/src/citra_sdl/default_ini.h @@ -163,6 +163,10 @@ render_3d = # 0 - 100: Intensity. 0 (default) factor_3d = +# Swap Eyes in 3D +# true or false (default) +swap_eyes_3d = + # Change Default Eye to Render When in Monoscopic Mode # 0 (default): Left, 1: Right mono_render_option = diff --git a/src/common/CMakeLists.txt b/src/common/CMakeLists.txt index 44f0a67dc..b7062e991 100644 --- a/src/common/CMakeLists.txt +++ b/src/common/CMakeLists.txt @@ -216,3 +216,5 @@ if (SSE42_COMPILE_OPTION) target_compile_definitions(citra_common PRIVATE CITRA_HAS_SSE42) target_compile_options(citra_common PRIVATE ${SSE42_COMPILE_OPTION}) endif() + +target_link_libraries(citra_common PUBLIC xxHash::xxhash) \ No newline at end of file diff --git a/src/common/android_storage.cpp b/src/common/android_storage.cpp index a18ecefac..00648aa7d 100644 --- a/src/common/android_storage.cpp +++ b/src/common/android_storage.cpp @@ -1,9 +1,13 @@ -// Copyright 2023 Citra Emulator Project +// Copyright Citra Emulator Project / Azahar Emulator Project // Licensed under GPLv2 or any later version // Refer to the license.txt file included. #ifdef ANDROID +#include +#include #include "common/android_storage.h" +#include "common/file_util.h" +#include "common/logging/log.h" namespace AndroidStorage { JNIEnv* GetEnvForThread() { @@ -80,8 +84,9 @@ void CleanupJNI() { } bool CreateFile(const std::string& directory, const std::string& filename) { - if (create_file == nullptr) + if (create_file == nullptr) { return false; + } auto env = GetEnvForThread(); jstring j_directory = env->NewStringUTF(directory.c_str()); jstring j_filename = env->NewStringUTF(filename.c_str()); @@ -89,8 +94,9 @@ bool CreateFile(const std::string& directory, const std::string& filename) { } bool CreateDir(const std::string& directory, const std::string& filename) { - if (create_dir == nullptr) + if (create_dir == nullptr) { return false; + } auto env = GetEnvForThread(); jstring j_directory = env->NewStringUTF(directory.c_str()); jstring j_directory_name = env->NewStringUTF(filename.c_str()); @@ -98,8 +104,9 @@ bool CreateDir(const std::string& directory, const std::string& filename) { } int OpenContentUri(const std::string& filepath, AndroidOpenMode openmode) { - if (open_content_uri == nullptr) + if (open_content_uri == nullptr) { return -1; + } const char* mode = ""; switch (openmode) { @@ -135,8 +142,9 @@ int OpenContentUri(const std::string& filepath, AndroidOpenMode openmode) { std::vector GetFilesName(const std::string& filepath) { auto vector = std::vector(); - if (get_files_name == nullptr) + if (get_files_name == nullptr) { return vector; + } auto env = GetEnvForThread(); jstring j_filepath = env->NewStringUTF(filepath.c_str()); auto j_object = @@ -150,10 +158,37 @@ std::vector GetFilesName(const std::string& filepath) { return vector; } +std::optional GetUserDirectory() { + if (get_user_directory == nullptr) { + throw std::runtime_error( + "Unable to locate user directory: Function with ID 'get_user_directory' is missing"); + } + auto env = GetEnvForThread(); + auto j_user_directory = + (jstring)(env->CallStaticObjectMethod(native_library, get_user_directory, nullptr)); + auto result = env->GetStringUTFChars(j_user_directory, nullptr); + if (result == "") { + return std::nullopt; + } + return result; +} + +std::string GetBuildFlavor() { + if (get_build_flavor == nullptr) { + throw std::runtime_error( + "Unable get build flavor: Function with ID 'get_build_flavor' is missing"); + } + auto env = GetEnvForThread(); + const auto jflavor = + (jstring)(env->CallStaticObjectMethod(native_library, get_build_flavor, nullptr)); + return env->GetStringUTFChars(jflavor, nullptr); +} + bool CopyFile(const std::string& source, const std::string& destination_path, const std::string& destination_filename) { - if (copy_file == nullptr) + if (copy_file == nullptr) { return false; + } auto env = GetEnvForThread(); jstring j_source_path = env->NewStringUTF(source.c_str()); jstring j_destination_path = env->NewStringUTF(destination_path.c_str()); @@ -163,8 +198,14 @@ bool CopyFile(const std::string& source, const std::string& destination_path, } bool RenameFile(const std::string& source, const std::string& filename) { - if (rename_file == nullptr) + if (rename_file == nullptr) { return false; + } + if (std::string(FileUtil::GetFilename(source)) == + std::string(FileUtil::GetFilename(filename))) { + // TODO: Should this be treated as a success or failure? + return false; + } auto env = GetEnvForThread(); jstring j_source_path = env->NewStringUTF(source.c_str()); jstring j_destination_path = env->NewStringUTF(filename.c_str()); @@ -172,6 +213,86 @@ bool RenameFile(const std::string& source, const std::string& filename) { j_destination_path); } +bool UpdateDocumentLocation(const std::string& source_path, const std::string& destination_path) { + if (update_document_location == nullptr) { + return false; + } + auto env = GetEnvForThread(); + jstring j_source_path = env->NewStringUTF(source_path.c_str()); + jstring j_destination_path = env->NewStringUTF(destination_path.c_str()); + return env->CallStaticBooleanMethod(native_library, update_document_location, j_source_path, + j_destination_path); +} + +bool MoveFile(const std::string& filename, const std::string& source_dir_path, + const std::string& destination_dir_path) { + if (move_file == nullptr) { + return false; + } + if (source_dir_path == destination_dir_path) { + // TODO: Should this be treated as a success or failure? + return false; + } + auto env = GetEnvForThread(); + jstring j_filename = env->NewStringUTF(filename.c_str()); + jstring j_source_dir_path = env->NewStringUTF(source_dir_path.c_str()); + jstring j_destination_dir_path = env->NewStringUTF(destination_dir_path.c_str()); + return env->CallStaticBooleanMethod(native_library, move_file, j_filename, j_source_dir_path, + j_destination_dir_path); +} + +bool MoveAndRenameFile(const std::string& src_full_path, const std::string& dest_full_path) { + if (src_full_path == dest_full_path) { + // TODO: Should this be treated as a success or failure? + return false; + } + const auto src_filename = std::string(FileUtil::GetFilename(src_full_path)); + const auto src_parent_path = std::string(FileUtil::GetParentPath(src_full_path)); + const auto dest_filename = std::string(FileUtil::GetFilename(dest_full_path)); + const auto dest_parent_path = std::string(FileUtil::GetParentPath(dest_full_path)); + bool result; + + const std::string tmp_path = "/tmp"; + AndroidStorage::CreateDir("/", "tmp"); + + // If a simultaneous move and rename are not necessary, use individual methods + if (src_filename == dest_filename || src_parent_path == dest_parent_path) { + if (src_filename != dest_filename) { + return AndroidStorage::RenameFile(src_full_path, dest_filename); + } else if (src_parent_path != dest_parent_path) { + return AndroidStorage::MoveFile(src_filename, src_parent_path, dest_parent_path); + } + } + + // Step 1: Create directory named after UUID inside /tmp to house the moved file. + // This prevents clashes if files with the same name are moved simultaneously. + const auto uuid = boost::uuids::to_string(boost::uuids::time_generator_v7()()); + const auto allocated_tmp_path = tmp_path + "/" + uuid; + AndroidStorage::CreateDir(tmp_path, uuid); + + // Step 2: Attempt to move to allocated temporary directory. + // If this step fails, skip everything except the cleanup. + result = AndroidStorage::MoveFile(src_filename, src_parent_path, allocated_tmp_path); + if (result == true) { + // Step 3: Rename to desired file name. + AndroidStorage::RenameFile((allocated_tmp_path + "/" + src_filename), dest_filename); + + // Step 4: If a file with the desired name in the destination exists, remove it. + AndroidStorage::DeleteDocument(dest_full_path); + + // Step 5: Attempt to move file to desired location. + // If this step fails, move the file back to where it came from. + result = AndroidStorage::MoveFile(dest_filename, allocated_tmp_path, dest_parent_path); + if (result == false) { + AndroidStorage::MoveAndRenameFile((allocated_tmp_path + "/" + dest_filename), + src_full_path); + } + } + // Step 6: Clean up the allocated temp directory. + AndroidStorage::DeleteDocument(allocated_tmp_path); + return result; +} + #define FR(FunctionName, ReturnValue, JMethodID, Caller, JMethodName, Signature) \ F(FunctionName, ReturnValue, JMethodID, Caller) #define F(FunctionName, ReturnValue, JMethodID, Caller) \ diff --git a/src/common/android_storage.h b/src/common/android_storage.h index 2ea0eb57c..bc4594362 100644 --- a/src/common/android_storage.h +++ b/src/common/android_storage.h @@ -1,4 +1,4 @@ -// Copyright 2023 Citra Emulator Project +// Copyright Citra Emulator Project / Azahar Emulator Project // Licensed under GPLv2 or any later version // Refer to the license.txt file included. @@ -19,12 +19,23 @@ open_content_uri, "openContentUri", "(Ljava/lang/String;Ljava/lang/String;)I") \ V(GetFilesName, std::vector, (const std::string& filepath), get_files_name, \ "getFilesName", "(Ljava/lang/String;)[Ljava/lang/String;") \ + V(GetUserDirectory, std::optional, (), get_user_directory, "getUserDirectory", \ + "(Landroid/net/Uri;)Ljava/lang/String;") \ V(CopyFile, bool, \ (const std::string& source, const std::string& destination_path, \ const std::string& destination_filename), \ copy_file, "copyFile", "(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Z") \ V(RenameFile, bool, (const std::string& source, const std::string& filename), rename_file, \ - "renameFile", "(Ljava/lang/String;Ljava/lang/String;)Z") + "renameFile", "(Ljava/lang/String;Ljava/lang/String;)Z") \ + V(UpdateDocumentLocation, bool, \ + (const std::string& source_path, const std::string& destination_path), \ + update_document_location, "updateDocumentLocation", \ + "(Ljava/lang/String;Ljava/lang/String;)Z") \ + V(GetBuildFlavor, std::string, (), get_build_flavor, "getBuildFlavor", "()Ljava/lang/String;") \ + V(MoveFile, bool, \ + (const std::string& filename, const std::string& source_dir_path, \ + const std::string& destination_dir_path), \ + move_file, "moveFile", "(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Z") #define ANDROID_SINGLE_PATH_DETERMINE_FUNCTIONS(V) \ V(IsDirectory, bool, is_directory, CallStaticBooleanMethod, "isDirectory", \ "(Ljava/lang/String;)Z") \ @@ -34,6 +45,7 @@ V(DeleteDocument, bool, delete_document, CallStaticBooleanMethod, "deleteDocument", \ "(Ljava/lang/String;)Z") namespace AndroidStorage { + static JavaVM* g_jvm = nullptr; static jclass native_library = nullptr; #define FR(FunctionName, ReturnValue, JMethodID, Caller, JMethodName, Signature) F(JMethodID) @@ -44,6 +56,7 @@ ANDROID_STORAGE_FUNCTIONS(FS) #undef F #undef FS #undef FR +bool MoveAndRenameFile(const std::string& src_full_path, const std::string& dest_full_path); // Reference: // https://developer.android.com/reference/android/os/ParcelFileDescriptor#parseMode(java.lang.String) enum class AndroidOpenMode { @@ -57,6 +70,12 @@ enum class AndroidOpenMode { NEVER = EINVAL, }; +class AndroidBuildFlavors { +public: + static constexpr std::string GOOGLEPLAY = "googlePlay"; + static constexpr std::string VANILLA = "vanilla"; +}; + inline AndroidOpenMode operator|(AndroidOpenMode a, int b) { return static_cast(static_cast(a) | b); } @@ -80,5 +99,6 @@ ANDROID_STORAGE_FUNCTIONS(FS) ANDROID_SINGLE_PATH_DETERMINE_FUNCTIONS(FR) #undef F #undef FR + } // namespace AndroidStorage #endif diff --git a/src/common/file_util.cpp b/src/common/file_util.cpp index c740e8416..a9793c43c 100644 --- a/src/common/file_util.cpp +++ b/src/common/file_util.cpp @@ -304,20 +304,31 @@ bool DeleteDir(const std::string& filename) { return false; } -bool Rename(const std::string& srcFilename, const std::string& destFilename) { - LOG_TRACE(Common_Filesystem, "{} --> {}", srcFilename, destFilename); +bool Rename(const std::string& srcFullPath, const std::string& destFullPath) { + LOG_TRACE(Common_Filesystem, "{} --> {}", srcFullPath, destFullPath); #ifdef _WIN32 - if (_wrename(Common::UTF8ToUTF16W(srcFilename).c_str(), - Common::UTF8ToUTF16W(destFilename).c_str()) == 0) + if (_wrename(Common::UTF8ToUTF16W(srcFullPath).c_str(), + Common::UTF8ToUTF16W(destFullPath).c_str()) == 0) return true; #elif ANDROID - if (AndroidStorage::RenameFile(srcFilename, std::string(GetFilename(destFilename)))) - return true; + // srcFullPath and destFullPath are relative to the user directory + if (AndroidStorage::GetBuildFlavor() == AndroidStorage::AndroidBuildFlavors::GOOGLEPLAY) { + if (AndroidStorage::MoveAndRenameFile(srcFullPath, destFullPath)) + return true; + } else { + std::optional userDirLocation = AndroidStorage::GetUserDirectory(); + if (userDirLocation && rename((*userDirLocation + srcFullPath).c_str(), + (*userDirLocation + destFullPath).c_str()) == 0) { + AndroidStorage::UpdateDocumentLocation(srcFullPath, destFullPath); + // ^ TODO: This shouldn't fail, but what should we do if it somehow does? + return true; + } + } #else - if (rename(srcFilename.c_str(), destFilename.c_str()) == 0) + if (rename(srcFullPath.c_str(), destFullPath.c_str()) == 0) return true; #endif - LOG_ERROR(Common_Filesystem, "failed {} --> {}: {}", srcFilename, destFilename, + LOG_ERROR(Common_Filesystem, "failed {} --> {}: {}", srcFullPath, destFullPath, GetLastErrorMsg()); return false; } @@ -874,7 +885,6 @@ void SetUserPath(const std::string& path) { g_paths.emplace(UserPath::LoadDir, user_path + LOAD_DIR DIR_SEP); g_paths.emplace(UserPath::StatesDir, user_path + STATES_DIR DIR_SEP); g_paths.emplace(UserPath::IconsDir, user_path + ICONS_DIR DIR_SEP); - g_paths.emplace(UserPath::PlayTimeDir, user_path + LOG_DIR DIR_SEP); g_default_paths = g_paths; } diff --git a/src/common/file_util.h b/src/common/file_util.h index 57a1d67e1..4c7d21349 100644 --- a/src/common/file_util.h +++ b/src/common/file_util.h @@ -51,7 +51,6 @@ enum class UserPath { LoadDir, LogDir, NANDDir, - PlayTimeDir, RootDir, SDMCDir, ShaderDir, @@ -136,13 +135,13 @@ bool Delete(const std::string& filename); // Deletes a directory filename, returns true on success bool DeleteDir(const std::string& filename); -// renames file srcFilename to destFilename, returns true on success -bool Rename(const std::string& srcFilename, const std::string& destFilename); +// Renames file srcFullPath to destFullPath, returns true on success +bool Rename(const std::string& srcFullPath, const std::string& destFullPath); -// copies file srcFilename to destFilename, returns true on success +// Copies file srcFilename to destFilename, returns true on success bool Copy(const std::string& srcFilename, const std::string& destFilename); -// creates an empty file filename, returns true on success +// Creates an empty file filename, returns true on success bool CreateEmptyFile(const std::string& filename); /** diff --git a/src/common/hacks/hack_list.cpp b/src/common/hacks/hack_list.cpp index ce93ad2ef..66b4f4144 100644 --- a/src/common/hacks/hack_list.cpp +++ b/src/common/hacks/hack_list.cpp @@ -158,6 +158,29 @@ HackManager hack_manager = { 0x0004013020003203, // New 3DS safe mode }, }}, + {HackType::REQUIRES_SHADER_FIXUP, + HackEntry{ + .mode = HackAllowMode::FORCE, + .affected_title_ids = + { + // 3D Thunder Blade + 0x0004000000128A00, // JPN + 0x0004000000158200, // EUR + 0x0004000000158C00, // USA + + // 3D After Burner II + 0x0004000000114200, // JPN + 0x0004000000157A00, // EUR + 0x0004000000158900, // USA + + // 3D Classics + 0x0004000000154000, // 1 (JPN) + 0x0004000000180E00, // 2 (JPN) + 0x000400000019A700, // 2 (EUR) + 0x0004000000185E00, // 2 (USA) + 0x00040000001AA300, // 3 (JPN) + }, + }}, }}; } \ No newline at end of file diff --git a/src/common/hacks/hack_list.h b/src/common/hacks/hack_list.h index 43d7ea409..0617fa51c 100644 --- a/src/common/hacks/hack_list.h +++ b/src/common/hacks/hack_list.h @@ -14,6 +14,7 @@ enum class HackType : int { DECRYPTION_AUTHORIZED, ONLINE_LLE_REQUIRED, REGION_FROM_SECURE, + REQUIRES_SHADER_FIXUP, }; class UserHackData {}; diff --git a/src/common/hash.h b/src/common/hash.h index 1a222b22e..de7cf0536 100644 --- a/src/common/hash.h +++ b/src/common/hash.h @@ -1,4 +1,4 @@ -// Copyright 2015 Citra Emulator Project +// Copyright Citra Emulator Project / Azahar Emulator Project // Licensed under GPLv2 or any later version // Refer to the license.txt file included. @@ -6,19 +6,35 @@ #include #include -#include "common/cityhash.h" +#include +#include "cityhash.h" #include "common/common_types.h" namespace Common { +namespace HashAlgo64 { +struct XXH3 { + static inline u64 hash(const void* data, std::size_t len) noexcept { + return XXH3_64bits(data, len); + } +}; + +struct CityHash { + static inline u64 hash(const void* data, std::size_t len) noexcept { + return CityHash64(reinterpret_cast(data), len); + } +}; +} // namespace HashAlgo64 + /** * Computes a 64-bit hash over the specified block of data * @param data Block of data to compute hash over * @param len Length of data (in bytes) to compute hash over * @returns 64-bit hash value that was computed over the data block */ +template static inline u64 ComputeHash64(const void* data, std::size_t len) noexcept { - return CityHash64(static_cast(data), len); + return Hasher::hash(data, len); } /** @@ -26,11 +42,11 @@ static inline u64 ComputeHash64(const void* data, std::size_t len) noexcept { * that either the struct includes no padding, or that any padding is initialized to a known value * by memsetting the struct to 0 before filling it in. */ -template +template static inline u64 ComputeStructHash64(const T& data) noexcept { static_assert(std::is_trivially_copyable_v, "Type passed to ComputeStructHash64 must be trivially copyable"); - return ComputeHash64(&data, sizeof(data)); + return ComputeHash64(&data, sizeof(data)); } /** @@ -49,7 +65,7 @@ struct IdentityHash { }; /// A helper template that ensures the padding in a struct is initialized by memsetting to 0. -template +template struct HashableStruct { // In addition to being trivially copyable, T must also have a trivial default constructor, // because any member initialization would be overridden by memset @@ -79,7 +95,7 @@ struct HashableStruct { }; std::size_t Hash() const noexcept { - return Common::ComputeStructHash64(state); + return Common::ComputeStructHash64(state); } }; diff --git a/src/common/play_time_manager.cpp b/src/common/play_time_manager.cpp index c8b94ee08..e4cb9a628 100644 --- a/src/common/play_time_manager.cpp +++ b/src/common/play_time_manager.cpp @@ -20,19 +20,27 @@ struct PlayTimeElement { PlayTime play_time; }; +#define PLAY_TIME_FILENAME "play_time.bin" + std::string GetCurrentUserPlayTimePath() { - return FileUtil::GetUserPath(FileUtil::UserPath::PlayTimeDir) + DIR_SEP + "play_time.bin"; + return FileUtil::GetUserPath(FileUtil::UserPath::SysDataDir) + DIR_SEP + PLAY_TIME_FILENAME; } [[nodiscard]] bool ReadPlayTimeFile(PlayTimeDatabase& out_play_time_db) { - const auto filename = GetCurrentUserPlayTimePath(); + const auto filepath = GetCurrentUserPlayTimePath(); + const auto old_filepath = + FileUtil::GetUserPath(FileUtil::UserPath::LogDir) + DIR_SEP + PLAY_TIME_FILENAME; + + if (FileUtil::Exists(old_filepath) && !FileUtil::Exists(filepath)) { + static_cast(FileUtil::Rename(old_filepath, filepath)); + } out_play_time_db.clear(); - if (FileUtil::Exists(filename)) { - FileUtil::IOFile file{filename, "rb"}; + if (FileUtil::Exists(filepath)) { + FileUtil::IOFile file{filepath, "rb"}; if (!file.IsOpen()) { - LOG_ERROR(Frontend, "Failed to open play time file: {}", filename); + LOG_ERROR(Frontend, "Failed to open play time file: {}", filepath); return false; } @@ -54,11 +62,11 @@ std::string GetCurrentUserPlayTimePath() { } [[nodiscard]] bool WritePlayTimeFile(const PlayTimeDatabase& play_time_db) { - const auto filename = GetCurrentUserPlayTimePath(); + const auto filepath = GetCurrentUserPlayTimePath(); - FileUtil::IOFile file{filename, "wb"}; + FileUtil::IOFile file{filepath, "wb"}; if (!file.IsOpen()) { - LOG_ERROR(Frontend, "Failed to open play time file: {}", filename); + LOG_ERROR(Frontend, "Failed to open play time file: {}", filepath); return false; } diff --git a/src/common/settings.cpp b/src/common/settings.cpp index cd604e34a..564090d0b 100644 --- a/src/common/settings.cpp +++ b/src/common/settings.cpp @@ -108,6 +108,9 @@ void LogSettings() { log_setting("Renderer_DisableRightEyeRender", values.disable_right_eye_render.GetValue()); log_setting("Stereoscopy_Render3d", values.render_3d.GetValue()); log_setting("Stereoscopy_Factor3d", values.factor_3d.GetValue()); + log_setting("Stereoscopy_Swap_Eyes", values.swap_eyes_3d.GetValue()); + log_setting("Stereoscopy_Render_3d_to_which_display", + values.render_3d_which_display.GetValue()); log_setting("Stereoscopy_MonoRenderOption", values.mono_render_option.GetValue()); if (values.render_3d.GetValue() == StereoRenderOption::Anaglyph) { log_setting("Renderer_AnaglyphShader", values.anaglyph_shader_name.GetValue()); @@ -153,6 +156,7 @@ void LogSettings() { log_setting("System_RegionValue", values.region_value.GetValue()); log_setting("System_PluginLoader", values.plugin_loader_enabled.GetValue()); log_setting("System_PluginLoaderAllowed", values.allow_plugin_loader.GetValue()); + log_setting("System_ApplyRegionFreePatch", values.apply_region_free_patch.GetValue()); log_setting("Debugging_DelayStartForLLEModules", values.delay_start_for_lle_modules.GetValue()); log_setting("Debugging_UseGdbstub", values.use_gdbstub.GetValue()); log_setting("Debugging_GdbstubPort", values.gdbstub_port.GetValue()); @@ -218,6 +222,7 @@ void RestoreGlobalState(bool is_powered_on) { values.bg_green.SetGlobal(true); values.bg_blue.SetGlobal(true); values.render_3d.SetGlobal(true); + values.swap_eyes_3d.SetGlobal(true); values.factor_3d.SetGlobal(true); values.filter_mode.SetGlobal(true); values.pp_shader_name.SetGlobal(true); diff --git a/src/common/settings.h b/src/common/settings.h index 589de0057..a85ad3c0a 100644 --- a/src/common/settings.h +++ b/src/common/settings.h @@ -72,7 +72,7 @@ enum class SmallScreenPosition : u32 { enum class StereoRenderOption : u32 { Off = 0, SideBySide = 1, - ReverseSideBySide = 2, + SideBySideFull = 2, Anaglyph = 3, Interlaced = 4, ReverseInterlaced = 5, @@ -86,6 +86,14 @@ enum class MonoRenderOption : u32 { RightEye = 1, }; +// on android, which displays to render stereo mode to +enum class StereoWhichDisplay : u32 { + None = 0, // equivalent to StereoRenderOption = Off + Both = 1, + PrimaryOnly = 2, + SecondaryOnly = 3 +}; + enum class AudioEmulation : u32 { HLE = 0, LLE = 1, @@ -481,6 +489,7 @@ struct Values { Setting plugin_loader_enabled{false, "plugin_loader"}; Setting allow_plugin_loader{true, "allow_plugin_loader"}; Setting steps_per_hour{0, "steps_per_hour"}; + Setting apply_region_free_patch{true, "apply_region_free_patch"}; // Renderer SwitchableSetting graphics_api{ @@ -561,6 +570,10 @@ struct Values { SwitchableSetting render_3d{StereoRenderOption::Off, "render_3d"}; SwitchableSetting factor_3d{0, "factor_3d"}; + SwitchableSetting swap_eyes_3d{false, "swap_eyes_3d"}; + + SwitchableSetting render_3d_which_display{StereoWhichDisplay::None, + "render_3d_which_display"}; SwitchableSetting mono_render_option{MonoRenderOption::LeftEye, "mono_render_option"}; diff --git a/src/common/zstd_compression.cpp b/src/common/zstd_compression.cpp index 1e38877a1..ac85ea197 100644 --- a/src/common/zstd_compression.cpp +++ b/src/common/zstd_compression.cpp @@ -13,7 +13,7 @@ #include #include #include -#include +#include #include #include diff --git a/src/core/core.cpp b/src/core/core.cpp index 005003ec8..1622f3941 100644 --- a/src/core/core.cpp +++ b/src/core/core.cpp @@ -24,9 +24,11 @@ #include "core/core.h" #include "core/core_timing.h" #include "core/dumping/backend.h" +#include "core/file_sys/ncch_container.h" #include "core/frontend/image_interface.h" #include "core/gdbstub/gdbstub.h" #include "core/global.h" +#include "core/hle/kernel/ipc_debugger/recorder.h" #include "core/hle/kernel/kernel.h" #include "core/hle/kernel/process.h" #include "core/hle/kernel/thread.h" @@ -317,49 +319,104 @@ System::ResultStatus System::Load(Frontend::EmuWindow& emu_window, const std::st } } - auto memory_mode = app_loader->LoadKernelMemoryMode(); - if (memory_mode.second != Loader::ResultStatus::Success) { - LOG_CRITICAL(Core, "Failed to determine system mode (Error {})!", - static_cast(memory_mode.second)); + Kernel::MemoryMode app_mem_mode; + Kernel::MemoryMode system_mem_mode; + bool used_default_mem_mode = false; + Kernel::New3dsHwCapabilities app_n3ds_hw_capabilities; - switch (memory_mode.second) { - case Loader::ResultStatus::ErrorEncrypted: - return ResultStatus::ErrorLoader_ErrorEncrypted; - case Loader::ResultStatus::ErrorInvalidFormat: - return ResultStatus::ErrorLoader_ErrorInvalidFormat; - case Loader::ResultStatus::ErrorGbaTitle: - return ResultStatus::ErrorLoader_ErrorGbaTitle; - case Loader::ResultStatus::ErrorArtic: - return ResultStatus::ErrorArticDisconnected; - default: - return ResultStatus::ErrorSystemMode; + if (m_mem_mode) { + // Use memory mode set by the FIRM launch parameters + system_mem_mode = static_cast(m_mem_mode.value()); + m_mem_mode = {}; + } else { + // Use default memory mode based on the n3ds setting + system_mem_mode = Settings::values.is_new_3ds.GetValue() ? Kernel::MemoryMode::NewProd + : Kernel::MemoryMode::Prod; + used_default_mem_mode = true; + } + + { + auto memory_mode = app_loader->LoadKernelMemoryMode(); + if (memory_mode.second != Loader::ResultStatus::Success) { + LOG_CRITICAL(Core, "Failed to determine system mode (Error {})!", + static_cast(memory_mode.second)); + + switch (memory_mode.second) { + case Loader::ResultStatus::ErrorEncrypted: + return ResultStatus::ErrorLoader_ErrorEncrypted; + case Loader::ResultStatus::ErrorInvalidFormat: + return ResultStatus::ErrorLoader_ErrorInvalidFormat; + case Loader::ResultStatus::ErrorGbaTitle: + return ResultStatus::ErrorLoader_ErrorGbaTitle; + case Loader::ResultStatus::ErrorArtic: + return ResultStatus::ErrorArticDisconnected; + default: + return ResultStatus::ErrorSystemMode; + } + } + + ASSERT(memory_mode.first); + app_mem_mode = memory_mode.first.value(); + } + + auto n3ds_hw_caps = app_loader->LoadNew3dsHwCapabilities(); + ASSERT(n3ds_hw_caps.first); + app_n3ds_hw_capabilities = n3ds_hw_caps.first.value(); + + if (!Settings::values.is_new_3ds.GetValue() && app_loader->IsN3DSExclusive()) { + return ResultStatus::ErrorN3DSApplication; + } + + // If the default mem mode has been used, we do not come from a FIRM launch. On real HW + // however, the home menu is in charge or setting the proper memory mode when launching + // applications by doing a FIRM launch. Since we launch the application without going + // through the home menu, we need to emulate the FIRM launch having happened and set the + // proper memory mode. + if (used_default_mem_mode) { + + // If we are on the Old 3DS prod mode and the application memory mode does not match, we + // need to adjust it. We do not need adjustment if we are on the New 3DS prod mode, as that + // one overrides all the Old 3DS memory modes. + if (system_mem_mode == Kernel::MemoryMode::Prod && app_mem_mode != system_mem_mode) { + system_mem_mode = app_mem_mode; + } + + // If we are on the New 3DS prod mode, and the application needs the New 3DS extended + // memory mode (only CTRAging is known to do this), adjust the memory mode. + else if (system_mem_mode == Kernel::MemoryMode::NewProd && + app_n3ds_hw_capabilities.memory_mode == Kernel::New3dsMemoryMode::NewDev1) { + system_mem_mode = Kernel::MemoryMode::NewDev1; } } - ASSERT(memory_mode.first); - auto n3ds_hw_caps = app_loader->LoadNew3dsHwCapabilities(); - ASSERT(n3ds_hw_caps.first); u32 num_cores = 2; if (Settings::values.is_new_3ds) { num_cores = 4; } - ResultStatus init_result{ - Init(emu_window, secondary_window, *memory_mode.first, *n3ds_hw_caps.first, num_cores)}; + ResultStatus init_result{Init(emu_window, secondary_window, system_mem_mode, num_cores)}; if (init_result != ResultStatus::Success) { LOG_CRITICAL(Core, "Failed to initialize system (Error {})!", static_cast(init_result)); System::Shutdown(); return init_result; } + + kernel->UpdateCPUAndMemoryState(program_id, app_mem_mode, app_n3ds_hw_capabilities); + gpu->ReportLoadingProgramID(program_id); // Restore any parameters that should be carried through a reset. - if (restore_deliver_arg.has_value()) { - if (auto apt = Service::APT::GetModule(*this)) { + if (auto apt = Service::APT::GetModule(*this)) { + if (restore_deliver_arg.has_value()) { apt->GetAppletManager()->SetDeliverArg(restore_deliver_arg); + restore_deliver_arg.reset(); + } + if (restore_sys_menu_arg.has_value()) { + apt->GetAppletManager()->SetSysMenuArg(restore_sys_menu_arg.value()); + restore_sys_menu_arg.reset(); } - restore_deliver_arg.reset(); } + if (restore_plugin_context.has_value()) { if (auto plg_ldr = Service::PLGLDR::GetService(*this)) { plg_ldr->SetPluginLoaderContext(restore_plugin_context.value()); @@ -367,6 +424,10 @@ System::ResultStatus System::Load(Frontend::EmuWindow& emu_window, const std::st restore_plugin_context.reset(); } + if (restore_ipc_recorder) { + kernel->RestoreIPCRecorder(std::move(restore_ipc_recorder)); + } + std::shared_ptr process; const Loader::ResultStatus load_result{app_loader->Load(process)}; if (Loader::ResultStatus::Success != load_result) { @@ -449,8 +510,7 @@ void System::Reschedule() { System::ResultStatus System::Init(Frontend::EmuWindow& emu_window, Frontend::EmuWindow* secondary_window, - Kernel::MemoryMode memory_mode, - const Kernel::New3dsHwCapabilities& n3ds_hw_caps, u32 num_cores) { + Kernel::MemoryMode memory_mode, u32 num_cores) { LOG_DEBUG(HW_Memory, "initialized OK"); memory = std::make_unique(*this); @@ -459,7 +519,7 @@ System::ResultStatus System::Init(Frontend::EmuWindow& emu_window, movie.GetOverrideBaseTicks()); kernel = std::make_unique( - *memory, *timing, [this] { PrepareReschedule(); }, memory_mode, num_cores, n3ds_hw_caps, + *memory, *timing, [this] { PrepareReschedule(); }, memory_mode, num_cores, movie.GetOverrideInitTime()); exclusive_monitor = MakeExclusiveMonitor(*memory, num_cores); @@ -496,8 +556,6 @@ System::ResultStatus System::Init(Frontend::EmuWindow& emu_window, dsp_core = std::make_unique(*this, multithread); } - memory->SetDSP(*dsp_core); - dsp_core->SetSink(Settings::values.output_type.GetValue(), Settings::values.output_device.GetValue()); dsp_core->EnableStretching(Settings::values.enable_audio_stretching.GetValue()); @@ -680,11 +738,14 @@ void System::Reset() { // This is needed as we don't currently support proper app jumping. if (auto apt = Service::APT::GetModule(*this)) { restore_deliver_arg = apt->GetAppletManager()->ReceiveDeliverArg(); + restore_sys_menu_arg = apt->GetAppletManager()->GetSysMenuArg(); } if (auto plg_ldr = Service::PLGLDR::GetService(*this)) { restore_plugin_context = plg_ldr->GetPluginLoaderContext(); } + restore_ipc_recorder = std::move(kernel->BackupIPCRecorder()); + Shutdown(); if (!m_chainloadpath.empty()) { @@ -752,6 +813,18 @@ void System::RegisterAppLoaderEarly(std::unique_ptr& loader) early_app_loader = std::move(loader); } +void System::InsertCartridge(const std::string& path) { + FileSys::NCCHContainer cartridge_container(path); + if (cartridge_container.LoadHeader() == Loader::ResultStatus::Success && + cartridge_container.IsNCSD()) { + inserted_cartridge = path; + } +} + +void System::EjectCartridge() { + inserted_cartridge.clear(); +} + bool System::IsInitialSetup() { return app_loader && app_loader->DoingInitialSetup(); } @@ -777,17 +850,19 @@ void System::serialize(Archive& ar, const unsigned int file_version) { } ar & lle_modules; + Kernel::MemoryMode mem_mode{}; + if (!Archive::is_loading::value) { + mem_mode = kernel->GetMemoryMode(); + } + ar & mem_mode; if (Archive::is_loading::value) { // When loading, we want to make sure any lingering state gets cleared out before we begin. // Shutdown, but persist a few things between loads... Shutdown(true); - // Re-initialize everything like it was before - auto memory_mode = this->app_loader->LoadKernelMemoryMode(); - auto n3ds_hw_caps = this->app_loader->LoadNew3dsHwCapabilities(); - [[maybe_unused]] const System::ResultStatus result = Init( - *m_emu_window, m_secondary_window, *memory_mode.first, *n3ds_hw_caps.first, num_cores); + [[maybe_unused]] const System::ResultStatus result = + Init(*m_emu_window, m_secondary_window, mem_mode, num_cores); } // Flush on save, don't flush on load @@ -819,7 +894,6 @@ void System::serialize(Archive& ar, const unsigned int file_version) { u32 cheats_pid; ar & cheats_pid; timing->UnlockEventQueue(); - memory->SetDSP(*dsp_core); cheat_engine.Connect(cheats_pid); // Re-register gpu callback, because gsp service changed after service_manager got diff --git a/src/core/core.h b/src/core/core.h index 4ed8ff326..b33fea174 100644 --- a/src/core/core.h +++ b/src/core/core.h @@ -101,6 +101,7 @@ public: ErrorSystemFiles, ///< Error in finding system files ErrorSavestate, ///< Error saving or loading ErrorArticDisconnected, ///< Error when artic base disconnects + ErrorN3DSApplication, ///< Error launching New 3DS application in Old 3DS mode ShutdownRequested, ///< Emulated program requested a system shutdown ErrorUnknown ///< Any other error }; @@ -137,8 +138,9 @@ public: bool SendSignal(Signal signal, u32 param = 0); /// Request reset of the system - void RequestReset(const std::string& chainload = "") { + void RequestReset(const std::string& chainload = "", std::optional mem_mode = {}) { m_chainloadpath = chainload; + m_mem_mode = mem_mode; SendSignal(Signal::Reset); } @@ -374,6 +376,14 @@ public: void RegisterAppLoaderEarly(std::unique_ptr& loader); + void InsertCartridge(const std::string& path); + + void EjectCartridge(); + + const std::string& GetCartridge() const { + return inserted_cartridge; + } + bool IsInitialSetup(); private: @@ -386,9 +396,7 @@ private: */ [[nodiscard]] ResultStatus Init(Frontend::EmuWindow& emu_window, Frontend::EmuWindow* secondary_window, - Kernel::MemoryMode memory_mode, - const Kernel::New3dsHwCapabilities& n3ds_hw_caps, - u32 num_cores); + Kernel::MemoryMode memory_mode, u32 num_cores); /// Reschedule the core emulation void Reschedule(); @@ -399,6 +407,9 @@ private: // Temporary app loader passed from frontend std::unique_ptr early_app_loader; + /// Path for current inserted cartridge + std::string inserted_cartridge; + /// ARM11 CPU core std::vector> cpu_cores; ARM_Interface* running_core = nullptr; @@ -463,6 +474,7 @@ private: Frontend::EmuWindow* m_secondary_window; std::string m_filepath; std::string m_chainloadpath; + std::optional m_mem_mode; u64 title_id; bool self_delete_pending; @@ -474,7 +486,9 @@ private: bool mic_permission_granted = false; boost::optional restore_deliver_arg; + boost::optional restore_sys_menu_arg; boost::optional restore_plugin_context; + std::unique_ptr restore_ipc_recorder; std::vector lle_modules; diff --git a/src/core/file_sys/archive_ncch.cpp b/src/core/file_sys/archive_ncch.cpp index fb0be5640..514a8736e 100644 --- a/src/core/file_sys/archive_ncch.cpp +++ b/src/core/file_sys/archive_ncch.cpp @@ -88,14 +88,31 @@ ResultVal> NCCHArchive::OpenFile(const Path& path, std::memcpy(&openfile_path, binary.data(), sizeof(NCCHFilePath)); std::string file_path; - if (Settings::values.is_new_3ds) { - // Try the New 3DS specific variant first. - file_path = Service::AM::GetTitleContentPath(media_type, title_id | 0x20000000, - openfile_path.content_index); - } - if (!Settings::values.is_new_3ds || !FileUtil::Exists(file_path)) { - file_path = - Service::AM::GetTitleContentPath(media_type, title_id, openfile_path.content_index); + + if (media_type == Service::FS::MediaType::GameCard) { + const auto& cartridge = Core::System::GetInstance().GetCartridge(); + if (cartridge.empty()) { + return ResultNotFound; + } + + u64 card_program_id; + auto cartridge_loader = Loader::GetLoader(cartridge); + FileSys::NCCHContainer cartridge_ncch(cartridge); + if (cartridge_ncch.ReadProgramId(card_program_id) != Loader::ResultStatus::Success || + card_program_id != title_id) { + return ResultNotFound; + } + file_path = cartridge; + } else { + if (Settings::values.is_new_3ds) { + // Try the New 3DS specific variant first. + file_path = Service::AM::GetTitleContentPath(media_type, title_id | 0x20000000, + openfile_path.content_index); + } + if (!Settings::values.is_new_3ds || !FileUtil::Exists(file_path)) { + file_path = + Service::AM::GetTitleContentPath(media_type, title_id, openfile_path.content_index); + } } auto ncch_container = NCCHContainer(file_path, 0, openfile_path.content_index); @@ -116,6 +133,15 @@ ResultVal> NCCHArchive::OpenFile(const Path& path, // Load NCCH .code or icon/banner/logo result = ncch_container.LoadSectionExeFS(openfile_path.exefs_filepath.data(), buffer); + if (result == Loader::ResultStatus::Success && Settings::values.apply_region_free_patch && + std::memcmp(openfile_path.exefs_filepath.data(), "icon", 4) == 0 && + buffer.size() >= sizeof(Loader::SMDH)) { + // Change the SMDH region lockout value to be region free + Loader::SMDH* smdh = reinterpret_cast(buffer.data()); + constexpr u32 REGION_LOCKOUT_REGION_FREE = 0x7FFFFFFF; + + smdh->region_lockout = REGION_LOCKOUT_REGION_FREE; + } std::unique_ptr delay_generator = std::make_unique(); file = std::make_unique(std::move(buffer), std::move(delay_generator)); } else { diff --git a/src/core/file_sys/plugin_3gx.cpp b/src/core/file_sys/plugin_3gx.cpp index fc7374d0b..f98e18a04 100644 --- a/src/core/file_sys/plugin_3gx.cpp +++ b/src/core/file_sys/plugin_3gx.cpp @@ -1,7 +1,9 @@ -// Copyright 2022 Citra Emulator Project +// Copyright Citra Emulator Project / Azahar Emulator Project // Licensed under GPLv2 or any later version // Refer to the license.txt file included. +// Originally MIT-licensed code from The Pixellizer Group + // Copyright 2022 The Pixellizer Group // // Permission is hereby granted, free of charge, to any person obtaining a copy of this software and @@ -22,6 +24,7 @@ #include "core/file_sys/file_backend.h" #include "core/file_sys/plugin_3gx.h" #include "core/file_sys/plugin_3gx_bootloader.h" +#include "core/hle/kernel/config_mem.h" #include "core/hle/kernel/vm_manager.h" #include "core/loader/loader.h" @@ -173,10 +176,10 @@ Loader::ResultStatus FileSys::Plugin3GXLoader::Map( } const std::array mem_region_sizes = { - 5 * 1024 * 1024, // 5 MiB - 2 * 1024 * 1024, // 2 MiB - 3 * 1024 * 1024, // 3 MiB - 4 * 1024 * 1024 // 4 MiB + 5 * 1024 * 1024, // 5 MiB + 2 * 1024 * 1024, // 2 MiB + 10 * 1024 * 1024, // 10 MiB + 5 * 1024 * 1024 // 5 MiB (reserved) }; const bool is_mem_private = header.infos.flags.use_private_memory != 0; @@ -184,65 +187,64 @@ Loader::ResultStatus FileSys::Plugin3GXLoader::Map( // Map memory block. This behaviour mimics how plugins are loaded on 3DS as much as possible. // Calculate the sizes of the different memory regions const u32 block_size = mem_region_sizes[header.infos.flags.memory_region_size.Value()]; + const u32 exe_offset = 0; const u32 exe_size = (sizeof(PluginHeader) + text_section.size() + rodata_section.size() + data_section.size() + header.executable.bss_size + 0x1000) & ~0xFFFu; + const u32 bootloader_offset = exe_offset + exe_size; + const u32 bootloader_size = bootloader_memory_size; + const u32 heap_offset = bootloader_offset + bootloader_size; + const u32 heap_size = block_size - heap_offset; - // Allocate the framebuffer block so that is in the highest FCRAM position possible - auto offset_fb = - kernel.GetMemoryRegion(Kernel::MemoryRegion::SYSTEM)->RLinearAllocate(_3GX_fb_size); - if (!offset_fb) { - LOG_ERROR(Service_PLGLDR, "Failed to load 3GX plugin. Not enough memory: {}", - plg_context.plugin_path); - return Loader::ResultStatus::ErrorMemoryAllocationFailed; + // Allocate a block of memory for the plugin + std::optional offset; + if (kernel.GetMemoryMode() == Kernel::MemoryMode::NewProd || + (plg_context.use_user_load_parameters && + plg_context.user_load_parameters.plugin_memory_strategy == + Service::PLGLDR::PLG_LDR::PluginMemoryStrategy::PLG_STRATEGY_MODE3)) { + // Allocate memory block from the end of the APPLICATION region + offset = + kernel.GetMemoryRegion(Kernel::MemoryRegion::APPLICATION)->RLinearAllocate(block_size); + + // If the reported available APP mem equals the actual size, remove the plugin block size. + if (offset) { + auto& config_mem = kernel.GetConfigMemHandler(); + if (config_mem.GetConfigMem().app_mem_alloc == + kernel.GetMemoryRegion(Kernel::MemoryRegion::APPLICATION)->size) { + config_mem.GetConfigMem().app_mem_alloc -= block_size; + } + } + plg_context.memory_region = Kernel::MemoryRegion::APPLICATION; + } else { + // Allocate memory block from the start of the SYSTEM region + offset = kernel.GetMemoryRegion(Kernel::MemoryRegion::SYSTEM)->LinearAllocate(block_size); + plg_context.memory_region = Kernel::MemoryRegion::SYSTEM; } - auto backing_memory_fb = kernel.memory.GetFCRAMRef(*offset_fb); - plg_ldr.SetPluginFBAddr(Memory::FCRAM_PADDR + *offset_fb); - std::fill(backing_memory_fb.GetPtr(), backing_memory_fb.GetPtr() + _3GX_fb_size, 0); - auto vma_heap_fb = process.vm_manager.MapBackingMemory( - _3GX_heap_load_addr, backing_memory_fb, _3GX_fb_size, - is_mem_private ? Kernel::MemoryState::Private : Kernel::MemoryState::Shared); - ASSERT(vma_heap_fb.Succeeded()); - process.vm_manager.Reprotect(vma_heap_fb.Unwrap(), Kernel::VMAPermission::ReadWrite); - - // Allocate a block from the end of FCRAM and clear it - auto offset = kernel.GetMemoryRegion(Kernel::MemoryRegion::SYSTEM) - ->RLinearAllocate(block_size - _3GX_fb_size); if (!offset) { - kernel.GetMemoryRegion(Kernel::MemoryRegion::SYSTEM)->Free(*offset_fb, _3GX_fb_size); LOG_ERROR(Service_PLGLDR, "Failed to load 3GX plugin. Not enough memory: {}", plg_context.plugin_path); return Loader::ResultStatus::ErrorMemoryAllocationFailed; } - auto backing_memory = kernel.memory.GetFCRAMRef(*offset); - std::fill(backing_memory.GetPtr(), backing_memory.GetPtr() + block_size - _3GX_fb_size, 0); - // Then we map part of the memory, which contains the executable - auto vma = process.vm_manager.MapBackingMemory(_3GX_exe_load_addr, backing_memory, exe_size, - is_mem_private ? Kernel::MemoryState::Private - : Kernel::MemoryState::Shared); - ASSERT(vma.Succeeded()); - process.vm_manager.Reprotect(vma.Unwrap(), Kernel::VMAPermission::ReadWriteExecute); + u32 fcram_offset = offset.value(); + + auto backing_memory_exe = kernel.memory.GetFCRAMRef(fcram_offset + exe_offset); + std::fill(backing_memory_exe.GetPtr(), backing_memory_exe.GetPtr() + exe_size, 0); + + // Map the executable + auto vma_exe = process.vm_manager.MapBackingMemory( + _3GX_exe_load_addr, backing_memory_exe, exe_size, + is_mem_private ? Kernel::MemoryState::Private : Kernel::MemoryState::Shared); + ASSERT(vma_exe.Succeeded()); + process.vm_manager.Reprotect(vma_exe.Unwrap(), Kernel::VMAPermission::ReadWriteExecute); - // Write text section - kernel.memory.WriteBlock(process, _3GX_exe_load_addr + sizeof(PluginHeader), - text_section.data(), header.executable.code_size); - // Write rodata section - kernel.memory.WriteBlock( - process, _3GX_exe_load_addr + sizeof(PluginHeader) + header.executable.code_size, - rodata_section.data(), header.executable.rodata_size); - // Write data section - kernel.memory.WriteBlock(process, - _3GX_exe_load_addr + sizeof(PluginHeader) + - header.executable.code_size + header.executable.rodata_size, - data_section.data(), header.executable.data_size); // Prepare plugin header and write it PluginHeader plugin_header = {0}; plugin_header.version = header.version; plugin_header.exe_size = exe_size; plugin_header.heap_VA = _3GX_heap_load_addr; - plugin_header.heap_size = block_size - exe_size; + plugin_header.heap_size = heap_size; plg_context.plg_event = _3GX_exe_load_addr - 0x4; plg_context.plg_reply = _3GX_exe_load_addr - 0x8; plugin_header.plgldr_event = plg_context.plg_event; @@ -254,39 +256,46 @@ Loader::ResultStatus FileSys::Plugin3GXLoader::Map( } kernel.memory.WriteBlock(process, _3GX_exe_load_addr, &plugin_header, sizeof(PluginHeader)); - // Map plugin heap - auto backing_memory_heap = kernel.memory.GetFCRAMRef(*offset + exe_size); + // Write text section + kernel.memory.WriteBlock(process, _3GX_exe_load_addr + sizeof(PluginHeader), + text_section.data(), header.executable.code_size); + // Write rodata section + kernel.memory.WriteBlock( + process, _3GX_exe_load_addr + sizeof(PluginHeader) + header.executable.code_size, + rodata_section.data(), header.executable.rodata_size); - // Map the rest of the memory at the heap location - auto vma_heap = process.vm_manager.MapBackingMemory( - _3GX_heap_load_addr + _3GX_fb_size, backing_memory_heap, - block_size - exe_size - _3GX_fb_size, - is_mem_private ? Kernel::MemoryState::Private : Kernel::MemoryState::Shared); - ASSERT(vma_heap.Succeeded()); - process.vm_manager.Reprotect(vma_heap.Unwrap(), Kernel::VMAPermission::ReadWriteExecute); + // Write data section + kernel.memory.WriteBlock(process, + _3GX_exe_load_addr + sizeof(PluginHeader) + + header.executable.code_size + header.executable.rodata_size, + data_section.data(), header.executable.data_size); - // Allocate a block from the end of FCRAM and clear it - auto bootloader_offset = kernel.GetMemoryRegion(Kernel::MemoryRegion::SYSTEM) - ->RLinearAllocate(bootloader_memory_size); - if (!bootloader_offset) { - kernel.GetMemoryRegion(Kernel::MemoryRegion::SYSTEM)->Free(*offset_fb, _3GX_fb_size); - kernel.GetMemoryRegion(Kernel::MemoryRegion::SYSTEM) - ->Free(*offset, block_size - _3GX_fb_size); - LOG_ERROR(Service_PLGLDR, "Failed to load 3GX plugin. Not enough memory: {}", - plg_context.plugin_path); - return Loader::ResultStatus::ErrorMemoryAllocationFailed; - } + // Map bootloader const bool use_internal = plg_context.load_exe_func.empty(); MapBootloader( - process, kernel, *bootloader_offset, + process, kernel, fcram_offset + bootloader_offset, (use_internal) ? exe_load_func : plg_context.load_exe_func, (use_internal) ? exe_load_args : plg_context.load_exe_args, header.executable.code_size + header.executable.rodata_size + header.executable.data_size, header.infos.exe_load_checksum, plg_context.use_user_load_parameters ? plg_context.user_load_parameters.no_flash : 0); + // Map plugin heap + auto backing_memory_heap = kernel.memory.GetFCRAMRef(fcram_offset + heap_offset); + std::fill(backing_memory_heap.GetPtr(), backing_memory_heap.GetPtr() + heap_size, 0); + + auto vma_heap = process.vm_manager.MapBackingMemory( + _3GX_heap_load_addr, backing_memory_heap, heap_size, + is_mem_private ? Kernel::MemoryState::Private : Kernel::MemoryState::Shared); + ASSERT(vma_heap.Succeeded()); + process.vm_manager.Reprotect(vma_heap.Unwrap(), Kernel::VMAPermission::ReadWriteExecute); + + kernel.memory.Plugin3GXFramebufferAddress() = Memory::FCRAM_PADDR + fcram_offset + heap_offset; plg_context.plugin_loaded = true; + plg_context.plugin_process_id = process.process_id; plg_context.use_user_load_parameters = false; + plg_context.memory_block = {fcram_offset, block_size}; + return Loader::ResultStatus::Success; } @@ -355,7 +364,7 @@ void FileSys::Plugin3GXLoader::MapBootloader(Kernel::Process& process, Kernel::K std::fill(backing_memory.GetPtr(), backing_memory.GetPtr() + bootloader_memory_size, 0); auto vma = process.vm_manager.MapBackingMemory(_3GX_exe_load_addr - bootloader_memory_size, backing_memory, bootloader_memory_size, - Kernel::MemoryState::Continuous); + Kernel::MemoryState::Private); ASSERT(vma.Succeeded()); process.vm_manager.Reprotect(vma.Unwrap(), Kernel::VMAPermission::ReadWriteExecute); diff --git a/src/core/frontend/emu_window.cpp b/src/core/frontend/emu_window.cpp index ee81b177e..3216a1675 100644 --- a/src/core/frontend/emu_window.cpp +++ b/src/core/frontend/emu_window.cpp @@ -25,9 +25,8 @@ public: std::mutex mutex; bool touch_pressed = false; ///< True if touchpad area is currently pressed, otherwise false - - float touch_x = 0.0f; ///< Touchpad X-position - float touch_y = 0.0f; ///< Touchpad Y-position + float touch_x = 0.0f; ///< Touchpad X-position + float touch_y = 0.0f; ///< Touchpad Y-position private: class Device : public Input::TouchDevice { @@ -56,24 +55,44 @@ EmuWindow::EmuWindow(bool is_secondary_) : is_secondary{is_secondary_} { EmuWindow::~EmuWindow() = default; +Settings::StereoRenderOption EmuWindow::get3DMode() const { + Settings::StereoRenderOption render_3d_mode = Settings::values.render_3d.GetValue(); +#ifndef ANDROID + // on desktop, if separate windows and this is the bottom screen, then no stereo + if (Settings::values.layout_option.GetValue() == Settings::LayoutOption::SeparateWindows && + ((!is_secondary && Settings::values.swap_screen.GetValue()) || + (is_secondary && !Settings::values.swap_screen.GetValue()))) { + render_3d_mode = Settings::StereoRenderOption::Off; + } +#else + // adjust the StereoRenderOption setting to Off if appropriate on mobile + Settings::StereoWhichDisplay whichDisplay = Settings::values.render_3d_which_display.GetValue(); + if (whichDisplay == Settings::StereoWhichDisplay::None || + whichDisplay == Settings::StereoWhichDisplay::PrimaryOnly && is_secondary || + whichDisplay == Settings::StereoWhichDisplay::SecondaryOnly && !is_secondary) { + render_3d_mode = Settings::StereoRenderOption::Off; + } +#endif + return render_3d_mode; +} + bool EmuWindow::IsWithinTouchscreen(const Layout::FramebufferLayout& layout, unsigned framebuffer_x, unsigned framebuffer_y) { #ifndef ANDROID // If separate windows and the touch is in the primary (top) screen, ignore it. if (Settings::values.layout_option.GetValue() == Settings::LayoutOption::SeparateWindows && - !is_secondary && !Settings::values.swap_screen.GetValue()) { + ((!is_secondary && !Settings::values.swap_screen.GetValue()) || + (is_secondary && Settings::values.swap_screen.GetValue()))) { return false; } #endif + Settings::StereoRenderOption render_3d_mode = get3DMode(); - if (!layout.bottom_screen_enabled) { - return false; + if (framebuffer_x > layout.width / 2 && + render_3d_mode == Settings::StereoRenderOption::SideBySideFull) { + framebuffer_x = static_cast(framebuffer_x - layout.width / 2); } - - Settings::StereoRenderOption render_3d_mode = Settings::values.render_3d.GetValue(); - - if (render_3d_mode == Settings::StereoRenderOption::SideBySide || - render_3d_mode == Settings::StereoRenderOption::ReverseSideBySide) { + if (render_3d_mode == Settings::StereoRenderOption::SideBySide) { return (framebuffer_y >= layout.bottom_screen.top && framebuffer_y < layout.bottom_screen.bottom && ((framebuffer_x >= layout.bottom_screen.left / 2 && @@ -97,25 +116,19 @@ bool EmuWindow::IsWithinTouchscreen(const Layout::FramebufferLayout& layout, uns } std::tuple EmuWindow::ClipToTouchScreen(unsigned new_x, unsigned new_y) const { - Settings::StereoRenderOption render_3d_mode = Settings::values.render_3d.GetValue(); - bool separate_win = false; -#ifndef ANDROID - separate_win = - (Settings::values.layout_option.GetValue() == Settings::LayoutOption::SeparateWindows); -#endif + + Settings::StereoRenderOption render_3d_mode = get3DMode(); if (new_x >= framebuffer_layout.width / 2) { - if ((render_3d_mode == Settings::StereoRenderOption::SideBySide || - render_3d_mode == Settings::StereoRenderOption::ReverseSideBySide) && - !separate_win) + if (render_3d_mode == Settings::StereoRenderOption::SideBySide || + render_3d_mode == Settings::StereoRenderOption::SideBySideFull) new_x -= framebuffer_layout.width / 2; else if (render_3d_mode == Settings::StereoRenderOption::CardboardVR) new_x -= (framebuffer_layout.width / 2) - (framebuffer_layout.cardboard.user_x_shift * 2); } - if ((render_3d_mode == Settings::StereoRenderOption::SideBySide || - render_3d_mode == Settings::StereoRenderOption::ReverseSideBySide) && - !separate_win) { + + if (render_3d_mode == Settings::StereoRenderOption::SideBySide) { new_x = std::max(new_x, framebuffer_layout.bottom_screen.left / 2); new_x = std::min(new_x, framebuffer_layout.bottom_screen.right / 2 - 1); } else { @@ -140,29 +153,22 @@ void EmuWindow::CreateTouchState() { } bool EmuWindow::TouchPressed(unsigned framebuffer_x, unsigned framebuffer_y) { - Settings::StereoRenderOption render_3d_mode = Settings::values.render_3d.GetValue(); - bool separate_win = false; -#ifndef ANDROID - separate_win = - (Settings::values.layout_option.GetValue() == Settings::LayoutOption::SeparateWindows); -#endif - if (!IsWithinTouchscreen(framebuffer_layout, framebuffer_x, framebuffer_y)) return false; + Settings::StereoRenderOption render_3d_mode = get3DMode(); if (framebuffer_x >= framebuffer_layout.width / 2) { - if ((render_3d_mode == Settings::StereoRenderOption::SideBySide || - render_3d_mode == Settings::StereoRenderOption::ReverseSideBySide) && - !separate_win) + if (render_3d_mode == Settings::StereoRenderOption::SideBySide || + render_3d_mode == Settings::StereoRenderOption::SideBySideFull) framebuffer_x -= framebuffer_layout.width / 2; else if (render_3d_mode == Settings::StereoRenderOption::CardboardVR) framebuffer_x -= (framebuffer_layout.width / 2) - (framebuffer_layout.cardboard.user_x_shift * 2); } + std::scoped_lock guard(touch_state->mutex); - if ((render_3d_mode == Settings::StereoRenderOption::SideBySide || - render_3d_mode == Settings::StereoRenderOption::ReverseSideBySide) && - !separate_win) { + + if (render_3d_mode == Settings::StereoRenderOption::SideBySide) { touch_state->touch_x = static_cast(framebuffer_x - framebuffer_layout.bottom_screen.left / 2) / (framebuffer_layout.bottom_screen.right / 2 - @@ -204,8 +210,13 @@ void EmuWindow::TouchMoved(unsigned framebuffer_x, unsigned framebuffer_y) { void EmuWindow::UpdateCurrentFramebufferLayout(u32 width, u32 height, bool is_portrait_mode) { Layout::FramebufferLayout layout; - const Settings::LayoutOption layout_option = Settings::values.layout_option.GetValue(); + const Settings::StereoRenderOption stereo_option = get3DMode(); + bool render_full_stereo = (stereo_option == Settings::StereoRenderOption::SideBySideFull); + bool is_bottom = is_secondary; + if (Settings::values.swap_screen.GetValue()) + is_bottom = !is_bottom; + const Settings::PortraitLayoutOption portrait_layout_option = Settings::values.portrait_layout_option.GetValue(); const auto min_size = is_portrait_mode @@ -215,6 +226,9 @@ void EmuWindow::UpdateCurrentFramebufferLayout(u32 width, u32 height, bool is_po width = std::max(width, min_size.first); height = std::max(height, min_size.second); + if (render_full_stereo) { + width = width / 2; + } if (is_portrait_mode) { switch (portrait_layout_option) { case Settings::PortraitLayoutOption::PortraitTopFullWidth: @@ -280,11 +294,16 @@ void EmuWindow::UpdateCurrentFramebufferLayout(u32 width, u32 height, bool is_po layout = Layout::AndroidSecondaryLayout(width, height); } #endif + + if (render_full_stereo) { + layout.width = width * 2; + } UpdateMinimumWindowSize(min_size); if (Settings::values.render_3d.GetValue() == Settings::StereoRenderOption::CardboardVR) { layout = Layout::GetCardboardSettings(layout); } + layout.render_3d_mode = stereo_option; NotifyFramebufferLayoutChanged(layout); } diff --git a/src/core/frontend/emu_window.h b/src/core/frontend/emu_window.h index f217a7eac..d5b7803cc 100644 --- a/src/core/frontend/emu_window.h +++ b/src/core/frontend/emu_window.h @@ -258,6 +258,8 @@ public: return is_secondary; } + Settings::StereoRenderOption get3DMode() const; + protected: EmuWindow(); EmuWindow(bool is_secondary); diff --git a/src/core/frontend/framebuffer_layout.cpp b/src/core/frontend/framebuffer_layout.cpp index 99628d118..392db8867 100644 --- a/src/core/frontend/framebuffer_layout.cpp +++ b/src/core/frontend/framebuffer_layout.cpp @@ -79,7 +79,7 @@ FramebufferLayout SingleFrameLayout(u32 width, u32 height, bool swapped, bool up // TODO: This is kind of gross, make it platform agnostic. -OS #ifdef ANDROID - const float window_aspect_ratio = static_cast(height) / static_cast(width); + const float window_aspect_ratio = static_cast(height) / width; const auto aspect_ratio_setting = Settings::values.aspect_ratio.GetValue(); float emulation_aspect_ratio = (swapped) ? BOT_SCREEN_ASPECT_RATIO : TOP_SCREEN_ASPECT_RATIO; @@ -365,6 +365,12 @@ FramebufferLayout CustomFrameLayout(u32 width, u32 height, bool is_swapped, bool } FramebufferLayout res{ width, height, true, true, {}, {}, !Settings::values.upright_screen, is_portrait_mode}; + float opacity_value = Settings::values.custom_second_layer_opacity.GetValue() / 100.0f; + + if (!is_portrait_mode && opacity_value < 1) { + is_swapped ? res.top_opacity = opacity_value : res.bottom_opacity = opacity_value; + } + const u16 top_x = is_portrait_mode ? Settings::values.custom_portrait_top_x.GetValue() : Settings::values.custom_top_x.GetValue(); const u16 top_width = is_portrait_mode ? Settings::values.custom_portrait_top_width.GetValue() @@ -407,53 +413,56 @@ FramebufferLayout FrameLayoutFromResolutionScale(u32 res_scale, bool is_secondar bool is_portrait) { u32 width, height, gap; gap = (int)(Settings::values.screen_gap.GetValue()) * res_scale; + + FramebufferLayout layout; if (is_portrait) { auto layout_option = Settings::values.portrait_layout_option.GetValue(); switch (layout_option) { case Settings::PortraitLayoutOption::PortraitCustomLayout: - return CustomFrameLayout( - std::max(Settings::values.custom_portrait_top_x.GetValue() + - Settings::values.custom_portrait_top_width.GetValue(), - Settings::values.custom_portrait_bottom_x.GetValue() + - Settings::values.custom_portrait_bottom_width.GetValue()), - std::max(Settings::values.custom_portrait_top_y.GetValue() + - Settings::values.custom_portrait_top_height.GetValue(), - Settings::values.custom_portrait_bottom_y.GetValue() + - Settings::values.custom_portrait_bottom_height.GetValue()), - Settings::values.swap_screen.GetValue(), is_portrait); + width = std::max(Settings::values.custom_portrait_top_x.GetValue() + + Settings::values.custom_portrait_top_width.GetValue(), + Settings::values.custom_portrait_bottom_x.GetValue() + + Settings::values.custom_portrait_bottom_width.GetValue()); + height = std::max(Settings::values.custom_portrait_top_y.GetValue() + + Settings::values.custom_portrait_top_height.GetValue(), + Settings::values.custom_portrait_bottom_y.GetValue() + + Settings::values.custom_portrait_bottom_height.GetValue()); + layout = CustomFrameLayout(width, height, Settings::values.swap_screen.GetValue(), + is_portrait); + + break; case Settings::PortraitLayoutOption::PortraitTopFullWidth: width = Core::kScreenTopWidth * res_scale; // clang-format off height = (static_cast(Core::kScreenTopHeight + Core::kScreenBottomHeight * 1.25) * res_scale) + gap; // clang-format on - return PortraitTopFullFrameLayout(width, height, - Settings::values.swap_screen.GetValue(), - Settings::values.upright_screen.GetValue()); + layout = + PortraitTopFullFrameLayout(width, height, Settings::values.swap_screen.GetValue(), + Settings::values.upright_screen.GetValue()); + break; case Settings::PortraitLayoutOption::PortraitOriginal: width = Core::kScreenTopWidth * res_scale; height = (Core::kScreenTopHeight + Core::kScreenBottomHeight) * res_scale; - return PortraitOriginalLayout(width, height, Settings::values.swap_screen.GetValue()); + layout = PortraitOriginalLayout(width, height, Settings::values.swap_screen.GetValue()); + break; } } else { auto layout_option = Settings::values.layout_option.GetValue(); switch (layout_option) { case Settings::LayoutOption::CustomLayout: - return CustomFrameLayout(std::max(Settings::values.custom_top_x.GetValue() + - Settings::values.custom_top_width.GetValue(), - Settings::values.custom_bottom_x.GetValue() + - Settings::values.custom_bottom_width.GetValue()), - std::max(Settings::values.custom_top_y.GetValue() + - Settings::values.custom_top_height.GetValue(), - Settings::values.custom_bottom_y.GetValue() + - Settings::values.custom_bottom_height.GetValue()), - Settings::values.swap_screen.GetValue(), is_portrait); - - case Settings::LayoutOption::SingleScreen: -#ifndef ANDROID - case Settings::LayoutOption::SeparateWindows: -#endif - { + layout = + CustomFrameLayout(std::max(Settings::values.custom_top_x.GetValue() + + Settings::values.custom_top_width.GetValue(), + Settings::values.custom_bottom_x.GetValue() + + Settings::values.custom_bottom_width.GetValue()), + std::max(Settings::values.custom_top_y.GetValue() + + Settings::values.custom_top_height.GetValue(), + Settings::values.custom_bottom_y.GetValue() + + Settings::values.custom_bottom_height.GetValue()), + Settings::values.swap_screen.GetValue(), is_portrait); + break; + case Settings::LayoutOption::SingleScreen: { const bool swap_screens = is_secondary || Settings::values.swap_screen.GetValue(); if (swap_screens) { width = Core::kScreenBottomWidth * res_scale; @@ -465,8 +474,10 @@ FramebufferLayout FrameLayoutFromResolutionScale(u32 res_scale, bool is_secondar if (Settings::values.upright_screen.GetValue()) { std::swap(width, height); } - return SingleFrameLayout(width, height, swap_screens, - Settings::values.upright_screen.GetValue()); + + layout = SingleFrameLayout(width, height, swap_screens, + Settings::values.upright_screen.GetValue()); + break; } case Settings::LayoutOption::LargeScreen: { @@ -495,10 +506,11 @@ FramebufferLayout FrameLayoutFromResolutionScale(u32 res_scale, bool is_secondar if (Settings::values.upright_screen.GetValue()) { std::swap(width, height); } - return LargeFrameLayout(width, height, Settings::values.swap_screen.GetValue(), - Settings::values.upright_screen.GetValue(), - Settings::values.large_screen_proportion.GetValue(), - Settings::values.small_screen_position.GetValue()); + layout = LargeFrameLayout(width, height, Settings::values.swap_screen.GetValue(), + Settings::values.upright_screen.GetValue(), + Settings::values.large_screen_proportion.GetValue(), + Settings::values.small_screen_position.GetValue()); + break; } case Settings::LayoutOption::SideScreen: width = (Core::kScreenTopWidth + Core::kScreenBottomWidth) * res_scale + gap; @@ -507,10 +519,10 @@ FramebufferLayout FrameLayoutFromResolutionScale(u32 res_scale, bool is_secondar if (Settings::values.upright_screen.GetValue()) { std::swap(width, height); } - return LargeFrameLayout(width, height, Settings::values.swap_screen.GetValue(), - Settings::values.upright_screen.GetValue(), 1, - Settings::SmallScreenPosition::MiddleRight); - + layout = LargeFrameLayout(width, height, Settings::values.swap_screen.GetValue(), + Settings::values.upright_screen.GetValue(), 1, + Settings::SmallScreenPosition::MiddleRight); + break; case Settings::LayoutOption::HybridScreen: height = Core::kScreenTopHeight * res_scale; @@ -526,9 +538,9 @@ FramebufferLayout FrameLayoutFromResolutionScale(u32 res_scale, bool is_secondar std::swap(width, height); } - return HybridScreenLayout(width, height, Settings::values.swap_screen.GetValue(), - Settings::values.upright_screen.GetValue()); - + layout = HybridScreenLayout(width, height, Settings::values.swap_screen.GetValue(), + Settings::values.upright_screen.GetValue()); + break; case Settings::LayoutOption::Default: default: width = Core::kScreenTopWidth * res_scale; @@ -537,10 +549,13 @@ FramebufferLayout FrameLayoutFromResolutionScale(u32 res_scale, bool is_secondar if (Settings::values.upright_screen.GetValue()) { std::swap(width, height); } - return DefaultFrameLayout(width, height, Settings::values.swap_screen.GetValue(), - Settings::values.upright_screen.GetValue()); + layout = DefaultFrameLayout(width, height, Settings::values.swap_screen.GetValue(), + Settings::values.upright_screen.GetValue()); + break; } } + + return layout; UNREACHABLE(); } diff --git a/src/core/frontend/framebuffer_layout.h b/src/core/frontend/framebuffer_layout.h index ad45cfe01..1d15e2c89 100644 --- a/src/core/frontend/framebuffer_layout.h +++ b/src/core/frontend/framebuffer_layout.h @@ -35,6 +35,8 @@ struct FramebufferLayout { bool is_rotated = true; bool is_portrait = false; bool additional_screen_enabled; + float top_opacity = 1.0f; + float bottom_opacity = 1.0f; Common::Rectangle additional_screen; CardboardSettings cardboard; @@ -46,6 +48,8 @@ struct FramebufferLayout { u32 GetScalingRatio() const; static float GetAspectRatioValue(Settings::AspectRatio aspect_ratio); + + Settings::StereoRenderOption render_3d_mode = Settings::values.render_3d.GetValue(); }; /** diff --git a/src/core/hle/kernel/kernel.cpp b/src/core/hle/kernel/kernel.cpp index c722b8e30..21ca655db 100644 --- a/src/core/hle/kernel/kernel.cpp +++ b/src/core/hle/kernel/kernel.cpp @@ -1,4 +1,4 @@ -// Copyright 2014 Citra Emulator Project +// Copyright Citra Emulator Project / Azahar Emulator Project // Licensed under GPLv2 or any later version // Refer to the license.txt file included. @@ -7,6 +7,7 @@ #include #include "common/archives.h" #include "common/serialization/atomic.h" +#include "common/settings.h" #include "core/hle/kernel/client_port.h" #include "core/hle/kernel/config_mem.h" #include "core/hle/kernel/handle_table.h" @@ -26,14 +27,13 @@ namespace Kernel { /// Initialize the kernel KernelSystem::KernelSystem(Memory::MemorySystem& memory, Core::Timing& timing, std::function prepare_reschedule_callback, - MemoryMode memory_mode, u32 num_cores, - const New3dsHwCapabilities& n3ds_hw_caps, u64 override_init_time) + MemoryMode memory_mode, u32 num_cores, u64 override_init_time) : memory(memory), timing(timing), - prepare_reschedule_callback(std::move(prepare_reschedule_callback)), memory_mode(memory_mode), - n3ds_hw_caps(n3ds_hw_caps) { + prepare_reschedule_callback(std::move(prepare_reschedule_callback)), + memory_mode(memory_mode) { std::generate(memory_regions.begin(), memory_regions.end(), [] { return std::make_shared(); }); - MemoryInit(memory_mode, n3ds_hw_caps.memory_mode, override_init_time); + MemoryInit(memory_mode, override_init_time); resource_limits = std::make_unique(*this); for (u32 core_id = 0; core_id < num_cores; ++core_id) { @@ -151,6 +151,14 @@ const IPCDebugger::Recorder& KernelSystem::GetIPCRecorder() const { return *ipc_recorder; } +std::unique_ptr KernelSystem::BackupIPCRecorder() { + return std::move(ipc_recorder); +} + +void KernelSystem::RestoreIPCRecorder(std::unique_ptr recorder) { + ipc_recorder = std::move(recorder); +} + void KernelSystem::AddNamedPort(std::string name, std::shared_ptr port) { named_ports.emplace(std::move(name), std::move(port)); } @@ -163,6 +171,37 @@ void KernelSystem::ResetThreadIDs() { next_thread_id = 0; } +void KernelSystem::UpdateCPUAndMemoryState(u64 title_id, MemoryMode memory_mode, + New3dsHwCapabilities n3ds_hw_cap) { + if (Settings::values.is_new_3ds) { + SetRunning804MHz(n3ds_hw_cap.enable_804MHz_cpu); + } + + u32 tid_high = static_cast(title_id >> 32); + + constexpr u32 TID_HIGH_APPLET = 0x00040030; + constexpr u32 TID_HIGH_SYSMODULE = 0x00040130; + + // PM only updates the reported memory for normal applications. + // TODO(PabloMK7): Using the title ID is not correct, but close enough. + if (tid_high != TID_HIGH_APPLET && tid_high != TID_HIGH_SYSMODULE) { + UpdateReportedMemory(memory_mode, n3ds_hw_cap.memory_mode); + } +} + +void KernelSystem::RestoreMemoryState(u64 title_id) { + u32 tid_high = static_cast(title_id >> 32); + + constexpr u32 TID_HIGH_APPLET = 0x00040030; + constexpr u32 TID_HIGH_SYSMODULE = 0x00040130; + + // PM only updates the reported memory for normal applications. + // TODO(PabloMK7): Using the title ID is not correct, but close enough. + if (tid_high != TID_HIGH_APPLET && tid_high != TID_HIGH_SYSMODULE) { + RestoreReportedMemory(); + } +} + template void KernelSystem::serialize(Archive& ar, const unsigned int) { ar & memory_regions; @@ -184,7 +223,7 @@ void KernelSystem::serialize(Archive& ar, const unsigned int) { ar & stored_processes; ar & next_thread_id; ar & memory_mode; - ar & n3ds_hw_caps; + ar & running_804MHz; ar & main_thread_extended_sleep; // Deliberately don't include debugger info to allow debugging through loads diff --git a/src/core/hle/kernel/kernel.h b/src/core/hle/kernel/kernel.h index d3b0bc53e..53d88cddf 100644 --- a/src/core/hle/kernel/kernel.h +++ b/src/core/hle/kernel/kernel.h @@ -111,6 +111,9 @@ enum class MemoryMode : u8 { Dev2 = 3, ///< 80MB app memory Dev3 = 4, ///< 72MB app memory Dev4 = 5, ///< 32MB app memory + + NewProd = 6, ///< 124MB app memory + NewDev1 = 7, ///< 178MB app memory }; /// New 3DS memory modes. @@ -137,8 +140,7 @@ class KernelSystem { public: explicit KernelSystem(Memory::MemorySystem& memory, Core::Timing& timing, std::function prepare_reschedule_callback, MemoryMode memory_mode, - u32 num_cores, const New3dsHwCapabilities& n3ds_hw_caps, - u64 override_init_time = 0); + u32 num_cores, u64 override_init_time = 0); ~KernelSystem(); using PortPair = std::pair, std::shared_ptr>; @@ -305,6 +307,8 @@ public: IPCDebugger::Recorder& GetIPCRecorder(); const IPCDebugger::Recorder& GetIPCRecorder() const; + std::unique_ptr BackupIPCRecorder(); + void RestoreIPCRecorder(std::unique_ptr recorder); std::shared_ptr GetMemoryRegion(MemoryRegion region); @@ -327,8 +331,12 @@ public: return memory_mode; } - const New3dsHwCapabilities& GetNew3dsHwCapabilities() const { - return n3ds_hw_caps; + void SetRunning804MHz(bool enable) { + running_804MHz = enable; + } + + bool GetRunning804MHz() const { + return running_804MHz; } std::recursive_mutex& GetHLELock() { @@ -365,8 +373,16 @@ public: return pending_async_operations != 0; } + void UpdateCPUAndMemoryState(u64 title_id, MemoryMode memory_mode, + New3dsHwCapabilities n3ds_hw_cap); + + void RestoreMemoryState(u64 title_id); + private: - void MemoryInit(MemoryMode memory_mode, New3dsMemoryMode n3ds_mode, u64 override_init_time); + void MemoryInit(MemoryMode memory_mode, u64 override_init_time); + + void UpdateReportedMemory(MemoryMode memory_mode, New3dsMemoryMode n3ds_mode); + void RestoreReportedMemory(); std::function prepare_reschedule_callback; @@ -404,7 +420,7 @@ private: u32 next_thread_id; MemoryMode memory_mode; - New3dsHwCapabilities n3ds_hw_caps; + bool running_804MHz = false; /* * Synchronizes access to the internal HLE kernel structures, it is acquired when a guest diff --git a/src/core/hle/kernel/memory.cpp b/src/core/hle/kernel/memory.cpp index fffa8dd6f..362e88ac5 100644 --- a/src/core/hle/kernel/memory.cpp +++ b/src/core/hle/kernel/memory.cpp @@ -1,4 +1,4 @@ -// Copyright 2014 Citra Emulator Project +// Copyright Citra Emulator Project / Azahar Emulator Project // Licensed under GPLv2 or any later version // Refer to the license.txt file included. @@ -41,23 +41,9 @@ static const u32 memory_region_sizes[8][3] = { {0x0B200000, 0x02E00000, 0x02000000}, // 7 }; -void KernelSystem::MemoryInit(MemoryMode memory_mode, New3dsMemoryMode n3ds_mode, - u64 override_init_time) { +void KernelSystem::MemoryInit(MemoryMode memory_mode, u64 override_init_time) { const bool is_new_3ds = Settings::values.is_new_3ds.GetValue(); - u32 mem_type_index = static_cast(memory_mode); - u32 reported_mem_type = static_cast(memory_mode); - if (is_new_3ds) { - if (n3ds_mode == New3dsMemoryMode::NewProd || n3ds_mode == New3dsMemoryMode::NewDev2) { - mem_type_index = 6; - reported_mem_type = 6; - } else if (n3ds_mode == New3dsMemoryMode::NewDev1) { - mem_type_index = 7; - reported_mem_type = 7; - } else { - // On the N3ds, all O3ds configurations (<=5) are forced to 6 instead. - mem_type_index = 6; - } - } + const u32 mem_type_index = static_cast(memory_mode); // The kernel allocation regions (APPLICATION, SYSTEM and BASE) are laid out in sequence, with // the sizes specified in the memory_region_sizes table. @@ -73,14 +59,41 @@ void KernelSystem::MemoryInit(MemoryMode memory_mode, New3dsMemoryMode n3ds_mode config_mem_handler = std::make_shared(); auto& config_mem = config_mem_handler->GetConfigMem(); - config_mem.app_mem_type = reported_mem_type; - config_mem.app_mem_alloc = memory_region_sizes[reported_mem_type][0]; + config_mem.app_mem_type = static_cast(memory_mode); + config_mem.app_mem_alloc = memory_regions[0]->size; config_mem.sys_mem_alloc = memory_regions[1]->size; config_mem.base_mem_alloc = memory_regions[2]->size; shared_page_handler = std::make_shared(timing, override_init_time); } +void KernelSystem::UpdateReportedMemory(MemoryMode memory_mode, New3dsMemoryMode n3ds_mode) { + // If we are in New 3DS prod memory mode, and the application n3ds memory mode is set to legacy + // (all Old 3DS applications), then update reported available memory to the proper one according + // to the memory mode. + // This is normally done by PM when launching applications using svcSetResourceLimitLimitValues, + // but we do not implement that. + if (GetMemoryMode() == Kernel::MemoryMode::NewProd && + n3ds_mode == Kernel::New3dsMemoryMode::Legacy) { + const u32 mem_type_index = static_cast(memory_mode); + auto& config_mem = config_mem_handler->GetConfigMem(); + config_mem.app_mem_alloc = memory_region_sizes[mem_type_index][0]; + } +} + +void KernelSystem::RestoreReportedMemory() { + // If we are on New 3DS prod memory mode and we have terminated a process, restore the available + // memory to the proper size. + // This is normally done by PM when the application ends using svcSetResourceLimitLimitValues, + // but we do not implement that. + auto mem_mode = GetMemoryMode(); + if (mem_mode == Kernel::MemoryMode::NewProd) { + const u32 mem_type_index = static_cast(mem_mode); + auto& config_mem = config_mem_handler->GetConfigMem(); + config_mem.app_mem_alloc = memory_region_sizes[mem_type_index][0]; + } +} + std::shared_ptr KernelSystem::GetMemoryRegion(MemoryRegion region) { switch (region) { case MemoryRegion::APPLICATION: diff --git a/src/core/hle/kernel/process.cpp b/src/core/hle/kernel/process.cpp index e4200e5df..5e0d3810f 100644 --- a/src/core/hle/kernel/process.cpp +++ b/src/core/hle/kernel/process.cpp @@ -1,4 +1,4 @@ -// Copyright 2015 Citra Emulator Project +// Copyright Citra Emulator Project / Azahar Emulator Project // Licensed under GPLv2 or any later version // Refer to the license.txt file included. @@ -124,6 +124,8 @@ void KernelSystem::TerminateProcess(std::shared_ptr process) { GetThreadManager(core).TerminateProcessThreads(process); } + RestoreMemoryState(process->codeset->program_id); + process->Exit(); std::erase(process_list, process); } diff --git a/src/core/hle/kernel/svc.cpp b/src/core/hle/kernel/svc.cpp index c0bd6540b..58530f494 100644 --- a/src/core/hle/kernel/svc.cpp +++ b/src/core/hle/kernel/svc.cpp @@ -119,6 +119,11 @@ enum class SystemInfoType { * For the ARM11 NATIVE_FIRM kernel, this is 5, for processes sm, fs, pm, loader, and pxi." */ KERNEL_SPAWNED_PIDS = 26, + /** + * Check various Luma3DS config values. This parameter is not available on real systems, + * but can be used by homebrew applications. + */ + LUMA_CFW_INFO = 0x10000, /** * Check if the current system is a new 3DS. This parameter is not available on real systems, * but can be used by homebrew applications. @@ -270,6 +275,13 @@ enum class SystemInfoMemUsageRegion { BASE = 3, }; +enum class SystemInfoLumaCFWInformation { + REAL_APP_REGION_SIZE = 0x80, // Gets the real APPLICATION region size, + // instead of the one reported by the kernel shared page + // which depends on the memory mode. + IS_N3DS = 0x201, // Checks if the system is a N3DS or not. +}; + /** * Accepted by svcGetSystemInfo param with CITRA_INFORMATION type. Selects which information * to fetch from Citra. Some string params don't fit in 7 bytes, so they are split. @@ -1827,6 +1839,20 @@ Result SVC::GetSystemInfo(s64* out, u32 type, s32 param) { case SystemInfoType::KERNEL_SPAWNED_PIDS: *out = 5; break; + case SystemInfoType::LUMA_CFW_INFO: + switch ((SystemInfoLumaCFWInformation)param) { + case SystemInfoLumaCFWInformation::REAL_APP_REGION_SIZE: + *out = kernel.GetMemoryRegion(MemoryRegion::APPLICATION)->size; + break; + case SystemInfoLumaCFWInformation::IS_N3DS: + *out = Settings::values.is_new_3ds ? 1 : 0; + break; + default: + LOG_ERROR(Kernel_SVC, "unknown GetSystemInfo type=0x10000 region: param={}", param); + *out = 0; + break; + } + break; case SystemInfoType::NEW_3DS_INFO: // The actual subtypes are not implemented, homebrew just check // this doesn't return an error in n3ds to know the system type diff --git a/src/core/hle/service/am/am.cpp b/src/core/hle/service/am/am.cpp index 9b0d5a709..645a015b6 100644 --- a/src/core/hle/service/am/am.cpp +++ b/src/core/hle/service/am/am.cpp @@ -850,19 +850,25 @@ bool CIAFile::Close() { current_content_install_result.type = InstallResult::Type::NONE; } - bool complete = - from_cdn ? is_done - : (install_state >= CIAInstallState::TMDLoaded && - content_written.size() == container.GetTitleMetadata().GetContentCount() && - std::all_of(content_written.begin(), content_written.end(), - [this, i = 0](auto& bytes_written) mutable { - return bytes_written >= - container.GetContentSize(static_cast(i++)); - })); + bool complete; + + if (is_cancel) { + complete = false; + } else { + complete = + from_cdn ? is_done + : (install_state >= CIAInstallState::TMDLoaded && + content_written.size() == container.GetTitleMetadata().GetContentCount() && + std::all_of(content_written.begin(), content_written.end(), + [this, i = 0](auto& bytes_written) mutable { + return bytes_written >= + container.GetContentSize(static_cast(i++)); + })); + } // Install aborted if (!complete) { - LOG_ERROR(Service_AM, "CIAFile closed prematurely, aborting install..."); + LOG_ERROR(Service_AM, "CIAFile closed prematurely or cancelled, aborting install..."); if (!is_additional_content) { // Only delete the content folder as there may be user save data in the title folder. const std::string title_content_path = @@ -1279,7 +1285,7 @@ std::string GetTitleContentPath(Service::FS::MediaType media_type, u64 tid, std: auto fs_user = Core::System::GetInstance().ServiceManager().GetService( "fs:USER"); - return fs_user->GetCurrentGamecardPath(); + return fs_user->GetRegisteredGamecardPath(); } std::string content_path = GetTitlePath(media_type, tid) + "content/"; @@ -1324,7 +1330,7 @@ std::string GetTitlePath(Service::FS::MediaType media_type, u64 tid) { auto fs_user = Core::System::GetInstance().ServiceManager().GetService( "fs:USER"); - return fs_user->GetCurrentGamecardPath(); + return fs_user->GetRegisteredGamecardPath(); } return ""; @@ -1345,7 +1351,7 @@ std::string GetMediaTitlePath(Service::FS::MediaType media_type) { auto fs_user = Core::System::GetInstance().ServiceManager().GetService( "fs:USER"); - return fs_user->GetCurrentGamecardPath(); + return fs_user->GetRegisteredGamecardPath(); } return ""; @@ -1408,39 +1414,52 @@ void Module::ScanForTitlesImpl(Service::FS::MediaType media_type) { LOG_DEBUG(Service_AM, "Starting title scan for media_type={}", static_cast(media_type)); - std::string title_path = GetMediaTitlePath(media_type); - - FileUtil::FSTEntry entries; - FileUtil::ScanDirectoryTree(title_path, entries, 1, &stop_scan_flag); - for (const FileUtil::FSTEntry& tid_high : entries.children) { - if (stop_scan_flag) { - break; + if (media_type == FS::MediaType::GameCard) { + const auto& cartridge = system.GetCartridge(); + if (!cartridge.empty()) { + u64 program_id = 0; + FileSys::NCCHContainer cartridge_ncch(cartridge); + Loader::ResultStatus res = cartridge_ncch.ReadProgramId(program_id); + if (res == Loader::ResultStatus::Success) { + am_title_list[static_cast(media_type)].push_back(program_id); + } } - for (const FileUtil::FSTEntry& tid_low : tid_high.children) { + } else { + std::string title_path = GetMediaTitlePath(media_type); + + FileUtil::FSTEntry entries; + FileUtil::ScanDirectoryTree(title_path, entries, 1, &stop_scan_flag); + for (const FileUtil::FSTEntry& tid_high : entries.children) { if (stop_scan_flag) { break; } - std::string tid_string = tid_high.virtualName + tid_low.virtualName; + for (const FileUtil::FSTEntry& tid_low : tid_high.children) { + if (stop_scan_flag) { + break; + } + std::string tid_string = tid_high.virtualName + tid_low.virtualName; - if (tid_string.length() == TITLE_ID_VALID_LENGTH) { - const u64 tid = std::stoull(tid_string, nullptr, 16); + if (tid_string.length() == TITLE_ID_VALID_LENGTH) { + const u64 tid = std::stoull(tid_string, nullptr, 16); - if (tid & TWL_TITLE_ID_FLAG) { - // TODO(PabloMK7) Move to TWL Nand, for now only check that - // the contents exists in CTR Nand as this is a SRL file - // instead of NCCH. - if (FileUtil::Exists(GetTitleContentPath(media_type, tid))) { - am_title_list[static_cast(media_type)].push_back(tid); - } - } else { - FileSys::NCCHContainer container(GetTitleContentPath(media_type, tid)); - if (container.Load() == Loader::ResultStatus::Success) { - am_title_list[static_cast(media_type)].push_back(tid); + if (tid & TWL_TITLE_ID_FLAG) { + // TODO(PabloMK7) Move to TWL Nand, for now only check that + // the contents exists in CTR Nand as this is a SRL file + // instead of NCCH. + if (FileUtil::Exists(GetTitleContentPath(media_type, tid))) { + am_title_list[static_cast(media_type)].push_back(tid); + } + } else { + FileSys::NCCHContainer container(GetTitleContentPath(media_type, tid)); + if (container.Load() == Loader::ResultStatus::Success) { + am_title_list[static_cast(media_type)].push_back(tid); + } } } } } } + LOG_DEBUG(Service_AM, "Finished title scan for media_type={}", static_cast(media_type)); } @@ -1449,6 +1468,7 @@ void Module::ScanForAllTitles() { ScanForTicketsImpl(); ScanForTitlesImpl(Service::FS::MediaType::NAND); ScanForTitlesImpl(Service::FS::MediaType::SDMC); + ScanForTitlesImpl(Service::FS::MediaType::GameCard); } else { scan_all_future = std::async([this]() { std::scoped_lock lock(am_lists_mutex); @@ -1459,6 +1479,9 @@ void Module::ScanForAllTitles() { if (!stop_scan_flag) { ScanForTitlesImpl(Service::FS::MediaType::SDMC); } + if (!stop_scan_flag) { + ScanForTitlesImpl(Service::FS::MediaType::GameCard); + } }); } } @@ -1981,30 +2004,75 @@ void Module::Interface::GetProgramList(Kernel::HLERequestContext& ctx) { } } -Result GetTitleInfoFromList(std::span title_id_list, Service::FS::MediaType media_type, +Result GetTitleInfoFromList(Core::System& system, std::span title_id_list, + Service::FS::MediaType media_type, std::vector& title_info_out) { title_info_out.reserve(title_id_list.size()); for (u32 i = 0; i < title_id_list.size(); i++) { - std::string tmd_path = GetTitleMetadataPath(media_type, title_id_list[i]); + if (media_type == Service::FS::MediaType::GameCard) { + auto& cartridge = system.GetCartridge(); + if (cartridge.empty()) { + LOG_DEBUG(Service_AM, "cartridge not inserted"); + return Result(ErrorDescription::NotFound, ErrorModule::AM, + ErrorSummary::InvalidState, ErrorLevel::Permanent); + } - TitleInfo title_info = {}; - title_info.tid = title_id_list[i]; + FileSys::NCCHContainer ncch_container(cartridge); + if (ncch_container.Load() != Loader::ResultStatus::Success || + !ncch_container.IsNCSD()) { + LOG_ERROR(Service_AM, "failed to load cartridge card"); + return Result(ErrorDescription::NotFound, ErrorModule::AM, + ErrorSummary::InvalidState, ErrorLevel::Permanent); + } - FileSys::TitleMetadata tmd; - if (tmd.Load(tmd_path) == Loader::ResultStatus::Success) { - // TODO(shinyquagsire23): This is the total size of all files this process owns, - // including savefiles and other content. This comes close but is off. - title_info.size = tmd.GetContentSizeByIndex(FileSys::TMDContentIndex::Main); - title_info.version = tmd.GetTitleVersion(); - title_info.type = tmd.GetTitleType(); + // This is what Process9 does for getting the information, from disassembly. + // It is still unclear what do those values mean, like the title info type. + if (ncch_container.exheader_header.arm11_system_local_caps.program_id != + title_id_list[i]) { + LOG_DEBUG(Service_AM, + "cartridge has different title ID than requested title_id={:016X} != " + "cartridge_title_id={:016X}", + title_id_list[i], + ncch_container.exheader_header.arm11_system_local_caps.program_id); + return Result(ErrorDescription::NotFound, ErrorModule::AM, + ErrorSummary::InvalidState, ErrorLevel::Permanent); + } + + TitleInfo title_info = {}; + title_info.tid = title_id_list[i]; + title_info.version = + (*reinterpret_cast( + &ncch_container.exheader_header.codeset_info.flags.remaster_version) + << 10) & + 0xFC00; + title_info.size = 0; + title_info.type = 0x40; + + LOG_DEBUG(Service_AM, "found title_id={:016X} version={:04X}", title_id_list[i], + title_info.version); + title_info_out.push_back(title_info); } else { - LOG_DEBUG(Service_AM, "not found title_id={:016X}", title_id_list[i]); - return Result(ErrorDescription::NotFound, ErrorModule::AM, ErrorSummary::InvalidState, - ErrorLevel::Permanent); + std::string tmd_path = GetTitleMetadataPath(media_type, title_id_list[i]); + + TitleInfo title_info = {}; + title_info.tid = title_id_list[i]; + + FileSys::TitleMetadata tmd; + if (tmd.Load(tmd_path) == Loader::ResultStatus::Success) { + // TODO(shinyquagsire23): This is the total size of all files this process owns, + // including savefiles and other content. This comes close but is off. + title_info.size = tmd.GetContentSizeByIndex(FileSys::TMDContentIndex::Main); + title_info.version = tmd.GetTitleVersion(); + title_info.type = tmd.GetTitleType(); + } else { + LOG_DEBUG(Service_AM, "not found title_id={:016X}", title_id_list[i]); + return Result(ErrorDescription::NotFound, ErrorModule::AM, + ErrorSummary::InvalidState, ErrorLevel::Permanent); + } + LOG_DEBUG(Service_AM, "found title_id={:016X} version={:04X}", title_id_list[i], + title_info.version); + title_info_out.push_back(title_info); } - LOG_DEBUG(Service_AM, "found title_id={:016X} version={:04X}", title_id_list[i], - title_info.version); - title_info_out.push_back(title_info); } return ResultSuccess; @@ -2136,7 +2204,7 @@ void Module::Interface::GetProgramInfosImpl(Kernel::HLERequestContext& ctx, bool } if (async_data->res.IsSuccess()) { - async_data->res = GetTitleInfoFromList(async_data->title_id_list, + async_data->res = GetTitleInfoFromList(am->system, async_data->title_id_list, async_data->media_type, async_data->out); } return 0; @@ -2350,7 +2418,7 @@ void Module::Interface::GetDLCTitleInfos(Kernel::HLERequestContext& ctx) { } if (async_data->res.IsSuccess()) { - async_data->res = GetTitleInfoFromList(async_data->title_id_list, + async_data->res = GetTitleInfoFromList(am->system, async_data->title_id_list, async_data->media_type, async_data->out); } return 0; @@ -2497,7 +2565,7 @@ void Module::Interface::GetPatchTitleInfos(Kernel::HLERequestContext& ctx) { } if (async_data->res.IsSuccess()) { - async_data->res = GetTitleInfoFromList(async_data->title_id_list, + async_data->res = GetTitleInfoFromList(am->system, async_data->title_id_list, async_data->media_type, async_data->out); } return 0; @@ -3214,97 +3282,6 @@ void Module::Interface::CheckContentRightsIgnorePlatform(Kernel::HLERequestConte LOG_DEBUG(Service_AM, "tid={:016x}, content_index={}", tid, content_index); } -void Module::Interface::BeginImportProgram(Kernel::HLERequestContext& ctx) { - IPC::RequestParser rp(ctx); - auto media_type = static_cast(rp.Pop()); - - if (am->cia_installing) { - IPC::RequestBuilder rb = rp.MakeBuilder(1, 0); - rb.Push(Result(ErrCodes::InvalidImportState, ErrorModule::AM, ErrorSummary::InvalidState, - ErrorLevel::Permanent)); - return; - } - - // Create our CIAFile handle for the app to write to, and while the app writes - // Citra will store contents out to sdmc/nand - const FileSys::Path cia_path = {}; - auto file = std::make_shared( - am->system.Kernel(), std::make_unique(am->system, media_type), cia_path); - - am->cia_installing = true; - - IPC::RequestBuilder rb = rp.MakeBuilder(1, 2); - rb.Push(ResultSuccess); // No error - rb.PushCopyObjects(file->Connect()); - - LOG_WARNING(Service_AM, "(STUBBED) media_type={}", media_type); -} - -void Module::Interface::BeginImportProgramTemporarily(Kernel::HLERequestContext& ctx) { - IPC::RequestParser rp(ctx); - - if (am->cia_installing) { - IPC::RequestBuilder rb = rp.MakeBuilder(1, 0); - rb.Push(Result(ErrCodes::InvalidImportState, ErrorModule::AM, ErrorSummary::InvalidState, - ErrorLevel::Permanent)); - return; - } - - // Note: This function should register the title in the temp_i.db database, but we can get away - // with not doing that because we traverse the file system to detect installed titles. - // Create our CIAFile handle for the app to write to, and while the app writes Citra will store - // contents out to sdmc/nand - const FileSys::Path cia_path = {}; - std::shared_ptr file; - { - auto cia_file = std::make_unique(am->system, FS::MediaType::NAND); - - AuthorizeCIAFileDecryption(cia_file.get(), ctx); - - file = - std::make_shared(am->system.Kernel(), std::move(cia_file), cia_path); - } - am->cia_installing = true; - - IPC::RequestBuilder rb = rp.MakeBuilder(1, 2); - rb.Push(ResultSuccess); // No error - rb.PushCopyObjects(file->Connect()); - - LOG_WARNING(Service_AM, "(STUBBED)"); -} - -void Module::Interface::EndImportProgram(Kernel::HLERequestContext& ctx) { - IPC::RequestParser rp(ctx); - [[maybe_unused]] const auto cia = rp.PopObject(); - - LOG_DEBUG(Service_AM, ""); - - am->ScanForAllTitles(); - - am->cia_installing = false; - IPC::RequestBuilder rb = rp.MakeBuilder(1, 0); - rb.Push(ResultSuccess); -} - -void Module::Interface::EndImportProgramWithoutCommit(Kernel::HLERequestContext& ctx) { - IPC::RequestParser rp(ctx); - [[maybe_unused]] const auto cia = rp.PopObject(); - - // Note: This function is basically a no-op for us since we don't use title.db or ticket.db - // files to keep track of installed titles. - am->ScanForAllTitles(); - - am->cia_installing = false; - IPC::RequestBuilder rb = rp.MakeBuilder(1, 0); - rb.Push(ResultSuccess); - - LOG_WARNING(Service_AM, "(STUBBED)"); -} - -void Module::Interface::CommitImportPrograms(Kernel::HLERequestContext& ctx) { - CommitImportTitlesImpl(ctx, false, false); -} - /// Wraps all File operations to allow adding an offset to them. class AMFileWrapper : public FileSys::FileBackend { public: @@ -3420,6 +3397,123 @@ ResultVal GetFileBackendFromSession(std::shared_ptr f return Kernel::ResultNotImplemented; } +void Module::Interface::BeginImportProgram(Kernel::HLERequestContext& ctx) { + IPC::RequestParser rp(ctx); + auto media_type = static_cast(rp.Pop()); + + if (am->cia_installing) { + IPC::RequestBuilder rb = rp.MakeBuilder(1, 0); + rb.Push(Result(ErrCodes::InvalidImportState, ErrorModule::AM, ErrorSummary::InvalidState, + ErrorLevel::Permanent)); + return; + } + + // Create our CIAFile handle for the app to write to, and while the app writes + // Citra will store contents out to sdmc/nand + const FileSys::Path cia_path = {}; + auto file = std::make_shared( + am->system.Kernel(), std::make_unique(am->system, media_type), cia_path); + + am->cia_installing = true; + + IPC::RequestBuilder rb = rp.MakeBuilder(1, 2); + rb.Push(ResultSuccess); // No error + rb.PushCopyObjects(file->Connect()); + + LOG_WARNING(Service_AM, "(STUBBED) media_type={}", media_type); +} + +void Module::Interface::BeginImportProgramTemporarily(Kernel::HLERequestContext& ctx) { + IPC::RequestParser rp(ctx); + + if (am->cia_installing) { + IPC::RequestBuilder rb = rp.MakeBuilder(1, 0); + rb.Push(Result(ErrCodes::InvalidImportState, ErrorModule::AM, ErrorSummary::InvalidState, + ErrorLevel::Permanent)); + return; + } + + // Note: This function should register the title in the temp_i.db database, but we can get away + // with not doing that because we traverse the file system to detect installed titles. + // Create our CIAFile handle for the app to write to, and while the app writes Citra will store + // contents out to sdmc/nand + const FileSys::Path cia_path = {}; + std::shared_ptr file; + { + auto cia_file = std::make_unique(am->system, FS::MediaType::NAND); + + AuthorizeCIAFileDecryption(cia_file.get(), ctx); + + file = + std::make_shared(am->system.Kernel(), std::move(cia_file), cia_path); + } + am->cia_installing = true; + + IPC::RequestBuilder rb = rp.MakeBuilder(1, 2); + rb.Push(ResultSuccess); // No error + rb.PushCopyObjects(file->Connect()); + + LOG_WARNING(Service_AM, "(STUBBED)"); +} + +void Module::Interface::CancelImportProgram(Kernel::HLERequestContext& ctx) { + IPC::RequestParser rp(ctx); + const auto cia = rp.PopObject(); + + LOG_DEBUG(Service_AM, ""); + + auto cia_file = GetFileBackendFromSession(cia); + if (cia_file.Succeeded()) { + cia_file.Unwrap()->Cancel(); + } + + am->cia_installing = false; + IPC::RequestBuilder rb = rp.MakeBuilder(1, 0); + rb.Push(ResultSuccess); +} + +void Module::Interface::EndImportProgram(Kernel::HLERequestContext& ctx) { + IPC::RequestParser rp(ctx); + const auto cia = rp.PopObject(); + + LOG_DEBUG(Service_AM, ""); + + auto cia_file = GetFileBackendFromSession(cia); + if (cia_file.Succeeded()) { + cia_file.Unwrap()->Close(); + } + + am->ScanForAllTitles(); + + am->cia_installing = false; + IPC::RequestBuilder rb = rp.MakeBuilder(1, 0); + rb.Push(ResultSuccess); +} + +void Module::Interface::EndImportProgramWithoutCommit(Kernel::HLERequestContext& ctx) { + IPC::RequestParser rp(ctx); + const auto cia = rp.PopObject(); + + auto cia_file = GetFileBackendFromSession(cia); + if (cia_file.Succeeded()) { + cia_file.Unwrap()->Close(); + } + + // Note: This function is basically a no-op for us since we don't use title.db or ticket.db + // files to keep track of installed titles. + am->ScanForAllTitles(); + + am->cia_installing = false; + IPC::RequestBuilder rb = rp.MakeBuilder(1, 0); + rb.Push(ResultSuccess); + + LOG_WARNING(Service_AM, "(STUBBED)"); +} + +void Module::Interface::CommitImportPrograms(Kernel::HLERequestContext& ctx) { + CommitImportTitlesImpl(ctx, false, false); +} + void Module::Interface::GetProgramInfoFromCia(Kernel::HLERequestContext& ctx) { IPC::RequestParser rp(ctx); [[maybe_unused]] const auto media_type = static_cast(rp.Pop()); diff --git a/src/core/hle/service/am/am.h b/src/core/hle/service/am/am.h index 5f92d7adc..4dec69e80 100644 --- a/src/core/hle/service/am/am.h +++ b/src/core/hle/service/am/am.h @@ -224,6 +224,11 @@ public: is_done = true; } + void Cancel() { + is_cancel = true; + Close(); + } + const std::vector& GetInstallResults() const { return install_results; } @@ -237,6 +242,7 @@ private: bool decryption_authorized; bool is_done = false; bool is_closed = false; + bool is_cancel = false; bool is_additional_content = false; // Whether it's installing an update, and what step of installation it is at @@ -815,6 +821,17 @@ public: */ void BeginImportProgramTemporarily(Kernel::HLERequestContext& ctx); + /** + * AM::CancelImportProgram service function + * Cancel importing a CTR Installable Archive + * Inputs: + * 0 : Command header (0x04040002) + * 1-2 : CIAFile handle application wrote to + * Outputs: + * 1 : Result, 0 on success, otherwise error code + */ + void CancelImportProgram(Kernel::HLERequestContext& ctx); + /** * AM::EndImportProgram service function * Finish importing from a CTR Installable Archive diff --git a/src/core/hle/service/am/am_net.cpp b/src/core/hle/service/am/am_net.cpp index 1ed88ea8b..039ea91b3 100644 --- a/src/core/hle/service/am/am_net.cpp +++ b/src/core/hle/service/am/am_net.cpp @@ -58,7 +58,7 @@ AM_NET::AM_NET(std::shared_ptr am) : Module::Interface(std::move(am), "a {0x0401, nullptr, "UpdateFirmwareTo"}, {0x0402, &AM_NET::BeginImportProgram, "BeginImportProgram"}, {0x0403, &AM_NET::BeginImportProgramTemporarily, "BeginImportProgramTemporarily"}, - {0x0404, nullptr, "CancelImportProgram"}, + {0x0404, &AM_NET::CancelImportProgram, "CancelImportProgram"}, {0x0405, &AM_NET::EndImportProgram, "EndImportProgram"}, {0x0406, &AM_NET::EndImportProgramWithoutCommit, "EndImportProgramWithoutCommit"}, {0x0407, &AM_NET::CommitImportPrograms, "CommitImportPrograms"}, diff --git a/src/core/hle/service/am/am_u.cpp b/src/core/hle/service/am/am_u.cpp index 32395d75a..0356999d8 100644 --- a/src/core/hle/service/am/am_u.cpp +++ b/src/core/hle/service/am/am_u.cpp @@ -58,7 +58,7 @@ AM_U::AM_U(std::shared_ptr am) : Module::Interface(std::move(am), "am:u" {0x0401, nullptr, "UpdateFirmwareTo"}, {0x0402, &AM_U::BeginImportProgram, "BeginImportProgram"}, {0x0403, &AM_U::BeginImportProgramTemporarily, "BeginImportProgramTemporarily"}, - {0x0404, nullptr, "CancelImportProgram"}, + {0x0404, &AM_U::CancelImportProgram, "CancelImportProgram"}, {0x0405, &AM_U::EndImportProgram, "EndImportProgram"}, {0x0406, &AM_U::EndImportProgramWithoutCommit, "EndImportProgramWithoutCommit"}, {0x0407, &AM_U::CommitImportPrograms, "CommitImportPrograms"}, diff --git a/src/core/hle/service/apt/applet_manager.cpp b/src/core/hle/service/apt/applet_manager.cpp index 2d21f9ae8..1dcbb430e 100644 --- a/src/core/hle/service/apt/applet_manager.cpp +++ b/src/core/hle/service/apt/applet_manager.cpp @@ -122,6 +122,37 @@ static u64 GetTitleIdForApplet(AppletId id, u32 region_value) { return itr->title_ids[region_value]; } +static constexpr std::size_t NumTitleIDConverts = 3; +static constexpr std::array, NumTitleIDConverts> TitleIDConvertTable = {{ + // MSET + {{0x0004001000020000, 0x0004001000021000, 0x0004001000022000, 0x0004001000020000, + 0x0004001000026000, 0x0004001000027000, 0x0004001000028000}}, + // eShop + {{0x0004001000020900, 0x0004001000021900, 0x0004001000022900, 0x0004001000020900, + 0x0004001000020900, 0x0004001000027900, 0x0004001000028900}}, + // NNID Settings + {{0x000400100002BF00, 0x000400100002C000, 0x000400100002C100, 0x000400100002BF00, + 0x000400100002BF00, 0x000400100002BF00, 0x000400100002BF00}}, +}}; + +static u64 ConvertTitleID(Core::System& system, u64 base_title_id) { + + auto cfg = Service::CFG::GetModule(system); + if (!cfg) { + return base_title_id; + } + + u32 region_value = cfg->GetRegionValue(false); + + for (auto& entry : TitleIDConvertTable) { + if (base_title_id == entry[0]) { + return entry[region_value]; + } + } + + return base_title_id; +} + static bool IsSystemAppletId(AppletId applet_id) { return (static_cast(applet_id) & static_cast(AppletId::AnySystemApplet)) != 0; } @@ -365,6 +396,10 @@ ResultVal AppletManager::Initialize(AppletId ap // Note: In the real console the title id of a given applet slot is set by the APT module when // calling StartApplication. slot_data->title_id = system.Kernel().GetCurrentProcess()->codeset->program_id; + if (app_id == AppletId::Application) { + slot_data->media_type = next_app_mediatype; + next_app_mediatype = static_cast(UINT32_MAX); + } slot_data->attributes.raw = attributes.raw; // Applications need to receive a Wakeup signal to actually start up, this signal is usually @@ -1013,6 +1048,22 @@ Result AppletManager::LeaveHomeMenu(std::shared_ptr object, return ResultSuccess; } +Result AppletManager::LoadSysMenuArg(std::vector& buffer) { + if (sys_menu_arg.has_value()) { + std::memcpy(buffer.data(), sys_menu_arg.value().data(), + std::min(buffer.size(), sys_menu_arg.value().size())); + } + // Always succeed, even if there is no data to copy. + return ResultSuccess; +} + +Result AppletManager::StoreSysMenuArg(const std::vector& buffer) { + sys_menu_arg = std::array(); + std::memcpy(sys_menu_arg.value().data(), buffer.data(), + std::min(buffer.size(), sys_menu_arg.value().size())); + return ResultSuccess; +} + Result AppletManager::OrderToCloseApplication() { if (active_slot == AppletSlot::Error) { return {ErrCodes::InvalidAppletSlot, ErrorModule::Applet, ErrorSummary::InvalidState, @@ -1160,7 +1211,14 @@ ResultVal AppletManager::GetAppletInfo(AppletId app_i ErrorLevel::Status); } - auto media_type = Service::AM::GetTitleMediaType(slot_data->title_id); + FS::MediaType media_type; + if (slot_data->media_type != static_cast(UINT32_MAX)) { + media_type = slot_data->media_type; + } else { + // Applet was not started from StartApplication, so we need to guess. + media_type = Service::AM::GetTitleMediaType(slot_data->title_id); + } + return AppletInfo{ .title_id = slot_data->title_id, .media_type = media_type, @@ -1187,7 +1245,13 @@ ResultVal AppletManager::Unknown54(u32 in_param) { in_param >= 0x40 ? Service::FS::MediaType::GameCard : Service::FS::MediaType::SDMC; auto check_update = in_param == 0x01 || in_param == 0x42; - auto app_media_type = Service::AM::GetTitleMediaType(slot_data->title_id); + FS::MediaType app_media_type; + if (slot_data->media_type != static_cast(UINT32_MAX)) { + app_media_type = slot_data->media_type; + } else { + // Applet was not started from StartApplication, so we need to guess. + app_media_type = Service::AM::GetTitleMediaType(slot_data->title_id); + } auto app_update_media_type = Service::AM::GetTitleMediaType(Service::AM::GetTitleUpdateId(slot_data->title_id)); if (app_media_type == check_target || (check_update && app_update_media_type == check_target)) { @@ -1213,8 +1277,8 @@ ApplicationRunningMode AppletManager::GetApplicationRunningMode() { // APT checks whether the system is a New 3DS and the 804MHz CPU speed is enabled to determine // the result. - auto new_3ds_mode = GetTargetPlatform() == TargetPlatform::New3ds && - system.Kernel().GetNew3dsHwCapabilities().enable_804MHz_cpu; + auto new_3ds_mode = + GetTargetPlatform() == TargetPlatform::New3ds && system.Kernel().GetRunning804MHz(); if (slot_data->registered) { return new_3ds_mode ? ApplicationRunningMode::New3dsRegistered : ApplicationRunningMode::Old3dsRegistered; @@ -1236,13 +1300,21 @@ Result AppletManager::PrepareToDoApplicationJump(u64 title_id, FS::MediaType med // Save the title data to send it to the Home Menu when DoApplicationJump is called. auto application_slot_data = GetAppletSlot(AppletSlot::Application); app_jump_parameters.current_title_id = application_slot_data->title_id; - app_jump_parameters.current_media_type = - Service::AM::GetTitleMediaType(application_slot_data->title_id); + + FS::MediaType curr_media_type; + if (application_slot_data->media_type != static_cast(UINT32_MAX)) { + curr_media_type = application_slot_data->media_type; + } else { + // Applet was not started from StartApplication, so we need to guess. + curr_media_type = Service::AM::GetTitleMediaType(application_slot_data->title_id); + } + + app_jump_parameters.current_media_type = curr_media_type; if (flags == ApplicationJumpFlags::UseCurrentParameters) { app_jump_parameters.next_title_id = app_jump_parameters.current_title_id; app_jump_parameters.next_media_type = app_jump_parameters.current_media_type; } else { - app_jump_parameters.next_title_id = title_id; + app_jump_parameters.next_title_id = ConvertTitleID(system, title_id); app_jump_parameters.next_media_type = media_type; } app_jump_parameters.flags = flags; @@ -1301,7 +1373,7 @@ Result AppletManager::DoApplicationJump(const DeliverArg& arg) { */ NS::RebootToTitle(system, app_jump_parameters.next_media_type, - app_jump_parameters.next_title_id); + app_jump_parameters.next_title_id, std::nullopt); return ResultSuccess; } } @@ -1320,6 +1392,61 @@ Result AppletManager::PrepareToStartApplication(u64 title_id, FS::MediaType medi ErrorLevel::Status}; } + title_id = ConvertTitleID(system, title_id); + + std::string path; + if (media_type == FS::MediaType::GameCard) { + path = system.GetCartridge(); + } else { + path = AM::GetTitleContentPath(media_type, title_id); + } + + next_app_mediatype = media_type; + + auto loader = Loader::GetLoader(path); + + if (!loader) { + LOG_ERROR(Service_APT, "Could not find .app for title 0x{:016x}", title_id); + // TODO: Find proper error code + return ResultUnknown; + } + + auto plg_ldr = Service::PLGLDR::GetService(system); + if (plg_ldr) { + const auto& plg_context = plg_ldr->GetPluginLoaderContext(); + if (plg_context.is_enabled && plg_context.use_user_load_parameters && + plg_context.user_load_parameters.low_title_Id == static_cast(title_id) && + plg_context.user_load_parameters.plugin_memory_strategy == + PLGLDR::PLG_LDR::PluginMemoryStrategy::PLG_STRATEGY_MODE3) { + loader->SetKernelMemoryModeOverride(Kernel::MemoryMode::Dev2); + } + } + + auto mem_mode = loader->LoadKernelMemoryMode(); + if (mem_mode.second != Loader::ResultStatus::Success || !mem_mode.first.has_value()) { + // This cannot happen on real HW at this point of execution + LOG_ERROR(Service_APT, "Could not determine memory mode"); + return ResultUnknown; + } + + auto curr_mem_mode = system.Kernel().GetMemoryMode(); + + if (mem_mode.first.value() != curr_mem_mode) { + if (system.Kernel().GetMemoryMode() == Kernel::MemoryMode::NewProd) { + // On New 3DS prod memory mode, only incorrect state is if the app + // reports having the "unused" memory mode 1. TODO: Figure out + // how this works and if it is even used. + if (mem_mode.first.value() == static_cast(1)) { + return {ErrCodes::IncorrectMemoryMode, ErrorModule::Applet, + ErrorSummary::InvalidState, ErrorLevel::Status}; + } + } else { + // On other memory modes, the state is incorrect. + return {ErrCodes::IncorrectMemoryMode, ErrorModule::Applet, ErrorSummary::InvalidState, + ErrorLevel::Status}; + } + } + ASSERT_MSG(!app_start_parameters, "Trying to prepare an application when another is already prepared"); @@ -1403,6 +1530,44 @@ Result AppletManager::CancelApplication() { return ResultSuccess; } +Result AppletManager::PrepareToStartNewestHomeMenu() { + if (active_slot == AppletSlot::Error || + GetAppletSlot(active_slot)->attributes.applet_pos != AppletPos::System) { + return {ErrCodes::InvalidAppletSlot, ErrorModule::Applet, ErrorSummary::InvalidState, + ErrorLevel::Status}; + } + + bool is_standard; + if (Settings::values.is_new_3ds) { + // Memory layout is standard if it is not NewDev1 (178MB) + is_standard = system.Kernel().GetMemoryMode() != Kernel::MemoryMode::NewDev1; + } else { + // Memory layout is standard if it is Prod (64MB) + is_standard = system.Kernel().GetMemoryMode() == Kernel::MemoryMode::Prod; + } + + if (is_standard) { + return Result{ErrorDescription::AlreadyExists, ErrorModule::Applet, + ErrorSummary::InvalidState, ErrorLevel::Status}; + } + + home_menu_tid_to_start = GetAppletSlot(active_slot)->title_id; + return ResultSuccess; +} + +Result AppletManager::StartNewestHomeMenu() { + if (!home_menu_tid_to_start) { + return Result{ErrorDescription::AlreadyExists, ErrorModule::Applet, + ErrorSummary::InvalidState, ErrorLevel::Status}; + } + + u64 titleID = home_menu_tid_to_start; + home_menu_tid_to_start = 0; + + NS::RebootToTitle(system, Service::FS::MediaType::NAND, titleID, std::nullopt); + return ResultSuccess; +} + void AppletManager::SendApplicationParameterAfterRegistration(const MessageParameter& parameter) { auto slot = GetAppletSlotFromId(parameter.destination_id); diff --git a/src/core/hle/service/apt/applet_manager.h b/src/core/hle/service/apt/applet_manager.h index 5aaf7fdac..3924ec510 100644 --- a/src/core/hle/service/apt/applet_manager.h +++ b/src/core/hle/service/apt/applet_manager.h @@ -1,4 +1,4 @@ -// Copyright 2018 Citra Emulator Project +// Copyright Citra Emulator Project / Azahar Emulator Project // Licensed under GPLv2 or any later version // Refer to the license.txt file included. @@ -118,6 +118,8 @@ enum class ApplicationRunningMode : u8 { New3dsUnregistered = 4, }; +constexpr std::size_t SysMenuArgSize = 0x40; + /// Holds information about the parameters used in Send/Glance/ReceiveParameter struct MessageParameter { AppletId sender_id = AppletId::None; @@ -180,6 +182,8 @@ private: friend class boost::serialization::access; }; +using SysMenuArg = std::array; + struct ApplicationJumpParameters { u64 next_title_id; FS::MediaType next_media_type; @@ -322,6 +326,16 @@ public: Result PrepareToLeaveHomeMenu(); Result LeaveHomeMenu(std::shared_ptr object, const std::vector& buffer); + Result LoadSysMenuArg(std::vector& buffer); + Result StoreSysMenuArg(const std::vector& buffer); + + boost::optional GetSysMenuArg() { + return sys_menu_arg; + } + void SetSysMenuArg(const SysMenuArg& arg) { + sys_menu_arg = arg; + } + Result OrderToCloseApplication(); Result PrepareToCloseApplication(bool return_to_sys); Result CloseApplication(std::shared_ptr object, const std::vector& buffer); @@ -376,6 +390,9 @@ public: Result WakeupApplication(std::shared_ptr object, const std::vector& buffer); Result CancelApplication(); + Result PrepareToStartNewestHomeMenu(); + Result StartNewestHomeMenu(); + struct AppletManInfo { AppletPos active_applet_pos; AppletId requested_applet_id; @@ -417,6 +434,8 @@ private: ApplicationJumpParameters app_jump_parameters{}; boost::optional app_start_parameters{}; boost::optional deliver_arg{}; + boost::optional sys_menu_arg{}; + u64 home_menu_tid_to_start{}; boost::optional capture_info; boost::optional capture_buffer_info; @@ -437,6 +456,7 @@ private: AppletId applet_id; AppletSlot slot; u64 title_id; + FS::MediaType media_type; bool registered; bool loaded; AppletAttributes attributes; @@ -457,6 +477,7 @@ private: ar & applet_id; ar & slot; ar & title_id; + ar & media_type; ar & registered; ar & loaded; ar & attributes.raw; @@ -495,6 +516,8 @@ private: bool last_home_button_state = false; bool last_power_button_state = false; + FS::MediaType next_app_mediatype = static_cast(UINT32_MAX); + Core::System& system; AppletSlotData* GetAppletSlot(AppletSlot slot) { @@ -532,6 +555,8 @@ private: ar & delayed_parameter; ar & app_start_parameters; ar & deliver_arg; + ar & sys_menu_arg; + ar & home_menu_tid_to_start; ar & capture_info; ar & capture_buffer_info; ar & active_slot; @@ -548,6 +573,7 @@ private: ar & capture_info; ar & applet_slots; ar & library_applet_closing_command; + ar & next_app_mediatype; if (Archive::is_loading::value) { LoadInputDevices(); diff --git a/src/core/hle/service/apt/apt.cpp b/src/core/hle/service/apt/apt.cpp index 002bd3728..14035af1a 100644 --- a/src/core/hle/service/apt/apt.cpp +++ b/src/core/hle/service/apt/apt.cpp @@ -75,6 +75,20 @@ void Module::NSInterface::SetWirelessRebootInfo(Kernel::HLERequestContext& ctx) LOG_WARNING(Service_APT, "called size={}", size); } +void Module::NSInterface::CardUpdateInitialize(Kernel::HLERequestContext& ctx) { + IPC::RequestParser rp(ctx); + rp.Pop(); // Shared mem size + rp.Pop(); // Always 0 + rp.Pop(); // Shared mem handle + + LOG_WARNING(Service_APT, "(stubbed) called"); + const Result update_not_needed(11, ErrorModule::CUP, ErrorSummary::NothingHappened, + ErrorLevel::Status); + + auto rb = rp.MakeBuilder(1, 0); + rb.Push(update_not_needed); +} + void Module::NSInterface::ShutdownAsync(Kernel::HLERequestContext& ctx) { IPC::RequestParser rp(ctx); @@ -92,16 +106,15 @@ void Module::NSInterface::RebootSystem(Kernel::HLERequestContext& ctx) { const auto title_id = rp.Pop(); const auto media_type = static_cast(rp.Pop()); rp.Skip(1, false); // Skip padding - // TODO: Utilize requested memory type. const auto mem_type = rp.Pop(); LOG_WARNING(Service_APT, "called launch_title={}, title_id={:016X}, media_type={:02X}, mem_type={:02X}", launch_title, title_id, media_type, mem_type); - // TODO: Handle mem type. if (launch_title) { - NS::RebootToTitle(apt->system, media_type, title_id); + NS::RebootToTitle(apt->system, media_type, title_id, + static_cast(mem_type)); } else { apt->system.RequestReset(); } @@ -763,16 +776,12 @@ void Module::APTInterface::PrepareToStartSystemApplet(Kernel::HLERequestContext& void Module::APTInterface::PrepareToStartNewestHomeMenu(Kernel::HLERequestContext& ctx) { IPC::RequestParser rp(ctx); + IPC::RequestBuilder rb = rp.MakeBuilder(1, 0); LOG_DEBUG(Service_APT, "called"); - // TODO(Subv): This command can only be called by a System Applet (return 0xC8A0CC04 otherwise). - - // This command must return an error when called, otherwise the Home Menu will try to reboot the - // system. - rb.Push(Result(ErrorDescription::AlreadyExists, ErrorModule::Applet, ErrorSummary::InvalidState, - ErrorLevel::Status)); + rb.Push(apt->applet_manager->PrepareToStartNewestHomeMenu()); } void Module::APTInterface::PreloadLibraryApplet(Kernel::HLERequestContext& ctx) { @@ -821,6 +830,19 @@ void Module::APTInterface::StartSystemApplet(Kernel::HLERequestContext& ctx) { rb.Push(apt->applet_manager->StartSystemApplet(applet_id, object, buffer)); } +void Module::APTInterface::StartNewestHomeMenu(Kernel::HLERequestContext& ctx) { + IPC::RequestParser rp(ctx); + + const auto buffer_size = rp.Pop(); + [[maybe_unused]] const auto object = rp.PopGenericObject(); + [[maybe_unused]] const auto buffer = rp.PopStaticBuffer(); + + LOG_DEBUG(Service_APT, "called, size={:08X}", buffer_size); + + IPC::RequestBuilder rb = rp.MakeBuilder(1, 0); + rb.Push(apt->applet_manager->StartNewestHomeMenu()); +} + void Module::APTInterface::OrderToCloseApplication(Kernel::HLERequestContext& ctx) { IPC::RequestParser rp(ctx); @@ -1011,10 +1033,10 @@ void Module::APTInterface::LoadSysMenuArg(Kernel::HLERequestContext& ctx) { // This service function does not clear the buffer. std::vector buffer(size); - std::copy_n(apt->sys_menu_arg_buffer.cbegin(), size, buffer.begin()); + Result res = apt->applet_manager->LoadSysMenuArg(buffer); IPC::RequestBuilder rb = rp.MakeBuilder(1, 2); - rb.Push(ResultSuccess); + rb.Push(res); rb.PushStaticBuffer(std::move(buffer), 0); } @@ -1026,10 +1048,10 @@ void Module::APTInterface::StoreSysMenuArg(Kernel::HLERequestContext& ctx) { LOG_DEBUG(Service_APT, "called"); ASSERT_MSG(buffer.size() >= size, "Buffer too small to hold requested data"); - std::copy_n(buffer.cbegin(), size, apt->sys_menu_arg_buffer.begin()); + Result res = apt->applet_manager->StoreSysMenuArg(buffer); IPC::RequestBuilder rb = rp.MakeBuilder(1, 0); - rb.Push(ResultSuccess); + rb.Push(res); } void Module::APTInterface::SendCaptureBufferInfo(Kernel::HLERequestContext& ctx) { @@ -1365,8 +1387,8 @@ void Module::APTInterface::Reboot(Kernel::HLERequestContext& ctx) { "called title_id={:016X}, media_type={:02X}, mem_type={:02X}, firm_tid_low={:08X}", title_id, media_type, mem_type, firm_tid_low); - // TODO: Handle mem type and FIRM TID low. - NS::RebootToTitle(apt->system, media_type, title_id); + // TODO: Handle FIRM TID low. + NS::RebootToTitle(apt->system, media_type, title_id, static_cast(mem_type)); IPC::RequestBuilder rb = rp.MakeBuilder(1, 0); rb.Push(ResultSuccess); @@ -1420,8 +1442,7 @@ void Module::APTInterface::IsStandardMemoryLayout(Kernel::HLERequestContext& ctx bool is_standard; if (Settings::values.is_new_3ds) { // Memory layout is standard if it is not NewDev1 (178MB) - is_standard = apt->system.Kernel().GetNew3dsHwCapabilities().memory_mode != - Kernel::New3dsMemoryMode::NewDev1; + is_standard = apt->system.Kernel().GetMemoryMode() != Kernel::MemoryMode::NewDev1; } else { // Memory layout is standard if it is Prod (64MB) is_standard = apt->system.Kernel().GetMemoryMode() == Kernel::MemoryMode::Prod; diff --git a/src/core/hle/service/apt/apt.h b/src/core/hle/service/apt/apt.h index 8e20a788b..376b113f0 100644 --- a/src/core/hle/service/apt/apt.h +++ b/src/core/hle/service/apt/apt.h @@ -1,4 +1,4 @@ -// Copyright 2015 Citra Emulator Project +// Copyright Citra Emulator Project / Azahar Emulator Project // Licensed under GPLv2 or any later version // Refer to the license.txt file included. @@ -31,8 +31,6 @@ class AppletManager; /// Each APT service can only have up to 2 sessions connected at the same time. static const u32 MaxAPTSessions = 2; -constexpr std::size_t SysMenuArgSize = 0x40; - enum class StartupArgumentType : u32 { OtherApp = 0, Restart = 1, @@ -74,6 +72,8 @@ public: */ void SetWirelessRebootInfo(Kernel::HLERequestContext& ctx); + void CardUpdateInitialize(Kernel::HLERequestContext& ctx); + /** * NS::ShutdownAsync service function. * Inputs: @@ -547,6 +547,21 @@ public: */ void StartSystemApplet(Kernel::HLERequestContext& ctx); + /** + * APT::StartNewestHomeMenu service function + * Inputs: + * 0 : Command header [0x00200044] + * 1 : Partameters size + * 2 : 0x0 + * 3 : Handle parameter + * 4 : (Parameters Size << 14) | 2 + * 5 : void*, Parameters + * Outputs: + * 0 : Return header + * 1 : Result of function, 0 on success, otherwise error code + */ + void StartNewestHomeMenu(Kernel::HLERequestContext& ctx); + /** * APT::OrderToCloseApplication service function * Inputs: @@ -1073,8 +1088,6 @@ private: u32 cpu_percent = 0; ///< CPU time available to the running application - std::array sys_menu_arg_buffer; - ScreencapPostPermission screen_capture_post_permission = ScreencapPostPermission::CleanThePermission; // TODO(JamePeng): verify the initial value diff --git a/src/core/hle/service/apt/apt_a.cpp b/src/core/hle/service/apt/apt_a.cpp index dc4c72c90..9de07a57d 100644 --- a/src/core/hle/service/apt/apt_a.cpp +++ b/src/core/hle/service/apt/apt_a.cpp @@ -1,4 +1,4 @@ -// Copyright 2014 Citra Emulator Project +// Copyright Citra Emulator Project / Azahar Emulator Project // Licensed under GPLv2 or any later version // Refer to the license.txt file included. @@ -42,7 +42,7 @@ APT_A::APT_A(std::shared_ptr apt) {0x001D, &APT_A::CancelApplication, "CancelApplication"}, {0x001E, &APT_A::StartLibraryApplet, "StartLibraryApplet"}, {0x001F, &APT_A::StartSystemApplet, "StartSystemApplet"}, - {0x0020, nullptr, "StartNewestHomeMenu"}, + {0x0020, &APT_A::StartNewestHomeMenu, "StartNewestHomeMenu"}, {0x0021, &APT_A::OrderToCloseApplication, "OrderToCloseApplication"}, {0x0022, &APT_A::PrepareToCloseApplication, "PrepareToCloseApplication"}, {0x0023, nullptr, "PrepareToJumpToApplication"}, diff --git a/src/core/hle/service/apt/apt_s.cpp b/src/core/hle/service/apt/apt_s.cpp index 9bd6d81ed..a332cebf6 100644 --- a/src/core/hle/service/apt/apt_s.cpp +++ b/src/core/hle/service/apt/apt_s.cpp @@ -1,4 +1,4 @@ -// Copyright 2015 Citra Emulator Project +// Copyright Citra Emulator Project / Azahar Emulator Project // Licensed under GPLv2 or any later version // Refer to the license.txt file included. @@ -42,7 +42,7 @@ APT_S::APT_S(std::shared_ptr apt) {0x001D, &APT_S::CancelApplication, "CancelApplication"}, {0x001E, &APT_S::StartLibraryApplet, "StartLibraryApplet"}, {0x001F, &APT_S::StartSystemApplet, "StartSystemApplet"}, - {0x0020, nullptr, "StartNewestHomeMenu"}, + {0x0020, &APT_S::StartNewestHomeMenu, "StartNewestHomeMenu"}, {0x0021, &APT_S::OrderToCloseApplication, "OrderToCloseApplication"}, {0x0022, &APT_S::PrepareToCloseApplication, "PrepareToCloseApplication"}, {0x0023, nullptr, "PrepareToJumpToApplication"}, diff --git a/src/core/hle/service/apt/apt_u.cpp b/src/core/hle/service/apt/apt_u.cpp index fd302ab4e..8e1fd18c6 100644 --- a/src/core/hle/service/apt/apt_u.cpp +++ b/src/core/hle/service/apt/apt_u.cpp @@ -1,4 +1,4 @@ -// Copyright 2014 Citra Emulator Project +// Copyright Citra Emulator Project / Azahar Emulator Project // Licensed under GPLv2 or any later version // Refer to the license.txt file included. @@ -42,7 +42,7 @@ APT_U::APT_U(std::shared_ptr apt) {0x001D, &APT_U::CancelApplication, "CancelApplication"}, {0x001E, &APT_U::StartLibraryApplet, "StartLibraryApplet"}, {0x001F, &APT_U::StartSystemApplet, "StartSystemApplet"}, - {0x0020, nullptr, "StartNewestHomeMenu"}, + {0x0020, &APT_U::StartNewestHomeMenu, "StartNewestHomeMenu"}, {0x0021, &APT_U::OrderToCloseApplication, "OrderToCloseApplication"}, {0x0022, &APT_U::PrepareToCloseApplication, "PrepareToCloseApplication"}, {0x0023, nullptr, "PrepareToJumpToApplication"}, diff --git a/src/core/hle/service/apt/errors.h b/src/core/hle/service/apt/errors.h index 25bffb9af..4de973906 100644 --- a/src/core/hle/service/apt/errors.h +++ b/src/core/hle/service/apt/errors.h @@ -1,4 +1,4 @@ -// Copyright 2018 Citra Emulator Project +// Copyright Citra Emulator Project / Azahar Emulator Project // Licensed under GPLv2 or any later version // Refer to the license.txt file included. @@ -8,6 +8,7 @@ namespace Service::APT::ErrCodes { enum { ParameterPresent = 2, InvalidAppletSlot = 4, + IncorrectMemoryMode = 5, AppNotRunning = 11, }; } // namespace Service::APT::ErrCodes diff --git a/src/core/hle/service/apt/ns.cpp b/src/core/hle/service/apt/ns.cpp index c71c23419..6b36d97d1 100644 --- a/src/core/hle/service/apt/ns.cpp +++ b/src/core/hle/service/apt/ns.cpp @@ -1,4 +1,4 @@ -// Copyright 2017 Citra Emulator Project +// Copyright Citra Emulator Project / Azahar Emulator Project // Licensed under GPLv2 or any later version // Refer to the license.txt file included. @@ -11,11 +11,21 @@ namespace Service::NS { std::shared_ptr LaunchTitle(Core::System& system, FS::MediaType media_type, u64 title_id) { - std::string path = AM::GetTitleContentPath(media_type, title_id); - auto loader = Loader::GetLoader(path); + std::string path; - if (!loader) { - LOG_WARNING(Service_NS, "Could not find .app for title 0x{:016x}", title_id); + if (media_type == FS::MediaType::GameCard) { + path = system.GetCartridge(); + } else { + path = AM::GetTitleContentPath(media_type, title_id); + } + + auto loader = Loader::GetLoader(path); + u64 program_id; + + if (!loader || loader->ReadProgramId(program_id) != Loader::ResultStatus::Success || + program_id != title_id) { + LOG_WARNING(Service_NS, "Could not load title=0x{:016x} media_type={}", title_id, + static_cast(media_type)); return nullptr; } @@ -30,6 +40,23 @@ std::shared_ptr LaunchTitle(Core::System& system, FS::MediaType } } + { + // This is normally done by PM, but we don't emulate it + // so we do it here instead. + auto mem_mode_res = loader->LoadKernelMemoryMode(); + Kernel::MemoryMode mem_mode{}; + auto n3ds_cap_res = loader->LoadNew3dsHwCapabilities(); + Kernel::New3dsHwCapabilities n3ds_hw_cap{}; + + if (mem_mode_res.second == Loader::ResultStatus::Success && mem_mode_res.first) { + mem_mode = mem_mode_res.first.value(); + } + if (n3ds_cap_res.second == Loader::ResultStatus::Success && n3ds_cap_res.first) { + n3ds_hw_cap = n3ds_cap_res.first.value(); + } + system.Kernel().UpdateCPUAndMemoryState(title_id, mem_mode, n3ds_hw_cap); + } + std::shared_ptr process; Loader::ResultStatus result = loader->Load(process); @@ -41,8 +68,15 @@ std::shared_ptr LaunchTitle(Core::System& system, FS::MediaType return process; } -void RebootToTitle(Core::System& system, FS::MediaType media_type, u64 title_id) { - auto new_path = AM::GetTitleContentPath(media_type, title_id); +void RebootToTitle(Core::System& system, FS::MediaType media_type, u64 title_id, + std::optional mem_mode) { + std::string new_path; + if (media_type == FS::MediaType::GameCard) { + new_path = system.GetCartridge(); + } else { + new_path = AM::GetTitleContentPath(media_type, title_id); + } + if (new_path.empty() || !FileUtil::Exists(new_path)) { // TODO: This can happen if the requested title is not installed. Need a way to find // non-installed titles in the game list. @@ -51,7 +85,12 @@ void RebootToTitle(Core::System& system, FS::MediaType media_type, u64 title_id) new_path); new_path.clear(); } - system.RequestReset(new_path); + + std::optional mem_mode_u8; + if (mem_mode) { + mem_mode_u8 = static_cast(mem_mode.value()); + } + system.RequestReset(new_path, mem_mode_u8); } } // namespace Service::NS diff --git a/src/core/hle/service/apt/ns.h b/src/core/hle/service/apt/ns.h index 8fa80e11b..2a7dda254 100644 --- a/src/core/hle/service/apt/ns.h +++ b/src/core/hle/service/apt/ns.h @@ -1,4 +1,4 @@ -// Copyright 2017 Citra Emulator Project +// Copyright Citra Emulator Project / Azahar Emulator Project // Licensed under GPLv2 or any later version // Refer to the license.txt file included. @@ -20,6 +20,7 @@ std::shared_ptr LaunchTitle(Core::System& system, FS::MediaType u64 title_id); /// Reboots the system to the specified title. -void RebootToTitle(Core::System& system, FS::MediaType media_type, u64 title_id); +void RebootToTitle(Core::System& system, FS::MediaType media_type, u64 title_id, + std::optional mem_mode); } // namespace Service::NS diff --git a/src/core/hle/service/apt/ns_s.cpp b/src/core/hle/service/apt/ns_s.cpp index dfb178d7b..ab267a0d4 100644 --- a/src/core/hle/service/apt/ns_s.cpp +++ b/src/core/hle/service/apt/ns_s.cpp @@ -1,4 +1,4 @@ -// Copyright 2015 Citra Emulator Project +// Copyright Citra Emulator Project / Azahar Emulator Project // Licensed under GPLv2 or any later version // Refer to the license.txt file included. @@ -17,7 +17,7 @@ NS_S::NS_S(std::shared_ptr apt) {0x0004, nullptr, "TerminateProcess"}, {0x0005, nullptr, "LaunchApplicationFIRM"}, {0x0006, &NS_S::SetWirelessRebootInfo, "SetWirelessRebootInfo"}, - {0x0007, nullptr, "CardUpdateInitialize"}, + {0x0007, &NS_S::CardUpdateInitialize, "CardUpdateInitialize"}, {0x0008, nullptr, "CardUpdateShutdown"}, {0x000D, nullptr, "SetTWLBannerHMAC"}, {0x000E, &NS_S::ShutdownAsync, "ShutdownAsync"}, diff --git a/src/core/hle/service/fs/archive.cpp b/src/core/hle/service/fs/archive.cpp index 2a48a741a..131cb58c0 100644 --- a/src/core/hle/service/fs/archive.cpp +++ b/src/core/hle/service/fs/archive.cpp @@ -1,4 +1,4 @@ -// Copyright 2014 Citra Emulator Project +// Copyright Citra Emulator Project / Azahar Emulator Project // Licensed under GPLv2 or any later version // Refer to the license.txt file included. @@ -30,11 +30,16 @@ namespace Service::FS { +bool IsInstalledApplication(std::string_view path) { + return path.rfind(FileUtil::GetUserPath(FileUtil::UserPath::NANDDir) + "title", 0) == 0 || + path.rfind(FileUtil::GetUserPath(FileUtil::UserPath::SDMCDir) + "Nintendo 3DS", 0) == 0; +} + MediaType GetMediaTypeFromPath(std::string_view path) { - if (path.rfind(FileUtil::GetUserPath(FileUtil::UserPath::NANDDir), 0) == 0) { + if (path.rfind(FileUtil::GetUserPath(FileUtil::UserPath::NANDDir) + "title", 0) == 0) { return MediaType::NAND; } - if (path.rfind(FileUtil::GetUserPath(FileUtil::UserPath::SDMCDir), 0) == 0) { + if (path.rfind(FileUtil::GetUserPath(FileUtil::UserPath::SDMCDir) + "Nintendo 3DS", 0) == 0) { return MediaType::SDMC; } return MediaType::GameCard; diff --git a/src/core/hle/service/fs/archive.h b/src/core/hle/service/fs/archive.h index 387b11dba..2e017f3e0 100644 --- a/src/core/hle/service/fs/archive.h +++ b/src/core/hle/service/fs/archive.h @@ -1,4 +1,4 @@ -// Copyright 2014 Citra Emulator Project +// Copyright Citra Emulator Project / Azahar Emulator Project // Licensed under GPLv2 or any later version // Refer to the license.txt file included. @@ -51,6 +51,7 @@ enum class ArchiveIdCode : u32 { /// Media types for the archives enum class MediaType : u32 { NAND = 0, SDMC = 1, GameCard = 2 }; +bool IsInstalledApplication(std::string_view path); MediaType GetMediaTypeFromPath(std::string_view path); enum class SpecialContentType : u8 { diff --git a/src/core/hle/service/fs/fs_user.cpp b/src/core/hle/service/fs/fs_user.cpp index 99390cd40..c9641a518 100644 --- a/src/core/hle/service/fs/fs_user.cpp +++ b/src/core/hle/service/fs/fs_user.cpp @@ -913,6 +913,14 @@ void FS_USER::GetFreeBytes(Kernel::HLERequestContext& ctx) { } } +void FS_USER::GetCardType(Kernel::HLERequestContext& ctx) { + IPC::RequestParser rp(ctx); + IPC::RequestBuilder rb = rp.MakeBuilder(2, 0); + rb.Push(ResultSuccess); + rb.Push(0); // CTR Card + LOG_DEBUG(Service_FS, "(STUBBED) called"); +} + void FS_USER::GetSdmcArchiveResource(Kernel::HLERequestContext& ctx) { IPC::RequestParser rp(ctx); @@ -999,8 +1007,8 @@ void FS_USER::CardSlotIsInserted(Kernel::HLERequestContext& ctx) { IPC::RequestParser rp(ctx); IPC::RequestBuilder rb = rp.MakeBuilder(2, 0); rb.Push(ResultSuccess); - rb.Push(false); - LOG_WARNING(Service_FS, "(STUBBED) called"); + rb.Push(!system.GetCartridge().empty()); + LOG_DEBUG(Service_FS, "called"); } void FS_USER::DeleteSystemSaveData(Kernel::HLERequestContext& ctx) { @@ -1681,14 +1689,20 @@ void FS_USER::GetSaveDataSecureValue(Kernel::HLERequestContext& ctx) { } void FS_USER::RegisterProgramInfo(u32 process_id, u64 program_id, const std::string& filepath) { - const MediaType media_type = GetMediaTypeFromPath(filepath); + MediaType media_type; + if (filepath == system.GetCartridge()) { + media_type = MediaType::GameCard; + } else { + media_type = GetMediaTypeFromPath(filepath); + } + program_info_map.insert_or_assign(process_id, ProgramInfo{program_id, media_type}); if (media_type == MediaType::GameCard) { current_gamecard_path = filepath; } } -std::string FS_USER::GetCurrentGamecardPath() const { +std::string FS_USER::GetRegisteredGamecardPath() const { return current_gamecard_path; } @@ -1779,7 +1793,7 @@ FS_USER::FS_USER(Core::System& system) {0x0810, &FS_USER::CreateLegacySystemSaveData, "CreateLegacySystemSaveData"}, {0x0811, nullptr, "DeleteSystemSaveData"}, {0x0812, &FS_USER::GetFreeBytes, "GetFreeBytes"}, - {0x0813, nullptr, "GetCardType"}, + {0x0813, &FS_USER::GetCardType, "GetCardType"}, {0x0814, &FS_USER::GetSdmcArchiveResource, "GetSdmcArchiveResource"}, {0x0815, &FS_USER::GetNandArchiveResource, "GetNandArchiveResource"}, {0x0816, nullptr, "GetSdmcFatfsError"}, diff --git a/src/core/hle/service/fs/fs_user.h b/src/core/hle/service/fs/fs_user.h index 11fbef4db..bdce1b7eb 100644 --- a/src/core/hle/service/fs/fs_user.h +++ b/src/core/hle/service/fs/fs_user.h @@ -1,4 +1,4 @@ -// Copyright 2014 Citra Emulator Project +// Copyright Citra Emulator Project / Azahar Emulator Project // Licensed under GPLv2 or any later version // Refer to the license.txt file included. @@ -54,7 +54,7 @@ public: // loader and pm, which we HLEed, we can just directly use it here void RegisterProgramInfo(u32 process_id, u64 program_id, const std::string& filepath); - std::string GetCurrentGamecardPath() const; + std::string GetRegisteredGamecardPath() const; struct ProductInfo { std::array product_code; @@ -361,6 +361,8 @@ private: */ void GetFreeBytes(Kernel::HLERequestContext& ctx); + void GetCardType(Kernel::HLERequestContext& ctx); + /** * FS_User::GetSdmcArchiveResource service function. * Inputs: diff --git a/src/core/hle/service/gsp/gsp_gpu.cpp b/src/core/hle/service/gsp/gsp_gpu.cpp index dc33488b4..4692e62fd 100644 --- a/src/core/hle/service/gsp/gsp_gpu.cpp +++ b/src/core/hle/service/gsp/gsp_gpu.cpp @@ -20,6 +20,7 @@ #include "core/memory.h" #include "video_core/gpu.h" #include "video_core/gpu_debugger.h" +#include "video_core/pica/pica_core.h" #include "video_core/pica/regs_lcd.h" #include "video_core/renderer_base.h" #include "video_core/right_eye_disabler.h" @@ -467,6 +468,8 @@ void GSP_GPU::TriggerCmdReqQueue(Kernel::HLERequestContext& ctx) { void GSP_GPU::ImportDisplayCaptureInfo(Kernel::HLERequestContext& ctx) { IPC::RequestParser rp(ctx); + LOG_DEBUG(Service_GSP, "called"); + if (active_thread_id == std::numeric_limits::max()) { LOG_WARNING(Service_GSP, "Called without an active thread."); @@ -503,28 +506,64 @@ void GSP_GPU::ImportDisplayCaptureInfo(Kernel::HLERequestContext& ctx) { rb.Push(ResultSuccess); rb.PushRaw(top_entry); rb.PushRaw(bottom_entry); - - LOG_WARNING(Service_GSP, "called"); } -static void CopyFrameBuffer(Core::System& system, VAddr dst, VAddr src, u32 stride, u32 lines) { - auto dst_ptr = system.Memory().GetPointer(dst); - const auto src_ptr = system.Memory().GetPointer(src); +static void CopyFrameBuffer(Core::System& system, VAddr dst, VAddr src, u32 dst_stride, + u32 src_stride, u32 lines) { + auto* dst_ptr = system.Memory().GetPointer(dst); + const auto* src_ptr = system.Memory().GetPointer(src); + if (!dst_ptr || !src_ptr) { LOG_WARNING(Service_GSP, "Could not resolve pointers for framebuffer capture, skipping screen."); return; } - system.Memory().RasterizerFlushVirtualRegion(src, stride * lines, Memory::FlushMode::Flush); - std::memcpy(dst_ptr, src_ptr, stride * lines); - system.Memory().RasterizerFlushVirtualRegion(dst, stride * lines, + system.Memory().RasterizerFlushVirtualRegion(src, src_stride * lines, Memory::FlushMode::Flush); + + const u32 copy_bytes_per_line = std::min(src_stride, dst_stride); + for (u32 y = 0; y < lines; ++y) { + std::memcpy(dst_ptr, src_ptr, copy_bytes_per_line); + src_ptr += src_stride; + dst_ptr += dst_stride; + } + + system.Memory().RasterizerFlushVirtualRegion(dst, dst_stride * lines, + Memory::FlushMode::Invalidate); +} + +static void ClearFramebuffer(Core::System& system, VAddr dst, u32 dst_stride, u32 lines) { + auto* dst_ptr = system.Memory().GetPointer(dst); + + if (!dst_ptr) { + LOG_WARNING(Service_GSP, + "Could not resolve pointers for framebuffer clear, skipping screen."); + return; + } + + const u32 set_bytes_per_line = dst_stride; + for (u32 y = 0; y < lines; ++y) { + std::memset(dst_ptr, 0, set_bytes_per_line); + dst_ptr += dst_stride; + } + + system.Memory().RasterizerFlushVirtualRegion(dst, dst_stride * lines, Memory::FlushMode::Invalidate); } void GSP_GPU::SaveVramSysArea(Kernel::HLERequestContext& ctx) { IPC::RequestParser rp(ctx); + LOG_DEBUG(Service_GSP, "called"); + + // Taken from GSP decomp. TODO: GSP seems to so something special + // when the fb format results in bpp of 0 or 4, most likely clearing + // it, more research needed. + static const u8 bpp_per_format[] = {// Valid values + 4, 3, 2, 2, 2, + // Invalid values + 0, 0, 0}; + if (active_thread_id == std::numeric_limits::max()) { LOG_WARNING(Service_GSP, "Called without an active thread."); @@ -534,47 +573,71 @@ void GSP_GPU::SaveVramSysArea(Kernel::HLERequestContext& ctx) { return; } - LOG_INFO(Service_GSP, "called"); - - // TODO: This should also save LCD register state. system.Memory().RasterizerFlushVirtualRegion(Memory::VRAM_VADDR, Memory::VRAM_SIZE, Memory::FlushMode::Flush); const auto vram = system.Memory().GetPointer(Memory::VRAM_VADDR); saved_vram.emplace(std::vector(Memory::VRAM_SIZE)); std::memcpy(saved_vram.get().data(), vram, Memory::VRAM_SIZE); - const auto top_screen = GetFrameBufferInfo(active_thread_id, 0); + auto top_screen = GetFrameBufferInfo(active_thread_id, 0); if (top_screen) { + u8 bytes_per_pixel = + bpp_per_format[top_screen->framebuffer_info[top_screen->index].GetPixelFormat()]; const auto top_fb = top_screen->framebuffer_info[top_screen->index]; - if (top_fb.address_left) { + if (top_fb.address_left && bytes_per_pixel != 0 && bytes_per_pixel != 4) { CopyFrameBuffer(system, FRAMEBUFFER_SAVE_AREA_TOP_LEFT, top_fb.address_left, - top_fb.stride, TOP_FRAMEBUFFER_HEIGHT); + FRAMEBUFFER_WIDTH * bytes_per_pixel, top_fb.stride, + TOP_FRAMEBUFFER_HEIGHT); } else { - LOG_WARNING(Service_GSP, "No framebuffer bound to top left screen, skipping capture."); + LOG_DEBUG(Service_GSP, "Invalid framebuffer bound to top left screen, clearing..."); + ClearFramebuffer(system, FRAMEBUFFER_SAVE_AREA_TOP_LEFT, + FRAMEBUFFER_WIDTH * bytes_per_pixel, TOP_FRAMEBUFFER_HEIGHT); } - if (top_fb.address_right) { + if (top_fb.address_right && bytes_per_pixel != 0 && bytes_per_pixel != 4) { CopyFrameBuffer(system, FRAMEBUFFER_SAVE_AREA_TOP_RIGHT, top_fb.address_right, - top_fb.stride, TOP_FRAMEBUFFER_HEIGHT); + FRAMEBUFFER_WIDTH * bytes_per_pixel, top_fb.stride, + TOP_FRAMEBUFFER_HEIGHT); } else { - LOG_WARNING(Service_GSP, "No framebuffer bound to top right screen, skipping capture."); + LOG_DEBUG(Service_GSP, "Invalid framebuffer bound to top right screen, clearing..."); + ClearFramebuffer(system, FRAMEBUFFER_SAVE_AREA_TOP_RIGHT, + FRAMEBUFFER_WIDTH * bytes_per_pixel, TOP_FRAMEBUFFER_HEIGHT); } + + FrameBufferInfo fb_info = top_screen->framebuffer_info[top_screen->index]; + + fb_info.address_left = FRAMEBUFFER_SAVE_AREA_TOP_LEFT; + fb_info.address_right = FRAMEBUFFER_SAVE_AREA_TOP_RIGHT; + fb_info.stride = FRAMEBUFFER_WIDTH * bytes_per_pixel; + system.GPU().SetBufferSwap(0, fb_info); } else { LOG_WARNING(Service_GSP, "No top screen bound, skipping capture."); } - const auto bottom_screen = GetFrameBufferInfo(active_thread_id, 1); + auto bottom_screen = GetFrameBufferInfo(active_thread_id, 1); if (bottom_screen) { + u8 bytes_per_pixel = + bpp_per_format[bottom_screen->framebuffer_info[bottom_screen->index].GetPixelFormat()]; const auto bottom_fb = bottom_screen->framebuffer_info[bottom_screen->index]; - if (bottom_fb.address_left) { + if (bottom_fb.address_left && bytes_per_pixel != 0 && bytes_per_pixel != 4) { CopyFrameBuffer(system, FRAMEBUFFER_SAVE_AREA_BOTTOM, bottom_fb.address_left, - bottom_fb.stride, BOTTOM_FRAMEBUFFER_HEIGHT); + FRAMEBUFFER_WIDTH * bytes_per_pixel, bottom_fb.stride, + BOTTOM_FRAMEBUFFER_HEIGHT); } else { - LOG_WARNING(Service_GSP, "No framebuffer bound to bottom screen, skipping capture."); + LOG_DEBUG(Service_GSP, "Invalid framebuffer bound to bottom screen, clearing..."); + ClearFramebuffer(system, FRAMEBUFFER_SAVE_AREA_BOTTOM, + FRAMEBUFFER_WIDTH * bytes_per_pixel, BOTTOM_FRAMEBUFFER_HEIGHT); } + FrameBufferInfo fb_info = bottom_screen->framebuffer_info[bottom_screen->index]; + + fb_info.address_left = FRAMEBUFFER_SAVE_AREA_BOTTOM; + fb_info.stride = FRAMEBUFFER_WIDTH * bytes_per_pixel; + system.GPU().SetBufferSwap(1, fb_info); } else { LOG_WARNING(Service_GSP, "No bottom screen bound, skipping capture."); } + // Real GSP waits for VBlank here, but we don't need it (?). + IPC::RequestBuilder rb = rp.MakeBuilder(1, 0); rb.Push(ResultSuccess); } @@ -582,16 +645,31 @@ void GSP_GPU::SaveVramSysArea(Kernel::HLERequestContext& ctx) { void GSP_GPU::RestoreVramSysArea(Kernel::HLERequestContext& ctx) { IPC::RequestParser rp(ctx); - LOG_INFO(Service_GSP, "called"); + LOG_DEBUG(Service_GSP, "called"); if (saved_vram) { - // TODO: This should also restore LCD register state. auto vram = system.Memory().GetPointer(Memory::VRAM_VADDR); std::memcpy(vram, saved_vram.get().data(), Memory::VRAM_SIZE); system.Memory().RasterizerFlushVirtualRegion(Memory::VRAM_VADDR, Memory::VRAM_SIZE, Memory::FlushMode::Invalidate); } + auto top_screen = GetFrameBufferInfo(active_thread_id, 0); + if (top_screen) { + system.GPU().SetBufferSwap(0, top_screen->framebuffer_info[top_screen->index]); + } else { + LOG_WARNING(Service_GSP, "No top screen bound, skipping restore."); + } + + auto bottom_screen = GetFrameBufferInfo(active_thread_id, 1); + if (bottom_screen) { + system.GPU().SetBufferSwap(1, bottom_screen->framebuffer_info[top_screen->index]); + } else { + LOG_WARNING(Service_GSP, "No bottom screen bound, skipping restore."); + } + + // Real GSP waits for VBlank here, but we don't need it (?). + IPC::RequestBuilder rb = rp.MakeBuilder(1, 0); rb.Push(ResultSuccess); } @@ -608,8 +686,16 @@ Result GSP_GPU::AcquireGpuRight(const Kernel::HLERequestContext& ctx, Common::Hacks::hack_manager.GetHackAllowMode(Common::Hacks::HackType::RIGHT_EYE_DISABLE, process->codeset->program_id) != Common::Hacks::HackAllowMode::DISALLOW; + + bool requires_shader_fixup = + Common::Hacks::hack_manager.GetHackAllowMode( + Common::Hacks::HackType::REQUIRES_SHADER_FIXUP, process->codeset->program_id, + Common::Hacks::HackAllowMode::DISALLOW) != Common::Hacks::HackAllowMode::DISALLOW; + auto& gpu = system.GPU(); gpu.GetRightEyeDisabler().SetEnabled(right_eye_disable_allow); + gpu.PicaCore().vs_setup.requires_fixup = requires_shader_fixup; + gpu.PicaCore().gs_setup.requires_fixup = requires_shader_fixup; if (active_thread_id == session_data->thread_id) { return {ErrorDescription::AlreadyDone, ErrorModule::GX, ErrorSummary::Success, diff --git a/src/core/hle/service/gsp/gsp_gpu.h b/src/core/hle/service/gsp/gsp_gpu.h index f5f810c44..0864e37de 100644 --- a/src/core/hle/service/gsp/gsp_gpu.h +++ b/src/core/hle/service/gsp/gsp_gpu.h @@ -30,6 +30,8 @@ class SharedMemory; namespace Service::GSP { struct FrameBufferInfo { + static constexpr u32 PIXEL_FORMAT_MASK = 0x7; + u32 active_fb; // 0 = first, 1 = second u32 address_left; u32 address_right; @@ -37,6 +39,10 @@ struct FrameBufferInfo { u32 format; // maps to 0x1EF00X70 ? u32 shown_fb; // maps to 0x1EF00X78 ? u32 unknown; + + u32 GetPixelFormat() { + return format & PIXEL_FORMAT_MASK; + } }; static_assert(sizeof(FrameBufferInfo) == 0x1c, "Struct has incorrect size"); diff --git a/src/core/hle/service/plgldr/plgldr.cpp b/src/core/hle/service/plgldr/plgldr.cpp index d619a0d0d..15c73c83c 100644 --- a/src/core/hle/service/plgldr/plgldr.cpp +++ b/src/core/hle/service/plgldr/plgldr.cpp @@ -2,6 +2,8 @@ // Licensed under GPLv2 or any later version // Refer to the license.txt file included. +// Originally MIT-licensed code from The Pixellizer Group + // Copyright 2022 The Pixellizer Group // // Permission is hereby granted, free of charge, to any person obtaining a copy of this software and @@ -70,6 +72,9 @@ void PLG_LDR::PluginLoaderContext::serialize(Archive& ar, const unsigned int) { ar & plugin_loaded; ar & is_default_path; ar & plugin_path; + ar & memory_region; + ar & memory_block; + ar & plugin_process_id; ar & use_user_load_parameters; ar & user_load_parameters; ar & plg_event; @@ -79,7 +84,6 @@ void PLG_LDR::PluginLoaderContext::serialize(Archive& ar, const unsigned int) { ar & exe_load_checksum; ar & load_exe_func; ar & load_exe_args; - ar & plugin_fb_addr; } SERIALIZE_IMPL(PLG_LDR::PluginLoaderContext) @@ -148,12 +152,22 @@ void PLG_LDR::OnProcessRun(Kernel::Process& process, Kernel::KernelSystem& kerne } void PLG_LDR::OnProcessExit(Kernel::Process& process, Kernel::KernelSystem& kernel) { - if (plgldr_context.plugin_loaded) { + if (plgldr_context.plugin_loaded && process.process_id == plgldr_context.plugin_process_id) { u32 status = kernel.memory.Read32(FileSys::Plugin3GXLoader::_3GX_exe_load_addr - 0xC); if (status == 0) { LOG_CRITICAL(Service_PLGLDR, "Failed to launch {}: Checksum failed", plgldr_context.plugin_path); } + if (plgldr_context.memory_region != static_cast(0)) { + kernel.GetMemoryRegion(plgldr_context.memory_region) + ->Free(plgldr_context.memory_block.first, plgldr_context.memory_block.second); + plgldr_context.memory_region = static_cast(0); + } + plgldr_context.plugin_loaded = false; + plgldr_context.plugin_process_id = UINT32_MAX; + plgldr_context.memory_changed_handle = 0; + kernel.memory.Plugin3GXFramebufferAddress() = 0; + LOG_INFO(Service_PLGLDR, "Plugin unloaded successfully."); } } diff --git a/src/core/hle/service/plgldr/plgldr.h b/src/core/hle/service/plgldr/plgldr.h index 01952b587..d18b7e24a 100644 --- a/src/core/hle/service/plgldr/plgldr.h +++ b/src/core/hle/service/plgldr/plgldr.h @@ -1,7 +1,9 @@ -// Copyright 2022 Citra Emulator Project +// Copyright Citra Emulator Project / Azahar Emulator Project // Licensed under GPLv2 or any later version // Refer to the license.txt file included. +// Originally MIT-licensed code from The Pixellizer Group + // Copyright 2022 The Pixellizer Group // // Permission is hereby granted, free of charge, to any person obtaining a copy of this software and @@ -62,6 +64,9 @@ public: bool plugin_loaded = false; bool is_default_path = false; std::string plugin_path = ""; + u32 plugin_process_id = UINT32_MAX; + Kernel::MemoryRegion memory_region{}; + std::pair memory_block{}; bool use_user_load_parameters = false; PluginLoadParameters user_load_parameters; @@ -76,8 +81,6 @@ public: std::vector load_exe_func; u32_le load_exe_args[4] = {0}; - PAddr plugin_fb_addr = 0; - template void serialize(Archive& ar, const unsigned int); friend class boost::serialization::access; @@ -109,12 +112,6 @@ public: bool GetAllowGameChangeState() { return plgldr_context.allow_game_change; } - void SetPluginFBAddr(PAddr addr) { - plgldr_context.plugin_fb_addr = addr; - } - PAddr GetPluginFBAddr() { - return plgldr_context.plugin_fb_addr; - } private: Core::System& system; diff --git a/src/core/hle/service/service.cpp b/src/core/hle/service/service.cpp index 148d60185..6ead40057 100644 --- a/src/core/hle/service/service.cpp +++ b/src/core/hle/service/service.cpp @@ -178,7 +178,7 @@ void ServiceFrameworkBase::ReportUnimplementedFunction(u32* cmd_buf, const Funct void ServiceFrameworkBase::HandleSyncRequest(Kernel::HLERequestContext& context) { auto itr = handlers.find(context.CommandHeader().command_id.Value()); const FunctionInfoBase* info = itr == handlers.end() ? nullptr : &itr->second; - if (info == nullptr || info->handler_callback == nullptr) { + if (info == nullptr || !info->implemented) { context.ReportUnimplemented(); return ReportUnimplementedFunction(context.CommandBuffer(), info); } diff --git a/src/core/hle/service/service.h b/src/core/hle/service/service.h index fbe368c2c..3dddf39d4 100644 --- a/src/core/hle/service/service.h +++ b/src/core/hle/service/service.h @@ -82,6 +82,7 @@ private: struct FunctionInfoBase { u32 command_id; + bool implemented; HandlerFnP handler_callback; const char* name; }; @@ -96,6 +97,8 @@ private: void RegisterHandlersBase(const FunctionInfoBase* functions, std::size_t n); void ReportUnimplementedFunction(u32* cmd_buf, const FunctionInfoBase* info); + void Empty(Kernel::HLERequestContext& ctx) {} + /// Identifier string used to connect to the service. std::string service_name; /// Maximum number of concurrent sessions that this service can handle. @@ -134,9 +137,11 @@ protected: */ constexpr FunctionInfo(u32 command_id, HandlerFnP handler_callback, const char* name) : FunctionInfoBase{ - command_id, + command_id, handler_callback != nullptr, // Type-erase member function pointer by casting it down to the base class. - static_cast>(handler_callback), name} {} + handler_callback ? static_cast>(handler_callback) + : &ServiceFrameworkBase::Empty, + name} {} }; /** diff --git a/src/core/loader/artic.cpp b/src/core/loader/artic.cpp index 30f62dc57..9c7aefbeb 100644 --- a/src/core/loader/artic.cpp +++ b/src/core/loader/artic.cpp @@ -134,6 +134,16 @@ Apploader_Artic::LoadNew3dsHwCapabilities() { return std::make_pair(std::move(caps), ResultStatus::Success); } +bool Apploader_Artic::IsN3DSExclusive() { + std::vector smdh_buffer; + if (ReadIcon(smdh_buffer) == ResultStatus::Success && IsValidSMDH(smdh_buffer)) { + SMDH* smdh = reinterpret_cast(smdh_buffer.data()); + return smdh->flags.n3ds_exclusive != 0; + } + + return false; +} + ResultStatus Apploader_Artic::LoadExec(std::shared_ptr& process) { if (!is_loaded) diff --git a/src/core/loader/artic.h b/src/core/loader/artic.h index 13b92c189..a6de6e0fd 100644 --- a/src/core/loader/artic.h +++ b/src/core/loader/artic.h @@ -56,6 +56,8 @@ public: std::pair, ResultStatus> LoadNew3dsHwCapabilities() override; + bool IsN3DSExclusive() override; + ResultStatus IsExecutable(bool& out_executable) override; ResultStatus ReadCode(std::vector& buffer) override; diff --git a/src/core/loader/loader.cpp b/src/core/loader/loader.cpp index 3b23f7762..5e5cdf2e2 100644 --- a/src/core/loader/loader.cpp +++ b/src/core/loader/loader.cpp @@ -164,7 +164,11 @@ std::unique_ptr GetLoader(const std::string& filename) { FileType filename_type = GuessFromExtension(filename_extension); if (type != filename_type) { - LOG_WARNING(Loader, "File {} has a different type than its extension.", filename); + // Do not show the error for CIA files, as their type cannot be determined. + if (!(type == FileType::Unknown && filename_type == FileType::CIA)) { + LOG_WARNING(Loader, "File {} has a different type than its extension.", filename); + } + if (FileType::Unknown == type) type = filename_type; } diff --git a/src/core/loader/loader.h b/src/core/loader/loader.h index 2c5ef952f..9e4c76122 100644 --- a/src/core/loader/loader.h +++ b/src/core/loader/loader.h @@ -163,6 +163,10 @@ public: ResultStatus::Success); } + virtual bool IsN3DSExclusive() { + return false; + } + /** * Get whether this application is executable. * @param out_executable Reference to store the executable flag into. @@ -298,6 +302,10 @@ public: return false; } + virtual std::string GetFilePath() { + return file ? file->Filename() : ""; + } + protected: Core::System& system; std::unique_ptr file; diff --git a/src/core/loader/ncch.cpp b/src/core/loader/ncch.cpp index ef33c42d3..0b2058293 100644 --- a/src/core/loader/ncch.cpp +++ b/src/core/loader/ncch.cpp @@ -125,6 +125,23 @@ AppLoader_NCCH::LoadNew3dsHwCapabilities() { return std::make_pair(std::move(caps), ResultStatus::Success); } +bool AppLoader_NCCH::IsN3DSExclusive() { + if (!is_loaded) { + ResultStatus res = base_ncch.Load(); + if (res != ResultStatus::Success) { + return false; + } + } + + std::vector smdh_buffer; + if (ReadIcon(smdh_buffer) == ResultStatus::Success && IsValidSMDH(smdh_buffer)) { + SMDH* smdh = reinterpret_cast(smdh_buffer.data()); + return smdh->flags.n3ds_exclusive != 0; + } + + return false; +} + ResultStatus AppLoader_NCCH::LoadExec(std::shared_ptr& process) { using Kernel::CodeSet; diff --git a/src/core/loader/ncch.h b/src/core/loader/ncch.h index d36e4c249..f1bf69855 100644 --- a/src/core/loader/ncch.h +++ b/src/core/loader/ncch.h @@ -50,6 +50,8 @@ public: std::pair, ResultStatus> LoadNew3dsHwCapabilities() override; + bool IsN3DSExclusive() override; + ResultStatus IsExecutable(bool& out_executable) override; ResultStatus ReadCode(std::vector& buffer) override; @@ -78,6 +80,10 @@ public: bool IsFileCompressed() override; + std::string GetFilePath() override { + return filepath; + } + private: /** * Loads .code section into memory for booting diff --git a/src/core/loader/smdh.h b/src/core/loader/smdh.h index 2913b195b..04a97f5d4 100644 --- a/src/core/loader/smdh.h +++ b/src/core/loader/smdh.h @@ -7,6 +7,7 @@ #include #include #include +#include "common/bit_field.h" #include "common/common_funcs.h" #include "common/common_types.h" #include "common/swap.h" @@ -37,7 +38,23 @@ struct SMDH { u32_le region_lockout; u32_le match_maker_id; u64_le match_maker_bit_id; - u32_le flags; + union { + u32_le raw; + + BitField<0, 1, u32> visible; + BitField<1, 1, u32> autoboot; + BitField<2, 1, u32> allow_3D; + BitField<3, 1, u32> require_eula; + BitField<4, 1, u32> autosave; + BitField<5, 1, u32> extended_banner; + BitField<6, 1, u32> rating_required; + BitField<7, 1, u32> uses_savedata; + BitField<8, 1, u32> record_usage; + BitField<10, 1, u32> disable_save_backup; + BitField<12, 1, u32> n3ds_exclusive; + BitField<14, 1, u32> parental_restricted; + } flags; + u16_le eula_version; INSERT_PADDING_BYTES(2); float_le banner_animation_frame; @@ -73,10 +90,6 @@ struct SMDH { Taiwan = 6, }; - enum Flags { - Visible = 1 << 0, - }; - /** * Checks if SMDH is valid. */ diff --git a/src/core/memory.cpp b/src/core/memory.cpp index c49aa2704..41ad049e5 100644 --- a/src/core/memory.cpp +++ b/src/core/memory.cpp @@ -91,19 +91,20 @@ public: std::unique_ptr fcram = std::make_unique(Memory::FCRAM_N3DS_SIZE); std::unique_ptr vram = std::make_unique(Memory::VRAM_SIZE); std::unique_ptr n3ds_extra_ram = std::make_unique(Memory::N3DS_EXTRA_RAM_SIZE); + std::unique_ptr dsp_ram = std::make_unique(Memory::DSP_RAM_SIZE); Core::System& system; std::shared_ptr current_page_table = nullptr; RasterizerCacheMarker cache_marker; std::vector> page_table_list; - AudioCore::DspInterface* dsp = nullptr; - std::shared_ptr fcram_mem; std::shared_ptr vram_mem; std::shared_ptr n3ds_extra_ram_mem; std::shared_ptr dsp_mem; + PAddr plugin_fb_address{}; + Impl(Core::System& system_); const u8* GetPtr(Region r) const { @@ -111,7 +112,7 @@ public: case Region::VRAM: return vram.get(); case Region::DSP: - return dsp->GetDspMemory().data(); + return dsp_ram.get(); case Region::FCRAM: return fcram.get(); case Region::N3DS: @@ -126,7 +127,7 @@ public: case Region::VRAM: return vram.get(); case Region::DSP: - return dsp->GetDspMemory().data(); + return dsp_ram.get(); case Region::FCRAM: return fcram.get(); case Region::N3DS: @@ -263,12 +264,8 @@ public: if (addr >= VRAM_VADDR && addr < VRAM_VADDR_END) { return {vram_mem, addr - VRAM_VADDR}; } - if (addr >= PLUGIN_3GX_FB_VADDR && addr < PLUGIN_3GX_FB_VADDR_END) { - auto plg_ldr = Service::PLGLDR::GetService(system); - if (plg_ldr) { - return {fcram_mem, - addr - PLUGIN_3GX_FB_VADDR + plg_ldr->GetPluginFBAddr() - FCRAM_PADDR}; - } + if (addr >= PLUGIN_3GX_FB_VADDR && addr < PLUGIN_3GX_FB_VADDR_END && plugin_fb_address) { + return {fcram_mem, addr - PLUGIN_3GX_FB_VADDR + plugin_fb_address - FCRAM_PADDR}; } UNREACHABLE(); @@ -307,9 +304,8 @@ public: CheckRegion(LINEAR_HEAP_VADDR, LINEAR_HEAP_VADDR_END, FCRAM_PADDR); CheckRegion(NEW_LINEAR_HEAP_VADDR, NEW_LINEAR_HEAP_VADDR_END, FCRAM_PADDR); CheckRegion(VRAM_VADDR, VRAM_VADDR_END, VRAM_PADDR); - auto plg_ldr = Service::PLGLDR::GetService(system); - if (plg_ldr && plg_ldr->GetPluginFBAddr()) { - CheckRegion(PLUGIN_3GX_FB_VADDR, PLUGIN_3GX_FB_VADDR_END, plg_ldr->GetPluginFBAddr()); + if (plugin_fb_address) { + CheckRegion(PLUGIN_3GX_FB_VADDR, PLUGIN_3GX_FB_VADDR_END, plugin_fb_address); } } @@ -324,6 +320,7 @@ private: fcram.get(), save_n3ds_ram ? Memory::FCRAM_N3DS_SIZE : Memory::FCRAM_SIZE); ar& boost::serialization::make_binary_object( n3ds_extra_ram.get(), save_n3ds_ram ? Memory::N3DS_EXTRA_RAM_SIZE : 0); + ar& boost::serialization::make_binary_object(dsp_ram.get(), Memory::DSP_RAM_SIZE); ar & cache_marker; ar & page_table_list; // dsp is set from Core::System at startup @@ -332,6 +329,7 @@ private: ar & vram_mem; ar & n3ds_extra_ram_mem; ar & dsp_mem; + ar & plugin_fb_address; } }; @@ -390,6 +388,10 @@ void MemorySystem::RasterizerFlushVirtualRegion(VAddr start, u32 size, FlushMode impl->RasterizerFlushVirtualRegion(start, size, mode); } +PAddr& Memory::MemorySystem::Plugin3GXFramebufferAddress() { + return impl->plugin_fb_address; +} + void MemorySystem::MapPages(PageTable& page_table, u32 base, u32 size, MemoryRef memory, PageType type) { LOG_DEBUG(HW_Memory, "Mapping {} onto {:08X}-{:08X}", (void*)memory.GetPtr(), @@ -638,13 +640,10 @@ std::string MemorySystem::ReadCString(VAddr vaddr, std::size_t max_length) { return string; } -u8* MemorySystem::GetPhysicalPointer(PAddr address) { - return GetPhysicalRef(address); -} - -MemoryRef MemorySystem::GetPhysicalRef(PAddr address) { - if (address == physical_ptr_cache.first) { - return physical_ptr_cache.second; +MemorySystem::PhysMemRegionInfo MemorySystem::GetPhysMemRegionInfo(PAddr address) { + if (address >= phys_mem_region_info_cache.region_start && + address < phys_mem_region_info_cache.region_end) { + return phys_mem_region_info_cache; } constexpr std::array memory_areas = { @@ -661,38 +660,52 @@ MemoryRef MemorySystem::GetPhysicalRef(PAddr address) { }); if (area == memory_areas.end()) [[unlikely]] { - LOG_ERROR(HW_Memory, "Unknown GetPhysicalPointer @ {:#08X} at PC {:#08X}", address, + LOG_ERROR(HW_Memory, "Unknown GetPhysMemRegionInfo @ {:#08X} at PC {:#08X}", address, impl->GetPC()); - physical_ptr_cache = {address, {nullptr}}; - return physical_ptr_cache.second; + phys_mem_region_info_cache = PhysMemRegionInfo(); + return phys_mem_region_info_cache; } - u32 offset_into_region = address - area->first; - - std::shared_ptr target_mem = nullptr; switch (area->first) { case VRAM_PADDR: - target_mem = impl->vram_mem; + phys_mem_region_info_cache = {&impl->vram_mem, area->first, area->second}; break; case DSP_RAM_PADDR: - target_mem = impl->dsp_mem; + phys_mem_region_info_cache = {&impl->dsp_mem, area->first, area->second}; break; case FCRAM_PADDR: - target_mem = impl->fcram_mem; + phys_mem_region_info_cache = {&impl->fcram_mem, area->first, area->second}; break; case N3DS_EXTRA_RAM_PADDR: - target_mem = impl->n3ds_extra_ram_mem; + phys_mem_region_info_cache = {&impl->n3ds_extra_ram_mem, area->first, area->second}; break; default: UNREACHABLE(); } - if (offset_into_region > target_mem->GetSize()) [[unlikely]] { - physical_ptr_cache = {address, {nullptr}}; - return physical_ptr_cache.second; + + return phys_mem_region_info_cache; +} + +u8* MemorySystem::GetPhysicalPointer(PAddr address) { + auto target_mem = GetPhysMemRegionInfo(address); + + if (!target_mem.valid()) [[unlikely]] { + return {nullptr}; } - physical_ptr_cache = {address, {target_mem, offset_into_region}}; - return physical_ptr_cache.second; + u32 offset_into_region = address - target_mem.region_start; + return target_mem.backing_mem->get()->GetPtr() + offset_into_region; +} + +MemoryRef MemorySystem::GetPhysicalRef(PAddr address) { + const auto& target_mem = GetPhysMemRegionInfo(address); + + if (!target_mem.valid()) [[unlikely]] { + return {nullptr}; + } + + u32 offset_into_region = address - target_mem.region_start; + return {*target_mem.backing_mem, offset_into_region}; } std::vector MemorySystem::PhysicalToVirtualAddressForRasterizer(PAddr addr) { @@ -700,12 +713,9 @@ std::vector MemorySystem::PhysicalToVirtualAddressForRasterizer(PAddr add return {addr - VRAM_PADDR + VRAM_VADDR}; } // NOTE: Order matters here. - auto plg_ldr = Service::PLGLDR::GetService(impl->system); - if (plg_ldr) { - auto fb_addr = plg_ldr->GetPluginFBAddr(); - if (addr >= fb_addr && addr < fb_addr + PLUGIN_3GX_FB_SIZE) { - return {addr - fb_addr + PLUGIN_3GX_FB_VADDR}; - } + PAddr plg_fb_addr = Plugin3GXFramebufferAddress(); + if (plg_fb_addr && addr >= plg_fb_addr && addr < plg_fb_addr + PLUGIN_3GX_FB_SIZE) { + return {addr - plg_fb_addr + PLUGIN_3GX_FB_VADDR}; } if (addr >= FCRAM_PADDR && addr < FCRAM_PADDR_END) { return {addr - FCRAM_PADDR + LINEAR_HEAP_VADDR, addr - FCRAM_PADDR + NEW_LINEAR_HEAP_VADDR}; @@ -989,8 +999,9 @@ MemoryRef MemorySystem::GetFCRAMRef(std::size_t offset) const { return MemoryRef(impl->fcram_mem, offset); } -void MemorySystem::SetDSP(AudioCore::DspInterface& dsp) { - impl->dsp = &dsp; +u8* MemorySystem::GetDspMemory(std::size_t offset) const { + ASSERT(offset <= Memory::DSP_RAM_SIZE); + return impl->dsp_ram.get() + offset; } } // namespace Memory diff --git a/src/core/memory.h b/src/core/memory.h index a3245f8ca..5c215b3f2 100644 --- a/src/core/memory.h +++ b/src/core/memory.h @@ -641,10 +641,14 @@ public: /// Unregisters page table for rasterizer cache marking void UnregisterPageTable(std::shared_ptr page_table); - void SetDSP(AudioCore::DspInterface& dsp); + /// Gets pointer to DSP shared memory with given offset + u8* GetDspMemory(std::size_t offset) const; void RasterizerFlushVirtualRegion(VAddr start, u32 size, FlushMode mode); + /// Returns a reference to the framebuffer address of the currently loaded 3GX plugin. + PAddr& Plugin3GXFramebufferAddress(); + private: template T Read(const std::shared_ptr& page_table, const VAddr vaddr); @@ -663,14 +667,35 @@ private: */ MemoryRef GetPointerForRasterizerCache(VAddr addr) const; - void MapPages(PageTable& page_table, u32 base, u32 size, MemoryRef memory, PageType type); + class PhysMemRegionInfo { + public: + // Use a pointer to the shared pointer instead of the shared pointer directly to prevent + // overhead in hot code. + const std::shared_ptr* backing_mem{}; - std::pair physical_ptr_cache; + PAddr region_start{}; + PAddr region_end{}; + + PhysMemRegionInfo() = default; + + PhysMemRegionInfo(const std::shared_ptr* mem, PAddr reg_start, size_t reg_size) + : backing_mem(mem), region_start{reg_start}, + region_end{reg_start + static_cast(reg_size)} {} + + bool valid() const { + return backing_mem != nullptr; + } + }; + PhysMemRegionInfo GetPhysMemRegionInfo(PAddr address); + + void MapPages(PageTable& page_table, u32 base, u32 size, MemoryRef memory, PageType type); private: class Impl; std::unique_ptr impl; + PhysMemRegionInfo phys_mem_region_info_cache{}; + friend class boost::serialization::access; template void serialize(Archive& ar, const unsigned int file_version); diff --git a/src/tests/audio_core/hle/hle.cpp b/src/tests/audio_core/hle/hle.cpp index 09e7ec5ab..9c4396973 100644 --- a/src/tests/audio_core/hle/hle.cpp +++ b/src/tests/audio_core/hle/hle.cpp @@ -1,4 +1,4 @@ -// Copyright 2023 Citra Emulator Project +// Copyright Citra Emulator Project / Azahar Emulator Project // Licensed under GPLv2 or any later version // Refer to the license.txt file included. @@ -22,8 +22,7 @@ TEST_CASE("DSP LLE vs HLE", "[audio_core][hle]") { Memory::MemorySystem lle_memory{system}; Core::Timing lle_core_timing(1, 100); Kernel::KernelSystem lle_kernel( - lle_memory, lle_core_timing, [] {}, Kernel::MemoryMode::Prod, 1, - Kernel::New3dsHwCapabilities{false, false, Kernel::New3dsMemoryMode::Legacy}); + lle_memory, lle_core_timing, [] {}, Kernel::MemoryMode::NewProd, 1); AudioCore::DspHle hle(system, hle_memory, hle_core_timing); AudioCore::DspLle lle(system, lle_memory, lle_core_timing, true); diff --git a/src/tests/audio_core/merryhime_3ds_audio/merry_audio/service_fixture.cpp b/src/tests/audio_core/merryhime_3ds_audio/merry_audio/service_fixture.cpp index 9417cea97..7b3169920 100644 --- a/src/tests/audio_core/merryhime_3ds_audio/merry_audio/service_fixture.cpp +++ b/src/tests/audio_core/merryhime_3ds_audio/merry_audio/service_fixture.cpp @@ -1,3 +1,7 @@ +// Copyright Citra Emulator Project / Azahar Emulator Project +// Licensed under GPLv2 or any later version +// Refer to the license.txt file included. + #include "audio_core/hle/hle.h" #include "audio_core/lle/lle.h" #include "common/settings.h" @@ -85,7 +89,7 @@ Result ServiceFixture::DSP_ReadPipeIfPossible(u32 channel, u32 /*peer*/, void* o Result ServiceFixture::ServiceFixture::DSP_ConvertProcessAddressFromDspDram(u32 dsp_address, u16** host_address) { *host_address = reinterpret_cast( - (dsp_address << 1) + (reinterpret_cast(dsp->GetDspMemory().data()) + 0x40000u)); + (dsp_address << 1) + (reinterpret_cast(memory.GetDspMemory(0)) + 0x40000u)); return ResultSuccess; } diff --git a/src/tests/core/hle/kernel/hle_ipc.cpp b/src/tests/core/hle/kernel/hle_ipc.cpp index f908e5f2c..372ea563f 100644 --- a/src/tests/core/hle/kernel/hle_ipc.cpp +++ b/src/tests/core/hle/kernel/hle_ipc.cpp @@ -1,4 +1,4 @@ -// Copyright 2017 Citra Emulator Project +// Copyright Citra Emulator Project / Azahar Emulator Project // Licensed under GPLv2 or any later version // Refer to the license.txt file included. @@ -23,9 +23,7 @@ TEST_CASE("HLERequestContext::PopulateFromIncomingCommandBuffer", "[core][kernel Core::Timing timing(1, 100); Core::System system; Memory::MemorySystem memory{system}; - Kernel::KernelSystem kernel( - memory, timing, [] {}, Kernel::MemoryMode::Prod, 1, - Kernel::New3dsHwCapabilities{false, false, Kernel::New3dsMemoryMode::Legacy}); + Kernel::KernelSystem kernel(memory, timing, [] {}, Kernel::MemoryMode::NewProd, 1); auto [server, client] = kernel.CreateSessionPair(); HLERequestContext context(kernel, std::move(server), nullptr); @@ -256,9 +254,7 @@ TEST_CASE("HLERequestContext::WriteToOutgoingCommandBuffer", "[core][kernel]") { Core::Timing timing(1, 100); Core::System system; Memory::MemorySystem memory{system}; - Kernel::KernelSystem kernel( - memory, timing, [] {}, Kernel::MemoryMode::Prod, 1, - Kernel::New3dsHwCapabilities{false, false, Kernel::New3dsMemoryMode::Legacy}); + Kernel::KernelSystem kernel(memory, timing, [] {}, Kernel::MemoryMode::NewProd, 1); auto [server, client] = kernel.CreateSessionPair(); HLERequestContext context(kernel, std::move(server), nullptr); diff --git a/src/tests/core/memory/memory.cpp b/src/tests/core/memory/memory.cpp index 597ac5132..6254c3b0d 100644 --- a/src/tests/core/memory/memory.cpp +++ b/src/tests/core/memory/memory.cpp @@ -1,4 +1,4 @@ -// Copyright 2017 Citra Emulator Project +// Copyright Citra Emulator Project / Azahar Emulator Project // Licensed under GPLv2 or any later version // Refer to the license.txt file included. @@ -12,9 +12,7 @@ TEST_CASE("memory.IsValidVirtualAddress", "[core][memory]") { Core::Timing timing(1, 100); Core::System system; Memory::MemorySystem memory{system}; - Kernel::KernelSystem kernel( - memory, timing, [] {}, Kernel::MemoryMode::Prod, 1, - Kernel::New3dsHwCapabilities{false, false, Kernel::New3dsMemoryMode::Legacy}); + Kernel::KernelSystem kernel(memory, timing, [] {}, Kernel::MemoryMode::NewProd, 1); SECTION("these regions should not be mapped on an empty process") { auto process = kernel.CreateProcess(kernel.CreateCodeSet("", 0)); CHECK(memory.IsValidVirtualAddress(*process, Memory::PROCESS_IMAGE_VADDR) == false); diff --git a/src/tests/core/memory/vm_manager.cpp b/src/tests/core/memory/vm_manager.cpp index f58ad2e5b..c15760d8a 100644 --- a/src/tests/core/memory/vm_manager.cpp +++ b/src/tests/core/memory/vm_manager.cpp @@ -1,4 +1,4 @@ -// Copyright 2017 Citra Emulator Project +// Copyright Citra Emulator Project / Azahar Emulator Project // Licensed under GPLv2 or any later version // Refer to the license.txt file included. @@ -16,9 +16,7 @@ TEST_CASE("Memory Basics", "[kernel][memory]") { Core::Timing timing(1, 100); Core::System system; Memory::MemorySystem memory{system}; - Kernel::KernelSystem kernel( - memory, timing, [] {}, Kernel::MemoryMode::Prod, 1, - Kernel::New3dsHwCapabilities{false, false, Kernel::New3dsMemoryMode::Legacy}); + Kernel::KernelSystem kernel(memory, timing, [] {}, Kernel::MemoryMode::NewProd, 1); Kernel::Process process(kernel); SECTION("mapping memory") { // Because of the PageTable, Kernel::VMManager is too big to be created on the stack. diff --git a/src/tests/video_core/shader.cpp b/src/tests/video_core/shader.cpp index 8747808d2..db868a260 100644 --- a/src/tests/video_core/shader.cpp +++ b/src/tests/video_core/shader.cpp @@ -1,4 +1,4 @@ -// Copyright 2023 Citra Emulator Project +// Copyright Citra Emulator Project / Azahar Emulator Project // Licensed under GPLv2 or any later version // Refer to the license.txt file included. @@ -63,11 +63,15 @@ static std::unique_ptr CompileShaderSetup( const auto shbin = nihstro::InlineAsm::CompileToRawBinary(code); auto shader = std::make_unique(); - - std::transform(shbin.program.begin(), shbin.program.end(), shader->program_code.begin(), + Pica::ProgramCode program_code{}; + Pica::SwizzleData swizzle_data{}; + std::transform(shbin.program.begin(), shbin.program.end(), program_code.begin(), [](const auto& x) { return x.hex; }); - std::transform(shbin.swizzle_table.begin(), shbin.swizzle_table.end(), - shader->swizzle_data.begin(), [](const auto& x) { return x.hex; }); + std::transform(shbin.swizzle_table.begin(), shbin.swizzle_table.end(), swizzle_data.begin(), + [](const auto& x) { return x.hex; }); + + shader->UpdateProgramCode(program_code); + shader->UpdateSwizzleData(swizzle_data); return shader; } @@ -143,12 +147,16 @@ private: class ShaderJitTest : public ShaderTest { public: explicit ShaderJitTest(std::initializer_list code) : ShaderTest(code) { - shader_jit.Compile(&shader_setup->program_code, &shader_setup->swizzle_data); + const auto& program_code = shader_setup->GetProgramCode(); + const auto& swizzle_data = shader_setup->GetSwizzleData(); + shader_jit.Compile(&program_code, &swizzle_data); } explicit ShaderJitTest(std::unique_ptr input_shader_setup) : ShaderTest(std::move(input_shader_setup)) { - shader_jit.Compile(&shader_setup->program_code, &shader_setup->swizzle_data); + const auto& program_code = shader_setup->GetProgramCode(); + const auto& swizzle_data = shader_setup->GetSwizzleData(); + shader_jit.Compile(&program_code, &swizzle_data); } void RunShader(Pica::ShaderUnit& shader_unit, std::span inputs) override { @@ -210,12 +218,12 @@ SHADER_TEST_CASE("CALL", "[video_core][shader]") { // call foo CALL.flow_control.dest_offset = 2; CALL.flow_control.num_instructions = 1; - shader_setup->program_code[0] = CALL.hex; + shader_setup->UpdateProgramCode(0, CALL.hex); // call ex2 CALL.flow_control.dest_offset = 4; CALL.flow_control.num_instructions = 1; - shader_setup->program_code[2] = CALL.hex; + shader_setup->UpdateProgramCode(2, CALL.hex); auto shader = TestType(std::move(shader_setup)); @@ -608,7 +616,7 @@ SHADER_TEST_CASE("MAD", "[video_core][shader]") { MAD.mad.src2 = sh_input2; MAD.mad.src3 = sh_input3; MAD.mad.dest = sh_output; - shader_setup->program_code[0] = MAD.hex; + shader_setup->UpdateProgramCode(0, MAD.hex); nihstro::SwizzlePattern swizzle = {}; swizzle.dest_mask = 0b1111; @@ -624,7 +632,7 @@ SHADER_TEST_CASE("MAD", "[video_core][shader]") { swizzle.SetSelectorSrc3(1, SwizzlePattern::Selector::y); swizzle.SetSelectorSrc3(2, SwizzlePattern::Selector::z); swizzle.SetSelectorSrc3(3, SwizzlePattern::Selector::w); - shader_setup->swizzle_data[0] = swizzle.hex; + shader_setup->UpdateSwizzleData(0, swizzle.hex); auto shader = TestType(std::move(shader_setup)); @@ -713,7 +721,7 @@ SHADER_TEST_CASE("Conditional", "[video_core][shader]") { { auto shader_setup = CompileShaderSetup(assembly_template); IFC.flow_control.op = nihstro::Instruction::FlowControlType::Op::JustX; - shader_setup->program_code[0] = IFC.hex; + shader_setup->UpdateProgramCode(0, IFC.hex); const float result = result_x ? 1.0f : 0.0f; auto shader_test = TestType(std::move(shader_setup)); @@ -726,7 +734,7 @@ SHADER_TEST_CASE("Conditional", "[video_core][shader]") { { auto shader_setup = CompileShaderSetup(assembly_template); IFC.flow_control.op = nihstro::Instruction::FlowControlType::Op::JustY; - shader_setup->program_code[0] = IFC.hex; + shader_setup->UpdateProgramCode(0, IFC.hex); const float result = result_y ? 1.0f : 0.0f; auto shader_test = TestType(std::move(shader_setup)); @@ -739,7 +747,7 @@ SHADER_TEST_CASE("Conditional", "[video_core][shader]") { { auto shader_setup = CompileShaderSetup(assembly_template); IFC.flow_control.op = nihstro::Instruction::FlowControlType::Op::Or; - shader_setup->program_code[0] = IFC.hex; + shader_setup->UpdateProgramCode(0, IFC.hex); const float result = (result_x || result_y) ? 1.0f : 0.0f; auto shader_test = TestType(std::move(shader_setup)); @@ -752,7 +760,7 @@ SHADER_TEST_CASE("Conditional", "[video_core][shader]") { { auto shader_setup = CompileShaderSetup(assembly_template); IFC.flow_control.op = nihstro::Instruction::FlowControlType::Op::And; - shader_setup->program_code[0] = IFC.hex; + shader_setup->UpdateProgramCode(0, IFC.hex); const float result = (result_x && result_y) ? 1.0f : 0.0f; auto shader_test = TestType(std::move(shader_setup)); diff --git a/src/video_core/debug_utils/debug_utils.cpp b/src/video_core/debug_utils/debug_utils.cpp index 88ee841c1..9b76be5fc 100644 --- a/src/video_core/debug_utils/debug_utils.cpp +++ b/src/video_core/debug_utils/debug_utils.cpp @@ -1,5 +1,5 @@ -// Copyright 2014 Citra Emulator Project -// Licensed under GPLv2 +// Copyright Citra Emulator Project / Azahar Emulator Project +// Licensed under GPLv2 or any later version // Refer to the license.txt file included. #include @@ -184,17 +184,18 @@ void DumpShader(const std::string& filename, const ShaderRegs& config, const Sha dvlb.dvle_offset = QueueForWriting(reinterpret_cast(&dvle), sizeof(dvle)); // TODO: Reduce the amount of binary code written to relevant portions + const auto& program_code = setup.GetProgramCode(); dvlp.binary_offset = write_offset - dvlp_offset; - dvlp.binary_size_words = static_cast(setup.program_code.size()); - QueueForWriting(reinterpret_cast(setup.program_code.data()), - static_cast(setup.program_code.size()) * sizeof(u32)); + dvlp.binary_size_words = static_cast(program_code.size()); + QueueForWriting(reinterpret_cast(program_code.data()), + static_cast(program_code.size()) * sizeof(u32)); + const auto& swizzle_data = setup.GetSwizzleData(); dvlp.swizzle_info_offset = write_offset - dvlp_offset; - dvlp.swizzle_info_num_entries = static_cast(setup.swizzle_data.size()); + dvlp.swizzle_info_num_entries = static_cast(swizzle_data.size()); u32 dummy = 0; - for (unsigned int i = 0; i < setup.swizzle_data.size(); ++i) { - QueueForWriting(reinterpret_cast(&setup.swizzle_data[i]), - sizeof(setup.swizzle_data[i])); + for (unsigned int i = 0; i < swizzle_data.size(); ++i) { + QueueForWriting(reinterpret_cast(&swizzle_data[i]), sizeof(swizzle_data[i])); QueueForWriting(reinterpret_cast(&dummy), sizeof(dummy)); } @@ -272,7 +273,7 @@ void StartPicaTracing() { } void OnPicaRegWrite(u16 cmd_id, u16 mask, u32 value) { - if (!g_is_pica_tracing) + if (!g_is_pica_tracing) [[likely]] return; std::lock_guard lock(pica_trace_mutex); diff --git a/src/video_core/gpu.cpp b/src/video_core/gpu.cpp index 74d5eeb46..11516e5d6 100644 --- a/src/video_core/gpu.cpp +++ b/src/video_core/gpu.cpp @@ -57,11 +57,10 @@ PAddr GPU::VirtualToPhysicalAddress(VAddr addr) { if (addr >= Memory::NEW_LINEAR_HEAP_VADDR && addr <= Memory::NEW_LINEAR_HEAP_VADDR_END) { return addr - Memory::NEW_LINEAR_HEAP_VADDR + Memory::FCRAM_PADDR; } - if (addr >= Memory::PLUGIN_3GX_FB_VADDR && addr <= Memory::PLUGIN_3GX_FB_VADDR_END) { - auto plg_ldr = Service::PLGLDR::GetService(impl->system); - if (plg_ldr) { - return addr - Memory::PLUGIN_3GX_FB_VADDR + plg_ldr->GetPluginFBAddr(); - } + PAddr plg_fb_addr; + if (addr >= Memory::PLUGIN_3GX_FB_VADDR && addr <= Memory::PLUGIN_3GX_FB_VADDR_END && + (plg_fb_addr = impl->system.Memory().Plugin3GXFramebufferAddress())) { + return addr - Memory::PLUGIN_3GX_FB_VADDR + plg_fb_addr; } LOG_ERROR(HW_Memory, "Unknown virtual address @ 0x{:08X}", addr); diff --git a/src/video_core/pica/pica_core.cpp b/src/video_core/pica/pica_core.cpp index d12a986c1..a5768365d 100644 --- a/src/video_core/pica/pica_core.cpp +++ b/src/video_core/pica/pica_core.cpp @@ -258,8 +258,7 @@ void PicaCore::WriteInternalReg(u32 id, u32 value, u32 mask, bool& stop_requeste if (offset >= 4096) { LOG_ERROR(HW_GPU, "Invalid GS program offset {}", offset); } else { - gs_setup.program_code[offset] = value; - gs_setup.MarkProgramCodeDirty(); + gs_setup.UpdateProgramCode(offset, value); offset++; } break; @@ -274,11 +273,10 @@ void PicaCore::WriteInternalReg(u32 id, u32 value, u32 mask, bool& stop_requeste case PICA_REG_INDEX(gs.swizzle_patterns.set_word[6]): case PICA_REG_INDEX(gs.swizzle_patterns.set_word[7]): { u32& offset = regs.internal.gs.swizzle_patterns.offset; - if (offset >= gs_setup.swizzle_data.size()) { + if (offset >= gs_setup.GetSwizzleData().size()) { LOG_ERROR(HW_GPU, "Invalid GS swizzle pattern offset {}", offset); } else { - gs_setup.swizzle_data[offset] = value; - gs_setup.MarkSwizzleDataDirty(); + gs_setup.UpdateSwizzleData(offset, value); offset++; } break; @@ -340,11 +338,10 @@ void PicaCore::WriteInternalReg(u32 id, u32 value, u32 mask, bool& stop_requeste if (offset >= 512) { LOG_ERROR(HW_GPU, "Invalid VS program offset {}", offset); } else { - vs_setup.program_code[offset] = value; - vs_setup.MarkProgramCodeDirty(); - if (!regs.internal.pipeline.gs_unit_exclusive_configuration) { - gs_setup.program_code[offset] = value; - gs_setup.MarkProgramCodeDirty(); + vs_setup.UpdateProgramCode(offset, value); + if (!regs.internal.pipeline.gs_unit_exclusive_configuration && + regs.internal.pipeline.use_gs == PipelineRegs::UseGS::No) { + gs_setup.UpdateProgramCode(offset, value); } offset++; } @@ -360,14 +357,13 @@ void PicaCore::WriteInternalReg(u32 id, u32 value, u32 mask, bool& stop_requeste case PICA_REG_INDEX(vs.swizzle_patterns.set_word[6]): case PICA_REG_INDEX(vs.swizzle_patterns.set_word[7]): { u32& offset = regs.internal.vs.swizzle_patterns.offset; - if (offset >= vs_setup.swizzle_data.size()) { + if (offset >= vs_setup.GetSwizzleData().size()) { LOG_ERROR(HW_GPU, "Invalid VS swizzle pattern offset {}", offset); } else { - vs_setup.swizzle_data[offset] = value; - vs_setup.MarkSwizzleDataDirty(); - if (!regs.internal.pipeline.gs_unit_exclusive_configuration) { - gs_setup.swizzle_data[offset] = value; - gs_setup.MarkSwizzleDataDirty(); + vs_setup.UpdateSwizzleData(offset, value); + if (!regs.internal.pipeline.gs_unit_exclusive_configuration && + regs.internal.pipeline.use_gs == PipelineRegs::UseGS::No) { + gs_setup.UpdateSwizzleData(offset, value); } offset++; } diff --git a/src/video_core/pica/shader_setup.cpp b/src/video_core/pica/shader_setup.cpp index 70808b02f..64647a442 100644 --- a/src/video_core/pica/shader_setup.cpp +++ b/src/video_core/pica/shader_setup.cpp @@ -2,6 +2,7 @@ // Licensed under GPLv2 or any later version // Refer to the license.txt file included. +#include #include "common/assert.h" #include "common/bit_set.h" #include "common/hash.h" @@ -51,7 +52,9 @@ std::optional ShaderSetup::WriteUniformFloatReg(ShaderRegs& config, u32 val u64 ShaderSetup::GetProgramCodeHash() { if (program_code_hash_dirty) { - program_code_hash = Common::ComputeHash64(&program_code, sizeof(program_code)); + const auto& prog_code = GetProgramCode(); + program_code_hash = + Common::ComputeHash64(prog_code.data(), biggest_program_size * sizeof(u32)); program_code_hash_dirty = false; } return program_code_hash; @@ -59,10 +62,126 @@ u64 ShaderSetup::GetProgramCodeHash() { u64 ShaderSetup::GetSwizzleDataHash() { if (swizzle_data_hash_dirty) { - swizzle_data_hash = Common::ComputeHash64(&swizzle_data, sizeof(swizzle_data)); + swizzle_data_hash = + Common::ComputeHash64(swizzle_data.data(), biggest_swizzle_size * sizeof(u32)); swizzle_data_hash_dirty = false; } return swizzle_data_hash; } +void ShaderSetup::DoProgramCodeFixup() { + // This function holds shader fixups that are required for proper emulation of some games. As + // emulation gets more accurate the goal is to have this function as empty as possible. + // WARNING: If the hashing method is changed, the hashes of the different shaders will need + // adjustment. + + if (!requires_fixup || !program_code_pending_fixup) { + return; + } + program_code_pending_fixup = false; + + auto prepare_for_fixup = [this]() { + memcpy(program_code_fixup.data(), program_code.data(), program_code.size()); + has_fixup = true; + program_code_hash_dirty = true; + }; + + /** + * Affected games: + * Some Sega 3D Classics games. + * + * Problem: + * The geometry shaders used by some of the Sega 3D Classics have a shader + * (gf2_five_color_gshader.vsh) that presents two separate issues. + * + * - The shader does not have an "end" instruction. This causes the execution + * to be unbounded and start running whatever is in the code buffer after the end of the + * program. Usually this is filled with zeroes, which are add instructions that have no effect + * due to no more vertices being emitted. It's not clear what happens when the PC reaches + * 0x3FFC and is incremented. The most likely scenario is that it overflows back to the start, + * where there is an end instruction close by. This causes the game to execute around 4K + * instructions per vertex, which is very slow on emulator. + * + * - The shader relies on a HW bug or quirk that we do not currently understand or implement. + * The game builds a quad (4 vertices) using two inputs, the upper left coordinate, and the + * bottom right coordinate. The generated vertex coordinates are put in output register o0 + * before being emitted. Here is the pseudocode of the shader: + * o0.xyzw = leftTop.xyzw + * emit <- Emits the top left vertex + * o0._yzw = leftTop.xyzw + * o0.x___ = rightBottom.xyzw + * emit <- Emits the top right vertex + * o0._y__ = rightBottom.xyzw + * emit <- Emits the bottom left vertex (!) + * o0.xyzw = rightBottom.xyzw + * emit <- Emits the bottom right vertex + * + * This shader code has a bug. When the bottom left vertex is emitted, the y element is + * updated to the bottom coordinate, but the x element is left untouched. One would say that + * since the x element was last set to the RIGHT coordinate, the vertex would end up being + * drawn to the bottom RIGHT instead of the intended bottom LEFT (which is what we observe on + * the emulator). But on real HW, the vertex is drawn to the bottom LEFT instead. This + * suggests a HW bug or quirk that is triggered whenever some elements of an output register + * are not written to between emits. In order for the quad to look proper, the xzw elements + * should somehow keep the contents from the first emit, where the top left coordinate was + * written. The specifics of the HW bug that causes this are unknown. + * + * Solution: + * The following patches are made to fix the shaders: + * + * - An end instruction is inserted at the end of the shader to prevent unbounded execution. + * + * - Before the third vertex is emited and the y element of o0 is adjusted, a mov o0.xywz + * leftTop.xywz instruction is inserted to update the xzw elements of the output register to + * the expected values. This requires making room in the shader code, but luckily there are no + * jumps that need relocation. + * + */ + constexpr u64 SEGA_3D_CLASSICS_THUNDER_BLADE = 0x0797513756f2c8c9; + constexpr u64 SEGA_3D_CLASSICS_AFTER_BURNER = 0x188e959fbe31324d; + constexpr u64 SEGA_3D_CLASSICS_COLLECTION_TB = 0x5954c8e4d13cdd86; + constexpr u64 SEGA_3D_CLASSICS_COLLECTION_PD = 0x27496993b307355b; + + const auto fix_3d_classics_common = [this](u32 offset_base, u32 mov_swizzle) { + offset_base /= 4; + + // Make some room to insert an instruction + std::memmove(program_code_fixup.data() + offset_base + 1, + program_code_fixup.data() + offset_base, 0x1C); + + // mov o0.xyzw v0.xyzw (out.pos <- vLeftTop) + program_code_fixup[offset_base] = 0x4c000000 | mov_swizzle; + + // end + program_code_fixup[offset_base + 0x20] = 0x88000000; + + // Adjust biggest program size + if (biggest_program_size <= offset_base + 0x20) { + biggest_program_size = offset_base + 0x20 + 1; + } + }; + + // Select shader fixup + switch (GetProgramCodeHash()) { + case SEGA_3D_CLASSICS_THUNDER_BLADE: { + prepare_for_fixup(); + fix_3d_classics_common(0x510, 0xA); + } break; + case SEGA_3D_CLASSICS_AFTER_BURNER: { + prepare_for_fixup(); + fix_3d_classics_common(0x50C, 0xA); + } break; + case SEGA_3D_CLASSICS_COLLECTION_TB: { + prepare_for_fixup(); + fix_3d_classics_common(0xAE0, 0xC); + } break; + case SEGA_3D_CLASSICS_COLLECTION_PD: { + prepare_for_fixup(); + fix_3d_classics_common(0xAF0, 0xC); + } break; + default: + break; + } +} + } // namespace Pica diff --git a/src/video_core/pica/shader_setup.h b/src/video_core/pica/shader_setup.h index ad4981b95..8845e0cb9 100644 --- a/src/video_core/pica/shader_setup.h +++ b/src/video_core/pica/shader_setup.h @@ -51,6 +51,17 @@ struct ShaderRegs; * The geometry shaders has a unique configuration so when enabled it has its own setup. */ struct ShaderSetup { +private: + void MakeProgramCodeDirty() { + program_code_hash_dirty = true; + program_code_pending_fixup = true; + has_fixup = false; + } + + void MakeSwizzleDataDirty() { + swizzle_data_hash_dirty = true; + } + public: explicit ShaderSetup(); ~ShaderSetup(); @@ -65,28 +76,80 @@ public: u64 GetSwizzleDataHash(); - void MarkProgramCodeDirty() { - program_code_hash_dirty = true; + void DoProgramCodeFixup(); + + inline void UpdateProgramCode(size_t offset, u32 value) { + u32& inst = program_code[offset]; + u32 old = inst; + + if (old == value) + return; + + inst = value; + if (!program_code_hash_dirty) { + MakeProgramCodeDirty(); + } + if ((offset + 1) > biggest_program_size) { + biggest_program_size = offset + 1; + } } - void MarkSwizzleDataDirty() { - swizzle_data_hash_dirty = true; + void UpdateProgramCode(const ProgramCode& other) { + program_code = other; + biggest_program_size = program_code.size(); + MakeProgramCodeDirty(); + } + + inline void UpdateSwizzleData(size_t offset, u32 value) { + u32& data = swizzle_data[offset]; + u32 old = data; + + if (old == value) + return; + + data = value; + if (!swizzle_data_hash_dirty) { + MakeSwizzleDataDirty(); + } + if ((offset + 1) > biggest_swizzle_size) { + biggest_swizzle_size = offset + 1; + } + } + + void UpdateSwizzleData(const SwizzleData& other) { + swizzle_data = other; + biggest_swizzle_size = swizzle_data.size(); + MakeSwizzleDataDirty(); + } + + const ProgramCode& GetProgramCode() const { + return (has_fixup) ? program_code_fixup : program_code; + } + + const SwizzleData& GetSwizzleData() const { + return swizzle_data; } public: Uniforms uniforms; PackedAttribute uniform_queue; - ProgramCode program_code{}; - SwizzleData swizzle_data{}; u32 entry_point{}; const void* cached_shader{}; bool uniforms_dirty = true; + bool requires_fixup = false; + bool has_fixup = false; private: + ProgramCode program_code{}; + ProgramCode program_code_fixup{}; + SwizzleData swizzle_data{}; bool program_code_hash_dirty{true}; bool swizzle_data_hash_dirty{true}; - u64 program_code_hash{0xDEADC0DE}; - u64 swizzle_data_hash{0xDEADC0DE}; + bool program_code_pending_fixup{true}; + u32 biggest_program_size = 0; + u32 biggest_swizzle_size = 0; + u64 program_code_hash{0}; + u64 swizzle_data_hash{0}; friend class boost::serialization::access; template @@ -94,11 +157,17 @@ private: ar & uniforms; ar & uniform_queue; ar & program_code; + ar & program_code_fixup; ar & swizzle_data; ar & program_code_hash_dirty; ar & swizzle_data_hash_dirty; + ar & program_code_pending_fixup; + ar & biggest_program_size; + ar & biggest_swizzle_size; ar & program_code_hash; ar & swizzle_data_hash; + ar & requires_fixup; + ar & has_fixup; } }; diff --git a/src/video_core/rasterizer_cache/rasterizer_cache.h b/src/video_core/rasterizer_cache/rasterizer_cache.h index 65aa6aeca..09d936020 100644 --- a/src/video_core/rasterizer_cache/rasterizer_cache.h +++ b/src/video_core/rasterizer_cache/rasterizer_cache.h @@ -1053,9 +1053,10 @@ u64 RasterizerCache::ComputeHash(const SurfaceParams& load_info, std::span(width * height * bpp); DecodeTexture(load_info, load_info.addr, load_info.end, upload_data, decoded, false); - return Common::ComputeHash64(decoded.data(), decoded.size()); + return Common::ComputeHash64(decoded.data(), decoded.size()); } else { - return Common::ComputeHash64(upload_data.data(), upload_data.size()); + return Common::ComputeHash64(upload_data.data(), + upload_data.size()); } } diff --git a/src/video_core/renderer_opengl/gl_shader_manager.cpp b/src/video_core/renderer_opengl/gl_shader_manager.cpp index e70319ef3..7b91a1639 100644 --- a/src/video_core/renderer_opengl/gl_shader_manager.cpp +++ b/src/video_core/renderer_opengl/gl_shader_manager.cpp @@ -89,8 +89,8 @@ static std::tuple BuildVSConfigFromRaw( std::copy_n(raw.GetProgramCode().begin() + Pica::MAX_PROGRAM_CODE_LENGTH, Pica::MAX_SWIZZLE_DATA_LENGTH, swizzle_data.begin()); Pica::ShaderSetup setup; - setup.program_code = program_code; - setup.swizzle_data = swizzle_data; + setup.UpdateProgramCode(program_code); + setup.UpdateSwizzleData(swizzle_data); // Enable the geometry-shader only if we are actually doing per-fragment lighting // and care about proper quaternions. Otherwise just use standard vertex+fragment shaders @@ -354,12 +354,13 @@ bool ShaderProgramManager::UseProgrammableVertexShader(const Pica::RegsInternal& // Save VS to the disk cache if its a new shader if (result) { auto& disk_cache = impl->disk_cache; - ProgramCode program_code{setup.program_code.begin(), setup.program_code.end()}; - program_code.insert(program_code.end(), setup.swizzle_data.begin(), - setup.swizzle_data.end()); - const u64 unique_identifier = GetUniqueIdentifier(regs, program_code); + const auto& program_code = setup.GetProgramCode(); + const auto& swizzle_data = setup.GetSwizzleData(); + ProgramCode new_program_code{program_code.begin(), program_code.end()}; + new_program_code.insert(new_program_code.end(), swizzle_data.begin(), swizzle_data.end()); + const u64 unique_identifier = GetUniqueIdentifier(regs, new_program_code); const ShaderDiskCacheRaw raw{unique_identifier, ProgramType::VS, regs, - std::move(program_code)}; + std::move(new_program_code)}; disk_cache.SaveRaw(raw); disk_cache.SaveDecompiled(unique_identifier, *result, accurate_mul); } diff --git a/src/video_core/renderer_opengl/renderer_opengl.cpp b/src/video_core/renderer_opengl/renderer_opengl.cpp index 514de372c..967fd21fa 100644 --- a/src/video_core/renderer_opengl/renderer_opengl.cpp +++ b/src/video_core/renderer_opengl/renderer_opengl.cpp @@ -326,7 +326,7 @@ void RendererOpenGL::InitOpenGLObjects() { glSamplerParameteri(samplers[i].handle, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); } - ReloadShader(); + ReloadShader(Settings::values.render_3d.GetValue()); // Generate VBO handle for drawing vertex_buffer.Create(); @@ -372,10 +372,10 @@ void RendererOpenGL::InitOpenGLObjects() { state.Apply(); } -void RendererOpenGL::ReloadShader() { +void RendererOpenGL::ReloadShader(Settings::StereoRenderOption render_3d) { // Link shaders and get variable locations std::string shader_data = fragment_shader_precision_OES; - if (Settings::values.render_3d.GetValue() == Settings::StereoRenderOption::Anaglyph) { + if (render_3d == Settings::StereoRenderOption::Anaglyph) { if (Settings::values.anaglyph_shader_name.GetValue() == "Dubois (builtin)") { shader_data += HostShaders::OPENGL_PRESENT_ANAGLYPH_FRAG; } else { @@ -388,9 +388,8 @@ void RendererOpenGL::ReloadShader() { shader_data += shader_text; } } - } else if (Settings::values.render_3d.GetValue() == Settings::StereoRenderOption::Interlaced || - Settings::values.render_3d.GetValue() == - Settings::StereoRenderOption::ReverseInterlaced) { + } else if (render_3d == Settings::StereoRenderOption::Interlaced || + render_3d == Settings::StereoRenderOption::ReverseInterlaced) { shader_data += HostShaders::OPENGL_PRESENT_INTERLACED_FRAG; } else { if (Settings::values.pp_shader_name.GetValue() == "None (builtin)") { @@ -411,17 +410,16 @@ void RendererOpenGL::ReloadShader() { state.Apply(); uniform_modelview_matrix = glGetUniformLocation(shader.handle, "modelview_matrix"); uniform_color_texture = glGetUniformLocation(shader.handle, "color_texture"); - if (Settings::values.render_3d.GetValue() == Settings::StereoRenderOption::Anaglyph || - Settings::values.render_3d.GetValue() == Settings::StereoRenderOption::Interlaced || - Settings::values.render_3d.GetValue() == Settings::StereoRenderOption::ReverseInterlaced) { + if (render_3d == Settings::StereoRenderOption::Anaglyph || + render_3d == Settings::StereoRenderOption::Interlaced || + render_3d == Settings::StereoRenderOption::ReverseInterlaced) { uniform_color_texture_r = glGetUniformLocation(shader.handle, "color_texture_r"); } - if (Settings::values.render_3d.GetValue() == Settings::StereoRenderOption::Interlaced || - Settings::values.render_3d.GetValue() == Settings::StereoRenderOption::ReverseInterlaced) { + if (render_3d == Settings::StereoRenderOption::Interlaced || + render_3d == Settings::StereoRenderOption::ReverseInterlaced) { GLuint uniform_reverse_interlaced = glGetUniformLocation(shader.handle, "reverse_interlaced"); - if (Settings::values.render_3d.GetValue() == - Settings::StereoRenderOption::ReverseInterlaced) + if (render_3d == Settings::StereoRenderOption::ReverseInterlaced) glUniform1i(uniform_reverse_interlaced, 1); else glUniform1i(uniform_reverse_interlaced, 0); @@ -658,7 +656,7 @@ void RendererOpenGL::DrawScreens(const Layout::FramebufferLayout& layout, bool f // Update fragment shader before drawing shader.Release(); // Link shaders and get variable locations - ReloadShader(); + ReloadShader(layout.render_3d_mode); } const auto& top_screen = layout.top_screen; @@ -676,9 +674,9 @@ void RendererOpenGL::DrawScreens(const Layout::FramebufferLayout& layout, bool f glUniform1i(uniform_color_texture, 0); const bool stereo_single_screen = - Settings::values.render_3d.GetValue() == Settings::StereoRenderOption::Anaglyph || - Settings::values.render_3d.GetValue() == Settings::StereoRenderOption::Interlaced || - Settings::values.render_3d.GetValue() == Settings::StereoRenderOption::ReverseInterlaced; + layout.render_3d_mode == Settings::StereoRenderOption::Anaglyph || + layout.render_3d_mode == Settings::StereoRenderOption::Interlaced || + layout.render_3d_mode == Settings::StereoRenderOption::ReverseInterlaced; // Bind a second texture for the right eye if in Anaglyph mode if (stereo_single_screen) { @@ -689,12 +687,12 @@ void RendererOpenGL::DrawScreens(const Layout::FramebufferLayout& layout, bool f if (!Settings::values.swap_screen.GetValue()) { DrawTopScreen(layout, top_screen); glUniform1i(uniform_layer, 0); - ApplySecondLayerOpacity(layout.is_portrait); + ApplySecondLayerOpacity(layout.bottom_opacity); DrawBottomScreen(layout, bottom_screen); } else { DrawBottomScreen(layout, bottom_screen); glUniform1i(uniform_layer, 0); - ApplySecondLayerOpacity(layout.is_portrait); + ApplySecondLayerOpacity(layout.top_opacity); DrawTopScreen(layout, top_screen); } @@ -706,29 +704,23 @@ void RendererOpenGL::DrawScreens(const Layout::FramebufferLayout& layout, bool f DrawBottomScreen(layout, additional_screen); } } - ResetSecondLayerOpacity(layout.is_portrait); + ResetSecondLayerOpacity(); } -void RendererOpenGL::ApplySecondLayerOpacity(bool isPortrait) { - if (Settings::values.layout_option.GetValue() == Settings::LayoutOption::CustomLayout && - Settings::values.custom_second_layer_opacity.GetValue() < 100) { - state.blend.src_rgb_func = GL_CONSTANT_ALPHA; - state.blend.src_a_func = GL_CONSTANT_ALPHA; - state.blend.dst_a_func = GL_ONE_MINUS_CONSTANT_ALPHA; - state.blend.dst_rgb_func = GL_ONE_MINUS_CONSTANT_ALPHA; - state.blend.color.alpha = Settings::values.custom_second_layer_opacity.GetValue() / 100.0f; - } +void RendererOpenGL::ApplySecondLayerOpacity(float opacity) { + state.blend.src_rgb_func = GL_CONSTANT_ALPHA; + state.blend.src_a_func = GL_CONSTANT_ALPHA; + state.blend.dst_a_func = GL_ONE_MINUS_CONSTANT_ALPHA; + state.blend.dst_rgb_func = GL_ONE_MINUS_CONSTANT_ALPHA; + state.blend.color.alpha = opacity; } -void RendererOpenGL::ResetSecondLayerOpacity(bool isPortrait) { - if (Settings::values.layout_option.GetValue() == Settings::LayoutOption::CustomLayout && - Settings::values.custom_second_layer_opacity.GetValue() < 100) { - state.blend.src_rgb_func = GL_ONE; - state.blend.dst_rgb_func = GL_ZERO; - state.blend.src_a_func = GL_ONE; - state.blend.dst_a_func = GL_ZERO; - state.blend.color.alpha = 0.0f; - } +void RendererOpenGL::ResetSecondLayerOpacity() { + state.blend.src_rgb_func = GL_ONE; + state.blend.dst_rgb_func = GL_ZERO; + state.blend.src_a_func = GL_ONE; + state.blend.dst_a_func = GL_ZERO; + state.blend.color.alpha = 0.0f; } void RendererOpenGL::DrawTopScreen(const Layout::FramebufferLayout& layout, @@ -736,6 +728,9 @@ void RendererOpenGL::DrawTopScreen(const Layout::FramebufferLayout& layout, if (!layout.top_screen_enabled) { return; } + int leftside, rightside; + leftside = Settings::values.swap_eyes_3d.GetValue() ? 1 : 0; + rightside = Settings::values.swap_eyes_3d.GetValue() ? 0 : 1; const float top_screen_left = static_cast(top_screen.left); const float top_screen_top = static_cast(top_screen.top); @@ -744,7 +739,7 @@ void RendererOpenGL::DrawTopScreen(const Layout::FramebufferLayout& layout, const auto orientation = layout.is_rotated ? Layout::DisplayOrientation::Landscape : Layout::DisplayOrientation::Portrait; - switch (Settings::values.render_3d.GetValue()) { + switch (layout.render_3d_mode) { case Settings::StereoRenderOption::Off: { const int eye = static_cast(Settings::values.mono_render_option.GetValue()); DrawSingleScreen(screen_infos[eye], top_screen_left, top_screen_top, top_screen_width, @@ -752,29 +747,29 @@ void RendererOpenGL::DrawTopScreen(const Layout::FramebufferLayout& layout, break; } case Settings::StereoRenderOption::SideBySide: { - DrawSingleScreen(screen_infos[0], top_screen_left / 2, top_screen_top, top_screen_width / 2, - top_screen_height, orientation); + DrawSingleScreen(screen_infos[leftside], top_screen_left / 2, top_screen_top, + top_screen_width / 2, top_screen_height, orientation); glUniform1i(uniform_layer, 1); - DrawSingleScreen(screen_infos[1], + DrawSingleScreen(screen_infos[rightside], static_cast((top_screen_left / 2) + (layout.width / 2)), top_screen_top, top_screen_width / 2, top_screen_height, orientation); break; } - case Settings::StereoRenderOption::ReverseSideBySide: { - DrawSingleScreen(screen_infos[1], top_screen_left / 2, top_screen_top, top_screen_width / 2, + case Settings::StereoRenderOption::SideBySideFull: { + DrawSingleScreen(screen_infos[leftside], top_screen_left, top_screen_top, top_screen_width, top_screen_height, orientation); glUniform1i(uniform_layer, 1); - DrawSingleScreen(screen_infos[0], - static_cast((top_screen_left / 2) + (layout.width / 2)), - top_screen_top, top_screen_width / 2, top_screen_height, orientation); + DrawSingleScreen(screen_infos[rightside], + static_cast(top_screen_left + layout.width / 2), top_screen_top, + top_screen_width, top_screen_height, orientation); break; } case Settings::StereoRenderOption::CardboardVR: { - DrawSingleScreen(screen_infos[0], top_screen_left, top_screen_top, top_screen_width, + DrawSingleScreen(screen_infos[leftside], top_screen_left, top_screen_top, top_screen_width, top_screen_height, orientation); glUniform1i(uniform_layer, 1); DrawSingleScreen( - screen_infos[1], + screen_infos[rightside], static_cast(layout.cardboard.top_screen_right_eye + (layout.width / 2)), top_screen_top, top_screen_width, top_screen_height, orientation); break; @@ -782,8 +777,8 @@ void RendererOpenGL::DrawTopScreen(const Layout::FramebufferLayout& layout, case Settings::StereoRenderOption::Anaglyph: case Settings::StereoRenderOption::Interlaced: case Settings::StereoRenderOption::ReverseInterlaced: { - DrawSingleScreenStereo(screen_infos[0], screen_infos[1], top_screen_left, top_screen_top, - top_screen_width, top_screen_height, orientation); + DrawSingleScreenStereo(screen_infos[leftside], screen_infos[rightside], top_screen_left, + top_screen_top, top_screen_width, top_screen_height, orientation); break; } } @@ -803,31 +798,30 @@ void RendererOpenGL::DrawBottomScreen(const Layout::FramebufferLayout& layout, const auto orientation = layout.is_rotated ? Layout::DisplayOrientation::Landscape : Layout::DisplayOrientation::Portrait; - bool separate_win = false; -#ifndef ANDROID - separate_win = - (Settings::values.layout_option.GetValue() == Settings::LayoutOption::SeparateWindows); -#endif - - switch (Settings::values.render_3d.GetValue()) { + switch (layout.render_3d_mode) { case Settings::StereoRenderOption::Off: { DrawSingleScreen(screen_infos[2], bottom_screen_left, bottom_screen_top, bottom_screen_width, bottom_screen_height, orientation); break; } case Settings::StereoRenderOption::SideBySide: // Bottom screen is identical on both sides - case Settings::StereoRenderOption::ReverseSideBySide: { - if (separate_win) { - DrawSingleScreen(screen_infos[2], bottom_screen_left, bottom_screen_top, - bottom_screen_width, bottom_screen_height, orientation); - } else { - DrawSingleScreen(screen_infos[2], bottom_screen_left / 2, bottom_screen_top, - bottom_screen_width / 2, bottom_screen_height, orientation); - glUniform1i(uniform_layer, 1); - DrawSingleScreen( - screen_infos[2], static_cast((bottom_screen_left / 2) + (layout.width / 2)), - bottom_screen_top, bottom_screen_width / 2, bottom_screen_height, orientation); - } + { + + DrawSingleScreen(screen_infos[2], bottom_screen_left / 2, bottom_screen_top, + bottom_screen_width / 2, bottom_screen_height, orientation); + glUniform1i(uniform_layer, 1); + DrawSingleScreen( + screen_infos[2], static_cast((bottom_screen_left / 2) + (layout.width / 2)), + bottom_screen_top, bottom_screen_width / 2, bottom_screen_height, orientation); + + break; + } + case Settings::StereoRenderOption::SideBySideFull: { + DrawSingleScreen(screen_infos[2], bottom_screen_left, bottom_screen_top, + bottom_screen_width, bottom_screen_height, orientation); + glUniform1i(uniform_layer, 1); + DrawSingleScreen(screen_infos[2], bottom_screen_left + layout.width / 2, bottom_screen_top, + bottom_screen_width, bottom_screen_height, orientation); break; } case Settings::StereoRenderOption::CardboardVR: { diff --git a/src/video_core/renderer_opengl/renderer_opengl.h b/src/video_core/renderer_opengl/renderer_opengl.h index 7fa1af976..2f2b318ed 100644 --- a/src/video_core/renderer_opengl/renderer_opengl.h +++ b/src/video_core/renderer_opengl/renderer_opengl.h @@ -56,7 +56,7 @@ public: private: void InitOpenGLObjects(); - void ReloadShader(); + void ReloadShader(Settings::StereoRenderOption render_3d); void PrepareRendertarget(); void RenderScreenshot(); void RenderToMailbox(const Layout::FramebufferLayout& layout, @@ -65,8 +65,8 @@ private: const Pica::FramebufferConfig& framebuffer, const Pica::ColorFill& color_fill); void DrawScreens(const Layout::FramebufferLayout& layout, bool flipped); - void ApplySecondLayerOpacity(bool isPortrait = false); - void ResetSecondLayerOpacity(bool isPortrait = false); + void ApplySecondLayerOpacity(float opacity = 1.0f); + void ResetSecondLayerOpacity(); void DrawBottomScreen(const Layout::FramebufferLayout& layout, const Common::Rectangle& bottom_screen); void DrawTopScreen(const Layout::FramebufferLayout& layout, diff --git a/src/video_core/renderer_vulkan/renderer_vulkan.cpp b/src/video_core/renderer_vulkan/renderer_vulkan.cpp index 4a78d4b1a..51f5b2c7f 100644 --- a/src/video_core/renderer_vulkan/renderer_vulkan.cpp +++ b/src/video_core/renderer_vulkan/renderer_vulkan.cpp @@ -575,8 +575,7 @@ void RendererVulkan::FillScreen(Common::Vec3 color, const TextureInfo& textu }); } -void RendererVulkan::ReloadPipeline() { - const Settings::StereoRenderOption render_3d = Settings::values.render_3d.GetValue(); +void RendererVulkan::ReloadPipeline(Settings::StereoRenderOption render_3d) { switch (render_3d) { case Settings::StereoRenderOption::Anaglyph: current_pipeline = 1; @@ -748,7 +747,9 @@ void RendererVulkan::DrawTopScreen(const Layout::FramebufferLayout& layout, if (!layout.top_screen_enabled) { return; } - + int leftside, rightside; + leftside = Settings::values.swap_eyes_3d.GetValue() ? 1 : 0; + rightside = Settings::values.swap_eyes_3d.GetValue() ? 0 : 1; const float top_screen_left = static_cast(top_screen.left); const float top_screen_top = static_cast(top_screen.top); const float top_screen_width = static_cast(top_screen.GetWidth()); @@ -756,7 +757,7 @@ void RendererVulkan::DrawTopScreen(const Layout::FramebufferLayout& layout, const auto orientation = layout.is_rotated ? Layout::DisplayOrientation::Landscape : Layout::DisplayOrientation::Portrait; - switch (Settings::values.render_3d.GetValue()) { + switch (layout.render_3d_mode) { case Settings::StereoRenderOption::Off: { const int eye = static_cast(Settings::values.mono_render_option.GetValue()); DrawSingleScreen(eye, top_screen_left, top_screen_top, top_screen_width, top_screen_height, @@ -764,35 +765,36 @@ void RendererVulkan::DrawTopScreen(const Layout::FramebufferLayout& layout, break; } case Settings::StereoRenderOption::SideBySide: { - DrawSingleScreen(0, top_screen_left / 2, top_screen_top, top_screen_width / 2, + DrawSingleScreen(leftside, top_screen_left / 2, top_screen_top, top_screen_width / 2, top_screen_height, orientation); draw_info.layer = 1; - DrawSingleScreen(1, static_cast((top_screen_left / 2) + (layout.width / 2)), + DrawSingleScreen(rightside, static_cast((top_screen_left / 2) + (layout.width / 2)), top_screen_top, top_screen_width / 2, top_screen_height, orientation); break; } - case Settings::StereoRenderOption::ReverseSideBySide: { - DrawSingleScreen(1, top_screen_left / 2, top_screen_top, top_screen_width / 2, + case Settings::StereoRenderOption::SideBySideFull: { + DrawSingleScreen(leftside, top_screen_left, top_screen_top, top_screen_width, top_screen_height, orientation); draw_info.layer = 1; - DrawSingleScreen(0, static_cast((top_screen_left / 2) + (layout.width / 2)), - top_screen_top, top_screen_width / 2, top_screen_height, orientation); + DrawSingleScreen(rightside, top_screen_left + layout.width / 2, top_screen_top, + top_screen_width, top_screen_height, orientation); break; } case Settings::StereoRenderOption::CardboardVR: { - DrawSingleScreen(0, top_screen_left, top_screen_top, top_screen_width, top_screen_height, - orientation); + DrawSingleScreen(leftside, top_screen_left, top_screen_top, top_screen_width, + top_screen_height, orientation); draw_info.layer = 1; DrawSingleScreen( - 1, static_cast(layout.cardboard.top_screen_right_eye + (layout.width / 2)), + rightside, + static_cast(layout.cardboard.top_screen_right_eye + (layout.width / 2)), top_screen_top, top_screen_width, top_screen_height, orientation); break; } case Settings::StereoRenderOption::Anaglyph: case Settings::StereoRenderOption::Interlaced: case Settings::StereoRenderOption::ReverseInterlaced: { - DrawSingleScreenStereo(0, 1, top_screen_left, top_screen_top, top_screen_width, - top_screen_height, orientation); + DrawSingleScreenStereo(leftside, rightside, top_screen_left, top_screen_top, + top_screen_width, top_screen_height, orientation); break; } } @@ -812,31 +814,29 @@ void RendererVulkan::DrawBottomScreen(const Layout::FramebufferLayout& layout, const auto orientation = layout.is_rotated ? Layout::DisplayOrientation::Landscape : Layout::DisplayOrientation::Portrait; - bool separate_win = false; -#ifndef ANDROID - separate_win = - (Settings::values.layout_option.GetValue() == Settings::LayoutOption::SeparateWindows); -#endif - - switch (Settings::values.render_3d.GetValue()) { + switch (layout.render_3d_mode) { case Settings::StereoRenderOption::Off: { DrawSingleScreen(2, bottom_screen_left, bottom_screen_top, bottom_screen_width, bottom_screen_height, orientation); + break; } case Settings::StereoRenderOption::SideBySide: // Bottom screen is identical on both sides - case Settings::StereoRenderOption::ReverseSideBySide: { - if (separate_win) { - DrawSingleScreen(2, bottom_screen_left, bottom_screen_top, bottom_screen_width, - bottom_screen_height, orientation); - } else { - DrawSingleScreen(2, bottom_screen_left / 2, bottom_screen_top, bottom_screen_width / 2, - bottom_screen_height, orientation); - draw_info.layer = 1; - DrawSingleScreen(2, static_cast((bottom_screen_left / 2) + (layout.width / 2)), - bottom_screen_top, bottom_screen_width / 2, bottom_screen_height, - orientation); - } + { + DrawSingleScreen(2, bottom_screen_left / 2, bottom_screen_top, bottom_screen_width / 2, + bottom_screen_height, orientation); + draw_info.layer = 1; + DrawSingleScreen(2, static_cast((bottom_screen_left / 2) + (layout.width / 2)), + bottom_screen_top, bottom_screen_width / 2, bottom_screen_height, + orientation); + break; + } + case Settings::StereoRenderOption::SideBySideFull: { + DrawSingleScreen(2, bottom_screen_left, bottom_screen_top, bottom_screen_width, + bottom_screen_height, orientation); + draw_info.layer = 1; + DrawSingleScreen(2, bottom_screen_left + layout.width / 2, bottom_screen_top, + bottom_screen_width, bottom_screen_height, orientation); break; } case Settings::StereoRenderOption::CardboardVR: { @@ -851,13 +851,8 @@ void RendererVulkan::DrawBottomScreen(const Layout::FramebufferLayout& layout, case Settings::StereoRenderOption::Anaglyph: case Settings::StereoRenderOption::Interlaced: case Settings::StereoRenderOption::ReverseInterlaced: { - if (separate_win) { - DrawSingleScreen(2, bottom_screen_left, bottom_screen_top, bottom_screen_width, - bottom_screen_height, orientation); - } else { - DrawSingleScreenStereo(2, 2, bottom_screen_left, bottom_screen_top, bottom_screen_width, - bottom_screen_height, orientation); - } + DrawSingleScreenStereo(2, 2, bottom_screen_left, bottom_screen_top, bottom_screen_width, + bottom_screen_height, orientation); break; } } @@ -871,7 +866,7 @@ void RendererVulkan::DrawScreens(Frame* frame, const Layout::FramebufferLayout& clear_color.float32[2] = Settings::values.bg_blue.GetValue(); } if (settings.shader_update_requested.exchange(false)) { - ReloadPipeline(); + ReloadPipeline(layout.render_3d_mode); } PrepareDraw(frame, layout); @@ -885,25 +880,18 @@ void RendererVulkan::DrawScreens(Frame* frame, const Layout::FramebufferLayout& // Apply the initial default opacity value; Needed to avoid flickering ApplySecondLayerOpacity(1.0f); - bool use_custom_opacity = - Settings::values.layout_option.GetValue() == Settings::LayoutOption::CustomLayout && - Settings::values.custom_second_layer_opacity.GetValue() < 100; - float second_alpha = use_custom_opacity - ? Settings::values.custom_second_layer_opacity.GetValue() / 100.0f - : 1.0f; - if (!Settings::values.swap_screen.GetValue()) { DrawTopScreen(layout, top_screen); draw_info.layer = 0; - if (use_custom_opacity) { - ApplySecondLayerOpacity(second_alpha); + if (layout.bottom_opacity < 1) { + ApplySecondLayerOpacity(layout.bottom_opacity); } DrawBottomScreen(layout, bottom_screen); } else { DrawBottomScreen(layout, bottom_screen); draw_info.layer = 0; - if (use_custom_opacity) { - ApplySecondLayerOpacity(second_alpha); + if (layout.top_opacity < 1) { + ApplySecondLayerOpacity(layout.top_opacity); } DrawTopScreen(layout, top_screen); } diff --git a/src/video_core/renderer_vulkan/renderer_vulkan.h b/src/video_core/renderer_vulkan/renderer_vulkan.h index 15807a4f3..29ed8a66e 100644 --- a/src/video_core/renderer_vulkan/renderer_vulkan.h +++ b/src/video_core/renderer_vulkan/renderer_vulkan.h @@ -80,7 +80,7 @@ public: void TryPresent(int timeout_ms, bool is_secondary) override {} private: - void ReloadPipeline(); + void ReloadPipeline(Settings::StereoRenderOption render_3d); void CompileShaders(); void BuildLayouts(); void BuildPipelines(); diff --git a/src/video_core/renderer_vulkan/vk_blit_helper.cpp b/src/video_core/renderer_vulkan/vk_blit_helper.cpp index 0a7a3be44..679ab3dcd 100644 --- a/src/video_core/renderer_vulkan/vk_blit_helper.cpp +++ b/src/video_core/renderer_vulkan/vk_blit_helper.cpp @@ -1,7 +1,8 @@ -// Copyright 2022 Citra Emulator Project +// Copyright Citra Emulator Project / Azahar Emulator Project // Licensed under GPLv2 or any later version // Refer to the license.txt file included. +#include "common/settings.h" #include "common/vector_math.h" #include "video_core/renderer_vulkan/vk_blit_helper.h" #include "video_core/renderer_vulkan/vk_descriptor_update_queue.h" @@ -16,8 +17,19 @@ #include "video_core/host_shaders/vulkan_blit_depth_stencil_frag.h" #include "video_core/host_shaders/vulkan_depth_to_buffer_comp.h" +// Texture filtering shader includes +#include "video_core/host_shaders/texture_filtering/bicubic_frag.h" +#include "video_core/host_shaders/texture_filtering/mmpx_frag.h" +#include "video_core/host_shaders/texture_filtering/refine_frag.h" +#include "video_core/host_shaders/texture_filtering/scale_force_frag.h" +#include "video_core/host_shaders/texture_filtering/x_gradient_frag.h" +#include "video_core/host_shaders/texture_filtering/xbrz_freescale_frag.h" +#include "video_core/host_shaders/texture_filtering/y_gradient_frag.h" +#include "vk_blit_helper.h" + namespace Vulkan { +using Settings::TextureFilter; using VideoCore::PixelFormat; namespace { @@ -55,8 +67,33 @@ constexpr std::array TWO_TEXTURES_BINDINGS = {1, vk::DescriptorType::eCombinedImageSampler, 1, vk::ShaderStageFlagBits::eFragment}, }}; +// Texture filtering descriptor set bindings +constexpr std::array SINGLE_TEXTURE_BINDINGS = {{ + {0, vk::DescriptorType::eCombinedImageSampler, 1, vk::ShaderStageFlagBits::eFragment}, +}}; + +constexpr std::array THREE_TEXTURES_BINDINGS = {{ + {0, vk::DescriptorType::eCombinedImageSampler, 1, vk::ShaderStageFlagBits::eFragment}, + {1, vk::DescriptorType::eCombinedImageSampler, 1, vk::ShaderStageFlagBits::eFragment}, + {2, vk::DescriptorType::eCombinedImageSampler, 1, vk::ShaderStageFlagBits::eFragment}, +}}; + +// Note: Removed FILTER_UTILITY_BINDINGS as texture filtering doesn't need shadow buffers + +// Push constant structure for texture filtering +struct FilterPushConstants { + std::array tex_scale; + std::array tex_offset; + float res_scale; // For xBRZ filter +}; + +inline constexpr vk::PushConstantRange FILTER_PUSH_CONSTANT_RANGE{ + .stageFlags = vk::ShaderStageFlagBits::eVertex | vk::ShaderStageFlagBits::eFragment, + .offset = 0, + .size = sizeof(FilterPushConstants), +}; inline constexpr vk::PushConstantRange PUSH_CONSTANT_RANGE{ - .stageFlags = vk::ShaderStageFlagBits::eVertex, + .stageFlags = vk::ShaderStageFlagBits::eVertex | vk::ShaderStageFlagBits::eFragment, .offset = 0, .size = sizeof(PushConstants), }; @@ -104,12 +141,17 @@ constexpr vk::PipelineDynamicStateCreateInfo PIPELINE_DYNAMIC_STATE_CREATE_INFO{ .dynamicStateCount = static_cast(DYNAMIC_STATES.size()), .pDynamicStates = DYNAMIC_STATES.data(), }; -constexpr vk::PipelineColorBlendStateCreateInfo PIPELINE_COLOR_BLEND_STATE_EMPTY_CREATE_INFO{ + +constexpr vk::PipelineColorBlendAttachmentState COLOR_BLEND_ATTACHMENT{ + .blendEnable = VK_FALSE, + .colorWriteMask = vk::ColorComponentFlagBits::eR | vk::ColorComponentFlagBits::eG | + vk::ColorComponentFlagBits::eB | vk::ColorComponentFlagBits::eA, +}; + +constexpr vk::PipelineColorBlendStateCreateInfo PIPELINE_COLOR_BLEND_STATE_CREATE_INFO{ .logicOpEnable = VK_FALSE, - .logicOp = vk::LogicOp::eClear, - .attachmentCount = 0, - .pAttachments = nullptr, - .blendConstants = std::array{0.0f, 0.0f, 0.0f, 0.0f}, + .attachmentCount = 1, + .pAttachments = &COLOR_BLEND_ATTACHMENT, }; constexpr vk::PipelineDepthStencilStateCreateInfo PIPELINE_DEPTH_STENCIL_STATE_CREATE_INFO{ .depthTestEnable = VK_TRUE, @@ -128,9 +170,9 @@ inline constexpr vk::SamplerCreateInfo SAMPLER_CREATE_INFO{ .magFilter = filter, .minFilter = filter, .mipmapMode = vk::SamplerMipmapMode::eNearest, - .addressModeU = vk::SamplerAddressMode::eClampToBorder, - .addressModeV = vk::SamplerAddressMode::eClampToBorder, - .addressModeW = vk::SamplerAddressMode::eClampToBorder, + .addressModeU = vk::SamplerAddressMode::eClampToEdge, + .addressModeV = vk::SamplerAddressMode::eClampToEdge, + .addressModeW = vk::SamplerAddressMode::eClampToEdge, .mipLodBias = 0.0f, .anisotropyEnable = VK_FALSE, .maxAnisotropy = 0.0f, @@ -143,12 +185,14 @@ inline constexpr vk::SamplerCreateInfo SAMPLER_CREATE_INFO{ }; constexpr vk::PipelineLayoutCreateInfo PipelineLayoutCreateInfo( - const vk::DescriptorSetLayout* set_layout, bool compute = false) { + const vk::DescriptorSetLayout* set_layout, bool compute = false, bool filter = false) { return vk::PipelineLayoutCreateInfo{ .setLayoutCount = 1, .pSetLayouts = set_layout, .pushConstantRangeCount = 1, - .pPushConstantRanges = (compute ? &COMPUTE_PUSH_CONSTANT_RANGE : &PUSH_CONSTANT_RANGE), + .pPushConstantRanges = + (compute ? &COMPUTE_PUSH_CONSTANT_RANGE + : (filter ? &FILTER_PUSH_CONSTANT_RANGE : &PUSH_CONSTANT_RANGE)), }; } @@ -185,12 +229,20 @@ BlitHelper::BlitHelper(const Instance& instance_, Scheduler& scheduler_, compute_provider{instance, scheduler.GetMasterSemaphore(), COMPUTE_BINDINGS}, compute_buffer_provider{instance, scheduler.GetMasterSemaphore(), COMPUTE_BUFFER_BINDINGS}, two_textures_provider{instance, scheduler.GetMasterSemaphore(), TWO_TEXTURES_BINDINGS, 16}, + single_texture_provider{instance, scheduler.GetMasterSemaphore(), SINGLE_TEXTURE_BINDINGS, + 16}, + three_textures_provider{instance, scheduler.GetMasterSemaphore(), THREE_TEXTURES_BINDINGS, + 16}, compute_pipeline_layout{ device.createPipelineLayout(PipelineLayoutCreateInfo(&compute_provider.Layout(), true))}, compute_buffer_pipeline_layout{device.createPipelineLayout( PipelineLayoutCreateInfo(&compute_buffer_provider.Layout(), true))}, two_textures_pipeline_layout{ device.createPipelineLayout(PipelineLayoutCreateInfo(&two_textures_provider.Layout()))}, + single_texture_pipeline_layout{device.createPipelineLayout( + PipelineLayoutCreateInfo(&single_texture_provider.Layout(), false, true))}, + three_textures_pipeline_layout{device.createPipelineLayout( + PipelineLayoutCreateInfo(&three_textures_provider.Layout(), false, true))}, full_screen_vert{Compile(HostShaders::FULL_SCREEN_TRIANGLE_VERT, vk::ShaderStageFlagBits::eVertex, device)}, d24s8_to_rgba8_comp{Compile(HostShaders::VULKAN_D24S8_TO_RGBA8_COMP, @@ -199,10 +251,24 @@ BlitHelper::BlitHelper(const Instance& instance_, Scheduler& scheduler_, vk::ShaderStageFlagBits::eCompute, device)}, blit_depth_stencil_frag{Compile(HostShaders::VULKAN_BLIT_DEPTH_STENCIL_FRAG, vk::ShaderStageFlagBits::eFragment, device)}, + // Texture filtering shader modules + bicubic_frag{Compile(HostShaders::BICUBIC_FRAG, vk::ShaderStageFlagBits::eFragment, device)}, + scale_force_frag{ + Compile(HostShaders::SCALE_FORCE_FRAG, vk::ShaderStageFlagBits::eFragment, device)}, + xbrz_frag{ + Compile(HostShaders::XBRZ_FREESCALE_FRAG, vk::ShaderStageFlagBits::eFragment, device)}, + mmpx_frag{Compile(HostShaders::MMPX_FRAG, vk::ShaderStageFlagBits::eFragment, device)}, + refine_frag{Compile(HostShaders::REFINE_FRAG, vk::ShaderStageFlagBits::eFragment, device)}, d24s8_to_rgba8_pipeline{MakeComputePipeline(d24s8_to_rgba8_comp, compute_pipeline_layout)}, depth_to_buffer_pipeline{ MakeComputePipeline(depth_to_buffer_comp, compute_buffer_pipeline_layout)}, depth_blit_pipeline{MakeDepthStencilBlitPipeline()}, + // Texture filtering pipelines + bicubic_pipeline{MakeFilterPipeline(bicubic_frag, single_texture_pipeline_layout)}, + scale_force_pipeline{MakeFilterPipeline(scale_force_frag, single_texture_pipeline_layout)}, + xbrz_pipeline{MakeFilterPipeline(xbrz_frag, single_texture_pipeline_layout)}, + mmpx_pipeline{MakeFilterPipeline(mmpx_frag, single_texture_pipeline_layout)}, + refine_pipeline{MakeFilterPipeline(refine_frag, three_textures_pipeline_layout)}, linear_sampler{device.createSampler(SAMPLER_CREATE_INFO)}, nearest_sampler{device.createSampler(SAMPLER_CREATE_INFO)} { @@ -230,19 +296,33 @@ BlitHelper::~BlitHelper() { device.destroyPipelineLayout(compute_pipeline_layout); device.destroyPipelineLayout(compute_buffer_pipeline_layout); device.destroyPipelineLayout(two_textures_pipeline_layout); + device.destroyPipelineLayout(single_texture_pipeline_layout); + device.destroyPipelineLayout(three_textures_pipeline_layout); device.destroyShaderModule(full_screen_vert); device.destroyShaderModule(d24s8_to_rgba8_comp); device.destroyShaderModule(depth_to_buffer_comp); device.destroyShaderModule(blit_depth_stencil_frag); + // Destroy texture filtering shader modules + device.destroyShaderModule(bicubic_frag); + device.destroyShaderModule(scale_force_frag); + device.destroyShaderModule(xbrz_frag); + device.destroyShaderModule(mmpx_frag); + device.destroyShaderModule(refine_frag); device.destroyPipeline(depth_to_buffer_pipeline); device.destroyPipeline(d24s8_to_rgba8_pipeline); device.destroyPipeline(depth_blit_pipeline); + // Destroy texture filtering pipelines + device.destroyPipeline(bicubic_pipeline); + device.destroyPipeline(scale_force_pipeline); + device.destroyPipeline(xbrz_pipeline); + device.destroyPipeline(mmpx_pipeline); + device.destroyPipeline(refine_pipeline); device.destroySampler(linear_sampler); device.destroySampler(nearest_sampler); } void BindBlitState(vk::CommandBuffer cmdbuf, vk::PipelineLayout layout, - const VideoCore::TextureBlit& blit) { + const VideoCore::TextureBlit& blit, const Surface& dest) { const vk::Offset2D offset{ .x = std::min(blit.dst_rect.left, blit.dst_rect.right), .y = std::min(blit.dst_rect.bottom, blit.dst_rect.top), @@ -272,8 +352,9 @@ void BindBlitState(vk::CommandBuffer cmdbuf, vk::PipelineLayout layout, }; cmdbuf.setViewport(0, viewport); cmdbuf.setScissor(0, scissor); - cmdbuf.pushConstants(layout, vk::ShaderStageFlagBits::eVertex, 0, sizeof(push_constants), - &push_constants); + cmdbuf.pushConstants(layout, + vk::ShaderStageFlagBits::eVertex | vk::ShaderStageFlagBits::eFragment, 0, + sizeof(push_constants), &push_constants); } bool BlitHelper::BlitDepthStencil(Surface& source, Surface& dest, @@ -300,12 +381,12 @@ bool BlitHelper::BlitDepthStencil(Surface& source, Surface& dest, }; renderpass_cache.BeginRendering(depth_pass); - scheduler.Record([blit, descriptor_set, this](vk::CommandBuffer cmdbuf) { + scheduler.Record([blit, descriptor_set, &dest, this](vk::CommandBuffer cmdbuf) { const vk::PipelineLayout layout = two_textures_pipeline_layout; cmdbuf.bindPipeline(vk::PipelineBindPoint::eGraphics, depth_blit_pipeline); cmdbuf.bindDescriptorSets(vk::PipelineBindPoint::eGraphics, layout, 0, descriptor_set, {}); - BindBlitState(cmdbuf, layout, blit); + BindBlitState(cmdbuf, layout, blit, dest); cmdbuf.draw(3, 1, 0, 0); }); scheduler.MakeDirty(StateFlags::Pipeline); @@ -531,7 +612,7 @@ vk::Pipeline BlitHelper::MakeDepthStencilBlitPipeline() { .pRasterizationState = &PIPELINE_RASTERIZATION_STATE_CREATE_INFO, .pMultisampleState = &PIPELINE_MULTISAMPLE_STATE_CREATE_INFO, .pDepthStencilState = &PIPELINE_DEPTH_STENCIL_STATE_CREATE_INFO, - .pColorBlendState = &PIPELINE_COLOR_BLEND_STATE_EMPTY_CREATE_INFO, + .pColorBlendState = &PIPELINE_COLOR_BLEND_STATE_CREATE_INFO, .pDynamicState = &PIPELINE_DYNAMIC_STATE_CREATE_INFO, .layout = two_textures_pipeline_layout, .renderPass = renderpass, @@ -547,4 +628,258 @@ vk::Pipeline BlitHelper::MakeDepthStencilBlitPipeline() { return VK_NULL_HANDLE; } +bool BlitHelper::Filter(Surface& surface, const VideoCore::TextureBlit& blit) { + const auto filter = Settings::values.texture_filter.GetValue(); + const bool is_depth = + surface.type == VideoCore::SurfaceType::Depth || + surface.type == VideoCore::SurfaceType::DepthStencil; // Skip filtering for depth textures + // and when no filter is selected + if (filter == Settings::TextureFilter::NoFilter || is_depth) { + return false; + } // Only filter base mipmap level + if (blit.src_level != 0) { + return true; + } + + switch (filter) { + case TextureFilter::Anime4K: + FilterAnime4K(surface, blit); + break; + case TextureFilter::Bicubic: + FilterBicubic(surface, blit); + break; + case TextureFilter::ScaleForce: + FilterScaleForce(surface, blit); + break; + case TextureFilter::xBRZ: + FilterXbrz(surface, blit); + break; + case TextureFilter::MMPX: + FilterMMPX(surface, blit); + break; + default: + LOG_ERROR(Render_Vulkan, "Unknown texture filter {}", filter); + return false; + } + return true; +} + +void BlitHelper::FilterAnime4K(Surface& surface, const VideoCore::TextureBlit& blit) { + FilterPassThreeTextures(surface, surface, surface, surface, refine_pipeline, + three_textures_pipeline_layout, blit); +} + +void BlitHelper::FilterBicubic(Surface& surface, const VideoCore::TextureBlit& blit) { + FilterPass(surface, surface, bicubic_pipeline, single_texture_pipeline_layout, blit); +} + +void BlitHelper::FilterScaleForce(Surface& surface, const VideoCore::TextureBlit& blit) { + FilterPass(surface, surface, scale_force_pipeline, single_texture_pipeline_layout, blit); +} + +void BlitHelper::FilterXbrz(Surface& surface, const VideoCore::TextureBlit& blit) { + FilterPass(surface, surface, xbrz_pipeline, single_texture_pipeline_layout, blit); +} + +void BlitHelper::FilterMMPX(Surface& surface, const VideoCore::TextureBlit& blit) { + FilterPass(surface, surface, mmpx_pipeline, single_texture_pipeline_layout, blit); +} + +vk::Pipeline BlitHelper::MakeFilterPipeline(vk::ShaderModule fragment_shader, + vk::PipelineLayout layout) { + const std::array stages = MakeStages(full_screen_vert, fragment_shader); + // Use color format for render pass, always a color target + const auto renderpass = renderpass_cache.GetRenderpass(VideoCore::PixelFormat::RGBA8, + VideoCore::PixelFormat::Invalid, false); + + vk::GraphicsPipelineCreateInfo pipeline_info = { + .stageCount = static_cast(stages.size()), + .pStages = stages.data(), + .pVertexInputState = &PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO, + .pInputAssemblyState = &PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO, + .pTessellationState = nullptr, + .pViewportState = &PIPELINE_VIEWPORT_STATE_CREATE_INFO, + .pRasterizationState = &PIPELINE_RASTERIZATION_STATE_CREATE_INFO, + .pMultisampleState = &PIPELINE_MULTISAMPLE_STATE_CREATE_INFO, + .pDepthStencilState = nullptr, + .pColorBlendState = &PIPELINE_COLOR_BLEND_STATE_CREATE_INFO, + .pDynamicState = &PIPELINE_DYNAMIC_STATE_CREATE_INFO, + .layout = layout, + .renderPass = renderpass, + }; + + if (const auto result = device.createGraphicsPipeline({}, pipeline_info); + result.result == vk::Result::eSuccess) { + return result.value; + } else { + LOG_CRITICAL(Render_Vulkan, "Filter pipeline creation failed!"); + UNREACHABLE(); + } +} + +void BlitHelper::FilterPass(Surface& source, Surface& dest, vk::Pipeline pipeline, + vk::PipelineLayout layout, const VideoCore::TextureBlit& blit) { + const auto texture_descriptor_set = single_texture_provider.Commit(); + update_queue.AddImageSampler(texture_descriptor_set, 0, 0, source.ImageView(0), linear_sampler, + vk::ImageLayout::eGeneral); + + const bool is_depth = dest.type == VideoCore::SurfaceType::Depth || + dest.type == VideoCore::SurfaceType::DepthStencil; + const auto color_format = is_depth ? VideoCore::PixelFormat::Invalid : dest.pixel_format; + const auto depth_format = is_depth ? dest.pixel_format : VideoCore::PixelFormat::Invalid; + const auto renderpass = renderpass_cache.GetRenderpass(color_format, depth_format, false); + + const RenderPass render_pass = { + .framebuffer = dest.Framebuffer(), + .render_pass = renderpass, + .render_area = + { + .offset = {0, 0}, + .extent = {dest.GetScaledWidth(), dest.GetScaledHeight()}, + }, + }; + renderpass_cache.BeginRendering(render_pass); + const float src_scale = static_cast(source.GetResScale()); + // Calculate normalized texture coordinates like OpenGL does + const auto src_extent = source.RealExtent(false); // Get unscaled texture extent + const float tex_scale_x = + static_cast(blit.src_rect.GetWidth()) / static_cast(src_extent.width); + const float tex_scale_y = + static_cast(blit.src_rect.GetHeight()) / static_cast(src_extent.height); + const float tex_offset_x = + static_cast(blit.src_rect.left) / static_cast(src_extent.width); + const float tex_offset_y = + static_cast(blit.src_rect.bottom) / static_cast(src_extent.height); + + scheduler.Record([pipeline, layout, texture_descriptor_set, blit, tex_scale_x, tex_scale_y, + tex_offset_x, tex_offset_y, src_scale](vk::CommandBuffer cmdbuf) { + const FilterPushConstants push_constants{.tex_scale = {tex_scale_x, tex_scale_y}, + .tex_offset = {tex_offset_x, tex_offset_y}, + .res_scale = src_scale}; + + cmdbuf.bindPipeline(vk::PipelineBindPoint::eGraphics, pipeline); + + // Bind single texture descriptor set + cmdbuf.bindDescriptorSets(vk::PipelineBindPoint::eGraphics, layout, 0, + texture_descriptor_set, {}); + + cmdbuf.pushConstants(layout, FILTER_PUSH_CONSTANT_RANGE.stageFlags, + FILTER_PUSH_CONSTANT_RANGE.offset, FILTER_PUSH_CONSTANT_RANGE.size, + &push_constants); + + // Set up viewport and scissor for filtering (don't use BindBlitState as it overwrites push + // constants) + const vk::Offset2D offset{ + .x = std::min(blit.dst_rect.left, blit.dst_rect.right), + .y = std::min(blit.dst_rect.bottom, blit.dst_rect.top), + }; + const vk::Extent2D extent{ + .width = blit.dst_rect.GetWidth(), + .height = blit.dst_rect.GetHeight(), + }; + const vk::Viewport viewport{ + .x = static_cast(offset.x), + .y = static_cast(offset.y), + .width = static_cast(extent.width), + .height = static_cast(extent.height), + .minDepth = 0.0f, + .maxDepth = 1.0f, + }; + const vk::Rect2D scissor{ + .offset = offset, + .extent = extent, + }; + cmdbuf.setViewport(0, viewport); + cmdbuf.setScissor(0, scissor); + cmdbuf.draw(3, 1, 0, 0); + }); + scheduler.MakeDirty(StateFlags::Pipeline); +} + +void BlitHelper::FilterPassThreeTextures(Surface& source1, Surface& source2, Surface& source3, + Surface& dest, vk::Pipeline pipeline, + vk::PipelineLayout layout, + const VideoCore::TextureBlit& blit) { + const auto texture_descriptor_set = three_textures_provider.Commit(); + + update_queue.AddImageSampler(texture_descriptor_set, 0, 0, source1.ImageView(0), linear_sampler, + vk::ImageLayout::eGeneral); + update_queue.AddImageSampler(texture_descriptor_set, 1, 0, source2.ImageView(0), linear_sampler, + vk::ImageLayout::eGeneral); + update_queue.AddImageSampler(texture_descriptor_set, 2, 0, source3.ImageView(0), linear_sampler, + vk::ImageLayout::eGeneral); + + const bool is_depth = dest.type == VideoCore::SurfaceType::Depth || + dest.type == VideoCore::SurfaceType::DepthStencil; + const auto color_format = is_depth ? VideoCore::PixelFormat::Invalid : dest.pixel_format; + const auto depth_format = is_depth ? dest.pixel_format : VideoCore::PixelFormat::Invalid; + const auto renderpass = renderpass_cache.GetRenderpass(color_format, depth_format, false); + + const RenderPass render_pass = { + .framebuffer = dest.Framebuffer(), + .render_pass = renderpass, + .render_area = + { + .offset = {0, 0}, + .extent = {dest.GetScaledWidth(), dest.GetScaledHeight()}, + }, + }; + renderpass_cache.BeginRendering(render_pass); + + const float src_scale = static_cast(source1.GetResScale()); + // Calculate normalized texture coordinates like OpenGL does + const auto src_extent = source1.RealExtent(false); // Get unscaled texture extent + const float tex_scale_x = + static_cast(blit.src_rect.GetWidth()) / static_cast(src_extent.width); + const float tex_scale_y = + static_cast(blit.src_rect.GetHeight()) / static_cast(src_extent.height); + const float tex_offset_x = + static_cast(blit.src_rect.left) / static_cast(src_extent.width); + const float tex_offset_y = + static_cast(blit.src_rect.bottom) / static_cast(src_extent.height); + + scheduler.Record([pipeline, layout, texture_descriptor_set, blit, tex_scale_x, tex_scale_y, + tex_offset_x, tex_offset_y, src_scale](vk::CommandBuffer cmdbuf) { + const FilterPushConstants push_constants{.tex_scale = {tex_scale_x, tex_scale_y}, + .tex_offset = {tex_offset_x, tex_offset_y}, + .res_scale = src_scale}; + + cmdbuf.bindPipeline(vk::PipelineBindPoint::eGraphics, pipeline); + + // Bind single texture descriptor set + cmdbuf.bindDescriptorSets(vk::PipelineBindPoint::eGraphics, layout, 0, + texture_descriptor_set, {}); + + cmdbuf.pushConstants(layout, FILTER_PUSH_CONSTANT_RANGE.stageFlags, + FILTER_PUSH_CONSTANT_RANGE.offset, FILTER_PUSH_CONSTANT_RANGE.size, + &push_constants); + + // Set up viewport and scissor using safe viewport like working filters + const vk::Offset2D offset{ + .x = std::min(blit.dst_rect.left, blit.dst_rect.right), + .y = std::min(blit.dst_rect.bottom, blit.dst_rect.top), + }; + const vk::Extent2D extent{ + .width = blit.dst_rect.GetWidth(), + .height = blit.dst_rect.GetHeight(), + }; + const vk::Viewport viewport{ + .x = static_cast(offset.x), + .y = static_cast(offset.y), + .width = static_cast(extent.width), + .height = static_cast(extent.height), + .minDepth = 0.0f, + .maxDepth = 1.0f, + }; + const vk::Rect2D scissor{ + .offset = offset, + .extent = extent, + }; + cmdbuf.setViewport(0, viewport); + cmdbuf.setScissor(0, scissor); + cmdbuf.draw(3, 1, 0, 0); + }); + scheduler.MakeDirty(StateFlags::Pipeline); +} + } // namespace Vulkan diff --git a/src/video_core/renderer_vulkan/vk_blit_helper.h b/src/video_core/renderer_vulkan/vk_blit_helper.h index d9b5c7760..030c65f5c 100644 --- a/src/video_core/renderer_vulkan/vk_blit_helper.h +++ b/src/video_core/renderer_vulkan/vk_blit_helper.h @@ -1,4 +1,4 @@ -// Copyright 2023 Citra Emulator Project +// Copyright Citra Emulator Project / Azahar Emulator Project // Licensed under GPLv2 or any later version // Refer to the license.txt file included. @@ -27,6 +27,7 @@ public: explicit BlitHelper(const Instance& instance, Scheduler& scheduler, RenderManager& renderpass_cache, DescriptorUpdateQueue& update_queue); ~BlitHelper(); + bool Filter(Surface& surface, const VideoCore::TextureBlit& blit); bool BlitDepthStencil(Surface& source, Surface& dest, const VideoCore::TextureBlit& blit); @@ -38,6 +39,23 @@ public: private: vk::Pipeline MakeComputePipeline(vk::ShaderModule shader, vk::PipelineLayout layout); vk::Pipeline MakeDepthStencilBlitPipeline(); + vk::Pipeline MakeFilterPipeline(vk::ShaderModule fragment_shader, vk::PipelineLayout layout); + + void FilterAnime4K(Surface& surface, const VideoCore::TextureBlit& blit); + void FilterBicubic(Surface& surface, const VideoCore::TextureBlit& blit); + void FilterScaleForce(Surface& surface, const VideoCore::TextureBlit& blit); + void FilterXbrz(Surface& surface, const VideoCore::TextureBlit& blit); + void FilterMMPX(Surface& surface, const VideoCore::TextureBlit& blit); + + void FilterPass(Surface& source, Surface& dest, vk::Pipeline pipeline, + vk::PipelineLayout layout, const VideoCore::TextureBlit& blit); + + void FilterPassThreeTextures(Surface& source1, Surface& source2, Surface& source3, + Surface& dest, vk::Pipeline pipeline, vk::PipelineLayout layout, + const VideoCore::TextureBlit& blit); + + void FilterPassYGradient(Surface& source, Surface& dest, vk::Pipeline pipeline, + vk::PipelineLayout layout, const VideoCore::TextureBlit& blit); private: const Instance& instance; @@ -51,18 +69,32 @@ private: DescriptorHeap compute_provider; DescriptorHeap compute_buffer_provider; DescriptorHeap two_textures_provider; + DescriptorHeap single_texture_provider; + DescriptorHeap three_textures_provider; vk::PipelineLayout compute_pipeline_layout; vk::PipelineLayout compute_buffer_pipeline_layout; vk::PipelineLayout two_textures_pipeline_layout; + vk::PipelineLayout single_texture_pipeline_layout; + vk::PipelineLayout three_textures_pipeline_layout; vk::ShaderModule full_screen_vert; vk::ShaderModule d24s8_to_rgba8_comp; vk::ShaderModule depth_to_buffer_comp; vk::ShaderModule blit_depth_stencil_frag; + vk::ShaderModule bicubic_frag; + vk::ShaderModule scale_force_frag; + vk::ShaderModule xbrz_frag; + vk::ShaderModule mmpx_frag; + vk::ShaderModule refine_frag; vk::Pipeline d24s8_to_rgba8_pipeline; vk::Pipeline depth_to_buffer_pipeline; vk::Pipeline depth_blit_pipeline; + vk::Pipeline bicubic_pipeline; + vk::Pipeline scale_force_pipeline; + vk::Pipeline xbrz_pipeline; + vk::Pipeline mmpx_pipeline; + vk::Pipeline refine_pipeline; vk::Sampler linear_sampler; vk::Sampler nearest_sampler; }; diff --git a/src/video_core/renderer_vulkan/vk_instance.h b/src/video_core/renderer_vulkan/vk_instance.h index d087d49b1..88c8726f4 100644 --- a/src/video_core/renderer_vulkan/vk_instance.h +++ b/src/video_core/renderer_vulkan/vk_instance.h @@ -1,4 +1,4 @@ -// Copyright 2022 Citra Emulator Project +// Copyright Citra Emulator Project / Azahar Emulator Project // Licensed under GPLv2 or any later version // Refer to the license.txt file included. @@ -229,7 +229,7 @@ public: } /// Returns the maximum supported elements in a texel buffer - u32 MaxTexelBufferElements() const { + u64 MaxTexelBufferElements() const { return properties.limits.maxTexelBufferElements; } diff --git a/src/video_core/renderer_vulkan/vk_resource_pool.cpp b/src/video_core/renderer_vulkan/vk_resource_pool.cpp index 0021167e4..28ef0504c 100644 --- a/src/video_core/renderer_vulkan/vk_resource_pool.cpp +++ b/src/video_core/renderer_vulkan/vk_resource_pool.cpp @@ -1,4 +1,4 @@ -// Copyright 2020 yuzu Emulator Project +// Copyright Citra Emulator Project / Azahar Emulator Project // Licensed under GPLv2 or any later version // Refer to the license.txt file included. @@ -103,13 +103,14 @@ vk::CommandBuffer CommandPool::Commit() { return cmd_buffers[index]; } -constexpr u32 DESCRIPTOR_SET_BATCH = 32; +constexpr u32 DESCRIPTOR_SET_BATCH = 64; +constexpr u32 DESCRIPTOR_MULTIPLIER = 4; // Increase capacity of each pool DescriptorHeap::DescriptorHeap(const Instance& instance, MasterSemaphore* master_semaphore, std::span bindings, u32 descriptor_heap_count_) : ResourcePool{master_semaphore, DESCRIPTOR_SET_BATCH}, device{instance.GetDevice()}, - descriptor_heap_count{descriptor_heap_count_} { + descriptor_heap_count{descriptor_heap_count_ * DESCRIPTOR_MULTIPLIER} { // Increase pool size // Create descriptor set layout. const vk::DescriptorSetLayoutCreateInfo layout_ci = { .bindingCount = static_cast(bindings.size()), diff --git a/src/video_core/renderer_vulkan/vk_texture_runtime.cpp b/src/video_core/renderer_vulkan/vk_texture_runtime.cpp index fdaa4ef2e..6b9b388fa 100644 --- a/src/video_core/renderer_vulkan/vk_texture_runtime.cpp +++ b/src/video_core/renderer_vulkan/vk_texture_runtime.cpp @@ -1,9 +1,23 @@ -// Copyright 2023 Citra Emulator Project +// Copyright Citra Emulator Project / Azahar Emulator Project // Licensed under GPLv2 or any later version // Refer to the license.txt file included. +#include "video_core/renderer_vulkan/vk_texture_runtime.h" + +#include +#include +#include +#include #include #include +#include +#include "video_core/custom_textures/custom_tex_manager.h" +#include "video_core/rasterizer_cache/pixel_format.h" +#include "video_core/rasterizer_cache/surface_params.h" +#include "video_core/renderer_base.h" +#include "video_core/renderer_vulkan/vk_blit_helper.h" +#include "video_core/renderer_vulkan/vk_descriptor_update_queue.h" +#include "video_core/renderer_vulkan/vk_stream_buffer.h" #include "common/literals.h" #include "common/microprofile.h" @@ -451,6 +465,49 @@ void TextureRuntime::ClearTextureWithRenderpass(Surface& surface, }); } +vk::UniqueImageView MakeFramebufferImageView(vk::Device device, vk::Image image, vk::Format format, + vk::ImageAspectFlags aspect, u32 base_level = 0) { + // For framebuffer attachments, we must always use levelCount=1 to avoid + // Vulkan validation errors about mipLevel being outside of the allowed range + const vk::ImageViewCreateInfo view_info = { + .image = image, + .viewType = vk::ImageViewType::e2D, + .format = format, + .subresourceRange{ + .aspectMask = aspect, + .baseMipLevel = base_level, // Use the specified base mip level + .levelCount = 1, // Framebuffers require a single mip level + .baseArrayLayer = 0, + .layerCount = 1, + }, + }; + return device.createImageViewUnique(view_info); +} + +vk::ImageView CreateFramebufferImageView(const Instance* instance, vk::Image image, + vk::Format format, vk::ImageAspectFlags aspect) { + // Always create a view with a single mip level for framebuffer attachments + const vk::ImageViewCreateInfo view_info = { + .image = image, + .viewType = vk::ImageViewType::e2D, + .format = format, + .subresourceRange{ + .aspectMask = aspect, + .baseMipLevel = 0, + .levelCount = 1, // Always use 1 for framebuffers to avoid Vulkan validation errors + .baseArrayLayer = 0, + .layerCount = 1, + }, + }; + return instance->GetDevice().createImageView(view_info); +} + +bool IsImagelessFramebufferSupported(const Instance* instance) { + // We're not using imageless framebuffers to avoid validation errors + // Even if the extension is supported, we'll use standard framebuffers for better compatibility + return false; +} + bool TextureRuntime::CopyTextures(Surface& source, Surface& dest, std::span copies) { renderpass_cache.EndRendering(); @@ -700,7 +757,7 @@ Surface::Surface(TextureRuntime& runtime_, const VideoCore::SurfaceParams& param : SurfaceBase{params}, runtime{&runtime_}, instance{&runtime_.GetInstance()}, scheduler{&runtime_.GetScheduler()}, traits{instance->GetTraits(pixel_format)} { - if (pixel_format == VideoCore::PixelFormat::Invalid) { + if (pixel_format == VideoCore::PixelFormat::Invalid || !traits.transfer_support) { return; } @@ -720,18 +777,25 @@ Surface::Surface(TextureRuntime& runtime_, const VideoCore::SurfaceParams& param flags |= vk::ImageCreateFlagBits::eMutableFormat; } + // Ensure color formats have the color attachment bit set for framebuffers + auto usage = traits.usage; + const bool is_color = + (traits.aspect & vk::ImageAspectFlagBits::eColor) != vk::ImageAspectFlags{}; + if (is_color) { + usage |= vk::ImageUsageFlagBits::eColorAttachment; + } + const bool need_format_list = is_mutable && instance->IsImageFormatListSupported(); - handles[0] = MakeHandle(instance, width, height, levels, texture_type, format, traits.usage, - flags, traits.aspect, need_format_list, DebugName(false)); + handles[0] = MakeHandle(instance, width, height, levels, texture_type, format, usage, flags, + traits.aspect, need_format_list, DebugName(false)); raw_images.emplace_back(handles[0].image); if (res_scale != 1) { handles[1] = MakeHandle(instance, GetScaledWidth(), GetScaledHeight(), levels, texture_type, format, - traits.usage, flags, traits.aspect, need_format_list, DebugName(true)); + usage, flags, traits.aspect, need_format_list, DebugName(true)); raw_images.emplace_back(handles[1].image); } - runtime->renderpass_cache.EndRendering(); scheduler->Record([raw_images, aspect = traits.aspect](vk::CommandBuffer cmdbuf) { const auto barriers = MakeInitBarriers(aspect, raw_images); @@ -788,6 +852,50 @@ Surface::Surface(TextureRuntime& runtime_, const VideoCore::SurfaceBase& surface material = mat; } +Surface::Surface(TextureRuntime& runtime_, u32 width_, u32 height_, VideoCore::PixelFormat format_) + : SurfaceBase{{ + .width = width_, + .height = height_, + .pixel_format = format_, + .type = VideoCore::SurfaceType::Texture, + }}, + runtime{&runtime_}, instance{&runtime_.GetInstance()}, scheduler{&runtime_.GetScheduler()}, + traits{instance->GetTraits(format_)} { + + // Create texture with requested size and format + const vk::ImageUsageFlags usage = + vk::ImageUsageFlagBits::eTransferSrc | vk::ImageUsageFlagBits::eTransferDst | + vk::ImageUsageFlagBits::eColorAttachment | vk::ImageUsageFlagBits::eSampled; + + handles[0] = MakeHandle(instance, width_, height_, 1, VideoCore::TextureType::Texture2D, + traits.native, usage, {}, traits.aspect, false, "Temporary Surface"); + + // Create image view + const vk::ImageViewCreateInfo view_info = { + .image = handles[0].image, + .viewType = vk::ImageViewType::e2D, + .format = traits.native, + .subresourceRange{ + .aspectMask = traits.aspect, + .baseMipLevel = 0, + .levelCount = 1, + .baseArrayLayer = 0, + .layerCount = 1, + }, + }; + + handles[0].image_view = instance->GetDevice().createImageViewUnique(view_info); + + runtime->renderpass_cache.EndRendering(); + scheduler->Record( + [raw_images = std::array{Image()}, aspect = traits.aspect](vk::CommandBuffer cmdbuf) { + const auto barriers = MakeInitBarriers(aspect, raw_images); + cmdbuf.pipelineBarrier(vk::PipelineStageFlagBits::eTopOfPipe, + vk::PipelineStageFlagBits::eTopOfPipe, + vk::DependencyFlagBits::eByRegion, {}, {}, barriers); + }); +} + Surface::~Surface() { if (!handles[0].image_view) { return; @@ -876,14 +984,23 @@ void Surface::Upload(const VideoCore::BufferTextureCopy& upload, runtime->upload_buffer.Commit(staging.size); if (res_scale != 1) { - const VideoCore::TextureBlit blit = { - .src_level = upload.texture_level, - .dst_level = upload.texture_level, - .src_rect = upload.texture_rect, - .dst_rect = upload.texture_rect * res_scale, - }; - - BlitScale(blit, true); + // Always ensure the scaled image exists + if (!handles[1].image) { + // This will create handles[1] and perform the initial scaling + ScaleUp(res_scale); + } else { + // Update the scaled version of the uploaded area + const VideoCore::TextureBlit blit = { + .src_level = upload.texture_level, + .dst_level = upload.texture_level, + .src_rect = upload.texture_rect, + .dst_rect = upload.texture_rect * res_scale, + }; + // Only apply texture filtering when upscaling, matching OpenGL behavior + if (res_scale != 1 && !runtime->blit_helper.Filter(*this, blit)) { + BlitScale(blit, true); + } + } } } @@ -1251,7 +1368,20 @@ vk::ImageView Surface::ImageView(u32 index) const noexcept { vk::ImageView Surface::FramebufferView() noexcept { is_framebuffer = true; - return ImageView(); + + const u32 index = res_scale == 1 ? 0u : 1u; + + // If we already have a framebuffer-compatible view, return it + if (framebuffer_view[index]) { + return framebuffer_view[index].get(); + } + + // Create a new view with a single mip level for framebuffer compatibility + // This is critical to avoid VUID-VkFramebufferCreateInfo-pAttachments-00883 validation errors + framebuffer_view[index] = MakeFramebufferImageView( + instance->GetDevice(), Image(), instance->GetTraits(pixel_format).native, Aspect(), 0); + + return framebuffer_view[index].get(); } vk::ImageView Surface::DepthView() noexcept { @@ -1329,6 +1459,8 @@ vk::ImageView Surface::StorageView() noexcept { } vk::Framebuffer Surface::Framebuffer() noexcept { + is_framebuffer = true; + const u32 index = res_scale == 1 ? 0u : 1u; if (framebuffers[index]) { return framebuffers[index].get(); @@ -1339,7 +1471,8 @@ vk::Framebuffer Surface::Framebuffer() noexcept { const auto depth_format = is_depth ? pixel_format : PixelFormat::Invalid; const auto render_pass = runtime->renderpass_cache.GetRenderpass(color_format, depth_format, false); - const auto attachments = std::array{ImageView()}; + // Use FramebufferView() instead of ImageView() to ensure single mip level + const auto attachments = std::array{FramebufferView()}; framebuffers[index] = MakeFramebuffer(instance->GetDevice(), render_pass, GetScaledWidth(), GetScaledHeight(), attachments); return framebuffers[index].get(); @@ -1353,9 +1486,16 @@ void Surface::BlitScale(const VideoCore::TextureBlit& blit, bool up_scale) { return; } - scheduler->Record([src_image = Image(!up_scale), aspect = Aspect(), - filter = MakeFilter(pixel_format), dst_image = Image(up_scale), + // Always use consistent source and destination images for proper scaling + // When upscaling: source = unscaled (0), destination = scaled (1) + // When downscaling: source = scaled (1), destination = unscaled (0) + const vk::Image src_image = up_scale ? Image(0) : Image(1); + const vk::Image dst_image = up_scale ? Image(1) : Image(0); + + scheduler->Record([src_image, aspect = Aspect(), filter = MakeFilter(pixel_format), dst_image, + src_access = AccessFlags(), dst_access = AccessFlags(), blit](vk::CommandBuffer render_cmdbuf) { + // Adjust blitting parameters for filtered upscaling const std::array source_offsets = { vk::Offset3D{static_cast(blit.src_rect.left), static_cast(blit.src_rect.bottom), 0}, @@ -1389,7 +1529,7 @@ void Surface::BlitScale(const VideoCore::TextureBlit& blit, bool up_scale) { const std::array read_barriers = { vk::ImageMemoryBarrier{ - .srcAccessMask = vk::AccessFlagBits::eMemoryWrite, + .srcAccessMask = src_access, .dstAccessMask = vk::AccessFlagBits::eTransferRead, .oldLayout = vk::ImageLayout::eGeneral, .newLayout = vk::ImageLayout::eTransferSrcOptimal, @@ -1399,10 +1539,7 @@ void Surface::BlitScale(const VideoCore::TextureBlit& blit, bool up_scale) { .subresourceRange = MakeSubresourceRange(aspect, blit.src_level), }, vk::ImageMemoryBarrier{ - .srcAccessMask = vk::AccessFlagBits::eShaderRead | - vk::AccessFlagBits::eDepthStencilAttachmentRead | - vk::AccessFlagBits::eColorAttachmentRead | - vk::AccessFlagBits::eTransferRead, + .srcAccessMask = dst_access, .dstAccessMask = vk::AccessFlagBits::eTransferWrite, .oldLayout = vk::ImageLayout::eGeneral, .newLayout = vk::ImageLayout::eTransferDstOptimal, @@ -1449,9 +1586,9 @@ void Surface::BlitScale(const VideoCore::TextureBlit& blit, bool up_scale) { } Framebuffer::Framebuffer(TextureRuntime& runtime, const VideoCore::FramebufferParams& params, - Surface* color, Surface* depth) + Surface* color, Surface* depth_stencil) : VideoCore::FramebufferParams{params}, - res_scale{color ? color->res_scale : (depth ? depth->res_scale : 1u)} { + res_scale{color ? color->res_scale : (depth_stencil ? depth_stencil->res_scale : 1u)} { auto& renderpass_cache = runtime.GetRenderpassCache(); if (shadow_rendering && !color) { return; @@ -1468,30 +1605,62 @@ Framebuffer::Framebuffer(TextureRuntime& runtime, const VideoCore::FramebufferPa } images[index] = surface->Image(); aspects[index] = surface->Aspect(); - image_views[index] = shadow_rendering ? surface->StorageView() : surface->FramebufferView(); }; - boost::container::static_vector attachments; - + // Prepare the surfaces for use in framebuffer if (color) { prepare(0, color); - attachments.emplace_back(image_views[0]); } - if (depth) { - prepare(1, depth); - attachments.emplace_back(image_views[1]); + if (depth_stencil) { + prepare(1, depth_stencil); } const vk::Device device = runtime.GetInstance().GetDevice(); + + // Create appropriate image views for the framebuffer + boost::container::static_vector fb_attachments; + + if (color) { + vk::UniqueImageView single_level_view = + MakeFramebufferImageView(device, color->Image(), color->traits.native, color->Aspect()); + fb_attachments.push_back(single_level_view.get()); + framebuffer_views.push_back(std::move(single_level_view)); + } + + if (depth_stencil) { + vk::UniqueImageView single_level_view = MakeFramebufferImageView( + device, depth_stencil->Image(), depth_stencil->traits.native, depth_stencil->Aspect()); + fb_attachments.push_back(single_level_view.get()); + framebuffer_views.push_back(std::move(single_level_view)); + } if (shadow_rendering) { - render_pass = - renderpass_cache.GetRenderpass(PixelFormat::Invalid, PixelFormat::Invalid, false); - framebuffer = MakeFramebuffer(device, render_pass, color->GetScaledWidth(), - color->GetScaledHeight(), {}); + // For shadow rendering, we need a special render pass with depth-only + // Since shadow rendering doesn't output to color buffer, we use depth-only render pass + render_pass = renderpass_cache.GetRenderpass(PixelFormat::Invalid, formats[1], false); + + // Find the depth attachment in fb_attachments + boost::container::static_vector shadow_attachments; + if (depth_stencil) { + // Depth attachment is the last one added (after color if present) + shadow_attachments.push_back(fb_attachments.back()); + } else if (!fb_attachments.empty()) { + // Fallback to first attachment if no depth_stencil + shadow_attachments.push_back(fb_attachments[0]); + } + + // Create framebuffer with depth attachment only + framebuffer = MakeFramebuffer( + device, render_pass, color ? color->GetScaledWidth() : depth_stencil->GetScaledWidth(), + color ? color->GetScaledHeight() : depth_stencil->GetScaledHeight(), + shadow_attachments); } else { - render_pass = renderpass_cache.GetRenderpass(formats[0], formats[1], false); - framebuffer = MakeFramebuffer(device, render_pass, width, height, attachments); + // For normal rendering, create a render pass that matches our attachments + render_pass = renderpass_cache.GetRenderpass( + color ? formats[0] : PixelFormat::Invalid, + depth_stencil ? formats[1] : PixelFormat::Invalid, false); + // Create the framebuffer with attachments matching the render pass + framebuffer = MakeFramebuffer(device, render_pass, width, height, fb_attachments); } } diff --git a/src/video_core/renderer_vulkan/vk_texture_runtime.h b/src/video_core/renderer_vulkan/vk_texture_runtime.h index e1745b22b..ecd7a5ef4 100644 --- a/src/video_core/renderer_vulkan/vk_texture_runtime.h +++ b/src/video_core/renderer_vulkan/vk_texture_runtime.h @@ -1,4 +1,4 @@ -// Copyright 2023 Citra Emulator Project +// Copyright Citra Emulator Project / Azahar Emulator Project // Licensed under GPLv2 or any later version // Refer to the license.txt file included. @@ -110,6 +110,8 @@ public: explicit Surface(TextureRuntime& runtime, const VideoCore::SurfaceParams& params); explicit Surface(TextureRuntime& runtime, const VideoCore::SurfaceBase& surface, const VideoCore::Material* materal); + explicit Surface(TextureRuntime& runtime, u32 width_, u32 height_, + VideoCore::PixelFormat format_); ~Surface(); Surface(const Surface&) = delete; @@ -128,6 +130,21 @@ public: /// Returns the image view at index, otherwise the base view vk::ImageView ImageView(u32 index = 1) const noexcept; + /// Returns width of the surface + u32 GetWidth() const noexcept { + return width; + } + + /// Returns height of the surface + u32 GetHeight() const noexcept { + return height; + } + + /// Returns resolution scale of the surface + u32 GetResScale() const noexcept { + return res_scale; + } + /// Returns a copy of the upscaled image handle, used for feedback loops. vk::ImageView CopyImageView() noexcept; @@ -184,6 +201,7 @@ public: std::array handles{}; std::array framebuffers{}; Handle copy_handle; + std::array framebuffer_view; vk::UniqueImageView depth_view; vk::UniqueImageView stencil_view; vk::UniqueImageView storage_view; @@ -244,6 +262,7 @@ private: std::array image_views{}; vk::UniqueFramebuffer framebuffer; vk::RenderPass render_pass; + std::vector framebuffer_views; std::array aspects{}; std::array formats{VideoCore::PixelFormat::Invalid, VideoCore::PixelFormat::Invalid}; diff --git a/src/video_core/shader/generator/glsl_fs_shader_gen.cpp b/src/video_core/shader/generator/glsl_fs_shader_gen.cpp index 96be02d05..463fe1950 100644 --- a/src/video_core/shader/generator/glsl_fs_shader_gen.cpp +++ b/src/video_core/shader/generator/glsl_fs_shader_gen.cpp @@ -1,4 +1,4 @@ -// Copyright 2023 Citra Emulator Project +// Copyright Citra Emulator Project / Azahar Emulator Project // Licensed under GPLv2 or any later version // Refer to the license.txt file included. @@ -172,6 +172,7 @@ vec4 secondary_fragment_color = vec4(0.0); break; case TexturingRegs::FogMode::Gas: WriteGas(); + // Return early due to unimplemented gas mode return out; default: break; @@ -832,7 +833,10 @@ void FragmentModule::WriteFog() { void FragmentModule::WriteGas() { // TODO: Implement me LOG_CRITICAL(Render, "Unimplemented gas mode"); - out += "discard; }"; + // Replace the output color with a transparent pixel, + // (just discarding the pixel causes graphical issues + // in some MH games). + out += "color = vec4(0.0); }"; } void FragmentModule::WriteShadow() { diff --git a/src/video_core/shader/generator/glsl_shader_gen.cpp b/src/video_core/shader/generator/glsl_shader_gen.cpp index 154ff1908..d6cc390cc 100644 --- a/src/video_core/shader/generator/glsl_shader_gen.cpp +++ b/src/video_core/shader/generator/glsl_shader_gen.cpp @@ -178,7 +178,7 @@ std::string GenerateVertexShader(const ShaderSetup& setup, const PicaVSConfig& c }; auto program_source = - DecompileProgram(setup.program_code, setup.swizzle_data, config.state.main_offset, + DecompileProgram(setup.GetProgramCode(), setup.GetSwizzleData(), config.state.main_offset, get_input_reg, get_output_reg, config.state.sanitize_mul); if (program_source.empty()) { diff --git a/src/video_core/shader/generator/shader_gen.cpp b/src/video_core/shader/generator/shader_gen.cpp index 6d7e61190..dafbdd8e8 100644 --- a/src/video_core/shader/generator/shader_gen.cpp +++ b/src/video_core/shader/generator/shader_gen.cpp @@ -1,4 +1,4 @@ -// Copyright 2023 Citra Emulator Project +// Copyright Citra Emulator Project / Azahar Emulator Project // Licensed under GPLv2 or any later version // Refer to the license.txt file included. @@ -42,6 +42,7 @@ void PicaVSConfigState::Init(const Pica::RegsInternal& regs, Pica::ShaderSetup& use_geometry_shader = use_geometry_shader_; sanitize_mul = accurate_mul_; + setup.DoProgramCodeFixup(); program_hash = setup.GetProgramCodeHash(); swizzle_hash = setup.GetSwizzleDataHash(); main_offset = regs.vs.main_offset; diff --git a/src/video_core/shader/shader_interpreter.cpp b/src/video_core/shader/shader_interpreter.cpp index bf19c037f..cb06a62bc 100644 --- a/src/video_core/shader/shader_interpreter.cpp +++ b/src/video_core/shader/shader_interpreter.cpp @@ -1,4 +1,4 @@ -// Copyright 2014 Citra Emulator Project +// Copyright Citra Emulator Project / Azahar Emulator Project // Licensed under GPLv2 or any later version // Refer to the license.txt file included. @@ -105,8 +105,8 @@ static void RunInterpreter(const ShaderSetup& setup, ShaderUnit& state, }; const auto& uniforms = setup.uniforms; - const auto& swizzle_data = setup.swizzle_data; - const auto& program_code = setup.program_code; + const auto& swizzle_data = setup.GetSwizzleData(); + const auto& program_code = setup.GetProgramCode(); // Constants for handling invalid inputs static f24 dummy_vec4_float24_zeros[4] = {f24::Zero(), f24::Zero(), f24::Zero(), f24::Zero()}; @@ -118,7 +118,21 @@ static void RunInterpreter(const ShaderSetup& setup, ShaderUnit& state, bool is_break = false; const u32 old_program_counter = program_counter; - const Instruction instr = {program_code[program_counter]}; + // Always treat the last instruction of the program code as an + // end instruction. This fixes some games such as Thunder Blade + // or After Burner II which have malformed geo shaders without an + // end instruction crashing the emulator due to the program counter + // growing uncontrollably. + // TODO(PabloMK7): Find how real HW reacts to this, most likely the + // program counter wraps around after reaching the last instruction, + // but more testing is needed. + Instruction instr{}; + if (program_counter < MAX_PROGRAM_CODE_LENGTH - 1) { + instr.hex = program_code[program_counter]; + } else { + instr.opcode.Assign(OpCode::Id::END); + } + const SwizzlePattern swizzle = {swizzle_data[instr.common.operand_desc_id]}; Record(debug_data, iteration, program_counter); @@ -722,6 +736,7 @@ static void RunInterpreter(const ShaderSetup& setup, ShaderUnit& state, void InterpreterEngine::SetupBatch(ShaderSetup& setup, unsigned int entry_point) { ASSERT(entry_point < MAX_PROGRAM_CODE_LENGTH); + setup.DoProgramCodeFixup(); setup.entry_point = entry_point; } diff --git a/src/video_core/shader/shader_jit.cpp b/src/video_core/shader/shader_jit.cpp index 72af05a85..cbbebb22e 100644 --- a/src/video_core/shader/shader_jit.cpp +++ b/src/video_core/shader/shader_jit.cpp @@ -69,6 +69,7 @@ void JitEngine::SetupBatch(ShaderSetup& setup, u32 entry_point) { ASSERT(entry_point < MAX_PROGRAM_CODE_LENGTH); setup.entry_point = entry_point; + setup.DoProgramCodeFixup(); const u64 code_hash = setup.GetProgramCodeHash(); const u64 swizzle_hash = setup.GetSwizzleDataHash(); const u64 cache_key = Common::HashCombine(code_hash, swizzle_hash); @@ -83,7 +84,7 @@ void JitEngine::SetupBatch(ShaderSetup& setup, u32 entry_point) { } else { // Compile synchronously and store the result auto shader = std::make_unique(); - shader->Compile(&setup.program_code, &setup.swizzle_data); + shader->Compile(&setup.GetProgramCode(), &setup.GetSwizzleData()); auto ready_future = std::make_shared>>(); ready_future->set_value(std::move(shader)); shader_future = ready_future->get_future().share(); diff --git a/src/video_core/shader/shader_jit_a64_compiler.cpp b/src/video_core/shader/shader_jit_a64_compiler.cpp index 18793317e..3c9786b29 100644 --- a/src/video_core/shader/shader_jit_a64_compiler.cpp +++ b/src/video_core/shader/shader_jit_a64_compiler.cpp @@ -1,4 +1,4 @@ -// Copyright 2023 Citra Emulator Project +// Copyright Citra Emulator Project / Azahar Emulator Project // Licensed under GPLv2 or any later version // Refer to the license.txt file included. @@ -899,7 +899,21 @@ void JitShader::Compile_NextInstr() { l(instruction_labels[program_counter]); - const Instruction instr = {(*program_code)[program_counter++]}; + // Always treat the last instruction of the program code as an + // end instruction. This fixes some games such as Thunder Blade + // or After Burner II which have malformed geo shaders without an + // end instruction crashing the emulator due to the program counter + // growing uncontrollably. + // TODO(PabloMK7): Find how real HW reacts to this, most likely the + // program counter wraps around after reaching the last instruction, + // but more testing is needed. + Instruction instr{}; + if (program_counter < MAX_PROGRAM_CODE_LENGTH - 1) { + instr.hex = (*program_code)[program_counter]; + } else { + instr.opcode.Assign(OpCode::Id::END); + } + ++program_counter; const OpCode::Id opcode = instr.opcode.Value(); const auto instr_func = instr_table[static_cast(opcode)]; diff --git a/src/video_core/shader/shader_jit_x64_compiler.cpp b/src/video_core/shader/shader_jit_x64_compiler.cpp index fd47ac0a1..84cdc09bc 100644 --- a/src/video_core/shader/shader_jit_x64_compiler.cpp +++ b/src/video_core/shader/shader_jit_x64_compiler.cpp @@ -1,4 +1,4 @@ -// Copyright 2015 Citra Emulator Project +// Copyright Citra Emulator Project / Azahar Emulator Project // Licensed under GPLv2 or any later version // Refer to the license.txt file included. @@ -936,7 +936,21 @@ void JitShader::Compile_NextInstr() { L(instruction_labels[program_counter]); - Instruction instr = {(*program_code)[program_counter++]}; + // Always treat the last instruction of the program code as an + // end instruction. This fixes some games such as Thunder Blade + // or After Burner II which have malformed geo shaders without an + // end instruction crashing the emulator due to the program counter + // growing uncontrollably. + // TODO(PabloMK7): Find how real HW reacts to this, most likely the + // program counter wraps around after reaching the last instruction, + // but more testing is needed. + Instruction instr{}; + if (program_counter < MAX_PROGRAM_CODE_LENGTH - 1) { + instr.hex = (*program_code)[program_counter]; + } else { + instr.opcode.Assign(OpCode::Id::END); + } + ++program_counter; OpCode::Id opcode = instr.opcode.Value(); auto instr_func = instr_table[static_cast(opcode)];