#include "stdafx.h" #include "MessageManager.h" std::unordered_map MessageManager::_enResources = { {"Cheats", u8"Cheats"}, {"Debug", u8"Debug"}, {"EmulationSpeed", u8"Emulation Speed"}, {"ClockRate", u8"Clock Rate"}, {"Error", u8"Error"}, {"GameInfo", u8"Game Info"}, {"GameLoaded", u8"Game loaded"}, {"Input", u8"Input"}, {"Patch", u8"Patch"}, {"Movies", u8"Movies"}, {"NetPlay", u8"Net Play"}, {"Overclock", u8"Overclock"}, {"Region", u8"Region"}, {"SaveStates", u8"Save States"}, {"ScreenshotSaved", u8"Screenshot Saved"}, {"SoundRecorder", u8"Sound Recorder"}, {"Test", u8"Test"}, {"VideoRecorder", u8"Video Recorder"}, {"ApplyingPatch", u8"Applying patch: %1"}, {"CheatApplied", u8"1 cheat applied."}, {"CheatsApplied", u8"%1 cheats applied."}, {"CheatsDisabled", u8"All cheats disabled."}, {"CoinInsertedSlot", u8"Coin inserted (slot %1)"}, {"ConnectedToServer", u8"Connected to server."}, {"ConnectedAsPlayer", u8"Connected as player %1"}, {"ConnectedAsSpectator", u8"Connected as spectator."}, {"ConnectionLost", u8"Connection to server lost."}, {"CouldNotConnect", u8"Could not connect to the server."}, {"CouldNotInitializeAudioSystem", u8"Could not initialize audio system"}, {"CouldNotFindRom", u8"Could not find matching game ROM. (%1)"}, {"CouldNotWriteToFile", u8"Could not write to file: %1"}, {"CouldNotLoadFile", u8"Could not load file: %1"}, {"EmulationMaximumSpeed", u8"Maximum speed"}, {"EmulationSpeedPercent", u8"%1%"}, {"FdsDiskInserted", u8"Disk %1 Side %2 inserted."}, {"Frame", u8"Frame"}, {"GameCrash", u8"Game has crashed (%1)"}, {"KeyboardModeDisabled", u8"Keyboard mode disabled."}, {"KeyboardModeEnabled", u8"Keyboard mode enabled."}, {"Lag", u8"Lag"}, {"Mapper", u8"Mapper: %1, SubMapper: %2"}, {"MovieEnded", u8"Movie ended."}, {"MovieInvalid", u8"Invalid movie file."}, {"MovieMissingRom", u8"Missing ROM required (%1) to play movie."}, { "MovieNewerVersion", u8"Cannot load movies created by a more recent version of Mesen-S. Please download the latest version." }, {"MovieIncompatibleVersion", u8"This movie is incompatible with this version of Mesen-S."}, {"MoviePlaying", u8"Playing movie: %1"}, {"MovieRecordingTo", u8"Recording to: %1"}, {"MovieSaved", u8"Movie saved to file: %1"}, {"NetplayVersionMismatch", u8"%1 is not running the same version of Mesen-S and has been disconnected."}, {"NetplayNotAllowed", u8"This action is not allowed while connected to a server."}, {"OverclockEnabled", u8"Overclocking enabled."}, {"OverclockDisabled", u8"Overclocking disabled."}, {"PrgSizeWarning", u8"PRG size is smaller than 32kb"}, {"SaveStateEmpty", u8"Slot is empty."}, {"SaveStateIncompatibleVersion", u8"Save state is incompatible with this version of Mesen-S."}, {"SaveStateInvalidFile", u8"Invalid save state file."}, {"SaveStateWrongSystemSnes", u8"Error: State cannot be loaded (wrong console type: SNES)"}, {"SaveStateWrongSystemGb", u8"Error: State cannot be loaded (wrong console type: Game Boy)"}, {"SaveStateLoaded", u8"State #%1 loaded."}, {"SaveStateMissingRom", u8"Missing ROM required (%1) to load save state."}, { "SaveStateNewerVersion", u8"Cannot load save states created by a more recent version of Mesen-S. Please download the latest version." }, {"SaveStateSaved", u8"State #%1 saved."}, {"SaveStateSlotSelected", u8"Slot #%1 selected."}, {"ScanlineTimingWarning", u8"PPU timing has been changed."}, {"ServerStarted", u8"Server started (Port: %1)"}, {"ServerStopped", u8"Server stopped"}, {"SoundRecorderStarted", u8"Recording to: %1"}, {"SoundRecorderStopped", u8"Recording saved to: %1"}, {"TestFileSavedTo", u8"Test file saved to: %1"}, {"UnsupportedMapper", u8"Unsupported mapper (%1), cannot load game."}, {"VideoRecorderStarted", u8"Recording to: %1"}, {"VideoRecorderStopped", u8"Recording saved to: %1"}, }; std::list MessageManager::_log; SimpleLock MessageManager::_logLock; SimpleLock MessageManager::_messageLock; bool MessageManager::_osdEnabled = true; IMessageManager* MessageManager::_messageManager = nullptr; void MessageManager::RegisterMessageManager(IMessageManager* messageManager) { auto lock = _messageLock.AcquireSafe(); MessageManager::_messageManager = messageManager; } void MessageManager::UnregisterMessageManager(IMessageManager* messageManager) { auto lock = _messageLock.AcquireSafe(); if (MessageManager::_messageManager == messageManager) { MessageManager::_messageManager = nullptr; } } void MessageManager::SetOsdState(bool enabled) { _osdEnabled = enabled; } string MessageManager::Localize(string key) { std::unordered_map* resources = &_enResources; /*switch(EmulationSettings::GetDisplayLanguage()) { case Language::English: resources = &_enResources; break; case Language::French: resources = &_frResources; break; case Language::Japanese: resources = &_jaResources; break; case Language::Russian: resources = &_ruResources; break; case Language::Spanish: resources = &_esResources; break; case Language::Ukrainian: resources = &_ukResources; break; case Language::Portuguese: resources = &_ptResources; break; case Language::Catalan: resources = &_caResources; break; case Language::Chinese: resources = &_zhResources; break; }*/ if (resources) { if (resources->find(key) != resources->end()) { return (*resources)[key]; } /* else if(EmulationSettings::GetDisplayLanguage() != Language::English) { //Fallback on English if resource key is missing another language resources = &_enResources; if(resources->find(key) != resources->end()) { return (*resources)[key]; } }*/ } return key; } void MessageManager::DisplayMessage(string title, string message, string param1, string param2) { if (MessageManager::_messageManager) { auto lock = _messageLock.AcquireSafe(); if (!MessageManager::_messageManager) { return; } title = Localize(title); message = Localize(message); size_t startPos = message.find(u8"%1"); if (startPos != std::string::npos) { message.replace(startPos, 2, param1); } startPos = message.find(u8"%2"); if (startPos != std::string::npos) { message.replace(startPos, 2, param2); } if (_osdEnabled) { MessageManager::_messageManager->DisplayMessage(title, message); } else { MessageManager::Log("[" + title + "] " + message); } } } void MessageManager::Log(string message) { #ifndef LIBRETRO auto lock = _logLock.AcquireSafe(); if (message.empty()) { message = "------------------------------------------------------"; } if (_log.size() >= 1000) { _log.pop_front(); } _log.push_back(message); #else if(MessageManager::_messageManager) { MessageManager::_messageManager->DisplayMessage("", message + "\n"); } #endif } void MessageManager::ClearLog() { auto lock = _logLock.AcquireSafe(); _log.clear(); } string MessageManager::GetLog() { auto lock = _logLock.AcquireSafe(); stringstream ss; for (string& msg : _log) { ss << msg << "\n"; } return ss.str(); }