Merge pull request #21371 from hrydgard/ui-fixes

Various cleanups, iCloud fix
This commit is contained in:
Henrik Rydgård
2026-03-07 10:21:38 +01:00
committed by GitHub
60 changed files with 130 additions and 71 deletions
-1
View File
@@ -1096,7 +1096,6 @@ static const ConfigSetting debuggerSettings[] = {
ConfigSetting("ConsoleWindowY", SETTING(g_Config, iConsoleWindowY), -1, CfgFlag::DEFAULT),
ConfigSetting("FontWidth", SETTING(g_Config, iFontWidth), 8, CfgFlag::DEFAULT),
ConfigSetting("FontHeight", SETTING(g_Config, iFontHeight), 12, CfgFlag::DEFAULT),
ConfigSetting("DisplayStatusBar", SETTING(g_Config, bDisplayStatusBar), true, CfgFlag::DEFAULT),
ConfigSetting("ShowBottomTabTitles",SETTING(g_Config, bShowBottomTabTitles), true, CfgFlag::DEFAULT),
ConfigSetting("ShowDeveloperMenu", SETTING(g_Config, bShowDeveloperMenu), false, CfgFlag::DEFAULT),
ConfigSetting("SkipDeadbeefFilling", SETTING(g_Config, bSkipDeadbeefFilling), false, CfgFlag::DEFAULT),
-1
View File
@@ -622,7 +622,6 @@ public:
int iConsoleWindowY;
int iFontWidth;
int iFontHeight;
bool bDisplayStatusBar;
bool bShowBottomTabTitles;
bool bShowDeveloperMenu;
+6 -2
View File
@@ -199,7 +199,9 @@ void AdhocLoadServerList() {
std::string json;
request.buffer().TakeAll(&json);
ParseServerListEntriesJSON(std::string_view(json.data(), json.size()));
if (!ParseServerListEntriesJSON(std::string_view(json.data(), json.size()))) {
LoadFallbackServerList();
}
});
} else if (!g_Config.sAdhocServerListUrl.empty()) {
// Try to read local file.
@@ -210,7 +212,9 @@ void AdhocLoadServerList() {
LoadFallbackServerList();
return;
}
ParseServerListEntriesJSON(std::string_view(json.data(), json.size()));
if (!ParseServerListEntriesJSON(std::string_view(json.data(), json.size()))) {
LoadFallbackServerList();
}
} else {
LoadFallbackServerList();
}
+4
View File
@@ -155,6 +155,10 @@ bool TryUpdateSavedPath(Path *path) {
#if PPSSPP_PLATFORM(IOS)
// DEBUG_LOG(Log::Loader, "Original path: %s", path->c_str());
std::string pathStr = path->ToString();
if (startsWith(pathStr, "/private/var/mobile/Containers/Data/Application/")) {
// For in-application files only, strip off the /private prefix if present - it's sometimes there, sometimes not.
pathStr = pathStr.substr(8);
}
const std::string_view applicationRoot = "/var/mobile/Containers/Data/Application/";
if (startsWith(pathStr, applicationRoot)) {
+3 -3
View File
@@ -1469,12 +1469,12 @@ checksum = "67b1b7a3b5fe4f1376887184045fcf45c69e92af734b7aaddc05fb777b6fbd03"
[[package]]
name = "socket2"
version = "0.6.2"
version = "0.6.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "86f4aa3ad99f2088c990dfa82d367e19cb29268ed67c574d10d0a4bfe71f07e0"
checksum = "3a766e1110788c36f4fa1c2b71b387a7815aa65f88ce0229841826633d93723e"
dependencies = [
"libc",
"windows-sys 0.60.2",
"windows-sys 0.61.2",
]
[[package]]
+2 -5
View File
@@ -996,11 +996,8 @@ fn execute_command(cmd: Command, ai: Option<&ChatGPT>, dry_run: bool, verbose: b
}
}
println!("Langtool processing reference {reference_ini_filename}");
if !dry_run {
reference_ini.write().unwrap();
}
// Don't need to additionally process reference here like we did before, this is done
// in the main loop.
}
fn generate_ai_response(
+14 -7
View File
@@ -54,16 +54,23 @@ void DarwinFileSystemServices::ClearDelegate() {
}
- (void)documentPicker:(UIDocumentPickerViewController *)controller didPickDocumentsAtURLs:(NSArray<NSURL *> *)urls {
std::string pathStr = urls[0].path.UTF8String;
// Strip /private prefix if present.
if (startsWith(pathStr, "/private/var/mobile/Containers/Data/Application/")) {
pathStr = pathStr.substr(8);
NSURL *url = urls.firstObject;
if (!url) {
self.panelCallback(false, Path());
return;
}
if (urls.count >= 1)
self.panelCallback(true, Path(pathStr));
else
// 1. Start accessing the resource
BOOL success = [url startAccessingSecurityScopedResource];
if (success) {
// 2. Pass the path to PPSSPP
// Note: In a real app, you'd want to call stopAccessingSecurityScopedResource
// when the game is closed, otherwise you "leak" kernel permissions.
self.panelCallback(true, Path(url.path.UTF8String));
} else {
ERROR_LOG(Log::System, "Failed to start accessing security scoped resource for: %s", url.path.UTF8String);
self.panelCallback(false, Path());
}
INFO_LOG(Log::System, "Callback processed, pre-emptively hide keyboard");
[sharedViewController hideKeyboard];
+1 -1
View File
@@ -1315,7 +1315,7 @@ void CtrlDisAsmView::disassembleToFile() {
}
std::string filename;
if (W32Util::BrowseForFileName(false, nullptr, L"Save Disassembly As...", nullptr, L"All Files\0*.*\0\0", nullptr, filename)) {
if (W32Util::BrowseForFileName(false, nullptr, L"Save Disassembly As...", nullptr, nullptr, L"All Files\0*.*\0\0", nullptr, filename)) {
std::wstring fileName = ConvertUTF8ToWString(filename);
FILE *output = _wfopen(fileName.c_str(), L"wb");
if (output == nullptr) {
+2 -9
View File
@@ -112,9 +112,6 @@ CDisasm::CDisasm(HINSTANCE _hInstance, HWND _hParent, MIPSDebugInterface *_cpu)
// init status bar
statusBarWnd = CreateWindowEx(0, STATUSCLASSNAME, L"", WS_CHILD | WS_VISIBLE, 0, 0, 0, 0, m_hDlg, (HMENU)IDC_DISASMSTATUSBAR, _hInstance, NULL);
if (g_Config.bDisplayStatusBar == false) {
ShowWindow(statusBarWnd,SW_HIDE);
}
// set it to use two parts
RECT statusBarRect;
@@ -614,12 +611,8 @@ void CDisasm::UpdateSize(WORD width, WORD height)
HWND bottomTabs = GetDlgItem(m_hDlg, IDC_DEBUG_BOTTOMTABS);
// ignore the status bar
int topHeightOffset = 0;
if (g_Config.bDisplayStatusBar)
{
GetWindowRect(statusBarWnd,&windowRect);
topHeightOffset = (windowRect.bottom-windowRect.top);
}
GetWindowRect(statusBarWnd, &windowRect);
int topHeightOffset = (windowRect.bottom - windowRect.top);
CtrlDisAsmView *ptr = DisAsmView();
int disassemblyRowHeight = ptr->getRowHeight();
+1 -1
View File
@@ -20,7 +20,7 @@ void DumpMemoryWindow::HandleBrowseClick(HWND hwnd) {
GetWindowTextW(filenameWnd, &buffer[0], (int)buffer.size());
std::string fn = ConvertWStringToUTF8(buffer);
bool result = W32Util::BrowseForFileName(false, hwnd, L"Select filename", NULL, NULL, NULL, fn);
bool result = W32Util::BrowseForFileName(false, hwnd, L"Select filename", nullptr, L"dump.bin", nullptr, nullptr, fn);
if (result) {
filenameChosen_ = true;
buffer = ConvertUTF8ToWString(fn);
+1 -1
View File
@@ -439,7 +439,7 @@ void CGEDebugger::DescribeSecondPreview(const GPUgstate &state, char desc[256])
void CGEDebugger::PreviewExport(const GPUDebugBuffer *dbgBuffer) {
constexpr const wchar_t *filter = L"PNG Image (*.png)\0*.png\0JPEG Image (*.jpg)\0*.jpg\0All files\0*.*\0\0";
std::string fn;
if (W32Util::BrowseForFileName(false, GetDlgHandle(), L"Save Preview Image...", nullptr, filter, L"png", fn)) {
if (W32Util::BrowseForFileName(false, GetDlgHandle(), L"Save Preview Image...", nullptr, L"preview.png", filter, L"png", fn)) {
ScreenshotFormat fmt = fn.find(".jpg") != fn.npos ? ScreenshotFormat::JPG : ScreenshotFormat::PNG;
Path filename(fn);
+9 -7
View File
@@ -558,7 +558,7 @@ namespace MainWindow {
case ID_FILE_LOADSTATEFILE:
if (!Achievements::WarnUserIfHardcoreModeActive(false) && !NetworkWarnUserIfOnlineAndCantSavestate()) {
if (W32Util::BrowseForFileName(true, hWnd, L"Load state", 0, L"Save States (*.ppst)\0*.ppst\0All files\0*.*\0\0", L"ppst", fn)) {
if (W32Util::BrowseForFileName(true, hWnd, L"Load state", nullptr, nullptr, L"Save States (*.ppst)\0*.ppst\0All files\0*.*\0\0", L"ppst", fn)) {
SetCursor(LoadCursor(0, IDC_WAIT));
SaveState::Load(Path(fn), -1, SaveStateActionFinished);
}
@@ -566,7 +566,7 @@ namespace MainWindow {
break;
case ID_FILE_SAVESTATEFILE:
if (!Achievements::WarnUserIfHardcoreModeActive(true) && !NetworkWarnUserIfOnlineAndCantSavestate()) {
if (W32Util::BrowseForFileName(false, hWnd, L"Save state", 0, L"Save States (*.ppst)\0*.ppst\0All files\0*.*\0\0", L"ppst", fn)) {
if (W32Util::BrowseForFileName(false, hWnd, L"Save state", nullptr, L"state.ppst", L"Save States (*.ppst)\0*.ppst\0All files\0*.*\0\0", L"ppst", fn)) {
SetCursor(LoadCursor(0, IDC_WAIT));
SaveState::Save(Path(fn), -1, SaveStateActionFinished);
}
@@ -773,27 +773,29 @@ namespace MainWindow {
}
case ID_DEBUG_LOADMAPFILE:
if (W32Util::BrowseForFileName(true, hWnd, L"Load .ppmap", 0, L"Maps\0*.ppmap\0All files\0*.*\0\0", L"ppmap", fn)) {
if (W32Util::BrowseForFileName(true, hWnd, L"Load .ppmap", nullptr, nullptr, L"Maps\0*.ppmap\0All files\0*.*\0\0", L"ppmap", fn)) {
g_symbolMap->LoadSymbolMap(Path(fn));
NotifyDebuggerMapLoaded();
}
break;
case ID_DEBUG_SAVEMAPFILE:
if (W32Util::BrowseForFileName(false, hWnd, L"Save .ppmap", 0, L"Maps\0*.ppmap\0All files\0*.*\0\0", L"ppmap", fn))
if (W32Util::BrowseForFileName(false, hWnd, L"Save .ppmap", nullptr, L"map.ppmap", L"Maps\0*.ppmap\0All files\0*.*\0\0", L"ppmap", fn)) {
g_symbolMap->SaveSymbolMap(Path(fn));
}
break;
case ID_DEBUG_LOADSYMFILE:
if (W32Util::BrowseForFileName(true, hWnd, L"Load .sym", 0, L"Symbols\0*.sym\0All files\0*.*\0\0", L"sym", fn)) {
if (W32Util::BrowseForFileName(true, hWnd, L"Load .sym", nullptr, nullptr, L"Symbols\0*.sym\0All files\0*.*\0\0", L"sym", fn)) {
g_symbolMap->LoadNocashSym(Path(fn));
NotifyDebuggerMapLoaded();
}
break;
case ID_DEBUG_SAVESYMFILE:
if (W32Util::BrowseForFileName(false, hWnd, L"Save .sym", 0, L"Symbols\0*.sym\0All files\0*.*\0\0", L"sym", fn))
if (W32Util::BrowseForFileName(false, hWnd, L"Save .sym", nullptr, L"symbols.sym", L"Symbols\0*.sym\0All files\0*.*\0\0", L"sym", fn)) {
g_symbolMap->SaveNocashSym(Path(fn));
}
break;
case ID_DEBUG_RESETSYMBOLTABLE:
@@ -845,7 +847,7 @@ namespace MainWindow {
MessageBox(hWnd, L"File does not exist.", L"Sorry", 0);
} else if (info.type == FILETYPE_DIRECTORY) {
MessageBox(hWnd, L"Cannot extract directories.", L"Sorry", 0);
} else if (W32Util::BrowseForFileName(false, hWnd, L"Save file as...", 0, L"All files\0*.*\0\0", L"", fn)) {
} else if (W32Util::BrowseForFileName(false, hWnd, L"Save file as...", nullptr, nullptr, L"All files\0*.*\0\0", L"", fn)) {
const u32 handle = pspFileSystem.OpenFile(filename, FILEACCESS_READ, "");
// Note: len may be in blocks.
size_t len = pspFileSystem.SeekFile(handle, 0, FILEMOVE_END);
+11 -21
View File
@@ -114,40 +114,30 @@ std::string BrowseForFolder2(HWND parent, std::string_view title, std::string_vi
}
bool BrowseForFileName(bool _bLoad, HWND _hParent, const wchar_t *_pTitle,
const wchar_t *_pInitialFolder, const wchar_t *_pFilter, const wchar_t *_pExtension,
const wchar_t *_pInitialFolder, const wchar_t *initialFilename, const wchar_t *_pFilter, const wchar_t *_pExtension,
std::string &_strFileName) {
// Let's hope this is large enough, don't want to trigger the dialog twice...
std::wstring filenameBuffer(32768 * 10, '\0');
wchar_t fileBuffer[2048]{};
wchar_t fileNameBuffer[2048]{};
if (initialFilename) {
wcscpy_s(fileBuffer, initialFilename);
}
OPENFILENAME ofn{ sizeof(OPENFILENAME) };
auto resetFileBuffer = [&] {
ofn.nMaxFile = (DWORD)filenameBuffer.size();
ofn.lpstrFile = &filenameBuffer[0];
if (!_strFileName.empty())
wcsncpy(ofn.lpstrFile, ConvertUTF8ToWString(_strFileName).c_str(), filenameBuffer.size() - 1);
};
resetFileBuffer();
ofn.lpstrInitialDir = _pInitialFolder;
ofn.lpstrFilter = _pFilter;
ofn.lpstrFileTitle = nullptr;
ofn.nMaxFileTitle = 0;
ofn.lpstrFileTitle = fileNameBuffer;
ofn.nMaxFileTitle = ARRAY_SIZE(fileNameBuffer);
ofn.lpstrDefExt = _pExtension;
ofn.hwndOwner = _hParent;
ofn.lpstrFile = fileBuffer;
ofn.nMaxFile = ARRAY_SIZE(fileBuffer);
ofn.Flags = OFN_NOCHANGEDIR | OFN_EXPLORER;
if (!_bLoad)
ofn.Flags |= OFN_HIDEREADONLY;
int success = _bLoad ? GetOpenFileName(&ofn) : GetSaveFileName(&ofn);
if (success == 0 && CommDlgExtendedError() == FNERR_BUFFERTOOSMALL) {
size_t sz = *(unsigned short *)&filenameBuffer[0];
// Documentation is unclear if this is WCHARs to CHARs.
filenameBuffer.resize(filenameBuffer.size() + sz * 2);
resetFileBuffer();
success = _bLoad ? GetOpenFileName(&ofn) : GetSaveFileName(&ofn);
}
if (success) {
_strFileName = ConvertWStringToUTF8(ofn.lpstrFile);
return true;
+1 -1
View File
@@ -11,7 +11,7 @@ namespace W32Util {
std::string BrowseForFolder2(HWND parent, std::string_view title, std::string_view initialPath);
bool BrowseForFileName(bool _bLoad, HWND _hParent, const wchar_t*_pTitle,
const wchar_t *_pInitialFolder, const wchar_t *_pFilter, const wchar_t*_pExtension,
const wchar_t *_pInitialFolder, const wchar_t *initialFilename, const wchar_t *_pFilter, const wchar_t*_pExtension,
std::string& _strFileName);
std::vector<std::string> BrowseForFileNameMultiSelect(bool _bLoad, HWND _hParent, const wchar_t*_pTitle,
const wchar_t*_pInitialFolder, const wchar_t*_pFilter, const wchar_t*_pExtension);
+6 -5
View File
@@ -686,7 +686,7 @@ bool System_MakeRequest(SystemRequestType type, int requestId, const std::string
std::thread([=] {
SetCurrentThreadName("BrowseForImage");
std::string out;
if (W32Util::BrowseForFileName(true, MainWindow::GetHWND(), ConvertUTF8ToWString(param1).c_str(), nullptr,
if (W32Util::BrowseForFileName(true, MainWindow::GetHWND(), ConvertUTF8ToWString(param1).c_str(), nullptr, nullptr,
FinalizeFilter(L"All supported images (*.jpg *.jpeg *.png)|*.jpg;*.jpeg;*.png|All files (*.*)|*.*||").c_str(), L"jpg", out)) {
g_requestManager.PostSystemSuccess(requestId, out.c_str());
} else {
@@ -699,16 +699,17 @@ bool System_MakeRequest(SystemRequestType type, int requestId, const std::string
{
const BrowseFileType browseType = (BrowseFileType)param3;
std::wstring filter = MakeWindowsFilter(browseType);
std::wstring initialFilename = ConvertUTF8ToWString(param2); // TODO: Plumb through
std::string initialFilename = param2;
if (filter.empty()) {
// Unsupported.
return false;
}
const bool load = type == SystemRequestType::BROWSE_FOR_FILE;
std::thread([=] {
std::thread([load, param1, initialFilename, filter, requestId] {
SetCurrentThreadName("BrowseForFile");
std::string out;
if (W32Util::BrowseForFileName(load, MainWindow::GetHWND(), ConvertUTF8ToWString(param1).c_str(), nullptr, filter.c_str(), L"", out)) {
std::string out = initialFilename;
std::wstring wInitial = ConvertUTF8ToWString(initialFilename);
if (W32Util::BrowseForFileName(load, MainWindow::GetHWND(), ConvertUTF8ToWString(param1).c_str(), nullptr, wInitial.c_str(), filter.c_str(), L"", out)) {
g_requestManager.PostSystemSuccess(requestId, out.c_str());
} else {
g_requestManager.PostSystemFailure(requestId);
+13
View File
@@ -49,6 +49,7 @@
"name": "ArenaAnywhere SA",
"host": "relay-sa.arenaanywhere.site",
"discord": "https://discord.gg/GdsXWmNHq5",
"ip": "34.35.138.175",
"web": "",
"location": "South Africa",
"description": "For players looking to play any games",
@@ -58,6 +59,7 @@
"name": "ArenaAnywhere EU",
"host": "relay.arenaanywhere.site",
"discord": "https://discord.gg/GdsXWmNHq5",
"ip": "34.91.25.46",
"web": "",
"location": "Europe",
"description": "For players looking to play any games",
@@ -67,11 +69,22 @@
"name": "ArenaAnywhere Dubai",
"host": "relay-dubai.arenaanywhere.site",
"discord": "https://discord.gg/GdsXWmNHq5",
"ip": "34.165.197.39",
"web": "",
"location": "Dubai",
"description": "For players looking to play any games",
"data_mode": "AemuPostoffice"
},
{
"name": "ArenaAnywhere Asia",
"host": "relay-asia.arenaanywhere.site",
"ip": "35.198.217.43",
"discord": "https://discord.gg/GdsXWmNHq5",
"web": "",
"location": "Singapore",
"description": "For players looking to play any games",
"data_mode": "AemuPostoffice"
},
{
"name": "Retroverze Relay Beta",
"host": "psp.retroverze.my.id",
+1
View File
@@ -69,6 +69,7 @@ This game has no achievements = لا تحتوي هذه اللعبة على اي
Top players = افضل اللاعبين
Unlocked = الإنجازات المفتوحة
Unofficial = الإنجازات الغير رسمية
Unofficial achievements = إنجازات غير رسمية # AI translated
Unsupported = الإنجازات الغير مدعومة
Win = فوز
+1 -2
View File
@@ -61,6 +61,7 @@ This game has no achievements = Bu oyunun uğurları yoxdur
Top players = Ən üst oyunçular
Unlocked = Açılmış uğurlar
Unofficial = Rəsmi olmayan uğurlar
Unofficial achievements = Rəsmi olmayan nailiyyətlər # AI translated
Unsupported = Dəstəklənməyən uğurlar
Win = Qalib gəlmək
@@ -683,7 +684,6 @@ FPS = FPS
Frame presentation mode = Kadr göstərmə rejimi
Frame Rate Control = Kadr yönəldilişi
Frame Skipping = Kadr buraxılışı
Frame Skipping Type = Kadr buraxılış biçimi
Framerate mode = Kadr tezliyi modu
Full screen = Bütün ekran
Geometry shader culling = Həndəsə kölgəl-sinin ayıqlanışı
@@ -734,7 +734,6 @@ Off = Sönülü
OpenGL = OpenGL
Overlay Information = Örtük bilgisi
Partial Stretch = Qismən dart
Percent of FPS = FPS faizi
Performance = Göstəriş
Postprocessing shaders = İşləm sonrası kölgələndirmələr
Recreate Activity = Etkinliyi yenidən yarat
+1
View File
@@ -61,6 +61,7 @@ This game has no achievements = This game has no achievements
Top players = Найлепшыя гульцы
Unlocked = Разблакаваныя дасягненні
Unofficial = Неафіцыйныя дасягненні
Unofficial achievements = Нефармальныя дасягненні # AI translated
Unsupported = Непадтрымоўваныя дасягненні
Win = Пераможца
+1
View File
@@ -61,6 +61,7 @@ This game has no achievements = This game has no achievements
Top players = Top players
Unlocked = Unlocked
Unofficial = Unofficial
Unofficial achievements = Неправителствени постижения # AI translated
Unsupported = Unsupported
Win = Победа
+1
View File
@@ -61,6 +61,7 @@ This game has no achievements = This game has no achievements
Top players = Top players
Unlocked = Unlocked
Unofficial = Unofficial
Unofficial achievements = Èxits no oficials # AI translated
Unsupported = Unsupported
Win = Guanyar
+1
View File
@@ -61,6 +61,7 @@ This game has no achievements = This game has no achievements
Top players = Top players
Unlocked = Unlocked
Unofficial = Unofficial
Unofficial achievements = Neoficiální úspěchy # AI translated
Unsupported = Unsupported
Win = Vyhrát
+1
View File
@@ -61,6 +61,7 @@ This game has no achievements = This game has no achievements
Top players = Top players
Unlocked = Unlocked
Unofficial = Unofficial
Unofficial achievements = Uofficielle præstationer # AI translated
Unsupported = Unsupported
Win = Vinde
+1
View File
@@ -61,6 +61,7 @@ This game has no achievements = Dieses Spiel hat keine Erfolge
Top players = Top-Spieler
Unlocked = Freigeschaltete Erfolge
Unofficial = Inoffizielle Erfolge
Unofficial achievements = Unoffizielle Erfolge # AI translated
Unsupported = Nicht unterstützte Erfolge
Win = Gewinnen
+1
View File
@@ -61,6 +61,7 @@ This game has no achievements = This game has no achievements
Top players = Top players
Unlocked = Unlocked
Unofficial = Unofficial
Unofficial achievements = Prestasi tidak resmi # AI translated
Unsupported = Unsupported
Win = Menang
+12 -2
View File
@@ -85,6 +85,7 @@ This game has no achievements = This game has no achievements
Top players = Top players
Unlocked = Unlocked
Unofficial = Unofficial
Unofficial achievements = Unofficial achievements
Unsupported = Unsupported
Win = Win
@@ -122,6 +123,8 @@ Analog Limiter = Analog limiter
Analog Settings = Analog Settings
Analog Stick = Analog stick
Analog Style = Analog Style
Analog stick threshold = Analog stick threshold
Analog to digital mapping = Analog to digital mapping
Analog trigger threshold = Analog trigger threshold
AnalogLimiter Tip = When the analog limiter button is pressed
Auto = Auto
@@ -351,6 +354,7 @@ Enable shader cache = Enable shader cache
Enter address = Enter address
Fast = Fast
Fragment = Fragment
Framebuffer list = Framebuffer list
FPU = FPU
Framedump tests = Framedump tests
Frame Profiler = Frame profiler
@@ -801,10 +805,12 @@ Existing data = Existing data
Import savedata from ZIP file = Import savedata from ZIP file
Install = Install
Install game from ZIP file? = Install game from ZIP file?
Install plugin from ZIP file? = Install plugin from ZIP file?
Install into folder = Install into folder
Install textures from ZIP file? = Install textures from ZIP file?
Installation failed = Installation failed
Installed! = Installed!
Supported games: = Supported games:
Texture pack doesn't support install = Texture pack doesn't support install
Zip archive corrupt = ZIP archive corrupt
ZIP file = ZIP file
@@ -875,7 +881,8 @@ Analog limiter = Analog limiter
Analog speed = Analog speed
Analog Stick = Analog stick
Audio/Video Recording = Audio/Video recording
AxisSwap = Axis swap
Axis swap (hold) = Axis swap (hold)
Axis swap (toggle) = Axis swap (toggle)
Circle = Circle
Cross = Cross
Custom %d = Custom %d
@@ -955,6 +962,7 @@ Display Portrait Reversed = Display Portrait Reversed
[Networking]
Ad Hoc multiplayer = Ad Hoc multiplayer
AdHoc server = Ad hoc server
Ad hoc server address = Ad hoc server address
AdhocServer Failed to Bind Port = Ad hoc server failed to bind port
Allow speed control while connected (not recommended) = Allow speed control while connected (not recommended)
AM: Data from Unknown Port = AM: Data from Unknown Port
@@ -970,6 +978,7 @@ Chat Button Position = Chat button position
Chat Here = Chat here
Chat message = Chat message
Chat Screen Position = Chat screen position
Custom server list = Custom server list
Disconnected from AdhocServer = Disconnected from ad hoc server
DNS Error Resolving = DNS error resolving
DNS server = DNS server
@@ -995,6 +1004,7 @@ Hostname = Hostname
Infrastructure = Infrastructure
Infrastructure server provided by: = Infrastructure server provided by:
Invalid IP or hostname = Invalid IP or hostname
Local network addresses = Local network addresses
Minimum Timeout = Minimum timeout (override in ms, 0 = default)
Misc = Miscellaneous (default = PSP compatibility)
Network connected = Network connected
@@ -1006,7 +1016,7 @@ P2P mode = P2P mode
Please change your Port Offset = Please change your port offset
Port offset = Port offset (0 = PSP compatibility)
Open PPSSPP Multiplayer Wiki Page = Open PPSSPP Multiplayer Wiki Page
proAdhocServer Address: = Ad hoc server address:
Public server list = Public server list
Quick Chat 1 = Quick chat 1
Quick Chat 2 = Quick chat 2
Quick Chat 3 = Quick chat 3
+1
View File
@@ -61,6 +61,7 @@ This game has no achievements = Este juego no tiene logros
Top players = Top jugadores
Unlocked = Desbloqueados
Unofficial = No oficiales
Unofficial achievements = Logros no oficiales # AI translated
Unsupported = No admitidos
Win = Ganar
+1
View File
@@ -61,6 +61,7 @@ This game has no achievements = Este juego no tiene logros
Top players = Top players
Unlocked = Desbloqueados
Unofficial = No oficiales
Unofficial achievements = Logros no oficiales # AI translated
Unsupported = Sin soporte
Win = Ganar
+1
View File
@@ -61,6 +61,7 @@ This game has no achievements = This game has no achievements
Top players = Top players
Unlocked = Unlocked
Unofficial = Unofficial
Unofficial achievements = دستاوردهای غیررسمی # AI translated
Unsupported = Unsupported
Win = برنده شدن
+2 -2
View File
@@ -61,6 +61,7 @@ This game has no achievements = Tällä pelillä ei ole saavutuksia
Top players = Top players
Unlocked = Avatut saavutukset
Unofficial = Epäviralliset saavutukset
Unofficial achievements = Epäviralliset saavutukset # AI translated
Unsupported = Unsupported
Win = Voittaa
@@ -599,8 +600,7 @@ Play = Pelaa
Remove From Recent = Poista "äskettäin" listalta...
SaveData = Tallennustieto
Setting Background = Taustakuvan asetus
ime Played: %1h %2m %3s = Pelattu aika: %1t %2m %3s
Time Played: %1h %2m %3s = Time Played: %1h %2m %3s
Time Played: %1h %2m %3s = Pelattu aika: %1t %2m %3s
Uncompressed = Pakkauksen purku tehty
USA = USA
Use background as UI background = Käytä käyttöliittymän taustakuvaa
+1
View File
@@ -61,6 +61,7 @@ This game has no achievements = This game has no achievements
Top players = Top players
Unlocked = Unlocked
Unofficial = Unofficial
Unofficial achievements = Réalisations non officielles # AI translated
Unsupported = Unsupported
Win = Gagner
+1
View File
@@ -61,6 +61,7 @@ This game has no achievements = This game has no achievements
Top players = Top players
Unlocked = Unlocked
Unofficial = Unofficial
Unofficial achievements = Logros non oficiais # AI translated
Unsupported = Unsupported
Win = Ganar
+1
View File
@@ -61,6 +61,7 @@ This game has no achievements = This game has no achievements
Top players = Top players
Unlocked = Unlocked
Unofficial = Unofficial
Unofficial achievements = Άτυπες επιτυχίες # AI translated
Unsupported = Unsupported
Win = Κερδίζω
+1
View File
@@ -61,6 +61,7 @@ This game has no achievements = This game has no achievements
Top players = Top players
Unlocked = Unlocked
Unofficial = Unofficial
Unofficial achievements = הישגים בלתי רשמיים # AI translated
Unsupported = Unsupported
Win = ניצחון
+1
View File
@@ -61,6 +61,7 @@ This game has no achievements = This game has no achievements
Top players = Top players
Unlocked = Unlocked
Unofficial = Unofficial
Unofficial achievements = םישגי ןמיש הרסימ # AI translated
Unsupported = Unsupported
Win = ןוקפש
+1
View File
@@ -61,6 +61,7 @@ This game has no achievements = This game has no achievements
Top players = Top players
Unlocked = Unlocked
Unofficial = Unofficial
Unofficial achievements = Neformalna postignuća # AI translated
Unsupported = Unsupported
Win = Pobjedi
+1
View File
@@ -61,6 +61,7 @@ This game has no achievements = Ehhez a játékhoz nincsenek teljesítmények
Top players = Top játékosok
Unlocked = Kioldott teljesítmények
Unofficial = Nem hivatalos teljesítmények
Unofficial achievements = Nem hivatalos teljesítmények # AI translated
Unsupported = Nem támogatott teljesítmények
Win = Nyerni
+1
View File
@@ -61,6 +61,7 @@ This game has no achievements = Game ini tidak memiliki pencapaian
Top players = Pemain papan atas
Unlocked = Pencapaian yang telah dibuka
Unofficial = Pencapaian tidak resmi
Unofficial achievements = Prestasi tidak resmi # AI translated
Unsupported = Pencapaian yang tidak didukung
Win = Menang
+1
View File
@@ -61,6 +61,7 @@ This game has no achievements = Questo gioco non ha obiettivi
Top players = Migliori giocatori
Unlocked = Obiettivi sbloccati
Unofficial = Obiettivi non ufficiali
Unofficial achievements = Risultati non ufficiali # AI translated
Unsupported = Obiettivi non supportati
Win = Vincere
+1
View File
@@ -61,6 +61,7 @@ This game has no achievements = このゲームは実績機能がありません
Top players = トッププレイヤー
Unlocked = 達成した実績
Unofficial = 非公式な実績
Unofficial achievements = 非公式な実績 # AI translated
Unsupported = サポートしていない実績
Win = 勝つ
+1
View File
@@ -61,6 +61,7 @@ This game has no achievements = Game iki ora duwe prestasi
Top players = Pemain tingkat dhuwur
Unlocked = Prestasi sing durung kebuka
Unofficial = Prestasi ora resmi
Unofficial achievements = Prestasi ora resmi # AI translated
Unsupported = Prestasi sing ora valid
Win = Menang
+1
View File
@@ -61,6 +61,7 @@ This game has no achievements = 이 게임에는 도전과제가 없음
Top players = 상위 플레이어
Unlocked = 잠금 해제된 도전과제
Unofficial = 비공식 도전과제
Unofficial achievements = 비공식 성취 # AI translated
Unsupported = 지원되지 않는 도전과제
Win = 승리
+1
View File
@@ -74,6 +74,7 @@ This game has no achievements = ئەم یاریە دەستکەوتی نییە
Top players = Top players
Unlocked = دەستکەوتە کراوەکان
Unofficial = دەستکەوتە نافەرمیەکان
Unofficial achievements = Serkeftinên ne resmi # AI translated
Unsupported = دەستکەوتە پاڵپشت نەکراوەکان
Win = Serkeftin
+1
View File
@@ -61,6 +61,7 @@ This game has no achievements = This game has no achievements
Top players = Top players
Unlocked = Unlocked
Unofficial = Unofficial
Unofficial achievements = ຜົນລັບທີ່ບໍ່ແມ່ນທາງການສູດ # AI translated
Unsupported = Unsupported
Win = ໄດ້ຊະນະ
+1
View File
@@ -61,6 +61,7 @@ This game has no achievements = This game has no achievements
Top players = Top players
Unlocked = Unlocked
Unofficial = Unofficial
Unofficial achievements = Neoficialūs pasiekimai # AI translated
Unsupported = Unsupported
Win = Laimėti
+1
View File
@@ -61,6 +61,7 @@ This game has no achievements = This game has no achievements
Top players = Top players
Unlocked = Unlocked
Unofficial = Unofficial
Unofficial achievements = Pencapaian tidak rasmi # AI translated
Unsupported = Unsupported
Win = Menang
+1
View File
@@ -61,6 +61,7 @@ This game has no achievements = This game has no achievements
Top players = Top players
Unlocked = Unlocked
Unofficial = Unofficial
Unofficial achievements = Niet-officiële prestaties # AI translated
Unsupported = Unsupported
Win = Winnen
+1
View File
@@ -61,6 +61,7 @@ This game has no achievements = This game has no achievements
Top players = Top players
Unlocked = Unlocked
Unofficial = Unofficial
Unofficial achievements = Uoffisielle prestasjoner # AI translated
Unsupported = Unsupported
Win = Vin
+1
View File
@@ -61,6 +61,7 @@ This game has no achievements = Ta gra nie posiada osiągnięć
Top players = Najlepsi gracze
Unlocked = Odblokowane osiągnięcia
Unofficial = Nieoficjalnie osiągnięcia
Unofficial achievements = Nieoficjalne osiągnięcia # AI translated
Unsupported = Niewspierane osiągnięcia
Win = Wygrać
+1
View File
@@ -85,6 +85,7 @@ This game has no achievements = Este jogo não tem conquistas
Top players = Os melhores jogadores
Unlocked = Destrancadas
Unofficial = Não oficiais
Unofficial achievements = Conquistas não oficiais # AI translated
Unsupported = Não suportadas
Win = Vitórias
+1
View File
@@ -85,6 +85,7 @@ This game has no achievements = Este jogo não tem conquistas disponíveis
Top players = Jogadores no topo
Unlocked = Conquistas desbloqueadas
Unofficial = Conquistas não oficiais
Unofficial achievements = Conquistas não oficiais # AI translated
Unsupported = Conquistas incompatíveis
Win = Vencer
+1
View File
@@ -61,6 +61,7 @@ This game has no achievements = This game has no achievements
Top players = Top players
Unlocked = Unlocked
Unofficial = Unofficial
Unofficial achievements = Realizări neoficiale # AI translated
Unsupported = Unsupported
Win = Câștigă
+1
View File
@@ -61,6 +61,7 @@ This game has no achievements = У данной игры нет достижен
Top players = Лучшие игроки
Unlocked = Разблокированные
Unofficial = Неофициальные
Unofficial achievements = Неофициальные достижения # AI translated
Unsupported = Неподдерживаемые
Win = Победа
+1
View File
@@ -61,6 +61,7 @@ This game has no achievements = Detta spel har inga prestationer
Top players = Toppspelare
Unlocked = Upplåsta prestationer
Unofficial = Inofficiella prestationer
Unofficial achievements = Inofficiella prestationer # AI translated
Unsupported = Prestationer som inte stöds
Win = Vinna
+1
View File
@@ -61,6 +61,7 @@ This game has no achievements = Ang larong ito ay wala nakuhang mga tagumpay
Top players = Mga nangungunang manlalaro
Unlocked = Mga nagawang tagumpay
Unofficial = Mga hindi opisyal na tagumpay
Unofficial achievements = Нерасмий дастур # AI translated
Unsupported = Mga hindi sinusuportahang tagumpay
Win = Баракат
+1
View File
@@ -61,6 +61,7 @@ This game has no achievements = Bu oyunun başarımları yok
Top players = En iyi oyuncular
Unlocked = Kilidi Açılmış Başarımlar
Unofficial = Resmi Olmayan Başarımlar
Unofficial achievements = Resmi olmayan başarılar # AI translated
Unsupported = Desteklenmeyen Başarımlar
Win = Kazanmak
+1
View File
@@ -61,6 +61,7 @@ This game has no achievements = Ця гра не має відзнак
Top players = Найкращі гравці
Unlocked = Розблоковані відзнаки
Unofficial = Неофіційні відзнаки
Unofficial achievements = Неофіційні досягнення # AI translated
Unsupported = Непідтримувані відзнаки
Win = Перемогти
+1
View File
@@ -61,6 +61,7 @@ This game has no achievements = This game has no achievements
Top players = Top players
Unlocked = Unlocked
Unofficial = Unofficial
Unofficial achievements = Thành tựu không chính thức # AI translated
Unsupported = Unsupported
Win = Thắng
+1
View File
@@ -61,6 +61,7 @@ This game has no achievements = 此游戏没有成就列表
Top players = 速度排名
Unlocked = 解锁的成就
Unofficial = 自定义成就
Unofficial achievements = 非官方成就 # AI translated
Unsupported = 不支持的成绩
Win =
+1
View File
@@ -61,6 +61,7 @@ This game has no achievements = 這個遊戲沒有成就
Top players = 頂級玩家
Unlocked = 已解鎖的成就
Unofficial = 非官方成就
Unofficial achievements = 非官方成就 # AI translated
Unsupported = 不支援的成就
Win =