mirror of
https://github.com/WinampDesktop/winamp.git
synced 2025-06-18 05:55:45 -04:00
Support translating strings in emulator core
This commit is contained in:
@ -53,8 +53,12 @@ bool AnalogController::DoState(StateWrapper& sw)
|
||||
|
||||
if (old_analog_mode != m_analog_mode)
|
||||
{
|
||||
g_host_interface->AddFormattedOSDMessage(5.0f, "Controller %u switched to %s mode.", m_index + 1u,
|
||||
m_analog_mode ? "analog" : "digital");
|
||||
g_host_interface->AddFormattedOSDMessage(
|
||||
5.0f,
|
||||
m_analog_mode ?
|
||||
g_host_interface->TranslateString("AnalogController", "Controller %u switched to analog mode.") :
|
||||
g_host_interface->TranslateString("AnalogController", "Controller %u switched to digital mode."),
|
||||
m_index + 1u);
|
||||
}
|
||||
}
|
||||
return true;
|
||||
@ -95,8 +99,13 @@ void AnalogController::SetButtonState(Button button, bool pressed)
|
||||
{
|
||||
if (m_analog_locked)
|
||||
{
|
||||
g_host_interface->AddFormattedOSDMessage(5.0f, "Controller %u is locked to %s mode by the game.", m_index + 1u,
|
||||
m_analog_mode ? "analog" : "digital");
|
||||
g_host_interface->AddFormattedOSDMessage(
|
||||
5.0f,
|
||||
m_analog_mode ? g_host_interface->TranslateString("AnalogController",
|
||||
"Controller %u is locked to analog mode by the game.") :
|
||||
g_host_interface->TranslateString("AnalogController",
|
||||
"Controller %u is locked to digital mode by the game."),
|
||||
m_index + 1u);
|
||||
}
|
||||
else
|
||||
{
|
||||
@ -155,8 +164,11 @@ void AnalogController::SetAnalogMode(bool enabled)
|
||||
return;
|
||||
|
||||
Log_InfoPrintf("Controller %u switched to %s mode.", m_index + 1u, enabled ? "analog" : "digital");
|
||||
g_host_interface->AddFormattedOSDMessage(5.0f, "Controller %u switched to %s mode.", m_index + 1u,
|
||||
enabled ? "analog" : "digital");
|
||||
g_host_interface->AddFormattedOSDMessage(
|
||||
5.0f,
|
||||
enabled ? g_host_interface->TranslateString("AnalogController", "Controller %u switched to analog mode.") :
|
||||
g_host_interface->TranslateString("AnalogController", "Controller %u switched to digital mode."),
|
||||
m_index + 1u);
|
||||
m_analog_mode = enabled;
|
||||
}
|
||||
|
||||
|
@ -8,6 +8,7 @@
|
||||
#include "common/log.h"
|
||||
#include "common/progress_callback.h"
|
||||
#include "common/string_util.h"
|
||||
#include "host_interface.h"
|
||||
#include "settings.h"
|
||||
#include <algorithm>
|
||||
#include <array>
|
||||
@ -270,7 +271,12 @@ std::vector<std::string> GameList::ParseM3UFile(const char* path)
|
||||
const char* GameList::GetGameListCompatibilityRatingString(GameListCompatibilityRating rating)
|
||||
{
|
||||
static constexpr std::array<const char*, static_cast<size_t>(GameListCompatibilityRating::Count)> names = {
|
||||
{"Unknown", "Doesn't Boot", "Crashes In Intro", "Crashes In-Game", "Graphical/Audio Issues", "No Issues"}};
|
||||
{TRANSLATABLE("GameListCompatibilityRating", "Unknown"),
|
||||
TRANSLATABLE("GameListCompatibilityRating", "Doesn't Boot"),
|
||||
TRANSLATABLE("GameListCompatibilityRating", "Crashes In Intro"),
|
||||
TRANSLATABLE("GameListCompatibilityRating", "Crashes In-Game"),
|
||||
TRANSLATABLE("GameListCompatibilityRating", "Graphical/Audio Issues"),
|
||||
TRANSLATABLE("GameListCompatibilityRating", "No Issues")}};
|
||||
return (rating >= GameListCompatibilityRating::Unknown && rating < GameListCompatibilityRating::Count) ?
|
||||
names[static_cast<int>(rating)] :
|
||||
"";
|
||||
|
@ -19,19 +19,19 @@ Log_SetChannel(GameSettings);
|
||||
namespace GameSettings {
|
||||
|
||||
std::array<std::pair<const char*, const char*>, static_cast<u32>(Trait::Count)> s_trait_names = {{
|
||||
{"ForceInterpreter", "Force Interpreter"},
|
||||
{"ForceSoftwareRenderer", "Force Software Renderer"},
|
||||
{"EnableInterlacing", "Enable Interlacing"},
|
||||
{"DisableTrueColor", "Disable True Color"},
|
||||
{"DisableUpscaling", "Disable Upscaling"},
|
||||
{"DisableScaledDithering", "Disable Scaled Dithering"},
|
||||
{"DisableWidescreen", "Disable Widescreen"},
|
||||
{"DisablePGXP", "Disable PGXP"},
|
||||
{"DisablePGXPCulling", "Disable PGXP Culling"},
|
||||
{"EnablePGXPVertexCache", "Enable PGXP Vertex Cache"},
|
||||
{"EnablePGXPCPUMode", "Enable PGXP CPU Mode"},
|
||||
{"ForceDigitalController", "Force Digital Controller"},
|
||||
{"EnableRecompilerMemoryExceptions", "Enable Recompiler Memory Exceptions"},
|
||||
{"ForceInterpreter", TRANSLATABLE("GameSettingsTrait", "Force Interpreter")},
|
||||
{"ForceSoftwareRenderer", TRANSLATABLE("GameSettingsTrait", "Force Software Renderer")},
|
||||
{"EnableInterlacing", TRANSLATABLE("GameSettingsTrait", "Enable Interlacing")},
|
||||
{"DisableTrueColor", TRANSLATABLE("GameSettingsTrait", "Disable True Color")},
|
||||
{"DisableUpscaling", TRANSLATABLE("GameSettingsTrait", "Disable Upscaling")},
|
||||
{"DisableScaledDithering", TRANSLATABLE("GameSettingsTrait", "Disable Scaled Dithering")},
|
||||
{"DisableWidescreen", TRANSLATABLE("GameSettingsTrait", "Disable Widescreen")},
|
||||
{"DisablePGXP", TRANSLATABLE("GameSettingsTrait", "Disable PGXP")},
|
||||
{"DisablePGXPCulling", TRANSLATABLE("GameSettingsTrait", "Disable PGXP Culling")},
|
||||
{"EnablePGXPVertexCache", TRANSLATABLE("GameSettingsTrait", "Enable PGXP Vertex Cache")},
|
||||
{"EnablePGXPCPUMode", TRANSLATABLE("GameSettingsTrait", "Enable PGXP CPU Mode")},
|
||||
{"ForceDigitalController", TRANSLATABLE("GameSettingsTrait", "Force Digital Controller")},
|
||||
{"EnableRecompilerMemoryExceptions", TRANSLATABLE("GameSettingsTrait", "Enable Recompiler Memory Exceptions")},
|
||||
}};
|
||||
|
||||
const char* GetTraitName(Trait trait)
|
||||
|
@ -114,7 +114,7 @@ void HostInterface::ResetSystem()
|
||||
{
|
||||
System::Reset();
|
||||
System::ResetPerformanceCounters();
|
||||
AddOSDMessage("System reset.");
|
||||
AddOSDMessage(TranslateStdString("OSDMessage", "System reset."));
|
||||
}
|
||||
|
||||
void HostInterface::PowerOffSystem()
|
||||
@ -284,13 +284,13 @@ bool HostInterface::LoadState(const char* filename)
|
||||
if (!stream)
|
||||
return false;
|
||||
|
||||
AddFormattedOSDMessage(5.0f, "Loading state from '%s'...", filename);
|
||||
AddFormattedOSDMessage(5.0f, TranslateString("OSDMessage", "Loading state from '%s'..."), filename);
|
||||
|
||||
if (!System::IsShutdown())
|
||||
{
|
||||
if (!System::LoadState(stream.get()))
|
||||
{
|
||||
ReportFormattedError("Loading state from '%s' failed. Resetting.", filename);
|
||||
ReportFormattedError(TranslateString("OSDMessage", "Loading state from '%s' failed. Resetting."), filename);
|
||||
ResetSystem();
|
||||
return false;
|
||||
}
|
||||
@ -318,12 +318,12 @@ bool HostInterface::SaveState(const char* filename)
|
||||
const bool result = System::SaveState(stream.get());
|
||||
if (!result)
|
||||
{
|
||||
ReportFormattedError("Saving state to '%s' failed.", filename);
|
||||
ReportFormattedError(TranslateString("OSDMessage", "Saving state to '%s' failed."), filename);
|
||||
stream->Discard();
|
||||
}
|
||||
else
|
||||
{
|
||||
AddFormattedOSDMessage(5.0f, "State saved to '%s'.", filename);
|
||||
AddFormattedOSDMessage(5.0f, TranslateString("OSDMessage", "State saved to '%s'."), filename);
|
||||
stream->Commit();
|
||||
}
|
||||
|
||||
@ -451,13 +451,20 @@ void HostInterface::FixIncompatibleSettings(bool display_osd_messages)
|
||||
if (g_settings.gpu_renderer == GPURenderer::Software)
|
||||
{
|
||||
if (display_osd_messages)
|
||||
AddOSDMessage("PGXP is incompatible with the software renderer, disabling PGXP.", 10.0f);
|
||||
{
|
||||
AddOSDMessage(TranslateStdString("OSDMessage", "PGXP is incompatible with the software renderer, disabling PGXP."), 10.0f);
|
||||
}
|
||||
g_settings.gpu_pgxp_enable = false;
|
||||
}
|
||||
else if (g_settings.gpu_pgxp_cpu && g_settings.cpu_execution_mode == CPUExecutionMode::Recompiler)
|
||||
{
|
||||
if (display_osd_messages)
|
||||
AddOSDMessage("PGXP CPU mode is incompatible with the recompiler, using Cached Interpreter instead.", 10.0f);
|
||||
{
|
||||
AddOSDMessage(
|
||||
TranslateStdString("OSDMessage",
|
||||
"PGXP CPU mode is incompatible with the recompiler, using Cached Interpreter instead."),
|
||||
10.0f);
|
||||
}
|
||||
g_settings.cpu_execution_mode = CPUExecutionMode::CachedInterpreter;
|
||||
}
|
||||
}
|
||||
@ -683,6 +690,16 @@ float HostInterface::GetFloatSettingValue(const char* section, const char* key,
|
||||
return float_value.value_or(default_value);
|
||||
}
|
||||
|
||||
TinyString HostInterface::TranslateString(const char* context, const char* str) const
|
||||
{
|
||||
return str;
|
||||
}
|
||||
|
||||
std::string HostInterface::TranslateStdString(const char* context, const char* str) const
|
||||
{
|
||||
return str;
|
||||
}
|
||||
|
||||
void HostInterface::ToggleSoftwareRendering()
|
||||
{
|
||||
if (System::IsShutdown() || g_settings.gpu_renderer == GPURenderer::Software)
|
||||
|
@ -109,6 +109,10 @@ public:
|
||||
/// Returns a float setting from the configuration.
|
||||
virtual float GetFloatSettingValue(const char* section, const char* key, float default_value = 0.0f);
|
||||
|
||||
/// Translates a string to the current language.
|
||||
virtual TinyString TranslateString(const char* context, const char* str) const;
|
||||
virtual std::string TranslateStdString(const char* context, const char* str) const;
|
||||
|
||||
/// Loads the BIOS image for the specified region.
|
||||
std::optional<std::vector<u8>> GetBIOSImage(ConsoleRegion region);
|
||||
|
||||
@ -164,4 +168,6 @@ protected:
|
||||
std::string m_user_directory;
|
||||
};
|
||||
|
||||
#define TRANSLATABLE(context, str) str
|
||||
|
||||
extern HostInterface* g_host_interface;
|
||||
|
@ -291,7 +291,10 @@ void Settings::Save(SettingsInterface& si) const
|
||||
static std::array<const char*, LOGLEVEL_COUNT> s_log_level_names = {
|
||||
{"None", "Error", "Warning", "Perf", "Success", "Info", "Dev", "Profile", "Debug", "Trace"}};
|
||||
static std::array<const char*, LOGLEVEL_COUNT> s_log_level_display_names = {
|
||||
{"None", "Error", "Warning", "Performance", "Success", "Information", "Developer", "Profile", "Debug", "Trace"}};
|
||||
{TRANSLATABLE("LogLevel", "None"), TRANSLATABLE("LogLevel", "Error"), TRANSLATABLE("LogLevel", "Warning"),
|
||||
TRANSLATABLE("LogLevel", "Performance"), TRANSLATABLE("LogLevel", "Success"),
|
||||
TRANSLATABLE("LogLevel", "Information"), TRANSLATABLE("LogLevel", "Developer"), TRANSLATABLE("LogLevel", "Profile"),
|
||||
TRANSLATABLE("LogLevel", "Debug"), TRANSLATABLE("LogLevel", "Trace")}};
|
||||
|
||||
std::optional<LOGLEVEL> Settings::ParseLogLevelName(const char* str)
|
||||
{
|
||||
@ -319,7 +322,8 @@ const char* Settings::GetLogLevelDisplayName(LOGLEVEL level)
|
||||
|
||||
static std::array<const char*, 4> s_console_region_names = {{"Auto", "NTSC-J", "NTSC-U", "PAL"}};
|
||||
static std::array<const char*, 4> s_console_region_display_names = {
|
||||
{"Auto-Detect", "NTSC-J (Japan)", "NTSC-U (US)", "PAL (Europe, Australia)"}};
|
||||
{TRANSLATABLE("ConsoleRegion", "Auto-Detect"), TRANSLATABLE("ConsoleRegion", "NTSC-J (Japan)"),
|
||||
TRANSLATABLE("ConsoleRegion", "NTSC-U (US)"), TRANSLATABLE("ConsoleRegion", "PAL (Europe, Australia)")}};
|
||||
|
||||
std::optional<ConsoleRegion> Settings::ParseConsoleRegionName(const char* str)
|
||||
{
|
||||
@ -347,7 +351,8 @@ const char* Settings::GetConsoleRegionDisplayName(ConsoleRegion region)
|
||||
|
||||
static std::array<const char*, 4> s_disc_region_names = {{"NTSC-J", "NTSC-U", "PAL", "Other"}};
|
||||
static std::array<const char*, 4> s_disc_region_display_names = {
|
||||
{"NTSC-J (Japan)", "NTSC-U (US)", "PAL (Europe, Australia)", "Other"}};
|
||||
{TRANSLATABLE("DiscRegion", "NTSC-J (Japan)"), TRANSLATABLE("DiscRegion", "NTSC-U (US)"),
|
||||
TRANSLATABLE("DiscRegion", "PAL (Europe, Australia)"), TRANSLATABLE("DiscRegion", "Other")}};
|
||||
|
||||
std::optional<DiscRegion> Settings::ParseDiscRegionName(const char* str)
|
||||
{
|
||||
@ -375,7 +380,8 @@ const char* Settings::GetDiscRegionDisplayName(DiscRegion region)
|
||||
|
||||
static std::array<const char*, 3> s_cpu_execution_mode_names = {{"Interpreter", "CachedInterpreter", "Recompiler"}};
|
||||
static std::array<const char*, 3> s_cpu_execution_mode_display_names = {
|
||||
{"Intepreter (Slowest)", "Cached Interpreter (Faster)", "Recompiler (Fastest)"}};
|
||||
{TRANSLATABLE("CPUExecutionMode", "Intepreter (Slowest)"), TRANSLATABLE("CPUExecutionMode", "Cached Interpreter (Faster)"),
|
||||
TRANSLATABLE("CPUExecutionMode", "Recompiler (Fastest)")}};
|
||||
|
||||
std::optional<CPUExecutionMode> Settings::ParseCPUExecutionMode(const char* str)
|
||||
{
|
||||
@ -408,9 +414,10 @@ static std::array<const char*, 4> s_gpu_renderer_names = {{
|
||||
"Vulkan", "OpenGL", "Software"}};
|
||||
static std::array<const char*, 4> s_gpu_renderer_display_names = {{
|
||||
#ifdef WIN32
|
||||
"Hardware (D3D11)",
|
||||
TRANSLATABLE("GPURenderer", "Hardware (D3D11)"),
|
||||
#endif
|
||||
"Hardware (Vulkan)", "Hardware (OpenGL)", "Software"}};
|
||||
TRANSLATABLE("GPURenderer", "Hardware (Vulkan)"), TRANSLATABLE("GPURenderer", "Hardware (OpenGL)"),
|
||||
TRANSLATABLE("GPURenderer", "Software")}};
|
||||
|
||||
std::optional<GPURenderer> Settings::ParseRendererName(const char* str)
|
||||
{
|
||||
@ -437,7 +444,9 @@ const char* Settings::GetRendererDisplayName(GPURenderer renderer)
|
||||
}
|
||||
|
||||
static std::array<const char*, 3> s_display_crop_mode_names = {{"None", "Overscan", "Borders"}};
|
||||
static std::array<const char*, 3> s_display_crop_mode_display_names = {{"None", "Only Overscan Area", "All Borders"}};
|
||||
static std::array<const char*, 3> s_display_crop_mode_display_names = {{TRANSLATABLE("DisplayCropMode", "None"),
|
||||
TRANSLATABLE("DisplayCropMode", "Only Overscan Area"),
|
||||
TRANSLATABLE("DisplayCropMode", "All Borders")}};
|
||||
|
||||
std::optional<DisplayCropMode> Settings::ParseDisplayCropMode(const char* str)
|
||||
{
|
||||
@ -493,7 +502,8 @@ float Settings::GetDisplayAspectRatioValue(DisplayAspectRatio ar)
|
||||
}
|
||||
|
||||
static std::array<const char*, 3> s_audio_backend_names = {{"Null", "Cubeb", "SDL"}};
|
||||
static std::array<const char*, 3> s_audio_backend_display_names = {{"Null (No Output)", "Cubeb", "SDL"}};
|
||||
static std::array<const char*, 3> s_audio_backend_display_names = {
|
||||
{TRANSLATABLE("AudioBackend", "Null (No Output)"), TRANSLATABLE("AudioBackend", "Cubeb"), TRANSLATABLE("AudioBackend", "SDL")}};
|
||||
|
||||
std::optional<AudioBackend> Settings::ParseAudioBackend(const char* str)
|
||||
{
|
||||
@ -522,7 +532,9 @@ const char* Settings::GetAudioBackendDisplayName(AudioBackend backend)
|
||||
static std::array<const char*, 6> s_controller_type_names = {
|
||||
{"None", "DigitalController", "AnalogController", "NamcoGunCon", "PlayStationMouse", "NeGcon"}};
|
||||
static std::array<const char*, 6> s_controller_display_names = {
|
||||
{"None", "Digital Controller", "Analog Controller (DualShock)", "Namco GunCon", "PlayStation Mouse", "NeGcon"}};
|
||||
{TRANSLATABLE("ControllerType", "None"), TRANSLATABLE("ControllerType", "Digital Controller"),
|
||||
TRANSLATABLE("ControllerType", "Analog Controller (DualShock)"), TRANSLATABLE("ControllerType", "Namco GunCon"),
|
||||
TRANSLATABLE("ControllerType", "PlayStation Mouse"), TRANSLATABLE("ControllerType", "NeGcon")}};
|
||||
|
||||
std::optional<ControllerType> Settings::ParseControllerTypeName(const char* str)
|
||||
{
|
||||
@ -549,9 +561,10 @@ const char* Settings::GetControllerTypeDisplayName(ControllerType type)
|
||||
}
|
||||
|
||||
static std::array<const char*, 4> s_memory_card_type_names = {{"None", "Shared", "PerGame", "PerGameTitle"}};
|
||||
static std::array<const char*, 4> s_memory_card_type_display_names = {{"No Memory Card", "Shared Between All Games",
|
||||
"Separate Card Per Game (Game Code)",
|
||||
"Separate Card Per Game (Game Title)"}};
|
||||
static std::array<const char*, 4> s_memory_card_type_display_names = {
|
||||
{TRANSLATABLE("MemoryCardType", "No Memory Card"), TRANSLATABLE("MemoryCardType", "Shared Between All Games"),
|
||||
TRANSLATABLE("MemoryCardType", "Separate Card Per Game (Game Code)"),
|
||||
TRANSLATABLE("MemoryCardType", "Separate Card Per Game (Game Title)")}};
|
||||
|
||||
std::optional<MemoryCardType> Settings::ParseMemoryCardTypeName(const char* str)
|
||||
{
|
||||
|
@ -650,8 +650,10 @@ bool DoLoadState(ByteStream* state, bool force_software_renderer)
|
||||
|
||||
if (header.version != SAVE_STATE_VERSION)
|
||||
{
|
||||
g_host_interface->ReportFormattedError("Save state is incompatible: expecting version %u but state is version %u.",
|
||||
SAVE_STATE_VERSION, header.version);
|
||||
g_host_interface->ReportFormattedError(
|
||||
g_host_interface->TranslateString("System",
|
||||
"Save state is incompatible: expecting version %u but state is version %u."),
|
||||
SAVE_STATE_VERSION, header.version);
|
||||
return false;
|
||||
}
|
||||
|
||||
@ -672,8 +674,9 @@ bool DoLoadState(ByteStream* state, bool force_software_renderer)
|
||||
media = OpenCDImage(media_filename.c_str(), false);
|
||||
if (!media)
|
||||
{
|
||||
g_host_interface->ReportFormattedError("Failed to open CD image from save state: '%s'.",
|
||||
media_filename.c_str());
|
||||
g_host_interface->ReportFormattedError(
|
||||
g_host_interface->TranslateString("System", "Failed to open CD image from save state: '%s'."),
|
||||
media_filename.c_str());
|
||||
return false;
|
||||
}
|
||||
}
|
||||
@ -1173,10 +1176,12 @@ void UpdateMemoryCards()
|
||||
{
|
||||
if (s_running_game_code.empty())
|
||||
{
|
||||
g_host_interface->AddFormattedOSDMessage(5.0f,
|
||||
"Per-game memory card cannot be used for slot %u as the running "
|
||||
"game has no code. Using shared card instead.",
|
||||
i + 1u);
|
||||
g_host_interface->AddFormattedOSDMessage(
|
||||
5.0f,
|
||||
g_host_interface->TranslateString("System",
|
||||
"Per-game memory card cannot be used for slot %u as the running "
|
||||
"game has no code. Using shared card instead."),
|
||||
i + 1u);
|
||||
card = MemoryCard::Open(g_host_interface->GetSharedMemoryCardPath(i));
|
||||
}
|
||||
else
|
||||
@ -1195,10 +1200,12 @@ void UpdateMemoryCards()
|
||||
}
|
||||
else if (s_running_game_title.empty())
|
||||
{
|
||||
g_host_interface->AddFormattedOSDMessage(5.0f,
|
||||
"Per-game memory card cannot be used for slot %u as the running "
|
||||
"game has no title. Using shared card instead.",
|
||||
i + 1u);
|
||||
g_host_interface->AddFormattedOSDMessage(
|
||||
5.0f,
|
||||
g_host_interface->TranslateString("System",
|
||||
"Per-game memory card cannot be used for slot %u as the running "
|
||||
"game has no title. Using shared card instead."),
|
||||
i + 1u);
|
||||
card = MemoryCard::Open(g_host_interface->GetSharedMemoryCardPath(i));
|
||||
}
|
||||
else
|
||||
@ -1212,8 +1219,10 @@ void UpdateMemoryCards()
|
||||
{
|
||||
if (g_settings.memory_card_paths[i].empty())
|
||||
{
|
||||
g_host_interface->AddFormattedOSDMessage(10.0f, "Memory card path for slot %u is missing, using default.",
|
||||
i + 1u);
|
||||
g_host_interface->AddFormattedOSDMessage(
|
||||
10.0f,
|
||||
g_host_interface->TranslateString("System", "Memory card path for slot %u is missing, using default."),
|
||||
i + 1u);
|
||||
card = MemoryCard::Open(g_host_interface->GetSharedMemoryCardPath(i));
|
||||
}
|
||||
else
|
||||
@ -1256,7 +1265,8 @@ bool InsertMedia(const char* path)
|
||||
|
||||
if (g_settings.HasAnyPerGameMemoryCards())
|
||||
{
|
||||
g_host_interface->AddOSDMessage("Game changed, reloading memory cards.", 2.0f);
|
||||
g_host_interface->AddOSDMessage(
|
||||
g_host_interface->TranslateStdString("System", "Game changed, reloading memory cards."), 10.0f);
|
||||
UpdateMemoryCards();
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user