From b8fced5b413348e04af8fbfc2fed0ccedde20ab2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20Rydg=C3=A5rd?= Date: Tue, 25 Nov 2025 00:44:24 +0100 Subject: [PATCH] Path code cleanup, move some UI code (#21037) * Move a bunch of path logic into Core/Util/PathUtil.cpp/h . * Move GameImageView out from SaveDataScreen * More cleanup, add a translation string --- CMakeLists.txt | 2 + Common/File/FileUtil.cpp | 1 + Common/File/PathBrowser.cpp | 25 ---- Common/File/PathBrowser.h | 7 - Core/Config.cpp | 84 ++--------- Core/Config.h | 3 - Core/Core.vcxproj | 4 +- Core/Core.vcxproj.filters | 8 +- Core/System.cpp | 99 ------------- Core/System.h | 25 +--- Core/Util/PathUtil.cpp | 211 ++++++++++++++++++++++++++++ Core/Util/PathUtil.h | 38 +++++ Core/Util/RecentFiles.cpp | 1 + UI/GameInfoCache.cpp | 9 +- UI/GameInfoCache.h | 1 + UI/MainScreen.cpp | 11 +- UI/MainScreen.h | 2 + UI/MiscViews.cpp | 52 +++++++ UI/MiscViews.h | 19 +++ UI/NativeApp.cpp | 11 +- UI/RemoteISOScreen.cpp | 1 - UI/SavedataScreen.cpp | 53 +------ UI/SavedataScreen.h | 17 --- UWP/CoreUWP/CoreUWP.vcxproj | 4 +- UWP/CoreUWP/CoreUWP.vcxproj.filters | 11 +- android/jni/Android.mk | 1 + assets/lang/ar_AE.ini | 1 + assets/lang/az_AZ.ini | 1 + assets/lang/be_BY.ini | 1 + assets/lang/bg_BG.ini | 1 + assets/lang/ca_ES.ini | 1 + assets/lang/cz_CZ.ini | 1 + assets/lang/da_DK.ini | 1 + assets/lang/de_DE.ini | 1 + assets/lang/dr_ID.ini | 1 + assets/lang/en_US.ini | 1 + assets/lang/es_ES.ini | 1 + assets/lang/es_LA.ini | 1 + assets/lang/fa_IR.ini | 1 + assets/lang/fi_FI.ini | 1 + assets/lang/fr_FR.ini | 1 + assets/lang/gl_ES.ini | 1 + assets/lang/gr_EL.ini | 1 + assets/lang/he_IL.ini | 1 + assets/lang/he_IL_invert.ini | 1 + assets/lang/hr_HR.ini | 1 + assets/lang/hu_HU.ini | 1 + assets/lang/id_ID.ini | 1 + assets/lang/it_IT.ini | 1 + assets/lang/ja_JP.ini | 1 + assets/lang/jv_ID.ini | 1 + assets/lang/ko_KR.ini | 1 + assets/lang/ku_SO.ini | 1 + assets/lang/lo_LA.ini | 1 + assets/lang/lt-LT.ini | 1 + assets/lang/ms_MY.ini | 1 + assets/lang/nl_NL.ini | 1 + assets/lang/no_NO.ini | 1 + assets/lang/pl_PL.ini | 1 + assets/lang/pt_BR.ini | 1 + assets/lang/pt_PT.ini | 1 + assets/lang/ro_RO.ini | 1 + assets/lang/ru_RU.ini | 1 + assets/lang/sv_SE.ini | 1 + assets/lang/tg_PH.ini | 1 + assets/lang/th_TH.ini | 1 + assets/lang/tr_TR.ini | 1 + assets/lang/uk_UA.ini | 1 + assets/lang/vi_VN.ini | 1 + assets/lang/zh_CN.ini | 1 + assets/lang/zh_TW.ini | 1 + libretro/Makefile.common | 1 + 72 files changed, 416 insertions(+), 330 deletions(-) create mode 100644 Core/Util/PathUtil.cpp create mode 100644 Core/Util/PathUtil.h diff --git a/CMakeLists.txt b/CMakeLists.txt index c582912ca2..9326b6c6f4 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -2468,6 +2468,8 @@ add_library(${CoreLibName} ${CoreLinkType} Core/Util/MemStick.h Core/Util/GameDB.cpp Core/Util/GameDB.h + Core/Util/PathUtil.cpp + Core/Util/PathUtil.h Core/Util/PortManager.cpp Core/Util/PortManager.h Core/Util/BlockAllocator.cpp diff --git a/Common/File/FileUtil.cpp b/Common/File/FileUtil.cpp index 90216ce858..7a7c748008 100644 --- a/Common/File/FileUtil.cpp +++ b/Common/File/FileUtil.cpp @@ -329,6 +329,7 @@ static bool ResolvePathVista(const std::wstring &path, wchar_t *buf, DWORD bufSi } #endif +// Canonicalize the given path, resolving symlinks, relative paths, etc. std::string ResolvePath(std::string_view path) { if (LOG_IO) { INFO_LOG(Log::IO, "ResolvePath %.*s", (int)path.size(), path.data()); diff --git a/Common/File/PathBrowser.cpp b/Common/File/PathBrowser.cpp index 9663a59108..3f1a26fa1b 100644 --- a/Common/File/PathBrowser.cpp +++ b/Common/File/PathBrowser.cpp @@ -204,31 +204,6 @@ void PathBrowser::ResetPending() { pendingPath_.clear(); } -std::string PathBrowser::GetFriendlyPath() const { - // Show relative to memstick root if there. - if (path_.StartsWith(aliasMatch_)) { - std::string p; - if (aliasMatch_.ComputePathTo(path_, p)) { - return aliasDisplay_ + p; - } - std::string str = path_.ToString(); - if (aliasMatch_.size() < str.length()) { - return aliasDisplay_ + str.substr(aliasMatch_.size()); - } else { - return aliasDisplay_; - } - } - - std::string str = path_.ToString(); -#if !PPSSPP_PLATFORM(ANDROID) && (PPSSPP_PLATFORM(LINUX) || PPSSPP_PLATFORM(MAC)) - char *home = getenv("HOME"); - if (home != nullptr && !strncmp(str.c_str(), home, strlen(home))) { - return std::string("~") + str.substr(strlen(home)); - } -#endif - return path_.ToVisualString(); -} - bool PathBrowser::GetListing(std::vector &fileInfo, const char *extensionFilter, bool *cancel) { std::unique_lock guard(pendingLock_); while (!IsListingReady() && (!cancel || !*cancel)) { diff --git a/Common/File/PathBrowser.h b/Common/File/PathBrowser.h index 644ec2b982..8372f25a70 100644 --- a/Common/File/PathBrowser.h +++ b/Common/File/PathBrowser.h @@ -36,15 +36,10 @@ public: const Path &GetPath() const { return path_; } - std::string GetFriendlyPath() const; void SetUserAgent(std::string_view s) { userAgent_ = s; } - void SetRootAlias(std::string_view alias, const Path &rootPath) { - aliasDisplay_ = alias; - aliasMatch_ = rootPath; - } void RestrictToRoot(const Path &root); bool empty() const { return path_.empty(); @@ -62,8 +57,6 @@ private: Path pendingPath_; Path restrictedRoot_; std::string userAgent_; - std::string aliasDisplay_; - Path aliasMatch_; std::vector pendingFiles_; std::condition_variable pendingCond_; std::mutex pendingLock_; diff --git a/Core/Config.cpp b/Core/Config.cpp index ca40928ba9..5fb7a71528 100644 --- a/Core/Config.cpp +++ b/Core/Config.cpp @@ -57,6 +57,7 @@ #include "Core/HLE/sceUtility.h" #include "Core/Instance.h" #include "Core/Util/RecentFiles.h" +#include "Core/Util/PathUtil.h" #include "GPU/Common/FramebufferManagerCommon.h" @@ -73,8 +74,6 @@ static const std::string_view logSectionName = "LogDebug"; static const std::string_view logSectionName = "Log"; #endif -bool TryUpdateSavedPath(Path *path); - static const std::vector defaultProAdhocServerList = { "socom.cc", "psp.gameplayer.club", // TODO: Add some saved recent history too? }; @@ -1177,10 +1176,10 @@ void Config::UpdateIniLocation(const char *iniFileName, const char *controllerIn const bool useIniFilename = iniFileName != nullptr && strlen(iniFileName) > 0; const char *ppssppIniFilename = IsVREnabled() ? "ppssppvr.ini" : "ppsspp.ini"; bool exists; - iniFilename_ = FindConfigFile(useIniFilename ? iniFileName : ppssppIniFilename, &exists); + iniFilename_ = FindConfigFile(searchPath_, useIniFilename ? iniFileName : ppssppIniFilename, &exists); const bool useControllerIniFilename = controllerIniFilename != nullptr && strlen(controllerIniFilename) > 0; const char *controlsIniFilename = IsVREnabled() ? "controlsvr.ini" : "controls.ini"; - controllerIniFilename_ = FindConfigFile(useControllerIniFilename ? controllerIniFilename : controlsIniFilename, &exists); + controllerIniFilename_ = FindConfigFile(searchPath_, useControllerIniFilename ? controllerIniFilename : controlsIniFilename, &exists); } bool Config::LoadAppendedConfig() { @@ -1538,70 +1537,10 @@ void Config::NotifyUpdatedCpuCore() { } } -// On iOS, the path to the app documents directory changes on each launch. -// Example path: -// /var/mobile/Containers/Data/Application/0E0E89DE-8D8E-485A-860C-700D8BC87B86/Documents/PSP/GAME/SuicideBarbie -// The GUID part changes on each launch. -bool TryUpdateSavedPath(Path *path) { -#if PPSSPP_PLATFORM(IOS) - // DEBUG_LOG(Log::Loader, "Original path: %s", path->c_str()); - std::string pathStr = path->ToString(); - - const std::string_view applicationRoot = "/var/mobile/Containers/Data/Application/"; - if (startsWith(pathStr, applicationRoot)) { - size_t documentsPos = pathStr.find("/Documents/"); - if (documentsPos == std::string::npos) { - return false; - } - std::string memstick = g_Config.memStickDirectory.ToString(); - size_t memstickDocumentsPos = memstick.find("/Documents"); // Note: No trailing slash, or we won't find it. - *path = Path(memstick.substr(0, memstickDocumentsPos) + pathStr.substr(documentsPos)); - return true; - } else { - // Path can't be auto-updated. - return false; - } -#else - return false; -#endif -} - void Config::SetSearchPath(const Path &searchPath) { searchPath_ = searchPath; } -Path Config::FindConfigFile(std::string_view baseFilename, bool *exists) const { - // Don't search for an absolute path. - if (baseFilename.size() > 1 && baseFilename[0] == '/') { - Path path(baseFilename); - *exists = File::Exists(path); - return path; - } -#ifdef _WIN32 - // Handle paths starting with a drive letter. - if (baseFilename.size() > 3 && baseFilename[1] == ':' && (baseFilename[2] == '/' || baseFilename[2] == '\\')) { - Path path(baseFilename); - *exists = File::Exists(path); - return path; - } -#endif - - Path filename = searchPath_ / baseFilename; - if (File::Exists(filename)) { - *exists = true; - return filename; - } - *exists = false; - // Make sure at least the directory it's supposed to be in exists. - Path parent = filename.NavigateUp(); - - // We try to create the path and ignore if it fails (already exists). - if (parent != GetSysDirectory(DIRECTORY_SYSTEM)) { - File::CreateFullPath(parent); - } - return filename; -} - void Config::RestoreDefaults(RestoreSettingsBits whatToRestore, bool log) { if (IsGameSpecific()) { // TODO: This could be done in a cleaner way. @@ -1636,13 +1575,13 @@ void Config::RestoreDefaults(RestoreSettingsBits whatToRestore, bool log) { bool Config::HasGameConfig(std::string_view gameId) { bool exists = false; - Path fullIniFilePath = GetGameConfigFilePath(gameId, &exists); + Path fullIniFilePath = GetGameConfigFilePath(searchPath_, gameId, &exists); return exists; } bool Config::CreateGameConfig(std::string_view gameId) { bool exists; - Path fullIniFilePath = GetGameConfigFilePath(gameId, &exists); + Path fullIniFilePath = GetGameConfigFilePath(searchPath_, gameId, &exists); if (exists) { INFO_LOG(Log::System, "Game config already exists"); @@ -1655,7 +1594,7 @@ bool Config::CreateGameConfig(std::string_view gameId) { bool Config::DeleteGameConfig(std::string_view gameId) { bool exists = false; - Path fullIniFilePath = Path(GetGameConfigFilePath(gameId, &exists)); + Path fullIniFilePath = GetGameConfigFilePath(searchPath_, gameId, &exists); if (exists) { if (System_GetPropertyBool(SYSPROP_HAS_TRASH_BIN)) { @@ -1667,13 +1606,6 @@ bool Config::DeleteGameConfig(std::string_view gameId) { return true; } -Path Config::GetGameConfigFilePath(std::string_view gameId, bool *exists) { - std::string_view ppssppIniFilename = IsVREnabled() ? "_ppssppvr.ini" : "_ppsspp.ini"; - std::string iniFileName = join(gameId, ppssppIniFilename); - Path iniFileNameFull = FindConfigFile(iniFileName, exists); - return iniFileNameFull; -} - bool Config::SaveGameConfig(const std::string &gameId, std::string_view titleForComment) { if (gameId.empty()) { return false; @@ -1685,7 +1617,7 @@ bool Config::SaveGameConfig(const std::string &gameId, std::string_view titleFor } bool exists; - Path fullIniFilePath = GetGameConfigFilePath(gameId, &exists); + Path fullIniFilePath = GetGameConfigFilePath(searchPath_, gameId, &exists); IniFile iniFile; @@ -1735,7 +1667,7 @@ bool Config::SaveGameConfig(const std::string &gameId, std::string_view titleFor bool Config::LoadGameConfig(const std::string &gameId) { bool exists; - Path iniFileNameFull = GetGameConfigFilePath(gameId, &exists); + Path iniFileNameFull = GetGameConfigFilePath(searchPath_, gameId, &exists); if (!exists) { // Bail if there's no game-specific config. DEBUG_LOG(Log::Loader, "No game-specific settings found in %s. Using global defaults.", iniFileNameFull.c_str()); diff --git a/Core/Config.h b/Core/Config.h index 73d8ce965c..28212fe409 100644 --- a/Core/Config.h +++ b/Core/Config.h @@ -672,12 +672,10 @@ public: bool SaveGameConfig(const std::string &pGameId, std::string_view titleForComment); void UnloadGameConfig(); - Path GetGameConfigFilePath(std::string_view gameId, bool *exists); bool HasGameConfig(std::string_view gameId); bool IsGameSpecific() const { return !gameId_.empty(); } void SetSearchPath(const Path &path); - Path FindConfigFile(std::string_view baseFilename, bool *exists) const; void UpdateIniLocation(const char *iniFileName = nullptr, const char *controllerIniFilename = nullptr); @@ -744,7 +742,6 @@ private: }; std::string CreateRandMAC(); -bool TryUpdateSavedPath(Path *path); // TODO: Find a better place for this. extern http::RequestManager g_DownloadManager; diff --git a/Core/Core.vcxproj b/Core/Core.vcxproj index e963618e46..5224acdeca 100644 --- a/Core/Core.vcxproj +++ b/Core/Core.vcxproj @@ -936,6 +936,7 @@ + @@ -1304,6 +1305,7 @@ + @@ -1348,4 +1350,4 @@ - + \ No newline at end of file diff --git a/Core/Core.vcxproj.filters b/Core/Core.vcxproj.filters index 22f2c9ba91..17491dc488 100644 --- a/Core/Core.vcxproj.filters +++ b/Core/Core.vcxproj.filters @@ -1393,6 +1393,9 @@ HW + + Util + @@ -2250,6 +2253,9 @@ HW + + Util + @@ -2278,4 +2284,4 @@ Ext - + \ No newline at end of file diff --git a/Core/System.cpp b/Core/System.cpp index b2eb5a91db..701299f316 100644 --- a/Core/System.cpp +++ b/Core/System.cpp @@ -774,105 +774,6 @@ void PSP_RunLoopFor(int cycles) { Core_RunLoopUntil(CoreTiming::GetTicks() + cycles); } -Path GetSysDirectory(PSPDirectories directoryType) { - const Path &memStickDirectory = g_Config.memStickDirectory; - Path pspDirectory; - if (!strcasecmp(memStickDirectory.GetFilename().c_str(), "PSP")) { - // Let's strip this off, to easily allow choosing a root directory named "PSP" on Android. - pspDirectory = memStickDirectory; - } else { - pspDirectory = memStickDirectory / "PSP"; - } - - switch (directoryType) { - case DIRECTORY_PSP: - return pspDirectory; - case DIRECTORY_CHEATS: - return pspDirectory / "Cheats"; - case DIRECTORY_GAME: - return pspDirectory / "GAME"; - case DIRECTORY_SAVEDATA: - return pspDirectory / "SAVEDATA"; - case DIRECTORY_SCREENSHOT: - return pspDirectory / "SCREENSHOT"; - case DIRECTORY_SYSTEM: - return pspDirectory / "SYSTEM"; - case DIRECTORY_PAUTH: - return memStickDirectory / "PAUTH"; // This one's at the root... - case DIRECTORY_EXDATA: - return memStickDirectory / "EXDATA"; // This one's traditionally at the root... - case DIRECTORY_DUMP: - return pspDirectory / "SYSTEM/DUMP"; - case DIRECTORY_SAVESTATE: - return pspDirectory / "PPSSPP_STATE"; - case DIRECTORY_CACHE: - return pspDirectory / "SYSTEM/CACHE"; - case DIRECTORY_TEXTURES: - return pspDirectory / "TEXTURES"; - case DIRECTORY_PLUGINS: - return pspDirectory / "PLUGINS"; - case DIRECTORY_APP_CACHE: - if (!g_Config.appCacheDirectory.empty()) { - return g_Config.appCacheDirectory; - } - return pspDirectory / "SYSTEM/CACHE"; - case DIRECTORY_VIDEO: - return pspDirectory / "VIDEO"; - case DIRECTORY_AUDIO: - return pspDirectory / "AUDIO"; - case DIRECTORY_CUSTOM_SHADERS: - return pspDirectory / "shaders"; - case DIRECTORY_CUSTOM_THEMES: - return pspDirectory / "themes"; - - case DIRECTORY_MEMSTICK_ROOT: - return g_Config.memStickDirectory; - // Just return the memory stick root if we run into some sort of problem. - default: - ERROR_LOG(Log::FileSystem, "Unknown directory type."); - return g_Config.memStickDirectory; - } -} - -bool CreateSysDirectories() { -#if PPSSPP_PLATFORM(ANDROID) - const bool createNoMedia = true; -#else - const bool createNoMedia = false; -#endif - - Path pspDir = GetSysDirectory(DIRECTORY_PSP); - INFO_LOG(Log::IO, "Creating '%s' and subdirs:", pspDir.c_str()); - File::CreateFullPath(pspDir); - if (!File::Exists(pspDir)) { - INFO_LOG(Log::IO, "Not a workable memstick directory. Giving up"); - return false; - } - - // Create the default directories that a real PSP creates. Good for homebrew so they can - // expect a standard environment. Skipping THEME though, that's pointless. - static const PSPDirectories sysDirs[] = { - DIRECTORY_CHEATS, - DIRECTORY_SAVEDATA, - DIRECTORY_SAVESTATE, - DIRECTORY_GAME, - DIRECTORY_SYSTEM, - DIRECTORY_TEXTURES, - DIRECTORY_PLUGINS, - DIRECTORY_CACHE, - }; - - for (auto dir : sysDirs) { - Path path = GetSysDirectory(dir); - File::CreateFullPath(path); - if (createNoMedia) { - // Create a nomedia file in each specified subdirectory. - File::CreateEmptyFile(path / ".nomedia"); - } - } - return true; -} - const char *DumpFileTypeToString(DumpFileType type) { switch (type) { case DumpFileType::EBOOT: return "EBOOT"; diff --git a/Core/System.h b/Core/System.h index dfc124afc5..f34284617e 100644 --- a/Core/System.h +++ b/Core/System.h @@ -22,6 +22,7 @@ #include "Common/File/Path.h" #include "Core/CoreParameter.h" #include "Core/ConfigValues.h" +#include "Core/Util/PathUtil.h" class MetaFileSystem; class ParamSFOData; @@ -39,30 +40,6 @@ enum GlobalUIState { UISTATE_EXCEPTION, }; -// Use these in conjunction with GetSysDirectory. -enum PSPDirectories { - DIRECTORY_PSP, - DIRECTORY_CHEATS, - DIRECTORY_SCREENSHOT, - DIRECTORY_SYSTEM, - DIRECTORY_GAME, - DIRECTORY_SAVEDATA, - DIRECTORY_PAUTH, - DIRECTORY_DUMP, - DIRECTORY_SAVESTATE, - DIRECTORY_CACHE, - DIRECTORY_TEXTURES, - DIRECTORY_PLUGINS, - DIRECTORY_APP_CACHE, // Use the OS app cache if available - DIRECTORY_VIDEO, - DIRECTORY_AUDIO, - DIRECTORY_MEMSTICK_ROOT, - DIRECTORY_EXDATA, - DIRECTORY_CUSTOM_SHADERS, - DIRECTORY_CUSTOM_THEMES, - COUNT, -}; - class GraphicsContext; enum class GPUBackend; diff --git a/Core/Util/PathUtil.cpp b/Core/Util/PathUtil.cpp new file mode 100644 index 0000000000..c8219cbded --- /dev/null +++ b/Core/Util/PathUtil.cpp @@ -0,0 +1,211 @@ +#include + +#include "Common/File/Path.h" +#include "Common/File/FileUtil.h" +#include "Common/StringUtils.h" +#include "Common/System/System.h" +#include "Common/Log.h" +#include "Core/Util/PathUtil.h" +#include "Core/Config.h" +#include "Common/VR/PPSSPPVR.h" + +Path FindConfigFile(const Path &searchPath, std::string_view baseFilename, bool *exists) { + // Don't search for an absolute path. + if (baseFilename.size() > 1 && baseFilename[0] == '/') { + Path path(baseFilename); + *exists = File::Exists(path); + return path; + } +#ifdef _WIN32 + // Handle paths starting with a drive letter. + if (baseFilename.size() > 3 && baseFilename[1] == ':' && (baseFilename[2] == '/' || baseFilename[2] == '\\')) { + Path path(baseFilename); + *exists = File::Exists(path); + return path; + } +#endif + + Path filename = searchPath / baseFilename; + if (File::Exists(filename)) { + *exists = true; + return filename; + } + *exists = false; + // Make sure at least the directory it's supposed to be in exists. + Path parent = filename.NavigateUp(); + + // We try to create the path and ignore if it fails (already exists). + if (parent != GetSysDirectory(DIRECTORY_SYSTEM)) { + File::CreateFullPath(parent); + } + return filename; +} + +Path GetSysDirectory(PSPDirectories directoryType) { + const Path &memStickDirectory = g_Config.memStickDirectory; + Path pspDirectory; + if (!strcasecmp(memStickDirectory.GetFilename().c_str(), "PSP")) { + // Let's strip this off, to easily allow choosing a root directory named "PSP" on Android. + pspDirectory = memStickDirectory; + } else { + pspDirectory = memStickDirectory / "PSP"; + } + + switch (directoryType) { + case DIRECTORY_PSP: + return pspDirectory; + case DIRECTORY_CHEATS: + return pspDirectory / "Cheats"; + case DIRECTORY_GAME: + return pspDirectory / "GAME"; + case DIRECTORY_SAVEDATA: + return pspDirectory / "SAVEDATA"; + case DIRECTORY_SCREENSHOT: + return pspDirectory / "SCREENSHOT"; + case DIRECTORY_SYSTEM: + return pspDirectory / "SYSTEM"; + case DIRECTORY_PAUTH: + return memStickDirectory / "PAUTH"; // This one's at the root... + case DIRECTORY_EXDATA: + return memStickDirectory / "EXDATA"; // This one's traditionally at the root... + case DIRECTORY_DUMP: + return pspDirectory / "SYSTEM/DUMP"; + case DIRECTORY_SAVESTATE: + return pspDirectory / "PPSSPP_STATE"; + case DIRECTORY_CACHE: + return pspDirectory / "SYSTEM/CACHE"; + case DIRECTORY_TEXTURES: + return pspDirectory / "TEXTURES"; + case DIRECTORY_PLUGINS: + return pspDirectory / "PLUGINS"; + case DIRECTORY_APP_CACHE: + if (!g_Config.appCacheDirectory.empty()) { + return g_Config.appCacheDirectory; + } + return pspDirectory / "SYSTEM/CACHE"; + case DIRECTORY_VIDEO: + return pspDirectory / "VIDEO"; + case DIRECTORY_AUDIO: + return pspDirectory / "AUDIO"; + case DIRECTORY_CUSTOM_SHADERS: + return pspDirectory / "shaders"; + case DIRECTORY_CUSTOM_THEMES: + return pspDirectory / "themes"; + + case DIRECTORY_MEMSTICK_ROOT: + return g_Config.memStickDirectory; + // Just return the memory stick root if we run into some sort of problem. + default: + ERROR_LOG(Log::FileSystem, "Unknown directory type."); + return g_Config.memStickDirectory; + } +} + +bool CreateSysDirectories() { +#if PPSSPP_PLATFORM(ANDROID) + const bool createNoMedia = true; +#else + const bool createNoMedia = false; +#endif + + Path pspDir = GetSysDirectory(DIRECTORY_PSP); + INFO_LOG(Log::IO, "Creating '%s' and subdirs:", pspDir.c_str()); + File::CreateFullPath(pspDir); + if (!File::Exists(pspDir)) { + INFO_LOG(Log::IO, "Not a workable memstick directory. Giving up"); + return false; + } + + // Create the default directories that a real PSP creates. Good for homebrew so they can + // expect a standard environment. Skipping THEME though, that's pointless. + static const PSPDirectories sysDirs[] = { + DIRECTORY_CHEATS, + DIRECTORY_SAVEDATA, + DIRECTORY_SAVESTATE, + DIRECTORY_GAME, + DIRECTORY_SYSTEM, + DIRECTORY_TEXTURES, + DIRECTORY_PLUGINS, + DIRECTORY_CACHE, + }; + + for (auto dir : sysDirs) { + Path path = GetSysDirectory(dir); + File::CreateFullPath(path); + if (createNoMedia) { + // Create a nomedia file in each specified subdirectory. + File::CreateEmptyFile(path / ".nomedia"); + } + } + return true; +} + +Path GetGameConfigFilePath(const Path &searchPath, std::string_view gameId, bool *exists) { + std::string_view ppssppIniFilename = IsVREnabled() ? "_ppssppvr.ini" : "_ppsspp.ini"; + std::string iniFileName = join(gameId, ppssppIniFilename); + Path iniFileNameFull = FindConfigFile(searchPath, iniFileName, exists); + return iniFileNameFull; +} + +// On iOS, the path to the app documents directory changes on each launch. +// Example path: +// /var/mobile/Containers/Data/Application/0E0E89DE-8D8E-485A-860C-700D8BC87B86/Documents/PSP/GAME/SuicideBarbie +// The GUID part changes on each launch. +bool TryUpdateSavedPath(Path *path) { +#if PPSSPP_PLATFORM(IOS) + // DEBUG_LOG(Log::Loader, "Original path: %s", path->c_str()); + std::string pathStr = path->ToString(); + + const std::string_view applicationRoot = "/var/mobile/Containers/Data/Application/"; + if (startsWith(pathStr, applicationRoot)) { + size_t documentsPos = pathStr.find("/Documents/"); + if (documentsPos == std::string::npos) { + return false; + } + std::string memstick = g_Config.memStickDirectory.ToString(); + size_t memstickDocumentsPos = memstick.find("/Documents"); // Note: No trailing slash, or we won't find it. + *path = Path(memstick.substr(0, memstickDocumentsPos) + pathStr.substr(documentsPos)); + return true; + } else { + // Path can't be auto-updated. + return false; + } +#else + return false; +#endif +} + +Path GetFailedBackendsDir() { + Path failedBackendsDir; + if (System_GetPropertyBool(SYSPROP_SUPPORTS_PERMISSIONS)) { + failedBackendsDir = GetSysDirectory(DIRECTORY_APP_CACHE); + } else { + failedBackendsDir = GetSysDirectory(DIRECTORY_SYSTEM); + } + return failedBackendsDir; +} + +std::string GetFriendlyPath(Path path, Path aliasMatch, std::string_view aliasDisplay) { + // Show relative to memstick root if there. + if (path.StartsWith(aliasMatch)) { + std::string p; + if (aliasMatch.ComputePathTo(path, p)) { + return join(aliasDisplay, p); + } + std::string str = path.ToString(); + if (aliasMatch.size() < str.length()) { + return join(aliasDisplay, str.substr(aliasMatch.size())); + } else { + return std::string(aliasDisplay); + } + } + + std::string str = path.ToString(); +#if !PPSSPP_PLATFORM(ANDROID) && (PPSSPP_PLATFORM(LINUX) || PPSSPP_PLATFORM(MAC)) + char *home = getenv("HOME"); + if (home != nullptr && !strncmp(str.c_str(), home, strlen(home))) { + return std::string("~") + str.substr(strlen(home)); + } +#endif + return path.ToVisualString(); +} diff --git a/Core/Util/PathUtil.h b/Core/Util/PathUtil.h new file mode 100644 index 0000000000..5c09ce053c --- /dev/null +++ b/Core/Util/PathUtil.h @@ -0,0 +1,38 @@ +#pragma once + +#include +#include + +#include "Common/File/Path.h" + +// Use these in conjunction with GetSysDirectory. +enum PSPDirectories { + DIRECTORY_PSP, + DIRECTORY_CHEATS, + DIRECTORY_SCREENSHOT, + DIRECTORY_SYSTEM, + DIRECTORY_GAME, + DIRECTORY_SAVEDATA, + DIRECTORY_PAUTH, + DIRECTORY_DUMP, + DIRECTORY_SAVESTATE, + DIRECTORY_CACHE, + DIRECTORY_TEXTURES, + DIRECTORY_PLUGINS, + DIRECTORY_APP_CACHE, // Use the OS app cache if available + DIRECTORY_VIDEO, + DIRECTORY_AUDIO, + DIRECTORY_MEMSTICK_ROOT, + DIRECTORY_EXDATA, + DIRECTORY_CUSTOM_SHADERS, + DIRECTORY_CUSTOM_THEMES, + COUNT, +}; + +Path FindConfigFile(const Path &searchPath, std::string_view baseFilename, bool *exists); +Path GetSysDirectory(PSPDirectories directoryType); +bool CreateSysDirectories(); +Path GetGameConfigFilePath(const Path &searchPath, std::string_view gameId, bool *exists); +bool TryUpdateSavedPath(Path *path); +Path GetFailedBackendsDir(); +std::string GetFriendlyPath(Path path, Path aliasMatch, std::string_view aliasDisplay); diff --git a/Core/Util/RecentFiles.cpp b/Core/Util/RecentFiles.cpp index 0148f50586..1f96626e8f 100644 --- a/Core/Util/RecentFiles.cpp +++ b/Core/Util/RecentFiles.cpp @@ -9,6 +9,7 @@ #include "Common/TimeUtil.h" #include "Core/Loaders.h" #include "Core/Util/RecentFiles.h" +#include "Core/Util/PathUtil.h" #include "Core/Config.h" RecentFilesManager g_recentFiles; diff --git a/UI/GameInfoCache.cpp b/UI/GameInfoCache.cpp index 7af9285835..e7f98aa7e8 100644 --- a/UI/GameInfoCache.cpp +++ b/UI/GameInfoCache.cpp @@ -402,13 +402,16 @@ void GameInfo::SetTitle(const std::string &newTitle) { } void GameInfo::FinishPendingTextureLoads(Draw::DrawContext *draw) { - if (draw && icon.dataLoaded && !icon.texture) { + if (!draw) { + return; + } + if (icon.dataLoaded && !icon.texture) { SetupTexture(draw, icon); } - if (draw && pic0.dataLoaded && !pic0.texture) { + if (pic0.dataLoaded && !pic0.texture) { SetupTexture(draw, pic0); } - if (draw && pic1.dataLoaded && !pic1.texture) { + if (pic1.dataLoaded && !pic1.texture) { SetupTexture(draw, pic1); } } diff --git a/UI/GameInfoCache.h b/UI/GameInfoCache.h index 89e681f23f..b463b3cd7a 100644 --- a/UI/GameInfoCache.h +++ b/UI/GameInfoCache.h @@ -197,6 +197,7 @@ public: // redrawing the UI often. Only set flags to GAMEINFO_WANTBG or WANTSND if you really want them // because they're big. bgTextures and sound may be discarded over time as well. // NOTE: This never returns null, so you don't need to check for that. Do check Ready() flags though. + // It's OK to pass in nullptr for draw if you don't need the actual texture right now. std::shared_ptr GetInfo(Draw::DrawContext *draw, const Path &gamePath, GameInfoFlags wantFlags, GameInfoFlags *outHasFlags = nullptr); void FlushBGs(); // Gets rid of all BG textures. Also gets rid of bg sounds. diff --git a/UI/MainScreen.cpp b/UI/MainScreen.cpp index 04ad70db5e..7e6e351423 100644 --- a/UI/MainScreen.cpp +++ b/UI/MainScreen.cpp @@ -519,10 +519,11 @@ GameBrowser::GameBrowser(int token, const Path &path, BrowseFlags browseFlags, b using namespace UI; path_.SetUserAgent(StringFromFormat("PPSSPP/%s", PPSSPP_GIT_VERSION)); Path memstickRoot = GetSysDirectory(DIRECTORY_MEMSTICK_ROOT); + aliasMatch_ = memstickRoot; if (memstickRoot == GetSysDirectory(DIRECTORY_PSP)) { - path_.SetRootAlias("ms:/PSP/", memstickRoot); + aliasDisplay_ = "ms:/PSP/"; } else { - path_.SetRootAlias("ms:/", memstickRoot); + aliasDisplay_ = "ms:/"; } if (System_GetPropertyBool(SYSPROP_LIMITED_FILE_BROWSING) && (path.Type() == PathType::NATIVE || path.Type() == PathType::CONTENT_URI)) { @@ -782,13 +783,15 @@ void GameBrowser::Refresh() { const bool pathOnSeparateLine = g_display.dp_xres < 1050 || portrait_; + std::string pathStr = GetFriendlyPath(path_.GetPath(), aliasMatch_, aliasDisplay_); + if (pathOnSeparateLine) { - Add(new TextView(path_.GetFriendlyPath(), ALIGN_VCENTER | FLAG_WRAP_TEXT, true, new LinearLayoutParams(FILL_PARENT, WRAP_CONTENT, Margins(8, 0, 8, 0)))); + Add(new TextView(pathStr, ALIGN_VCENTER | FLAG_WRAP_TEXT, true, new LinearLayoutParams(FILL_PARENT, WRAP_CONTENT, Margins(8, 0, 8, 0)))); } if (browseFlags_ & BrowseFlags::NAVIGATE) { if (!pathOnSeparateLine) { topBar->Add(new Spacer(2.0f)); - topBar->Add(new TextView(path_.GetFriendlyPath(), ALIGN_VCENTER | FLAG_WRAP_TEXT, true, new LinearLayoutParams(FILL_PARENT, 64.0f, 1.0f))); + topBar->Add(new TextView(pathStr, ALIGN_VCENTER | FLAG_WRAP_TEXT, true, new LinearLayoutParams(FILL_PARENT, 64.0f, 1.0f))); } topBar->Add(new Choice(ImageID("I_HOME"), new LayoutParams(WRAP_CONTENT, 64.0f)))->OnClick.Handle(this, &GameBrowser::OnHomeClick); if (System_GetPropertyBool(SYSPROP_HAS_ADDITIONAL_STORAGE)) { diff --git a/UI/MainScreen.h b/UI/MainScreen.h index 6ba953b195..d10bafd3f4 100644 --- a/UI/MainScreen.h +++ b/UI/MainScreen.h @@ -116,6 +116,8 @@ private: ScreenManager *screenManager_; int token_ = -1; bool portrait_ = false; + Path aliasMatch_; + std::string aliasDisplay_; }; class RemoteISOBrowseScreen; diff --git a/UI/MiscViews.cpp b/UI/MiscViews.cpp index 0245f76059..9dc392af35 100644 --- a/UI/MiscViews.cpp +++ b/UI/MiscViews.cpp @@ -158,3 +158,55 @@ PaneTitleBar::PaneTitleBar(const Path &gamePath, std::string_view title, const s }); } } + +void GameImageView::GetContentDimensions(const UIContext &dc, float &w, float &h) const { + w = textureWidth_; + h = textureHeight_; +} + +void GameImageView::Draw(UIContext &dc) { + using namespace UI; + std::shared_ptr info = g_gameInfoCache->GetInfo(dc.GetDrawContext(), gamePath_, image_); + if (!info->Ready(image_) || !info->icon.texture) { + return; + } + + Draw::Texture *texture = nullptr; + switch (image_) { + case GameInfoFlags::ICON: + texture = info->icon.texture; + break; + case GameInfoFlags::PIC0: + texture = info->pic0.texture; + break; + case GameInfoFlags::PIC1: + texture = info->pic1.texture; + break; + } + + if (!texture) { + return; + } + + textureWidth_ = texture->Width() * scale_; + textureHeight_ = texture->Height() * scale_; + + // Fade icon with the backgrounds. + double loadTime = info->icon.timeLoaded; + auto pic = info->GetPIC1(); + if (pic) { + loadTime = std::max(loadTime, pic->timeLoaded); + } + uint32_t color = whiteAlpha(ease((time_now_d() - loadTime) * 3)); + + // Adjust size so we don't stretch the image vertically or horizontally. + // Make sure it's not wider than 144 (like Doom Legacy homebrew), ugly in the grid mode. + float nw = std::min(bounds_.h * textureWidth_ / textureHeight_, (float)bounds_.w); + int x = bounds_.x + (bounds_.w - nw) / 2.0f; + + dc.Flush(); + dc.GetDrawContext()->BindTexture(0, texture); + dc.Draw()->Rect(x, bounds_.y, nw, bounds_.h, color); + dc.Flush(); + dc.RebindTexture(); +} diff --git a/UI/MiscViews.h b/UI/MiscViews.h index 38d8009588..e7021229e4 100644 --- a/UI/MiscViews.h +++ b/UI/MiscViews.h @@ -3,6 +3,7 @@ #include "Common/Common.h" #include "Common/UI/View.h" #include "UI/ViewGroup.h" +#include "UI/GameInfoCache.h" // Compound view, showing a text with an icon. class TextWithImage : public UI::LinearLayout { @@ -57,3 +58,21 @@ public: private: Path gamePath_; }; + +class GameImageView : public UI::InertView { +public: + GameImageView(const Path &gamePath, GameInfoFlags image, float scale, UI::LayoutParams *layoutParams = 0) + : InertView(layoutParams), image_(image), gamePath_(gamePath), scale_(scale) { + } + + void GetContentDimensions(const UIContext &dc, float &w, float &h) const override; + void Draw(UIContext &dc) override; + std::string DescribeText() const override { return ""; } + +private: + Path gamePath_; + GameInfoFlags image_; + float scale_ = 1.0f; + int textureWidth_ = 0; + int textureHeight_ = 0; +}; diff --git a/UI/NativeApp.cpp b/UI/NativeApp.cpp index 26556b66ea..af874315da 100644 --- a/UI/NativeApp.cpp +++ b/UI/NativeApp.cpp @@ -111,6 +111,7 @@ #include "Core/Util/PortManager.h" #include "Core/Util/AudioFormat.h" #include "Core/Util/RecentFiles.h" +#include "Core/Util/PathUtil.h" #include "Core/WebServer.h" #include "Core/TiltEventProcessor.h" @@ -257,16 +258,6 @@ void PostLoadConfig() { #endif } -static Path GetFailedBackendsDir() { - Path failedBackendsDir; - if (System_GetPropertyBool(SYSPROP_SUPPORTS_PERMISSIONS)) { - failedBackendsDir = GetSysDirectory(DIRECTORY_APP_CACHE); - } else { - failedBackendsDir = GetSysDirectory(DIRECTORY_SYSTEM); - } - return failedBackendsDir; -} - static void CheckFailedGPUBackends() { #ifdef _DEBUG // If you're in debug mode, you probably don't want a fallback. If you're in release mode, use IGNORE below. diff --git a/UI/RemoteISOScreen.cpp b/UI/RemoteISOScreen.cpp index c60e2d808a..c6c0437301 100644 --- a/UI/RemoteISOScreen.cpp +++ b/UI/RemoteISOScreen.cpp @@ -257,7 +257,6 @@ static bool LoadGameList(const Path &url, std::vector &games) { browser.SetPath(url); std::vector files; browser.SetUserAgent(StringFromFormat("PPSSPP/%s", PPSSPP_GIT_VERSION)); - browser.SetRootAlias("ms:", GetSysDirectory(DIRECTORY_MEMSTICK_ROOT)); browser.GetListing(files, "iso:cso:chd:pbp:elf:prx:ppdmp:", &scanCancelled); if (scanCancelled) { return false; diff --git a/UI/SavedataScreen.cpp b/UI/SavedataScreen.cpp index 3d34991819..05d211fc7a 100644 --- a/UI/SavedataScreen.cpp +++ b/UI/SavedataScreen.cpp @@ -45,6 +45,7 @@ #include "Core/SaveState.h" #include "Core/System.h" #include "Core/HLE/sceUtility.h" +#include "UI/MiscViews.h" class SavedataButton; @@ -722,55 +723,3 @@ void SavedataScreen::sendMessage(UIMessage message, const char *value) { stateBrowser_->SetSearchFilter(searchFilter_); } } - -void GameImageView::GetContentDimensions(const UIContext &dc, float &w, float &h) const { - w = textureWidth_; - h = textureHeight_; -} - -void GameImageView::Draw(UIContext &dc) { - using namespace UI; - std::shared_ptr info = g_gameInfoCache->GetInfo(dc.GetDrawContext(), gamePath_, image_); - if (!info->Ready(image_) || !info->icon.texture) { - return; - } - - Draw::Texture *texture = nullptr; - switch (image_) { - case GameInfoFlags::ICON: - texture = info->icon.texture; - break; - case GameInfoFlags::PIC0: - texture = info->pic0.texture; - break; - case GameInfoFlags::PIC1: - texture = info->pic1.texture; - break; - } - - if (!texture) { - return; - } - - textureWidth_ = texture->Width() * scale_; - textureHeight_ = texture->Height() * scale_; - - // Fade icon with the backgrounds. - double loadTime = info->icon.timeLoaded; - auto pic = info->GetPIC1(); - if (pic) { - loadTime = std::max(loadTime, pic->timeLoaded); - } - uint32_t color = whiteAlpha(ease((time_now_d() - loadTime) * 3)); - - // Adjust size so we don't stretch the image vertically or horizontally. - // Make sure it's not wider than 144 (like Doom Legacy homebrew), ugly in the grid mode. - float nw = std::min(bounds_.h * textureWidth_ / textureHeight_, (float)bounds_.w); - int x = bounds_.x + (bounds_.w - nw) / 2.0f; - - dc.Flush(); - dc.GetDrawContext()->BindTexture(0, texture); - dc.Draw()->Rect(x, bounds_.y, nw, bounds_.h, color); - dc.Flush(); - dc.RebindTexture(); -} diff --git a/UI/SavedataScreen.h b/UI/SavedataScreen.h index a1196238f5..e0ac8efdb0 100644 --- a/UI/SavedataScreen.h +++ b/UI/SavedataScreen.h @@ -97,23 +97,6 @@ private: std::string searchFilter_; }; -class GameImageView : public UI::InertView { -public: - GameImageView(const Path &gamePath, GameInfoFlags image, float scale, UI::LayoutParams *layoutParams = 0) - : InertView(layoutParams), image_(image), gamePath_(gamePath), scale_(scale) {} - - void GetContentDimensions(const UIContext &dc, float &w, float &h) const override; - void Draw(UIContext &dc) override; - std::string DescribeText() const override { return ""; } - -private: - Path gamePath_; - GameInfoFlags image_; - float scale_ = 1.0f; - int textureWidth_ = 0; - int textureHeight_ = 0; -}; - class SavedataButton : public UI::Clickable { public: SavedataButton(const Path &gamePath, UI::LayoutParams *layoutParams = 0) diff --git a/UWP/CoreUWP/CoreUWP.vcxproj b/UWP/CoreUWP/CoreUWP.vcxproj index 8ed06e7e0e..8fc5b8a974 100644 --- a/UWP/CoreUWP/CoreUWP.vcxproj +++ b/UWP/CoreUWP/CoreUWP.vcxproj @@ -315,6 +315,7 @@ + @@ -621,6 +622,7 @@ + @@ -1032,4 +1034,4 @@ - + \ No newline at end of file diff --git a/UWP/CoreUWP/CoreUWP.vcxproj.filters b/UWP/CoreUWP/CoreUWP.vcxproj.filters index 5789675c07..816635bf1e 100644 --- a/UWP/CoreUWP/CoreUWP.vcxproj.filters +++ b/UWP/CoreUWP/CoreUWP.vcxproj.filters @@ -75,6 +75,7 @@ + @@ -165,7 +166,6 @@ - @@ -410,6 +410,7 @@ + @@ -488,6 +489,7 @@ + @@ -680,12 +682,9 @@ -<<<<<<< HEAD -======= - ->>>>>>> cfb162d436 (Integrate Dolphin's granule based audio resampler.) + - + \ No newline at end of file diff --git a/android/jni/Android.mk b/android/jni/Android.mk index 0d0db04fff..33ad6789e2 100644 --- a/android/jni/Android.mk +++ b/android/jni/Android.mk @@ -758,6 +758,7 @@ EXEC_AND_LIB_FILES := \ $(SRC)/Core/Util/AtracTrack.cpp \ $(SRC)/Core/Util/AudioFormat.cpp \ $(SRC)/Core/Util/MemStick.cpp \ + $(SRC)/Core/Util/PathUtil.cpp \ $(SRC)/Core/Util/PortManager.cpp \ $(SRC)/Core/Util/GameDB.cpp \ $(SRC)/Core/Util/GameManager.cpp \ diff --git a/assets/lang/ar_AE.ini b/assets/lang/ar_AE.ini index 037446ec0d..fb7f8330e4 100644 --- a/assets/lang/ar_AE.ini +++ b/assets/lang/ar_AE.ini @@ -1010,6 +1010,7 @@ Some network functionality in this game is not working = Some network functional To play in Infrastructure Mode, you must enter a username = To play in Infrastructure Mode, you must enter a username Transfer files = نقل الملفات Unable to find UPnP device = Unable to find UPnP device +Upload files = رفع الملفات UPnP (port-forwarding) = UPnP (port forwarding) UPnP need to be reinitialized = UPnP need to be reinitialized UPnP use original port = UPnP use original port (enabled = PSP compatibility) diff --git a/assets/lang/az_AZ.ini b/assets/lang/az_AZ.ini index 765ca3ad81..5ab6c6e142 100644 --- a/assets/lang/az_AZ.ini +++ b/assets/lang/az_AZ.ini @@ -1005,6 +1005,7 @@ Some network functionality in this game is not working = Bu oyundakı bəzi bağ To play in Infrastructure Mode, you must enter a username = İnfrastruktur Modunda oynamaq üçün işlədici adı yazmalısınız Transfer files = Faylları köçürmək Unable to find UPnP device = UPnP qurğusu tapılmır +Upload files = Faylları yükləyin UPnP (port-forwarding) = UPnP (port yönləndirməsi) UPnP need to be reinitialized = UPnP, yenidən başladılmalıdır UPnP use original port = UPnP doğma portu işlədir (açıqdır = PSP uyumluğu) diff --git a/assets/lang/be_BY.ini b/assets/lang/be_BY.ini index 6bb0fae7e0..5950704cd4 100644 --- a/assets/lang/be_BY.ini +++ b/assets/lang/be_BY.ini @@ -969,6 +969,7 @@ Some network functionality in this game is not working = Some network functional To play in Infrastructure Mode, you must enter a username = To play in Infrastructure Mode, you must enter a username Transfer files = Перадаць файлы Unable to find UPnP device = Unable to find UPnP device +Upload files = Загрузіць файлы UPnP (port-forwarding) = UPnP (port forwarding) UPnP need to be reinitialized = UPnP need to be reinitialized UPnP use original port = UPnP use original port (enabled = PSP compatibility) diff --git a/assets/lang/bg_BG.ini b/assets/lang/bg_BG.ini index 6ab499c3f4..87c2c5dc8a 100644 --- a/assets/lang/bg_BG.ini +++ b/assets/lang/bg_BG.ini @@ -1002,6 +1002,7 @@ Some network functionality in this game is not working = Some network functional To play in Infrastructure Mode, you must enter a username = To play in Infrastructure Mode, you must enter a username Transfer files = Прехвърляне на файлове Unable to find UPnP device = Unable to find UPnP device +Upload files = Качване на файлове UPnP (port-forwarding) = UPnP (port forwarding) UPnP need to be reinitialized = UPnP need to be reinitialized UPnP use original port = UPnP use original port (enabled = PSP compatibility) diff --git a/assets/lang/ca_ES.ini b/assets/lang/ca_ES.ini index 0ea2e9c160..8a7ea14fcc 100644 --- a/assets/lang/ca_ES.ini +++ b/assets/lang/ca_ES.ini @@ -1002,6 +1002,7 @@ Some network functionality in this game is not working = Some network functional To play in Infrastructure Mode, you must enter a username = To play in Infrastructure Mode, you must enter a username Transfer files = Transferir fitxers Unable to find UPnP device = Unable to find UPnP device +Upload files = Pujar fitxers UPnP (port-forwarding) = UPnP (port forwarding) UPnP need to be reinitialized = UPnP need to be reinitialized UPnP use original port = UPnP use original port (enabled = PSP compatibility) diff --git a/assets/lang/cz_CZ.ini b/assets/lang/cz_CZ.ini index ee7efc0c21..98c043ba62 100644 --- a/assets/lang/cz_CZ.ini +++ b/assets/lang/cz_CZ.ini @@ -1002,6 +1002,7 @@ Some network functionality in this game is not working = Some network functional To play in Infrastructure Mode, you must enter a username = To play in Infrastructure Mode, you must enter a username Transfer files = Přenos souborů Unable to find UPnP device = Unable to find UPnP device +Upload files = Nahrát soubory UPnP (port-forwarding) = UPnP (port forwarding) UPnP need to be reinitialized = UPnP need to be reinitialized UPnP use original port = UPnP use original port (enabled = PSP compatibility) diff --git a/assets/lang/da_DK.ini b/assets/lang/da_DK.ini index 9eb598e12a..318a9f65cb 100644 --- a/assets/lang/da_DK.ini +++ b/assets/lang/da_DK.ini @@ -1002,6 +1002,7 @@ Some network functionality in this game is not working = Some network functional To play in Infrastructure Mode, you must enter a username = To play in Infrastructure Mode, you must enter a username Transfer files = Overfør filer Unable to find UPnP device = Unable to find UPnP device +Upload files = Upload filer UPnP (port-forwarding) = UPnP (port forwarding) UPnP need to be reinitialized = UPnP need to be reinitialized UPnP use original port = UPnP use original port (enabled = PSP compatibility) diff --git a/assets/lang/de_DE.ini b/assets/lang/de_DE.ini index 42b7ad9724..2b4122c52f 100644 --- a/assets/lang/de_DE.ini +++ b/assets/lang/de_DE.ini @@ -991,6 +991,7 @@ Some network functionality in this game is not working = Einige Netzwerkfunktion To play in Infrastructure Mode, you must enter a username = Um im Infrastrukturmodus zu spielen, musst du einen Benutzernamen eingeben Transfer files = Dateien übertragen Unable to find UPnP device = UPnP-Gerät konnte nicht gefunden werden +Upload files = Dateien hochladen UPnP (port-forwarding) = UPnP (Port-Weiterleitung) UPnP need to be reinitialized = UPnP muss neu initialisiert werden UPnP use original port = UPnP-Original-Port verwenden (aktiviert = PSP-Kompatibilität) diff --git a/assets/lang/dr_ID.ini b/assets/lang/dr_ID.ini index 2690e2555b..54487a071f 100644 --- a/assets/lang/dr_ID.ini +++ b/assets/lang/dr_ID.ini @@ -1002,6 +1002,7 @@ Some network functionality in this game is not working = Some network functional To play in Infrastructure Mode, you must enter a username = To play in Infrastructure Mode, you must enter a username Transfer files = Transfer file Unable to find UPnP device = Unable to find UPnP device +Upload files = Unggah file UPnP (port-forwarding) = UPnP (port forwarding) UPnP need to be reinitialized = UPnP need to be reinitialized UPnP use original port = UPnP use original port (enabled = PSP compatibility) diff --git a/assets/lang/en_US.ini b/assets/lang/en_US.ini index 967b6e3c2e..fd1e145f5c 100644 --- a/assets/lang/en_US.ini +++ b/assets/lang/en_US.ini @@ -993,6 +993,7 @@ Some network functionality in this game is not working = Some network functional To play in Infrastructure Mode, you must enter a username = To play in Infrastructure Mode, you must enter a username Transfer files = Transfer files Unable to find UPnP device = Unable to find UPnP device +Upload files = Upload files UPnP (port-forwarding) = UPnP (port forwarding) UPnP need to be reinitialized = UPnP need to be reinitialized UPnP use original port = UPnP use original port (enabled = PSP compatibility) diff --git a/assets/lang/es_ES.ini b/assets/lang/es_ES.ini index 7617433b99..837a6e434a 100644 --- a/assets/lang/es_ES.ini +++ b/assets/lang/es_ES.ini @@ -1003,6 +1003,7 @@ Some network functionality in this game is not working = Algunas funciones de re To play in Infrastructure Mode, you must enter a username = Para jugar en el modo Infraestructura, debes introducir un nombre de usuario Transfer files = Transferir archivos Unable to find UPnP device = Dispositivo UPnP no encontrado +Upload files = Subir archivos UPnP (port-forwarding) = UPnP (redirección de puertos) UPnP need to be reinitialized = Es necesario reiniciar UPnP UPnP use original port = UPnP usa puerto original (activado = compatibilidad PSP) diff --git a/assets/lang/es_LA.ini b/assets/lang/es_LA.ini index fd3c29b4e9..c38c9a47c3 100644 --- a/assets/lang/es_LA.ini +++ b/assets/lang/es_LA.ini @@ -1002,6 +1002,7 @@ Some network functionality in this game is not working = Some network functional To play in Infrastructure Mode, you must enter a username = To play in Infrastructure Mode, you must enter a username Transfer files = Transferir archivos Unable to find UPnP device = No se encuentra el dispositivo UPnP +Upload files = Subir archivos UPnP (port-forwarding) = UPnP (redirección de puertos) UPnP need to be reinitialized = La función de UPnP debe reinicializarse. UPnP use original port = Usar puerto UPnP de PSP (activado = más compatible con PSP ) diff --git a/assets/lang/fa_IR.ini b/assets/lang/fa_IR.ini index 429a4e5d03..3ea02c4033 100644 --- a/assets/lang/fa_IR.ini +++ b/assets/lang/fa_IR.ini @@ -1002,6 +1002,7 @@ Some network functionality in this game is not working = Some network functional To play in Infrastructure Mode, you must enter a username = To play in Infrastructure Mode, you must enter a username Transfer files = انتقال فایل‌ها Unable to find UPnP device = پیدا کردن دستگاه UPnP ممکن نیست +Upload files = بارگذاری فایل‌ها UPnP (port-forwarding) = UPnP (هدایت درگاه) UPnP need to be reinitialized = UPnP باید بازراه‌اندازی شود UPnP use original port = استفاده از درگاه اصلی UPnP (فعال = سازگاری با PSP) diff --git a/assets/lang/fi_FI.ini b/assets/lang/fi_FI.ini index 3d8475aa03..2c8bbacfe2 100644 --- a/assets/lang/fi_FI.ini +++ b/assets/lang/fi_FI.ini @@ -1002,6 +1002,7 @@ Some network functionality in this game is not working = Some network functional To play in Infrastructure Mode, you must enter a username = To play in Infrastructure Mode, you must enter a username Transfer files = Siirrä tiedostoja Unable to find UPnP device = Unable to find UPnP device +Upload files = Lataa tiedostoja UPnP (port-forwarding) = UPnP (port forwarding) UPnP need to be reinitialized = UPnP need to be reinitialized UPnP use original port = UPnP use original port (enabled = PSP compatibility) diff --git a/assets/lang/fr_FR.ini b/assets/lang/fr_FR.ini index e93c4377fc..905c0f3343 100644 --- a/assets/lang/fr_FR.ini +++ b/assets/lang/fr_FR.ini @@ -1002,6 +1002,7 @@ Some network functionality in this game is not working = Some network functional To play in Infrastructure Mode, you must enter a username = To play in Infrastructure Mode, you must enter a username Transfer files = Transférer des fichiers Unable to find UPnP device = Appareil UPnP introuvable +Upload files = Télécharger des fichiers UPnP (port-forwarding) = UPnP (redirection de port) UPnP need to be reinitialized = UPnP doit être réinitialisé UPnP use original port = Utiliser les ports originaux avec UPnP (activé = compatibilité PSP) diff --git a/assets/lang/gl_ES.ini b/assets/lang/gl_ES.ini index fc50f3a8e5..6f814759c8 100644 --- a/assets/lang/gl_ES.ini +++ b/assets/lang/gl_ES.ini @@ -1002,6 +1002,7 @@ Some network functionality in this game is not working = Some network functional To play in Infrastructure Mode, you must enter a username = To play in Infrastructure Mode, you must enter a username Transfer files = Transferir arquivos Unable to find UPnP device = Unable to find UPnP device +Upload files = Subir ficheiros UPnP (port-forwarding) = UPnP (port forwarding) UPnP need to be reinitialized = UPnP need to be reinitialized UPnP use original port = UPnP use original port (enabled = PSP compatibility) diff --git a/assets/lang/gr_EL.ini b/assets/lang/gr_EL.ini index 739b9622fe..756ba9c392 100644 --- a/assets/lang/gr_EL.ini +++ b/assets/lang/gr_EL.ini @@ -1002,6 +1002,7 @@ Some network functionality in this game is not working = Some network functional To play in Infrastructure Mode, you must enter a username = To play in Infrastructure Mode, you must enter a username Transfer files = Μεταφορά αρχείων Unable to find UPnP device = Unable to find UPnP device +Upload files = Ανεβάστε αρχεία UPnP (port-forwarding) = UPnP (port forwarding) UPnP need to be reinitialized = UPnP need to be reinitialized UPnP use original port = UPnP use original port (enabled = PSP compatibility) diff --git a/assets/lang/he_IL.ini b/assets/lang/he_IL.ini index fd813d48e2..2714a83e46 100644 --- a/assets/lang/he_IL.ini +++ b/assets/lang/he_IL.ini @@ -1002,6 +1002,7 @@ Some network functionality in this game is not working = Some network functional To play in Infrastructure Mode, you must enter a username = To play in Infrastructure Mode, you must enter a username Transfer files = העבר קבצים Unable to find UPnP device = Unable to find UPnP device +Upload files = העלה קבצים UPnP (port-forwarding) = UPnP (port forwarding) UPnP need to be reinitialized = UPnP need to be reinitialized UPnP use original port = UPnP use original port (enabled = PSP compatibility) diff --git a/assets/lang/he_IL_invert.ini b/assets/lang/he_IL_invert.ini index c979d4d772..d288ab2e36 100644 --- a/assets/lang/he_IL_invert.ini +++ b/assets/lang/he_IL_invert.ini @@ -999,6 +999,7 @@ Some network functionality in this game is not working = Some network functional To play in Infrastructure Mode, you must enter a username = To play in Infrastructure Mode, you must enter a username Transfer files = קבצים העבר Unable to find UPnP device = Unable to find UPnP device +Upload files = םִשָּׁא חֶבַּק UPnP (port-forwarding) = UPnP (port forwarding) UPnP need to be reinitialized = UPnP need to be reinitialized UPnP use original port = UPnP use original port (enabled = PSP compatibility) diff --git a/assets/lang/hr_HR.ini b/assets/lang/hr_HR.ini index 239b9bd8fa..ff6071962a 100644 --- a/assets/lang/hr_HR.ini +++ b/assets/lang/hr_HR.ini @@ -1002,6 +1002,7 @@ Some network functionality in this game is not working = Some network functional To play in Infrastructure Mode, you must enter a username = To play in Infrastructure Mode, you must enter a username Transfer files = Prenesi datoteke Unable to find UPnP device = Unable to find UPnP device +Upload files = Otprema datoteka UPnP (port-forwarding) = UPnP (port forwarding) UPnP need to be reinitialized = UPnP need to be reinitialized UPnP use original port = UPnP use original port (enabled = PSP compatibility) diff --git a/assets/lang/hu_HU.ini b/assets/lang/hu_HU.ini index 9b5d74e812..0395415929 100644 --- a/assets/lang/hu_HU.ini +++ b/assets/lang/hu_HU.ini @@ -1002,6 +1002,7 @@ Some network functionality in this game is not working = Some network functional To play in Infrastructure Mode, you must enter a username = To play in Infrastructure Mode, you must enter a username Transfer files = Fájlok átvitele Unable to find UPnP device = UPnP eszköz nem található +Upload files = Fájlok feltöltése UPnP (port-forwarding) = UPnP (port átirányítás) UPnP need to be reinitialized = UPnP újra-inicializálás szükséges UPnP use original port = UPnP eredeti portot használja (be = PSP kompatibilitás) diff --git a/assets/lang/id_ID.ini b/assets/lang/id_ID.ini index 0bfbfa3a29..6a13fb2303 100644 --- a/assets/lang/id_ID.ini +++ b/assets/lang/id_ID.ini @@ -1002,6 +1002,7 @@ Some network functionality in this game is not working = Beberapa fungsi jaringa To play in Infrastructure Mode, you must enter a username = Untuk bermain dalam Mode Infrastruktur, Anda harus memasukkan nama pengguna Transfer files = Transfer file Unable to find UPnP device = Tidak dapat menemukan perangkat UPnP +Upload files = Unggah berkas UPnP (port-forwarding) = UPnP (penerusan port) UPnP need to be reinitialized = UPnP perlu diinisialisasi ulang UPnP use original port = UPnP menggunakan port asli (diaktifkan = kompatibilitas PSP) diff --git a/assets/lang/it_IT.ini b/assets/lang/it_IT.ini index d272369b3e..cb847ad992 100644 --- a/assets/lang/it_IT.ini +++ b/assets/lang/it_IT.ini @@ -970,6 +970,7 @@ Some network functionality in this game is not working = Alcune funzionalità di To play in Infrastructure Mode, you must enter a username = Per giocare in modalità Infrastruttura, è necessario inserire un nome utente Transfer files = Trasferisci file Unable to find UPnP device = Impossibile trovare il dispositivo UPnP +Upload files = Carica file UPnP (port-forwarding) = UPnP (reindirizzamento della porta) UPnP need to be reinitialized = UPnP dev'essere reinizializzato UPnP use original port = Usa la porta originale di UPnP (attiva = compatibilità PSP) diff --git a/assets/lang/ja_JP.ini b/assets/lang/ja_JP.ini index 50663672f6..9b3d9eb15d 100644 --- a/assets/lang/ja_JP.ini +++ b/assets/lang/ja_JP.ini @@ -969,6 +969,7 @@ Some network functionality in this game is not working = このゲームの一 To play in Infrastructure Mode, you must enter a username = インフラストラクチャモードでプレイするには、ユーザー名を入力する必要があります Transfer files = ファイルを転送 Unable to find UPnP device = UPnPデバイスがみつかりません +Upload files = ファイルをアップロード UPnP (port-forwarding) = UPnP(ポートフォワーディング) UPnP need to be reinitialized = UPnPの再初期化が必要です UPnP use original port = UPnPでオリジナルのポートを使用する (有効 = PSP互換) diff --git a/assets/lang/jv_ID.ini b/assets/lang/jv_ID.ini index 7abf7c5ea4..db16372735 100644 --- a/assets/lang/jv_ID.ini +++ b/assets/lang/jv_ID.ini @@ -1002,6 +1002,7 @@ Some network functionality in this game is not working = Some network functional To play in Infrastructure Mode, you must enter a username = To play in Infrastructure Mode, you must enter a username Transfer files = Transfer file Unable to find UPnP device = Unable to find UPnP device +Upload files = Upload file UPnP (port-forwarding) = UPnP (port forwarding) UPnP need to be reinitialized = UPnP need to be reinitialized UPnP use original port = UPnP use original port (enabled = PSP compatibility) diff --git a/assets/lang/ko_KR.ini b/assets/lang/ko_KR.ini index b52243f061..d87659f739 100644 --- a/assets/lang/ko_KR.ini +++ b/assets/lang/ko_KR.ini @@ -969,6 +969,7 @@ Some network functionality in this game is not working = 이 게임의 일부 To play in Infrastructure Mode, you must enter a username = 인프라 모드에서 플레이하려면 사용자 이름을 입력해야 함 Transfer files = 파일 전송 Unable to find UPnP device = UPnP 장치를 찾을 수 없습니다. +Upload files = 파일 업로드 UPnP (port-forwarding) = UPnP (포트 포워딩) UPnP need to be reinitialized = UPnP를 다시 초기화해야 합니다. UPnP use original port = UPnP는 원래 포트를 사용합니다 (활성화됨 = PSP 호환성) diff --git a/assets/lang/ku_SO.ini b/assets/lang/ku_SO.ini index c694fa7353..c2fb4c655e 100644 --- a/assets/lang/ku_SO.ini +++ b/assets/lang/ku_SO.ini @@ -983,6 +983,7 @@ Some network functionality in this game is not working = Some network functional To play in Infrastructure Mode, you must enter a username = To play in Infrastructure Mode, you must enter a username Transfer files = Pelanên transfer bike Unable to find UPnP device = Unable to find UPnP device +Upload files = Pelên barkirin UPnP (port-forwarding) = UPnP (port forwarding) UPnP need to be reinitialized = UPnP need to be reinitialized UPnP use original port = UPnP use original port (enabled = PSP compatibility) diff --git a/assets/lang/lo_LA.ini b/assets/lang/lo_LA.ini index 414f17ad68..513834a778 100644 --- a/assets/lang/lo_LA.ini +++ b/assets/lang/lo_LA.ini @@ -1002,6 +1002,7 @@ Some network functionality in this game is not working = Some network functional To play in Infrastructure Mode, you must enter a username = To play in Infrastructure Mode, you must enter a username Transfer files = ເກັບໃສ່ໄຟລ໌ Unable to find UPnP device = Unable to find UPnP device +Upload files = ເອົາໄຟລ໌ UPnP (port-forwarding) = UPnP (port forwarding) UPnP need to be reinitialized = UPnP need to be reinitialized UPnP use original port = UPnP use original port (enabled = PSP compatibility) diff --git a/assets/lang/lt-LT.ini b/assets/lang/lt-LT.ini index 53b2fc8749..b6d93bf3e9 100644 --- a/assets/lang/lt-LT.ini +++ b/assets/lang/lt-LT.ini @@ -1002,6 +1002,7 @@ Some network functionality in this game is not working = Some network functional To play in Infrastructure Mode, you must enter a username = To play in Infrastructure Mode, you must enter a username Transfer files = Perkelti failus Unable to find UPnP device = Unable to find UPnP device +Upload files = Įkelti failus UPnP (port-forwarding) = UPnP (port forwarding) UPnP need to be reinitialized = UPnP need to be reinitialized UPnP use original port = UPnP use original port (enabled = PSP compatibility) diff --git a/assets/lang/ms_MY.ini b/assets/lang/ms_MY.ini index 955a3b5aaf..84c6735db3 100644 --- a/assets/lang/ms_MY.ini +++ b/assets/lang/ms_MY.ini @@ -1002,6 +1002,7 @@ Some network functionality in this game is not working = Some network functional To play in Infrastructure Mode, you must enter a username = To play in Infrastructure Mode, you must enter a username Transfer files = Pindahkan fail Unable to find UPnP device = Unable to find UPnP device +Upload files = Muat naik fail UPnP (port-forwarding) = UPnP (port forwarding) UPnP need to be reinitialized = UPnP need to be reinitialized UPnP use original port = UPnP use original port (enabled = PSP compatibility) diff --git a/assets/lang/nl_NL.ini b/assets/lang/nl_NL.ini index 7fe323f25e..b345bb5521 100644 --- a/assets/lang/nl_NL.ini +++ b/assets/lang/nl_NL.ini @@ -1002,6 +1002,7 @@ Some network functionality in this game is not working = Some network functional To play in Infrastructure Mode, you must enter a username = To play in Infrastructure Mode, you must enter a username Transfer files = Bestanden overdragen Unable to find UPnP device = Unable to find UPnP device +Upload files = Bestanden uploaden UPnP (port-forwarding) = UPnP (port forwarding) UPnP need to be reinitialized = UPnP need to be reinitialized UPnP use original port = UPnP use original port (enabled = PSP compatibility) diff --git a/assets/lang/no_NO.ini b/assets/lang/no_NO.ini index e26b98cbd2..f79433e9f0 100644 --- a/assets/lang/no_NO.ini +++ b/assets/lang/no_NO.ini @@ -1002,6 +1002,7 @@ Some network functionality in this game is not working = Some network functional To play in Infrastructure Mode, you must enter a username = To play in Infrastructure Mode, you must enter a username Transfer files = Overfør filer Unable to find UPnP device = Unable to find UPnP device +Upload files = Last opp filer UPnP (port-forwarding) = UPnP (port forwarding) UPnP need to be reinitialized = UPnP need to be reinitialized UPnP use original port = UPnP use original port (enabled = PSP compatibility) diff --git a/assets/lang/pl_PL.ini b/assets/lang/pl_PL.ini index 781c9a3360..84e390f219 100644 --- a/assets/lang/pl_PL.ini +++ b/assets/lang/pl_PL.ini @@ -998,6 +998,7 @@ Some network functionality in this game is not working = Niektóre funkcje sieci To play in Infrastructure Mode, you must enter a username = Aby grać w trybie infrastruktury, musisz wprowadzić nazwę użytkownika. Transfer files = Przenieś pliki Unable to find UPnP device = Nie udało się zlokalizować urządzenia UPnP +Upload files = Prześlij pliki UPnP (port-forwarding) = UPnP (przekierowanie portów) UPnP need to be reinitialized = Należy ponownie zainicjować UPnP UPnP use original port = UPnP używa oryginalnego portu (włączone = kompatybilność z PSP) diff --git a/assets/lang/pt_BR.ini b/assets/lang/pt_BR.ini index 75d9bf959e..527c83055b 100644 --- a/assets/lang/pt_BR.ini +++ b/assets/lang/pt_BR.ini @@ -992,6 +992,7 @@ Some network functionality in this game is not working = Algumas funcionalidades To play in Infrastructure Mode, you must enter a username = Pra jogar no Modo de Infra-estrutura você deve inserir um nome de usuário Transfer files = Transferir arquivos Unable to find UPnP device = Incapaz de achar o dispositivo UPnP +Upload files = Enviar arquivos UPnP (port-forwarding) = UPnP (abertura das portas) UPnP need to be reinitialized = O UPnP precisa ser reinicializado UPnP use original port = O UPnP usa a porta original (ativado = compatibilidade com o PSP) diff --git a/assets/lang/pt_PT.ini b/assets/lang/pt_PT.ini index 092baed3c3..d8862f3fa3 100644 --- a/assets/lang/pt_PT.ini +++ b/assets/lang/pt_PT.ini @@ -994,6 +994,7 @@ Some network functionality in this game is not working = Some network functional To play in Infrastructure Mode, you must enter a username = To play in Infrastructure Mode, you must enter a username Transfer files = Transferir ficheiros Unable to find UPnP device = Não é possível encontrar o dispositivo UPnP +Upload files = Carregar ficheiros UPnP (port-forwarding) = UPnP (abertura das portas) UPnP need to be reinitialized = O UPnP precisa ser reiniciado UPnP use original port = O UPnP usa a porta original (ativado = compatibilidade com a PSP) diff --git a/assets/lang/ro_RO.ini b/assets/lang/ro_RO.ini index ee67a98fe9..48c814612a 100644 --- a/assets/lang/ro_RO.ini +++ b/assets/lang/ro_RO.ini @@ -1003,6 +1003,7 @@ Some network functionality in this game is not working = Some network functional To play in Infrastructure Mode, you must enter a username = To play in Infrastructure Mode, you must enter a username Transfer files = Transferați fișiere Unable to find UPnP device = Unable to find UPnP device +Upload files = Încărcați fișiere UPnP (port-forwarding) = UPnP (port forwarding) UPnP need to be reinitialized = UPnP need to be reinitialized UPnP use original port = UPnP use original port (enabled = PSP compatibility) diff --git a/assets/lang/ru_RU.ini b/assets/lang/ru_RU.ini index 73196423bc..22e0e34a84 100644 --- a/assets/lang/ru_RU.ini +++ b/assets/lang/ru_RU.ini @@ -969,6 +969,7 @@ Some network functionality in this game is not working = Некоторые се To play in Infrastructure Mode, you must enter a username = Для игры в режиме инфраструктуры необходимо ввести имя пользователя Transfer files = Перенос файлов Unable to find UPnP device = Невозможно найти устройство UPnP +Upload files = Загрузить файлы UPnP (port-forwarding) = UPnP (проброс портов) UPnP need to be reinitialized = Необходимо перезапустить UPnP UPnP use original port = Использовать оригинальный порт UPnP (включено = совместимость с PSP) diff --git a/assets/lang/sv_SE.ini b/assets/lang/sv_SE.ini index 20090c4691..ca98005a25 100644 --- a/assets/lang/sv_SE.ini +++ b/assets/lang/sv_SE.ini @@ -970,6 +970,7 @@ Some network functionality in this game is not working = Viss nätverksfunktiona To play in Infrastructure Mode, you must enter a username = För att spela i infrastrukturläge måste du ange ett användarnamn Transfer files = Överför filer Unable to find UPnP device = Kunde inte hitta UPnP-enhet +Upload files = Ladda upp filer UPnP (port-forwarding) = UPnP (port forwarding) UPnP need to be reinitialized = UPnP behöver ominitialiseras UPnP use original port = UPnP use original port (enabled = PSP compatibility) diff --git a/assets/lang/tg_PH.ini b/assets/lang/tg_PH.ini index f797e907e9..1a1c66c871 100644 --- a/assets/lang/tg_PH.ini +++ b/assets/lang/tg_PH.ini @@ -1003,6 +1003,7 @@ Some network functionality in this game is not working = Some network functional To play in Infrastructure Mode, you must enter a username = To play in Infrastructure Mode, you must enter a username Transfer files = Файли интиқол кунед Unable to find UPnP device = Hindi mahanap ang UPnP device +Upload files = Гирифтан файли UPnP (port-forwarding) = UPnP (pagpapasa ng port) UPnP need to be reinitialized = Kailangang muling simulan ang UPnP UPnP use original port = Gamitin ang orihinal na port ng UPnP (enabled = PSP compatibility) diff --git a/assets/lang/th_TH.ini b/assets/lang/th_TH.ini index 3f14ed3446..b50272d404 100644 --- a/assets/lang/th_TH.ini +++ b/assets/lang/th_TH.ini @@ -1021,6 +1021,7 @@ Some network functionality in this game is not working = ฟังก์ชั To play in Infrastructure Mode, you must enter a username = การเล่นในโหมด Infrastructure คุณจะต้องป้อนชื่อผู้ใช้งาน Transfer files = โอนไฟล์ Unable to find UPnP device = ไม่พบอุปกรณ์ UPnP +Upload files = อัพโหลดไฟล์ UPnP (port-forwarding) = โพรโตคอล UPnP (ฟอร์เวิร์ด พอร์ต อัตโนมัติ) UPnP need to be reinitialized = UPnP จำเป็นต้องเริ่มการทำงานใหม่ UPnP use original port = UPnP ใช้พอร์ตค่าเริ่มต้น (เปิดใช้งาน = เล่นกับเครื่อง PSP) diff --git a/assets/lang/tr_TR.ini b/assets/lang/tr_TR.ini index 748a6dc13b..cf1083351f 100644 --- a/assets/lang/tr_TR.ini +++ b/assets/lang/tr_TR.ini @@ -1004,6 +1004,7 @@ Some network functionality in this game is not working = Bu oyundaki bazı ağ i To play in Infrastructure Mode, you must enter a username = Altyapı modunda oynamak için bir kullanıcı adı girmelisiniz Transfer files = Dosyaları aktar Unable to find UPnP device = UPnP cihazı bulunamıyor +Upload files = Dosya yükle UPnP (port-forwarding) = UPnP (Port Yönlendirme) UPnP need to be reinitialized = UPnP yeniden başlatılmalı UPnP use original port = UPnP Orijinal Port Kullan diff --git a/assets/lang/uk_UA.ini b/assets/lang/uk_UA.ini index e6db49cf0b..48ca7396b1 100644 --- a/assets/lang/uk_UA.ini +++ b/assets/lang/uk_UA.ini @@ -1002,6 +1002,7 @@ Some network functionality in this game is not working = Some network functional To play in Infrastructure Mode, you must enter a username = To play in Infrastructure Mode, you must enter a username Transfer files = Передати файли Unable to find UPnP device = Неможливо знайти пристрій UPnP +Upload files = Завантажити файли UPnP (port-forwarding) = UPnP (переадресація портів) UPnP need to be reinitialized = UPnP необхідно повторно ініціалізувати UPnP use original port = UPnP використовує оригінальний порт (увімкнуто = PSP сумісність) diff --git a/assets/lang/vi_VN.ini b/assets/lang/vi_VN.ini index e6e3a35f73..1c8d33f670 100644 --- a/assets/lang/vi_VN.ini +++ b/assets/lang/vi_VN.ini @@ -1002,6 +1002,7 @@ Some network functionality in this game is not working = Some network functional To play in Infrastructure Mode, you must enter a username = To play in Infrastructure Mode, you must enter a username Transfer files = Chuyển tệp Unable to find UPnP device = Unable to find UPnP device +Upload files = Tải lên tệp UPnP (port-forwarding) = UPnP (port forwarding) UPnP need to be reinitialized = UPnP need to be reinitialized UPnP use original port = UPnP use original port (enabled = PSP compatibility) diff --git a/assets/lang/zh_CN.ini b/assets/lang/zh_CN.ini index 4b3b306360..fa33c33422 100644 --- a/assets/lang/zh_CN.ini +++ b/assets/lang/zh_CN.ini @@ -1003,6 +1003,7 @@ Some network functionality in this game is not working = 此游戏中的某些 To play in Infrastructure Mode, you must enter a username = 您必须输入用户名,才能在基础模式下游玩 Transfer files = 传输文件 Unable to find UPnP device = 未找到UPnP设备 +Upload files = 上传文件 UPnP (port-forwarding) = UPnP (端口转发) UPnP need to be reinitialized = UPnP 需要重新初始化 UPnP use original port = UPnP 使用原始端口 (启用=兼容PSP) diff --git a/assets/lang/zh_TW.ini b/assets/lang/zh_TW.ini index 9574d63b47..247b44b83d 100644 --- a/assets/lang/zh_TW.ini +++ b/assets/lang/zh_TW.ini @@ -969,6 +969,7 @@ Some network functionality in this game is not working = 此遊戲中的某些 To play in Infrastructure Mode, you must enter a username = 您必須輸入使用者名稱,才能在基礎模式下游玩 Transfer files = 傳輸檔案 Unable to find UPnP device = 找不到 UPnP 裝置 +Upload files = 上傳檔案 UPnP (port-forwarding) = UPnP (連接埠轉送) UPnP need to be reinitialized = UPnP 需要重新初始化 UPnP use original port = UPnP 使用原始連接埠 (已啟用 = PSP 相容性) diff --git a/libretro/Makefile.common b/libretro/Makefile.common index 05bf0f0763..7366387d1e 100644 --- a/libretro/Makefile.common +++ b/libretro/Makefile.common @@ -887,6 +887,7 @@ SOURCES_CXX += \ $(COREDIR)/Util/PPGeDraw.cpp \ $(COREDIR)/Util/RecentFiles.cpp \ $(COREDIR)/Util/AudioFormat.cpp \ + $(COREDIR)/Util/PathUtil.cpp \ $(COREDIR)/Util/PortManager.cpp \ $(CORE_DIR)/UI/GameInfoCache.cpp