shared_translation.cpp 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369
  1. // SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project
  2. // SPDX-License-Identifier: GPL-2.0-or-later
  3. #include <forward_list>
  4. #include <map>
  5. #include <memory>
  6. #include <string>
  7. #include <typeindex>
  8. #include <utility>
  9. #include <QString>
  10. #include <QWidget>
  11. #include "common/settings.h"
  12. #include "yuzu/configuration/shared_translation.h"
  13. #include "yuzu/uisettings.h"
  14. namespace ConfigurationShared {
  15. std::unique_ptr<TranslationMap> InitializeTranslations(QWidget* parent) {
  16. std::unique_ptr<TranslationMap> translations = std::make_unique<TranslationMap>();
  17. const auto& tr = [parent](const char* text) -> QString { return parent->tr(text); };
  18. #define INSERT(SETTINGS, ID, NAME, TOOLTIP) \
  19. translations->insert(std::pair{SETTINGS::values.ID.Id(), std::pair{tr((NAME)), tr((TOOLTIP))}})
  20. // A setting can be ignored by giving it a blank name
  21. // Audio
  22. INSERT(Settings, sink_id, "Output Engine:", "");
  23. INSERT(Settings, audio_output_device_id, "Output Device:", "");
  24. INSERT(Settings, audio_input_device_id, "Input Device:", "");
  25. INSERT(Settings, audio_muted, "Mute audio when in background", "");
  26. INSERT(Settings, volume, "Volume:", "");
  27. INSERT(Settings, dump_audio_commands, "", "");
  28. // Core
  29. INSERT(Settings, use_multi_core, "Multicore CPU Emulation", "");
  30. INSERT(Settings, use_unsafe_extended_memory_layout, "Unsafe extended memory layout (8GB DRAM)",
  31. "");
  32. // Cpu
  33. INSERT(Settings, cpu_accuracy, "Accuracy:", "");
  34. INSERT(Settings, cpu_accuracy_first_time, "", "");
  35. // Cpu Debug
  36. // Cpu Unsafe
  37. INSERT(Settings, cpuopt_unsafe_unfuse_fma,
  38. "Unfuse FMA (improve performance on CPUs without FMA)",
  39. "This option improves speed by reducing accuracy of fused-multiply-add instructions on "
  40. "CPUs without native FMA support.");
  41. INSERT(Settings, cpuopt_unsafe_reduce_fp_error, "Faster FRSQRTE and FRECPE",
  42. "This option improves the speed of some approximate floating-point functions by using "
  43. "less accurate native approximations.");
  44. INSERT(Settings, cpuopt_unsafe_ignore_standard_fpcr, "Faster ASIMD instructions (32 bits only)",
  45. "This option improves the speed of 32 bits ASIMD floating-point functions by running "
  46. "with incorrect rounding modes.");
  47. INSERT(Settings, cpuopt_unsafe_inaccurate_nan, "Inaccurate NaN handling",
  48. "This option improves speed by removing NaN checking. Please note this also reduces "
  49. "accuracy of certain floating-point instructions.");
  50. INSERT(
  51. Settings, cpuopt_unsafe_fastmem_check, "Disable address space checks",
  52. "This option improves speed by eliminating a safety check before every memory read/write "
  53. "in guest. Disabling it may allow a game to read/write the emulator's memory.");
  54. INSERT(Settings, cpuopt_unsafe_ignore_global_monitor, "Ignore global monitor",
  55. "This option improves speed by relying only on the semantics of cmpxchg to ensure "
  56. "safety of exclusive access instructions. Please note this may result in deadlocks and "
  57. "other race conditions.");
  58. // Renderer
  59. INSERT(Settings, renderer_backend, "API:", "");
  60. INSERT(Settings, vulkan_device, "Device:", "");
  61. INSERT(Settings, shader_backend, "Shader Backend:", "");
  62. INSERT(Settings, resolution_setup, "Resolution:", "");
  63. INSERT(Settings, scaling_filter, "Window Adapting Filter:", "");
  64. INSERT(Settings, fsr_sharpening_slider, "AMD FidelityFX™ Super Resolution Sharpness:", "");
  65. INSERT(Settings, anti_aliasing, "Anti-Aliasing Method:", "");
  66. INSERT(Settings, fullscreen_mode, "Fullscreen Mode:", "");
  67. INSERT(Settings, aspect_ratio, "Aspect Ratio:", "");
  68. INSERT(Settings, use_disk_shader_cache, "Use disk pipeline cache", "");
  69. INSERT(Settings, use_asynchronous_gpu_emulation, "Use asynchronous GPU emulation", "");
  70. INSERT(Settings, nvdec_emulation, "NVDEC emulation:", "");
  71. INSERT(Settings, accelerate_astc, "ASTC Decoding Method:", "");
  72. INSERT(Settings, vsync_mode, "VSync Mode:",
  73. "FIFO (VSync) does not drop frames or exhibit tearing but is limited by the screen "
  74. "refresh rate.\nFIFO Relaxed is similar to FIFO but allows tearing as it recovers from "
  75. "a slow down.\nMailbox can have lower latency than FIFO and does not tear but may drop "
  76. "frames.\nImmediate (no synchronization) just presents whatever is available and can "
  77. "exhibit tearing.");
  78. INSERT(Settings, bg_red, "", "");
  79. INSERT(Settings, bg_green, "", "");
  80. INSERT(Settings, bg_blue, "", "");
  81. // Renderer (Advanced Graphics)
  82. INSERT(Settings, async_presentation, "Enable asynchronous presentation (Vulkan only)", "");
  83. INSERT(Settings, renderer_force_max_clock, "Force maximum clocks (Vulkan only)",
  84. "Runs work in the background while waiting for graphics commands to keep the GPU from "
  85. "lowering its clock speed.");
  86. INSERT(Settings, max_anisotropy, "Anisotropic Filtering:", "");
  87. INSERT(Settings, gpu_accuracy, "Accuracy Level:", "");
  88. INSERT(Settings, use_asynchronous_shaders, "Use asynchronous shader building (Hack)",
  89. "Enables asynchronous shader compilation, which may reduce shader stutter. This feature "
  90. "is experimental.");
  91. INSERT(Settings, use_fast_gpu_time, "Use Fast GPU Time (Hack)",
  92. "Enables Fast GPU Time. This option will force most games to run at their highest "
  93. "native resolution.");
  94. INSERT(Settings, use_vulkan_driver_pipeline_cache, "Use Vulkan pipeline cache",
  95. "Enables GPU vendor-specific pipeline cache. This option can improve shader loading "
  96. "time significantly in cases where the Vulkan driver does not store pipeline cache "
  97. "files internally.");
  98. INSERT(Settings, enable_compute_pipelines, "Enable Compute Pipelines (Intel Vulkan Only)",
  99. "Enable compute pipelines, required by some games.\nThis setting only exists for Intel "
  100. "proprietary drivers, and may crash if enabled.\nCompute pipelines are always enabled "
  101. "on all other drivers.");
  102. INSERT(Settings, use_reactive_flushing, "Enable Reactive Flushing",
  103. "Uses reactive flushing instead of predictive flushing, allowing more accurate memory "
  104. "syncing.");
  105. // Renderer (Debug)
  106. // Renderer (General)
  107. INSERT(Settings, use_speed_limit, "", "");
  108. INSERT(Settings, speed_limit, "Limit Speed Percent", "");
  109. // System
  110. INSERT(Settings, rng_seed, "RNG Seed", "");
  111. INSERT(Settings, rng_seed_enabled, "", "");
  112. INSERT(Settings, device_name, "Device Name", "");
  113. INSERT(Settings, custom_rtc, "Custom RTC", "");
  114. INSERT(Settings, custom_rtc_enabled, "", "");
  115. INSERT(Settings, language_index,
  116. "Language:", "Note: this can be overridden when region setting is auto-select");
  117. INSERT(Settings, region_index, "Region:", "");
  118. INSERT(Settings, time_zone_index, "Time Zone:", "");
  119. INSERT(Settings, sound_index, "Sound Output Mode:", "");
  120. INSERT(Settings, use_docked_mode, "", "");
  121. INSERT(Settings, current_user, "", "");
  122. // Controls
  123. // Data Storage
  124. // Debugging
  125. // Debugging Graphics
  126. // Network
  127. // Web Service
  128. // Ui
  129. // Ui General
  130. INSERT(UISettings, select_user_on_boot, "Prompt for user on game boot", "");
  131. INSERT(UISettings, pause_when_in_background, "Pause emulation when in background", "");
  132. INSERT(UISettings, confirm_before_closing, "Confirm exit while emulation is running", "");
  133. INSERT(UISettings, hide_mouse, "Hide mouse on inactivity", "");
  134. // Ui Debugging
  135. // Ui Multiplayer
  136. // Ui Games list
  137. #undef INSERT
  138. return translations;
  139. }
  140. std::unique_ptr<ComboboxTranslationMap> ComboboxEnumeration(QWidget* parent) {
  141. std::unique_ptr<ComboboxTranslationMap> translations =
  142. std::make_unique<ComboboxTranslationMap>();
  143. const auto& tr = [&](const char* text) { return parent->tr(text); };
  144. // Intentionally skipping VSyncMode to let the UI fill that one out
  145. translations->insert(
  146. {typeid(Settings::AstcDecodeMode),
  147. {
  148. {static_cast<u32>(Settings::AstcDecodeMode::CPU), tr("CPU")},
  149. {static_cast<u32>(Settings::AstcDecodeMode::GPU), tr("GPU")},
  150. {static_cast<u32>(Settings::AstcDecodeMode::CPUAsynchronous), tr("CPU Asynchronous")},
  151. }});
  152. translations->insert({typeid(Settings::RendererBackend),
  153. {
  154. #ifdef HAS_OPENGL
  155. {static_cast<u32>(Settings::RendererBackend::OpenGL), tr("OpenGL")},
  156. #endif
  157. {static_cast<u32>(Settings::RendererBackend::Vulkan), tr("Vulkan")},
  158. {static_cast<u32>(Settings::RendererBackend::Null), tr("Null")},
  159. }});
  160. translations->insert({typeid(Settings::ShaderBackend),
  161. {
  162. {static_cast<u32>(Settings::ShaderBackend::GLSL), tr("GLSL")},
  163. {static_cast<u32>(Settings::ShaderBackend::GLASM),
  164. tr("GLASM (Assembly Shaders, NVIDIA Only)")},
  165. {static_cast<u32>(Settings::ShaderBackend::SPIRV),
  166. tr("SPIR-V (Experimental, Mesa Only)")},
  167. }});
  168. translations->insert({typeid(Settings::GPUAccuracy),
  169. {
  170. {static_cast<u32>(Settings::GPUAccuracy::Normal), tr("Normal")},
  171. {static_cast<u32>(Settings::GPUAccuracy::High), tr("High")},
  172. {static_cast<u32>(Settings::GPUAccuracy::Extreme), tr("Extreme")},
  173. }});
  174. translations->insert({typeid(Settings::CPUAccuracy),
  175. {
  176. {static_cast<u32>(Settings::CPUAccuracy::Auto), tr("Auto")},
  177. {static_cast<u32>(Settings::CPUAccuracy::Accurate), tr("Accurate")},
  178. {static_cast<u32>(Settings::CPUAccuracy::Unsafe), tr("Unsafe")},
  179. {static_cast<u32>(Settings::CPUAccuracy::Paranoid),
  180. tr("Paranoid (disables most optimizations)")},
  181. }});
  182. translations->insert(
  183. {typeid(Settings::FullscreenMode),
  184. {
  185. {static_cast<u32>(Settings::FullscreenMode::Borderless), tr("Borderless Windowed")},
  186. {static_cast<u32>(Settings::FullscreenMode::Exclusive), tr("Exclusive Fullscreen")},
  187. }});
  188. translations->insert(
  189. {typeid(Settings::NvdecEmulation),
  190. {
  191. {static_cast<u32>(Settings::NvdecEmulation::Off), tr("No Video Output")},
  192. {static_cast<u32>(Settings::NvdecEmulation::CPU), tr("CPU Video Decoding")},
  193. {static_cast<u32>(Settings::NvdecEmulation::GPU), tr("GPU Video Decoding (Default)")},
  194. }});
  195. translations->insert(
  196. {typeid(Settings::ResolutionSetup),
  197. {
  198. {static_cast<u32>(Settings::ResolutionSetup::Res1_2X),
  199. tr("0.5X (360p/540p) [EXPERIMENTAL]")},
  200. {static_cast<u32>(Settings::ResolutionSetup::Res3_4X),
  201. tr("0.75X (540p/810p) [EXPERIMENTAL]")},
  202. {static_cast<u32>(Settings::ResolutionSetup::Res1X), tr("1X (720p/1080p)")},
  203. {static_cast<u32>(Settings::ResolutionSetup::Res3_2X),
  204. tr("1.5X (1080p/1620p) [EXPERIMENTAL]")},
  205. {static_cast<u32>(Settings::ResolutionSetup::Res2X), tr("2X (1440p/2160p)")},
  206. {static_cast<u32>(Settings::ResolutionSetup::Res3X), tr("3X (2160p/3240p)")},
  207. {static_cast<u32>(Settings::ResolutionSetup::Res4X), tr("4X (2880p/4320p)")},
  208. {static_cast<u32>(Settings::ResolutionSetup::Res5X), tr("5X (3600p/5400p)")},
  209. {static_cast<u32>(Settings::ResolutionSetup::Res6X), tr("6X (4320p/6480p)")},
  210. {static_cast<u32>(Settings::ResolutionSetup::Res7X), tr("7X (5040p/7560p)")},
  211. {static_cast<u32>(Settings::ResolutionSetup::Res8X), tr("8X (5760p/8640p)")},
  212. }});
  213. translations->insert(
  214. {typeid(Settings::ScalingFilter),
  215. {
  216. {static_cast<u32>(Settings::ScalingFilter::NearestNeighbor), tr("Nearest Neighbor")},
  217. {static_cast<u32>(Settings::ScalingFilter::Bilinear), tr("Bilinear")},
  218. {static_cast<u32>(Settings::ScalingFilter::Bicubic), tr("Bicubic")},
  219. {static_cast<u32>(Settings::ScalingFilter::Gaussian), tr("Gaussian")},
  220. {static_cast<u32>(Settings::ScalingFilter::ScaleForce), tr("ScaleForce")},
  221. {static_cast<u32>(Settings::ScalingFilter::Fsr),
  222. tr("AMD FidelityFX™️ Super Resolution")},
  223. }});
  224. translations->insert({typeid(Settings::AntiAliasing),
  225. {
  226. {static_cast<u32>(Settings::AntiAliasing::None), tr("None")},
  227. {static_cast<u32>(Settings::AntiAliasing::Fxaa), tr("FXAA")},
  228. {static_cast<u32>(Settings::AntiAliasing::Smaa), tr("SMAA")},
  229. }});
  230. translations->insert(
  231. {typeid(Settings::AspectRatio),
  232. {
  233. {static_cast<u32>(Settings::AspectRatio::R16_9), tr("Default (16:9)")},
  234. {static_cast<u32>(Settings::AspectRatio::R4_3), tr("Force 4:3")},
  235. {static_cast<u32>(Settings::AspectRatio::R21_9), tr("Force 21:9")},
  236. {static_cast<u32>(Settings::AspectRatio::R16_10), tr("Force 16:10")},
  237. {static_cast<u32>(Settings::AspectRatio::Stretch), tr("Stretch to Window")},
  238. }});
  239. translations->insert(
  240. {typeid(Settings::AnisotropyMode),
  241. {
  242. {static_cast<u32>(Settings::AnisotropyMode::Automatic), tr("Automatic")},
  243. {static_cast<u32>(Settings::AnisotropyMode::Default), tr("Default")},
  244. {static_cast<u32>(Settings::AnisotropyMode::X2), tr("2x")},
  245. {static_cast<u32>(Settings::AnisotropyMode::X4), tr("4x")},
  246. {static_cast<u32>(Settings::AnisotropyMode::X8), tr("8x")},
  247. {static_cast<u32>(Settings::AnisotropyMode::X16), tr("16x")},
  248. }});
  249. translations->insert(
  250. {typeid(Settings::Language),
  251. {
  252. {static_cast<u32>(Settings::Language::Japanese), tr("Japanese (日本語)")},
  253. {static_cast<u32>(Settings::Language::EnglishAmerican), tr("American English")},
  254. {static_cast<u32>(Settings::Language::French), tr("French (français)")},
  255. {static_cast<u32>(Settings::Language::German), tr("German (Deutsch)")},
  256. {static_cast<u32>(Settings::Language::Italian), tr("Italian (italiano)")},
  257. {static_cast<u32>(Settings::Language::Spanish), tr("Spanish (español)")},
  258. {static_cast<u32>(Settings::Language::Chinese), tr("Chinese")},
  259. {static_cast<u32>(Settings::Language::Korean), tr("Korean (한국어)")},
  260. {static_cast<u32>(Settings::Language::Dutch), tr("Dutch (Nederlands)")},
  261. {static_cast<u32>(Settings::Language::Portuguese), tr("Portuguese (português)")},
  262. {static_cast<u32>(Settings::Language::Russian), tr("Russian (Русский)")},
  263. {static_cast<u32>(Settings::Language::Taiwanese), tr("Taiwanese")},
  264. {static_cast<u32>(Settings::Language::EnglishBritish), tr("British English")},
  265. {static_cast<u32>(Settings::Language::FrenchCanadian), tr("Canadian French")},
  266. {static_cast<u32>(Settings::Language::SpanishLatin), tr("Latin American Spanish")},
  267. {static_cast<u32>(Settings::Language::ChineseSimplified), tr("Simplified Chinese")},
  268. {static_cast<u32>(Settings::Language::ChineseTraditional),
  269. tr("Traditional Chinese (正體中文)")},
  270. {static_cast<u32>(Settings::Language::PortugueseBrazilian),
  271. tr("Brazilian Portuguese (português do Brasil)")},
  272. }});
  273. translations->insert({typeid(Settings::Region),
  274. {
  275. {static_cast<u32>(Settings::Region::Japan), tr("Japan")},
  276. {static_cast<u32>(Settings::Region::USA), tr("USA")},
  277. {static_cast<u32>(Settings::Region::Europe), tr("Europe")},
  278. {static_cast<u32>(Settings::Region::Australia), tr("Australia")},
  279. {static_cast<u32>(Settings::Region::China), tr("China")},
  280. {static_cast<u32>(Settings::Region::Korea), tr("Korea")},
  281. {static_cast<u32>(Settings::Region::Taiwan), tr("Taiwan")},
  282. }});
  283. translations->insert({typeid(Settings::TimeZone),
  284. {
  285. {static_cast<u32>(Settings::TimeZone::Auto), tr("Auto")},
  286. {static_cast<u32>(Settings::TimeZone::Default), tr("Default")},
  287. {static_cast<u32>(Settings::TimeZone::CET), tr("CET")},
  288. {static_cast<u32>(Settings::TimeZone::CST6CDT), tr("CST6CDT")},
  289. {static_cast<u32>(Settings::TimeZone::Cuba), tr("Cuba")},
  290. {static_cast<u32>(Settings::TimeZone::EET), tr("EET")},
  291. {static_cast<u32>(Settings::TimeZone::Egypt), tr("Egypt")},
  292. {static_cast<u32>(Settings::TimeZone::Eire), tr("Eire")},
  293. {static_cast<u32>(Settings::TimeZone::EST), tr("EST")},
  294. {static_cast<u32>(Settings::TimeZone::EST5EDT), tr("EST5EDT")},
  295. {static_cast<u32>(Settings::TimeZone::GB), tr("GB")},
  296. {static_cast<u32>(Settings::TimeZone::GBEire), tr("GB-Eire")},
  297. {static_cast<u32>(Settings::TimeZone::GMT), tr("GMT")},
  298. {static_cast<u32>(Settings::TimeZone::GMTPlusZero), tr("GMT+0")},
  299. {static_cast<u32>(Settings::TimeZone::GMTMinusZero), tr("GMT-0")},
  300. {static_cast<u32>(Settings::TimeZone::GMTZero), tr("GMT0")},
  301. {static_cast<u32>(Settings::TimeZone::Greenwich), tr("Greenwich")},
  302. {static_cast<u32>(Settings::TimeZone::Hongkong), tr("Hongkong")},
  303. {static_cast<u32>(Settings::TimeZone::HST), tr("HST")},
  304. {static_cast<u32>(Settings::TimeZone::Iceland), tr("Iceland")},
  305. {static_cast<u32>(Settings::TimeZone::Iran), tr("Iran")},
  306. {static_cast<u32>(Settings::TimeZone::Israel), tr("Israel")},
  307. {static_cast<u32>(Settings::TimeZone::Jamaica), tr("Jamaica")},
  308. {static_cast<u32>(Settings::TimeZone::Kwajalein), tr("Kwajalein")},
  309. {static_cast<u32>(Settings::TimeZone::Libya), tr("Libya")},
  310. {static_cast<u32>(Settings::TimeZone::MET), tr("MET")},
  311. {static_cast<u32>(Settings::TimeZone::MST), tr("MST")},
  312. {static_cast<u32>(Settings::TimeZone::MST7MDT), tr("MST7MDT")},
  313. {static_cast<u32>(Settings::TimeZone::Navajo), tr("Navajo")},
  314. {static_cast<u32>(Settings::TimeZone::NZ), tr("NZ")},
  315. {static_cast<u32>(Settings::TimeZone::NZCHAT), tr("NZ-CHAT")},
  316. {static_cast<u32>(Settings::TimeZone::Poland), tr("Poland")},
  317. {static_cast<u32>(Settings::TimeZone::Portugal), tr("Portugal")},
  318. {static_cast<u32>(Settings::TimeZone::PRC), tr("PRC")},
  319. {static_cast<u32>(Settings::TimeZone::PST8PDT), tr("PST8PDT")},
  320. {static_cast<u32>(Settings::TimeZone::ROC), tr("ROC")},
  321. {static_cast<u32>(Settings::TimeZone::ROK), tr("ROK")},
  322. {static_cast<u32>(Settings::TimeZone::Singapore), tr("Singapore")},
  323. {static_cast<u32>(Settings::TimeZone::Turkey), tr("Turkey")},
  324. {static_cast<u32>(Settings::TimeZone::UCT), tr("UCT")},
  325. {static_cast<u32>(Settings::TimeZone::W_SU), tr("W-SU")},
  326. {static_cast<u32>(Settings::TimeZone::WET), tr("WET")},
  327. {static_cast<u32>(Settings::TimeZone::Zulu), tr("Zulu")},
  328. }});
  329. translations->insert({typeid(Settings::AudioMode),
  330. {
  331. {static_cast<u32>(Settings::AudioMode::Mono), tr("Mono")},
  332. {static_cast<u32>(Settings::AudioMode::Stereo), tr("Stereo")},
  333. {static_cast<u32>(Settings::AudioMode::Surround), tr("Surround")},
  334. }});
  335. return translations;
  336. }
  337. } // namespace ConfigurationShared