diff --git a/Common/Thread/ThreadUtil.cpp b/Common/Thread/ThreadUtil.cpp index a2016e2f92..73eab75e5c 100644 --- a/Common/Thread/ThreadUtil.cpp +++ b/Common/Thread/ThreadUtil.cpp @@ -21,6 +21,7 @@ #include "Common/Log.h" #include "Common/Thread/ThreadUtil.h" +#include "Common/Data/Encoding/Utf8.h" #if (PPSSPP_PLATFORM(ANDROID) || PPSSPP_PLATFORM(LINUX)) && !defined(_GNU_SOURCE) #define _GNU_SOURCE @@ -61,15 +62,73 @@ static EXCEPTION_DISPOSITION NTAPI ignore_handler(EXCEPTION_RECORD *rec, } #endif -void SetCurrentThreadName(const char* threadName) { -#if PPSSPP_PLATFORM(WINDOWS) - // Set the debugger-visible threadname through an unholy magic hack - static const DWORD MS_VC_EXCEPTION = 0x406D1388; + +#if PPSSPP_PLATFORM(WINDOWS) && !PPSSPP_PLATFORM(UWP) +typedef HRESULT (WINAPI *TSetThreadDescription)(HANDLE, PCWSTR); + +static TSetThreadDescription g_pSetThreadDescription = nullptr; +static bool g_failedToFindSetThreadDescription = false; + +static void InitializeSetThreadDescription() { + if (g_pSetThreadDescription != nullptr || g_failedToFindSetThreadDescription) { + return; + } + + HMODULE hKernel32 = GetModuleHandle(L"kernelbase.dll"); + if (hKernel32 == nullptr) { + // Failed to find the function. Windows version too old, most likely. + g_failedToFindSetThreadDescription = true; + return; + } + g_pSetThreadDescription = reinterpret_cast(GetProcAddress(hKernel32, "SetThreadDescription")); + if (g_pSetThreadDescription == nullptr) { + g_failedToFindSetThreadDescription = true; + return; + } +} + +void SetCurrentThreadNameThroughException(const char *threadName); #endif - // TODO: Use the new function SetThreadDescription available since Windows 10, version 1607. +void SetCurrentThreadName(const char* threadName) { +#if PPSSPP_PLATFORM(WINDOWS) && !PPSSPP_PLATFORM(UWP) + InitializeSetThreadDescription(); + if (g_pSetThreadDescription) { + // Use the modern API + wchar_t buffer[256]; + ConvertUTF8ToWString(buffer, ARRAY_SIZE(buffer), threadName); + g_pSetThreadDescription(GetCurrentThread(), buffer); + } else { + // Use the old exception hack. + SetCurrentThreadNameThroughException(threadName); + } +#elif PPSSPP_PLATFORM(WINDOWS) + wchar_t buffer[256]; + ConvertUTF8ToWString(buffer, ARRAY_SIZE(buffer), threadName); + SetThreadDescription(GetCurrentThread(), buffer); +#elif PPSSPP_PLATFORM(ANDROID) || PPSSPP_PLATFORM(LINUX) + pthread_setname_np(pthread_self(), threadName); +#elif defined(__APPLE__) + pthread_setname_np(threadName); +#elif defined(__DragonFly__) || defined(__FreeBSD__) || defined(__OpenBSD__) + pthread_set_name_np(pthread_self(), threadName); +#elif defined(__NetBSD__) + pthread_setname_np(pthread_self(), "%s", (void*)threadName); +#endif -#if PPSSPP_PLATFORM(WINDOWS) && defined(__MINGW32__) + // Set the locally known threadname using a thread local variable. +#ifdef TLS_SUPPORTED + curThreadName = threadName; +#endif +} + +#if PPSSPP_PLATFORM(WINDOWS) + +void SetCurrentThreadNameThroughException(const char *threadName) { + // Set the debugger-visible threadname through an unholy magic hack + static const DWORD MS_VC_EXCEPTION = 0x406D1388; + +#if defined(__MINGW32__) // Thread information for VS compatible debugger. -1 sets current thread. THREADNAME_INFO ti; ti.dwType = 0x1000; @@ -90,7 +149,7 @@ void SetCurrentThreadName(const char* threadName) { // Pop exception handler tib->ExceptionList = tib->ExceptionList->Next; -#elif PPSSPP_PLATFORM(WINDOWS) +#else #pragma pack(push,8) struct THREADNAME_INFO { DWORD dwType; // must be 0x1000 @@ -119,25 +178,9 @@ void SetCurrentThreadName(const char* threadName) { __except(EXCEPTION_CONTINUE_EXECUTION) #endif {} -#else - -#if PPSSPP_PLATFORM(ANDROID) || PPSSPP_PLATFORM(LINUX) - pthread_setname_np(pthread_self(), threadName); -#elif defined(__APPLE__) - pthread_setname_np(threadName); -#elif defined(__DragonFly__) || defined(__FreeBSD__) || defined(__OpenBSD__) - pthread_set_name_np(pthread_self(), threadName); -#elif defined(__NetBSD__) - pthread_setname_np(pthread_self(), "%s", (void*)threadName); -#endif - - // Do nothing -#endif - // Set the locally known threadname using a thread local variable. -#ifdef TLS_SUPPORTED - curThreadName = threadName; #endif } +#endif void AssertCurrentThreadName(const char *threadName) { #ifdef TLS_SUPPORTED diff --git a/Core/Config.cpp b/Core/Config.cpp index adf83fbf1b..c7b4999901 100644 --- a/Core/Config.cpp +++ b/Core/Config.cpp @@ -29,6 +29,7 @@ #include "Common/Net/URL.h" #include "Common/Log.h" +#include "Common/TimeUtil.h" #include "Common/Data/Format/IniFile.h" #include "Common/Data/Format/JSONReader.h" #include "Common/Data/Text/I18n.h" @@ -1658,18 +1659,34 @@ void Config::RemoveRecent(const std::string &file) { } void Config::CleanRecent() { + double startTime = time_now_d(); + std::vector cleanedRecent; for (size_t i = 0; i < recentIsos.size(); i++) { - FileLoader *loader = ConstructFileLoader(Path(recentIsos[i])); - if (loader->ExistsFast()) { + bool exists = false; + Path path = Path(recentIsos[i]); + switch (path.Type()) { + case PathType::CONTENT_URI: + case PathType::NATIVE: + exists = File::Exists(path); + break; + default: + FileLoader *loader = ConstructFileLoader(path); + exists = loader->ExistsFast(); + delete loader; + break; + } + + if (exists) { // Make sure we don't have any redundant items. auto duplicate = std::find(cleanedRecent.begin(), cleanedRecent.end(), recentIsos[i]); if (duplicate == cleanedRecent.end()) { cleanedRecent.push_back(recentIsos[i]); } } - delete loader; } + + INFO_LOG(SYSTEM, "CleanRecent took %0.2f", time_now_d() - startTime); recentIsos = cleanedRecent; } diff --git a/Windows/Debugger/Debugger_Disasm.cpp b/Windows/Debugger/Debugger_Disasm.cpp index 833a9dbe0d..8e9c147e7e 100644 --- a/Windows/Debugger/Debugger_Disasm.cpp +++ b/Windows/Debugger/Debugger_Disasm.cpp @@ -466,6 +466,7 @@ BOOL CDisasm::DlgProc(UINT message, WPARAM wParam, LPARAM lParam) break; case IDC_SHOWVFPU: + MainWindow::CreateVFPUWindow(); vfpudlg->Show(true); break; @@ -899,7 +900,8 @@ void CDisasm::UpdateDialog(bool _bComplete) _snwprintf(tempTicks, 24, L"%lld", CoreTiming::GetTicks() - lastTicks); SetDlgItemText(m_hDlg, IDC_DEBUG_COUNT, tempTicks); } - // Update Register Dialog + + // Update memory window if (memoryWindow) memoryWindow->Update(); diff --git a/Windows/Debugger/Debugger_Lists.cpp b/Windows/Debugger/Debugger_Lists.cpp index 9c90d6d0f2..b60ed587d1 100644 --- a/Windows/Debugger/Debugger_Lists.cpp +++ b/Windows/Debugger/Debugger_Lists.cpp @@ -6,6 +6,7 @@ #include "Windows/Debugger/DebuggerShared.h" #include "Windows/Debugger/CtrlDisAsmView.h" #include "Windows/W32Util/ContextMenu.h" +#include "Windows/MainWindow.h" #include "Windows/resource.h" #include "Windows/main.h" #include "Common/Data/Encoding/Utf8.h" @@ -373,10 +374,12 @@ void CtrlBreakpointList::gotoBreakpointAddress(int itemIndex) if (isMemory) { u32 address = displayedMemChecks_[index].start; + MainWindow::CreateMemoryWindow(); if (memoryWindow) memoryWindow->Goto(address); } else { u32 address = displayedBreakPoints_[index].addr; + MainWindow::CreateDisasmWindow(); if (disasmWindow) disasmWindow->Goto(address); } diff --git a/Windows/Debugger/Debugger_VFPUDlg.cpp b/Windows/Debugger/Debugger_VFPUDlg.cpp index 5075e61731..1a6bc43852 100644 --- a/Windows/Debugger/Debugger_VFPUDlg.cpp +++ b/Windows/Debugger/Debugger_VFPUDlg.cpp @@ -13,8 +13,6 @@ #include "Core/MIPS/MIPS.h" // BAD -CVFPUDlg *vfpudlg; - CVFPUDlg::CVFPUDlg(HINSTANCE _hInstance, HWND _hParent, DebugInterface *cpu_) : Dialog((LPCSTR)IDD_VFPU, _hInstance,_hParent) { cpu = cpu_; diff --git a/Windows/Debugger/Debugger_VFPUDlg.h b/Windows/Debugger/Debugger_VFPUDlg.h index 9c3c4deede..0e5763dcfc 100644 --- a/Windows/Debugger/Debugger_VFPUDlg.h +++ b/Windows/Debugger/Debugger_VFPUDlg.h @@ -20,6 +20,3 @@ private: int mode; BOOL DlgProc(UINT message, WPARAM wParam, LPARAM lParam); }; - - -extern CVFPUDlg *vfpudlg; diff --git a/Windows/MainWindow.cpp b/Windows/MainWindow.cpp index 72374b749b..c8720004db 100644 --- a/Windows/MainWindow.cpp +++ b/Windows/MainWindow.cpp @@ -569,36 +569,58 @@ namespace MainWindow return TRUE; } - void CreateDebugWindows() { - disasmWindow = new CDisasm(MainWindow::GetHInstance(), MainWindow::GetHWND(), currentDebugMIPS); - DialogManager::AddDlg(disasmWindow); - disasmWindow->Show(g_Config.bShowDebuggerOnLoad, false); + void CreateDisasmWindow() { + if (!disasmWindow) { + disasmWindow = new CDisasm(MainWindow::GetHInstance(), MainWindow::GetHWND(), currentDebugMIPS); + DialogManager::AddDlg(disasmWindow); + } + } + void CreateGeDebuggerWindow() { #if PPSSPP_API(ANY_GL) - geDebuggerWindow = new CGEDebugger(MainWindow::GetHInstance(), MainWindow::GetHWND()); - DialogManager::AddDlg(geDebuggerWindow); + if (!geDebuggerWindow) { + geDebuggerWindow = new CGEDebugger(MainWindow::GetHInstance(), MainWindow::GetHWND()); + DialogManager::AddDlg(geDebuggerWindow); + } #endif - memoryWindow = new CMemoryDlg(MainWindow::GetHInstance(), MainWindow::GetHWND(), currentDebugMIPS); - DialogManager::AddDlg(memoryWindow); + } + + void CreateMemoryWindow() { + if (!memoryWindow) { + memoryWindow = new CMemoryDlg(MainWindow::GetHInstance(), MainWindow::GetHWND(), currentDebugMIPS); + DialogManager::AddDlg(memoryWindow); + } + } + + void CreateVFPUWindow() { + if (!vfpudlg) { + vfpudlg = new CVFPUDlg(MainWindow::GetHInstance(), MainWindow::GetHWND(), currentDebugMIPS); + DialogManager::AddDlg(vfpudlg); + } } void DestroyDebugWindows() { DialogManager::RemoveDlg(disasmWindow); if (disasmWindow) delete disasmWindow; - disasmWindow = 0; + disasmWindow = nullptr; #if PPSSPP_API(ANY_GL) DialogManager::RemoveDlg(geDebuggerWindow); if (geDebuggerWindow) delete geDebuggerWindow; - geDebuggerWindow = 0; + geDebuggerWindow = nullptr; #endif DialogManager::RemoveDlg(memoryWindow); if (memoryWindow) delete memoryWindow; - memoryWindow = 0; + memoryWindow = nullptr; + + DialogManager::RemoveDlg(vfpudlg); + if (vfpudlg) + delete vfpudlg; + vfpudlg = nullptr; } LRESULT CALLBACK DisplayProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { @@ -968,7 +990,6 @@ namespace MainWindow disasmWindow->NotifyMapLoaded(); if (memoryWindow) memoryWindow->NotifyMapLoaded(); - if (disasmWindow) disasmWindow->UpdateDialog(); break; diff --git a/Windows/MainWindow.h b/Windows/MainWindow.h index 38c239c615..f90b8b2e8b 100644 --- a/Windows/MainWindow.h +++ b/Windows/MainWindow.h @@ -62,9 +62,11 @@ namespace MainWindow void Init(HINSTANCE hInstance); BOOL Show(HINSTANCE hInstance); - void CreateDebugWindows(); + void CreateDisasmWindow(); + void CreateGeDebuggerWindow(); + void CreateMemoryWindow(); + void CreateVFPUWindow(); void DestroyDebugWindows(); - void Close(); void UpdateMenus(bool isMenuSelect = false); void UpdateCommands(); void UpdateSwitchUMD(); diff --git a/Windows/MainWindowMenu.cpp b/Windows/MainWindowMenu.cpp index 1cab6eccc1..06942d190d 100644 --- a/Windows/MainWindowMenu.cpp +++ b/Windows/MainWindowMenu.cpp @@ -912,18 +912,21 @@ namespace MainWindow { break; case ID_DEBUG_DISASSEMBLY: + CreateDisasmWindow(); if (disasmWindow) disasmWindow->Show(true); break; case ID_DEBUG_GEDEBUGGER: #if PPSSPP_API(ANY_GL) + CreateGeDebuggerWindow(); if (geDebuggerWindow) geDebuggerWindow->Show(true); #endif break; case ID_DEBUG_MEMORYVIEW: + CreateMemoryWindow(); if (memoryWindow) memoryWindow->Show(true); break; diff --git a/Windows/W32Util/DialogManager.cpp b/Windows/W32Util/DialogManager.cpp index df131d9db4..ee5526f45b 100644 --- a/Windows/W32Util/DialogManager.cpp +++ b/Windows/W32Util/DialogManager.cpp @@ -76,6 +76,9 @@ void DialogManager::AddDlg(Dialog *dialog) void DialogManager::RemoveDlg(Dialog *dialog) { + if (!dialog) { + return; + } dialogs.erase(std::remove(dialogs.begin(), dialogs.end(), dialog), dialogs.end()); } diff --git a/Windows/main.cpp b/Windows/main.cpp index 59ee239d7d..6b0f2d1098 100644 --- a/Windows/main.cpp +++ b/Windows/main.cpp @@ -95,6 +95,7 @@ CGEDebugger* geDebuggerWindow = nullptr; CDisasm *disasmWindow = nullptr; CMemoryDlg *memoryWindow = nullptr; +CVFPUDlg *vfpudlg = nullptr; static std::string langRegion; static std::string osName; @@ -684,9 +685,11 @@ int WINAPI WinMain(HINSTANCE _hInstance, HINSTANCE hPrevInstance, LPSTR szCmdLin #if PPSSPP_API(ANY_GL) CGEDebugger::Init(); #endif - DialogManager::AddDlg(vfpudlg = new CVFPUDlg(_hInstance, hwndMain, currentDebugMIPS)); - MainWindow::CreateDebugWindows(); + if (g_Config.bShowDebuggerOnLoad) { + MainWindow::CreateDisasmWindow(); + disasmWindow->Show(g_Config.bShowDebuggerOnLoad, false); + } const bool minimized = iCmdShow == SW_MINIMIZE || iCmdShow == SW_SHOWMINIMIZED || iCmdShow == SW_SHOWMINNOACTIVE; if (minimized) { diff --git a/Windows/main.h b/Windows/main.h index 890acc845c..44cdbd621a 100644 --- a/Windows/main.h +++ b/Windows/main.h @@ -19,12 +19,16 @@ #pragma once #include "ppsspp_config.h" + #include "Debugger/Debugger_Disasm.h" #include "Debugger/Debugger_MemoryDlg.h" +#include "Debugger/Debugger_VFPUDlg.h" + #include "Common/CommonWindows.h" extern CDisasm *disasmWindow; extern CMemoryDlg *memoryWindow; +extern CVFPUDlg *vfpudlg; #if PPSSPP_API(ANY_GL) #include "Windows/GEDebugger/GEDebugger.h" diff --git a/assets/lang/es_LA.ini b/assets/lang/es_LA.ini index 5e00c96e88..193c50fe04 100644 --- a/assets/lang/es_LA.ini +++ b/assets/lang/es_LA.ini @@ -33,28 +33,28 @@ Auto = Automática Auto-centering analog stick = Auto-centrado del análogo Auto-hide buttons after seconds = Ocultar botones después de (en segundos) Auto-switch = Auto-switch -Base tilt position = Base tilt position +Base tilt position = Posición de inclinación de la base Binds = Asignaciones -Button Binding = Button Binding +Button Binding = Vincular botones Button Opacity = Transparencia de botones Button style = Estilo de botones Calibrate Analog Stick = Calibrar análogo Calibrate D-Pad = Calibrar cruceta Calibrated = Calibrado Calibration = Calibración -Circular stick input = Circular stick input +Circular stick input = Entrada del stick circular Classic = Clásico Combo Key Setting = Ajustes de botones combo Combo Key Setup = Configurar botones combo... Confine Mouse = Fijar el ratón al área de la ventana/pantalla Control Mapping = Asignar botones -Custom Key Setting = Custom Key Setting +Custom Key Setting = Configurar teclas personalizadas Customize = Personalizar Customize Touch Controls = Editar pantalla táctil Customize tilt = Personalizar acelerómetro D-PAD = Cruceta Deadzone radius = Radio de zona inactiva -DInput Analog Settings = Configuraciones de Analog de DInput +DInput Analog Settings = Configuraciones de Analog de DirectInput Disable D-Pad diagonals (4-way touch) = Desactivar diagonales de la cruceta Disable diagonal input = Deshabilitar mov. diagonal Double tap = Doble toque @@ -90,13 +90,13 @@ Portrait Reversed = Retrato invertido PSP Action Buttons = Botones de acción PSP Raw input = Raw input Reset to defaults = Restaurar config. -Screen aligned to ground = Screen aligned to ground -Screen at right angle to ground = Screen at right angle to ground +Screen aligned to ground = Pantalla alineada al suelo +Screen at right angle to ground = Ángulo correcto de pantalla al suelo Screen Rotation = Rotación de pantalla seconds, 0 : off = Segundos, 0 = No Sensitivity (scale) = Sensibilidad (escala) Sensitivity = Sensibilidad -Shape = Shape +Shape = Forma Show right analog = Mostrar análogo derecho Show Touch Pause Menu Button = Mostrar botón del menú Swipe = Deslizar hacia @@ -108,7 +108,7 @@ Tilt Input Type = Tipo de control del acelerómetro Tilt Sensitivity along X axis = Sensibilidad de inclinación del eje X Tilt Sensitivity along Y axis = Sensibilidad de inclinación del eje Y To Calibrate = Para calibrar, pon el aparato en una superficie plana y presiona "Calibrar". -Toggle mode = Toggle mode +Toggle mode = Modo de alternancia Touch Control Visibility = Visibilidad de pantalla táctil Use custom right analog = Usar Analog derecho personalizado Use Mouse Control = Usar el control del ratón @@ -570,14 +570,14 @@ Stretching = Estirar Texture Filter = Filtro de texturas Texture Filtering = Filtrado de texturas Texture Scaling = Escalado de texturas -Texture Shader = Texture shader +Texture Shader = Shader de texturas Turn off Hardware Tessellation - unsupported = Desactivando Teselado por Hardware: no es soportado. Unlimited = Ilimitado Up to 1 = Hasta 1 Up to 2 = Hasta 2 Upscale Level = Nivel de escalado Upscale Type = Tipo de escalado -UpscaleLevel Tip = Consume tanta CPU. Cierto escalado se retrasa para evitar caídas de cuadros. +UpscaleLevel Tip = Consume tanta CPU. Cierto escalado se retrasa para evitar caídas de frames. Use all displays = Usar todas las muestras Vertex Cache = Caché con Vértices VertexCache Tip = Acelera, pero puede causar parpadeos en ocasiones. @@ -658,16 +658,16 @@ Auto Analog Rotation (CW) = Rotación analógica automática (CW) AxisSwap = Invertir ejes Circle = ○ Cross = × -Custom 1 = Custom 1 -Custom 10 = Custom 10 -Custom 2 = Custom 2 -Custom 3 = Custom 3 -Custom 4 = Custom 4 -Custom 5 = Custom 5 -Custom 6 = Custom 6 -Custom 7 = Custom 7 -Custom 8 = Custom 8 -Custom 9 = Custom 9 +Custom 1 = Personal 1 +Custom 2 = Personal 2 +Custom 3 = Personal 3 +Custom 4 = Personal 4 +Custom 5 = Personal 5 +Custom 6 = Personal 6 +Custom 7 = Personal 7 +Custom 8 = Personal 8 +Custom 9 = Personal 9 +Custom 10 = Personal 10 D-pad down = PDM Abajo D-pad left = PDM Izquierda D-pad right = PDM Derecha @@ -684,7 +684,7 @@ Left = Izquierda Load State = Cargar estado Mute toggle = Alternar silencio Next Slot = Siguiente ranura -None = None +None = Ninguno Note = Sonido OpenChat = Abrir chat Pause = Pausa @@ -712,7 +712,7 @@ Swipe Down = Deslizar hacia abajo Swipe Left = Deslizar hacia la izq. Swipe Right = Deslizar hacia la der. Swipe Up = Deslizar hacia arriba -tap to customize = tap to customize +tap to customize = Toca para personalizar Texture Dumping = Dumpear textura Texture Replacement = Remplazo de textura Toggle Fullscreen = Alternar pantalla completa @@ -750,7 +750,7 @@ USBAccessThrough = Acceso USB en la carpeta Android/data/org.ppsspp.ppsspp/files USBAccessThroughGold = Acceso USB en la carpeta Android/data/org.ppsspp.ppssppgold/files Use App Private Data = Usar datos privados de la App Use PSP folder at root of storage = Usar carpeta de PSP como carpeta raíz -Welcome to PPSSPP! = Bienvenido a PPSSPP! +Welcome to PPSSPP! = ¡Bienvenido a PPSSPP! WhatsThis = ¿Que es esto? [Networking] @@ -820,7 +820,7 @@ WLAN Channel = Canal WLAN You're in Offline Mode, go to lobby or online hall = Estás en modo fuera de línea, ve al lobby o sala en línea [Pause] -Cheats = Trucos +Cheats = Trampas Continue = Continuar Create Game Config = Crear config. del juego Delete Game Config = Borrar config. del juego @@ -1098,7 +1098,7 @@ Change Nickname = Cambiar nombre de usuario ChangingMemstickPath = Datos de juego, estados guardados, y otros archivos no son copiados a esta carpeta.\n\n¿Quieres cambiar de carpeta de Memory Stick? ChangingMemstickPathInvalid = Esta carpeta no se usa para guardar archivos de Memory Stick. ChangingMemstickPathNotExists = No existe esta carpeta.\n\nDatos de juego, estados guardados, y otros archivos no son copiados a esta carpeta.\n\n¿Crearás una nueva carpeta de Memory Stick? -Cheats = Trucos +Cheats = Trampas Clear Recent = Destruir "recientes" Clear Recent Games List = Borrar lista de juegos recientes Clear UI background = Borrar fondo de interfaz @@ -1114,7 +1114,7 @@ Display Homebrew on a grid = Mostrar "Homebrew y Demos" en una cuadrícula Display Recent on a grid = Mostrar "Reciente" en una cuadrícula Dynarec (JIT) = Dynarec (JIT) Emulation = Emulación -Enable Cheats = Activar trucos +Enable Cheats = Activar trampas Enable Compatibility Server Reports = Activar reportes de compatibilidad Failed to load state. Error in the file system. = Falló al cargar el estado. Hubo un fallo en el sistema de archivos. Failed to save state. Error in the file system. = Falló al guardar el estado. Hubo un fallo en el sistema de archivos. @@ -1143,7 +1143,7 @@ Not a PSP game = No es un juego de PSP Off = No Oldest Save = Antiguos datos de guardado Path does not exist! = La ruta no existe. -PSP Memory Stick = PSP Memory Stick +PSP Memory Stick = Memory Stick de PSP PSP Model = Modelo de PSP PSP Settings = Ajustes de PSP PSP-1000 = PSP-1000 @@ -1155,7 +1155,7 @@ Reset Recording on Save/Load State = Reiniciar grabación al abrir/guardar estad Restore Default Settings = Reestablecer ajustes Rewind Snapshot Frequency = Frecuencia de rebobinado\n(consume memoria) Save path in installed.txt = Guardar ruta en installed.txt -Save path in My Documents = Guardar ruta en Documentos +Save path in My Documents = Guardar ruta en\n"C:/Users/(tu usuario)/Documents" Savestate Slot = Ranura de estado guardado Savestate slot backups = Copias de seguridad de estado guardado Screenshots as PNG = Capturas en PNG diff --git a/assets/lang/id_ID.ini b/assets/lang/id_ID.ini index 35075caae1..1779e2c5d0 100644 --- a/assets/lang/id_ID.ini +++ b/assets/lang/id_ID.ini @@ -79,7 +79,7 @@ Landscape Auto = Lanskap otomatis Landscape Reversed = Lanskap terbalik Low end radius = Radius kelas atas Mouse = Pengaturan mouse -Mouse sensitivity = Sentivitas mouse +Mouse sensitivity = Sensitivitas mouse Mouse smoothing = Kehalusan mouse MouseControl Tip = Anda sekarang dapat memetakan mouse di layar pemetaan kontrol dengan menekan ikon 'M'. None (Disabled) = Tidak ada (nonaktif) @@ -94,13 +94,13 @@ Screen aligned to ground = Layar sejajar kebawah Screen at right angle to ground = Layar pada sudut kanan kebawah Screen Rotation = Rotasi layar seconds, 0 : off = detik, 0 = mati -Sensitivity (scale) = Sensivitas (skala) +Sensitivity (scale) = Sensitivitas (skala) Sensitivity = Sensitivitas Shape = Bentuk Show right analog = Tampilkan analog kanan Show Touch Pause Menu Button = Tampilkan tombol menu jeda Swipe = Geser -Swipe sensitivity = Geser sensivitas +Swipe sensitivity = Geser sensitivitas Swipe smoothing = Geser kehalusan Thin borders = Garis batas tipis Tilt Base Radius = Radius kemiringan dasar @@ -241,7 +241,7 @@ Current = Saat ini Dev Tools = Alat pengembang DevMenu = Menu pengembang Disabled JIT functionality = Fungsi JIT dinonaktifkan -Draw Frametimes Graph = Gambar grafik sketsa waktu +Draw Frametimes Graph = Gambar grafis sketsa waktu Dump Decrypted Eboot = Buang EBOOT.BIN yang didekripsi pada pengaktifan ulang permainan Dump Frame GPU Commands = Buang perintah laju bingkai GPU Enable driver bug workarounds = Aktifkan solusi masalah driver @@ -266,7 +266,7 @@ Prev = Sebelum Random = Acak Replace textures = Ganti tekstur Reset = Atur ulang -Reset limited logging = Setel ulang pencatatan terbatas +Reset limited logging = Atur ulang pencatatan terbatas RestoreDefaultSettings = Apakah Anda yakin ingin mengembalikan semua pengaturan ke awal?\nPengaturan pemetaan kendali tidak berubah.\n\nAksi ini bersifat permanen.\nSilakan mulai ulang PPSSPP agar perubahan ini bisa diterapkan. RestoreGameDefaultSettings = Apakah Anda yakin ingin mengembalikan pengaturan permainan\nkembali ke pengaturan awal PPSSPP? Resume = Lanjutkan @@ -940,7 +940,7 @@ FeedbackIncludeScreen = Sertakan tangkapan layar FeedbackSubmitDone = Data anda telah terkirim. FeedbackSubmitFail = Tidak bisa mengirimkan data ke server. Coba perbarui PPSSPP. FeedbackThanks = Terima kasih atas umpan balik Anda! -Gameplay = Gameplay +Gameplay = Mekanisme permainan Graphics = Grafis Great = Bagus In-game = Dalam permainan @@ -989,7 +989,7 @@ Chainfire3DWarning = Peringatan: Chainfire3D terdeteksi, mungkin akan menyebabka Failed to load state = Gagal memuat status permainan Failed to save state = Gagal menyimpan status permainan fixed = Kecepatan: alternatif -GLToolsWarning = PERINGATAN: GLTools terdeteksi, mungkin akan menyebabkan masalah. +GLToolsWarning = Peringatan: GLTools terdeteksi, mungkin akan menyebabkan masalah. In menu = Dalam menu Load savestate failed = Gagal memuat simpanan status permainan Loaded State = Status/keadaan termuat @@ -1152,9 +1152,9 @@ PSP-2000/3000 = PSP-2000/3000 Recent games = Permainan terbaru Record Audio = Rekam suara Record Display = Rekam tampilan -Reset Recording on Save/Load State = Setel ulang rekaman pada status Simpan/Muat +Reset Recording on Save/Load State = Atur ulang rekaman pada status simpan/muat Restore Default Settings = Atur ulang pengaturan PPSSPP ke awal -Rewind Snapshot Frequency = Putar ulang frekuensi foto (mem hog) +Rewind Snapshot Frequency = Putar ulang frekuensi foto (memory hog) Save path in installed.txt = Simpan jalur dalam installed.txt Save path in My Documents = Simpan jalur dalam dokumen saya Savestate Slot = Slot simpanan status @@ -1189,7 +1189,7 @@ Waves = Bergelombang YYYYMMDD = TTTT/BB/HH [Upgrade] -Details = Detail +Details = Rincian Dismiss = Tolak Download = Unduh New version of PPSSPP available = Versi baru PPSSPP tersedia diff --git a/assets/lang/zh_CN.ini b/assets/lang/zh_CN.ini index d487393546..546e6e412e 100644 --- a/assets/lang/zh_CN.ini +++ b/assets/lang/zh_CN.ini @@ -1098,7 +1098,7 @@ Memory Stick size = 记忆棒大小(GB) Change Nickname = 修改昵称 ChangingMemstickPath = 游戏存档、即时存档及其它数据不会复制到新路径。\n\n确定要修改记忆棒文件夹吗? ChangingMemstickPathInvalid = 目标路径不能用于保存记忆棒数据。 -ChangingMemstickPathNotExists = 目标文件夹不存在。\n\n游戏存档、即时存档及其它数据不会复制到新路径。\n\n确定要创建新的记忆棒文件夹吗? +ChangingMemstickPathNotExists = 目标文件夹不存在。\n\n游戏存档、即时存档及其它数据不会复制到新路径。\n\n要创建新的记忆棒文件夹吗? Cheats = 作弊设置 Clear Recent = 清除"最近的游戏" Clear Recent Games List = 清除"最近的游戏"列表