diff --git a/rpcs3/Json/pad_settings.json b/rpcs3/Json/pad_settings.json deleted file mode 100644 index 4b93cc96f0..0000000000 --- a/rpcs3/Json/pad_settings.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "handlers": { - "null": "This controller is disabled and will appear as disconnected to software. Choose another handler to enable it.", - "keyboard": "While it is possible to use a keyboard as a pad in RPCS3, the use of an actual controller is strongly recommended. To bind mouse movement to a button or joystick, click on the desired button to activate it, then click and hold while dragging the mouse to a direction", - "ds3_windows": "In order to use the DualShock 3 handler, you need to install the official DualShock 3 driver first.\nSee the RPCS3 Wiki for instructions.", - "ds3_linux": "In order to use the DualShock 3 handler, you might need to add udev rules to let RPCS3 access the controller.\nSee the RPCS3 Wiki for instructions.", - "ds3_other": "The DualShock 3 handler is recommended for official DualShock 3 controllers.", - "ds4_windows": "If you have any issues with the DualShock 4 handler, it might be caused by third-party tools such as DS4Windows. It's recommended that you disable them while using this handler.", - "ds4_linux": "In order to use the DualShock 4 handler, you might need to add udev rules to let RPCS3 access the controller.\nSee the RPCS3 Wiki for instructions.", - "ds4_other": "The DualShock 4 handler is recommended for official DualShock 4 controllers.", - "xinput": "The XInput handler will work with Xbox controllers and many third-party PC-compatible controllers. Pressure sensitive buttons from SCP are supported when SCP's XInput1_3.dll is placed in the main RPCS3 directory. For more details, see the RPCS3 Wiki.", - "evdev": "The evdev handler should work with any controller that has linux support.\nIf your joystick is not being centered properly, read the RPCS3 Wiki for instructions.", - "mmjoy": "The MMJoystick handler should work with almost any controller recognized by Windows. However, it is recommended that you use the more specific handlers if you have a controller that supports them." - } -} diff --git a/rpcs3/Json/tooltips.json b/rpcs3/Json/tooltips.json deleted file mode 100644 index aae710e02f..0000000000 --- a/rpcs3/Json/tooltips.json +++ /dev/null @@ -1,173 +0,0 @@ -{ - "advanced": { - "libraries": { - "manual": "Allows the user to manually choose the LLE libraries to load.\nIf unsure, don't use this option. Nothing will work if you use this.", - "both": "Load libsysmodule.sprx and chosen list of libraries. Option for backward compatibility.\nIf unsure, don't use this option.", - "liblv2both": "Loads liblv2.sprx and chosen list of libraries.\nIf unsure, don't use this option.", - "liblv2list": "Loads liblv2.sprx and nothing but selected libraries.\nDon't use this option.", - "liblv2": "This closely emulates how games can load and unload system module files on a real PlayStation 3.\nSome games require this.\nThis is the preferred option." - }, - "debugConsoleMode": "Increases the amount of usable system memory to match a DECR console and more.\nCauses some software to behave differently than on retail hardware.", - "silenceAllLogs": "Stop writing any logs after game startup. Don't use unless you believe it's necessary.", - "readColor": "Initializes render target memory using vm memory.", - "readDepth": "Initializes render target memory using vm memory.", - "dumpDepth": "Writes depth buffer values to vm memory.", - "disableOnDiskShaderCache": "Disables the loading and saving of shaders from and to the shader cache in the data directory.", - "relaxedZCULL": "Changes ZCULL report synchronization behaviour to be more forgiving to PC architecture.\nCan improve performance in some games but can also cause stability issues or drastically reduced performance in others.\nUse with caution and if performance or stability is compromised, keep this disabled.", - "maxSPURSThreads": "Limits the maximum number of SPURS threads in each thread group.\nMay improve performance in some cases, especially on systems with limited number of hardware threads.\nLimiting the number of threads is likely to cause crashes; it's recommended to keep this at default value.", - "sleepTimersAccuracy": "Changes the sleep period accuracy.\n'As Host' uses default accuracy of the underlying operating system, while 'All Timers' attempts to improve it.\n'Usleep Only' limits the adjustments to usleep syscall only.\nCan affect perfomance in unexpected ways.", - "vblankRate": "Adjusts the frequency of vertical blanking signals that the emulator sends.\nAffects timing of events which rely on these signals.", - "clocksScale": "Changes the scale of emulated system time.\nAffects software which uses system time to calculate things such as dynamic timesteps.", - "wakeupDelay": "Try fiddling with this setting when encountering unstable games. The higher value, the better stability it may provide.\nIncrements/Decrements for each test should be around 100μs to 200μs until finding the best value for optimal stability.\nValues above 1000μs may cause noticeable performance penalties, use with caution.", - "disabledFromGlobal": "Do not change this setting globally.\nRight-click the game in game list and choose \"Configure\" instead." - }, - "audio": { - "audioOutBox": "XAudio2 is the recommended option and should be used whenever possible.\nOpenAL uses a cross-platform approach and is the next best alternative.", - "audioOutBox_Linux": "OpenAL uses a cross-platform approach and supports audio buffering, so it is the recommended option.\nPulseAudio uses the native Linux sound system, and is the next best alternative. If neither are available, ALSA can be used instead.", - "audioDump": "Saves all audio as a raw wave file. If unsure, leave this unchecked.", - "convert": "Uses 16-bit audio samples instead of default 32-bit floating point.\nUse with buggy audio drivers if you have no sound or completely broken sound.", - "downmix": "Uses stereo audio output instead of default 7.1 surround sound.\nUse with stereo audio devices. Disable it only if you are using a surround sound audio system.", - "masterVolume": "Controls the overall volume of the emulation.\nValues above 100% might reduce the audio quality.", - "enableBuffering": "Enables audio buffering, which reduces crackle/stutter but increases audio latency (requires XAudio2 or OpenAL).", - "audioBufferDuration": "Target buffer duration in milliseconds.\nHigher values make the buffering algorithm's job easier, but may introduce noticeable audio latency.", - "enableTimeStretching": "Enables time stretching - requires buffering to be enabled.\nReduces crackle/stutter further, but may cause a very noticeable reduction in audio quality on slower CPUs.", - "timeStretchingThreshold": "Buffer fill level (in percentage) below which time stretching will start.", - "microphoneBox": "Standard should be used for most games.\nSingStar emulates a SingStar device and should be used with SingStar games.\nReal SingStar should only be used with a REAL SingStar device with SingStar games.\nRocksmith should be used with a Rocksmith dongle." - }, - "cpu": { - "PPU": { - "precise": "This is the most accurate Interpreter, but very slow to play games with.\nYou may try this as a last resort if you encounter odd bugs or crashes.\nIf unsure, use PPU Interpreter Fast or PPU Recompiler (LLVM).", - "fast": "This is the fastest interpreter.\nTrades accuracy for speed, and it very rarely breaks games even in comparison to the Precise option.\nTry this if PPU Recompiler (LLVM) fails.", - "LLVM": "Recompiles the game's executable once before running it for the first time.\nThis is by far the fastest option and should always be used.\nShould you face compatibility issues, fall back to one of the Interpreters and retry.\nIf unsure, use this option." - }, - "SPU": { - "precise": "This is extremely slow but may fix broken graphics in some games.", - "fast": "This is slower than the SPU Recompiler but significantly faster than the precise interpreter.\nGames rarely need this however.", - "ASMJIT": "This is the fast option with very good compatibility.\nIf unsure, use this option.", - "LLVM": "This is the fastest option with very good compatibility.\nRecompiles the game's SPU LLVM cache before running which adds extra start-up time.\nIf you experience issues, use the ASMJIT Recompiler." - }, - "checkboxes": { - "accurateXFloat": "Fixes bugs in various games at the cost of performance.\nThis setting is only applied when SPU LLVM is active.", - "spuCache": "Should normally stay enabled.\nDisable this if the cache becomes too large.\nDisabling it does not remove the existing cache.", - "enableThreadScheduler": "Allows RPCS3 to manually schedule physical cores to run specific tasks on, instead of letting the OS handle it.\nVery useful on Windows, especially for AMD Ryzen systems where it can give huge performance gains.\nNote: This function is only implemented for AMD Ryzen CPUs.", - "lowerSPUThrPrio": "Runs SPU threads with lower priority than PPU threads.\nUsually faster on an i3 or i5, possibly slower or no difference on an i7 or Ryzen.", - "spuLoopDetection": "Try to detect loop conditions in SPU kernels and use them as scheduling hints.\nImproves performance and reduces CPU usage.\nMay cause severe audio stuttering in rare cases." - }, - "comboboxes": { - "enableTSX": "Enable usage of TSX instructions.\nNeeds to be forced on some Haswell or Broadwell CPUs.\nForcing this on older Hardware can lead to system instability, use it with caution.", - "spuBlockSize": "This option controls the SPU analyser, particularly the size of compiled units. The Mega and Giga modes may improve performance by tying smaller units together, decreasing the number of compiled units but increasing their size.\nUse the Safe mode for maximum compatibility.", - "preferredSPUThreads": "Some SPU stages are sensitive to race conditions and allowing a limited number at a time helps alleviate performance stalls.\nSetting this to a smaller value might improve performance and reduce stuttering in some games.\nLeave this on auto if performance is negatively affected when setting a small value." - } - }, - "debug": { - "ppuDebug": "Never use this.", - "spuDebug": "Never use this.", - "setDAZandFTZ": "Never use this.", - "accurateGETLLAR": "Never use this.", - "accuratePUTLLUC": "Never use this.", - "hookStFunc": "Allows to hook some functions like 'memcpy' replacing them with high-level implementations. May do nothing or break things. Experimental.", - "glLegacyBuffers": "Enables use of classic OpenGL buffers which allows capturing tools to work with RPCS3 e.g RenderDoc.\nIf unsure, don't use this option.", - "forceHighpZ": "Only useful when debugging differences in GPU hardware.\nNot necessary for average users.\nIf unsure, don't use this option.", - "debugOutput": "Enables the selected API's inbuilt debugging functionality.\nWill cause severe performance degradation especially with Vulkan.\nOnly useful to developers.\nIf unsure, don't use this option.", - "debugOverlay": "Provides a graphical overlay of various debugging information.\nIf unsure, don't use this option.", - "logProg": "Dump game shaders to file. Only useful to developers.\nIf unsure, don't use this option.", - "disableOcclusionQueries": "Disables running occlusion queries. Minor to moderate performance boost.\nMight introduce issues with broken occlusion e.g missing geometry and extreme pop-in.", - "forceCpuBlitEmulation": "Forces emulation of all blit and image manipulation operations on the CPU.\nRequires 'Write Color Buffers' option to also be enabled in most cases to avoid missing graphics.\nSignificantly degrades performance but is more accurate in some cases.\nThis setting overrides the 'GPU texture scaling' option.", - "disableVulkanMemAllocator": "Disables the custom Vulkan memory allocator and reverts to direct calls to VkAllocateMemory/VkFreeMemory.", - "disableFIFOReordering": "Disables RSX FIFO optimizations completely. Draws are processed as they are received by the DMA puller.", - "gpuTextureScaling": "Force all texture transfer, scaling and conversion operations on the GPU.\nMay cause texture corruption in some cases.", - "strictTextureFlushing": "Forces texture flushing even in situations where it is not necessary/correct. Known to cause visual artifacts, but useful for debugging certain texture cache issues." - }, - "emulator": { - "misc": { - "exitOnStop": "Automatically close RPCS3 when closing a game, or when a game closes itself.", - "alwaysStart": "Leave this enabled unless you are a developer.", - "startGameFullscreen": "Automatically puts the game window in fullscreen.\nDouble click on the game window or press alt+enter to toggle fullscreen and windowed mode.", - "preventDisplaySleep": "Prevent the display from sleeping while a game is running.\nThis requires the org.freedesktop.ScreenSaver D-Bus service on Linux.\nThis option will be disabled if the current platform does not support display sleep control.", - "showFPSInTitle": "Shows the frame rate in the game window title. May cause buggy or outdated recording software to not notice RPCS3.", - "gs_resizeOnBoot": "Automatically resizes the game window on boot.\nThis does not change the internal game resolution.", - "showTrophyPopups": "Show trophy pop-ups when a trophy is unlocked.", - "gs_disableMouse": "Disables the activation of fullscreen mode per double-click while the game screen is active.\nCheck this if you want to play with mouse and keyboard (for example with UCR).", - "maxLLVMThreads": "Limits the maximum number of threads used for PPU Module compilation.\nLower this in order to increase performance of other open applications.\nThe default uses all available threads.", - "showShaderCompilationHint": "Show shader compilation hints using the native overlay.", - "useNativeInterface": "Enables use of native HUD within the game window that can interact with game controllers.\nWhen disabled, regular Qt dialogs are used instead.\nCurrently, only Latin characters are supported." - }, - "overlay": { - "perfOverlayEnabled": "Enables or disables the performance overlay.", - "perfOverlayFramerateGraphEnabled": "Enables or disables the framerate graph.", - "perfOverlayFrametimeGraphEnabled": "Enables or disables the frametime graph.", - "perfOverlayPosition": "Sets the on-screen position (quadrant) of the performance overlay.", - "perfOverlayDetailLevel": "Controls the amount of information displayed on the performance overlay.", - "perfOverlayUpdateInterval": "Sets the time interval in which the performance overlay is being updated (measured in milliseconds).", - "perfOverlayFontSize": "Sets the font size of the performance overlay (measured in pixels).", - "perfOverlayOpacity": "Sets the opacity of the performance overlay (measured in %).", - "perfOverlayMarginX": "Sets the horizontal distance to the screen border relative to the screen quadrant (measured in pixels).", - "perfOverlayMarginY": "Sets the vertical distance to the screen border relative to the screen quadrant (measured in pixels).", - "perfOverlayCenterX": "Centers the performance overlay horizontally and overrides the horizontal margin.", - "perfOverlayCenterY": "Centers the performance overlay vertically and overrides the vertical margin." - }, - "shaderLoadingScreen": { - "shaderLoadBgEnabled": "Shows a background image during the native shader loading dialog/loading screen.\nBy default the used image will be /PS3_GAME/PIC1.PNG or /PS3_GAME/PIC0.PNG.", - "shaderLoadBgDarkening": "Changes the background image darkening effect strength of the native shader loading dialog.\nThis may be used to improve readability and/or aesthetics.", - "shaderLoadBgBlur": "Changes the background image blur effect strength of the native shader loading dialog.\nThis may be used to improve readability and/or aesthetics." - } - }, - "gpu": { - "comboboxes": { - "renderBox": "Vulkan is the fastest renderer. OpenGL is the most accurate renderer.\nIf unsure, use Vulkan. Should you have any compatibility issues, fall back to OpenGL.", - "resBox": "This setting will be ignored if the Resolution Scale is set to anything other than 100%!\nLeave this on 1280x720, every PS3 game is compatible with this resolution.\nOnly use 1920x1080 if the game supports it.\nRarely due to emulation bugs some games will only render at low resolutions like 480p.", - "graphicsAdapterBox": "On multi GPU systems select which GPU to use in RPCS3 when using Vulkan.\nThis is not needed when using OpenGL.", - "aspectBox": "Leave this on 16:9 unless you have a 4:3 monitor.", - "frameLimitBox": "Off is the best option as it performs faster.\nUsing the frame limiter will add extra overhead and slow down the game.\nHowever, some games will crash if the frame rate is too high.\nIf that happens, set value to anything other than Off.", - "antiAliasing": "Emulate PS3 multisampling layout.\nCan fix some otherwise difficult to solve graphics glitches.\nLow to moderate performance hit depending on your GPU hardware.", - "anisotropicFilterOverride": "Higher values increase sharpness of textures on sloped surfaces at the cost of GPU resources.\nModern GPUs can handle this setting just fine even at 16x.\nKeep this on Automatic if you want to use the original setting used by a real PS3." - }, - "sliders": { - "resolutionScale": "Scales the game's resolution by the given percentage.\nThe base resolution is always 1280x720.\nSet this value to 100% if you want to use the normal Resolution options.", - "minimumScalableDimension": "Only framebuffers greater than this size will be upscaled.\nIncreasing this value might fix problems with missing graphics when upscaling, especially when Write Color Buffers is enabled.\nDo not touch this setting if you are unsure." - }, - "main": { - "dumpColor": "Enable this option if you get missing graphics or broken lighting ingame.\nMight degrade performance and introduce stuttering in some cases.\nRequired for Demon's Souls.", - "vsync": "By having this off you might obtain a higher frame rate at the cost of tearing artifacts in the game.", - "scrictModeRendering": "Enforces strict compliance to the API specification.\nMight result in degraded performance in some games.\nCan resolve rare cases of missing graphics and flickering.\nIf unsure, don't use this option.", - "disableVertexCache": "Disables the vertex cache.\nMight resolve missing or flickering graphics output.\nMay degrade performance.", - "disableAsyncShaders": "Disables asynchronous shader compilation.\nFixes missing graphics while shaders are compiling but introduces stuttering.\nDisable if you do not want to deal with graphics pop-in, or for testing before filing any bug reports.", - "stretchToDisplayArea": "Overrides the aspect ratio and stretches the image to the full display area.", - "multithreadedRSX": "Offloads some RSX operations to a secondary thread.\nMay improve performance for some high-core processors.\nMay cause slowdown in some situations due to the extra worker thread load." - } - }, - "gui": { - "log_limit": "Sets the maximum amount of blocks that the log can display.\nThis usually equals the number of lines.\nSet 0 in order to remove the limit.", - "tty_limit": "Sets the maximum amount of blocks that the tty can display.\nThis usually equals the number of lines.\nSet 0 in order to remove the limit.", - "configs": "Only useful to developers.\nIf unsure, don't use this option.", - "stylesheets": "Changes the overall look of RPCS3.\nChoose a stylesheet and click Apply to change between styles.", - "show_welcome": "Shows the initial welcome screen upon starting RPCS3.", - "show_exit_game": "Shows a confirmation dialog when the game window is being closed.", - "show_boot_game": "Shows a confirmation dialog when a game was booted while another game is running.", - "show_pkg_install": "Shows a dialog when packages were installed successfully.", - "show_pup_install": "Shows a dialog when firmware was installed successfully.", - "check_update_start": "Check if an update is available on startup.", - "useRichPresence": "Enables use of Discord Rich Presence to show what game you are playing on Discord.\nRequires a restart of RPCS3 to completely close the connection.", - "discordState": "Tell your friends what you are doing.", - "custom_colors": "Prioritize custom user interface colors over properties set in stylesheet." - }, - "input": { - "padHandlerBox": "If you want to use the keyboard to control, select the Keyboard option.\nIf you have a DualShock 4, select DualShock 4.\nIf you have an Xbox controller, or another compatible device, use XInput.\nOlder controllers such as PS2 controllers with an adapter usually work fine with MMJoystick.\nCheck button mappings in the Windows control panel.", - "padHandlerBox_Linux": "If you want to use the keyboard to control, select the Keyboard option.\nIf you have a DualShock 4, select DualShock 4.", - "keyboardHandlerBox": "Some games support native keyboard input.\nBasic will work in these cases.", - "mouseHandlerBox": "Some games support native mouse input.\nBasic will work in these cases.", - "cameraBox": "Camera support is not implemented, leave this on null.", - "cameraTypeBox": "Camera support is not implemented, leave this on unknown.", - "moveBox": "PlayStation Move support.\nFake: Experimental! This maps Move controls to DS3 controller mappings.\nMouse: Emulate PSMove with Mouse handler." - }, - "network": { - "netStatusBox": "Leave as disconnected unless you're debugging.\nRPCS3 has no online support." - }, - "system": { - "sysLangBox": "Some games may fail to boot if the system language is not available in the game itself.\nOther games will switch language automatically to what is selected here.\nIt is recommended leaving this on a language supported by the game.", - "keyboardType": "Sets the used keyboard layout.\nCurrently only US, Japanese and German layouts are fully supported at this moment.", - "enterButtonAssignment": "The button used for enter/accept/confirm in system dialogs.\nChange this to use the circle button instead, which is the default configuration on Japanese systems and in many Japanese games.\nIn these cases having the cross button assigned can often lead to confusion.", - "enableHostRoot": "Required for some Homebrew.\nIf unsure, don't use this option.", - "limitCacheSize": "Automatically removes older files from disk cache on boot if it grows larger than the specified value.\nGames can use the cache folder to temporarily store data outside of system memory. It is not used for long-term storage." - } -} diff --git a/rpcs3/qt/etc/qt.conf b/rpcs3/qt/etc/qt.conf index 220ce33fa2..8a60d8561e 100644 --- a/rpcs3/qt/etc/qt.conf +++ b/rpcs3/qt/etc/qt.conf @@ -1,3 +1,4 @@ [Paths] Prefix = qt/ Plugins = plugins +Translations = translations diff --git a/rpcs3/resources.qrc b/rpcs3/resources.qrc index d14201e213..d29c6d5416 100644 --- a/rpcs3/resources.qrc +++ b/rpcs3/resources.qrc @@ -13,8 +13,6 @@ Icons/grid.png Icons/list.png Icons/refresh.png - Json/tooltips.json - Json/pad_settings.json Icons/exit_fullscreen.png Icons/open.png Icons/custom_config.png diff --git a/rpcs3/rpcs3.vcxproj b/rpcs3/rpcs3.vcxproj index 9fd6aac496..507c0df596 100644 --- a/rpcs3/rpcs3.vcxproj +++ b/rpcs3/rpcs3.vcxproj @@ -442,6 +442,11 @@ true true + + true + true + true + true true @@ -522,6 +527,11 @@ true true + + true + true + true + true true @@ -652,6 +662,11 @@ true true + + true + true + true + true true @@ -732,6 +747,11 @@ true true + + true + true + true + true true @@ -882,6 +902,11 @@ true true + + true + true + true + true true @@ -962,6 +987,11 @@ true true + + true + true + true + true true @@ -1092,6 +1122,11 @@ true true + + true + true + true + true true @@ -1172,6 +1207,11 @@ true true + + true + true + true + true true @@ -1829,6 +1869,24 @@ .\QTGeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\QTGeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -D_WINDOWS -DUNICODE -DWIN32 -DWIN64 -DQT_OPENGL_LIB -DQT_WIDGETS_LIB -DQT_GUI_LIB -DQT_QML_LIB -DQT_NETWORK_LIB -DQT_CORE_LIB -DQT_WINEXTRAS_LIB -DQT_CONCURRENT_LIB -D%(PreprocessorDefinitions) "-I.\..\3rdparty\libusb\libusb" "-I$(VULKAN_SDK)\Include" "-I.\..\3rdparty\minidx12\Include" "-I$(QTDIR)\include" "-I$(QTDIR)\include\QtOpenGL" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtANGLE" "-I$(QTDIR)\include\QtQml" "-I$(QTDIR)\include\QtNetwork" "-I$(QTDIR)\include\QtCore" "-I.\debug" "-I$(QTDIR)\mkspecs\win32-msvc2015" "-I.\QTGeneratedFiles\$(ConfigurationName)" "-I.\QTGeneratedFiles" "-I$(QTDIR)\include\QtWinExtras" "-I$(QTDIR)\include\QtConcurrent" + + $(QTDIR)\bin\moc.exe;%(FullPath) + Moc%27ing %(Identity)... + .\QTGeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp + "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\QTGeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -D_WINDOWS -DUNICODE -DWIN32 -DWIN64 -DWITH_DISCORD_RPC -DQT_NO_DEBUG -DQT_OPENGL_LIB -DQT_WIDGETS_LIB -DQT_GUI_LIB -DQT_QML_LIB -DQT_NETWORK_LIB -DQT_CORE_LIB -DNDEBUG -DQT_WINEXTRAS_LIB "-DBRANCH=$(BRANCH)" -DQT_CONCURRENT_LIB -D%(PreprocessorDefinitions) "-I.\..\3rdparty\libusb\libusb" "-I$(VULKAN_SDK)\Include" "-I.\..\3rdparty\minidx12\Include" "-I$(QTDIR)\include" "-I$(QTDIR)\include\QtOpenGL" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtANGLE" "-I$(QTDIR)\include\QtQml" "-I$(QTDIR)\include\QtNetwork" "-I$(QTDIR)\include\QtCore" "-I.\release" "-I$(QTDIR)\mkspecs\win32-msvc2015" "-I.\QTGeneratedFiles\$(ConfigurationName)" "-I.\QTGeneratedFiles" "-I$(QTDIR)\include\QtWinExtras" "-I$(QTDIR)\include\QtConcurrent" + $(QTDIR)\bin\moc.exe;%(FullPath) + Moc%27ing %(Identity)... + .\QTGeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp + "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\QTGeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -D_WINDOWS -DUNICODE -DWIN32 -DWIN64 -DQT_OPENGL_LIB -DQT_WIDGETS_LIB -DQT_GUI_LIB -DQT_QML_LIB -DQT_NETWORK_LIB -DQT_CORE_LIB -DQT_WINEXTRAS_LIB -DQT_CONCURRENT_LIB -D%(PreprocessorDefinitions) "-I.\..\3rdparty\libusb\libusb" "-I$(VULKAN_SDK)\Include" "-I.\..\3rdparty\minidx12\Include" "-I$(QTDIR)\include" "-I$(QTDIR)\include\QtOpenGL" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtANGLE" "-I$(QTDIR)\include\QtQml" "-I$(QTDIR)\include\QtNetwork" "-I$(QTDIR)\include\QtCore" "-I.\debug" "-I$(QTDIR)\mkspecs\win32-msvc2015" "-I.\QTGeneratedFiles\$(ConfigurationName)" "-I.\QTGeneratedFiles" "-I$(QTDIR)\include\QtWinExtras" "-I$(QTDIR)\include\QtConcurrent" + $(QTDIR)\bin\moc.exe;%(FullPath) + Moc%27ing %(Identity)... + .\QTGeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp + "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\QTGeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -D_WINDOWS -DUNICODE -DWIN32 -DWIN64 -DWITH_DISCORD_RPC -DQT_NO_DEBUG -DQT_OPENGL_LIB -DQT_WIDGETS_LIB -DQT_GUI_LIB -DQT_QML_LIB -DQT_NETWORK_LIB -DQT_CORE_LIB -DNDEBUG -DQT_WINEXTRAS_LIB -DQT_CONCURRENT_LIB -D%(PreprocessorDefinitions) "-I.\..\3rdparty\libusb\libusb" "-I$(VULKAN_SDK)\Include" "-I.\..\3rdparty\minidx12\Include" "-I$(QTDIR)\include" "-I$(QTDIR)\include\QtOpenGL" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtANGLE" "-I$(QTDIR)\include\QtQml" "-I$(QTDIR)\include\QtNetwork" "-I$(QTDIR)\include\QtCore" "-I.\release" "-I$(QTDIR)\mkspecs\win32-msvc2015" "-I.\QTGeneratedFiles\$(ConfigurationName)" "-I.\QTGeneratedFiles" "-I$(QTDIR)\include\QtWinExtras" "-I$(QTDIR)\include\QtConcurrent" + $(QTDIR)\bin\moc.exe;%(FullPath) + Moc%27ing %(Identity)... + .\QTGeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp + "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\QTGeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -D_WINDOWS -DUNICODE -DWIN32 -DWIN64 -DQT_OPENGL_LIB -DQT_WIDGETS_LIB -DQT_GUI_LIB -DQT_QML_LIB -DQT_NETWORK_LIB -DQT_CORE_LIB -DQT_WINEXTRAS_LIB -DQT_CONCURRENT_LIB -D%(PreprocessorDefinitions) "-I.\..\3rdparty\libusb\libusb" "-I$(VULKAN_SDK)\Include" "-I.\..\3rdparty\minidx12\Include" "-I$(QTDIR)\include" "-I$(QTDIR)\include\QtOpenGL" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtANGLE" "-I$(QTDIR)\include\QtQml" "-I$(QTDIR)\include\QtNetwork" "-I$(QTDIR)\include\QtCore" "-I.\debug" "-I$(QTDIR)\mkspecs\win32-msvc2015" "-I.\QTGeneratedFiles\$(ConfigurationName)" "-I.\QTGeneratedFiles" "-I$(QTDIR)\include\QtWinExtras" "-I$(QTDIR)\include\QtConcurrent" + @@ -1849,6 +1907,24 @@ .\QTGeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\QTGeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -D_WINDOWS -DUNICODE -DWIN32 -DWIN64 -DQT_OPENGL_LIB -DQT_WIDGETS_LIB -DQT_GUI_LIB -DQT_QML_LIB -DQT_NETWORK_LIB -DQT_CORE_LIB -DQT_WINEXTRAS_LIB -DQT_CONCURRENT_LIB -D%(PreprocessorDefinitions) "-I.\..\3rdparty\libusb\libusb" "-I$(VULKAN_SDK)\Include" "-I.\..\3rdparty\minidx12\Include" "-I$(QTDIR)\include" "-I$(QTDIR)\include\QtOpenGL" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtANGLE" "-I$(QTDIR)\include\QtQml" "-I$(QTDIR)\include\QtNetwork" "-I$(QTDIR)\include\QtCore" "-I.\debug" "-I$(QTDIR)\mkspecs\win32-msvc2015" "-I.\QTGeneratedFiles\$(ConfigurationName)" "-I.\QTGeneratedFiles" "-I$(QTDIR)\include\QtWinExtras" "-I$(QTDIR)\include\QtConcurrent" + + $(QTDIR)\bin\moc.exe;%(FullPath) + Moc%27ing %(Identity)... + .\QTGeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp + "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\QTGeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -D_WINDOWS -DUNICODE -DWIN32 -DWIN64 -DWITH_DISCORD_RPC -DQT_NO_DEBUG -DQT_OPENGL_LIB -DQT_WIDGETS_LIB -DQT_GUI_LIB -DQT_QML_LIB -DQT_NETWORK_LIB -DQT_CORE_LIB -DNDEBUG -DQT_WINEXTRAS_LIB "-DBRANCH=$(BRANCH)" -DQT_CONCURRENT_LIB -D%(PreprocessorDefinitions) "-I.\..\3rdparty\libusb\libusb" "-I$(VULKAN_SDK)\Include" "-I.\..\3rdparty\minidx12\Include" "-I$(QTDIR)\include" "-I$(QTDIR)\include\QtOpenGL" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtANGLE" "-I$(QTDIR)\include\QtQml" "-I$(QTDIR)\include\QtNetwork" "-I$(QTDIR)\include\QtCore" "-I.\release" "-I$(QTDIR)\mkspecs\win32-msvc2015" "-I.\QTGeneratedFiles\$(ConfigurationName)" "-I.\QTGeneratedFiles" "-I$(QTDIR)\include\QtWinExtras" "-I$(QTDIR)\include\QtConcurrent" + $(QTDIR)\bin\moc.exe;%(FullPath) + Moc%27ing %(Identity)... + .\QTGeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp + "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\QTGeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -D_WINDOWS -DUNICODE -DWIN32 -DWIN64 -DQT_OPENGL_LIB -DQT_WIDGETS_LIB -DQT_GUI_LIB -DQT_QML_LIB -DQT_NETWORK_LIB -DQT_CORE_LIB -DQT_WINEXTRAS_LIB -DQT_CONCURRENT_LIB -D%(PreprocessorDefinitions) "-I.\..\3rdparty\libusb\libusb" "-I$(VULKAN_SDK)\Include" "-I.\..\3rdparty\minidx12\Include" "-I$(QTDIR)\include" "-I$(QTDIR)\include\QtOpenGL" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtANGLE" "-I$(QTDIR)\include\QtQml" "-I$(QTDIR)\include\QtNetwork" "-I$(QTDIR)\include\QtCore" "-I.\debug" "-I$(QTDIR)\mkspecs\win32-msvc2015" "-I.\QTGeneratedFiles\$(ConfigurationName)" "-I.\QTGeneratedFiles" "-I$(QTDIR)\include\QtWinExtras" "-I$(QTDIR)\include\QtConcurrent" + $(QTDIR)\bin\moc.exe;%(FullPath) + Moc%27ing %(Identity)... + .\QTGeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp + "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\QTGeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -D_WINDOWS -DUNICODE -DWIN32 -DWIN64 -DWITH_DISCORD_RPC -DQT_NO_DEBUG -DQT_OPENGL_LIB -DQT_WIDGETS_LIB -DQT_GUI_LIB -DQT_QML_LIB -DQT_NETWORK_LIB -DQT_CORE_LIB -DNDEBUG -DQT_WINEXTRAS_LIB -DQT_CONCURRENT_LIB -D%(PreprocessorDefinitions) "-I.\..\3rdparty\libusb\libusb" "-I$(VULKAN_SDK)\Include" "-I.\..\3rdparty\minidx12\Include" "-I$(QTDIR)\include" "-I$(QTDIR)\include\QtOpenGL" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtANGLE" "-I$(QTDIR)\include\QtQml" "-I$(QTDIR)\include\QtNetwork" "-I$(QTDIR)\include\QtCore" "-I.\release" "-I$(QTDIR)\mkspecs\win32-msvc2015" "-I.\QTGeneratedFiles\$(ConfigurationName)" "-I.\QTGeneratedFiles" "-I$(QTDIR)\include\QtWinExtras" "-I$(QTDIR)\include\QtConcurrent" + $(QTDIR)\bin\moc.exe;%(FullPath) + Moc%27ing %(Identity)... + .\QTGeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp + "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\QTGeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -D_WINDOWS -DUNICODE -DWIN32 -DWIN64 -DQT_OPENGL_LIB -DQT_WIDGETS_LIB -DQT_GUI_LIB -DQT_QML_LIB -DQT_NETWORK_LIB -DQT_CORE_LIB -DQT_WINEXTRAS_LIB -DQT_CONCURRENT_LIB -D%(PreprocessorDefinitions) "-I.\..\3rdparty\libusb\libusb" "-I$(VULKAN_SDK)\Include" "-I.\..\3rdparty\minidx12\Include" "-I$(QTDIR)\include" "-I$(QTDIR)\include\QtOpenGL" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtANGLE" "-I$(QTDIR)\include\QtQml" "-I$(QTDIR)\include\QtNetwork" "-I$(QTDIR)\include\QtCore" "-I.\debug" "-I$(QTDIR)\mkspecs\win32-msvc2015" "-I.\QTGeneratedFiles\$(ConfigurationName)" "-I.\QTGeneratedFiles" "-I$(QTDIR)\include\QtWinExtras" "-I$(QTDIR)\include\QtConcurrent" + diff --git a/rpcs3/rpcs3.vcxproj.filters b/rpcs3/rpcs3.vcxproj.filters index 8f45c55011..b209b431b3 100644 --- a/rpcs3/rpcs3.vcxproj.filters +++ b/rpcs3/rpcs3.vcxproj.filters @@ -120,6 +120,11 @@ {73853473-9d11-4771-b8d8-d06ea25e2ead} + + {639EADAA-A684-42e4-A9AD-28FC9BCB8F7C} + ts + false + @@ -812,18 +817,6 @@ Generated Files\Debug - LLVM - - Generated Files\Release - LLVM - - - Generated Files\Debug - - - Generated Files\Release - - - Generated Files\Debug - LLVM - Generated Files\Release - LLVM @@ -845,6 +838,30 @@ Io\Keyboard + + Generated Files\Release - LLVM + + + Generated Files\Debug + + + Generated Files\Release + + + Generated Files\Debug - LLVM + + + Generated Files\Release - LLVM + + + Generated Files\Debug + + + Generated Files\Release + + + Generated Files\Debug - LLVM + @@ -1107,6 +1124,12 @@ Gui\settings + + Gui\settings + + + Gui\settings + diff --git a/rpcs3/rpcs3qt/category.h b/rpcs3/rpcs3qt/category.h new file mode 100644 index 0000000000..f2824c0096 --- /dev/null +++ b/rpcs3/rpcs3qt/category.h @@ -0,0 +1,51 @@ +#pragma once + +#include +#include + +enum Category +{ + Disc_Game, + HDD_Game, + PS1_Game, + PS2_Game, + PSP_Game, + Home, + Media, + Data, + Unknown_Cat, + Others, +}; + +namespace category +{ + const QString cat_app_music = "AM"; + const QString cat_app_photo = "AP"; + const QString cat_app_tv = "AT"; + const QString cat_app_video = "AV"; + const QString cat_bc_video = "BV"; + const QString cat_web_tv = "WT"; + const QString cat_home = "HM"; + const QString cat_network = "CB"; + const QString cat_store_fe = "SF"; + const QString cat_disc_game = "DG"; + const QString cat_hdd_game = "HG"; + const QString cat_ps2_game = "2P"; + const QString cat_ps2_inst = "2G"; + const QString cat_ps1_game = "1P"; + const QString cat_psp_game = "PP"; + const QString cat_psp_mini = "MN"; + const QString cat_psp_rema = "PE"; + const QString cat_ps3_data = "GD"; + const QString cat_ps2_data = "2D"; + const QString cat_ps3_save = "SD"; + const QString cat_psp_save = "MS"; + + const QString cat_unknown = "Unknown"; + + const QStringList ps2_games = { cat_ps2_game, cat_ps2_inst }; + const QStringList psp_games = { cat_psp_game, cat_psp_mini, cat_psp_rema }; + const QStringList media = { cat_app_photo, cat_app_video, cat_bc_video, cat_app_music, cat_app_tv, cat_web_tv }; + const QStringList data = { cat_ps3_data, cat_ps2_data, cat_ps3_save, cat_psp_save }; + const QStringList others = { cat_network, cat_store_fe }; +} \ No newline at end of file diff --git a/rpcs3/rpcs3qt/cheat_manager.cpp b/rpcs3/rpcs3qt/cheat_manager.cpp index 17626e7ce1..f56ee4961d 100644 --- a/rpcs3/rpcs3qt/cheat_manager.cpp +++ b/rpcs3/rpcs3qt/cheat_manager.cpp @@ -20,7 +20,7 @@ #include "Utilities/StrUtil.h" -LOG_CHANNEL(log_cheat); +LOG_CHANNEL(log_cheat, "Cheat"); cheat_manager_dialog* cheat_manager_dialog::inst = nullptr; diff --git a/rpcs3/rpcs3qt/game_compatibility.cpp b/rpcs3/rpcs3qt/game_compatibility.cpp index de0a8081a5..9b0dde6021 100644 --- a/rpcs3/rpcs3qt/game_compatibility.cpp +++ b/rpcs3/rpcs3qt/game_compatibility.cpp @@ -3,7 +3,7 @@ #include #include -LOG_CHANNEL(compat_log); +LOG_CHANNEL(compat_log, "Compat"); constexpr auto qstr = QString::fromStdString; inline std::string sstr(const QString& _in) { return _in.toStdString(); } @@ -38,19 +38,19 @@ bool game_compatibility::ReadJSON(const QJsonObject& json_data, bool after_downl error_message = "Server Error - Unknown Error"; break; } - compat_log.error("Compatibility error: { %s: return code %d }", error_message, return_code); + compat_log.error("%s: return code %d", error_message, return_code); Q_EMIT DownloadError(qstr(error_message) + " " + QString::number(return_code)); } else { - compat_log.error("Compatibility error: { Database Error - Invalid: return code %d }", return_code); + compat_log.error("Database Error - Invalid: return code %d", return_code); } return false; } if (!json_data["results"].isObject()) { - compat_log.error("Compatibility error: { Database Error - No Results found }"); + compat_log.error("Database Error - No Results found"); return false; } @@ -63,7 +63,7 @@ bool game_compatibility::ReadJSON(const QJsonObject& json_data, bool after_downl { if (!json_results[key].isObject()) { - compat_log.error("Compatibility error: { Database Error - Unusable object %s }", sstr(key)); + compat_log.error("Database Error - Unusable object %s", sstr(key)); continue; } @@ -94,20 +94,20 @@ void game_compatibility::RequestCompatibility(bool online) if (!file.exists()) { - compat_log.notice("Compatibility notice: { Database file not found: %s }", sstr(m_filepath)); + compat_log.notice("Database file not found: %s", sstr(m_filepath)); return; } if (!file.open(QIODevice::ReadOnly)) { - compat_log.error("Compatibility error: { Database Error - Could not read database from file: %s }", sstr(m_filepath)); + compat_log.error("Database Error - Could not read database from file: %s", sstr(m_filepath)); return; } QByteArray data = file.readAll(); file.close(); - compat_log.notice("Compatibility notice: { Finished reading database from file: %s }", sstr(m_filepath)); + compat_log.notice("Finished reading database from file: %s", sstr(m_filepath)); // Create new map from database ReadJSON(QJsonDocument::fromJson(data).object(), online); @@ -179,7 +179,7 @@ void game_compatibility::RequestCompatibility(bool online) // We failed to retrieve a new database, therefore refresh gamelist to old state const QString error = network_reply->errorString(); Q_EMIT DownloadError(error); - compat_log.error("Compatibility error: { Network Error - %s }", sstr(error)); + compat_log.error("Network Error - %s", sstr(error)); } // Clean up Progress Dialog @@ -213,7 +213,7 @@ void game_compatibility::RequestCompatibility(bool online) m_progress_timer->stop(); } - compat_log.notice("Compatibility notice: { Database download finished }"); + compat_log.notice("Database download finished"); // Read data from network reply QByteArray data = network_reply->readAll(); @@ -230,19 +230,19 @@ void game_compatibility::RequestCompatibility(bool online) if (file.exists()) { - compat_log.notice("Compatibility notice: { Database file found: %s }", sstr(m_filepath)); + compat_log.notice("Database file found: %s", sstr(m_filepath)); } if (!file.open(QIODevice::WriteOnly)) { - compat_log.error("Compatibility error: { Database Error - Could not write database to file: %s }", sstr(m_filepath)); + compat_log.error("Database Error - Could not write database to file: %s", sstr(m_filepath)); return; } file.write(data); file.close(); - compat_log.success("Compatibility success: { Write database to file: %s }", sstr(m_filepath)); + compat_log.success("Write database to file: %s", sstr(m_filepath)); } }); diff --git a/rpcs3/rpcs3qt/game_compatibility.h b/rpcs3/rpcs3qt/game_compatibility.h index 6eb2a8f08c..dfce48bebe 100644 --- a/rpcs3/rpcs3qt/game_compatibility.h +++ b/rpcs3/rpcs3qt/game_compatibility.h @@ -32,14 +32,14 @@ class game_compatibility : public QObject private: const std::map Status_Data = { - { "Playable", { 0, "", "#1ebc61", QObject::tr("Playable"), QObject::tr("Games that can be properly played from start to finish") } }, - { "Ingame", { 1, "", "#f9b32f", QObject::tr("Ingame"), QObject::tr("Games that either can't be finished, have serious glitches or have insufficient performance") } }, - { "Intro", { 2, "", "#e08a1e", QObject::tr("Intro"), QObject::tr("Games that display image but don't make it past the menus") } }, - { "Loadable", { 3, "", "#e74c3c", QObject::tr("Loadable"), QObject::tr("Games that display a black screen with a framerate on the window's title") } }, - { "Nothing", { 4, "", "#455556", QObject::tr("Nothing"), QObject::tr("Games that don't initialize properly, not loading at all and/or crashing the emulator") } }, - { "NoResult", { 5, "", "", QObject::tr("No results found"), QObject::tr("There is no entry for this game or application in the compatibility database yet.") } }, - { "NoData", { 6, "", "", QObject::tr("Database missing"), QObject::tr("Right click here and download the current database.\nMake sure you are connected to the internet.") } }, - { "Download", { 7, "", "", QObject::tr("Retrieving..."), QObject::tr("Downloading the compatibility database. Please wait...") } } + { "Playable", { 0, "", "#1ebc61", tr("Playable"), tr("Games that can be properly played from start to finish") } }, + { "Ingame", { 1, "", "#f9b32f", tr("Ingame"), tr("Games that either can't be finished, have serious glitches or have insufficient performance") } }, + { "Intro", { 2, "", "#e08a1e", tr("Intro"), tr("Games that display image but don't make it past the menus") } }, + { "Loadable", { 3, "", "#e74c3c", tr("Loadable"), tr("Games that display a black screen with a framerate on the window's title") } }, + { "Nothing", { 4, "", "#455556", tr("Nothing"), tr("Games that don't initialize properly, not loading at all and/or crashing the emulator") } }, + { "NoResult", { 5, "", "", tr("No results found"), tr("There is no entry for this game or application in the compatibility database yet.") } }, + { "NoData", { 6, "", "", tr("Database missing"), tr("Right click here and download the current database.\nMake sure you are connected to the internet.") } }, + { "Download", { 7, "", "", tr("Retrieving..."), tr("Downloading the compatibility database. Please wait...") } } }; int m_timer_count = 0; QString m_filepath; diff --git a/rpcs3/rpcs3qt/game_list_frame.cpp b/rpcs3/rpcs3qt/game_list_frame.cpp index 90b1279502..71d485730c 100644 --- a/rpcs3/rpcs3qt/game_list_frame.cpp +++ b/rpcs3/rpcs3qt/game_list_frame.cpp @@ -293,7 +293,7 @@ bool game_list_frame::IsEntryVisible(const game_info& game) { return m_categoryFilters.contains(qstr(game->info.category)); } - return category::CategoryInMap(game->info.category, category::cat_boot); + return category::CategoryInMap(game->info.category, Localized().category.cat_boot); }; const QString serial = qstr(game->info.serial); @@ -461,15 +461,16 @@ void game_list_frame::Refresh(const bool fromDrive, const bool scrollAfter) { if (fromDrive) { + const Localized localized; + // Load PSF m_game_data.clear(); m_notes.clear(); const std::string _hdd = Emulator::GetHddDir(); - const std::string cat_DG = sstr(category::disc_game); - const std::string cat_GD = sstr(category::ps3_data); - const std::string cat_unknown = sstr(category::unknown); + const std::string cat_unknown = sstr(category::cat_unknown); + const std::string cat_unknown_localized = sstr(localized.category.unknown); std::vector path_list; @@ -546,6 +547,8 @@ void game_list_frame::Refresh(const bool fromDrive, const bool scrollAfter) { const std::string dir = path_list[i]; + const Localized thread_localized; + try { const std::string sfo_dir = Emulator::GetSfoDirFromGamePath(dir, Emu.GetUsr()); @@ -560,11 +563,11 @@ void game_list_frame::Refresh(const bool fromDrive, const bool scrollAfter) GameInfo game; game.path = dir; game.serial = psf::get_string(psf, "TITLE_ID", ""); - game.name = psf::get_string(psf, "TITLE", cat_unknown); - game.app_ver = psf::get_string(psf, "APP_VER", cat_unknown); - game.version = psf::get_string(psf, "VERSION", cat_unknown); + game.name = psf::get_string(psf, "TITLE", cat_unknown_localized); + game.app_ver = psf::get_string(psf, "APP_VER", cat_unknown_localized); + game.version = psf::get_string(psf, "VERSION", cat_unknown_localized); game.category = psf::get_string(psf, "CATEGORY", cat_unknown); - game.fw = psf::get_string(psf, "PS3_SYSTEM_VER", cat_unknown); + game.fw = psf::get_string(psf, "PS3_SYSTEM_VER", cat_unknown_localized); game.parental_lvl = psf::get_integer(psf, "PARENTAL_LEVEL", 0); game.resolution = psf::get_integer(psf, "RESOLUTION", 0); game.sound_format = psf::get_integer(psf, "SOUND_FORMAT", 0); @@ -621,25 +624,27 @@ void game_list_frame::Refresh(const bool fromDrive, const bool scrollAfter) m_titles.insert(serial, title); } - auto cat = category::cat_boot.find(game.category); - if (cat != category::cat_boot.end()) + auto qt_cat = qstr(game.category); + auto cat = thread_localized.category.cat_boot.find(qt_cat); + if (cat != thread_localized.category.cat_boot.end()) { game.icon_path = sfo_dir + "/ICON0.PNG"; - game.category = sstr(cat->second); + qt_cat = cat->second; } - else if ((cat = category::cat_data.find(game.category)) != category::cat_data.end()) + else if ((cat = thread_localized.category.cat_data.find(qt_cat)) != thread_localized.category.cat_data.end()) { game.icon_path = sfo_dir + "/ICON0.PNG"; - game.category = sstr(cat->second); + qt_cat = cat->second; } else if (game.category == cat_unknown) { game.icon_path = sfo_dir + "/ICON0.PNG"; + qt_cat = localized.category.unknown; } else { game.icon_path = sfo_dir + "/ICON0.PNG"; - game.category = sstr(category::other); + qt_cat = localized.category.other; } mutex_cat.unlock(); @@ -660,7 +665,7 @@ void game_list_frame::Refresh(const bool fromDrive, const bool scrollAfter) const QColor color = getGridCompatibilityColor(compat.color); const QPixmap pxmap = PaintedPixmap(icon, hasCustomConfig, hasCustomPadConfig, color); - games.push(std::make_shared(gui_game_info{game, compat, icon, pxmap, hasCustomConfig, hasCustomPadConfig})); + games.push(std::make_shared(gui_game_info{game, qt_cat, compat, icon, pxmap, hasCustomConfig, hasCustomPadConfig})); } catch (const std::exception& e) { @@ -677,12 +682,12 @@ void game_list_frame::Refresh(const bool fromDrive, const bool scrollAfter) // Try to update the app version for disc games if there is a patch for (const auto& entry : m_game_data) { - if (entry->info.category == cat_DG) + if (entry->info.category == "DG") { for (const auto& other : m_game_data) { // The patch is game data and must have the same serial and an app version - if (entry->info.serial == other->info.serial && other->info.category == cat_GD && other->info.app_ver != cat_unknown) + if (entry->info.serial == other->info.serial && other->info.category == "GD" && other->info.app_ver != cat_unknown) { try { @@ -1171,13 +1176,13 @@ void game_list_frame::ShowContextMenu(const QPoint &pos) }); // Disable options depending on software category - QString category = qstr(currGame.category); + const QString category = qstr(currGame.category); - if (category == category::disc_game) + if (category == cat_disc_game) { removeGame->setEnabled(false); } - else if (category != category::hdd_game) + else if (category != cat_hdd_game) { checkCompat->setEnabled(false); } @@ -1912,7 +1917,8 @@ int game_list_frame::PopulateGameList() m_gameList->setRowCount(m_game_data.size()); // Default locale. Uses current Qt application language. - QLocale locale{}; + const QLocale locale{}; + const Localized localized; int row = 0, index = -1; for (const auto& game : m_game_data) @@ -1973,13 +1979,13 @@ int game_list_frame::PopulateGameList() // Version QString app_version = qstr(game->info.app_ver); - if (app_version == category::unknown) + if (app_version == localized.category.unknown) { // Fall back to Disc/Pkg Revision app_version = qstr(game->info.version); } - if (!game->compat.version.isEmpty() && (app_version == category::unknown || game->compat.version.toDouble() > app_version.toDouble())) + if (!game->compat.version.isEmpty() && (app_version == localized.category.unknown || game->compat.version.toDouble() > app_version.toDouble())) { app_version = tr("%0 (Update available: %1)").arg(app_version, game->compat.version); } @@ -2006,12 +2012,12 @@ int game_list_frame::PopulateGameList() m_gameList->setItem(row, gui::column_serial, serial_item); m_gameList->setItem(row, gui::column_firmware, new custom_table_widget_item(game->info.fw)); m_gameList->setItem(row, gui::column_version, new custom_table_widget_item(app_version)); - m_gameList->setItem(row, gui::column_category, new custom_table_widget_item(game->info.category)); + m_gameList->setItem(row, gui::column_category, new custom_table_widget_item(game->localized_category)); m_gameList->setItem(row, gui::column_path, new custom_table_widget_item(game->info.path)); m_gameList->setItem(row, gui::column_move, new custom_table_widget_item(sstr(supports_move ? tr("Supported") : tr("Not Supported")), Qt::UserRole, !supports_move)); - m_gameList->setItem(row, gui::column_resolution, new custom_table_widget_item(GetStringFromU32(game->info.resolution, resolution::mode, true))); - m_gameList->setItem(row, gui::column_sound, new custom_table_widget_item(GetStringFromU32(game->info.sound_format, sound::format, true))); - m_gameList->setItem(row, gui::column_parental, new custom_table_widget_item(GetStringFromU32(game->info.parental_lvl, parental::level), Qt::UserRole, game->info.parental_lvl)); + m_gameList->setItem(row, gui::column_resolution, new custom_table_widget_item(GetStringFromU32(game->info.resolution, localized.resolution.mode, true))); + m_gameList->setItem(row, gui::column_sound, new custom_table_widget_item(GetStringFromU32(game->info.sound_format, localized.sound.format, true))); + m_gameList->setItem(row, gui::column_parental, new custom_table_widget_item(GetStringFromU32(game->info.parental_lvl, localized.parental.level), Qt::UserRole, game->info.parental_lvl)); m_gameList->setItem(row, gui::column_last_play, new custom_table_widget_item(locale.toString(last_played, gui::persistent::last_played_date_format_new), Qt::UserRole, last_played)); m_gameList->setItem(row, gui::column_playtime, new custom_table_widget_item(GetPlayTimeByMs(elapsed_ms), Qt::UserRole, elapsed_ms)); m_gameList->setItem(row, gui::column_compat, compat_item); diff --git a/rpcs3/rpcs3qt/game_list_frame.h b/rpcs3/rpcs3qt/game_list_frame.h index a02f65c018..71ecb87d96 100644 --- a/rpcs3/rpcs3qt/game_list_frame.h +++ b/rpcs3/rpcs3qt/game_list_frame.h @@ -9,6 +9,7 @@ #include "emu_settings.h" #include "persistent_settings.h" #include "game_compatibility.h" +#include "category.h" #include #include @@ -18,95 +19,9 @@ #include -enum Category +namespace category { - Disc_Game, - HDD_Game, - PS1_Game, - PS2_Game, - PSP_Game, - Home, - Media, - Data, - Unknown_Cat, - Others, -}; - -namespace category // (see PARAM.SFO in psdevwiki.com) TODO: Disc Categories -{ - // PS3 bootable - const QString app_music = QObject::tr("App Music"); - const QString app_photo = QObject::tr("App Photo"); - const QString app_tv = QObject::tr("App TV"); - const QString app_video = QObject::tr("App Video"); - const QString bc_video = QObject::tr("Broadcast Video"); - const QString disc_game = QObject::tr("Disc Game"); - const QString hdd_game = QObject::tr("HDD Game"); - const QString home = QObject::tr("Home"); - const QString network = QObject::tr("Network"); - const QString store_fe = QObject::tr("Store"); - const QString web_tv = QObject::tr("Web TV"); - - // PS2 bootable - const QString ps2_game = QObject::tr("PS2 Classics"); - const QString ps2_inst = QObject::tr("PS2 Game"); - - // PS1 bootable - const QString ps1_game = QObject::tr("PS1 Classics"); - - // PSP bootable - const QString psp_game = QObject::tr("PSP Game"); - const QString psp_mini = QObject::tr("PSP Minis"); - const QString psp_rema = QObject::tr("PSP Remasters"); - - // Data - const QString ps3_data = QObject::tr("PS3 Game Data"); - const QString ps2_data = QObject::tr("PS2 Emulator Data"); - - // Save - const QString ps3_save = QObject::tr("PS3 Save Data"); - const QString psp_save = QObject::tr("PSP Minis Save Data"); - - // others - const QString trophy = QObject::tr("Trophy"); - const QString unknown = QObject::tr("Unknown"); - const QString other = QObject::tr("Other"); - - const q_from_char cat_boot = - { - { "AM", app_music }, // media - { "AP", app_photo }, // media - { "AT", app_tv }, // media - { "AV", app_video }, // media - { "BV", bc_video }, // media - { "WT", web_tv }, // media - { "HM", home }, // home - { "CB", network }, // other - { "SF", store_fe }, // other - { "DG", disc_game }, // disc_game - { "HG", hdd_game }, // hdd_game - { "2P", ps2_game }, // ps2_games - { "2G", ps2_inst }, // ps2_games - { "1P", ps1_game }, // ps1_game - { "PP", psp_game }, // psp_games - { "MN", psp_mini }, // psp_games - { "PE", psp_rema }, // psp_games - }; - const q_from_char cat_data = - { - { "GD", ps3_data }, // data - { "2D", ps2_data }, // data - { "SD", ps3_save }, // data - { "MS", psp_save } // data - }; - - const QStringList ps2_games = { ps2_game, ps2_inst }; - const QStringList psp_games = { psp_game, psp_mini, psp_rema }; - const QStringList media = { app_photo, app_video, bc_video, app_music, app_tv, web_tv }; - const QStringList data = { ps3_data, ps2_data, ps3_save, psp_save }; - const QStringList others = { network, store_fe, trophy, other }; - - inline bool CategoryInMap(const std::string& cat, const q_from_char& map) + inline bool CategoryInMap(const std::string& cat, const localized_cat& map) { auto map_contains_category = [s = qstr(cat)](const auto& p) { @@ -117,57 +32,11 @@ namespace category // (see PARAM.SFO in psdevwiki.com) TODO: Disc Categories } } -namespace parental -{ - // These values are partly generalized. They can vary between country and category - // Normally only values 1,2,3,5,7 and 9 are used - const std::map level - { - { 1, QObject::tr("0+") }, - { 2, QObject::tr("3+") }, - { 3, QObject::tr("7+") }, - { 4, QObject::tr("10+") }, - { 5, QObject::tr("12+") }, - { 6, QObject::tr("15+") }, - { 7, QObject::tr("16+") }, - { 8, QObject::tr("17+") }, - { 9, QObject::tr("18+") }, - { 10, QObject::tr("Level 10") }, - { 11, QObject::tr("Level 11") } - }; -} - -namespace resolution -{ - // there might be different values for other categories - const std::map mode - { - { 1 << 0, QObject::tr("480p") }, - { 1 << 1, QObject::tr("576p") }, - { 1 << 2, QObject::tr("720p") }, - { 1 << 3, QObject::tr("1080p") }, - { 1 << 4, QObject::tr("480p 16:9") }, - { 1 << 5, QObject::tr("576p 16:9") }, - }; -} - -namespace sound -{ - const std::map format - { - { 1 << 0, QObject::tr("LPCM 2.0") }, - //{ 1 << 1, QObject::tr("LPCM ???") }, - { 1 << 2, QObject::tr("LPCM 5.1") }, - { 1 << 4, QObject::tr("LPCM 7.1") }, - { 1 << 8, QObject::tr("Dolby Digital 5.1") }, - { 1 << 9, QObject::tr("DTS 5.1") }, - }; -} - /* Having the icons associated with the game info simplifies logic internally */ struct gui_game_info { GameInfo info; + QString localized_category; compat_status compat; QPixmap icon; QPixmap pxmap; diff --git a/rpcs3/rpcs3qt/gui_application.cpp b/rpcs3/rpcs3qt/gui_application.cpp index 1b1acd5527..aedc399864 100644 --- a/rpcs3/rpcs3qt/gui_application.cpp +++ b/rpcs3/rpcs3qt/gui_application.cpp @@ -35,12 +35,16 @@ void gui_application::Init() { setWindowIcon(QIcon(":/rpcs3.ico")); - LoadLanguage(QLocale(QLocale::English).name()); - m_emu_settings.reset(new emu_settings()); m_gui_settings.reset(new gui_settings()); m_persistent_settings.reset(new persistent_settings()); + const auto locales = GetAvailableLocales(); + const auto language = m_gui_settings->GetValue(gui::loc_language).toString(); + const auto index = locales.indexOf(language); + + LoadLanguage(index < 0 ? QLocale(QLocale::English).bcp47Name() : locales.at(index)); + // Force init the emulator InitializeEmulator(m_gui_settings->GetCurrentUser().toStdString(), true, m_show_gui); @@ -76,15 +80,25 @@ void gui_application::Init() #endif } -void gui_application::SwitchTranslator(QTranslator& translator, const QString& filename) +void gui_application::SwitchTranslator(QTranslator& translator, const QString& filename, const QString& language) { // remove the old translator removeTranslator(&translator); - // load the new translator - if (translator.load(QLocale(QLocale::English), filename)) + const QString lang_path = QLibraryInfo::location(QLibraryInfo::TranslationsPath) + QStringLiteral("/"); + const QString file_path = lang_path + filename; + + if (QFileInfo(file_path).isFile()) { - installTranslator(&translator); + // load the new translator + if (translator.load(file_path)) + { + installTranslator(&translator); + } + } + else if (language != QLocale(QLocale::English).bcp47Name()) // ignore default case "en", since it is handled in source code + { + gui_log.error("No translation file found in: %s", file_path.toStdString()); } } @@ -97,23 +111,47 @@ void gui_application::LoadLanguage(const QString& language) m_language = language; - const QLocale locale = QLocale(language); + const QLocale locale = QLocale(language); + const QString locale_name = QLocale::languageToString(locale.language()); + QLocale::setDefault(locale); // Idk if this is overruled by the QLocale default, so I'll change it here just to be sure. // As per QT recommendations to avoid conflicts for POSIX functions std::setlocale(LC_NUMERIC, "C"); - // TODO: implement once we decided to enable translations - //SwitchTranslator(m_translator, QString("TranslationExample''%1.qm").arg(language)); - //SwitchTranslator(m_translator_qt, QString("qt_%1.qm").arg(language)); + SwitchTranslator(m_translator, QStringLiteral("rpcs3_%1.qm").arg(language), language); if (m_main_window) { - m_main_window->RepaintGui(); + m_main_window->RetranslateUI(); } - gui_log.notice("Current language changed to %s (%s)", QLocale::languageToString(locale.language()).toStdString(), language.toStdString()); + gui_log.notice("Current language changed to %s (%s)", locale_name.toStdString(), language.toStdString()); +} + +QStringList gui_application::GetAvailableLocales() +{ + QStringList locales; + + const QString language_path = QLibraryInfo::location(QLibraryInfo::TranslationsPath); + + if (QFileInfo(language_path).isDir()) + { + const QDir dir(language_path); + const QStringList filenames = dir.entryList(QStringList("*.qm")); + + for (const auto& filename : filenames) + { + QString locale = filename; // "rpcs3_en.qm" + locale.truncate(locale.lastIndexOf('.')); // "rpcs3_en" + locale.remove(0, locale.indexOf('_') + 1); // "en" + + locales << locale; + } + } + + return locales; } void gui_application::InitializeConnects() diff --git a/rpcs3/rpcs3qt/gui_application.h b/rpcs3/rpcs3qt/gui_application.h index 8017d67def..087c3c048a 100644 --- a/rpcs3/rpcs3qt/gui_application.h +++ b/rpcs3/rpcs3qt/gui_application.h @@ -47,8 +47,9 @@ private: return thread(); } - void SwitchTranslator(QTranslator& translator, const QString& filename); + void SwitchTranslator(QTranslator& translator, const QString& filename, const QString& language); void LoadLanguage(const QString& language); + QStringList GetAvailableLocales(); void InitializeCallbacks(); void InitializeConnects(); diff --git a/rpcs3/rpcs3qt/gui_settings.cpp b/rpcs3/rpcs3qt/gui_settings.cpp index 89dc839cd9..10474a5f68 100644 --- a/rpcs3/rpcs3qt/gui_settings.cpp +++ b/rpcs3/rpcs3qt/gui_settings.cpp @@ -11,9 +11,11 @@ LOG_CHANNEL(cfg_log, "CFG"); inline std::string sstr(const QString& _in) { return _in.toStdString(); } gui_settings::gui_settings(QObject* parent) : settings(parent) - , m_current_name(gui::Settings) { - m_settings = new QSettings(ComputeSettingsDir() + gui::Settings + ".ini", QSettings::Format::IniFormat, parent); + const Localized localized; + + m_current_name = localized.constants.Settings; + m_settings = new QSettings(ComputeSettingsDir() + localized.constants.Settings + ".ini", QSettings::Format::IniFormat, parent); const QString settings_name = GetValue(gui::m_currentConfig).toString(); @@ -47,15 +49,17 @@ bool gui_settings::ChangeToConfig(const QString& friendly_name) return false; } - if (friendly_name != gui::Settings) + const Localized localized; + + if (friendly_name != localized.constants.Settings) { - if (m_current_name == gui::Settings) + if (m_current_name == localized.constants.Settings) { SetValue(gui::m_currentConfig, friendly_name); } else { - QSettings tmp(m_settings_dir.absoluteFilePath(gui::Settings + ".ini"), QSettings::Format::IniFormat, parent()); + QSettings tmp(m_settings_dir.absoluteFilePath(localized.constants.Settings + ".ini"), QSettings::Format::IniFormat, parent()); tmp.beginGroup(gui::m_currentConfig.key); tmp.setValue(gui::m_currentConfig.name, friendly_name); tmp.endGroup(); @@ -99,16 +103,18 @@ void gui_settings::Reset(bool removeMeta) QStringList gui_settings::GetGameListCategoryFilters() { QStringList filterList; - if (GetCategoryVisibility(Category::HDD_Game)) filterList.append(category::hdd_game); - if (GetCategoryVisibility(Category::Disc_Game)) filterList.append(category::disc_game); - if (GetCategoryVisibility(Category::PS1_Game)) filterList.append(category::ps1_game); + + if (GetCategoryVisibility(Category::HDD_Game)) filterList.append(category::cat_hdd_game); + if (GetCategoryVisibility(Category::Disc_Game)) filterList.append(category::cat_disc_game); + if (GetCategoryVisibility(Category::PS1_Game)) filterList.append(category::cat_ps1_game); if (GetCategoryVisibility(Category::PS2_Game)) filterList.append(category::ps2_games); if (GetCategoryVisibility(Category::PSP_Game)) filterList.append(category::psp_games); - if (GetCategoryVisibility(Category::Home)) filterList.append(category::home); + if (GetCategoryVisibility(Category::Home)) filterList.append(category::cat_home); if (GetCategoryVisibility(Category::Media)) filterList.append(category::media); if (GetCategoryVisibility(Category::Data)) filterList.append(category::data); - if (GetCategoryVisibility(Category::Unknown_Cat)) filterList.append(category::unknown); + if (GetCategoryVisibility(Category::Unknown_Cat)) filterList.append(category::cat_unknown); if (GetCategoryVisibility(Category::Others)) filterList.append(category::others); + return filterList; } @@ -237,16 +243,18 @@ void gui_settings::SetCustomColor(int col, const QColor& val) void gui_settings::SaveCurrentConfig(const QString& friendly_name) { - if (friendly_name != gui::Settings) + const Localized localized; + + if (friendly_name != localized.constants.Settings) { - if (m_current_name == gui::Settings) + if (m_current_name == localized.constants.Settings) { SetValue(gui::m_currentConfig, friendly_name); m_settings->sync(); } else { - QSettings tmp(m_settings_dir.absoluteFilePath(gui::Settings + ".ini"), QSettings::Format::IniFormat, parent()); + QSettings tmp(m_settings_dir.absoluteFilePath(localized.constants.Settings + ".ini"), QSettings::Format::IniFormat, parent()); tmp.beginGroup(gui::m_currentConfig.key); tmp.setValue(gui::m_currentConfig.name, friendly_name); tmp.endGroup(); @@ -321,13 +329,15 @@ QStringList gui_settings::GetStylesheetEntries() QString gui_settings::GetCurrentStylesheetPath() { + const Localized localized; + QString stylesheet = GetValue(gui::m_currentStylesheet).toString(); - if (stylesheet == gui::Default) + if (stylesheet == localized.constants.Default) { return ""; } - else if (stylesheet == gui::None) + else if (stylesheet == localized.constants.None) { return "-"; } diff --git a/rpcs3/rpcs3qt/gui_settings.h b/rpcs3/rpcs3qt/gui_settings.h index 994c49b536..3a7c89d4c5 100644 --- a/rpcs3/rpcs3qt/gui_settings.h +++ b/rpcs3/rpcs3qt/gui_settings.h @@ -2,6 +2,7 @@ #include "settings.h" #include "Utilities/Log.h" +#include "localized.h" #include #include @@ -94,22 +95,20 @@ namespace gui return q_string_pair(path, title.simplified()); // simplified() forces single line text } - const QString Settings = QObject::tr("CurrentSettings"); - const QString Default = QObject::tr("default"); - const QString None = QObject::tr("none"); - const QString main_window = "main_window"; - const QString game_list = "GameList"; - const QString logger = "Logger"; - const QString debugger = "Debugger"; - const QString rsx = "RSX_Debugger"; - const QString meta = "Meta"; - const QString fs = "FileSystem"; - const QString gs_frame = "GSFrame"; - const QString trophy = "Trophy"; - const QString savedata = "SaveData"; - const QString users = "Users"; - const QString notes = "Notes"; - const QString titles = "Titles"; + const QString main_window = "main_window"; + const QString game_list = "GameList"; + const QString logger = "Logger"; + const QString debugger = "Debugger"; + const QString rsx = "RSX_Debugger"; + const QString meta = "Meta"; + const QString fs = "FileSystem"; + const QString gs_frame = "GSFrame"; + const QString trophy = "Trophy"; + const QString savedata = "SaveData"; + const QString users = "Users"; + const QString notes = "Notes"; + const QString titles = "Titles"; + const QString localization = "Localization"; const QColor gl_icon_color = QColor(240, 240, 240, 255); @@ -181,8 +180,8 @@ namespace gui const gui_save rsx_geometry = gui_save(rsx, "geometry", QByteArray()); const gui_save rsx_states = gui_save(rsx, "states", QVariantMap()); - const gui_save m_currentConfig = gui_save(meta, "currentConfig", Settings); - const gui_save m_currentStylesheet = gui_save(meta, "currentStylesheet", Default); + const gui_save m_currentConfig = gui_save(meta, "currentConfig", Localized().constants.Settings); + const gui_save m_currentStylesheet = gui_save(meta, "currentStylesheet", Localized().constants.Default); const gui_save m_saveNotes = gui_save(meta, "saveNotes", QVariantMap()); const gui_save m_showDebugTab = gui_save(meta, "showDebugTab", false); const gui_save m_enableUIColors = gui_save(meta, "enableUIColors", false); @@ -216,6 +215,8 @@ namespace gui const gui_save um_geometry = gui_save(users, "geometry", QByteArray()); const gui_save um_active_user = gui_save(users, "active_user", "00000001"); + + const gui_save loc_language = gui_save(localization, "language", "en"); } /** Class for GUI settings.. diff --git a/rpcs3/rpcs3qt/localized.h b/rpcs3/rpcs3qt/localized.h new file mode 100644 index 0000000000..da7c9ce41d --- /dev/null +++ b/rpcs3/rpcs3qt/localized.h @@ -0,0 +1,144 @@ +#pragma once + +#include "category.h" + +#include +#include + +typedef std::map localized_cat; + +using namespace category; + +class Localized : public QObject +{ + Q_OBJECT + +public: + + Localized() {}; + ~Localized() {}; + + const struct constants + { + const QString Settings = tr("CurrentSettings"); + const QString Default = tr("default"); + const QString None = tr("none"); + } constants; + + const struct category // (see PARAM.SFO in psdevwiki.com) TODO: Disc Categories + { + // PS3 bootable + const QString app_music = tr("App Music"); + const QString app_photo = tr("App Photo"); + const QString app_tv = tr("App TV"); + const QString app_video = tr("App Video"); + const QString bc_video = tr("Broadcast Video"); + const QString disc_game = tr("Disc Game"); + const QString hdd_game = tr("HDD Game"); + const QString home = tr("Home"); + const QString network = tr("Network"); + const QString store_fe = tr("Store"); + const QString web_tv = tr("Web TV"); + + // PS2 bootable + const QString ps2_game = tr("PS2 Classics"); + const QString ps2_inst = tr("PS2 Game"); + + // PS1 bootable + const QString ps1_game = tr("PS1 Classics"); + + // PSP bootable + const QString psp_game = tr("PSP Game"); + const QString psp_mini = tr("PSP Minis"); + const QString psp_rema = tr("PSP Remasters"); + + // Data + const QString ps3_data = tr("PS3 Game Data"); + const QString ps2_data = tr("PS2 Emulator Data"); + + // Save + const QString ps3_save = tr("PS3 Save Data"); + const QString psp_save = tr("PSP Minis Save Data"); + + // others + const QString trophy = tr("Trophy"); + const QString unknown = tr("Unknown"); + const QString other = tr("Other"); + + const localized_cat cat_boot = + { + { cat_app_music, app_music }, // media + { cat_app_photo, app_photo }, // media + { cat_app_tv , app_tv }, // media + { cat_app_video, app_video }, // media + { cat_bc_video , bc_video }, // media + { cat_web_tv , web_tv }, // media + { cat_home , home }, // home + { cat_network , network }, // other + { cat_store_fe , store_fe }, // other + { cat_disc_game, disc_game }, // disc_game + { cat_hdd_game , hdd_game }, // hdd_game + { cat_ps2_game , ps2_game }, // ps2_games + { cat_ps2_inst , ps2_inst }, // ps2_games + { cat_ps1_game , ps1_game }, // ps1_game + { cat_psp_game , psp_game }, // psp_games + { cat_psp_mini , psp_mini }, // psp_games + { cat_psp_rema , psp_rema }, // psp_games + }; + + const localized_cat cat_data = + { + { cat_ps3_data, ps3_data }, // data + { cat_ps2_data, ps2_data }, // data + { cat_ps3_save, ps3_save }, // data + { cat_psp_save, psp_save } // data + }; + } category; + + const struct parental + { + // These values are partly generalized. They can vary between country and category + // Normally only values 1,2,3,5,7 and 9 are used + const std::map level + { + { 1, tr("0+") }, + { 2, tr("3+") }, + { 3, tr("7+") }, + { 4, tr("10+") }, + { 5, tr("12+") }, + { 6, tr("15+") }, + { 7, tr("16+") }, + { 8, tr("17+") }, + { 9, tr("18+") }, + { 10, tr("Level 10") }, + { 11, tr("Level 11") } + }; + } parental; + + const struct resolution + { + // there might be different values for other categories + const std::map mode + { + { 1 << 0, tr("480p") }, + { 1 << 1, tr("576p") }, + { 1 << 2, tr("720p") }, + { 1 << 3, tr("1080p") }, + { 1 << 4, tr("480p 16:9") }, + { 1 << 5, tr("576p 16:9") }, + }; + } resolution; + + const struct sound + { + const std::map format + { + { 1 << 0, tr("LPCM 2.0") }, + //{ 1 << 1, tr("LPCM ???") }, + { 1 << 2, tr("LPCM 5.1") }, + { 1 << 4, tr("LPCM 7.1") }, + { 1 << 8, tr("Dolby Digital 5.1") }, + { 1 << 9, tr("DTS 5.1") }, + }; + } sound; +}; diff --git a/rpcs3/rpcs3qt/main_window.cpp b/rpcs3/rpcs3qt/main_window.cpp index 64e8d95a3d..e141792a9a 100644 --- a/rpcs3/rpcs3qt/main_window.cpp +++ b/rpcs3/rpcs3qt/main_window.cpp @@ -1168,6 +1168,18 @@ void main_window::RepaintGui() Q_EMIT RequestTrophyManagerRepaint(); } +void main_window::RetranslateUI() +{ + ui->retranslateUi(this); + + RepaintGui(); + + if (m_gameListFrame) + { + m_gameListFrame->Refresh(true); + } +} + void main_window::ShowTitleBars(bool show) { m_gameListFrame->SetTitleBarVisible(show); @@ -1457,15 +1469,15 @@ void main_window::CreateConnects() int id = 0; const bool& checked = act->isChecked(); - if (act == ui->showCatHDDGameAct) categories += category::hdd_game, id = Category::HDD_Game; - else if (act == ui->showCatDiscGameAct) categories += category::disc_game, id = Category::Disc_Game; - else if (act == ui->showCatPS1GamesAct) categories += category::ps1_game, id = Category::PS1_Game; + if (act == ui->showCatHDDGameAct) categories += category::cat_hdd_game, id = Category::HDD_Game; + else if (act == ui->showCatDiscGameAct) categories += category::cat_disc_game, id = Category::Disc_Game; + else if (act == ui->showCatPS1GamesAct) categories += category::cat_ps1_game, id = Category::PS1_Game; else if (act == ui->showCatPS2GamesAct) categories += category::ps2_games, id = Category::PS2_Game; else if (act == ui->showCatPSPGamesAct) categories += category::psp_games, id = Category::PSP_Game; - else if (act == ui->showCatHomeAct) categories += category::home, id = Category::Home; + else if (act == ui->showCatHomeAct) categories += category::cat_home, id = Category::Home; else if (act == ui->showCatAudioVideoAct) categories += category::media, id = Category::Media; else if (act == ui->showCatGameDataAct) categories += category::data, id = Category::Data; - else if (act == ui->showCatUnknownAct) categories += category::unknown, id = Category::Unknown_Cat; + else if (act == ui->showCatUnknownAct) categories += category::cat_unknown, id = Category::Unknown_Cat; else if (act == ui->showCatOtherAct) categories += category::others, id = Category::Others; else gui_log.warning("categoryVisibleActGroup: category action not found"); diff --git a/rpcs3/rpcs3qt/main_window.h b/rpcs3/rpcs3qt/main_window.h index 4267f1ef10..b5123d6c9b 100644 --- a/rpcs3/rpcs3qt/main_window.h +++ b/rpcs3/rpcs3qt/main_window.h @@ -86,6 +86,7 @@ public Q_SLOTS: void OnEmuReady(); void RepaintGui(); + void RetranslateUI(); private Q_SLOTS: void OnPlayOrPause(); diff --git a/rpcs3/rpcs3qt/pad_settings_dialog.cpp b/rpcs3/rpcs3qt/pad_settings_dialog.cpp index c478ec288c..786355430c 100644 --- a/rpcs3/rpcs3qt/pad_settings_dialog.cpp +++ b/rpcs3/rpcs3qt/pad_settings_dialog.cpp @@ -10,6 +10,7 @@ #include "qt_utils.h" #include "pad_settings_dialog.h" #include "ui_pad_settings_dialog.h" +#include "tooltips.h" #include "Emu/Io/Null/NullPadHandler.h" @@ -70,14 +71,6 @@ pad_settings_dialog::pad_settings_dialog(QWidget *parent, const GameInfo *game) setWindowTitle(tr("Gamepad Settings")); } - // Load tooltips - QFile json_file(":/Json/pad_settings.json"); - json_file.open(QIODevice::ReadOnly | QIODevice::Text); - QJsonObject json_obj = QJsonDocument::fromJson(json_file.readAll()).object(); - json_file.close(); - - m_json_handlers = json_obj.value("handlers").toObject(); - // Create tab widget for 7 players m_tabs = new QTabWidget; for (int i = 1; i < 8; i++) @@ -994,37 +987,40 @@ void pad_settings_dialog::ChangeInputType() m_handler = GetHandler(g_cfg_input.player[player]->handler); const auto device_list = m_handler->ListDevices(); + // Tooltips + Tooltips tooltips; + // Change the description QString description; switch (m_handler->m_type) { case pad_handler::null: - description = m_json_handlers["null"].toString(); break; + description = tooltips.gamepad_settings.null; break; case pad_handler::keyboard: - description = m_json_handlers["keyboard"].toString(); break; + description = tooltips.gamepad_settings.keyboard; break; #ifdef _WIN32 case pad_handler::xinput: - description = m_json_handlers["xinput"].toString(); break; + description = tooltips.gamepad_settings.xinput; break; case pad_handler::mm: - description = m_json_handlers["mmjoy"].toString(); break; + description = tooltips.gamepad_settings.mmjoy; break; case pad_handler::ds3: - description = m_json_handlers["ds3_windows"].toString(); break; + description = tooltips.gamepad_settings.ds3_windows; break; case pad_handler::ds4: - description = m_json_handlers["ds4_windows"].toString(); break; + description = tooltips.gamepad_settings.ds4_windows; break; #elif __linux__ case pad_handler::ds3: - description = m_json_handlers["ds3_linux"].toString(); break; + description = tooltips.gamepad_settings.ds3_linux; break; case pad_handler::ds4: - description = m_json_handlers["ds4_linux"].toString(); break; + description = tooltips.gamepad_settings.ds4_linux; break; #else case pad_handler::ds3: - description = m_json_handlers["ds3_other"].toString(); break; + description = tooltips.gamepad_settings.ds3_other; break; case pad_handler::ds4: - description = m_json_handlers["ds4_other"].toString(); break; + description = tooltips.gamepad_settings.ds4_other; break; #endif #ifdef HAVE_LIBEVDEV case pad_handler::evdev: - description = (m_json_handlers["evdev"].toString()); break; + description = tooltips.gamepad_settings.evdev; break; #endif default: description = ""; diff --git a/rpcs3/rpcs3qt/pad_settings_dialog.h b/rpcs3/rpcs3qt/pad_settings_dialog.h index 18e62e33a3..5880b0e2b1 100644 --- a/rpcs3/rpcs3qt/pad_settings_dialog.h +++ b/rpcs3/rpcs3qt/pad_settings_dialog.h @@ -3,7 +3,6 @@ #include #include #include -#include #include #include #include @@ -104,9 +103,6 @@ private: Ui::pad_settings_dialog *ui; std::string m_title_id; - // Tooltip things - QJsonObject m_json_handlers; - // TabWidget QTabWidget* m_tabs = nullptr; diff --git a/rpcs3/rpcs3qt/settings.h b/rpcs3/rpcs3qt/settings.h index 7a28fb4b63..8d5e27f870 100644 --- a/rpcs3/rpcs3qt/settings.h +++ b/rpcs3/rpcs3qt/settings.h @@ -26,7 +26,6 @@ struct gui_save } }; -typedef std::map q_from_char; typedef QPair q_string_pair; typedef QPair q_size_pair; typedef QList q_pair_list; diff --git a/rpcs3/rpcs3qt/settings_dialog.cpp b/rpcs3/rpcs3qt/settings_dialog.cpp index 65253ba6f2..a1de0b43bc 100644 --- a/rpcs3/rpcs3qt/settings_dialog.cpp +++ b/rpcs3/rpcs3qt/settings_dialog.cpp @@ -5,9 +5,6 @@ #include #include #include -#include -#include -#include #include #include #include @@ -19,6 +16,7 @@ #include "qt_utils.h" #include "settings_dialog.h" #include "ui_settings_dialog.h" +#include "tooltips.h" #include "stdafx.h" #include "Emu/System.h" @@ -57,6 +55,9 @@ settings_dialog::settings_dialog(std::shared_ptr guiSettings, std: ui->buttonBox->button(QDialogButtonBox::StandardButton::Save)->setText(tr("Save custom configuration")); } + // Localized strings + Tooltips tooltips; + // Add description labels SubscribeDescription(ui->description_cpu); SubscribeDescription(ui->description_gpu); @@ -72,40 +73,6 @@ settings_dialog::settings_dialog(std::shared_ptr guiSettings, std: } SubscribeDescription(ui->description_debug); - // read tooltips from json - QFile json_file(":/Json/tooltips.json"); - json_file.open(QIODevice::ReadOnly | QIODevice::Text); - QJsonObject json_obj = QJsonDocument::fromJson(json_file.readAll()).object(); - json_file.close(); - - QJsonObject json_cpu = json_obj.value("cpu").toObject(); - QJsonObject json_cpu_ppu = json_cpu.value("PPU").toObject(); - QJsonObject json_cpu_spu = json_cpu.value("SPU").toObject(); - QJsonObject json_cpu_cbs = json_cpu.value("checkboxes").toObject(); - QJsonObject json_cpu_cbo = json_cpu.value("comboboxes").toObject(); - - QJsonObject json_gpu = json_obj.value("gpu").toObject(); - QJsonObject json_gpu_cbo = json_gpu.value("comboboxes").toObject(); - QJsonObject json_gpu_main = json_gpu.value("main").toObject(); - QJsonObject json_gpu_slid = json_gpu.value("sliders").toObject(); - - QJsonObject json_audio = json_obj.value("audio").toObject(); - QJsonObject json_input = json_obj.value("input").toObject(); - QJsonObject json_sys = json_obj.value("system").toObject(); - QJsonObject json_net = json_obj.value("network").toObject(); - - QJsonObject json_advanced = json_obj.value("advanced").toObject(); - QJsonObject json_advanced_libs = json_advanced.value("libraries").toObject(); - - QJsonObject json_emu = json_obj.value("emulator").toObject(); - QJsonObject json_emu_misc = json_emu.value("misc").toObject(); - QJsonObject json_emu_overlay = json_emu.value("overlay").toObject(); - QJsonObject json_emu_shaders = json_emu.value("shaderLoadingScreen").toObject(); - - QJsonObject json_gui = json_obj.value("gui").toObject(); - - QJsonObject json_debug = json_obj.value("debug").toObject(); - if (game) { xemu_settings->LoadSettings(game->serial); @@ -179,33 +146,33 @@ settings_dialog::settings_dialog(std::shared_ptr guiSettings, std: // Checkboxes xemu_settings->EnhanceCheckBox(ui->spuCache, emu_settings::SPUCache); - SubscribeTooltip(ui->spuCache, json_cpu_cbs["spuCache"].toString()); + SubscribeTooltip(ui->spuCache, tooltips.settings.spu_cache); xemu_settings->EnhanceCheckBox(ui->enableScheduler, emu_settings::EnableThreadScheduler); - SubscribeTooltip(ui->enableScheduler, json_cpu_cbs["enableThreadScheduler"].toString()); + SubscribeTooltip(ui->enableScheduler, tooltips.settings.enable_thread_scheduler); xemu_settings->EnhanceCheckBox(ui->lowerSPUThrPrio, emu_settings::LowerSPUThreadPrio); - SubscribeTooltip(ui->lowerSPUThrPrio, json_cpu_cbs["lowerSPUThrPrio"].toString()); + SubscribeTooltip(ui->lowerSPUThrPrio, tooltips.settings.lower_spu_thread_priority); xemu_settings->EnhanceCheckBox(ui->spuLoopDetection, emu_settings::SPULoopDetection); - SubscribeTooltip(ui->spuLoopDetection, json_cpu_cbs["spuLoopDetection"].toString()); + SubscribeTooltip(ui->spuLoopDetection, tooltips.settings.spu_loop_detection); xemu_settings->EnhanceCheckBox(ui->accurateXFloat, emu_settings::AccurateXFloat); - SubscribeTooltip(ui->accurateXFloat, json_cpu_cbs["accurateXFloat"].toString()); + SubscribeTooltip(ui->accurateXFloat, tooltips.settings.accurate_xfloat); // Comboboxes xemu_settings->EnhanceComboBox(ui->spuBlockSize, emu_settings::SPUBlockSize); - SubscribeTooltip(ui->gb_spuBlockSize, json_cpu_cbo["spuBlockSize"].toString()); + SubscribeTooltip(ui->gb_spuBlockSize, tooltips.settings.spu_block_size); xemu_settings->EnhanceComboBox(ui->preferredSPUThreads, emu_settings::PreferredSPUThreads, true); - SubscribeTooltip(ui->gb_spu_threads, json_cpu_cbo["preferredSPUThreads"].toString()); + SubscribeTooltip(ui->gb_spu_threads, tooltips.settings.preferred_spu_threads); ui->preferredSPUThreads->setItemText(ui->preferredSPUThreads->findData("0"), tr("Auto")); if (utils::has_rtm()) { xemu_settings->EnhanceComboBox(ui->enableTSX, emu_settings::EnableTSX); - SubscribeTooltip(ui->gb_tsx, json_cpu_cbo["enableTSX"].toString()); + SubscribeTooltip(ui->gb_tsx, tooltips.settings.enable_tsx); static const QString tsx_forced = qstr(fmt::format("%s", tsx_usage::forced)); static const QString tsx_default = qstr(xemu_settings->GetSettingDefault(emu_settings::EnableTSX)); @@ -238,9 +205,9 @@ settings_dialog::settings_dialog(std::shared_ptr guiSettings, std: } // PPU tool tips - SubscribeTooltip(ui->ppu_precise, json_cpu_ppu["precise"].toString()); - SubscribeTooltip(ui->ppu_fast, json_cpu_ppu["fast"].toString()); - SubscribeTooltip(ui->ppu_llvm, json_cpu_ppu["LLVM"].toString()); + SubscribeTooltip(ui->ppu_precise, tooltips.settings.ppu_precise); + SubscribeTooltip(ui->ppu_fast, tooltips.settings.ppu_fast); + SubscribeTooltip(ui->ppu_llvm, tooltips.settings.ppu_llvm); QButtonGroup *ppuBG = new QButtonGroup(this); ppuBG->addButton(ui->ppu_precise, static_cast(ppu_decoder_type::precise)); @@ -266,10 +233,10 @@ settings_dialog::settings_dialog(std::shared_ptr guiSettings, std: } // SPU tool tips - SubscribeTooltip(ui->spu_precise, json_cpu_spu["precise"].toString()); - SubscribeTooltip(ui->spu_fast, json_cpu_spu["fast"].toString()); - SubscribeTooltip(ui->spu_asmjit, json_cpu_spu["ASMJIT"].toString()); - SubscribeTooltip(ui->spu_llvm, json_cpu_spu["LLVM"].toString()); + SubscribeTooltip(ui->spu_precise, tooltips.settings.spu_precise); + SubscribeTooltip(ui->spu_fast, tooltips.settings.spu_fast); + SubscribeTooltip(ui->spu_asmjit, tooltips.settings.spu_asmjit); + SubscribeTooltip(ui->spu_llvm, tooltips.settings.spu_llvm); QButtonGroup *spuBG = new QButtonGroup(this); spuBG->addButton(ui->spu_precise, static_cast(spu_decoder_type::precise)); @@ -323,14 +290,14 @@ settings_dialog::settings_dialog(std::shared_ptr guiSettings, std: // Comboboxes xemu_settings->EnhanceComboBox(ui->renderBox, emu_settings::Renderer); - SubscribeTooltip(ui->gb_renderer, json_gpu_cbo["renderBox"].toString()); - SubscribeTooltip(ui->gb_graphicsAdapter, json_gpu_cbo["graphicsAdapterBox"].toString()); + SubscribeTooltip(ui->gb_renderer, tooltips.settings.renderer); + SubscribeTooltip(ui->gb_graphicsAdapter, tooltips.settings.graphics_adapter); // Change displayed renderer names ui->renderBox->setItemText(ui->renderBox->findData("Null"), render_creator.name_Null); xemu_settings->EnhanceComboBox(ui->resBox, emu_settings::Resolution); - SubscribeTooltip(ui->gb_default_resolution, json_gpu_cbo["resBox"].toString()); + SubscribeTooltip(ui->gb_default_resolution, tooltips.settings.resolution); // remove unsupported resolutions from the dropdown const int saved_index = ui->resBox->currentIndex(); bool saved_index_removed = false; @@ -381,16 +348,16 @@ settings_dialog::settings_dialog(std::shared_ptr guiSettings, std: } xemu_settings->EnhanceComboBox(ui->aspectBox, emu_settings::AspectRatio); - SubscribeTooltip(ui->gb_aspectRatio, json_gpu_cbo["aspectBox"].toString()); + SubscribeTooltip(ui->gb_aspectRatio, tooltips.settings.aspect_ratio); xemu_settings->EnhanceComboBox(ui->frameLimitBox, emu_settings::FrameLimit); - SubscribeTooltip(ui->gb_frameLimit, json_gpu_cbo["frameLimitBox"].toString()); + SubscribeTooltip(ui->gb_frameLimit, tooltips.settings.frame_limit); xemu_settings->EnhanceComboBox(ui->antiAliasing, emu_settings::MSAA); - SubscribeTooltip(ui->gb_antiAliasing, json_gpu_cbo["antiAliasing"].toString()); + SubscribeTooltip(ui->gb_antiAliasing, tooltips.settings.anti_aliasing); xemu_settings->EnhanceComboBox(ui->anisotropicFilterOverride, emu_settings::AnisotropicFilterOverride, true); - SubscribeTooltip(ui->gb_anisotropicFilter, json_gpu_cbo["anisotropicFilterOverride"].toString()); + SubscribeTooltip(ui->gb_anisotropicFilter, tooltips.settings.anisotropic_filter); // only allow values 0,2,4,8,16 for (int i = ui->anisotropicFilterOverride->count() - 1; i >= 0; i--) { @@ -413,25 +380,25 @@ settings_dialog::settings_dialog(std::shared_ptr guiSettings, std: // Checkboxes: main options xemu_settings->EnhanceCheckBox(ui->dumpColor, emu_settings::WriteColorBuffers); - SubscribeTooltip(ui->dumpColor, json_gpu_main["dumpColor"].toString()); + SubscribeTooltip(ui->dumpColor, tooltips.settings.dump_color); xemu_settings->EnhanceCheckBox(ui->vsync, emu_settings::VSync); - SubscribeTooltip(ui->vsync, json_gpu_main["vsync"].toString()); + SubscribeTooltip(ui->vsync, tooltips.settings.vsync); xemu_settings->EnhanceCheckBox(ui->stretchToDisplayArea, emu_settings::StretchToDisplayArea); - SubscribeTooltip(ui->stretchToDisplayArea, json_gpu_main["stretchToDisplayArea"].toString()); + SubscribeTooltip(ui->stretchToDisplayArea, tooltips.settings.stretch_to_display_area); xemu_settings->EnhanceCheckBox(ui->disableVertexCache, emu_settings::DisableVertexCache); - SubscribeTooltip(ui->disableVertexCache, json_gpu_main["disableVertexCache"].toString()); + SubscribeTooltip(ui->disableVertexCache, tooltips.settings.disable_vertex_cache); xemu_settings->EnhanceCheckBox(ui->multithreadedRSX, emu_settings::MultithreadedRSX); - SubscribeTooltip(ui->multithreadedRSX, json_gpu_main["multithreadedRSX"].toString()); + SubscribeTooltip(ui->multithreadedRSX, tooltips.settings.multithreaded_rsx); xemu_settings->EnhanceCheckBox(ui->disableAsyncShaders, emu_settings::DisableAsyncShaderCompiler); - SubscribeTooltip(ui->disableAsyncShaders, json_gpu_main["disableAsyncShaders"].toString()); + SubscribeTooltip(ui->disableAsyncShaders, tooltips.settings.disable_async_shaders); xemu_settings->EnhanceCheckBox(ui->scrictModeRendering, emu_settings::StrictRenderingMode); - SubscribeTooltip(ui->scrictModeRendering, json_gpu_main["scrictModeRendering"].toString()); + SubscribeTooltip(ui->scrictModeRendering, tooltips.settings.strict_rendering_mode); connect(ui->scrictModeRendering, &QCheckBox::clicked, [=](bool checked) { ui->gb_resolutionScale->setEnabled(!checked); @@ -445,7 +412,7 @@ settings_dialog::settings_dialog(std::shared_ptr guiSettings, std: }; xemu_settings->EnhanceSlider(ui->resolutionScale, emu_settings::ResolutionScale); - SubscribeTooltip(ui->gb_resolutionScale, json_gpu_slid["resolutionScale"].toString()); + SubscribeTooltip(ui->gb_resolutionScale, tooltips.settings.resolution_scale); ui->gb_resolutionScale->setEnabled(!ui->scrictModeRendering->isChecked()); // rename label texts to fit current state of Resolution Scale int resolutionScaleDef = stoi(xemu_settings->GetSettingDefault(emu_settings::ResolutionScale)); @@ -474,7 +441,7 @@ settings_dialog::settings_dialog(std::shared_ptr guiSettings, std: SnapSlider(ui->resolutionScale, 25); xemu_settings->EnhanceSlider(ui->minimumScalableDimension, emu_settings::MinimumScalableDimension); - SubscribeTooltip(ui->gb_minimumScalableDimension, json_gpu_slid["minimumScalableDimension"].toString()); + SubscribeTooltip(ui->gb_minimumScalableDimension, tooltips.settings.minimum_scalable_dimension); ui->gb_minimumScalableDimension->setEnabled(!ui->scrictModeRendering->isChecked()); // rename label texts to fit current state of Minimum Scalable Dimension int minimumScalableDimensionDef = stoi(xemu_settings->GetSettingDefault(emu_settings::MinimumScalableDimension)); @@ -741,9 +708,9 @@ settings_dialog::settings_dialog(std::shared_ptr guiSettings, std: xemu_settings->EnhanceComboBox(ui->audioOutBox, emu_settings::AudioRenderer); #ifdef WIN32 - SubscribeTooltip(ui->gb_audio_out, json_audio["audioOutBox"].toString()); + SubscribeTooltip(ui->gb_audio_out, tooltips.settings.audio_out); #else - SubscribeTooltip(ui->gb_audio_out, json_audio["audioOutBox_Linux"].toString()); + SubscribeTooltip(ui->gb_audio_out, tooltips.settings.audio_out_linux); #endif // Change displayed backend names ui->audioOutBox->setItemText(ui->renderBox->findData("Null"), tr("Disable Audio Output")); @@ -776,27 +743,27 @@ settings_dialog::settings_dialog(std::shared_ptr guiSettings, std: xemu_settings->EnhanceComboBox(ui->microphoneBox, emu_settings::MicrophoneType); ui->microphoneBox->setItemText(ui->microphoneBox->findData("Null"), tr("Disabled")); - SubscribeTooltip(ui->microphoneBox, json_audio["microphoneBox"].toString()); + SubscribeTooltip(ui->microphoneBox, tooltips.settings.microphone); connect(ui->microphoneBox, &QComboBox::currentTextChanged, ChangeMicrophoneType); PropagateUsedDevices(); // Enables/Disables comboboxes and checks values from config for sanity // Checkboxes xemu_settings->EnhanceCheckBox(ui->audioDump, emu_settings::DumpToFile); - SubscribeTooltip(ui->audioDump, json_audio["audioDump"].toString()); + SubscribeTooltip(ui->audioDump, tooltips.settings.audio_dump); xemu_settings->EnhanceCheckBox(ui->convert, emu_settings::ConvertTo16Bit); - SubscribeTooltip(ui->convert, json_audio["convert"].toString()); + SubscribeTooltip(ui->convert, tooltips.settings.convert); xemu_settings->EnhanceCheckBox(ui->downmix, emu_settings::DownmixStereo); - SubscribeTooltip(ui->downmix, json_audio["downmix"].toString()); + SubscribeTooltip(ui->downmix, tooltips.settings.downmix); xemu_settings->EnhanceCheckBox(ui->enableBuffering, emu_settings::EnableBuffering); - SubscribeTooltip(ui->enableBuffering, json_audio["enableBuffering"].toString()); + SubscribeTooltip(ui->enableBuffering, tooltips.settings.enable_buffering); connect(ui->enableBuffering, &QCheckBox::clicked, EnableBufferingOptions); xemu_settings->EnhanceCheckBox(ui->enableTimeStretching, emu_settings::EnableTimeStretching); - SubscribeTooltip(ui->enableTimeStretching, json_audio["enableTimeStretching"].toString()); + SubscribeTooltip(ui->enableTimeStretching, tooltips.settings.enable_time_stretching); connect(ui->enableTimeStretching, &QCheckBox::clicked, EnableTimeStretchingOptions); EnableBuffering(ui->audioOutBox->currentText()); @@ -804,13 +771,13 @@ settings_dialog::settings_dialog(std::shared_ptr guiSettings, std: // Sliders EnhanceSlider(emu_settings::MasterVolume, ui->masterVolume, ui->masterVolumeLabel, tr("Master: %0 %")); - SubscribeTooltip(ui->master_volume, json_audio["masterVolume"].toString()); + SubscribeTooltip(ui->master_volume, tooltips.settings.master_volume); EnhanceSlider(emu_settings::AudioBufferDuration, ui->audioBufferDuration, ui->audioBufferDurationLabel, tr("Audio Buffer Duration: %0 ms")); - SubscribeTooltip(ui->audio_buffer_duration, json_audio["audioBufferDuration"].toString()); + SubscribeTooltip(ui->audio_buffer_duration, tooltips.settings.audio_buffer_duration); EnhanceSlider(emu_settings::TimeStretchingThreshold, ui->timeStretchingThreshold, ui->timeStretchingThresholdLabel, tr("Time Stretching Threshold: %0 %")); - SubscribeTooltip(ui->time_stretching_threshold, json_audio["timeStretchingThreshold"].toString()); + SubscribeTooltip(ui->time_stretching_threshold, tooltips.settings.time_stretching_threshold); // _____ __ ____ _______ _ // |_ _| / / / __ \ |__ __| | | @@ -822,19 +789,19 @@ settings_dialog::settings_dialog(std::shared_ptr guiSettings, std: // Comboboxes xemu_settings->EnhanceComboBox(ui->keyboardHandlerBox, emu_settings::KeyboardHandler); - SubscribeTooltip(ui->gb_keyboard_handler, json_input["keyboardHandlerBox"].toString()); + SubscribeTooltip(ui->gb_keyboard_handler, tooltips.settings.keyboard_handler); xemu_settings->EnhanceComboBox(ui->mouseHandlerBox, emu_settings::MouseHandler); - SubscribeTooltip(ui->gb_mouse_handler, json_input["mouseHandlerBox"].toString()); + SubscribeTooltip(ui->gb_mouse_handler, tooltips.settings.mouse_handler); xemu_settings->EnhanceComboBox(ui->cameraTypeBox, emu_settings::CameraType); - SubscribeTooltip(ui->gb_camera_type, json_input["cameraTypeBox"].toString()); + SubscribeTooltip(ui->gb_camera_type, tooltips.settings.camera_type); xemu_settings->EnhanceComboBox(ui->cameraBox, emu_settings::Camera); - SubscribeTooltip(ui->gb_camera_setting, json_input["cameraBox"].toString()); + SubscribeTooltip(ui->gb_camera_setting, tooltips.settings.camera); xemu_settings->EnhanceComboBox(ui->moveBox, emu_settings::Move); - SubscribeTooltip(ui->gb_move_handler, json_input["moveBox"].toString()); + SubscribeTooltip(ui->gb_move_handler, tooltips.settings.move); // _____ _ _______ _ // / ____| | | |__ __| | | @@ -848,18 +815,18 @@ settings_dialog::settings_dialog(std::shared_ptr guiSettings, std: // Comboboxes xemu_settings->EnhanceComboBox(ui->sysLangBox, emu_settings::Language, false, false, 0, true); - SubscribeTooltip(ui->gb_sysLang, json_sys["sysLangBox"].toString()); + SubscribeTooltip(ui->gb_sysLang, tooltips.settings.system_language); xemu_settings->EnhanceComboBox(ui->keyboardType, emu_settings::KeyboardType, false, false, 0, true); - SubscribeTooltip(ui->gb_keyboardType, json_sys["keyboardType"].toString()); + SubscribeTooltip(ui->gb_keyboardType, tooltips.settings.keyboard_type); // Checkboxes xemu_settings->EnhanceCheckBox(ui->enableHostRoot, emu_settings::EnableHostRoot); - SubscribeTooltip(ui->enableHostRoot, json_sys["enableHostRoot"].toString()); + SubscribeTooltip(ui->enableHostRoot, tooltips.settings.enable_host_root); xemu_settings->EnhanceCheckBox(ui->enableCacheClearing, emu_settings::LimitCacheSize); - SubscribeTooltip(ui->gb_DiskCacheClearing, json_sys["limitCacheSize"].toString()); + SubscribeTooltip(ui->gb_DiskCacheClearing, tooltips.settings.limit_cache_size); connect(ui->enableCacheClearing, &QCheckBox::stateChanged, ui->maximumCacheSize, &QSlider::setEnabled); // Sliders @@ -869,7 +836,7 @@ settings_dialog::settings_dialog(std::shared_ptr guiSettings, std: // Radio Buttons - SubscribeTooltip(ui->gb_enterButtonAssignment, json_sys["enterButtonAssignment"].toString()); + SubscribeTooltip(ui->gb_enterButtonAssignment, tooltips.settings.enter_button_assignment); // creating this in ui file keeps scrambling the order... QButtonGroup *enterButtonAssignmentBG = new QButtonGroup(this); @@ -906,7 +873,7 @@ settings_dialog::settings_dialog(std::shared_ptr guiSettings, std: // Comboboxes xemu_settings->EnhanceComboBox(ui->netStatusBox, emu_settings::ConnectionStatus); - SubscribeTooltip(ui->gb_network_status, json_net["netStatusBox"].toString()); + SubscribeTooltip(ui->gb_network_status, tooltips.settings.net_status); // _ _ _______ _ @@ -920,34 +887,34 @@ settings_dialog::settings_dialog(std::shared_ptr guiSettings, std: // Checkboxes xemu_settings->EnhanceCheckBox(ui->debugConsoleMode, emu_settings::DebugConsoleMode); - SubscribeTooltip(ui->debugConsoleMode, json_advanced["debugConsoleMode"].toString()); + SubscribeTooltip(ui->debugConsoleMode, tooltips.settings.debug_console_mode); xemu_settings->EnhanceCheckBox(ui->silenceAllLogs, emu_settings::SilenceAllLogs); - SubscribeTooltip(ui->silenceAllLogs, json_advanced["silenceAllLogs"].toString()); + SubscribeTooltip(ui->silenceAllLogs, tooltips.settings.silence_all_logs); xemu_settings->EnhanceCheckBox(ui->readColor, emu_settings::ReadColorBuffers); - SubscribeTooltip(ui->readColor, json_advanced["readColor"].toString()); + SubscribeTooltip(ui->readColor, tooltips.settings.read_color); xemu_settings->EnhanceCheckBox(ui->readDepth, emu_settings::ReadDepthBuffer); - SubscribeTooltip(ui->readDepth, json_advanced["readDepth"].toString()); + SubscribeTooltip(ui->readDepth, tooltips.settings.read_depth); xemu_settings->EnhanceCheckBox(ui->dumpDepth, emu_settings::WriteDepthBuffer); - SubscribeTooltip(ui->dumpDepth, json_advanced["dumpDepth"].toString()); + SubscribeTooltip(ui->dumpDepth, tooltips.settings.dump_depth); xemu_settings->EnhanceCheckBox(ui->disableOnDiskShaderCache, emu_settings::DisableOnDiskShaderCache); - SubscribeTooltip(ui->disableOnDiskShaderCache, json_advanced["disableOnDiskShaderCache"].toString()); + SubscribeTooltip(ui->disableOnDiskShaderCache, tooltips.settings.disable_on_disk_shader_cache); xemu_settings->EnhanceCheckBox(ui->relaxedZCULL, emu_settings::RelaxedZCULL); - SubscribeTooltip(ui->relaxedZCULL, json_advanced["relaxedZCULL"].toString()); + SubscribeTooltip(ui->relaxedZCULL, tooltips.settings.relaxed_zcull); // Comboboxes xemu_settings->EnhanceComboBox(ui->maxSPURSThreads, emu_settings::MaxSPURSThreads, true); ui->maxSPURSThreads->setItemText(ui->maxSPURSThreads->findData("6"), tr("Unlimited (Default)")); - SubscribeTooltip(ui->gb_max_spurs_threads, json_advanced["maxSPURSThreads"].toString()); + SubscribeTooltip(ui->gb_max_spurs_threads, tooltips.settings.max_spurs_threads); xemu_settings->EnhanceComboBox(ui->sleepTimersAccuracy, emu_settings::SleepTimersAccuracy); - SubscribeTooltip(ui->gb_sleep_timers_accuracy, json_advanced["sleepTimersAccuracy"].toString()); + SubscribeTooltip(ui->gb_sleep_timers_accuracy, tooltips.settings.sleep_timers_accuracy); // Sliders @@ -983,27 +950,27 @@ settings_dialog::settings_dialog(std::shared_ptr guiSettings, std: { ui->vblank->setDisabled(true); ui->vblankReset->setDisabled(true); - SubscribeTooltip(ui->gb_vblank, json_advanced["disabledFromGlobal"].toString()); + SubscribeTooltip(ui->gb_vblank, tooltips.settings.disabled_from_global); ui->clockScale->setDisabled(true); ui->clockScaleReset->setDisabled(true); - SubscribeTooltip(ui->gb_clockScale, json_advanced["disabledFromGlobal"].toString()); + SubscribeTooltip(ui->gb_clockScale, tooltips.settings.disabled_from_global); ui->wakeupDelay->setDisabled(true); ui->wakeupReset->setDisabled(true); - SubscribeTooltip(ui->gb_wakeupDelay, json_advanced["disabledFromGlobal"].toString()); + SubscribeTooltip(ui->gb_wakeupDelay, tooltips.settings.disabled_from_global); } else { - SubscribeTooltip(ui->gb_vblank, json_advanced["vblankRate"].toString()); - SubscribeTooltip(ui->gb_clockScale, json_advanced["clocksScale"].toString()); - SubscribeTooltip(ui->gb_wakeupDelay, json_advanced["wakeupDelay"].toString()); + SubscribeTooltip(ui->gb_vblank, tooltips.settings.vblank_rate); + SubscribeTooltip(ui->gb_clockScale, tooltips.settings.clocks_scale); + SubscribeTooltip(ui->gb_wakeupDelay, tooltips.settings.wake_up_delay); } // lib options tool tips - SubscribeTooltip(ui->lib_manu, json_advanced_libs["manual"].toString()); - SubscribeTooltip(ui->lib_both, json_advanced_libs["both"].toString()); - SubscribeTooltip(ui->lib_lv2, json_advanced_libs["liblv2"].toString()); - SubscribeTooltip(ui->lib_lv2b, json_advanced_libs["liblv2both"].toString()); - SubscribeTooltip(ui->lib_lv2l, json_advanced_libs["liblv2list"].toString()); + SubscribeTooltip(ui->lib_manu, tooltips.settings.libraries_manual); + SubscribeTooltip(ui->lib_both, tooltips.settings.libraries_both); + SubscribeTooltip(ui->lib_lv2, tooltips.settings.libraries_liblv2); + SubscribeTooltip(ui->lib_lv2b, tooltips.settings.libraries_liblv2both); + SubscribeTooltip(ui->lib_lv2l, tooltips.settings.libraries_liblv2list); // creating this in ui file keeps scrambling the order... QButtonGroup *libModeBG = new QButtonGroup(this); @@ -1153,44 +1120,44 @@ settings_dialog::settings_dialog(std::shared_ptr guiSettings, std: // Comboboxes xemu_settings->EnhanceComboBox(ui->maxLLVMThreads, emu_settings::MaxLLVMThreads, true, true, std::thread::hardware_concurrency()); - SubscribeTooltip(ui->gb_max_llvm, json_emu_misc["maxLLVMThreads"].toString()); + SubscribeTooltip(ui->gb_max_llvm, tooltips.settings.max_llvm_threads); ui->maxLLVMThreads->setItemText(ui->maxLLVMThreads->findData("0"), tr("All (%1)").arg(std::thread::hardware_concurrency())); xemu_settings->EnhanceComboBox(ui->perfOverlayDetailLevel, emu_settings::PerfOverlayDetailLevel); - SubscribeTooltip(ui->perf_overlay_detail_level, json_emu_overlay["perfOverlayDetailLevel"].toString()); + SubscribeTooltip(ui->perf_overlay_detail_level, tooltips.settings.perf_overlay_detail_level); xemu_settings->EnhanceComboBox(ui->perfOverlayPosition, emu_settings::PerfOverlayPosition); - SubscribeTooltip(ui->perf_overlay_position, json_emu_overlay["perfOverlayPosition"].toString()); + SubscribeTooltip(ui->perf_overlay_position, tooltips.settings.perf_overlay_position); // Checkboxes xemu_settings->EnhanceCheckBox(ui->exitOnStop, emu_settings::ExitRPCS3OnFinish); - SubscribeTooltip(ui->exitOnStop, json_emu_misc["exitOnStop"].toString()); + SubscribeTooltip(ui->exitOnStop, tooltips.settings.exit_on_stop); xemu_settings->EnhanceCheckBox(ui->alwaysStart, emu_settings::StartOnBoot); - SubscribeTooltip(ui->alwaysStart, json_emu_misc["alwaysStart"].toString()); + SubscribeTooltip(ui->alwaysStart, tooltips.settings.start_on_boot); xemu_settings->EnhanceCheckBox(ui->startGameFullscreen, emu_settings::StartGameFullscreen); - SubscribeTooltip(ui->startGameFullscreen, json_emu_misc["startGameFullscreen"].toString()); + SubscribeTooltip(ui->startGameFullscreen, tooltips.settings.start_game_fullscreen); xemu_settings->EnhanceCheckBox(ui->preventDisplaySleep, emu_settings::PreventDisplaySleep); - SubscribeTooltip(ui->preventDisplaySleep, json_emu_misc["preventDisplaySleep"].toString()); + SubscribeTooltip(ui->preventDisplaySleep, tooltips.settings.prevent_display_sleep); ui->preventDisplaySleep->setEnabled(display_sleep_control_supported()); xemu_settings->EnhanceCheckBox(ui->showFPSInTitle, emu_settings::ShowFPSInTitle); - SubscribeTooltip(ui->showFPSInTitle, json_emu_misc["showFPSInTitle"].toString()); + SubscribeTooltip(ui->showFPSInTitle, tooltips.settings.show_fps_in_title); xemu_settings->EnhanceCheckBox(ui->showTrophyPopups, emu_settings::ShowTrophyPopups); - SubscribeTooltip(ui->showTrophyPopups, json_emu_misc["showTrophyPopups"].toString()); + SubscribeTooltip(ui->showTrophyPopups, tooltips.settings.show_trophy_popups); xemu_settings->EnhanceCheckBox(ui->useNativeInterface, emu_settings::UseNativeInterface); - SubscribeTooltip(ui->useNativeInterface, json_emu_misc["useNativeInterface"].toString()); + SubscribeTooltip(ui->useNativeInterface, tooltips.settings.use_native_interface); xemu_settings->EnhanceCheckBox(ui->showShaderCompilationHint, emu_settings::ShowShaderCompilationHint); - SubscribeTooltip(ui->showShaderCompilationHint, json_emu_misc["showShaderCompilationHint"].toString()); + SubscribeTooltip(ui->showShaderCompilationHint, tooltips.settings.show_shader_compilation_hint); xemu_settings->EnhanceCheckBox(ui->perfOverlayCenterX, emu_settings::PerfOverlayCenterX); - SubscribeTooltip(ui->perfOverlayCenterX, json_emu_overlay["perfOverlayCenterX"].toString()); + SubscribeTooltip(ui->perfOverlayCenterX, tooltips.settings.perf_overlay_center_x); connect(ui->perfOverlayCenterX, &QCheckBox::clicked, [this](bool checked) { ui->perfOverlayMarginX->setEnabled(!checked); @@ -1198,7 +1165,7 @@ settings_dialog::settings_dialog(std::shared_ptr guiSettings, std: ui->perfOverlayMarginX->setEnabled(!ui->perfOverlayCenterX->isChecked()); xemu_settings->EnhanceCheckBox(ui->perfOverlayCenterY, emu_settings::PerfOverlayCenterY); - SubscribeTooltip(ui->perfOverlayCenterY, json_emu_overlay["perfOverlayCenterY"].toString()); + SubscribeTooltip(ui->perfOverlayCenterY, tooltips.settings.perf_overlay_center_y); connect(ui->perfOverlayCenterY, &QCheckBox::clicked, [this](bool checked) { ui->perfOverlayMarginY->setEnabled(!checked); @@ -1206,13 +1173,13 @@ settings_dialog::settings_dialog(std::shared_ptr guiSettings, std: ui->perfOverlayMarginY->setEnabled(!ui->perfOverlayCenterY->isChecked()); xemu_settings->EnhanceCheckBox(ui->perfOverlayFramerateGraphEnabled, emu_settings::PerfOverlayFramerateGraphEnabled); - SubscribeTooltip(ui->perfOverlayFramerateGraphEnabled, json_emu_overlay["perfOverlayFramerateGraphEnabled"].toString()); + SubscribeTooltip(ui->perfOverlayFramerateGraphEnabled, tooltips.settings.perf_overlay_framerate_graph_enabled); xemu_settings->EnhanceCheckBox(ui->perfOverlayFrametimeGraphEnabled, emu_settings::PerfOverlayFrametimeGraphEnabled); - SubscribeTooltip(ui->perfOverlayFrametimeGraphEnabled, json_emu_overlay["perfOverlayFrametimeGraphEnabled"].toString()); + SubscribeTooltip(ui->perfOverlayFrametimeGraphEnabled, tooltips.settings.perf_overlay_frametime_graph_enabled); xemu_settings->EnhanceCheckBox(ui->perfOverlayEnabled, emu_settings::PerfOverlayEnabled); - SubscribeTooltip(ui->perfOverlayEnabled, json_emu_overlay["perfOverlayEnabled"].toString()); + SubscribeTooltip(ui->perfOverlayEnabled, tooltips.settings.perf_overlay_enabled); auto EnablePerfOverlayOptions = [this](bool enabled) { ui->label_detail_level->setEnabled(enabled); @@ -1238,7 +1205,7 @@ settings_dialog::settings_dialog(std::shared_ptr guiSettings, std: connect(ui->perfOverlayEnabled, &QCheckBox::clicked, EnablePerfOverlayOptions); xemu_settings->EnhanceCheckBox(ui->shaderLoadBgEnabled, emu_settings::ShaderLoadBgEnabled); - SubscribeTooltip(ui->shaderLoadBgEnabled, json_emu_shaders["shaderLoadBgEnabled"].toString()); + SubscribeTooltip(ui->shaderLoadBgEnabled, tooltips.settings.shader_load_bg_enabled); auto EnableShaderLoaderOptions = [this](bool enabled) { ui->label_shaderLoadBgDarkening->setEnabled(enabled); @@ -1252,34 +1219,34 @@ settings_dialog::settings_dialog(std::shared_ptr guiSettings, std: // Sliders EnhanceSlider(emu_settings::PerfOverlayUpdateInterval, ui->perfOverlayUpdateInterval, ui->label_update_interval, tr("Update Interval: %0 ms")); - SubscribeTooltip(ui->perf_overlay_update_interval, json_emu_overlay["perfOverlayUpdateInterval"].toString()); + SubscribeTooltip(ui->perf_overlay_update_interval, tooltips.settings.perf_overlay_update_interval); EnhanceSlider(emu_settings::PerfOverlayFontSize, ui->perfOverlayFontSize, ui->label_font_size, tr("Font Size: %0 px")); - SubscribeTooltip(ui->perf_overlay_font_size, json_emu_overlay["perfOverlayFontSize"].toString()); + SubscribeTooltip(ui->perf_overlay_font_size, tooltips.settings.perf_overlay_font_size); EnhanceSlider(emu_settings::PerfOverlayOpacity, ui->perfOverlayOpacity, ui->label_opacity, tr("Opacity: %0 %")); - SubscribeTooltip(ui->perf_overlay_opacity, json_emu_overlay["perfOverlayOpacity"].toString()); + SubscribeTooltip(ui->perf_overlay_opacity, tooltips.settings.perf_overlay_opacity); EnhanceSlider(emu_settings::ShaderLoadBgDarkening, ui->shaderLoadBgDarkening, ui->label_shaderLoadBgDarkening, tr("Background darkening: %0 %")); - SubscribeTooltip(ui->shaderLoadBgDarkening, json_emu_shaders["shaderLoadBgDarkening"].toString()); + SubscribeTooltip(ui->shaderLoadBgDarkening, tooltips.settings.shader_load_bg_darkening); EnhanceSlider(emu_settings::ShaderLoadBgBlur, ui->shaderLoadBgBlur, ui->label_shaderLoadBgBlur, tr("Background blur: %0 %")); - SubscribeTooltip(ui->shaderLoadBgBlur, json_emu_shaders["shaderLoadBgBlur"].toString()); + SubscribeTooltip(ui->shaderLoadBgBlur, tooltips.settings.shader_load_bg_blur); // SpinBoxes xemu_settings->EnhanceSpinBox(ui->perfOverlayMarginX, emu_settings::PerfOverlayMarginX, "", tr("px")); - SubscribeTooltip(ui->perfOverlayMarginX, json_emu_overlay["perfOverlayMarginX"].toString()); + SubscribeTooltip(ui->perfOverlayMarginX, tooltips.settings.perf_overlay_margin_x); xemu_settings->EnhanceSpinBox(ui->perfOverlayMarginY, emu_settings::PerfOverlayMarginY, "", tr("px")); - SubscribeTooltip(ui->perfOverlayMarginY, json_emu_overlay["perfOverlayMarginY"].toString()); + SubscribeTooltip(ui->perfOverlayMarginY, tooltips.settings.perf_overlay_margin_y); // Global settings (gui_settings) if (!game) { - SubscribeTooltip(ui->gs_resizeOnBoot, json_emu_misc["gs_resizeOnBoot"].toString()); + SubscribeTooltip(ui->gs_resizeOnBoot, tooltips.settings.resize_on_boot); - SubscribeTooltip(ui->gs_disableMouse, json_emu_misc["gs_disableMouse"].toString()); + SubscribeTooltip(ui->gs_disableMouse, tooltips.settings.disable_mouse); ui->gs_disableMouse->setChecked(xgui_settings->GetValue(gui::gs_disableMouse).toBool()); connect(ui->gs_disableMouse, &QCheckBox::clicked, [=](bool val) @@ -1331,29 +1298,29 @@ settings_dialog::settings_dialog(std::shared_ptr guiSettings, std: if (!game) { // Comboboxes - SubscribeTooltip(ui->combo_configs, json_gui["configs"].toString()); + SubscribeTooltip(ui->combo_configs, tooltips.settings.configs); - SubscribeTooltip(ui->gb_stylesheets, json_gui["stylesheets"].toString()); + SubscribeTooltip(ui->gb_stylesheets, tooltips.settings.stylesheets); // Checkboxes: - SubscribeTooltip(ui->cb_custom_colors, json_gui["custom_colors"].toString()); + SubscribeTooltip(ui->cb_custom_colors, tooltips.settings.custom_colors); // Checkboxes: gui options - SubscribeTooltip(ui->cb_show_welcome, json_gui["show_welcome"].toString()); + SubscribeTooltip(ui->cb_show_welcome, tooltips.settings.show_welcome); - SubscribeTooltip(ui->cb_show_exit_game, json_gui["show_exit_game"].toString()); + SubscribeTooltip(ui->cb_show_exit_game, tooltips.settings.show_exit_game); - SubscribeTooltip(ui->cb_show_boot_game, json_gui["show_boot_game"].toString()); + SubscribeTooltip(ui->cb_show_boot_game, tooltips.settings.show_boot_game); - SubscribeTooltip(ui->cb_show_pkg_install, json_gui["show_pkg_install"].toString()); + SubscribeTooltip(ui->cb_show_pkg_install, tooltips.settings.show_pkg_install); - SubscribeTooltip(ui->cb_show_pup_install, json_gui["show_pup_install"].toString()); + SubscribeTooltip(ui->cb_show_pup_install, tooltips.settings.show_pup_install); - SubscribeTooltip(ui->cb_check_update_start, json_gui["check_update_start"].toString()); + SubscribeTooltip(ui->cb_check_update_start, tooltips.settings.check_update_start); - SubscribeTooltip(ui->useRichPresence, json_gui["useRichPresence"].toString()); + SubscribeTooltip(ui->useRichPresence, tooltips.settings.use_rich_presence); - SubscribeTooltip(ui->discordState, json_gui["discordState"].toString()); + SubscribeTooltip(ui->discordState, tooltips.settings.discord_state); // Discord: ui->useRichPresence->setChecked(m_use_discord); @@ -1374,8 +1341,8 @@ settings_dialog::settings_dialog(std::shared_ptr guiSettings, std: }); // Log and TTY: - SubscribeTooltip(ui->log_limit, json_gui["log_limit"].toString()); - SubscribeTooltip(ui->tty_limit, json_gui["tty_limit"].toString()); + SubscribeTooltip(ui->log_limit, tooltips.settings.log_limit); + SubscribeTooltip(ui->tty_limit, tooltips.settings.tty_limit); ui->spinbox_log_limit->setValue(xgui_settings->GetValue(gui::l_limit).toInt()); connect(ui->spinbox_log_limit, &QSpinBox::editingFinished, [=]() @@ -1440,8 +1407,9 @@ settings_dialog::settings_dialog(std::shared_ptr guiSettings, std: { if (reset) { - m_currentConfig = gui::Default; - m_currentStylesheet = gui::Default; + const Localized localized; + m_currentConfig = localized.constants.Default; + m_currentStylesheet = localized.constants.Default; ui->combo_configs->setCurrentIndex(0); ui->combo_stylesheets->setCurrentIndex(0); } @@ -1468,7 +1436,7 @@ settings_dialog::settings_dialog(std::shared_ptr guiSettings, std: { ApplyGuiOptions(true); xgui_settings->Reset(true); - xgui_settings->ChangeToConfig(gui::Default); + xgui_settings->ChangeToConfig(Localized().constants.Default); Q_EMIT GuiSettingsSyncRequest(true); AddConfigs(); AddStylesheets(); @@ -1568,56 +1536,56 @@ settings_dialog::settings_dialog(std::shared_ptr guiSettings, std: // Checkboxes: gpu debug options xemu_settings->EnhanceCheckBox(ui->glLegacyBuffers, emu_settings::LegacyBuffers); - SubscribeTooltip(ui->glLegacyBuffers, json_debug["glLegacyBuffers"].toString()); + SubscribeTooltip(ui->glLegacyBuffers, tooltips.settings.gl_legacy_buffers); xemu_settings->EnhanceCheckBox(ui->forceHighpZ, emu_settings::ForceHighpZ); - SubscribeTooltip(ui->forceHighpZ, json_debug["forceHighpZ"].toString()); + SubscribeTooltip(ui->forceHighpZ, tooltips.settings.force_high_pz); xemu_settings->EnhanceCheckBox(ui->debugOutput, emu_settings::DebugOutput); - SubscribeTooltip(ui->debugOutput, json_debug["debugOutput"].toString()); + SubscribeTooltip(ui->debugOutput, tooltips.settings.debug_output); xemu_settings->EnhanceCheckBox(ui->debugOverlay, emu_settings::DebugOverlay); - SubscribeTooltip(ui->debugOverlay, json_debug["debugOverlay"].toString()); + SubscribeTooltip(ui->debugOverlay, tooltips.settings.debug_overlay); xemu_settings->EnhanceCheckBox(ui->logProg, emu_settings::LogShaderPrograms); - SubscribeTooltip(ui->logProg, json_debug["logProg"].toString()); + SubscribeTooltip(ui->logProg, tooltips.settings.log_shader_programs); xemu_settings->EnhanceCheckBox(ui->disableHwOcclusionQueries, emu_settings::DisableOcclusionQueries); - SubscribeTooltip(ui->disableHwOcclusionQueries, json_debug["disableOcclusionQueries"].toString()); + SubscribeTooltip(ui->disableHwOcclusionQueries, tooltips.settings.disable_occlusion_queries); xemu_settings->EnhanceCheckBox(ui->forceCpuBlitEmulation, emu_settings::ForceCPUBlitEmulation); - SubscribeTooltip(ui->forceCpuBlitEmulation, json_debug["forceCpuBlitEmulation"].toString()); + SubscribeTooltip(ui->forceCpuBlitEmulation, tooltips.settings.force_cpu_blit_emulation); xemu_settings->EnhanceCheckBox(ui->disableVulkanMemAllocator, emu_settings::DisableVulkanMemAllocator); - SubscribeTooltip(ui->disableVulkanMemAllocator, json_debug["disableVulkanMemAllocator"].toString()); + SubscribeTooltip(ui->disableVulkanMemAllocator, tooltips.settings.disable_vulkan_mem_allocator); xemu_settings->EnhanceCheckBox(ui->disableFIFOReordering, emu_settings::DisableFIFOReordering); - SubscribeTooltip(ui->disableFIFOReordering, json_debug["disableFIFOReordering"].toString()); + SubscribeTooltip(ui->disableFIFOReordering, tooltips.settings.disable_fifo_reordering); xemu_settings->EnhanceCheckBox(ui->strictTextureFlushing, emu_settings::StrictTextureFlushing); - SubscribeTooltip(ui->strictTextureFlushing, json_debug["strictTextureFlushing"].toString()); + SubscribeTooltip(ui->strictTextureFlushing, tooltips.settings.strict_texture_flushing); xemu_settings->EnhanceCheckBox(ui->gpuTextureScaling, emu_settings::GPUTextureScaling); - SubscribeTooltip(ui->gpuTextureScaling, json_debug["gpuTextureScaling"].toString()); + SubscribeTooltip(ui->gpuTextureScaling, tooltips.settings.gpu_texture_scaling); // Checkboxes: core debug options xemu_settings->EnhanceCheckBox(ui->ppuDebug, emu_settings::PPUDebug); - SubscribeTooltip(ui->ppuDebug, json_debug["ppuDebug"].toString()); + SubscribeTooltip(ui->ppuDebug, tooltips.settings.ppu_debug); xemu_settings->EnhanceCheckBox(ui->spuDebug, emu_settings::SPUDebug); - SubscribeTooltip(ui->spuDebug, json_debug["spuDebug"].toString()); + SubscribeTooltip(ui->spuDebug, tooltips.settings.spu_debug); xemu_settings->EnhanceCheckBox(ui->setDAZandFTZ, emu_settings::SetDAZandFTZ); - SubscribeTooltip(ui->setDAZandFTZ, json_debug["setDAZandFTZ"].toString()); + SubscribeTooltip(ui->setDAZandFTZ, tooltips.settings.set_daz_and_ftz); xemu_settings->EnhanceCheckBox(ui->accurateGETLLAR, emu_settings::AccurateGETLLAR); - SubscribeTooltip(ui->accurateGETLLAR, json_debug["accurateGETLLAR"].toString()); + SubscribeTooltip(ui->accurateGETLLAR, tooltips.settings.accurate_getllar); xemu_settings->EnhanceCheckBox(ui->accuratePUTLLUC, emu_settings::AccuratePUTLLUC); - SubscribeTooltip(ui->accuratePUTLLUC, json_debug["accuratePUTLLUC"].toString()); + SubscribeTooltip(ui->accuratePUTLLUC, tooltips.settings.accurate_putlluc); xemu_settings->EnhanceCheckBox(ui->hookStFunc, emu_settings::HookStaticFuncs); - SubscribeTooltip(ui->hookStFunc, json_debug["hookStFunc"].toString()); + SubscribeTooltip(ui->hookStFunc, tooltips.settings.hook_static_functions); // Layout fix for High Dpi layout()->setSizeConstraint(QLayout::SetFixedSize); @@ -1666,13 +1634,15 @@ void settings_dialog::SnapSlider(QSlider *slider, int interval) void settings_dialog::AddConfigs() { + const Localized localized; + ui->combo_configs->clear(); - ui->combo_configs->addItem(gui::Default); + ui->combo_configs->addItem(localized.constants.Default); for (const QString& entry : xgui_settings->GetConfigEntries()) { - if (entry != gui::Default) + if (entry != localized.constants.Default) { ui->combo_configs->addItem(entry); } @@ -1693,14 +1663,16 @@ void settings_dialog::AddConfigs() void settings_dialog::AddStylesheets() { + const Localized localized; + ui->combo_stylesheets->clear(); - ui->combo_stylesheets->addItem("None", gui::None); - ui->combo_stylesheets->addItem("Default (Bright)", gui::Default); + ui->combo_stylesheets->addItem("None", localized.constants.None); + ui->combo_stylesheets->addItem("Default (Bright)", localized.constants.Default); for (const QString& entry : xgui_settings->GetStylesheetEntries()) { - if (entry != gui::Default) + if (entry != localized.constants.Default) { ui->combo_stylesheets->addItem(entry, entry); } diff --git a/rpcs3/rpcs3qt/tooltips.h b/rpcs3/rpcs3qt/tooltips.h new file mode 100644 index 0000000000..3ac27c31da --- /dev/null +++ b/rpcs3/rpcs3qt/tooltips.h @@ -0,0 +1,194 @@ +#pragma once + +#include +#include + +class Tooltips : public QObject +{ + Q_OBJECT + +public: + + Tooltips() {}; + ~Tooltips() {}; + + const struct settings + { + // advanced + + const QString libraries_manual = tr("Allows the user to manually choose the LLE libraries to load.\nIf unsure, don't use this option. Nothing will work if you use this."); + const QString libraries_both = tr("Load libsysmodule.sprx and chosen list of libraries. Option for backward compatibility.\nIf unsure, don't use this option."); + const QString libraries_liblv2both = tr("Loads liblv2.sprx and chosen list of libraries.\nIf unsure, don't use this option."); + const QString libraries_liblv2list = tr("Loads liblv2.sprx and nothing but selected libraries.\nDon't use this option."); + const QString libraries_liblv2 = tr("This closely emulates how games can load and unload system module files on a real PlayStation 3.\nSome games require this.\nThis is the preferred option."); + + const QString debug_console_mode = tr("Increases the amount of usable system memory to match a DECR console and more.\nCauses some software to behave differently than on retail hardware."); + const QString silence_all_logs = tr("Stop writing any logs after game startup. Don't use unless you believe it's necessary."); + const QString read_color = tr("Initializes render target memory using vm memory."); + const QString read_depth = tr("Initializes render target memory using vm memory."); + const QString dump_depth = tr("Writes depth buffer values to vm memory."); + const QString disable_on_disk_shader_cache = tr("Disables the loading and saving of shaders from and to the shader cache in the data directory."); + const QString relaxed_zcull = tr("Changes ZCULL report synchronization behaviour to be more forgiving to PC architecture.\nCan improve performance in some games but can also cause stability issues or drastically reduced performance in others.\nUse with caution and if performance or stability is compromised, keep this disabled."); + const QString max_spurs_threads = tr("Limits the maximum number of SPURS threads in each thread group.\nMay improve performance in some cases, especially on systems with limited number of hardware threads.\nLimiting the number of threads is likely to cause crashes; it's recommended to keep this at default value."); + const QString sleep_timers_accuracy = tr("Changes the sleep period accuracy.\n'As Host' uses default accuracy of the underlying operating system, while 'All Timers' attempts to improve it.\n'Usleep Only' limits the adjustments to usleep syscall only.\nCan affect perfomance in unexpected ways."); + const QString vblank_rate = tr("Adjusts the frequency of vertical blanking signals that the emulator sends.\nAffects timing of events which rely on these signals."); + const QString clocks_scale = tr("Changes the scale of emulated system time.\nAffects software which uses system time to calculate things such as dynamic timesteps."); + const QString wake_up_delay = tr("Try fiddling with this setting when encountering unstable games. The higher value, the better stability it may provide.\nIncrements/Decrements for each test should be around 100μs to 200μs until finding the best value for optimal stability.\nValues above 1000μs may cause noticeable performance penalties, use with caution."); + const QString disabled_from_global = tr("Do not change this setting globally.\nRight-click the game in game list and choose \"Configure\" instead."); + + // audio + + const QString audio_out = tr("XAudio2 is the recommended option and should be used whenever possible.\nOpenAL uses a cross-platform approach and is the next best alternative."); + const QString audio_out_linux = tr("OpenAL uses a cross-platform approach and supports audio buffering, so it is the recommended option.\nPulseAudio uses the native Linux sound system, and is the next best alternative. If neither are available, ALSA can be used instead."); + const QString audio_dump = tr("Saves all audio as a raw wave file. If unsure, leave this unchecked."); + const QString convert = tr("Uses 16-bit audio samples instead of default 32-bit floating point.\nUse with buggy audio drivers if you have no sound or completely broken sound."); + const QString downmix = tr("Uses stereo audio output instead of default 7.1 surround sound.\nUse with stereo audio devices. Disable it only if you are using a surround sound audio system."); + const QString master_volume = tr("Controls the overall volume of the emulation.\nValues above 100% might reduce the audio quality."); + const QString enable_buffering = tr("Enables audio buffering, which reduces crackle/stutter but increases audio latency (requires XAudio2 or OpenAL)."); + const QString audio_buffer_duration = tr("Target buffer duration in milliseconds.\nHigher values make the buffering algorithm's job easier, but may introduce noticeable audio latency."); + const QString enable_time_stretching = tr("Enables time stretching - requires buffering to be enabled.\nReduces crackle/stutter further, but may cause a very noticeable reduction in audio quality on slower CPUs."); + const QString time_stretching_threshold = tr("Buffer fill level (in percentage) below which time stretching will start."); + const QString microphone = tr("Standard should be used for most games.\nSingStar emulates a SingStar device and should be used with SingStar games.\nReal SingStar should only be used with a REAL SingStar device with SingStar games.\nRocksmith should be used with a Rocksmith dongle."); + + // cpu + + const QString ppu_precise = tr("This is the most accurate Interpreter, but very slow to play games with.\nYou may try this as a last resort if you encounter odd bugs or crashes.\nIf unsure, use PPU Interpreter Fast or PPU Recompiler (LLVM)."); + const QString ppu_fast = tr("This is the fastest interpreter.\nTrades accuracy for speed, and it very rarely breaks games even in comparison to the Precise option.\nTry this if PPU Recompiler (LLVM) fails."); + const QString ppu_llvm = tr("Recompiles the game's executable once before running it for the first time.\nThis is by far the fastest option and should always be used.\nShould you face compatibility issues, fall back to one of the Interpreters and retry.\nIf unsure, use this option."); + const QString spu_precise = tr("This is extremely slow but may fix broken graphics in some games."); + const QString spu_fast = tr("This is slower than the SPU Recompiler but significantly faster than the precise interpreter.\nGames rarely need this however."); + const QString spu_asmjit = tr("This is the fast option with very good compatibility.\nIf unsure, use this option."); + const QString spu_llvm = tr("This is the fastest option with very good compatibility.\nRecompiles the game's SPU LLVM cache before running which adds extra start-up time.\nIf you experience issues, use the ASMJIT Recompiler."); + const QString accurate_xfloat = tr("Fixes bugs in various games at the cost of performance.\nThis setting is only applied when SPU LLVM is active."); + const QString spu_cache = tr("Should normally stay enabled.\nDisable this if the cache becomes too large.\nDisabling it does not remove the existing cache."); + const QString enable_thread_scheduler = tr("Allows RPCS3 to manually schedule physical cores to run specific tasks on, instead of letting the OS handle it.\nVery useful on Windows, especially for AMD Ryzen systems where it can give huge performance gains.\nNote: This function is only implemented for AMD Ryzen CPUs."); + const QString lower_spu_thread_priority = tr("Runs SPU threads with lower priority than PPU threads.\nUsually faster on an i3 or i5, possibly slower or no difference on an i7 or Ryzen."); + const QString spu_loop_detection = tr("Try to detect loop conditions in SPU kernels and use them as scheduling hints.\nImproves performance and reduces CPU usage.\nMay cause severe audio stuttering in rare cases."); + const QString enable_tsx = tr("Enable usage of TSX instructions.\nNeeds to be forced on some Haswell or Broadwell CPUs.\nForcing this on older Hardware can lead to system instability, use it with caution."); + const QString spu_block_size = tr("This option controls the SPU analyser, particularly the size of compiled units. The Mega and Giga modes may improve performance by tying smaller units together, decreasing the number of compiled units but increasing their size.\nUse the Safe mode for maximum compatibility."); + const QString preferred_spu_threads = tr("Some SPU stages are sensitive to race conditions and allowing a limited number at a time helps alleviate performance stalls.\nSetting this to a smaller value might improve performance and reduce stuttering in some games.\nLeave this on auto if performance is negatively affected when setting a small value."); + + // debug + + const QString ppu_debug = tr("Never use this."); + const QString spu_debug = tr("Never use this."); + const QString set_daz_and_ftz = tr("Never use this."); + const QString accurate_getllar = tr("Never use this."); + const QString accurate_putlluc = tr("Never use this."); + const QString hook_static_functions = tr("Allows to hook some functions like 'memcpy' replacing them with high-level implementations. May do nothing or break things. Experimental."); + const QString gl_legacy_buffers = tr("Enables use of classic OpenGL buffers which allows capturing tools to work with RPCS3 e.g RenderDoc.\nIf unsure, don't use this option."); + const QString force_high_pz = tr("Only useful when debugging differences in GPU hardware.\nNot necessary for average users.\nIf unsure, don't use this option."); + const QString debug_output = tr("Enables the selected API's inbuilt debugging functionality.\nWill cause severe performance degradation especially with Vulkan.\nOnly useful to developers.\nIf unsure, don't use this option."); + const QString debug_overlay = tr("Provides a graphical overlay of various debugging information.\nIf unsure, don't use this option."); + const QString log_shader_programs = tr("Dump game shaders to file. Only useful to developers.\nIf unsure, don't use this option."); + const QString disable_occlusion_queries = tr("Disables running occlusion queries. Minor to moderate performance boost.\nMight introduce issues with broken occlusion e.g missing geometry and extreme pop-in."); + const QString force_cpu_blit_emulation = tr("Forces emulation of all blit and image manipulation operations on the CPU.\nRequires 'Write Color Buffers' option to also be enabled in most cases to avoid missing graphics.\nSignificantly degrades performance but is more accurate in some cases.\nThis setting overrides the 'GPU texture scaling' option."); + const QString disable_vulkan_mem_allocator = tr("Disables the custom Vulkan memory allocator and reverts to direct calls to VkAllocateMemory/VkFreeMemory."); + const QString disable_fifo_reordering = tr("Disables RSX FIFO optimizations completely. Draws are processed as they are received by the DMA puller."); + const QString gpu_texture_scaling = tr("Force all texture transfer, scaling and conversion operations on the GPU.\nMay cause texture corruption in some cases."); + const QString strict_texture_flushing = tr("Forces texture flushing even in situations where it is not necessary/correct. Known to cause visual artifacts, but useful for debugging certain texture cache issues."); + + // emulator + + const QString exit_on_stop = tr("Automatically close RPCS3 when closing a game, or when a game closes itself."); + const QString start_on_boot = tr("Leave this enabled unless you are a developer."); + const QString start_game_fullscreen = tr("Automatically puts the game window in fullscreen.\nDouble click on the game window or press alt+enter to toggle fullscreen and windowed mode."); + const QString prevent_display_sleep = tr("Prevent the display from sleeping while a game is running.\nThis requires the org.freedesktop.ScreenSaver D-Bus service on Linux.\nThis option will be disabled if the current platform does not support display sleep control."); + const QString show_fps_in_title = tr("Shows the frame rate in the game window title. May cause buggy or outdated recording software to not notice RPCS3."); + const QString resize_on_boot = tr("Automatically resizes the game window on boot.\nThis does not change the internal game resolution."); + const QString show_trophy_popups = tr("Show trophy pop-ups when a trophy is unlocked."); + const QString disable_mouse = tr("Disables the activation of fullscreen mode per double-click while the game screen is active.\nCheck this if you want to play with mouse and keyboard (for example with UCR)."); + const QString max_llvm_threads = tr("Limits the maximum number of threads used for PPU Module compilation.\nLower this in order to increase performance of other open applications.\nThe default uses all available threads."); + const QString show_shader_compilation_hint = tr("Show shader compilation hints using the native overlay."); + const QString use_native_interface = tr("Enables use of native HUD within the game window that can interact with game controllers.\nWhen disabled, regular Qt dialogs are used instead.\nCurrently, only Latin characters are supported."); + + const QString perf_overlay_enabled = tr("Enables or disables the performance overlay."); + const QString perf_overlay_framerate_graph_enabled = tr("Enables or disables the framerate graph."); + const QString perf_overlay_frametime_graph_enabled = tr("Enables or disables the frametime graph."); + const QString perf_overlay_position = tr("Sets the on-screen position (quadrant) of the performance overlay."); + const QString perf_overlay_detail_level = tr("Controls the amount of information displayed on the performance overlay."); + const QString perf_overlay_update_interval = tr("Sets the time interval in which the performance overlay is being updated (measured in milliseconds)."); + const QString perf_overlay_font_size = tr("Sets the font size of the performance overlay (measured in pixels)."); + const QString perf_overlay_opacity = tr("Sets the opacity of the performance overlay (measured in %)."); + const QString perf_overlay_margin_x = tr("Sets the horizontal distance to the screen border relative to the screen quadrant (measured in pixels)."); + const QString perf_overlay_margin_y = tr("Sets the vertical distance to the screen border relative to the screen quadrant (measured in pixels)."); + const QString perf_overlay_center_x = tr("Centers the performance overlay horizontally and overrides the horizontal margin."); + const QString perf_overlay_center_y = tr("Centers the performance overlay vertically and overrides the vertical margin."); + + const QString shader_load_bg_enabled = tr("Shows a background image during the native shader loading dialog/loading screen.\nBy default the used image will be /PS3_GAME/PIC1.PNG or /PS3_GAME/PIC0.PNG."); + const QString shader_load_bg_darkening = tr("Changes the background image darkening effect strength of the native shader loading dialog.\nThis may be used to improve readability and/or aesthetics."); + const QString shader_load_bg_blur = tr("Changes the background image blur effect strength of the native shader loading dialog.\nThis may be used to improve readability and/or aesthetics."); + + // gpu + + const QString renderer = tr("Vulkan is the fastest renderer. OpenGL is the most accurate renderer.\nIf unsure, use Vulkan. Should you have any compatibility issues, fall back to OpenGL."); + const QString resolution = tr("This setting will be ignored if the Resolution Scale is set to anything other than 100%!\nLeave this on 1280x720, every PS3 game is compatible with this resolution.\nOnly use 1920x1080 if the game supports it.\nRarely due to emulation bugs some games will only render at low resolutions like 480p."); + const QString graphics_adapter = tr("On multi GPU systems select which GPU to use in RPCS3 when using Vulkan.\nThis is not needed when using OpenGL."); + const QString aspect_ratio = tr("Leave this on 16:9 unless you have a 4:3 monitor."); + const QString frame_limit = tr("Off is the best option as it performs faster.\nUsing the frame limiter will add extra overhead and slow down the game.\nHowever, some games will crash if the frame rate is too high.\nIf that happens, set value to anything other than Off."); + const QString anti_aliasing = tr("Emulate PS3 multisampling layout.\nCan fix some otherwise difficult to solve graphics glitches.\nLow to moderate performance hit depending on your GPU hardware."); + const QString anisotropic_filter = tr("Higher values increase sharpness of textures on sloped surfaces at the cost of GPU resources.\nModern GPUs can handle this setting just fine even at 16x.\nKeep this on Automatic if you want to use the original setting used by a real PS3."); + const QString resolution_scale = tr("Scales the game's resolution by the given percentage.\nThe base resolution is always 1280x720.\nSet this value to 100% if you want to use the normal Resolution options."); + const QString minimum_scalable_dimension = tr("Only framebuffers greater than this size will be upscaled.\nIncreasing this value might fix problems with missing graphics when upscaling, especially when Write Color Buffers is enabled.\nDo not touch this setting if you are unsure."); + const QString dump_color = tr("Enable this option if you get missing graphics or broken lighting ingame.\nMight degrade performance and introduce stuttering in some cases.\nRequired for Demon's Souls."); + const QString vsync = tr("By having this off you might obtain a higher frame rate at the cost of tearing artifacts in the game."); + const QString strict_rendering_mode = tr("Enforces strict compliance to the API specification.\nMight result in degraded performance in some games.\nCan resolve rare cases of missing graphics and flickering.\nIf unsure, don't use this option."); + const QString disable_vertex_cache = tr("Disables the vertex cache.\nMight resolve missing or flickering graphics output.\nMay degrade performance."); + const QString disable_async_shaders = tr("Disables asynchronous shader compilation.\nFixes missing graphics while shaders are compiling but introduces stuttering.\nDisable if you do not want to deal with graphics pop-in, or for testing before filing any bug reports."); + const QString stretch_to_display_area = tr("Overrides the aspect ratio and stretches the image to the full display area."); + const QString multithreaded_rsx = tr("Offloads some RSX operations to a secondary thread.\nMay improve performance for some high-core processors.\nMay cause slowdown in some situations due to the extra worker thread load."); + + // gui + + const QString log_limit = tr("Sets the maximum amount of blocks that the log can display.\nThis usually equals the number of lines.\nSet 0 in order to remove the limit."); + const QString tty_limit = tr("Sets the maximum amount of blocks that the tty can display.\nThis usually equals the number of lines.\nSet 0 in order to remove the limit."); + const QString configs = tr("Only useful to developers.\nIf unsure, don't use this option."); + const QString stylesheets = tr("Changes the overall look of RPCS3.\nChoose a stylesheet and click Apply to change between styles."); + const QString show_welcome = tr("Shows the initial welcome screen upon starting RPCS3."); + const QString show_exit_game = tr("Shows a confirmation dialog when the game window is being closed."); + const QString show_boot_game = tr("Shows a confirmation dialog when a game was booted while another game is running."); + const QString show_pkg_install = tr("Shows a dialog when packages were installed successfully."); + const QString show_pup_install = tr("Shows a dialog when firmware was installed successfully."); + const QString check_update_start = tr("Check if an update is available on startup."); + const QString use_rich_presence = tr("Enables use of Discord Rich Presence to show what game you are playing on Discord.\nRequires a restart of RPCS3 to completely close the connection."); + const QString discord_state = tr("Tell your friends what you are doing."); + const QString custom_colors = tr("Prioritize custom user interface colors over properties set in stylesheet."); + + // input + + const QString pad_handler = tr("If you want to use the keyboard to control, select the Keyboard option.\nIf you have a DualShock 4, select DualShock 4.\nIf you have an Xbox controller, or another compatible device, use XInput.\nOlder controllers such as PS2 controllers with an adapter usually work fine with MMJoystick.\nCheck button mappings in the Windows control panel."); + const QString pad_handler_linux = tr("If you want to use the keyboard to control, select the Keyboard option.\nIf you have a DualShock 4, select DualShock 4."); + const QString keyboard_handler = tr("Some games support native keyboard input.\nBasic will work in these cases."); + const QString mouse_handler = tr("Some games support native mouse input.\nBasic will work in these cases."); + const QString camera = tr("Camera support is not implemented, leave this on null."); + const QString camera_type = tr("Camera support is not implemented, leave this on unknown."); + const QString move = tr("PlayStation Move support.\nFake: Experimental! This maps Move controls to DS3 controller mappings.\nMouse: Emulate PSMove with Mouse handler."); + + // network + + const QString net_status = tr("Leave as disconnected unless you're debugging.\nRPCS3 has no online support."); + + // system + + const QString system_language = tr("Some games may fail to boot if the system language is not available in the game itself.\nOther games will switch language automatically to what is selected here.\nIt is recommended leaving this on a language supported by the game."); + const QString keyboard_type = tr(" Sets the used keyboard layout.\nCurrently only US, Japanese and German layouts are fully supported at this moment."); + const QString enter_button_assignment = tr("The button used for enter/accept/confirm in system dialogs.\nChange this to use the circle button instead, which is the default configuration on Japanese systems and in many Japanese games.\nIn these cases having the cross button assigned can often lead to confusion."); + const QString enable_host_root = tr("Required for some Homebrew.\nIf unsure, don't use this option."); + const QString limit_cache_size = tr("Automatically removes older files from disk cache on boot if it grows larger than the specified value.\nGames can use the cache folder to temporarily store data outside of system memory. It is not used for long-term storage."); + } settings; + + const struct gamepad_settings + { + const QString null = tr("This controller is disabled and will appear as disconnected to software. Choose another handler to enable it."); + const QString keyboard = tr("While it is possible to use a keyboard as a pad in RPCS3, the use of an actual controller is strongly recommended. To bind mouse movement to a button or joystick, click on the desired button to activate it, then click and hold while dragging the mouse to a direction"); + const QString ds3_windows = tr("In order to use the DualShock 3 handler, you need to install the official DualShock 3 driver first.\nSee the RPCS3 Wiki for instructions."); + const QString ds3_linux = tr("In order to use the DualShock 3 handler, you might need to add udev rules to let RPCS3 access the controller.\nSee the RPCS3 Wiki for instructions."); + const QString ds3_other = tr("The DualShock 3 handler is recommended for official DualShock 3 controllers."); + const QString ds4_windows = tr("If you have any issues with the DualShock 4 handler, it might be caused by third-party tools such as DS4Windows. It's recommended that you disable them while using this handler."); + const QString ds4_linux = tr("In order to use the DualShock 4 handler, you might need to add udev rules to let RPCS3 access the controller.\nSee the RPCS3 Wiki for instructions."); + const QString ds4_other = tr("The DualShock 4 handler is recommended for official DualShock 4 controllers."); + const QString xinput = tr("The XInput handler will work with Xbox controllers and many third-party PC-compatible controllers. Pressure sensitive buttons from SCP are supported when SCP's XInput1_3.dll is placed in the main RPCS3 directory. For more details, see the RPCS3 Wiki."); + const QString evdev = tr("The evdev handler should work with any controller that has linux support.\nIf your joystick is not being centered properly, read the RPCS3 Wiki for instructions."); + const QString mmjoy = tr("The MMJoystick handler should work with almost any controller recognized by Windows. However, it is recommended that you use the more specific handlers if you have a controller that supports them."); + } gamepad_settings; +};