From cfecbf53aa5e334580c16c387686b01cb69af7c4 Mon Sep 17 00:00:00 2001 From: Stenzek Date: Wed, 15 May 2024 08:11:44 +1000 Subject: [PATCH] Host: Add plural translation support Backport of https://github.com/stenzek/duckstation/commit/f3aec0c965df248b316709e2aa9742f8d554b42f --- .../scripts/common/update_base_translation.sh | 2 +- pcsx2-gsrunner/Main.cpp | 17 + pcsx2-qt/GameList/GameListModel.cpp | 13 +- pcsx2-qt/GameList/GameListModel.h | 2 + pcsx2-qt/Translations.cpp | 9 +- pcsx2-qt/Translations/pcsx2-qt_en-US.ts | 117 + pcsx2-qt/Translations/pcsx2-qt_en.ts | 6125 +++++++++-------- .../Translations/update_base_translation.bat | 10 + .../Translations/update_base_translation.sh | 9 + .../Translations/update_en_translation.bat | 7 +- .../Translations/update_en_translation.sh | 4 +- pcsx2/Achievements.cpp | 18 +- pcsx2/GameList.cpp | 4 +- pcsx2/Host.h | 7 + pcsx2/Hotkeys.cpp | 7 +- pcsx2/Patch.cpp | 15 +- tests/ctest/core/StubHost.cpp | 17 + 17 files changed, 3351 insertions(+), 3032 deletions(-) create mode 100644 pcsx2-qt/Translations/pcsx2-qt_en-US.ts create mode 100644 pcsx2-qt/Translations/update_base_translation.bat create mode 100644 pcsx2-qt/Translations/update_base_translation.sh diff --git a/.github/workflows/scripts/common/update_base_translation.sh b/.github/workflows/scripts/common/update_base_translation.sh index 544b915492..6cb0f2dfb7 100755 --- a/.github/workflows/scripts/common/update_base_translation.sh +++ b/.github/workflows/scripts/common/update_base_translation.sh @@ -8,4 +8,4 @@ set -e # for just updating translations. Saves building it for this action alone. "$SCRIPTDIR/../../../../tools/retry.sh" sudo apt-get -y install qt6-l10n-tools -PATH=/usr/lib/qt6/bin:$PATH "$SCRIPTDIR/../../../../pcsx2-qt/Translations/update_en_translation.sh" +PATH=/usr/lib/qt6/bin:$PATH "$SCRIPTDIR/../../../../pcsx2-qt/Translations/update_base_translation.sh" diff --git a/pcsx2-gsrunner/Main.cpp b/pcsx2-gsrunner/Main.cpp index e51acea6b8..cbe4f1e78c 100644 --- a/pcsx2-gsrunner/Main.cpp +++ b/pcsx2-gsrunner/Main.cpp @@ -743,6 +743,23 @@ s32 Host::Internal::GetTranslatedStringImpl( return static_cast(msg.size()); } +std::string Host::TranslatePluralToString(const char* context, const char* msg, const char* disambiguation, int count) +{ + TinyString count_str = TinyString::from_format("{}", count); + + std::string ret(msg); + for (;;) + { + std::string::size_type pos = ret.find("%n"); + if (pos == std::string::npos) + break; + + ret.replace(pos, pos + 2, count_str.view()); + } + + return ret; +} + ////////////////////////////////////////////////////////////////////////// // Platform specific code ////////////////////////////////////////////////////////////////////////// diff --git a/pcsx2-qt/GameList/GameListModel.cpp b/pcsx2-qt/GameList/GameListModel.cpp index 2009d2f198..1f548394e6 100644 --- a/pcsx2-qt/GameList/GameListModel.cpp +++ b/pcsx2-qt/GameList/GameListModel.cpp @@ -259,6 +259,17 @@ int GameListModel::columnCount(const QModelIndex& parent) const return Column_Count; } +QString GameListModel::formatTimespan(time_t timespan) +{ + // avoid an extra string conversion + const u32 hours = static_cast(timespan / 3600); + const u32 minutes = static_cast((timespan % 3600) / 60); + if (hours > 0) + return qApp->translate("GameList", "%n hours", "", hours); + else + return qApp->translate("GameList", "%n minutes", "", minutes); +} + QVariant GameListModel::data(const QModelIndex& index, int role) const { if (!index.isValid()) @@ -296,7 +307,7 @@ QVariant GameListModel::data(const QModelIndex& index, int role) const if (ge->total_played_time == 0) return {}; else - return QString::fromStdString(GameList::FormatTimespan(ge->total_played_time, true)); + return formatTimespan(ge->total_played_time); } case Column_LastPlayed: diff --git a/pcsx2-qt/GameList/GameListModel.h b/pcsx2-qt/GameList/GameListModel.h index 8fd964255e..ceb32dae88 100644 --- a/pcsx2-qt/GameList/GameListModel.h +++ b/pcsx2-qt/GameList/GameListModel.h @@ -82,6 +82,8 @@ private: void loadOrGenerateCover(const GameList::Entry* ge); void invalidateCoverForPath(const std::string& path); + static QString formatTimespan(time_t timespan); + float m_cover_scale = 0.0f; std::atomic m_cover_scale_counter{0}; bool m_show_titles_for_covers = false; diff --git a/pcsx2-qt/Translations.cpp b/pcsx2-qt/Translations.cpp index e826e25f23..a160ac0677 100644 --- a/pcsx2-qt/Translations.cpp +++ b/pcsx2-qt/Translations.cpp @@ -95,7 +95,7 @@ static QString getSystemLanguage() } // No matches :( Console.Warning("Couldn't find translation for system language %s, using en instead", locale.toStdString().c_str()); - return QStringLiteral("en"); + return QStringLiteral("en-US"); } void QtHost::InstallTranslator(QWidget* dialog_parent) @@ -213,6 +213,11 @@ s32 Host::Internal::GetTranslatedStringImpl( return static_cast(translated_size); } +std::string Host::TranslatePluralToString(const char* context, const char* msg, const char* disambiguation, int count) +{ + return qApp->translate(context, msg, disambiguation, count).toStdString(); +} + std::vector> QtHost::GetAvailableLanguageList() { return { @@ -224,7 +229,7 @@ std::vector> QtHost::GetAvailableLanguageList() {QStringLiteral("Dansk (da-DK)"), QStringLiteral("da-DK")}, {QStringLiteral("Deutsch (de-DE)"), QStringLiteral("de-DE")}, {QStringLiteral("Ελληνικά (el-GR)"), QStringLiteral("el-GR")}, - {QStringLiteral("English (en)"), QStringLiteral("en")}, + {QStringLiteral("English (en)"), QStringLiteral("en-US")}, {QStringLiteral("Español (Hispanoamérica) (es-419)"), QStringLiteral("es-419")}, {QStringLiteral("Español (España) (es-ES)"), QStringLiteral("es-ES")}, {QStringLiteral("فارسی (fa-IR)"), QStringLiteral("fa-IR")}, diff --git a/pcsx2-qt/Translations/pcsx2-qt_en-US.ts b/pcsx2-qt/Translations/pcsx2-qt_en-US.ts new file mode 100644 index 0000000000..92105598e4 --- /dev/null +++ b/pcsx2-qt/Translations/pcsx2-qt_en-US.ts @@ -0,0 +1,117 @@ + + + + + AchievementSettingsWidget + + + + %n seconds + + %n second + %n seconds + + + + + Achievements + + + You have unlocked {} of %n achievements + Achievement popup + + You have unlocked {} of %n achievements + You have unlocked {} of %n achievements + + + + + and earned {} of %n points + Achievement popup + + and earned {} of %n points + and earned {} of %n points + + + + + %n achievements + Mastery popup + + %n achievement + %n achievements + + + + + %n points + Mastery popup + + %n point + %n points + + + + + GameList + + + + %n hours + + %n hour + %n hours + + + + + + %n minutes + + %n minute + %n minutes + + + + + InputBindingWidget + + + %n bindings + + %n binding + %n bindings + + + + + Patch + + + %n GameDB patches are active. + OSD Message + + %n GameDB patch is active. + %n GameDB patches are active. + + + + + %n game patches are active. + OSD Message + + %n game patch is active. + %n game patches are active. + + + + + %n cheat patches are active. + OSD Message + + %n cheat patch is active. + %n cheat patches are active. + + + + diff --git a/pcsx2-qt/Translations/pcsx2-qt_en.ts b/pcsx2-qt/Translations/pcsx2-qt_en.ts index f619d81fc1..c170248b1a 100644 --- a/pcsx2-qt/Translations/pcsx2-qt_en.ts +++ b/pcsx2-qt/Translations/pcsx2-qt_en.ts @@ -1,6 +1,6 @@ - + AboutDialog @@ -369,305 +369,341 @@ Login token generated on %2. Achievements - + Hardcore mode will be enabled on system reset. - - + + {0} cannot be performed while hardcore mode is active. Do you want to disable hardcore mode? {0} will be cancelled if you select No. - + Hardcore mode is now enabled. - + {} (Hardcore Mode) - + + {0}, {1}. + + + + + You have unlocked {} of %n achievements + Achievement popup + + You have unlocked {} of %n achievements + You have unlocked {} of %n achievements + + + + + and earned {} of %n points + Achievement popup + + and earned {} of %n points + and earned {} of %n points + + + + {} (Unofficial) - + Mastered {} - + + {0}, {1} + + + + + %n achievements + Mastery popup + + %n achievement + %n achievements + + + + + %n points + Mastery popup + + %n point + %n points + + + + Leaderboard attempt started. - + Leaderboard attempt failed. - + Your Time: {}{} - + Your Score: {}{} - + Your Value: {}{} - + (Submitting) - + Achievements Disconnected - + An unlock request could not be completed. We will keep retrying to submit this request. - + Achievements Reconnected - + All pending unlock requests have completed. - + Hardcore mode is now disabled. - + Score: {0} pts (softcore: {1} pts) Unread messages: {2} - - + + Confirm Hardcore Mode - + Active Challenge Achievements - + (Hardcore Mode) - + You have unlocked all achievements and earned {} points! - - You have unlocked {0} of {1} achievements, and earned {2} of {3} points. - - - - - {0} achievements, {1} points - - - - + Your Time: {0} (Best: {1}) - + Your Score: {0} (Best: {1}) - + Your Value: {0} (Best: {1}) - + {0} Leaderboard Position: {1} of {2} - + Server error in {0}: {1} - + Yes - + No - + You have unlocked {0} of {1} achievements, earning {2} of {3} possible points. - + Unknown - + Locked - + Unlocked - + Unsupported - + Unofficial - + Recently Unlocked - + Active Challenges - + Almost There - + {} points - + {} point - + XXX points - + Unlocked: {} - + This game has {} leaderboards. - + Submitting scores is disabled because hardcore mode is off. Leaderboards are read-only. - + Show Best - + Show Nearby - + Rank - + Name - + Time - + Score - + Value - + Date Submitted - + Downloading leaderboard data, please wait... - - + + Loading... - - + + Leaderboard download failed - - + + This game has no achievements. - + Failed to read executable from disc. Achievements disabled. @@ -675,240 +711,251 @@ Leaderboard Position: {1} of {2} AdvancedSettingsWidget - + Use Global Setting [%1] - + Rounding Mode - - - + + + Chop/Zero (Default) - + Changes how PCSX2 handles rounding while emulating the Emotion Engine's Floating Point Unit (EE FPU). Because the various FPUs in the PS2 are non-compliant with international standards, some games may need different modes to do math correctly. The default value handles the vast majority of games; <b>modifying this setting when a game is not having a visible problem can cause instability.</b> - + Division Rounding Mode - + Nearest (Default) - + Determines how the results of floating-point division is rounded. Some games need specific settings; <b>modifying this setting when a game is not having a visible problem can cause instability.</b> - + Clamping Mode - - - + + + Normal (Default) - + Changes how PCSX2 handles keeping floats in a standard x86 range. The default value handles the vast majority of games; <b>modifying this setting when a game is not having a visible problem can cause instability.</b> - - + + Enable Recompiler - - - - - - + + + + + - - - + + + + Checked - + Performs just-in-time binary translation of 64-bit MIPS-IV machine code to x86. - + Wait Loop Detection Wait loop: When the game makes the CPU do nothing (loop/spin) while it waits for something to happen (usually an interrupt). - + Moderate speedup for some games, with no known side effects. - + Enable Cache (Slow) - - + + + Unchecked - + Interpreter only, provided for diagnostic. - + INTC Spin Detection INTC = Name of a PS2 register, leave as-is. "spin" = to make a cpu (or gpu) actively do nothing while you wait for something. Like spinning in a circle, you're moving but not actually going anywhere. - + Huge speedup for some games, with almost no compatibility side effects. - + Enable Fast Memory Access - + Uses backpatching to avoid register flushing on every memory access. "Backpatching" = To edit previously generated code to change what it does (in this case, we generate direct memory accesses, then backpatch them to jump to a fancier handler function when we realize they need the fancier handler function) - + Pause On TLB Miss - + Pauses the virtual machine when a TLB miss occurs, instead of ignoring it and continuing. Note that the VM will pause after the end of the block, not on the instruction which caused the exception. Refer to the console to see the address where the invalid access occurred. - + + Enable 128MB RAM (Dev Console) + + + + + Exposes an additional 96MB of memory to the virtual machine. + + + + VU0 Rounding Mode - + Changes how PCSX2 handles rounding while emulating the Emotion Engine's Vector Unit 0 (EE VU0). The default value handles the vast majority of games; <b>modifying this setting when a game is not having a visible problem will cause stability issues and/or crashes.</b> - + VU1 Rounding Mode - + Changes how PCSX2 handles rounding while emulating the Emotion Engine's Vector Unit 1 (EE VU1). The default value handles the vast majority of games; <b>modifying this setting when a game is not having a visible problem will cause stability issues and/or crashes.</b> - + VU0 Clamping Mode - + Changes how PCSX2 handles keeping floats in a standard x86 range in the Emotion Engine's Vector Unit 0 (EE VU0). The default value handles the vast majority of games; <b>modifying this setting when a game is not having a visible problem can cause instability.</b> - + VU1 Clamping Mode - + Changes how PCSX2 handles keeping floats in a standard x86 range in the Emotion Engine's Vector Unit 1 (EE VU1). The default value handles the vast majority of games; <b>modifying this setting when a game is not having a visible problem can cause instability.</b> - + Enable VU0 Recompiler (Micro Mode) VU0 = Vector Unit 0. One of the PS2's processors. - + Enables VU0 Recompiler. - + Enable VU1 Recompiler VU1 = Vector Unit 1. One of the PS2's processors. - + Enables VU1 Recompiler. - + mVU Flag Hack mVU = PCSX2's recompiler for VU (Vector Unit) code (full name: microVU) - + Good speedup and high compatibility, may cause graphical errors. - + Performs just-in-time binary translation of 32-bit MIPS-I machine code to x86. - + Enable Game Fixes - + Automatically loads and applies fixes to known problematic games on game start. - + Enable Compatibility Patches - + Automatically loads and applies compatibility patches to known problematic games. @@ -934,24 +981,24 @@ Leaderboard Position: {1} of {2} - - + + Nearest - - + + Negative - - + + Positive @@ -962,22 +1009,22 @@ Leaderboard Position: {1} of {2} - - + + None - - + + Normal (Default) - - + + Chop/Zero (Default) @@ -1005,8 +1052,8 @@ Leaderboard Position: {1} of {2} - - + + Extra + Preserve Sign Sign: refers here to the mathematical meaning (plus/minus). @@ -1023,7 +1070,7 @@ Leaderboard Position: {1} of {2} - + Enable Recompiler @@ -1048,106 +1095,111 @@ Leaderboard Position: {1} of {2} - + + Enable 128MB RAM (Dev Console) + + + + Vector Units (VU) Vector Unit/VU: refers to two of PS2's processors. Do not translate the full text or do so as a comment. Leave the acronym as-is. - + VU1 Rounding Mode: - + mVU Flag Hack - + Enable VU1 Recompiler - + Enable VU0 Recompiler (Micro Mode) - - + + Extra - + VU0 Clamping Mode: - + VU0 Rounding Mode: - + VU1 Clamping Mode: - + I/O Processor (IOP, MIPS-I) - + Game Settings - + Enable Game Fixes - + Enable Compatibility Patches - + Frame Rate Control - - + + hz hz=Hertz, as in the measuring unit. Shown after the corresponding number. Those languages who'd need to remove the space or do something in between should do so. - + PAL Frame Rate: - + NTSC Frame Rate: - + PINE Settings - + Slot: - + Enable @@ -1256,62 +1308,61 @@ Leaderboard Position: {1} of {2} - - - + Stretch Settings - + Buffer Size: - + Maximum latency: 0 frames (0.00ms) - + Backend: - + + 0 ms - + Controls - + Output Volume: - - + + 100% - + Fast Forward Volume: - + Mute All Sound - + Synchronization: @@ -1321,22 +1372,22 @@ Leaderboard Position: {1} of {2} - + Expansion: - + Output Latency: - + Minimal - + Output Device: @@ -1372,8 +1423,28 @@ Leaderboard Position: {1} of {2} - + + Resets output volume back to the global/inherited setting. + + + + + Resets output volume back to the default. + + + + + Resets fast forward volume back to the global/inherited setting. + + + + + Resets fast forward volume back to the default. + + + + %1% @@ -1390,7 +1461,7 @@ Leaderboard Position: {1} of {2} - + % @@ -1408,6 +1479,7 @@ Leaderboard Position: {1} of {2} + %1 ms @@ -1472,23 +1544,13 @@ Leaderboard Position: {1} of {2} + Reset Volume - - - Resets volume back to the global/inherited setting. - - - - - - Resets volume back to the default, i.e. full. - - - + Reset Fast Forward Volume @@ -1499,22 +1561,22 @@ Leaderboard Position: {1} of {2} - + Maximum Latency: %1 ms (%2 ms buffer + %3 ms expand + %4 ms output) - + Maximum Latency: %1 ms (%2 ms buffer + %3 ms output) - + Maximum Latency: %1 ms (%2 ms expand, minimum output latency unknown) - + Maximum Latency: %1 ms (minimum output latency unknown) @@ -2393,17 +2455,17 @@ Leaderboard Position: {1} of {2} ControllerCustomSettingsWidget - + Restore Default Settings - + Browse... - + Select File @@ -2599,7 +2661,7 @@ Leaderboard Position: {1} of {2} - + 100% @@ -2609,58 +2671,63 @@ Leaderboard Position: {1} of {2} - + Select the trigger to activate this macro. This can be a single button, or combination of buttons (chord). Shift-click for multiple triggers. - + + Press To Toggle + + + + Deadzone: - + Frequency - + Macro will toggle every N frames. - + Set... - + Not Configured - - + + %1% - + Set Frequency - + Frequency: - + Macro will not repeat. - + Macro will toggle buttons every %1 frames. @@ -2772,7 +2839,7 @@ Not Configured/Buttons configured - Load Profile + Apply Profile @@ -2787,13 +2854,14 @@ Not Configured/Buttons configured - + Restore Defaults + Create Input Profile @@ -2807,9 +2875,9 @@ Enter the name for the new input profile: - - - + + + Error @@ -2824,17 +2892,22 @@ Enter the name for the new input profile: - - Failed to save the new profile to '%1'. + + Do you want to copy the current hotkey bindings from global settings to the new input profile? + Failed to save the new profile to '%1'. + + + + Load Input Profile - + Are you sure you want to load the input profile named '%1'? All current global bindings will be removed, and the profile bindings loaded. @@ -2843,24 +2916,24 @@ You cannot undo this action. - + Delete Input Profile - + Are you sure you want to delete the input profile named '%1'? You cannot undo this action. - + Failed to delete '%1'. - + Are you sure you want to restore the default controller configuration? All shared bindings and configuration will be lost, but your input profiles will remain. @@ -2869,46 +2942,46 @@ You cannot undo this action. - + Global Settings - - + + Controller Port %1%2 %3 Controller Port is an official term from Sony. Find the official translation for your language inside the console's manual. - - + + Controller Port %1 %2 Controller Port is an official term from Sony. Find the official translation for your language inside the console's manual. - - + + USB Port %1 %2 - + Hotkeys - + Shared "Shared" refers here to the shared input profile. - + The input profile named '%1' cannot be found. @@ -3855,81 +3928,81 @@ Enter function name EmuThread - + Slot: %1 | %2 | EE: %3% | VU: %4% | GS: %5% - + Slot: %1 | %2 | EE: %3% | GS: %4% - + No Image - + %1x%2 - + Game: %1 FPS - + Video: %1 FPS (%2%) - + Game: %1 (%2) - + Rich presence inactive or unsupported. - + Game not loaded or no RetroAchievements available. - - - - + + + + Error - + Failed to create HTTPDownloader. - + Downloading %1... - + Download failed with HTTP status code %1. - + Download failed: Data is empty. - + Failed to write '%1'. @@ -4439,4291 +4512,4263 @@ The URL was: %1 FullscreenUI - + Could not find any CD/DVD-ROM devices. Please ensure you have a drive connected and sufficient permissions to access it. - + Use Global Setting - + Automatic binding failed, no devices are available. - + Game title copied to clipboard. - + Game serial copied to clipboard. - + Game CRC copied to clipboard. - + Game type copied to clipboard. - + Game region copied to clipboard. - + Game compatibility copied to clipboard. - + Game path copied to clipboard. - + Per-game controller configuration initialized with global settings. - + Controller settings reset to default. - + No input profiles available. - + Create New... - + Enter the name of the input profile you wish to create. - + Are you sure you want to restore the default settings? Any preferences will be lost. - + Settings reset to defaults. - + No save present in this slot. - + No save states found. - + Failed to delete save state. - + Failed to copy text to clipboard. - + This game has no achievements. - + This game has no leaderboards. - + Reset System - + Hardcore mode will not be enabled until the system is reset. Do you want to reset the system now? - + Launch a game from images scanned from your game directories. - + Launch a game by selecting a file/disc image. - + Start the console without any disc inserted. - + Start a game from a disc in your PC's DVD drive. - + No Binding - + Setting %s binding %s. - + Push a controller button or axis now. - + Timing out in %.0f seconds... - + Unknown - + OK - + Select Device - + Details - + Options - + Copies the current global settings to this game. - + Clears all settings set for this game. - + Behaviour - + Prevents the screen saver from activating and the host from sleeping while emulation is running. - + Shows the game you are currently playing as part of your profile on Discord. - + Pauses the emulator when a game is started. - + Pauses the emulator when you minimize the window or switch to another application, and unpauses when you switch back. - + Pauses the emulator when you open the quick menu, and unpauses when you close it. - + Determines whether a prompt will be displayed to confirm shutting down the emulator/game when the hotkey is pressed. - + Automatically saves the emulator state when powering down or exiting. You can then resume directly from where you left off next time. - + Uses a light coloured theme instead of the default dark theme. - + Game Display - + Switches between full screen and windowed when the window is double-clicked. - + Hides the mouse pointer/cursor when the emulator is in fullscreen mode. - + Determines how large the on-screen messages and monitor are. - + Shows on-screen-display messages when events occur such as save states being created/loaded, screenshots being taken, etc. - + Shows the current emulation speed of the system in the top-right corner of the display as a percentage. - + Shows the number of video frames (or v-syncs) displayed per second by the system in the top-right corner of the display. - + Shows the CPU usage based on threads in the top-right corner of the display. - + Shows the host's GPU usage in the top-right corner of the display. - + Shows statistics about GS (primitives, draw calls) in the top-right corner of the display. - + Shows indicators when fast forwarding, pausing, and other abnormal states are active. - + Shows the current configuration in the bottom-right corner of the display. - + Shows the current controller state of the system in the bottom-left corner of the display. - + Shows a visual history of frame times in the upper-left corner of the display. - + Displays warnings when settings are enabled which may break games. - + Resets configuration to defaults (excluding controller settings). - + Changes the BIOS image used to start future sessions. - + Automatic - + {0}/{1}/{2}/{3} - + Default - + WARNING: Your memory card is still writing data. Shutting down now will IRREVERSIBLY DESTROY YOUR MEMORY CARD. It is strongly recommended to resume your game and let it finish writing to your memory card. Do you wish to shutdown anyways and IRREVERSIBLY DESTROY YOUR MEMORY CARD? - + Automatically switches to fullscreen mode when a game is started. - + On-Screen Display - + %d%% - + Shows the resolution of the game in the top-right corner of the display. - + BIOS Configuration - + BIOS Selection - + Options and Patches - + Skips the intro screen, and bypasses region checks. - + Speed Control - + Normal Speed - + Sets the speed when running without fast forwarding. - + Fast Forward Speed - + Sets the speed when using the fast forward hotkey. - + Slow Motion Speed - + Sets the speed when using the slow motion hotkey. - - When disabled, the game will run as fast as possible. - - - - + System Settings - + EE Cycle Rate - + Underclocks or overclocks the emulated Emotion Engine CPU. - + EE Cycle Skipping - + Affinity Control Mode - + Pins emulation threads to CPU cores to potentially improve performance/frame time variance. - + Enable MTVU (Multi-Threaded VU1) - + Enable Instant VU1 - + Enable Cheats - + Enables loading cheats from pnach files. - + Enable Host Filesystem - + Enables access to files from the host: namespace in the virtual machine. - + Enable Fast CDVD - + Fast disc access, less loading times. Not recommended. - + Frame Pacing/Latency Control - + Maximum Frame Latency - + Sets the number of frames which can be queued. - + Optimal Frame Pacing - + Synchronize EE and GS threads after each frame. Lowest input latency, but increases system requirements. - + Speeds up emulation so that the guest refresh rate matches the host. - + Renderer - + Selects the API used to render the emulated GS. - + Sync To Host Refresh (VSync) - + Synchronizes frame presentation with host refresh. - + Display - + Aspect Ratio - + Selects the aspect ratio to display the game content at. - + FMV Aspect Ratio - + Selects the aspect ratio for display when a FMV is detected as playing. - + Deinterlacing - + Selects the algorithm used to convert the PS2's interlaced output to progressive for display. - + Screenshot Size - + Determines the resolution at which screenshots will be saved. - + Screenshot Format - + Selects the format which will be used to save screenshots. - + Screenshot Quality - + Selects the quality at which screenshots will be compressed. - + Vertical Stretch - + Increases or decreases the virtual picture size vertically. - + Crop - + Crops the image, while respecting aspect ratio. - + %dpx - + Enable Widescreen Patches - + Enables loading widescreen patches from pnach files. - + Enable No-Interlacing Patches - + Enables loading no-interlacing patches from pnach files. - + Bilinear Upscaling - + Smooths out the image when upscaling the console to the screen. - + Integer Upscaling - + Adds padding to the display area to ensure that the ratio between pixels on the host to pixels in the console is an integer number. May result in a sharper image in some 2D games. - + Screen Offsets - + Enables PCRTC Offsets which position the screen as the game requests. - + Show Overscan - + Enables the option to show the overscan area on games which draw more than the safe area of the screen. - + Anti-Blur - + Enables internal Anti-Blur hacks. Less accurate to PS2 rendering but will make a lot of games look less blurry. - + Rendering - + Internal Resolution - + Multiplies the render resolution by the specified factor (upscaling). - + Mipmapping - + Determines how mipmaps are used when rendering textures. - + Bilinear Filtering - + Selects where bilinear filtering is utilized when rendering textures. - + Trilinear Filtering - + Selects where trilinear filtering is utilized when rendering textures. - + Anisotropic Filtering - + Dithering - + Selects the type of dithering applies when the game requests it. - + Blending Accuracy - + Determines the level of accuracy when emulating blend modes not supported by the host graphics API. - + Texture Preloading - + Uploads full textures to the GPU on use, rather than only the utilized regions. Can improve performance in some games. - + Software Rendering Threads - + Number of threads to use in addition to the main GS thread for rasterization. - + Auto Flush (Software) - + Force a primitive flush when a framebuffer is also an input texture. - + Edge AA (AA1) - + Enables emulation of the GS's edge anti-aliasing (AA1). - + Enables emulation of the GS's texture mipmapping. - + Hardware Fixes - + Manual Hardware Fixes - + Disables automatic hardware fixes, allowing you to set fixes manually. - + CPU Sprite Render Size - + Uses software renderer to draw texture decompression-like sprites. - + CPU Sprite Render Level - + Determines filter level for CPU sprite render. - + Software CLUT Render - + Uses software renderer to draw texture CLUT points/sprites. - + Skip Draw Start - + Object range to skip drawing. - + Skip Draw End - + Auto Flush (Hardware) - + CPU Framebuffer Conversion - + Disable Depth Conversion - + Disable Safe Features - + This option disables multiple safe features. - + This option disables game-specific render fixes. - + Uploads GS data when rendering a new frame to reproduce some effects accurately. - + Disable Partial Invalidation - + Removes texture cache entries when there is any intersection, rather than only the intersected areas. - + Allows the texture cache to reuse as an input texture the inner portion of a previous framebuffer. - + Read Targets When Closing - + Flushes all targets in the texture cache back to local memory when shutting down. - + Estimate Texture Region - + Attempts to reduce the texture size when games do not set it themselves (e.g. Snowblind games). - + GPU Palette Conversion - + Upscaling Fixes - + Adjusts vertices relative to upscaling. - + Round Sprite - + Adjusts sprite coordinates. - + Bilinear Upscale - + Can smooth out textures due to be bilinear filtered when upscaling. E.g. Brave sun glare. - + Adjusts target texture offsets. - + Align Sprite - + Fixes issues with upscaling (vertical lines) in some games. - + Merge Sprite - + Replaces multiple post-processing sprites with a larger single sprite. - + Wild Arms Hack - + Lowers the GS precision to avoid gaps between pixels when upscaling. Fixes the text on Wild Arms games. - + Unscaled Palette Texture Draws - + Can fix some broken effects which rely on pixel perfect precision. - + Texture Replacement - + Load Textures - + Loads replacement textures where available and user-provided. - + Asynchronous Texture Loading - + Loads replacement textures on a worker thread, reducing microstutter when replacements are enabled. - + Precache Replacements - + Preloads all replacement textures to memory. Not necessary with asynchronous loading. - + Replacements Directory - + Folders - + Texture Dumping - + Dump Textures - + Dump Mipmaps - + Includes mipmaps when dumping textures. - + Dump FMV Textures - + Allows texture dumping when FMVs are active. You should not enable this. - + Post-Processing - + FXAA - + Enables FXAA post-processing shader. - + Contrast Adaptive Sharpening - + Enables FidelityFX Contrast Adaptive Sharpening. - + CAS Sharpness - + Determines the intensity the sharpening effect in CAS post-processing. - + Filters - + Shade Boost - + Enables brightness/contrast/saturation adjustment. - + Shade Boost Brightness - + Adjusts brightness. 50 is normal. - + Shade Boost Contrast - + Adjusts contrast. 50 is normal. - + Shade Boost Saturation - + Adjusts saturation. 50 is normal. - + TV Shaders - + Advanced - + Skip Presenting Duplicate Frames - + Disable Threaded Presentation - + Hardware Download Mode - + Changes synchronization behavior for GS downloads. - + Allow Exclusive Fullscreen - + Overrides the driver's heuristics for enabling exclusive fullscreen, or direct flip/scanout. - + Override Texture Barriers - + Forces texture barrier functionality to the specified value. - + GS Dump Compression - + Sets the compression algorithm for GS dumps. - + Disable Framebuffer Fetch - + Prevents the usage of framebuffer fetch when supported by host GPU. - + Disable Shader Cache - + Prevents the loading and saving of shaders/pipelines to disk. - + Disable Vertex Shader Expand - + Falls back to the CPU for expanding sprites/lines. - - Runtime Settings - - - - - Applies a global volume modifier to all sound produced by the game. - - - - - Mixing Settings - - - - + Changes when SPU samples are generated relative to system emulation. - - Determines how the stereo output is transformed to greater speaker counts. - - - - - Output Settings - - - - - Determines which API is used to play back audio samples on the host. - - - - - Sets the average output latency when using the cubeb backend. - - - - - %d ms (avg) - - - - - Timestretch Settings - - - - - Affects how the timestretcher operates when not running at 100% speed. - - - - + %d ms - + Settings and Operations - + Creates a new memory card file or folder. - + Simulates a larger memory card by filtering saves only to the current game. - + If not set, this card will be considered unplugged. - + The selected memory card image will be used for this slot. - + Enable/Disable the Player LED on DualSense controllers. - + {:%H:%M} - + Slot {} - + WebP - + Change Selection - + Select - + Parent Directory - + Enter Value - + About - + Toggle Fullscreen - + Navigate - + Load Global State - + Change Page - + Return To Game - + Select State - + Select Game - + Change View - + Launch Options - + Create Save State Backups - + Create Memory Card - + Configuration - + Start Game - + Launch a game from a file, disc, or starts the console without any disc inserted. - + Changes settings for the application. - + Return to desktop mode, or exit the application. - + Back - + Return to the previous menu. - + Exit PCSX2 - + Completely exits the application, returning you to your desktop. - + Desktop Mode - + Exits Big Picture mode, returning to the desktop interface. - + Uses game-specific settings for controllers for this game. - + Copies the global controller configuration to this game. - + Resets all configuration to defaults (including bindings). - + Replaces these settings with a previously saved input profile. - + Stores the current settings to an input profile. - + Input Sources - + The SDL input source supports most controllers. - + Provides vibration and LED control support over Bluetooth. - + Allow SDL to use raw access to input devices. - + The XInput source provides support for XBox 360/XBox One/XBox Series controllers. - + Multitap - + Enables an additional three controller slots. Not supported in all games. - + Attempts to map the selected port to a chosen controller. - + Determines how much pressure is simulated when macro is active. - + Determines the pressure required to activate the macro. - + Toggle every %d frames - + Clears all bindings for this USB controller. - + Data Save Locations - + Show Advanced Settings - + Changing these options may cause games to become non-functional. Modify at your own risk, the PCSX2 team will not provide support for configurations with these settings changed. - + Logging - + System Console - + Writes log messages to the system console (console window/standard output). - + File Logging - + Writes log messages to emulog.txt. - + Verbose Logging - + Writes dev log messages to log sinks. - + Log Timestamps - + Writes timestamps alongside log messages. - + EE Console - + Writes debug messages from the game's EE code to the console. - + IOP Console - + Writes debug messages from the game's IOP code to the console. - + CDVD Verbose Reads - + Logs disc reads from games. - + Emotion Engine - + Rounding Mode - + Determines how the results of floating-point operations are rounded. Some games need specific settings. - + Division Rounding Mode - + Determines how the results of floating-point division is rounded. Some games need specific settings. - + Clamping Mode - + Determines how out-of-range floating point numbers are handled. Some games need specific settings. - + Enable EE Recompiler - + Performs just-in-time binary translation of 64-bit MIPS-IV machine code to native code. - + Enable EE Cache - + Enables simulation of the EE's cache. Slow. - + Enable INTC Spin Detection - + Huge speedup for some games, with almost no compatibility side effects. - + Enable Wait Loop Detection - + Moderate speedup for some games, with no known side effects. - + Enable Fast Memory Access - + Uses backpatching to avoid register flushing on every memory access. - + Vector Units - + VU0 Rounding Mode - + VU0 Clamping Mode - + VU1 Rounding Mode - + VU1 Clamping Mode - + Enable VU0 Recompiler (Micro Mode) - + New Vector Unit recompiler with much improved compatibility. Recommended. - + Enable VU1 Recompiler - + Enable VU Flag Optimization - + Good speedup and high compatibility, may cause graphical errors. - + I/O Processor - + Enable IOP Recompiler - + Performs just-in-time binary translation of 32-bit MIPS-I machine code to native code. - + Graphics - + Use Debug Device - + Settings - + No cheats are available for this game. - + Cheat Codes - + No patches are available for this game. - + Game Patches - + Activating cheats can cause unpredictable behavior, crashing, soft-locks, or broken saved games. - + Activating game patches can cause unpredictable behavior, crashing, soft-locks, or broken saved games. - + Use patches at your own risk, the PCSX2 team will provide no support for users who have enabled game patches. - + Game Fixes - + Game fixes should not be modified unless you are aware of what each option does and the implications of doing so. - + FPU Multiply Hack - + For Tales of Destiny. - + Preload TLB Hack - + Needed for some games with complex FMV rendering. - + Skip MPEG Hack - + Skips videos/FMVs in games to avoid game hanging/freezes. - + OPH Flag Hack - + EE Timing Hack - + Instant DMA Hack - + Known to affect following games: Mana Khemia 1, Metal Saga, Pilot Down Behind Enemy Lines. - + For SOCOM 2 HUD and Spy Hunter loading hang. - + VU Add Hack - + Full VU0 Synchronization - + Forces tight VU0 sync on every COP2 instruction. - + VU Overflow Hack - + To check for possible float overflows (Superman Returns). - + Use accurate timing for VU XGKicks (slower). - - Quadraphonic - - - - + Load State - + Makes the emulated Emotion Engine skip cycles. Helps a small subset of games like SOTC. Most of the time it's harmful to performance. - + Generally a speedup on CPUs with 4 or more cores. Safe for most games, but a few are incompatible and may hang. - + Runs VU1 instantly. Provides a modest speed improvement in most games. Safe for most games, but a few games may exhibit graphical errors. - + Scale To Host Refresh Rate - + Disable the support of depth buffers in the texture cache. - + Disable Render Fixes - + Preload Frame Data - + Texture Inside RT - + When enabled GPU converts colormap-textures, otherwise the CPU will. It is a trade-off between GPU and CPU. - + Half Pixel Offset - + Texture Offset X - + Texture Offset Y - + Dumps replaceable textures to disk. Will reduce performance. - + Applies a shader which replicates the visual effects of different styles of television set. - + Skips displaying frames that don't change in 25/30fps games. Can improve speed, but increase input lag/make frame pacing worse. - + Presents frames on the main GS thread instead of a worker thread. Used for debugging frametime issues. - + Enables API-level validation of graphics commands. - + Use Software Renderer For FMVs - + To avoid TLB miss on Goemon. - + General-purpose timing hack. Known to affect following games: Digital Devil Saga, SSX. - + Good for cache emulation problems. Known to affect following games: Fire Pro Wrestling Z. - + Known to affect following games: Bleach Blade Battlers, Growlanser II and III, Wizardry. - + Emulate GIF FIFO - + Correct but slower. Known to affect the following games: Fifa Street 2. - + DMA Busy Hack - + Delay VIF1 Stalls - + Emulate VIF FIFO - + Simulate VIF1 FIFO read ahead. Known to affect following games: Test Drive Unlimited, Transformers. - + VU I Bit Hack - + Avoids constant recompilation in some games. Known to affect the following games: Scarface The World is Yours, Crash Tag Team Racing. - + For Tri-Ace Games: Star Ocean 3, Radiata Stories, Valkyrie Profile 2. - + VU Sync - + Run behind. To avoid sync problems when reading or writing VU registers. - + VU XGKick Sync - + Force Blit Internal FPS Detection - + Save State - + Load Resume State - + A resume save state created at %s was found. Do you want to load this save and continue? - + Region: - + Compatibility: - + No Game Selected - + Search Directories - + Adds a new directory to the game search list. - + Scanning Subdirectories - + Not Scanning Subdirectories - + List Settings - + Sets which view the game list will open to. - + Determines which field the game list will be sorted by. - + Reverses the game list sort order from the default (usually ascending to descending). - + Cover Settings - + Downloads covers from a user-specified URL template. - + Operations - + Selects where anisotropic filtering is utilized when rendering textures. - + Use alternative method to calculate internal FPS to avoid false readings in some games. - + Identifies any new files added to the game directories. - + Forces a full rescan of all games previously identified. - + Download Covers - + About PCSX2 - + PCSX2 is a free and open-source PlayStation 2 (PS2) emulator. Its purpose is to emulate the PS2's hardware, using a combination of MIPS CPU Interpreters, Recompilers and a Virtual Machine which manages hardware states and PS2 system memory. This allows you to play PS2 games on your PC, with many additional features and benefits. - + PlayStation 2 and PS2 are registered trademarks of Sony Interactive Entertainment. This application is not affiliated in any way with Sony Interactive Entertainment. - + When enabled and logged in, PCSX2 will scan for achievements on startup. - + "Challenge" mode for achievements, including leaderboard tracking. Disables save state, cheats, and slowdown functions. - + Displays popup messages on events such as achievement unlocks and leaderboard submissions. - + Plays sound effects for events such as achievement unlocks and leaderboard submissions. - + Shows icons in the lower-right corner of the screen when a challenge/primed achievement is active. - + When enabled, PCSX2 will list achievements from unofficial sets. These achievements are not tracked by RetroAchievements. - + When enabled, PCSX2 will assume all achievements are locked and not send any unlock notifications to the server. - - Displays popup messages when starting, submitting, or failing a leaderboard challenge. + + Error - - When enabled, each session will behave as if no achievements have been unlocked. + + Pauses the emulator when a controller with bindings is disconnected. - - Account + + Creates a backup copy of a save state if it already exists when the save is created. The backup copy has a .backup suffix - - Logs out of RetroAchievements. + + Audio Control - - Logs in to RetroAchievements. + + Controls the volume of the audio played on the host. - - Current Game + + Fast Forward Volume - - {} is not a valid disc image. + + Controls the volume of the audio played on the host when fast forwarding. - - Automatic mapping completed for {}. + + Mute All Sound - - Automatic mapping failed for {}. + + Prevents the emulator from producing any audible sound. - - Game settings initialized with global settings for '{}'. - - - - - Game settings have been cleared for '{}'. - - - - - {} (Current) - - - - - {} (Folder) - - - - - Failed to load '{}'. - - - - - Input profile '{}' loaded. - - - - - Input profile '{}' saved. - - - - - Failed to save input profile '{}'. - - - - - Port {} Controller Type - - - - - Select Macro {} Binds - - - - - Port {} Device - - - - - Port {} Subtype - - - - - {} unlabelled patch codes will automatically activate. - - - - - {} unlabelled patch codes found but not enabled. - - - - - This Session: {} - - - - - All Time: {} - - - - - Save Slot {0} - - - - - Saved {} - - - - - {} does not exist. - - - - - {} deleted. - - - - - Failed to delete {}. - - - - - File: {} - - - - - CRC: {:08X} - - - - - Time Played: {} - - - - - Last Played: {} - - - - - Size: {:.2f} MB - - - - - Left: - - - - - Top: - - - - - Right: - - - - - Bottom: - - - - - Summary - - - - - Interface Settings - - - - - BIOS Settings - - - - - Emulation Settings - - - - - Graphics Settings - - - - - Audio Settings - - - - - Memory Card Settings - - - - - Controller Settings - - - - - Hotkey Settings - - - - - Achievements Settings - - - - - Folder Settings - - - - - Advanced Settings - - - - - Patches - - - - - Cheats - - - - - 2% [1 FPS (NTSC) / 1 FPS (PAL)] - - - - - 10% [6 FPS (NTSC) / 5 FPS (PAL)] - - - - - 25% [15 FPS (NTSC) / 12 FPS (PAL)] - - - - - 50% [30 FPS (NTSC) / 25 FPS (PAL)] - - - - - 75% [45 FPS (NTSC) / 37 FPS (PAL)] - - - - - 90% [54 FPS (NTSC) / 45 FPS (PAL)] - - - - - 100% [60 FPS (NTSC) / 50 FPS (PAL)] - - - - - 110% [66 FPS (NTSC) / 55 FPS (PAL)] - - - - - 120% [72 FPS (NTSC) / 60 FPS (PAL)] - - - - - 150% [90 FPS (NTSC) / 75 FPS (PAL)] - - - - - 175% [105 FPS (NTSC) / 87 FPS (PAL)] - - - - - 200% [120 FPS (NTSC) / 100 FPS (PAL)] - - - - - 300% [180 FPS (NTSC) / 150 FPS (PAL)] - - - - - 400% [240 FPS (NTSC) / 200 FPS (PAL)] - - - - - 500% [300 FPS (NTSC) / 250 FPS (PAL)] - - - - - 1000% [600 FPS (NTSC) / 500 FPS (PAL)] - - - - - 50% Speed - - - - - 60% Speed - - - - - 75% Speed - - - - - 100% Speed (Default) - - - - - 130% Speed - - - - - 180% Speed - - - - - 300% Speed - - - - - Normal (Default) - - - - - Mild Underclock - - - - - Moderate Underclock - - - - - Maximum Underclock - - - - - Disabled - - - - - EE > VU > GS - - - - - EE > GS > VU - - - - - VU > EE > GS - - - - - VU > GS > EE - - - - - GS > EE > VU - - - - - GS > VU > EE - - - - - 0 Frames (Hard Sync) - - - - - 1 Frame - - - - - 2 Frames - - - - - 3 Frames - - - - - None - - - - - Extra + Preserve Sign - - - - - Full - - - - - Extra - - - - - Automatic (Default) - - - - - Direct3D 11 - - - - - Direct3D 12 - - - - - OpenGL - - - - - Vulkan - - - - - Metal - - - - - Software - - - - - Null - - - - - Off - - - - - On - - - - - Adaptive - - - - - Bilinear (Smooth) - - - - - Bilinear (Sharp) - - - - - Weave (Top Field First, Sawtooth) - - - - - Weave (Bottom Field First, Sawtooth) - - - - - Bob (Top Field First) - - - - - Bob (Bottom Field First) - - - - - Blend (Top Field First, Half FPS) - - - - - Blend (Bottom Field First, Half FPS) - - - - - Adaptive (Top Field First) - - - - - Adaptive (Bottom Field First) - - - - - Native (PS2) - - - - - 1.25x Native - - - - - 1.5x Native - - - - - 1.75x Native - - - - - 2x Native (~720p) - - - - - 2.25x Native - - - - - 2.5x Native - - - - - 2.75x Native - - - - - 3x Native (~1080p) - - - - - 3.5x Native - - - - - 4x Native (~1440p/2K) - - - - - 5x Native (~1620p) - - - - - 6x Native (~2160p/4K) - - - - - 7x Native (~2520p) - - - - - 8x Native (~2880p) - - - - - Basic (Generated Mipmaps) - - - - - Full (PS2 Mipmaps) - - - - - Nearest - - - - - Bilinear (Forced) - - - - - Bilinear (PS2) - - - - - Bilinear (Forced excluding sprite) - - - - - Off (None) - - - - - Trilinear (PS2) - - - - - Trilinear (Forced) - - - - - Scaled - - - - - Unscaled (Default) - - - - - Minimum - - - - - Basic (Recommended) - - - - - Medium - - - - - High - - - - - Full (Slow) - - - - - Maximum (Very Slow) - - - - - Off (Default) - - - - - 2x - - - - - 4x - - - - - 8x - - - - - 16x - - - - - Partial - - - - - Full (Hash Cache) - - - - - Force Disabled - - - - - Force Enabled - - - - - Accurate (Recommended) - - - - - Disable Readbacks (Synchronize GS Thread) - - - - - Unsynchronized (Non-Deterministic) - - - - - Disabled (Ignore Transfers) - - - - - Screen Resolution - - - - - Internal Resolution (Aspect Uncorrected) - - - - - WARNING: Memory Card Busy - - - - - Cannot show details for games which were not scanned in the game list. - - - - - SDL DualSense Player LED - - - - - Deadzone - - - - - Full Boot - - - - - Achievement Notifications - - - - - Leaderboard Notifications - - - - - Enable In-Game Overlays - - - - - Encore Mode - - - - - Spectator Mode - - - - - PNG - - - - - - - - - - - Convert 4-bit and 8-bit framebuffer on the CPU instead of the GPU. + + Backend Settings - Removes the current card from the slot. + Audio Backend - - Determines the frequency at which the macro will toggle the buttons on and off (aka auto fire). + + The audio backend determines how frames produced by the emulator are submitted to the host. + + + + + Expansion + + + + + Determines how audio is expanded from stereo to surround for supported games. + + + + + Synchronization + + + + + Buffer Size + + + + + Determines the amount of audio buffered before being pulled by the host API. + + + + + Output Latency + + + + + Determines how much latency there is between the audio being picked up by the host API, and played through speakers. + + + + + Minimal Output Latency + + + + + When enabled, the minimum supported output latency will be used for the host API. + + + + + Displays popup messages when starting, submitting, or failing a leaderboard challenge. + + + + + When enabled, each session will behave as if no achievements have been unlocked. + + + + + Account + + + + + Logs out of RetroAchievements. - {} Frames + Logs in to RetroAchievements. + + + + + Current Game + + + + + An error occurred while deleting empty game settings: +{} + + + + + An error occurred while saving game settings: +{} + + + + + {} is not a valid disc image. + + + + + Automatic mapping completed for {}. + + + + + Automatic mapping failed for {}. + + + + + Game settings initialized with global settings for '{}'. + + + + + Game settings have been cleared for '{}'. + + + + + {} (Current) + + + + + {} (Folder) + + + + + Failed to load '{}'. + + + + + Input profile '{}' loaded. + + + + + Input profile '{}' saved. + + + + + Failed to save input profile '{}'. + + + + + Port {} Controller Type + + + + + Select Macro {} Binds + + + + + Port {} Device + + + + + Port {} Subtype + + + + + {} unlabelled patch codes will automatically activate. + + + + + {} unlabelled patch codes found but not enabled. + + + + + This Session: {} + + + + + All Time: {} + + + + + Save Slot {0} + + + + + Saved {} + + + + + {} does not exist. + + + + + {} deleted. + + + + + Failed to delete {}. + + + + + File: {} + + + + + CRC: {:08X} + + + + + Time Played: {} + + + + + Last Played: {} + + + + + Size: {:.2f} MB + + + + + Left: + + + + + Top: + + + + + Right: + + + + + Bottom: + + + + + Summary + + + + + Interface Settings + + + + + BIOS Settings + + + + + Emulation Settings + + + + + Graphics Settings + + + + + Audio Settings + + + + + Memory Card Settings + + + + + Controller Settings + + + + + Hotkey Settings + + + + + Achievements Settings + + + + + Folder Settings + + + + + Advanced Settings + + + + + Patches + + + + + Cheats + + + + + 2% [1 FPS (NTSC) / 1 FPS (PAL)] + + + + + 10% [6 FPS (NTSC) / 5 FPS (PAL)] + + + + + 25% [15 FPS (NTSC) / 12 FPS (PAL)] + + + + + 50% [30 FPS (NTSC) / 25 FPS (PAL)] + + + + + 75% [45 FPS (NTSC) / 37 FPS (PAL)] + + + + + 90% [54 FPS (NTSC) / 45 FPS (PAL)] + + + + + 100% [60 FPS (NTSC) / 50 FPS (PAL)] + + + + + 110% [66 FPS (NTSC) / 55 FPS (PAL)] + + + + + 120% [72 FPS (NTSC) / 60 FPS (PAL)] + + + + + 150% [90 FPS (NTSC) / 75 FPS (PAL)] + + + + + 175% [105 FPS (NTSC) / 87 FPS (PAL)] + + + + + 200% [120 FPS (NTSC) / 100 FPS (PAL)] + + + + + 300% [180 FPS (NTSC) / 150 FPS (PAL)] + + + + + 400% [240 FPS (NTSC) / 200 FPS (PAL)] + + + + + 500% [300 FPS (NTSC) / 250 FPS (PAL)] + + + + + 1000% [600 FPS (NTSC) / 500 FPS (PAL)] + + + + + 50% Speed + + + + + 60% Speed + + + + + 75% Speed + + + + + 100% Speed (Default) + + + + + 130% Speed + + + + + 180% Speed + + + + + 300% Speed + + + + + Normal (Default) + + + + + Mild Underclock + + + + + Moderate Underclock + + + + + Maximum Underclock + + + + + Disabled + + + + + EE > VU > GS + + + + + EE > GS > VU + + + + + VU > EE > GS + + + + + VU > GS > EE + + + + + GS > EE > VU + + + + + GS > VU > EE + + + + + 0 Frames (Hard Sync) - No Deinterlacing + 1 Frame + + + + + 2 Frames + + + + + 3 Frames + + + + + None + + + + + Extra + Preserve Sign + + + + + Full + + + + + Extra + + + + + Automatic (Default) + + + + + Direct3D 11 + + + + + Direct3D 12 + + + + + OpenGL + + + + + Vulkan + + + + + Metal + + + + + Software + + + + + Null + + + + + Off + + + + + Bilinear (Smooth) + + + + + Bilinear (Sharp) + + + + + Weave (Top Field First, Sawtooth) + + + + + Weave (Bottom Field First, Sawtooth) + + + + + Bob (Top Field First) + + + + + Bob (Bottom Field First) + + + + + Blend (Top Field First, Half FPS) + + + + + Blend (Bottom Field First, Half FPS) + + + + + Adaptive (Top Field First) + + + + + Adaptive (Bottom Field First) + + + + + Native (PS2) + + + + + 1.25x Native + + + + + 1.5x Native + + + + + 1.75x Native + + + + + 2x Native (~720p) + + + + + 2.25x Native + + + + + 2.5x Native + + + + + 2.75x Native + + + + + 3x Native (~1080p) + + + + + 3.5x Native + + + + + 4x Native (~1440p/2K) + + + + + 5x Native (~1620p) + + + + + 6x Native (~2160p/4K) + + + + + 7x Native (~2520p) + + + + + 8x Native (~2880p) + + + + + Basic (Generated Mipmaps) + + + + + Full (PS2 Mipmaps) + + + + + Nearest + + + + + Bilinear (Forced) + + + + + Bilinear (PS2) + + + + + Bilinear (Forced excluding sprite) + + + + + Off (None) + + + + + Trilinear (PS2) + + + + + Trilinear (Forced) + + + + + Scaled + + + + + Unscaled (Default) + + + + + Minimum + + + + + Basic (Recommended) + + + + + Medium + + + + + High - JPEG + Full (Slow) + + + + + Maximum (Very Slow) - 0 (Disabled) + Off (Default) - 1 (64 Max Width) + 2x - 2 (128 Max Width) + 4x - 3 (192 Max Width) + 8x - 4 (256 Max Width) + 16x - 5 (320 Max Width) + Partial - 6 (384 Max Width) + Full (Hash Cache) - 7 (448 Max Width) + Force Disabled - 8 (512 Max Width) + Force Enabled - 9 (576 Max Width) + Accurate (Recommended) - 10 (640 Max Width) + Disable Readbacks (Synchronize GS Thread) - Sprites Only + Unsynchronized (Non-Deterministic) - Sprites/Triangles + Disabled (Ignore Transfers) - Blended Sprites/Triangles + Screen Resolution - 1 (Normal) - - - - - 2 (Aggressive) - - - - - Inside Target - - - - - Merge Targets - - - - - Normal (Vertex) - - - - - Special (Texture) - - - - - Special (Texture - Aggressive) - - - - - Align To Native - - - - - Half - - - - - Force Bilinear - - - - - Force Nearest - - - - - Disabled (Default) - - - - - Enabled (Sprites Only) - - - - - Enabled (All Primitives) - - - - - None (Default) - - - - - Sharpen Only (Internal Resolution) - - - - - Sharpen and Resize (Display Resolution) - - - - - Scanline Filter - - - - - Diagonal Filter - - - - - Triangular Filter - - - - - Wave Filter - - - - - Lottes CRT - - - - - 4xRGSS - - - - - NxAGSS - - - - - Uncompressed - - - - - LZMA (xz) - - - - - Zstandard (zst) - - - - - TimeStretch (Recommended) - - - - - Async Mix (Breaks some games!) - - - - - None (Audio can skip.) - - - - - Stereo (None, Default) - - - - - Surround 5.1 - - - - - Surround 7.1 - - - - - No Sound (Emulate SPU2 only) - - - - - Cubeb (Cross-platform) - - - - - XAudio2 - - - - - PS2 (8MB) - - - - - PS2 (16MB) - - - - - PS2 (32MB) - - - - - PS2 (64MB) - - - - - PS1 - - - - - Negative - - - - - Positive - - - - - Chop/Zero (Default) - - - - - Game Grid - - - - - Game List - - - - - Game List Settings - - - - - Type - - - - - Serial - - - - - Title - - - - - File Title - - - - - CRC - - - - - Time Played - - - - - Last Played - - - - - Size - - - - - Select Disc Image - - - - - Select Disc Drive - - - - - Start File - - - - - Start BIOS - - - - - Start Disc - - - - - Exit - - - - - Set Input Binding - - - - - Region - - - - - Compatibility Rating - - - - - Path - - - - - Disc Path - - - - - Select Disc Path + Internal Resolution (Aspect Uncorrected) - Copy Settings - - - - - Clear Settings - - - - - Inhibit Screensaver - - - - - Enable Discord Presence - - - - - Pause On Start - - - - - Pause On Focus Loss - - - - - Pause On Menu + WARNING: Memory Card Busy - Confirm Shutdown - - - - - Save State On Shutdown - - - - - Use Light Theme - - - - - Start Fullscreen - - - - - Double-Click Toggles Fullscreen - - - - - Hide Cursor In Fullscreen + Cannot show details for games which were not scanned in the game list. - OSD Scale - - - - - Show Messages - - - - - Show Speed - - - - - Show FPS - - - - - Show CPU Usage - - - - - Show GPU Usage - - - - - Show Resolution - - - - - Show GS Statistics - - - - - Show Status Indicators - - - - - Show Settings - - - - - Show Inputs - - - - - Show Frame Times - - - - - Warn About Unsafe Settings - - - - - Reset Settings - - - - - Change Search Directory - - - - - Fast Boot - - - - - Output Volume - - - - - Synchronization Mode - - - - - Expansion Mode - - - - - Output Module - - - - - Latency - - - - - Sequence Length - - - - - Seekwindow Size - - - - - Overlap - - - - - Memory Card Directory - - - - - Folder Memory Card Filter - - - - - Create - - - - - Cancel - - - - - Load Profile - - - - - Save Profile - - - - - Per-Game Configuration - - - - - Copy Global Settings - - - - - Enable SDL Input Source - - - - - SDL DualShock 4 / DualSense Enhanced Mode + Pause On Controller Disconnection - SDL Raw Input - - - - - Enable XInput Input Source - - - - - Enable Console Port 1 Multitap - - - - - Enable Console Port 2 Multitap - - - - - Controller Port {}{} - - - - - Controller Port {} - - - - - Controller Type - - - - - Automatic Mapping - - - - - Controller Port {}{} Macros - - - - - Controller Port {} Macros - - - - - Macro Button {} - - - - - Buttons - - - - - Frequency - - - - - Pressure + SDL DualSense Player LED - Controller Port {}{} Settings - - - - - Controller Port {} Settings - - - - - USB Port {} - - - - - Device Type - - - - - Device Subtype - - - - - {} Bindings - - - - - Clear Bindings - - - - - {} Settings - - - - - Cache Directory - - - - - Covers Directory - - - - - Snapshots Directory - - - - - Save States Directory - - - - - Game Settings Directory - - - - - Input Profile Directory - - - - - Cheats Directory - - - - - Patches Directory - - - - - Texture Replacements Directory - - - - - Video Dumping Directory - - - - - Resume Game - - - - - Toggle Frame Limit - - - - - Game Properties - - - - - Achievements - - - - - Save Screenshot - - - - - Switch To Software Renderer - - - - - Switch To Hardware Renderer - - - - - Change Disc - - - - - Close Game - - - - - Exit Without Saving - - - - - Back To Pause Menu - - - - - Exit And Save State - - - - - Leaderboards - - - - - Delete Save - - - - - Close Menu - - - - - Delete State - - - - - Default Boot + Deadzone - Reset Play Time + Full Boot - - Add Search Directory - - - - - Open in File Browser - - - - - Disable Subdirectory Scanning - - - - - Enable Subdirectory Scanning - - - - - Remove From List - - - - - Default View - - - - - Sort By - - - - - Sort Reversed - - - - - Scan For New Games - - - - - Rescan All Games - - - - - Website - - - - - Support Forums - - - - - GitHub Repository - - - - - License - - - - - Close - - - - - RAIntegration is being used instead of the built-in achievements implementation. - - - - - Enable Achievements - - - - - Hardcore Mode + + Achievement Notifications - Sound Effects + Leaderboard Notifications + + + + + Enable In-Game Overlays + + + + + Encore Mode - Test Unofficial Achievements + Spectator Mode + + + + + PNG + + + + + - + + + + + Convert 4-bit and 8-bit framebuffer on the CPU instead of the GPU. + + + + + Removes the current card from the slot. + + + + + Determines the frequency at which the macro will toggle the buttons on and off (aka auto fire). + + + + + {} Frames + + + + + No Deinterlacing + + + + + JPEG + + + + + 0 (Disabled) + + + + + 1 (64 Max Width) + + + + + 2 (128 Max Width) + + + + + 3 (192 Max Width) + + + + + 4 (256 Max Width) + + + + + 5 (320 Max Width) + + + + + 6 (384 Max Width) + + + + + 7 (448 Max Width) + + + + + 8 (512 Max Width) + + + + + 9 (576 Max Width) + + + + + 10 (640 Max Width) + + + + + Sprites Only + + + + + Sprites/Triangles + + + + + Blended Sprites/Triangles + + + + + 1 (Normal) + + + + + 2 (Aggressive) + + + + + Inside Target + + + + + Merge Targets + + + + + Normal (Vertex) + + + + + Special (Texture) + + + + + Special (Texture - Aggressive) + + + + + Align To Native + + + + + Half + + + + + Force Bilinear + + + + + Force Nearest + + + + + Disabled (Default) + + + + + Enabled (Sprites Only) + + + + + Enabled (All Primitives) + + + + + None (Default) + + + + + Sharpen Only (Internal Resolution) + + + + + Sharpen and Resize (Display Resolution) + + + + + Scanline Filter + + + + + Diagonal Filter + + + + + Triangular Filter + + + + + Wave Filter + + + + + Lottes CRT + + + + + 4xRGSS + + + + + NxAGSS + + + + + Uncompressed + + + + + LZMA (xz) + + + + + Zstandard (zst) + + + + + PS2 (8MB) + + + + + PS2 (16MB) + + + + + PS2 (32MB) + + + + + PS2 (64MB) + + + + + PS1 + + + + + Negative + + + + + Positive + + + + + Chop/Zero (Default) + + + + + Game Grid + + + + + Game List + + + + + Game List Settings + + + + + Type + + + + + Serial + + + + + Title + + + + + File Title + + + + + CRC + + + + + Time Played + + + + + Last Played + + + + + Size + + + + + Select Disc Image + + + + + Select Disc Drive + + + + + Start File + + + + + Start BIOS + + + + + Start Disc + + + + + Exit + + + + + Set Input Binding + + + + + Region + + + + + Compatibility Rating + + + + + Path + + + + + Disc Path + + + + + Select Disc Path + + + + + Copy Settings + + + + + Clear Settings + + + + + Inhibit Screensaver + + + + + Enable Discord Presence + + + + + Pause On Start + + + + + Pause On Focus Loss + + + + + Pause On Menu + + + + + Confirm Shutdown + + + + + Save State On Shutdown + + + + + Use Light Theme + + + + + Start Fullscreen + + + + + Double-Click Toggles Fullscreen + + + + + Hide Cursor In Fullscreen + + + + + OSD Scale + + + + + Show Messages + + + + + Show Speed + + + + + Show FPS + + + + + Show CPU Usage + + + + + Show GPU Usage + + + + + Show Resolution + + + + + Show GS Statistics + + + + + Show Status Indicators + + + + + Show Settings + + + + + Show Inputs + + + + + Show Frame Times + + + + + Warn About Unsafe Settings + + + + + Reset Settings + + + + + Change Search Directory + + + + + Fast Boot + + + + + Output Volume + + + + + Memory Card Directory + + + + + Folder Memory Card Filter + + + + + Create + + + + + Cancel + + + + + Load Profile + + + + + Save Profile + + + + + Per-Game Configuration + + + + + Copy Global Settings + + + + + Enable SDL Input Source + + + + + SDL DualShock 4 / DualSense Enhanced Mode + + + + + SDL Raw Input + + + + + Enable XInput Input Source + + + + + Enable Console Port 1 Multitap + + + + + Enable Console Port 2 Multitap + + + + + Controller Port {}{} + + + + + Controller Port {} + + + + + Controller Type + + + + + Automatic Mapping + + + + + Controller Port {}{} Macros + + + + + Controller Port {} Macros + + + + + Macro Button {} + + + + + Buttons + + + + + Frequency + + + + + Pressure + + + + + Controller Port {}{} Settings + + + + + Controller Port {} Settings + + + + + USB Port {} + + + + + Device Type + + + + + Device Subtype + + + + + {} Bindings + + + + + Clear Bindings + + + + + {} Settings + + + + + Cache Directory + + + + + Covers Directory + + + + + Snapshots Directory + + + + + Save States Directory + + + + + Game Settings Directory + + + + + Input Profile Directory + + + + + Cheats Directory + + + + + Patches Directory + + + + + Texture Replacements Directory + + + + + Video Dumping Directory + + + + + Resume Game + + + + + Toggle Frame Limit + + + + + Game Properties + + + + + Achievements + + + + + Save Screenshot + + + + + Switch To Software Renderer + + + + + Switch To Hardware Renderer + + + + + Change Disc + + + + + Close Game + + + + + Exit Without Saving + + + + + Back To Pause Menu + + + + + Exit And Save State + + + + + Leaderboards + + + + + Delete Save + + + + + Close Menu + + + + + Delete State + + + + + Default Boot + + + + + Reset Play Time + + + + + Add Search Directory + + + + + Open in File Browser + + + + + Disable Subdirectory Scanning + + + + + Enable Subdirectory Scanning + + + + + Remove From List + + + + + Default View + + + + + Sort By + + + + + Sort Reversed + + + + + Scan For New Games + + + + + Rescan All Games + + + + + Website + + + + + Support Forums + + + + + GitHub Repository + + + + + License + + + + + Close + + + + + RAIntegration is being used instead of the built-in achievements implementation. + + + + + Enable Achievements + + + + + Hardcore Mode + + + + + Sound Effects - Username: {} + Test Unofficial Achievements - Login token generated on {} + Username: {} - Logout + Login token generated on {} - Not Logged In + Logout - Login + Not Logged In - Game: {0} ({1}) + Login - Rich presence inactive or unsupported. + Game: {0} ({1}) - Game not loaded or no RetroAchievements available. + Rich presence inactive or unsupported. - Card Enabled + Game not loaded or no RetroAchievements available. - Card Name + Card Enabled + Card Name + + + + Eject Card @@ -8731,82 +8776,82 @@ Do you want to load this save and continue? GS - + Failed to reopen, restoring old configuration. - + Failed to create render device. This may be due to your GPU not supporting the chosen renderer ({}), or because your graphics drivers need to be updated. - + Upscale multiplier set to {}x. - + Saving screenshot to '{}'. - + Saved screenshot to '{}'. - + Failed to save screenshot to '{}'. - + Host GPU device encountered an error and was recovered. This may have broken rendering. - + CAS is not available, your graphics driver does not support the required functionality. - + with no compression - + with LZMA compression - + with Zstandard compression - + Saving {0} GS dump {1} to '{2}' - + single frame - + multi-frame - + Failed to render/download screenshot. - + Saved GS dump to '{}'. @@ -8821,12 +8866,12 @@ Do you want to load this save and continue? - + Stencil buffers and texture barriers are both unavailable, this will break some graphical effects. - + Spin GPU During Readbacks is enabled, but calibrated timestamps are unavailable. This might be really slow. @@ -9295,15 +9340,23 @@ graphical quality, but this will increase system requirements. {}s - + + - {} hours - + %n hours + + + + - + + - {} minutes - + %n minutes + + + + @@ -9314,52 +9367,52 @@ graphical quality, but this will increase system requirements. GameListModel - + Type - + Code - + Title - + File Title - + CRC - + Time Played - + Last Played - + Size - + Region - + Compatibility @@ -9384,7 +9437,7 @@ graphical quality, but this will increase system requirements. - + Remove @@ -9445,34 +9498,34 @@ graphical quality, but this will increase system requirements. - + Open Directory... - + Select Search Directory - + Scan Recursively? - + Would you like to scan the directory "%1" recursively? Scanning recursively takes more time, but will identify files in subdirectories. - + Select File - + Select Directory @@ -10237,13 +10290,11 @@ Percentage sign that will appear next to a number. Add a space or whatever is ne - Enable Widescreen Patches - Enable No-Interlacing Patches @@ -10723,6 +10774,16 @@ Percentage sign that will appear next to a number. Add a space or whatever is ne No Deinterlacing + + + Apply Widescreen Patches + + + + + Apply No-Interlacing Patches + + Window Resolution (Aspect Corrected) @@ -12328,135 +12389,135 @@ Swap chain: see Microsoft's Terminology Portal. Hotkeys - - - - - - - + + + + - + + - - - - + + + + + + Graphics - + Save Screenshot - + Toggle Video Capture - + Save Single Frame GS Dump - + Save Multi Frame GS Dump - + Toggle Software Rendering - + Increase Upscale Multiplier - + Decrease Upscale Multiplier - + Toggle On-Screen Display - + Cycle Aspect Ratio - + Aspect ratio set to '{}'. - + Cycle Hardware Mipmapping - + Hardware mipmapping set to '{}'. - + Cycle Deinterlace Mode - + Deinterlace mode set to '{}'. - + Toggle Texture Dumping - + Texture dumping is now enabled. - + Texture dumping is now disabled. - + Toggle Texture Replacements - + Texture replacements are now enabled. - + Texture replacements are now disabled. - + Reload Texture Replacements - + Texture replacements are not enabled. - + Reloading texture replacements... @@ -12481,253 +12542,248 @@ Swap chain: see Microsoft's Terminology Portal. - - You cannot pause until another {:.1f} seconds have passed. - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + System - + Open Pause Menu - + Open Achievements List - + Open Leaderboards List - + Toggle Pause - + Toggle Fullscreen - + Toggle Frame Limit - + Toggle Turbo / Fast Forward - + Toggle Slow Motion - + Turbo / Fast Forward (Hold) - + Increase Target Speed - + Decrease Target Speed - + Increase Volume - + Decrease Volume - + Toggle Mute - + Frame Advance - + Shut Down Virtual Machine - + Reset Virtual Machine - + Toggle Input Recording Mode - - - - - + + + + + Save States - + Select Previous Save Slot - + Select Next Save Slot - + Save State To Selected Slot - + Load State From Selected Slot - + Save State and Select Next Slot - + Save State To Slot 1 - + Load State From Slot 1 - + Save State To Slot 2 - + Load State From Slot 2 - + Save State To Slot 3 - + Load State From Slot 3 - + Save State To Slot 4 - + Load State From Slot 4 - + Save State To Slot 5 - + Load State From Slot 5 - + Save State To Slot 6 - + Load State From Slot 6 - + Save State To Slot 7 - + Load State From Slot 7 - + Save State To Slot 8 - + Load State From Slot 8 - + Save State To Slot 9 - + Load State From Slot 9 - + Save State To Slot 10 - + Load State From Slot 10 @@ -13082,126 +13138,132 @@ Right click to clear binding - - + + Pause On Focus Loss - + Inhibit Screensaver - - + + Save State On Shutdown - + Pause On Start - - + + Confirm Shutdown - - + + Create Save State Backups - + Enable Discord Presence - + + + Pause On Controller Disconnection + + + + Game Display - - + + Start Fullscreen - - - - Double-Click Toggles Fullscreen - - - - Render To Separate Window + + Double-Click Toggles Fullscreen - Hide Main Window When Running + Render To Separate Window - - Disable Window Resizing + + Hide Main Window When Running - + + Disable Window Resizing + + + + + Hide Cursor In Fullscreen - + Preferences - + Language: - + Theme: - + Automatic Updater - + Update Channel: - + Current Version: - - + + Enable Automatic Update Check - + Check for Updates... @@ -13210,6 +13272,12 @@ Right click to clear binding Native + + + Classic Windows + Ignore what Crowdin says in this string about "[Light]/[Dark]" being untouchable here, these are not variables in this case and must be translated. + + Dark Fusion (Gray) [Dark] @@ -13289,60 +13357,66 @@ Right click to clear binding - - - - - + + + + + Checked - + Automatically checks for updates to the program on startup. Updates can be deferred until later or skipped entirely. - + %1 (%2) Variable %1 shows the version number and variable %2 shows a timestamp. - + Prevents the screen saver from activating and the host from sleeping while emulation is running. - + Determines whether a prompt will be displayed to confirm shutting down the virtual machine when the hotkey is pressed. - + Automatically saves the emulator state when powering down or exiting. You can then resume directly from where you left off next time. - - Allows switching in and out of fullscreen mode by double-clicking the game window. + + Pauses the emulator when a controller with bindings is disconnected. + Allows switching in and out of fullscreen mode by double-clicking the game window. + + + + Prevents the main window from being resized. - - - - - + + + + + - + + Unchecked @@ -13352,48 +13426,48 @@ Right click to clear binding - + Pauses the emulator when a game is started. - + Pauses the emulator when you minimize the window or switch to another application, and unpauses when you switch back. - + Creates a backup copy of a save state if it already exists when the save is created. The backup copy has a .backup suffix. Do not translate the ".backup" extension. - + Automatically switches to fullscreen mode when a game is started. - + Hides the mouse pointer/cursor when the emulator is in fullscreen mode. - + Renders the game to a separate window, instead of the main window. If unchecked, the game will display over the top of the game list. - + Hides the main window (with the game list) when a game is running, requires Render To Separate Window to be enabled. - + Shows the game you are currently playing as part of your profile in Discord. - + System Language [Default] @@ -13534,14 +13608,14 @@ Right click to clear binding - - + + Change Disc - + Load State @@ -14056,13 +14130,13 @@ Right click to clear binding - + Start Big Picture Mode - + Big Picture In Toolbar @@ -14134,269 +14208,269 @@ Are you sure you want to continue? - + WARNING: Memory Card Busy - + Confirm Shutdown - + Are you sure you want to shut down the virtual machine? - + Save State For Resume - - - - - - + + + + + + Error - + You must select a disc to change discs. - + Properties... - + Set Cover Image... - + Exclude From List - + Reset Play Time - + Default Boot - + Fast Boot - + Full Boot - + Boot and Debug - + Add Search Directory... - + Start File - + Start Disc - + Select Disc Image - + Updater Error - + <p>Sorry, you are trying to update a PCSX2 version which is not an official GitHub release. To prevent incompatibilities, the auto-updater is only enabled on official builds.</p><p>To obtain an official build, please download from the link below:</p><p><a href="https://pcsx2.net/downloads/">https://pcsx2.net/downloads/</a></p> - + Automatic updating is not supported on the current platform. - + Confirm File Creation - + The pnach file '%1' does not currently exist. Do you want to create it? - + Failed to create '%1'. - + Input Recording Files (*.p2m2) - + Paused - + Load State Failed - + Cannot load a save state without a running VM. - + The new ELF cannot be loaded without resetting the virtual machine. Do you want to reset the virtual machine now? - + Cannot change from game to GS dump without shutting down first. - + Failed to get window info from widget - + Stop Big Picture Mode - + Exit Big Picture In Toolbar - + Game Properties - + Game properties is unavailable for the current game. - + Could not find any CD/DVD-ROM devices. Please ensure you have a drive connected and sufficient permissions to access it. - + Select disc drive: - + This save state does not exist. - + Select Cover Image - + Cover Already Exists - + A cover image for this game already exists, do you wish to replace it? - - - - + + + + Copy Error - + Failed to remove existing cover '%1' - + Failed to copy '%1' to '%2' - + Failed to remove '%1' - - + + Confirm Reset - + All Cover Image Types (*.jpg *.jpeg *.png *.webp) - + You must select a different file to the current cover image. - + Are you sure you want to reset the play time for '%1'? This action cannot be undone. - + Load Resume State - + A resume save state was found for this game, saved at: %1. @@ -14405,43 +14479,43 @@ Do you want to load this state, or start from a fresh boot? - + Fresh Boot - + Delete And Boot - + Failed to delete save state file '%1'. - + Load State File... - + Load From File... - - + + Select Save State File - + Save States (*.p2s) - + Delete Save States... @@ -14456,109 +14530,98 @@ Do you want to load this state, or start from a fresh boot? - - RA: Logged in as %1 (%2 pts, softcore: %3 pts). %4 unread messages. - - - - + WARNING: Your memory card is still writing data. Shutting down now <b>WILL IRREVERSIBLY DESTROY YOUR MEMORY CARD.</b> It is strongly recommended to resume your game and let it finish writing to your memory card.<br><br>Do you wish to shutdown anyways and <b>IRREVERSIBLY DESTROY YOUR MEMORY CARD?</b> - + Save States (*.p2s *.p2s.backup) - + Undo Load State - + Resume (%2) - + Load Slot %1 (%2) - - + + Delete Save States - + Are you sure you want to delete all save states for %1? The saves will not be recoverable. - + %1 save states deleted. - + Save To File... - + Empty - + Save Slot %1 (%2) - + Confirm Disc Change - + Do you want to swap discs or boot the new image (via system reset)? - + Swap Disc - + Reset - + Missing Font File - + The font file '%1' is required for the On-Screen Display and Big Picture Mode to show messages in your language.<br><br>Do you want to download this file now? These files are usually less than 10 megabytes in size.<br><br><strong>If you do not download this file, on-screen messages will not be readable.</strong> - + Downloading Files - - - Classic Windows - Ignore what Crowdin says in this string about "[Light]/[Dark]" being untouchable here, these are not variables in this case and must be translated. - - MemoryCard @@ -15788,7 +15851,7 @@ This action cannot be reversed, and you will lose any saves on the card. - + Controller port {0}, slot {1} has a {2} connected, but the save state has a {3}. Ejecting {3} and replacing it with {2}. @@ -15851,28 +15914,35 @@ Ejecting {3} and replacing it with {2}. Failed to open {}. Built-in game patches are not available. - + - {} GameDB patches - + %n GameDB patches are active. + OSD Message + + + + + + + + %n game patches are active. + OSD Message + + + + + + + + %n cheat patches are active. + OSD Message + + + + - - {}{} game patches - - - - - {}{} cheat patches - - - - - {} are active. - - - - + No cheats or patches (widescreen, compatibility or others) are found / enabled. @@ -15880,12 +15950,12 @@ Ejecting {3} and replacing it with {2}. Pcsx2Config - + Disabled (Noisy) - + TimeStretch (Recommended) @@ -15951,6 +16021,47 @@ Ejecting {3} and replacing it with {2}. + + QtHost + + + RA: Logged in as %1 (%2 pts, softcore: %3 pts). %4 unread messages. + + + + + + Error + + + + + An error occurred while deleting empty game settings: +{} + + + + + An error occurred while saving game settings: +{} + + + + + Controller {} connected. + + + + + System paused because controller {} was disconnected. + + + + + Controller {} disconnected. + + + QtModalProgressCallback @@ -16079,11 +16190,10 @@ Ejecting {3} and replacing it with {2}. SaveState - - This savestate is an unsupported version and cannot be used. + + This save state is outdated and is no longer compatible with the current version of PCSX2. -You can download PCSX2 {} from pcsx2.net and make a normal memory card save. -Otherwise delete the savestate and do a fresh boot. +If you have any unsaved progress on this save state, you can download the compatible version (PCSX2 {}) from pcsx2.net, load the save state, and save your progress to the memory card. @@ -16178,7 +16288,7 @@ Do you want to create this directory? - + PCSX2 Settings @@ -16412,12 +16522,12 @@ Do you want to continue? - + Per-game configuration cleared. - + Recommended Value @@ -16516,7 +16626,7 @@ Do you want to continue? - + Remove @@ -16570,7 +16680,7 @@ Do you want to continue? - + Default (Keyboard) @@ -16642,44 +16752,44 @@ Any changes have been saved, and the wizard will run again next time you start P - + Open Directory... - + Select Search Directory - + Scan Recursively? - + Would you like to scan the directory "%1" recursively? Scanning recursively takes more time, but will identify files in subdirectories. - + Default (None) - + No devices available - + Automatic Binding - + No generic bindings were generated for device '%1'. The controller/source may not support automatic mapping. @@ -16940,6 +17050,7 @@ Scanning recursively takes more time, but will identify files in subdirectories. + D-Pad Up @@ -16949,6 +17060,7 @@ Scanning recursively takes more time, but will identify files in subdirectories. + D-Pad Down @@ -16958,6 +17070,7 @@ Scanning recursively takes more time, but will identify files in subdirectories. + D-Pad Left @@ -16967,6 +17080,7 @@ Scanning recursively takes more time, but will identify files in subdirectories. + D-Pad Right @@ -17012,7 +17126,7 @@ Scanning recursively takes more time, but will identify files in subdirectories. - + Select @@ -17023,7 +17137,7 @@ Scanning recursively takes more time, but will identify files in subdirectories. - + Start @@ -17534,242 +17648,242 @@ Scanning recursively takes more time, but will identify files in subdirectories. - + Buzz Controller - + Player 1 Red - + Player 1 Blue - + Player 1 Orange - + Player 1 Green - + Player 1 Yellow - + Player 2 Red - + Player 2 Blue - + Player 2 Orange - + Player 2 Green - + Player 2 Yellow - + Player 3 Red - + Player 3 Blue - + Player 3 Orange - + Player 3 Green - + Player 3 Yellow - + Player 4 Red - + Player 4 Blue - + Player 4 Orange - + Player 4 Green - + Player 4 Yellow - + KeyboardMania - + C 1 - + C# 1 - + D 1 - + D# 1 - + E 1 - + F 1 - + F# 1 - + G 1 - + G# 1 - + A 1 - + A# 1 - + B 1 - + C 2 - + C# 2 - + D 2 - + D# 2 - + E 2 - + F 2 - + F# 2 - + G 2 - + G# 2 - + A 2 - + A# 2 - + B 2 - + Wheel Up - + Wheel Down @@ -17944,12 +18058,12 @@ Scanning recursively takes more time, but will identify files in subdirectories. USBBindingWidget - + Axes - + Buttons @@ -18269,32 +18383,32 @@ Scanning recursively takes more time, but will identify files in subdirectories. - + USB Port %1 - + No devices available - + Clear Bindings - + Are you sure you want to clear all bindings for this device? This action cannot be undone. - + Automatic Binding - + No generic bindings were generated for device '%1'. The controller/source may not support automatic mapping. @@ -18302,32 +18416,32 @@ Scanning recursively takes more time, but will identify files in subdirectories. VMManager - + Failed to back up old save state {}. - + Failed to save save state: {}. - + PS2 BIOS ({}) - + Unknown Game - + Error - + PCSX2 requires a PS2 BIOS in order to run. For legal reasons, you *must* obtain a BIOS from an actual PS2 unit that you own (borrowing doesn't count). @@ -18338,250 +18452,255 @@ Please consult the FAQs and Guides for further instructions. - + Resuming state - + Boot and Debug - + Failed to load save state - + State saved to slot {}. - + Failed to save save state to slot {}. - - + + Loading state - + Failed to load state (Memory card is busy) - + There is no save state in slot {}. - + Failed to load state from slot {} (Memory card is busy) - + Loading state from slot {}... - + Failed to save state (Memory card is busy) - + Failed to save state to slot {} (Memory card is busy) - + Saving state to slot {}... - + Frame advancing - + Disc removed. - + Disc changed to '{}'. - + Failed to open new disc image '{}'. Reverting to old image. Error was: {} - + Failed to switch back to old disc image. Removing disc. Error was: {} - + Cheats have been disabled due to achievements hardcore mode. - + Fast CDVD is enabled, this may break games. - + Cycle rate/skip is not at default, this may crash or make games run too slow. - + Upscale multiplier is below native, this will break rendering. - + Mipmapping is not set to automatic. This may break rendering in some games. - + Texture filtering is not set to Bilinear (PS2). This will break rendering in some games. - + Trilinear filtering is not set to automatic. This may break rendering in some games. - + Blending Accuracy is below Basic, this may break effects in some games. - + Hardware Download Mode is not set to Accurate, this may break rendering in some games. - + EE FPU Round Mode is not set to default, this may break some games. - + EE FPU Clamp Mode is not set to default, this may break some games. - + VU0 Round Mode is not set to default, this may break some games. - + VU1 Round Mode is not set to default, this may break some games. - + VU Clamp Mode is not set to default, this may break some games. - + + 128MB RAM is enabled. Compatibility with some games may be affected. + + + + Game Fixes are not enabled. Compatibility with some games may be affected. - + Compatibility Patches are not enabled. Compatibility with some games may be affected. - + Frame rate for NTSC is not default. This may break some games. - + Frame rate for PAL is not default. This may break some games. - + EE Recompiler is not enabled, this will significantly reduce performance. - + VU0 Recompiler is not enabled, this will significantly reduce performance. - + VU1 Recompiler is not enabled, this will significantly reduce performance. - + IOP Recompiler is not enabled, this will significantly reduce performance. - + EE Cache is enabled, this will significantly reduce performance. - + EE Wait Loop Detection is not enabled, this may reduce performance. - + INTC Spin Detection is not enabled, this may reduce performance. - + Instant VU1 is disabled, this may reduce performance. - + mVU Flag Hack is not enabled, this may reduce performance. - + GPU Palette Conversion is enabled, this may reduce performance. - + Texture Preloading is not Full, this may reduce performance. - + Estimate texture region is enabled, this may reduce performance. - + Texture dumping is enabled, this will continually dump textures to disk. diff --git a/pcsx2-qt/Translations/update_base_translation.bat b/pcsx2-qt/Translations/update_base_translation.bat new file mode 100644 index 0000000000..3863f203e8 --- /dev/null +++ b/pcsx2-qt/Translations/update_base_translation.bat @@ -0,0 +1,10 @@ +@echo off + +set QTBIN=..\..\deps\bin +set SRCDIRS=../ ../../pcsx2/ + +set OPTS=-tr-function-alias QT_TRANSLATE_NOOP+=TRANSLATE,QT_TRANSLATE_NOOP+=TRANSLATE_SV,QT_TRANSLATE_NOOP+=TRANSLATE_STR,QT_TRANSLATE_NOOP+=TRANSLATE_FS,QT_TRANSLATE_N_NOOP3+=TRANSLATE_FMT,QT_TRANSLATE_NOOP+=TRANSLATE_NOOP,translate+=TRANSLATE_PLURAL_STR,translate+=TRANSLATE_PLURAL_FS + +"%QTBIN%\lupdate.exe" %SRCDIRS% %OPTS% -no-obsolete -source-language en -ts pcsx2-qt_en.ts + +pause diff --git a/pcsx2-qt/Translations/update_base_translation.sh b/pcsx2-qt/Translations/update_base_translation.sh new file mode 100644 index 0000000000..770a20cf86 --- /dev/null +++ b/pcsx2-qt/Translations/update_base_translation.sh @@ -0,0 +1,9 @@ +#!/bin/bash + +SCRIPTDIR=$(dirname "${BASH_SOURCE[0]}") + +OPTS="-tr-function-alias QT_TRANSLATE_NOOP+=TRANSLATE,QT_TRANSLATE_NOOP+=TRANSLATE_SV,QT_TRANSLATE_NOOP+=TRANSLATE_STR,QT_TRANSLATE_NOOP+=TRANSLATE_FS,QT_TRANSLATE_N_NOOP3+=TRANSLATE_FMT,QT_TRANSLATE_NOOP+=TRANSLATE_NOOP,translate+=TRANSLATE_PLURAL_STR,translate+=TRANSLATE_PLURAL_FS" +SRCDIRS=$(realpath "$SCRIPTDIR/..")/\ $(realpath "$SCRIPTDIR/../../pcsx2")/ +OUTDIR=$(realpath "$SCRIPTDIR") + +lupdate $SRCDIRS $OPTS -no-obsolete -source-language en -ts "$OUTDIR/pcsx2-qt_en.ts" diff --git a/pcsx2-qt/Translations/update_en_translation.bat b/pcsx2-qt/Translations/update_en_translation.bat index 4e847256ac..27374a40d2 100644 --- a/pcsx2-qt/Translations/update_en_translation.bat +++ b/pcsx2-qt/Translations/update_en_translation.bat @@ -3,8 +3,7 @@ set QTBIN=..\..\deps\bin set SRCDIRS=../ ../../pcsx2/ -set OPTS=-tr-function-alias QT_TRANSLATE_NOOP+=TRANSLATE,QT_TRANSLATE_NOOP+=TRANSLATE_SV,QT_TRANSLATE_NOOP+=TRANSLATE_STR,QT_TRANSLATE_NOOP+=TRANSLATE_FS,QT_TRANSLATE_N_NOOP3+=TRANSLATE_FMT,QT_TRANSLATE_NOOP+=TRANSLATE_NOOP +set OPTS=-tr-function-alias QT_TRANSLATE_NOOP+=TRANSLATE,QT_TRANSLATE_NOOP+=TRANSLATE_SV,QT_TRANSLATE_NOOP+=TRANSLATE_STR,QT_TRANSLATE_NOOP+=TRANSLATE_FS,QT_TRANSLATE_N_NOOP3+=TRANSLATE_FMT,QT_TRANSLATE_NOOP+=TRANSLATE_NOOP,translate+=TRANSLATE_PLURAL_STR,translate+=TRANSLATE_PLURAL_FS -pluralonly -no-obsolete -"%QTBIN%\lupdate.exe" %SRCDIRS% %OPTS% -no-obsolete -source-language en -ts pcsx2-qt_en.ts - -pause +"%QTBIN%\lupdate.exe" %SRCDIRS% %OPTS% -no-obsolete -source-language en_US -ts pcsx2-qt_en-US.ts +start %QTBIN%\linguist.exe %~dp0\pcsx2-qt_en-US.ts diff --git a/pcsx2-qt/Translations/update_en_translation.sh b/pcsx2-qt/Translations/update_en_translation.sh index 7395b0f225..231118ac27 100755 --- a/pcsx2-qt/Translations/update_en_translation.sh +++ b/pcsx2-qt/Translations/update_en_translation.sh @@ -2,8 +2,8 @@ SCRIPTDIR=$(dirname "${BASH_SOURCE[0]}") -OPTS="-tr-function-alias QT_TRANSLATE_NOOP+=TRANSLATE,QT_TRANSLATE_NOOP+=TRANSLATE_SV,QT_TRANSLATE_NOOP+=TRANSLATE_STR,QT_TRANSLATE_NOOP+=TRANSLATE_FS,QT_TRANSLATE_N_NOOP3+=TRANSLATE_FMT,QT_TRANSLATE_NOOP+=TRANSLATE_NOOP" +OPTS="-tr-function-alias QT_TRANSLATE_NOOP+=TRANSLATE,QT_TRANSLATE_NOOP+=TRANSLATE_SV,QT_TRANSLATE_NOOP+=TRANSLATE_STR,QT_TRANSLATE_NOOP+=TRANSLATE_FS,QT_TRANSLATE_N_NOOP3+=TRANSLATE_FMT,QT_TRANSLATE_NOOP+=TRANSLATE_NOOP,translate+=TRANSLATE_PLURAL_STR,translate+=TRANSLATE_PLURAL_FS -pluralonly -no-obsolete" SRCDIRS=$(realpath "$SCRIPTDIR/..")/\ $(realpath "$SCRIPTDIR/../../pcsx2")/ OUTDIR=$(realpath "$SCRIPTDIR") -lupdate $SRCDIRS $OPTS -no-obsolete -source-language en -ts "$OUTDIR/pcsx2-qt_en.ts" +lupdate $SRCDIRS $OPTS -no-obsolete -source-language en_US -ts "$OUTDIR/pcsx2-qt_en-US.ts" diff --git a/pcsx2/Achievements.cpp b/pcsx2/Achievements.cpp index ef99c10d43..a8f6c82c79 100644 --- a/pcsx2/Achievements.cpp +++ b/pcsx2/Achievements.cpp @@ -1016,9 +1016,14 @@ void Achievements::DisplayAchievementSummary() std::string summary; if (s_game_summary.num_core_achievements > 0) { - summary = fmt::format(TRANSLATE_FS("Achievements", "You have unlocked {0} of {1} achievements, and earned {2} of {3} points."), - s_game_summary.num_unlocked_achievements, s_game_summary.num_core_achievements, s_game_summary.points_unlocked, - s_game_summary.points_core); + summary = fmt::format( + TRANSLATE_FS("Achievements", "{0}, {1}."), + SmallString::from_format(TRANSLATE_PLURAL_FS("Achievements", "You have unlocked {} of %n achievements", + "Achievement popup", s_game_summary.num_core_achievements), + s_game_summary.num_unlocked_achievements), + SmallString::from_format(TRANSLATE_PLURAL_FS("Achievements", "and earned {} of %n points", "Achievement popup", + s_game_summary.points_core), + s_game_summary.points_unlocked)); } else { @@ -1099,8 +1104,11 @@ void Achievements::HandleGameCompleteEvent(const rc_client_event_t* event) if (EmuConfig.Achievements.Notifications) { std::string title = fmt::format(TRANSLATE_FS("Achievements", "Mastered {}"), s_game_title); - std::string message = fmt::format(TRANSLATE_FS("Achievements", "{0} achievements, {1} points"), - s_game_summary.num_unlocked_achievements, s_game_summary.points_unlocked); + std::string message = fmt::format( + TRANSLATE_FS("Achievements", "{0}, {1}"), + TRANSLATE_PLURAL_STR("Achievements", "%n achievements", "Mastery popup", + s_game_summary.num_unlocked_achievements), + TRANSLATE_PLURAL_STR("Achievements", "%n points", "Mastery popup", s_game_summary.num_unlocked_achievements)); MTGS::RunOnGSThread([title = std::move(title), message = std::move(message), icon = s_game_icon]() { if (ImGuiManager::InitializeFullscreenUI()) diff --git a/pcsx2/GameList.cpp b/pcsx2/GameList.cpp index fc47552ba8..220e34b1da 100644 --- a/pcsx2/GameList.cpp +++ b/pcsx2/GameList.cpp @@ -1139,9 +1139,9 @@ std::string GameList::FormatTimespan(std::time_t timespan, bool long_format) else { if (hours > 0) - ret = fmt::format(TRANSLATE_FS("GameList", "{} hours"), hours); + ret.assign(TRANSLATE_PLURAL_STR("GameList", "%n hours", "", hours)); else - ret = fmt::format(TRANSLATE_FS("GameList", "{} minutes"), minutes); + ret.assign(TRANSLATE_PLURAL_STR("GameList", "%n minutes", "", minutes)); } return ret; diff --git a/pcsx2/Host.h b/pcsx2/Host.h index d8ba778d0a..847cb9548e 100644 --- a/pcsx2/Host.h +++ b/pcsx2/Host.h @@ -42,6 +42,9 @@ namespace Host /// Returns a localized version of the specified string within the specified context. std::string TranslateToString(const std::string_view& context, const std::string_view& msg); + /// Returns a localized version of the specified string within the specified context, adjusting for plurals using %n. + std::string TranslatePluralToString(const char* context, const char* msg, const char* disambiguation, int count); + /// Clears the translation cache. All previously used strings should be considered invalid. void ClearTranslationCache(); @@ -164,6 +167,10 @@ namespace Host #define TRANSLATE_SV(context, msg) Host::TranslateToStringView(context, msg) #define TRANSLATE_STR(context, msg) Host::TranslateToString(context, msg) #define TRANSLATE_FS(context, msg) fmt::runtime(Host::TranslateToStringView(context, msg)) +#define TRANSLATE_PLURAL_STR(context, msg, disambiguation, count) \ + Host::TranslatePluralToString(context, msg, disambiguation, count) +#define TRANSLATE_PLURAL_FS(context, msg, disambiguation, count) \ + fmt::runtime(Host::TranslatePluralToString(context, msg, disambiguation, count)) // Does not translate the string at runtime, but allows the UI to in its own way. #define TRANSLATE_NOOP(context, msg) msg diff --git a/pcsx2/Hotkeys.cpp b/pcsx2/Hotkeys.cpp index cb757db7dd..8b2d956a1b 100644 --- a/pcsx2/Hotkeys.cpp +++ b/pcsx2/Hotkeys.cpp @@ -93,10 +93,9 @@ static bool CanPause() const float delta = static_cast(Common::Timer::ConvertValueToSeconds(time - s_last_pause_time)); if (delta < PAUSE_INTERVAL) { - Host::AddIconOSDMessage( - "PauseCooldown", ICON_FA_CLOCK, - fmt::format(TRANSLATE_FS("Hotkeys", "You cannot pause until another {:.1f} seconds have passed."), - PAUSE_INTERVAL - delta), + Host::AddIconOSDMessage("PauseCooldown", ICON_FA_CLOCK, + TRANSLATE_PLURAL_STR("Hotkeys", "You cannot pause until another %n second(s) have passed.", + "", static_cast(std::ceil(PAUSE_INTERVAL - delta))), Host::OSD_QUICK_DURATION); return false; } diff --git a/pcsx2/Patch.cpp b/pcsx2/Patch.cpp index 005a9a25d1..d53347fded 100644 --- a/pcsx2/Patch.cpp +++ b/pcsx2/Patch.cpp @@ -689,27 +689,27 @@ void Patch::UpdateActivePatches(bool reload_enabled_list, bool verbose, bool ver s_override_aspect_ratio.reset(); s_override_interlace_mode.reset(); - std::string message; + SmallString message; u32 gp_count = 0; if (EmuConfig.EnablePatches) { gp_count = EnablePatches(s_gamedb_patches, EnablePatchList()); if (gp_count > 0) - fmt::format_to(std::back_inserter(message), TRANSLATE_FS("Patch", "{} GameDB patches"), gp_count); + message.append(TRANSLATE_PLURAL_STR("Patch", "%n GameDB patches are active.", "OSD Message", gp_count)); } const u32 p_count = EnablePatches(s_game_patches, s_enabled_patches); if (p_count > 0) { - fmt::format_to(std::back_inserter(message), TRANSLATE_FS("Patch", "{}{} game patches"), - message.empty() ? "" : ", ", p_count); + message.append_format("{}{}", message.empty() ? "" : "\n", + TRANSLATE_PLURAL_STR("Patch", "%n game patches are active.", "OSD Message", p_count)); } const u32 c_count = EmuConfig.EnableCheats ? EnablePatches(s_cheat_patches, s_enabled_cheats) : 0; if (c_count > 0) { - fmt::format_to(std::back_inserter(message), TRANSLATE_FS("Patch", "{}{} cheat patches"), - message.empty() ? "" : ", ", c_count); + message.append_format("{}{}", message.empty() ? "" : "\n", + TRANSLATE_PLURAL_STR("Patch", "%n cheat patches are active.", "OSD Message", c_count)); } // Display message on first boot when we load patches. @@ -719,8 +719,7 @@ void Patch::UpdateActivePatches(bool reload_enabled_list, bool verbose, bool ver { if (!message.empty()) { - Host::AddIconOSDMessage("LoadPatches", ICON_FA_BAND_AID, - fmt::format(TRANSLATE_FS("Patch", "{} are active."), message), Host::OSD_INFO_DURATION); + Host::AddIconOSDMessage("LoadPatches", ICON_FA_BAND_AID, message, Host::OSD_INFO_DURATION); } else { diff --git a/tests/ctest/core/StubHost.cpp b/tests/ctest/core/StubHost.cpp index 7d23593c2d..3c7200e2f9 100644 --- a/tests/ctest/core/StubHost.cpp +++ b/tests/ctest/core/StubHost.cpp @@ -191,6 +191,23 @@ s32 Host::Internal::GetTranslatedStringImpl( return static_cast(msg.size()); } +std::string Host::TranslatePluralToString(const char* context, const char* msg, const char* disambiguation, int count) +{ + TinyString count_str = TinyString::from_format("{}", count); + + std::string ret(msg); + for (;;) + { + std::string::size_type pos = ret.find("%n"); + if (pos == std::string::npos) + break; + + ret.replace(pos, pos + 2, count_str.view()); + } + + return ret; +} + void Host::OnAchievementsLoginRequested(Achievements::LoginRequestReason reason) { }