diff --git a/Common/Data/Collections/FastVec.h b/Common/Data/Collections/FastVec.h index f842f5cfdb..3dab59abb8 100644 --- a/Common/Data/Collections/FastVec.h +++ b/Common/Data/Collections/FastVec.h @@ -88,7 +88,7 @@ public: T &insert(T *iter) { int pos = iter - data_; ExtendByOne(); - if (pos + 1 < size_) { + if (pos + 1 < (int)size_) { memmove(data_ + pos + 1, data_ + pos, (size_ - pos) * sizeof(T)); } return data_[pos]; diff --git a/Common/Data/Text/I18n.cpp b/Common/Data/Text/I18n.cpp index 0b0a3d2957..43b03a38b1 100644 --- a/Common/Data/Text/I18n.cpp +++ b/Common/Data/Text/I18n.cpp @@ -41,6 +41,7 @@ static const char * const g_categoryNames[(size_t)I18NCat::CATEGORY_COUNT] = { "Upgrade", "VR", "Achievements", + "PSPSettings", }; I18NRepo g_i18nrepo; diff --git a/Common/Data/Text/I18n.h b/Common/Data/Text/I18n.h index 15cdf25147..dba943fdbc 100644 --- a/Common/Data/Text/I18n.h +++ b/Common/Data/Text/I18n.h @@ -57,6 +57,7 @@ enum class I18NCat : uint8_t { UPGRADE, VR, ACHIEVEMENTS, + PSPSETTINGS, CATEGORY_COUNT, NONE = CATEGORY_COUNT, }; diff --git a/Common/Net/HTTPClient.cpp b/Common/Net/HTTPClient.cpp index 7c810ec975..15477558b9 100644 --- a/Common/Net/HTTPClient.cpp +++ b/Common/Net/HTTPClient.cpp @@ -383,6 +383,8 @@ int Client::ReadResponseHeaders(net::Buffer *readbuf, std::vector & } int Client::ReadResponseEntity(net::Buffer *readbuf, const std::vector &responseHeaders, Buffer *output, net::RequestProgress *progress) { + _dbg_assert_(progress->cancelled); + bool gzip = false; bool chunked = false; int contentLength = 0; diff --git a/Common/Net/NetBuffer.h b/Common/Net/NetBuffer.h index 32525ad3f7..b30851d12d 100644 --- a/Common/Net/NetBuffer.h +++ b/Common/Net/NetBuffer.h @@ -9,7 +9,6 @@ namespace net { class RequestProgress { public: - RequestProgress() {} explicit RequestProgress(bool *c) : cancelled(c) {} void Update(int64_t downloaded, int64_t totalBytes, bool done); diff --git a/Core/Config.cpp b/Core/Config.cpp index 820cf0e8c6..15fdecca7a 100644 --- a/Core/Config.cpp +++ b/Core/Config.cpp @@ -796,25 +796,12 @@ static const ConfigSetting networkSettings[] = { ConfigSetting("QuickChat5", &g_Config.sQuickChat4, "Quick Chat 5", CfgFlag::PER_GAME), }; -static int DefaultSystemParamLanguage() { - int defaultLang = PSP_SYSTEMPARAM_LANGUAGE_ENGLISH; - if (g_Config.bFirstRun) { - // TODO: Be smart about same language, different country - auto &langValuesMapping = g_Config.GetLangValuesMapping(); - auto iter = langValuesMapping.find(g_Config.sLanguageIni); - if (iter != langValuesMapping.end()) { - defaultLang = iter->second.second; - } - } - return defaultLang; -} - static const ConfigSetting systemParamSettings[] = { ConfigSetting("PSPModel", &g_Config.iPSPModel, PSP_MODEL_SLIM, CfgFlag::PER_GAME | CfgFlag::REPORT), ConfigSetting("PSPFirmwareVersion", &g_Config.iFirmwareVersion, PSP_DEFAULT_FIRMWARE, CfgFlag::PER_GAME | CfgFlag::REPORT), ConfigSetting("NickName", &g_Config.sNickName, "PPSSPP", CfgFlag::PER_GAME), ConfigSetting("MacAddress", &g_Config.sMACAddress, "", CfgFlag::PER_GAME), - ConfigSetting("Language", &g_Config.iLanguage, &DefaultSystemParamLanguage, CfgFlag::PER_GAME | CfgFlag::REPORT), + ConfigSetting("GameLanguage", &g_Config.iLanguage, -1, CfgFlag::PER_GAME | CfgFlag::REPORT), ConfigSetting("ParamTimeFormat", &g_Config.iTimeFormat, PSP_SYSTEMPARAM_TIME_FORMAT_24HR, CfgFlag::PER_GAME), ConfigSetting("ParamDateFormat", &g_Config.iDateFormat, PSP_SYSTEMPARAM_DATE_FORMAT_YYYYMMDD, CfgFlag::PER_GAME), ConfigSetting("TimeZone", &g_Config.iTimeZone, 0, CfgFlag::PER_GAME), @@ -1771,3 +1758,18 @@ void Config::GetReportingInfo(UrlEncoder &data) { bool Config::IsPortrait() const { return (iInternalScreenRotation == ROTATION_LOCKED_VERTICAL || iInternalScreenRotation == ROTATION_LOCKED_VERTICAL180) && !bSkipBufferEffects; } + +int Config::GetPSPLanguage() { + if (g_Config.iLanguage == -1) { + const auto &langValuesMapping = GetLangValuesMapping(); + auto iter = langValuesMapping.find(g_Config.sLanguageIni); + if (iter != langValuesMapping.end()) { + return iter->second.second; + } else { + // Fallback to English + return PSP_SYSTEMPARAM_LANGUAGE_ENGLISH; + } + } else { + return g_Config.iLanguage; + } +} diff --git a/Core/Config.h b/Core/Config.h index d62d846a0f..73948124fb 100644 --- a/Core/Config.h +++ b/Core/Config.h @@ -569,6 +569,10 @@ public: void SetAppendedConfigIni(const Path &path); void UpdateAfterSettingAutoFrameSkip(); void NotifyUpdatedCpuCore(); + + // Applies the Auto setting if set. Returns an enum value from PSP_SYSTEMPARAM_LANGUAGE_*. + int GetPSPLanguage(); + protected: void LoadStandardControllerIni(); void LoadLangValuesMapping(); diff --git a/Core/Dialog/PSPDialog.cpp b/Core/Dialog/PSPDialog.cpp index 964f7ae301..dd05b2441c 100644 --- a/Core/Dialog/PSPDialog.cpp +++ b/Core/Dialog/PSPDialog.cpp @@ -42,7 +42,7 @@ PSPDialog::~PSPDialog() { void PSPDialog::InitCommon() { UpdateCommon(); - if (GetCommonParam() && GetCommonParam()->language != g_Config.iLanguage) { + if (GetCommonParam() && GetCommonParam()->language != g_Config.GetPSPLanguage()) { WARN_LOG(SCEUTILITY, "Game requested language %d, ignoring and using user language", GetCommonParam()->language); } } diff --git a/Core/HLE/sceImpose.cpp b/Core/HLE/sceImpose.cpp index c5ab64a24a..5cb102a8d0 100644 --- a/Core/HLE/sceImpose.cpp +++ b/Core/HLE/sceImpose.cpp @@ -40,7 +40,7 @@ static u32 backlightOffTime; void __ImposeInit() { - language = g_Config.iLanguage; + language = g_Config.GetPSPLanguage(); if (PSP_CoreParameter().compat.flags().EnglishOrJapaneseOnly) { if (language != PSP_SYSTEMPARAM_LANGUAGE_ENGLISH && language != PSP_SYSTEMPARAM_LANGUAGE_JAPANESE) { language = PSP_SYSTEMPARAM_LANGUAGE_ENGLISH; @@ -76,7 +76,7 @@ static u32 sceImposeGetBatteryIconStatus(u32 chargingPtr, u32 iconStatusPtr) static u32 sceImposeSetLanguageMode(u32 languageVal, u32 buttonVal) { language = languageVal; buttonValue = buttonVal; - if (language != g_Config.iLanguage) { + if (language != g_Config.GetPSPLanguage()) { return hleLogWarning(SCEUTILITY, 0, "ignoring requested language"); } return hleLogSuccessI(SCEUTILITY, 0); diff --git a/Core/HLE/sceNp2.cpp b/Core/HLE/sceNp2.cpp index 89f047757f..70b349145b 100644 --- a/Core/HLE/sceNp2.cpp +++ b/Core/HLE/sceNp2.cpp @@ -131,7 +131,8 @@ static int sceNpMatching2ContextStart(int ctxId) //npMatching2Ctx.started = true; Url url("http://static-resource.np.community.playstation.net/np/resource/psp-title/" + std::string(npTitleId.data) + "_00/matching/" + std::string(npTitleId.data) + "_00-matching.xml"); http::Client client; - net::RequestProgress progress; + bool cancelled = false; + net::RequestProgress progress(&cancelled); if (!client.Resolve(url.Host().c_str(), url.Port())) { return hleLogError(SCENET, SCE_NP_COMMUNITY_SERVER_ERROR_NO_SUCH_TITLE, "HTTP failed to resolve %s", url.Resource().c_str()); } diff --git a/Core/HLE/sceUtility.cpp b/Core/HLE/sceUtility.cpp index 1ff229a9ca..1f559d79e5 100644 --- a/Core/HLE/sceUtility.cpp +++ b/Core/HLE/sceUtility.cpp @@ -898,7 +898,7 @@ static u32 sceUtilityGetSystemParamInt(u32 id, u32 destaddr) param = g_Config.bDayLightSavings?PSP_SYSTEMPARAM_DAYLIGHTSAVINGS_SAVING:PSP_SYSTEMPARAM_DAYLIGHTSAVINGS_STD; break; case PSP_SYSTEMPARAM_ID_INT_LANGUAGE: - param = g_Config.iLanguage; + param = g_Config.GetPSPLanguage(); if (PSP_CoreParameter().compat.flags().EnglishOrJapaneseOnly) { if (param != PSP_SYSTEMPARAM_LANGUAGE_ENGLISH && param != PSP_SYSTEMPARAM_LANGUAGE_JAPANESE) { param = PSP_SYSTEMPARAM_LANGUAGE_ENGLISH; diff --git a/Core/WebServer.cpp b/Core/WebServer.cpp index 83a6f86574..a2192984c0 100644 --- a/Core/WebServer.cpp +++ b/Core/WebServer.cpp @@ -64,7 +64,8 @@ static ServerStatus RetrieveStatus() { static bool RegisterServer(int port) { bool success = false; http::Client http; - net::RequestProgress progress; + bool cancelled = false; + net::RequestProgress progress(&cancelled); Buffer theVoid = Buffer::Void(); http.SetUserAgent(StringFromFormat("PPSSPP/%s", PPSSPP_GIT_VERSION)); diff --git a/UI/GameSettingsScreen.cpp b/UI/GameSettingsScreen.cpp index 7c99613765..377630d31c 100644 --- a/UI/GameSettingsScreen.cpp +++ b/UI/GameSettingsScreen.cpp @@ -897,6 +897,7 @@ void GameSettingsScreen::CreateSystemSettings(UI::ViewGroup *systemSettings) { auto di = GetI18NCategory(I18NCat::DIALOG); auto vr = GetI18NCategory(I18NCat::VR); auto th = GetI18NCategory(I18NCat::THEMES); + auto psps = GetI18NCategory(I18NCat::PSPSETTINGS); // TODO: Should move more into this section. systemSettings->Add(new ItemHeader(sy->T("RetroAchievements"))); auto retro = systemSettings->Add(new Choice(sy->T("RetroAchievements"))); @@ -1108,6 +1109,10 @@ void GameSettingsScreen::CreateSystemSettings(UI::ViewGroup *systemSettings) { }); systemSettings->Add(new ItemHeader(sy->T("PSP Settings"))); + + // The ordering here is simply mapping directly to PSP_SYSTEMPARAM_LANGUAGE_*. + static const char *defaultLanguages[] = { "Auto", "Japanese", "English", "French", "Spanish", "German", "Italian", "Dutch", "Portuguese", "Russian", "Korean", "Chinese (traditional)", "Chinese (simplified)" }; + systemSettings->Add(new PopupMultiChoice(&g_Config.iLanguage, psps->T("Game language"), defaultLanguages, -1, ARRAY_SIZE(defaultLanguages), I18NCat::PSPSETTINGS, screenManager())); static const char *models[] = { "PSP-1000", "PSP-2000/3000" }; systemSettings->Add(new PopupMultiChoice(&g_Config.iPSPModel, sy->T("PSP Model"), models, 0, ARRAY_SIZE(models), I18NCat::SYSTEM, screenManager()))->SetEnabled(!PSP_IsInited()); systemSettings->Add(new PopupTextInputChoice(&g_Config.sNickName, sy->T("Change Nickname"), "", 32, screenManager())); diff --git a/UI/MiscScreens.cpp b/UI/MiscScreens.cpp index 9b30a8bdc3..0f928332e2 100644 --- a/UI/MiscScreens.cpp +++ b/UI/MiscScreens.cpp @@ -677,18 +677,9 @@ void NewLanguageScreen::OnCompleted(DialogResult result) { iniLoadedSuccessfully = g_i18nrepo.LoadIni(g_Config.sLanguageIni, langOverridePath); if (iniLoadedSuccessfully) { - // Dunno what else to do here. - auto &langValuesMapping = g_Config.GetLangValuesMapping(); - - auto iter = langValuesMapping.find(code); - if (iter == langValuesMapping.end()) { - // Fallback to English - g_Config.iLanguage = PSP_SYSTEMPARAM_LANGUAGE_ENGLISH; - } else { - g_Config.iLanguage = iter->second.second; - } RecreateViews(); } else { + // Failed to load the language ini. Shouldn't really happen, but let's just switch back to the old language. g_Config.sLanguageIni = oldLang; } } diff --git a/assets/lang/en_US.ini b/assets/lang/en_US.ini index d0cecb4147..e96c896d27 100644 --- a/assets/lang/en_US.ini +++ b/assets/lang/en_US.ini @@ -977,6 +977,23 @@ Use PSP folder at root of storage = Use PSP folder at root of storage Welcome to PPSSPP! = Welcome to PPSSPP! WhatsThis = What's this? +[PSPSettings] +Auto = Auto +Chinese (simplified) = Chinese (simplified) +Chinese (traditional) = Chinese (traditional) +Dutch = Dutch +English = English +French = French +Game language = Game language +German = German +Italian = Italian +Japanese = Japanese +Korean = Korean +Games often don't support all languages = Games often don't support all languages +Portuguese = Portuguese +Russian = Russian +Spanish = Spanish + [RemoteISO] Browse Games = Browse games Local Server Port = Local server port diff --git a/assets/lang/es_LA.ini b/assets/lang/es_LA.ini index 3a93988723..2b9637ad9e 100644 --- a/assets/lang/es_LA.ini +++ b/assets/lang/es_LA.ini @@ -954,6 +954,8 @@ Twitter @PPSSPP_emu = Twitter @PPSSPP_emu website = Sitio web oficial written = Escrito en lenguaje C++ para una mejor portabilidad y velocidad +[PSPSettings] + [RemoteISO] Browse Games = Buscar juegos Local Server Port = Puerto del servidor local @@ -1222,7 +1224,7 @@ Reset Recording on Save/Load State = Reiniciar grabación al abrir/guardar estad Restore Default Settings = Reestablecer ajustes Rewind Snapshot Interval = Frecuencia de rebobinado\n(consume memoria) Save path in installed.txt = Guardar ruta en installed.txt -Save path in My Documents = Guardar ruta en\n"C:/Users/(tu usuario)/Documents" +Save path in My Documents = Guardar ruta en "C:/Users/(tu usuario)/Documents" Savestate Slot = Ranura de estado guardado Savestate slot backups = Copias de seguridad de estado guardado Screenshots as PNG = Capturas en PNG diff --git a/assets/lang/sv_SE.ini b/assets/lang/sv_SE.ini index dd07d4f809..87be54638b 100644 --- a/assets/lang/sv_SE.ini +++ b/assets/lang/sv_SE.ini @@ -925,6 +925,23 @@ Twitter @PPSSPP_emu = Twitter @PPSSPP_emu website = Kolla in webbsidan: written = Skriven i C++ - prestanda och portabilitet +[PSPSettings] +Auto = Auto +Chinese (simplified) = Kinesiska (förenklad) +Chinese (traditional) = Kinesiska (traditionell) +Dutch = Holländska +English = Engelska +French = Franska +Game language = Språk i spel +Games often don't support all languages = Games often don't support all languages +German = Tyska +Italian = Italienska +Japanese = Japanska +Korean = Koreanska +Portuguese = Portugisiska +Russian = Ryska +Spanish = Spanska + [MemStick] Already contains PSP data = Innehåller redan PSP-data Create or Choose a PSP folder = Skapa eller välj en PSP-mapp